From 3cacefe1257dab0bc640963994b25a0642751d59 Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 13:08:02 -0500 Subject: [PATCH 01/41] Use rapidjson instead of manual serialization --- Axiom/Assets/AssetCookManifest.cpp | 357 ++-- Axiom/Assets/CookedAssetRuntime.cpp | 233 +-- Axiom/Assets/SceneFile.cpp | 915 +++++----- Axiom/CMakeLists.txt | 1 + Axiom/Core/Log.cpp | 41 +- Axiom/Project/ProjectSystem.cpp | 402 ++--- CMakeLists.txt | 10 + Headless/HeadlessCommandProtocol.cpp | 2374 ++++++++++++++------------ Headless/HeadlessCommandProtocol.h | 1 - Headless/RemoteViewportServer.cpp | 457 +++-- Tests/HeadlessProtocolTests.cpp | 146 +- 11 files changed, 2486 insertions(+), 2451 deletions(-) diff --git a/Axiom/Assets/AssetCookManifest.cpp b/Axiom/Assets/AssetCookManifest.cpp index e46611d8..6a25d8f7 100644 --- a/Axiom/Assets/AssetCookManifest.cpp +++ b/Axiom/Assets/AssetCookManifest.cpp @@ -2,34 +2,15 @@ #include "Core/Log.h" -#include -#include +#include +#include +#include + #include -#include -#include namespace Axiom::Assets { namespace { -std::string EscapeJson(std::string_view Value) { - std::string Out; - Out.reserve(Value.size() + 2); - Out += '"'; - for (char Character : Value) { - if (Character == '"') { - Out += "\\\""; - } else if (Character == '\\') { - Out += "\\\\"; - } else if (Character == '\n') { - Out += "\\n"; - } else { - Out += Character; - } - } - Out += '"'; - return Out; -} - const char *AssetKindToString(AssetKind Kind) { switch (Kind) { case AssetKind::Mesh: @@ -44,246 +25,87 @@ const char *AssetKindToString(AssetKind Kind) { } AssetKind AssetKindFromString(std::string_view Value) { - if (Value == "mesh") + if (Value == "mesh") { return AssetKind::Mesh; - if (Value == "texture") + } + if (Value == "texture") { return AssetKind::Texture; - if (Value == "material") + } + if (Value == "material") { return AssetKind::Material; + } return AssetKind::Unknown; } -struct Parser { - std::string_view Src; - size_t Pos{0}; - - char Peek() const { return Pos < Src.size() ? Src[Pos] : '\0'; } +} // namespace - void SkipWs() { - while (Pos < Src.size() && - std::isspace(static_cast(Src[Pos])) != 0) { - ++Pos; - } +std::optional +LoadAssetCookManifest(const std::filesystem::path &Path) { + std::ifstream File(Path); + if (!File.is_open()) { + return std::nullopt; } - bool Expect(char Character) { - SkipWs(); - if (Peek() != Character) - return false; - ++Pos; - return true; + std::string Text((std::istreambuf_iterator(File)), + std::istreambuf_iterator()); + rapidjson::Document Document; + Document.ParseInsitu(Text.data()); + if (Document.HasParseError() || !Document.IsObject()) { + A_CORE_WARN("AssetCookManifest: failed to parse '{}'", Path.string()); + return std::nullopt; } - std::optional ParseString() { - SkipWs(); - if (Peek() != '"') - return std::nullopt; - ++Pos; - - std::string Out; - while (Pos < Src.size()) { - const char Character = Src[Pos++]; - if (Character == '"') - return Out; - if (Character == '\\') { - if (Pos >= Src.size()) - return std::nullopt; - const char Escaped = Src[Pos++]; - if (Escaped == 'n') { - Out += '\n'; - } else { - Out += Escaped; - } - } else { - Out += Character; - } - } - + AssetCookManifest Manifest; + const auto EntriesIt = Document.FindMember("entries"); + if (EntriesIt == Document.MemberEnd()) { + return Manifest; + } + if (!EntriesIt->value.IsArray()) { + A_CORE_WARN("AssetCookManifest: failed to parse '{}'", Path.string()); return std::nullopt; } - std::optional ParseUint64() { - SkipWs(); - const size_t Start = Pos; - while (Pos < Src.size() && - std::isdigit(static_cast(Src[Pos])) != 0) { - ++Pos; - } - if (Start == Pos) + for (const auto &EntryValue : EntriesIt->value.GetArray()) { + if (!EntryValue.IsObject()) { + A_CORE_WARN("AssetCookManifest: failed to parse '{}'", Path.string()); return std::nullopt; - - uint64_t Value = 0; - for (size_t Index = Start; Index < Pos; ++Index) { - Value = Value * 10u + static_cast(Src[Index] - '0'); } - return Value; - } - void SkipValue() { - SkipWs(); - const char Character = Peek(); - if (Character == '"') { - ParseString(); - return; - } - if (Character == '{') { - SkipObject(); - return; - } - if (Character == '[') { - SkipArray(); - return; - } - if (Src.substr(Pos, 4) == "null") { - Pos += 4; - return; + AssetCookManifestEntry Entry; + if (const auto AssetIdIt = EntryValue.FindMember("assetId"); + AssetIdIt != EntryValue.MemberEnd() && AssetIdIt->value.IsUint64()) { + Entry.Id = AssetId{AssetIdIt->value.GetUint64()}; } - ParseUint64(); - } - - void SkipObject() { - if (!Expect('{')) - return; - SkipWs(); - if (Peek() == '}') { - ++Pos; - return; + if (const auto KindIt = EntryValue.FindMember("kind"); + KindIt != EntryValue.MemberEnd() && KindIt->value.IsString()) { + Entry.Kind = AssetKindFromString( + std::string_view(KindIt->value.GetString(), + KindIt->value.GetStringLength())); } - do { - ParseString(); - Expect(':'); - SkipValue(); - SkipWs(); - } while (Expect(',')); - Expect('}'); - } - - void SkipArray() { - if (!Expect('[')) - return; - SkipWs(); - if (Peek() == ']') { - ++Pos; - return; + if (const auto RelativePathIt = EntryValue.FindMember("relativePath"); + RelativePathIt != EntryValue.MemberEnd() && + RelativePathIt->value.IsString()) { + Entry.RelativePath.assign(RelativePathIt->value.GetString(), + RelativePathIt->value.GetStringLength()); } - do { - SkipValue(); - SkipWs(); - } while (Expect(',')); - Expect(']'); - } - - template bool ParseObject(HandlerFn Handler) { - if (!Expect('{')) - return false; - SkipWs(); - if (Peek() == '}') { - ++Pos; - return true; + if (const auto CookedPathIt = EntryValue.FindMember("cookedPath"); + CookedPathIt != EntryValue.MemberEnd() && + CookedPathIt->value.IsString()) { + Entry.CookedPath.assign(CookedPathIt->value.GetString(), + CookedPathIt->value.GetStringLength()); } - - do { - auto Key = ParseString(); - if (!Key.has_value()) - return false; - if (!Expect(':')) - return false; - if (!Handler(*Key)) - SkipValue(); - SkipWs(); - } while (Expect(',')); - - return Expect('}'); - } - - template bool ParseArray(HandlerFn Handler) { - if (!Expect('[')) - return false; - SkipWs(); - if (Peek() == ']') { - ++Pos; - return true; + if (const auto FormatVersionIt = EntryValue.FindMember("formatVersion"); + FormatVersionIt != EntryValue.MemberEnd() && + FormatVersionIt->value.IsUint()) { + Entry.FormatVersion = FormatVersionIt->value.GetUint(); } - - do { - if (!Handler()) - return false; - SkipWs(); - } while (Expect(',')); - - return Expect(']'); - } -}; - -} // namespace - -std::optional -LoadAssetCookManifest(const std::filesystem::path &Path) { - std::ifstream File(Path); - if (!File.is_open()) { - return std::nullopt; - } - - const std::string Text((std::istreambuf_iterator(File)), - std::istreambuf_iterator()); - Parser P{Text}; - AssetCookManifest Manifest; - - const bool Parsed = P.ParseObject([&](const std::string &Key) -> bool { - if (Key == "entries") { - return P.ParseArray([&]() -> bool { - AssetCookManifestEntry Entry; - const bool EntryParsed = P.ParseObject([&](const std::string &EntryKey) -> bool { - if (EntryKey == "assetId") { - auto Value = P.ParseUint64(); - if (Value.has_value()) - Entry.Id = AssetId{*Value}; - return true; - } - if (EntryKey == "kind") { - auto Value = P.ParseString(); - if (Value.has_value()) - Entry.Kind = AssetKindFromString(*Value); - return true; - } - if (EntryKey == "relativePath") { - auto Value = P.ParseString(); - if (Value.has_value()) - Entry.RelativePath = *Value; - return true; - } - if (EntryKey == "cookedPath") { - auto Value = P.ParseString(); - if (Value.has_value()) - Entry.CookedPath = *Value; - return true; - } - if (EntryKey == "formatVersion") { - auto Value = P.ParseUint64(); - if (Value.has_value()) - Entry.FormatVersion = static_cast(*Value); - return true; - } - if (EntryKey == "sourceHash") { - auto Value = P.ParseUint64(); - if (Value.has_value()) - Entry.SourceHash = *Value; - return true; - } - return false; - }); - if (!EntryParsed) - return false; - Manifest.Entries.push_back(std::move(Entry)); - return true; - }); + if (const auto SourceHashIt = EntryValue.FindMember("sourceHash"); + SourceHashIt != EntryValue.MemberEnd() && + SourceHashIt->value.IsUint64()) { + Entry.SourceHash = SourceHashIt->value.GetUint64(); } - return false; - }); - if (!Parsed) { - A_CORE_WARN("AssetCookManifest: failed to parse '{}'", Path.string()); - return std::nullopt; + Manifest.Entries.push_back(std::move(Entry)); } return Manifest; @@ -298,25 +120,48 @@ bool SaveAssetCookManifest(const std::filesystem::path &Path, return false; } - std::ostringstream Out; - Out << "{\n"; - Out << " \"entries\": [\n"; - for (size_t Index = 0; Index < Manifest.Entries.size(); ++Index) { - const auto &Entry = Manifest.Entries[Index]; - if (Index > 0) { - Out << ",\n"; - } - Out << " {\"assetId\":" << Entry.Id.Value - << ",\"kind\":" << EscapeJson(AssetKindToString(Entry.Kind)) - << ",\"relativePath\":" << EscapeJson(Entry.RelativePath) - << ",\"cookedPath\":" << EscapeJson(Entry.CookedPath) - << ",\"formatVersion\":" << Entry.FormatVersion - << ",\"sourceHash\":" << Entry.SourceHash << "}"; + rapidjson::Document Document; + Document.SetObject(); + auto &Allocator = Document.GetAllocator(); + + rapidjson::Value Entries(rapidjson::kArrayType); + Entries.Reserve(static_cast(Manifest.Entries.size()), + Allocator); + for (const auto &Entry : Manifest.Entries) { + rapidjson::Value EntryValue(rapidjson::kObjectType); + EntryValue.AddMember("assetId", Entry.Id.Value, Allocator); + EntryValue.AddMember( + "kind", + rapidjson::Value(AssetKindToString(Entry.Kind), Allocator).Move(), + Allocator); + EntryValue.AddMember( + "relativePath", + rapidjson::Value(Entry.RelativePath.c_str(), + static_cast( + Entry.RelativePath.size()), + Allocator) + .Move(), + Allocator); + EntryValue.AddMember( + "cookedPath", + rapidjson::Value(Entry.CookedPath.c_str(), + static_cast(Entry.CookedPath.size()), + Allocator) + .Move(), + Allocator); + EntryValue.AddMember("formatVersion", Entry.FormatVersion, Allocator); + EntryValue.AddMember("sourceHash", Entry.SourceHash, Allocator); + Entries.PushBack(EntryValue, Allocator); } - Out << "\n ]\n"; - Out << "}\n"; - File << Out.str(); + Document.AddMember("entries", Entries, Allocator); + + rapidjson::StringBuffer Buffer; + rapidjson::PrettyWriter Writer(Buffer); + Writer.SetIndent(' ', 2); + Document.Accept(Writer); + + File << Buffer.GetString() << '\n'; return File.good(); } diff --git a/Axiom/Assets/CookedAssetRuntime.cpp b/Axiom/Assets/CookedAssetRuntime.cpp index 7caf4580..c1f0d216 100644 --- a/Axiom/Assets/CookedAssetRuntime.cpp +++ b/Axiom/Assets/CookedAssetRuntime.cpp @@ -6,12 +6,26 @@ #include "Assets/IAssetSource.h" #include "Assets/SceneFile.h" +#include + +#include +#include #include -#include #include +#include +#include namespace Axiom::Assets { namespace { +constexpr char kCookedSceneMagic[] = {'W', 'S', 'C', 'N'}; +constexpr std::uint32_t kCookedSceneVersion = 1; + +struct CookedSceneAssetReferences { + std::vector MeshAssetPaths; + std::vector MaterialAssetPaths; + std::vector TextureAssetPaths; +}; + bool ReadPackageManifestFields( const std::filesystem::path &ManifestPath, std::unordered_map &Fields) { @@ -20,81 +34,124 @@ bool ReadPackageManifestFields( return false; } - const std::string Text((std::istreambuf_iterator(File)), - std::istreambuf_iterator()); - std::size_t Position = 0; - auto SkipWs = [&]() { - while (Position < Text.size() && - (Text[Position] == ' ' || Text[Position] == '\n' || - Text[Position] == '\r' || Text[Position] == '\t')) { - ++Position; + std::string Text((std::istreambuf_iterator(File)), + std::istreambuf_iterator()); + rapidjson::Document Document; + Document.ParseInsitu(Text.data()); + if (Document.HasParseError() || !Document.IsObject()) { + return false; + } + + for (const auto &Member : Document.GetObject()) { + if (Member.value.IsString()) { + Fields.emplace( + Member.name.GetString(), + std::string(Member.value.GetString(), Member.value.GetStringLength())); + continue; } - }; - auto ParseString = [&]() -> std::optional { - SkipWs(); - if (Position >= Text.size() || Text[Position] != '"') { - return std::nullopt; + + if (Member.value.IsBool()) { + Fields.emplace(Member.name.GetString(), + Member.value.GetBool() ? "true" : "false"); + continue; } - ++Position; - std::string Result; - while (Position < Text.size()) { - const char Character = Text[Position++]; - if (Character == '"') { - return Result; - } - if (Character == '\\' && Position < Text.size()) { - Result.push_back(Text[Position++]); - } else { - Result.push_back(Character); - } + + if (Member.value.IsInt64()) { + Fields.emplace(Member.name.GetString(), + std::to_string(Member.value.GetInt64())); + continue; } - return std::nullopt; - }; - SkipWs(); - if (Position >= Text.size() || Text[Position] != '{') { - return false; - } - ++Position; - while (true) { - SkipWs(); - if (Position >= Text.size()) { - return false; + if (Member.value.IsUint64()) { + Fields.emplace(Member.name.GetString(), + std::to_string(Member.value.GetUint64())); + continue; } - if (Text[Position] == '}') { - return true; + + if (Member.value.IsDouble()) { + Fields.emplace(Member.name.GetString(), + std::to_string(Member.value.GetDouble())); + continue; } - const auto Key = ParseString(); - if (!Key.has_value()) { - return false; + if (Member.value.IsNull()) { + Fields.emplace(Member.name.GetString(), "null"); } - SkipWs(); - if (Position >= Text.size() || Text[Position] != ':') { - return false; + } + + return true; +} + +bool ReadCookedSceneAssetReferences(const std::filesystem::path &ScenePath, + CookedSceneAssetReferences &References) { + std::ifstream File(ScenePath, std::ios::binary); + if (!File.is_open()) { + return false; + } + + char Magic[sizeof(kCookedSceneMagic)]; + File.read(Magic, sizeof(Magic)); + if (!File.good() || std::memcmp(Magic, kCookedSceneMagic, sizeof(Magic)) != 0) { + return false; + } + + std::uint32_t Version = 0; + std::uint64_t PayloadSize = 0; + File.read(reinterpret_cast(&Version), sizeof(Version)); + File.read(reinterpret_cast(&PayloadSize), sizeof(PayloadSize)); + if (!File.good() || Version != kCookedSceneVersion) { + return false; + } + + std::string Payload(PayloadSize, '\0'); + File.read(Payload.data(), static_cast(PayloadSize)); + if (!File.good()) { + return false; + } + + rapidjson::Document Document; + Document.ParseInsitu(Payload.data()); + if (Document.HasParseError() || !Document.IsObject()) { + return false; + } + + const auto ObjectsIt = Document.FindMember("objects"); + if (ObjectsIt == Document.MemberEnd() || !ObjectsIt->value.IsArray()) { + return true; + } + + for (const auto &ObjectValue : ObjectsIt->value.GetArray()) { + if (!ObjectValue.IsObject()) { + continue; } - ++Position; - const auto Value = ParseString(); - if (Value.has_value()) { - Fields[*Key] = *Value; - } else { - SkipWs(); - const std::size_t ValueStart = Position; - while (Position < Text.size() && Text[Position] != ',' && Text[Position] != '}') { - ++Position; - } - Fields[*Key] = Text.substr(ValueStart, Position - ValueStart); + + const auto AssetRelativePathIt = ObjectValue.FindMember("assetRelativePath"); + if (AssetRelativePathIt != ObjectValue.MemberEnd() && + AssetRelativePathIt->value.IsString()) { + References.MeshAssetPaths.emplace_back( + AssetRelativePathIt->value.GetString(), + AssetRelativePathIt->value.GetStringLength()); } - SkipWs(); - if (Position < Text.size() && Text[Position] == ',') { - ++Position; - continue; + const auto MaterialAssetPathIt = + ObjectValue.FindMember("materialAssetPath"); + if (MaterialAssetPathIt != ObjectValue.MemberEnd() && + MaterialAssetPathIt->value.IsString()) { + References.MaterialAssetPaths.emplace_back( + MaterialAssetPathIt->value.GetString(), + MaterialAssetPathIt->value.GetStringLength()); } - if (Position < Text.size() && Text[Position] == '}') { - return true; + + const auto TextureAssetPathIt = ObjectValue.FindMember("textureAssetPath"); + if (TextureAssetPathIt != ObjectValue.MemberEnd() && + TextureAssetPathIt->value.IsString()) { + References.TextureAssetPaths.emplace_back( + TextureAssetPathIt->value.GetString(), + TextureAssetPathIt->value.GetStringLength()); } } + + return true; } } // namespace @@ -104,13 +161,14 @@ bool IsCookedOnlyContentPath(const std::filesystem::path &Path) { return false; } - const auto PackageManifestPath = ContentRoot->parent_path() / "package.wraith.json"; + const auto PackageManifestPath = + ContentRoot->parent_path() / "package.wraith.json"; return std::filesystem::exists(PackageManifestPath); } std::optional ResolvePackagedContentDescriptor(const std::filesystem::path &Path, - std::string *FailureReason) { + std::string *FailureReason) { const auto ContentRoot = FindContentRootForPath(Path); if (!ContentRoot.has_value()) { if (FailureReason != nullptr) { @@ -143,7 +201,8 @@ ResolvePackagedContentDescriptor(const std::filesystem::path &Path, if (ContentModeIt == Fields.end() || SceneAssetIt == Fields.end() || CookManifestIt == Fields.end() || EngineContentIt == Fields.end()) { if (FailureReason != nullptr) { - *FailureReason = "package.wraith.json is missing required packaged runtime fields."; + *FailureReason = + "package.wraith.json is missing required packaged runtime fields."; } return std::nullopt; } @@ -196,8 +255,9 @@ bool ValidatePackagedContentDescriptor(const PackagedContentDescriptor &Descript return false; } - const auto LoadedScene = LoadCookedSceneFromFile(Descriptor.SceneAssetPath); - if (!LoadedScene.has_value()) { + CookedSceneAssetReferences SceneReferences; + if (!ReadCookedSceneAssetReferences(Descriptor.SceneAssetPath, + SceneReferences)) { if (FailureReason != nullptr) { *FailureReason = "Failed to load packaged scene asset '" + Descriptor.SceneAssetPath.string() + "'."; @@ -259,47 +319,30 @@ bool ValidatePackagedContentDescriptor(const PackagedContentDescriptor &Descript if (FailureReason != nullptr) { *FailureReason = std::string(Usage) + " '" + RelativeAssetPath.generic_string() + - "' maps to missing cooked asset '" + + "' resolves to missing cooked asset '" + CookedPath->string() + "'."; } return false; } + return true; }; - std::unordered_set MeshPaths; - std::unordered_set TexturePaths; - for (const auto &Instance : LoadedScene->MeshInstances) { - if (!Instance.AssetRelativePath.empty()) { - MeshPaths.insert(Instance.AssetRelativePath); - } - if (Instance.Material != nullptr && - !Instance.Material->TextureAssetPath.empty()) { - TexturePaths.insert(Instance.Material->TextureAssetPath); - } - } - for (const auto &[ObjectId, Details] : LoadedScene->ObjectDetailsById) { - static_cast(ObjectId); - if (!Details.AssetRelativePath.empty()) { - MeshPaths.insert(Details.AssetRelativePath); - } - if (Details.Material.has_value() && - Details.Material->TextureAssetPath.has_value() && - !Details.Material->TextureAssetPath->empty()) { - TexturePaths.insert(*Details.Material->TextureAssetPath); + for (const std::string &MeshAssetPath : SceneReferences.MeshAssetPaths) { + if (!ValidateResolvedAssetPath(MeshAssetPath, "Mesh asset")) { + return false; } } - if (!LoadedScene->WorldSettings.SkyboxHDRPath.empty()) { - TexturePaths.insert(LoadedScene->WorldSettings.SkyboxHDRPath); - } - for (const std::string &MeshPath : MeshPaths) { - if (!ValidateResolvedAssetPath(MeshPath, "Mesh asset reference")) { + for (const std::string &MaterialAssetPath : + SceneReferences.MaterialAssetPaths) { + if (!ValidateResolvedAssetPath(MaterialAssetPath, "Material asset")) { return false; } } - for (const std::string &TexturePath : TexturePaths) { - if (!ValidateResolvedAssetPath(TexturePath, "Texture asset reference")) { + + for (const std::string &TextureAssetPath : SceneReferences.TextureAssetPaths) { + if (!ValidateResolvedAssetPath(TextureAssetPath, "Texture asset")) { return false; } } diff --git a/Axiom/Assets/SceneFile.cpp b/Axiom/Assets/SceneFile.cpp index db0a1e4f..675f4e8d 100644 --- a/Axiom/Assets/SceneFile.cpp +++ b/Axiom/Assets/SceneFile.cpp @@ -9,13 +9,15 @@ #include #include -#include +#include +#include +#include + #include #include +#include #include #include -#include -#include #include #include @@ -34,24 +36,30 @@ namespace { constexpr char kCookedSceneMagic[] = {'W', 'S', 'C', 'N'}; constexpr std::uint32_t kCookedSceneVersion = 1; -std::string EscStr(std::string_view S) { - std::string Out; - Out.reserve(S.size() + 2); - Out += '"'; - for (char C : S) { - if (C == '"') { Out += "\\\""; } - else if (C == '\\') { Out += "\\\\"; } - else if (C == '\n') { Out += "\\n"; } - else { Out += C; } - } - Out += '"'; - return Out; +rapidjson::Value CopyString(std::string_view Value, + rapidjson::Document::AllocatorType &Allocator) { + rapidjson::Value StringValue; + StringValue.SetString(Value.data(), + static_cast(Value.size()), + Allocator); + return StringValue; +} + +rapidjson::Value SerializeVec3(const glm::vec3 &Value, + rapidjson::Document::AllocatorType &Allocator) { + rapidjson::Value ArrayValue(rapidjson::kArrayType); + ArrayValue.PushBack(Value.x, Allocator); + ArrayValue.PushBack(Value.y, Allocator); + ArrayValue.PushBack(Value.z, Allocator); + return ArrayValue; } -std::string SerializeVec3(const glm::vec3 &V) { - std::ostringstream S; - S << "[" << V.x << "," << V.y << "," << V.z << "]"; - return S.str(); +std::string SerializePrettyJson(const rapidjson::Document &Document) { + rapidjson::StringBuffer Buffer; + rapidjson::PrettyWriter Writer(Buffer); + Writer.SetIndent(' ', 2); + Document.Accept(Writer); + return std::string(Buffer.GetString(), Buffer.GetSize()) + '\n'; } std::string SanitizeGeneratedAssetToken(std::string_view Value) { @@ -114,22 +122,30 @@ const char *KindStr(EditorSceneItemKind K) { } void SerializeSceneItemsFlat( - std::ostringstream &Out, const std::vector &Items, + rapidjson::Value &Out, const std::vector &Items, const std::unordered_map &DetailsById, - const std::string &ParentId, bool &First) { + std::string_view ParentId, + rapidjson::Document::AllocatorType &Allocator) { for (const auto &Item : Items) { const auto DetailsIt = DetailsById.find(Item.Id); if (DetailsIt != DetailsById.end() && DetailsIt->second.IsGeneratedAssetChild) { continue; } - if (!First) Out << ",\n"; - First = false; - Out << " {\"id\":" << EscStr(Item.Id) - << ",\"parentId\":" << (ParentId.empty() ? "null" : EscStr(ParentId)) - << ",\"displayName\":" << EscStr(Item.DisplayName) - << ",\"kind\":\"" << KindStr(Item.Kind) << "\"" - << ",\"visible\":" << (Item.Visible ? "true" : "false") << "}"; - SerializeSceneItemsFlat(Out, Item.Children, DetailsById, Item.Id, First); + rapidjson::Value NodeValue(rapidjson::kObjectType); + NodeValue.AddMember("id", CopyString(Item.Id, Allocator), Allocator); + if (ParentId.empty()) { + NodeValue.AddMember("parentId", rapidjson::Value().SetNull(), Allocator); + } else { + NodeValue.AddMember("parentId", CopyString(ParentId, Allocator), + Allocator); + } + NodeValue.AddMember("displayName", CopyString(Item.DisplayName, Allocator), + Allocator); + NodeValue.AddMember("kind", CopyString(KindStr(Item.Kind), Allocator), + Allocator); + NodeValue.AddMember("visible", Item.Visible, Allocator); + Out.PushBack(NodeValue, Allocator); + SerializeSceneItemsFlat(Out, Item.Children, DetailsById, Item.Id, Allocator); } } @@ -414,51 +430,67 @@ std::string SerializeSceneToJsonString(const std::filesystem::path &Path, } } - std::ostringstream Out; - Out << "{\n"; - Out << " \"version\": 1,\n"; - Out << " \"meshAsset\": " - << EscStr(HasImplicitGlobalMeshAsset ? "basicmesh.glb" : "") << ",\n"; - - // Flat node list (scene tree + parent links) - Out << " \"nodes\": [\n"; - bool FirstNode = true; - SerializeSceneItemsFlat(Out, Scene.Items, Scene.ObjectDetailsById, "", FirstNode); - Out << "\n ],\n"; - - // Object details (transforms, visibility, mesh name mapping) - Out << " \"objects\": [\n"; - bool FirstObj = true; + rapidjson::Document Document; + Document.SetObject(); + auto &Allocator = Document.GetAllocator(); + + Document.AddMember("version", 1u, Allocator); + Document.AddMember("meshAsset", + CopyString(HasImplicitGlobalMeshAsset ? "basicmesh.glb" : "", + Allocator), + Allocator); + + rapidjson::Value Nodes(rapidjson::kArrayType); + SerializeSceneItemsFlat(Nodes, Scene.Items, Scene.ObjectDetailsById, "", + Allocator); + Document.AddMember("nodes", Nodes, Allocator); + + rapidjson::Value Objects(rapidjson::kArrayType); for (const auto &[Id, Details] : Scene.ObjectDetailsById) { if (Details.IsGeneratedAssetChild) { continue; } - if (!FirstObj) Out << ",\n"; - FirstObj = false; - Out << " {\"id\":" << EscStr(Id) - << ",\"displayName\":" << EscStr(Details.DisplayName) - << ",\"kind\":\"" << KindStr(Details.Kind) << "\"" - << ",\"visible\":" << (Details.Visible ? "true" : "false") - << ",\"isGeneratedAssetChild\":" - << (Details.IsGeneratedAssetChild ? "true" : "false") - << ",\"supportsTransform\":" << (Details.SupportsTransform ? "true" : "false") - << ",\"transformReadOnly\":" << (Details.TransformReadOnly ? "true" : "false"); + rapidjson::Value ObjectValue(rapidjson::kObjectType); + ObjectValue.AddMember("id", CopyString(Id, Allocator), Allocator); + ObjectValue.AddMember("displayName", CopyString(Details.DisplayName, Allocator), + Allocator); + ObjectValue.AddMember("kind", CopyString(KindStr(Details.Kind), Allocator), + Allocator); + ObjectValue.AddMember("visible", Details.Visible, Allocator); + ObjectValue.AddMember("isGeneratedAssetChild", Details.IsGeneratedAssetChild, + Allocator); + ObjectValue.AddMember("supportsTransform", Details.SupportsTransform, + Allocator); + ObjectValue.AddMember("transformReadOnly", Details.TransformReadOnly, + Allocator); if (Details.Transform.has_value()) { - Out << ",\"location\":" << SerializeVec3(Details.Transform->Location) - << ",\"rotationDegrees\":" << SerializeVec3(Details.Transform->RotationDegrees) - << ",\"scale\":" << SerializeVec3(Details.Transform->Scale); + ObjectValue.AddMember("location", + SerializeVec3(Details.Transform->Location, Allocator), + Allocator); + ObjectValue.AddMember( + "rotationDegrees", + SerializeVec3(Details.Transform->RotationDegrees, Allocator), + Allocator); + ObjectValue.AddMember("scale", + SerializeVec3(Details.Transform->Scale, Allocator), + Allocator); } if (Details.ScriptClass.has_value()) { - Out << ",\"scriptClass\":" << EscStr(*Details.ScriptClass); + ObjectValue.AddMember("scriptClass", + CopyString(*Details.ScriptClass, Allocator), + Allocator); } if (Details.GeneratedFromAssetRootId.has_value()) { - Out << ",\"generatedFromAssetRootId\":" - << EscStr(*Details.GeneratedFromAssetRootId); + ObjectValue.AddMember("generatedFromAssetRootId", + CopyString(*Details.GeneratedFromAssetRootId, + Allocator), + Allocator); } if (Details.Kind == EditorSceneItemKind::Mesh) { const auto AssetIt = AssetPathByObjectId.find(Id); if (AssetIt != AssetPathByObjectId.end()) { - Out << ",\"assetRelativePath\":" << EscStr(AssetIt->second); + ObjectValue.AddMember("assetRelativePath", + CopyString(AssetIt->second, Allocator), Allocator); } if (Details.Material.has_value()) { const std::filesystem::path MaterialPath = @@ -471,70 +503,94 @@ std::string SerializeSceneToJsonString(const std::filesystem::path &Path, .TextureAssetPath = Details.Material->TextureAssetPath.value_or("")}); if (MaterialCooked.has_value()) { - Out << ",\"materialAssetPath\":" - << EscStr(MaterialCooked->RelativePath); + ObjectValue.AddMember("materialAssetPath", + CopyString(MaterialCooked->RelativePath, + Allocator), + Allocator); } } if (Details.Material.has_value() && Details.Material->TextureAssetPath.has_value()) { - Out << ",\"textureAssetPath\":" << EscStr(*Details.Material->TextureAssetPath); + ObjectValue.AddMember("textureAssetPath", + CopyString(*Details.Material->TextureAssetPath, + Allocator), + Allocator); } } if (Details.Light.has_value()) { - Out << ",\"lightColor\":" << SerializeVec3(Details.Light->Color) - << ",\"lightIntensity\":" << Details.Light->Intensity - << ",\"lightDirection\":" << SerializeVec3(Details.Light->Direction); + ObjectValue.AddMember("lightColor", + SerializeVec3(Details.Light->Color, Allocator), + Allocator); + ObjectValue.AddMember("lightIntensity", Details.Light->Intensity, + Allocator); + ObjectValue.AddMember("lightDirection", + SerializeVec3(Details.Light->Direction, Allocator), + Allocator); } if (Details.Physics.has_value()) { - Out << ",\"physicsBodyType\":" - << EscStr(Details.Physics->BodyType == EditorPhysicsBodyType::Dynamic - ? "dynamic" - : (Details.Physics->BodyType == EditorPhysicsBodyType::Static - ? "static" - : "none")) - << ",\"physicsColliderType\":" - << EscStr(Details.Physics->ColliderType == EditorPhysicsColliderType::Sphere - ? "sphere" - : (Details.Physics->ColliderType == EditorPhysicsColliderType::Box - ? "box" - : "none")) - << ",\"physicsBoxHalfExtents\":" - << SerializeVec3(Details.Physics->BoxHalfExtents) - << ",\"physicsSphereRadius\":" << Details.Physics->SphereRadius - << ",\"physicsMass\":" << Details.Physics->Mass - << ",\"physicsFriction\":" << Details.Physics->Friction - << ",\"physicsRestitution\":" << Details.Physics->Restitution; + ObjectValue.AddMember( + "physicsBodyType", + CopyString(Details.Physics->BodyType == EditorPhysicsBodyType::Dynamic + ? "dynamic" + : (Details.Physics->BodyType == + EditorPhysicsBodyType::Static + ? "static" + : "none"), + Allocator), + Allocator); + ObjectValue.AddMember( + "physicsColliderType", + CopyString( + Details.Physics->ColliderType == EditorPhysicsColliderType::Sphere + ? "sphere" + : (Details.Physics->ColliderType == + EditorPhysicsColliderType::Box + ? "box" + : "none"), + Allocator), + Allocator); + ObjectValue.AddMember( + "physicsBoxHalfExtents", + SerializeVec3(Details.Physics->BoxHalfExtents, Allocator), Allocator); + ObjectValue.AddMember("physicsSphereRadius", + Details.Physics->SphereRadius, Allocator); + ObjectValue.AddMember("physicsMass", Details.Physics->Mass, Allocator); + ObjectValue.AddMember("physicsFriction", Details.Physics->Friction, + Allocator); + ObjectValue.AddMember("physicsRestitution", + Details.Physics->Restitution, Allocator); } - Out << "}"; + Objects.PushBack(ObjectValue, Allocator); } - Out << "\n ],\n"; + Document.AddMember("objects", Objects, Allocator); - // Mesh name → object ID mapping (needed to re-hydrate MeshInstances) - Out << " \"meshNameToObjectId\": {\n"; - bool FirstMesh = true; + rapidjson::Value MeshNameToObjectId(rapidjson::kObjectType); for (const auto &Instance : Scene.MeshInstances) { const auto DetailsIt = Scene.ObjectDetailsById.find(Instance.ObjectId); if (DetailsIt == Scene.ObjectDetailsById.end() || DetailsIt->second.IsGeneratedAssetChild) { continue; } - // We stored the display name as the mesh source name via ResolveStartupObjectId - // Look up the display name from ObjectDetailsById - const auto It = DetailsIt; - if (!FirstMesh) Out << ",\n"; - FirstMesh = false; - Out << " " << EscStr(It->second.DisplayName) << ": " << EscStr(Instance.ObjectId); + MeshNameToObjectId.AddMember( + CopyString(DetailsIt->second.DisplayName, Allocator), + CopyString(Instance.ObjectId, Allocator), Allocator); } - Out << "\n },\n"; - Out << " \"worldSettings\": {\n" - << " \"skyboxColorTop\": " - << SerializeVec3(Scene.WorldSettings.SkyboxColorTop) << ",\n" - << " \"skyboxColorBottom\": " - << SerializeVec3(Scene.WorldSettings.SkyboxColorBottom) << ",\n" - << " \"skyboxHDRPath\": " - << EscStr(Scene.WorldSettings.SkyboxHDRPath) << "\n" - << " }\n"; - Out << "}\n"; - return Out.str(); + Document.AddMember("meshNameToObjectId", MeshNameToObjectId, Allocator); + + rapidjson::Value WorldSettings(rapidjson::kObjectType); + WorldSettings.AddMember( + "skyboxColorTop", + SerializeVec3(Scene.WorldSettings.SkyboxColorTop, Allocator), Allocator); + WorldSettings.AddMember( + "skyboxColorBottom", + SerializeVec3(Scene.WorldSettings.SkyboxColorBottom, Allocator), + Allocator); + WorldSettings.AddMember("skyboxHDRPath", + CopyString(Scene.WorldSettings.SkyboxHDRPath, + Allocator), + Allocator); + Document.AddMember("worldSettings", WorldSettings, Allocator); + + return SerializePrettyJson(Document); } bool SaveSceneToFile(const std::filesystem::path &Path, @@ -567,165 +623,38 @@ bool SaveCookedSceneToFile(const std::filesystem::path &Path, return File.good(); } -// --------------------------------------------------------------------------- -// Minimal JSON parser (purpose-built for the known scene file schema) -// --------------------------------------------------------------------------- - namespace { -struct Parser { - std::string_view Src; - size_t Pos{0}; - - char Peek() const { return Pos < Src.size() ? Src[Pos] : '\0'; } - char Eat() { return Pos < Src.size() ? Src[Pos++] : '\0'; } - - void SkipWs() { - while (Pos < Src.size() && (Src[Pos] == ' ' || Src[Pos] == '\t' || - Src[Pos] == '\r' || Src[Pos] == '\n')) - ++Pos; - } - - bool Expect(char C) { - SkipWs(); - if (Peek() == C) { ++Pos; return true; } - return false; - } +EditorSceneItemKind KindFromStr(std::string_view S) { + if (S == "Mesh") return EditorSceneItemKind::Mesh; + if (S == "Light") return EditorSceneItemKind::Light; + if (S == "Camera") return EditorSceneItemKind::Camera; + if (S == "Actor") return EditorSceneItemKind::Actor; + return EditorSceneItemKind::Folder; +} - std::optional ParseString() { - SkipWs(); - if (Peek() != '"') return std::nullopt; - ++Pos; - std::string Out; - while (Pos < Src.size()) { - char C = Eat(); - if (C == '"') return Out; - if (C == '\\') { - char E = Eat(); - if (E == 'n') Out += '\n'; - else if (E == '\\') Out += '\\'; - else if (E == '"') Out += '"'; - else Out += E; - } else { - Out += C; - } - } +std::optional GetOptionalString( + const rapidjson::Value &Object, const char *Name) { + const auto It = Object.FindMember(Name); + if (It == Object.MemberEnd()) { return std::nullopt; } - - std::optional ParseNumber() { - SkipWs(); - const size_t Start = Pos; - if (Peek() == '-') ++Pos; - while (Pos < Src.size() && - (std::isdigit(static_cast(Src[Pos])) || - Src[Pos] == '.' || Src[Pos] == 'e' || Src[Pos] == 'E' || - Src[Pos] == '+' || Src[Pos] == '-')) - ++Pos; - // std::from_chars for floating-point requires macOS 13.3+; use strtod instead. - char *End = nullptr; - double V = std::strtod(Src.data() + Start, &End); - if (End == Src.data() + Start) return std::nullopt; - return V; + if (It->value.IsNull()) { + return std::string(); } - - std::optional ParseBool() { - SkipWs(); - if (Src.substr(Pos, 4) == "true") { Pos += 4; return true; } - if (Src.substr(Pos, 5) == "false") { Pos += 5; return false; } + if (!It->value.IsString()) { return std::nullopt; } + return std::string(It->value.GetString(), It->value.GetStringLength()); +} - bool ParseNull() { - SkipWs(); - if (Src.substr(Pos, 4) == "null") { Pos += 4; return true; } - return false; - } - - std::optional ParseVec3() { - if (!Expect('[')) return std::nullopt; - auto X = ParseNumber(); if (!X) return std::nullopt; - if (!Expect(',')) return std::nullopt; - auto Y = ParseNumber(); if (!Y) return std::nullopt; - if (!Expect(',')) return std::nullopt; - auto Z = ParseNumber(); if (!Z) return std::nullopt; - if (!Expect(']')) return std::nullopt; - return glm::vec3{static_cast(*X), static_cast(*Y), - static_cast(*Z)}; - } - - // Skip any JSON value (string, number, bool, null, array, object) - void SkipValue() { - SkipWs(); - char C = Peek(); - if (C == '"') { ParseString(); return; } - if (C == '{') { SkipObject(); return; } - if (C == '[') { SkipArray(); return; } - if (C == 't' || C == 'f') { ParseBool(); return; } - if (C == 'n') { ParseNull(); return; } - ParseNumber(); - } - - void SkipObject() { - Expect('{'); - SkipWs(); - if (Peek() == '}') { ++Pos; return; } - do { - ParseString(); Expect(':'); SkipValue(); SkipWs(); - } while (Expect(',')); - Expect('}'); - } - - void SkipArray() { - Expect('['); - SkipWs(); - if (Peek() == ']') { ++Pos; return; } - do { - SkipValue(); SkipWs(); - } while (Expect(',')); - Expect(']'); - } - - // Parse {"key": value, ...} calling Handler(key) for each known field. - // Handler should read the value via this Parser before returning. - template - bool ParseObject(Fn Handler) { - if (!Expect('{')) return false; - SkipWs(); - if (Peek() == '}') { ++Pos; return true; } - do { - SkipWs(); - auto Key = ParseString(); - if (!Key) return false; - if (!Expect(':')) return false; - SkipWs(); - if (!Handler(*Key)) SkipValue(); - SkipWs(); - } while (Expect(',')); - return Expect('}'); - } - - // Parse [element, ...] calling Handler() for each element. - template - bool ParseArray(Fn Handler) { - if (!Expect('[')) return false; - SkipWs(); - if (Peek() == ']') { ++Pos; return true; } - do { - SkipWs(); - Handler(); - SkipWs(); - } while (Expect(',')); - return Expect(']'); +std::optional ParseVec3(const rapidjson::Value &Value) { + if (!Value.IsArray() || Value.Size() != 3 || !Value[0].IsNumber() || + !Value[1].IsNumber() || !Value[2].IsNumber()) { + return std::nullopt; } -}; - -EditorSceneItemKind KindFromStr(std::string_view S) { - if (S == "Mesh") return EditorSceneItemKind::Mesh; - if (S == "Light") return EditorSceneItemKind::Light; - if (S == "Camera") return EditorSceneItemKind::Camera; - if (S == "Actor") return EditorSceneItemKind::Actor; - return EditorSceneItemKind::Folder; + return glm::vec3(Value[0].GetFloat(), Value[1].GetFloat(), + Value[2].GetFloat()); } } // namespace @@ -739,8 +668,13 @@ DeserializeSceneFromJsonString(const std::filesystem::path &Path, std::string_view Text) { const std::filesystem::path ContentRoot = ResolveContentRootForScenePath(Path); const bool CookedOnlyContent = IsCookedOnlyContentPath(ContentRoot); - - Parser P{Text}; + std::string MutableText(Text); + rapidjson::Document Document; + Document.ParseInsitu(MutableText.data()); + if (Document.HasParseError() || !Document.IsObject()) { + A_CORE_ERROR("SceneFile: failed to parse {0}", Path.string()); + return std::nullopt; + } // --- Stage 1: parse flat data --- struct FlatNode { @@ -770,208 +704,295 @@ DeserializeSceneFromJsonString(const std::filesystem::path &Path, std::unordered_map Objects; std::unordered_map MeshNameToObjectId; EditorWorldSettings WorldSettings; + if (const auto MeshAssetIt = Document.FindMember("meshAsset"); + MeshAssetIt != Document.MemberEnd() && MeshAssetIt->value.IsString()) { + MeshAsset.assign(MeshAssetIt->value.GetString(), + MeshAssetIt->value.GetStringLength()); + } - bool Ok = P.ParseObject([&](const std::string &Key) -> bool { - if (Key == "version") { P.ParseNumber(); return true; } - if (Key == "meshAsset") { - auto V = P.ParseString(); if (V) MeshAsset = *V; return true; - } - if (Key == "nodes") { - P.ParseArray([&] { - FlatNode Node; - P.ParseObject([&](const std::string &K) -> bool { - if (K == "id") { auto V = P.ParseString(); if (V) Node.Id = *V; return true; } - if (K == "parentId") { P.SkipWs(); if (P.Peek() == 'n') { P.ParseNull(); } else { auto V = P.ParseString(); if (V) Node.ParentId = *V; } return true; } - if (K == "displayName") { auto V = P.ParseString(); if (V) Node.DisplayName = *V; return true; } - if (K == "kind") { auto V = P.ParseString(); if (V) Node.Kind = KindFromStr(*V); return true; } - if (K == "visible") { auto V = P.ParseBool(); if (V) Node.Visible = *V; return true; } - return false; - }); - Nodes.push_back(std::move(Node)); - }); - return true; + if (const auto NodesIt = Document.FindMember("nodes"); + NodesIt != Document.MemberEnd() && NodesIt->value.IsArray()) { + for (const auto &NodeValue : NodesIt->value.GetArray()) { + if (!NodeValue.IsObject()) { + continue; + } + FlatNode Node; + if (const auto Id = GetOptionalString(NodeValue, "id"); Id.has_value()) { + Node.Id = *Id; + } + if (const auto ParentId = GetOptionalString(NodeValue, "parentId"); + ParentId.has_value()) { + Node.ParentId = *ParentId; + } + if (const auto DisplayName = GetOptionalString(NodeValue, "displayName"); + DisplayName.has_value()) { + Node.DisplayName = *DisplayName; + } + if (const auto KindIt = NodeValue.FindMember("kind"); + KindIt != NodeValue.MemberEnd() && KindIt->value.IsString()) { + Node.Kind = KindFromStr( + std::string_view(KindIt->value.GetString(), + KindIt->value.GetStringLength())); + } + if (const auto VisibleIt = NodeValue.FindMember("visible"); + VisibleIt != NodeValue.MemberEnd() && VisibleIt->value.IsBool()) { + Node.Visible = VisibleIt->value.GetBool(); + } + Nodes.push_back(std::move(Node)); } - if (Key == "objects") { - P.ParseArray([&] { - std::string ObjId; - ObjectData Data; - P.ParseObject([&](const std::string &K) -> bool { - if (K == "id") { auto V = P.ParseString(); if (V) ObjId = *V; return true; } - if (K == "displayName") { auto V = P.ParseString(); if (V) Data.DisplayName = *V; return true; } - if (K == "kind") { auto V = P.ParseString(); if (V) Data.Kind = KindFromStr(*V); return true; } - if (K == "visible") { auto V = P.ParseBool(); if (V) Data.Visible = *V; return true; } - if (K == "isGeneratedAssetChild") { auto V = P.ParseBool(); if (V) Data.IsGeneratedAssetChild = *V; return true; } - if (K == "supportsTransform"){ auto V = P.ParseBool(); if (V) Data.SupportsTransform = *V; return true; } - if (K == "transformReadOnly"){ auto V = P.ParseBool(); if (V) Data.TransformReadOnly = *V; return true; } - if (K == "location") { - auto V = P.ParseVec3(); - if (V) { - if (!Data.Transform) Data.Transform = EditorTransformDetails{}; - Data.Transform->Location = *V; - } - return true; - } - if (K == "rotationDegrees") { - auto V = P.ParseVec3(); - if (V) { - if (!Data.Transform) Data.Transform = EditorTransformDetails{}; - Data.Transform->RotationDegrees = *V; - } - return true; - } - if (K == "scale") { - auto V = P.ParseVec3(); - if (V) { - if (!Data.Transform) Data.Transform = EditorTransformDetails{}; - Data.Transform->Scale = *V; - } - return true; - } - if (K == "scriptClass") { - P.SkipWs(); - if (P.Peek() == 'n') { P.ParseNull(); } else { auto V = P.ParseString(); if (V) Data.ScriptClass = *V; } - return true; - } - if (K == "generatedFromAssetRootId") { - P.SkipWs(); - if (P.Peek() == 'n') { P.ParseNull(); } else { auto V = P.ParseString(); if (V) Data.GeneratedFromAssetRootId = *V; } - return true; - } - if (K == "assetRelativePath") { - auto V = P.ParseString(); if (V) Data.AssetRelativePath = *V; return true; - } - if (K == "materialAssetPath") { - auto V = P.ParseString(); if (V) Data.MaterialAssetPath = *V; return true; - } - if (K == "textureAssetPath") { - P.SkipWs(); - if (P.Peek() == 'n') { P.ParseNull(); } else { auto V = P.ParseString(); if (V) Data.TextureAssetPath = *V; } - return true; - } - if (K == "lightColor") { - auto V = P.ParseVec3(); - if (V) { if (!Data.Light) Data.Light = EditorLightProperties{}; Data.Light->Color = *V; } - return true; - } - if (K == "lightIntensity") { - auto V = P.ParseNumber(); - if (V) { if (!Data.Light) Data.Light = EditorLightProperties{}; Data.Light->Intensity = static_cast(*V); } - return true; - } - if (K == "lightDirection") { - auto V = P.ParseVec3(); - if (V) { if (!Data.Light) Data.Light = EditorLightProperties{}; Data.Light->Direction = *V; } - return true; - } - if (K == "physicsBodyType") { - auto V = P.ParseString(); - if (V) { - if (!Data.Physics) Data.Physics = EditorPhysicsProperties{}; - if (*V == "static") { - Data.Physics->BodyType = EditorPhysicsBodyType::Static; - } else if (*V == "dynamic") { - Data.Physics->BodyType = EditorPhysicsBodyType::Dynamic; - } else { - Data.Physics->BodyType = EditorPhysicsBodyType::None; - } - } - return true; - } - if (K == "physicsColliderType") { - auto V = P.ParseString(); - if (V) { - if (!Data.Physics) Data.Physics = EditorPhysicsProperties{}; - if (*V == "box") { - Data.Physics->ColliderType = EditorPhysicsColliderType::Box; - } else if (*V == "sphere") { - Data.Physics->ColliderType = EditorPhysicsColliderType::Sphere; - } else { - Data.Physics->ColliderType = EditorPhysicsColliderType::None; - } - } - return true; + } + + if (const auto ObjectsIt = Document.FindMember("objects"); + ObjectsIt != Document.MemberEnd() && ObjectsIt->value.IsArray()) { + for (const auto &ObjectValue : ObjectsIt->value.GetArray()) { + if (!ObjectValue.IsObject()) { + continue; + } + + std::string ObjId; + ObjectData Data; + if (const auto Id = GetOptionalString(ObjectValue, "id"); Id.has_value()) { + ObjId = *Id; + } + if (const auto DisplayName = GetOptionalString(ObjectValue, "displayName"); + DisplayName.has_value()) { + Data.DisplayName = *DisplayName; + } + if (const auto KindIt = ObjectValue.FindMember("kind"); + KindIt != ObjectValue.MemberEnd() && KindIt->value.IsString()) { + Data.Kind = KindFromStr( + std::string_view(KindIt->value.GetString(), + KindIt->value.GetStringLength())); + } + if (const auto VisibleIt = ObjectValue.FindMember("visible"); + VisibleIt != ObjectValue.MemberEnd() && VisibleIt->value.IsBool()) { + Data.Visible = VisibleIt->value.GetBool(); + } + if (const auto GeneratedIt = + ObjectValue.FindMember("isGeneratedAssetChild"); + GeneratedIt != ObjectValue.MemberEnd() && GeneratedIt->value.IsBool()) { + Data.IsGeneratedAssetChild = GeneratedIt->value.GetBool(); + } + if (const auto SupportsTransformIt = + ObjectValue.FindMember("supportsTransform"); + SupportsTransformIt != ObjectValue.MemberEnd() && + SupportsTransformIt->value.IsBool()) { + Data.SupportsTransform = SupportsTransformIt->value.GetBool(); + } + if (const auto TransformReadOnlyIt = + ObjectValue.FindMember("transformReadOnly"); + TransformReadOnlyIt != ObjectValue.MemberEnd() && + TransformReadOnlyIt->value.IsBool()) { + Data.TransformReadOnly = TransformReadOnlyIt->value.GetBool(); + } + if (const auto LocationIt = ObjectValue.FindMember("location"); + LocationIt != ObjectValue.MemberEnd()) { + if (const auto Value = ParseVec3(LocationIt->value); Value.has_value()) { + if (!Data.Transform.has_value()) { + Data.Transform = EditorTransformDetails{}; } - if (K == "physicsBoxHalfExtents") { - auto V = P.ParseVec3(); - if (V) { - if (!Data.Physics) Data.Physics = EditorPhysicsProperties{}; - Data.Physics->BoxHalfExtents = *V; - } - return true; + Data.Transform->Location = *Value; + } + } + if (const auto RotationIt = ObjectValue.FindMember("rotationDegrees"); + RotationIt != ObjectValue.MemberEnd()) { + if (const auto Value = ParseVec3(RotationIt->value); Value.has_value()) { + if (!Data.Transform.has_value()) { + Data.Transform = EditorTransformDetails{}; } - if (K == "physicsSphereRadius") { - auto V = P.ParseNumber(); - if (V) { - if (!Data.Physics) Data.Physics = EditorPhysicsProperties{}; - Data.Physics->SphereRadius = static_cast(*V); - } - return true; + Data.Transform->RotationDegrees = *Value; + } + } + if (const auto ScaleIt = ObjectValue.FindMember("scale"); + ScaleIt != ObjectValue.MemberEnd()) { + if (const auto Value = ParseVec3(ScaleIt->value); Value.has_value()) { + if (!Data.Transform.has_value()) { + Data.Transform = EditorTransformDetails{}; } - if (K == "physicsMass") { - auto V = P.ParseNumber(); - if (V) { - if (!Data.Physics) Data.Physics = EditorPhysicsProperties{}; - Data.Physics->Mass = static_cast(*V); - } - return true; + Data.Transform->Scale = *Value; + } + } + if (const auto ScriptClass = GetOptionalString(ObjectValue, "scriptClass"); + ScriptClass.has_value() && !ScriptClass->empty()) { + Data.ScriptClass = *ScriptClass; + } + if (const auto GeneratedRootId = + GetOptionalString(ObjectValue, "generatedFromAssetRootId"); + GeneratedRootId.has_value() && !GeneratedRootId->empty()) { + Data.GeneratedFromAssetRootId = *GeneratedRootId; + } + if (const auto AssetRelativePath = + GetOptionalString(ObjectValue, "assetRelativePath"); + AssetRelativePath.has_value()) { + Data.AssetRelativePath = *AssetRelativePath; + } + if (const auto MaterialAssetPath = + GetOptionalString(ObjectValue, "materialAssetPath"); + MaterialAssetPath.has_value()) { + Data.MaterialAssetPath = *MaterialAssetPath; + } + if (const auto TextureAssetPath = + GetOptionalString(ObjectValue, "textureAssetPath"); + TextureAssetPath.has_value()) { + Data.TextureAssetPath = *TextureAssetPath; + } + if (const auto LightColorIt = ObjectValue.FindMember("lightColor"); + LightColorIt != ObjectValue.MemberEnd()) { + if (const auto Value = ParseVec3(LightColorIt->value); + Value.has_value()) { + if (!Data.Light.has_value()) { + Data.Light = EditorLightProperties{}; } - if (K == "physicsFriction") { - auto V = P.ParseNumber(); - if (V) { - if (!Data.Physics) Data.Physics = EditorPhysicsProperties{}; - Data.Physics->Friction = static_cast(*V); - } - return true; + Data.Light->Color = *Value; + } + } + if (const auto LightIntensityIt = + ObjectValue.FindMember("lightIntensity"); + LightIntensityIt != ObjectValue.MemberEnd() && + LightIntensityIt->value.IsNumber()) { + if (!Data.Light.has_value()) { + Data.Light = EditorLightProperties{}; + } + Data.Light->Intensity = LightIntensityIt->value.GetFloat(); + } + if (const auto LightDirectionIt = + ObjectValue.FindMember("lightDirection"); + LightDirectionIt != ObjectValue.MemberEnd()) { + if (const auto Value = ParseVec3(LightDirectionIt->value); + Value.has_value()) { + if (!Data.Light.has_value()) { + Data.Light = EditorLightProperties{}; } - if (K == "physicsRestitution") { - auto V = P.ParseNumber(); - if (V) { - if (!Data.Physics) Data.Physics = EditorPhysicsProperties{}; - Data.Physics->Restitution = static_cast(*V); - } - return true; + Data.Light->Direction = *Value; + } + } + if (const auto PhysicsBodyTypeIt = + ObjectValue.FindMember("physicsBodyType"); + PhysicsBodyTypeIt != ObjectValue.MemberEnd() && + PhysicsBodyTypeIt->value.IsString()) { + if (!Data.Physics.has_value()) { + Data.Physics = EditorPhysicsProperties{}; + } + const std::string_view PhysicsBodyType( + PhysicsBodyTypeIt->value.GetString(), + PhysicsBodyTypeIt->value.GetStringLength()); + if (PhysicsBodyType == "static") { + Data.Physics->BodyType = EditorPhysicsBodyType::Static; + } else if (PhysicsBodyType == "dynamic") { + Data.Physics->BodyType = EditorPhysicsBodyType::Dynamic; + } else { + Data.Physics->BodyType = EditorPhysicsBodyType::None; + } + } + if (const auto PhysicsColliderTypeIt = + ObjectValue.FindMember("physicsColliderType"); + PhysicsColliderTypeIt != ObjectValue.MemberEnd() && + PhysicsColliderTypeIt->value.IsString()) { + if (!Data.Physics.has_value()) { + Data.Physics = EditorPhysicsProperties{}; + } + const std::string_view PhysicsColliderType( + PhysicsColliderTypeIt->value.GetString(), + PhysicsColliderTypeIt->value.GetStringLength()); + if (PhysicsColliderType == "box") { + Data.Physics->ColliderType = EditorPhysicsColliderType::Box; + } else if (PhysicsColliderType == "sphere") { + Data.Physics->ColliderType = EditorPhysicsColliderType::Sphere; + } else { + Data.Physics->ColliderType = EditorPhysicsColliderType::None; + } + } + if (const auto PhysicsBoxHalfExtentsIt = + ObjectValue.FindMember("physicsBoxHalfExtents"); + PhysicsBoxHalfExtentsIt != ObjectValue.MemberEnd()) { + if (const auto Value = ParseVec3(PhysicsBoxHalfExtentsIt->value); + Value.has_value()) { + if (!Data.Physics.has_value()) { + Data.Physics = EditorPhysicsProperties{}; } - return false; - }); - if (!ObjId.empty()) Objects[ObjId] = std::move(Data); - }); - return true; - } - if (Key == "meshNameToObjectId") { - P.ParseObject([&](const std::string &MeshName) -> bool { - auto ObjId = P.ParseString(); - if (ObjId) MeshNameToObjectId[MeshName] = *ObjId; - return true; - }); - return true; - } - if (Key == "worldSettings") { - P.ParseObject([&](const std::string &K) -> bool { - if (K == "skyboxColorTop") { - auto V = P.ParseVec3(); - if (V) WorldSettings.SkyboxColorTop = *V; - return true; + Data.Physics->BoxHalfExtents = *Value; } - if (K == "skyboxColorBottom") { - auto V = P.ParseVec3(); - if (V) WorldSettings.SkyboxColorBottom = *V; - return true; + } + if (const auto PhysicsSphereRadiusIt = + ObjectValue.FindMember("physicsSphereRadius"); + PhysicsSphereRadiusIt != ObjectValue.MemberEnd() && + PhysicsSphereRadiusIt->value.IsNumber()) { + if (!Data.Physics.has_value()) { + Data.Physics = EditorPhysicsProperties{}; + } + Data.Physics->SphereRadius = PhysicsSphereRadiusIt->value.GetFloat(); + } + if (const auto PhysicsMassIt = ObjectValue.FindMember("physicsMass"); + PhysicsMassIt != ObjectValue.MemberEnd() && + PhysicsMassIt->value.IsNumber()) { + if (!Data.Physics.has_value()) { + Data.Physics = EditorPhysicsProperties{}; } - if (K == "skyboxHDRPath") { - auto V = P.ParseString(); - if (V) WorldSettings.SkyboxHDRPath = *V; - return true; + Data.Physics->Mass = PhysicsMassIt->value.GetFloat(); + } + if (const auto PhysicsFrictionIt = + ObjectValue.FindMember("physicsFriction"); + PhysicsFrictionIt != ObjectValue.MemberEnd() && + PhysicsFrictionIt->value.IsNumber()) { + if (!Data.Physics.has_value()) { + Data.Physics = EditorPhysicsProperties{}; } - return false; - }); - return true; + Data.Physics->Friction = PhysicsFrictionIt->value.GetFloat(); + } + if (const auto PhysicsRestitutionIt = + ObjectValue.FindMember("physicsRestitution"); + PhysicsRestitutionIt != ObjectValue.MemberEnd() && + PhysicsRestitutionIt->value.IsNumber()) { + if (!Data.Physics.has_value()) { + Data.Physics = EditorPhysicsProperties{}; + } + Data.Physics->Restitution = PhysicsRestitutionIt->value.GetFloat(); + } + + if (!ObjId.empty()) { + Objects[ObjId] = std::move(Data); + } } - return false; - }); + } - if (!Ok) { - A_CORE_ERROR("SceneFile: failed to parse {0}", Path.string()); - return std::nullopt; + if (const auto MeshNameToObjectIdIt = + Document.FindMember("meshNameToObjectId"); + MeshNameToObjectIdIt != Document.MemberEnd() && + MeshNameToObjectIdIt->value.IsObject()) { + for (const auto &Member : MeshNameToObjectIdIt->value.GetObject()) { + if (Member.value.IsString()) { + MeshNameToObjectId.emplace( + Member.name.GetString(), + std::string(Member.value.GetString(), + Member.value.GetStringLength())); + } + } + } + + if (const auto WorldSettingsIt = Document.FindMember("worldSettings"); + WorldSettingsIt != Document.MemberEnd() && + WorldSettingsIt->value.IsObject()) { + if (const auto SkyboxColorTopIt = + WorldSettingsIt->value.FindMember("skyboxColorTop"); + SkyboxColorTopIt != WorldSettingsIt->value.MemberEnd()) { + if (const auto Value = ParseVec3(SkyboxColorTopIt->value); + Value.has_value()) { + WorldSettings.SkyboxColorTop = *Value; + } + } + if (const auto SkyboxColorBottomIt = + WorldSettingsIt->value.FindMember("skyboxColorBottom"); + SkyboxColorBottomIt != WorldSettingsIt->value.MemberEnd()) { + if (const auto Value = ParseVec3(SkyboxColorBottomIt->value); + Value.has_value()) { + WorldSettings.SkyboxColorBottom = *Value; + } + } + if (const auto SkyboxHDRPath = GetOptionalString(WorldSettingsIt->value, + "skyboxHDRPath"); + SkyboxHDRPath.has_value()) { + WorldSettings.SkyboxHDRPath = *SkyboxHDRPath; + } } // --- Stage 2: reconstruct scene tree from flat nodes --- diff --git a/Axiom/CMakeLists.txt b/Axiom/CMakeLists.txt index 05b97cfa..911aa0c0 100644 --- a/Axiom/CMakeLists.txt +++ b/Axiom/CMakeLists.txt @@ -294,6 +294,7 @@ target_include_directories(AxiomCore PUBLIC "${CMAKE_SOURCE_DIR}/ThirdParty/vma" "${CMAKE_SOURCE_DIR}/ThirdParty/volk" "${CMAKE_SOURCE_DIR}/ThirdParty/spdlog/include" + "${rapidjson_SOURCE_DIR}/include" "$<$:${AXIOM_JOLT_SOURCE_DIR}>" "${Vulkan_INCLUDE_DIRS}" ) diff --git a/Axiom/Core/Log.cpp b/Axiom/Core/Log.cpp index 2cbd605b..8eb1cfb7 100644 --- a/Axiom/Core/Log.cpp +++ b/Axiom/Core/Log.cpp @@ -8,6 +8,20 @@ std::shared_ptr Log::s_CoreLogger; std::shared_ptr Log::s_ClientLogger; void Log::Init() { + if (s_CoreLogger != nullptr && s_ClientLogger != nullptr) { + return; + } + + if (s_CoreLogger == nullptr) { + s_CoreLogger = spdlog::get("AXIOM"); + } + if (s_ClientLogger == nullptr) { + s_ClientLogger = spdlog::get("APP"); + } + if (s_CoreLogger != nullptr && s_ClientLogger != nullptr) { + return; + } + std::vector LogSinks; LogSinks.emplace_back( std::make_shared()); @@ -17,17 +31,21 @@ void Log::Init() { LogSinks[0]->set_pattern("%^[%T] %n: %v%$"); LogSinks[1]->set_pattern("[%T] [%l] %n: %v"); - s_CoreLogger = - std::make_shared("AXIOM", begin(LogSinks), end(LogSinks)); - spdlog::register_logger(s_CoreLogger); - s_CoreLogger->set_level(spdlog::level::trace); - s_CoreLogger->flush_on(spdlog::level::trace); - - s_ClientLogger = - std::make_shared("APP", begin(LogSinks), end(LogSinks)); - spdlog::register_logger(s_ClientLogger); - s_ClientLogger->set_level(spdlog::level::trace); - s_ClientLogger->flush_on(spdlog::level::trace); + if (s_CoreLogger == nullptr) { + s_CoreLogger = std::make_shared("AXIOM", begin(LogSinks), + end(LogSinks)); + spdlog::register_logger(s_CoreLogger); + s_CoreLogger->set_level(spdlog::level::trace); + s_CoreLogger->flush_on(spdlog::level::trace); + } + + if (s_ClientLogger == nullptr) { + s_ClientLogger = std::make_shared("APP", begin(LogSinks), + end(LogSinks)); + spdlog::register_logger(s_ClientLogger); + s_ClientLogger->set_level(spdlog::level::trace); + s_ClientLogger->flush_on(spdlog::level::trace); + } } void Log::Flush() { @@ -35,4 +53,3 @@ void Log::Flush() { s_ClientLogger->flush(); } } // namespace Axiom - diff --git a/Axiom/Project/ProjectSystem.cpp b/Axiom/Project/ProjectSystem.cpp index 29b9e119..4310935a 100644 --- a/Axiom/Project/ProjectSystem.cpp +++ b/Axiom/Project/ProjectSystem.cpp @@ -6,6 +6,10 @@ #include "Assets/SceneFile.h" #include "Core/Log.h" +#include +#include +#include + #include #include #include @@ -38,163 +42,14 @@ constexpr std::string_view kDefaultStarterScriptClassName = "StarterScript"; constexpr std::string_view kCsProjectTypeGuid = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"; -std::string EscapeJsonString(std::string_view Value) { - std::string Result; - Result.reserve(Value.size() + 4); - for (const char Character : Value) { - switch (Character) { - case '\\': - Result += "\\\\"; - break; - case '"': - Result += "\\\""; - break; - case '\n': - Result += "\\n"; - break; - case '\r': - Result += "\\r"; - break; - case '\t': - Result += "\\t"; - break; - default: - Result.push_back(Character); - break; - } - } - return Result; +std::string SerializePrettyJson(const rapidjson::Document &Document) { + rapidjson::StringBuffer Buffer; + rapidjson::PrettyWriter Writer(Buffer); + Writer.SetIndent(' ', 2); + Document.Accept(Writer); + return std::string(Buffer.GetString(), Buffer.GetSize()) + '\n'; } -class JsonObjectParser { -public: - explicit JsonObjectParser(std::string_view Text) : m_Text(Text) {} - - bool ParseObject(std::unordered_map &Out) { - SkipWhitespace(); - if (!Consume('{')) { - return false; - } - - SkipWhitespace(); - if (Consume('}')) { - return true; - } - - while (m_Index < m_Text.size()) { - const auto Key = ParseString(); - if (!Key.has_value()) { - return false; - } - - SkipWhitespace(); - if (!Consume(':')) { - return false; - } - - SkipWhitespace(); - std::string Value; - if (Peek() == '"') { - const auto Parsed = ParseString(); - if (!Parsed.has_value()) { - return false; - } - Value = *Parsed; - } else { - const size_t Start = m_Index; - while (m_Index < m_Text.size()) { - const char Character = m_Text[m_Index]; - if (Character == ',' || Character == '}' || - std::isspace(static_cast(Character))) { - break; - } - ++m_Index; - } - Value = std::string(m_Text.substr(Start, m_Index - Start)); - } - Out.emplace(*Key, std::move(Value)); - - SkipWhitespace(); - if (Consume('}')) { - return true; - } - if (!Consume(',')) { - return false; - } - SkipWhitespace(); - } - - return false; - } - -private: - std::optional ParseString() { - if (!Consume('"')) { - return std::nullopt; - } - - std::string Result; - while (m_Index < m_Text.size()) { - const char Character = m_Text[m_Index++]; - if (Character == '"') { - return Result; - } - if (Character == '\\') { - if (m_Index >= m_Text.size()) { - return std::nullopt; - } - const char Escaped = m_Text[m_Index++]; - switch (Escaped) { - case '\\': - case '"': - case '/': - Result.push_back(Escaped); - break; - case 'n': - Result.push_back('\n'); - break; - case 'r': - Result.push_back('\r'); - break; - case 't': - Result.push_back('\t'); - break; - default: - return std::nullopt; - } - continue; - } - Result.push_back(Character); - } - return std::nullopt; - } - - void SkipWhitespace() { - while (m_Index < m_Text.size() && - std::isspace(static_cast(m_Text[m_Index]))) { - ++m_Index; - } - } - - bool Consume(char Expected) { - if (Peek() != Expected) { - return false; - } - ++m_Index; - return true; - } - - char Peek() const { - if (m_Index >= m_Text.size()) { - return '\0'; - } - return m_Text[m_Index]; - } - - std::string_view m_Text; - size_t m_Index{0}; -}; - std::string BuildProjectId(std::string_view Slug) { // Stable enough for v1 scaffold creation without adding a UUID dependency. std::hash Hasher; @@ -572,24 +427,53 @@ bool CopyDirectoryTree(const std::filesystem::path &Source, bool SavePackageManifestFile(const ProjectDescriptor &Project, const ProjectPackageResult &PackageResult) { - std::ostringstream Stream; - Stream << "{\n" - << " \"version\": 1,\n" - << " \"projectId\": \"" << EscapeJsonString(Project.Manifest.ProjectId) - << "\",\n" - << " \"name\": \"" << EscapeJsonString(Project.Manifest.Name) << "\",\n" - << " \"slug\": \"" << EscapeJsonString(Project.Manifest.Slug) << "\",\n" - << " \"contentMode\": \"cooked-only-v1\",\n" - << " \"sceneAsset\": \"Content/Cooked/scene.wscene\",\n" - << " \"cookedDir\": \"Content/Cooked\",\n" - << " \"assetCookManifest\": \"Content/Cooked/AssetCookManifest.json\",\n" - << " \"engineContentDir\": \"Content/Engine\",\n" - << " \"cookedSourceAssetCount\": " - << PackageResult.Cook.CookedSourceAssetCount << ",\n" - << " \"manifestEntryCount\": " << PackageResult.Cook.ManifestEntryCount - << "\n" - << "}\n"; - return WriteTextFile(Project.Output.PackageManifestPath, Stream.str()); + rapidjson::Document Document; + Document.SetObject(); + auto &Allocator = Document.GetAllocator(); + + Document.AddMember("version", 1u, Allocator); + Document.AddMember( + "projectId", + rapidjson::Value(Project.Manifest.ProjectId.c_str(), + static_cast( + Project.Manifest.ProjectId.size()), + Allocator) + .Move(), + Allocator); + Document.AddMember( + "name", + rapidjson::Value(Project.Manifest.Name.c_str(), + static_cast(Project.Manifest.Name.size()), + Allocator) + .Move(), + Allocator); + Document.AddMember( + "slug", + rapidjson::Value(Project.Manifest.Slug.c_str(), + static_cast(Project.Manifest.Slug.size()), + Allocator) + .Move(), + Allocator); + Document.AddMember("contentMode", "cooked-only-v1", Allocator); + Document.AddMember("sceneAsset", "Content/Cooked/scene.wscene", Allocator); + Document.AddMember("cookedDir", "Content/Cooked", Allocator); + Document.AddMember("assetCookManifest", + "Content/Cooked/AssetCookManifest.json", Allocator); + Document.AddMember("engineContentDir", "Content/Engine", Allocator); + Document.AddMember( + "cookedSourceAssetCount", + rapidjson::Value() + .SetUint64( + static_cast(PackageResult.Cook.CookedSourceAssetCount)), + Allocator); + Document.AddMember( + "manifestEntryCount", + rapidjson::Value().SetUint64( + static_cast(PackageResult.Cook.ManifestEntryCount)), + Allocator); + + return WriteTextFile(Project.Output.PackageManifestPath, + SerializePrettyJson(Document)); } } // namespace @@ -749,24 +633,51 @@ bool SaveProjectManifest(const std::filesystem::path &ManifestPath, return false; } - std::ofstream File(ManifestPath); - if (!File.is_open()) { - A_CORE_ERROR("ProjectSystem: failed to open manifest '{}'", - ManifestPath.string()); - return false; - } - - File << "{\n" - << " \"version\": " << Manifest.Version << ",\n" - << " \"projectId\": \"" << EscapeJsonString(Manifest.ProjectId) << "\",\n" - << " \"name\": \"" << EscapeJsonString(Manifest.Name) << "\",\n" - << " \"slug\": \"" << EscapeJsonString(Manifest.Slug) << "\",\n" - << " \"scriptAssemblyName\": \"" - << EscapeJsonString(Manifest.ScriptAssemblyName) << "\",\n" - << " \"scriptRootNamespace\": \"" - << EscapeJsonString(Manifest.ScriptRootNamespace) << "\"\n" - << "}\n"; - return File.good(); + rapidjson::Document Document; + Document.SetObject(); + auto &Allocator = Document.GetAllocator(); + + Document.AddMember("version", Manifest.Version, Allocator); + Document.AddMember( + "projectId", + rapidjson::Value(Manifest.ProjectId.c_str(), + static_cast( + Manifest.ProjectId.size()), + Allocator) + .Move(), + Allocator); + Document.AddMember( + "name", + rapidjson::Value(Manifest.Name.c_str(), + static_cast(Manifest.Name.size()), + Allocator) + .Move(), + Allocator); + Document.AddMember( + "slug", + rapidjson::Value(Manifest.Slug.c_str(), + static_cast(Manifest.Slug.size()), + Allocator) + .Move(), + Allocator); + Document.AddMember( + "scriptAssemblyName", + rapidjson::Value( + Manifest.ScriptAssemblyName.c_str(), + static_cast(Manifest.ScriptAssemblyName.size()), + Allocator) + .Move(), + Allocator); + Document.AddMember( + "scriptRootNamespace", + rapidjson::Value( + Manifest.ScriptRootNamespace.c_str(), + static_cast(Manifest.ScriptRootNamespace.size()), + Allocator) + .Move(), + Allocator); + + return WriteTextFile(ManifestPath, SerializePrettyJson(Document)); } std::optional @@ -776,44 +687,56 @@ LoadProjectManifest(const std::filesystem::path &ManifestPath) { return std::nullopt; } - JsonObjectParser Parser(Text); - std::unordered_map Fields; - if (!Parser.ParseObject(Fields)) { + rapidjson::Document Document; + Document.ParseInsitu(Text.data()); + if (Document.HasParseError() || !Document.IsObject()) { A_CORE_WARN("ProjectSystem: failed to parse manifest '{}'", ManifestPath.string()); return std::nullopt; } - const auto VersionIt = Fields.find("version"); - const auto ProjectIdIt = Fields.find("projectId"); - const auto NameIt = Fields.find("name"); - const auto SlugIt = Fields.find("slug"); - if (VersionIt == Fields.end() || ProjectIdIt == Fields.end() || - NameIt == Fields.end() || SlugIt == Fields.end()) { + const auto VersionIt = Document.FindMember("version"); + const auto ProjectIdIt = Document.FindMember("projectId"); + const auto NameIt = Document.FindMember("name"); + const auto SlugIt = Document.FindMember("slug"); + if (VersionIt == Document.MemberEnd() || ProjectIdIt == Document.MemberEnd() || + NameIt == Document.MemberEnd() || SlugIt == Document.MemberEnd() || + !VersionIt->value.IsUint() || !ProjectIdIt->value.IsString() || + !NameIt->value.IsString() || !SlugIt->value.IsString()) { return std::nullopt; } - const auto Version = ParseUint32(VersionIt->second); - if (!Version.has_value() || !IsValidProjectSlug(SlugIt->second)) { + const auto Version = ParseUint32( + std::to_string(static_cast(VersionIt->value.GetUint()))); + const std::string_view Slug(SlugIt->value.GetString(), + SlugIt->value.GetStringLength()); + const std::string_view Name(NameIt->value.GetString(), + NameIt->value.GetStringLength()); + if (!Version.has_value() || !IsValidProjectSlug(Slug)) { return std::nullopt; } return ProjectManifest{ .Version = *Version, - .ProjectId = ProjectIdIt->second, - .Name = NameIt->second, - .Slug = SlugIt->second, - .ScriptAssemblyName = [&Fields, &NameIt]() { - const auto ScriptAssemblyIt = Fields.find("scriptAssemblyName"); - return ScriptAssemblyIt != Fields.end() - ? ScriptAssemblyIt->second - : BuildScriptAssemblyName(NameIt->second); + .ProjectId = std::string(ProjectIdIt->value.GetString(), + ProjectIdIt->value.GetStringLength()), + .Name = std::string(Name), + .Slug = std::string(Slug), + .ScriptAssemblyName = [&Document, Name]() { + const auto ScriptAssemblyIt = Document.FindMember("scriptAssemblyName"); + return ScriptAssemblyIt != Document.MemberEnd() && + ScriptAssemblyIt->value.IsString() + ? std::string(ScriptAssemblyIt->value.GetString(), + ScriptAssemblyIt->value.GetStringLength()) + : BuildScriptAssemblyName(Name); }(), - .ScriptRootNamespace = [&Fields, &NameIt]() { - const auto ScriptNamespaceIt = Fields.find("scriptRootNamespace"); - return ScriptNamespaceIt != Fields.end() - ? ScriptNamespaceIt->second - : BuildScriptRootNamespace(NameIt->second); + .ScriptRootNamespace = [&Document, Name]() { + const auto ScriptNamespaceIt = Document.FindMember("scriptRootNamespace"); + return ScriptNamespaceIt != Document.MemberEnd() && + ScriptNamespaceIt->value.IsString() + ? std::string(ScriptNamespaceIt->value.GetString(), + ScriptNamespaceIt->value.GetStringLength()) + : BuildScriptRootNamespace(Name); }(), }; } @@ -827,37 +750,24 @@ bool SaveDefaultSceneFile(const std::filesystem::path &SceneFilePath) { return false; } - std::ofstream File(SceneFilePath); - if (!File.is_open()) { - A_CORE_ERROR("ProjectSystem: failed to open scene file '{}'", - SceneFilePath.string()); - return false; - } - - File << "{\n" - << " \"version\": 1,\n" - << " \"meshAsset\": \"\",\n" - << " \"nodes\": [\n" - << " {\n" - << " \"id\": \"world\",\n" - << " \"parentId\": null,\n" - << " \"displayName\": \"World\",\n" - << " \"kind\": \"Folder\",\n" - << " \"visible\": true\n" - << " }\n" - << " ],\n" - << " \"objects\": [\n" - << " {\n" - << " \"id\": \"world\",\n" - << " \"displayName\": \"World\",\n" - << " \"kind\": \"Folder\",\n" - << " \"visible\": true,\n" - << " \"supportsTransform\": false,\n" - << " \"transformReadOnly\": true\n" - << " }\n" - << " ]\n" - << "}\n"; - return File.good(); + EditorSceneState Scene; + Scene.Items = {{ + .Id = "world", + .DisplayName = "World", + .Kind = EditorSceneItemKind::Folder, + .Visible = true, + }}; + Scene.ObjectDetailsById.emplace( + "world", + EditorObjectDetails{ + .ObjectId = "world", + .DisplayName = "World", + .Kind = EditorSceneItemKind::Folder, + .Visible = true, + .SupportsTransform = false, + .TransformReadOnly = true, + }); + return Assets::SaveSceneToFile(SceneFilePath, Scene); } std::optional diff --git a/CMakeLists.txt b/CMakeLists.txt index 285c5957..3564ec27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,16 @@ add_subdirectory(ThirdParty/fastgltf) add_subdirectory(ThirdParty/glm/glm) include(FetchContent) +FetchContent_Declare( + rapidjson + URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.zip + DOWNLOAD_EXTRACT_TIMESTAMP TRUE +) +FetchContent_GetProperties(rapidjson) +if(NOT rapidjson_POPULATED) + FetchContent_Populate(rapidjson) +endif() + FetchContent_Declare( assimp URL https://github.com/assimp/assimp/archive/refs/tags/v5.4.3.zip diff --git a/Headless/HeadlessCommandProtocol.cpp b/Headless/HeadlessCommandProtocol.cpp index 9cbc957a..30a3b080 100644 --- a/Headless/HeadlessCommandProtocol.cpp +++ b/Headless/HeadlessCommandProtocol.cpp @@ -1,27 +1,21 @@ #include "HeadlessCommandProtocol.h" -#include -#include +#include +#include +#include #include -#include +#include +#include #include +#include namespace Axiom { namespace { -std::optional MatchString(std::string_view Text, - const std::regex &Pattern, - size_t Group = 1) { - std::match_results Match; - if (!std::regex_search(Text.begin(), Text.end(), Match, Pattern) || - Match.size() <= Group) { - return std::nullopt; - } - return std::string(Match[Group].first, Match[Group].second); -} + +using JsonWriter = rapidjson::Writer; std::optional ParseDouble(std::string_view Value) { - // std::from_chars for floating-point requires macOS 13.3+; use strtod. char *End = nullptr; const double Result = std::strtod(Value.data(), &End); if (End != Value.data() + Value.size()) { @@ -30,50 +24,6 @@ std::optional ParseDouble(std::string_view Value) { return Result; } -std::string UnescapeJsonString(std::string_view Value) { - std::string Unescaped; - Unescaped.reserve(Value.size()); - for (size_t Index = 0; Index < Value.size(); ++Index) { - const char Character = Value[Index]; - if (Character != '\\' || Index + 1 >= Value.size()) { - Unescaped.push_back(Character); - continue; - } - - const char Escape = Value[++Index]; - switch (Escape) { - case '\\': - Unescaped.push_back('\\'); - break; - case '"': - Unescaped.push_back('"'); - break; - case '/': - Unescaped.push_back('/'); - break; - case 'b': - Unescaped.push_back('\b'); - break; - case 'f': - Unescaped.push_back('\f'); - break; - case 'n': - Unescaped.push_back('\n'); - break; - case 'r': - Unescaped.push_back('\r'); - break; - case 't': - Unescaped.push_back('\t'); - break; - default: - Unescaped.push_back(Escape); - break; - } - } - return Unescaped; -} - std::optional ParseUnsigned16(std::string_view Value) { uint16_t Result = 0; const auto [Ptr, Ec] = @@ -84,41 +34,169 @@ std::optional ParseUnsigned16(std::string_view Value) { return Result; } -template -std::string_view MatchView(const MatchType &Match, size_t Index) { - return std::string_view(&*Match[Index].first, Match[Index].length()); +void WriteString(JsonWriter &Writer, std::string_view Value) { + Writer.String(Value.data(), static_cast(Value.size())); +} + +template void WriteNumber(JsonWriter &Writer, Number Value) { + const double DoubleValue = static_cast(Value); + const double RoundedValue = std::nearbyint(DoubleValue); + if (std::isfinite(DoubleValue) && DoubleValue == RoundedValue) { + if (RoundedValue >= 0.0 && + RoundedValue <= + static_cast(std::numeric_limits::max())) { + Writer.Uint64(static_cast(RoundedValue)); + return; + } + if (RoundedValue >= + static_cast(std::numeric_limits::min()) && + RoundedValue <= + static_cast(std::numeric_limits::max())) { + Writer.Int64(static_cast(RoundedValue)); + return; + } + } + + if constexpr (std::is_floating_point_v>) { + std::ostringstream Stream; + Stream << Value; + const std::string Text = Stream.str(); + Writer.RawValue(Text.c_str(), Text.size(), rapidjson::kNumberType); + return; + } + + Writer.Double(DoubleValue); +} + +template std::string BuildJson(Fn &&FnWriter) { + rapidjson::StringBuffer Buffer; + JsonWriter Writer(Buffer); + FnWriter(Writer); + return std::string(Buffer.GetString(), Buffer.GetSize()); +} + +std::optional ParseVec2(const rapidjson::Value &Value) { + if (!Value.IsArray() || Value.Size() != 2 || !Value[0].IsNumber() || + !Value[1].IsNumber()) { + return std::nullopt; + } + return glm::dvec2(Value[0].GetDouble(), Value[1].GetDouble()); +} + +std::optional ParseVec3(const rapidjson::Value &Value) { + if (!Value.IsArray() || Value.Size() != 3 || !Value[0].IsNumber() || + !Value[1].IsNumber() || !Value[2].IsNumber()) { + return std::nullopt; + } + return glm::vec3(Value[0].GetFloat(), Value[1].GetFloat(), + Value[2].GetFloat()); +} + +std::optional ParseVec4(const rapidjson::Value &Value) { + if (!Value.IsArray() || Value.Size() != 4 || !Value[0].IsNumber() || + !Value[1].IsNumber() || !Value[2].IsNumber() || !Value[3].IsNumber()) { + return std::nullopt; + } + return glm::vec4(Value[0].GetFloat(), Value[1].GetFloat(), + Value[2].GetFloat(), Value[3].GetFloat()); +} + +const rapidjson::Value *FindMemberValue(const rapidjson::Value &Object, + const char *Name) { + if (!Object.IsObject()) { + return nullptr; + } + const auto It = Object.FindMember(Name); + if (It == Object.MemberEnd()) { + return nullptr; + } + return &It->value; +} + +std::optional GetStringView(const rapidjson::Value &Object, + const char *Name) { + const rapidjson::Value *Value = FindMemberValue(Object, Name); + if (Value == nullptr || !Value->IsString()) { + return std::nullopt; + } + return std::string_view(Value->GetString(), Value->GetStringLength()); +} + +std::optional GetBoolValue(const rapidjson::Value &Object, + const char *Name) { + const rapidjson::Value *Value = FindMemberValue(Object, Name); + if (Value == nullptr || !Value->IsBool()) { + return std::nullopt; + } + return Value->GetBool(); } -std::optional MatchVec2(std::string_view Text, - const std::regex &Pattern) { - std::match_results Match; - if (!std::regex_search(Text.begin(), Text.end(), Match, Pattern) || - Match.size() < 3) { +std::optional GetFloatValue(const rapidjson::Value &Object, + const char *Name) { + const rapidjson::Value *Value = FindMemberValue(Object, Name); + if (Value == nullptr || !Value->IsNumber()) { return std::nullopt; } - const auto X = ParseDouble(MatchView(Match, 1)); - const auto Y = ParseDouble(MatchView(Match, 2)); - if (!X.has_value() || !Y.has_value()) { + return Value->GetFloat(); +} + +std::optional GetVec2Value(const rapidjson::Value &Object, + const char *Name) { + const rapidjson::Value *Value = FindMemberValue(Object, Name); + if (Value == nullptr) { return std::nullopt; } - return glm::dvec2(*X, *Y); + return ParseVec2(*Value); } -std::optional MatchVec3(std::string_view Text, - const std::regex &Pattern) { - std::match_results Match; - if (!std::regex_search(Text.begin(), Text.end(), Match, Pattern) || - Match.size() < 4) { +std::optional GetVec3Value(const rapidjson::Value &Object, + const char *Name) { + const rapidjson::Value *Value = FindMemberValue(Object, Name); + if (Value == nullptr) { return std::nullopt; } - const auto X = ParseDouble(MatchView(Match, 1)); - const auto Y = ParseDouble(MatchView(Match, 2)); - const auto Z = ParseDouble(MatchView(Match, 3)); - if (!X.has_value() || !Y.has_value() || !Z.has_value()) { + return ParseVec3(*Value); +} + +std::optional GetVec4Value(const rapidjson::Value &Object, + const char *Name) { + const rapidjson::Value *Value = FindMemberValue(Object, Name); + if (Value == nullptr) { return std::nullopt; } - return glm::vec3(static_cast(*X), static_cast(*Y), - static_cast(*Z)); + return ParseVec4(*Value); +} + +void WriteVec2(JsonWriter &Writer, const glm::dvec2 &Value) { + Writer.StartArray(); + WriteNumber(Writer, Value.x); + WriteNumber(Writer, Value.y); + Writer.EndArray(); +} + +void WriteVec3(JsonWriter &Writer, const glm::vec3 &Value) { + Writer.StartArray(); + WriteNumber(Writer, Value.x); + WriteNumber(Writer, Value.y); + WriteNumber(Writer, Value.z); + Writer.EndArray(); +} + +void WriteVec4(JsonWriter &Writer, const glm::vec4 &Value) { + Writer.StartArray(); + WriteNumber(Writer, Value.r); + WriteNumber(Writer, Value.g); + WriteNumber(Writer, Value.b); + WriteNumber(Writer, Value.a); + Writer.EndArray(); +} + +void WriteOptionalUint64(JsonWriter &Writer, std::optional Value) { + if (Value.has_value()) { + Writer.Uint64(*Value); + } else { + Writer.Null(); + } } std::string EventPayloadType(const EditorEventPayload &Payload) { @@ -324,152 +402,215 @@ std::vector BuildParticipants(const EditorSessionState &State return Participants; } -void SerializeSceneItem(std::ostringstream &Stream, const EditorSceneItem &Item) { - Stream << "{\"id\":\"" << EscapeJson(Item.Id) << "\",\"displayName\":\"" - << EscapeJson(Item.DisplayName) << "\",\"kind\":\"" - << SceneItemKindToString(Item.Kind) << "\",\"visible\":" - << (Item.Visible ? "true" : "false") << ",\"children\":["; - for (size_t Index = 0; Index < Item.Children.size(); ++Index) { - if (Index != 0) { - Stream << ","; - } - SerializeSceneItem(Stream, Item.Children[Index]); - } - Stream << "]}"; +void WriteSceneItem(JsonWriter &Writer, const EditorSceneItem &Item) { + Writer.StartObject(); + Writer.Key("id"); + WriteString(Writer, Item.Id); + Writer.Key("displayName"); + WriteString(Writer, Item.DisplayName); + Writer.Key("kind"); + WriteString(Writer, SceneItemKindToString(Item.Kind)); + Writer.Key("visible"); + Writer.Bool(Item.Visible); + Writer.Key("children"); + Writer.StartArray(); + for (const auto &Child : Item.Children) { + WriteSceneItem(Writer, Child); + } + Writer.EndArray(); + Writer.EndObject(); } -void SerializeObjectDetails(std::ostringstream &Stream, - const EditorSessionState &State, - const EditorObjectDetails &Details) { - Stream << "{\"objectId\":\"" << EscapeJson(Details.ObjectId) - << "\",\"displayName\":\"" << EscapeJson(Details.DisplayName) - << "\",\"kind\":\"" << SceneItemKindToString(Details.Kind) - << "\",\"visible\":" << (Details.Visible ? "true" : "false") - << ",\"isGeneratedAssetChild\":" - << (Details.IsGeneratedAssetChild ? "true" : "false"); +void WriteObjectDetails(JsonWriter &Writer, const EditorSessionState &State, + const EditorObjectDetails &Details) { + Writer.StartObject(); + Writer.Key("objectId"); + WriteString(Writer, Details.ObjectId); + Writer.Key("displayName"); + WriteString(Writer, Details.DisplayName); + Writer.Key("kind"); + WriteString(Writer, SceneItemKindToString(Details.Kind)); + Writer.Key("visible"); + Writer.Bool(Details.Visible); + Writer.Key("isGeneratedAssetChild"); + Writer.Bool(Details.IsGeneratedAssetChild); + Writer.Key("generatedFromAssetRootId"); if (Details.GeneratedFromAssetRootId.has_value()) { - Stream << ",\"generatedFromAssetRootId\":\"" - << EscapeJson(*Details.GeneratedFromAssetRootId) << "\""; + WriteString(Writer, *Details.GeneratedFromAssetRootId); } else { - Stream << ",\"generatedFromAssetRootId\":null"; - } - Stream - << ",\"capabilities\":{\"supportsTransform\":" - << (Details.SupportsTransform ? "true" : "false") - << ",\"transformReadOnly\":" - << (Details.TransformReadOnly ? "true" : "false") << "},\"transform\":"; - // Serialize WorldTransform (world-space) so the frontend works in world space. - // Fall back to Transform for objects that predate world-transform computation. - const auto &T = Details.WorldTransform.has_value() ? Details.WorldTransform - : Details.Transform; - if (T.has_value()) { - Stream << "{\"location\":[" << T->Location.x << "," - << T->Location.y << "," << T->Location.z - << "],\"rotationDegrees\":[" << T->RotationDegrees.x - << "," << T->RotationDegrees.y << "," - << T->RotationDegrees.z << "],\"scale\":[" - << T->Scale.x << "," << T->Scale.y - << "," << T->Scale.z << "]}"; + Writer.Null(); + } + + Writer.Key("capabilities"); + Writer.StartObject(); + Writer.Key("supportsTransform"); + Writer.Bool(Details.SupportsTransform); + Writer.Key("transformReadOnly"); + Writer.Bool(Details.TransformReadOnly); + Writer.EndObject(); + + Writer.Key("transform"); + const auto &Transform = + Details.WorldTransform.has_value() ? Details.WorldTransform + : Details.Transform; + if (Transform.has_value()) { + Writer.StartObject(); + Writer.Key("location"); + WriteVec3(Writer, Transform->Location); + Writer.Key("rotationDegrees"); + WriteVec3(Writer, Transform->RotationDegrees); + Writer.Key("scale"); + WriteVec3(Writer, Transform->Scale); + Writer.EndObject(); } else { - Stream << "null"; + Writer.Null(); } + + Writer.Key("light"); if (Details.Light.has_value()) { - Stream << ",\"light\":{\"color\":[" << Details.Light->Color.r << "," - << Details.Light->Color.g << "," << Details.Light->Color.b - << "],\"intensity\":" << Details.Light->Intensity << "}"; + Writer.StartObject(); + Writer.Key("color"); + WriteVec3(Writer, Details.Light->Color); + Writer.Key("intensity"); + WriteNumber(Writer, Details.Light->Intensity); + Writer.EndObject(); } else { - Stream << ",\"light\":null"; + Writer.Null(); } + + Writer.Key("material"); if (Details.Material.has_value()) { - Stream << ",\"material\":{\"baseColorFactor\":[" - << Details.Material->BaseColorFactor.r << "," - << Details.Material->BaseColorFactor.g << "," - << Details.Material->BaseColorFactor.b << "," - << Details.Material->BaseColorFactor.a - << "],\"metallic\":" << Details.Material->Metallic - << ",\"roughness\":" << Details.Material->Roughness; + Writer.StartObject(); + Writer.Key("baseColorFactor"); + WriteVec4(Writer, Details.Material->BaseColorFactor); + Writer.Key("metallic"); + WriteNumber(Writer, Details.Material->Metallic); + Writer.Key("roughness"); + WriteNumber(Writer, Details.Material->Roughness); + Writer.Key("textureAssetPath"); if (Details.Material->TextureAssetPath.has_value()) { - Stream << ",\"textureAssetPath\":\"" - << EscapeJson(*Details.Material->TextureAssetPath) << "\""; + WriteString(Writer, *Details.Material->TextureAssetPath); } else { - Stream << ",\"textureAssetPath\":null"; + Writer.Null(); } - Stream << "}"; + Writer.EndObject(); } else { - Stream << ",\"material\":null"; + Writer.Null(); } + + Writer.Key("physics"); if (Details.Physics.has_value()) { - Stream << ",\"physics\":{\"bodyType\":\"" - << PhysicsBodyTypeToString(Details.Physics->BodyType) - << "\",\"colliderType\":\"" - << PhysicsColliderTypeToString(Details.Physics->ColliderType) - << "\",\"boxHalfExtents\":[" - << Details.Physics->BoxHalfExtents.x << "," - << Details.Physics->BoxHalfExtents.y << "," - << Details.Physics->BoxHalfExtents.z - << "],\"sphereRadius\":" << Details.Physics->SphereRadius - << ",\"mass\":" << Details.Physics->Mass - << ",\"friction\":" << Details.Physics->Friction - << ",\"restitution\":" << Details.Physics->Restitution << "}"; + Writer.StartObject(); + Writer.Key("bodyType"); + WriteString(Writer, PhysicsBodyTypeToString(Details.Physics->BodyType)); + Writer.Key("colliderType"); + WriteString(Writer, + PhysicsColliderTypeToString(Details.Physics->ColliderType)); + Writer.Key("boxHalfExtents"); + WriteVec3(Writer, Details.Physics->BoxHalfExtents); + Writer.Key("sphereRadius"); + WriteNumber(Writer, Details.Physics->SphereRadius); + Writer.Key("mass"); + WriteNumber(Writer, Details.Physics->Mass); + Writer.Key("friction"); + WriteNumber(Writer, Details.Physics->Friction); + Writer.Key("restitution"); + WriteNumber(Writer, Details.Physics->Restitution); + Writer.EndObject(); } else { - Stream << ",\"physics\":null"; + Writer.Null(); } - Stream << ",\"collaboration\":{\"selectedByUserIds\":["; - bool FirstSelectionOwner = true; + + Writer.Key("collaboration"); + Writer.StartObject(); + Writer.Key("selectedByUserIds"); + Writer.StartArray(); for (const auto &Participant : BuildParticipants(State, SessionUserId{0})) { if (!Participant.SelectedObjectId.has_value() || *Participant.SelectedObjectId != Details.ObjectId) { continue; } - if (!FirstSelectionOwner) { - Stream << ","; - } - FirstSelectionOwner = false; - Stream << Participant.User.Value; + Writer.Uint64(Participant.User.Value); } - Stream << "],\"lockState\":\""; + Writer.EndArray(); + Writer.Key("lockState"); const auto CollaborationIt = State.Scene.CollaborationByObjectId.find(Details.ObjectId); if (CollaborationIt != State.Scene.CollaborationByObjectId.end()) { - Stream << LockStateToString(CollaborationIt->second.LockState) - << "\",\"lockOwnerUserId\":"; + WriteString(Writer, + LockStateToString(CollaborationIt->second.LockState)); + Writer.Key("lockOwnerUserId"); if (CollaborationIt->second.LockOwner.has_value()) { - Stream << CollaborationIt->second.LockOwner->Value; + Writer.Uint64(CollaborationIt->second.LockOwner->Value); } else { - Stream << "null"; + Writer.Null(); } } else { - Stream << "unlocked\",\"lockOwnerUserId\":null"; + WriteString(Writer, "unlocked"); + Writer.Key("lockOwnerUserId"); + Writer.Null(); } - Stream << "}}"; + Writer.EndObject(); + + Writer.EndObject(); } -void SerializeParticipant(std::ostringstream &Stream, - const EditorParticipant &Participant) { - Stream << "{\"userId\":" << Participant.User.Value << ",\"displayName\":\"" - << EscapeJson(Participant.DisplayName) << "\",\"presenceState\":\"" - << PresenceStateToString(Participant.State) << "\",\"isLocal\":" - << (Participant.IsLocal ? "true" : "false") - << ",\"currentTool\":\"" << EscapeJson(Participant.CurrentTool) - << "\",\"presentationColor\":\"" - << EscapeJson(Participant.PresentationColor) - << "\",\"selectionObjectId\":"; + +void WriteParticipant(JsonWriter &Writer, const EditorParticipant &Participant) { + Writer.StartObject(); + Writer.Key("userId"); + Writer.Uint64(Participant.User.Value); + Writer.Key("displayName"); + WriteString(Writer, Participant.DisplayName); + Writer.Key("presenceState"); + WriteString(Writer, PresenceStateToString(Participant.State)); + Writer.Key("isLocal"); + Writer.Bool(Participant.IsLocal); + Writer.Key("currentTool"); + WriteString(Writer, Participant.CurrentTool); + Writer.Key("presentationColor"); + WriteString(Writer, Participant.PresentationColor); + Writer.Key("selectionObjectId"); if (Participant.SelectedObjectId.has_value()) { - Stream << "\"" << EscapeJson(*Participant.SelectedObjectId) << "\""; + WriteString(Writer, *Participant.SelectedObjectId); } else { - Stream << "null"; + Writer.Null(); } - Stream << ",\"camera\":"; + Writer.Key("camera"); if (Participant.Camera.has_value()) { - Stream << "{\"position\":[" << Participant.Camera->Position.x << "," - << Participant.Camera->Position.y << "," - << Participant.Camera->Position.z << "],\"yawDegrees\":" - << Participant.Camera->YawDegrees << ",\"pitchDegrees\":" - << Participant.Camera->PitchDegrees << "}"; + Writer.StartObject(); + Writer.Key("position"); + WriteVec3(Writer, Participant.Camera->Position); + Writer.Key("yawDegrees"); + WriteNumber(Writer, Participant.Camera->YawDegrees); + Writer.Key("pitchDegrees"); + WriteNumber(Writer, Participant.Camera->PitchDegrees); + Writer.EndObject(); } else { - Stream << "null"; + Writer.Null(); } - Stream << "}"; + Writer.EndObject(); } + +std::optional +ParseJson(std::string_view JsonLine, std::string &MutableJson, std::string &Error) { + MutableJson.assign(JsonLine.begin(), JsonLine.end()); + rapidjson::Document Document; + Document.ParseInsitu(MutableJson.data()); + if (Document.HasParseError() || !Document.IsObject()) { + Error = "Command is not valid JSON."; + return std::nullopt; + } + return Document; +} + +template +HeadlessCommand WrapCommand(HeadlessCommandType Type, TCommand Payload) { + return HeadlessCommand{ + .Type = Type, + .EditorPayload = {.Payload = std::move(Payload)}, + }; +} + } // namespace std::optional ParseHeadlessOptions(int argc, char **argv, @@ -509,30 +650,14 @@ std::optional ParseHeadlessOptions(int argc, char **argv, std::optional ParseHeadlessCommand(std::string_view JsonLine, std::string &Error) { - static const std::regex TypePattern(R"json("type"\s*:\s*"([^"]+)")json"); - static const std::regex ViewModePattern(R"json("viewMode"\s*:\s*"([^"]+)")json"); - static const std::regex ShowCollidersPattern( - R"json("showColliders"\s*:\s*(true|false))json"); - static const std::regex BoolPattern( - R"json("isLooking"\s*:\s*(true|false))json"); - static const std::regex CursorPattern( - R"json("cursorPosition"\s*:\s*\[\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*\])json"); - static const std::regex MovementPattern( - R"json("worldMovement"\s*:\s*\[\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*\])json"); - static const std::regex PositionPattern( - R"json("position"\s*:\s*\[\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*\])json"); - static const std::regex YawPattern( - R"json("yawDegrees"\s*:\s*([-+0-9.eE]+))json"); - static const std::regex PitchPattern( - R"json("pitchDegrees"\s*:\s*([-+0-9.eE]+))json"); - static const std::regex MouseXPattern( - R"json("mouseX"\s*:\s*([-+0-9.eE]+))json"); - static const std::regex MouseYPattern( - R"json("mouseY"\s*:\s*([-+0-9.eE]+))json"); - static const std::regex ProjectionTypePattern( - R"json("projectionType"\s*:\s*"([^"]+)")json"); - - const auto Type = MatchString(JsonLine, TypePattern); + std::string MutableJson; + auto ParsedDocument = ParseJson(JsonLine, MutableJson, Error); + if (!ParsedDocument.has_value()) { + return std::nullopt; + } + rapidjson::Document &Document = *ParsedDocument; + + const auto Type = GetStringView(Document, "type"); if (!Type.has_value()) { Error = "Command is missing a string `type` field."; return std::nullopt; @@ -549,7 +674,7 @@ std::optional ParseHeadlessCommand(std::string_view JsonLine, .EditorPayload = {}}; } if (*Type == "set_view_mode") { - const auto ViewMode = MatchString(JsonLine, ViewModePattern); + const auto ViewMode = GetStringView(Document, "viewMode"); if (!ViewMode.has_value()) { Error = "`set_view_mode` requires `viewMode`."; return std::nullopt; @@ -563,7 +688,7 @@ std::optional ParseHeadlessCommand(std::string_view JsonLine, } else if (*ViewMode == "wireframe") { ParsedMode = RendererViewMode::Wireframe; } else { - Error = "Unsupported view mode: " + *ViewMode; + Error = "Unsupported view mode: " + std::string(*ViewMode); return std::nullopt; } @@ -572,29 +697,31 @@ std::optional ParseHeadlessCommand(std::string_view JsonLine, .ViewMode = ParsedMode}; } if (*Type == "set_camera_projection") { - const auto ProjType = MatchString(JsonLine, ProjectionTypePattern); - if (!ProjType.has_value()) { + const auto ProjectionType = GetStringView(Document, "projectionType"); + if (!ProjectionType.has_value()) { Error = "`set_camera_projection` requires `projectionType`."; return std::nullopt; } CameraProjectionType Parsed{}; - if (*ProjType == "perspective") { + if (*ProjectionType == "perspective") { Parsed = CameraProjectionType::Perspective; - } else if (*ProjType == "orthographic") { + } else if (*ProjectionType == "orthographic") { Parsed = CameraProjectionType::Orthographic; } else { - Error = "Unsupported projectionType: " + *ProjType; + Error = "Unsupported projectionType: " + std::string(*ProjectionType); return std::nullopt; } return HeadlessCommand{ .Type = HeadlessCommandType::SetCameraProjection, - .EditorPayload = {SetCameraProjectionCommand{.ProjectionType = Parsed}}, - .ProjectionType = Parsed}; + .EditorPayload = {.Payload = SetCameraProjectionCommand{ + .ProjectionType = Parsed}}, + .ProjectionType = Parsed, + }; } if (*Type == "set_show_colliders") { - const auto ShowColliders = MatchString(JsonLine, ShowCollidersPattern); + const auto ShowColliders = GetBoolValue(Document, "showColliders"); if (!ShowColliders.has_value()) { Error = "`set_show_colliders` requires `showColliders`."; return std::nullopt; @@ -602,343 +729,226 @@ std::optional ParseHeadlessCommand(std::string_view JsonLine, return HeadlessCommand{.Type = HeadlessCommandType::SetShowColliders, .EditorPayload = {}, - .ShowColliders = *ShowColliders == "true"}; + .ShowColliders = *ShowColliders}; } if (*Type == "quit") { return HeadlessCommand{.Type = HeadlessCommandType::Quit, .EditorPayload = {}}; } if (*Type == "play_session") { - return HeadlessCommand{ - .Type = HeadlessCommandType::PlaySession, - .EditorPayload = {.Payload = PlaySessionCommand{}}, - }; + return WrapCommand(HeadlessCommandType::PlaySession, PlaySessionCommand{}); } if (*Type == "pause_session") { - return HeadlessCommand{ - .Type = HeadlessCommandType::PauseSession, - .EditorPayload = {.Payload = PauseSessionCommand{}}, - }; + return WrapCommand(HeadlessCommandType::PauseSession, PauseSessionCommand{}); } if (*Type == "resume_session") { - return HeadlessCommand{ - .Type = HeadlessCommandType::ResumeSession, - .EditorPayload = {.Payload = ResumeSessionCommand{}}, - }; + return WrapCommand(HeadlessCommandType::ResumeSession, ResumeSessionCommand{}); } if (*Type == "stop_session") { - return HeadlessCommand{ - .Type = HeadlessCommandType::StopSession, - .EditorPayload = {.Payload = StopSessionCommand{}}, - }; + return WrapCommand(HeadlessCommandType::StopSession, StopSessionCommand{}); } if (*Type == "set_look_active") { - const auto BoolValue = MatchString(JsonLine, BoolPattern); - if (!BoolValue.has_value()) { + const auto IsLooking = GetBoolValue(Document, "isLooking"); + if (!IsLooking.has_value()) { Error = "`set_look_active` requires `isLooking`."; return std::nullopt; } - const auto Cursor = MatchVec2(JsonLine, CursorPattern); return HeadlessCommand{ .Type = HeadlessCommandType::SetLookActive, .EditorPayload = {.Payload = SetLookActiveCommand{ - .IsLooking = *BoolValue == "true", - .CursorPosition = Cursor, + .IsLooking = *IsLooking, + .CursorPosition = GetVec2Value(Document, "cursorPosition"), }}, }; } if (*Type == "set_viewport_camera_pose") { - const auto Position = MatchVec3(JsonLine, PositionPattern); - const auto Yaw = MatchString(JsonLine, YawPattern); - const auto Pitch = MatchString(JsonLine, PitchPattern); - if (!Position.has_value() || !Yaw.has_value() || !Pitch.has_value()) { + const auto Position = GetVec3Value(Document, "position"); + const auto YawDegrees = GetFloatValue(Document, "yawDegrees"); + const auto PitchDegrees = GetFloatValue(Document, "pitchDegrees"); + if (!Position.has_value() || !YawDegrees.has_value() || + !PitchDegrees.has_value()) { Error = "`set_viewport_camera_pose` requires `position`, `yawDegrees`, and `pitchDegrees`."; return std::nullopt; } - const auto ParsedYaw = ParseDouble(*Yaw); - const auto ParsedPitch = ParseDouble(*Pitch); - if (!ParsedYaw.has_value() || !ParsedPitch.has_value()) { - Error = "`set_viewport_camera_pose` requires numeric `yawDegrees` and `pitchDegrees`."; - return std::nullopt; - } return HeadlessCommand{ .Type = HeadlessCommandType::SetViewportCameraPose, .EditorPayload = {.Payload = SetViewportCameraPoseCommand{ .Position = *Position, - .YawDegrees = static_cast(*ParsedYaw), - .PitchDegrees = static_cast(*ParsedPitch), + .YawDegrees = *YawDegrees, + .PitchDegrees = *PitchDegrees, }}, }; } if (*Type == "select_object") { - static const std::regex ObjectIdPattern( - R"json("objectId"\s*:\s*"((?:\\.|[^"])*)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); + const auto ObjectId = GetStringView(Document, "objectId"); if (!ObjectId.has_value()) { Error = "`select_object` requires `objectId`."; return std::nullopt; } - return HeadlessCommand{ - .Type = HeadlessCommandType::SelectObject, - .EditorPayload = - {.Payload = SelectObjectCommand{.ObjectId = UnescapeJsonString(*ObjectId)}}, - }; + return WrapCommand(HeadlessCommandType::SelectObject, + SelectObjectCommand{.ObjectId = std::string(*ObjectId)}); } if (*Type == "rename_object") { - static const std::regex ObjectIdPattern( - R"json("objectId"\s*:\s*"((?:\\.|[^"])*)")json"); - static const std::regex DisplayNamePattern( - R"json("displayName"\s*:\s*"((?:\\.|[^"])*)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto DisplayName = MatchString(JsonLine, DisplayNamePattern); + const auto ObjectId = GetStringView(Document, "objectId"); + const auto DisplayName = GetStringView(Document, "displayName"); if (!ObjectId.has_value() || !DisplayName.has_value()) { Error = "`rename_object` requires `objectId` and `displayName`."; return std::nullopt; } - return HeadlessCommand{ - .Type = HeadlessCommandType::RenameObject, - .EditorPayload = - {.Payload = RenameObjectCommand{ - .ObjectId = UnescapeJsonString(*ObjectId), - .DisplayName = UnescapeJsonString(*DisplayName), - }}, - }; + return WrapCommand( + HeadlessCommandType::RenameObject, + RenameObjectCommand{.ObjectId = std::string(*ObjectId), + .DisplayName = std::string(*DisplayName)}); } if (*Type == "set_object_visibility") { - static const std::regex ObjectIdPattern( - R"json("objectId"\s*:\s*"((?:\\.|[^"])*)")json"); - static const std::regex VisiblePattern( - R"json("visible"\s*:\s*(true|false))json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto Visible = MatchString(JsonLine, VisiblePattern); + const auto ObjectId = GetStringView(Document, "objectId"); + const auto Visible = GetBoolValue(Document, "visible"); if (!ObjectId.has_value() || !Visible.has_value()) { Error = "`set_object_visibility` requires `objectId` and `visible`."; return std::nullopt; } - return HeadlessCommand{ - .Type = HeadlessCommandType::SetObjectVisibility, - .EditorPayload = - {.Payload = SetObjectVisibilityCommand{ - .ObjectId = UnescapeJsonString(*ObjectId), - .Visible = *Visible == "true", - }}, - }; + return WrapCommand( + HeadlessCommandType::SetObjectVisibility, + SetObjectVisibilityCommand{.ObjectId = std::string(*ObjectId), + .Visible = *Visible}); } if (*Type == "set_transform") { - static const std::regex ObjectIdPattern( - R"json("objectId"\s*:\s*"((?:\\.|[^"])*)")json"); - static const std::regex LocationPattern( - R"json("location"\s*:\s*\[\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*\])json"); - static const std::regex RotationPattern( - R"json("rotationDegrees"\s*:\s*\[\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*\])json"); - static const std::regex ScalePattern( - R"json("scale"\s*:\s*\[\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*,\s*([-+0-9.eE]+)\s*\])json"); - - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto Location = MatchVec3(JsonLine, LocationPattern); - const auto Rotation = MatchVec3(JsonLine, RotationPattern); - const auto Scale = MatchVec3(JsonLine, ScalePattern); - if (!ObjectId.has_value() || !Location.has_value() || !Rotation.has_value() || - !Scale.has_value()) { + const auto ObjectId = GetStringView(Document, "objectId"); + const auto Location = GetVec3Value(Document, "location"); + const auto RotationDegrees = GetVec3Value(Document, "rotationDegrees"); + const auto Scale = GetVec3Value(Document, "scale"); + if (!ObjectId.has_value() || !Location.has_value() || + !RotationDegrees.has_value() || !Scale.has_value()) { Error = "`set_transform` requires `objectId`, `location`, `rotationDegrees`, and `scale`."; return std::nullopt; } - return HeadlessCommand{ - .Type = HeadlessCommandType::SetTransform, - .EditorPayload = - {.Payload = SetTransformCommand{ - .ObjectId = UnescapeJsonString(*ObjectId), - .Location = *Location, - .RotationDegrees = *Rotation, - .Scale = *Scale, - }}, - }; + return WrapCommand( + HeadlessCommandType::SetTransform, + SetTransformCommand{.ObjectId = std::string(*ObjectId), + .Location = *Location, + .RotationDegrees = *RotationDegrees, + .Scale = *Scale}); } if (*Type == "create_object") { - static const std::regex TemplateIdPattern( - R"json("templateId"\s*:\s*"((?:\\.|[^"])*)")json"); - const auto TemplateId = MatchString(JsonLine, TemplateIdPattern); + const auto TemplateId = GetStringView(Document, "templateId"); if (!TemplateId.has_value()) { Error = "`create_object` requires `templateId`."; return std::nullopt; } - return HeadlessCommand{ - .Type = HeadlessCommandType::CreateObject, - .EditorPayload = - {.Payload = CreateObjectCommand{ - .TemplateId = UnescapeJsonString(*TemplateId), - }}, - }; + return WrapCommand(HeadlessCommandType::CreateObject, + CreateObjectCommand{.TemplateId = + std::string(*TemplateId)}); } if (*Type == "duplicate_object") { - static const std::regex ObjectIdPattern( - R"json("objectId"\s*:\s*"((?:\\.|[^"])*)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); + const auto ObjectId = GetStringView(Document, "objectId"); if (!ObjectId.has_value()) { Error = "`duplicate_object` requires `objectId`."; return std::nullopt; } - return HeadlessCommand{ - .Type = HeadlessCommandType::DuplicateObject, - .EditorPayload = - {.Payload = DuplicateObjectCommand{ - .ObjectId = UnescapeJsonString(*ObjectId), - }}, - }; + return WrapCommand(HeadlessCommandType::DuplicateObject, + DuplicateObjectCommand{.ObjectId = + std::string(*ObjectId)}); } if (*Type == "delete_object") { - static const std::regex ObjectIdPattern( - R"json("objectId"\s*:\s*"((?:\\.|[^"])*)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); + const auto ObjectId = GetStringView(Document, "objectId"); if (!ObjectId.has_value()) { Error = "`delete_object` requires `objectId`."; return std::nullopt; } - return HeadlessCommand{ - .Type = HeadlessCommandType::DeleteObject, - .EditorPayload = - {.Payload = DeleteObjectCommand{ - .ObjectId = UnescapeJsonString(*ObjectId), - }}, - }; + return WrapCommand(HeadlessCommandType::DeleteObject, + DeleteObjectCommand{.ObjectId = std::string(*ObjectId)}); } if (*Type == "reparent_object") { - static const std::regex ObjectIdPattern( - R"json("objectId"\s*:\s*"((?:\\.|[^"])*)")json"); - static const std::regex NewParentIdPattern( - R"json("newParentId"\s*:\s*"((?:\\.|[^"])*)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto NewParentId = MatchString(JsonLine, NewParentIdPattern); + const auto ObjectId = GetStringView(Document, "objectId"); + const auto NewParentId = GetStringView(Document, "newParentId"); if (!ObjectId.has_value() || !NewParentId.has_value()) { Error = "`reparent_object` requires `objectId` and `newParentId`."; return std::nullopt; } - return HeadlessCommand{ - .Type = HeadlessCommandType::ReparentObject, - .EditorPayload = - {.Payload = ReparentObjectCommand{ - .ObjectId = UnescapeJsonString(*ObjectId), - .NewParentId = UnescapeJsonString(*NewParentId), - }}, - }; + return WrapCommand( + HeadlessCommandType::ReparentObject, + ReparentObjectCommand{.ObjectId = std::string(*ObjectId), + .NewParentId = std::string(*NewParentId)}); } if (*Type == "update_viewport_camera") { - const auto Movement = MatchVec3(JsonLine, MovementPattern); - if (!Movement.has_value()) { + const auto WorldMovement = GetVec3Value(Document, "worldMovement"); + if (!WorldMovement.has_value()) { Error = "`update_viewport_camera` requires `worldMovement`."; return std::nullopt; } - const auto Cursor = MatchVec2(JsonLine, CursorPattern); return HeadlessCommand{ .Type = HeadlessCommandType::UpdateViewportCamera, .EditorPayload = {.Payload = UpdateViewportCameraCommand{ - .WorldMovement = *Movement, - .CursorPosition = Cursor, + .WorldMovement = *WorldMovement, + .CursorPosition = GetVec2Value(Document, "cursorPosition"), }}, }; } - if (*Type == "gizmo_hover") { - const auto MX = MatchString(JsonLine, MouseXPattern); - const auto MY = MatchString(JsonLine, MouseYPattern); - float MouseX = 0.0f; - float MouseY = 0.0f; - if (MX.has_value()) { - if (const auto V = ParseDouble(*MX)) { - MouseX = static_cast(*V); - } + auto ParseMousePosition = [&](float DefaultX, float DefaultY) { + glm::vec2 MousePosition(DefaultX, DefaultY); + if (const auto MouseX = GetFloatValue(Document, "mouseX"); + MouseX.has_value()) { + MousePosition.x = *MouseX; } - if (MY.has_value()) { - if (const auto V = ParseDouble(*MY)) { - MouseY = static_cast(*V); - } + if (const auto MouseY = GetFloatValue(Document, "mouseY"); + MouseY.has_value()) { + MousePosition.y = *MouseY; } + return MousePosition; + }; + + if (*Type == "gizmo_hover") { return HeadlessCommand{ .Type = HeadlessCommandType::GizmoHover, - .MousePosition = {MouseX, MouseY}, + .MousePosition = ParseMousePosition(0.0f, 0.0f), + }; + } + if (*Type == "gizmo_drag_start") { + return HeadlessCommand{ + .Type = HeadlessCommandType::GizmoDragStart, + .MousePosition = ParseMousePosition(0.0f, 0.0f), + }; + } + if (*Type == "gizmo_drag_update") { + return HeadlessCommand{ + .Type = HeadlessCommandType::GizmoDragUpdate, + .MousePosition = ParseMousePosition(0.0f, 0.0f), + }; + } + if (*Type == "gizmo_drag_end") { + return HeadlessCommand{ + .Type = HeadlessCommandType::GizmoDragEnd, + .MousePosition = ParseMousePosition(0.0f, 0.0f), }; } - - auto ParseMouseXY = [&](HeadlessCommandType T) -> HeadlessCommand { - const auto MX = MatchString(JsonLine, MouseXPattern); - const auto MY = MatchString(JsonLine, MouseYPattern); - float MouseX = 0.0f; - float MouseY = 0.0f; - if (MX.has_value()) { - if (const auto V = ParseDouble(*MX)) MouseX = static_cast(*V); - } - if (MY.has_value()) { - if (const auto V = ParseDouble(*MY)) MouseY = static_cast(*V); - } - return HeadlessCommand{.Type = T, .MousePosition = {MouseX, MouseY}}; - }; - - if (*Type == "gizmo_drag_start") return ParseMouseXY(HeadlessCommandType::GizmoDragStart); - if (*Type == "gizmo_drag_update") return ParseMouseXY(HeadlessCommandType::GizmoDragUpdate); - if (*Type == "gizmo_drag_end") return ParseMouseXY(HeadlessCommandType::GizmoDragEnd); if (*Type == "drop_mesh") { - static const std::regex AssetPathPattern(R"json("assetPath"\s*:\s*"([^"]+)")json"); - const auto AssetPath = MatchString(JsonLine, AssetPathPattern); - const auto MX = MatchString(JsonLine, MouseXPattern); - const auto MY = MatchString(JsonLine, MouseYPattern); - float MouseX = 0.0f; - float MouseY = 0.0f; - if (MX.has_value()) { - if (const auto V = ParseDouble(*MX)) MouseX = static_cast(*V); - } - if (MY.has_value()) { - if (const auto V = ParseDouble(*MY)) MouseY = static_cast(*V); - } - HeadlessCommand Cmd; - Cmd.Type = HeadlessCommandType::DropMesh; - Cmd.MeshAssetPath = AssetPath.value_or(""); - Cmd.MousePosition = {MouseX, MouseY}; - return Cmd; + HeadlessCommand Command; + Command.Type = HeadlessCommandType::DropMesh; + Command.MeshAssetPath = + std::string(GetStringView(Document, "assetPath").value_or("")); + Command.MousePosition = ParseMousePosition(0.0f, 0.0f); + return Command; } if (*Type == "drop_texture") { - static const std::regex TexturePathPattern(R"json("textureAssetPath"\s*:\s*"([^"]*)")json"); - const auto TexturePath = MatchString(JsonLine, TexturePathPattern); - const auto MX = MatchString(JsonLine, MouseXPattern); - const auto MY = MatchString(JsonLine, MouseYPattern); - float MouseX = 0.0f; - float MouseY = 0.0f; - if (MX.has_value()) { - if (const auto V = ParseDouble(*MX)) MouseX = static_cast(*V); - } - if (MY.has_value()) { - if (const auto V = ParseDouble(*MY)) MouseY = static_cast(*V); - } - HeadlessCommand Cmd; - Cmd.Type = HeadlessCommandType::DropTexture; - Cmd.TextureAssetPath = TexturePath.value_or(""); - Cmd.MousePosition = {MouseX, MouseY}; - return Cmd; + HeadlessCommand Command; + Command.Type = HeadlessCommandType::DropTexture; + Command.TextureAssetPath = + std::string(GetStringView(Document, "textureAssetPath").value_or("")); + Command.MousePosition = ParseMousePosition(0.0f, 0.0f); + return Command; } if (*Type == "place_actor") { - static const std::regex TemplateIdPattern( - R"json("templateId"\s*:\s*"((?:\\.|[^"])*)")json"); - static const std::regex MeshAssetPathPattern( - R"json("meshAssetPath"\s*:\s*"((?:\\.|[^"])*)")json"); - const auto TemplateId = MatchString(JsonLine, TemplateIdPattern); - const auto MeshAssetPath = MatchString(JsonLine, MeshAssetPathPattern); - const auto MX = MatchString(JsonLine, MouseXPattern); - const auto MY = MatchString(JsonLine, MouseYPattern); - float MouseX = -1.0f; - float MouseY = -1.0f; - if (MX.has_value()) { - if (const auto V = ParseDouble(*MX)) MouseX = static_cast(*V); - } - if (MY.has_value()) { - if (const auto V = ParseDouble(*MY)) MouseY = static_cast(*V); - } - HeadlessCommand Cmd; - Cmd.Type = HeadlessCommandType::PlaceActor; - Cmd.PlaceActorTemplateId = TemplateId.has_value() ? UnescapeJsonString(*TemplateId) : ""; - Cmd.PlaceActorMeshAssetPath = MeshAssetPath.has_value() ? UnescapeJsonString(*MeshAssetPath) : ""; - Cmd.MousePosition = {MouseX, MouseY}; - return Cmd; + HeadlessCommand Command; + Command.Type = HeadlessCommandType::PlaceActor; + Command.PlaceActorTemplateId = + std::string(GetStringView(Document, "templateId").value_or("")); + Command.PlaceActorMeshAssetPath = + std::string(GetStringView(Document, "meshAssetPath").value_or("")); + Command.MousePosition = ParseMousePosition(-1.0f, -1.0f); + return Command; } if (*Type == "list_assets") { return HeadlessCommand{.Type = HeadlessCommandType::ListAssets}; @@ -950,252 +960,158 @@ std::optional ParseHeadlessCommand(std::string_view JsonLine, return HeadlessCommand{.Type = HeadlessCommandType::ReloadScripts}; } if (*Type == "attach_script") { - static const std::regex ObjectIdPattern(R"json("objectId"\s*:\s*"([^"]+)")json"); - static const std::regex ClassPattern(R"json("scriptClass"\s*:\s*"([^"]*)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto ScriptClass = MatchString(JsonLine, ClassPattern); return HeadlessCommand{ .Type = HeadlessCommandType::AttachScript, .EditorPayload = {.Payload = AttachScriptCommand{ - .ObjectId = ObjectId.value_or(""), - .ScriptClassName = ScriptClass.value_or("")}}}; + .ObjectId = std::string( + GetStringView(Document, "objectId").value_or("")), + .ScriptClassName = std::string( + GetStringView(Document, "scriptClass") + .value_or(""))}}, + }; } if (*Type == "detach_script") { - static const std::regex ObjectIdPattern(R"json("objectId"\s*:\s*"([^"]+)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); return HeadlessCommand{ .Type = HeadlessCommandType::DetachScript, .EditorPayload = {.Payload = DetachScriptCommand{ - .ObjectId = ObjectId.value_or("")}}}; + .ObjectId = std::string( + GetStringView(Document, "objectId").value_or(""))}}, + }; } if (*Type == "set_mesh_asset") { - static const std::regex ObjectIdPattern(R"json("objectId"\s*:\s*"([^"]+)")json"); - static const std::regex AssetPathPattern(R"json("assetPath"\s*:\s*"([^"]+)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto AssetPath = MatchString(JsonLine, AssetPathPattern); + const std::string ObjectId = + std::string(GetStringView(Document, "objectId").value_or("")); + const std::string AssetPath = + std::string(GetStringView(Document, "assetPath").value_or("")); return HeadlessCommand{ .Type = HeadlessCommandType::SetMeshAsset, .EditorPayload = {.Payload = SetMeshAssetCommand{ - .ObjectId = ObjectId.value_or(""), - .AssetPath = AssetPath.value_or("")}}, - .AssetPath = AssetPath.value_or("")}; + .ObjectId = ObjectId, + .AssetPath = AssetPath}}, + .AssetPath = AssetPath, + }; } if (*Type == "set_light_properties") { - static const std::regex ObjectIdPattern(R"json("objectId"\s*:\s*"([^"]+)")json"); - static const std::regex ColorPattern( - R"json("color"\s*:\s*\[\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*\])json"); - static const std::regex IntensityPattern(R"json("intensity"\s*:\s*(-?[0-9Ee.+-]+))json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto Color = MatchVec3(JsonLine, ColorPattern); - std::optional Intensity; - { - std::match_results M; - if (std::regex_search(JsonLine.begin(), JsonLine.end(), M, IntensityPattern)) - Intensity = ParseDouble(std::string_view(M[1].first, M[1].second)); - } - HeadlessCommand Cmd; - Cmd.Type = HeadlessCommandType::SetLightProperties; - Cmd.Color = Color.value_or(glm::vec3(1.0f)); - Cmd.Intensity = static_cast(Intensity.value_or(1.0)); - Cmd.EditorPayload = {.Payload = SetLightPropertiesCommand{ - .ObjectId = ObjectId.value_or(""), - .Color = Cmd.Color, - .Intensity = Cmd.Intensity}}; - return Cmd; + HeadlessCommand Command; + Command.Type = HeadlessCommandType::SetLightProperties; + Command.Color = GetVec3Value(Document, "color").value_or(glm::vec3(1.0f)); + Command.Intensity = GetFloatValue(Document, "intensity").value_or(1.0f); + Command.EditorPayload = {.Payload = SetLightPropertiesCommand{ + .ObjectId = std::string( + GetStringView(Document, "objectId") + .value_or("")), + .Color = Command.Color, + .Intensity = Command.Intensity}}; + return Command; } if (*Type == "set_material_properties") { - static const std::regex ObjectIdPattern(R"json("objectId"\s*:\s*"([^"]+)")json"); - static const std::regex BaseColorPattern( - R"json("baseColorFactor"\s*:\s*\[\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*\])json"); - static const std::regex MetallicPattern(R"json("metallic"\s*:\s*(-?[0-9Ee.+-]+))json"); - static const std::regex RoughnessPattern(R"json("roughness"\s*:\s*(-?[0-9Ee.+-]+))json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - std::optional BaseColorFactor; - { - std::match_results M; - if (std::regex_search(JsonLine.begin(), JsonLine.end(), M, BaseColorPattern)) { - auto R = ParseDouble(std::string_view(M[1].first, M[1].second)); - auto G = ParseDouble(std::string_view(M[2].first, M[2].second)); - auto B = ParseDouble(std::string_view(M[3].first, M[3].second)); - auto A = ParseDouble(std::string_view(M[4].first, M[4].second)); - if (R && G && B && A) - BaseColorFactor = glm::vec4( - static_cast(*R), static_cast(*G), - static_cast(*B), static_cast(*A)); - } - } - std::optional Metallic; - std::optional Roughness; - { - std::match_results M; - if (std::regex_search(JsonLine.begin(), JsonLine.end(), M, MetallicPattern)) - Metallic = ParseDouble(std::string_view(M[1].first, M[1].second)); - } - { - std::match_results M; - if (std::regex_search(JsonLine.begin(), JsonLine.end(), M, RoughnessPattern)) - Roughness = ParseDouble(std::string_view(M[1].first, M[1].second)); - } - HeadlessCommand Cmd; - Cmd.Type = HeadlessCommandType::SetMaterialProperties; - Cmd.BaseColorFactor = BaseColorFactor.value_or(glm::vec4(1.0f)); - Cmd.Metallic = static_cast(Metallic.value_or(0.0)); - Cmd.Roughness = static_cast(Roughness.value_or(0.5)); - Cmd.EditorPayload = {.Payload = SetMaterialPropertiesCommand{ - .ObjectId = ObjectId.value_or(""), - .BaseColorFactor = Cmd.BaseColorFactor, - .Metallic = Cmd.Metallic, - .Roughness = Cmd.Roughness}}; - return Cmd; + HeadlessCommand Command; + Command.Type = HeadlessCommandType::SetMaterialProperties; + Command.BaseColorFactor = + GetVec4Value(Document, "baseColorFactor").value_or(glm::vec4(1.0f)); + Command.Metallic = GetFloatValue(Document, "metallic").value_or(0.0f); + Command.Roughness = GetFloatValue(Document, "roughness").value_or(0.5f); + Command.EditorPayload = {.Payload = SetMaterialPropertiesCommand{ + .ObjectId = std::string( + GetStringView(Document, "objectId") + .value_or("")), + .BaseColorFactor = Command.BaseColorFactor, + .Metallic = Command.Metallic, + .Roughness = Command.Roughness}}; + return Command; } if (*Type == "set_material_texture") { - static const std::regex ObjectIdPattern(R"json("objectId"\s*:\s*"([^"]+)")json"); - static const std::regex TexturePathPattern(R"json("textureAssetPath"\s*:\s*"([^"]*)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto TexturePath = MatchString(JsonLine, TexturePathPattern); - HeadlessCommand Cmd; - Cmd.Type = HeadlessCommandType::SetMaterialTexture; - Cmd.TextureAssetPath = TexturePath.value_or(""); - Cmd.EditorPayload = {.Payload = SetMaterialTextureCommand{ - .ObjectId = ObjectId.value_or(""), - .TextureAssetPath = Cmd.TextureAssetPath}}; - return Cmd; + HeadlessCommand Command; + Command.Type = HeadlessCommandType::SetMaterialTexture; + Command.TextureAssetPath = + std::string(GetStringView(Document, "textureAssetPath").value_or("")); + Command.EditorPayload = {.Payload = SetMaterialTextureCommand{ + .ObjectId = std::string( + GetStringView(Document, "objectId") + .value_or("")), + .TextureAssetPath = Command.TextureAssetPath}}; + return Command; } if (*Type == "get_schema") { - static const std::regex ObjectIdPattern(R"json("objectId"\s*:\s*"([^"]+)")json"); - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - return HeadlessCommand{.Type = HeadlessCommandType::GetSchema, - .ObjectId = ObjectId.value_or("")}; + return HeadlessCommand{ + .Type = HeadlessCommandType::GetSchema, + .ObjectId = + std::string(GetStringView(Document, "objectId").value_or("")), + }; } if (*Type == "set_property") { - static const std::regex ObjectIdPattern(R"json("objectId"\s*:\s*"([^"]+)")json"); - static const std::regex PropPattern(R"json("property"\s*:\s*"([^"]+)")json"); - static const std::regex StringValPattern(R"json("value"\s*:\s*"([^"]*)")json"); - static const std::regex BoolValPattern(R"json("value"\s*:\s*(true|false))json"); - static const std::regex NumberValPattern( - R"json("value"\s*:\s*(-?[0-9Ee.+-]+))json"); - static const std::regex Vec3ValPattern( - R"json("value"\s*:\s*\[\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*,\s*(-?[0-9Ee.+-]+)\s*\])json"); - - const auto ObjectId = MatchString(JsonLine, ObjectIdPattern); - const auto PropName = MatchString(JsonLine, PropPattern); - - std::optional Val; - if (const auto StrVal = MatchString(JsonLine, StringValPattern)) { - Val = PropertyValue{*StrVal}; - } else if (const auto BoolStr = MatchString(JsonLine, BoolValPattern)) { - Val = PropertyValue{*BoolStr == "true"}; - } else if (const auto NumberStr = MatchString(JsonLine, NumberValPattern)) { - if (const auto Number = ParseDouble(*NumberStr)) { - Val = PropertyValue{static_cast(*Number)}; - } - } else { - std::match_results M; - if (std::regex_search(JsonLine.begin(), JsonLine.end(), M, Vec3ValPattern) && - M.size() == 4) { - const auto X = ParseDouble(std::string_view(M[1].first, M[1].second)); - const auto Y = ParseDouble(std::string_view(M[2].first, M[2].second)); - const auto Z = ParseDouble(std::string_view(M[3].first, M[3].second)); - if (X && Y && Z) { - Val = PropertyValue{glm::vec3{static_cast(*X), - static_cast(*Y), - static_cast(*Z)}}; - } + HeadlessCommand Command; + Command.Type = HeadlessCommandType::SetProperty; + Command.ObjectId = + std::string(GetStringView(Document, "objectId").value_or("")); + Command.PropertyName = + std::string(GetStringView(Document, "property").value_or("")); + if (const rapidjson::Value *Value = FindMemberValue(Document, "value"); + Value != nullptr) { + if (Value->IsString()) { + Command.PropertyVal = PropertyValue{std::string( + Value->GetString(), Value->GetStringLength())}; + } else if (Value->IsBool()) { + Command.PropertyVal = PropertyValue{Value->GetBool()}; + } else if (Value->IsNumber()) { + Command.PropertyVal = PropertyValue{Value->GetFloat()}; + } else if (const auto Vec3Value = ParseVec3(*Value); + Vec3Value.has_value()) { + Command.PropertyVal = PropertyValue{*Vec3Value}; } } - - return HeadlessCommand{.Type = HeadlessCommandType::SetProperty, - .ObjectId = ObjectId.value_or(""), - .PropertyName = PropName.value_or(""), - .PropertyVal = Val}; + return Command; } 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); + HeadlessCommand Command; + Command.Type = HeadlessCommandType::SetWorldSettings; + if (const auto Top = GetVec3Value(Document, "skyboxColorTop"); + Top.has_value()) { + Command.SkyboxColorTop = *Top; } - 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); + if (const auto Bottom = GetVec3Value(Document, "skyboxColorBottom"); + Bottom.has_value()) { + Command.SkyboxColorBottom = *Bottom; } - - Cmd.EditorPayload = {.Payload = SetWorldSettingsCommand{ - .Settings = EditorWorldSettings{ - .SkyboxColorTop = Cmd.SkyboxColorTop, - .SkyboxColorBottom = Cmd.SkyboxColorBottom, - .SkyboxHDRPath = Cmd.SkyboxHDRPath}}}; - return Cmd; + Command.SkyboxHDRPath = + std::string(GetStringView(Document, "skyboxHDRPath").value_or("")); + Command.EditorPayload = {.Payload = SetWorldSettingsCommand{ + .Settings = EditorWorldSettings{ + .SkyboxColorTop = Command.SkyboxColorTop, + .SkyboxColorBottom = + Command.SkyboxColorBottom, + .SkyboxHDRPath = Command.SkyboxHDRPath}}}; + return Command; } if (*Type == "set_gizmo_mode") { - static const std::regex ModePattern(R"json("mode"\s*:\s*"([^"]+)")json"); - const auto ModeStr = MatchString(JsonLine, ModePattern); GizmoMode Mode = GizmoMode::Translate; - if (ModeStr.has_value()) { + if (const auto ModeStr = GetStringView(Document, "mode"); + ModeStr.has_value()) { if (*ModeStr == "scale") { Mode = GizmoMode::Scale; } else if (*ModeStr == "rotate") { Mode = GizmoMode::Rotate; } } - return HeadlessCommand{.Type = HeadlessCommandType::SetGizmoMode, .Mode = Mode}; + return HeadlessCommand{.Type = HeadlessCommandType::SetGizmoMode, + .Mode = Mode}; } if (*Type == "set_grid_snap") { - static const std::regex EnabledPattern(R"json("enabled"\s*:\s*(true|false))json"); - static const std::regex TranslationStepPattern( - R"json("translationStep"\s*:\s*(-?[0-9Ee.+-]+))json"); - static const std::regex RotationStepPattern( - R"json("rotationStepDegrees"\s*:\s*(-?[0-9Ee.+-]+))json"); - static const std::regex ScaleStepPattern( - R"json("scaleStep"\s*:\s*(-?[0-9Ee.+-]+))json"); - const auto EnabledStr = MatchString(JsonLine, EnabledPattern); - auto ParseScalar = [&](const std::regex &pattern, double fallback) { - std::match_results match; - if (std::regex_search(JsonLine.begin(), JsonLine.end(), match, pattern)) { - if (const auto value = - ParseDouble(std::string_view(match[1].first, match[1].second))) { - return static_cast(*value); - } - } - return static_cast(fallback); - }; return HeadlessCommand{ .Type = HeadlessCommandType::SetGridSnap, - .Enabled = EnabledStr.value_or("false") == "true", - .TranslationStep = ParseScalar(TranslationStepPattern, 1.0), - .RotationStepDegrees = ParseScalar(RotationStepPattern, 15.0), - .ScaleStep = ParseScalar(ScaleStepPattern, 0.1)}; + .Enabled = GetBoolValue(Document, "enabled").value_or(false), + .TranslationStep = + GetFloatValue(Document, "translationStep").value_or(1.0f), + .RotationStepDegrees = + GetFloatValue(Document, "rotationStepDegrees").value_or(15.0f), + .ScaleStep = GetFloatValue(Document, "scaleStep").value_or(0.1f), + }; } - Error = "Unsupported command type: " + *Type; + Error = "Unsupported command type: " + std::string(*Type); return std::nullopt; } @@ -1259,282 +1175,386 @@ ParseRemoteViewportCommand(std::string_view JsonLine, std::string &Error) { return std::nullopt; } -std::string EscapeJson(std::string_view Value) { - std::string Escaped; - Escaped.reserve(Value.size()); - for (const char Character : Value) { - switch (Character) { - case '\\': - Escaped += "\\\\"; - break; - case '"': - Escaped += "\\\""; - break; - case '\n': - Escaped += "\\n"; - break; - case '\r': - Escaped += "\\r"; - break; - case '\t': - Escaped += "\\t"; - break; - default: - Escaped.push_back(Character); - break; - } - } - return Escaped; -} - std::string SerializeEvent(const PublishedEditorEvent &Event) { - std::ostringstream Stream; - Stream << "{\"type\":\"event\",\"eventId\":" << Event.Id.Value - << ",\"payloadType\":\"" << EventPayloadType(Event.Event.Payload) << "\""; - if (const auto *Camera = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Camera->User.Value << ",\"position\":[" - << Camera->Position.x << "," << Camera->Position.y << "," - << Camera->Position.z << "],\"yawDegrees\":" << Camera->YawDegrees - << ",\"pitchDegrees\":" << Camera->PitchDegrees; - } else if (const auto *Look = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Look->User.Value << ",\"isLooking\":" - << (Look->IsLooking ? "true" : "false"); - } else if (const auto *Acknowledged = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Acknowledged->User.Value - << ",\"acknowledgedCommandId\":" - << Acknowledged->AcknowledgedCommand.Value - << ",\"commandType\":\"" << EscapeJson(Acknowledged->CommandType) - << "\""; - } else if (const auto *Rejected = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Rejected->User.Value - << ",\"rejectedCommandId\":" << Rejected->RejectedCommand.Value - << ",\"reason\":\"" << EscapeJson(Rejected->Reason) << "\""; - } else if (const auto *Presence = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Presence->User.Value - << ",\"displayName\":\"" << EscapeJson(Presence->DisplayName) - << "\",\"isLocal\":" << (Presence->IsLocal ? "true" : "false") - << ",\"presenceState\":\"" << EscapeJson(Presence->PresenceState) - << "\",\"selectionObjectId\":"; - if (Presence->SelectedObjectId.has_value()) { - Stream << "\"" << EscapeJson(*Presence->SelectedObjectId) << "\""; - } else { - Stream << "null"; - } - } else if (const auto *Selection = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Selection->User.Value << ",\"objectId\":"; - if (Selection->ObjectId.has_value()) { - Stream << "\"" << EscapeJson(*Selection->ObjectId) << "\""; - } else { - Stream << "null"; - } - } else if (const auto *Rename = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Rename->User.Value << ",\"objectId\":\"" - << EscapeJson(Rename->ObjectId) << "\",\"displayName\":\"" - << EscapeJson(Rename->DisplayName) << "\""; - } else if (const auto *Visibility = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Visibility->User.Value << ",\"objectId\":\"" - << EscapeJson(Visibility->ObjectId) << "\",\"visible\":" - << (Visibility->Visible ? "true" : "false"); - } else if (const auto *Created = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Created->User.Value << ",\"objectId\":\"" - << EscapeJson(Created->ObjectId) << "\",\"displayName\":\"" - << EscapeJson(Created->DisplayName) << "\""; - } else if (const auto *Deleted = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Deleted->User.Value << ",\"objectId\":\"" - << EscapeJson(Deleted->ObjectId) << "\""; - } else if (const auto *Reparented = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Reparented->User.Value << ",\"objectId\":\"" - << EscapeJson(Reparented->ObjectId) << "\",\"newParentId\":\"" - << EscapeJson(Reparented->NewParentId) << "\""; - } else if (const auto *Transform = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << Transform->User.Value << ",\"objectId\":\"" - << EscapeJson(Transform->ObjectId) << "\",\"location\":[" - << Transform->Location.x << "," << Transform->Location.y << "," - << Transform->Location.z << "],\"rotationDegrees\":[" - << Transform->RotationDegrees.x << "," - << Transform->RotationDegrees.y << "," - << Transform->RotationDegrees.z << "],\"scale\":[" - << Transform->Scale.x << "," << Transform->Scale.y << "," - << Transform->Scale.z << "]"; - } else if (const auto *LockChanged = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"objectId\":\"" << EscapeJson(LockChanged->ObjectId) - << "\",\"lockState\":\"" << LockStateToString(LockChanged->LockState) - << "\",\"lockOwnerUserId\":"; - if (LockChanged->LockOwner.has_value()) { - Stream << LockChanged->LockOwner->Value; - } else { - Stream << "null"; - } - } else if (const auto *ScriptChanged = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"objectId\":\"" << EscapeJson(ScriptChanged->ObjectId) - << "\",\"scriptClass\":"; - if (ScriptChanged->ScriptClass.has_value()) { - Stream << "\"" << EscapeJson(*ScriptChanged->ScriptClass) << "\""; - } else { - Stream << "null"; + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("event"); + Writer.Key("eventId"); + Writer.Uint64(Event.Id.Value); + Writer.Key("payloadType"); + WriteString(Writer, EventPayloadType(Event.Event.Payload)); + + if (const auto *Camera = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Camera->User.Value); + Writer.Key("position"); + WriteVec3(Writer, Camera->Position); + Writer.Key("yawDegrees"); + WriteNumber(Writer, Camera->YawDegrees); + Writer.Key("pitchDegrees"); + WriteNumber(Writer, Camera->PitchDegrees); + } else if (const auto *Look = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Look->User.Value); + Writer.Key("isLooking"); + Writer.Bool(Look->IsLooking); + } else if (const auto *Acknowledged = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Acknowledged->User.Value); + Writer.Key("acknowledgedCommandId"); + Writer.Uint64(Acknowledged->AcknowledgedCommand.Value); + Writer.Key("commandType"); + WriteString(Writer, Acknowledged->CommandType); + } else if (const auto *Rejected = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Rejected->User.Value); + Writer.Key("rejectedCommandId"); + Writer.Uint64(Rejected->RejectedCommand.Value); + Writer.Key("reason"); + WriteString(Writer, Rejected->Reason); + } else if (const auto *Presence = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Presence->User.Value); + Writer.Key("displayName"); + WriteString(Writer, Presence->DisplayName); + Writer.Key("isLocal"); + Writer.Bool(Presence->IsLocal); + Writer.Key("presenceState"); + WriteString(Writer, Presence->PresenceState); + Writer.Key("selectionObjectId"); + if (Presence->SelectedObjectId.has_value()) { + WriteString(Writer, *Presence->SelectedObjectId); + } else { + Writer.Null(); + } + } else if (const auto *Selection = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Selection->User.Value); + Writer.Key("objectId"); + if (Selection->ObjectId.has_value()) { + WriteString(Writer, *Selection->ObjectId); + } else { + Writer.Null(); + } + } else if (const auto *Rename = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Rename->User.Value); + Writer.Key("objectId"); + WriteString(Writer, Rename->ObjectId); + Writer.Key("displayName"); + WriteString(Writer, Rename->DisplayName); + } else if (const auto *Visibility = + std::get_if( + &Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Visibility->User.Value); + Writer.Key("objectId"); + WriteString(Writer, Visibility->ObjectId); + Writer.Key("visible"); + Writer.Bool(Visibility->Visible); + } else if (const auto *Created = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Created->User.Value); + Writer.Key("objectId"); + WriteString(Writer, Created->ObjectId); + Writer.Key("displayName"); + WriteString(Writer, Created->DisplayName); + } else if (const auto *Deleted = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Deleted->User.Value); + Writer.Key("objectId"); + WriteString(Writer, Deleted->ObjectId); + } else if (const auto *Reparented = + std::get_if(&Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Reparented->User.Value); + Writer.Key("objectId"); + WriteString(Writer, Reparented->ObjectId); + Writer.Key("newParentId"); + WriteString(Writer, Reparented->NewParentId); + } else if (const auto *Transform = + std::get_if( + &Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(Transform->User.Value); + Writer.Key("objectId"); + WriteString(Writer, Transform->ObjectId); + Writer.Key("location"); + WriteVec3(Writer, Transform->Location); + Writer.Key("rotationDegrees"); + WriteVec3(Writer, Transform->RotationDegrees); + Writer.Key("scale"); + WriteVec3(Writer, Transform->Scale); + } else if (const auto *LockChanged = + std::get_if(&Event.Event.Payload)) { + Writer.Key("objectId"); + WriteString(Writer, LockChanged->ObjectId); + Writer.Key("lockState"); + WriteString(Writer, LockStateToString(LockChanged->LockState)); + Writer.Key("lockOwnerUserId"); + if (LockChanged->LockOwner.has_value()) { + Writer.Uint64(LockChanged->LockOwner->Value); + } else { + Writer.Null(); + } + } else if (const auto *ScriptChanged = + std::get_if( + &Event.Event.Payload)) { + Writer.Key("objectId"); + WriteString(Writer, ScriptChanged->ObjectId); + Writer.Key("scriptClass"); + if (ScriptChanged->ScriptClass.has_value()) { + WriteString(Writer, *ScriptChanged->ScriptClass); + } else { + Writer.Null(); + } + } else if (const auto *ScriptError = + std::get_if(&Event.Event.Payload)) { + Writer.Key("objectId"); + WriteString(Writer, ScriptError->ObjectId); + Writer.Key("message"); + WriteString(Writer, ScriptError->Message); + } else if (const auto *MeshAsset = + std::get_if(&Event.Event.Payload)) { + Writer.Key("objectId"); + WriteString(Writer, MeshAsset->ObjectId); + Writer.Key("assetPath"); + WriteString(Writer, MeshAsset->AssetPath); + } else if (const auto *LightProps = + std::get_if( + &Event.Event.Payload)) { + Writer.Key("objectId"); + WriteString(Writer, LightProps->ObjectId); + Writer.Key("color"); + WriteVec3(Writer, LightProps->Color); + Writer.Key("intensity"); + WriteNumber(Writer, LightProps->Intensity); + } else if (const auto *MaterialProps = + std::get_if( + &Event.Event.Payload)) { + Writer.Key("objectId"); + WriteString(Writer, MaterialProps->ObjectId); + Writer.Key("baseColorFactor"); + WriteVec4(Writer, MaterialProps->BaseColorFactor); + Writer.Key("metallic"); + WriteNumber(Writer, MaterialProps->Metallic); + Writer.Key("roughness"); + WriteNumber(Writer, MaterialProps->Roughness); + } else if (const auto *TextureEvent = + std::get_if( + &Event.Event.Payload)) { + Writer.Key("objectId"); + WriteString(Writer, TextureEvent->ObjectId); + Writer.Key("textureAssetPath"); + WriteString(Writer, TextureEvent->TextureAssetPath); + } else if (const auto *PhysicsProps = + std::get_if( + &Event.Event.Payload)) { + Writer.Key("objectId"); + WriteString(Writer, PhysicsProps->ObjectId); + Writer.Key("bodyType"); + WriteString(Writer, + PhysicsBodyTypeToString(PhysicsProps->Physics.BodyType)); + Writer.Key("colliderType"); + WriteString(Writer, + PhysicsColliderTypeToString( + PhysicsProps->Physics.ColliderType)); + Writer.Key("boxHalfExtents"); + WriteVec3(Writer, PhysicsProps->Physics.BoxHalfExtents); + Writer.Key("sphereRadius"); + WriteNumber(Writer, PhysicsProps->Physics.SphereRadius); + Writer.Key("mass"); + WriteNumber(Writer, PhysicsProps->Physics.Mass); + Writer.Key("friction"); + WriteNumber(Writer, PhysicsProps->Physics.Friction); + Writer.Key("restitution"); + WriteNumber(Writer, PhysicsProps->Physics.Restitution); + } else if (const auto *RuntimeState = + std::get_if( + &Event.Event.Payload)) { + Writer.Key("user"); + Writer.Uint64(RuntimeState->User.Value); + Writer.Key("runtimeState"); + WriteString(Writer, RuntimeStateToString(RuntimeState->State)); } - } else if (const auto *ScriptError = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"objectId\":\"" << EscapeJson(ScriptError->ObjectId) - << "\",\"message\":\"" << EscapeJson(ScriptError->Message) << "\""; - } else if (const auto *MeshAsset = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"objectId\":\"" << EscapeJson(MeshAsset->ObjectId) - << "\",\"assetPath\":\"" << EscapeJson(MeshAsset->AssetPath) << "\""; - } else if (const auto *LightProps = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"objectId\":\"" << EscapeJson(LightProps->ObjectId) - << "\",\"color\":[" << LightProps->Color.r << "," << LightProps->Color.g - << "," << LightProps->Color.b << "],\"intensity\":" << LightProps->Intensity; - } else if (const auto *MatProps = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"objectId\":\"" << EscapeJson(MatProps->ObjectId) - << "\",\"baseColorFactor\":[" - << MatProps->BaseColorFactor.r << "," << MatProps->BaseColorFactor.g << "," - << MatProps->BaseColorFactor.b << "," << MatProps->BaseColorFactor.a - << "],\"metallic\":" << MatProps->Metallic - << ",\"roughness\":" << MatProps->Roughness; - } else if (const auto *TexEv = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"objectId\":\"" << EscapeJson(TexEv->ObjectId) - << "\",\"textureAssetPath\":\"" << EscapeJson(TexEv->TextureAssetPath) << "\""; - } else if (const auto *PhysicsProps = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"objectId\":\"" << EscapeJson(PhysicsProps->ObjectId) - << "\",\"bodyType\":\"" - << PhysicsBodyTypeToString(PhysicsProps->Physics.BodyType) - << "\",\"colliderType\":\"" - << PhysicsColliderTypeToString(PhysicsProps->Physics.ColliderType) - << "\",\"boxHalfExtents\":[" - << PhysicsProps->Physics.BoxHalfExtents.x << "," - << PhysicsProps->Physics.BoxHalfExtents.y << "," - << PhysicsProps->Physics.BoxHalfExtents.z - << "],\"sphereRadius\":" << PhysicsProps->Physics.SphereRadius - << ",\"mass\":" << PhysicsProps->Physics.Mass - << ",\"friction\":" << PhysicsProps->Physics.Friction - << ",\"restitution\":" << PhysicsProps->Physics.Restitution; - } else if (const auto *RuntimeState = - std::get_if(&Event.Event.Payload)) { - Stream << ",\"user\":" << RuntimeState->User.Value - << ",\"runtimeState\":\"" - << RuntimeStateToString(RuntimeState->State) << "\""; - } - Stream << "}"; - return Stream.str(); + + Writer.EndObject(); + }); } std::string SerializeReady(uint32_t Width, uint32_t Height) { - std::ostringstream Stream; - Stream << "{\"type\":\"ready\",\"width\":" << Width << ",\"height\":" << Height - << "}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("ready"); + Writer.Key("width"); + Writer.Uint(Width); + Writer.Key("height"); + Writer.Uint(Height); + Writer.EndObject(); + }); } -std::string SerializeConnected() { return "{\"type\":\"connected\"}"; } +std::string SerializeConnected() { + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("connected"); + Writer.EndObject(); + }); +} -std::string SerializeDisconnected() { return "{\"type\":\"disconnected\"}"; } +std::string SerializeDisconnected() { + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("disconnected"); + Writer.EndObject(); + }); +} std::string SerializeFrame(const std::filesystem::path &Path, const CapturedFrame &Frame) { - std::ostringstream Stream; - Stream << "{\"type\":\"frame\",\"frameIndex\":" << Frame.FrameIndex - << ",\"path\":\"" << EscapeJson(Path.string()) << "\",\"width\":" - << Frame.Width << ",\"height\":" << Frame.Height << "}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("frame"); + Writer.Key("frameIndex"); + Writer.Uint64(Frame.FrameIndex); + Writer.Key("path"); + WriteString(Writer, Path.string()); + Writer.Key("width"); + Writer.Uint(Frame.Width); + Writer.Key("height"); + Writer.Uint(Frame.Height); + Writer.EndObject(); + }); } std::string SerializeFrameMetadata(uint64_t FrameIndex, uint32_t Width, uint32_t Height, std::string_view FrameUrl) { - std::ostringstream Stream; - Stream << "{\"type\":\"frame\",\"frameIndex\":" << FrameIndex - << ",\"path\":\"" << EscapeJson(FrameUrl) << "\",\"width\":" << Width - << ",\"height\":" << Height << "}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("frame"); + Writer.Key("frameIndex"); + Writer.Uint64(FrameIndex); + Writer.Key("path"); + WriteString(Writer, FrameUrl); + Writer.Key("width"); + Writer.Uint(Width); + Writer.Key("height"); + Writer.Uint(Height); + Writer.EndObject(); + }); } std::string SerializeEncodedVideoPacketMetadata( const EncodedVideoPacket &Packet, std::string_view PacketUrl) { - std::ostringstream Stream; - Stream << "{\"type\":\"encoded_video\",\"codec\":\""; - switch (Packet.Codec) { - case EncodedVideoCodec::H264: - Stream << "h264"; - break; - } - Stream << "\",\"frameIndex\":" << Packet.FrameIndex - << ",\"path\":\"" << EscapeJson(PacketUrl) << "\",\"width\":" - << Packet.Width << ",\"height\":" << Packet.Height - << ",\"isKeyframe\":" - << (Packet.IsKeyframe ? "true" : "false") - << ",\"byteLength\":" << Packet.Bytes.size() << "}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("encoded_video"); + Writer.Key("codec"); + switch (Packet.Codec) { + case EncodedVideoCodec::H264: + Writer.String("h264"); + break; + } + Writer.Key("frameIndex"); + Writer.Uint64(Packet.FrameIndex); + Writer.Key("path"); + WriteString(Writer, PacketUrl); + Writer.Key("width"); + Writer.Uint(Packet.Width); + Writer.Key("height"); + Writer.Uint(Packet.Height); + Writer.Key("isKeyframe"); + Writer.Bool(Packet.IsKeyframe); + Writer.Key("byteLength"); + Writer.Uint64(Packet.Bytes.size()); + Writer.EndObject(); + }); } std::optional ParseWebRtcSessionDescription(std::string_view JsonLine, std::string &Error) { - static const std::regex TypePattern(R"json("type"\s*:\s*"([^"]+)")json"); - static const std::regex SdpPattern(R"json("sdp"\s*:\s*"((?:\\.|[^"])*)")json"); + std::string MutableJson; + auto ParsedDocument = ParseJson(JsonLine, MutableJson, Error); + if (!ParsedDocument.has_value()) { + Error = "WebRTC session description is not valid JSON."; + return std::nullopt; + } + rapidjson::Document &Document = *ParsedDocument; - const auto Type = MatchString(JsonLine, TypePattern); + const auto Type = GetStringView(Document, "type"); if (!Type.has_value()) { Error = "WebRTC session description is missing a string `type` field."; return std::nullopt; } - - const auto Sdp = MatchString(JsonLine, SdpPattern); + const auto Sdp = GetStringView(Document, "sdp"); if (!Sdp.has_value()) { Error = "WebRTC session description is missing a string `sdp` field."; return std::nullopt; } - if (*Type != "offer" && *Type != "answer") { - Error = "Unsupported WebRTC session description type: " + *Type; + Error = "Unsupported WebRTC session description type: " + + std::string(*Type); return std::nullopt; } - - return WebRtcSessionDescription{.Type = *Type, - .Sdp = UnescapeJsonString(*Sdp)}; + return WebRtcSessionDescription{ + .Type = std::string(*Type), + .Sdp = std::string(*Sdp), + }; } std::optional ParseWebRtcIceCandidate(std::string_view JsonLine, std::string &Error) { - static const std::regex CandidatePattern( - R"json("candidate"\s*:\s*"((?:\\.|[^"])*)")json"); - static const std::regex MidPattern(R"json("sdpMid"\s*:\s*"([^"]+)")json"); - static const std::regex MLinePattern( - R"json("sdpMLineIndex"\s*:\s*([0-9]+))json"); + std::string MutableJson; + auto ParsedDocument = ParseJson(JsonLine, MutableJson, Error); + if (!ParsedDocument.has_value()) { + Error = "WebRTC ICE candidate is not valid JSON."; + return std::nullopt; + } + rapidjson::Document &Document = *ParsedDocument; - const auto Candidate = MatchString(JsonLine, CandidatePattern); + const auto Candidate = GetStringView(Document, "candidate"); if (!Candidate.has_value()) { Error = "WebRTC ICE candidate is missing a string `candidate` field."; return std::nullopt; } - WebRtcIceCandidate Parsed{.Candidate = UnescapeJsonString(*Candidate)}; - if (const auto Mid = MatchString(JsonLine, MidPattern); Mid.has_value()) { - Parsed.SdpMid = UnescapeJsonString(*Mid); - } - - const auto MLineValue = MatchString(JsonLine, MLinePattern); - if (MLineValue.has_value()) { - const auto ParsedIndex = ParseUnsigned16(*MLineValue); + WebRtcIceCandidate Parsed{ + .Candidate = std::string(*Candidate), + }; + if (const auto SdpMid = GetStringView(Document, "sdpMid"); + SdpMid.has_value()) { + Parsed.SdpMid = std::string(*SdpMid); + } + if (const rapidjson::Value *MLineIndex = + FindMemberValue(Document, "sdpMLineIndex"); + MLineIndex != nullptr) { + if (!MLineIndex->IsUint()) { + Error = + "WebRTC ICE candidate `sdpMLineIndex` must be an unsigned integer."; + return std::nullopt; + } + const auto ParsedIndex = + ParseUnsigned16(std::to_string(MLineIndex->GetUint())); if (!ParsedIndex.has_value()) { - Error = "WebRTC ICE candidate `sdpMLineIndex` must be an unsigned integer."; + Error = + "WebRTC ICE candidate `sdpMLineIndex` must be an unsigned integer."; return std::nullopt; } Parsed.SdpMLineIndex = *ParsedIndex; @@ -1545,41 +1565,62 @@ ParseWebRtcIceCandidate(std::string_view JsonLine, std::string &Error) { std::string SerializeWebRtcSessionDescription( const WebRtcSessionDescription &Description, std::string_view SessionId) { - std::ostringstream Stream; - Stream << "{\"type\":\"" << EscapeJson(Description.Type) << "\",\"sdp\":\"" - << EscapeJson(Description.Sdp) << "\""; - if (!SessionId.empty()) { - Stream << ",\"sessionId\":\"" << EscapeJson(SessionId) << "\""; - } - Stream << "}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + WriteString(Writer, Description.Type); + Writer.Key("sdp"); + WriteString(Writer, Description.Sdp); + if (!SessionId.empty()) { + Writer.Key("sessionId"); + WriteString(Writer, SessionId); + } + Writer.EndObject(); + }); } std::string SerializeWebRtcIceCandidate(const WebRtcIceCandidate &Candidate) { - std::ostringstream Stream; - Stream << "{\"candidate\":\"" << EscapeJson(Candidate.Candidate) << "\""; - if (Candidate.SdpMid.has_value()) { - Stream << ",\"sdpMid\":\"" << EscapeJson(*Candidate.SdpMid) << "\""; - } - if (Candidate.SdpMLineIndex.has_value()) { - Stream << ",\"sdpMLineIndex\":" << *Candidate.SdpMLineIndex; - } - Stream << "}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("candidate"); + WriteString(Writer, Candidate.Candidate); + if (Candidate.SdpMid.has_value()) { + Writer.Key("sdpMid"); + WriteString(Writer, *Candidate.SdpMid); + } + if (Candidate.SdpMLineIndex.has_value()) { + Writer.Key("sdpMLineIndex"); + Writer.Uint(*Candidate.SdpMLineIndex); + } + Writer.EndObject(); + }); } std::string SerializeWebRtcIceCandidateList( std::span Candidates) { - std::ostringstream Stream; - Stream << "{\"type\":\"ice_candidates\",\"candidates\":["; - for (size_t Index = 0; Index < Candidates.size(); ++Index) { - if (Index != 0) { - Stream << ","; + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("ice_candidates"); + Writer.Key("candidates"); + Writer.StartArray(); + for (const auto &Candidate : Candidates) { + Writer.StartObject(); + Writer.Key("candidate"); + WriteString(Writer, Candidate.Candidate); + if (Candidate.SdpMid.has_value()) { + Writer.Key("sdpMid"); + WriteString(Writer, *Candidate.SdpMid); + } + if (Candidate.SdpMLineIndex.has_value()) { + Writer.Key("sdpMLineIndex"); + Writer.Uint(*Candidate.SdpMLineIndex); + } + Writer.EndObject(); } - Stream << SerializeWebRtcIceCandidate(Candidates[Index]); - } - Stream << "]}"; - return Stream.str(); + Writer.EndArray(); + Writer.EndObject(); + }); } std::string SerializeSessionSnapshot(const EditorSessionState &State, @@ -1590,8 +1631,7 @@ std::string SerializeSessionSnapshot(const EditorSessionState &State, std::string_view WebRtcConnectionState) { const std::vector Participants = BuildParticipants(State, CurrentUser); - const SessionUserId RuntimeControllerUser = - [&]() -> SessionUserId { + const SessionUserId RuntimeControllerUser = [&]() -> SessionUserId { if (State.RuntimeControllerUser.has_value()) { return *State.RuntimeControllerUser; } @@ -1609,73 +1649,88 @@ std::string SerializeSessionSnapshot(const EditorSessionState &State, return Candidate.value_or(SessionUserId{1}); }(); - std::ostringstream Stream; - Stream << "{\"type\":\"session_snapshot\",\"sessionId\":" << State.Session.Value - << ",\"currentUserId\":" << CurrentUser.Value - << ",\"runtimeControllerUserId\":" << RuntimeControllerUser.Value - << ",\"showColliders\":" << (ShowColliders ? "true" : "false") - << ",\"runtimeState\":\"" << RuntimeStateToString(State.RuntimeState) - << "\"" - << ",\"transport\":{\"connected\":" - << (TransportConnected ? "true" : "false") << ",\"state\":\"" - << EscapeJson(TransportState) << "\",\"webrtcConnectionState\":\"" - << EscapeJson(WebRtcConnectionState) << "\"},\"participants\":["; - - for (size_t Index = 0; Index < Participants.size(); ++Index) { - if (Index != 0) { - Stream << ","; - } - SerializeParticipant(Stream, Participants[Index]); - } - - Stream << "],\"selections\":["; - bool FirstSelection = true; - for (const auto &[User, ObjectId] : State.SelectedObjectIds) { - if (!FirstSelection) { - Stream << ","; + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("session_snapshot"); + Writer.Key("sessionId"); + Writer.Uint64(State.Session.Value); + Writer.Key("currentUserId"); + Writer.Uint64(CurrentUser.Value); + Writer.Key("runtimeControllerUserId"); + Writer.Uint64(RuntimeControllerUser.Value); + Writer.Key("showColliders"); + Writer.Bool(ShowColliders); + Writer.Key("runtimeState"); + WriteString(Writer, RuntimeStateToString(State.RuntimeState)); + + Writer.Key("transport"); + Writer.StartObject(); + Writer.Key("connected"); + Writer.Bool(TransportConnected); + Writer.Key("state"); + WriteString(Writer, TransportState); + Writer.Key("webrtcConnectionState"); + WriteString(Writer, WebRtcConnectionState); + Writer.EndObject(); + + Writer.Key("participants"); + Writer.StartArray(); + for (const auto &Participant : Participants) { + WriteParticipant(Writer, Participant); } - FirstSelection = false; - Stream << "{\"userId\":" << User.Value << ",\"objectId\":\"" - << EscapeJson(ObjectId) << "\"}"; - } + Writer.EndArray(); + + Writer.Key("selections"); + Writer.StartArray(); + for (const auto &[User, ObjectId] : State.SelectedObjectIds) { + Writer.StartObject(); + Writer.Key("userId"); + Writer.Uint64(User.Value); + Writer.Key("objectId"); + WriteString(Writer, ObjectId); + Writer.EndObject(); + } + Writer.EndArray(); - Stream << "],\"sceneTree\":["; - for (size_t Index = 0; Index < State.Scene.Items.size(); ++Index) { - if (Index != 0) { - Stream << ","; + Writer.Key("sceneTree"); + Writer.StartArray(); + for (const auto &Item : State.Scene.Items) { + WriteSceneItem(Writer, Item); } - SerializeSceneItem(Stream, State.Scene.Items[Index]); - } - 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); - if (SelectionIt == State.SelectedObjectIds.end()) { - return nullptr; - } - const auto DetailsIt = - State.Scene.ObjectDetailsById.find(SelectionIt->second); - return DetailsIt != State.Scene.ObjectDetailsById.end() - ? &DetailsIt->second - : nullptr; - }(); - Details != nullptr) { - SerializeObjectDetails(Stream, State, *Details); - } else { - Stream << "null"; - } - Stream << "}"; - return Stream.str(); + Writer.EndArray(); + + Writer.Key("worldSettings"); + Writer.StartObject(); + Writer.Key("skyboxColorTop"); + WriteVec3(Writer, State.Scene.WorldSettings.SkyboxColorTop); + Writer.Key("skyboxColorBottom"); + WriteVec3(Writer, State.Scene.WorldSettings.SkyboxColorBottom); + Writer.Key("skyboxHDRPath"); + WriteString(Writer, State.Scene.WorldSettings.SkyboxHDRPath); + Writer.EndObject(); + + Writer.Key("selectedObjectDetails"); + const EditorObjectDetails *Details = [&]() -> const EditorObjectDetails * { + const auto SelectionIt = State.SelectedObjectIds.find(CurrentUser); + if (SelectionIt == State.SelectedObjectIds.end()) { + return nullptr; + } + const auto DetailsIt = + State.Scene.ObjectDetailsById.find(SelectionIt->second); + return DetailsIt != State.Scene.ObjectDetailsById.end() + ? &DetailsIt->second + : nullptr; + }(); + if (Details != nullptr) { + WriteObjectDetails(Writer, State, *Details); + } else { + Writer.Null(); + } + + Writer.EndObject(); + }); } std::string SerializeSessionConnectResponse( @@ -1683,13 +1738,23 @@ std::string SerializeSessionConnectResponse( SessionUserId CurrentUser, bool ShowColliders, bool TransportConnected, std::string_view TransportState, std::string_view WebRtcConnectionState) { - std::ostringstream Stream; - Stream << "{\"type\":\"session_connect\",\"clientId\":\"" - << EscapeJson(ClientId) << "\",\"snapshot\":" - << SerializeSessionSnapshot(State, CurrentUser, ShowColliders, TransportConnected, - TransportState, WebRtcConnectionState) - << "}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("session_connect"); + Writer.Key("clientId"); + WriteString(Writer, ClientId); + Writer.Key("snapshot"); + + const std::string Snapshot = SerializeSessionSnapshot( + State, CurrentUser, ShowColliders, TransportConnected, TransportState, + WebRtcConnectionState); + rapidjson::Document SnapshotDocument; + SnapshotDocument.Parse(Snapshot.c_str()); + SnapshotDocument.Accept(Writer); + + Writer.EndObject(); + }); } std::string SerializeWebRtcStatus(bool Enabled, bool Available, @@ -1699,159 +1764,230 @@ std::string SerializeWebRtcStatus(bool Enabled, bool Available, std::string_view SessionId, size_t PendingLocalIceCandidateCount, const WebRtcVideoStatus &VideoStatus) { - std::ostringstream Stream; - Stream << "{\"type\":\"webrtc_status\",\"enabled\":" - << (Enabled ? "true" : "false") << ",\"available\":" - << (Available ? "true" : "false") << ",\"signalingState\":\"" - << EscapeJson(SignalingState) << "\",\"connectionState\":\"" - << EscapeJson(ConnectionState) << "\",\"detail\":\"" - << EscapeJson(Detail) << "\",\"sessionId\":\"" - << EscapeJson(SessionId) << "\",\"pendingLocalIceCandidateCount\":" - << PendingLocalIceCandidateCount << ",\"video\":{\"codec\":\"" - << EscapeJson(VideoStatus.Codec) << "\",\"senderBound\":" - << (VideoStatus.SenderBound ? "true" : "false") - << ",\"waitingForKeyframe\":" - << (VideoStatus.WaitingForKeyframe ? "true" : "false") - << ",\"hasOutstandingSendRequest\":" - << (VideoStatus.HasOutstandingSendRequest ? "true" : "false") - << ",\"pendingPacketCount\":" << VideoStatus.PendingPacketCount - << ",\"droppedPacketCount\":" << VideoStatus.DroppedPacketCount - << ",\"droppedStaleRequestCount\":" - << VideoStatus.DroppedStaleRequestCount - << ",\"droppedStalePacketCount\":" - << VideoStatus.DroppedStalePacketCount - << ",\"lastFrameIndex\":"; - if (VideoStatus.LastFrameIndex.has_value()) { - Stream << *VideoStatus.LastFrameIndex; - } else { - Stream << "null"; - } - Stream << ",\"latestRequestedFrameIndex\":"; - if (VideoStatus.LatestRequestedFrameIndex.has_value()) { - Stream << *VideoStatus.LatestRequestedFrameIndex; - } else { - Stream << "null"; - } - Stream << ",\"latestEncodedFrameIndex\":"; - if (VideoStatus.LatestEncodedFrameIndex.has_value()) { - Stream << *VideoStatus.LatestEncodedFrameIndex; - } else { - Stream << "null"; - } - Stream << ",\"lastKeyframeFrameIndex\":"; - if (VideoStatus.LastKeyframeFrameIndex.has_value()) { - Stream << *VideoStatus.LastKeyframeFrameIndex; - } else { - Stream << "null"; - } - Stream << "},\"dataChannels\":[" - << "{\"label\":\"editor-events\",\"ordered\":true," - "\"maxRetransmits\":null}," - << "{\"label\":\"viewport-input\",\"ordered\":false," - "\"maxRetransmits\":0}]}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("webrtc_status"); + Writer.Key("enabled"); + Writer.Bool(Enabled); + Writer.Key("available"); + Writer.Bool(Available); + Writer.Key("signalingState"); + WriteString(Writer, SignalingState); + Writer.Key("connectionState"); + WriteString(Writer, ConnectionState); + Writer.Key("detail"); + WriteString(Writer, Detail); + Writer.Key("sessionId"); + WriteString(Writer, SessionId); + Writer.Key("pendingLocalIceCandidateCount"); + Writer.Uint64(PendingLocalIceCandidateCount); + + Writer.Key("video"); + Writer.StartObject(); + Writer.Key("codec"); + WriteString(Writer, VideoStatus.Codec); + Writer.Key("senderBound"); + Writer.Bool(VideoStatus.SenderBound); + Writer.Key("waitingForKeyframe"); + Writer.Bool(VideoStatus.WaitingForKeyframe); + Writer.Key("hasOutstandingSendRequest"); + Writer.Bool(VideoStatus.HasOutstandingSendRequest); + Writer.Key("pendingPacketCount"); + Writer.Uint64(VideoStatus.PendingPacketCount); + Writer.Key("droppedPacketCount"); + Writer.Uint64(VideoStatus.DroppedPacketCount); + Writer.Key("droppedStaleRequestCount"); + Writer.Uint64(VideoStatus.DroppedStaleRequestCount); + Writer.Key("droppedStalePacketCount"); + Writer.Uint64(VideoStatus.DroppedStalePacketCount); + Writer.Key("lastFrameIndex"); + WriteOptionalUint64(Writer, VideoStatus.LastFrameIndex); + Writer.Key("latestRequestedFrameIndex"); + WriteOptionalUint64(Writer, VideoStatus.LatestRequestedFrameIndex); + Writer.Key("latestEncodedFrameIndex"); + WriteOptionalUint64(Writer, VideoStatus.LatestEncodedFrameIndex); + Writer.Key("lastKeyframeFrameIndex"); + WriteOptionalUint64(Writer, VideoStatus.LastKeyframeFrameIndex); + Writer.EndObject(); + + Writer.Key("dataChannels"); + Writer.StartArray(); + Writer.StartObject(); + Writer.Key("label"); + Writer.String("editor-events"); + Writer.Key("ordered"); + Writer.Bool(true); + Writer.Key("maxRetransmits"); + Writer.Null(); + Writer.EndObject(); + Writer.StartObject(); + Writer.Key("label"); + Writer.String("viewport-input"); + Writer.Key("ordered"); + Writer.Bool(false); + Writer.Key("maxRetransmits"); + Writer.Uint(0); + Writer.EndObject(); + Writer.EndArray(); + + Writer.EndObject(); + }); } std::string SerializeAssetList(const std::vector &Assets) { - std::ostringstream Stream; - Stream << "{\"type\":\"asset_list\",\"assets\":["; - for (size_t I = 0; I < Assets.size(); ++I) { - const auto &Desc = Assets[I]; - if (I > 0) - Stream << ","; - const std::string_view Kind = - Desc.Kind == Assets::AssetKind::Mesh ? "mesh" : "texture"; - Stream << "{\"id\":" << Desc.Id.Value << ",\"name\":\"" - << EscapeJson(Desc.Name) << "\",\"kind\":\"" << Kind - << "\",\"path\":\"" << EscapeJson(Desc.RelativePath) << "\"}"; - } - Stream << "]}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("asset_list"); + Writer.Key("assets"); + Writer.StartArray(); + for (const auto &Asset : Assets) { + Writer.StartObject(); + Writer.Key("id"); + Writer.Uint64(Asset.Id.Value); + Writer.Key("name"); + WriteString(Writer, Asset.Name); + Writer.Key("kind"); + WriteString(Writer, + Asset.Kind == Assets::AssetKind::Mesh ? "mesh" : "texture"); + Writer.Key("path"); + WriteString(Writer, Asset.RelativePath); + Writer.EndObject(); + } + Writer.EndArray(); + Writer.EndObject(); + }); } std::string SerializeObjectSchema(const EditorObjectDetails &Details) { - std::ostringstream Stream; - - const char *ClassName = "Unknown"; - switch (Details.Kind) { - case EditorSceneItemKind::Folder: ClassName = "Folder"; break; - case EditorSceneItemKind::Mesh: ClassName = "Mesh"; break; - case EditorSceneItemKind::Light: ClassName = "Light"; break; - case EditorSceneItemKind::Camera: ClassName = "Camera"; break; - case EditorSceneItemKind::Actor: ClassName = "Actor"; break; - } - - Stream << "{\"type\":\"object_schema\",\"objectId\":\"" - << EscapeJson(Details.ObjectId) << "\",\"className\":\"" << ClassName - << "\",\"properties\":["; - - bool First = true; - // Appends a property descriptor; Value (if non-empty) is the current value. - auto AppendProp = [&](std::string_view Name, std::string_view Type, bool ReadOnly, - std::string_view Value = {}) { - if (!First) Stream << ","; - First = false; - Stream << "{\"name\":\"" << Name << "\",\"type\":\"" << Type - << "\",\"readOnly\":" << (ReadOnly ? "true" : "false"); - if (!Value.empty()) Stream << ",\"value\":\"" << EscapeJson(Value) << "\""; - Stream << "}"; - }; + return BuildJson([&](JsonWriter &Writer) { + const char *ClassName = "Unknown"; + switch (Details.Kind) { + case EditorSceneItemKind::Folder: + ClassName = "Folder"; + break; + case EditorSceneItemKind::Mesh: + ClassName = "Mesh"; + break; + case EditorSceneItemKind::Light: + ClassName = "Light"; + break; + case EditorSceneItemKind::Camera: + ClassName = "Camera"; + break; + case EditorSceneItemKind::Actor: + ClassName = "Actor"; + break; + } + + Writer.StartObject(); + Writer.Key("type"); + Writer.String("object_schema"); + Writer.Key("objectId"); + WriteString(Writer, Details.ObjectId); + Writer.Key("className"); + Writer.String(ClassName); + Writer.Key("properties"); + Writer.StartArray(); + + auto AppendProperty = [&](std::string_view Name, std::string_view Type, + bool ReadOnly, + std::optional Value = + std::nullopt) { + Writer.StartObject(); + Writer.Key("name"); + WriteString(Writer, Name); + Writer.Key("type"); + WriteString(Writer, Type); + Writer.Key("readOnly"); + Writer.Bool(ReadOnly); + if (Value.has_value() && !Value->empty()) { + Writer.Key("value"); + WriteString(Writer, *Value); + } + Writer.EndObject(); + }; + + AppendProperty("displayName", "string", false, Details.DisplayName); + AppendProperty("visible", "bool", false); + + if (Details.SupportsTransform) { + const bool ReadOnly = Details.TransformReadOnly; + AppendProperty("location", "vec3", ReadOnly); + AppendProperty("rotationDegrees", "vec3", ReadOnly); + AppendProperty("scale", "vec3", ReadOnly); + } - AppendProp("displayName", "string", false, Details.DisplayName); - AppendProp("visible", "bool", false); - - if (Details.SupportsTransform) { - const bool RO = Details.TransformReadOnly; - AppendProp("location", "vec3", RO); - AppendProp("rotationDegrees", "vec3", RO); - AppendProp("scale", "vec3", RO); - } - - if (Details.Kind == EditorSceneItemKind::Actor) { - AppendProp("scriptClass", "string", false, - Details.ScriptClass.value_or("")); - } - - if (Details.Kind == EditorSceneItemKind::Mesh) { - const std::string_view TexPath = - (Details.Material.has_value() && Details.Material->TextureAssetPath.has_value()) - ? *Details.Material->TextureAssetPath - : std::string_view{}; - AppendProp("baseColorTexture", "texture_ref", false, TexPath); - } - - if (Details.SupportsTransform) { - const EditorPhysicsProperties Physics = - Details.Physics.value_or(EditorPhysicsProperties{}); - AppendProp("physicsBodyType", "enum", Details.TransformReadOnly, - PhysicsBodyTypeToString(Physics.BodyType)); - AppendProp("physicsColliderType", "enum", Details.TransformReadOnly, - PhysicsColliderTypeToString(Physics.ColliderType)); - AppendProp("physicsBoxHalfExtents", "vec3", Details.TransformReadOnly); - AppendProp("physicsSphereRadius", "number", Details.TransformReadOnly, - std::to_string(Physics.SphereRadius)); - AppendProp("physicsMass", "number", Details.TransformReadOnly, - std::to_string(Physics.Mass)); - AppendProp("physicsFriction", "number", Details.TransformReadOnly, - std::to_string(Physics.Friction)); - AppendProp("physicsRestitution", "number", Details.TransformReadOnly, - std::to_string(Physics.Restitution)); - } - - Stream << "]}"; - return Stream.str(); + if (Details.Kind == EditorSceneItemKind::Actor) { + AppendProperty("scriptClass", "string", false, + Details.ScriptClass.value_or("")); + } + + if (Details.Kind == EditorSceneItemKind::Mesh) { + const std::string_view TexturePath = + (Details.Material.has_value() && + Details.Material->TextureAssetPath.has_value()) + ? *Details.Material->TextureAssetPath + : std::string_view{}; + AppendProperty("baseColorTexture", "texture_ref", false, TexturePath); + } + + if (Details.SupportsTransform) { + const EditorPhysicsProperties Physics = + Details.Physics.value_or(EditorPhysicsProperties{}); + AppendProperty("physicsBodyType", "enum", Details.TransformReadOnly, + PhysicsBodyTypeToString(Physics.BodyType)); + AppendProperty("physicsColliderType", "enum", Details.TransformReadOnly, + PhysicsColliderTypeToString(Physics.ColliderType)); + AppendProperty("physicsBoxHalfExtents", "vec3", + Details.TransformReadOnly); + const auto SphereRadius = std::to_string(Physics.SphereRadius); + const auto Mass = std::to_string(Physics.Mass); + const auto Friction = std::to_string(Physics.Friction); + const auto Restitution = std::to_string(Physics.Restitution); + AppendProperty("physicsSphereRadius", "number", + Details.TransformReadOnly, SphereRadius); + AppendProperty("physicsMass", "number", Details.TransformReadOnly, Mass); + AppendProperty("physicsFriction", "number", Details.TransformReadOnly, + Friction); + AppendProperty("physicsRestitution", "number", + Details.TransformReadOnly, Restitution); + } + + Writer.EndArray(); + Writer.EndObject(); + }); } std::string SerializeSaveResult(bool Success) { - return Success ? "{\"type\":\"scene_saved\"}" - : "{\"type\":\"scene_save_failed\"}"; + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String(Success ? "scene_saved" : "scene_save_failed"); + Writer.EndObject(); + }); } std::string SerializeError(std::string_view Message) { - return std::string("{\"type\":\"error\",\"message\":\"") + - EscapeJson(Message) + "\"}"; + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("error"); + Writer.Key("message"); + WriteString(Writer, Message); + Writer.EndObject(); + }); +} + +std::string SerializeShutdown() { + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("shutdown"); + Writer.EndObject(); + }); } -std::string SerializeShutdown() { return "{\"type\":\"shutdown\"}"; } } // namespace Axiom diff --git a/Headless/HeadlessCommandProtocol.h b/Headless/HeadlessCommandProtocol.h index 91a5b69d..c1181755 100644 --- a/Headless/HeadlessCommandProtocol.h +++ b/Headless/HeadlessCommandProtocol.h @@ -136,7 +136,6 @@ std::optional ParseHeadlessOptions(int argc, char **argv, std::string &Error); std::optional ParseHeadlessCommand(std::string_view JsonLine, std::string &Error); -std::string EscapeJson(std::string_view Value); std::string SerializeEvent(const PublishedEditorEvent &Event); std::string SerializeReady(uint32_t Width, uint32_t Height); std::string SerializeConnected(); diff --git a/Headless/RemoteViewportServer.cpp b/Headless/RemoteViewportServer.cpp index f076f0fa..3b261dde 100644 --- a/Headless/RemoteViewportServer.cpp +++ b/Headless/RemoteViewportServer.cpp @@ -9,6 +9,9 @@ #include "GizmoHitTest.h" #include "HeadlessCommandProtocol.h" +#include +#include +#include #include #include #include @@ -392,226 +395,196 @@ std::string JsonResponse(std::string_view Status, std::string_view Payload) { return BuildHttpResponse(Status, "application/json; charset=utf-8", Payload); } +using JsonWriter = rapidjson::Writer; + +void WriteJsonString(JsonWriter &Writer, std::string_view Value) { + Writer.String(Value.data(), static_cast(Value.size())); +} + +template std::string BuildJson(Fn &&FnWriter) { + rapidjson::StringBuffer Buffer; + JsonWriter Writer(Buffer); + FnWriter(Writer); + return std::string(Buffer.GetString(), Buffer.GetSize()); +} + +std::string SerializeTypeOnlyJson(std::string_view Type) { + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + WriteJsonString(Writer, Type); + Writer.EndObject(); + }); +} + std::optional ExtractJsonStringField(std::string_view Body, std::string_view FieldName) { - const std::string Needle = "\"" + std::string(FieldName) + "\""; - const size_t KeyPos = Body.find(Needle); - if (KeyPos == std::string_view::npos) { + std::string MutableBody(Body); + rapidjson::Document Document; + Document.ParseInsitu(MutableBody.data()); + if (Document.HasParseError() || !Document.IsObject()) { return std::nullopt; } - const size_t ColonPos = Body.find(':', KeyPos + Needle.size()); - if (ColonPos == std::string_view::npos) { + const auto It = Document.FindMember( + std::string(FieldName).c_str()); + if (It == Document.MemberEnd() || !It->value.IsString()) { return std::nullopt; } - - size_t ValuePos = ColonPos + 1; - while (ValuePos < Body.size() && - std::isspace(static_cast(Body[ValuePos])) != 0) { - ++ValuePos; - } - if (ValuePos >= Body.size() || Body[ValuePos] != '"') { - return std::nullopt; - } - ++ValuePos; - - std::string Result; - while (ValuePos < Body.size()) { - const char Character = Body[ValuePos++]; - if (Character == '"') { - return Result; - } - if (Character == '\\') { - if (ValuePos >= Body.size()) { - return std::nullopt; - } - const char Escaped = Body[ValuePos++]; - switch (Escaped) { - case '\\': - case '"': - case '/': - Result.push_back(Escaped); - break; - case 'n': - Result.push_back('\n'); - break; - case 'r': - Result.push_back('\r'); - break; - case 't': - Result.push_back('\t'); - break; - default: - return std::nullopt; - } - continue; - } - Result.push_back(Character); - } - - return std::nullopt; -} - -std::string EscapeJsonString(std::string_view Value) { - std::string Result; - Result.reserve(Value.size() + 4); - for (const char Character : Value) { - switch (Character) { - case '\\': - Result += "\\\\"; - break; - case '"': - Result += "\\\""; - break; - case '\n': - Result += "\\n"; - break; - case '\r': - Result += "\\r"; - break; - case '\t': - Result += "\\t"; - break; - default: - Result.push_back(Character); - break; - } - } - return Result; + return std::string(It->value.GetString(), It->value.GetStringLength()); +} + +void WriteProjectJson(JsonWriter &Writer, + const Project::ProjectDescriptor &Project) { + Writer.StartObject(); + Writer.Key("projectId"); + WriteJsonString(Writer, Project.Manifest.ProjectId); + Writer.Key("name"); + WriteJsonString(Writer, Project.Manifest.Name); + Writer.Key("slug"); + WriteJsonString(Writer, Project.Manifest.Slug); + Writer.Key("rootPath"); + WriteJsonString(Writer, Project.Root.RootPath.string()); + Writer.Key("contentDir"); + WriteJsonString(Writer, Project.Root.ContentDir.string()); + Writer.Key("scriptsDir"); + WriteJsonString(Writer, Project.ScriptWorkspace.ScriptsDir.string()); + Writer.Key("scriptProjectPath"); + WriteJsonString(Writer, Project.ScriptWorkspace.ScriptProjectPath.string()); + Writer.Key("scriptSolutionPath"); + WriteJsonString(Writer, Project.ScriptWorkspace.ScriptSolutionPath.string()); + Writer.Key("scriptAssemblyName"); + WriteJsonString(Writer, Project.ScriptWorkspace.AssemblyName); + Writer.Key("scriptRootNamespace"); + WriteJsonString(Writer, Project.ScriptWorkspace.RootNamespace); + Writer.Key("starterScriptPath"); + WriteJsonString(Writer, Project.ScriptWorkspace.StarterScriptPath.string()); + Writer.Key("starterScriptClassName"); + WriteJsonString(Writer, Project.ScriptWorkspace.StarterScriptClassName); + Writer.Key("starterScriptQualifiedClassName"); + WriteJsonString(Writer, + Project.ScriptWorkspace.StarterScriptQualifiedClassName); + Writer.Key("cookedDir"); + WriteJsonString(Writer, Project.Output.CookedDir.string()); + Writer.Key("cookManifestPath"); + WriteJsonString(Writer, Project.Output.CookManifestPath.string()); + Writer.Key("buildDir"); + WriteJsonString(Writer, Project.Output.BuildDir.string()); + Writer.Key("packageDir"); + WriteJsonString(Writer, Project.Output.PackageDir.string()); + Writer.Key("packagedContentDir"); + WriteJsonString(Writer, Project.Output.PackagedContentDir.string()); + Writer.Key("packagedCookedDir"); + WriteJsonString(Writer, Project.Output.PackagedCookedDir.string()); + Writer.Key("packagedSceneAssetPath"); + WriteJsonString(Writer, Project.Output.PackagedSceneAssetPath.string()); + Writer.Key("stagedRuntimeBinaryPath"); + WriteJsonString(Writer, Project.Output.StagedRuntimeBinaryPath.string()); + Writer.Key("packageManifestPath"); + WriteJsonString(Writer, Project.Output.PackageManifestPath.string()); + Writer.Key("engineContentDir"); + WriteJsonString( + Writer, (std::filesystem::path(AXIOM_CONTENT_DIR) / "Engine").string()); + Writer.Key("sceneFilePath"); + WriteJsonString(Writer, Project.Root.SceneFilePath.string()); + Writer.EndObject(); } std::string SerializeProjectJson(const Project::ProjectDescriptor &Project) { - std::ostringstream Stream; - Stream << "{" - << "\"projectId\":\"" << EscapeJsonString(Project.Manifest.ProjectId) - << "\",\"name\":\"" << EscapeJsonString(Project.Manifest.Name) - << "\",\"slug\":\"" << EscapeJsonString(Project.Manifest.Slug) - << "\",\"rootPath\":\"" - << EscapeJsonString(Project.Root.RootPath.string()) - << "\",\"contentDir\":\"" - << EscapeJsonString(Project.Root.ContentDir.string()) - << "\",\"scriptsDir\":\"" - << EscapeJsonString(Project.ScriptWorkspace.ScriptsDir.string()) - << "\",\"scriptProjectPath\":\"" - << EscapeJsonString(Project.ScriptWorkspace.ScriptProjectPath.string()) - << "\",\"scriptSolutionPath\":\"" - << EscapeJsonString(Project.ScriptWorkspace.ScriptSolutionPath.string()) - << "\",\"scriptAssemblyName\":\"" - << EscapeJsonString(Project.ScriptWorkspace.AssemblyName) - << "\",\"scriptRootNamespace\":\"" - << EscapeJsonString(Project.ScriptWorkspace.RootNamespace) - << "\",\"starterScriptPath\":\"" - << EscapeJsonString(Project.ScriptWorkspace.StarterScriptPath.string()) - << "\",\"starterScriptClassName\":\"" - << EscapeJsonString(Project.ScriptWorkspace.StarterScriptClassName) - << "\",\"starterScriptQualifiedClassName\":\"" - << EscapeJsonString( - Project.ScriptWorkspace.StarterScriptQualifiedClassName) - << "\",\"cookedDir\":\"" - << EscapeJsonString(Project.Output.CookedDir.string()) - << "\",\"cookManifestPath\":\"" - << EscapeJsonString(Project.Output.CookManifestPath.string()) - << "\",\"buildDir\":\"" - << EscapeJsonString(Project.Output.BuildDir.string()) - << "\",\"packageDir\":\"" - << EscapeJsonString(Project.Output.PackageDir.string()) - << "\",\"packagedContentDir\":\"" - << EscapeJsonString(Project.Output.PackagedContentDir.string()) - << "\",\"packagedCookedDir\":\"" - << EscapeJsonString(Project.Output.PackagedCookedDir.string()) - << "\",\"packagedSceneAssetPath\":\"" - << EscapeJsonString(Project.Output.PackagedSceneAssetPath.string()) - << "\",\"stagedRuntimeBinaryPath\":\"" - << EscapeJsonString(Project.Output.StagedRuntimeBinaryPath.string()) - << "\",\"packageManifestPath\":\"" - << EscapeJsonString(Project.Output.PackageManifestPath.string()) - << "\",\"engineContentDir\":\"" - << EscapeJsonString((std::filesystem::path(AXIOM_CONTENT_DIR) / "Engine").string()) - << "\",\"sceneFilePath\":\"" - << EscapeJsonString(Project.Root.SceneFilePath.string()) - << "\"}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { WriteProjectJson(Writer, Project); }); } std::string SerializeProjectList( const std::vector &Projects, const std::optional &ActiveProject) { - std::ostringstream Stream; - Stream << "{\"type\":\"projects\",\"activeProjectSlug\":"; - if (ActiveProject.has_value()) { - Stream << "\"" << EscapeJsonString(ActiveProject->Manifest.Slug) << "\""; - } else { - Stream << "null"; - } - Stream << ",\"projects\":["; - for (size_t Index = 0; Index < Projects.size(); ++Index) { - if (Index > 0) { - Stream << ","; + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("projects"); + Writer.Key("activeProjectSlug"); + if (ActiveProject.has_value()) { + WriteJsonString(Writer, ActiveProject->Manifest.Slug); + } else { + Writer.Null(); } - Stream << SerializeProjectJson(Projects[Index]); - } - Stream << "]}"; - return Stream.str(); + Writer.Key("projects"); + Writer.StartArray(); + for (const auto &Project : Projects) { + WriteProjectJson(Writer, Project); + } + Writer.EndArray(); + Writer.EndObject(); + }); } std::string SerializeCurrentProject( const std::optional &ActiveProject) { - std::ostringstream Stream; - Stream << "{\"type\":\"current_project\",\"project\":"; - if (ActiveProject.has_value()) { - Stream << SerializeProjectJson(*ActiveProject); - } else { - Stream << "null"; - } - Stream << "}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("current_project"); + Writer.Key("project"); + if (ActiveProject.has_value()) { + WriteProjectJson(Writer, *ActiveProject); + } else { + Writer.Null(); + } + Writer.EndObject(); + }); } std::string SerializeProjectCookResult( const Project::ProjectDescriptor &Project, const Project::ProjectCookResult &Result) { - std::ostringstream Stream; - Stream << "{" - << "\"type\":\"project_cooked\"" - << ",\"project\":" << SerializeProjectJson(Project) - << ",\"cookedSourceAssetCount\":" << Result.CookedSourceAssetCount - << ",\"manifestEntryCount\":" << Result.ManifestEntryCount - << ",\"cookManifestPath\":\"" - << EscapeJsonString(Result.Output.CookManifestPath.string()) - << "\"}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("project_cooked"); + Writer.Key("project"); + WriteProjectJson(Writer, Project); + Writer.Key("cookedSourceAssetCount"); + Writer.Uint64(Result.CookedSourceAssetCount); + Writer.Key("manifestEntryCount"); + Writer.Uint64(Result.ManifestEntryCount); + Writer.Key("cookManifestPath"); + WriteJsonString(Writer, Result.Output.CookManifestPath.string()); + Writer.EndObject(); + }); } std::string SerializeProjectPackageResult( const Project::ProjectDescriptor &Project, const Project::ProjectPackageResult &Result) { - std::ostringstream Stream; - Stream << "{" - << "\"type\":\"project_packaged\"" - << ",\"project\":" << SerializeProjectJson(Project) - << ",\"cookedSourceAssetCount\":" << Result.Cook.CookedSourceAssetCount - << ",\"manifestEntryCount\":" << Result.Cook.ManifestEntryCount - << ",\"packagedFileCount\":" << Result.PackagedFileCount - << ",\"includedSceneAsset\":" - << (Result.IncludedSceneAsset ? "true" : "false") - << ",\"includedEngineContent\":" - << (Result.IncludedEngineContent ? "true" : "false") - << ",\"includedRuntimeBinary\":" - << (Result.IncludedRuntimeBinary ? "true" : "false") - << ",\"sceneAssetPath\":\"" - << EscapeJsonString(Result.SceneAssetPath.string()) - << "\",\"runtimeBinaryPath\":\"" - << EscapeJsonString(Result.RuntimeBinaryPath.string()) - << "\"" - << ",\"packagedContentPath\":\"" - << EscapeJsonString(Result.Cook.Output.PackagedContentDir.string()) - << "\"" - << ",\"packageDir\":\"" - << EscapeJsonString(Result.Cook.Output.PackageDir.string()) - << "\",\"packageManifestPath\":\"" - << EscapeJsonString(Result.Cook.Output.PackageManifestPath.string()) - << "\"}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("project_packaged"); + Writer.Key("project"); + WriteProjectJson(Writer, Project); + Writer.Key("cookedSourceAssetCount"); + Writer.Uint64(Result.Cook.CookedSourceAssetCount); + Writer.Key("manifestEntryCount"); + Writer.Uint64(Result.Cook.ManifestEntryCount); + Writer.Key("packagedFileCount"); + Writer.Uint64(Result.PackagedFileCount); + Writer.Key("includedSceneAsset"); + Writer.Bool(Result.IncludedSceneAsset); + Writer.Key("includedEngineContent"); + Writer.Bool(Result.IncludedEngineContent); + Writer.Key("includedRuntimeBinary"); + Writer.Bool(Result.IncludedRuntimeBinary); + Writer.Key("sceneAssetPath"); + WriteJsonString(Writer, Result.SceneAssetPath.string()); + Writer.Key("runtimeBinaryPath"); + WriteJsonString(Writer, Result.RuntimeBinaryPath.string()); + Writer.Key("packagedContentPath"); + WriteJsonString(Writer, Result.Cook.Output.PackagedContentDir.string()); + Writer.Key("packageDir"); + WriteJsonString(Writer, Result.Cook.Output.PackageDir.string()); + Writer.Key("packageManifestPath"); + WriteJsonString(Writer, Result.Cook.Output.PackageManifestPath.string()); + Writer.EndObject(); + }); } bool IsValidScriptRelativePath(std::filesystem::path RelativePath) { @@ -633,49 +606,65 @@ bool IsValidScriptRelativePath(std::filesystem::path RelativePath) { } std::string SerializeScriptListJson(const std::vector &Files) { - std::ostringstream Stream; - Stream << "{\"type\":\"scripts_list\",\"files\":["; - for (size_t Index = 0; Index < Files.size(); ++Index) { - if (Index > 0) { - Stream << ","; + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("scripts_list"); + Writer.Key("files"); + Writer.StartArray(); + for (const auto &File : Files) { + WriteJsonString(Writer, File); } - Stream << "\"" << EscapeJsonString(Files[Index]) << "\""; - } - Stream << "]}"; - return Stream.str(); + Writer.EndArray(); + Writer.EndObject(); + }); } std::string SerializeScriptFileJson(std::string_view RelativePath, std::string_view Content) { - std::ostringstream Stream; - Stream << "{\"type\":\"script_file\",\"path\":\"" - << EscapeJsonString(RelativePath) << "\",\"content\":\"" - << EscapeJsonString(Content) << "\"}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("script_file"); + Writer.Key("path"); + WriteJsonString(Writer, RelativePath); + Writer.Key("content"); + WriteJsonString(Writer, Content); + Writer.EndObject(); + }); } std::string SerializeScriptMutationJson(std::string_view MutationType, std::string_view RelativePath) { - std::ostringstream Stream; - Stream << "{\"type\":\"" << MutationType << "\",\"path\":\"" - << EscapeJsonString(RelativePath) << "\"}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + WriteJsonString(Writer, MutationType); + Writer.Key("path"); + WriteJsonString(Writer, RelativePath); + Writer.EndObject(); + }); } std::string SerializeScriptClassesJson( const std::vector> &Classes) { - std::ostringstream Stream; - Stream << "{\"type\":\"script_classes\",\"classes\":["; - for (size_t Index = 0; Index < Classes.size(); ++Index) { - if (Index > 0) { - Stream << ","; - } - Stream << "{\"className\":\"" << EscapeJsonString(Classes[Index].first) - << "\",\"path\":\"" << EscapeJsonString(Classes[Index].second) - << "\"}"; - } - Stream << "]}"; - return Stream.str(); + return BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("script_classes"); + Writer.Key("classes"); + Writer.StartArray(); + for (const auto &Entry : Classes) { + Writer.StartObject(); + Writer.Key("className"); + WriteJsonString(Writer, Entry.first); + Writer.Key("path"); + WriteJsonString(Writer, Entry.second); + Writer.EndObject(); + } + Writer.EndArray(); + Writer.EndObject(); + }); } // Loads an image file, scales it to fit within MaxDim x MaxDim (preserving @@ -1361,7 +1350,7 @@ bool RemoteViewportServer::HandlePostRequest(uintptr_t ClientSocketValue, } const std::string Response = - JsonResponse("202 Accepted", "{\"type\":\"accepted\"}"); + JsonResponse("202 Accepted", SerializeTypeOnlyJson("accepted")); SendAll(ClientSocket, Response.data(), Response.size()); return false; } @@ -2073,7 +2062,7 @@ bool RemoteViewportServer::HandleWebRtcIceCandidateRequest( } const std::string Response = - JsonResponse("202 Accepted", "{\"type\":\"accepted\"}"); + JsonResponse("202 Accepted", SerializeTypeOnlyJson("accepted")); SendAll(ClientSocket, Response.data(), Response.size()); return false; } @@ -2299,15 +2288,19 @@ bool RemoteViewportServer::HandleAssetUploadRequest( BroadcastTextMessage(SerializeAssetList(CollectVisibleAssets())); } - // Build JSON response with saved paths. - std::ostringstream Out; - Out << "{\"type\":\"assets_uploaded\",\"files\":["; - for (size_t i = 0; i < Saved.size(); ++i) { - if (i > 0) Out << ","; - Out << "\"" << EscapeJson(Saved[i]) << "\""; - } - Out << "]}"; - const std::string Response = JsonResponse("200 OK", Out.str()); + const std::string Payload = BuildJson([&](JsonWriter &Writer) { + Writer.StartObject(); + Writer.Key("type"); + Writer.String("assets_uploaded"); + Writer.Key("files"); + Writer.StartArray(); + for (const auto &SavedPath : Saved) { + WriteJsonString(Writer, SavedPath); + } + Writer.EndArray(); + Writer.EndObject(); + }); + const std::string Response = JsonResponse("200 OK", Payload); SendAll(ClientSocket, Response.data(), Response.size()); return false; } @@ -2982,7 +2975,7 @@ bool RemoteViewportServer::HandleClientWebRtcMessage(std::string_view ClientId, m_Host.ReloadUserScripts(); if (Client->WebRtcSession != nullptr) { Client->WebRtcSession->SendReliableMessage( - "{\"type\":\"scripts_reloaded\"}"); + SerializeTypeOnlyJson("scripts_reloaded")); } return true; } diff --git a/Tests/HeadlessProtocolTests.cpp b/Tests/HeadlessProtocolTests.cpp index d9aca6f6..e142fac9 100644 --- a/Tests/HeadlessProtocolTests.cpp +++ b/Tests/HeadlessProtocolTests.cpp @@ -1,10 +1,31 @@ #include +#include + #include "../Headless/HeadlessCommandProtocol.h" #include "../Headless/WebRtcSession.h" #include +namespace { + +rapidjson::Document ParseJson(const std::string &Json) { + rapidjson::Document Document; + Document.Parse(Json.c_str()); + EXPECT_FALSE(Document.HasParseError()); + EXPECT_TRUE(Document.IsObject()); + return Document; +} + +const rapidjson::Value &RequireMember(const rapidjson::Value &Object, + const char *Name) { + const auto It = Object.FindMember(Name); + EXPECT_NE(It, Object.MemberEnd()); + return It->value; +} + +} // namespace + TEST(HeadlessProtocolTests, ParsesSetLookActiveCommandWithCursorPosition) { std::string Error; const auto Command = Axiom::ParseHeadlessCommand( @@ -302,11 +323,24 @@ TEST(HeadlessProtocolTests, SerializesObjectTransformUpdatedEvent) { }}}; const std::string Json = Axiom::SerializeEvent(Event); - EXPECT_NE(Json.find("\"payloadType\":\"object_transform_updated\""), - std::string::npos); - EXPECT_NE(Json.find("\"location\":[1,2,3]"), std::string::npos); - EXPECT_NE(Json.find("\"rotationDegrees\":[4,5,6]"), std::string::npos); - EXPECT_NE(Json.find("\"scale\":[1,1.5,2]"), std::string::npos); + const rapidjson::Document Document = ParseJson(Json); + EXPECT_STREQ(RequireMember(Document, "payloadType").GetString(), + "object_transform_updated"); + const auto &Location = RequireMember(Document, "location"); + ASSERT_TRUE(Location.IsArray()); + EXPECT_FLOAT_EQ(Location[0].GetFloat(), 1.0f); + EXPECT_FLOAT_EQ(Location[1].GetFloat(), 2.0f); + EXPECT_FLOAT_EQ(Location[2].GetFloat(), 3.0f); + const auto &RotationDegrees = RequireMember(Document, "rotationDegrees"); + ASSERT_TRUE(RotationDegrees.IsArray()); + EXPECT_FLOAT_EQ(RotationDegrees[0].GetFloat(), 4.0f); + EXPECT_FLOAT_EQ(RotationDegrees[1].GetFloat(), 5.0f); + EXPECT_FLOAT_EQ(RotationDegrees[2].GetFloat(), 6.0f); + const auto &Scale = RequireMember(Document, "scale"); + ASSERT_TRUE(Scale.IsArray()); + EXPECT_FLOAT_EQ(Scale[0].GetFloat(), 1.0f); + EXPECT_FLOAT_EQ(Scale[1].GetFloat(), 1.5f); + EXPECT_FLOAT_EQ(Scale[2].GetFloat(), 2.0f); } TEST(HeadlessProtocolTests, SerializesRuntimeStateChangedEvent) { @@ -412,36 +446,52 @@ TEST(HeadlessProtocolTests, SerializesSessionSnapshot) { const std::string Json = Axiom::SerializeSessionSnapshot( State, Axiom::SessionUserId{1}, true, true, "connected", "connected"); - EXPECT_NE(Json.find("\"type\":\"session_snapshot\""), std::string::npos); - EXPECT_NE(Json.find("\"currentUserId\":1"), std::string::npos); - EXPECT_NE(Json.find("\"runtimeControllerUserId\":1"), std::string::npos); - EXPECT_NE(Json.find("\"showColliders\":true"), std::string::npos); - EXPECT_NE(Json.find("\"runtimeState\":\"edit\""), std::string::npos); - EXPECT_NE(Json.find("\"participants\""), std::string::npos); - EXPECT_NE(Json.find("\"displayName\":\"Local User\""), std::string::npos); - EXPECT_NE(Json.find("\"presenceState\":\"connected\""), std::string::npos); - EXPECT_NE(Json.find("\"selectionObjectId\":\"PlayerCharacter\""), - std::string::npos); - EXPECT_NE(Json.find("\"camera\":{\"position\":[1,2,3],\"yawDegrees\":-90"), - std::string::npos); - EXPECT_NE(Json.find("\"pitchDegrees\":0"), std::string::npos); - EXPECT_NE(Json.find("\"objectId\":\"PlayerCharacter\""), std::string::npos); - EXPECT_NE(Json.find("\"displayName\":\"World\""), std::string::npos); - EXPECT_NE(Json.find("\"kind\":\"actor\""), std::string::npos); - EXPECT_NE(Json.find("\"selectedObjectDetails\""), std::string::npos); - EXPECT_NE(Json.find("\"supportsTransform\":true"), std::string::npos); - EXPECT_NE(Json.find("\"transformReadOnly\":true"), std::string::npos); - EXPECT_NE(Json.find("\"location\":[1,2,3]"), std::string::npos); - EXPECT_NE(Json.find("\"physics\":{\"bodyType\":\"dynamic\""), - std::string::npos); - EXPECT_NE(Json.find("\"colliderType\":\"sphere\""), std::string::npos); - EXPECT_NE(Json.find("\"sphereRadius\":1.25"), std::string::npos); - EXPECT_NE(Json.find("\"mass\":3.5"), std::string::npos); - EXPECT_NE(Json.find("\"friction\":0.6"), std::string::npos); - EXPECT_NE(Json.find("\"restitution\":0.4"), std::string::npos); - EXPECT_NE(Json.find("\"selectedByUserIds\":[1]"), std::string::npos); - EXPECT_NE(Json.find("\"lockState\":\"locked\""), std::string::npos); - EXPECT_NE(Json.find("\"lockOwnerUserId\":1"), std::string::npos); + const rapidjson::Document Document = ParseJson(Json); + EXPECT_STREQ(RequireMember(Document, "type").GetString(), "session_snapshot"); + EXPECT_EQ(RequireMember(Document, "currentUserId").GetUint64(), 1u); + EXPECT_EQ(RequireMember(Document, "runtimeControllerUserId").GetUint64(), 1u); + EXPECT_TRUE(RequireMember(Document, "showColliders").GetBool()); + EXPECT_STREQ(RequireMember(Document, "runtimeState").GetString(), "edit"); + const auto &Participants = RequireMember(Document, "participants"); + ASSERT_TRUE(Participants.IsArray()); + ASSERT_FALSE(Participants.Empty()); + const auto &Participant = Participants[0]; + EXPECT_STREQ(RequireMember(Participant, "displayName").GetString(), "Local User"); + EXPECT_STREQ(RequireMember(Participant, "presenceState").GetString(), "connected"); + EXPECT_STREQ(RequireMember(Participant, "selectionObjectId").GetString(), + "PlayerCharacter"); + const auto &CameraJson = RequireMember(Participant, "camera"); + const auto &Position = RequireMember(CameraJson, "position"); + EXPECT_FLOAT_EQ(Position[0].GetFloat(), 1.0f); + EXPECT_FLOAT_EQ(Position[1].GetFloat(), 2.0f); + EXPECT_FLOAT_EQ(Position[2].GetFloat(), 3.0f); + EXPECT_FLOAT_EQ(RequireMember(CameraJson, "yawDegrees").GetFloat(), -90.0f); + EXPECT_FLOAT_EQ(RequireMember(CameraJson, "pitchDegrees").GetFloat(), 0.0f); + const auto &SelectedObjectDetails = RequireMember(Document, "selectedObjectDetails"); + EXPECT_STREQ(RequireMember(SelectedObjectDetails, "objectId").GetString(), + "PlayerCharacter"); + const auto &Capabilities = RequireMember(SelectedObjectDetails, "capabilities"); + EXPECT_TRUE(RequireMember(Capabilities, "supportsTransform").GetBool()); + EXPECT_TRUE(RequireMember(Capabilities, "transformReadOnly").GetBool()); + const auto &Transform = RequireMember(SelectedObjectDetails, "transform"); + const auto &SelectedLocation = RequireMember(Transform, "location"); + EXPECT_FLOAT_EQ(SelectedLocation[0].GetFloat(), 1.0f); + EXPECT_FLOAT_EQ(SelectedLocation[1].GetFloat(), 2.0f); + EXPECT_FLOAT_EQ(SelectedLocation[2].GetFloat(), 3.0f); + const auto &Physics = RequireMember(SelectedObjectDetails, "physics"); + EXPECT_STREQ(RequireMember(Physics, "bodyType").GetString(), "dynamic"); + EXPECT_STREQ(RequireMember(Physics, "colliderType").GetString(), "sphere"); + EXPECT_FLOAT_EQ(RequireMember(Physics, "sphereRadius").GetFloat(), 1.25f); + EXPECT_FLOAT_EQ(RequireMember(Physics, "mass").GetFloat(), 3.5f); + EXPECT_FLOAT_EQ(RequireMember(Physics, "friction").GetFloat(), 0.6f); + EXPECT_FLOAT_EQ(RequireMember(Physics, "restitution").GetFloat(), 0.4f); + const auto &Collaboration = RequireMember(SelectedObjectDetails, "collaboration"); + const auto &SelectedByUserIds = RequireMember(Collaboration, "selectedByUserIds"); + ASSERT_TRUE(SelectedByUserIds.IsArray()); + ASSERT_EQ(SelectedByUserIds.Size(), 1u); + EXPECT_EQ(SelectedByUserIds[0].GetUint64(), 1u); + EXPECT_STREQ(RequireMember(Collaboration, "lockState").GetString(), "locked"); + EXPECT_EQ(RequireMember(Collaboration, "lockOwnerUserId").GetUint64(), 1u); } TEST(HeadlessProtocolTests, SerializesSessionConnectResponse) { @@ -720,10 +770,12 @@ TEST(HeadlessProtocolTests, SerializesMaterialPropertiesChangedEvent) { }}}; const std::string Json = Axiom::SerializeEvent(Event); - EXPECT_NE(Json.find("\"payloadType\":\"material_properties_changed\""), std::string::npos); - EXPECT_NE(Json.find("\"objectId\":\"crate-1\""), std::string::npos); - EXPECT_NE(Json.find("\"metallic\":0.9"), std::string::npos); - EXPECT_NE(Json.find("\"roughness\":0.1"), std::string::npos); + const rapidjson::Document Document = ParseJson(Json); + EXPECT_STREQ(RequireMember(Document, "payloadType").GetString(), + "material_properties_changed"); + EXPECT_STREQ(RequireMember(Document, "objectId").GetString(), "crate-1"); + EXPECT_FLOAT_EQ(RequireMember(Document, "metallic").GetFloat(), 0.9f); + EXPECT_FLOAT_EQ(RequireMember(Document, "roughness").GetFloat(), 0.1f); } TEST(HeadlessProtocolTests, SerializesObjectDetailsWithMaterial) { @@ -745,10 +797,18 @@ TEST(HeadlessProtocolTests, SerializesObjectDetailsWithMaterial) { const std::string Json = Axiom::SerializeSessionSnapshot( State, Axiom::SessionUserId{1}, true, true, "connected", "connected"); - EXPECT_NE(Json.find("\"material\":{"), std::string::npos); - EXPECT_NE(Json.find("\"baseColorFactor\":[0.5,0.5,0.5,1]"), std::string::npos); - EXPECT_NE(Json.find("\"metallic\":0"), std::string::npos); - EXPECT_NE(Json.find("\"roughness\":0.5"), std::string::npos); + const rapidjson::Document Document = ParseJson(Json); + const auto &Material = RequireMember(RequireMember(Document, "selectedObjectDetails"), + "material"); + ASSERT_TRUE(Material.IsObject()); + const auto &BaseColorFactor = RequireMember(Material, "baseColorFactor"); + ASSERT_TRUE(BaseColorFactor.IsArray()); + EXPECT_FLOAT_EQ(BaseColorFactor[0].GetFloat(), 0.5f); + EXPECT_FLOAT_EQ(BaseColorFactor[1].GetFloat(), 0.5f); + EXPECT_FLOAT_EQ(BaseColorFactor[2].GetFloat(), 0.5f); + EXPECT_FLOAT_EQ(BaseColorFactor[3].GetFloat(), 1.0f); + EXPECT_FLOAT_EQ(RequireMember(Material, "metallic").GetFloat(), 0.0f); + EXPECT_FLOAT_EQ(RequireMember(Material, "roughness").GetFloat(), 0.5f); } TEST(HeadlessProtocolTests, SerializesObjectDetailsWithNullMaterialForLights) { From 9f5e322f23cb57632300788d4e43c75bb050e7ec Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 16:40:02 -0500 Subject: [PATCH 02/41] Module system --- Axiom/CMakeLists.txt | 1 + Axiom/Core/Application.cpp | 247 +++++++++++++++++++++++++++++------ Axiom/Core/Application.h | 23 +++- Axiom/Core/IModule.h | 36 +++++ Axiom/Core/ModuleManager.cpp | 148 +++++++++++++++++++++ Axiom/Core/ModuleManager.h | 63 +++++++++ Tests/CMakeLists.txt | 1 + Tests/ModuleManagerTests.cpp | 203 ++++++++++++++++++++++++++++ 8 files changed, 679 insertions(+), 43 deletions(-) create mode 100644 Axiom/Core/IModule.h create mode 100644 Axiom/Core/ModuleManager.cpp create mode 100644 Axiom/Core/ModuleManager.h create mode 100644 Tests/ModuleManagerTests.cpp diff --git a/Axiom/CMakeLists.txt b/Axiom/CMakeLists.txt index 911aa0c0..c79a825f 100644 --- a/Axiom/CMakeLists.txt +++ b/Axiom/CMakeLists.txt @@ -17,6 +17,7 @@ set(ENGINE_SOURCES Core/GlfwEditorInputSource.cpp Core/GlfwWindow.cpp Core/HeadlessWindow.cpp + Core/ModuleManager.cpp Core/Layer.cpp Core/LayerStack.cpp Core/Window.cpp diff --git a/Axiom/Core/Application.cpp b/Axiom/Core/Application.cpp index d9710cd7..dfe02f63 100644 --- a/Axiom/Core/Application.cpp +++ b/Axiom/Core/Application.cpp @@ -2,6 +2,7 @@ #include "Core/GlfwWindow.h" #include "Core/HeadlessWindow.h" +#include "Core/IModule.h" #include "Core/Log.h" #include @@ -9,42 +10,168 @@ #include namespace Axiom { +namespace { +class WindowEventsModule final : public IModule { +public: + [[nodiscard]] std::string_view GetName() const override { + return "Core.WindowEvents"; + } + + bool Initialize(Application &App) override { + (void)App; + return true; + } + + void Update(const ModuleUpdateContext &Context) override { + if (Context.Phase != ModuleUpdatePhase::FrameStart) { + return; + } + + if (Window *Window = Context.App.GetWindow(); Window != nullptr) { + Window->PollEvents(); + } + } + + void Shutdown(Application &App) override { (void)App; } +}; + +class LayerUpdateModule final : public IModule { +public: + [[nodiscard]] std::string_view GetName() const override { + return "Core.LayerUpdate"; + } + + bool Initialize(Application &App) override { + (void)App; + return true; + } + + void Update(const ModuleUpdateContext &Context) override { + if (Context.Phase != ModuleUpdatePhase::FrameStart) { + return; + } + + Context.App.ForEachLayer([](Layer *Layer) { Layer->OnUpdate(); }); + } + + void Shutdown(Application &App) override { (void)App; } +}; + +class LayerRenderModule final : public IModule { +public: + [[nodiscard]] std::string_view GetName() const override { + return "Core.LayerRender"; + } + + bool Initialize(Application &App) override { + (void)App; + return true; + } + + void Update(const ModuleUpdateContext &Context) override { + if (Context.Phase == ModuleUpdatePhase::Render) { + Context.App.ForEachLayer([](Layer *Layer) { Layer->OnRender(); }); + return; + } + + if (Context.Phase == ModuleUpdatePhase::ImGuiRender) { + Context.App.ForEachLayer([](Layer *Layer) { Layer->OnImGuiRender(); }); + } + } + + void Shutdown(Application &App) override { (void)App; } +}; + +class RendererFrameModule final : public IModule { +public: + [[nodiscard]] std::string_view GetName() const override { + return "Core.RendererFrame"; + } + + bool Initialize(Application &App) override { + (void)App; + return true; + } + + void Update(const ModuleUpdateContext &Context) override { + switch (Context.Phase) { + case ModuleUpdatePhase::FrameStart: + Context.App.GetRenderer().SetCpuFrameTime(Context.DeltaTimeSeconds * + 1000.0f); + break; + case ModuleUpdatePhase::RenderBegin: + Context.App.GetRenderer().BeginFrame(); + break; + case ModuleUpdatePhase::Render: + Context.App.GetRenderer().Render(); + break; + case ModuleUpdatePhase::RenderEnd: + Context.App.GetRenderer().EndFrame(); + break; + case ModuleUpdatePhase::ImGuiRender: + break; + } + } + + void Shutdown(Application &App) override { (void)App; } +}; +} // namespace + Application *Application::s_Instance = nullptr; Application::Application(const ApplicationConfig &Config, const ApplicationArgs &Args) - : m_Config(Config) { + : Application(Config, Args, {}) {} + +Application::Application(const ApplicationConfig &Config, + const ApplicationArgs &Args, + RuntimeDependencies Dependencies) + : m_Config(Config), + m_Window(std::move(Dependencies.Window)), + m_RenderSurface(std::move(Dependencies.RenderSurface)), + m_Renderer(std::move(Dependencies.Renderer)) { (void)Args; s_Instance = this; Log::Init(); - switch (m_Config.Mode) { - case RuntimeMode::LocalWindowedEditor: - case RuntimeMode::LocalPackagedGame: - m_Window = std::make_unique(m_Config.Title, m_Config.Width, - m_Config.Height); - m_RenderSurface = std::make_shared(*m_Window); - break; - case RuntimeMode::HeadlessEditorSession: - m_Window = std::make_unique(m_Config.Title, m_Config.Width, - m_Config.Height); - m_RenderSurface = - std::make_shared(m_Config.Width, m_Config.Height); - break; - } - - m_Renderer = std::make_unique(); - m_Renderer->Init({ - .TargetWindow = m_Window.get(), - .TargetSurface = m_RenderSurface, - .FrameOutput = m_Config.FrameOutput, - .Width = m_Window->GetWidth(), - .Height = m_Window->GetHeight(), - }); + if (m_Window == nullptr || m_RenderSurface == nullptr) { + switch (m_Config.Mode) { + case RuntimeMode::LocalWindowedEditor: + case RuntimeMode::LocalPackagedGame: + m_Window = std::make_unique(m_Config.Title, m_Config.Width, + m_Config.Height); + m_RenderSurface = std::make_shared(*m_Window); + break; + case RuntimeMode::HeadlessEditorSession: + m_Window = std::make_unique(m_Config.Title, m_Config.Width, + m_Config.Height); + m_RenderSurface = std::make_shared( + m_Config.Width, m_Config.Height); + break; + } + } + + if (m_Renderer == nullptr && Dependencies.InitializeRenderer) { + m_Renderer = std::make_unique(); + } + if (m_Renderer != nullptr && Dependencies.InitializeRenderer) { + m_Renderer->Init({ + .TargetWindow = m_Window.get(), + .TargetSurface = m_RenderSurface, + .FrameOutput = m_Config.FrameOutput, + .Width = m_Window->GetWidth(), + .Height = m_Window->GetHeight(), + }); + } + if (Dependencies.RegisterDefaultModules) { + RegisterDefaultModules(); + } + m_ModuleManager.InitializeModules(*this); m_LastFrameTime = std::chrono::steady_clock::now(); } Application::~Application() { + m_ModuleManager.ShutdownModules(*this); m_LayerStack.Clear(); m_Renderer.reset(); m_Window.reset(); @@ -59,6 +186,12 @@ Window *Application::GetWindow() const { return m_Window.get(); } void Application::PushLayer(Layer *Layer) { m_LayerStack.PushLayer(Layer); } +void Application::ForEachLayer(const std::function &Visitor) { + for (Layer *Layer : m_LayerStack) { + Visitor(Layer); + } +} + void Application::RequestClose() { if (m_Window) { m_Window->RequestClose(); @@ -89,6 +222,15 @@ void Application::Run() { } } +void Application::RegisterDefaultModules() { + m_ModuleManager.RegisterModule(std::make_unique()); + m_ModuleManager.RegisterModule(std::make_unique()); + m_ModuleManager.RegisterModule(std::make_unique()); + if (m_Renderer != nullptr) { + m_ModuleManager.RegisterModule(std::make_unique()); + } +} + size_t Application::BeginRenderPasses() { return 1u; } void Application::PrepareRenderPass(size_t PassIndex) { (void)PassIndex; } @@ -107,32 +249,53 @@ bool Application::Step() { m_DeltaTime = std::chrono::duration(Now - m_LastFrameTime).count(); m_LastFrameTime = Now; ++m_FrameIndex; - m_Renderer->SetCpuFrameTime(m_DeltaTime * 1000.0f); - - m_Window->PollEvents(); - - for (Layer *Layer : m_LayerStack) { - Layer->OnUpdate(); - } + m_ModuleManager.UpdateActiveModules({ + .App = *this, + .DeltaTimeSeconds = m_DeltaTime, + .FrameIndex = m_FrameIndex, + .Phase = ModuleUpdatePhase::FrameStart, + }); const size_t RenderPassCount = std::max(1u, BeginRenderPasses()); for (size_t PassIndex = 0; PassIndex < RenderPassCount; ++PassIndex) { PrepareRenderPass(PassIndex); - m_Renderer->BeginFrame(); - - for (Layer *Layer : m_LayerStack) { - Layer->OnRender(); - } - - m_Renderer->Render(); + const ModuleUpdateContext RenderContext{ + .App = *this, + .DeltaTimeSeconds = m_DeltaTime, + .FrameIndex = m_FrameIndex, + .Phase = ModuleUpdatePhase::RenderBegin, + .RenderPassIndex = PassIndex, + .RenderPassCount = RenderPassCount, + }; + m_ModuleManager.UpdateActiveModules(RenderContext); + m_ModuleManager.UpdateActiveModules({ + .App = *this, + .DeltaTimeSeconds = m_DeltaTime, + .FrameIndex = m_FrameIndex, + .Phase = ModuleUpdatePhase::Render, + .RenderPassIndex = PassIndex, + .RenderPassCount = RenderPassCount, + }); if (ShouldRenderImGuiForPass(PassIndex, RenderPassCount)) { - for (Layer *Layer : m_LayerStack) { - Layer->OnImGuiRender(); - } + m_ModuleManager.UpdateActiveModules({ + .App = *this, + .DeltaTimeSeconds = m_DeltaTime, + .FrameIndex = m_FrameIndex, + .Phase = ModuleUpdatePhase::ImGuiRender, + .RenderPassIndex = PassIndex, + .RenderPassCount = RenderPassCount, + }); } - m_Renderer->EndFrame(); + m_ModuleManager.UpdateActiveModules({ + .App = *this, + .DeltaTimeSeconds = m_DeltaTime, + .FrameIndex = m_FrameIndex, + .Phase = ModuleUpdatePhase::RenderEnd, + .RenderPassIndex = PassIndex, + .RenderPassCount = RenderPassCount, + }); } return !m_Window->ShouldClose(); } diff --git a/Axiom/Core/Application.h b/Axiom/Core/Application.h index 0f3c3c6d..96fe6c01 100644 --- a/Axiom/Core/Application.h +++ b/Axiom/Core/Application.h @@ -2,11 +2,13 @@ #include "Renderer/RenderSurface.h" #include "Renderer/ViewportFrameOutput.h" +#include "Core/ModuleManager.h" #include #include -#include #include +#include +#include #include #include "Core/LayerStack.h" @@ -36,6 +38,14 @@ struct ApplicationConfig { class Application { public: + struct RuntimeDependencies { + std::unique_ptr Window; + RenderSurfacePtr RenderSurface; + std::unique_ptr Renderer; + bool InitializeRenderer{true}; + bool RegisterDefaultModules{true}; + }; + Application(const ApplicationConfig &Config, const ApplicationArgs &Args); virtual ~Application(); @@ -52,17 +62,27 @@ class Application { [[nodiscard]] uint64_t GetFrameIndex() const { return m_FrameIndex; } [[nodiscard]] RuntimeMode GetRuntimeMode() const { return m_Config.Mode; } [[nodiscard]] Renderer &GetRenderer() const { return *m_Renderer; } + [[nodiscard]] ModuleManager &GetModuleManager() { return m_ModuleManager; } + [[nodiscard]] const ModuleManager &GetModuleManager() const { + return m_ModuleManager; + } void RequestClose(); void SetRendererViewMode(RendererViewMode ViewMode); void SetViewportFrameUser(SessionUserId User); void SetViewportFrameOutput(IViewportFrameOutput *FrameOutput); + void ForEachLayer(const std::function &Visitor); protected: + Application(const ApplicationConfig &Config, const ApplicationArgs &Args, + RuntimeDependencies Dependencies); + virtual size_t BeginRenderPasses(); virtual void PrepareRenderPass(size_t PassIndex); virtual bool ShouldRenderImGuiForPass(size_t PassIndex, size_t PassCount) const; + void RegisterDefaultModules(); + private: static Application *s_Instance; @@ -71,6 +91,7 @@ class Application { RenderSurfacePtr m_RenderSurface; std::unique_ptr m_Renderer; LayerStack m_LayerStack; + ModuleManager m_ModuleManager; std::chrono::steady_clock::time_point m_LastFrameTime; float m_DeltaTime{0.0f}; uint64_t m_FrameIndex{0}; diff --git a/Axiom/Core/IModule.h b/Axiom/Core/IModule.h new file mode 100644 index 00000000..6a9b1bd2 --- /dev/null +++ b/Axiom/Core/IModule.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include + +namespace Axiom { +class Application; + +enum class ModuleUpdatePhase { + FrameStart, + RenderBegin, + Render, + ImGuiRender, + RenderEnd, +}; + +struct ModuleUpdateContext { + Application &App; + float DeltaTimeSeconds{0.0f}; + uint64_t FrameIndex{0}; + ModuleUpdatePhase Phase{ModuleUpdatePhase::FrameStart}; + size_t RenderPassIndex{0}; + size_t RenderPassCount{1}; +}; + +class IModule { +public: + virtual ~IModule() = default; + + [[nodiscard]] virtual std::string_view GetName() const = 0; + virtual bool Initialize(Application &App) = 0; + virtual void Update(const ModuleUpdateContext &Context) = 0; + virtual void Shutdown(Application &App) = 0; +}; +} // namespace Axiom diff --git a/Axiom/Core/ModuleManager.cpp b/Axiom/Core/ModuleManager.cpp new file mode 100644 index 00000000..7785b7b8 --- /dev/null +++ b/Axiom/Core/ModuleManager.cpp @@ -0,0 +1,148 @@ +#include "Core/ModuleManager.h" + +#include "Core/Application.h" + +namespace Axiom { +bool ModuleManager::RegisterModule(std::unique_ptr Module, + bool ActiveByDefault) { + if (Module == nullptr) { + return false; + } + + if (HasModule(Module->GetName())) { + return false; + } + + ModuleRecord &Record = + m_Modules.emplace_back(ModuleRecord{.Module = std::move(Module), + .Lifecycle = ModuleLifecycleState::Registered, + .IsLoaded = false, + .IsActive = ActiveByDefault}); + if (m_RuntimeApplication != nullptr) { + InitializeRecord(Record, *m_RuntimeApplication); + } + return true; +} + +void ModuleManager::InitializeModules(Application &App) { + m_RuntimeApplication = &App; + for (ModuleRecord &Record : m_Modules) { + InitializeRecord(Record, App); + } +} + +void ModuleManager::UpdateActiveModules(const ModuleUpdateContext &Context) { + for (ModuleRecord &Record : m_Modules) { + if (!Record.IsLoaded || !Record.IsActive) { + continue; + } + Record.Module->Update(Context); + } +} + +void ModuleManager::ShutdownModules(Application &App) { + for (auto It = m_Modules.rbegin(); It != m_Modules.rend(); ++It) { + if (!It->IsLoaded) { + continue; + } + + It->Module->Shutdown(App); + It->IsLoaded = false; + It->Lifecycle = ModuleLifecycleState::Registered; + } + m_RuntimeApplication = nullptr; +} + +bool ModuleManager::HasModule(std::string_view Name) const { + return FindRecord(Name) != nullptr; +} + +bool ModuleManager::SetModuleActive(std::string_view Name, bool Active) { + ModuleRecord *Record = FindRecord(Name); + if (Record == nullptr) { + return false; + } + + Record->IsActive = Active; + return true; +} + +bool ModuleManager::IsModuleActive(std::string_view Name) const { + const ModuleRecord *Record = FindRecord(Name); + return Record != nullptr && Record->IsActive; +} + +std::optional ModuleManager::GetModuleState( + std::string_view Name) const { + const ModuleRecord *Record = FindRecord(Name); + if (Record == nullptr) { + return std::nullopt; + } + + return ModuleState{ + .Name = std::string(Record->Module->GetName()), + .Lifecycle = Record->Lifecycle, + .IsLoaded = Record->IsLoaded, + .IsActive = Record->IsActive, + }; +} + +std::vector ModuleManager::GetModuleStates() const { + std::vector States; + States.reserve(m_Modules.size()); + for (const ModuleRecord &Record : m_Modules) { + States.push_back({ + .Name = std::string(Record.Module->GetName()), + .Lifecycle = Record.Lifecycle, + .IsLoaded = Record.IsLoaded, + .IsActive = Record.IsActive, + }); + } + return States; +} + +IModule *ModuleManager::FindModule(std::string_view Name) { + ModuleRecord *Record = FindRecord(Name); + return Record != nullptr ? Record->Module.get() : nullptr; +} + +const IModule *ModuleManager::FindModule(std::string_view Name) const { + const ModuleRecord *Record = FindRecord(Name); + return Record != nullptr ? Record->Module.get() : nullptr; +} + +ModuleManager::ModuleRecord *ModuleManager::FindRecord(std::string_view Name) { + for (ModuleRecord &Record : m_Modules) { + if (Record.Module->GetName() == Name) { + return &Record; + } + } + return nullptr; +} + +const ModuleManager::ModuleRecord * +ModuleManager::FindRecord(std::string_view Name) const { + for (const ModuleRecord &Record : m_Modules) { + if (Record.Module->GetName() == Name) { + return &Record; + } + } + return nullptr; +} + +void ModuleManager::InitializeRecord(ModuleRecord &Record, Application &App) { + if (Record.IsLoaded || Record.Lifecycle == ModuleLifecycleState::Failed) { + return; + } + + if (!Record.Module->Initialize(App)) { + Record.Lifecycle = ModuleLifecycleState::Failed; + Record.IsLoaded = false; + Record.IsActive = false; + return; + } + + Record.Lifecycle = ModuleLifecycleState::Initialized; + Record.IsLoaded = true; +} +} // namespace Axiom diff --git a/Axiom/Core/ModuleManager.h b/Axiom/Core/ModuleManager.h new file mode 100644 index 00000000..b989cb10 --- /dev/null +++ b/Axiom/Core/ModuleManager.h @@ -0,0 +1,63 @@ +#pragma once + +#include "Core/IModule.h" + +#include +#include +#include +#include +#include + +namespace Axiom { +enum class ModuleLifecycleState { + Registered, + Initialized, + Failed, +}; + +struct ModuleState { + std::string Name; + ModuleLifecycleState Lifecycle{ModuleLifecycleState::Registered}; + bool IsLoaded{false}; + bool IsActive{false}; +}; + +class ModuleManager { +public: + ModuleManager() = default; + ~ModuleManager() = default; + + ModuleManager(const ModuleManager &) = delete; + ModuleManager &operator=(const ModuleManager &) = delete; + + bool RegisterModule(std::unique_ptr Module, + bool ActiveByDefault = true); + void InitializeModules(Application &App); + void UpdateActiveModules(const ModuleUpdateContext &Context); + void ShutdownModules(Application &App); + + bool HasModule(std::string_view Name) const; + bool SetModuleActive(std::string_view Name, bool Active); + bool IsModuleActive(std::string_view Name) const; + std::optional GetModuleState(std::string_view Name) const; + std::vector GetModuleStates() const; + + IModule *FindModule(std::string_view Name); + const IModule *FindModule(std::string_view Name) const; + +private: + struct ModuleRecord { + std::unique_ptr Module; + ModuleLifecycleState Lifecycle{ModuleLifecycleState::Registered}; + bool IsLoaded{false}; + bool IsActive{false}; + }; + + ModuleRecord *FindRecord(std::string_view Name); + const ModuleRecord *FindRecord(std::string_view Name) const; + void InitializeRecord(ModuleRecord &Record, Application &App); + + std::vector m_Modules; + Application *m_RuntimeApplication{nullptr}; +}; +} // namespace Axiom diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index b98c28c0..cd2b36ac 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -3,6 +3,7 @@ add_executable(AxiomTests LayerTests.cpp HeadlessProtocolTests.cpp MeshPickingTests.cpp + ModuleManagerTests.cpp ProjectTests.cpp SceneLifecycleTests.cpp ../Headless/HeadlessSessionLayer.cpp diff --git a/Tests/ModuleManagerTests.cpp b/Tests/ModuleManagerTests.cpp new file mode 100644 index 00000000..33464eba --- /dev/null +++ b/Tests/ModuleManagerTests.cpp @@ -0,0 +1,203 @@ +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace { +class FakeWindow final : public Axiom::Window { +public: + FakeWindow() : Window("Module Test Window", 320, 200) {} + + void PollEvents() override { ++PollCount; } + bool IsKeyPressed(int Key) const override { + (void)Key; + return false; + } + bool IsMouseButtonPressed(int Button) const override { + (void)Button; + return false; + } + void GetCursorPosition(double &X, double &Y) const override { + X = 0.0; + Y = 0.0; + } + void SetCursorMode(Axiom::CursorMode Mode) override { CursorMode = Mode; } + [[nodiscard]] Axiom::CursorMode GetCursorMode() const override { + return CursorMode; + } + [[nodiscard]] bool ShouldClose() const override { return Closed; } + void RequestClose() override { Closed = true; } + [[nodiscard]] void *GetNativeHandle() const override { return nullptr; } + + size_t PollCount{0}; + bool Closed{false}; + Axiom::CursorMode CursorMode{Axiom::CursorMode::Normal}; +}; + +class RecordingModule final : public Axiom::IModule { +public: + explicit RecordingModule(std::string Name, bool InitializeResult = true) + : m_Name(std::move(Name)), m_InitializeResult(InitializeResult) {} + + [[nodiscard]] std::string_view GetName() const override { return m_Name; } + + bool Initialize(Axiom::Application &App) override { + (void)App; + ++InitializeCalls; + return m_InitializeResult; + } + + void Update(const Axiom::ModuleUpdateContext &Context) override { + ObservedPhases.push_back(Context.Phase); + ObservedPasses.push_back(Context.RenderPassIndex); + ObservedFrameIndices.push_back(Context.FrameIndex); + } + + void Shutdown(Axiom::Application &App) override { + (void)App; + ++ShutdownCalls; + } + + size_t InitializeCalls{0}; + size_t ShutdownCalls{0}; + std::vector ObservedPhases; + std::vector ObservedPasses; + std::vector ObservedFrameIndices; + +private: + std::string m_Name; + bool m_InitializeResult{true}; +}; + +class ModuleTestApplication final : public Axiom::Application { +public: + ModuleTestApplication() + : Application( + {.Title = "Module Test App", + .Width = 320, + .Height = 200, + .Mode = Axiom::RuntimeMode::HeadlessEditorSession}, + {.Arguments = nullptr, .ArgumentCount = 0}, + {.Window = std::make_unique(), + .RenderSurface = + std::make_shared(320, 200), + .Renderer = nullptr, + .InitializeRenderer = false, + .RegisterDefaultModules = false}) {} + + void SetRenderPassCount(size_t Count) { m_RenderPassCount = Count; } + void RequestTestClose() { RequestClose(); } + + FakeWindow &GetFakeWindow() { + return static_cast(*GetWindow()); + } + +protected: + size_t BeginRenderPasses() override { return m_RenderPassCount; } + +private: + size_t m_RenderPassCount{1}; +}; + +TEST(ModuleManagerTests, TracksModuleStatesAndSupportsActivationQueries) { + ModuleTestApplication App; + + auto Primary = std::make_unique("Primary"); + RecordingModule *PrimaryPtr = Primary.get(); + EXPECT_TRUE(App.GetModuleManager().RegisterModule(std::move(Primary))); + + auto Disabled = std::make_unique("Disabled"); + RecordingModule *DisabledPtr = Disabled.get(); + EXPECT_TRUE( + App.GetModuleManager().RegisterModule(std::move(Disabled), false)); + + auto Failed = std::make_unique("Failed", false); + RecordingModule *FailedPtr = Failed.get(); + EXPECT_TRUE(App.GetModuleManager().RegisterModule(std::move(Failed))); + + ASSERT_EQ(PrimaryPtr->InitializeCalls, 1u); + ASSERT_EQ(DisabledPtr->InitializeCalls, 1u); + ASSERT_EQ(FailedPtr->InitializeCalls, 1u); + + EXPECT_TRUE(App.GetModuleManager().HasModule("Primary")); + EXPECT_TRUE(App.GetModuleManager().IsModuleActive("Primary")); + EXPECT_FALSE(App.GetModuleManager().IsModuleActive("Disabled")); + EXPECT_FALSE(App.GetModuleManager().IsModuleActive("Failed")); + + const auto PrimaryState = App.GetModuleManager().GetModuleState("Primary"); + ASSERT_TRUE(PrimaryState.has_value()); + EXPECT_TRUE(PrimaryState->IsLoaded); + EXPECT_TRUE(PrimaryState->IsActive); + EXPECT_EQ(PrimaryState->Lifecycle, + Axiom::ModuleLifecycleState::Initialized); + + const auto DisabledState = App.GetModuleManager().GetModuleState("Disabled"); + ASSERT_TRUE(DisabledState.has_value()); + EXPECT_TRUE(DisabledState->IsLoaded); + EXPECT_FALSE(DisabledState->IsActive); + + const auto FailedState = App.GetModuleManager().GetModuleState("Failed"); + ASSERT_TRUE(FailedState.has_value()); + EXPECT_FALSE(FailedState->IsLoaded); + EXPECT_FALSE(FailedState->IsActive); + EXPECT_EQ(FailedState->Lifecycle, Axiom::ModuleLifecycleState::Failed); + + const std::vector States = + App.GetModuleManager().GetModuleStates(); + ASSERT_EQ(States.size(), 3u); + EXPECT_TRUE(std::ranges::any_of(States, [](const Axiom::ModuleState &State) { + return State.Name == "Primary" && State.IsLoaded && State.IsActive; + })); + + EXPECT_TRUE(App.GetModuleManager().SetModuleActive("Disabled", true)); + EXPECT_TRUE(App.GetModuleManager().IsModuleActive("Disabled")); + + EXPECT_FALSE(App.GetModuleManager().RegisterModule( + std::make_unique("Primary"))); + EXPECT_FALSE(App.GetModuleManager().SetModuleActive("Missing", true)); +} + +TEST(ModuleManagerTests, ApplicationStepRunsThroughActiveModulesOnly) { + ModuleTestApplication App; + App.SetRenderPassCount(2); + + auto Active = std::make_unique("Active"); + RecordingModule *ActivePtr = Active.get(); + ASSERT_TRUE(App.GetModuleManager().RegisterModule(std::move(Active))); + + auto Inactive = std::make_unique("Inactive"); + RecordingModule *InactivePtr = Inactive.get(); + ASSERT_TRUE(App.GetModuleManager().RegisterModule(std::move(Inactive), false)); + + EXPECT_TRUE(App.Step()); + + ASSERT_EQ(ActivePtr->ObservedPhases.size(), 8u); + EXPECT_EQ(ActivePtr->ObservedPhases[0], Axiom::ModuleUpdatePhase::FrameStart); + EXPECT_EQ(ActivePtr->ObservedPhases[1], Axiom::ModuleUpdatePhase::RenderBegin); + EXPECT_EQ(ActivePtr->ObservedPhases[2], Axiom::ModuleUpdatePhase::Render); + EXPECT_EQ(ActivePtr->ObservedPhases[3], Axiom::ModuleUpdatePhase::RenderEnd); + EXPECT_EQ(ActivePtr->ObservedPhases[4], Axiom::ModuleUpdatePhase::RenderBegin); + EXPECT_EQ(ActivePtr->ObservedPhases[5], Axiom::ModuleUpdatePhase::Render); + EXPECT_EQ(ActivePtr->ObservedPhases[6], Axiom::ModuleUpdatePhase::ImGuiRender); + EXPECT_EQ(ActivePtr->ObservedPhases[7], Axiom::ModuleUpdatePhase::RenderEnd); + EXPECT_EQ(ActivePtr->ObservedPasses, + (std::vector{0u, 0u, 0u, 0u, 1u, 1u, 1u, 1u})); + EXPECT_TRUE(std::all_of(ActivePtr->ObservedFrameIndices.begin(), + ActivePtr->ObservedFrameIndices.end(), + [](uint64_t FrameIndex) { return FrameIndex == 1u; })); + + EXPECT_TRUE(InactivePtr->ObservedPhases.empty()); + + App.RequestTestClose(); + EXPECT_FALSE(App.Step()); +} +} // namespace From 89660e98b33204993a07ff844535fcdc23db401f Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 16:47:45 -0500 Subject: [PATCH 03/41] Subsystem boundaries split to modules --- Axiom/CMakeLists.txt | 1 + Axiom/Core/Application.cpp | 108 +----------------------------- Axiom/Core/ApplicationModules.cpp | 98 +++++++++++++++++++++++++++ Axiom/Core/ApplicationModules.h | 37 ++++++++++ Headless/CMakeLists.txt | 4 ++ Headless/HeadlessSessionHost.cpp | 39 +++++------ Headless/HeadlessSessionHost.h | 17 ++--- Headless/HeadlessSessionLayer.cpp | 4 -- Headless/HeadlessSessionLayer.h | 3 - Headless/HostModules.cpp | 90 +++++++++++++++++++++++++ Headless/HostModules.h | 60 +++++++++++++++++ Headless/PackagedRuntimeHost.cpp | 15 ++--- Headless/PackagedRuntimeHost.h | 4 +- 13 files changed, 323 insertions(+), 157 deletions(-) create mode 100644 Axiom/Core/ApplicationModules.cpp create mode 100644 Axiom/Core/ApplicationModules.h create mode 100644 Headless/HostModules.cpp create mode 100644 Headless/HostModules.h diff --git a/Axiom/CMakeLists.txt b/Axiom/CMakeLists.txt index c79a825f..bba761bf 100644 --- a/Axiom/CMakeLists.txt +++ b/Axiom/CMakeLists.txt @@ -14,6 +14,7 @@ set(ENGINE_SOURCES Assets/SceneFile.cpp Assets/SvgTexture.cpp Core/Application.cpp + Core/ApplicationModules.cpp Core/GlfwEditorInputSource.cpp Core/GlfwWindow.cpp Core/HeadlessWindow.cpp diff --git a/Axiom/Core/Application.cpp b/Axiom/Core/Application.cpp index dfe02f63..4dc3d1fe 100644 --- a/Axiom/Core/Application.cpp +++ b/Axiom/Core/Application.cpp @@ -1,8 +1,8 @@ #include "Application.h" +#include "Core/ApplicationModules.h" #include "Core/GlfwWindow.h" #include "Core/HeadlessWindow.h" -#include "Core/IModule.h" #include "Core/Log.h" #include @@ -10,112 +10,6 @@ #include namespace Axiom { -namespace { -class WindowEventsModule final : public IModule { -public: - [[nodiscard]] std::string_view GetName() const override { - return "Core.WindowEvents"; - } - - bool Initialize(Application &App) override { - (void)App; - return true; - } - - void Update(const ModuleUpdateContext &Context) override { - if (Context.Phase != ModuleUpdatePhase::FrameStart) { - return; - } - - if (Window *Window = Context.App.GetWindow(); Window != nullptr) { - Window->PollEvents(); - } - } - - void Shutdown(Application &App) override { (void)App; } -}; - -class LayerUpdateModule final : public IModule { -public: - [[nodiscard]] std::string_view GetName() const override { - return "Core.LayerUpdate"; - } - - bool Initialize(Application &App) override { - (void)App; - return true; - } - - void Update(const ModuleUpdateContext &Context) override { - if (Context.Phase != ModuleUpdatePhase::FrameStart) { - return; - } - - Context.App.ForEachLayer([](Layer *Layer) { Layer->OnUpdate(); }); - } - - void Shutdown(Application &App) override { (void)App; } -}; - -class LayerRenderModule final : public IModule { -public: - [[nodiscard]] std::string_view GetName() const override { - return "Core.LayerRender"; - } - - bool Initialize(Application &App) override { - (void)App; - return true; - } - - void Update(const ModuleUpdateContext &Context) override { - if (Context.Phase == ModuleUpdatePhase::Render) { - Context.App.ForEachLayer([](Layer *Layer) { Layer->OnRender(); }); - return; - } - - if (Context.Phase == ModuleUpdatePhase::ImGuiRender) { - Context.App.ForEachLayer([](Layer *Layer) { Layer->OnImGuiRender(); }); - } - } - - void Shutdown(Application &App) override { (void)App; } -}; - -class RendererFrameModule final : public IModule { -public: - [[nodiscard]] std::string_view GetName() const override { - return "Core.RendererFrame"; - } - - bool Initialize(Application &App) override { - (void)App; - return true; - } - - void Update(const ModuleUpdateContext &Context) override { - switch (Context.Phase) { - case ModuleUpdatePhase::FrameStart: - Context.App.GetRenderer().SetCpuFrameTime(Context.DeltaTimeSeconds * - 1000.0f); - break; - case ModuleUpdatePhase::RenderBegin: - Context.App.GetRenderer().BeginFrame(); - break; - case ModuleUpdatePhase::Render: - Context.App.GetRenderer().Render(); - break; - case ModuleUpdatePhase::RenderEnd: - Context.App.GetRenderer().EndFrame(); - break; - case ModuleUpdatePhase::ImGuiRender: - break; - } - } - - void Shutdown(Application &App) override { (void)App; } -}; -} // namespace Application *Application::s_Instance = nullptr; diff --git a/Axiom/Core/ApplicationModules.cpp b/Axiom/Core/ApplicationModules.cpp new file mode 100644 index 00000000..b86834db --- /dev/null +++ b/Axiom/Core/ApplicationModules.cpp @@ -0,0 +1,98 @@ +#include "Core/ApplicationModules.h" + +#include "Core/Application.h" + +namespace Axiom { +std::string_view WindowEventsModule::GetName() const { + return "Core.WindowEvents"; +} + +bool WindowEventsModule::Initialize(Application &App) { + (void)App; + return true; +} + +void WindowEventsModule::Update(const ModuleUpdateContext &Context) { + if (Context.Phase != ModuleUpdatePhase::FrameStart) { + return; + } + + if (Window *Window = Context.App.GetWindow(); Window != nullptr) { + Window->PollEvents(); + } +} + +void WindowEventsModule::Shutdown(Application &App) { (void)App; } + +std::string_view LayerUpdateModule::GetName() const { + return "Core.LayerUpdate"; +} + +bool LayerUpdateModule::Initialize(Application &App) { + (void)App; + return true; +} + +void LayerUpdateModule::Update(const ModuleUpdateContext &Context) { + if (Context.Phase != ModuleUpdatePhase::FrameStart) { + return; + } + + Context.App.ForEachLayer([](Layer *Layer) { Layer->OnUpdate(); }); +} + +void LayerUpdateModule::Shutdown(Application &App) { (void)App; } + +std::string_view LayerRenderModule::GetName() const { + return "Core.LayerRender"; +} + +bool LayerRenderModule::Initialize(Application &App) { + (void)App; + return true; +} + +void LayerRenderModule::Update(const ModuleUpdateContext &Context) { + if (Context.Phase == ModuleUpdatePhase::Render) { + Context.App.ForEachLayer([](Layer *Layer) { Layer->OnRender(); }); + return; + } + + if (Context.Phase == ModuleUpdatePhase::ImGuiRender) { + Context.App.ForEachLayer([](Layer *Layer) { Layer->OnImGuiRender(); }); + } +} + +void LayerRenderModule::Shutdown(Application &App) { (void)App; } + +std::string_view RendererFrameModule::GetName() const { + return "Core.RendererFrame"; +} + +bool RendererFrameModule::Initialize(Application &App) { + (void)App; + return true; +} + +void RendererFrameModule::Update(const ModuleUpdateContext &Context) { + switch (Context.Phase) { + case ModuleUpdatePhase::FrameStart: + Context.App.GetRenderer().SetCpuFrameTime(Context.DeltaTimeSeconds * + 1000.0f); + break; + case ModuleUpdatePhase::RenderBegin: + Context.App.GetRenderer().BeginFrame(); + break; + case ModuleUpdatePhase::Render: + Context.App.GetRenderer().Render(); + break; + case ModuleUpdatePhase::RenderEnd: + Context.App.GetRenderer().EndFrame(); + break; + case ModuleUpdatePhase::ImGuiRender: + break; + } +} + +void RendererFrameModule::Shutdown(Application &App) { (void)App; } +} // namespace Axiom diff --git a/Axiom/Core/ApplicationModules.h b/Axiom/Core/ApplicationModules.h new file mode 100644 index 00000000..1539d07b --- /dev/null +++ b/Axiom/Core/ApplicationModules.h @@ -0,0 +1,37 @@ +#pragma once + +#include "Core/IModule.h" + +namespace Axiom { +class WindowEventsModule final : public IModule { +public: + [[nodiscard]] std::string_view GetName() const override; + bool Initialize(Application &App) override; + void Update(const ModuleUpdateContext &Context) override; + void Shutdown(Application &App) override; +}; + +class LayerUpdateModule final : public IModule { +public: + [[nodiscard]] std::string_view GetName() const override; + bool Initialize(Application &App) override; + void Update(const ModuleUpdateContext &Context) override; + void Shutdown(Application &App) override; +}; + +class LayerRenderModule final : public IModule { +public: + [[nodiscard]] std::string_view GetName() const override; + bool Initialize(Application &App) override; + void Update(const ModuleUpdateContext &Context) override; + void Shutdown(Application &App) override; +}; + +class RendererFrameModule final : public IModule { +public: + [[nodiscard]] std::string_view GetName() const override; + bool Initialize(Application &App) override; + void Update(const ModuleUpdateContext &Context) override; + void Shutdown(Application &App) override; +}; +} // namespace Axiom diff --git a/Headless/CMakeLists.txt b/Headless/CMakeLists.txt index 6c2920a6..17707c2b 100644 --- a/Headless/CMakeLists.txt +++ b/Headless/CMakeLists.txt @@ -1,6 +1,7 @@ add_executable(AxiomHeadless AxiomHeadless.cpp HeadlessCommandProtocol.cpp + HostModules.cpp HeadlessSessionHost.cpp HeadlessSessionLayer.cpp WebRtcSession.cpp @@ -9,6 +10,7 @@ add_executable(AxiomHeadless add_executable(AxiomRemoteViewportDevClient DevRemoteViewportClient.cpp HeadlessCommandProtocol.cpp + HostModules.cpp HeadlessSessionHost.cpp HeadlessSessionLayer.cpp WebRtcSession.cpp @@ -29,6 +31,7 @@ add_executable(AxiomRemoteViewportServer AxiomRemoteViewportServer.cpp RemoteViewportServer.cpp HeadlessCommandProtocol.cpp + HostModules.cpp HeadlessSessionHost.cpp HeadlessSessionLayer.cpp WebRtcSession.cpp @@ -36,6 +39,7 @@ add_executable(AxiomRemoteViewportServer add_executable(AxiomPackagedRuntime AxiomPackagedRuntime.cpp + HostModules.cpp PackagedRuntimeHost.cpp HeadlessSessionLayer.cpp ) diff --git a/Headless/HeadlessSessionHost.cpp b/Headless/HeadlessSessionHost.cpp index 3101215a..3d0f4d2d 100644 --- a/Headless/HeadlessSessionHost.cpp +++ b/Headless/HeadlessSessionHost.cpp @@ -2,8 +2,6 @@ #include -#include - namespace Axiom { HeadlessSessionHost::HeadlessSessionHost(const ApplicationArgs &Args, uint32_t Width, uint32_t Height) @@ -23,40 +21,35 @@ HeadlessSessionHost::HeadlessSessionHost(const ApplicationArgs &Args, return std::nullopt; }); PushLayer(m_Layer); - m_Endpoint = std::make_unique(m_Layer->GetSession()); - m_Endpoint->SetVideoEncoder(CreateDefaultVideoEncoder()); m_RenderViews.EnsureLocalView(m_Layer->GetLocalUserId()); - m_FrameBridge = std::make_unique( - *m_Endpoint, [this]() -> std::optional { + auto TransportModule = std::make_unique( + m_Layer->GetSession(), [this]() -> std::optional { if (const HeadlessRenderViewState *View = GetActiveRenderView(); View != nullptr) { return *View; } return std::nullopt; }); - SetViewportFrameOutput(m_FrameBridge.get()); - m_ScriptHost.Initialize( - AXIOM_CORAL_MANAGED_DIR, - AXIOM_SCRIPTING_TRUST_RESTRICTED ? ScriptTrustProfile::Restricted - : ScriptTrustProfile::Trusted); - m_ScriptHost.LoadEngineAssembly(AXIOM_MANAGED_DIR); - m_ScriptHost.RegisterInternalCalls(m_Layer->GetSession(), - SessionId{1}, - m_Layer->GetLocalUserId()); - m_Layer->GetSession().Subscribe(&m_ScriptHost); - m_Layer->SetScriptHost(&m_ScriptHost); + m_TransportModule = TransportModule.get(); + GetModuleManager().RegisterModule(std::move(TransportModule)); + + auto ScriptingModule = std::make_unique( + "Headless.SessionScriptHost", m_Layer->GetSession(), SessionId{1}, + m_Layer->GetLocalUserId()); + m_ScriptingModule = ScriptingModule.get(); + GetModuleManager().RegisterModule(std::move(ScriptingModule)); } bool HeadlessSessionHost::Step() { return Application::Step(); } void HeadlessSessionHost::LoadUserScripts( const std::filesystem::path &AssemblyPath) { - m_ScriptHost.LoadUserAssembly(AssemblyPath); - m_ScriptHost.StartFileWatcher(); + GetScriptingModule().GetScriptHost().LoadUserAssembly(AssemblyPath); + GetScriptingModule().GetScriptHost().StartFileWatcher(); } void HeadlessSessionHost::ReloadUserScripts() { - m_ScriptHost.ReloadUserAssembly(); + GetScriptingModule().GetScriptHost().ReloadUserAssembly(); } bool HeadlessSessionHost::LoadStartupSceneIntoSession() { @@ -73,17 +66,17 @@ void HeadlessSessionHost::SubmitLocalCommand(const EditorCommand &Command) { } void HeadlessSessionHost::SubmitRemoteCommand(const EditorCommand &Command) { - m_Layer->SubmitToTransport(*m_Endpoint, Command); + m_Layer->SubmitToTransport(GetTransport(), Command); } void HeadlessSessionHost::SubmitRemoteCommand(SessionUserId User, const EditorCommand &Command) { - m_Layer->SubmitToTransport(*m_Endpoint, User, Command); + m_Layer->SubmitToTransport(GetTransport(), User, Command); } void HeadlessSessionHost::SetTransportVideoEncoder( std::unique_ptr Encoder) { - m_Endpoint->SetVideoEncoder(std::move(Encoder)); + m_TransportModule->SetVideoEncoder(std::move(Encoder)); } void HeadlessSessionHost::SetRemoteViewMode(RendererViewMode ViewMode) { diff --git a/Headless/HeadlessSessionHost.h b/Headless/HeadlessSessionHost.h index b4ec50ec..46442478 100644 --- a/Headless/HeadlessSessionHost.h +++ b/Headless/HeadlessSessionHost.h @@ -3,14 +3,12 @@ #include #include -#include #include -#include #include +#include "HostModules.h" #include "HeadlessRenderView.h" #include "HeadlessSessionLayer.h" -#include "HeadlessViewportFrameBridge.h" #include #include @@ -42,9 +40,9 @@ class HeadlessSessionHost final : public Application { const HeadlessRenderViewState *FindRenderView(SessionUserId User) const; void LoadUserScripts(const std::filesystem::path &AssemblyPath); void ReloadUserScripts(); - ISessionTransport &GetTransport() { return *m_Endpoint; } + ISessionTransport &GetTransport() { return m_TransportModule->GetTransport(); } HeadlessSessionLayer &GetHeadlessLayer() { return *m_Layer; } - ScriptHost &GetScriptHost() { return m_ScriptHost; } + ScriptHost &GetScriptHost() { return m_ScriptingModule->GetScriptHost(); } const HeadlessRenderViewRegistry &GetRenderViews() const { return m_RenderViews; } @@ -55,13 +53,16 @@ class HeadlessSessionHost final : public Application { bool ShouldRenderImGuiForPass(size_t PassIndex, size_t PassCount) const override; + SessionScriptHostModule &GetScriptingModule() const { + return *m_ScriptingModule; + } + HeadlessSessionLayer *m_Layer{nullptr}; - std::unique_ptr m_Endpoint; - std::unique_ptr m_FrameBridge; + HeadlessSessionTransportModule *m_TransportModule{nullptr}; + SessionScriptHostModule *m_ScriptingModule{nullptr}; EditorSceneRendererAdapter m_SharedRendererAdapter; HeadlessRenderViewRegistry m_RenderViews; std::vector m_ActiveRenderPassViews; size_t m_CurrentRenderPassIndex{0}; - ScriptHost m_ScriptHost; }; } // namespace Axiom diff --git a/Headless/HeadlessSessionLayer.cpp b/Headless/HeadlessSessionLayer.cpp index 3f45e883..24afff3f 100644 --- a/Headless/HeadlessSessionLayer.cpp +++ b/Headless/HeadlessSessionLayer.cpp @@ -3,7 +3,6 @@ #include "HeadlessRenderView.h" #include -#include #include #include @@ -225,9 +224,6 @@ void HeadlessSessionLayer::OnAttach() { void HeadlessSessionLayer::OnUpdate() { m_Session.Tick(Application::Get().GetDeltaTime()); - if (m_ScriptHost != nullptr) { - m_ScriptHost->Tick(Application::Get().GetDeltaTime()); - } } void HeadlessSessionLayer::OnRender() { diff --git a/Headless/HeadlessSessionLayer.h b/Headless/HeadlessSessionLayer.h index 3772edc7..567333bd 100644 --- a/Headless/HeadlessSessionLayer.h +++ b/Headless/HeadlessSessionLayer.h @@ -16,7 +16,6 @@ namespace Axiom { struct HeadlessRenderViewState; -class ScriptHost; class HeadlessSessionLayer final : public Layer { public: @@ -47,7 +46,6 @@ class HeadlessSessionLayer final : public Layer { m_ColliderBoxMesh = std::move(BoxMesh); m_ColliderSphereMesh = std::move(SphereMesh); } - void SetScriptHost(ScriptHost *Host) { m_ScriptHost = Host; } EditorSession &GetSession() { return m_Session; } SessionUserId GetLocalUserId() const { return m_LocalUserId; } @@ -70,7 +68,6 @@ class HeadlessSessionLayer final : public Layer { SessionId m_SessionId{1}; SessionUserId m_LocalUserId{1}; EditorSession m_Session; - ScriptHost *m_ScriptHost{nullptr}; EditorSceneRendererAdapter *m_RendererAdapter{nullptr}; MeshRef m_PresenceMarkerMesh; MeshRef m_ColliderBoxMesh; diff --git a/Headless/HostModules.cpp b/Headless/HostModules.cpp new file mode 100644 index 00000000..209271b1 --- /dev/null +++ b/Headless/HostModules.cpp @@ -0,0 +1,90 @@ +#include "HostModules.h" + +#include + +#include + +namespace Axiom { +HeadlessSessionTransportModule::HeadlessSessionTransportModule( + EditorSession &Session, + std::function()> ActiveViewResolver) + : m_Session(Session), + m_ActiveViewResolver(std::move(ActiveViewResolver)) {} + +std::string_view HeadlessSessionTransportModule::GetName() const { + return "Headless.SessionTransport"; +} + +bool HeadlessSessionTransportModule::Initialize(Application &App) { + m_Endpoint = std::make_unique(m_Session); + m_Endpoint->SetVideoEncoder(CreateDefaultVideoEncoder()); + m_FrameBridge = std::make_unique( + *m_Endpoint, [this]() { return m_ActiveViewResolver(); }); + App.SetViewportFrameOutput(m_FrameBridge.get()); + return true; +} + +void HeadlessSessionTransportModule::Update(const ModuleUpdateContext &Context) { + (void)Context; +} + +void HeadlessSessionTransportModule::Shutdown(Application &App) { + App.SetViewportFrameOutput(nullptr); + m_FrameBridge.reset(); + m_Endpoint.reset(); +} + +ISessionTransport &HeadlessSessionTransportModule::GetTransport() const { + return *m_Endpoint; +} + +void HeadlessSessionTransportModule::SetVideoEncoder( + std::unique_ptr Encoder) { + if (m_Endpoint != nullptr) { + m_Endpoint->SetVideoEncoder(std::move(Encoder)); + } +} + +SessionScriptHostModule::SessionScriptHostModule(std::string_view ModuleName, + EditorSession &Session, + SessionId SessionHandle, + SessionUserId LocalUserId) + : m_ModuleName(ModuleName), + m_Session(Session), + m_SessionId(SessionHandle), + m_LocalUserId(LocalUserId) {} + +std::string_view SessionScriptHostModule::GetName() const { + return m_ModuleName; +} + +bool SessionScriptHostModule::Initialize(Application &App) { + (void)App; + m_ScriptHost.Initialize( + AXIOM_CORAL_MANAGED_DIR, + AXIOM_SCRIPTING_TRUST_RESTRICTED ? ScriptTrustProfile::Restricted + : ScriptTrustProfile::Trusted); + m_ScriptHost.LoadEngineAssembly(AXIOM_MANAGED_DIR); + m_ScriptHost.RegisterInternalCalls(m_Session, m_SessionId, m_LocalUserId); + m_Session.Subscribe(&m_ScriptHost); + m_IsSubscribed = true; + return true; +} + +void SessionScriptHostModule::Update(const ModuleUpdateContext &Context) { + if (Context.Phase != ModuleUpdatePhase::FrameStart) { + return; + } + + m_ScriptHost.Tick(Context.DeltaTimeSeconds); +} + +void SessionScriptHostModule::Shutdown(Application &App) { + (void)App; + if (m_IsSubscribed) { + m_Session.Unsubscribe(&m_ScriptHost); + m_IsSubscribed = false; + } + m_ScriptHost.Shutdown(); +} +} // namespace Axiom diff --git a/Headless/HostModules.h b/Headless/HostModules.h new file mode 100644 index 00000000..225ecee3 --- /dev/null +++ b/Headless/HostModules.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "HeadlessRenderView.h" +#include "HeadlessViewportFrameBridge.h" + +#include +#include +#include +#include +#include + +namespace Axiom { +class HeadlessSessionTransportModule final : public IModule { +public: + HeadlessSessionTransportModule( + EditorSession &Session, + std::function()> ActiveViewResolver); + + [[nodiscard]] std::string_view GetName() const override; + bool Initialize(Application &App) override; + void Update(const ModuleUpdateContext &Context) override; + void Shutdown(Application &App) override; + + ISessionTransport &GetTransport() const; + void SetVideoEncoder(std::unique_ptr Encoder); + +private: + EditorSession &m_Session; + std::function()> m_ActiveViewResolver; + std::unique_ptr m_Endpoint; + std::unique_ptr m_FrameBridge; +}; + +class SessionScriptHostModule final : public IModule { +public: + SessionScriptHostModule(std::string_view ModuleName, EditorSession &Session, + SessionId SessionHandle, SessionUserId LocalUserId); + + [[nodiscard]] std::string_view GetName() const override; + bool Initialize(Application &App) override; + void Update(const ModuleUpdateContext &Context) override; + void Shutdown(Application &App) override; + + ScriptHost &GetScriptHost() { return m_ScriptHost; } + +private: + std::string m_ModuleName; + EditorSession &m_Session; + SessionId m_SessionId{}; + SessionUserId m_LocalUserId{}; + ScriptHost m_ScriptHost; + bool m_IsSubscribed{false}; +}; +} // namespace Axiom diff --git a/Headless/PackagedRuntimeHost.cpp b/Headless/PackagedRuntimeHost.cpp index 5da2d5e4..a2982b99 100644 --- a/Headless/PackagedRuntimeHost.cpp +++ b/Headless/PackagedRuntimeHost.cpp @@ -15,16 +15,11 @@ PackagedRuntimeHost::PackagedRuntimeHost(const ApplicationArgs &Args, m_Layer = new HeadlessSessionLayer(); m_Layer->SetSharedRendererAdapter(&m_RendererAdapter); PushLayer(m_Layer); - - m_ScriptHost.Initialize( - AXIOM_CORAL_MANAGED_DIR, - AXIOM_SCRIPTING_TRUST_RESTRICTED ? ScriptTrustProfile::Restricted - : ScriptTrustProfile::Trusted); - m_ScriptHost.LoadEngineAssembly(AXIOM_MANAGED_DIR); - m_ScriptHost.RegisterInternalCalls(m_Layer->GetSession(), SessionId{1}, - m_Layer->GetLocalUserId()); - m_Layer->GetSession().Subscribe(&m_ScriptHost); - m_Layer->SetScriptHost(&m_ScriptHost); + auto ScriptingModule = std::make_unique( + "PackagedRuntime.SessionScriptHost", m_Layer->GetSession(), SessionId{1}, + m_Layer->GetLocalUserId()); + m_ScriptingModule = ScriptingModule.get(); + GetModuleManager().RegisterModule(std::move(ScriptingModule)); } bool PackagedRuntimeHost::LoadPackagedProject(const std::filesystem::path &ContentDir, diff --git a/Headless/PackagedRuntimeHost.h b/Headless/PackagedRuntimeHost.h index 86d9bd58..7c5af81c 100644 --- a/Headless/PackagedRuntimeHost.h +++ b/Headless/PackagedRuntimeHost.h @@ -3,8 +3,8 @@ #include #include -#include +#include "HostModules.h" #include "HeadlessSessionLayer.h" namespace Axiom { @@ -19,8 +19,8 @@ class PackagedRuntimeHost final : public Application { private: HeadlessSessionLayer *m_Layer{nullptr}; + SessionScriptHostModule *m_ScriptingModule{nullptr}; EditorSceneRendererAdapter m_RendererAdapter; - ScriptHost m_ScriptHost; }; } // namespace Axiom From c43ecc579df2496e24abe8d51385cc8abb39acb4 Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 16:57:01 -0500 Subject: [PATCH 04/41] Editor/runtime feature modules --- Editor/CMakeLists.txt | 1 + Editor/EditorFeatureModules.cpp | 103 +++++++ Editor/EditorFeatureModules.h | 39 +++ Editor/GlfwEditorLayer.cpp | 83 +----- Editor/GlfwEditorLayer.h | 9 +- Headless/CMakeLists.txt | 4 + Headless/HeadlessOverlayModule.cpp | 360 +++++++++++++++++++++++++ Headless/HeadlessOverlayModule.h | 46 ++++ Headless/HeadlessSessionLayer.cpp | 420 +---------------------------- Headless/HeadlessSessionLayer.h | 53 ++-- Tests/CMakeLists.txt | 1 + 11 files changed, 605 insertions(+), 514 deletions(-) create mode 100644 Editor/EditorFeatureModules.cpp create mode 100644 Editor/EditorFeatureModules.h create mode 100644 Headless/HeadlessOverlayModule.cpp create mode 100644 Headless/HeadlessOverlayModule.h diff --git a/Editor/CMakeLists.txt b/Editor/CMakeLists.txt index 197032d1..f443d95f 100644 --- a/Editor/CMakeLists.txt +++ b/Editor/CMakeLists.txt @@ -1,4 +1,5 @@ add_executable(AxiomEditor + EditorFeatureModules.cpp EditorApplication.cpp GlfwEditorLayer.cpp ) diff --git a/Editor/EditorFeatureModules.cpp b/Editor/EditorFeatureModules.cpp new file mode 100644 index 00000000..51d2cbbf --- /dev/null +++ b/Editor/EditorFeatureModules.cpp @@ -0,0 +1,103 @@ +#include "EditorFeatureModules.h" + +#include +#include +#include +#include +#include +#include + +#define GLFW_INCLUDE_NONE +#include + +namespace Axiom { +void EditorViewportInputModule::Initialize(Window &Window, float MoveSpeed) { + m_WindowInputPlatform = std::make_unique(Window); + m_InputSource = + std::make_unique(*m_WindowInputPlatform, MoveSpeed); +} + +void EditorViewportInputModule::Shutdown() { + if (m_WindowInputPlatform != nullptr) { + m_WindowInputPlatform->SetCursorMode(CursorMode::Normal); + } + m_InputSource.reset(); + m_WindowInputPlatform.reset(); +} + +void EditorViewportInputModule::Tick(EditorSession &Session, + SessionId SessionHandle, + SessionUserId LocalUserId) { + const EditorViewportState *Viewport = Session.FindViewport(LocalUserId); + if (m_InputSource != nullptr) { + m_InputSource->Tick({ + .Session = SessionHandle, + .User = LocalUserId, + .FrameIndex = Application::Get().GetFrameIndex(), + .DeltaTimeSeconds = Application::Get().GetDeltaTime(), + .Viewport = Viewport, + .CommandSink = &Session, + }); + } + + if (m_InputSource != nullptr) { + m_InputSource->SyncViewport(Session.FindViewport(LocalUserId)); + } +} + +void EditorViewportSelectionModule::Tick(EditorSession &Session, + SessionId SessionHandle, + SessionUserId LocalUserId, + IInputPlatform *InputPlatform, + const Window *Window, + bool &LastLeftMouseDown) { + const EditorViewportState *Viewport = Session.FindViewport(LocalUserId); + const bool IsLeftDown = InputPlatform != nullptr && + InputPlatform->IsMouseButtonPressed(GLFW_MOUSE_BUTTON_LEFT); + const bool ClickedNow = IsLeftDown && !LastLeftMouseDown; + LastLeftMouseDown = IsLeftDown; + + if (!ClickedNow || Viewport == nullptr || Viewport->IsLooking || + InputPlatform == nullptr || Window == nullptr) { + return; + } + + const glm::dvec2 CursorPos = InputPlatform->GetCursorPosition(); + const std::string HitId = + HitTestMeshes(Viewport->Camera, Window->GetWidth(), Window->GetHeight(), + glm::vec2(CursorPos), Session.GetState().Scene.MeshInstances); + if (HitId.empty()) { + return; + } + + const CommandContext Context{ + .Session = SessionHandle, + .User = LocalUserId, + .FrameIndex = Application::Get().GetFrameIndex(), + .DeltaTimeSeconds = Application::Get().GetDeltaTime(), + }; + Session.Submit(Context, EditorCommand{SelectObjectCommand{.ObjectId = HitId}}); +} + +void EditorSceneRenderModule::Render(EditorSession &Session, + SessionUserId LocalUserId, + EditorSceneRendererAdapter &RendererAdapter) { + const EditorViewportState *Viewport = Session.FindViewport(LocalUserId); + if (Viewport == nullptr) { + return; + } + + RenderCommand::SetCamera(Viewport->Camera); + for (const auto &Submission : RendererAdapter.BuildRenderSubmissions(Session)) { + RenderCommand::Submit(Submission); + } + + const EditorObjectDetails *Selected = + Session.FindSelectedObjectDetails(LocalUserId); + if (Selected != nullptr && Selected->SupportsTransform && + Selected->Transform.has_value()) { + RenderCommand::SetGizmoOverlay( + {.WorldPosition = Selected->Transform->Location, .Scale = 0.5f}); + } +} +} // namespace Axiom diff --git a/Editor/EditorFeatureModules.h b/Editor/EditorFeatureModules.h new file mode 100644 index 00000000..2229c1aa --- /dev/null +++ b/Editor/EditorFeatureModules.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace Axiom { +class Window; + +class EditorViewportInputModule { +public: + void Initialize(Window &Window, float MoveSpeed); + void Shutdown(); + void Tick(EditorSession &Session, SessionId SessionHandle, + SessionUserId LocalUserId); + + IInputPlatform *GetInputPlatform() const { return m_WindowInputPlatform.get(); } + +private: + std::unique_ptr m_WindowInputPlatform; + std::unique_ptr m_InputSource; +}; + +class EditorViewportSelectionModule { +public: + void Tick(EditorSession &Session, SessionId SessionHandle, + SessionUserId LocalUserId, IInputPlatform *InputPlatform, + const Window *Window, bool &LastLeftMouseDown); +}; + +class EditorSceneRenderModule { +public: + void Render(EditorSession &Session, SessionUserId LocalUserId, + EditorSceneRendererAdapter &RendererAdapter); +}; +} // namespace Axiom diff --git a/Editor/GlfwEditorLayer.cpp b/Editor/GlfwEditorLayer.cpp index 9fcf7199..b60f81cb 100644 --- a/Editor/GlfwEditorLayer.cpp +++ b/Editor/GlfwEditorLayer.cpp @@ -1,15 +1,7 @@ #include "GlfwEditorLayer.h" #include -#include #include -#include - -#define GLFW_INCLUDE_NONE -#include - -#include -#include #include namespace Axiom { @@ -20,83 +12,22 @@ void GlfwEditorLayer::OnAttach() { m_Session.EnsureViewportState(m_LocalUserId); Window *Window = Application::Get().GetWindow(); if (Window != nullptr) { - m_WindowInputPlatform = std::make_unique(*Window); - m_InputSource = - std::make_unique(*m_WindowInputPlatform, - m_MoveSpeed); + m_InputModule.Initialize(*Window, m_MoveSpeed); } LoadStartupScene(m_Session); } -void GlfwEditorLayer::OnDetach() { - if (m_WindowInputPlatform != nullptr) { - m_WindowInputPlatform->SetCursorMode(CursorMode::Normal); - } -} +void GlfwEditorLayer::OnDetach() { m_InputModule.Shutdown(); } void GlfwEditorLayer::OnUpdate() { - const EditorViewportState *Viewport = m_Session.FindViewport(m_LocalUserId); - if (m_InputSource != nullptr) { - m_InputSource->Tick({ - .Session = m_SessionId, - .User = m_LocalUserId, - .FrameIndex = Application::Get().GetFrameIndex(), - .DeltaTimeSeconds = Application::Get().GetDeltaTime(), - .Viewport = Viewport, - .CommandSink = &m_Session, - }); - } + m_InputModule.Tick(m_Session, m_SessionId, m_LocalUserId); m_Session.Tick(); - - // Left-click mesh picking — detect rising edge to select on click, not hold. - { - const bool IsLeftDown = m_WindowInputPlatform != nullptr && - m_WindowInputPlatform->IsMouseButtonPressed(GLFW_MOUSE_BUTTON_LEFT); - const bool ClickedNow = IsLeftDown && !m_LastLeftMouseDown; - m_LastLeftMouseDown = IsLeftDown; - - if (ClickedNow && Viewport != nullptr && !Viewport->IsLooking) { - const Window *Win = Application::Get().GetWindow(); - if (Win != nullptr) { - const glm::dvec2 CursorPos = m_WindowInputPlatform->GetCursorPosition(); - const std::string HitId = HitTestMeshes( - Viewport->Camera, Win->GetWidth(), Win->GetHeight(), - glm::vec2(CursorPos), m_Session.GetState().Scene.MeshInstances); - if (!HitId.empty()) { - const CommandContext Ctx{ - .Session = m_SessionId, - .User = m_LocalUserId, - .FrameIndex = Application::Get().GetFrameIndex(), - .DeltaTimeSeconds = Application::Get().GetDeltaTime(), - }; - m_Session.Submit(Ctx, EditorCommand{SelectObjectCommand{.ObjectId = HitId}}); - } - } - } - } - - if (m_InputSource != nullptr) { - m_InputSource->SyncViewport(m_Session.FindViewport(m_LocalUserId)); - } + m_SelectionModule.Tick(m_Session, m_SessionId, m_LocalUserId, + m_InputModule.GetInputPlatform(), + Application::Get().GetWindow(), m_LastLeftMouseDown); } void GlfwEditorLayer::OnRender() { - const EditorViewportState *Viewport = m_Session.FindViewport(m_LocalUserId); - if (Viewport == nullptr) { - return; - } - - RenderCommand::SetCamera(Viewport->Camera); - for (const auto &Submission : m_RendererAdapter.BuildRenderSubmissions(m_Session)) { - RenderCommand::Submit(Submission); - } - - const EditorObjectDetails *Selected = - m_Session.FindSelectedObjectDetails(m_LocalUserId); - if (Selected != nullptr && Selected->SupportsTransform && - Selected->Transform.has_value()) { - RenderCommand::SetGizmoOverlay( - {.WorldPosition = Selected->Transform->Location, .Scale = 0.5f}); - } + m_RenderModule.Render(m_Session, m_LocalUserId, m_RendererAdapter); } } // namespace Axiom diff --git a/Editor/GlfwEditorLayer.h b/Editor/GlfwEditorLayer.h index 09e5984d..3dba3f0f 100644 --- a/Editor/GlfwEditorLayer.h +++ b/Editor/GlfwEditorLayer.h @@ -4,8 +4,8 @@ #include -#include -#include +#include "EditorFeatureModules.h" + #include #include @@ -24,8 +24,9 @@ class GlfwEditorLayer final : public Layer { SessionUserId m_LocalUserId{1}; EditorSession m_Session; EditorSceneRendererAdapter m_RendererAdapter; - std::unique_ptr m_WindowInputPlatform; - std::unique_ptr m_InputSource; + EditorViewportInputModule m_InputModule; + EditorViewportSelectionModule m_SelectionModule; + EditorSceneRenderModule m_RenderModule; float m_MoveSpeed{3.5f}; bool m_LastLeftMouseDown{false}; }; diff --git a/Headless/CMakeLists.txt b/Headless/CMakeLists.txt index 17707c2b..b136523f 100644 --- a/Headless/CMakeLists.txt +++ b/Headless/CMakeLists.txt @@ -1,6 +1,7 @@ add_executable(AxiomHeadless AxiomHeadless.cpp HeadlessCommandProtocol.cpp + HeadlessOverlayModule.cpp HostModules.cpp HeadlessSessionHost.cpp HeadlessSessionLayer.cpp @@ -10,6 +11,7 @@ add_executable(AxiomHeadless add_executable(AxiomRemoteViewportDevClient DevRemoteViewportClient.cpp HeadlessCommandProtocol.cpp + HeadlessOverlayModule.cpp HostModules.cpp HeadlessSessionHost.cpp HeadlessSessionLayer.cpp @@ -31,6 +33,7 @@ add_executable(AxiomRemoteViewportServer AxiomRemoteViewportServer.cpp RemoteViewportServer.cpp HeadlessCommandProtocol.cpp + HeadlessOverlayModule.cpp HostModules.cpp HeadlessSessionHost.cpp HeadlessSessionLayer.cpp @@ -39,6 +42,7 @@ add_executable(AxiomRemoteViewportServer add_executable(AxiomPackagedRuntime AxiomPackagedRuntime.cpp + HeadlessOverlayModule.cpp HostModules.cpp PackagedRuntimeHost.cpp HeadlessSessionLayer.cpp diff --git a/Headless/HeadlessOverlayModule.cpp b/Headless/HeadlessOverlayModule.cpp new file mode 100644 index 00000000..0d038709 --- /dev/null +++ b/Headless/HeadlessOverlayModule.cpp @@ -0,0 +1,360 @@ +#include "HeadlessOverlayModule.h" + +#include +#include + +#include +#include + +#include +#include + +namespace Axiom { +namespace { +constexpr float ColliderOverlayScale = 1.01f; +constexpr float ColliderCornerScale = 0.085f; + +MeshData BuildPresenceMarkerMeshData() { + MeshData Mesh{}; + Mesh.Vertices = { + {.Position = {-0.35f, -0.2f, 0.5f, 1.0f}}, + {.Position = {0.35f, -0.2f, 0.5f, 1.0f}}, + {.Position = {0.35f, 0.2f, 0.5f, 1.0f}}, + {.Position = {-0.35f, 0.2f, 0.5f, 1.0f}}, + {.Position = {0.0f, 0.0f, -0.9f, 1.0f}}, + }; + Mesh.Indices = {0, 1, 2, 0, 2, 3, 0, 1, 4, 1, 2, 4, 2, 3, 4, 3, 0, 4}; + Mesh.BoundsMin = {-0.35f, -0.2f, -0.9f}; + Mesh.BoundsMax = {0.35f, 0.2f, 0.5f}; + return Mesh; +} + +MeshData BuildUnitBoxMeshData() { + MeshData Mesh{}; + Mesh.Vertices = { + {.Position = {-1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 0.0f, 1.0f, 0.0f}}, + {.Position = {1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 0.0f, 1.0f, 0.0f}}, + {.Position = {1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 0.0f, 1.0f, 0.0f}}, + {.Position = {-1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 0.0f, 1.0f, 0.0f}}, + {.Position = {-1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 0.0f, -1.0f, 0.0f}}, + {.Position = {1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 0.0f, -1.0f, 0.0f}}, + {.Position = {1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 0.0f, -1.0f, 0.0f}}, + {.Position = {-1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 0.0f, -1.0f, 0.0f}}, + {.Position = {-1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {-1.0f, 0.0f, 0.0f, 0.0f}}, + {.Position = {-1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {-1.0f, 0.0f, 0.0f, 0.0f}}, + {.Position = {-1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {-1.0f, 0.0f, 0.0f, 0.0f}}, + {.Position = {-1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {-1.0f, 0.0f, 0.0f, 0.0f}}, + {.Position = {1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {1.0f, 0.0f, 0.0f, 0.0f}}, + {.Position = {1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {1.0f, 0.0f, 0.0f, 0.0f}}, + {.Position = {1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {1.0f, 0.0f, 0.0f, 0.0f}}, + {.Position = {1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {1.0f, 0.0f, 0.0f, 0.0f}}, + {.Position = {-1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 1.0f, 0.0f, 0.0f}}, + {.Position = {-1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 1.0f, 0.0f, 0.0f}}, + {.Position = {1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 1.0f, 0.0f, 0.0f}}, + {.Position = {1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 1.0f, 0.0f, 0.0f}}, + {.Position = {-1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {0.0f, -1.0f, 0.0f, 0.0f}}, + {.Position = {-1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {0.0f, -1.0f, 0.0f, 0.0f}}, + {.Position = {1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {0.0f, -1.0f, 0.0f, 0.0f}}, + {.Position = {1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {0.0f, -1.0f, 0.0f, 0.0f}}, + }; + Mesh.Indices = { + 0, 1, 2, 0, 2, 3, 4, 6, 5, 4, 7, 6, 8, 9, 10, 8, 10, 11, + 12, 14, 13, 12, 15, 14, 16, 17, 18, 16, 18, 19, 20, 22, 21, 20, 23, 22, + }; + Mesh.BoundsMin = {-1.0f, -1.0f, -1.0f}; + Mesh.BoundsMax = {1.0f, 1.0f, 1.0f}; + return Mesh; +} + +MeshData BuildUnitSphereMeshData(uint32_t LongitudeSegments = 16, + uint32_t LatitudeSegments = 10) { + MeshData Mesh{}; + Mesh.Vertices.reserve(static_cast(LongitudeSegments + 1) * + static_cast(LatitudeSegments + 1)); + for (uint32_t Lat = 0; Lat <= LatitudeSegments; ++Lat) { + const float V = static_cast(Lat) / static_cast(LatitudeSegments); + const float Theta = V * std::numbers::pi_v; + const float SinTheta = std::sin(Theta); + const float CosTheta = std::cos(Theta); + for (uint32_t Lon = 0; Lon <= LongitudeSegments; ++Lon) { + const float U = static_cast(Lon) / static_cast(LongitudeSegments); + const float Phi = U * std::numbers::pi_v * 2.0f; + const float SinPhi = std::sin(Phi); + const float CosPhi = std::cos(Phi); + const glm::vec3 Normal{SinTheta * CosPhi, CosTheta, SinTheta * SinPhi}; + Mesh.Vertices.push_back({ + .Position = glm::vec4(Normal, 1.0f), + .Normal = glm::vec4(glm::normalize(Normal), 0.0f), + .TexCoord = {U, V}, + }); + } + } + const uint32_t Stride = LongitudeSegments + 1; + for (uint32_t Lat = 0; Lat < LatitudeSegments; ++Lat) { + for (uint32_t Lon = 0; Lon < LongitudeSegments; ++Lon) { + const uint32_t A = Lat * Stride + Lon; + const uint32_t B = A + Stride; + const uint32_t C = A + 1; + const uint32_t D = B + 1; + Mesh.Indices.insert(Mesh.Indices.end(), {A, B, C, C, B, D}); + } + } + Mesh.BoundsMin = {-1.0f, -1.0f, -1.0f}; + Mesh.BoundsMax = {1.0f, 1.0f, 1.0f}; + return Mesh; +} + +glm::vec4 ParseHexColor(std::string_view Hex) { + if (Hex.size() != 7 || Hex.front() != '#') { + return {1.0f, 1.0f, 1.0f, 1.0f}; + } + auto ParseChannel = [](char High, char Low) -> uint8_t { + auto ToNibble = [](char Value) -> uint8_t { + if (Value >= '0' && Value <= '9') return static_cast(Value - '0'); + if (Value >= 'a' && Value <= 'f') return static_cast(10 + Value - 'a'); + if (Value >= 'A' && Value <= 'F') return static_cast(10 + Value - 'A'); + return 0; + }; + return static_cast((ToNibble(High) << 4u) | ToNibble(Low)); + }; + return {ParseChannel(Hex[1], Hex[2]) / 255.0f, + ParseChannel(Hex[3], Hex[4]) / 255.0f, + ParseChannel(Hex[5], Hex[6]) / 255.0f, 1.0f}; +} + +glm::mat4 BuildPresenceTransform(const EditorParticipant::CameraState &Camera) { + Axiom::Camera OrientedCamera; + OrientedCamera.SetRotation(Camera.YawDegrees, Camera.PitchDegrees); + glm::mat4 Transform(1.0f); + Transform[0] = glm::vec4(OrientedCamera.GetRight(), 0.0f); + Transform[1] = glm::vec4(OrientedCamera.GetUp(), 0.0f); + Transform[2] = glm::vec4(OrientedCamera.GetForward(), 0.0f); + Transform[3] = glm::vec4(Camera.Position, 1.0f); + return Transform * glm::scale(glm::mat4(1.0f), glm::vec3(0.35f)); +} + +glm::mat4 BuildTransformMatrix(const EditorTransformDetails &Transform) { + glm::mat4 Matrix = glm::translate(glm::mat4(1.0f), Transform.Location); + Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.y), + glm::vec3(0.0f, 1.0f, 0.0f)); + Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.x), + glm::vec3(1.0f, 0.0f, 0.0f)); + Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.z), + glm::vec3(0.0f, 0.0f, 1.0f)); + return glm::scale(Matrix, Transform.Scale); +} + +const EditorTransformDetails *GetEffectiveTransform(const EditorObjectDetails &Details) { + if (Details.WorldTransform.has_value()) return &*Details.WorldTransform; + if (Details.Transform.has_value()) return &*Details.Transform; + return nullptr; +} + +bool HasRenderableCollider(const EditorObjectDetails &Details) { + return Details.Visible && Details.Physics.has_value() && + Details.Physics->BodyType != EditorPhysicsBodyType::None && + Details.Physics->ColliderType != EditorPhysicsColliderType::None && + GetEffectiveTransform(Details) != nullptr; +} +} // namespace + +HeadlessOverlayModule::HeadlessOverlayModule(EditorSession &Session) + : m_Session(Session) {} + +void HeadlessOverlayModule::Initialize() { + m_PresenceMarkerMesh = Renderer::Get().CreateMesh(BuildPresenceMarkerMeshData()); + m_ColliderBoxMesh = Renderer::Get().CreateMesh(BuildUnitBoxMeshData()); + m_ColliderSphereMesh = Renderer::Get().CreateMesh(BuildUnitSphereMeshData()); +} + +void HeadlessOverlayModule::SetPresenceMarkerMeshForTesting(MeshRef Mesh) { + m_PresenceMarkerMesh = std::move(Mesh); +} + +void HeadlessOverlayModule::SetColliderMeshesForTesting(MeshRef BoxMesh, + MeshRef SphereMesh) { + m_ColliderBoxMesh = std::move(BoxMesh); + m_ColliderSphereMesh = std::move(SphereMesh); +} + +void HeadlessOverlayModule::SetGizmoHoveredAxis(SessionUserId User, int Axis) { + std::lock_guard Lock(m_GizmoHoverMutex); + m_GizmoHoveredAxisByUser[User.Value] = Axis; +} + +int HeadlessOverlayModule::GetGizmoHoveredAxis(SessionUserId User) const { + std::lock_guard Lock(m_GizmoHoverMutex); + const auto It = m_GizmoHoveredAxisByUser.find(User.Value); + return It != m_GizmoHoveredAxisByUser.end() ? It->second : -1; +} + +void HeadlessOverlayModule::SetGizmoMode(SessionUserId User, GizmoMode Mode) { + std::lock_guard Lock(m_GizmoModeMutex); + m_GizmoModeByUser[User.Value] = Mode; +} + +GizmoMode HeadlessOverlayModule::GetGizmoMode(SessionUserId User) const { + std::lock_guard Lock(m_GizmoModeMutex); + const auto It = m_GizmoModeByUser.find(User.Value); + return It != m_GizmoModeByUser.end() ? It->second : GizmoMode::Translate; +} + +std::vector HeadlessOverlayModule::BuildLightBillboards() const { + std::vector Result; + for (const auto &[Id, Details] : m_Session.GetState().Scene.ObjectDetailsById) { + (void)Id; + if (Details.Kind != EditorSceneItemKind::Light || !Details.Visible || + !Details.Light.has_value()) { + continue; + } + const EditorTransformDetails *EffectiveTransform = + Details.WorldTransform.has_value() ? &*Details.WorldTransform + : Details.Transform.has_value() ? &*Details.Transform + : nullptr; + Result.push_back({ + .ObjectId = Details.ObjectId, + .WorldPosition = EffectiveTransform != nullptr + ? EffectiveTransform->Location + : glm::vec3(0.0f), + .Color = glm::vec4(Details.Light->Color, 1.0f), + .PixelSize = 48.0f, + }); + } + return Result; +} + +std::vector +HeadlessOverlayModule::BuildColliderOverlaySubmissions() const { + std::vector Result; + for (const auto &[Id, Details] : m_Session.GetState().Scene.ObjectDetailsById) { + (void)Id; + if (!HasRenderableCollider(Details)) { + continue; + } + const EditorTransformDetails &Transform = *GetEffectiveTransform(Details); + const EditorPhysicsProperties &Physics = *Details.Physics; + MeshRef ColliderMesh; + glm::mat4 ColliderTransform = BuildTransformMatrix(Transform); + if (Physics.ColliderType == EditorPhysicsColliderType::Box) { + if (m_ColliderBoxMesh == nullptr) continue; + ColliderMesh = m_ColliderBoxMesh; + ColliderTransform *= glm::scale(glm::mat4(1.0f), + Physics.BoxHalfExtents * ColliderOverlayScale); + } else if (Physics.ColliderType == EditorPhysicsColliderType::Sphere) { + if (m_ColliderSphereMesh == nullptr) continue; + ColliderMesh = m_ColliderSphereMesh; + ColliderTransform *= glm::scale( + glm::mat4(1.0f), glm::vec3(Physics.SphereRadius * ColliderOverlayScale)); + } else { + continue; + } + Result.push_back({ + .Mesh = ColliderMesh, + .Material = GetOrCreateColliderMaterial(Physics.BodyType), + .Name = Details.ObjectId + "-collider", + .RenderPath = MeshRenderPath::Graphics, + .Transform = ColliderTransform, + .Translucent = true, + }); + if (m_ColliderBoxMesh == nullptr) continue; + const glm::vec3 HalfExtents = + Physics.ColliderType == EditorPhysicsColliderType::Box + ? Physics.BoxHalfExtents * ColliderOverlayScale + : glm::vec3(Physics.SphereRadius * ColliderOverlayScale); + for (int X = -1; X <= 1; X += 2) { + for (int Y = -1; Y <= 1; Y += 2) { + for (int Z = -1; Z <= 1; Z += 2) { + const glm::vec3 LocalOffset = + glm::vec3(static_cast(X), static_cast(Y), + static_cast(Z)) * HalfExtents; + glm::mat4 CornerTransform = + BuildTransformMatrix(Transform) * + glm::translate(glm::mat4(1.0f), LocalOffset) * + glm::scale(glm::mat4(1.0f), glm::vec3(std::max( + 0.03f, + std::max(HalfExtents.x, + std::max(HalfExtents.y, + HalfExtents.z)) * + ColliderCornerScale))); + Result.push_back({ + .Mesh = m_ColliderBoxMesh, + .Material = GetOrCreateColliderMaterial(Physics.BodyType), + .Name = Details.ObjectId + "-collider-corner", + .RenderPath = MeshRenderPath::Graphics, + .Transform = CornerTransform, + .Translucent = false, + }); + } + } + } + } + return Result; +} + +std::vector +HeadlessOverlayModule::BuildPresenceOverlaySubmissions(SessionUserId RenderUser) const { + std::vector Result; + if (m_PresenceMarkerMesh == nullptr) { + return Result; + } + const std::vector Participants = + m_Session.BuildParticipants(RenderUser); + for (const EditorParticipant &Participant : Participants) { + if (Participant.User.Value == 1 || Participant.User.Value == RenderUser.Value || + Participant.State != EditorUserPresenceState::Connected || + !Participant.Camera.has_value()) { + continue; + } + Result.push_back({ + .Mesh = m_PresenceMarkerMesh, + .Material = GetOrCreatePresenceMaterial(Participant.User), + .Name = "participant-camera-" + std::to_string(Participant.User.Value), + .RenderPath = MeshRenderPath::Graphics, + .Transform = BuildPresenceTransform(*Participant.Camera), + }); + } + return Result; +} + +MaterialInstanceRef +HeadlessOverlayModule::GetOrCreatePresenceMaterial(SessionUserId User) const { + const auto Existing = m_PresenceMaterials.find(User.Value); + if (Existing != m_PresenceMaterials.end()) { + return Existing->second; + } + const EditorParticipant Participant = m_Session.BuildParticipant(User); + const glm::vec4 Color = ParseHexColor(Participant.PresentationColor); + auto Texture = std::make_shared(); + Texture->Width = 1; + Texture->Height = 1; + Texture->Pixels = {static_cast(Color.r * 255.0f), + static_cast(Color.g * 255.0f), + static_cast(Color.b * 255.0f), + static_cast(Color.a * 255.0f)}; + auto Material = std::make_shared(); + Material->BaseColorTexture = Texture; + m_PresenceMaterials.emplace(User.Value, Material); + return Material; +} + +MaterialInstanceRef HeadlessOverlayModule::GetOrCreateColliderMaterial( + EditorPhysicsBodyType BodyType) const { + const int Key = static_cast(BodyType); + const auto Existing = m_ColliderMaterials.find(Key); + if (Existing != m_ColliderMaterials.end()) { + return Existing->second; + } + auto Material = std::make_shared(); + if (BodyType == EditorPhysicsBodyType::Dynamic) { + Material->BaseColorFactor = {1.0f, 0.55f, 0.2f, 0.22f}; + } else if (BodyType == EditorPhysicsBodyType::Static) { + Material->BaseColorFactor = {0.2f, 0.9f, 1.0f, 0.18f}; + } else { + Material->BaseColorFactor = {0.8f, 0.8f, 0.8f, 0.18f}; + } + Material->Metallic = 0.0f; + Material->Roughness = 0.15f; + m_ColliderMaterials.emplace(Key, Material); + return Material; +} +} // namespace Axiom diff --git a/Headless/HeadlessOverlayModule.h b/Headless/HeadlessOverlayModule.h new file mode 100644 index 00000000..1e6178bf --- /dev/null +++ b/Headless/HeadlessOverlayModule.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include + +namespace Axiom { +class HeadlessOverlayModule { +public: + explicit HeadlessOverlayModule(EditorSession &Session); + + void Initialize(); + void SetPresenceMarkerMeshForTesting(MeshRef Mesh); + void SetColliderMeshesForTesting(MeshRef BoxMesh, MeshRef SphereMesh); + + void SetGizmoHoveredAxis(SessionUserId User, int Axis); + int GetGizmoHoveredAxis(SessionUserId User) const; + void SetGizmoMode(SessionUserId User, GizmoMode Mode); + GizmoMode GetGizmoMode(SessionUserId User) const; + + std::vector BuildLightBillboards() const; + std::vector BuildColliderOverlaySubmissions() const; + std::vector + BuildPresenceOverlaySubmissions(SessionUserId RenderUser) const; + +private: + MaterialInstanceRef GetOrCreatePresenceMaterial(SessionUserId User) const; + MaterialInstanceRef + GetOrCreateColliderMaterial(EditorPhysicsBodyType BodyType) const; + + EditorSession &m_Session; + MeshRef m_PresenceMarkerMesh; + MeshRef m_ColliderBoxMesh; + MeshRef m_ColliderSphereMesh; + mutable std::unordered_map m_PresenceMaterials; + mutable std::unordered_map m_ColliderMaterials; + mutable std::mutex m_GizmoHoverMutex; + std::unordered_map m_GizmoHoveredAxisByUser; + mutable std::mutex m_GizmoModeMutex; + std::unordered_map m_GizmoModeByUser; +}; +} // namespace Axiom diff --git a/Headless/HeadlessSessionLayer.cpp b/Headless/HeadlessSessionLayer.cpp index 24afff3f..907aefbb 100644 --- a/Headless/HeadlessSessionLayer.cpp +++ b/Headless/HeadlessSessionLayer.cpp @@ -6,220 +6,22 @@ #include #include -#include #include -#include -#include -#include - #include -#include -#include namespace Axiom { namespace { -constexpr float ColliderOverlayScale = 1.01f; -constexpr float ColliderCornerScale = 0.085f; - -MeshData BuildPresenceMarkerMeshData() { - MeshData Mesh{}; - Mesh.Vertices = { - {.Position = {-0.35f, -0.2f, 0.5f, 1.0f}}, - {.Position = {0.35f, -0.2f, 0.5f, 1.0f}}, - {.Position = {0.35f, 0.2f, 0.5f, 1.0f}}, - {.Position = {-0.35f, 0.2f, 0.5f, 1.0f}}, - {.Position = {0.0f, 0.0f, -0.9f, 1.0f}}, - }; - Mesh.Indices = { - 0, 1, 2, 0, 2, 3, - 0, 1, 4, - 1, 2, 4, - 2, 3, 4, - 3, 0, 4, - }; - Mesh.BoundsMin = {-0.35f, -0.2f, -0.9f}; - Mesh.BoundsMax = {0.35f, 0.2f, 0.5f}; - return Mesh; -} - -MeshData BuildUnitBoxMeshData() { - MeshData Mesh{}; - Mesh.Vertices = { - {.Position = {-1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 0.0f, 1.0f, 0.0f}}, - {.Position = {1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 0.0f, 1.0f, 0.0f}}, - {.Position = {1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 0.0f, 1.0f, 0.0f}}, - {.Position = {-1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 0.0f, 1.0f, 0.0f}}, - {.Position = {-1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 0.0f, -1.0f, 0.0f}}, - {.Position = {1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 0.0f, -1.0f, 0.0f}}, - {.Position = {1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 0.0f, -1.0f, 0.0f}}, - {.Position = {-1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 0.0f, -1.0f, 0.0f}}, - {.Position = {-1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {-1.0f, 0.0f, 0.0f, 0.0f}}, - {.Position = {-1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {-1.0f, 0.0f, 0.0f, 0.0f}}, - {.Position = {-1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {-1.0f, 0.0f, 0.0f, 0.0f}}, - {.Position = {-1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {-1.0f, 0.0f, 0.0f, 0.0f}}, - {.Position = {1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {1.0f, 0.0f, 0.0f, 0.0f}}, - {.Position = {1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {1.0f, 0.0f, 0.0f, 0.0f}}, - {.Position = {1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {1.0f, 0.0f, 0.0f, 0.0f}}, - {.Position = {1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {1.0f, 0.0f, 0.0f, 0.0f}}, - {.Position = {-1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 1.0f, 0.0f, 0.0f}}, - {.Position = {-1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 1.0f, 0.0f, 0.0f}}, - {.Position = {1.0f, 1.0f, 1.0f, 1.0f}, .Normal = {0.0f, 1.0f, 0.0f, 0.0f}}, - {.Position = {1.0f, 1.0f, -1.0f, 1.0f}, .Normal = {0.0f, 1.0f, 0.0f, 0.0f}}, - {.Position = {-1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {0.0f, -1.0f, 0.0f, 0.0f}}, - {.Position = {-1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {0.0f, -1.0f, 0.0f, 0.0f}}, - {.Position = {1.0f, -1.0f, 1.0f, 1.0f}, .Normal = {0.0f, -1.0f, 0.0f, 0.0f}}, - {.Position = {1.0f, -1.0f, -1.0f, 1.0f}, .Normal = {0.0f, -1.0f, 0.0f, 0.0f}}, - }; - Mesh.Indices = { - 0, 1, 2, 0, 2, 3, 4, 6, 5, 4, 7, 6, 8, 9, 10, 8, 10, 11, - 12, 14, 13, 12, 15, 14, 16, 17, 18, 16, 18, 19, 20, 22, 21, 20, 23, 22, - }; - Mesh.BoundsMin = {-1.0f, -1.0f, -1.0f}; - Mesh.BoundsMax = {1.0f, 1.0f, 1.0f}; - return Mesh; -} - -MeshData BuildUnitSphereMeshData(uint32_t LongitudeSegments = 16, - uint32_t LatitudeSegments = 10) { - MeshData Mesh{}; - Mesh.Vertices.reserve(static_cast(LongitudeSegments + 1) * - static_cast(LatitudeSegments + 1)); - for (uint32_t Lat = 0; Lat <= LatitudeSegments; ++Lat) { - const float V = static_cast(Lat) / - static_cast(LatitudeSegments); - const float Theta = V * std::numbers::pi_v; - const float SinTheta = std::sin(Theta); - const float CosTheta = std::cos(Theta); - for (uint32_t Lon = 0; Lon <= LongitudeSegments; ++Lon) { - const float U = static_cast(Lon) / - static_cast(LongitudeSegments); - const float Phi = U * std::numbers::pi_v * 2.0f; - const float SinPhi = std::sin(Phi); - const float CosPhi = std::cos(Phi); - const glm::vec3 Normal{SinTheta * CosPhi, CosTheta, SinTheta * SinPhi}; - Mesh.Vertices.push_back({ - .Position = glm::vec4(Normal, 1.0f), - .Normal = glm::vec4(glm::normalize(Normal), 0.0f), - .TexCoord = {U, V}, - }); - } - } - - Mesh.Indices.reserve(static_cast(LongitudeSegments) * - static_cast(LatitudeSegments) * 6u); - const uint32_t Stride = LongitudeSegments + 1; - for (uint32_t Lat = 0; Lat < LatitudeSegments; ++Lat) { - for (uint32_t Lon = 0; Lon < LongitudeSegments; ++Lon) { - const uint32_t A = Lat * Stride + Lon; - const uint32_t B = A + Stride; - const uint32_t C = A + 1; - const uint32_t D = B + 1; - Mesh.Indices.insert(Mesh.Indices.end(), {A, B, C, C, B, D}); - } - } - Mesh.BoundsMin = {-1.0f, -1.0f, -1.0f}; - Mesh.BoundsMax = {1.0f, 1.0f, 1.0f}; - return Mesh; -} - -MeshData BuildUnitCornerMarkerMeshData() { - MeshData Mesh{}; - Mesh.Vertices = { - {.Position = {-1.0f, -1.0f, 1.0f, 1.0f}}, {.Position = {1.0f, -1.0f, 1.0f, 1.0f}}, - {.Position = {1.0f, 1.0f, 1.0f, 1.0f}}, {.Position = {-1.0f, 1.0f, 1.0f, 1.0f}}, - {.Position = {-1.0f, -1.0f, -1.0f, 1.0f}}, {.Position = {1.0f, -1.0f, -1.0f, 1.0f}}, - {.Position = {1.0f, 1.0f, -1.0f, 1.0f}}, {.Position = {-1.0f, 1.0f, -1.0f, 1.0f}}, - }; - Mesh.Indices = { - 0, 1, 2, 0, 2, 3, 4, 6, 5, 4, 7, 6, - 4, 0, 3, 4, 3, 7, 1, 5, 6, 1, 6, 2, - 3, 2, 6, 3, 6, 7, 4, 5, 1, 4, 1, 0, - }; - Mesh.BoundsMin = {-1.0f, -1.0f, -1.0f}; - Mesh.BoundsMax = {1.0f, 1.0f, 1.0f}; - return Mesh; -} - -glm::vec4 ParseHexColor(std::string_view Hex) { - if (Hex.size() != 7 || Hex.front() != '#') { - return {1.0f, 1.0f, 1.0f, 1.0f}; - } - - auto ParseChannel = [](char High, char Low) -> uint8_t { - auto ToNibble = [](char Value) -> uint8_t { - if (Value >= '0' && Value <= '9') { - return static_cast(Value - '0'); - } - if (Value >= 'a' && Value <= 'f') { - return static_cast(10 + Value - 'a'); - } - if (Value >= 'A' && Value <= 'F') { - return static_cast(10 + Value - 'A'); - } - return 0; - }; - return static_cast((ToNibble(High) << 4u) | ToNibble(Low)); - }; - - return { - ParseChannel(Hex[1], Hex[2]) / 255.0f, - ParseChannel(Hex[3], Hex[4]) / 255.0f, - ParseChannel(Hex[5], Hex[6]) / 255.0f, - 1.0f, - }; -} - -glm::mat4 BuildPresenceTransform(const EditorParticipant::CameraState &Camera) { - Axiom::Camera OrientedCamera; - OrientedCamera.SetRotation(Camera.YawDegrees, Camera.PitchDegrees); - - glm::mat4 Transform(1.0f); - Transform[0] = glm::vec4(OrientedCamera.GetRight(), 0.0f); - Transform[1] = glm::vec4(OrientedCamera.GetUp(), 0.0f); - Transform[2] = glm::vec4(OrientedCamera.GetForward(), 0.0f); - Transform[3] = glm::vec4(Camera.Position, 1.0f); - - return Transform * glm::scale(glm::mat4(1.0f), glm::vec3(0.35f)); -} - -glm::mat4 BuildTransformMatrix(const EditorTransformDetails &Transform) { - glm::mat4 Matrix = glm::translate(glm::mat4(1.0f), Transform.Location); - Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.y), - glm::vec3(0.0f, 1.0f, 0.0f)); - Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.x), - glm::vec3(1.0f, 0.0f, 0.0f)); - Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.z), - glm::vec3(0.0f, 0.0f, 1.0f)); - return glm::scale(Matrix, Transform.Scale); -} - -const EditorTransformDetails *GetEffectiveTransform(const EditorObjectDetails &Details) { - if (Details.WorldTransform.has_value()) { - return &*Details.WorldTransform; - } - if (Details.Transform.has_value()) { - return &*Details.Transform; - } - return nullptr; -} - -bool HasRenderableCollider(const EditorObjectDetails &Details) { - return Details.Visible && Details.Physics.has_value() && - Details.Physics->BodyType != EditorPhysicsBodyType::None && - Details.Physics->ColliderType != EditorPhysicsColliderType::None && - GetEffectiveTransform(Details) != nullptr; -} } // namespace HeadlessSessionLayer::HeadlessSessionLayer() - : Layer("HeadlessSessionLayer"), m_Session(m_SessionId) {} + : Layer("HeadlessSessionLayer"), + m_Session(m_SessionId), + m_OverlayModule(m_Session) {} void HeadlessSessionLayer::OnAttach() { m_Session.EnsureViewportState(m_LocalUserId); - m_PresenceMarkerMesh = Renderer::Get().CreateMesh(BuildPresenceMarkerMeshData()); - m_ColliderBoxMesh = Renderer::Get().CreateMesh(BuildUnitBoxMeshData()); - m_ColliderSphereMesh = Renderer::Get().CreateMesh(BuildUnitSphereMeshData()); + m_OverlayModule.Initialize(); } void HeadlessSessionLayer::OnUpdate() { @@ -289,15 +91,16 @@ void HeadlessSessionLayer::OnRender() { for (const auto &Submission : m_RendererAdapter->BuildRenderSubmissions(m_Session)) { RenderCommand::Submit(Submission); } - for (const auto &Billboard : BuildLightBillboards()) { + for (const auto &Billboard : m_OverlayModule.BuildLightBillboards()) { RenderCommand::SubmitLightBillboard(Billboard); } if (RenderView.ShowColliders) { - for (const auto &Submission : BuildColliderOverlaySubmissions()) { + for (const auto &Submission : m_OverlayModule.BuildColliderOverlaySubmissions()) { RenderCommand::Submit(Submission); } } - for (const auto &Submission : BuildPresenceOverlaySubmissions(RenderUser)) { + for (const auto &Submission : + m_OverlayModule.BuildPresenceOverlaySubmissions(RenderUser)) { RenderCommand::Submit(Submission); } @@ -313,140 +116,12 @@ void HeadlessSessionLayer::OnRender() { RenderCommand::SetGizmoOverlay({ .WorldPosition = EffTransform->Location, .Scale = 0.5f, - .HoveredAxis = GetGizmoHoveredAxis(RenderUser), - .Mode = GetGizmoMode(RenderUser), + .HoveredAxis = m_OverlayModule.GetGizmoHoveredAxis(RenderUser), + .Mode = m_OverlayModule.GetGizmoMode(RenderUser), }); } } -void HeadlessSessionLayer::SetGizmoHoveredAxis(SessionUserId User, int Axis) { - std::lock_guard Lock(m_GizmoHoverMutex); - m_GizmoHoveredAxisByUser[User.Value] = Axis; -} - -int HeadlessSessionLayer::GetGizmoHoveredAxis(SessionUserId User) const { - std::lock_guard Lock(m_GizmoHoverMutex); - const auto It = m_GizmoHoveredAxisByUser.find(User.Value); - return It != m_GizmoHoveredAxisByUser.end() ? It->second : -1; -} - -void HeadlessSessionLayer::SetGizmoMode(SessionUserId User, GizmoMode Mode) { - std::lock_guard Lock(m_GizmoModeMutex); - m_GizmoModeByUser[User.Value] = Mode; -} - -GizmoMode HeadlessSessionLayer::GetGizmoMode(SessionUserId User) const { - std::lock_guard Lock(m_GizmoModeMutex); - const auto It = m_GizmoModeByUser.find(User.Value); - return It != m_GizmoModeByUser.end() ? It->second : GizmoMode::Translate; -} - -std::vector HeadlessSessionLayer::BuildLightBillboards() - const { - std::vector Result; - for (const auto &[Id, Details] : m_Session.GetState().Scene.ObjectDetailsById) { - (void)Id; - if (Details.Kind != EditorSceneItemKind::Light || !Details.Visible || - !Details.Light.has_value()) { - continue; - } - - const EditorTransformDetails *EffectiveTransform = - Details.WorldTransform.has_value() ? &*Details.WorldTransform - : Details.Transform.has_value() ? &*Details.Transform - : nullptr; - Result.push_back({ - .ObjectId = Details.ObjectId, - .WorldPosition = EffectiveTransform != nullptr - ? EffectiveTransform->Location - : glm::vec3(0.0f), - .Color = glm::vec4(Details.Light->Color, 1.0f), - .PixelSize = 48.0f, - }); - } - return Result; -} - -std::vector -HeadlessSessionLayer::BuildColliderOverlaySubmissions() const { - std::vector Result; - for (const auto &[Id, Details] : m_Session.GetState().Scene.ObjectDetailsById) { - (void)Id; - if (!HasRenderableCollider(Details)) { - continue; - } - - const EditorTransformDetails &Transform = *GetEffectiveTransform(Details); - const EditorPhysicsProperties &Physics = *Details.Physics; - MeshRef ColliderMesh; - glm::mat4 ColliderTransform = BuildTransformMatrix(Transform); - if (Physics.ColliderType == EditorPhysicsColliderType::Box) { - if (m_ColliderBoxMesh == nullptr) { - continue; - } - ColliderMesh = m_ColliderBoxMesh; - ColliderTransform *= glm::scale(glm::mat4(1.0f), - Physics.BoxHalfExtents * ColliderOverlayScale); - } else if (Physics.ColliderType == EditorPhysicsColliderType::Sphere) { - if (m_ColliderSphereMesh == nullptr) { - continue; - } - ColliderMesh = m_ColliderSphereMesh; - ColliderTransform *= glm::scale( - glm::mat4(1.0f), - glm::vec3(Physics.SphereRadius * ColliderOverlayScale)); - } else { - continue; - } - - Result.push_back({ - .Mesh = ColliderMesh, - .Material = GetOrCreateColliderMaterial(Physics.BodyType), - .Name = Details.ObjectId + "-collider", - .RenderPath = MeshRenderPath::Graphics, - .Transform = ColliderTransform, - .Translucent = true, - }); - - if (m_ColliderBoxMesh == nullptr) { - continue; - } - - const glm::vec3 HalfExtents = - Physics.ColliderType == EditorPhysicsColliderType::Box - ? Physics.BoxHalfExtents * ColliderOverlayScale - : glm::vec3(Physics.SphereRadius * ColliderOverlayScale); - for (int X = -1; X <= 1; X += 2) { - for (int Y = -1; Y <= 1; Y += 2) { - for (int Z = -1; Z <= 1; Z += 2) { - const glm::vec3 LocalOffset = - glm::vec3(static_cast(X), static_cast(Y), - static_cast(Z)) * - HalfExtents; - glm::mat4 CornerTransform = - BuildTransformMatrix(Transform) * - glm::translate(glm::mat4(1.0f), LocalOffset) * - glm::scale(glm::mat4(1.0f), glm::vec3(std::max( - 0.03f, - std::max(HalfExtents.x, - std::max(HalfExtents.y, - HalfExtents.z)) * - ColliderCornerScale))); - Result.push_back({ - .Mesh = m_ColliderBoxMesh, - .Material = GetOrCreateColliderMaterial(Physics.BodyType), - .Name = Details.ObjectId + "-collider-corner", - .RenderPath = MeshRenderPath::Graphics, - .Transform = CornerTransform, - .Translucent = false, - }); - } - } - } - } - return Result; -} - bool HeadlessSessionLayer::LoadStartupSceneIntoSession() { return LoadStartupSceneIntoSession(std::filesystem::path(AXIOM_CONTENT_DIR)); } @@ -476,81 +151,6 @@ void HeadlessSessionLayer::SubmitToTransport(ISessionTransport &Transport, Transport.Submit(MakeContext(User), Command); } -std::vector -HeadlessSessionLayer::BuildPresenceOverlaySubmissions( - SessionUserId RenderUser) const { - std::vector Result; - if (m_PresenceMarkerMesh == nullptr) { - return Result; - } - - const std::vector Participants = - m_Session.BuildParticipants(RenderUser); - for (const EditorParticipant &Participant : Participants) { - if (Participant.User.Value == 1 || - Participant.User.Value == RenderUser.Value || - Participant.State != EditorUserPresenceState::Connected || - !Participant.Camera.has_value()) { - continue; - } - - Result.push_back({ - .Mesh = m_PresenceMarkerMesh, - .Material = GetOrCreatePresenceMaterial(Participant.User), - .Name = "participant-camera-" + std::to_string(Participant.User.Value), - .RenderPath = MeshRenderPath::Graphics, - .Transform = BuildPresenceTransform(*Participant.Camera), - }); - } - return Result; -} - -MaterialInstanceRef -HeadlessSessionLayer::GetOrCreatePresenceMaterial(SessionUserId User) const { - const auto Existing = m_PresenceMaterials.find(User.Value); - if (Existing != m_PresenceMaterials.end()) { - return Existing->second; - } - - const EditorParticipant Participant = m_Session.BuildParticipant(User); - const glm::vec4 Color = ParseHexColor(Participant.PresentationColor); - auto Texture = std::make_shared(); - Texture->Width = 1; - Texture->Height = 1; - Texture->Pixels = { - static_cast(Color.r * 255.0f), - static_cast(Color.g * 255.0f), - static_cast(Color.b * 255.0f), - static_cast(Color.a * 255.0f), - }; - - auto Material = std::make_shared(); - Material->BaseColorTexture = Texture; - m_PresenceMaterials.emplace(User.Value, Material); - return Material; -} - -MaterialInstanceRef HeadlessSessionLayer::GetOrCreateColliderMaterial( - EditorPhysicsBodyType BodyType) const { - const int Key = static_cast(BodyType); - const auto Existing = m_ColliderMaterials.find(Key); - if (Existing != m_ColliderMaterials.end()) { - return Existing->second; - } - - auto Material = std::make_shared(); - if (BodyType == EditorPhysicsBodyType::Dynamic) { - Material->BaseColorFactor = {1.0f, 0.55f, 0.2f, 0.22f}; - } else if (BodyType == EditorPhysicsBodyType::Static) { - Material->BaseColorFactor = {0.2f, 0.9f, 1.0f, 0.18f}; - } else { - Material->BaseColorFactor = {0.8f, 0.8f, 0.8f, 0.18f}; - } - Material->Metallic = 0.0f; - Material->Roughness = 0.15f; - m_ColliderMaterials.emplace(Key, Material); - return Material; -} CommandContext HeadlessSessionLayer::MakeContext() const { return MakeContext(m_LocalUserId); diff --git a/Headless/HeadlessSessionLayer.h b/Headless/HeadlessSessionLayer.h index 567333bd..64c5bd1a 100644 --- a/Headless/HeadlessSessionLayer.h +++ b/Headless/HeadlessSessionLayer.h @@ -9,10 +9,10 @@ #include #include +#include "HeadlessOverlayModule.h" + #include -#include #include -#include namespace Axiom { struct HeadlessRenderViewState; @@ -41,43 +41,48 @@ class HeadlessSessionLayer final : public Layer { void SetRenderViewResolver(RenderViewResolver Resolver) { m_RenderViewResolver = std::move(Resolver); } - void SetPresenceMarkerMeshForTesting(MeshRef Mesh) { m_PresenceMarkerMesh = std::move(Mesh); } + void SetPresenceMarkerMeshForTesting(MeshRef Mesh) { + m_OverlayModule.SetPresenceMarkerMeshForTesting(std::move(Mesh)); + } void SetColliderMeshesForTesting(MeshRef BoxMesh, MeshRef SphereMesh) { - m_ColliderBoxMesh = std::move(BoxMesh); - m_ColliderSphereMesh = std::move(SphereMesh); + m_OverlayModule.SetColliderMeshesForTesting(std::move(BoxMesh), + std::move(SphereMesh)); } EditorSession &GetSession() { return m_Session; } SessionUserId GetLocalUserId() const { return m_LocalUserId; } - void SetGizmoHoveredAxis(SessionUserId User, int Axis); - int GetGizmoHoveredAxis(SessionUserId User) const; - void SetGizmoMode(SessionUserId User, GizmoMode Mode); - GizmoMode GetGizmoMode(SessionUserId User) const; - std::vector BuildLightBillboards() const; - std::vector BuildColliderOverlaySubmissions() const; + void SetGizmoHoveredAxis(SessionUserId User, int Axis) { + m_OverlayModule.SetGizmoHoveredAxis(User, Axis); + } + int GetGizmoHoveredAxis(SessionUserId User) const { + return m_OverlayModule.GetGizmoHoveredAxis(User); + } + void SetGizmoMode(SessionUserId User, GizmoMode Mode) { + m_OverlayModule.SetGizmoMode(User, Mode); + } + GizmoMode GetGizmoMode(SessionUserId User) const { + return m_OverlayModule.GetGizmoMode(User); + } + std::vector BuildLightBillboards() const { + return m_OverlayModule.BuildLightBillboards(); + } + std::vector BuildColliderOverlaySubmissions() const { + return m_OverlayModule.BuildColliderOverlaySubmissions(); + } std::vector - BuildPresenceOverlaySubmissions(SessionUserId RenderUser) const; + BuildPresenceOverlaySubmissions(SessionUserId RenderUser) const { + return m_OverlayModule.BuildPresenceOverlaySubmissions(RenderUser); + } private: - MaterialInstanceRef GetOrCreatePresenceMaterial(SessionUserId User) const; - MaterialInstanceRef - GetOrCreateColliderMaterial(EditorPhysicsBodyType BodyType) const; CommandContext MakeContext() const; CommandContext MakeContext(SessionUserId User) const; SessionId m_SessionId{1}; SessionUserId m_LocalUserId{1}; EditorSession m_Session; + HeadlessOverlayModule m_OverlayModule; EditorSceneRendererAdapter *m_RendererAdapter{nullptr}; - MeshRef m_PresenceMarkerMesh; - MeshRef m_ColliderBoxMesh; - MeshRef m_ColliderSphereMesh; RenderViewResolver m_RenderViewResolver; - mutable std::unordered_map m_PresenceMaterials; - mutable std::unordered_map m_ColliderMaterials; - mutable std::mutex m_GizmoHoverMutex; - std::unordered_map m_GizmoHoveredAxisByUser; - mutable std::mutex m_GizmoModeMutex; - std::unordered_map m_GizmoModeByUser; }; } // namespace Axiom diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index cd2b36ac..11cba93a 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable(AxiomTests ModuleManagerTests.cpp ProjectTests.cpp SceneLifecycleTests.cpp + ../Headless/HeadlessOverlayModule.cpp ../Headless/HeadlessSessionLayer.cpp ../Headless/HeadlessCommandProtocol.cpp ../Headless/WebRtcSession.cpp From 74f65f207d9c7aaeae4eaaf41245519b193c97ea Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 17:06:36 -0500 Subject: [PATCH 05/41] Command processing modules --- Axiom/CMakeLists.txt | 2 + Axiom/Session/EditorSession.cpp | 570 +---- Axiom/Session/EditorSession.h | 7 + .../Session/EditorSessionSceneStateModule.cpp | 359 ++++ Axiom/Session/EditorSessionSceneStateModule.h | 36 + .../Session/EditorSessionValidationModule.cpp | 491 +++++ Axiom/Session/EditorSessionValidationModule.h | 16 + Content/Cooked/AssetCookManifest.json | 1863 +++++++++++++++-- 8 files changed, 2592 insertions(+), 752 deletions(-) create mode 100644 Axiom/Session/EditorSessionSceneStateModule.cpp create mode 100644 Axiom/Session/EditorSessionSceneStateModule.h create mode 100644 Axiom/Session/EditorSessionValidationModule.cpp create mode 100644 Axiom/Session/EditorSessionValidationModule.h diff --git a/Axiom/CMakeLists.txt b/Axiom/CMakeLists.txt index bba761bf..7b062c49 100644 --- a/Axiom/CMakeLists.txt +++ b/Axiom/CMakeLists.txt @@ -31,6 +31,8 @@ set(ENGINE_SOURCES Session/EditorMessageBus.cpp Session/EditorSceneRendererAdapter.cpp Session/EditorSession.cpp + Session/EditorSessionSceneStateModule.cpp + Session/EditorSessionValidationModule.cpp Session/StartupScene.cpp Renderer/Camera.cpp Renderer/ForwardRenderer.cpp diff --git a/Axiom/Session/EditorSession.cpp b/Axiom/Session/EditorSession.cpp index d3a139fc..37d5aa05 100644 --- a/Axiom/Session/EditorSession.cpp +++ b/Axiom/Session/EditorSession.cpp @@ -5,6 +5,8 @@ #include "Assets/IAssetSource.h" #include "Assets/MeshAsset.h" #include "Physics/PhysicsWorld.h" +#include "Session/EditorSessionSceneStateModule.h" +#include "Session/EditorSessionValidationModule.h" #include @@ -449,8 +451,11 @@ EditorSceneState CloneEditorSceneState(const EditorSceneState &Scene) { } // namespace EditorSession::EditorSession(SessionId Session, EditorSessionConfig Config) - : m_Config(Config), m_State({.Session = Session}) { - InitSceneRoot(); + : m_Config(Config), + m_State({.Session = Session}), + m_SceneStateModule(std::make_unique(*this)), + m_ValidationModule(std::make_unique(*this)) { + m_SceneStateModule->InitSceneRoot(); } EditorSession::~EditorSession() = default; @@ -500,26 +505,7 @@ void EditorSession::SetPresenceState(SessionUserId User, } void EditorSession::SetSceneState(EditorSceneState SceneState) { - m_State.Scene = std::move(SceneState); - HydrateWorldSettingsHDRData(m_State.Scene.WorldSettings, m_ContentDir, - m_EngineContentDir, - "SetSceneState"); - // Populate Material on object details from mesh instances so the inspector - // can display and edit material properties for mesh objects. - for (const auto &MeshInst : m_State.Scene.MeshInstances) { - auto DetailsIt = m_State.Scene.ObjectDetailsById.find(MeshInst.ObjectId); - if (DetailsIt != m_State.Scene.ObjectDetailsById.end() && - MeshInst.Material && !DetailsIt->second.Material.has_value()) { - DetailsIt->second.Material = EditorMaterialProperties{ - .BaseColorFactor = MeshInst.Material->BaseColorFactor, - .Metallic = MeshInst.Material->Metallic, - .Roughness = MeshInst.Material->Roughness, - }; - } - } - RebuildInstanceTree(m_State.Scene.Items, m_SceneRoot.get()); - PruneInvalidSelections(); - RecomputeAllWorldTransforms(); + m_SceneStateModule->SetSceneState(std::move(SceneState)); } void EditorSession::SetSceneMeshInstances( @@ -528,16 +514,12 @@ void EditorSession::SetSceneMeshInstances( } void EditorSession::SetSceneItems(std::vector SceneItems) { - m_State.Scene.Items = std::move(SceneItems); - RebuildInstanceTree(m_State.Scene.Items, m_SceneRoot.get()); - PruneInvalidSelections(); - RecomputeAllWorldTransforms(); + m_SceneStateModule->SetSceneItems(std::move(SceneItems)); } void EditorSession::SetObjectDetails( std::vector ObjectDetails) { - m_State.Scene.ObjectDetailsById = BuildObjectDetailsMap(std::move(ObjectDetails)); - RecomputeAllWorldTransforms(); + m_SceneStateModule->SetObjectDetails(std::move(ObjectDetails)); } void EditorSession::SetPresence(std::vector Presence) { @@ -562,7 +544,7 @@ const EditorViewportState *EditorSession::FindViewport(SessionUserId User) const } const EditorSceneItem *EditorSession::FindSceneItem(std::string_view ObjectId) const { - return FindSceneItemRecursive(m_State.Scene.Items, ObjectId); + return m_SceneStateModule->FindSceneItem(ObjectId); } const std::string *EditorSession::FindSelectedObjectId(SessionUserId User) const { @@ -666,17 +648,12 @@ const EditorObjectCollaborationState *EditorSession::FindCollaborationState( std::unordered_map EditorSession::BuildObjectDetailsMap( std::vector ObjectDetails) { - std::unordered_map DetailsByObjectId; - DetailsByObjectId.reserve(ObjectDetails.size()); - for (EditorObjectDetails &Details : ObjectDetails) { - DetailsByObjectId.emplace(Details.ObjectId, std::move(Details)); - } - return DetailsByObjectId; + return EditorSessionSceneStateModule::BuildObjectDetailsMap( + std::move(ObjectDetails)); } void EditorSession::InitSceneRoot() { - m_SceneRoot = std::make_unique(); - Instance::Create("world")->SetParent(m_SceneRoot.get()); + m_SceneStateModule->InitSceneRoot(); } Instance *EditorSession::FindWorldFolder() const { @@ -724,42 +701,15 @@ Instance *EditorSession::EnsureWorldFolder() { void EditorSession::RebuildInstanceTree(const std::vector &Items, Instance *Parent) { - if (!Parent) return; - std::vector OldChildren = Parent->GetChildren(); - for (Instance *Child : OldChildren) - Child->Destroy(); - for (const EditorSceneItem &Item : Items) { - Instance *Node = CreateInstanceForTemplate( - std::string(TemplateIdForKind(Item.Kind)), Item.Id); - if (!Node) continue; - Node->SetParent(Parent); - if (!Item.Children.empty()) - RebuildInstanceTree(Item.Children, Node); - } + m_SceneStateModule->RebuildInstanceTree(Items, Parent); } void EditorSession::SyncItemsFromTree() { - m_State.Scene.Items.clear(); - if (!m_SceneRoot) return; - for (const Instance *Child : m_SceneRoot->GetChildren()) - m_State.Scene.Items.push_back(BuildItemFromInstance(Child)); + m_SceneStateModule->SyncItemsFromTree(); } EditorSceneItem EditorSession::BuildItemFromInstance(const Instance *Node) const { - EditorSceneItem Item; - Item.Id = Node->GetName(); - Item.Kind = KindForInstance(Node); - Item.Visible = true; - Item.DisplayName = Node->GetName(); - const auto It = m_State.Scene.ObjectDetailsById.find(Node->GetName()); - if (It != m_State.Scene.ObjectDetailsById.end()) { - Item.DisplayName = It->second.DisplayName; - Item.Visible = It->second.Visible; - Item.Kind = It->second.Kind; - } - for (const Instance *Child : Node->GetChildren()) - Item.Children.push_back(BuildItemFromInstance(Child)); - return Item; + return m_SceneStateModule->BuildItemFromInstance(Node); } Instance *EditorSession::CreateInstanceForTemplate(const std::string &TemplateId, @@ -773,7 +723,7 @@ Instance *EditorSession::CreateInstanceForTemplate(const std::string &TemplateId } EditorSceneItemKind EditorSession::KindForInstance(const Instance *Node) const { - return KindForClassName(Node->GetClassName()); + return m_SceneStateModule->KindForInstance(Node); } bool EditorSession::IsValidTemplateId(const std::string &TemplateId) const { @@ -1097,80 +1047,23 @@ void EditorSession::ClearSelectionsForObject(std::string_view ObjectId) { } void EditorSession::PruneInvalidSelections() { - for (auto It = m_State.SelectedObjectIds.begin(); - It != m_State.SelectedObjectIds.end();) { - if (FindSceneItem(It->second) == nullptr) { - It = m_State.SelectedObjectIds.erase(It); - } else { - ++It; - } - } + m_SceneStateModule->PruneInvalidSelections(); } glm::mat4 EditorSession::ComputeWorldTransformMatrix(const Instance *Node) const { - if (!Node) return glm::mat4(1.0f); - std::vector Chain; - const Instance *Cur = Node; - while (Cur && Cur != m_SceneRoot.get()) { - Chain.push_back(Cur); - Cur = Cur->GetParent(); - } - glm::mat4 World(1.0f); - for (auto It = Chain.rbegin(); It != Chain.rend(); ++It) { - const auto DetailsIt = m_State.Scene.ObjectDetailsById.find((*It)->GetName()); - if (DetailsIt != m_State.Scene.ObjectDetailsById.end() && - DetailsIt->second.Transform.has_value()) { - World = World * BuildTransformMatrix(*DetailsIt->second.Transform); - } - } - return World; + return m_SceneStateModule->ComputeWorldTransformMatrix(Node); } EditorTransformDetails EditorSession::DecomposeMatrix(const glm::mat4 &Matrix) const { - const glm::vec3 Location = glm::vec3(Matrix[3]); - glm::vec3 Col0 = glm::vec3(Matrix[0]); - glm::vec3 Col1 = glm::vec3(Matrix[1]); - glm::vec3 Col2 = glm::vec3(Matrix[2]); - const float ScaleX = glm::length(Col0); - const float ScaleY = glm::length(Col1); - const float ScaleZ = glm::length(Col2); - if (ScaleX > 0.0f) Col0 /= ScaleX; - if (ScaleY > 0.0f) Col1 /= ScaleY; - if (ScaleZ > 0.0f) Col2 /= ScaleZ; - // YXZ Euler decomposition matching BuildTransformMatrix order (Ry * Rx * Rz) - const float AngleX = glm::degrees(glm::asin(glm::clamp(-Col2.y, -1.0f, 1.0f))); - const float AngleY = glm::degrees(glm::atan(Col2.x, Col2.z)); - const float AngleZ = glm::degrees(glm::atan(Col0.y, Col1.y)); - return EditorTransformDetails{ - .Location = Location, - .RotationDegrees = {AngleX, AngleY, AngleZ}, - .Scale = {ScaleX, ScaleY, ScaleZ}, - }; + return m_SceneStateModule->DecomposeMatrix(Matrix); } void EditorSession::RecomputeSubtreeWorldTransforms(const Instance *Node) { - if (!Node) return; - const std::string &Id = Node->GetName(); - const auto DetailsIt = m_State.Scene.ObjectDetailsById.find(Id); - if (DetailsIt != m_State.Scene.ObjectDetailsById.end() && - DetailsIt->second.Transform.has_value()) { - const glm::mat4 WorldMatrix = ComputeWorldTransformMatrix(Node); - DetailsIt->second.WorldTransform = DecomposeMatrix(WorldMatrix); - for (EditorSceneMeshInstance &Inst : m_State.Scene.MeshInstances) { - if (Inst.ObjectId == Id) { - Inst.Transform = WorldMatrix; - break; - } - } - } - for (const Instance *Child : Node->GetChildren()) - RecomputeSubtreeWorldTransforms(Child); + m_SceneStateModule->RecomputeSubtreeWorldTransforms(Node); } void EditorSession::RecomputeAllWorldTransforms() { - if (!m_SceneRoot) return; - for (const Instance *Child : m_SceneRoot->GetChildren()) - RecomputeSubtreeWorldTransforms(Child); + m_SceneStateModule->RecomputeAllWorldTransforms(); } void EditorSession::AcquireLock(const std::string &ObjectId, SessionUserId User) { @@ -1260,19 +1153,7 @@ EditorViewportState &EditorSession::EnsureViewport(SessionUserId User) { const EditorSceneItem *EditorSession::FindSceneItemRecursive( const std::vector &Items, std::string_view ObjectId) const { - for (const EditorSceneItem &Item : Items) { - if (Item.Id == ObjectId) { - return &Item; - } - - if (const EditorSceneItem *Child = - FindSceneItemRecursive(Item.Children, ObjectId); - Child != nullptr) { - return Child; - } - } - - return nullptr; + return m_SceneStateModule->FindSceneItemRecursive(Items, ObjectId); } void EditorSession::ProcessCommand(const QueuedEditorCommand &QueuedCommand) { @@ -1305,408 +1186,7 @@ void EditorSession::ProcessCommand(const QueuedEditorCommand &QueuedCommand) { bool EditorSession::ValidateCommand(const QueuedEditorCommand &QueuedCommand, std::string &FailureReason) { - if (QueuedCommand.Context.Session != m_State.Session) { - FailureReason = "Command targeted a different session."; - return false; - } - - if ((std::holds_alternative(QueuedCommand.Command.Payload) || - std::holds_alternative(QueuedCommand.Command.Payload) || - std::holds_alternative(QueuedCommand.Command.Payload) || - std::holds_alternative(QueuedCommand.Command.Payload)) && - QueuedCommand.Context.User.Value != ResolveRuntimeControllerUser().Value) { - FailureReason = - "Only the current simulation host can control simulation state."; - return false; - } - - if (!QueuedCommand.Context.IsScriptContext && - m_State.RuntimeState != EditorRuntimeState::Edit && - IsAuthoringMutationCommand(QueuedCommand.Command.Payload)) { - FailureReason = - "Authoring edits are disabled while shared simulation is active."; - return false; - } - - const EditorViewportState &Viewport = - const_cast(this)->EnsureViewport(QueuedCommand.Context.User); - - if (const auto *CameraCommand = - std::get_if( - &QueuedCommand.Command.Payload)) { - if (Viewport.IsLooking && !CameraCommand->CursorPosition.has_value()) { - FailureReason = "Look-enabled camera updates require cursor position."; - return false; - } - } - - if (const auto *SelectionCommand = - std::get_if(&QueuedCommand.Command.Payload)) { - if (SelectionCommand->ObjectId.empty()) { - FailureReason = "Selection commands require a non-empty object id."; - return false; - } - if (FindSceneItem(SelectionCommand->ObjectId) == nullptr) { - FailureReason = "Selection targeted an unknown object."; - return false; - } - } - - // Lock guard: reject mutating commands if another user owns the lock. - { - const std::string *LockedObjectId = nullptr; - std::string SingleId; - if (const auto *C = std::get_if(&QueuedCommand.Command.Payload)) - SingleId = C->ObjectId; - else if (const auto *C = std::get_if(&QueuedCommand.Command.Payload)) - SingleId = C->ObjectId; - else if (const auto *C = std::get_if(&QueuedCommand.Command.Payload)) - SingleId = C->ObjectId; - else if (const auto *C = std::get_if(&QueuedCommand.Command.Payload)) - SingleId = C->ObjectId; - else if (const auto *C = std::get_if(&QueuedCommand.Command.Payload)) - SingleId = C->ObjectId; - else if (const auto *C = std::get_if(&QueuedCommand.Command.Payload)) - SingleId = C->ObjectId; - if (!SingleId.empty()) { - const auto CollabIt = m_State.Scene.CollaborationByObjectId.find(SingleId); - if (CollabIt != m_State.Scene.CollaborationByObjectId.end() && - CollabIt->second.LockState == EditorObjectLockState::Locked && - CollabIt->second.LockOwner.has_value() && - *CollabIt->second.LockOwner != QueuedCommand.Context.User) { - FailureReason = "Object is locked by another user."; - return false; - } - } - } - - if (const auto *TransformCommand = - std::get_if(&QueuedCommand.Command.Payload)) { - if (TransformCommand->ObjectId.empty()) { - FailureReason = "Transform commands require a non-empty object id."; - return false; - } - - const EditorObjectDetails *Details = FindObjectDetails(TransformCommand->ObjectId); - if (Details == nullptr) { - FailureReason = "Transform targeted an unknown object."; - return false; - } - if (!Details->SupportsTransform || !Details->Transform.has_value()) { - FailureReason = "This object does not support transform edits."; - return false; - } - if (Details->TransformReadOnly) { - FailureReason = "This object is read-only."; - return false; - } - if (TransformCommand->Scale.x <= 0.0f || TransformCommand->Scale.y <= 0.0f || - TransformCommand->Scale.z <= 0.0f) { - FailureReason = "Scale values must be greater than zero."; - return false; - } - } - - if (const auto *PhysicsCommand = - std::get_if(&QueuedCommand.Command.Payload)) { - if (PhysicsCommand->ObjectId.empty()) { - FailureReason = "Physics commands require a non-empty object id."; - return false; - } - - const EditorObjectDetails *Details = FindObjectDetails(PhysicsCommand->ObjectId); - if (Details == nullptr) { - FailureReason = "Physics targeted an unknown object."; - return false; - } - if (!Details->SupportsTransform) { - FailureReason = "Physics can only be assigned to transformable objects."; - return false; - } - if (PhysicsCommand->Physics.BodyType == EditorPhysicsBodyType::Dynamic && - PhysicsCommand->Physics.Mass <= 0.0f) { - FailureReason = "Dynamic physics bodies require a positive mass."; - return false; - } - if (PhysicsCommand->Physics.ColliderType == EditorPhysicsColliderType::Box && - !IsPositive(PhysicsCommand->Physics.BoxHalfExtents)) { - FailureReason = "Box colliders require positive half extents."; - return false; - } - if (PhysicsCommand->Physics.ColliderType == EditorPhysicsColliderType::Sphere && - PhysicsCommand->Physics.SphereRadius <= 0.0f) { - FailureReason = "Sphere colliders require a positive radius."; - return false; - } - if (PhysicsCommand->Physics.Friction < 0.0f) { - FailureReason = "Physics friction must be zero or greater."; - return false; - } - if (PhysicsCommand->Physics.Restitution < 0.0f) { - FailureReason = "Physics restitution must be zero or greater."; - return false; - } - } - - if (const auto *RenameCommand = - std::get_if(&QueuedCommand.Command.Payload)) { - if (RenameCommand->ObjectId.empty()) { - FailureReason = "Rename commands require a non-empty object id."; - return false; - } - if (FindSceneItem(RenameCommand->ObjectId) == nullptr) { - FailureReason = "Rename targeted an unknown object."; - return false; - } - if (RenameCommand->DisplayName.empty() || - IsBlankString(RenameCommand->DisplayName)) { - FailureReason = "Rename commands require a non-empty display name."; - return false; - } - } - - if (const auto *VisibilityCommand = - std::get_if( - &QueuedCommand.Command.Payload)) { - if (VisibilityCommand->ObjectId.empty()) { - FailureReason = "Visibility commands require a non-empty object id."; - return false; - } - if (FindSceneItem(VisibilityCommand->ObjectId) == nullptr) { - FailureReason = "Visibility targeted an unknown object."; - return false; - } - } - - if (const auto *CreateCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - if (CreateCmd->TemplateId.empty()) { - FailureReason = "Create commands require a non-empty TemplateId."; - return false; - } - if (!IsValidTemplateId(CreateCmd->TemplateId)) { - FailureReason = "Unknown TemplateId: " + CreateCmd->TemplateId + "."; - return false; - } - } - - if (const auto *CreateMeshCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - if (CreateMeshCmd->AssetPath.empty()) { - FailureReason = "CreateMeshObject requires a non-empty asset path."; - return false; - } - if (CreateMeshCmd->Scale.x <= 0.0f || CreateMeshCmd->Scale.y <= 0.0f || - CreateMeshCmd->Scale.z <= 0.0f) { - FailureReason = "Scale values must be greater than zero."; - return false; - } - if (m_ContentDir.empty()) { - FailureReason = "CreateMeshObject requires a configured content directory."; - return false; - } - CookMeshAssetBestEffort(m_ContentDir, CreateMeshCmd->AssetPath); - const std::filesystem::path FullPath = m_ContentDir / CreateMeshCmd->AssetPath; - const auto SceneData = Assets::LoadBasicMeshAsset(FullPath); - if (!SceneData.has_value() || SceneData->Instances.empty()) { - FailureReason = "CreateMeshObject failed to load mesh asset: " + - CreateMeshCmd->AssetPath + "."; - return false; - } - } - - if (const auto *DupCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - if (DupCmd->ObjectId.empty()) { - FailureReason = "Duplicate commands require a non-empty object id."; - return false; - } - if (FindSceneItem(DupCmd->ObjectId) == nullptr) { - FailureReason = "Duplicate targeted an unknown object."; - return false; - } - } - - if (const auto *DelCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - if (DelCmd->ObjectId.empty()) { - FailureReason = "Delete commands require a non-empty object id."; - return false; - } - if (FindSceneItem(DelCmd->ObjectId) == nullptr) { - FailureReason = "Delete targeted an unknown object."; - return false; - } - if (DelCmd->ObjectId == "world") { - FailureReason = "The world folder cannot be deleted."; - return false; - } - } - - if (const auto *ReparentCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - if (ReparentCmd->ObjectId.empty()) { - FailureReason = "Reparent commands require a non-empty object id."; - return false; - } - if (ReparentCmd->NewParentId.empty()) { - FailureReason = "Reparent commands require a non-empty new parent id."; - return false; - } - if (FindSceneItem(ReparentCmd->ObjectId) == nullptr) { - FailureReason = "Reparent targeted an unknown object."; - return false; - } - if (FindSceneItem(ReparentCmd->NewParentId) == nullptr) { - FailureReason = "Reparent new parent is an unknown object."; - return false; - } - if (ReparentCmd->ObjectId == ReparentCmd->NewParentId) { - FailureReason = "Cannot reparent an object onto itself."; - return false; - } - if (ReparentCmd->ObjectId == "world") { - FailureReason = "The world folder cannot be reparented."; - return false; - } - // Reject if new parent is a descendant of the object (would create cycle) - const Instance *Target = - FindInstanceById(m_SceneRoot.get(), ReparentCmd->ObjectId); - if (Target != nullptr) { - for (const std::string &DescId : CollectDescendantIds(Target)) { - if (DescId == ReparentCmd->NewParentId) { - FailureReason = "Cannot reparent an object onto one of its descendants."; - return false; - } - } - } - } - - if (const auto *AttachCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - if (AttachCmd->ObjectId.empty()) { - FailureReason = "AttachScript requires a non-empty object id."; - return false; - } - if (AttachCmd->ScriptClassName.empty()) { - FailureReason = "AttachScript requires a non-empty script class name."; - return false; - } - const EditorObjectDetails *Details = FindObjectDetails(AttachCmd->ObjectId); - if (Details == nullptr) { - FailureReason = "AttachScript targeted an unknown object."; - return false; - } - if (Details->Kind != EditorSceneItemKind::Actor) { - FailureReason = "Scripts can only be attached to Actor objects."; - return false; - } - } - - if (const auto *DetachCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - if (DetachCmd->ObjectId.empty()) { - FailureReason = "DetachScript requires a non-empty object id."; - return false; - } - if (FindObjectDetails(DetachCmd->ObjectId) == nullptr) { - FailureReason = "DetachScript targeted an unknown object."; - return false; - } - } - - if (const auto *MeshAssetCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - if (MeshAssetCmd->ObjectId.empty()) { - FailureReason = "SetMeshAsset requires a non-empty object id."; - return false; - } - if (MeshAssetCmd->AssetPath.empty()) { - FailureReason = "SetMeshAsset requires a non-empty asset path."; - return false; - } - const EditorObjectDetails *Details = FindObjectDetails(MeshAssetCmd->ObjectId); - if (Details == nullptr) { - FailureReason = "SetMeshAsset targeted an unknown object."; - return false; - } - if (Details->Kind != EditorSceneItemKind::Mesh && - Details->Kind != EditorSceneItemKind::Actor) { - FailureReason = "SetMeshAsset target must be a Mesh or Actor object."; - return false; - } - } - - if (const auto *LightCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - const EditorObjectDetails *Details = FindObjectDetails(LightCmd->ObjectId); - if (Details == nullptr) { - FailureReason = "SetLightProperties targeted an unknown object."; - return false; - } - if (Details->Kind != EditorSceneItemKind::Light) { - FailureReason = "SetLightProperties target must be a Light object."; - return false; - } - } - - if (const auto *MatCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - const EditorObjectDetails *Details = FindObjectDetails(MatCmd->ObjectId); - if (Details == nullptr) { - FailureReason = "SetMaterialProperties targeted an unknown object."; - return false; - } - if (Details->Kind != EditorSceneItemKind::Mesh) { - FailureReason = "SetMaterialProperties target must be a Mesh object."; - return false; - } - } - - if (const auto *TexCmd = - std::get_if(&QueuedCommand.Command.Payload)) { - const EditorObjectDetails *Details = FindObjectDetails(TexCmd->ObjectId); - if (Details == nullptr) { - FailureReason = "SetMaterialTexture targeted an unknown object."; - return false; - } - if (Details->Kind != EditorSceneItemKind::Mesh) { - FailureReason = "SetMaterialTexture target must be a Mesh object."; - return false; - } - } - - if (std::holds_alternative(QueuedCommand.Command.Payload)) { - if (m_State.RuntimeState != EditorRuntimeState::Edit) { - FailureReason = "PlaySession is only valid while in edit mode."; - return false; - } - } - - if (std::holds_alternative(QueuedCommand.Command.Payload)) { - if (m_State.RuntimeState != EditorRuntimeState::Playing) { - FailureReason = "PauseSession is only valid while playing."; - return false; - } - } - - if (std::holds_alternative(QueuedCommand.Command.Payload)) { - if (m_State.RuntimeState != EditorRuntimeState::Paused) { - FailureReason = "ResumeSession is only valid while paused."; - return false; - } - } - - if (std::holds_alternative(QueuedCommand.Command.Payload)) { - if (m_State.RuntimeState == EditorRuntimeState::Edit) { - FailureReason = "StopSession is only valid while simulation is active."; - return false; - } - } - - // SetWorldSettingsCommand requires no specific validation since colors are just vec3 - - return true; + return m_ValidationModule->ValidateCommand(QueuedCommand, FailureReason); } void EditorSession::HandleCommand( diff --git a/Axiom/Session/EditorSession.h b/Axiom/Session/EditorSession.h index 0b9a2ff5..ca462753 100644 --- a/Axiom/Session/EditorSession.h +++ b/Axiom/Session/EditorSession.h @@ -20,6 +20,8 @@ namespace Axiom { class PhysicsWorld; +class EditorSessionSceneStateModule; +class EditorSessionValidationModule; struct EditorSessionConfig { glm::vec3 InitialCameraPosition{0.0f, 0.8f, 3.5f}; @@ -209,6 +211,9 @@ class EditorSession final : public IEditorCommandSink { void PublishScriptError(const std::string &ObjectId, const std::string &Message); private: + friend class EditorSessionSceneStateModule; + friend class EditorSessionValidationModule; + static std::unordered_map BuildObjectDetailsMap(std::vector ObjectDetails); static bool IsBlankString(std::string_view Value); @@ -329,6 +334,8 @@ class EditorSession final : public IEditorCommandSink { EditorSessionConfig m_Config; EditorSessionState m_State; EditorMessageBus m_MessageBus; + std::unique_ptr m_SceneStateModule; + std::unique_ptr m_ValidationModule; std::unique_ptr m_SceneRoot; std::filesystem::path m_ContentDir; std::filesystem::path m_EngineContentDir; diff --git a/Axiom/Session/EditorSessionSceneStateModule.cpp b/Axiom/Session/EditorSessionSceneStateModule.cpp new file mode 100644 index 00000000..f5e170f4 --- /dev/null +++ b/Axiom/Session/EditorSessionSceneStateModule.cpp @@ -0,0 +1,359 @@ +#include "Session/EditorSessionSceneStateModule.h" + +#include "Assets/AssetCooker.h" +#include "Assets/CookedTextureAsset.h" +#include "Assets/IAssetSource.h" +#include "Assets/MeshAsset.h" + +#include + +#include +#include +#include +#include +#include + +#include + +namespace Axiom { +namespace { +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)); + } +} + +void HydrateWorldSettingsHDRData(EditorWorldSettings &Settings, + const std::filesystem::path &ContentDir, + const std::filesystem::path &EngineContentDir, + std::string_view LogContext) { + if (Settings.SkyboxHDRPath.empty()) { + Settings.SkyboxHDRData = nullptr; + return; + } + if (Settings.SkyboxHDRData) { + return; + } + if (ContentDir.empty()) { + A_CORE_WARN("{}: content directory not configured; cannot load HDR '{}'", + LogContext, Settings.SkyboxHDRPath); + return; + } + + const std::filesystem::path HDRRelativePath(Settings.SkyboxHDRPath); + const bool IsEngineAsset = + !HDRRelativePath.empty() && *HDRRelativePath.begin() == "Engine"; + std::filesystem::path EffectiveContentDir = ContentDir; + std::filesystem::path EffectiveRelativePath = HDRRelativePath; + if (IsEngineAsset && !EngineContentDir.empty()) { + EffectiveContentDir = EngineContentDir; + auto It = HDRRelativePath.begin(); + ++It; + EffectiveRelativePath.clear(); + for (; It != HDRRelativePath.end(); ++It) { + EffectiveRelativePath /= *It; + } + } + + const auto FullPath = EffectiveContentDir / EffectiveRelativePath; + if (std::filesystem::exists(FullPath)) { + CookHDRTextureAssetBestEffort(EffectiveContentDir, + EffectiveRelativePath.generic_string()); + } + auto Loaded = Assets::LoadHDRTextureFromFile(FullPath); + if (!Loaded) { + const Assets::CookedAssetSource CookedSource(EffectiveContentDir); + if (CookedSource.HasManifest()) { + const auto CookedPath = CookedSource.Resolve( + Assets::AssetIdFromRelativePath(EffectiveRelativePath)); + if (CookedPath.has_value()) { + const auto CookedHDR = Assets::LoadCookedHDRTextureAsset(*CookedPath); + if (CookedHDR.has_value()) { + Loaded = std::make_shared(*CookedHDR); + } + } + } + } + if (!Loaded) { + A_CORE_WARN("{}: failed to load HDR '{}'", LogContext, + Settings.SkyboxHDRPath); + } + Settings.SkyboxHDRData = std::move(Loaded); +} + +EditorSceneItemKind KindForClassName(std::string_view ClassName) { + if (ClassName == "SceneMeshObject") + return EditorSceneItemKind::Mesh; + if (ClassName == "SceneLight") + return EditorSceneItemKind::Light; + if (ClassName == "SceneCamera") + return EditorSceneItemKind::Camera; + if (ClassName == "SceneActor") + return EditorSceneItemKind::Actor; + return EditorSceneItemKind::Folder; +} + +std::string_view TemplateIdForKind(EditorSceneItemKind Kind) { + switch (Kind) { + case EditorSceneItemKind::Mesh: + return "Mesh"; + case EditorSceneItemKind::Light: + return "Light"; + case EditorSceneItemKind::Camera: + return "Camera"; + case EditorSceneItemKind::Actor: + return "Actor"; + default: + return "Folder"; + } +} + +glm::mat4 BuildTransformMatrix(const EditorTransformDetails &Transform) { + glm::mat4 Matrix(1.0f); + Matrix = glm::translate(Matrix, Transform.Location); + Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.y), + glm::vec3(0.0f, 1.0f, 0.0f)); + Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.x), + glm::vec3(1.0f, 0.0f, 0.0f)); + Matrix = glm::rotate(Matrix, glm::radians(Transform.RotationDegrees.z), + glm::vec3(0.0f, 0.0f, 1.0f)); + Matrix = glm::scale(Matrix, Transform.Scale); + return Matrix; +} +} // namespace + +EditorSessionSceneStateModule::EditorSessionSceneStateModule(EditorSession &Session) + : m_Session(Session) {} + +void EditorSessionSceneStateModule::SetSceneState(EditorSceneState SceneState) { + m_Session.m_State.Scene = std::move(SceneState); + HydrateWorldSettingsHDRData(m_Session.m_State.Scene.WorldSettings, + m_Session.m_ContentDir, + m_Session.m_EngineContentDir, "SetSceneState"); + for (const auto &MeshInst : m_Session.m_State.Scene.MeshInstances) { + auto DetailsIt = + m_Session.m_State.Scene.ObjectDetailsById.find(MeshInst.ObjectId); + if (DetailsIt != m_Session.m_State.Scene.ObjectDetailsById.end() && + MeshInst.Material && !DetailsIt->second.Material.has_value()) { + DetailsIt->second.Material = EditorMaterialProperties{ + .BaseColorFactor = MeshInst.Material->BaseColorFactor, + .Metallic = MeshInst.Material->Metallic, + .Roughness = MeshInst.Material->Roughness, + }; + } + } + RebuildInstanceTree(m_Session.m_State.Scene.Items, m_Session.m_SceneRoot.get()); + PruneInvalidSelections(); + RecomputeAllWorldTransforms(); +} + +void EditorSessionSceneStateModule::SetSceneItems( + std::vector SceneItems) { + m_Session.m_State.Scene.Items = std::move(SceneItems); + RebuildInstanceTree(m_Session.m_State.Scene.Items, m_Session.m_SceneRoot.get()); + PruneInvalidSelections(); + RecomputeAllWorldTransforms(); +} + +void EditorSessionSceneStateModule::SetObjectDetails( + std::vector ObjectDetails) { + m_Session.m_State.Scene.ObjectDetailsById = + BuildObjectDetailsMap(std::move(ObjectDetails)); + RecomputeAllWorldTransforms(); +} + +const EditorSceneItem * +EditorSessionSceneStateModule::FindSceneItem(std::string_view ObjectId) const { + return FindSceneItemRecursive(m_Session.m_State.Scene.Items, ObjectId); +} + +std::unordered_map +EditorSessionSceneStateModule::BuildObjectDetailsMap( + std::vector ObjectDetails) { + std::unordered_map DetailsByObjectId; + DetailsByObjectId.reserve(ObjectDetails.size()); + for (EditorObjectDetails &Details : ObjectDetails) { + DetailsByObjectId.emplace(Details.ObjectId, std::move(Details)); + } + return DetailsByObjectId; +} + +void EditorSessionSceneStateModule::InitSceneRoot() { + m_Session.m_SceneRoot = std::make_unique(); + Instance::Create("world")->SetParent(m_Session.m_SceneRoot.get()); +} + +void EditorSessionSceneStateModule::RebuildInstanceTree( + const std::vector &Items, Instance *Parent) { + if (!Parent) { + return; + } + std::vector OldChildren = Parent->GetChildren(); + for (Instance *Child : OldChildren) { + Child->Destroy(); + } + for (const EditorSceneItem &Item : Items) { + Instance *Node = m_Session.CreateInstanceForTemplate( + std::string(TemplateIdForKind(Item.Kind)), Item.Id); + if (!Node) { + continue; + } + Node->SetParent(Parent); + if (!Item.Children.empty()) { + RebuildInstanceTree(Item.Children, Node); + } + } +} + +void EditorSessionSceneStateModule::SyncItemsFromTree() { + m_Session.m_State.Scene.Items.clear(); + if (!m_Session.m_SceneRoot) { + return; + } + for (const Instance *Child : m_Session.m_SceneRoot->GetChildren()) { + m_Session.m_State.Scene.Items.push_back(BuildItemFromInstance(Child)); + } +} + +EditorSceneItem EditorSessionSceneStateModule::BuildItemFromInstance( + const Instance *Node) const { + EditorSceneItem Item; + Item.Id = Node->GetName(); + Item.Kind = KindForInstance(Node); + Item.Visible = true; + Item.DisplayName = Node->GetName(); + const auto It = + m_Session.m_State.Scene.ObjectDetailsById.find(Node->GetName()); + if (It != m_Session.m_State.Scene.ObjectDetailsById.end()) { + Item.DisplayName = It->second.DisplayName; + Item.Visible = It->second.Visible; + Item.Kind = It->second.Kind; + } + for (const Instance *Child : Node->GetChildren()) { + Item.Children.push_back(BuildItemFromInstance(Child)); + } + return Item; +} + +EditorSceneItemKind +EditorSessionSceneStateModule::KindForInstance(const Instance *Node) const { + return KindForClassName(Node->GetClassName()); +} + +glm::mat4 EditorSessionSceneStateModule::ComputeWorldTransformMatrix( + const Instance *Node) const { + if (!Node) { + return glm::mat4(1.0f); + } + std::vector Chain; + const Instance *Cur = Node; + while (Cur && Cur != m_Session.m_SceneRoot.get()) { + Chain.push_back(Cur); + Cur = Cur->GetParent(); + } + glm::mat4 World(1.0f); + for (auto It = Chain.rbegin(); It != Chain.rend(); ++It) { + const auto DetailsIt = + m_Session.m_State.Scene.ObjectDetailsById.find((*It)->GetName()); + if (DetailsIt != m_Session.m_State.Scene.ObjectDetailsById.end() && + DetailsIt->second.Transform.has_value()) { + World = World * BuildTransformMatrix(*DetailsIt->second.Transform); + } + } + return World; +} + +EditorTransformDetails +EditorSessionSceneStateModule::DecomposeMatrix(const glm::mat4 &Matrix) const { + const glm::vec3 Location = glm::vec3(Matrix[3]); + glm::vec3 Col0 = glm::vec3(Matrix[0]); + glm::vec3 Col1 = glm::vec3(Matrix[1]); + glm::vec3 Col2 = glm::vec3(Matrix[2]); + const float ScaleX = glm::length(Col0); + const float ScaleY = glm::length(Col1); + const float ScaleZ = glm::length(Col2); + if (ScaleX > 0.0f) + Col0 /= ScaleX; + if (ScaleY > 0.0f) + Col1 /= ScaleY; + if (ScaleZ > 0.0f) + Col2 /= ScaleZ; + const float AngleX = + glm::degrees(glm::asin(glm::clamp(-Col2.y, -1.0f, 1.0f))); + const float AngleY = glm::degrees(glm::atan(Col2.x, Col2.z)); + const float AngleZ = glm::degrees(glm::atan(Col0.y, Col1.y)); + return EditorTransformDetails{ + .Location = Location, + .RotationDegrees = {AngleX, AngleY, AngleZ}, + .Scale = {ScaleX, ScaleY, ScaleZ}, + }; +} + +void EditorSessionSceneStateModule::RecomputeSubtreeWorldTransforms( + const Instance *Node) { + if (!Node) { + return; + } + const std::string &Id = Node->GetName(); + auto DetailsIt = m_Session.m_State.Scene.ObjectDetailsById.find(Id); + if (DetailsIt != m_Session.m_State.Scene.ObjectDetailsById.end() && + DetailsIt->second.Transform.has_value()) { + const glm::mat4 WorldMatrix = ComputeWorldTransformMatrix(Node); + DetailsIt->second.WorldTransform = DecomposeMatrix(WorldMatrix); + for (EditorSceneMeshInstance &Inst : m_Session.m_State.Scene.MeshInstances) { + if (Inst.ObjectId == Id) { + Inst.Transform = WorldMatrix; + break; + } + } + } + for (const Instance *Child : Node->GetChildren()) { + RecomputeSubtreeWorldTransforms(Child); + } +} + +void EditorSessionSceneStateModule::RecomputeAllWorldTransforms() { + if (!m_Session.m_SceneRoot) { + return; + } + for (const Instance *Child : m_Session.m_SceneRoot->GetChildren()) { + RecomputeSubtreeWorldTransforms(Child); + } +} + +void EditorSessionSceneStateModule::PruneInvalidSelections() { + for (auto It = m_Session.m_State.SelectedObjectIds.begin(); + It != m_Session.m_State.SelectedObjectIds.end();) { + if (FindSceneItem(It->second) == nullptr) { + It = m_Session.m_State.SelectedObjectIds.erase(It); + } else { + ++It; + } + } +} + +const EditorSceneItem *EditorSessionSceneStateModule::FindSceneItemRecursive( + const std::vector &Items, + std::string_view ObjectId) const { + for (const EditorSceneItem &Item : Items) { + if (Item.Id == ObjectId) { + return &Item; + } + + if (const EditorSceneItem *Child = + FindSceneItemRecursive(Item.Children, ObjectId); + Child != nullptr) { + return Child; + } + } + + return nullptr; +} +} // namespace Axiom diff --git a/Axiom/Session/EditorSessionSceneStateModule.h b/Axiom/Session/EditorSessionSceneStateModule.h new file mode 100644 index 00000000..95055d11 --- /dev/null +++ b/Axiom/Session/EditorSessionSceneStateModule.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +namespace Axiom { +class EditorSessionSceneStateModule { +public: + explicit EditorSessionSceneStateModule(EditorSession &Session); + + void SetSceneState(EditorSceneState SceneState); + void SetSceneItems(std::vector SceneItems); + void SetObjectDetails(std::vector ObjectDetails); + const EditorSceneItem *FindSceneItem(std::string_view ObjectId) const; + + static std::unordered_map + BuildObjectDetailsMap(std::vector ObjectDetails); + + void InitSceneRoot(); + void RebuildInstanceTree(const std::vector &Items, + Instance *Parent); + void SyncItemsFromTree(); + EditorSceneItem BuildItemFromInstance(const Instance *Node) const; + EditorSceneItemKind KindForInstance(const Instance *Node) const; + glm::mat4 ComputeWorldTransformMatrix(const Instance *Node) const; + EditorTransformDetails DecomposeMatrix(const glm::mat4 &Matrix) const; + void RecomputeSubtreeWorldTransforms(const Instance *Node); + void RecomputeAllWorldTransforms(); + void PruneInvalidSelections(); + const EditorSceneItem * + FindSceneItemRecursive(const std::vector &Items, + std::string_view ObjectId) const; + +private: + EditorSession &m_Session; +}; +} // namespace Axiom diff --git a/Axiom/Session/EditorSessionValidationModule.cpp b/Axiom/Session/EditorSessionValidationModule.cpp new file mode 100644 index 00000000..e1789f1b --- /dev/null +++ b/Axiom/Session/EditorSessionValidationModule.cpp @@ -0,0 +1,491 @@ +#include "Session/EditorSessionValidationModule.h" + +#include "Assets/AssetCooker.h" +#include "Assets/MeshAsset.h" + +#include + +namespace Axiom { +namespace { +Instance *FindInstanceById(Instance *Root, std::string_view Id) { + if (!Root) { + return nullptr; + } + if (Root->GetName() == Id) { + return Root; + } + for (Instance *Child : Root->GetChildren()) { + if (Instance *Found = FindInstanceById(Child, Id)) { + return Found; + } + } + return nullptr; +} + +void CookMeshAssetBestEffort(const std::filesystem::path &ContentDir, + std::string_view RelativeAssetPath) { + if (ContentDir.empty() || RelativeAssetPath.empty()) { + return; + } + + const auto Cooked = Assets::CookMeshAsset(ContentDir, RelativeAssetPath); + if (!Cooked.has_value()) { + A_CORE_WARN("EditorSession: failed to cook mesh asset '{}'", + std::string(RelativeAssetPath)); + } +} + +bool IsAuthoringMutationCommand(const EditorCommandPayload &Payload) { + return std::holds_alternative(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) || + std::holds_alternative(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) || + std::holds_alternative(Payload) || + std::holds_alternative(Payload) || + std::holds_alternative(Payload); +} + +bool IsPositive(const glm::vec3 &Value) { + return Value.x > 0.0f && Value.y > 0.0f && Value.z > 0.0f; +} +} // namespace + +EditorSessionValidationModule::EditorSessionValidationModule( + EditorSession &Session) + : m_Session(Session) {} + +bool EditorSessionValidationModule::ValidateCommand( + const QueuedEditorCommand &QueuedCommand, std::string &FailureReason) const { + if (QueuedCommand.Context.Session != m_Session.m_State.Session) { + FailureReason = "Command targeted a different session."; + return false; + } + + if ((std::holds_alternative(QueuedCommand.Command.Payload) || + std::holds_alternative( + QueuedCommand.Command.Payload) || + std::holds_alternative( + QueuedCommand.Command.Payload) || + std::holds_alternative( + QueuedCommand.Command.Payload)) && + QueuedCommand.Context.User.Value != + m_Session.ResolveRuntimeControllerUser().Value) { + FailureReason = + "Only the current simulation host can control simulation state."; + return false; + } + + if (!QueuedCommand.Context.IsScriptContext && + m_Session.m_State.RuntimeState != EditorRuntimeState::Edit && + IsAuthoringMutationCommand(QueuedCommand.Command.Payload)) { + FailureReason = + "Authoring edits are disabled while shared simulation is active."; + return false; + } + + const EditorViewportState &Viewport = const_cast(m_Session) + .EnsureViewport( + QueuedCommand.Context.User); + + if (const auto *CameraCommand = std::get_if( + &QueuedCommand.Command.Payload)) { + if (Viewport.IsLooking && !CameraCommand->CursorPosition.has_value()) { + FailureReason = "Look-enabled camera updates require cursor position."; + return false; + } + } + + if (const auto *SelectionCommand = + std::get_if(&QueuedCommand.Command.Payload)) { + if (SelectionCommand->ObjectId.empty()) { + FailureReason = "Selection commands require a non-empty object id."; + return false; + } + if (m_Session.FindSceneItem(SelectionCommand->ObjectId) == nullptr) { + FailureReason = "Selection targeted an unknown object."; + return false; + } + } + + { + std::string SingleId; + if (const auto *C = + std::get_if(&QueuedCommand.Command.Payload)) + SingleId = C->ObjectId; + else if (const auto *C = + std::get_if(&QueuedCommand.Command.Payload)) + SingleId = C->ObjectId; + else if (const auto *C = std::get_if( + &QueuedCommand.Command.Payload)) + SingleId = C->ObjectId; + else if (const auto *C = + std::get_if(&QueuedCommand.Command.Payload)) + SingleId = C->ObjectId; + else if (const auto *C = std::get_if( + &QueuedCommand.Command.Payload)) + SingleId = C->ObjectId; + else if (const auto *C = std::get_if( + &QueuedCommand.Command.Payload)) + SingleId = C->ObjectId; + if (!SingleId.empty()) { + const auto CollabIt = + m_Session.m_State.Scene.CollaborationByObjectId.find(SingleId); + if (CollabIt != m_Session.m_State.Scene.CollaborationByObjectId.end() && + CollabIt->second.LockState == EditorObjectLockState::Locked && + CollabIt->second.LockOwner.has_value() && + *CollabIt->second.LockOwner != QueuedCommand.Context.User) { + FailureReason = "Object is locked by another user."; + return false; + } + } + } + + if (const auto *TransformCommand = + std::get_if(&QueuedCommand.Command.Payload)) { + if (TransformCommand->ObjectId.empty()) { + FailureReason = "Transform commands require a non-empty object id."; + return false; + } + + const EditorObjectDetails *Details = + m_Session.FindObjectDetails(TransformCommand->ObjectId); + if (Details == nullptr) { + FailureReason = "Transform targeted an unknown object."; + return false; + } + if (!Details->SupportsTransform || !Details->Transform.has_value()) { + FailureReason = "This object does not support transform edits."; + return false; + } + if (Details->TransformReadOnly) { + FailureReason = "This object is read-only."; + return false; + } + if (TransformCommand->Scale.x <= 0.0f || + TransformCommand->Scale.y <= 0.0f || + TransformCommand->Scale.z <= 0.0f) { + FailureReason = "Scale values must be greater than zero."; + return false; + } + } + + if (const auto *PhysicsCommand = std::get_if( + &QueuedCommand.Command.Payload)) { + if (PhysicsCommand->ObjectId.empty()) { + FailureReason = "Physics commands require a non-empty object id."; + return false; + } + + const EditorObjectDetails *Details = + m_Session.FindObjectDetails(PhysicsCommand->ObjectId); + if (Details == nullptr) { + FailureReason = "Physics targeted an unknown object."; + return false; + } + if (!Details->SupportsTransform) { + FailureReason = "Physics can only be assigned to transformable objects."; + return false; + } + if (PhysicsCommand->Physics.BodyType == EditorPhysicsBodyType::Dynamic && + PhysicsCommand->Physics.Mass <= 0.0f) { + FailureReason = "Dynamic physics bodies require a positive mass."; + return false; + } + if (PhysicsCommand->Physics.ColliderType == + EditorPhysicsColliderType::Box && + !IsPositive(PhysicsCommand->Physics.BoxHalfExtents)) { + FailureReason = "Box colliders require positive half extents."; + return false; + } + if (PhysicsCommand->Physics.ColliderType == + EditorPhysicsColliderType::Sphere && + PhysicsCommand->Physics.SphereRadius <= 0.0f) { + FailureReason = "Sphere colliders require a positive radius."; + return false; + } + if (PhysicsCommand->Physics.Friction < 0.0f) { + FailureReason = "Physics friction must be zero or greater."; + return false; + } + if (PhysicsCommand->Physics.Restitution < 0.0f) { + FailureReason = "Physics restitution must be zero or greater."; + return false; + } + } + + if (const auto *RenameCommand = + std::get_if(&QueuedCommand.Command.Payload)) { + if (RenameCommand->ObjectId.empty()) { + FailureReason = "Rename commands require a non-empty object id."; + return false; + } + if (m_Session.FindSceneItem(RenameCommand->ObjectId) == nullptr) { + FailureReason = "Rename targeted an unknown object."; + return false; + } + if (RenameCommand->DisplayName.empty() || + EditorSession::IsBlankString(RenameCommand->DisplayName)) { + FailureReason = "Rename commands require a non-empty display name."; + return false; + } + } + + if (const auto *VisibilityCommand = std::get_if( + &QueuedCommand.Command.Payload)) { + if (VisibilityCommand->ObjectId.empty()) { + FailureReason = "Visibility commands require a non-empty object id."; + return false; + } + if (m_Session.FindSceneItem(VisibilityCommand->ObjectId) == nullptr) { + FailureReason = "Visibility targeted an unknown object."; + return false; + } + } + + if (const auto *CreateCmd = + std::get_if(&QueuedCommand.Command.Payload)) { + if (CreateCmd->TemplateId.empty()) { + FailureReason = "Create commands require a non-empty TemplateId."; + return false; + } + if (!m_Session.IsValidTemplateId(CreateCmd->TemplateId)) { + FailureReason = "Unknown TemplateId: " + CreateCmd->TemplateId + "."; + return false; + } + } + + if (const auto *CreateMeshCmd = std::get_if( + &QueuedCommand.Command.Payload)) { + if (CreateMeshCmd->AssetPath.empty()) { + FailureReason = "CreateMeshObject requires a non-empty asset path."; + return false; + } + if (CreateMeshCmd->Scale.x <= 0.0f || CreateMeshCmd->Scale.y <= 0.0f || + CreateMeshCmd->Scale.z <= 0.0f) { + FailureReason = "Scale values must be greater than zero."; + return false; + } + if (m_Session.m_ContentDir.empty()) { + FailureReason = "CreateMeshObject requires a configured content directory."; + return false; + } + CookMeshAssetBestEffort(m_Session.m_ContentDir, CreateMeshCmd->AssetPath); + const std::filesystem::path FullPath = + m_Session.m_ContentDir / CreateMeshCmd->AssetPath; + const auto SceneData = Assets::LoadBasicMeshAsset(FullPath); + if (!SceneData.has_value() || SceneData->Instances.empty()) { + FailureReason = "CreateMeshObject failed to load mesh asset: " + + CreateMeshCmd->AssetPath + "."; + return false; + } + } + + if (const auto *DupCmd = + std::get_if(&QueuedCommand.Command.Payload)) { + if (DupCmd->ObjectId.empty()) { + FailureReason = "Duplicate commands require a non-empty object id."; + return false; + } + if (m_Session.FindSceneItem(DupCmd->ObjectId) == nullptr) { + FailureReason = "Duplicate targeted an unknown object."; + return false; + } + } + + if (const auto *DelCmd = + std::get_if(&QueuedCommand.Command.Payload)) { + if (DelCmd->ObjectId.empty()) { + FailureReason = "Delete commands require a non-empty object id."; + return false; + } + if (m_Session.FindSceneItem(DelCmd->ObjectId) == nullptr) { + FailureReason = "Delete targeted an unknown object."; + return false; + } + if (DelCmd->ObjectId == "world") { + FailureReason = "The world folder cannot be deleted."; + return false; + } + } + + if (const auto *ReparentCmd = + std::get_if(&QueuedCommand.Command.Payload)) { + if (ReparentCmd->ObjectId.empty()) { + FailureReason = "Reparent commands require a non-empty object id."; + return false; + } + if (ReparentCmd->NewParentId.empty()) { + FailureReason = "Reparent commands require a non-empty new parent id."; + return false; + } + if (m_Session.FindSceneItem(ReparentCmd->ObjectId) == nullptr) { + FailureReason = "Reparent targeted an unknown object."; + return false; + } + if (m_Session.FindSceneItem(ReparentCmd->NewParentId) == nullptr) { + FailureReason = "Reparent new parent is an unknown object."; + return false; + } + if (ReparentCmd->ObjectId == ReparentCmd->NewParentId) { + FailureReason = "Cannot reparent an object onto itself."; + return false; + } + if (ReparentCmd->ObjectId == "world") { + FailureReason = "The world folder cannot be reparented."; + return false; + } + const Instance *Target = + FindInstanceById(m_Session.m_SceneRoot.get(), ReparentCmd->ObjectId); + if (Target != nullptr) { + for (const std::string &DescId : m_Session.CollectDescendantIds(Target)) { + if (DescId == ReparentCmd->NewParentId) { + FailureReason = + "Cannot reparent an object onto one of its descendants."; + return false; + } + } + } + } + + if (const auto *AttachCmd = + std::get_if(&QueuedCommand.Command.Payload)) { + if (AttachCmd->ObjectId.empty()) { + FailureReason = "AttachScript requires a non-empty object id."; + return false; + } + if (AttachCmd->ScriptClassName.empty()) { + FailureReason = "AttachScript requires a non-empty script class name."; + return false; + } + const EditorObjectDetails *Details = + m_Session.FindObjectDetails(AttachCmd->ObjectId); + if (Details == nullptr) { + FailureReason = "AttachScript targeted an unknown object."; + return false; + } + if (Details->Kind != EditorSceneItemKind::Actor) { + FailureReason = "Scripts can only be attached to Actor objects."; + return false; + } + } + + if (const auto *DetachCmd = + std::get_if(&QueuedCommand.Command.Payload)) { + if (DetachCmd->ObjectId.empty()) { + FailureReason = "DetachScript requires a non-empty object id."; + return false; + } + if (m_Session.FindObjectDetails(DetachCmd->ObjectId) == nullptr) { + FailureReason = "DetachScript targeted an unknown object."; + return false; + } + } + + if (const auto *MeshAssetCmd = + std::get_if(&QueuedCommand.Command.Payload)) { + if (MeshAssetCmd->ObjectId.empty()) { + FailureReason = "SetMeshAsset requires a non-empty object id."; + return false; + } + if (MeshAssetCmd->AssetPath.empty()) { + FailureReason = "SetMeshAsset requires a non-empty asset path."; + return false; + } + const EditorObjectDetails *Details = + m_Session.FindObjectDetails(MeshAssetCmd->ObjectId); + if (Details == nullptr) { + FailureReason = "SetMeshAsset targeted an unknown object."; + return false; + } + if (Details->Kind != EditorSceneItemKind::Mesh && + Details->Kind != EditorSceneItemKind::Actor) { + FailureReason = "SetMeshAsset target must be a Mesh or Actor object."; + return false; + } + } + + if (const auto *LightCmd = std::get_if( + &QueuedCommand.Command.Payload)) { + const EditorObjectDetails *Details = + m_Session.FindObjectDetails(LightCmd->ObjectId); + if (Details == nullptr) { + FailureReason = "SetLightProperties targeted an unknown object."; + return false; + } + if (Details->Kind != EditorSceneItemKind::Light) { + FailureReason = "SetLightProperties target must be a Light object."; + return false; + } + } + + if (const auto *MatCmd = std::get_if( + &QueuedCommand.Command.Payload)) { + const EditorObjectDetails *Details = + m_Session.FindObjectDetails(MatCmd->ObjectId); + if (Details == nullptr) { + FailureReason = "SetMaterialProperties targeted an unknown object."; + return false; + } + if (Details->Kind != EditorSceneItemKind::Mesh) { + FailureReason = "SetMaterialProperties target must be a Mesh object."; + return false; + } + } + + if (const auto *TexCmd = std::get_if( + &QueuedCommand.Command.Payload)) { + const EditorObjectDetails *Details = + m_Session.FindObjectDetails(TexCmd->ObjectId); + if (Details == nullptr) { + FailureReason = "SetMaterialTexture targeted an unknown object."; + return false; + } + if (Details->Kind != EditorSceneItemKind::Mesh) { + FailureReason = "SetMaterialTexture target must be a Mesh object."; + return false; + } + } + + if (std::holds_alternative(QueuedCommand.Command.Payload)) { + if (m_Session.m_State.RuntimeState != EditorRuntimeState::Edit) { + FailureReason = "PlaySession is only valid while in edit mode."; + return false; + } + } + + if (std::holds_alternative( + QueuedCommand.Command.Payload)) { + if (m_Session.m_State.RuntimeState != EditorRuntimeState::Playing) { + FailureReason = "PauseSession is only valid while playing."; + return false; + } + } + + if (std::holds_alternative( + QueuedCommand.Command.Payload)) { + if (m_Session.m_State.RuntimeState != EditorRuntimeState::Paused) { + FailureReason = "ResumeSession is only valid while paused."; + return false; + } + } + + if (std::holds_alternative(QueuedCommand.Command.Payload)) { + if (m_Session.m_State.RuntimeState == EditorRuntimeState::Edit) { + FailureReason = "StopSession is only valid while simulation is active."; + return false; + } + } + + return true; +} +} // namespace Axiom diff --git a/Axiom/Session/EditorSessionValidationModule.h b/Axiom/Session/EditorSessionValidationModule.h new file mode 100644 index 00000000..bcc7945b --- /dev/null +++ b/Axiom/Session/EditorSessionValidationModule.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace Axiom { +class EditorSessionValidationModule { +public: + explicit EditorSessionValidationModule(EditorSession &Session); + + bool ValidateCommand(const QueuedEditorCommand &QueuedCommand, + std::string &FailureReason) const; + +private: + EditorSession &m_Session; +}; +} // namespace Axiom diff --git a/Content/Cooked/AssetCookManifest.json b/Content/Cooked/AssetCookManifest.json index 0b48e9c1..323345e7 100644 --- a/Content/Cooked/AssetCookManifest.json +++ b/Content/Cooked/AssetCookManifest.json @@ -1,211 +1,1660 @@ { "entries": [ - {"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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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} + { + "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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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 + } ] } From 8f336c05a6562bed3671ac595bcf83a5fdb0a16c Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 17:10:49 -0500 Subject: [PATCH 06/41] Update docs --- Docs/DistributedWraithEngineDesign.md | 50 +++++++++++++++++++-------- Docs/HeadlessAxiomSessionPrototype.md | 1 + README.md | 15 ++++++++ 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/Docs/DistributedWraithEngineDesign.md b/Docs/DistributedWraithEngineDesign.md index ecea6481..3911eaee 100644 --- a/Docs/DistributedWraithEngineDesign.md +++ b/Docs/DistributedWraithEngineDesign.md @@ -2,7 +2,7 @@ ## Document Status - Status: Draft -- Date: 2026-05-11 +- Date: 2026-05-24 - Audience: Engine, tools, networking, web, and infrastructure contributors - Intended outcome: Establish the target architecture for evolving WraithEngine into a distributed game engine and browser-based collaborative editor @@ -62,7 +62,7 @@ - `ListAssets` command returns `{"type":"asset_list","assets":[{id,name,kind,path}...]}`; the content browser triggers it on connection and renders real assets in grid/list views with mesh/texture filter tabs and a Refresh button - `GetSchema` command returns `{"type":"object_schema","objectId":"...","className":"...","properties":[{name,type,readOnly}...]}`; the details panel fetches schema on selection change and shows a `className` badge in the panel header - `SetProperty` command dispatches to `RenameObjectCommand`, `SetObjectVisibilityCommand`, or `SetTransformCommand` based on property name; vec3 fields (location, rotationDegrees, scale) read the current transform from `ObjectDetailsById` and patch only the changed component -- `SceneFile` (`Axiom/Assets/SceneFile.h/.cpp`) provides `SaveSceneToFile` / `LoadSceneFromFile`; serialization uses a manual `ostringstream` JSON emitter in flat-node format with `parentId` links; deserialization uses a purpose-built recursive descent parser (no external JSON library) +- `SceneFile` (`Axiom/Assets/SceneFile.h/.cpp`) provides `SaveSceneToFile` / `LoadSceneFromFile`; it now serializes and parses the flat-node `parentId`-linked scene format through `rapidjson`, with in-place parse where the current file-loading path allows it - `LoadStartupScene` now checks for `Content/scene.json` first and falls back to the hardcoded default scene; scene state persists across server restarts automatically - `SaveScene` command writes `Content/scene.json` and replies with `{"type":"scene_saved"}` or `{"type":"scene_save_failed"}`; the toolbar Save button animates to a green checkmark for 2.5 s on success or a red X on failure - Phase 7 (Asset Pipeline) is now implemented: mesh asset assignment, dynamic directional lighting, material property editing, texture thumbnail previews, texture assignment, FBX/OBJ import via assimp, and OS-level file import into the content browser @@ -87,6 +87,12 @@ - The cooked-texture format (`.wtex`) was extended to v2 with a `PixelFormat` field appended after the existing v1 header; legacy v1 LDR files continue to load unchanged, while HDR textures cook as v2 with full-float (`RGBA32F`) pixel data through new `SaveCookedHDRTextureAsset` / `LoadCookedHDRTextureAsset` / `CookHDRTextureAsset` paths, so the editor's authored HDR keeps its full dynamic range for future image-based lighting reuse - `.hdr` is now a first-class asset extension: `LocalAssetSource` indexes it as `AssetKind::Texture`, `RemoteViewportServer` accepts it through the upload endpoint, and the content browser picker filters it natively - A new `WorldDetailsPanel` (docked alongside the Details inspector) hosts a `Sky Gradient` section with linked color pickers and an `HDR Sky` section that combines a typed content-relative path input, drag-drop from the content browser (consuming the existing `axiom/asset-path` / `axiom/asset-kind` dataTransfer payload), and a folder-icon `AssetPickerButton` popover that lists every `.hdr` in the project searchably; the same `AssetPickerButton` is also wired into the script-class field on the Details panel so script attachment no longer requires typing a fully-qualified class name; the panel reuses the canonical Details-style section/input chrome and forces the shadcn popover surfaces into dark theme so they match the rest of the editor +- Added a foundational engine module/plugin system: `IModule` defines standardized lifecycle hooks (`GetName`, `Initialize`, `Update`, `Shutdown`), and `ModuleManager` owns registration, initialization order, per-module active state, and query APIs intended for future CVAR/config integration +- `Application` now owns a `ModuleManager` and drives the frame through module phases instead of hardcoded polling/update/render branches; default runtime responsibilities were extracted into engine modules for window events, layer update, layer render, and renderer frame orchestration +- Headless runtime hosts now register focused host modules instead of wiring everything inline: transport/session bootstrap moved into `HeadlessSessionTransportModule`, and script-host lifecycle moved into `SessionScriptHostModule` +- Editor viewport responsibilities were split out of `GlfwEditorLayer` into `EditorViewportInputModule`, `EditorViewportSelectionModule`, and `EditorSceneRenderModule` +- Headless overlay and gizmo rendering responsibilities were split out of `HeadlessSessionLayer` into `HeadlessOverlayModule`, which now owns light billboards, collider overlays, presence markers, material caches, and per-user gizmo overlay state +- `EditorSession` refactoring has started in earnest: scene/tree synchronization responsibilities now live in `EditorSessionSceneStateModule`, and command validation now lives in `EditorSessionValidationModule`, leaving `EditorSession` closer to the intended coordinator role ## 1. Executive Summary WraithEngine will evolve from a single-process native editor into a distributed platform with one shared C++ engine runtime that supports two execution styles: @@ -96,7 +102,7 @@ WraithEngine will evolve from a single-process native editor into a distributed The first major milestone is a `remote browser editor`. The browser will own most editor UI using React, Next.js, and Tailwind CSS, while a native engine session remains authoritative for rendering, world state, asset loading, and validation of edits. The viewport will be rendered server-side and streamed to the browser via WebRTC using H.264 first. -The current repository is still a native Vulkan/GLFW/ImGui engine with a simple `Application -> Renderer -> RenderScene` flow, file-based mesh loading, and a native editor executable. That is a good base for the next phase because the rendering and runtime already exist, but the codebase needs new seams for headless execution, transport, collaboration state, asset reflection, scripting isolation, and deployment. +The current repository has moved beyond the original single-process Vulkan/GLFW/ImGui-only shape: it now includes a headless runtime path, authoritative `EditorSession` state, remote viewport transport/server layers, browser-editor integration, and an engine module runtime seam. That is a good base for the next phase because the rendering and runtime already exist, but the codebase still needs continued decomposition around session dispatch, remote server responsibilities, and packaging/deployment boundaries. This document describes the target architecture, public concepts, service boundaries, trust model, rollout order, and acceptance criteria for that transition. @@ -152,20 +158,22 @@ At the time of writing, the repository contains: The active architecture is roughly: -1. `Application` owns a GLFW window and a renderer. -2. `Layer`s update every frame and can render from authoritative state in a separate pass. -3. A local `EditorSession` owns viewport camera/look state and drains queued commands deterministically each frame. -4. `RenderCommand` writes authoritative frame data into a frame-local `RenderScene`. -5. `Renderer` passes that scene into a Vulkan backend. -6. The backend renders to a window-presented swapchain image. +1. `Application` owns a window, renderer-facing runtime state, and a `ModuleManager`. +2. Engine-owned modules now drive the core loop phases for window polling, layer update, layer render, and renderer frame orchestration. +3. Local editor and headless hosts layer their own feature modules on top of that runtime seam instead of expanding `Application` or the host constructors directly. +4. A local or headless `EditorSession` owns authoritative scene/editor state and drains queued commands deterministically each frame. +5. `RenderCommand` writes authoritative frame data into a frame-local `RenderScene`. +6. `Renderer` passes that scene into a Vulkan backend. +7. The backend renders to either a window-presented swapchain image or an offscreen headless target. This is enough to establish: - there is already a separation between scene submission and rendering +- there is now a first-class runtime module seam for enabling, disabling, and eventually configuring major engine features without re-hardcoding the app loop - there is now an initial engine-owned command/event authority seam for editor viewport state - the renderer can evolve into windowed and headless targets -- the current authoritative domain is still narrow and local to viewport/input state rather than full world editing -- there is not yet a reflection, network, collaboration, headless runtime, or scripting host layer +- the current architecture already includes reflection, networking, collaboration, headless runtime, and scripting-host layers, but some of those areas still need cleaner boundaries and further hardening +- `EditorSession` remains one of the main concentration points for authoritative world-editing logic even after the first extraction steps ## 5. Architectural Principles - One core runtime, multiple adapters @@ -1047,7 +1055,7 @@ Progress update: - `IAssetSource` / `LocalAssetSource` VFS abstraction introduced in `Axiom/Assets/IAssetSource.h/.cpp`; `LocalAssetSource` scans a root directory and derives stable `AssetId` values from hashed relative paths; `ResolveRelative` provides typed engine-internal path lookup - `ListAssets`, `GetSchema`, `SetProperty`, and `SaveScene` command types added to `HeadlessCommandType` and `ParseRemoteViewportCommand`; all four are handled in both the WebSocket and WebRTC dispatch paths in `RemoteViewportServer` - `SerializeAssetList`, `SerializeObjectSchema`, and `SerializeSaveResult` serializers added to `HeadlessCommandProtocol` -- `SceneFile` serializer/parser implemented in `Axiom/Assets/SceneFile.h/.cpp` using a manual ostringstream JSON emitter and a purpose-built recursive descent parser; flat-node format with `parentId` links avoids any external JSON library dependency +- `SceneFile` serializer/parser implemented in `Axiom/Assets/SceneFile.h/.cpp` using `rapidjson`; the flat-node format with `parentId` links is preserved, but the handwritten emitter/parser has been retired - `LoadStartupScene` now checks for `Content/scene.json` first and falls back to the hardcoded default startup scene, making scene state persistent across restarts - `SaveScene` command writes `Content/scene.json` at runtime and returns `scene_saved` or `scene_save_failed`; the pre-existing toolbar Save button is now wired end-to-end and animates to a green checkmark (success) or red X (failure) for 2.5 s - content browser replaced with a live server-driven implementation: `listAssets` is dispatched on connection, results populate grid/list views with mesh/texture filter tabs and a Refresh button @@ -1167,6 +1175,9 @@ Progress update: - manifest-backed cooked lookup resolution - `SetMeshAsset` and `SetMaterialTexture` command-path cooking - scene save/load round-trip of cooked material state +- JSON infrastructure migration is now complete across the current packaging/runtime/protocol surface: `AssetCookManifest`, `CookedAssetRuntime`, `SceneFile`, `ProjectSystem`, `HeadlessCommandProtocol`, and the JSON-producing/JSON-consuming endpoints in `RemoteViewportServer` all use `rapidjson` internally rather than the earlier handwritten serializers/parsers +- `rapidjson` is now fetched in CMake as a project dependency; current file-loading paths prefer in-place parse (`ParseInsitu`) where mutable buffers already exist, while writer-based serialization preserves the existing wire/file schemas +- verification for the migration is covered by the focused `AxiomTests` JSON slice: `HeadlessProtocolTests.*`, `ProjectSystemTests.*`, `ProjectSystemStandaloneTests.*`, `SceneLifecycleTests.SceneFile_*`, `SceneLifecycleTests.CookedSceneFile_*`, and `CookedAssetTests.*` - remaining Phase 8 work is mostly hardening and packaging-facing: - importer-driven cook orchestration rather than today’s best-effort command/load triggers - richer material/texture reference tables and GPU-oriented texture layout if needed @@ -1215,12 +1226,20 @@ Scope: Several classes have grown to 1,500 – 2,500 lines and now own multiple responsibilities. This phase extracts those responsibilities into focused units before the codebase becomes materially harder to extend. +Current progress: +- The first engine-wide extraction step is done: a reusable `IModule` / `ModuleManager` foundation now exists and the `Application` loop runs through it. +- `Application` runtime responsibilities have already been split into `ApplicationModules`. +- Headless host bootstrap responsibilities have already been split into `HostModules`. +- `GlfwEditorLayer` responsibilities have already been split into `EditorFeatureModules`. +- `HeadlessSessionLayer` overlay responsibilities have already been split into `HeadlessOverlayModule`. +- `EditorSession` has begun the same transition via `EditorSessionSceneStateModule` and `EditorSessionValidationModule`, but command handling is still concentrated in `EditorSession.cpp`. + #### 10.1 Candidates for refactoring (audit before Phase 10 begins) Likely targets based on current trajectory: | File | Approximate size | Concerns to extract | |------|-----------------|---------------------| -| `Axiom/Session/EditorSession.cpp` | ~2,000 lines | Command dispatch, event publication, lock management, presence logic, schema generation | +| `Axiom/Session/EditorSession.cpp` | ~2,500 lines before the current split; still large after it | Remaining command handling, runtime transitions, asset/material mutation, event publication, presence/lock helpers | | `Headless/RemoteViewportServer.cpp` | ~1,500 lines | HTTP routing, WebSocket framing, WebRTC signaling, command parsing, client lifecycle | | `Headless/HeadlessCommandProtocol.cpp` | ~800 lines | Growing with every new command; serialization/deserialization should be generated or table-driven | | viewport interaction / gizmo hit-testing path | multi-file | mode-specific hit testing, drag math, and interaction branching are starting to duplicate patterns and should move toward reusable primitives or strategies | @@ -1229,7 +1248,9 @@ Likely targets based on current trajectory: **`EditorSession`** → split into: - `EditorSession` — thin coordinator; owns state, wires subsystems -- `CommandDispatcher` — validates and routes incoming commands +- `EditorSessionValidationModule` — validates incoming commands +- `EditorSessionSceneStateModule` — owns scene snapshots, instance-tree rebuilding, transform recomputation, and selection pruning +- `CommandDispatcher` — routes incoming commands - `EventBroadcaster` — serializes and fans out authoritative events - `LockManager` — manages object/asset lock lifecycle - `PresenceTracker` — heartbeat, idle detection, state transitions @@ -1351,6 +1372,7 @@ Progress update: - scripting authoring is now project-local: each project gets a generated `Scripts/` workspace plus `.sln`/`.csproj`, the browser has a script editor with file CRUD and syntax highlighting, scripts can be attached to actors, and inspector `Open Script` jumps into the editor - Phase 7 (Asset Pipeline) is complete: `SetMeshAssetCommand` wires any discovered `.glb`/`.gltf`/`.fbx`/`.obj` to mesh objects and actor roots with scene-file persistence; `SetLightPropertiesCommand` drives a Blinn-Phong directional light from `SceneLight` world position; `SetMaterialPropertiesCommand` exposes `BaseColorFactor`/`Metallic`/`Roughness` push constants end-to-end through the inspector; `SetMaterialTextureCommand` assigns PNG/JPG textures to mesh base-color slots with persistence, inspector display, and drag-drop from both the content browser and outliner; FBX/OBJ import is implemented via assimp with embedded and external texture handling; the content browser accepts OS file drag-drop and a file picker Import button that upload to `POST /assets/upload`; texture thumbnail previews are served by the remote viewport server; the content browser navigates folders non-recursively; regression coverage now includes the `CreateObject`→`SetMeshAsset` runtime-creation path and actor mesh assignment - Phase 8 (Binary Asset Formats) and the first packaging foundation are now implemented: `.wmesh`, `.wtex`, and `.wmat` cooked formats exist; `AssetCookManifest` and `CookedAssetSource` resolve cooked content by stable `AssetId`; startup, scene reload, and mesh/texture editing flows all prefer cooked payloads while preserving source fallback during editor use; scene persistence now round-trips cooked material state through `materialAssetPath`; projects now cook into per-project `Content/Cooked/` and stage packaged outputs under per-project `Package/` directories +- the supporting JSON layer under those systems has now been standardized on `rapidjson`: scene files, cook manifests, packaged project manifests, cooked-runtime validation, headless command/event serialization, and remote project/script HTTP payloads all moved off the earlier handwritten JSON code while preserving their public schemas - packaged runtime cutover is now implemented for the first desktop slice: staged packages include `AxiomPackagedRuntime`, cooked project content, `scene.wscene`, the asset cook manifest, shared engine content, and a package manifest; packaged content roots are treated as cooked-only at runtime and now fail fast on invalid package layout, missing cooked scene/cook manifest, or unresolved cooked asset references - the next step is now a targeted runtime/editor architecture refactor before further large feature work: the current codebase has enough cross-cutting packaging/editor/runtime/session state that cameras, gameplay input, and possession should not be layered on top of the existing seams without first tightening the boundaries - that refactor should stay narrow and gameplay-motivated rather than turning into general cleanup; the goal is to separate editor authoring state from runtime gameplay state, editor viewport controls from in-game input, and editor camera movement from runtime camera ownership/activation diff --git a/Docs/HeadlessAxiomSessionPrototype.md b/Docs/HeadlessAxiomSessionPrototype.md index 5175dc9b..00da453f 100644 --- a/Docs/HeadlessAxiomSessionPrototype.md +++ b/Docs/HeadlessAxiomSessionPrototype.md @@ -39,6 +39,7 @@ The current slice includes a macOS-first H.264 path that is wired into the nativ - the browser client now pumps camera/input updates on `requestAnimationFrame` and flushes pointer-lock look input immediately instead of batching on a fixed timer - the current stream no longer has the severe FPS collapse seen in the older prototype, but there is still roughly half a second of residual input latency to investigate later - a multi-client frame-routing bug was fixed by stamping each offscreen capture with the submitting `SessionUserId` at render time instead of inferring ownership later from mutable active-pass state +- the headless command/protocol layer and the remote project/script HTTP JSON helpers now use `rapidjson` internally; command/event/session payload schemas are unchanged, but the earlier handwritten JSON serializer/parser code on those paths has been removed - a root-level `EditorFrontend` workspace now hosts the primary browser editor shell using Next.js, React, and Tailwind CSS - `EditorFrontend` includes the docked editor layout, menu bar, toolbar, outliner, details panel, content browser, and the active WebRTC viewport client in `components/engine/viewport.tsx` - the old inline localhost:8080 page has been retired; the server now focuses on backend/session and diagnostics endpoints diff --git a/README.md b/README.md index b701b43e..95cfc4dd 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,14 @@ AxiomRemoteViewportServer (C++) └─ EditorSession (authoritative scene state) ├─ Vulkan Renderer (offscreen, per-client) └─ ScriptHost (Coral .NET 9 / C# scripting) + +AxiomCore runtime flow + └─ ModuleManager (register / enable / disable / query modules) + ├─ Application modules (window polling, layer update, layer render, renderer frame) + ├─ Host modules (session transport, script host lifecycle) + ├─ Editor feature modules (viewport input, selection, scene render) + ├─ Headless overlay module (billboards, colliders, presence, gizmo overlay state) + └─ EditorSession internal modules (scene-state coordination, command validation) ``` ## Features @@ -33,6 +41,7 @@ AxiomRemoteViewportServer (C++) - Vulkan rendering backend with MoltenVK on macOS - Headless offscreen rendering with H.264 encoding (VideoToolbox on macOS) - Authoritative command/event model for scene mutations +- Foundational engine module/plugin system with lifecycle-managed runtime modules and queryable active state - DataModel scene hierarchy — folders, meshes, lights, cameras, actors - Transform gizmos (translate / scale / rotate) with server-side hit-testing - Multi-client rendering: each connected user gets their own viewport @@ -60,6 +69,12 @@ AxiomRemoteViewportServer (C++) - Perspective / Orthographic viewport projection toggle; HDR skybox automatically falls back to gradient in orthographic mode - Place Actors panel: searchable, category-filtered panel with click-to-place and drag-to-viewport placement; shapes (Cube, Sphere, Cylinder, Cone, Plane) place a Mesh child inside an Actor wrapper; lights, cameras, and generic actors each place their appropriate type +**Runtime architecture** +- `IModule` / `ModuleManager` foundation for engine-owned feature registration, initialization, update, shutdown, active-state toggling, and future CVAR/config integration +- `Application` loop now executes module phases instead of hardcoding subsystem updates +- Core app flow, headless host flow, editor viewport flow, and headless overlay rendering are split into focused modules instead of living in monolithic layer/application classes +- `EditorSession` now delegates scene-state/tree synchronization and command validation to dedicated internal session modules + ## Prerequisites - CMake 3.10+ From ee7eed02eb3077236a9e395d110619728bc04ced Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 17:40:46 -0500 Subject: [PATCH 07/41] uWebSockets integration --- Headless/AxiomRemoteViewportServer.cpp | 24 +- Headless/CMakeLists.txt | 46 +- Headless/RemoteViewportServer.cpp | 897 ++++++++++--------------- Headless/RemoteViewportServer.h | 65 +- Headless/WraithNetworkingModule.cpp | 99 +++ Headless/WraithNetworkingModule.h | 78 +++ Tests/CMakeLists.txt | 5 + Tests/UWebSocketsVendorTests.cpp | 12 + Tests/WraithNetworkingModuleTests.cpp | 156 +++++ 9 files changed, 831 insertions(+), 551 deletions(-) create mode 100644 Headless/WraithNetworkingModule.cpp create mode 100644 Headless/WraithNetworkingModule.h create mode 100644 Tests/UWebSocketsVendorTests.cpp create mode 100644 Tests/WraithNetworkingModuleTests.cpp diff --git a/Headless/AxiomRemoteViewportServer.cpp b/Headless/AxiomRemoteViewportServer.cpp index 70691490..d5e436e6 100644 --- a/Headless/AxiomRemoteViewportServer.cpp +++ b/Headless/AxiomRemoteViewportServer.cpp @@ -1,8 +1,10 @@ #include "RemoteViewportServer.h" +#include "WraithNetworkingModule.h" #include "HeadlessCommandProtocol.h" #include +#include int main(int argc, char **argv) { std::string Error; @@ -19,18 +21,30 @@ int main(int argc, char **argv) { return 1; } - Axiom::RemoteViewportServer Server(Host, Options); - if (!Server.Start(Error)) { - std::cerr << Axiom::SerializeError(Error) << std::endl; + auto NetworkingModule = + std::make_unique(Host, Options); + Axiom::WraithNetworkingModule *NetworkingModulePtr = NetworkingModule.get(); + if (!Host.GetModuleManager().RegisterModule(std::move(NetworkingModule))) { + std::cerr + << Axiom::SerializeError("Failed to register the WraithNetworking module.") + << std::endl; + return 1; + } + const auto NetworkingState = NetworkingModulePtr->GetStateSnapshot(); + if (!NetworkingModulePtr->IsInitialized()) { + std::cerr << Axiom::SerializeError( + NetworkingState.LastError.empty() + ? "Failed to initialize the WraithNetworking module." + : NetworkingState.LastError) + << std::endl; return 1; } std::cout << Axiom::SerializeReady(Options.Width, Options.Height) << std::endl; - while (!Server.ShouldStop() && Host.Step()) { + while (!NetworkingModulePtr->ShouldStop() && Host.Step()) { } - Server.Stop(); std::cout << Axiom::SerializeShutdown() << std::endl; return 0; } diff --git a/Headless/CMakeLists.txt b/Headless/CMakeLists.txt index b136523f..3dbe5702 100644 --- a/Headless/CMakeLists.txt +++ b/Headless/CMakeLists.txt @@ -1,3 +1,41 @@ +add_library(uSockets STATIC + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/uSockets/src/bsd.c" + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/uSockets/src/context.c" + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/uSockets/src/loop.c" + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/uSockets/src/socket.c" + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/uSockets/src/udp.c" + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/uSockets/src/eventing/epoll_kqueue.c" +) + +target_include_directories(uSockets PUBLIC + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/uSockets/src" +) + +target_compile_definitions(uSockets PUBLIC LIBUS_NO_SSL) + +add_library(uWebSocketsVendor INTERFACE) +target_include_directories(uWebSocketsVendor INTERFACE + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/src" + "${CMAKE_SOURCE_DIR}/ThirdParty/uWebSockets/uSockets/src" +) +target_link_libraries(uWebSocketsVendor INTERFACE uSockets) + +add_library(WraithNetworking STATIC + RemoteViewportServer.cpp + WraithNetworkingModule.cpp +) + +target_include_directories(WraithNetworking PUBLIC + "${CMAKE_SOURCE_DIR}/Headless" + "${CMAKE_SOURCE_DIR}/ThirdParty/glfw/deps" +) + +target_link_libraries(WraithNetworking PUBLIC AxiomCore uWebSocketsVendor) + +if(WIN32) + target_link_libraries(WraithNetworking PUBLIC ws2_32 advapi32) +endif() + add_executable(AxiomHeadless AxiomHeadless.cpp HeadlessCommandProtocol.cpp @@ -31,7 +69,6 @@ target_link_libraries(AxiomRemoteViewportDevClient PRIVATE AxiomCore) add_executable(AxiomRemoteViewportServer AxiomRemoteViewportServer.cpp - RemoteViewportServer.cpp HeadlessCommandProtocol.cpp HeadlessOverlayModule.cpp HostModules.cpp @@ -64,7 +101,7 @@ target_include_directories(AxiomRemoteViewportServer PRIVATE "${CMAKE_SOURCE_DIR}/ThirdParty/glfw/deps" ) -target_link_libraries(AxiomRemoteViewportServer PRIVATE AxiomCore) +target_link_libraries(AxiomRemoteViewportServer PRIVATE AxiomCore WraithNetworking) target_link_libraries(AxiomPackagedRuntime PRIVATE AxiomCore) set_target_properties(AxiomPackagedRuntime PROPERTIES @@ -74,8 +111,3 @@ set_target_properties(AxiomPackagedRuntime PROPERTIES target_compile_definitions(AxiomCore PUBLIC AXIOM_PACKAGED_RUNTIME_BINARY_PATH="$" ) - -if(WIN32) - target_link_libraries(AxiomRemoteViewportServer PRIVATE ws2_32) - target_link_libraries(AxiomRemoteViewportServer PRIVATE advapi32) -endif() diff --git a/Headless/RemoteViewportServer.cpp b/Headless/RemoteViewportServer.cpp index 3b261dde..6b91b0db 100644 --- a/Headless/RemoteViewportServer.cpp +++ b/Headless/RemoteViewportServer.cpp @@ -9,6 +9,9 @@ #include "GizmoHitTest.h" #include "HeadlessCommandProtocol.h" +#include +#include +#include #include #include #include @@ -23,9 +26,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -49,11 +54,29 @@ #endif namespace Axiom { +struct RemoteViewportServerUwsState { + std::mutex StartupMutex; + std::condition_variable StartupCondition; + bool StartupCompleted{false}; + std::string StartupError; + uWS::Loop *Loop{nullptr}; + std::unique_ptr App; + us_listen_socket_t *ListenSocket{nullptr}; +}; + namespace { -constexpr std::string_view WebSocketGuid = - "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; constexpr std::string_view ClientIdHeaderName = "X-Axiom-Client-Id"; +struct RemoteViewportWebSocketUserData { + uintptr_t ConnectionId{0}; +}; + +using UwsHttpRequest = uWS::HttpRequest; +using UwsHttpResponse = uWS::HttpResponse; +using UwsWebSocket = + uWS::WebSocket; +std::function g_HttpResponseSender; + #if AXIOM_PLATFORM_WINDOWS using SocketHandle = SOCKET; constexpr SocketHandle InvalidSocket = INVALID_SOCKET; @@ -99,14 +122,6 @@ void SetReuseAddress(SocketHandle Socket) { #endif } -struct HttpRequest { - std::string Method; - std::string Path; - std::string HeaderBlock; - std::string Body; - size_t ContentLength{0}; -}; - std::string BuildHttpResponse(std::string_view Status, std::string_view ContentType, std::string_view Body, @@ -125,7 +140,74 @@ std::string BuildHttpResponse(std::string_view Status, return Stream.str(); } +std::string Trim(std::string_view Value); + +struct ParsedHttpResponse { + std::string Status; + std::vector> Headers; + std::string Body; +}; + +std::optional ParseHttpResponseText(std::string_view Response) { + const size_t HeaderEnd = Response.find("\r\n\r\n"); + if (HeaderEnd == std::string_view::npos) { + return std::nullopt; + } + + const std::string_view HeaderBlock = Response.substr(0, HeaderEnd); + const size_t StatusLineEnd = HeaderBlock.find("\r\n"); + if (StatusLineEnd == std::string_view::npos) { + return std::nullopt; + } + + const std::string_view StatusLine = HeaderBlock.substr(0, StatusLineEnd); + const size_t FirstSpace = StatusLine.find(' '); + if (FirstSpace == std::string_view::npos || FirstSpace + 1 >= StatusLine.size()) { + return std::nullopt; + } + + ParsedHttpResponse Parsed{}; + Parsed.Status = std::string(StatusLine.substr(FirstSpace + 1)); + Parsed.Body = std::string(Response.substr(HeaderEnd + 4)); + + size_t LineStart = StatusLineEnd + 2; + while (LineStart < HeaderBlock.size()) { + const size_t LineEnd = HeaderBlock.find("\r\n", LineStart); + const std::string_view Line = HeaderBlock.substr( + LineStart, (LineEnd == std::string_view::npos ? HeaderBlock.size() : LineEnd) - + LineStart); + const size_t Colon = Line.find(':'); + if (Colon != std::string_view::npos) { + Parsed.Headers.emplace_back(std::string(Trim(Line.substr(0, Colon))), + std::string(Trim(Line.substr(Colon + 1)))); + } + + if (LineEnd == std::string_view::npos) { + break; + } + LineStart = LineEnd + 2; + } + + return Parsed; +} + +std::string BuildHeaderBlock(std::string_view Method, UwsHttpRequest &Request) { + std::ostringstream Stream; + Stream << Method << ' ' << Request.getFullUrl() << " HTTP/1.1\r\n"; + for (const auto &[Key, Value] : Request) { + Stream << Key << ": " << Value << "\r\n"; + } + Stream << "\r\n"; + return Stream.str(); +} + bool SendAll(SocketHandle Socket, const void *Data, size_t Size) { + if (g_HttpResponseSender) { + return g_HttpResponseSender(static_cast(Socket), + std::string_view(static_cast(Data), + Size)); + } + const auto *Bytes = static_cast(Data); size_t Offset = 0; while (Offset < Size) { @@ -144,41 +226,6 @@ bool SendAll(SocketHandle Socket, const void *Data, size_t Size) { return true; } -bool RecvExact(SocketHandle Socket, void *Data, size_t Size) { - auto *Bytes = static_cast(Data); - size_t Offset = 0; - while (Offset < Size) { -#if AXIOM_PLATFORM_WINDOWS - const int Received = - recv(Socket, reinterpret_cast(Bytes + Offset), - static_cast(Size - Offset), 0); -#else - const ssize_t Received = recv( - Socket, reinterpret_cast(Bytes + Offset), Size - Offset, 0); -#endif - if (Received <= 0) { - return false; - } - Offset += static_cast(Received); - } - return true; -} - -bool RecvChunk(SocketHandle Socket, char *Data, size_t Size, size_t &ReceivedOut) { -#if AXIOM_PLATFORM_WINDOWS - const int Received = recv(Socket, Data, static_cast(Size), 0); -#else - const ssize_t Received = recv(Socket, Data, Size, 0); -#endif - if (Received <= 0) { - ReceivedOut = 0; - return false; - } - - ReceivedOut = static_cast(Received); - return true; -} - std::string_view StripQuery(std::string_view Path) { const size_t Query = Path.find('?'); return Query == std::string_view::npos ? Path : Path.substr(0, Query); @@ -287,28 +334,6 @@ bool EqualsCaseInsensitive(std::string_view Left, std::string_view Right) { return true; } -std::optional ParseContentLength(std::string_view Headers) { - const std::string_view Key = "Content-Length:"; - size_t Position = Headers.find(Key); - if (Position == std::string_view::npos) { - return 0u; - } - - Position += Key.size(); - const size_t End = Headers.find("\r\n", Position); - const std::string Value = - Trim(Headers.substr(Position, End == std::string_view::npos - ? std::string_view::npos - : End - Position)); - size_t Result = 0; - const auto [Ptr, Ec] = - std::from_chars(Value.data(), Value.data() + Value.size(), Result); - if (Ec != std::errc{} || Ptr != Value.data() + Value.size()) { - return std::nullopt; - } - return Result; -} - std::optional FindHeaderValue(std::string_view HeaderBlock, std::string_view HeaderName) { size_t LineStart = 0; @@ -332,65 +357,6 @@ std::optional FindHeaderValue(std::string_view HeaderBlock, return std::nullopt; } -bool ReadHttpRequest(SocketHandle Socket, HttpRequest &Request, - std::string &Error) { - std::string Buffer; - std::array Chunk{}; - size_t HeaderEnd = std::string::npos; - - while (HeaderEnd == std::string::npos) { - size_t Received = 0; - if (!RecvChunk(Socket, Chunk.data(), Chunk.size(), Received)) { - Error = "Failed to read HTTP request headers."; - return false; - } - Buffer.append(Chunk.data(), Received); - HeaderEnd = Buffer.find("\r\n\r\n"); - } - - const std::string_view HeaderView(Buffer.data(), HeaderEnd + 4); - const size_t RequestLineEnd = HeaderView.find("\r\n"); - if (RequestLineEnd == std::string_view::npos) { - Error = "Malformed HTTP request line."; - return false; - } - - const std::string_view RequestLine = HeaderView.substr(0, RequestLineEnd); - const size_t MethodEnd = RequestLine.find(' '); - const size_t PathEnd = - MethodEnd == std::string_view::npos ? std::string_view::npos - : RequestLine.find(' ', MethodEnd + 1); - if (MethodEnd == std::string_view::npos || PathEnd == std::string_view::npos) { - Error = "Malformed HTTP request line."; - return false; - } - - Request.Method = std::string(RequestLine.substr(0, MethodEnd)); - Request.Path = - std::string(RequestLine.substr(MethodEnd + 1, PathEnd - MethodEnd - 1)); - Request.HeaderBlock = std::string(HeaderView); - - const auto ContentLength = ParseContentLength(HeaderView); - if (!ContentLength.has_value()) { - Error = "Invalid Content-Length header."; - return false; - } - Request.ContentLength = *ContentLength; - - const size_t BodyOffset = HeaderEnd + 4; - while (Buffer.size() < BodyOffset + Request.ContentLength) { - size_t Received = 0; - if (!RecvChunk(Socket, Chunk.data(), Chunk.size(), Received)) { - Error = "Failed to read HTTP request body."; - return false; - } - Buffer.append(Chunk.data(), Received); - } - - Request.Body.assign(Buffer.data() + BodyOffset, Request.ContentLength); - return true; -} - std::string JsonResponse(std::string_view Status, std::string_view Payload) { return BuildHttpResponse(Status, "application/json; charset=utf-8", Payload); } @@ -714,161 +680,6 @@ std::vector MakeThumbnailJpeg(const std::filesystem::path &Path, return JpegBytes; } -std::string Base64Encode(const unsigned char *Data, size_t Size) { - static constexpr char Alphabet[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - std::string Encoded; - Encoded.reserve(((Size + 2u) / 3u) * 4u); - for (size_t Index = 0; Index < Size; Index += 3u) { - const uint32_t Byte0 = Data[Index]; - const uint32_t Byte1 = Index + 1u < Size ? Data[Index + 1u] : 0u; - const uint32_t Byte2 = Index + 2u < Size ? Data[Index + 2u] : 0u; - const uint32_t Triple = (Byte0 << 16u) | (Byte1 << 8u) | Byte2; - - Encoded.push_back(Alphabet[(Triple >> 18u) & 0x3Fu]); - Encoded.push_back(Alphabet[(Triple >> 12u) & 0x3Fu]); - Encoded.push_back(Index + 1u < Size ? Alphabet[(Triple >> 6u) & 0x3Fu] - : '='); - Encoded.push_back(Index + 2u < Size ? Alphabet[Triple & 0x3Fu] : '='); - } - return Encoded; -} - -std::optional> -ComputeSha1(std::string_view Input) { - std::array Digest{}; - uint64_t BitLength = static_cast(Input.size()) * 8u; - std::vector Buffer(Input.begin(), Input.end()); - Buffer.push_back(0x80u); - while ((Buffer.size() % 64u) != 56u) { - Buffer.push_back(0u); - } - for (int Shift = 56; Shift >= 0; Shift -= 8) { - Buffer.push_back( - static_cast((BitLength >> Shift) & 0xFFu)); - } - - uint32_t H0 = 0x67452301u; - uint32_t H1 = 0xEFCDAB89u; - uint32_t H2 = 0x98BADCFEu; - uint32_t H3 = 0x10325476u; - uint32_t H4 = 0xC3D2E1F0u; - - auto LeftRotate = [](uint32_t Value, int Shift) { - return static_cast((Value << Shift) | (Value >> (32 - Shift))); - }; - - for (size_t ChunkOffset = 0; ChunkOffset < Buffer.size(); - ChunkOffset += 64u) { - std::array Words{}; - for (size_t Index = 0; Index < 16u; ++Index) { - const size_t Base = ChunkOffset + (Index * 4u); - Words[Index] = (static_cast(Buffer[Base]) << 24u) | - (static_cast(Buffer[Base + 1u]) << 16u) | - (static_cast(Buffer[Base + 2u]) << 8u) | - static_cast(Buffer[Base + 3u]); - } - for (size_t Index = 16u; Index < Words.size(); ++Index) { - Words[Index] = LeftRotate( - Words[Index - 3u] ^ Words[Index - 8u] ^ Words[Index - 14u] ^ - Words[Index - 16u], - 1); - } - - uint32_t A = H0; - uint32_t B = H1; - uint32_t C = H2; - uint32_t D = H3; - uint32_t E = H4; - - for (size_t Index = 0; Index < Words.size(); ++Index) { - uint32_t F = 0; - uint32_t K = 0; - if (Index < 20u) { - F = (B & C) | ((~B) & D); - K = 0x5A827999u; - } else if (Index < 40u) { - F = B ^ C ^ D; - K = 0x6ED9EBA1u; - } else if (Index < 60u) { - F = (B & C) | (B & D) | (C & D); - K = 0x8F1BBCDCu; - } else { - F = B ^ C ^ D; - K = 0xCA62C1D6u; - } - - const uint32_t Temp = - LeftRotate(A, 5) + F + E + K + Words[Index]; - E = D; - D = C; - C = LeftRotate(B, 30); - B = A; - A = Temp; - } - - H0 += A; - H1 += B; - H2 += C; - H3 += D; - H4 += E; - } - - const std::array State{H0, H1, H2, H3, H4}; - for (size_t Index = 0; Index < State.size(); ++Index) { - const uint32_t Word = State[Index]; - Digest[Index * 4u] = static_cast((Word >> 24u) & 0xFFu); - Digest[Index * 4u + 1u] = - static_cast((Word >> 16u) & 0xFFu); - Digest[Index * 4u + 2u] = - static_cast((Word >> 8u) & 0xFFu); - Digest[Index * 4u + 3u] = static_cast(Word & 0xFFu); - } - - return Digest; -} - -bool IsWebSocketUpgradeRequest(std::string_view HeaderBlock) { - const auto Upgrade = FindHeaderValue(HeaderBlock, "Upgrade"); - const auto Connection = FindHeaderValue(HeaderBlock, "Connection"); - std::string LowerConnection = - Connection.has_value() ? *Connection : std::string(); - std::transform(LowerConnection.begin(), LowerConnection.end(), - LowerConnection.begin(), - [](unsigned char Character) { - return static_cast(std::tolower(Character)); - }); - return Upgrade.has_value() && Connection.has_value() && - EqualsCaseInsensitive(*Upgrade, "websocket") && - LowerConnection.find("upgrade") != std::string::npos; -} - -std::vector BuildWebSocketFrame(uint8_t Opcode, const void *Data, - size_t Size) { - std::vector Frame; - Frame.reserve(Size + 10u); - Frame.push_back(static_cast(0x80u | (Opcode & 0x0Fu))); - if (Size <= 125u) { - Frame.push_back(static_cast(Size)); - } else if (Size <= 0xFFFFu) { - Frame.push_back(126u); - Frame.push_back(static_cast((Size >> 8u) & 0xFFu)); - Frame.push_back(static_cast(Size & 0xFFu)); - } else { - Frame.push_back(127u); - for (int Shift = 56; Shift >= 0; Shift -= 8) { - Frame.push_back( - static_cast((static_cast(Size) >> Shift) & - 0xFFu)); - } - } - - const auto *Bytes = static_cast(Data); - Frame.insert(Frame.end(), Bytes, Bytes + Size); - return Frame; -} - std::string GenerateClientId() { static std::atomic Counter{1}; const uint64_t Value = Counter.fetch_add(1); @@ -901,57 +712,199 @@ RemoteViewportServer::RemoteViewportServer( RemoteViewportServer::~RemoteViewportServer() { Stop(); } +RemoteViewportServerMetrics RemoteViewportServer::GetMetrics() const { + RemoteViewportServerMetrics Metrics{}; + Metrics.TransportConnected = m_TransportConnected.load(); + Metrics.ListenPort = m_Options.Port; + Metrics.TotalHttpRequests = m_TotalHttpRequests.load(); + Metrics.TotalWebSocketMessages = m_TotalWebSocketMessages.load(); + + std::scoped_lock Lock(m_ClientMutex); + Metrics.ActiveWebSocketClients = m_WebSocketClients.size(); + Metrics.ActiveRemoteClients = m_RemoteClientsById.size(); + for (const auto &[ClientId, Client] : m_RemoteClientsById) { + (void)ClientId; + if (Client.WebRtcSession != nullptr) { + ++Metrics.ActiveWebRtcSessions; + } + } + return Metrics; +} + bool RemoteViewportServer::Start(std::string &Error) { -#if AXIOM_PLATFORM_WINDOWS - WinsockRuntime Winsock; - (void)Winsock; -#endif + m_StopRequested.store(false); + g_HttpResponseSender = [this](uintptr_t ClientSocketValue, + std::string_view Response) { + return SendHttpResponse(ClientSocketValue, Response); + }; + m_UwsState = std::make_unique(); + m_Host.GetTransport().Connect(this); + m_ServerThread = std::thread([this]() { + RemoteViewportServerUwsState *State = m_UwsState.get(); + if (State == nullptr) { + return; + } + + State->Loop = uWS::Loop::get(); + State->App = std::make_unique(); + + auto RegisterGetHandler = [this](UwsHttpResponse *Response, + UwsHttpRequest *Request) { + const uintptr_t ConnectionId = AllocateConnectionId(); + RegisterPendingHttpResponse(ConnectionId, Response); + Response->onAborted([this, ConnectionId]() { + MarkPendingHttpResponseAborted(ConnectionId); + }); + + const std::string HeaderBlock = BuildHeaderBlock("GET", *Request); + m_TotalHttpRequests.fetch_add(1); + HandleGetRequest(ConnectionId, std::string(Request->getFullUrl()), + HeaderBlock); + }; - addrinfo Hint{}; - Hint.ai_family = AF_INET; - Hint.ai_socktype = SOCK_STREAM; - Hint.ai_protocol = IPPROTO_TCP; - Hint.ai_flags = AI_PASSIVE; + auto RegisterOptionsHandler = [this](UwsHttpResponse *Response, + UwsHttpRequest *Request) { + (void)Request; + const uintptr_t ConnectionId = AllocateConnectionId(); + RegisterPendingHttpResponse(ConnectionId, Response); + Response->onAborted([this, ConnectionId]() { + MarkPendingHttpResponseAborted(ConnectionId); + }); + + m_TotalHttpRequests.fetch_add(1); + const std::string ResponseText = BuildHttpResponse( + "204 No Content", "text/plain; charset=utf-8", "", + "Access-Control-Allow-Methods: GET, POST, OPTIONS\r\n" + "Access-Control-Allow-Headers: Content-Type, X-Axiom-Client-Id\r\n"); + SendHttpResponse(ConnectionId, ResponseText); + }; - addrinfo *AddressInfo = nullptr; - const std::string PortString = std::to_string(m_Options.Port); - if (getaddrinfo(m_Options.Host.c_str(), PortString.c_str(), &Hint, - &AddressInfo) != 0) { - Error = "Failed to resolve the remote viewport server address."; - return false; - } + auto RegisterPostHandler = [this](UwsHttpResponse *Response, + UwsHttpRequest *Request) { + const uintptr_t ConnectionId = AllocateConnectionId(); + RegisterPendingHttpResponse(ConnectionId, Response); + Response->onAborted([this, ConnectionId]() { + MarkPendingHttpResponseAborted(ConnectionId); + }); + + auto HeaderBlock = + std::make_shared(BuildHeaderBlock("POST", *Request)); + auto Path = std::make_shared(Request->getFullUrl()); + auto Body = std::make_shared(); + m_TotalHttpRequests.fetch_add(1); + + const std::string_view ContentLength = Request->getHeader("content-length"); + if (ContentLength.empty() || ContentLength == "0") { + HandlePostRequest(ConnectionId, *Path, *HeaderBlock, ""); + return; + } - SocketHandle ListenSocket = InvalidSocket; - for (addrinfo *Current = AddressInfo; Current != nullptr; - Current = Current->ai_next) { - ListenSocket = - socket(Current->ai_family, Current->ai_socktype, Current->ai_protocol); - if (ListenSocket == InvalidSocket) { - continue; + Response->onData([this, ConnectionId, HeaderBlock, Path, Body]( + std::string_view Chunk, bool IsLast) { + Body->append(Chunk.data(), Chunk.size()); + if (IsLast) { + HandlePostRequest(ConnectionId, *Path, *HeaderBlock, *Body); + } + }); + }; + + uWS::App::WebSocketBehavior Behavior{}; + Behavior.compression = uWS::DISABLED; + Behavior.maxPayloadLength = 256 * 1024; + Behavior.upgrade = + [this](UwsHttpResponse *Response, UwsHttpRequest *Request, + us_socket_context_t *Context) { + const uintptr_t ConnectionId = AllocateConnectionId(); + Response->template upgrade( + {.ConnectionId = ConnectionId}, + Request->getHeader("sec-websocket-key"), + Request->getHeader("sec-websocket-protocol"), + Request->getHeader("sec-websocket-extensions"), Context); + }; + Behavior.open = [this](UwsWebSocket *Socket) { + const uintptr_t ConnectionId = Socket->getUserData()->ConnectionId; + { + std::scoped_lock Lock(m_ClientMutex); + m_WebSocketClients.push_back( + {.ConnectionId = ConnectionId, .Socket = Socket, .IsOpen = true}); + } + std::cout << SerializeConnected() << std::endl; + SendTextMessage(ConnectionId, + SerializeReady(m_Options.Width, m_Options.Height)); + SendTextMessage(ConnectionId, SerializeConnected()); + }; + Behavior.message = [this](UwsWebSocket *Socket, std::string_view Message, + uWS::OpCode OpCode) { + if (OpCode != uWS::OpCode::TEXT) { + return; + } + const uintptr_t ConnectionId = Socket->getUserData()->ConnectionId; + if (!HandleWebSocketMessage(ConnectionId, Message)) { + SendTextMessage(ConnectionId, + SerializeError("Invalid WebSocket command payload.")); + } + }; + Behavior.close = [this](UwsWebSocket *Socket, int Code, + std::string_view Message) { + (void)Code; + (void)Message; + RemoveWebSocketClient(Socket->getUserData()->ConnectionId); + }; + + State->App->ws("/ws", std::move(Behavior)) + .get("/*", std::move(RegisterGetHandler)) + .post("/*", std::move(RegisterPostHandler)) + .options("/*", std::move(RegisterOptionsHandler)) + .listen(m_Options.Host, static_cast(m_Options.Port), + [State](us_listen_socket_t *ListenSocket) { + std::scoped_lock Lock(State->StartupMutex); + State->ListenSocket = ListenSocket; + State->StartupCompleted = true; + if (ListenSocket == nullptr) { + State->StartupError = + "Failed to bind the remote viewport server socket."; + } + State->StartupCondition.notify_all(); + }); + + { + std::scoped_lock Lock(State->StartupMutex); + if (!State->StartupCompleted) { + State->StartupCompleted = true; + State->StartupError = + "uWebSockets did not complete remote viewport startup."; + State->StartupCondition.notify_all(); + } } - SetReuseAddress(ListenSocket); + if (State->ListenSocket != nullptr) { + State->Loop->run(); + } - if (bind(ListenSocket, Current->ai_addr, Current->ai_addrlen) == 0 && - listen(ListenSocket, SOMAXCONN) == 0) { - break; + State->App.reset(); + if (State->Loop != nullptr) { + State->Loop->free(); + State->Loop = nullptr; } + }); - CloseSocket(ListenSocket); - ListenSocket = InvalidSocket; + { + std::unique_lock Lock(m_UwsState->StartupMutex); + m_UwsState->StartupCondition.wait( + Lock, [this]() { return m_UwsState->StartupCompleted; }); + Error = m_UwsState->StartupError; } - freeaddrinfo(AddressInfo); - - if (ListenSocket == InvalidSocket) { - Error = "Failed to bind the remote viewport server socket."; + if (!Error.empty()) { + m_StopRequested.store(true); + if (m_ServerThread.joinable()) { + m_ServerThread.join(); + } + m_Host.GetTransport().Disconnect(this); + m_UwsState.reset(); return false; } - m_ListenSocket = ToValue(ListenSocket); - m_StopRequested.store(false); - m_Host.GetTransport().Connect(this); - m_AcceptThread = std::thread([this]() { AcceptLoop(); }); m_PresenceThread = std::thread([this]() { PresenceLoop(); }); return true; } @@ -962,12 +915,21 @@ void RemoteViewportServer::Stop() { return; } - const SocketHandle ListenSocket = ToSocket(m_ListenSocket); - m_ListenSocket = ToValue(InvalidSocket); - CloseSocket(ListenSocket); CloseAllClients(); - if (m_AcceptThread.joinable()) { - m_AcceptThread.join(); + if (m_UwsState != nullptr && m_UwsState->Loop != nullptr) { + RemoteViewportServerUwsState *State = m_UwsState.get(); + m_UwsState->Loop->defer([State]() { + if (State->ListenSocket != nullptr) { + us_listen_socket_close(0, State->ListenSocket); + State->ListenSocket = nullptr; + } + if (State->App != nullptr) { + State->App->close(); + } + }); + } + if (m_ServerThread.joinable()) { + m_ServerThread.join(); } if (m_PresenceThread.joinable()) { m_PresenceThread.join(); @@ -977,6 +939,8 @@ void RemoteViewportServer::Stop() { for (IWebRtcSession *Session : CollectClientWebRtcSessions()) { Session->ResetPeer("server_stopped"); } + g_HttpResponseSender = nullptr; + m_UwsState.reset(); } void RemoteViewportServer::OnSessionTransportConnected() { @@ -1067,41 +1031,13 @@ void RemoteViewportServer::PresenceLoop() { } } -void RemoteViewportServer::AcceptLoop() { - const SocketHandle ListenSocket = ToSocket(m_ListenSocket); - while (!m_StopRequested.load()) { - sockaddr_in ClientAddress{}; - socklen_t ClientAddressLength = sizeof(ClientAddress); - const SocketHandle ClientSocket = - accept(ListenSocket, reinterpret_cast(&ClientAddress), - &ClientAddressLength); - if (ClientSocket == InvalidSocket) { - if (!m_StopRequested.load()) { - std::this_thread::sleep_for(std::chrono::milliseconds(25)); - } - continue; - } - - std::thread(&RemoteViewportServer::HandleClient, this, ToValue(ClientSocket)) - .detach(); - } -} - -void RemoteViewportServer::HandleClient(uintptr_t ClientSocketValue) { - const SocketHandle ClientSocket = ToSocket(ClientSocketValue); - if (HandleHttpRequest(ClientSocketValue)) { - return; - } - CloseSocket(ClientSocket); -} - void RemoteViewportServer::BroadcastTextMessage(std::string Message) { std::vector Clients; { std::scoped_lock Lock(m_ClientMutex); for (const auto &Client : m_WebSocketClients) { if (Client.IsOpen) { - Clients.push_back(Client.SocketValue); + Clients.push_back(Client.ConnectionId); } } } @@ -1119,18 +1055,16 @@ void RemoteViewportServer::BroadcastTextMessage(std::string Message) { } void RemoteViewportServer::CloseAllClients() { - std::vector ClientSockets; { std::scoped_lock Lock(m_ClientMutex); for (auto &Client : m_WebSocketClients) { Client.IsOpen = false; - ClientSockets.push_back(Client.SocketValue); } m_WebSocketClients.clear(); } - - for (const uintptr_t ClientSocketValue : ClientSockets) { - CloseSocket(ToSocket(ClientSocketValue)); + { + std::scoped_lock Lock(m_HttpResponseMutex); + m_PendingHttpResponses.clear(); } } @@ -1140,7 +1074,7 @@ void RemoteViewportServer::RemoveWebSocketClient(uintptr_t ClientSocketValue) { std::scoped_lock Lock(m_ClientMutex); auto It = std::find_if(m_WebSocketClients.begin(), m_WebSocketClients.end(), [ClientSocketValue](const WebSocketClient &Client) { - return Client.SocketValue == ClientSocketValue; + return Client.ConnectionId == ClientSocketValue; }); if (It != m_WebSocketClients.end()) { It->IsOpen = false; @@ -1150,62 +1084,105 @@ void RemoteViewportServer::RemoveWebSocketClient(uintptr_t ClientSocketValue) { } if (Removed) { - CloseSocket(ToSocket(ClientSocketValue)); std::cout << SerializeDisconnected() << std::endl; } } bool RemoteViewportServer::SendTextMessage(uintptr_t ClientSocketValue, std::string_view Message) { - const auto Frame = BuildWebSocketFrame(0x1u, Message.data(), Message.size()); + void *SocketHandle = nullptr; + { + std::scoped_lock Lock(m_ClientMutex); + const auto It = std::find_if( + m_WebSocketClients.begin(), m_WebSocketClients.end(), + [ClientSocketValue](const WebSocketClient &Client) { + return Client.ConnectionId == ClientSocketValue && Client.IsOpen; + }); + if (It == m_WebSocketClients.end()) { + return false; + } + SocketHandle = It->Socket; + } + + auto *Socket = static_cast(SocketHandle); std::scoped_lock Lock(m_SendMutex); - return SendAll(ToSocket(ClientSocketValue), Frame.data(), Frame.size()); + return Socket->send(Message, uWS::OpCode::TEXT) != UwsWebSocket::DROPPED; } bool RemoteViewportServer::SendBinaryMessage(uintptr_t ClientSocketValue, const void *Data, size_t Size) { - const auto Frame = BuildWebSocketFrame(0x2u, Data, Size); + void *SocketHandle = nullptr; + { + std::scoped_lock Lock(m_ClientMutex); + const auto It = std::find_if( + m_WebSocketClients.begin(), m_WebSocketClients.end(), + [ClientSocketValue](const WebSocketClient &Client) { + return Client.ConnectionId == ClientSocketValue && Client.IsOpen; + }); + if (It == m_WebSocketClients.end()) { + return false; + } + SocketHandle = It->Socket; + } + + auto *Socket = static_cast(SocketHandle); + const std::string_view Payload(static_cast(Data), Size); std::scoped_lock Lock(m_SendMutex); - return SendAll(ToSocket(ClientSocketValue), Frame.data(), Frame.size()); + return Socket->send(Payload, uWS::OpCode::BINARY) != UwsWebSocket::DROPPED; } -bool RemoteViewportServer::HandleHttpRequest(uintptr_t ClientSocketValue) { - const SocketHandle ClientSocket = ToSocket(ClientSocketValue); - HttpRequest Request{}; - std::string Error; - if (!ReadHttpRequest(ClientSocket, Request, Error)) { - const std::string Response = - JsonResponse("400 Bad Request", SerializeError(Error)); - SendAll(ClientSocket, Response.data(), Response.size()); - return false; +bool RemoteViewportServer::SendHttpResponse(uintptr_t ClientSocketValue, + std::string_view Response) { + PendingHttpResponse Pending{}; + { + std::scoped_lock Lock(m_HttpResponseMutex); + const auto It = m_PendingHttpResponses.find(ClientSocketValue); + if (It == m_PendingHttpResponses.end() || It->second.Aborted) { + return false; + } + Pending = It->second; + m_PendingHttpResponses.erase(It); } - if (Request.Method == "GET" && - HandleWebSocketUpgrade(ClientSocketValue, Request.HeaderBlock, - Request.Path)) { - return true; - } - if (Request.Method == "GET") { - return HandleGetRequest(ClientSocketValue, Request.Path, Request.HeaderBlock); - } - if (Request.Method == "POST") { - return HandlePostRequest(ClientSocketValue, Request.Path, Request.HeaderBlock, - Request.Body); - } - if (Request.Method == "OPTIONS") { - const std::string Response = BuildHttpResponse( - "204 No Content", "text/plain; charset=utf-8", "", - "Access-Control-Allow-Methods: GET, POST, OPTIONS\r\n" - "Access-Control-Allow-Headers: Content-Type, X-Axiom-Client-Id\r\n"); - SendAll(ClientSocket, Response.data(), Response.size()); + auto Parsed = ParseHttpResponseText(Response); + if (!Parsed.has_value()) { return false; } - const std::string Response = JsonResponse( - "405 Method Not Allowed", - SerializeError("Only GET, POST, and OPTIONS are supported.")); - SendAll(ClientSocket, Response.data(), Response.size()); - return false; + auto *HttpResponse = static_cast(Pending.Response); + HttpResponse->writeStatus(Parsed->Status); + for (const auto &[HeaderName, HeaderValue] : Parsed->Headers) { + if (EqualsCaseInsensitive(HeaderName, "Content-Length") || + EqualsCaseInsensitive(HeaderName, "Connection")) { + continue; + } + HttpResponse->writeHeader(HeaderName, HeaderValue); + } + HttpResponse->end(Parsed->Body); + return true; +} + +uintptr_t RemoteViewportServer::AllocateConnectionId() { + return m_NextClientConnectionId.fetch_add(1); +} + +void RemoteViewportServer::RegisterPendingHttpResponse(uintptr_t ClientSocketValue, + void *Response) { + std::scoped_lock Lock(m_HttpResponseMutex); + m_PendingHttpResponses[ClientSocketValue] = PendingHttpResponse{ + .Response = Response, + .Aborted = false, + }; +} + +void RemoteViewportServer::MarkPendingHttpResponseAborted( + uintptr_t ClientSocketValue) { + std::scoped_lock Lock(m_HttpResponseMutex); + auto It = m_PendingHttpResponses.find(ClientSocketValue); + if (It != m_PendingHttpResponses.end()) { + It->second.Aborted = true; + m_PendingHttpResponses.erase(It); + } } bool RemoteViewportServer::HandlePostRequest(uintptr_t ClientSocketValue, @@ -2696,137 +2673,9 @@ void RemoteViewportServer::HandlePlaceActorCommand(SessionUserId User, }}); } -bool RemoteViewportServer::HandleWebSocketUpgrade(uintptr_t ClientSocketValue, - std::string_view HeaderBlock, - std::string_view Path) { - const std::string_view Route = StripQuery(Path); - if (Route != "/ws" || !IsWebSocketUpgradeRequest(HeaderBlock)) { - return false; - } - - const auto Key = FindHeaderValue(HeaderBlock, "Sec-WebSocket-Key"); - if (!Key.has_value()) { - const std::string Response = JsonResponse( - "400 Bad Request", - SerializeError("Missing Sec-WebSocket-Key for WebSocket upgrade.")); - const SocketHandle ClientSocket = ToSocket(ClientSocketValue); - SendAll(ClientSocket, Response.data(), Response.size()); - return false; - } - - const auto Digest = ComputeSha1(*Key + std::string(WebSocketGuid)); - if (!Digest.has_value()) { - const std::string Response = JsonResponse( - "500 Internal Server Error", - SerializeError("Failed to compute WebSocket handshake.")); - const SocketHandle ClientSocket = ToSocket(ClientSocketValue); - SendAll(ClientSocket, Response.data(), Response.size()); - return false; - } - - const std::string Accept = Base64Encode(Digest->data(), Digest->size()); - std::ostringstream Response; - Response << "HTTP/1.1 101 Switching Protocols\r\n" - << "Upgrade: websocket\r\n" - << "Connection: Upgrade\r\n" - << "Sec-WebSocket-Accept: " << Accept << "\r\n\r\n"; - const std::string ResponseText = Response.str(); - const SocketHandle ClientSocket = ToSocket(ClientSocketValue); - if (!SendAll(ClientSocket, ResponseText.data(), ResponseText.size())) { - return false; - } - - { - std::scoped_lock Lock(m_ClientMutex); - m_WebSocketClients.push_back({.SocketValue = ClientSocketValue}); - } - - std::cout << SerializeConnected() << std::endl; - SendTextMessage(ClientSocketValue, - SerializeReady(m_Options.Width, m_Options.Height)); - SendTextMessage(ClientSocketValue, SerializeConnected()); - - RunWebSocketSession(ClientSocketValue); - return true; -} - -void RemoteViewportServer::RunWebSocketSession(uintptr_t ClientSocketValue) { - const SocketHandle ClientSocket = ToSocket(ClientSocketValue); - while (!m_StopRequested.load()) { - std::array Header{}; - if (!RecvExact(ClientSocket, Header.data(), Header.size())) { - break; - } - - const bool IsFinal = (Header[0] & 0x80u) != 0u; - const uint8_t Opcode = static_cast(Header[0] & 0x0Fu); - const bool IsMasked = (Header[1] & 0x80u) != 0u; - uint64_t PayloadLength = static_cast(Header[1] & 0x7Fu); - if (!IsFinal || !IsMasked) { - break; - } - - if (PayloadLength == 126u) { - std::array ExtendedLength{}; - if (!RecvExact(ClientSocket, ExtendedLength.data(), - ExtendedLength.size())) { - break; - } - PayloadLength = (static_cast(ExtendedLength[0]) << 8u) | - static_cast(ExtendedLength[1]); - } else if (PayloadLength == 127u) { - std::array ExtendedLength{}; - if (!RecvExact(ClientSocket, ExtendedLength.data(), - ExtendedLength.size())) { - break; - } - PayloadLength = 0; - for (const unsigned char Byte : ExtendedLength) { - PayloadLength = (PayloadLength << 8u) | static_cast(Byte); - } - } - - std::array MaskingKey{}; - if (!RecvExact(ClientSocket, MaskingKey.data(), MaskingKey.size())) { - break; - } - - std::vector Payload(PayloadLength); - if (PayloadLength > 0u && - !RecvExact(ClientSocket, Payload.data(), Payload.size())) { - break; - } - for (size_t Index = 0; Index < Payload.size(); ++Index) { - Payload[Index] ^= MaskingKey[Index % MaskingKey.size()]; - } - - if (Opcode == 0x8u) { - break; - } - if (Opcode == 0x9u) { - const auto Pong = BuildWebSocketFrame(0xAu, Payload.data(), Payload.size()); - std::scoped_lock Lock(m_SendMutex); - if (!SendAll(ClientSocket, Pong.data(), Pong.size())) { - break; - } - continue; - } - if (Opcode != 0x1u) { - continue; - } - - const std::string TextPayload(Payload.begin(), Payload.end()); - if (!HandleWebSocketMessage(ClientSocketValue, TextPayload)) { - SendTextMessage(ClientSocketValue, - SerializeError("Invalid WebSocket command payload.")); - } - } - - RemoveWebSocketClient(ClientSocketValue); -} - bool RemoteViewportServer::HandleWebSocketMessage(uintptr_t ClientSocketValue, std::string_view Payload) { + m_TotalWebSocketMessages.fetch_add(1); std::string Error; const auto Command = ParseRemoteViewportCommand(Payload, Error); if (!Command.has_value()) { diff --git a/Headless/RemoteViewportServer.h b/Headless/RemoteViewportServer.h index 64a43b33..001d4179 100644 --- a/Headless/RemoteViewportServer.h +++ b/Headless/RemoteViewportServer.h @@ -23,6 +23,8 @@ #include namespace Axiom { +class RemoteViewportServerUwsState; + struct RemoteViewportServerOptions { std::string Host{"127.0.0.1"}; uint16_t Port{8080}; @@ -30,17 +32,42 @@ struct RemoteViewportServerOptions { uint32_t Height{900}; }; -class RemoteViewportServer final : public ISessionTransportSubscriber { +struct RemoteViewportServerMetrics { + bool TransportConnected{false}; + uint16_t ListenPort{0}; + size_t ActiveWebSocketClients{0}; + size_t ActiveRemoteClients{0}; + size_t ActiveWebRtcSessions{0}; + uint64_t TotalHttpRequests{0}; + uint64_t TotalWebSocketMessages{0}; +}; + +class IRemoteViewportServer { +public: + virtual ~IRemoteViewportServer() = default; + + virtual bool Start(std::string &Error) = 0; + virtual void Stop() = 0; + [[nodiscard]] virtual bool ShouldStop() const = 0; + [[nodiscard]] virtual uint16_t GetPort() const = 0; + [[nodiscard]] virtual RemoteViewportServerMetrics GetMetrics() const = 0; +}; + +class RemoteViewportServer final : public IRemoteViewportServer, + public ISessionTransportSubscriber { public: RemoteViewportServer(HeadlessSessionHost &Host, const RemoteViewportServerOptions &Options); ~RemoteViewportServer() override; - bool Start(std::string &Error); - void Stop(); + bool Start(std::string &Error) override; + void Stop() override; - bool ShouldStop() const { return m_StopRequested.load(); } - uint16_t GetPort() const { return m_Options.Port; } + [[nodiscard]] bool ShouldStop() const override { + return m_StopRequested.load(); + } + [[nodiscard]] uint16_t GetPort() const override { return m_Options.Port; } + [[nodiscard]] RemoteViewportServerMetrics GetMetrics() const override; void OnSessionTransportConnected() override; void OnSessionTransportDisconnected() override; @@ -49,6 +76,11 @@ class RemoteViewportServer final : public ISessionTransportSubscriber { void OnSessionTransportViewportFrame(const ViewportFrame &Frame) override; private: + struct PendingHttpResponse { + void *Response{nullptr}; + bool Aborted{false}; + }; + struct GridSnapSettings { bool Enabled{true}; float TranslationStep{1.0f}; @@ -57,7 +89,8 @@ class RemoteViewportServer final : public ISessionTransportSubscriber { }; struct WebSocketClient { - uintptr_t SocketValue{static_cast(~0ull)}; + uintptr_t ConnectionId{static_cast(~0ull)}; + void *Socket{nullptr}; bool IsOpen{true}; }; @@ -90,16 +123,13 @@ class RemoteViewportServer final : public ISessionTransportSubscriber { }; private: - void AcceptLoop(); void PresenceLoop(); - void HandleClient(uintptr_t ClientSocketValue); void BroadcastTextMessage(std::string Message); void CloseAllClients(); void RemoveWebSocketClient(uintptr_t ClientSocketValue); bool SendTextMessage(uintptr_t ClientSocketValue, std::string_view Message); bool SendBinaryMessage(uintptr_t ClientSocketValue, const void *Data, size_t Size); - bool HandleHttpRequest(uintptr_t ClientSocketValue); bool HandleGetRequest(uintptr_t ClientSocketValue, std::string_view Path, std::string_view HeaderBlock); bool HandlePostRequest(uintptr_t ClientSocketValue, std::string_view Path, @@ -139,10 +169,6 @@ class RemoteViewportServer final : public ISessionTransportSubscriber { std::string_view Path, std::string_view HeaderBlock, std::string_view Body); - bool HandleWebSocketUpgrade(uintptr_t ClientSocketValue, - std::string_view HeaderBlock, - std::string_view Path); - void RunWebSocketSession(uintptr_t ClientSocketValue); bool HandleWebSocketMessage(uintptr_t ClientSocketValue, std::string_view Payload); bool HandleClientWebRtcMessage(std::string_view ClientId, @@ -180,21 +206,30 @@ class RemoteViewportServer final : public ISessionTransportSubscriber { std::vector CollectVisibleAssets() const; std::optional ResolveVisibleAssetPath(std::string_view RelativePath) const; + uintptr_t AllocateConnectionId(); + void RegisterPendingHttpResponse(uintptr_t ClientSocketValue, void *Response); + void MarkPendingHttpResponseAborted(uintptr_t ClientSocketValue); + bool SendHttpResponse(uintptr_t ClientSocketValue, std::string_view Response); private: HeadlessSessionHost &m_Host; RemoteViewportServerOptions m_Options; std::atomic m_StopRequested{false}; std::atomic m_TransportConnected{false}; - uintptr_t m_ListenSocket{static_cast(~0ull)}; - std::thread m_AcceptThread; + std::atomic m_NextClientConnectionId{1}; + std::unique_ptr m_UwsState; + std::thread m_ServerThread; std::thread m_PresenceThread; mutable std::mutex m_ClientMutex; std::vector m_WebSocketClients; + mutable std::mutex m_HttpResponseMutex; + std::unordered_map m_PendingHttpResponses; std::unordered_map m_RemoteClientsById; uint64_t m_NextRemoteUserId{2}; mutable std::mutex m_SendMutex; + std::atomic m_TotalHttpRequests{0}; + std::atomic m_TotalWebSocketMessages{0}; const std::filesystem::path m_ProjectsRoot; mutable std::mutex m_ProjectMutex; std::optional m_ActiveProject; diff --git a/Headless/WraithNetworkingModule.cpp b/Headless/WraithNetworkingModule.cpp new file mode 100644 index 00000000..d381bfe4 --- /dev/null +++ b/Headless/WraithNetworkingModule.cpp @@ -0,0 +1,99 @@ +#include "WraithNetworkingModule.h" + +#include "RemoteViewportServer.h" + +namespace Axiom { +namespace { +std::unique_ptr +MakeRemoteViewportServer(HeadlessSessionHost &Host, + const RemoteViewportServerOptions &Options) { + return std::make_unique(Host, Options); +} +} // namespace + +WraithNetworkingModule::WraithNetworkingModule( + HeadlessSessionHost &Host, const RemoteViewportServerOptions &Options, + bool Enabled) + : m_ServerFactory([&Host, Options]() { + return MakeRemoteViewportServer(Host, Options); + }), + m_Enabled(Enabled) {} + +WraithNetworkingModule::WraithNetworkingModule( + RemoteViewportServerFactory ServerFactory, bool Enabled) + : m_ServerFactory(std::move(ServerFactory)), m_Enabled(Enabled) {} + +std::string_view WraithNetworkingModule::GetName() const { return ModuleName; } + +bool WraithNetworkingModule::Initialize(Application &App) { + (void)App; + if (!m_Enabled) { + m_Server.reset(); + m_LastError.clear(); + m_InitializationState = WraithNetworkingInitializationState::Shutdown; + return true; + } + + m_InitializationState = WraithNetworkingInitializationState::Starting; + m_LastError.clear(); + m_Server = m_ServerFactory ? m_ServerFactory() : nullptr; + if (m_Server == nullptr) { + m_LastError = "No remote viewport server factory is configured."; + m_InitializationState = WraithNetworkingInitializationState::Failed; + return false; + } + + if (!m_Server->Start(m_LastError)) { + m_InitializationState = WraithNetworkingInitializationState::Failed; + return false; + } + + m_InitializationState = WraithNetworkingInitializationState::Initialized; + return true; +} + +void WraithNetworkingModule::Update(const ModuleUpdateContext &Context) { + (void)Context; +} + +void WraithNetworkingModule::Shutdown(Application &App) { + (void)App; + if (m_Server != nullptr) { + m_Server->Stop(); + m_Server.reset(); + } + m_InitializationState = WraithNetworkingInitializationState::Shutdown; +} + +bool WraithNetworkingModule::IsInitialized() const { + return m_InitializationState == WraithNetworkingInitializationState::Initialized; +} + +bool WraithNetworkingModule::ShouldStop() const { + return m_Server != nullptr && m_Server->ShouldStop(); +} + +WraithNetworkingStateSnapshot WraithNetworkingModule::GetStateSnapshot() const { + WraithNetworkingStateSnapshot Snapshot{}; + Snapshot.InitializationState = m_InitializationState; + Snapshot.Enabled = m_Enabled; + Snapshot.LastError = m_LastError; + if (m_Server != nullptr) { + Snapshot.Metrics = ConvertMetrics(m_Server->GetMetrics()); + } + return Snapshot; +} + +WraithNetworkingMetrics WraithNetworkingModule::ConvertMetrics( + const RemoteViewportServerMetrics &Metrics) { + return { + .TransportConnected = Metrics.TransportConnected, + .ListenPort = Metrics.ListenPort, + .ActiveWebSocketClients = Metrics.ActiveWebSocketClients, + .ActiveRemoteClients = Metrics.ActiveRemoteClients, + .ActiveWebRtcSessions = Metrics.ActiveWebRtcSessions, + .TotalHttpRequests = Metrics.TotalHttpRequests, + .TotalWebSocketMessages = Metrics.TotalWebSocketMessages, + }; +} +} // namespace Axiom diff --git a/Headless/WraithNetworkingModule.h b/Headless/WraithNetworkingModule.h new file mode 100644 index 00000000..f32d14ba --- /dev/null +++ b/Headless/WraithNetworkingModule.h @@ -0,0 +1,78 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +namespace Axiom { +class Application; +class HeadlessSessionHost; +class IRemoteViewportServer; +struct RemoteViewportServerOptions; +struct RemoteViewportServerMetrics; + +enum class WraithNetworkingInitializationState { + Uninitialized, + Starting, + Initialized, + Failed, + Shutdown, +}; + +struct WraithNetworkingMetrics { + bool TransportConnected{false}; + uint16_t ListenPort{0}; + size_t ActiveWebSocketClients{0}; + size_t ActiveRemoteClients{0}; + size_t ActiveWebRtcSessions{0}; + uint64_t TotalHttpRequests{0}; + uint64_t TotalWebSocketMessages{0}; +}; + +struct WraithNetworkingStateSnapshot { + WraithNetworkingInitializationState InitializationState{ + WraithNetworkingInitializationState::Uninitialized}; + bool Enabled{true}; + std::string LastError; + WraithNetworkingMetrics Metrics; +}; + +using RemoteViewportServerFactory = std::function()>; + +class WraithNetworkingModule final : public IModule { +public: + static constexpr std::string_view ModuleName = "WraithNetworking"; + + WraithNetworkingModule(HeadlessSessionHost &Host, + const RemoteViewportServerOptions &Options, + bool Enabled = true); + explicit WraithNetworkingModule(RemoteViewportServerFactory ServerFactory, + bool Enabled = true); + + [[nodiscard]] std::string_view GetName() const override; + bool Initialize(Application &App) override; + void Update(const ModuleUpdateContext &Context) override; + void Shutdown(Application &App) override; + + [[nodiscard]] bool IsEnabled() const { return m_Enabled; } + [[nodiscard]] bool IsInitialized() const; + [[nodiscard]] bool ShouldStop() const; + [[nodiscard]] WraithNetworkingStateSnapshot GetStateSnapshot() const; + +private: + static WraithNetworkingMetrics + ConvertMetrics(const RemoteViewportServerMetrics &Metrics); + + RemoteViewportServerFactory m_ServerFactory; + std::unique_ptr m_Server; + bool m_Enabled{true}; + WraithNetworkingInitializationState m_InitializationState{ + WraithNetworkingInitializationState::Uninitialized}; + std::string m_LastError; +}; +} // namespace Axiom diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 11cba93a..27b7de9e 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -6,9 +6,13 @@ add_executable(AxiomTests ModuleManagerTests.cpp ProjectTests.cpp SceneLifecycleTests.cpp + UWebSocketsVendorTests.cpp + WraithNetworkingModuleTests.cpp ../Headless/HeadlessOverlayModule.cpp + ../Headless/HeadlessSessionHost.cpp ../Headless/HeadlessSessionLayer.cpp ../Headless/HeadlessCommandProtocol.cpp + ../Headless/HostModules.cpp ../Headless/WebRtcSession.cpp ) @@ -20,6 +24,7 @@ endif() target_link_libraries(AxiomTests PRIVATE AxiomCore + WraithNetworking GTest::gtest_main ) diff --git a/Tests/UWebSocketsVendorTests.cpp b/Tests/UWebSocketsVendorTests.cpp new file mode 100644 index 00000000..f92e960d --- /dev/null +++ b/Tests/UWebSocketsVendorTests.cpp @@ -0,0 +1,12 @@ +#include + +#include + +TEST(UWebSocketsVendorTests, VendoredHeadersAndRuntimeConstruct) { + uWS::App App = uWS::App(); + App.get("/health", [](auto *Response, auto *Request) { + (void)Request; + Response->end("ok"); + }); + SUCCEED(); +} diff --git a/Tests/WraithNetworkingModuleTests.cpp b/Tests/WraithNetworkingModuleTests.cpp new file mode 100644 index 00000000..f2b058cd --- /dev/null +++ b/Tests/WraithNetworkingModuleTests.cpp @@ -0,0 +1,156 @@ +#include + +#include +#include +#include + +#include +#include + +#include +#include + +namespace { +class FakeWindow final : public Axiom::Window { +public: + FakeWindow() : Window("WraithNetworking Test Window", 320, 200) {} + + void PollEvents() override {} + bool IsKeyPressed(int Key) const override { + (void)Key; + return false; + } + bool IsMouseButtonPressed(int Button) const override { + (void)Button; + return false; + } + void GetCursorPosition(double &X, double &Y) const override { + X = 0.0; + Y = 0.0; + } + void SetCursorMode(Axiom::CursorMode Mode) override { Cursor = Mode; } + [[nodiscard]] Axiom::CursorMode GetCursorMode() const override { + return Cursor; + } + [[nodiscard]] bool ShouldClose() const override { return Closed; } + void RequestClose() override { Closed = true; } + [[nodiscard]] void *GetNativeHandle() const override { return nullptr; } + +private: + bool Closed{false}; + Axiom::CursorMode Cursor{Axiom::CursorMode::Normal}; +}; + +class ModuleTestApplication final : public Axiom::Application { +public: + ModuleTestApplication() + : Application( + {.Title = "WraithNetworking Test App", + .Width = 320, + .Height = 200, + .Mode = Axiom::RuntimeMode::HeadlessEditorSession}, + {.Arguments = nullptr, .ArgumentCount = 0}, + {.Window = std::make_unique(), + .RenderSurface = + std::make_shared(320, 200), + .Renderer = nullptr, + .InitializeRenderer = false, + .RegisterDefaultModules = false}) {} +}; + +class FakeRemoteViewportServer final : public Axiom::IRemoteViewportServer { +public: + bool Start(std::string &Error) override { + ++StartCalls; + Error.clear(); + if (!StartResult) { + Error = FailureReason; + return false; + } + Started = true; + return true; + } + + void Stop() override { + ++StopCalls; + Started = false; + } + + [[nodiscard]] bool ShouldStop() const override { return StopRequested; } + [[nodiscard]] uint16_t GetPort() const override { return Metrics.ListenPort; } + [[nodiscard]] Axiom::RemoteViewportServerMetrics GetMetrics() const override { + return Metrics; + } + + bool StartResult{true}; + bool Started{false}; + bool StopRequested{false}; + std::string FailureReason{"start failed"}; + Axiom::RemoteViewportServerMetrics Metrics{ + .TransportConnected = true, + .ListenPort = 8080, + .ActiveWebSocketClients = 2, + .ActiveRemoteClients = 1, + .ActiveWebRtcSessions = 1, + .TotalHttpRequests = 4, + .TotalWebSocketMessages = 6, + }; + size_t StartCalls{0}; + size_t StopCalls{0}; +}; + +TEST(WraithNetworkingModuleTests, + RegistersThroughModuleManagerAndExposesMetrics) { + ModuleTestApplication App; + + FakeRemoteViewportServer *ServerPtr = nullptr; + auto Module = std::make_unique( + [&ServerPtr]() -> std::unique_ptr { + auto Server = std::make_unique(); + ServerPtr = Server.get(); + return Server; + }); + Axiom::WraithNetworkingModule *ModulePtr = Module.get(); + + ASSERT_TRUE(App.GetModuleManager().RegisterModule(std::move(Module))); + ASSERT_NE(ServerPtr, nullptr); + ASSERT_NE(ModulePtr, nullptr); + EXPECT_EQ(ServerPtr->StartCalls, 1u); + EXPECT_TRUE(ModulePtr->IsInitialized()); + + const auto State = ModulePtr->GetStateSnapshot(); + EXPECT_EQ(State.InitializationState, + Axiom::WraithNetworkingInitializationState::Initialized); + EXPECT_TRUE(State.Metrics.TransportConnected); + EXPECT_EQ(State.Metrics.ListenPort, 8080); + EXPECT_EQ(State.Metrics.ActiveWebSocketClients, 2u); + EXPECT_EQ(State.Metrics.ActiveRemoteClients, 1u); + EXPECT_EQ(State.Metrics.ActiveWebRtcSessions, 1u); + EXPECT_EQ(State.Metrics.TotalHttpRequests, 4u); + EXPECT_EQ(State.Metrics.TotalWebSocketMessages, 6u); + + ServerPtr->StopRequested = true; + EXPECT_TRUE(ModulePtr->ShouldStop()); +} + +TEST(WraithNetworkingModuleTests, SurfacesInitializationFailures) { + ModuleTestApplication App; + + auto Module = std::make_unique( + []() -> std::unique_ptr { + auto Server = std::make_unique(); + Server->StartResult = false; + Server->FailureReason = "simulated bind failure"; + return Server; + }); + Axiom::WraithNetworkingModule *ModulePtr = Module.get(); + + ASSERT_TRUE(ModulePtr != nullptr); + EXPECT_TRUE(App.GetModuleManager().RegisterModule(std::move(Module))); + + const auto State = ModulePtr->GetStateSnapshot(); + EXPECT_EQ(State.InitializationState, + Axiom::WraithNetworkingInitializationState::Failed); + EXPECT_EQ(State.LastError, "simulated bind failure"); +} +} // namespace From 1e71b0b91b74dfdb89947e1af3eb832d81a970bd Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 17:43:03 -0500 Subject: [PATCH 08/41] Add uWebSockets as a submodule --- .gitmodules | 3 +++ ThirdParty/uWebSockets | 1 + 2 files changed, 4 insertions(+) create mode 160000 ThirdParty/uWebSockets diff --git a/.gitmodules b/.gitmodules index e69de29b..406d4676 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ThirdParty/uWebSockets"] + path = ThirdParty/uWebSockets + url = https://github.com/uNetworking/uWebSockets.git diff --git a/ThirdParty/uWebSockets b/ThirdParty/uWebSockets new file mode 160000 index 00000000..34809c2e --- /dev/null +++ b/ThirdParty/uWebSockets @@ -0,0 +1 @@ +Subproject commit 34809c2eb8210f15369b251c4405eb2f494a334e From 396d4d39d47f5f40f6c4345e9a0a2a80fa0c5d5a Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 19:45:32 -0500 Subject: [PATCH 09/41] Fix object viewport selection selecting readonly child --- Headless/RemoteViewportServer.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Headless/RemoteViewportServer.cpp b/Headless/RemoteViewportServer.cpp index 6b91b0db..e5e2efef 100644 --- a/Headless/RemoteViewportServer.cpp +++ b/Headless/RemoteViewportServer.cpp @@ -3072,7 +3072,9 @@ bool RemoteViewportServer::HandleClientWebRtcMessage(std::string_view ClientId, } const EditorObjectDetails *Selected = Session.FindSelectedObjectDetails(Client->User); - const auto *DragTD = (Selected != nullptr && Selected->SupportsTransform) + const auto *DragTD = + (Selected != nullptr && Selected->SupportsTransform && + !Selected->TransformReadOnly) ? (Selected->WorldTransform.has_value() ? &*Selected->WorldTransform : (Selected->Transform.has_value() ? &*Selected->Transform : nullptr)) : nullptr; @@ -3124,8 +3126,19 @@ bool RemoteViewportServer::HandleClientWebRtcMessage(std::string_view ClientId, Command->MousePosition, Session.GetState().Scene.MeshInstances, m_Host.GetHeadlessLayer().BuildLightBillboards()); if (Hit.has_value() && !Hit->ObjectId.empty()) { + // Multi-instance mesh assets expand into read-only generated children + // (one per sub-mesh) that share the parent's transform. Picking one of + // these visually selects the asset, but transforms can only be applied + // to the movable root — so promote the selection to the root. + std::string SelectId = Hit->ObjectId; + if (const EditorObjectDetails *Picked = + Session.FindObjectDetails(SelectId); + Picked != nullptr && Picked->IsGeneratedAssetChild && + Picked->GeneratedFromAssetRootId.has_value()) { + SelectId = *Picked->GeneratedFromAssetRootId; + } m_Host.SubmitRemoteCommand(Client->User, - EditorCommand{SelectObjectCommand{.ObjectId = Hit->ObjectId}}); + EditorCommand{SelectObjectCommand{.ObjectId = SelectId}}); } return true; } From 88531b8e513111e9308a489b0c41d187d614bc41 Mon Sep 17 00:00:00 2001 From: Tamely Date: Sun, 24 May 2026 22:06:00 -0500 Subject: [PATCH 10/41] Renderer optimizations --- Axiom/Assets/AssimpImporter.cpp | 6 +- Axiom/Assets/CookedMeshAsset.cpp | 40 ++- Axiom/Assets/CookedMeshAsset.h | 2 +- Axiom/Assets/MeshAsset.cpp | 7 +- Axiom/CMakeLists.txt | 1 + Axiom/Renderer/Mesh.cpp | 44 +++ Axiom/Renderer/Mesh.h | 30 ++- Axiom/Renderer/RenderCommand.cpp | 6 +- Axiom/Renderer/Renderer.cpp | 10 +- Axiom/Renderer/Renderer.h | 3 +- Axiom/Renderer/RendererBackend.h | 3 +- Axiom/Renderer/Vulkan/VulkanMesh.cpp | 21 +- Axiom/Renderer/Vulkan/VulkanMesh.h | 8 +- .../Renderer/Vulkan/VulkanRendererBackend.cpp | 10 +- Axiom/Renderer/Vulkan/VulkanRendererBackend.h | 3 +- Axiom/Renderer/Vulkan/VulkanSceneRenderer.cpp | 30 ++- Axiom/Renderer/Vulkan/VulkanSceneRenderer.h | 11 +- Axiom/Session/EditorSceneRendererAdapter.cpp | 4 +- Content/Cooked/AssetCookManifest.json | 2 +- Content/Cooked/sponza_atrium_3.wmesh | Bin 10862998 -> 9323054 bytes Content/Shaders/mesh_project.comp | 23 +- Content/Shaders/mesh_project.comp.spv | Bin 5248 -> 5448 bytes Headless/HeadlessOverlayModule.cpp | 75 +++--- .../Content/Cooked/AssetCookManifest.json | 252 ++++++++++++++++-- Tests/CookedAssetTests.cpp | 8 +- Tests/LayerTests.cpp | 6 +- 26 files changed, 476 insertions(+), 129 deletions(-) create mode 100644 Axiom/Renderer/Mesh.cpp diff --git a/Axiom/Assets/AssimpImporter.cpp b/Axiom/Assets/AssimpImporter.cpp index 25db0dcf..7bff69d5 100644 --- a/Axiom/Assets/AssimpImporter.cpp +++ b/Axiom/Assets/AssimpImporter.cpp @@ -26,12 +26,12 @@ MeshData ConvertMesh(const aiMesh *AiMesh) { for (unsigned i = 0; i < AiMesh->mNumVertices; ++i) { MeshVertex V{}; V.Position = {AiMesh->mVertices[i].x, AiMesh->mVertices[i].y, - AiMesh->mVertices[i].z, 1.0f}; + AiMesh->mVertices[i].z}; if (AiMesh->HasNormals()) { V.Normal = {AiMesh->mNormals[i].x, AiMesh->mNormals[i].y, - AiMesh->mNormals[i].z, 0.0f}; + AiMesh->mNormals[i].z}; } else { - V.Normal = {0.0f, 1.0f, 0.0f, 0.0f}; + V.Normal = {0.0f, 1.0f, 0.0f}; } if (AiMesh->HasTextureCoords(0)) { V.TexCoord = {AiMesh->mTextureCoords[0][i].x, diff --git a/Axiom/Assets/CookedMeshAsset.cpp b/Axiom/Assets/CookedMeshAsset.cpp index c44c8246..627124c2 100644 --- a/Axiom/Assets/CookedMeshAsset.cpp +++ b/Axiom/Assets/CookedMeshAsset.cpp @@ -46,6 +46,14 @@ static_assert(std::is_trivially_copyable_v); static_assert(std::is_trivially_copyable_v); static_assert(std::is_trivially_copyable_v); +struct LegacyMeshVertexV2 { + glm::vec4 Position{0.0f, 0.0f, 0.0f, 1.0f}; + glm::vec4 Normal{0.0f, 0.0f, 1.0f, 0.0f}; + glm::vec2 TexCoord{0.0f, 0.0f}; +}; + +static_assert(std::is_trivially_copyable_v); + template bool WriteValue(std::ofstream &Stream, const T &Value) { Stream.write(reinterpret_cast(&Value), sizeof(T)); @@ -169,7 +177,8 @@ LoadCookedMeshAsset(const std::filesystem::path &Path) { return std::nullopt; } - if (Header.Version != 1 && Header.Version != kCookedMeshFormatVersion) { + if (Header.Version != 1 && Header.Version != 2 && + Header.Version != kCookedMeshFormatVersion) { A_CORE_WARN("CookedMeshAsset: unsupported version {} in '{}'", Header.Version, Path.string()); return std::nullopt; @@ -222,11 +231,30 @@ LoadCookedMeshAsset(const std::filesystem::path &Path) { Instance.Mesh.Vertices.resize(InstanceMeta.VertexCount); if (InstanceMeta.VertexCount > 0) { - Stream.read(reinterpret_cast(Instance.Mesh.Vertices.data()), - static_cast(Instance.Mesh.Vertices.size() * - sizeof(MeshVertex))); - if (!Stream.good()) - return std::nullopt; + if (Header.Version >= 3) { + Stream.read(reinterpret_cast(Instance.Mesh.Vertices.data()), + static_cast(Instance.Mesh.Vertices.size() * + sizeof(MeshVertex))); + if (!Stream.good()) { + return std::nullopt; + } + } else { + std::vector LegacyVertices(InstanceMeta.VertexCount); + Stream.read(reinterpret_cast(LegacyVertices.data()), + static_cast(LegacyVertices.size() * + sizeof(LegacyMeshVertexV2))); + if (!Stream.good()) { + return std::nullopt; + } + for (size_t VertexIndex = 0; VertexIndex < LegacyVertices.size(); + ++VertexIndex) { + Instance.Mesh.Vertices[VertexIndex] = { + .Position = glm::vec3(LegacyVertices[VertexIndex].Position), + .Normal = glm::vec3(LegacyVertices[VertexIndex].Normal), + .TexCoord = LegacyVertices[VertexIndex].TexCoord, + }; + } + } } Instance.Mesh.Indices.resize(InstanceMeta.IndexCount); diff --git a/Axiom/Assets/CookedMeshAsset.h b/Axiom/Assets/CookedMeshAsset.h index 8297393f..6dca48a1 100644 --- a/Axiom/Assets/CookedMeshAsset.h +++ b/Axiom/Assets/CookedMeshAsset.h @@ -10,7 +10,7 @@ namespace Axiom::Assets { -constexpr uint32_t kCookedMeshFormatVersion = 2; +constexpr uint32_t kCookedMeshFormatVersion = 3; struct CookedMeshSceneData { struct InstanceData { diff --git a/Axiom/Assets/MeshAsset.cpp b/Axiom/Assets/MeshAsset.cpp index f6d466bd..e007ac9b 100644 --- a/Axiom/Assets/MeshAsset.cpp +++ b/Axiom/Assets/MeshAsset.cpp @@ -164,7 +164,7 @@ BuildMeshData(const fastgltf::Asset &Asset, const fastgltf::Primitive &Primitive fastgltf::iterateAccessorWithIndex( Asset, PositionAccessor, [&](const glm::vec3 &Position, size_t Index) { - Result.Mesh.Vertices[Index].Position = glm::vec4(Position, 1.0f); + Result.Mesh.Vertices[Index].Position = Position; Result.Mesh.BoundsMin = glm::min(Result.Mesh.BoundsMin, Position); Result.Mesh.BoundsMax = glm::max(Result.Mesh.BoundsMax, Position); }); @@ -173,12 +173,11 @@ BuildMeshData(const fastgltf::Asset &Asset, const fastgltf::Primitive &Primitive const auto &NormalAccessor = Asset.accessors[*NormalAccessorIndex]; fastgltf::iterateAccessorWithIndex( Asset, NormalAccessor, [&](const glm::vec3 &Normal, size_t Index) { - Result.Mesh.Vertices[Index].Normal = - glm::vec4(glm::normalize(Normal), 0.0f); + Result.Mesh.Vertices[Index].Normal = glm::normalize(Normal); }); } else { for (auto &Vertex : Result.Mesh.Vertices) { - Vertex.Normal = glm::vec4(0.0f, 0.0f, 1.0f, 0.0f); + Vertex.Normal = glm::vec3(0.0f, 0.0f, 1.0f); } } diff --git a/Axiom/CMakeLists.txt b/Axiom/CMakeLists.txt index 7b062c49..d8565854 100644 --- a/Axiom/CMakeLists.txt +++ b/Axiom/CMakeLists.txt @@ -36,6 +36,7 @@ set(ENGINE_SOURCES Session/StartupScene.cpp Renderer/Camera.cpp Renderer/ForwardRenderer.cpp + Renderer/Mesh.cpp Renderer/RenderCommand.cpp Renderer/Renderer.cpp Renderer/RenderScene.cpp diff --git a/Axiom/Renderer/Mesh.cpp b/Axiom/Renderer/Mesh.cpp new file mode 100644 index 00000000..e95f54f2 --- /dev/null +++ b/Axiom/Renderer/Mesh.cpp @@ -0,0 +1,44 @@ +#include "Renderer/Mesh.h" + +#include "Renderer/Vulkan/VulkanMesh.h" + +#include +#include + +namespace Axiom { +namespace { +std::mutex g_RenderMeshDebugDataMutex; +std::deque g_RenderMeshDebugData{ + RenderMeshSubmissionDebugData{}}; +} // namespace + +RenderMeshSubmissionDebugDataId +RegisterRenderMeshSubmissionDebugData(RenderMeshSubmissionDebugData Data) { + std::scoped_lock Lock(g_RenderMeshDebugDataMutex); + g_RenderMeshDebugData.push_back(std::move(Data)); + return static_cast( + g_RenderMeshDebugData.size() - 1); +} + +const RenderMeshSubmissionDebugData * +TryGetRenderMeshSubmissionDebugData(RenderMeshSubmissionDebugDataId Id) { + std::scoped_lock Lock(g_RenderMeshDebugDataMutex); + if (Id == 0 || Id >= g_RenderMeshDebugData.size()) { + return nullptr; + } + return &g_RenderMeshDebugData[Id]; +} + +std::string_view +GetRenderMeshSubmissionDebugName(RenderMeshSubmissionDebugDataId Id) { + if (const auto *DebugData = TryGetRenderMeshSubmissionDebugData(Id); + DebugData != nullptr) { + return DebugData->Name; + } + return {}; +} + +VulkanMesh *ResolveVulkanMesh(const MeshRef &Mesh) { + return Mesh != nullptr ? dynamic_cast(Mesh.get()) : nullptr; +} +} // namespace Axiom diff --git a/Axiom/Renderer/Mesh.h b/Axiom/Renderer/Mesh.h index 4bc23a27..87950515 100644 --- a/Axiom/Renderer/Mesh.h +++ b/Axiom/Renderer/Mesh.h @@ -10,20 +10,24 @@ #include #include #include +#include #include #include namespace Axiom { +class VulkanMesh; + enum class MeshRenderPath { Graphics, Compute, }; struct MeshVertex { - glm::vec4 Position{0.0f, 0.0f, 0.0f, 1.0f}; - glm::vec4 Normal{0.0f, 0.0f, 1.0f, 0.0f}; + glm::vec3 Position{0.0f, 0.0f, 0.0f}; + glm::vec3 Normal{0.0f, 0.0f, 1.0f}; glm::vec2 TexCoord{0.0f, 0.0f}; }; +static_assert(sizeof(MeshVertex) == 32); struct MeshData { std::vector Vertices; @@ -48,6 +52,10 @@ struct MeshSceneLoadOptions { std::unordered_set ComputeMeshNames; }; +struct MeshCreateOptions { + bool KeepCpuData{false}; +}; + class Mesh { public: virtual ~Mesh() = default; @@ -55,10 +63,26 @@ class Mesh { using MeshRef = std::shared_ptr; +struct RenderMeshSubmissionDebugData { + std::string Name; +}; + +using RenderMeshSubmissionDebugDataId = uint32_t; + +RenderMeshSubmissionDebugDataId +RegisterRenderMeshSubmissionDebugData(RenderMeshSubmissionDebugData Data); +const RenderMeshSubmissionDebugData * +TryGetRenderMeshSubmissionDebugData(RenderMeshSubmissionDebugDataId Id); +std::string_view +GetRenderMeshSubmissionDebugName(RenderMeshSubmissionDebugDataId Id); + +VulkanMesh *ResolveVulkanMesh(const MeshRef &Mesh); + struct RenderMeshSubmission { MeshRef Mesh; + VulkanMesh *TypedMesh{nullptr}; MaterialInstanceRef Material; - std::string Name; + RenderMeshSubmissionDebugDataId DebugDataId{0}; MeshRenderPath RenderPath{MeshRenderPath::Graphics}; glm::mat4 Transform{1.0f}; bool Translucent{false}; diff --git a/Axiom/Renderer/RenderCommand.cpp b/Axiom/Renderer/RenderCommand.cpp index 61454bb5..03679da2 100644 --- a/Axiom/Renderer/RenderCommand.cpp +++ b/Axiom/Renderer/RenderCommand.cpp @@ -16,7 +16,11 @@ void RenderCommand::SetCamera(const Camera &Camera) { void RenderCommand::Submit(const RenderMeshSubmission &Submission) { if (s_ActiveScene) { - s_ActiveScene->Submissions.push_back(Submission); + RenderMeshSubmission Prepared = Submission; + if (Prepared.TypedMesh == nullptr && Prepared.Mesh != nullptr) { + Prepared.TypedMesh = ResolveVulkanMesh(Prepared.Mesh); + } + s_ActiveScene->Submissions.push_back(std::move(Prepared)); } } diff --git a/Axiom/Renderer/Renderer.cpp b/Axiom/Renderer/Renderer.cpp index a38b43cd..d93cb7ab 100644 --- a/Axiom/Renderer/Renderer.cpp +++ b/Axiom/Renderer/Renderer.cpp @@ -99,8 +99,10 @@ const RendererFrameStats &Renderer::GetFrameStats() const { return m_Backend->GetFrameStats(); } -std::shared_ptr Renderer::CreateMesh(const MeshData &MeshData) { - return m_Backend != nullptr ? m_Backend->CreateMesh(MeshData) : nullptr; +std::shared_ptr Renderer::CreateMesh(const MeshData &MeshData, + const MeshCreateOptions &Options) { + return m_Backend != nullptr ? m_Backend->CreateMesh(MeshData, Options) + : nullptr; } void Renderer::UpdateCpuRenderTime(float CpuRenderMs) { @@ -130,8 +132,10 @@ Renderer::LoadMeshSceneFromFile(const std::filesystem::path &Path, : Options.DefaultRenderPath; Result.push_back( {.Mesh = Mesh, + .TypedMesh = ResolveVulkanMesh(Mesh), .Material = Instance.Material, - .Name = Instance.Name, + .DebugDataId = RegisterRenderMeshSubmissionDebugData( + {.Name = Instance.Name}), .RenderPath = RenderPath, .Transform = Instance.Transform}); } diff --git a/Axiom/Renderer/Renderer.h b/Axiom/Renderer/Renderer.h index 8cea6441..90f9027f 100644 --- a/Axiom/Renderer/Renderer.h +++ b/Axiom/Renderer/Renderer.h @@ -31,7 +31,8 @@ class Renderer { std::optional ConsumeCapturedFrame(); void SetCpuFrameTime(float CpuFrameMs); const RendererFrameStats &GetFrameStats() const; - std::shared_ptr CreateMesh(const MeshData &MeshData); + std::shared_ptr + CreateMesh(const MeshData &MeshData, const MeshCreateOptions &Options = {}); std::vector LoadMeshSceneFromFile( const std::filesystem::path &Path, diff --git a/Axiom/Renderer/RendererBackend.h b/Axiom/Renderer/RendererBackend.h index 7c4c72a5..ac3d6c0f 100644 --- a/Axiom/Renderer/RendererBackend.h +++ b/Axiom/Renderer/RendererBackend.h @@ -65,7 +65,8 @@ class RendererBackend { virtual void Init(const RendererCreateInfo &CreateInfo) = 0; virtual void Shutdown() = 0; virtual void BeginFrame() = 0; - virtual std::shared_ptr CreateMesh(const MeshData &Mesh) = 0; + virtual std::shared_ptr + CreateMesh(const MeshData &Mesh, const MeshCreateOptions &Options = {}) = 0; virtual void RenderSceneMeshes(RenderScene &Scene) = 0; virtual void RenderFallbackBackground(RenderScene &Scene) = 0; virtual RendererFrameStats &AccessFrameStats() = 0; diff --git a/Axiom/Renderer/Vulkan/VulkanMesh.cpp b/Axiom/Renderer/Vulkan/VulkanMesh.cpp index d8f39b24..b66d94d9 100644 --- a/Axiom/Renderer/Vulkan/VulkanMesh.cpp +++ b/Axiom/Renderer/Vulkan/VulkanMesh.cpp @@ -8,9 +8,7 @@ #include namespace Axiom { -VulkanMesh::VulkanMesh(MeshData SourceData, VmaAllocator InAllocator) - : Allocator(InAllocator), CpuData(std::move(SourceData)), - BoundsMin(CpuData.BoundsMin), BoundsMax(CpuData.BoundsMax) {} +VulkanMesh::VulkanMesh(VmaAllocator InAllocator) : Allocator(InAllocator) {} VulkanMesh::~VulkanMesh() { if (auto *Backend = VulkanRendererBackend::TryGet(); @@ -42,8 +40,11 @@ VulkanMesh::Create(const MeshData &MeshSource, VmaAllocator Allocator, VkDevice Device, VkQueue GraphicsQueue, VkCommandPool CommandPool, ::DescriptorAllocator &DescriptorAllocator, + const MeshCreateOptions &Options, VkDescriptorSetLayout MeshDescriptorLayout) { - auto MeshRef = std::make_shared(MeshSource, Allocator); + auto MeshRef = std::make_shared(Allocator); + MeshRef->BoundsMin = MeshSource.BoundsMin; + MeshRef->BoundsMax = MeshSource.BoundsMax; MeshRef->VertexCount = static_cast(MeshSource.Vertices.size()); MeshRef->IndexCount = static_cast(MeshSource.Indices.size()); MeshRef->TriangleCount = MeshRef->IndexCount / 3; @@ -85,6 +86,18 @@ VulkanMesh::Create(const MeshData &MeshSource, VmaAllocator Allocator, vkUpdateDescriptorSets(Device, static_cast(Writes.size()), Writes.data(), 0, VK_NULL_HANDLE); + if (Options.KeepCpuData) { + MeshRef->CpuData = MeshSource; + } + return MeshRef; } + +size_t VulkanMesh::RetainedCpuBytes() const { + if (!CpuData.has_value()) { + return 0; + } + return CpuData->Vertices.size() * sizeof(MeshVertex) + + CpuData->Indices.size() * sizeof(uint32_t); +} } // namespace Axiom diff --git a/Axiom/Renderer/Vulkan/VulkanMesh.h b/Axiom/Renderer/Vulkan/VulkanMesh.h index 3f209deb..25dcc657 100644 --- a/Axiom/Renderer/Vulkan/VulkanMesh.h +++ b/Axiom/Renderer/Vulkan/VulkanMesh.h @@ -5,22 +5,24 @@ #include "Renderer/Vulkan/VulkanRendererTypes.h" #include "Renderer/Vulkan/VulkanTypes.h" +#include #include namespace Axiom { class VulkanMesh final : public Mesh { public: - explicit VulkanMesh(MeshData SourceData, VmaAllocator InAllocator); + explicit VulkanMesh(VmaAllocator InAllocator); ~VulkanMesh() override; static std::shared_ptr Create(const MeshData &MeshSource, VmaAllocator Allocator, VkDevice Device, VkQueue GraphicsQueue, VkCommandPool CommandPool, ::DescriptorAllocator &DescriptorAllocator, + const MeshCreateOptions &Options, VkDescriptorSetLayout MeshDescriptorLayout); VmaAllocator Allocator{nullptr}; - MeshData CpuData; + std::optional CpuData; AllocatedBuffer VertexBuffer; AllocatedBuffer IndexBuffer; AllocatedBuffer ProjectedVertexBuffer; @@ -30,5 +32,7 @@ class VulkanMesh final : public Mesh { uint32_t VertexCount{0}; uint32_t IndexCount{0}; uint32_t TriangleCount{0}; + bool KeepsCpuData() const { return CpuData.has_value(); } + size_t RetainedCpuBytes() const; }; } // namespace Axiom diff --git a/Axiom/Renderer/Vulkan/VulkanRendererBackend.cpp b/Axiom/Renderer/Vulkan/VulkanRendererBackend.cpp index 62c90c1d..c44ba907 100644 --- a/Axiom/Renderer/Vulkan/VulkanRendererBackend.cpp +++ b/Axiom/Renderer/Vulkan/VulkanRendererBackend.cpp @@ -848,9 +848,9 @@ void VulkanRendererBackend::InitMeshPipelines() { .stride = sizeof(MeshVertex), .inputRate = VK_VERTEX_INPUT_RATE_VERTEX}; std::array AttributeDescriptions = { - VkVertexInputAttributeDescription{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, + VkVertexInputAttributeDescription{0, 0, VK_FORMAT_R32G32B32_SFLOAT, offsetof(MeshVertex, Position)}, - VkVertexInputAttributeDescription{1, 0, VK_FORMAT_R32G32B32A32_SFLOAT, + VkVertexInputAttributeDescription{1, 0, VK_FORMAT_R32G32B32_SFLOAT, offsetof(MeshVertex, Normal)}, VkVertexInputAttributeDescription{2, 0, VK_FORMAT_R32G32_SFLOAT, offsetof(MeshVertex, TexCoord)}}; @@ -1078,10 +1078,12 @@ void VulkanRendererBackend::InitMeshFrameResources() { } std::shared_ptr -VulkanRendererBackend::CreateMesh(const MeshData &MeshSource) { +VulkanRendererBackend::CreateMesh(const MeshData &MeshSource, + const MeshCreateOptions &Options) { return VulkanMesh::Create(MeshSource, m_Device.Allocator, m_Device.Device, m_Device.GraphicsQueue, GetCurrentFrame().CommandPool, - m_GlobalDescriptorAllocator, m_MeshDescriptorLayout); + m_GlobalDescriptorAllocator, Options, + m_MeshDescriptorLayout); } void VulkanRendererBackend::CollectFrameStats(MeshFrameResources &Frame) { diff --git a/Axiom/Renderer/Vulkan/VulkanRendererBackend.h b/Axiom/Renderer/Vulkan/VulkanRendererBackend.h index 7efb8412..a1b7d1f7 100644 --- a/Axiom/Renderer/Vulkan/VulkanRendererBackend.h +++ b/Axiom/Renderer/Vulkan/VulkanRendererBackend.h @@ -34,7 +34,8 @@ class VulkanRendererBackend final : public RendererBackend { void Init(const RendererCreateInfo &CreateInfo) override; void Shutdown() override; void BeginFrame() override; - std::shared_ptr CreateMesh(const MeshData &Mesh) override; + std::shared_ptr + CreateMesh(const MeshData &Mesh, const MeshCreateOptions &Options = {}) override; void RenderSceneMeshes(RenderScene &Scene) override; void RenderFallbackBackground(RenderScene &Scene) override; RendererFrameStats &AccessFrameStats() override; diff --git a/Axiom/Renderer/Vulkan/VulkanSceneRenderer.cpp b/Axiom/Renderer/Vulkan/VulkanSceneRenderer.cpp index 53e85c1a..ed6f73a1 100644 --- a/Axiom/Renderer/Vulkan/VulkanSceneRenderer.cpp +++ b/Axiom/Renderer/Vulkan/VulkanSceneRenderer.cpp @@ -49,11 +49,11 @@ glm::vec3 VulkanSceneRenderer::ComputeWorldCenter( } void VulkanSceneRenderer::BindMeshBuffers( - VkCommandBuffer CommandBuffer, const std::shared_ptr &MeshRef) { + VkCommandBuffer CommandBuffer, const VulkanMesh &Mesh) { VkDeviceSize VertexOffset = 0; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, &MeshRef->VertexBuffer.Buffer, + vkCmdBindVertexBuffers(CommandBuffer, 0, 1, &Mesh.VertexBuffer.Buffer, &VertexOffset); - vkCmdBindIndexBuffer(CommandBuffer, MeshRef->IndexBuffer.Buffer, 0, + vkCmdBindIndexBuffer(CommandBuffer, Mesh.IndexBuffer.Buffer, 0, VK_INDEX_TYPE_UINT32); } @@ -173,7 +173,7 @@ void VulkanSceneRenderer::RecordDepthPrepass( vkCmdPushConstants(Context.CommandBuffer, Context.MeshDepthPipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(MeshGraphicsPushConstants), &PushConstants); - BindMeshBuffers(Context.CommandBuffer, VisibleSubmission.Mesh); + BindMeshBuffers(Context.CommandBuffer, *VisibleSubmission.Mesh); vkCmdDrawIndexed(Context.CommandBuffer, VisibleSubmission.Mesh->IndexCount, 1, 0, 0, 0); }; @@ -325,7 +325,7 @@ void VulkanSceneRenderer::RecordGraphicsPass( vkCmdPushConstants(Context.CommandBuffer, Context.MeshGraphicsPipelineLayout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(MeshGraphicsPushConstants), &PushConstants); - BindMeshBuffers(Context.CommandBuffer, VisibleSubmission.Mesh); + BindMeshBuffers(Context.CommandBuffer, *VisibleSubmission.Mesh); vkCmdDrawIndexed(Context.CommandBuffer, VisibleSubmission.Mesh->IndexCount, 1, 0, 0, 0); } @@ -387,7 +387,7 @@ void VulkanSceneRenderer::RecordTranslucentGraphicsPass( vkCmdPushConstants(Context.CommandBuffer, Context.MeshGraphicsPipelineLayout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(MeshGraphicsPushConstants), &PushConstants); - BindMeshBuffers(Context.CommandBuffer, VisibleSubmission.Mesh); + BindMeshBuffers(Context.CommandBuffer, *VisibleSubmission.Mesh); vkCmdDrawIndexed(Context.CommandBuffer, VisibleSubmission.Mesh->IndexCount, 1, 0, 0, 0); } @@ -420,10 +420,14 @@ void VulkanSceneRenderer::RenderScenePasses(const RenderContext &Context) const Context.FrameStats.MeshSubmissionCount = 0; Context.FrameStats.TriangleCount = 0; - std::vector Candidates; - std::vector OpaqueGraphicsSubmissions; - std::vector TranslucentGraphicsSubmissions; - std::vector ComputeSubmissions; + auto &Candidates = m_CandidateScratch; + auto &OpaqueGraphicsSubmissions = m_OpaqueGraphicsScratch; + auto &TranslucentGraphicsSubmissions = m_TranslucentGraphicsScratch; + auto &ComputeSubmissions = m_ComputeScratch; + Candidates.clear(); + OpaqueGraphicsSubmissions.clear(); + TranslucentGraphicsSubmissions.clear(); + ComputeSubmissions.clear(); Candidates.reserve(SubmissionCount); OpaqueGraphicsSubmissions.reserve(SubmissionCount); TranslucentGraphicsSubmissions.reserve(SubmissionCount); @@ -431,8 +435,8 @@ void VulkanSceneRenderer::RenderScenePasses(const RenderContext &Context) const for (size_t Index = 0; Index < SubmissionCount; ++Index) { const auto &Submission = Context.Scene.Submissions[Index]; - auto VulkanMeshRef = std::dynamic_pointer_cast(Submission.Mesh); - if (!VulkanMeshRef) { + VulkanMesh *VulkanMeshRef = Submission.TypedMesh; + if (VulkanMeshRef == nullptr) { continue; } @@ -447,7 +451,7 @@ void VulkanSceneRenderer::RenderScenePasses(const RenderContext &Context) const const glm::vec3 WorldCenter = ComputeWorldCenter(Submission, *VulkanMeshRef); const glm::vec3 Delta = WorldCenter - Camera.GetPosition(); Candidates.push_back({.Submission = &Submission, - .Mesh = std::move(VulkanMeshRef), + .Mesh = VulkanMeshRef, .SortDepth = glm::dot(Delta, Delta)}); } diff --git a/Axiom/Renderer/Vulkan/VulkanSceneRenderer.h b/Axiom/Renderer/Vulkan/VulkanSceneRenderer.h index cd961b76..b9fca4fd 100644 --- a/Axiom/Renderer/Vulkan/VulkanSceneRenderer.h +++ b/Axiom/Renderer/Vulkan/VulkanSceneRenderer.h @@ -53,13 +53,13 @@ class VulkanSceneRenderer { private: struct VisibleMeshSubmission { const RenderMeshSubmission *Submission{nullptr}; - std::shared_ptr Mesh; + VulkanMesh *Mesh{nullptr}; float SortDepth{0.0f}; }; struct CandidateSubmission { const RenderMeshSubmission *Submission{nullptr}; - std::shared_ptr Mesh; + VulkanMesh *Mesh{nullptr}; float SortDepth{0.0f}; }; @@ -67,7 +67,7 @@ class VulkanSceneRenderer { static glm::vec3 ComputeWorldCenter(const RenderMeshSubmission &Submission, const VulkanMesh &Mesh); static void BindMeshBuffers(VkCommandBuffer CommandBuffer, - const std::shared_ptr &MeshRef); + const VulkanMesh &Mesh); static void UpdateComputeFrameDescriptors(const RenderContext &Context, const VkDescriptorBufferInfo &CameraBufferInfo); @@ -96,5 +96,10 @@ class VulkanSceneRenderer { const VkRect2D &Scissor, const std::vector &GraphicsSubmissions, const VkDescriptorBufferInfo &CameraBufferInfo, bool ForceWireframe); + + mutable std::vector m_CandidateScratch; + mutable std::vector m_OpaqueGraphicsScratch; + mutable std::vector m_TranslucentGraphicsScratch; + mutable std::vector m_ComputeScratch; }; } // namespace Axiom diff --git a/Axiom/Session/EditorSceneRendererAdapter.cpp b/Axiom/Session/EditorSceneRendererAdapter.cpp index 2f78c354..368a12ef 100644 --- a/Axiom/Session/EditorSceneRendererAdapter.cpp +++ b/Axiom/Session/EditorSceneRendererAdapter.cpp @@ -35,8 +35,10 @@ EditorSceneRendererAdapter::BuildRenderSubmissions(const EditorSession &Session) Submissions.push_back({ .Mesh = Cached.Mesh, + .TypedMesh = ResolveVulkanMesh(Cached.Mesh), .Material = Instance.Material, // always live — picks up material edits - .Name = Instance.ObjectId, + .DebugDataId = RegisterRenderMeshSubmissionDebugData( + {.Name = Instance.ObjectId}), .RenderPath = Cached.RenderPath, .Transform = Instance.Transform, }); diff --git a/Content/Cooked/AssetCookManifest.json b/Content/Cooked/AssetCookManifest.json index 323345e7..90d13b44 100644 --- a/Content/Cooked/AssetCookManifest.json +++ b/Content/Cooked/AssetCookManifest.json @@ -69,7 +69,7 @@ "kind": "mesh", "relativePath": "sponza_atrium_3.glb", "cookedPath": "Cooked/sponza_atrium_3.wmesh", - "formatVersion": 2, + "formatVersion": 3, "sourceHash": 13152113367551948137 }, { diff --git a/Content/Cooked/sponza_atrium_3.wmesh b/Content/Cooked/sponza_atrium_3.wmesh index 37339303f5b7945235d46e79163aff6d83eb54d6..fbb393d5128f1928cd34e96122ef626d6ebca1df 100644 GIT binary patch literal 9323054 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 j{ovB!+v=Z&M)P?>o+a79jqT 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

RfDFfaXm-NUvST1 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

DCyq}%%I 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

Ni%$QQ(j-^JDfG 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

S#V>|XbNn5pkesH*Le^Js}z@>2bWeqw#U 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

?`SNk`iw*md3C;CUMe=^48=P%JjcjDly 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]MF9 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

@nCGF3oEJ;e)KDvNIOA#^v~* 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 z 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 z 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