| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
- //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
- #include "BsScriptSerializedObject.h"
- #include "BsScriptMeta.h"
- #include "BsMonoClass.h"
- #include "BsScriptComponent.h"
- #include "BsScriptManagedResource.h"
- #include "BsManagedComponent.h"
- #include "BsManagedResource.h"
- #include "BsManagedSerializableObject.h"
- #include "BsScriptAssemblyManager.h"
- namespace BansheeEngine
- {
- ScriptSerializedObject::ScriptSerializedObject(MonoObject* instance, const SPtr<ManagedSerializableObject>& obj)
- : ScriptObject(instance), mSerializedObject(obj)
- {
- }
- void ScriptSerializedObject::initRuntimeData()
- {
- metaData.scriptClass->addInternalCall("Internal_CreateComponent", &ScriptSerializedObject::internal_CreateComponent);
- metaData.scriptClass->addInternalCall("Internal_CreateResource", &ScriptSerializedObject::internal_CreateResource);
- metaData.scriptClass->addInternalCall("Internal_CreateGeneric", &ScriptSerializedObject::internal_CreateGeneric);
- metaData.scriptClass->addInternalCall("Internal_Deserialize", &ScriptSerializedObject::internal_Deserialize);
- }
- MonoObject* ScriptSerializedObject::internal_CreateComponent(ScriptComponent* componentPtr)
- {
- HManagedComponent component = componentPtr->getHandle();
- if (component.isDestroyed())
- return nullptr;
- MonoObject* managedInstance = component->getManagedInstance();
- SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(managedInstance);
- if (serializedObject == nullptr)
- return nullptr;
- serializedObject->serialize();
- MonoObject* instance = metaData.scriptClass->createInstance();
- new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, serializedObject);
- return instance;
- }
- MonoObject* ScriptSerializedObject::internal_CreateResource(ScriptManagedResource* resourcePtr)
- {
- HManagedResource resource = resourcePtr->getHandle();
- if (!resource.isLoaded())
- return nullptr;
- MonoObject* managedInstance = resource->getManagedInstance();
- SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(managedInstance);
- if (serializedObject == nullptr)
- return nullptr;
- serializedObject->serialize();
- MonoObject* instance = metaData.scriptClass->createInstance();
- new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, serializedObject);
- return instance;
- }
- MonoObject* ScriptSerializedObject::internal_CreateGeneric(MonoObject* obj)
- {
- if (obj == nullptr)
- return nullptr;
- SPtr<ManagedSerializableObject> serializedObject = ManagedSerializableObject::createFromExisting(obj);
- if (serializedObject == nullptr)
- return nullptr;
- serializedObject->serialize();
- MonoObject* instance = metaData.scriptClass->createInstance();
- new (bs_alloc<ScriptSerializedObject>()) ScriptSerializedObject(instance, serializedObject);
- return instance;
- }
- MonoObject* ScriptSerializedObject::internal_Deserialize(ScriptSerializedObject* thisPtr)
- {
- SPtr<ManagedSerializableObject> serializedObject = thisPtr->mSerializedObject;
- if (serializedObject == nullptr)
- return nullptr;
- serializedObject->deserialize();
- MonoObject* managedInstance = serializedObject->getManagedInstance();
- // Note: Technically I could just clear managed data without a full serialization since I know nothing has changed
- serializedObject->serialize();
- return managedInstance;
- }
- }
|