diff --git a/Source/Engine/Core/Config/GameSettings.cpp b/Source/Engine/Core/Config/GameSettings.cpp index d06f0616f..a8fa83132 100644 --- a/Source/Engine/Core/Config/GameSettings.cpp +++ b/Source/Engine/Core/Config/GameSettings.cpp @@ -204,33 +204,23 @@ void GameSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* mo void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) { const auto tags = stream.FindMember("Tags"); - if (tags != stream.MemberEnd()) + if (tags != stream.MemberEnd() && tags->value.IsArray()) { auto& tagsArray = tags->value; - ASSERT(tagsArray.IsArray()); + Tags.Clear(); Tags.EnsureCapacity(tagsArray.Size()); - - // Note: we cannot remove tags at runtime so this should deserialize them in additive mode - // Tags are stored as tagIndex in actors so collection change would break the linkage - for (uint32 i = 0; i < tagsArray.Size(); i++) { auto& v = tagsArray[i]; if (v.IsString()) - { - const String tag = v.GetText(); - if (!Tags.Contains(tag)) - Tags.Add(tag); - } + Tags.Add(v.GetText()); } } const auto layers = stream.FindMember("Layers"); - if (layers != stream.MemberEnd()) + if (layers != stream.MemberEnd() && layers->value.IsArray()) { auto& layersArray = layers->value; - ASSERT(layersArray.IsArray()); - for (uint32 i = 0; i < layersArray.Size() && i < 32; i++) { auto& v = layersArray[i]; @@ -239,5 +229,9 @@ void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeMod else Layers[i].Clear(); } + for (uint32 i = layersArray.Size(); i < 32; i++) + { + Layers[i].Clear(); + } } } diff --git a/Source/Engine/Core/Config/LayersTagsSettings.h b/Source/Engine/Core/Config/LayersTagsSettings.h index 92edf61c7..066b5cdd5 100644 --- a/Source/Engine/Core/Config/LayersTagsSettings.h +++ b/Source/Engine/Core/Config/LayersTagsSettings.h @@ -30,5 +30,6 @@ public: static LayersAndTagsSettings* Get(); // [SettingsBase] + void Apply() override; void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override; }; diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 134808962..602093363 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -113,7 +113,6 @@ public: { } - bool Init() override; void Update() override; void LateUpdate() override; void FixedUpdate() override; @@ -177,13 +176,22 @@ bool LevelImpl::deleteActor(Actor* actor) return false; } -bool LevelService::Init() +void LayersAndTagsSettings::Apply() { - auto& settings = *LayersAndTagsSettings::Get(); - Level::Tags = settings.Tags; + // Note: we cannot remove tags/layers at runtime so this should deserialize them in additive mode + // Tags/Layers are stored as index in actors so collection change would break the linkage + for (auto& tag : Tags) + { + if (!Level::Tags.Contains(tag)) + Level::Tags.Add(tag); + } for (int32 i = 0; i < ARRAY_COUNT(Level::Layers); i++) - Level::Layers[i] = settings.Layers[i]; - return false; + { + const auto& src = Layers[i]; + auto& dst = Level::Layers[i]; + if (dst.IsEmpty() || !src.IsEmpty()) + dst = src; + } } void LevelService::Update()