From f68321c9f5391e2665b51f5136ddd64bf3aaa784 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 9 Aug 2021 12:12:32 +0200 Subject: [PATCH] Fix pasting actors if cannot spawn a object (eg. type missing) to still paste valid objects --- Source/Engine/Level/Actor.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Source/Engine/Level/Actor.cpp b/Source/Engine/Level/Actor.cpp index 63fc12b20..076ac4608 100644 --- a/Source/Engine/Level/Actor.cpp +++ b/Source/Engine/Level/Actor.cpp @@ -1611,21 +1611,22 @@ bool Actor::FromBytes(const Span& data, Array& output, ISerializeM // Create object auto obj = SceneObjectsFactory::Spawn(document, modifier); + sceneObjects->At(i) = obj; if (obj == nullptr) { LOG(Warning, "Cannot create object."); - return true; + continue; } obj->RegisterObject(); // Add to results - sceneObjects->At(i) = obj; Actor* actor = dynamic_cast(obj); if (actor) { output.Add(actor); } } + // TODO: optimize this to call json parsing only once per-object instead of twice (spawn + load) stream.SetPosition(startPos); for (int32 i = 0; i < objectsCount; i++) { @@ -1639,7 +1640,7 @@ bool Actor::FromBytes(const Span& data, Array& output, ISerializeM int32 orderInParent; stream.ReadInt32(&orderInParent); - // Load JSON + // Load JSON rapidjson_flax::Document document; { PROFILE_CPU_NAMED("Json.Parse"); @@ -1653,7 +1654,10 @@ bool Actor::FromBytes(const Span& data, Array& output, ISerializeM // Deserialize object auto obj = sceneObjects->At(i); - SceneObjectsFactory::Deserialize(obj, document, modifier); + if (obj) + SceneObjectsFactory::Deserialize(obj, document, modifier); + else + SceneObjectsFactory::HandleObjectDeserializationError(document); } Scripting::ObjectsLookupIdMapping.Set(nullptr);