diff --git a/Axiom/Assets/AssetCooker.cpp b/Axiom/Assets/AssetCooker.cpp index 00196ffb..400381d2 100644 --- a/Axiom/Assets/AssetCooker.cpp +++ b/Axiom/Assets/AssetCooker.cpp @@ -265,6 +265,79 @@ CookTextureAsset(const std::filesystem::path &ContentRoot, return Entry; } +std::optional +CookHDRTextureAsset(const std::filesystem::path &ContentRoot, + const std::filesystem::path &RelativeAssetPath) { + const std::filesystem::path SourcePath = ContentRoot / RelativeAssetPath; + const auto SourceHash = HashFileContents(SourcePath); + if (!SourceHash.has_value()) { + A_CORE_WARN("AssetCooker: failed to hash source HDR texture '{}'", + SourcePath.string()); + return std::nullopt; + } + + const auto Texture = LoadHDRTextureFromSourceFile(SourcePath); + if (!Texture || !Texture->IsValid()) { + A_CORE_WARN("AssetCooker: failed to decode source HDR texture '{}'", + SourcePath.string()); + return std::nullopt; + } + + return CookHDRTextureAsset(ContentRoot, RelativeAssetPath, *Texture); +} + +std::optional +CookHDRTextureAsset(const std::filesystem::path &ContentRoot, + const std::filesystem::path &RelativeTexturePath, + const HDRTextureSourceData &Texture) { + const AssetId Asset = AssetIdFromRelativePath(RelativeTexturePath); + if (!Texture.IsValid()) { + A_CORE_WARN("AssetCooker: invalid generated HDR texture '{}'", + RelativeTexturePath.string()); + return std::nullopt; + } + + const std::filesystem::path CookedRelativePath = + BuildCookedTextureRelativePath(RelativeTexturePath); + const std::filesystem::path CookedAbsolutePath = ContentRoot / CookedRelativePath; + std::error_code Ec; + std::filesystem::create_directories(CookedAbsolutePath.parent_path(), Ec); + if (Ec) { + A_CORE_WARN("AssetCooker: failed to create cooked HDR texture directory '{}': {}", + CookedAbsolutePath.parent_path().string(), Ec.message()); + return std::nullopt; + } + + if (!SaveCookedHDRTextureAsset(CookedAbsolutePath, Texture, Asset)) { + return std::nullopt; + } + + const std::filesystem::path ManifestPath = + ContentRoot / "Cooked" / "AssetCookManifest.json"; + AssetCookManifest Manifest = + LoadAssetCookManifest(ManifestPath).value_or(AssetCookManifest{}); + + const uint64_t SourceHash = HashString( + std::to_string(Texture.Width) + "|" + std::to_string(Texture.Height) + + "|hdr|" + std::to_string(Texture.Pixels.size())); + + AssetCookManifestEntry Entry{ + .Id = Asset, + .Kind = AssetKind::Texture, + .RelativePath = RelativeTexturePath.generic_string(), + .CookedPath = CookedRelativePath.generic_string(), + .FormatVersion = kCookedTextureFormatVersion, + .SourceHash = SourceHash, + }; + UpsertManifestEntry(Manifest, Entry); + + if (!SaveAssetCookManifest(ManifestPath, Manifest)) { + return std::nullopt; + } + + return Entry; +} + std::optional CookMaterialAsset(const std::filesystem::path &ContentRoot, const std::filesystem::path &RelativeMaterialPath, diff --git a/Axiom/Assets/AssetCooker.h b/Axiom/Assets/AssetCooker.h index bf130e56..7c1ce8d2 100644 --- a/Axiom/Assets/AssetCooker.h +++ b/Axiom/Assets/AssetCooker.h @@ -28,6 +28,19 @@ CookTextureAsset(const std::filesystem::path &ContentRoot, const std::filesystem::path &RelativeTexturePath, const TextureSourceData &Texture); +// Decodes a source HDR texture (e.g. .hdr) from the content directory, writes +// a cooked v2 `.wtex` with float pixels, and updates the cook manifest. +std::optional +CookHDRTextureAsset(const std::filesystem::path &ContentRoot, + const std::filesystem::path &RelativeAssetPath); + +// Writes generated cooked HDR texture state under Content/Cooked and updates the +// cook manifest for the provided logical texture path. +std::optional +CookHDRTextureAsset(const std::filesystem::path &ContentRoot, + const std::filesystem::path &RelativeTexturePath, + const HDRTextureSourceData &Texture); + // Writes generated cooked material state under Content/Cooked and updates the // cook manifest for the provided logical material path. std::optional diff --git a/Axiom/Assets/CookedAssetRuntime.cpp b/Axiom/Assets/CookedAssetRuntime.cpp index 18063b53..e44fb761 100644 --- a/Axiom/Assets/CookedAssetRuntime.cpp +++ b/Axiom/Assets/CookedAssetRuntime.cpp @@ -103,6 +103,38 @@ LoadCookedTextureAssetIfAvailable(const std::filesystem::path &Path) { return std::make_shared(*CookedTexture); } +HDRTextureSourceDataRef +LoadCookedHDRTextureAssetIfAvailable(const std::filesystem::path &Path) { + const auto ContentRoot = FindContentRootForPath(Path); + if (!ContentRoot.has_value()) { + return nullptr; + } + + std::error_code Ec; + const auto RelativePath = std::filesystem::relative(Path, *ContentRoot, Ec); + if (Ec) { + return nullptr; + } + + const CookedAssetSource CookedSource(*ContentRoot); + if (!CookedSource.HasManifest()) { + return nullptr; + } + + const auto CookedPath = + CookedSource.Resolve(AssetIdFromRelativePath(RelativePath)); + if (!CookedPath.has_value()) { + return nullptr; + } + + const auto CookedTexture = LoadCookedHDRTextureAsset(*CookedPath); + if (!CookedTexture.has_value()) { + return nullptr; + } + + return std::make_shared(*CookedTexture); +} + std::optional LoadCookedMaterialAssetIfAvailable(const std::filesystem::path &Path) { const auto ContentRoot = FindContentRootForPath(Path); diff --git a/Axiom/Assets/CookedAssetRuntime.h b/Axiom/Assets/CookedAssetRuntime.h index 3db4b397..4eeb3846 100644 --- a/Axiom/Assets/CookedAssetRuntime.h +++ b/Axiom/Assets/CookedAssetRuntime.h @@ -20,6 +20,9 @@ LoadCookedMeshAssetIfAvailable(const std::filesystem::path &Path); TextureSourceDataRef LoadCookedTextureAssetIfAvailable(const std::filesystem::path &Path); +HDRTextureSourceDataRef +LoadCookedHDRTextureAssetIfAvailable(const std::filesystem::path &Path); + std::optional LoadCookedMaterialAssetIfAvailable(const std::filesystem::path &Path); diff --git a/Axiom/Assets/CookedTextureAsset.cpp b/Axiom/Assets/CookedTextureAsset.cpp index ff3b5e6a..49e9978b 100644 --- a/Axiom/Assets/CookedTextureAsset.cpp +++ b/Axiom/Assets/CookedTextureAsset.cpp @@ -35,6 +35,49 @@ template bool ReadValue(std::ifstream &Stream, T &Value) { return Stream.good(); } +bool WriteCommonHeader(std::ofstream &Stream, uint32_t Width, uint32_t Height, + uint32_t PixelByteCount, AssetId Asset) { + const FileHeader Header{ + .Magic = {kMagic[0], kMagic[1], kMagic[2], kMagic[3]}, + .Version = kCookedTextureFormatVersion, + .AssetIdValue = Asset.Value, + .Width = Width, + .Height = Height, + .ChannelCount = 4, + .PixelByteCount = PixelByteCount, + }; + return WriteValue(Stream, Header); +} + +bool ReadAndValidateHeader(std::ifstream &Stream, FileHeader &Header, + const std::filesystem::path &Path) { + if (!ReadValue(Stream, Header)) { + A_CORE_WARN("CookedTextureAsset: failed to read header from '{}'", + Path.string()); + return false; + } + + if (Header.Magic[0] != kMagic[0] || Header.Magic[1] != kMagic[1] || + Header.Magic[2] != kMagic[2] || Header.Magic[3] != kMagic[3]) { + A_CORE_WARN("CookedTextureAsset: invalid magic in '{}'", Path.string()); + return false; + } + + if (Header.Version != 1 && Header.Version != kCookedTextureFormatVersion) { + A_CORE_WARN("CookedTextureAsset: unsupported version {} in '{}'", + Header.Version, Path.string()); + return false; + } + + if (Header.ChannelCount != 4) { + A_CORE_WARN("CookedTextureAsset: unsupported channel count {} in '{}'", + Header.ChannelCount, Path.string()); + return false; + } + + return true; +} + } // namespace bool SaveCookedTextureAsset(const std::filesystem::path &Path, @@ -52,16 +95,13 @@ bool SaveCookedTextureAsset(const std::filesystem::path &Path, return false; } - const FileHeader Header{ - .Magic = {kMagic[0], kMagic[1], kMagic[2], kMagic[3]}, - .Version = kCookedTextureFormatVersion, - .AssetIdValue = Asset.Value, - .Width = Texture.Width, - .Height = Texture.Height, - .ChannelCount = 4, - .PixelByteCount = static_cast(Texture.Pixels.size()), - }; - if (!WriteValue(Stream, Header)) + if (!WriteCommonHeader(Stream, Texture.Width, Texture.Height, + static_cast(Texture.Pixels.size()), Asset)) + return false; + + const auto Format = + static_cast(CookedTexturePixelFormat::RGBA8); + if (!WriteValue(Stream, Format)) return false; Stream.write(reinterpret_cast(Texture.Pixels.data()), @@ -77,42 +117,123 @@ LoadCookedTextureAsset(const std::filesystem::path &Path) { } FileHeader Header{}; - if (!ReadValue(Stream, Header)) { - A_CORE_WARN("CookedTextureAsset: failed to read header from '{}'", + if (!ReadAndValidateHeader(Stream, Header, Path)) { + return std::nullopt; + } + + CookedTexturePixelFormat PixelFormat = CookedTexturePixelFormat::RGBA8; + if (Header.Version >= 2) { + uint32_t FormatRaw = 0; + if (!ReadValue(Stream, FormatRaw)) { + A_CORE_WARN("CookedTextureAsset: failed to read pixel format from '{}'", + Path.string()); + return std::nullopt; + } + PixelFormat = static_cast(FormatRaw); + } + + if (PixelFormat != CookedTexturePixelFormat::RGBA8) { + A_CORE_WARN("CookedTextureAsset: '{}' is an HDR texture; use " + "LoadCookedHDRTextureAsset instead", Path.string()); return std::nullopt; } - if (Header.Magic[0] != kMagic[0] || Header.Magic[1] != kMagic[1] || - Header.Magic[2] != kMagic[2] || Header.Magic[3] != kMagic[3]) { - A_CORE_WARN("CookedTextureAsset: invalid magic in '{}'", Path.string()); + TextureSourceData Texture; + Texture.Width = Header.Width; + Texture.Height = Header.Height; + Texture.Pixels.resize(Header.PixelByteCount); + Stream.read(reinterpret_cast(Texture.Pixels.data()), + static_cast(Texture.Pixels.size())); + if (!Stream.good()) { return std::nullopt; } - if (Header.Version != kCookedTextureFormatVersion) { - A_CORE_WARN("CookedTextureAsset: unsupported version {} in '{}'", - Header.Version, Path.string()); + if (!Texture.IsValid()) { + A_CORE_WARN("CookedTextureAsset: decoded invalid texture payload from '{}'", + Path.string()); return std::nullopt; } - if (Header.ChannelCount != 4) { - A_CORE_WARN("CookedTextureAsset: unsupported channel count {} in '{}'", - Header.ChannelCount, Path.string()); + return Texture; +} + +bool SaveCookedHDRTextureAsset(const std::filesystem::path &Path, + const HDRTextureSourceData &Texture, + AssetId Asset) { + if (!Texture.IsValid()) { + A_CORE_WARN("CookedTextureAsset: refusing to save invalid HDR texture '{}'", + Path.string()); + return false; + } + + std::ofstream Stream(Path, std::ios::binary); + if (!Stream.is_open()) { + A_CORE_ERROR("CookedTextureAsset: could not open '{}' for writing", + Path.string()); + return false; + } + + const uint32_t PixelByteCount = + static_cast(Texture.Pixels.size() * sizeof(float)); + if (!WriteCommonHeader(Stream, Texture.Width, Texture.Height, PixelByteCount, + Asset)) + return false; + + const auto Format = + static_cast(CookedTexturePixelFormat::RGBA32F); + if (!WriteValue(Stream, Format)) + return false; + + Stream.write(reinterpret_cast(Texture.Pixels.data()), + static_cast(PixelByteCount)); + return Stream.good(); +} + +std::optional +LoadCookedHDRTextureAsset(const std::filesystem::path &Path) { + std::ifstream Stream(Path, std::ios::binary); + if (!Stream.is_open()) { return std::nullopt; } - TextureSourceData Texture; + FileHeader Header{}; + if (!ReadAndValidateHeader(Stream, Header, Path)) { + return std::nullopt; + } + + if (Header.Version < 2) { + A_CORE_WARN("CookedTextureAsset: '{}' is a v1 LDR texture, not HDR", + Path.string()); + return std::nullopt; + } + + uint32_t FormatRaw = 0; + if (!ReadValue(Stream, FormatRaw)) { + A_CORE_WARN("CookedTextureAsset: failed to read pixel format from '{}'", + Path.string()); + return std::nullopt; + } + + if (static_cast(FormatRaw) != + CookedTexturePixelFormat::RGBA32F) { + A_CORE_WARN("CookedTextureAsset: '{}' is not an HDR texture", Path.string()); + return std::nullopt; + } + + HDRTextureSourceData Texture; Texture.Width = Header.Width; Texture.Height = Header.Height; - Texture.Pixels.resize(Header.PixelByteCount); + const size_t FloatCount = Header.PixelByteCount / sizeof(float); + Texture.Pixels.resize(FloatCount); Stream.read(reinterpret_cast(Texture.Pixels.data()), - static_cast(Texture.Pixels.size())); + static_cast(Header.PixelByteCount)); if (!Stream.good()) { return std::nullopt; } if (!Texture.IsValid()) { - A_CORE_WARN("CookedTextureAsset: decoded invalid texture payload from '{}'", + A_CORE_WARN("CookedTextureAsset: decoded invalid HDR payload from '{}'", Path.string()); return std::nullopt; } diff --git a/Axiom/Assets/CookedTextureAsset.h b/Axiom/Assets/CookedTextureAsset.h index abe8fb67..77e2d92b 100644 --- a/Axiom/Assets/CookedTextureAsset.h +++ b/Axiom/Assets/CookedTextureAsset.h @@ -8,7 +8,12 @@ namespace Axiom::Assets { -constexpr uint32_t kCookedTextureFormatVersion = 1; +constexpr uint32_t kCookedTextureFormatVersion = 2; + +enum class CookedTexturePixelFormat : uint32_t { + RGBA8 = 0, + RGBA32F = 1, +}; bool SaveCookedTextureAsset(const std::filesystem::path &Path, const TextureSourceData &Texture, AssetId Asset); @@ -16,4 +21,11 @@ bool SaveCookedTextureAsset(const std::filesystem::path &Path, std::optional LoadCookedTextureAsset(const std::filesystem::path &Path); +bool SaveCookedHDRTextureAsset(const std::filesystem::path &Path, + const HDRTextureSourceData &Texture, + AssetId Asset); + +std::optional +LoadCookedHDRTextureAsset(const std::filesystem::path &Path); + } // namespace Axiom::Assets diff --git a/Axiom/Assets/MeshAsset.cpp b/Axiom/Assets/MeshAsset.cpp index d152c3c5..f6d466bd 100644 --- a/Axiom/Assets/MeshAsset.cpp +++ b/Axiom/Assets/MeshAsset.cpp @@ -579,4 +579,52 @@ TextureSourceDataRef LoadTextureFromMemory(const unsigned char *Bytes, return DecodeTextureFromMemory( reinterpret_cast(Bytes), Length, DebugName); } + +HDRTextureSourceDataRef +LoadHDRTextureFromSourceFile(const std::filesystem::path &Path) { + int Width = 0; + int Height = 0; + int Channels = 0; + float *DecodedPixels = + stbi_loadf(Path.string().c_str(), &Width, &Height, &Channels, STBI_rgb_alpha); + if (DecodedPixels == nullptr) { + A_CORE_WARN("Failed to load HDR texture file {0}: {1}", Path.string(), + stbi_failure_reason()); + return nullptr; + } + + auto Texture = std::make_shared(); + Texture->Width = static_cast(Width); + Texture->Height = static_cast(Height); + const size_t FloatCount = + static_cast(Width) * static_cast(Height) * 4; + Texture->Pixels.assign(DecodedPixels, DecodedPixels + FloatCount); + stbi_image_free(DecodedPixels); + return Texture; +} + +HDRTextureSourceDataRef LoadHDRTextureFromFile(const std::filesystem::path &Path) { + const std::string Ext = ToLowerCopy(Path.extension().string()); + if (Ext == ".wtex") { + const auto Cooked = LoadCookedHDRTextureAsset(Path); + if (!Cooked.has_value()) { + return nullptr; + } + return std::make_shared(*Cooked); + } + + if (auto Cooked = LoadCookedHDRTextureAssetIfAvailable(Path); + Cooked != nullptr) { + return Cooked; + } + + if (IsCookedOnlyContentPath(Path)) { + A_CORE_WARN( + "Cooked runtime: missing cooked HDR texture asset for '{}' and source fallback is disabled", + Path.string()); + return nullptr; + } + + return LoadHDRTextureFromSourceFile(Path); +} } // namespace Axiom::Assets diff --git a/Axiom/Assets/MeshAsset.h b/Axiom/Assets/MeshAsset.h index 7ba40b84..ee62b920 100644 --- a/Axiom/Assets/MeshAsset.h +++ b/Axiom/Assets/MeshAsset.h @@ -14,4 +14,7 @@ TextureSourceDataRef LoadTextureFromFile(const std::filesystem::path &Path); TextureSourceDataRef LoadTextureFromSourceFile(const std::filesystem::path &Path); TextureSourceDataRef LoadTextureFromMemory(const unsigned char *Bytes, int Length, const std::string &DebugName); + +HDRTextureSourceDataRef LoadHDRTextureFromFile(const std::filesystem::path &Path); +HDRTextureSourceDataRef LoadHDRTextureFromSourceFile(const std::filesystem::path &Path); } // namespace Axiom::Assets diff --git a/Axiom/Renderer/Material.h b/Axiom/Renderer/Material.h index 75b32b7d..e2e28c24 100644 --- a/Axiom/Renderer/Material.h +++ b/Axiom/Renderer/Material.h @@ -22,6 +22,20 @@ struct TextureSourceData { using TextureSourceDataRef = std::shared_ptr; +struct HDRTextureSourceData { + uint32_t Width{0}; + uint32_t Height{0}; + std::vector Pixels; // RGBA floats, 4 per pixel + + [[nodiscard]] bool IsValid() const { + return Width > 0 && Height > 0 && + Pixels.size() == static_cast(Width) * + static_cast(Height) * 4; + } +}; + +using HDRTextureSourceDataRef = std::shared_ptr; + struct MaterialInstance { TextureSourceDataRef BaseColorTexture; glm::vec4 BaseColorFactor{1.0f}; diff --git a/Axiom/Renderer/RenderCommand.cpp b/Axiom/Renderer/RenderCommand.cpp index 421da02b..61454bb5 100644 --- a/Axiom/Renderer/RenderCommand.cpp +++ b/Axiom/Renderer/RenderCommand.cpp @@ -39,5 +39,18 @@ void RenderCommand::SetSun(const DirectionalLight &Light) { } } +void RenderCommand::SetSkyboxColors(const glm::vec3 &Top, const glm::vec3 &Bottom) { + if (s_ActiveScene) { + s_ActiveScene->SkyboxColorTop = Top; + s_ActiveScene->SkyboxColorBottom = Bottom; + } +} + +void RenderCommand::SetSkyboxHDR(HDRTextureSourceDataRef Texture) { + if (s_ActiveScene) { + s_ActiveScene->SkyboxHDRTexture = std::move(Texture); + } +} + void RenderCommand::EndScene() { s_ActiveScene = nullptr; } } // namespace Axiom diff --git a/Axiom/Renderer/RenderCommand.h b/Axiom/Renderer/RenderCommand.h index e790c7ce..46e3f805 100644 --- a/Axiom/Renderer/RenderCommand.h +++ b/Axiom/Renderer/RenderCommand.h @@ -13,6 +13,8 @@ class RenderCommand { static void SubmitLightBillboard(const LightBillboardOverlay &Billboard); static void SetGizmoOverlay(const GizmoOverlayData &Gizmo); static void SetSun(const DirectionalLight &Light); + static void SetSkyboxColors(const glm::vec3 &Top, const glm::vec3 &Bottom); + static void SetSkyboxHDR(HDRTextureSourceDataRef Texture); static void EndScene(); private: diff --git a/Axiom/Renderer/RenderScene.h b/Axiom/Renderer/RenderScene.h index dce28791..2f04686f 100644 --- a/Axiom/Renderer/RenderScene.h +++ b/Axiom/Renderer/RenderScene.h @@ -1,5 +1,6 @@ #pragma once +#include "Renderer/Material.h" #include "Renderer/Mesh.h" #include @@ -45,5 +46,8 @@ class RenderScene { std::optional GizmoOverlay; std::optional Sun; std::vector LightBillboards; + glm::vec3 SkyboxColorTop{0.08f, 0.09f, 0.14f}; + glm::vec3 SkyboxColorBottom{0.14f, 0.24f, 0.38f}; + HDRTextureSourceDataRef SkyboxHDRTexture{nullptr}; }; } // namespace Axiom diff --git a/Axiom/Renderer/Vulkan/VulkanRendererBackend.cpp b/Axiom/Renderer/Vulkan/VulkanRendererBackend.cpp index 3e1999d2..fa3f59da 100644 --- a/Axiom/Renderer/Vulkan/VulkanRendererBackend.cpp +++ b/Axiom/Renderer/Vulkan/VulkanRendererBackend.cpp @@ -1,6 +1,7 @@ #include "Renderer/Vulkan/VulkanRendererBackend.h" #include "Assets/SvgTexture.h" +#include "Renderer/Camera.h" #include "Renderer/RenderScene.h" #include "Renderer/Vulkan/VulkanBuffer.h" #include "Renderer/Vulkan/VulkanDescriptors.h" @@ -9,6 +10,9 @@ #include "Renderer/Vulkan/VulkanMesh.h" #include "Renderer/Vulkan/VulkanPipeline.h" +#include +#include + #include #include @@ -565,6 +569,91 @@ void VulkanRendererBackend::InitBackgroundPipelines() { VK_NULL_HANDLE); vkDestroyPipeline(m_Device.Device, m_GradientPipeline, VK_NULL_HANDLE); }); + + // --- HDR skybox pipeline ------------------------------------------------- + { + DescriptorLayoutBuilder Builder; + Builder.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER); + m_HDRSkyboxDescriptorLayout = + Builder.Build(m_Device.Device, VK_SHADER_STAGE_COMPUTE_BIT); + } + + VkSamplerCreateInfo HDRSamplerInfo{ + .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, + .pNext = VK_NULL_HANDLE, + .magFilter = VK_FILTER_LINEAR, + .minFilter = VK_FILTER_LINEAR, + .mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR, + .addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT, + .addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .mipLodBias = 0.0f, + .anisotropyEnable = VK_FALSE, + .compareEnable = VK_FALSE, + .minLod = 0.0f, + .maxLod = 0.0f, + .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK, + .unnormalizedCoordinates = VK_FALSE}; + VK_CHECK(vkCreateSampler(m_Device.Device, &HDRSamplerInfo, VK_NULL_HANDLE, + &m_HDRSkyboxSampler)); + + const std::array HDRSetLayouts = { + m_DrawImageDescriptorLayout, m_HDRSkyboxDescriptorLayout}; + + VkPipelineLayoutCreateInfo HDRLayout = VkInit::PipelineLayoutCreateInfo(); + HDRLayout.pSetLayouts = HDRSetLayouts.data(); + HDRLayout.setLayoutCount = static_cast(HDRSetLayouts.size()); + + VkPushConstantRange HDRPushConstant{}; + HDRPushConstant.offset = 0; + HDRPushConstant.size = sizeof(glm::mat4); + HDRPushConstant.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + + HDRLayout.pPushConstantRanges = &HDRPushConstant; + HDRLayout.pushConstantRangeCount = 1; + + VK_CHECK(vkCreatePipelineLayout(m_Device.Device, &HDRLayout, VK_NULL_HANDLE, + &m_HDRSkyboxPipelineLayout)); + + VkShaderModule HDRShader; + const std::string HDRShaderPath = + std::string(AXIOM_CONTENT_DIR) + "/Shaders/skybox_hdr.comp.spv"; + if (!VkUtil::LoadShaderModule(HDRShaderPath.c_str(), m_Device.Device, + &HDRShader)) { + A_ERROR("Error when loading the HDR skybox compute shader: {0}", + HDRShaderPath); + Axiom::Log::Flush(); + abort(); + } + + VkPipelineShaderStageCreateInfo HDRStage = + VkInit::PipelineShaderStageCreateInfo(VK_SHADER_STAGE_COMPUTE_BIT, + HDRShader); + + VkComputePipelineCreateInfo HDRPipelineInfo = { + .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, + .pNext = VK_NULL_HANDLE, + .stage = HDRStage, + .layout = m_HDRSkyboxPipelineLayout}; + + VK_CHECK(vkCreateComputePipelines(m_Device.Device, VK_NULL_HANDLE, 1, + &HDRPipelineInfo, VK_NULL_HANDLE, + &m_HDRSkyboxPipeline)); + + vkDestroyShaderModule(m_Device.Device, HDRShader, VK_NULL_HANDLE); + + m_MainDeletionQueue.PushFunction([this]() { + DestroyHDRSkyboxTexture(); + if (m_HDRSkyboxSampler != VK_NULL_HANDLE) { + vkDestroySampler(m_Device.Device, m_HDRSkyboxSampler, VK_NULL_HANDLE); + m_HDRSkyboxSampler = VK_NULL_HANDLE; + } + vkDestroyPipeline(m_Device.Device, m_HDRSkyboxPipeline, VK_NULL_HANDLE); + vkDestroyPipelineLayout(m_Device.Device, m_HDRSkyboxPipelineLayout, + VK_NULL_HANDLE); + vkDestroyDescriptorSetLayout(m_Device.Device, m_HDRSkyboxDescriptorLayout, + VK_NULL_HANDLE); + }); } void VulkanRendererBackend::InitMeshPipelines() { @@ -1024,6 +1113,37 @@ void VulkanRendererBackend::CollectFrameStats(MeshFrameResources &Frame) { } void VulkanRendererBackend::DrawBackground(VkCommandBuffer CommandBuffer) { + SyncHDRSkyboxTexture(); + + const bool UseHDR = m_LoadedHDRSkyboxData != nullptr && + m_HDRSkyboxDescriptorSet != VK_NULL_HANDLE && + m_ActiveScene != nullptr && + m_ActiveScene->ActiveCamera != nullptr; + + if (UseHDR) { + vkCmdBindPipeline(CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, + m_HDRSkyboxPipeline); + const std::array Sets = {m_DrawImageDescriptorSet, + m_HDRSkyboxDescriptorSet}; + vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, + m_HDRSkyboxPipelineLayout, 0, + static_cast(Sets.size()), Sets.data(), 0, + VK_NULL_HANDLE); + + const glm::mat4 InverseViewProj = glm::inverse( + m_ActiveScene->ActiveCamera->GetViewProjectionMatrix()); + + vkCmdPushConstants(CommandBuffer, m_HDRSkyboxPipelineLayout, + VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(glm::mat4), + glm::value_ptr(InverseViewProj)); + + vkCmdDispatch(CommandBuffer, + static_cast(std::ceil(m_DrawExtent.width / 16.0f)), + static_cast(std::ceil(m_DrawExtent.height / 16.0f)), + 1); + return; + } + vkCmdBindPipeline(CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_GradientPipeline); vkCmdBindDescriptorSets(CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, @@ -1031,8 +1151,13 @@ void VulkanRendererBackend::DrawBackground(VkCommandBuffer CommandBuffer) { &m_DrawImageDescriptorSet, 0, VK_NULL_HANDLE); ComputePushConstants PC; - PC.data1 = glm::vec4(0.08f, 0.09f, 0.14f, 1.0f); - PC.data2 = glm::vec4(0.14f, 0.24f, 0.38f, 1.0f); + if (m_ActiveScene) { + PC.data1 = glm::vec4(m_ActiveScene->SkyboxColorTop, 1.0f); + PC.data2 = glm::vec4(m_ActiveScene->SkyboxColorBottom, 1.0f); + } else { + PC.data1 = glm::vec4(0.08f, 0.09f, 0.14f, 1.0f); + PC.data2 = glm::vec4(0.14f, 0.24f, 0.38f, 1.0f); + } vkCmdPushConstants(CommandBuffer, m_GradientPipelineLayout, VK_SHADER_STAGE_COMPUTE_BIT, 0, @@ -1043,6 +1168,132 @@ void VulkanRendererBackend::DrawBackground(VkCommandBuffer CommandBuffer) { static_cast(std::ceil(m_DrawExtent.height / 16.0f)), 1); } +void VulkanRendererBackend::SyncHDRSkyboxTexture() { + const HDRTextureSourceDataRef Wanted = + m_ActiveScene ? m_ActiveScene->SkyboxHDRTexture : nullptr; + if (Wanted == m_LoadedHDRSkyboxData) { + return; + } + + // Defer destruction of the previous image onto the current frame's deletion + // queue. That queue flushes when this frame slot is reused, after its + // RenderFence is signaled — guaranteeing every command buffer that bound the + // old image/descriptor has finished executing on the GPU. + if (m_HDRSkyboxImage.Image != VK_NULL_HANDLE) { + AllocatedImage OldImage = m_HDRSkyboxImage; + GetCurrentFrame().DeletionQueue.PushFunction( + [Device = m_Device.Device, Allocator = m_Device.Allocator, + OldImage]() mutable { + if (OldImage.ImageView != VK_NULL_HANDLE) { + vkDestroyImageView(Device, OldImage.ImageView, VK_NULL_HANDLE); + } + if (OldImage.Image != VK_NULL_HANDLE) { + vmaDestroyImage(Allocator, OldImage.Image, OldImage.Allocation); + } + }); + m_HDRSkyboxImage = {}; + // The descriptor set is pool-allocated; drop the handle. The pool itself + // is destroyed at shutdown. + m_HDRSkyboxDescriptorSet = VK_NULL_HANDLE; + } + + if (Wanted) { + UploadHDRSkyboxTexture(*Wanted); + } + m_LoadedHDRSkyboxData = Wanted; +} + +void VulkanRendererBackend::UploadHDRSkyboxTexture( + const HDRTextureSourceData &Texture) { + if (!Texture.IsValid()) { + A_CORE_WARN("HDR skybox: refusing to upload invalid texture ({}x{})", + Texture.Width, Texture.Height); + return; + } + + m_HDRSkyboxImage.ImageFormat = VK_FORMAT_R32G32B32A32_SFLOAT; + m_HDRSkyboxImage.ImageExtent = {Texture.Width, Texture.Height, 1}; + + VkImageCreateInfo ImageInfo = VkInit::ImageCreateInfo( + m_HDRSkyboxImage.ImageFormat, + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + m_HDRSkyboxImage.ImageExtent); + + VmaAllocationCreateInfo AllocationInfo{}; + AllocationInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY; + AllocationInfo.requiredFlags = + VkMemoryPropertyFlags(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + + VK_CHECK(vmaCreateImage(m_Device.Allocator, &ImageInfo, &AllocationInfo, + &m_HDRSkyboxImage.Image, &m_HDRSkyboxImage.Allocation, + VK_NULL_HANDLE)); + + VkImageViewCreateInfo ViewInfo = VkInit::ImageViewCreateInfo( + m_HDRSkyboxImage.ImageFormat, m_HDRSkyboxImage.Image, + VK_IMAGE_ASPECT_COLOR_BIT); + VK_CHECK(vkCreateImageView(m_Device.Device, &ViewInfo, VK_NULL_HANDLE, + &m_HDRSkyboxImage.ImageView)); + + const VkDeviceSize ByteCount = + static_cast(Texture.Pixels.size()) * sizeof(float); + auto StagingBuffer = VkBufferUtil::CreateBuffer( + m_Device.Allocator, ByteCount, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VMA_MEMORY_USAGE_CPU_ONLY, + VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | + VMA_ALLOCATION_CREATE_MAPPED_BIT); + std::memcpy(StagingBuffer.Info.pMappedData, Texture.Pixels.data(), ByteCount); + + ImmediateSubmit([&](VkCommandBuffer CommandBuffer) { + VkUtil::TransitionImage(CommandBuffer, m_HDRSkyboxImage.Image, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + + VkBufferImageCopy Region{}; + Region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + Region.imageSubresource.layerCount = 1; + Region.imageExtent = m_HDRSkyboxImage.ImageExtent; + vkCmdCopyBufferToImage(CommandBuffer, StagingBuffer.Buffer, + m_HDRSkyboxImage.Image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &Region); + + VkUtil::TransitionImage(CommandBuffer, m_HDRSkyboxImage.Image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + }); + + VkBufferUtil::DestroyBuffer(m_Device.Allocator, StagingBuffer); + + m_HDRSkyboxDescriptorSet = m_GlobalDescriptorAllocator.Allocate( + m_Device.Device, m_HDRSkyboxDescriptorLayout); + + VkDescriptorImageInfo SamplerImage{}; + SamplerImage.sampler = m_HDRSkyboxSampler; + SamplerImage.imageView = m_HDRSkyboxImage.ImageView; + SamplerImage.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + + VkWriteDescriptorSet Write = VkInit::WriteDescriptorSet( + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, m_HDRSkyboxDescriptorSet, + &SamplerImage, 0); + vkUpdateDescriptorSets(m_Device.Device, 1, &Write, 0, VK_NULL_HANDLE); +} + +void VulkanRendererBackend::DestroyHDRSkyboxTexture() { + if (m_HDRSkyboxImage.ImageView != VK_NULL_HANDLE) { + vkDestroyImageView(m_Device.Device, m_HDRSkyboxImage.ImageView, + VK_NULL_HANDLE); + m_HDRSkyboxImage.ImageView = VK_NULL_HANDLE; + } + if (m_HDRSkyboxImage.Image != VK_NULL_HANDLE) { + vmaDestroyImage(m_Device.Allocator, m_HDRSkyboxImage.Image, + m_HDRSkyboxImage.Allocation); + m_HDRSkyboxImage.Image = VK_NULL_HANDLE; + m_HDRSkyboxImage.Allocation = VK_NULL_HANDLE; + } + // The descriptor set lives in the pool; we drop the handle and rely on the + // pool being destroyed at shutdown. + m_HDRSkyboxDescriptorSet = VK_NULL_HANDLE; +} + void VulkanRendererBackend::BuildHzb(VkCommandBuffer CommandBuffer, MeshFrameResources &Frame) { if (m_HzbReduceDescriptorSets.empty()) { diff --git a/Axiom/Renderer/Vulkan/VulkanRendererBackend.h b/Axiom/Renderer/Vulkan/VulkanRendererBackend.h index 318de042..7efb8412 100644 --- a/Axiom/Renderer/Vulkan/VulkanRendererBackend.h +++ b/Axiom/Renderer/Vulkan/VulkanRendererBackend.h @@ -64,6 +64,9 @@ class VulkanRendererBackend final : public RendererBackend { void InitHzbResources(); void CollectFrameStats(MeshFrameResources &Frame); void DrawBackground(VkCommandBuffer CommandBuffer); + void SyncHDRSkyboxTexture(); + void UploadHDRSkyboxTexture(const HDRTextureSourceData &Texture); + void DestroyHDRSkyboxTexture(); void DrawMeshes(VkCommandBuffer CommandBuffer, RenderScene &Scene); void BuildHzb(VkCommandBuffer CommandBuffer, MeshFrameResources &Frame); void RecordOffscreenCapture(VkCommandBuffer CommandBuffer, @@ -122,6 +125,13 @@ class VulkanRendererBackend final : public RendererBackend { VkPipeline m_GradientPipeline{VK_NULL_HANDLE}; VkPipelineLayout m_GradientPipelineLayout{VK_NULL_HANDLE}; + VkPipeline m_HDRSkyboxPipeline{VK_NULL_HANDLE}; + VkPipelineLayout m_HDRSkyboxPipelineLayout{VK_NULL_HANDLE}; + VkDescriptorSetLayout m_HDRSkyboxDescriptorLayout{VK_NULL_HANDLE}; + VkDescriptorSet m_HDRSkyboxDescriptorSet{VK_NULL_HANDLE}; + VkSampler m_HDRSkyboxSampler{VK_NULL_HANDLE}; + AllocatedImage m_HDRSkyboxImage{}; + HDRTextureSourceDataRef m_LoadedHDRSkyboxData{nullptr}; VkPipeline m_HzbReducePipeline{VK_NULL_HANDLE}; VkPipelineLayout m_HzbReducePipelineLayout{VK_NULL_HANDLE}; VkPipeline m_MeshProjectPipeline{VK_NULL_HANDLE}; diff --git a/Axiom/Session/EditorCommand.h b/Axiom/Session/EditorCommand.h index 97da06e5..99c0c9e7 100644 --- a/Axiom/Session/EditorCommand.h +++ b/Axiom/Session/EditorCommand.h @@ -128,6 +128,10 @@ struct ResumeSessionCommand {}; struct StopSessionCommand {}; +struct SetWorldSettingsCommand { + EditorWorldSettings Settings; +}; + using EditorCommandPayload = std::variant; + StopSessionCommand, SetWorldSettingsCommand>; struct EditorCommand { EditorCommandPayload Payload; diff --git a/Axiom/Session/EditorSession.cpp b/Axiom/Session/EditorSession.cpp index 584533ee..6e294acb 100644 --- a/Axiom/Session/EditorSession.cpp +++ b/Axiom/Session/EditorSession.cpp @@ -44,6 +44,19 @@ void CookTextureAssetBestEffort(const std::filesystem::path &ContentDir, } } +void CookHDRTextureAssetBestEffort(const std::filesystem::path &ContentDir, + std::string_view RelativeAssetPath) { + if (ContentDir.empty() || RelativeAssetPath.empty()) { + return; + } + + const auto Cooked = Assets::CookHDRTextureAsset(ContentDir, RelativeAssetPath); + if (!Cooked.has_value()) { + A_CORE_WARN("EditorSession: failed to cook HDR texture asset '{}'", + std::string(RelativeAssetPath)); + } +} + std::string DefaultUserDisplayName(SessionUserId User) { if (User.Value == 1) { return "Host"; @@ -199,6 +212,9 @@ std::string CommandTypeName(const EditorCommandPayload &Payload) { if (std::holds_alternative(Payload)) { return "stop_session"; } + if (std::holds_alternative(Payload)) { + return "set_world_settings"; + } return "set_transform"; } @@ -217,7 +233,8 @@ bool IsAuthoringMutationCommand(const EditorCommandPayload &Payload) { std::holds_alternative(Payload) || std::holds_alternative(Payload) || std::holds_alternative(Payload) || - std::holds_alternative(Payload); + std::holds_alternative(Payload) || + std::holds_alternative(Payload); } EditorSceneItemKind KindForClassName(std::string_view ClassName) { @@ -1617,6 +1634,8 @@ bool EditorSession::ValidateCommand(const QueuedEditorCommand &QueuedCommand, } } + // SetWorldSettingsCommand requires no specific validation since colors are just vec3 + return true; } @@ -2240,6 +2259,38 @@ void EditorSession::HandleCommand(const QueuedEditorCommand &QueuedCommand, }}); } +void EditorSession::HandleCommand(const QueuedEditorCommand &QueuedCommand, + const SetWorldSettingsCommand &Command) { + (void)QueuedCommand; + const std::string PreviousHDRPath = m_State.Scene.WorldSettings.SkyboxHDRPath; + HDRTextureSourceDataRef PreviousHDRData = m_State.Scene.WorldSettings.SkyboxHDRData; + + m_State.Scene.WorldSettings = Command.Settings; + + if (Command.Settings.SkyboxHDRPath.empty()) { + m_State.Scene.WorldSettings.SkyboxHDRData = nullptr; + } else if (Command.Settings.SkyboxHDRPath == PreviousHDRPath && + PreviousHDRData) { + // Path unchanged and we already have the data loaded — reuse it. + m_State.Scene.WorldSettings.SkyboxHDRData = std::move(PreviousHDRData); + } else if (m_ContentDir.empty()) { + A_CORE_WARN("SetWorldSettings: content directory not configured; cannot " + "load HDR '{}'", + Command.Settings.SkyboxHDRPath); + m_State.Scene.WorldSettings.SkyboxHDRData = nullptr; + } else { + CookHDRTextureAssetBestEffort(m_ContentDir, + Command.Settings.SkyboxHDRPath); + const auto FullPath = m_ContentDir / Command.Settings.SkyboxHDRPath; + auto Loaded = Assets::LoadHDRTextureFromFile(FullPath); + if (!Loaded) { + A_CORE_WARN("SetWorldSettings: failed to load HDR '{}'", + Command.Settings.SkyboxHDRPath); + } + m_State.Scene.WorldSettings.SkyboxHDRData = std::move(Loaded); + } +} + void EditorSession::SetContentDir(std::filesystem::path ContentDir) { m_ContentDir = std::move(ContentDir); } diff --git a/Axiom/Session/EditorSession.h b/Axiom/Session/EditorSession.h index 49919cce..b0944e67 100644 --- a/Axiom/Session/EditorSession.h +++ b/Axiom/Session/EditorSession.h @@ -133,6 +133,7 @@ struct EditorSceneState { std::unordered_map ObjectDetailsById; std::unordered_map CollaborationByObjectId; + EditorWorldSettings WorldSettings; }; struct EditorSessionState { @@ -298,6 +299,8 @@ class EditorSession final : public IEditorCommandSink { const ResumeSessionCommand &Command); void HandleCommand(const QueuedEditorCommand &QueuedCommand, const StopSessionCommand &Command); + void HandleCommand(const QueuedEditorCommand &QueuedCommand, + const SetWorldSettingsCommand &Command); void ApplyWorldTransform(std::string_view ObjectId, const EditorTransformDetails &WorldTransform, SessionUserId User, bool PublishEvent); diff --git a/Axiom/Session/SessionTypes.h b/Axiom/Session/SessionTypes.h index 17dc567b..a005ca45 100644 --- a/Axiom/Session/SessionTypes.h +++ b/Axiom/Session/SessionTypes.h @@ -1,8 +1,11 @@ #pragma once +#include "Renderer/Material.h" + #include #include #include +#include #include @@ -61,4 +64,15 @@ struct EditorPhysicsProperties { float Friction{0.2f}; float Restitution{0.0f}; }; + +struct EditorWorldSettings { + glm::vec3 SkyboxColorTop{0.08f, 0.09f, 0.14f}; + glm::vec3 SkyboxColorBottom{0.14f, 0.24f, 0.38f}; + // Content-relative path to an equirectangular HDR (.hdr / cooked .wtex). + // Empty means use the gradient colors above. + std::string SkyboxHDRPath; + // Loaded HDR pixel data; populated by EditorSession when SkyboxHDRPath + // changes. Not serialized. + HDRTextureSourceDataRef SkyboxHDRData; +}; } // namespace Axiom diff --git a/Content/Cooked/AssetCookManifest.json b/Content/Cooked/AssetCookManifest.json index 1142f3c4..0b48e9c1 100644 --- a/Content/Cooked/AssetCookManifest.json +++ b/Content/Cooked/AssetCookManifest.json @@ -1,211 +1,211 @@ { "entries": [ - {"assetId":15229175004894892839,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__101","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__101.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":15229175004894892839,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__101","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__101.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":12140336635836207652,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__101","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__101.wmat","formatVersion":1,"sourceHash":3586948860202070916}, - {"assetId":16670649961235633850,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__102","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__102.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":16670649961235633850,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__102","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__102.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":5457201860838636531,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__102","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__102.wmat","formatVersion":1,"sourceHash":6145656221699350966}, {"assetId":18212675864156437195,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__81","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__81.wmat","formatVersion":1,"sourceHash":10338313927153405416}, - {"assetId":16222585198370233502,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__82","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__82.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":16222585198370233502,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__82","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__82.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6341542026414383172,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__82","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__82.wmat","formatVersion":1,"sourceHash":10985747164797825642}, - {"assetId":6276292986914166204,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__83","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__83.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":6276292986914166204,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__83","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__83.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":13913950202207721753,"kind":"mesh","relativePath":"sponza_atrium_3.glb","cookedPath":"Cooked/sponza_atrium_3.wmesh","formatVersion":2,"sourceHash":13152113367551948137}, - {"assetId":3524126900194724051,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__84","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__84.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":3524126900194724051,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__84","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__84.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1368142407168599961,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__84","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__84.wmat","formatVersion":1,"sourceHash":1573590478991570099}, - {"assetId":8379936892125882364,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__85","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__85.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":8379936892125882364,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__85","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__85.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":17615425434727149779,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__85","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__85.wmat","formatVersion":1,"sourceHash":15021837972009510944}, - {"assetId":5370529907106783966,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__86","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__86.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":5370529907106783966,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__86","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__86.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":3307378166964972138,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__86","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__86.wmat","formatVersion":1,"sourceHash":16414512736408610493}, - {"assetId":11435685726260663774,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__87","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__87.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11435685726260663774,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__87","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__87.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1601912636468888724,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__87","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__87.wmat","formatVersion":1,"sourceHash":2836131640602896348}, - {"assetId":1914623039437072610,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__88","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__88.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":1914623039437072610,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__88","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__88.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6896494829003407116,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__88","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__88.wmat","formatVersion":1,"sourceHash":3677809703873982172}, - {"assetId":4113860169957569099,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__89","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__89.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":4113860169957569099,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__89","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__89.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6410752746425559445,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__89","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__89.wmat","formatVersion":1,"sourceHash":794871690607076599}, - {"assetId":16292226204569430461,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__90","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__90.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":16292226204569430461,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__90","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__90.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":12546584266307313070,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__90","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__90.wmat","formatVersion":1,"sourceHash":17304015300532786011}, - {"assetId":1161113871088196371,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__91","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__91.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":1161113871088196371,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__91","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__91.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":13140657335267704776,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__91","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__91.wmat","formatVersion":1,"sourceHash":10993084337399955276}, - {"assetId":2153231978189338291,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__92","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__92.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":2153231978189338291,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__92","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__92.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":7574761956857896106,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__92","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__92.wmat","formatVersion":1,"sourceHash":15347192330358828181}, - {"assetId":14593766337526508589,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__93","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__93.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":14593766337526508589,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__93","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__93.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":12588103244075146374,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__93","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__93.wmat","formatVersion":1,"sourceHash":11879179696935072141}, - {"assetId":6530629928095013992,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__94","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__94.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":6530629928095013992,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__94","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__94.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":15112736952776741626,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__94","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__94.wmat","formatVersion":1,"sourceHash":7690582110283420096}, - {"assetId":18081150503426162446,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__95","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__95.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":18081150503426162446,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__95","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__95.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1994779334733726980,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__95","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__95.wmat","formatVersion":1,"sourceHash":3660925423700951973}, - {"assetId":10480157717321104301,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__96","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__96.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":10480157717321104301,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__96","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__96.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":4087356689680254175,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__96","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__96.wmat","formatVersion":1,"sourceHash":4973025491254526861}, - {"assetId":3901345578842322117,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__97","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__97.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":3901345578842322117,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__97","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__97.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":2419053644206384395,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__97","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__97.wmat","formatVersion":1,"sourceHash":15030832607098163724}, - {"assetId":5743276401868917762,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__98","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__98.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":5743276401868917762,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__98","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__98.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":10793103097143920867,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__98","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__98.wmat","formatVersion":1,"sourceHash":11605956222055713613}, - {"assetId":17840664353554127551,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__99","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__99.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":17840664353554127551,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__99","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__99.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6429394278380673583,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__99","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__99.wmat","formatVersion":1,"sourceHash":521088494192120068}, - {"assetId":3968184785818211594,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__100","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__100.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":3968184785818211594,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__100","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__100.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":15000008075878416251,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__100","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__100.wmat","formatVersion":1,"sourceHash":14785741697486435488}, - {"assetId":8949008766911302915,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__0","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__0.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":8949008766911302915,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__0","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__0.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6406691723554709426,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__0","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__0.wmat","formatVersion":1,"sourceHash":12105348316115371814}, - {"assetId":2047440963454411317,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__1","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__1.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":2047440963454411317,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__1","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__1.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":338408498823845738,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__1","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__1.wmat","formatVersion":1,"sourceHash":11937650793961544448}, - {"assetId":2609070077096360103,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__2","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__2.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":2609070077096360103,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__2","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__2.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":2082388146543210735,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__2","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__2.wmat","formatVersion":1,"sourceHash":16410775011811095777}, - {"assetId":12144441902023958388,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__3","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__3.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":12144441902023958388,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__3","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__3.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":17527947539543232506,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__3","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__3.wmat","formatVersion":1,"sourceHash":3416732856032483136}, - {"assetId":14935625733198014204,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__4","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__4.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":14935625733198014204,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__4","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__4.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":2917609430187082044,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__4","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__4.wmat","formatVersion":1,"sourceHash":2122964563376366127}, - {"assetId":8000510243179873760,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__5","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__5.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":8000510243179873760,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__5","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__5.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1833647933708458171,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__5","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__5.wmat","formatVersion":1,"sourceHash":431772422916233084}, - {"assetId":15108022691734276197,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__6","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__6.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":15108022691734276197,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__6","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__6.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":13270350426872169045,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__6","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__6.wmat","formatVersion":1,"sourceHash":1613934549528476018}, - {"assetId":15426782677142257150,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__7","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__7.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":15426782677142257150,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__7","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__7.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":11133723940075140816,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__7","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__7.wmat","formatVersion":1,"sourceHash":1920503734990514352}, - {"assetId":935055086319286039,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__8","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__8.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":935055086319286039,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__8","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__8.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":9878873497959639324,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__8","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__8.wmat","formatVersion":1,"sourceHash":17514446031319777689}, - {"assetId":6989572634075200210,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__9","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__9.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":6989572634075200210,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__9","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__9.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":15772495388093143928,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__9","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__9.wmat","formatVersion":1,"sourceHash":14637193827494394025}, - {"assetId":9599674849738750772,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__10","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__10.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":9599674849738750772,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__10","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__10.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":2896645638468082733,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__10","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__10.wmat","formatVersion":1,"sourceHash":17362250718079553547}, - {"assetId":14616201166244300419,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__11","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__11.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":14616201166244300419,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__11","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__11.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":5182902489092553603,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__11","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__11.wmat","formatVersion":1,"sourceHash":14699062389568748940}, - {"assetId":13318269828404021151,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__12","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__12.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":13318269828404021151,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__12","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__12.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1381354933644706323,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__12","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__12.wmat","formatVersion":1,"sourceHash":2067503673473807703}, - {"assetId":418041667898929635,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__13","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__13.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":418041667898929635,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__13","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__13.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":7335716352758067924,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__13","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__13.wmat","formatVersion":1,"sourceHash":3443891746728836002}, - {"assetId":11460860277751759961,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__14","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__14.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11460860277751759961,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__14","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__14.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":10303325347291496521,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__14","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__14.wmat","formatVersion":1,"sourceHash":11468274840462287699}, - {"assetId":57118869757405117,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__15","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__15.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":57118869757405117,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__15","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__15.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":4318461462746769796,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__15","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__15.wmat","formatVersion":1,"sourceHash":1988328698587556133}, - {"assetId":5070985410898534162,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__16","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__16.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":5070985410898534162,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__16","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__16.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":13980165142181086485,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__16","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__16.wmat","formatVersion":1,"sourceHash":4937683144631245473}, - {"assetId":536335246703651284,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__17","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__17.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":536335246703651284,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__17","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__17.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":7387032219278094511,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__17","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__17.wmat","formatVersion":1,"sourceHash":2852633945460346414}, - {"assetId":15686379171003262801,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__18","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__18.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":15686379171003262801,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__18","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__18.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":8720650190583489158,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__18","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__18.wmat","formatVersion":1,"sourceHash":15463314947407387625}, - {"assetId":1412843259362631608,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__19","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__19.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":1412843259362631608,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__19","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__19.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":5685564747107029388,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__19","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__19.wmat","formatVersion":1,"sourceHash":9445146940921157142}, - {"assetId":9192472894437067434,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__20","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__20.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":9192472894437067434,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__20","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__20.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6894865326422565929,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__20","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__20.wmat","formatVersion":1,"sourceHash":14062335024188840592}, - {"assetId":6639126766486840204,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__21","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__21.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":6639126766486840204,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__21","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__21.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":9141098151863153504,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__21","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__21.wmat","formatVersion":1,"sourceHash":7625158974550489513}, - {"assetId":16584590773156486040,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__22","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__22.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":16584590773156486040,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__22","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__22.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":11986908085456801312,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__22","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__22.wmat","formatVersion":1,"sourceHash":9746980511802920792}, - {"assetId":16912923655458696876,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__23","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__23.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":16912923655458696876,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__23","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__23.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":75998186172291003,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__23","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__23.wmat","formatVersion":1,"sourceHash":3761010161796409630}, - {"assetId":16916866212321513280,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__24","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__24.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":16916866212321513280,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__24","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__24.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":12353471030465543246,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__24","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__24.wmat","formatVersion":1,"sourceHash":9327000674952958699}, - {"assetId":2374162152453047656,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__25","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__25.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":2374162152453047656,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__25","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__25.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":10315655477725643010,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__25","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__25.wmat","formatVersion":1,"sourceHash":13800637962277353069}, - {"assetId":6231828774228086012,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__26","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__26.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":6231828774228086012,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__26","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__26.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1489882246957632078,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__26","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__26.wmat","formatVersion":1,"sourceHash":1914889437746598852}, - {"assetId":14835781405174517290,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__27","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__27.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":14835781405174517290,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__27","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__27.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":15777561656369557976,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__27","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__27.wmat","formatVersion":1,"sourceHash":3741971524521780286}, - {"assetId":12365111798863810594,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__28","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__28.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":12365111798863810594,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__28","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__28.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1487016160038041592,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__28","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__28.wmat","formatVersion":1,"sourceHash":16847151654528284207}, - {"assetId":4816640343485796455,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__29","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__29.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":4816640343485796455,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__29","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__29.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":5736582587947684968,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__29","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__29.wmat","formatVersion":1,"sourceHash":3110976458674466213}, - {"assetId":2335489473499343915,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__30","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__30.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":2335489473499343915,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__30","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__30.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":9309213505028262097,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__30","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__30.wmat","formatVersion":1,"sourceHash":6855991421574206476}, - {"assetId":14294178196105835203,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__31","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__31.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":14294178196105835203,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__31","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__31.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":17061688190034129669,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__31","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__31.wmat","formatVersion":1,"sourceHash":11800299738552449015}, - {"assetId":11849761624884880228,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__32","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__32.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11849761624884880228,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__32","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__32.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":4251901682895947253,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__32","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__32.wmat","formatVersion":1,"sourceHash":926952403814070686}, - {"assetId":11968440148746543500,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__33","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__33.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11968440148746543500,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__33","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__33.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":12421151130816866460,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__33","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__33.wmat","formatVersion":1,"sourceHash":13849620051997181063}, - {"assetId":9413999610432788887,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__34","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__34.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":9413999610432788887,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__34","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__34.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":13377664948097222989,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__34","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__34.wmat","formatVersion":1,"sourceHash":6745908713292237972}, - {"assetId":3206050910767936484,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__35","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__35.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":3206050910767936484,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__35","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__35.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":884509795584781669,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__35","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__35.wmat","formatVersion":1,"sourceHash":13770668752275295155}, - {"assetId":6560012162369303788,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__36","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__36.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":6560012162369303788,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__36","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__36.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":4560151726280134650,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__36","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__36.wmat","formatVersion":1,"sourceHash":8466891692858494164}, - {"assetId":639270548772163740,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__37","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__37.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":639270548772163740,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__37","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__37.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":17922609879183352666,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__37","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__37.wmat","formatVersion":1,"sourceHash":4184171774617991775}, - {"assetId":17555800433981341095,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__38","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__38.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":17555800433981341095,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__38","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__38.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":10100035789257866383,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__38","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__38.wmat","formatVersion":1,"sourceHash":16606266445749377162}, - {"assetId":11420437435638758274,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__39","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__39.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11420437435638758274,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__39","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__39.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":4050580276738303960,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__39","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__39.wmat","formatVersion":1,"sourceHash":15102528717865983540}, - {"assetId":11306607703883254382,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__40","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__40.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11306607703883254382,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__40","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__40.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":8858843042684904766,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__40","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__40.wmat","formatVersion":1,"sourceHash":13741552318892389879}, - {"assetId":12460855100054038388,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__41","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__41.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":12460855100054038388,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__41","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__41.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":9631852698186271261,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__41","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__41.wmat","formatVersion":1,"sourceHash":588546811845668699}, - {"assetId":3254376880908665827,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__42","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__42.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":3254376880908665827,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__42","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__42.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":16203075113385007226,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__42","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__42.wmat","formatVersion":1,"sourceHash":6413442546387661798}, - {"assetId":9013002783490148122,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__43","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__43.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":9013002783490148122,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__43","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__43.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6530180347153082594,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__43","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__43.wmat","formatVersion":1,"sourceHash":10492985162459293085}, - {"assetId":3548548975956987037,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__44","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__44.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":3548548975956987037,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__44","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__44.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":929704761341936123,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__44","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__44.wmat","formatVersion":1,"sourceHash":775071552424960229}, - {"assetId":12949756596101087740,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__45","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__45.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":12949756596101087740,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__45","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__45.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":12493647735195381543,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__45","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__45.wmat","formatVersion":1,"sourceHash":9139502168056263364}, - {"assetId":7668103232490655480,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__46","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__46.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":7668103232490655480,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__46","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__46.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":3516490016846387337,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__46","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__46.wmat","formatVersion":1,"sourceHash":7930211813925214123}, - {"assetId":7760219078526813804,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__47","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__47.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":7760219078526813804,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__47","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__47.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":9233051403786368865,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__47","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__47.wmat","formatVersion":1,"sourceHash":13377665289041716221}, - {"assetId":952881265951366713,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__48","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__48.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":952881265951366713,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__48","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__48.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":17259416390395138510,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__48","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__48.wmat","formatVersion":1,"sourceHash":10128547069958724922}, - {"assetId":9958318104475448220,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__49","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__49.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":9958318104475448220,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__49","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__49.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":11108836736635882916,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__49","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__49.wmat","formatVersion":1,"sourceHash":14622359694189615963}, - {"assetId":15478161406022928727,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__50","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__50.wtex","formatVersion":1,"sourceHash":13834509895381492195}, + {"assetId":15478161406022928727,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__50","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__50.wtex","formatVersion":2,"sourceHash":13834509895381492195}, {"assetId":9089107162248191790,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__50","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__50.wmat","formatVersion":1,"sourceHash":13483825194474164463}, - {"assetId":3072345739054193766,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__51","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__51.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":3072345739054193766,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__51","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__51.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":17465508359896384865,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__51","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__51.wmat","formatVersion":1,"sourceHash":16978121369089822570}, - {"assetId":7268203633730872137,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__52","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__52.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":7268203633730872137,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__52","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__52.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":3244402830141628456,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__52","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__52.wmat","formatVersion":1,"sourceHash":5353180470586327978}, - {"assetId":12748113197778075258,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__53","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__53.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":12748113197778075258,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__53","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__53.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":16306434343215284634,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__53","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__53.wmat","formatVersion":1,"sourceHash":7447515478019148808}, - {"assetId":4519313381700649372,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__54","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__54.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":4519313381700649372,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__54","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__54.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":998295677570452009,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__54","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__54.wmat","formatVersion":1,"sourceHash":12355589836418080625}, - {"assetId":157030763324087685,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__55","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__55.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":157030763324087685,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__55","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__55.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":5789132488689622967,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__55","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__55.wmat","formatVersion":1,"sourceHash":16892589328850450973}, - {"assetId":9166456867916392735,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__56","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__56.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":9166456867916392735,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__56","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__56.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":18054864403564059647,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__56","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__56.wmat","formatVersion":1,"sourceHash":5829632433907177469}, - {"assetId":11006535976202166325,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__57","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__57.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11006535976202166325,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__57","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__57.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":5730670853493317779,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__57","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__57.wmat","formatVersion":1,"sourceHash":13505299453285165148}, - {"assetId":12129955814755625773,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__58","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__58.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":12129955814755625773,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__58","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__58.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1732882884677843463,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__58","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__58.wmat","formatVersion":1,"sourceHash":538972629376551351}, - {"assetId":8327526667649131927,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__59","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__59.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":8327526667649131927,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__59","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__59.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":16064301680766859049,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__59","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__59.wmat","formatVersion":1,"sourceHash":528110843448922099}, - {"assetId":1904484066334468700,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__60","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__60.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":1904484066334468700,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__60","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__60.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":3045438415191816439,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__60","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__60.wmat","formatVersion":1,"sourceHash":9108640508261734035}, - {"assetId":7736993864853341099,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__61","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__61.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":7736993864853341099,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__61","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__61.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":16314920960340782341,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__61","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__61.wmat","formatVersion":1,"sourceHash":915934276284787436}, - {"assetId":5383388308933643833,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__62","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__62.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":5383388308933643833,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__62","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__62.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6923143004171991324,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__62","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__62.wmat","formatVersion":1,"sourceHash":3482299694309499429}, - {"assetId":8428097613701717203,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__63","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__63.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":8428097613701717203,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__63","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__63.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":11883505219019110422,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__63","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__63.wmat","formatVersion":1,"sourceHash":6832124729437712248}, - {"assetId":16919978094734787135,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__64","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__64.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":16919978094734787135,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__64","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__64.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":7493961902870723016,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__64","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__64.wmat","formatVersion":1,"sourceHash":17964375059061294257}, - {"assetId":11978365854394189157,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__65","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__65.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11978365854394189157,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__65","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__65.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":9703569224552357746,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__65","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__65.wmat","formatVersion":1,"sourceHash":5915094414860838624}, - {"assetId":18402512700998817142,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__66","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__66.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":18402512700998817142,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__66","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__66.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":17913129048379707209,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__66","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__66.wmat","formatVersion":1,"sourceHash":8409928813853797007}, - {"assetId":13094775716748457230,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__67","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__67.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":13094775716748457230,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__67","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__67.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":16052493459987036767,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__67","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__67.wmat","formatVersion":1,"sourceHash":13838582871554607396}, - {"assetId":9420110106818975442,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__68","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__68.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":9420110106818975442,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__68","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__68.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":14249256068688134670,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__68","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__68.wmat","formatVersion":1,"sourceHash":5251816322602559214}, - {"assetId":11665770550954512744,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__69","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__69.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11665770550954512744,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__69","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__69.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":15892041888065753741,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__69","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__69.wmat","formatVersion":1,"sourceHash":4805949336775480751}, - {"assetId":9436205051216976025,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__70","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__70.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":9436205051216976025,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__70","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__70.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":14942587649695695571,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__70","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__70.wmat","formatVersion":1,"sourceHash":3404472943720160873}, - {"assetId":4021034824484642372,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__71","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__71.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":4021034824484642372,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__71","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__71.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":16133487766062081595,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__71","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__71.wmat","formatVersion":1,"sourceHash":4901093357586403455}, - {"assetId":1162139202324819048,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__72","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__72.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":1162139202324819048,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__72","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__72.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":18400739809462618767,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__72","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__72.wmat","formatVersion":1,"sourceHash":11202574233412256705}, - {"assetId":2419795551060346878,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__73","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__73.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":2419795551060346878,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__73","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__73.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":12004174778239393697,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__73","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__73.wmat","formatVersion":1,"sourceHash":11085349085811421204}, - {"assetId":17658336077506810347,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__74","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__74.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":17658336077506810347,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__74","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__74.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6830953916348626798,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__74","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__74.wmat","formatVersion":1,"sourceHash":16191336209829419681}, - {"assetId":11270128962196775149,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__75","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__75.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11270128962196775149,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__75","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__75.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":1438750279709290240,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__75","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__75.wmat","formatVersion":1,"sourceHash":5122982235709189413}, - {"assetId":4246832261388970769,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__76","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__76.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":4246832261388970769,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__76","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__76.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":10585462442248717742,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__76","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__76.wmat","formatVersion":1,"sourceHash":6651055802267303058}, - {"assetId":11236147002407908713,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__77","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__77.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":11236147002407908713,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__77","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__77.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6278905015285581392,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__77","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__77.wmat","formatVersion":1,"sourceHash":12058946091763468861}, - {"assetId":6385561491663638508,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__78","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__78.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":6385561491663638508,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__78","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__78.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":11833017377497455644,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__78","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__78.wmat","formatVersion":1,"sourceHash":15746208370710709652}, - {"assetId":5774460084544343272,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__79","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__79.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":5774460084544343272,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__79","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__79.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":6449228353247814594,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__79","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__79.wmat","formatVersion":1,"sourceHash":5581722757693394212}, - {"assetId":12363407856602167113,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__80","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__80.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":12363407856602167113,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__80","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__80.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":7825203658809297879,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__80","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__80.wmat","formatVersion":1,"sourceHash":3883641405705167589}, - {"assetId":10411425554735263391,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__81","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__81.wtex","formatVersion":1,"sourceHash":1136906439044749114}, + {"assetId":10411425554735263391,"kind":"texture","relativePath":"Generated/MeshTextures/sponza_atrium_3__81","cookedPath":"Cooked/Generated/MeshTextures/sponza_atrium_3__81.wtex","formatVersion":2,"sourceHash":1136906439044749114}, {"assetId":9297787003665117867,"kind":"material","relativePath":"Generated/MeshMaterials/sponza_atrium_3__83","cookedPath":"Cooked/Generated/MeshMaterials/sponza_atrium_3__83.wmat","formatVersion":1,"sourceHash":987993751301634973} ] } diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__0.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__0.wtex index 498f0b5d..d02a59e8 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__0.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__0.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__1.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__1.wtex index e0796539..9271818b 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__1.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__1.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__10.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__10.wtex index 74c34d16..515739ad 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__10.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__10.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__100.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__100.wtex index faea765d..8edd0aa5 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__100.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__100.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__101.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__101.wtex index cbd2dd85..1bbe4eb5 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__101.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__101.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__102.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__102.wtex index 769e702d..1ab67377 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__102.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__102.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__11.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__11.wtex index 86af9894..5916a011 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__11.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__11.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__12.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__12.wtex index e73f66e4..800fa5ea 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__12.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__12.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__13.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__13.wtex index 5a6178a1..c2b64495 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__13.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__13.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__14.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__14.wtex index e7683501..b4554d33 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__14.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__14.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__15.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__15.wtex index 7ba34ff9..33274d47 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__15.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__15.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__16.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__16.wtex index 5ae3273a..cfe70c46 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__16.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__16.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__17.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__17.wtex index 7065b7e8..2116016d 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__17.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__17.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__18.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__18.wtex index e82baf52..3872e803 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__18.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__18.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__19.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__19.wtex index 39bf84b9..accab480 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__19.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__19.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__2.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__2.wtex index 6862e332..693e0a2e 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__2.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__2.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__20.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__20.wtex index 74a33353..e8663fca 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__20.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__20.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__21.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__21.wtex index 4bb53e0f..2353b570 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__21.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__21.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__22.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__22.wtex index 251167e7..cef1fcfa 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__22.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__22.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__23.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__23.wtex index 7bfcaca6..0997816c 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__23.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__23.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__24.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__24.wtex index b8dd9e85..8494a5af 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__24.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__24.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__25.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__25.wtex index 22c378ce..75979e53 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__25.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__25.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__26.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__26.wtex index 3025f050..603f99c9 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__26.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__26.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__27.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__27.wtex index c83fd8ac..de685370 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__27.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__27.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__28.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__28.wtex index 1179e9ad..89a4c9eb 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__28.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__28.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__29.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__29.wtex index fd8404b6..cfd21891 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__29.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__29.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__3.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__3.wtex index 34eb7158..a3267f20 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__3.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__3.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__30.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__30.wtex index f2bc7236..5da97525 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__30.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__30.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__31.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__31.wtex index ba99596a..be976039 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__31.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__31.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__32.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__32.wtex index d9d2b29f..b5f35628 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__32.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__32.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__33.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__33.wtex index 6a566952..7131ffb1 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__33.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__33.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__34.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__34.wtex index aa41c87e..d747cbda 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__34.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__34.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__35.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__35.wtex index 7fdaa577..a6bc2490 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__35.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__35.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__36.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__36.wtex index 73ca0889..7946f504 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__36.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__36.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__37.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__37.wtex index e85c247e..4c714cfe 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__37.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__37.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__38.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__38.wtex index 98e35e66..d83d91af 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__38.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__38.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__39.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__39.wtex index bcd85419..b323fa84 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__39.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__39.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__4.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__4.wtex index 899d4584..b3a2e32c 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__4.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__4.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__40.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__40.wtex index 2a695e77..3b2873a7 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__40.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__40.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__41.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__41.wtex index 51f5dc93..f5179cf1 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__41.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__41.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__42.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__42.wtex index 23132605..c32fc5e8 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__42.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__42.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__43.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__43.wtex index 0625cad6..a29cab88 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__43.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__43.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__44.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__44.wtex index 5297fb7c..bc9edb7f 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__44.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__44.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__45.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__45.wtex index b8ee6b63..ed463b39 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__45.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__45.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__46.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__46.wtex index 38f1bd70..0aa65ef0 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__46.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__46.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__47.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__47.wtex index d2c91892..36727508 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__47.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__47.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__48.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__48.wtex index 9a9bad09..be27de6a 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__48.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__48.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__49.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__49.wtex index 19544909..6f1e3fb3 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__49.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__49.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__5.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__5.wtex index 1e024582..a57e00c7 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__5.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__5.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__50.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__50.wtex index 8a3e3cbe..fc73b802 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__50.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__50.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__51.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__51.wtex index 6d113455..17f7d00d 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__51.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__51.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__52.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__52.wtex index 32f9694f..a817da83 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__52.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__52.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__53.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__53.wtex index 22ae0424..04dd3cef 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__53.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__53.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__54.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__54.wtex index 66b68919..aa11f334 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__54.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__54.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__55.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__55.wtex index df31012c..484ef855 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__55.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__55.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__56.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__56.wtex index 631d0881..330c4c7d 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__56.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__56.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__57.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__57.wtex index 878aed1f..2004fc6a 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__57.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__57.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__58.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__58.wtex index 4f0716e5..eb66dce9 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__58.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__58.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__59.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__59.wtex index c2e86f97..e7e58619 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__59.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__59.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__6.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__6.wtex index b86493d4..1a91ef30 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__6.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__6.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__60.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__60.wtex index dca04e42..f7ead267 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__60.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__60.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__61.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__61.wtex index 9b9f8344..5342072d 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__61.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__61.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__62.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__62.wtex index 00acafcf..cd1f544f 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__62.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__62.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__63.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__63.wtex index 92b02938..d49c4781 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__63.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__63.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__64.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__64.wtex index 2c6d8e6b..c93fb913 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__64.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__64.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__65.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__65.wtex index a710e1fb..99acf014 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__65.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__65.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__66.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__66.wtex index 7eb02021..79ba7b4c 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__66.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__66.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__67.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__67.wtex index ffbb9334..95377b3f 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__67.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__67.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__68.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__68.wtex index 9cdfedd8..5d485d81 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__68.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__68.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__69.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__69.wtex index 07c046df..a4d690dd 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__69.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__69.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__7.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__7.wtex index a4ad4535..516c6a1f 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__7.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__7.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__70.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__70.wtex index 551d7865..b56e9338 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__70.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__70.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__71.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__71.wtex index 04cf3dc7..554e7ead 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__71.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__71.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__72.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__72.wtex index e7d1c0c9..a4ae0bbb 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__72.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__72.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__73.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__73.wtex index f0ec6f61..277fd62b 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__73.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__73.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__74.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__74.wtex index cfd3dfce..3ee09a9d 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__74.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__74.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__75.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__75.wtex index 8d9b586e..555ebf31 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__75.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__75.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__76.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__76.wtex index b5e2439f..243f12c3 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__76.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__76.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__77.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__77.wtex index 0acd1f0d..292947f5 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__77.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__77.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__78.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__78.wtex index 738e4646..64d5f910 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__78.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__78.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__79.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__79.wtex index fcf7e19a..2061341e 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__79.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__79.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__8.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__8.wtex index 9248c056..2327e960 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__8.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__8.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__80.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__80.wtex index de4cc05b..b1fea350 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__80.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__80.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__81.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__81.wtex index 8d619a56..0a23e730 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__81.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__81.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__82.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__82.wtex index 0e4c909a..010f0395 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__82.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__82.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__83.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__83.wtex index 705a473b..22776aae 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__83.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__83.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__84.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__84.wtex index 8c299d38..45aea8f2 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__84.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__84.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__85.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__85.wtex index 14c0987e..290121d9 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__85.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__85.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__86.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__86.wtex index 46b064ee..21d146ba 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__86.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__86.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__87.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__87.wtex index 758694d3..150f4a48 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__87.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__87.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__88.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__88.wtex index 5041e1e5..95d1bdf7 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__88.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__88.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__89.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__89.wtex index 90854ab8..8160b821 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__89.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__89.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__9.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__9.wtex index 3af079ce..23cc8d87 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__9.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__9.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__90.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__90.wtex index b1b41a67..432d3f50 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__90.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__90.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__91.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__91.wtex index 7c59f275..63a465d0 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__91.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__91.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__92.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__92.wtex index d82f6d9d..4a66014d 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__92.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__92.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__93.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__93.wtex index f2edcc3c..ff7e54e1 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__93.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__93.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__94.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__94.wtex index e219dff2..df294124 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__94.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__94.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__95.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__95.wtex index 6fd839de..bd121c6b 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__95.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__95.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__96.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__96.wtex index 11a1d85e..306a074f 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__96.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__96.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__97.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__97.wtex index 26fc03ba..a910febd 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__97.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__97.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__98.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__98.wtex index bd2e1d0c..73995403 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__98.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__98.wtex differ diff --git a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__99.wtex b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__99.wtex index 90b77c04..c422d6c3 100644 Binary files a/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__99.wtex and b/Content/Cooked/Generated/MeshTextures/sponza_atrium_3__99.wtex differ diff --git a/Content/Shaders/skybox_hdr.comp b/Content/Shaders/skybox_hdr.comp new file mode 100644 index 00000000..4c6e0d2e --- /dev/null +++ b/Content/Shaders/skybox_hdr.comp @@ -0,0 +1,40 @@ +#version 460 + +layout(local_size_x = 16, local_size_y = 16) in; + +layout(rgba16f, set = 0, binding = 0) uniform image2D image; +layout(set = 1, binding = 0) uniform sampler2D hdrTexture; + +layout(push_constant) uniform constants { + mat4 inverseViewProj; +} PC; + +const float PI = 3.14159265359; + +void main() { + ivec2 coord = ivec2(gl_GlobalInvocationID.xy); + ivec2 size = imageSize(image); + if (coord.x >= size.x || coord.y >= size.y) { + return; + } + + // Pixel center to NDC (Vulkan: Y-down in image space; viewport flip is + // handled by the camera projection, so we keep the raw mapping here.) + vec2 uv = (vec2(coord) + 0.5) / vec2(size); + vec2 ndc = uv * 2.0 - 1.0; + + // Unproject two depths to derive the world-space ray direction. + vec4 near = PC.inverseViewProj * vec4(ndc, 0.0, 1.0); + near /= near.w; + vec4 far = PC.inverseViewProj * vec4(ndc, 1.0, 1.0); + far /= far.w; + vec3 dir = normalize(far.xyz - near.xyz); + + // Equirectangular sample. + float phi = atan(dir.z, dir.x); + float theta = asin(clamp(dir.y, -1.0, 1.0)); + vec2 hdruv = vec2(phi / (2.0 * PI) + 0.5, 0.5 - theta / PI); + + vec4 color = texture(hdrTexture, hdruv); + imageStore(image, coord, vec4(color.rgb, 1.0)); +} diff --git a/Content/Shaders/skybox_hdr.comp.spv b/Content/Shaders/skybox_hdr.comp.spv new file mode 100644 index 00000000..c75beec1 Binary files /dev/null and b/Content/Shaders/skybox_hdr.comp.spv differ diff --git a/EditorFrontend/components/engine/dock/dock-context.tsx b/EditorFrontend/components/engine/dock/dock-context.tsx index 345b5149..b2e13d0b 100644 --- a/EditorFrontend/components/engine/dock/dock-context.tsx +++ b/EditorFrontend/components/engine/dock/dock-context.tsx @@ -9,6 +9,7 @@ export type PanelId = | "content-browser" | "remote-viewport" | "script-editor" + | "world-details" export type DockZone = "left" | "right" | "top" | "bottom" | "center" | "tab" @@ -252,7 +253,7 @@ const initialLayout: DockState = { id: "details-cell", type: "cell", weight: 1, - tabGroup: { id: "tg-details", panels: ["details"], activePanel: "details" }, + tabGroup: { id: "tg-details", panels: ["details", "world-details"], activePanel: "details" }, }, ], } as DockColumn, diff --git a/EditorFrontend/components/engine/dock/dock-layout.tsx b/EditorFrontend/components/engine/dock/dock-layout.tsx index 30109a49..be933e64 100644 --- a/EditorFrontend/components/engine/dock/dock-layout.tsx +++ b/EditorFrontend/components/engine/dock/dock-layout.tsx @@ -132,6 +132,7 @@ const PANEL_LABELS: Record = { "content-browser": "Content Browser", "remote-viewport": "Remote Viewport", "script-editor": "Script Editor", + "world-details": "World Details", } function DragCursorOverlay() { diff --git a/EditorFrontend/components/engine/dock/dock-panel.tsx b/EditorFrontend/components/engine/dock/dock-panel.tsx index 3a746a32..e1895ce6 100644 --- a/EditorFrontend/components/engine/dock/dock-panel.tsx +++ b/EditorFrontend/components/engine/dock/dock-panel.tsx @@ -19,6 +19,7 @@ const PANEL_LABELS: Record = { "content-browser": "Content Browser", "remote-viewport": "Remote Viewport", "script-editor": "Script Editor", + "world-details": "World Details", } export function DockPanel({ tabGroup, className = "", style }: DockPanelProps) { diff --git a/EditorFrontend/components/engine/dock/floating-panel.tsx b/EditorFrontend/components/engine/dock/floating-panel.tsx index e82d0b65..9e7f2fc2 100644 --- a/EditorFrontend/components/engine/dock/floating-panel.tsx +++ b/EditorFrontend/components/engine/dock/floating-panel.tsx @@ -12,6 +12,7 @@ const PANEL_LABELS: Record = { "content-browser": "Content Browser", "remote-viewport": "Remote Viewport", "script-editor": "Script Editor", + "world-details": "World Details", } interface FloatingPanelProps { diff --git a/EditorFrontend/components/engine/dock/panel-content.tsx b/EditorFrontend/components/engine/dock/panel-content.tsx index 54c04f42..89d14dcd 100644 --- a/EditorFrontend/components/engine/dock/panel-content.tsx +++ b/EditorFrontend/components/engine/dock/panel-content.tsx @@ -7,6 +7,7 @@ import { Details } from "../details" import { ContentBrowser } from "../content-browser" import { RemoteViewportPanel } from "../remote-viewport-panel" import { ScriptEditor } from "../script-editor" +import { WorldDetailsPanel } from "../../panels/world-details-panel" interface PanelContentProps { panelId: PanelId @@ -26,6 +27,8 @@ export function PanelContent({ panelId }: PanelContentProps) { return case "script-editor": return + case "world-details": + return default: return null } diff --git a/EditorFrontend/components/engine/remote-viewport-context.tsx b/EditorFrontend/components/engine/remote-viewport-context.tsx index 1db8f9b5..7dd28c84 100644 --- a/EditorFrontend/components/engine/remote-viewport-context.tsx +++ b/EditorFrontend/components/engine/remote-viewport-context.tsx @@ -190,6 +190,11 @@ interface RemoteViewportActions { roughness: number ) => Promise setMaterialTexture: (objectId: string, textureAssetPath: string) => Promise + setWorldSettings: ( + skyboxColorTop: [number, number, number], + skyboxColorBottom: [number, number, number], + skyboxHDRPath: string, + ) => Promise } export interface SessionObjectTransformUpdate { @@ -303,6 +308,18 @@ interface RemoteViewportContextValue { duplicateObject: (objectId: string) => Promise deleteObject: (objectId: string) => Promise reparentObject: (objectId: string, newParentId: string) => Promise + worldSettings: SessionWorldSettings + setWorldSettings: ( + skyboxColorTop: [number, number, number], + skyboxColorBottom: [number, number, number], + skyboxHDRPath: string, + ) => Promise +} + +export interface SessionWorldSettings { + skyboxColorTop: [number, number, number] + skyboxColorBottom: [number, number, number] + skyboxHDRPath: string } interface SessionSnapshot { @@ -312,6 +329,7 @@ interface SessionSnapshot { showColliders: boolean participants: SessionParticipant[] sceneTree: SessionSceneItem[] + worldSettings: SessionWorldSettings selections: SessionSelection[] selectedObjectDetails: SessionObjectDetails | null } @@ -377,6 +395,7 @@ export function RemoteViewportProvider({ children }: { children: ReactNode }) { setLightProperties: async () => false, setMaterialProperties: async () => false, setMaterialTexture: async () => false, + setWorldSettings: async () => false, }) const [connectionState, setConnectionState] = useState("idle") @@ -401,6 +420,11 @@ export function RemoteViewportProvider({ children }: { children: ReactNode }) { const [runtimeControllerUserId, setRuntimeControllerUserId] = useState(null) const [participants, setParticipants] = useState([]) const [sceneTree, setSceneTree] = useState([]) + const [worldSettings, setWorldSettingsState] = useState({ + skyboxColorTop: [0.08, 0.09, 0.14], + skyboxColorBottom: [0.14, 0.24, 0.38], + skyboxHDRPath: "", + }) const [selections, setSelections] = useState([]) const [selectedObjectDetails, setSelectedObjectDetails] = useState(null) @@ -430,6 +454,7 @@ export function RemoteViewportProvider({ children }: { children: ReactNode }) { setShowCollidersState(snapshot.showColliders) setParticipants(snapshot.participants) setSceneTree(snapshot.sceneTree) + setWorldSettingsState(snapshot.worldSettings) setSelections( snapshot.participants .filter((participant) => participant.selectionObjectId !== null) @@ -448,6 +473,11 @@ export function RemoteViewportProvider({ children }: { children: ReactNode }) { setShowCollidersState(true) setParticipants([]) setSceneTree([]) + setWorldSettingsState({ + skyboxColorTop: [0.08, 0.09, 0.14], + skyboxColorBottom: [0.14, 0.24, 0.38], + skyboxHDRPath: "", + }) setSelections([]) setSelectedObjectDetails(null) setLockedObjects({}) @@ -690,6 +720,12 @@ export function RemoteViewportProvider({ children }: { children: ReactNode }) { setLightProperties, setMaterialProperties, setMaterialTexture, + worldSettings, + setWorldSettings: async ( + top: [number, number, number], + bottom: [number, number, number], + hdrPath: string, + ) => await actionsRef.current.setWorldSettings(top, bottom, hdrPath), reloadStatus, setReloadStatus, scriptErrorToasts, @@ -781,6 +817,7 @@ export function RemoteViewportProvider({ children }: { children: ReactNode }) { setLightProperties, setMaterialProperties, setMaterialTexture, + worldSettings, reloadStatus, scriptErrorToasts, addScriptErrorToast, diff --git a/EditorFrontend/components/engine/viewport.tsx b/EditorFrontend/components/engine/viewport.tsx index 5867bf8a..c9c28eba 100644 --- a/EditorFrontend/components/engine/viewport.tsx +++ b/EditorFrontend/components/engine/viewport.tsx @@ -83,6 +83,11 @@ interface SessionSnapshotResponse { selections: SessionSelection[] selectedObjectDetails: SessionObjectDetails | null runtimeState: "edit" | "playing" | "paused" + worldSettings?: { + skyboxColorTop: [number, number, number] + skyboxColorBottom: [number, number, number] + skyboxHDRPath?: string + } } interface SessionConnectResponse { @@ -231,6 +236,12 @@ type RemoteViewportCommand = mouseY: number textureAssetPath: string } + | { + type: "set_world_settings" + skyboxColorTop: [number, number, number] + skyboxColorBottom: [number, number, number] + skyboxHDRPath: string + } function formatLogEntry(value: unknown) { return typeof value === "string" ? value : JSON.stringify(value) @@ -573,6 +584,13 @@ export function Viewport() { sceneTree: snapshot.sceneTree ?? [], selections: snapshot.selections ?? [], selectedObjectDetails: snapshot.selectedObjectDetails ?? null, + worldSettings: { + skyboxColorTop: + snapshot.worldSettings?.skyboxColorTop ?? [0.08, 0.09, 0.14], + skyboxColorBottom: + snapshot.worldSettings?.skyboxColorBottom ?? [0.14, 0.24, 0.38], + skyboxHDRPath: snapshot.worldSettings?.skyboxHDRPath ?? "", + }, }) sessionReadyRef.current = true setSessionUi( @@ -1621,6 +1639,21 @@ export function Viewport() { } return accepted }, + setWorldSettings: async (skyboxColorTop, skyboxColorBottom, skyboxHDRPath) => { + const accepted = await sendCommand( + { + type: "set_world_settings", + skyboxColorTop, + skyboxColorBottom, + skyboxHDRPath, + }, + "reliable" + ) + if (accepted) { + await refreshSessionSnapshotSafely("command") + } + return accepted + }, listAssets: async () => { await sendCommand({ type: "list_assets" }, "reliable") }, diff --git a/EditorFrontend/components/panels/world-details-panel.tsx b/EditorFrontend/components/panels/world-details-panel.tsx new file mode 100644 index 00000000..fb84be6b --- /dev/null +++ b/EditorFrontend/components/panels/world-details-panel.tsx @@ -0,0 +1,145 @@ +"use client" + +import { useRemoteViewport } from "@/components/engine/remote-viewport-context" +import { HexColorPicker } from "react-colorful" +import { useState, useEffect } from "react" +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" + +function vec3ToHex(vec: [number, number, number]): string { + const toHex = (n: number) => { + const hex = Math.round(Math.max(0, Math.min(1, n)) * 255).toString(16) + return hex.length === 1 ? "0" + hex : hex + } + return `#${toHex(vec[0])}${toHex(vec[1])}${toHex(vec[2])}` +} + +function hexToVec3(hex: string): [number, number, number] { + const r = parseInt(hex.slice(1, 3), 16) / 255 + const g = parseInt(hex.slice(3, 5), 16) / 255 + const b = parseInt(hex.slice(5, 7), 16) / 255 + return [r, g, b] +} + +export function WorldDetailsPanel() { + const { worldSettings, setWorldSettings } = useRemoteViewport() + + const [topColorHex, setTopColorHex] = useState(vec3ToHex(worldSettings.skyboxColorTop)) + const [bottomColorHex, setBottomColorHex] = useState(vec3ToHex(worldSettings.skyboxColorBottom)) + const [hdrPath, setHdrPath] = useState(worldSettings.skyboxHDRPath) + + // Update local state when remote state changes + useEffect(() => { + setTopColorHex(vec3ToHex(worldSettings.skyboxColorTop)) + setBottomColorHex(vec3ToHex(worldSettings.skyboxColorBottom)) + setHdrPath(worldSettings.skyboxHDRPath) + }, [worldSettings]) + + const handleTopColorChange = (newColor: string) => { + setTopColorHex(newColor) + setWorldSettings(hexToVec3(newColor), hexToVec3(bottomColorHex), hdrPath) + } + + const handleBottomColorChange = (newColor: string) => { + setBottomColorHex(newColor) + setWorldSettings(hexToVec3(topColorHex), hexToVec3(newColor), hdrPath) + } + + const commitHdrPath = (next: string) => { + if (next === worldSettings.skyboxHDRPath) return + setWorldSettings(hexToVec3(topColorHex), hexToVec3(bottomColorHex), next) + } + + const hdrActive = hdrPath.trim().length > 0 + + return ( +
+
+
+

Environment Settings

+ +
+
+ Sky Top + + +
+
+
+ + +
+
Skybox Top Color
+ +
+ HEX + handleTopColorChange(e.target.value)} + /> +
+
+
+ +
+ +
+ Sky Bottom + + +
+
+
+ + +
+
Skybox Bottom Color
+ +
+ HEX + handleBottomColorChange(e.target.value)} + /> +
+
+
+ +
+
+ +
+ HDR Sky + setHdrPath(e.target.value)} + onBlur={(e) => commitHdrPath(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + commitHdrPath((e.target as HTMLInputElement).value) + ;(e.target as HTMLInputElement).blur() + } + }} + /> +
+

