|
|
@@ -10,10 +10,12 @@
|
|
|
#include "Serialization/BsManagedSerializableObject.h"
|
|
|
#include "Serialization/BsScriptAssemblyManager.h"
|
|
|
#include "Reflection/BsRTTIType.h"
|
|
|
+#include "BsScriptGameObjectManager.h"
|
|
|
+#include "Serialization/BsSerializedObject.h"
|
|
|
|
|
|
namespace bs
|
|
|
{
|
|
|
- ScriptSerializedObject::ScriptSerializedObject(MonoObject* instance, const SPtr<ManagedSerializableObject>& obj)
|
|
|
+ ScriptSerializedObject::ScriptSerializedObject(MonoObject* instance, const SPtr<IReflectable>& obj)
|
|
|
: ScriptObject(instance), mSerializedObject(obj)
|
|
|
{
|
|
|
|
|
|
@@ -27,18 +29,28 @@ namespace bs
|
|
|
metaData.scriptClass->addInternalCall("Internal_Deserialize", (void*)&ScriptSerializedObject::internal_Deserialize);
|
|
|
}
|
|
|
|
|
|
- MonoObject* ScriptSerializedObject::internal_CreateComponent(ScriptManagedComponent* componentPtr)
|
|
|
+ MonoObject* ScriptSerializedObject::internal_CreateComponent(ScriptComponentBase* componentPtr)
|
|
|
{
|
|
|
- HManagedComponent component = static_object_cast<ManagedComponent>(componentPtr->getHandle());
|
|
|
+ HComponent component = componentPtr->getComponent();
|
|
|
if (component.isDestroyed())
|
|
|
return nullptr;
|
|
|
|
|
|
- MonoObject* managedInstance = component->getManagedInstance();
|
|
|
- SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(managedInstance);
|
|
|
- if (serializedObject == nullptr)
|
|
|
- return nullptr;
|
|
|
+ SPtr<IReflectable> serializedObject;
|
|
|
+ if (rtti_is_of_type<ManagedComponent>(component.get()))
|
|
|
+ {
|
|
|
+ ManagedComponent* managedComponent = static_cast<ManagedComponent*>(component.get());
|
|
|
+ MonoObject* managedInstance = managedComponent->getManagedInstance();
|
|
|
+
|
|
|
+ SPtr<ManagedSerializableObject> managedSerializedObject = ManagedSerializableObject::createFromExisting(managedInstance);
|
|
|
+ if (managedSerializedObject == nullptr)
|
|
|
+ return nullptr;
|
|
|
+
|
|
|
+ managedSerializedObject->serialize();
|
|
|
+ serializedObject = managedSerializedObject;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ serializedObject = SerializedObject::create(*component.get());
|
|
|
|
|
|
- serializedObject->serialize();
|
|
|
|
|
|
MonoObject* instance = metaData.scriptClass->createInstance();
|
|
|
new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, serializedObject);
|
|
|
@@ -70,24 +82,51 @@ namespace bs
|
|
|
if (obj == nullptr)
|
|
|
return nullptr;
|
|
|
|
|
|
- SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(obj);
|
|
|
- if (serializedObject == nullptr)
|
|
|
+ SPtr<IReflectable> nativeValue = ScriptAssemblyManager::instance().getReflectableFromManagedObject(obj);
|
|
|
+ if (!nativeValue)
|
|
|
return nullptr;
|
|
|
|
|
|
- serializedObject->serialize();
|
|
|
+ if(!rtti_is_of_type<ManagedSerializableObject>(nativeValue))
|
|
|
+ nativeValue = SerializedObject::create(*nativeValue);
|
|
|
|
|
|
MonoObject* instance = metaData.scriptClass->createInstance();
|
|
|
- new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, serializedObject);
|
|
|
+ new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, nativeValue);
|
|
|
|
|
|
return instance;
|
|
|
}
|
|
|
|
|
|
MonoObject* ScriptSerializedObject::internal_Deserialize(ScriptSerializedObject* thisPtr)
|
|
|
{
|
|
|
- SPtr<ManagedSerializableObject> serializedObject = thisPtr->mSerializedObject;
|
|
|
+ SPtr<IReflectable> serializedObject = thisPtr->mSerializedObject;
|
|
|
if (serializedObject == nullptr)
|
|
|
return nullptr;
|
|
|
|
|
|
- return serializedObject->deserialize();
|
|
|
+ if(auto managedSerializableObject = rtti_cast<ManagedSerializableObject>(serializedObject))
|
|
|
+ {
|
|
|
+ if (!managedSerializableObject)
|
|
|
+ return nullptr;
|
|
|
+
|
|
|
+ return managedSerializableObject->deserialize();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(auto nativeSerializedObject = rtti_cast<SerializedObject>(serializedObject))
|
|
|
+ {
|
|
|
+ SPtr<IReflectable> obj = nativeSerializedObject->decode();
|
|
|
+
|
|
|
+ UINT32 rttiId = obj->getRTTI()->getRTTIId();
|
|
|
+ const ReflectableTypeInfo* reflTypeInfo = ScriptAssemblyManager::instance().getReflectableTypeInfo(rttiId);
|
|
|
+ if (reflTypeInfo == nullptr)
|
|
|
+ {
|
|
|
+ LOGERR(StringUtil::format("Mapping between a reflectable object and a managed type is missing "
|
|
|
+ "for type \"{0}\"", rttiId))
|
|
|
+ return nullptr;
|
|
|
+ }
|
|
|
+
|
|
|
+ return reflTypeInfo->createCallback(obj);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
-}
|
|
|
+}
|