Add layers and tags updating
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user