+ Content-relative path to an equirectangular .hdr (or cooked .wtex). Leave empty to use the gradient colors above. +

+ +
+
+
+ ) +} diff --git a/EditorFrontend/next-env.d.ts b/EditorFrontend/next-env.d.ts index c4b7818f..9edff1c7 100644 --- a/EditorFrontend/next-env.d.ts +++ b/EditorFrontend/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/EditorFrontend/package.json b/EditorFrontend/package.json index a0771324..0ca9ea12 100644 --- a/EditorFrontend/package.json +++ b/EditorFrontend/package.json @@ -50,6 +50,7 @@ "next": "16.2.4", "next-themes": "^0.4.6", "react": "^19", + "react-colorful": "^5.7.0", "react-day-picker": "9.13.2", "react-dom": "^19", "react-hook-form": "^7.54.1", diff --git a/EditorFrontend/pnpm-lock.yaml b/EditorFrontend/pnpm-lock.yaml index 7f2c76c8..50a537a5 100644 --- a/EditorFrontend/pnpm-lock.yaml +++ b/EditorFrontend/pnpm-lock.yaml @@ -131,6 +131,9 @@ importers: react: specifier: ^19 version: 19.2.4 + react-colorful: + specifier: ^5.7.0 + version: 5.7.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-day-picker: specifier: 9.13.2 version: 9.13.2(react@19.2.4) @@ -1572,6 +1575,12 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + react-colorful@5.7.0: + resolution: {integrity: sha512-fuesYIemttah97XmsIHmz4OORDHiSFzyc9HMAIrCHJou2jaRQmL8cFJ76K4zQhhj8jzwOBlOi4BaGTjjOZCfTg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + react-day-picker@9.13.2: resolution: {integrity: sha512-IMPiXfXVIAuR5Yk58DDPBC8QKClrhdXV+Tr/alBrwrHUw0qDDYB1m5zPNuTnnPIr/gmJ4ChMxmtqPdxm8+R4Eg==} engines: {node: '>=18'} @@ -3013,6 +3022,11 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + react-colorful@5.7.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-day-picker@9.13.2(react@19.2.4): dependencies: '@date-fns/tz': 1.4.1 diff --git a/Headless/HeadlessCommandProtocol.cpp b/Headless/HeadlessCommandProtocol.cpp index 27b75683..648fe41a 100644 --- a/Headless/HeadlessCommandProtocol.cpp +++ b/Headless/HeadlessCommandProtocol.cpp @@ -1064,6 +1064,49 @@ std::optional ParseHeadlessCommand(std::string_view JsonLine, if (*Type == "heartbeat") { return HeadlessCommand{.Type = HeadlessCommandType::Heartbeat}; } + if (*Type == "set_world_settings") { + static const std::regex TopPattern( + R"json("skyboxColorTop"\s*:\s*\[\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*\])json"); + static const std::regex BottomPattern( + R"json("skyboxColorBottom"\s*:\s*\[\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*\])json"); + static const std::regex HDRPattern( + R"json("skyboxHDRPath"\s*:\s*"([^"]*)")json"); + + HeadlessCommand Cmd; + Cmd.Type = HeadlessCommandType::SetWorldSettings; + + std::match_results Match; + if (std::regex_search(JsonLine.begin(), JsonLine.end(), Match, TopPattern) && + Match.size() == 4) { + if (const auto R = ParseDouble(std::string_view(Match[1].first, Match[1].second))) + Cmd.SkyboxColorTop.r = static_cast(*R); + if (const auto G = ParseDouble(std::string_view(Match[2].first, Match[2].second))) + Cmd.SkyboxColorTop.g = static_cast(*G); + if (const auto B = ParseDouble(std::string_view(Match[3].first, Match[3].second))) + Cmd.SkyboxColorTop.b = static_cast(*B); + } + if (std::regex_search(JsonLine.begin(), JsonLine.end(), Match, BottomPattern) && + Match.size() == 4) { + if (const auto R = ParseDouble(std::string_view(Match[1].first, Match[1].second))) + Cmd.SkyboxColorBottom.r = static_cast(*R); + if (const auto G = ParseDouble(std::string_view(Match[2].first, Match[2].second))) + Cmd.SkyboxColorBottom.g = static_cast(*G); + if (const auto B = ParseDouble(std::string_view(Match[3].first, Match[3].second))) + Cmd.SkyboxColorBottom.b = static_cast(*B); + } + + if (std::regex_search(JsonLine.begin(), JsonLine.end(), Match, HDRPattern) && + Match.size() == 2) { + Cmd.SkyboxHDRPath.assign(Match[1].first, Match[1].second); + } + + Cmd.EditorPayload = {.Payload = SetWorldSettingsCommand{ + .Settings = EditorWorldSettings{ + .SkyboxColorTop = Cmd.SkyboxColorTop, + .SkyboxColorBottom = Cmd.SkyboxColorBottom, + .SkyboxHDRPath = Cmd.SkyboxHDRPath}}}; + return Cmd; + } if (*Type == "set_gizmo_mode") { static const std::regex ModePattern(R"json("mode"\s*:\s*"([^"]+)")json"); const auto ModeStr = MatchString(JsonLine, ModePattern); @@ -1151,6 +1194,7 @@ ParseRemoteViewportCommand(std::string_view JsonLine, std::string &Error) { case HeadlessCommandType::StopSession: case HeadlessCommandType::DropMesh: case HeadlessCommandType::DropTexture: + case HeadlessCommandType::SetWorldSettings: case HeadlessCommandType::ReloadScripts: case HeadlessCommandType::Heartbeat: case HeadlessCommandType::Quit: @@ -1553,7 +1597,16 @@ std::string SerializeSessionSnapshot(const EditorSessionState &State, } SerializeSceneItem(Stream, State.Scene.Items[Index]); } - Stream << "],\"selectedObjectDetails\":"; + Stream << "],\"worldSettings\":{\"skyboxColorTop\":[" + << State.Scene.WorldSettings.SkyboxColorTop.r << "," + << State.Scene.WorldSettings.SkyboxColorTop.g << "," + << State.Scene.WorldSettings.SkyboxColorTop.b << "],\"skyboxColorBottom\":[" + << State.Scene.WorldSettings.SkyboxColorBottom.r << "," + << State.Scene.WorldSettings.SkyboxColorBottom.g << "," + << State.Scene.WorldSettings.SkyboxColorBottom.b + << "],\"skyboxHDRPath\":\"" + << EscapeJson(State.Scene.WorldSettings.SkyboxHDRPath) << "\"}" + << ",\"selectedObjectDetails\":"; if (const EditorObjectDetails *Details = [&]() -> const EditorObjectDetails * { const auto SelectionIt = State.SelectedObjectIds.find(CurrentUser); diff --git a/Headless/HeadlessCommandProtocol.h b/Headless/HeadlessCommandProtocol.h index bb7b15da..36ca3c6c 100644 --- a/Headless/HeadlessCommandProtocol.h +++ b/Headless/HeadlessCommandProtocol.h @@ -60,6 +60,7 @@ enum class HeadlessCommandType { StopSession, DropMesh, DropTexture, + SetWorldSettings, Heartbeat, RenderFrame, Quit, @@ -89,6 +90,9 @@ struct HeadlessCommand { float Roughness{0.5f}; // used by SetMaterialProperties std::string MeshAssetPath; // used by DropMesh std::string TextureAssetPath; // used by SetMaterialTexture + glm::vec3 SkyboxColorTop{0.08f, 0.09f, 0.14f}; // used by SetWorldSettings + glm::vec3 SkyboxColorBottom{0.14f, 0.24f, 0.38f}; // used by SetWorldSettings + std::string SkyboxHDRPath; // used by SetWorldSettings }; struct HeadlessAppOptions { diff --git a/Headless/HeadlessSessionLayer.cpp b/Headless/HeadlessSessionLayer.cpp index bab32655..7665cef2 100644 --- a/Headless/HeadlessSessionLayer.cpp +++ b/Headless/HeadlessSessionLayer.cpp @@ -286,6 +286,10 @@ void HeadlessSessionLayer::OnRender() { } } + RenderCommand::SetSkyboxColors(m_Session.GetState().Scene.WorldSettings.SkyboxColorTop, + m_Session.GetState().Scene.WorldSettings.SkyboxColorBottom); + RenderCommand::SetSkyboxHDR(m_Session.GetState().Scene.WorldSettings.SkyboxHDRData); + for (const auto &Submission : m_RendererAdapter->BuildRenderSubmissions(m_Session)) { RenderCommand::Submit(Submission); } diff --git a/Headless/RemoteViewportServer.cpp b/Headless/RemoteViewportServer.cpp index d21c2ea4..9a08e5d6 100644 --- a/Headless/RemoteViewportServer.cpp +++ b/Headless/RemoteViewportServer.cpp @@ -1310,6 +1310,7 @@ bool RemoteViewportServer::HandlePostRequest(uintptr_t ClientSocketValue, case HeadlessCommandType::SetLightProperties: case HeadlessCommandType::SetMaterialProperties: case HeadlessCommandType::SetMaterialTexture: + case HeadlessCommandType::SetWorldSettings: m_Host.SubmitRemoteCommand(*User, Command->EditorPayload); break; case HeadlessCommandType::DropMesh: @@ -2919,6 +2920,7 @@ bool RemoteViewportServer::HandleClientWebRtcMessage(std::string_view ClientId, case HeadlessCommandType::SetLightProperties: case HeadlessCommandType::SetMaterialProperties: case HeadlessCommandType::SetMaterialTexture: + case HeadlessCommandType::SetWorldSettings: m_Host.SubmitRemoteCommand(Client->User, Command->EditorPayload); return true; case HeadlessCommandType::DropMesh: