From db7dfdb0b14c1d28013a6eefdfe1903c8c981255 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 14 Feb 2024 18:55:48 +0100 Subject: [PATCH] Add support for structure and script types in `JsonAsset` --- Source/Engine/Content/JsonAsset.cpp | 66 +++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/Source/Engine/Content/JsonAsset.cpp b/Source/Engine/Content/JsonAsset.cpp index 9977a28e1..60ff29be1 100644 --- a/Source/Engine/Content/JsonAsset.cpp +++ b/Source/Engine/Content/JsonAsset.cpp @@ -393,34 +393,57 @@ bool JsonAsset::CreateInstance() if (typeHandle) { auto& type = typeHandle.GetType(); + + // Ensure that object can deserialized + const ScriptingType::InterfaceImplementation* interface = type.GetInterface(ISerializable::TypeInitializer); + if (!interface) + { + LOG(Warning, "Cannot deserialize {0} from Json Asset because it doesn't implement ISerializable interface.", type.ToString()); + return false; + } + auto modifier = Cache::ISerializeModifier.Get(); + modifier->EngineBuild = DataEngineBuild; + + // Create object switch (type.Type) { case ScriptingTypes::Class: + case ScriptingTypes::Structure: { - // Ensure that object can deserialized - const ScriptingType::InterfaceImplementation* interface = type.GetInterface(ISerializable::TypeInitializer); - if (!interface) - { - LOG(Warning, "Cannot deserialize {0} from Json Asset because it doesn't implement ISerializable interface.", type.ToString()); - break; - } - - // Allocate object const auto instance = Allocator::Allocate(type.Size); if (!instance) return true; Instance = instance; - InstanceType = typeHandle; - _dtor = type.Class.Dtor; - type.Class.Ctor(instance); + if (type.Type == ScriptingTypes::Class) + { + _dtor = type.Class.Dtor; + type.Class.Ctor(instance); + } + else + { + _dtor = type.Struct.Dtor; + type.Struct.Ctor(instance); + } // Deserialize object - auto modifier = Cache::ISerializeModifier.Get(); - modifier->EngineBuild = DataEngineBuild; ((ISerializable*)((byte*)instance + interface->VTableOffset))->Deserialize(*Data, modifier.Value); break; } + case ScriptingTypes::Script: + { + const ScriptingObjectSpawnParams params(Guid::New(), typeHandle); + const auto instance = type.Script.Spawn(params); + if (!instance) + return true; + Instance = instance; + _dtor = nullptr; + + // Deserialize object + ToInterface(instance)->Deserialize(*Data, modifier.Value); + break; } + } + InstanceType = typeHandle; } return false; @@ -441,13 +464,20 @@ void JsonAsset::DeleteInstance() } // C++ instance - if (!Instance || !_dtor) + if (!Instance) return; - _dtor(Instance); + if (_dtor) + { + _dtor(Instance); + _dtor = nullptr; + Allocator::Free(Instance); + } + else + { + Delete((ScriptingObject*)Instance); + } InstanceType = ScriptingTypeHandle(); - Allocator::Free(Instance); Instance = nullptr; - _dtor = nullptr; } #if USE_EDITOR