diff --git a/CMakeLists.txt b/CMakeLists.txt index 34785a0aa..e2b203b89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,11 +150,21 @@ SET(SDL_BUILD_DIR "${GLARE_CORE_LIBS_ENV}/SDL/sdl_build" CACHE FILEPATH "SDL b MESSAGE("SDL_BUILD_DIR: ${SDL_BUILD_DIR}") -SET(USE_SDL OFF CACHE BOOL "Use SDL for client UI instead of Qt") -MESSAGE("USE_SDL (instead of Qt): ${USE_SDL}") - - -# External library directory (apart from llvm, openssl and Qt) +SET(USE_SDL OFF CACHE BOOL "Use SDL for client UI instead of Qt") +MESSAGE("USE_SDL (instead of Qt): ${USE_SDL}") + +SET(XR_SUPPORT OFF CACHE BOOL "Enable experimental XR/OpenXR integration for native clients") +MESSAGE("XR_SUPPORT: ${XR_SUPPORT}") + +set(default_openxr_sdk_dir "") +if(EXISTS "${GLARE_CORE_LIBS_ENV}/OpenXR-SDK-1.1.57/install/cmake/OpenXRConfig.cmake") + set(default_openxr_sdk_dir "${GLARE_CORE_LIBS_ENV}/OpenXR-SDK-1.1.57/install") +endif() +SET(OPENXR_SDK_DIR "${default_openxr_sdk_dir}" CACHE PATH "Path to installed OpenXR SDK root (contains include/, lib/, cmake/)") +MESSAGE("OPENXR_SDK_DIR: ${OPENXR_SDK_DIR}") + + +# External library directory (apart from llvm, openssl and Qt) set(imathdir "${GLARE_CORE_TRUNK_DIR_ENV}/Imath") set(openexrdir "${GLARE_CORE_TRUNK_DIR_ENV}/OpenEXR") set(zlibdir "${GLARE_CORE_TRUNK_DIR_ENV}/zlib") @@ -299,7 +309,7 @@ ADD_SUBDIRECTORY(server server) #ADD_SUBDIRECTORY(lightmapper_bot lightmapper_bot) -#ADD_SUBDIRECTORY(screenshot_bot screenshot_bot) +ADD_SUBDIRECTORY(screenshot_bot screenshot_bot) #ADD_SUBDIRECTORY(${SUBSTRATA_PRIVATE_REPO_PATH}/eth_bot eth_bot) diff --git a/README.md b/README.md index a1f52bb95..aca10db80 100644 --- a/README.md +++ b/README.md @@ -1,99 +1,37 @@ +# ❄️ Metasiberia - metaverse from Siberia ❄️ -Substrata is an open-source metaverse, developed by Glare Technologies Limited, see https://substrata.info/. +[![C++](https://img.shields.io/badge/C%2B%2B-20-00599C?logo=cplusplus&logoColor=white)](https://isocpp.org/) +[![Build](https://img.shields.io/badge/build-CMake-064F8C?logo=cmake&logoColor=white)](https://cmake.org/) +[![UI](https://img.shields.io/badge/UI-Qt%205%20%7C%20Qt%206%20%7C%20SDL-41CD52)](https://www.qt.io/) +[![Platforms](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20Android-1F6FEB)](https://github.com/shipilovden/sub-metasiberia) +[![Windows CI](https://img.shields.io/github/actions/workflow/status/shipilovden/sub-metasiberia/windows-main-ci.yml?branch=master&label=Windows%20CI)](https://github.com/shipilovden/sub-metasiberia/actions/workflows/windows-main-ci.yml) +[![Linux Configure](https://img.shields.io/github/actions/workflow/status/shipilovden/sub-metasiberia/cmake-configure-linux.yml?branch=master&label=Linux%20Configure)](https://github.com/shipilovden/sub-metasiberia/actions/workflows/cmake-configure-linux.yml) +[![License](https://img.shields.io/github/license/shipilovden/sub-metasiberia)](LICENCE) +[![Stars](https://img.shields.io/github/stars/shipilovden/sub-metasiberia?style=social)](https://github.com/shipilovden/sub-metasiberia/stargazers) +[![Admin](https://img.shields.io/website?url=https%3A%2F%2Fvr.metasiberia.com%2F&up_message=online&down_message=offline&label=admin&logo=googlechrome)](https://vr.metasiberia.com/) +[![Signup](https://img.shields.io/website?url=https%3A%2F%2Fvr.metasiberia.com%2Fsignup&up_message=online&down_message=offline&label=signup&logo=googlechrome)](https://vr.metasiberia.com/signup) +[![Website](https://img.shields.io/website?url=https%3A%2F%2Fmetasiberia.com%2F&up_message=online&down_message=offline&label=website&logo=googlechrome)](https://metasiberia.com/) -The Substrata client and server are native apps written in C++, that support Windows, Mac and Linux. -There is also an in-development web-client. +Metasiberia is a virtual world project inspired by and based on the open-source Substrata software. -You can build the Substrata client or Substrata server from this repository. +## Quick Access -![main screenshot](https://github.com/glaretechnologies/substrata/assets/30285/38a6db93-e729-4f15-8561-5c848eb5391c) +- **🛠 Admin**: [https://vr.metasiberia.com/](https://vr.metasiberia.com/) +- **📝 Signup**: [https://vr.metasiberia.com/signup](https://vr.metasiberia.com/signup) +- **🌐 Web Client**: [https://vr.metasiberia.com/webclient](https://vr.metasiberia.com/webclient) +- **🏠 Website**: [https://metasiberia.com/](https://metasiberia.com/) +![](docs/images/metasiberia.png) -## Usage examples +## Community and Support -You can always visit the main Substrata world at substrata.info - this is the server that we run, and the main gathering point for Substrata users. However you are also welcome to run your own server! You can do this using by building the server from this repository, or using one of the prebuilt binaries. +[![VK](https://img.shields.io/badge/VK-metasiberia__official-0077FF?logo=vk&logoColor=white)](https://vk.com/metasiberia_official) +[![Telegram](https://img.shields.io/badge/Telegram-metasiberia__channel-26A5E4?logo=telegram&logoColor=white)](https://t.me/metasiberia_channel) -### 3D model Visualisation +## Credits -Substrata is perfect for multi-user visualisation of 3d models. Walk around a digital twin model with your team, hosted on an on-premises server! +**Metasiberia** is inspired and based on **Substrata**. -### Education - -Because Substrata is open source, you can build and run your own world for students without paying any licensing fees. - -## Get Involved - -We welcome contributions from people! - -Chat about Substrata on the Substrata discord here: https://discord.gg/3Ds9cxyEnZ - -Feel free to drop a message on the discord if you are having trouble building Substrata, or have any questions about it. - - - -## Building - -See [docs/building.txt](docs/building.txt) for build instructions. - -## Features - -### High performance, physically-based rendering engine - -Substrata uses the Glare engine (https://github.com/glaretechnologies/glare-core), which produces realistic graphics while rendering the entire Substrata world - e.g. over 12000 objects with user-generated content at 200 fps. - -* The Glare engine is designed for metaverses, in particular large numbers of varied objects. -* Automatic level of detail generation -* Streaming loading and unloading of objects without hitches as the player moves around -* Physically-based rendering -* Highly realistic sun/sky/daylight system derived from a multiple scattering ray-tracing atmospheric simulation in https://www.indigorenderer.com/ -* Skeletal animation system with procedural animations and animation retargetting for sharing animation data amongst avatars with varied sizes -* Runtime texture compression for making best use of GPU memory -* GLTF, OBJ import, plus supports many image formats -* Terrain and water rendering -* Particle system for rendering dust, water splashes, smoke etc. - -![boat](https://github.com/glaretechnologies/substrata/assets/30285/0dde612a-ea95-49af-bc64-07f1a7114c7f) - - -### Networked physics simulation - -We have integrated the Jolt physics engine (https://github.com/jrouwe/JoltPhysics), and have implemented a networked physics simulation on top of it. -What that means is that multiple players can interact with objects in a world, drive vehicles, push objects etc. in a realistic way. - -Physics-based vehicles: (Image links are to videos on YouTube) - - - -Networked physics: - - - - -Handling lots of interactive objects: - - - - -### Spatial Audio and Voice Chat - -Substrata has built-in spatial audio and voice chat, without using any third-party services or servers. - - -### In-world building - -The substrata client has controls for creating and editing objects, as well as for editing voxels - - - - - - -You can add objects to the world from your local machine, and they will be automatically uploaded to the server and be visible to other users. - -## Get help - -Chat about Substrata on the Substrata discord here: https://discord.gg/3Ds9cxyEnZ - -Feel free to drop a message on the discord if you are having trouble building Substrata, or have any questions about it. - -Alternatively, feel free to create a github issue. +[![Original Substrata](https://img.shields.io/badge/GitHub-glaretechnologies%2Fsubstrata-181717?logo=github&logoColor=white)](https://github.com/glaretechnologies/substrata) +[![Substrata Creator](https://img.shields.io/badge/X-%40NickChapmn-000000?logo=x&logoColor=white)](https://x.com/NickChapmn) +[![Metasiberia Author](https://img.shields.io/badge/X-%40denshipilovart-000000?logo=x&logoColor=white)](https://x.com/denshipilovart) diff --git a/gui_client/AvatarGraphics.cpp b/gui_client/AvatarGraphics.cpp index 65cb46367..951fda902 100644 --- a/gui_client/AvatarGraphics.cpp +++ b/gui_client/AvatarGraphics.cpp @@ -6,8 +6,9 @@ Copyright Glare Technologies Limited 2021 - #include "AvatarGraphics.h" -#include "AnimationManager.h" -#include "PhysicsWorld.h" +#include "AnimationManager.h" +#include "AvatarGroundingUtils.h" +#include "PhysicsWorld.h" #include "ParticleManager.h" #include "../shared/GestureSettings.h" #include "opengl/OpenGLEngine.h" @@ -46,11 +47,12 @@ AvatarGraphics::AvatarGraphics(Avatar* avatar_) next_eye_target_os = Vec4f(0,0,1,1); eye_start_transition_time = -2; eye_end_transition_time = -1; - saccade_gap = 0.5; - - last_cam_rotation_time = 0; - - cur_head_rot_z = 0; + saccade_gap = 0.5; + + last_cam_rotation_time = 0; + avatar_eye_height_above_ground = AvatarGrounding::kDefaultAvatarEyeHeightM; + + cur_head_rot_z = 0; //cur_head_rot_quat = Quatf::identity(); turn_anim_end_time = -1; @@ -158,7 +160,7 @@ void AvatarGraphics::setOverallTransform(OpenGLEngine& engine, PhysicsWorld& phy // We will translate the position of the capsule down from eye position to the centre of the avatar. // TODO: rotate based on current head bone and hip bone relative position? const Vec4f last_eye_pos = getLastHeadPosition(); // Use animated head position so it works for animations with root motion. - physics_world.setNewPosition(*physics_ob, last_eye_pos - Vec4f(0, 0, EYE_HEIGHT / 2.f, 0)); + physics_world.setNewPosition(*physics_ob, last_eye_pos - Vec4f(0, 0, avatar_eye_height_above_ground / 2.f, 0)); } @@ -847,7 +849,7 @@ void AvatarGraphics::setOverallTransform(OpenGLEngine& engine, PhysicsWorld& phy lowest_bone_z_os = myMin(lowest_bone_z_os, left_foot_pos_os[2]); } - const float lowest_node_height_above_ground = lowest_bone_z_os + 1.67f - 0.03f; // Translate up by default eye height. + const float lowest_node_height_above_ground = lowest_bone_z_os + avatar_eye_height_above_ground - 0.03f; float vertical_adjustment = 0; if(lowest_node_height_above_ground < 0) @@ -984,8 +986,8 @@ void AvatarGraphics::setOverallTransform(OpenGLEngine& engine, PhysicsWorld& phy const float NECK_FACTOR = 0.5f; // relative to amount of head rotation and translation //const float pitch_move_forwards_factor = head_pitch_amount * 0.0f * NECK_FACTOR; const float neck_yaw_amount = head_yaw_amount * NECK_FACTOR; - const float neck_pitch_amount = 0.3f + head_pitch_amount * NECK_FACTOR; // Idle pose neck rotation is 0.5. A value of 0 gives a very erect posture. Use 0.3 as a compromise. - // Note that ideally we would compute the neck pitch as some fraction betweeen 0.3 and head pitch amount. + // Keep neutral XR head pose aligned with the horizon instead of baking in a constant downward neck tilt. + const float neck_pitch_amount = head_pitch_amount * NECK_FACTOR; //Matrix4f neck_rot = Matrix4f::translationMatrix(0, 0, pitch_move_forwards_factor /*- fabs(yaw_amount) * 0.04 * NECK_FACTOR*/) * // Matrix4f::rotationAroundZAxis(-0.2f * head_yaw_amount * NECK_FACTOR) * Matrix4f::rotationAroundYAxis(head_yaw_amount * NECK_FACTOR) * Matrix4f::rotationAroundXAxis(head_pitch_amount * NECK_FACTOR); @@ -1264,12 +1266,17 @@ void AvatarGraphics::build(bool our_avatar_) running_backwards_anim_i = findAnimation(*skinned_gl_ob, "Running Backward"); floating_anim_i = findAnimation(*skinned_gl_ob, "Floating"); flying_anim_i = findAnimation(*skinned_gl_ob, "Flying"); - turn_left_anim_i = findAnimation(*skinned_gl_ob, "Left Turn"); - turn_right_anim_i = findAnimation(*skinned_gl_ob, "Right Turn"); - - const AnimationData& anim_data = skinned_gl_ob->mesh_data->animation_data; - - // root_node_i = skinned_gl_ob->mesh_data->animation_data.getNodeIndex("player_rig"); + turn_left_anim_i = findAnimation(*skinned_gl_ob, "Left Turn"); + turn_right_anim_i = findAnimation(*skinned_gl_ob, "Right Turn"); + + const AnimationData& anim_data = skinned_gl_ob->mesh_data->animation_data; + avatar_eye_height_above_ground = AvatarGrounding::computeGroundingInfo( + anim_data, + /*use_retarget_adjustment=*/true, + AvatarGrounding::kRetargetedToeBottomOffsetM + ).eye_height_above_ground; + + // root_node_i = skinned_gl_ob->mesh_data->animation_data.getNodeIndex("player_rig"); neck_node_i = skinned_gl_ob->mesh_data->animation_data.getNodeIndex("Neck"); head_node_i = skinned_gl_ob->mesh_data->animation_data.getNodeIndex("Head"); diff --git a/gui_client/AvatarGraphics.h b/gui_client/AvatarGraphics.h index 595c8aa2f..f3a49bb4b 100644 --- a/gui_client/AvatarGraphics.h +++ b/gui_client/AvatarGraphics.h @@ -268,10 +268,11 @@ class AvatarGraphics : public ThreadSafeRefCounted int RightHandPinky3_i; int RightHandPinky4_i; - float upper_right_arm_len, lower_right_arm_len; - float upper_left_arm_len, lower_left_arm_len; - - Avatar* avatar; + float upper_right_arm_len, lower_right_arm_len; + float upper_left_arm_len, lower_left_arm_len; + float avatar_eye_height_above_ground; + + Avatar* avatar; bool our_avatar; Reference physics_ob; }; diff --git a/gui_client/AvatarGroundingUtils.h b/gui_client/AvatarGroundingUtils.h new file mode 100644 index 000000000..a8282e8b6 --- /dev/null +++ b/gui_client/AvatarGroundingUtils.h @@ -0,0 +1,74 @@ +#pragma once + +#include +#include + + +namespace AvatarGrounding +{ +static constexpr float kDefaultAvatarEyeHeightM = 1.67f; +static constexpr float kHeadNodeToEyesOffsetM = 0.076f; +static constexpr float kDefaultToeBottomOffsetM = 0.0362269469f; +static constexpr float kRetargetedToeBottomOffsetM = 0.03f; + + +struct GroundingInfo +{ + float foot_bottom_height; + float anchor_height_from_origin; + float eye_height_above_ground; +}; + + +inline bool tryGetNodeHeight(const AnimationData& animation_data, const char* node_name, bool use_retarget_adjustment, float& height_out) +{ + const int node_i = animation_data.getNodeIndex(node_name); + if(node_i < 0) + return false; + + const Vec4f node_pos = animation_data.getNodePositionModelSpace(node_i, use_retarget_adjustment); + if(!std::isfinite(node_pos[1])) + return false; + + height_out = node_pos[1]; + return true; +} + + +inline GroundingInfo computeGroundingInfo(const AnimationData& animation_data, bool use_retarget_adjustment, float toe_bottom_offset_m) +{ + GroundingInfo info = {}; + + float toe_height = toe_bottom_offset_m; + if(tryGetNodeHeight(animation_data, "LeftToe_End", use_retarget_adjustment, toe_height)) + info.foot_bottom_height = toe_height - toe_bottom_offset_m; + else + info.foot_bottom_height = 0.0f; + + float left_eye_height = 0.0f; + float right_eye_height = 0.0f; + float head_height = 0.0f; + const bool has_left_eye = tryGetNodeHeight(animation_data, "LeftEye", use_retarget_adjustment, left_eye_height); + const bool has_right_eye = tryGetNodeHeight(animation_data, "RightEye", use_retarget_adjustment, right_eye_height); + + if(has_left_eye && has_right_eye) + info.anchor_height_from_origin = 0.5f * (left_eye_height + right_eye_height); + else if(has_left_eye) + info.anchor_height_from_origin = left_eye_height; + else if(has_right_eye) + info.anchor_height_from_origin = right_eye_height; + else if(tryGetNodeHeight(animation_data, "Head", use_retarget_adjustment, head_height)) + info.anchor_height_from_origin = head_height + kHeadNodeToEyesOffsetM; + else + info.anchor_height_from_origin = info.foot_bottom_height + kDefaultAvatarEyeHeightM; + + info.eye_height_above_ground = info.anchor_height_from_origin - info.foot_bottom_height; + if(!(std::isfinite(info.eye_height_above_ground) && (info.eye_height_above_ground > 0.1f))) + { + info.eye_height_above_ground = kDefaultAvatarEyeHeightM; + info.anchor_height_from_origin = info.foot_bottom_height + info.eye_height_above_ground; + } + + return info; +} +} diff --git a/gui_client/AvatarSettingsDialog.cpp b/gui_client/AvatarSettingsDialog.cpp index aa1a5a045..3a4bf751d 100644 --- a/gui_client/AvatarSettingsDialog.cpp +++ b/gui_client/AvatarSettingsDialog.cpp @@ -6,8 +6,9 @@ Copyright Glare Technologies Limited 2022 - #include "AvatarSettingsDialog.h" -#include "AddObjectDialog.h" -#include "ModelLoading.h" +#include "AddObjectDialog.h" +#include "AvatarGroundingUtils.h" +#include "ModelLoading.h" #include "AnimationManager.h" #include "../shared/ResourceManager.h" #include "../indigo/TextureServer.h" @@ -201,32 +202,35 @@ void AvatarSettingsDialog::loadModelIntoPreview(const std::string& local_path, b original_left_eye_pos = Vec4f(0,1.67,0,1); }*/ - Vec4f original_toe_pos = preview_gl_ob->mesh_data->animation_data.getNodePositionModelSpace("LeftToe_End", /*use_retarget_adjustment=*/false); - - // TEMP: Load animation data for ready-player-me type avatars - //float eye_height_adjustment = 0; - float foot_bottom_height = original_toe_pos[1] - 0.0362269469; // Should be ~= 0 - //printVar(foot_bottom_height); - if(true) - { - // Append the first animation (Idle) and build the retargetting data. - preview_gl_ob->mesh_data->animation_data.loadAndRetargetAnim(*anim_manager->getAnimation("Idle.subanim", *resource_manager)); - - // Append all the other animations - for(size_t i=0; imesh_data->animation_data.appendAnimationData(*anim_manager->getAnimation(URLString(anim_names[i]) + ".subanim", *resource_manager)); - - - // If we loaded the extracted_avatar_anim bone data, then the avatar will be floating off the ground for female leg lengths, so move down. - //eye_height_adjustment = -1.67 + original_left_eye_pos[1]; - - Vec4f new_toe_pos = preview_gl_ob->mesh_data->animation_data.getNodePositionModelSpace("LeftToe_End", /*use_retarget_adjustment=*/true); - conPrint("new_toe_pos: " + new_toe_pos.toStringNSigFigs(4)); - - foot_bottom_height = new_toe_pos[1] - 0.03; // Height of foot bottom for avatar with retargetted animation, off ground. - - conPrint("foot_bottom_height: " + doubleToStringNSigFigs(foot_bottom_height, 4)); - } + AnimationData& animation_data = preview_gl_ob->mesh_data->animation_data; + AvatarGrounding::GroundingInfo grounding = AvatarGrounding::computeGroundingInfo( + animation_data, + /*use_retarget_adjustment=*/false, + AvatarGrounding::kDefaultToeBottomOffsetM + ); + float foot_bottom_height = grounding.foot_bottom_height; + float avatar_anchor_height = grounding.anchor_height_from_origin; + //printVar(foot_bottom_height); + if(true) + { + // Append the first animation (Idle) and build the retargetting data. + animation_data.loadAndRetargetAnim(*anim_manager->getAnimation("Idle.subanim", *resource_manager)); + + // Append all the other animations + for(size_t i=0; igetAnimation(URLString(anim_names[i]) + ".subanim", *resource_manager)); + + grounding = AvatarGrounding::computeGroundingInfo( + animation_data, + /*use_retarget_adjustment=*/true, + AvatarGrounding::kRetargetedToeBottomOffsetM + ); + foot_bottom_height = grounding.foot_bottom_height; + avatar_anchor_height = grounding.anchor_height_from_origin; + + conPrint("foot_bottom_height: " + doubleToStringNSigFigs(foot_bottom_height, 4)); + conPrint("avatar_anchor_height: " + doubleToStringNSigFigs(avatar_anchor_height, 4)); + } // Populate current animation combobox with anim names animationComboBox->clear(); @@ -238,9 +242,8 @@ void AvatarSettingsDialog::loadModelIntoPreview(const std::string& local_path, b preview_gl_ob->current_anim_i = myMax(0, preview_gl_ob->mesh_data->animation_data.getAnimationIndex("Idle")); SignalBlocker::setCurrentIndex(animationComboBox, preview_gl_ob->current_anim_i); - // Construct transformation to bring ready-player-me avatars to z-up and standing on the ground. - // We want to translate the avatar down from 1.67 metres in the sky (which is the default substrata eye height), to the ground - this->pre_ob_to_world_matrix = Matrix4f::translationMatrix(0, 0, -1.67 - foot_bottom_height) * preview_gl_ob->ob_to_world_matrix; + // Align the avatar eye level with the camera origin using eye bones when available. + this->pre_ob_to_world_matrix = Matrix4f::translationMatrix(0, 0, -avatar_anchor_height) * preview_gl_ob->ob_to_world_matrix; preview_gl_ob->ob_to_world_matrix = Matrix4f::translationMatrix(0, 0, -foot_bottom_height) * preview_gl_ob->ob_to_world_matrix; diff --git a/gui_client/CMakeLists.txt b/gui_client/CMakeLists.txt index af6424f84..91fc382e8 100644 --- a/gui_client/CMakeLists.txt +++ b/gui_client/CMakeLists.txt @@ -9,6 +9,25 @@ endif() include(../cmake/shared_settings.cmake) include(../cmake/shared_cxx_settings.cmake) +if(XR_SUPPORT) + if(EMSCRIPTEN) + message(FATAL_ERROR "XR_SUPPORT is only supported for native builds.") + endif() + + if(OPENXR_SDK_DIR STREQUAL "") + message(FATAL_ERROR "XR_SUPPORT=ON requires OPENXR_SDK_DIR to point to an installed OpenXR SDK root.") + endif() + + if(NOT EXISTS "${OPENXR_SDK_DIR}/cmake/OpenXRConfig.cmake") + message(FATAL_ERROR "Could not find OpenXRConfig.cmake in '${OPENXR_SDK_DIR}/cmake'. Please set -DOPENXR_SDK_DIR to an installed OpenXR SDK root.") + endif() + + find_package(OpenXR CONFIG REQUIRED PATHS "${OPENXR_SDK_DIR}/cmake" NO_DEFAULT_PATH) +endif() + +# Needed for webcam/* headers that are included as "webcam/..." from within gui_client/webcam sources. +include_directories(${CMAKE_SOURCE_DIR}/gui_client) + if(NOT EMSCRIPTEN) include(../cmake/winter.cmake) endif() @@ -62,6 +81,7 @@ if(NOT USE_SDL) addMocFileRule(gui_client GuiClientApplication) addMocFileRule(gui_client GlWidget) addMocFileRule(gui_client AvatarSettingsDialog) + addMocFileRule(gui_client AvatarSettingsWidget) addMocFileRule(gui_client AvatarPreviewWidget) addMocFileRule(gui_client AddObjectDialog) addMocFileRule(gui_client AddVideoDialog) @@ -80,6 +100,8 @@ if(NOT USE_SDL) addMocFileRule(gui_client IndigoView) addMocFileRule(gui_client ShaderEditorDialog) addMocFileRule(gui_client AboutDialog) + addMocFileRule(gui_client UpdateDialog) + addMocFileRule(gui_client UpdateManager) addMocFileRule(gui_client MainOptionsDialog) addMocFileRule(gui_client MainOptionsDialog) addMocFileRule(gui_client GoToParcelDialog) @@ -91,6 +113,13 @@ if(NOT USE_SDL) addMocFileRule(gui_client TerrainSpecSectionWidget) addMocFileRule(gui_client WorldSettingsWidget) addMocFileRule(gui_client CreateObjectsDialog) + addMocFileRule(gui_client VRoidAuthFlow) + + # Webcam Qt UI (Qt Multimedia). Not built for SDL configurations. + addMocFileRule(gui_client/webcam WebcamWindow) + addMocFileRule(gui_client/webcam WebcamVideoView) + addMocFileRule(gui_client/webcam WebcamControlPanel) + addMocFileRule(gui_client/webcam WebcamSettingsDialog) addMocFileRule(qt FileSelectWidget) addMocFileRule(qt RealControl) @@ -101,6 +130,7 @@ if(NOT USE_SDL) addUIFileRule(gui_client AddObjectDialog) addUIFileRule(gui_client AddVideoDialog) addUIFileRule(gui_client AvatarSettingsDialog) + addUIFileRule(gui_client AvatarSettingsWidget) addUIFileRule(gui_client MainWindow) addUIFileRule(gui_client ObjectEditor) addUIFileRule(gui_client EnvironmentOptionsWidget) @@ -251,6 +281,12 @@ ${CMAKE_SOURCE_DIR}/gui_client/URLParser.h ${CMAKE_SOURCE_DIR}/gui_client/URLWhitelist.cpp ${CMAKE_SOURCE_DIR}/gui_client/URLWhitelist.h ${CMAKE_SOURCE_DIR}/gui_client/VehiclePhysics.h +${CMAKE_SOURCE_DIR}/gui_client/XRSupport.cpp +${CMAKE_SOURCE_DIR}/gui_client/XRSupport.h +${CMAKE_SOURCE_DIR}/gui_client/XRSession.cpp +${CMAKE_SOURCE_DIR}/gui_client/XRSession.h +${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamCapture.cpp +${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamCapture.h ${CMAKE_SOURCE_DIR}/gui_client/WebViewData.cpp ${CMAKE_SOURCE_DIR}/gui_client/WebViewData.h ${CMAKE_SOURCE_DIR}/gui_client/WinterShaderEvaluator.cpp @@ -300,6 +336,9 @@ else() ${CMAKE_SOURCE_DIR}/gui_client/AvatarSettingsDialog.cpp ${CMAKE_SOURCE_DIR}/gui_client/AvatarSettingsDialog.h ${CMAKE_SOURCE_DIR}/gui_client/AvatarSettingsDialog.ui + ${CMAKE_SOURCE_DIR}/gui_client/AvatarSettingsWidget.cpp + ${CMAKE_SOURCE_DIR}/gui_client/AvatarSettingsWidget.h + ${CMAKE_SOURCE_DIR}/gui_client/AvatarSettingsWidget.ui ${CMAKE_SOURCE_DIR}/gui_client/ChangePasswordDialog.cpp ${CMAKE_SOURCE_DIR}/gui_client/ChangePasswordDialog.h ${CMAKE_SOURCE_DIR}/gui_client/ChangePasswordDialog.ui @@ -340,6 +379,10 @@ else() ${CMAKE_SOURCE_DIR}/gui_client/MainWindow.h ${CMAKE_SOURCE_DIR}/gui_client/MainWindow.ui ${CMAKE_SOURCE_DIR}/gui_client/MainWindowTestCode.txt + ${CMAKE_SOURCE_DIR}/gui_client/UpdateDialog.cpp + ${CMAKE_SOURCE_DIR}/gui_client/UpdateDialog.h + ${CMAKE_SOURCE_DIR}/gui_client/UpdateManager.cpp + ${CMAKE_SOURCE_DIR}/gui_client/UpdateManager.h ${CMAKE_SOURCE_DIR}/gui_client/MaterialBrowser.cpp ${CMAKE_SOURCE_DIR}/gui_client/MaterialBrowser.h ${CMAKE_SOURCE_DIR}/gui_client/MaterialBrowser.ui @@ -379,15 +422,29 @@ else() ${CMAKE_SOURCE_DIR}/gui_client/CreateObjectsDialog.cpp ${CMAKE_SOURCE_DIR}/gui_client/CreateObjectsDialog.h ${CMAKE_SOURCE_DIR}/gui_client/CreateObjectsDialog.ui + + # Webcam Qt UI (Qt Multimedia). Not built for SDL configurations. + ${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamWindow.cpp + ${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamWindow.h + ${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamVideoView.cpp + ${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamVideoView.h + ${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamControlPanel.cpp + ${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamControlPanel.h + ${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamSettingsDialog.cpp + ${CMAKE_SOURCE_DIR}/gui_client/webcam/WebcamSettingsDialog.h ) endif() -if(NOT USE_SDL) + if(NOT USE_SDL) SET(gui_client ${gui_client} + ${CMAKE_SOURCE_DIR}/gui_client/VRoidAuthFlow.cpp + ${CMAKE_SOURCE_DIR}/gui_client/VRoidAuthFlow.h + ${CMAKE_SOURCE_DIR}/gui_client/moc_MainWindow.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_GuiClientApplication.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_GlWidget.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_AvatarSettingsDialog.cpp + ${CMAKE_SOURCE_DIR}/gui_client/moc_AvatarSettingsWidget.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_AvatarPreviewWidget.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_AddObjectDialog.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_AddVideoDialog.cpp @@ -406,6 +463,8 @@ if(NOT USE_SDL) ${CMAKE_SOURCE_DIR}/gui_client/moc_IndigoView.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_ShaderEditorDialog.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_AboutDialog.cpp + ${CMAKE_SOURCE_DIR}/gui_client/moc_UpdateDialog.cpp + ${CMAKE_SOURCE_DIR}/gui_client/moc_UpdateManager.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_MainOptionsDialog.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_GoToParcelDialog.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_GoToPositionDialog.cpp @@ -416,10 +475,18 @@ if(NOT USE_SDL) ${CMAKE_SOURCE_DIR}/gui_client/moc_TerrainSpecSectionWidget.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_WorldSettingsWidget.cpp ${CMAKE_SOURCE_DIR}/gui_client/moc_CreateObjectsDialog.cpp + ${CMAKE_SOURCE_DIR}/gui_client/moc_VRoidAuthFlow.cpp + + # Webcam Qt UI (Qt Multimedia) + ${CMAKE_SOURCE_DIR}/gui_client/webcam/moc_WebcamWindow.cpp + ${CMAKE_SOURCE_DIR}/gui_client/webcam/moc_WebcamControlPanel.cpp + ${CMAKE_SOURCE_DIR}/gui_client/webcam/moc_WebcamVideoView.cpp + ${CMAKE_SOURCE_DIR}/gui_client/webcam/moc_WebcamSettingsDialog.cpp ${CMAKE_SOURCE_DIR}/gui_client/ui_AddObjectDialog.h ${CMAKE_SOURCE_DIR}/gui_client/ui_AddVideoDialog.h ${CMAKE_SOURCE_DIR}/gui_client/ui_AvatarSettingsDialog.h + ${CMAKE_SOURCE_DIR}/gui_client/ui_AvatarSettingsWidget.h ${CMAKE_SOURCE_DIR}/gui_client/ui_ObjectEditor.h ${CMAKE_SOURCE_DIR}/gui_client/ui_EnvironmentOptionsWidget.h ${CMAKE_SOURCE_DIR}/gui_client/ui_ParcelEditor.h @@ -588,7 +655,7 @@ if(USE_SDL) ) else() set(settings - ${settings} + ${settings} ${GLARE_CORE_TRUNK_DIR_ENV}/settings/RegistrySettingsStore.cpp ${GLARE_CORE_TRUNK_DIR_ENV}/settings/RegistrySettingsStore.h ) @@ -621,22 +688,22 @@ if(1) ../resonance-audio/resonance_audio/ambisonics/ambisonic_binaural_decoder.cc ../resonance-audio/resonance_audio/ambisonics/ambisonic_binaural_decoder.h ../resonance-audio/resonance_audio/ambisonics/ambisonic_codec.h - ../resonance-audio/resonance_audio/ambisonics/ambisonic_binaural_decoder.cc - ../resonance-audio/resonance_audio/ambisonics/ambisonic_binaural_decoder.h - ../resonance-audio/resonance_audio/ambisonics/ambisonic_codec.h - ../resonance-audio/resonance_audio/ambisonics/ambisonic_codec_impl.h - ../resonance-audio/resonance_audio/ambisonics/ambisonic_lookup_table.cc - ../resonance-audio/resonance_audio/ambisonics/ambisonic_lookup_table.h - ../resonance-audio/resonance_audio/ambisonics/ambisonic_spread_coefficients.h - ../resonance-audio/resonance_audio/ambisonics/associated_legendre_polynomials_generator.cc - ../resonance-audio/resonance_audio/ambisonics/associated_legendre_polynomials_generator.h - ../resonance-audio/resonance_audio/ambisonics/foa_rotator.cc - ../resonance-audio/resonance_audio/ambisonics/foa_rotator.h - ../resonance-audio/resonance_audio/ambisonics/hoa_rotator.cc - ../resonance-audio/resonance_audio/ambisonics/hoa_rotator.h - ../resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter.cc - ../resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter.h - ../resonance-audio/resonance_audio/ambisonics/utils.h + ../resonance-audio/resonance_audio/ambisonics/ambisonic_binaural_decoder.cc + ../resonance-audio/resonance_audio/ambisonics/ambisonic_binaural_decoder.h + ../resonance-audio/resonance_audio/ambisonics/ambisonic_codec.h + ../resonance-audio/resonance_audio/ambisonics/ambisonic_codec_impl.h + ../resonance-audio/resonance_audio/ambisonics/ambisonic_lookup_table.cc + ../resonance-audio/resonance_audio/ambisonics/ambisonic_lookup_table.h + ../resonance-audio/resonance_audio/ambisonics/ambisonic_spread_coefficients.h + ../resonance-audio/resonance_audio/ambisonics/associated_legendre_polynomials_generator.cc + ../resonance-audio/resonance_audio/ambisonics/associated_legendre_polynomials_generator.h + ../resonance-audio/resonance_audio/ambisonics/foa_rotator.cc + ../resonance-audio/resonance_audio/ambisonics/foa_rotator.h + ../resonance-audio/resonance_audio/ambisonics/hoa_rotator.cc + ../resonance-audio/resonance_audio/ambisonics/hoa_rotator.h + ../resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter.cc + ../resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter.h + ../resonance-audio/resonance_audio/ambisonics/utils.h ) set(res_api @@ -645,123 +712,123 @@ if(1) ) set(res_base - ../resonance-audio/resonance_audio/base/aligned_allocator.h - ../resonance-audio/resonance_audio/base/audio_buffer.cc - ../resonance-audio/resonance_audio/base/audio_buffer.h - ../resonance-audio/resonance_audio/base/channel_view.cc - ../resonance-audio/resonance_audio/base/channel_view.h - ../resonance-audio/resonance_audio/base/constants_and_types.h - ../resonance-audio/resonance_audio/base/integral_types.h - ../resonance-audio/resonance_audio/base/logging.h - ../resonance-audio/resonance_audio/base/misc_math.cc - ../resonance-audio/resonance_audio/base/misc_math.h - ../resonance-audio/resonance_audio/base/object_transform.h - ../resonance-audio/resonance_audio/base/simd_macros.h - ../resonance-audio/resonance_audio/base/simd_utils.cc - ../resonance-audio/resonance_audio/base/simd_utils.h - ../resonance-audio/resonance_audio/base/source_parameters.h - ../resonance-audio/resonance_audio/base/spherical_angle.cc - ../resonance-audio/resonance_audio/base/spherical_angle.h - ../resonance-audio/resonance_audio/base/unique_ptr_wrapper.h + ../resonance-audio/resonance_audio/base/aligned_allocator.h + ../resonance-audio/resonance_audio/base/audio_buffer.cc + ../resonance-audio/resonance_audio/base/audio_buffer.h + ../resonance-audio/resonance_audio/base/channel_view.cc + ../resonance-audio/resonance_audio/base/channel_view.h + ../resonance-audio/resonance_audio/base/constants_and_types.h + ../resonance-audio/resonance_audio/base/integral_types.h + ../resonance-audio/resonance_audio/base/logging.h + ../resonance-audio/resonance_audio/base/misc_math.cc + ../resonance-audio/resonance_audio/base/misc_math.h + ../resonance-audio/resonance_audio/base/object_transform.h + ../resonance-audio/resonance_audio/base/simd_macros.h + ../resonance-audio/resonance_audio/base/simd_utils.cc + ../resonance-audio/resonance_audio/base/simd_utils.h + ../resonance-audio/resonance_audio/base/source_parameters.h + ../resonance-audio/resonance_audio/base/spherical_angle.cc + ../resonance-audio/resonance_audio/base/spherical_angle.h + ../resonance-audio/resonance_audio/base/unique_ptr_wrapper.h ) set(res_dsp - ../resonance-audio/resonance_audio/dsp/biquad_filter.cc - ../resonance-audio/resonance_audio/dsp/biquad_filter.h - ../resonance-audio/resonance_audio/dsp/channel_converter.cc - ../resonance-audio/resonance_audio/dsp/channel_converter.h - ../resonance-audio/resonance_audio/dsp/circular_buffer.cc - ../resonance-audio/resonance_audio/dsp/circular_buffer.h - ../resonance-audio/resonance_audio/dsp/delay_filter.cc - ../resonance-audio/resonance_audio/dsp/delay_filter.h - ../resonance-audio/resonance_audio/dsp/distance_attenuation.cc - ../resonance-audio/resonance_audio/dsp/distance_attenuation.h - ../resonance-audio/resonance_audio/dsp/fft_manager.cc - ../resonance-audio/resonance_audio/dsp/fft_manager.h - ../resonance-audio/resonance_audio/dsp/filter_coefficient_generators.cc - ../resonance-audio/resonance_audio/dsp/filter_coefficient_generators.h - ../resonance-audio/resonance_audio/dsp/fir_filter.cc - ../resonance-audio/resonance_audio/dsp/fir_filter.h - ../resonance-audio/resonance_audio/dsp/gain.cc - ../resonance-audio/resonance_audio/dsp/gain.h - ../resonance-audio/resonance_audio/dsp/gain_mixer.cc - ../resonance-audio/resonance_audio/dsp/gain_mixer.h - ../resonance-audio/resonance_audio/dsp/gain_processor.cc - ../resonance-audio/resonance_audio/dsp/gain_processor.h - ../resonance-audio/resonance_audio/dsp/mixer.cc - ../resonance-audio/resonance_audio/dsp/mixer.h - ../resonance-audio/resonance_audio/dsp/mono_pole_filter.cc - ../resonance-audio/resonance_audio/dsp/mono_pole_filter.h - ../resonance-audio/resonance_audio/dsp/multi_channel_iir.cc - ../resonance-audio/resonance_audio/dsp/multi_channel_iir.h - ../resonance-audio/resonance_audio/dsp/near_field_processor.cc - ../resonance-audio/resonance_audio/dsp/near_field_processor.h - ../resonance-audio/resonance_audio/dsp/occlusion_calculator.cc - ../resonance-audio/resonance_audio/dsp/occlusion_calculator.h - ../resonance-audio/resonance_audio/dsp/partitioned_fft_filter.cc - ../resonance-audio/resonance_audio/dsp/partitioned_fft_filter.h - ../resonance-audio/resonance_audio/dsp/reflection.h - ../resonance-audio/resonance_audio/dsp/reflections_processor.cc - ../resonance-audio/resonance_audio/dsp/reflections_processor.h - ../resonance-audio/resonance_audio/dsp/resampler.cc - ../resonance-audio/resonance_audio/dsp/resampler.h - ../resonance-audio/resonance_audio/dsp/reverb_onset_compensator.cc - ../resonance-audio/resonance_audio/dsp/reverb_onset_compensator.h - ../resonance-audio/resonance_audio/dsp/reverb_onset_update_processor.cc - ../resonance-audio/resonance_audio/dsp/reverb_onset_update_processor.h - ../resonance-audio/resonance_audio/dsp/shoe_box_room.cc - ../resonance-audio/resonance_audio/dsp/shoe_box_room.h - ../resonance-audio/resonance_audio/dsp/sh_hrir_creator.cc - ../resonance-audio/resonance_audio/dsp/sh_hrir_creator.h - ../resonance-audio/resonance_audio/dsp/spectral_reverb.cc - ../resonance-audio/resonance_audio/dsp/spectral_reverb.h - ../resonance-audio/resonance_audio/dsp/spectral_reverb_constants_and_tables.h - ../resonance-audio/resonance_audio/dsp/stereo_panner.cc - ../resonance-audio/resonance_audio/dsp/stereo_panner.h - ../resonance-audio/resonance_audio/dsp/utils.cc - ../resonance-audio/resonance_audio/dsp/utils.h + ../resonance-audio/resonance_audio/dsp/biquad_filter.cc + ../resonance-audio/resonance_audio/dsp/biquad_filter.h + ../resonance-audio/resonance_audio/dsp/channel_converter.cc + ../resonance-audio/resonance_audio/dsp/channel_converter.h + ../resonance-audio/resonance_audio/dsp/circular_buffer.cc + ../resonance-audio/resonance_audio/dsp/circular_buffer.h + ../resonance-audio/resonance_audio/dsp/delay_filter.cc + ../resonance-audio/resonance_audio/dsp/delay_filter.h + ../resonance-audio/resonance_audio/dsp/distance_attenuation.cc + ../resonance-audio/resonance_audio/dsp/distance_attenuation.h + ../resonance-audio/resonance_audio/dsp/fft_manager.cc + ../resonance-audio/resonance_audio/dsp/fft_manager.h + ../resonance-audio/resonance_audio/dsp/filter_coefficient_generators.cc + ../resonance-audio/resonance_audio/dsp/filter_coefficient_generators.h + ../resonance-audio/resonance_audio/dsp/fir_filter.cc + ../resonance-audio/resonance_audio/dsp/fir_filter.h + ../resonance-audio/resonance_audio/dsp/gain.cc + ../resonance-audio/resonance_audio/dsp/gain.h + ../resonance-audio/resonance_audio/dsp/gain_mixer.cc + ../resonance-audio/resonance_audio/dsp/gain_mixer.h + ../resonance-audio/resonance_audio/dsp/gain_processor.cc + ../resonance-audio/resonance_audio/dsp/gain_processor.h + ../resonance-audio/resonance_audio/dsp/mixer.cc + ../resonance-audio/resonance_audio/dsp/mixer.h + ../resonance-audio/resonance_audio/dsp/mono_pole_filter.cc + ../resonance-audio/resonance_audio/dsp/mono_pole_filter.h + ../resonance-audio/resonance_audio/dsp/multi_channel_iir.cc + ../resonance-audio/resonance_audio/dsp/multi_channel_iir.h + ../resonance-audio/resonance_audio/dsp/near_field_processor.cc + ../resonance-audio/resonance_audio/dsp/near_field_processor.h + ../resonance-audio/resonance_audio/dsp/occlusion_calculator.cc + ../resonance-audio/resonance_audio/dsp/occlusion_calculator.h + ../resonance-audio/resonance_audio/dsp/partitioned_fft_filter.cc + ../resonance-audio/resonance_audio/dsp/partitioned_fft_filter.h + ../resonance-audio/resonance_audio/dsp/reflection.h + ../resonance-audio/resonance_audio/dsp/reflections_processor.cc + ../resonance-audio/resonance_audio/dsp/reflections_processor.h + ../resonance-audio/resonance_audio/dsp/resampler.cc + ../resonance-audio/resonance_audio/dsp/resampler.h + ../resonance-audio/resonance_audio/dsp/reverb_onset_compensator.cc + ../resonance-audio/resonance_audio/dsp/reverb_onset_compensator.h + ../resonance-audio/resonance_audio/dsp/reverb_onset_update_processor.cc + ../resonance-audio/resonance_audio/dsp/reverb_onset_update_processor.h + ../resonance-audio/resonance_audio/dsp/shoe_box_room.cc + ../resonance-audio/resonance_audio/dsp/shoe_box_room.h + ../resonance-audio/resonance_audio/dsp/sh_hrir_creator.cc + ../resonance-audio/resonance_audio/dsp/sh_hrir_creator.h + ../resonance-audio/resonance_audio/dsp/spectral_reverb.cc + ../resonance-audio/resonance_audio/dsp/spectral_reverb.h + ../resonance-audio/resonance_audio/dsp/spectral_reverb_constants_and_tables.h + ../resonance-audio/resonance_audio/dsp/stereo_panner.cc + ../resonance-audio/resonance_audio/dsp/stereo_panner.h + ../resonance-audio/resonance_audio/dsp/utils.cc + ../resonance-audio/resonance_audio/dsp/utils.h ) set(res_graph - ../resonance-audio/resonance_audio/graph/ambisonic_binaural_decoder_node.cc - ../resonance-audio/resonance_audio/graph/ambisonic_binaural_decoder_node.h - ../resonance-audio/resonance_audio/graph/ambisonic_mixing_encoder_node.cc - ../resonance-audio/resonance_audio/graph/ambisonic_mixing_encoder_node.h - ../resonance-audio/resonance_audio/graph/binaural_surround_renderer_impl.cc - ../resonance-audio/resonance_audio/graph/binaural_surround_renderer_impl.h - ../resonance-audio/resonance_audio/graph/buffered_source_node.cc - ../resonance-audio/resonance_audio/graph/buffered_source_node.h - ../resonance-audio/resonance_audio/graph/foa_rotator_node.cc - ../resonance-audio/resonance_audio/graph/foa_rotator_node.h - ../resonance-audio/resonance_audio/graph/gain_mixer_node.cc - ../resonance-audio/resonance_audio/graph/gain_mixer_node.h - ../resonance-audio/resonance_audio/graph/gain_node.cc - ../resonance-audio/resonance_audio/graph/gain_node.h - ../resonance-audio/resonance_audio/graph/graph_manager.cc - ../resonance-audio/resonance_audio/graph/graph_manager.h - ../resonance-audio/resonance_audio/graph/graph_manager_config.h - ../resonance-audio/resonance_audio/graph/hoa_rotator_node.cc - ../resonance-audio/resonance_audio/graph/hoa_rotator_node.h - ../resonance-audio/resonance_audio/graph/mixer_node.cc - ../resonance-audio/resonance_audio/graph/mixer_node.h - ../resonance-audio/resonance_audio/graph/mono_from_soundfield_node.cc - ../resonance-audio/resonance_audio/graph/mono_from_soundfield_node.h - ../resonance-audio/resonance_audio/graph/near_field_effect_node.cc - ../resonance-audio/resonance_audio/graph/near_field_effect_node.h - ../resonance-audio/resonance_audio/graph/occlusion_node.cc - ../resonance-audio/resonance_audio/graph/occlusion_node.h - ../resonance-audio/resonance_audio/graph/reflections_node.cc - ../resonance-audio/resonance_audio/graph/reflections_node.h - ../resonance-audio/resonance_audio/graph/resonance_audio_api_impl.cc - ../resonance-audio/resonance_audio/graph/resonance_audio_api_impl.h - ../resonance-audio/resonance_audio/graph/reverb_node.cc - ../resonance-audio/resonance_audio/graph/reverb_node.h - ../resonance-audio/resonance_audio/graph/source_graph_config.h - ../resonance-audio/resonance_audio/graph/source_parameters_manager.cc - ../resonance-audio/resonance_audio/graph/source_parameters_manager.h - ../resonance-audio/resonance_audio/graph/stereo_mixing_panner_node.cc - ../resonance-audio/resonance_audio/graph/stereo_mixing_panner_node.h - ../resonance-audio/resonance_audio/graph/system_settings.h + ../resonance-audio/resonance_audio/graph/ambisonic_binaural_decoder_node.cc + ../resonance-audio/resonance_audio/graph/ambisonic_binaural_decoder_node.h + ../resonance-audio/resonance_audio/graph/ambisonic_mixing_encoder_node.cc + ../resonance-audio/resonance_audio/graph/ambisonic_mixing_encoder_node.h + ../resonance-audio/resonance_audio/graph/binaural_surround_renderer_impl.cc + ../resonance-audio/resonance_audio/graph/binaural_surround_renderer_impl.h + ../resonance-audio/resonance_audio/graph/buffered_source_node.cc + ../resonance-audio/resonance_audio/graph/buffered_source_node.h + ../resonance-audio/resonance_audio/graph/foa_rotator_node.cc + ../resonance-audio/resonance_audio/graph/foa_rotator_node.h + ../resonance-audio/resonance_audio/graph/gain_mixer_node.cc + ../resonance-audio/resonance_audio/graph/gain_mixer_node.h + ../resonance-audio/resonance_audio/graph/gain_node.cc + ../resonance-audio/resonance_audio/graph/gain_node.h + ../resonance-audio/resonance_audio/graph/graph_manager.cc + ../resonance-audio/resonance_audio/graph/graph_manager.h + ../resonance-audio/resonance_audio/graph/graph_manager_config.h + ../resonance-audio/resonance_audio/graph/hoa_rotator_node.cc + ../resonance-audio/resonance_audio/graph/hoa_rotator_node.h + ../resonance-audio/resonance_audio/graph/mixer_node.cc + ../resonance-audio/resonance_audio/graph/mixer_node.h + ../resonance-audio/resonance_audio/graph/mono_from_soundfield_node.cc + ../resonance-audio/resonance_audio/graph/mono_from_soundfield_node.h + ../resonance-audio/resonance_audio/graph/near_field_effect_node.cc + ../resonance-audio/resonance_audio/graph/near_field_effect_node.h + ../resonance-audio/resonance_audio/graph/occlusion_node.cc + ../resonance-audio/resonance_audio/graph/occlusion_node.h + ../resonance-audio/resonance_audio/graph/reflections_node.cc + ../resonance-audio/resonance_audio/graph/reflections_node.h + ../resonance-audio/resonance_audio/graph/resonance_audio_api_impl.cc + ../resonance-audio/resonance_audio/graph/resonance_audio_api_impl.h + ../resonance-audio/resonance_audio/graph/reverb_node.cc + ../resonance-audio/resonance_audio/graph/reverb_node.h + ../resonance-audio/resonance_audio/graph/source_graph_config.h + ../resonance-audio/resonance_audio/graph/source_parameters_manager.cc + ../resonance-audio/resonance_audio/graph/source_parameters_manager.h + ../resonance-audio/resonance_audio/graph/stereo_mixing_panner_node.cc + ../resonance-audio/resonance_audio/graph/stereo_mixing_panner_node.h + ../resonance-audio/resonance_audio/graph/system_settings.h ) set(res_config @@ -784,54 +851,54 @@ if(1) set(res_platforms ../resonance-audio/platforms/common/common_utils.cc - ../resonance-audio/platforms/common/room_effects_utils.cc - ../resonance-audio/platforms/common/room_effects_utils.h - ../resonance-audio/platforms/common/room_properties.h - ../resonance-audio/platforms/common/utils.h + ../resonance-audio/platforms/common/room_effects_utils.cc + ../resonance-audio/platforms/common/room_effects_utils.h + ../resonance-audio/platforms/common/room_properties.h + ../resonance-audio/platforms/common/utils.h ) set(res_node - ../resonance-audio/resonance_audio/node/node.h - ../resonance-audio/resonance_audio/node/processing_node.cc - ../resonance-audio/resonance_audio/node/processing_node.h - ../resonance-audio/resonance_audio/node/publisher_node.h - ../resonance-audio/resonance_audio/node/sink_node.cc - ../resonance-audio/resonance_audio/node/sink_node.h - ../resonance-audio/resonance_audio/node/source_node.cc - ../resonance-audio/resonance_audio/node/source_node.h - ../resonance-audio/resonance_audio/node/subscriber_node.h + ../resonance-audio/resonance_audio/node/node.h + ../resonance-audio/resonance_audio/node/processing_node.cc + ../resonance-audio/resonance_audio/node/processing_node.h + ../resonance-audio/resonance_audio/node/publisher_node.h + ../resonance-audio/resonance_audio/node/sink_node.cc + ../resonance-audio/resonance_audio/node/sink_node.h + ../resonance-audio/resonance_audio/node/source_node.cc + ../resonance-audio/resonance_audio/node/source_node.h + ../resonance-audio/resonance_audio/node/subscriber_node.h ) set(res_utils - ../resonance-audio/resonance_audio/utils/buffer_crossfader.cc - ../resonance-audio/resonance_audio/utils/buffer_crossfader.h - ../resonance-audio/resonance_audio/utils/buffer_partitioner.cc - ../resonance-audio/resonance_audio/utils/buffer_partitioner.h - ../resonance-audio/resonance_audio/utils/buffer_unpartitioner.cc - ../resonance-audio/resonance_audio/utils/buffer_unpartitioner.h - ../resonance-audio/resonance_audio/utils/lockless_task_queue.cc - ../resonance-audio/resonance_audio/utils/lockless_task_queue.h - #../resonance-audio/resonance_audio/utils/ogg_vorbis_recorder.cc - #../resonance-audio/resonance_audio/utils/ogg_vorbis_recorder.h - ../resonance-audio/resonance_audio/utils/planar_interleaved_conversion.cc - ../resonance-audio/resonance_audio/utils/planar_interleaved_conversion.h - ../resonance-audio/resonance_audio/utils/pseudoinverse.h - ../resonance-audio/resonance_audio/utils/sample_type_conversion.cc - ../resonance-audio/resonance_audio/utils/sample_type_conversion.h - ../resonance-audio/resonance_audio/utils/semi_lockless_fifo.h - ../resonance-audio/resonance_audio/utils/sum_and_difference_processor.cc - ../resonance-audio/resonance_audio/utils/sum_and_difference_processor.h - ../resonance-audio/resonance_audio/utils/task_thread_pool.cc - ../resonance-audio/resonance_audio/utils/task_thread_pool.h - #../resonance-audio/resonance_audio/utils/test_util.cc - #../resonance-audio/resonance_audio/utils/test_util.h - ../resonance-audio/resonance_audio/utils/threadsafe_fifo.h - #../resonance-audio/resonance_audio/utils/vorbis_stream_encoder.cc - #../resonance-audio/resonance_audio/utils/vorbis_stream_encoder.h - ../resonance-audio/resonance_audio/utils/wav.cc - ../resonance-audio/resonance_audio/utils/wav.h - ../resonance-audio/resonance_audio/utils/wav_reader.cc - ../resonance-audio/resonance_audio/utils/wav_reader.h + ../resonance-audio/resonance_audio/utils/buffer_crossfader.cc + ../resonance-audio/resonance_audio/utils/buffer_crossfader.h + ../resonance-audio/resonance_audio/utils/buffer_partitioner.cc + ../resonance-audio/resonance_audio/utils/buffer_partitioner.h + ../resonance-audio/resonance_audio/utils/buffer_unpartitioner.cc + ../resonance-audio/resonance_audio/utils/buffer_unpartitioner.h + ../resonance-audio/resonance_audio/utils/lockless_task_queue.cc + ../resonance-audio/resonance_audio/utils/lockless_task_queue.h + #../resonance-audio/resonance_audio/utils/ogg_vorbis_recorder.cc + #../resonance-audio/resonance_audio/utils/ogg_vorbis_recorder.h + ../resonance-audio/resonance_audio/utils/planar_interleaved_conversion.cc + ../resonance-audio/resonance_audio/utils/planar_interleaved_conversion.h + ../resonance-audio/resonance_audio/utils/pseudoinverse.h + ../resonance-audio/resonance_audio/utils/sample_type_conversion.cc + ../resonance-audio/resonance_audio/utils/sample_type_conversion.h + ../resonance-audio/resonance_audio/utils/semi_lockless_fifo.h + ../resonance-audio/resonance_audio/utils/sum_and_difference_processor.cc + ../resonance-audio/resonance_audio/utils/sum_and_difference_processor.h + ../resonance-audio/resonance_audio/utils/task_thread_pool.cc + ../resonance-audio/resonance_audio/utils/task_thread_pool.h + #../resonance-audio/resonance_audio/utils/test_util.cc + #../resonance-audio/resonance_audio/utils/test_util.h + ../resonance-audio/resonance_audio/utils/threadsafe_fifo.h + #../resonance-audio/resonance_audio/utils/vorbis_stream_encoder.cc + #../resonance-audio/resonance_audio/utils/vorbis_stream_encoder.h + ../resonance-audio/resonance_audio/utils/wav.cc + ../resonance-audio/resonance_audio/utils/wav.h + ../resonance-audio/resonance_audio/utils/wav_reader.cc + ../resonance-audio/resonance_audio/utils/wav_reader.h ) @@ -1068,7 +1135,7 @@ if(APPLE) # Plist stuff. SET(MACOSX_BUNDLE_ICON_FILE Cyberspace.icns) SET(MACOSX_BUNDLE_COPYRIGHT "Copyright 2022 Glare Technologies Ltd.") - SET(MACOSX_BUNDLE_BUNDLE_NAME "Substrata") + SET(MACOSX_BUNDLE_BUNDLE_NAME "Metasiberia Beta") SET(MACOSX_BUNDLE_BUNDLE_VERSION "${SUBSTRATA_VERSION}") SET(MACOSX_BUNDLE_SHORT_VERSION_STRING "${SUBSTRATA_VERSION}") SET(MACOSX_BUNDLE_GUI_IDENTIFIER com.glaretechnologies.substrata) @@ -1132,23 +1199,27 @@ ${settings} add_definitions(-DGUI_CLIENT=1) +if(XR_SUPPORT) + add_definitions(-DXR_SUPPORT=1) +endif() + include(../cmake/shared_target_settings.cmake) if(USE_SDL) include_directories(${SDL_BUILD_DIR}/include/SDL2) - + if(WIN32) include_directories(${SDL_BUILD_DIR}/include-config-release/SDL2) # For SDL_config.h. NOTE: SDL_config.h seems to be the same for both Debug and Release configs, at least on Windows. else() include_directories(${SDL_BUILD_DIR}/include-config-/SDL2) endif() - + add_definitions(-DUSE_SDL=1) else() # Else use Qt: add_definitions(-DUSE_QT=1) endif() - + if(EMSCRIPTEN) target_link_libraries(${CURRENT_TARGET} @@ -1156,9 +1227,9 @@ if(EMSCRIPTEN) Jolt # Jolt physics Opus ) - + # Note that a bunch of Emscripten C++ options are set in shared_cxx_settings.cmake as well. - + # Emscripten worker threads: # -------------------------- # main_task_manager: 8 @@ -1170,9 +1241,9 @@ if(EMSCRIPTEN) # StreamerThread 1 # UploadResourceThread 1 # GarbageDeleterThread 1 - # + # # Total: 30 - + target_link_options(${CURRENT_TARGET} PRIVATE "-sMIN_WEBGL_VERSION=2" "-sMAX_WEBGL_VERSION=2" @@ -1186,41 +1257,41 @@ if(EMSCRIPTEN) "-sPTHREAD_POOL_SIZE=30" # See calculation above "-sSTACK_SIZE=262144" "-sEXPORTED_RUNTIME_METHODS=ccall" # Needed to be able to call into C++ from JS. Used in emscripten_browser_clipboard. - "-sEXPORTED_FUNCTIONS=_processFilePickerFile,_malloc,_free,_main" + "-sEXPORTED_FUNCTIONS=_processAvatarModelFile,_processGestureAnimationFile,_malloc,_free,_main" "-lwebsocket.js" # To use emscripten websockets API: https://emscripten.org/docs/porting/networking.html#emscripten-websockets-api --use-preload-cache # Cache the preloaded data in IndexedDB for subsequent page visits. --preload-file data # Use preloaded data, read it from the 'data' directory in the Emscripten build dir. ) - + set_target_properties(${CURRENT_TARGET} PROPERTIES LINK_DEPENDS "data") - + elseif(WIN32) add_definitions(-D__WINDOWS_DS__) # Add directsound config choice define for RTAudio - + if((NOT FUZZING) AND (NOT (USE_SANITIZER STREQUAL ""))) SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /ZI") # ZI = Set debug info format to 'Program Database for Edit & Continue' for debug builds. # It slows down the code too much to use for RelWithDebInfo builds. endif() - + if(NOT (USE_SANITIZER STREQUAL "")) # To avoid "cl : command line error D8016: '/ZI' and '/fsanitize=address' command-line options are incompatible" - SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Zi") - SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zi") + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Zi") + SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi") + SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zi") endif() - - - + + + # Enable Tracy profiler for RELEASE and RELWITHDEBINFO configs. Can't enable for Debug config because it clashes with Edit & Continue (/ZI). if(TRACY_ENABLED) add_definitions(-DTRACY_ENABLE=1) endif() - + if(BUGSPLAT_SUPPORT) add_definitions(-DBUGSPLAT_SUPPORT=1) # Enable BugSplat support endif() - + if(CEF_SUPPORT) add_definitions(-DCEF_SUPPORT=1) # Enable Chromium Embedded Framework (CEF) support (Used for WebView). endif() @@ -1229,41 +1300,41 @@ elseif(WIN32) OpenGL32 # Media foundation video reading: - mfplat.lib - mfreadwrite.lib + mfplat.lib + mfreadwrite.lib mfuuid.lib Mf.lib d3d11.lib DXGI.lib - + # RtAudio: ole32 - winmm + winmm dsound - + # Jolt physics Jolt - + Opus ) - + if(INDIGO_SUPPORT) target_link_libraries(${CURRENT_TARGET} debug C:/programming/indigo/output/vs2022/indigo_x64/Debug/indigo_sdk_lib.lib optimized C:/programming/indigo/output/vs2022/indigo_x64/RelWithDebInfo/indigo_sdk_lib.lib ) endif() - + if(USE_SDL) target_link_libraries(${CURRENT_TARGET} - debug "${SDL_BUILD_DIR}/Debug/SDL2d.lib" - debug "${SDL_BUILD_DIR}/Debug/SDL2maind.lib" - optimized "${SDL_BUILD_DIR}/RelWithDebInfo/SDL2.lib" - optimized "${SDL_BUILD_DIR}/RelWithDebInfo/SDL2main.lib" + debug "${SDL_BUILD_DIR}/Debug/SDL2d.lib" + debug "${SDL_BUILD_DIR}/Debug/SDL2maind.lib" + optimized "${SDL_BUILD_DIR}/RelWithDebInfo/SDL2.lib" + optimized "${SDL_BUILD_DIR}/RelWithDebInfo/SDL2main.lib" ) else() # Else use Qt: target_link_libraries(${CURRENT_TARGET} - + # Qt 6: # optimized Qt6Gui # optimized Qt6Core @@ -1277,34 +1348,40 @@ elseif(WIN32) # debug Qt6Widgetsd # debug Qt6OpenGLWidgetsd # debug Qt6Core5Compatd - + # Qt 5: optimized qtmain optimized Qt5Gui optimized Qt5Core optimized Qt5OpenGL optimized Qt5Widgets + optimized Qt5Multimedia + optimized Qt5MultimediaWidgets + optimized Qt5Network optimized Qt5Gamepad debug qtmaind debug Qt5Guid debug Qt5Cored debug Qt5OpenGLd debug Qt5Widgetsd + debug Qt5Multimediad + debug Qt5MultimediaWidgetsd + debug Qt5Networkd debug Qt5Gamepadd ) endif() - + # Chromium embedded framework if(CEF_SUPPORT) target_link_libraries(${CURRENT_TARGET} debug ${cef_binary_dist_dir}/Debug/libcef.lib optimized ${cef_binary_dist_dir}/Release/libcef.lib - + debug ${cef_binary_dist_dir}/libcef_dll_build/libcef_dll_wrapper/Debug/libcef_dll_wrapper.lib optimized ${cef_binary_dist_dir}/libcef_dll_build/libcef_dll_wrapper/Release/libcef_dll_wrapper.lib ) endif() - + if(BUGSPLAT_SUPPORT) target_link_libraries(${CURRENT_TARGET} optimized ${GLARE_CORE_LIBS_ENV}/BugSplat/BugSplat/x64/Release/BugSplat64.lib @@ -1319,21 +1396,21 @@ elseif(WIN32) debug "C:/Program Files/Superluminal/Performance/API/lib/x64/PerformanceAPI_MDd.lib" ) endif() - + # target_link_options(${CURRENT_TARGET} PRIVATE "/SUBSYSTEM:CONSOLE") # Disable ASLR (/DYNAMICBASE) #get_target_property(OLD_TARGET_PROPERTIES ${CURRENT_TARGET} LINK_FLAGS) #set_target_properties(${CURRENT_TARGET} PROPERTIES LINK_FLAGS "${OLD_TARGET_PROPERTIES} /DYNAMICBASE:NO") elseif(APPLE) - + if(CEF_SUPPORT) add_definitions(-DCEF_SUPPORT=1) # Enable Chromium Embedded Framework (CEF) support (Used for WebView). endif() add_definitions(-D__MACOSX_CORE__) # Add CoreAudio config choice define for RTAudio add_definitions(-DGL_SILENCE_DEPRECATION) # Tell Mac to shut up about OpenGL being deprecated - + set_target_properties(${CURRENT_TARGET} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/osx/CyberspaceInfo.plist.in") if(CEF_SUPPORT) @@ -1341,12 +1418,12 @@ elseif(APPLE) # Chromium embedded framework #debug ${cef_binary_dist_dir}/Debug/libcef.lib #optimized ${cef_binary_dist_dir}/Release/libcef.lib - + debug ${cef_binary_dist_dir}/libcef_dll_build/libcef_dll_wrapper/libcef_dll_wrapper.a optimized ${cef_binary_dist_dir}/libcef_dll_build/libcef_dll_wrapper/libcef_dll_wrapper.a ) endif() - + if(USE_SDL) target_link_libraries(${CURRENT_TARGET} PRIVATE ${SDL_BUILD_DIR}/libSDL2.a @@ -1354,7 +1431,7 @@ elseif(APPLE) iconv ) endif() - + target_link_libraries(${CURRENT_TARGET} PRIVATE Jolt # Jolt physics Opus @@ -1362,19 +1439,19 @@ elseif(APPLE) ) get_target_property(OLD_TARGET_PROPERTIES ${CURRENT_TARGET} LINK_FLAGS) - + if(USE_SDL) set_target_properties(${CURRENT_TARGET} PROPERTIES LINK_FLAGS "${OLD_TARGET_PROPERTIES} -framework OpenGL -framework Security -framework CoreAudio -framework CoreFoundation -framework AudioToolbox -framework Cocoa -framework IOKit -framework GameController -framework CoreHaptics -framework CoreVideo -framework ForceFeedback -framework Carbon -framework Metal") else() # Qt 5: set_target_properties(${CURRENT_TARGET} PROPERTIES LINK_FLAGS "${OLD_TARGET_PROPERTIES} -F${INDIGO_QT_LIB_DIR} -framework QtCore -framework QtGui -framework QtWidgets -framework QtNetwork -framework QtOpenGL -framework QtMultimedia -framework OpenGL -framework QtGamepad -framework Security -framework CoreAudio -framework CoreFoundation -framework AudioToolbox") - + #Qt 6: #set_target_properties(${CURRENT_TARGET} PROPERTIES LINK_FLAGS "${OLD_TARGET_PROPERTIES} -F${INDIGO_QT_LIB_DIR} -framework QtCore -framework QtGui -framework QtWidgets -framework QtNetwork -framework QtOpenGL -framework QtOpenGLWidgets -framework QtMultimedia -framework OpenGL -framework Security -framework CoreAudio -framework CoreFoundation -framework AudioToolbox -framework QtCore5Compat") endif() - + #add_dependencies(${CURRENT_TARGET} "gui_client Helper.app") - + else() # linux if(CEF_SUPPORT) @@ -1383,6 +1460,12 @@ else() # linux add_definitions(-D__LINUX_PULSE__) # Add config choice define for RTAudio + if(USE_SDL) + target_link_libraries(${CURRENT_TARGET} PRIVATE + SDL2 + ) + endif() + target_link_libraries(${CURRENT_TARGET} PRIVATE GL Qt5Gui @@ -1390,6 +1473,7 @@ else() # linux Qt5OpenGL Qt5Widgets Qt5Multimedia + Qt5MultimediaWidgets Qt5Network Qt5Gamepad dl @@ -1399,7 +1483,7 @@ else() # linux Jolt # Jolt physics Opus ) - + if(CEF_SUPPORT) target_link_libraries(${CURRENT_TARGET} PRIVATE ${cef_binary_dist_dir}/libcef_dll_build/libcef_dll_wrapper/libcef_dll_wrapper.a @@ -1407,8 +1491,12 @@ else() # linux debug ${cef_binary_dist_dir}/Debug/libcef.so optimized ${cef_binary_dist_dir}/Release/libcef.so ) - endif() + endif() #get_target_property(OLD_TARGET_PROPERTIES ${CURRENT_TARGET} LINK_FLAGS) #set_target_properties(${CURRENT_TARGET} PROPERTIES LINK_FLAGS "${OLD_TARGET_PROPERTIES} -Xlinker -rpath='$ORIGIN/lib'") endif() + +if(XR_SUPPORT) + target_link_libraries(${CURRENT_TARGET} OpenXR::openxr_loader) +endif() diff --git a/gui_client/GUIClient.cpp b/gui_client/GUIClient.cpp index e7f39a1b2..a72d96d46 100644 --- a/gui_client/GUIClient.cpp +++ b/gui_client/GUIClient.cpp @@ -1,16620 +1,19541 @@ -/*===================================================================== -GUIClient.cpp -------------- -Copyright Glare Technologies Limited 2024 - -=====================================================================*/ - - -#include "GUIClient.h" -#include -#include "ClientThread.h" -#include "ModelLoading.h" -#include "MeshBuilding.h" -#include "ThreadMessages.h" -#include "TerrainSystem.h" -#include "TerrainDecalManager.h" -#include "LoadScriptTask.h" -#include "UploadResourceThread.h" -#include "DownloadResourcesThread.h" -#include "NetDownloadResourcesThread.h" -#include "ObjectPathController.h" -#include "AvatarGraphics.h" -#include "WinterShaderEvaluator.h" -#include "ClientUDPHandlerThread.h" -#include "URLWhitelist.h" -#include "URLParser.h" -#include "LoadModelTask.h" -#include "BuildScatteringInfoTask.h" -#include "LoadTextureTask.h" -#include "LoadAudioTask.h" -#include "../audio/MicReadThread.h" -#include "MakeHypercardTextureTask.h" -#include "SaveResourcesDBThread.h" -#include "GarbageDeleterThread.h" -#include "BiomeManager.h" -#include "WebViewData.h" -#include "BrowserVidPlayer.h" -#include "AnimatedTextureManager.h" -#include "ParticleManager.h" -#include "Scripting.h" -#include "HoverCarPhysics.h" -#include "BikePhysics.h" -#include "CarPhysics.h" -#include "BoatPhysics.h" -#include "JoltUtils.h" -#include "MiniMap.h" -#include "PhotoModeUI.h" -#include "CEF.h" -#include -#if !defined(EMSCRIPTEN) -#include "../networking/TLSSocket.h" -#endif -#include "../shared/Protocol.h" -#include "../shared/Version.h" -#include "../shared/LODGeneration.h" -#include "../shared/ImageDecoding.h" -#include "../shared/MessageUtils.h" -#include "../shared/FileTypes.h" -#include "../shared/LuaScriptEvaluator.h" -#include "../shared/SubstrataLuaVM.h" -#include "../shared/ObjectEventHandlers.h" -#include "../shared/WorldStateLock.h" -#include "../server/User.h" -#include "../shared/WorldSettings.h" -#include "../maths/Quat.h" -#include "../maths/GeometrySampling.h" -#include "../utils/Clock.h" -#include "../utils/Timer.h" -#include "../utils/PlatformUtils.h" -#include "../utils/ConPrint.h" -#include "../utils/Exception.h" -#include "../utils/TaskManager.h" -#include "../utils/SocketBufferOutStream.h" -#include "../utils/StringUtils.h" -#include "../utils/FileUtils.h" -#include "../utils/FileChecksum.h" -#include "../utils/Parser.h" -#include "../utils/OpenSSL.h" -#include "../utils/CryptoRNG.h" -#include "../utils/FileInStream.h" -#include "../utils/IncludeXXHash.h" -#include "../utils/IndigoXMLDoc.h" -#include "../utils/FastPoolAllocator.h" -#include "../utils/RuntimeCheck.h" -#include -#include "../utils/MemAlloc.h" -#include "../utils/UTF8Utils.h" -#include "../networking/Networking.h" -#include "../networking/URL.h" -#include "../graphics/ImageMap.h" -#include "../graphics/SRGBUtils.h" -#include "../graphics/BasisDecoder.h" -#include "../dll/include/IndigoMesh.h" -#include "../indigo/TextureServer.h" -#include