Add layers and tags updating

This commit is contained in:
Wojtek Figat
2021-02-22 11:22:44 +01:00
parent 6683cb299e
commit f3216a9c96
3 changed files with 23 additions and 20 deletions

View File

@@ -204,33 +204,23 @@ void GameSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* mo
void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier)
{ {
const auto tags = stream.FindMember("Tags"); const auto tags = stream.FindMember("Tags");
if (tags != stream.MemberEnd()) if (tags != stream.MemberEnd() && tags->value.IsArray())
{ {
auto& tagsArray = tags->value; auto& tagsArray = tags->value;
ASSERT(tagsArray.IsArray()); Tags.Clear();
Tags.EnsureCapacity(tagsArray.Size()); 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++) for (uint32 i = 0; i < tagsArray.Size(); i++)
{ {
auto& v = tagsArray[i]; auto& v = tagsArray[i];
if (v.IsString()) if (v.IsString())
{ Tags.Add(v.GetText());
const String tag = v.GetText();
if (!Tags.Contains(tag))
Tags.Add(tag);
}
} }
} }
const auto layers = stream.FindMember("Layers"); const auto layers = stream.FindMember("Layers");
if (layers != stream.MemberEnd()) if (layers != stream.MemberEnd() && layers->value.IsArray())
{ {
auto& layersArray = layers->value; auto& layersArray = layers->value;
ASSERT(layersArray.IsArray());
for (uint32 i = 0; i < layersArray.Size() && i < 32; i++) for (uint32 i = 0; i < layersArray.Size() && i < 32; i++)
{ {
auto& v = layersArray[i]; auto& v = layersArray[i];
@@ -239,5 +229,9 @@ void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeMod
else else
Layers[i].Clear(); Layers[i].Clear();
} }
for (uint32 i = layersArray.Size(); i < 32; i++)
{
Layers[i].Clear();
}
} }
} }

View File

@@ -30,5 +30,6 @@ public:
static LayersAndTagsSettings* Get(); static LayersAndTagsSettings* Get();
// [SettingsBase] // [SettingsBase]
void Apply() override;
void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override; void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override;
}; };

View File

@@ -113,7 +113,6 @@ public:
{ {
} }
bool Init() override;
void Update() override; void Update() override;
void LateUpdate() override; void LateUpdate() override;
void FixedUpdate() override; void FixedUpdate() override;
@@ -177,13 +176,22 @@ bool LevelImpl::deleteActor(Actor* actor)
return false; return false;
} }
bool LevelService::Init() void LayersAndTagsSettings::Apply()
{ {
auto& settings = *LayersAndTagsSettings::Get(); // Note: we cannot remove tags/layers at runtime so this should deserialize them in additive mode
Level::Tags = settings.Tags; // 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++) 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() void LevelService::Update()