| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
- //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
- #include "BsManagedResource.h"
- #include "RTTI/BsManagedResourceRTTI.h"
- #include "BsManagedResourceMetaData.h"
- #include "BsMonoManager.h"
- #include "BsMonoClass.h"
- #include "Resources/BsResources.h"
- #include "BsManagedResourceManager.h"
- #include "Serialization/BsManagedSerializableObject.h"
- #include "Wrappers/BsScriptManagedResource.h"
- #include "Serialization/BsMemorySerializer.h"
- #include "BsScriptResourceManager.h"
- #include "BsMonoUtil.h"
- #include "Serialization/BsScriptAssemblyManager.h"
- #include "Debug/BsDebug.h"
- namespace bs
- {
- ManagedResource::ManagedResource()
- :Resource(false)
- { }
- ManagedResource::ManagedResource(MonoObject* managedInstance)
- :Resource(false)
- {
- SPtr<ManagedResourceMetaData> metaData = bs_shared_ptr_new<ManagedResourceMetaData>();
- mMetaData = metaData;
- MonoUtil::getClassName(managedInstance, metaData->typeNamespace, metaData->typeName);
- MonoClass* managedClass = MonoManager::instance().findClass(metaData->typeNamespace, metaData->typeName);
- if (managedClass == nullptr)
- {
- LOGWRN("Cannot create managed component: " + metaData->typeNamespace + "." + metaData->typeName + " because that type doesn't exist.");
- return;
- }
- }
- MonoObject* ManagedResource::getManagedInstance() const
- {
- if(mOwner)
- return mOwner->getManagedInstance();
-
- return nullptr;
- }
- ResourceBackupData ManagedResource::backup()
- {
- MonoObject* instance = mOwner->getManagedInstance();
- SPtr<ManagedSerializableObject> serializableObject = ManagedSerializableObject::createFromExisting(instance);
- ResourceBackupData backupData;
- if (serializableObject != nullptr)
- {
- MemorySerializer ms;
- backupData.size = 0;
- backupData.data = ms.encode(serializableObject.get(), backupData.size);
- }
- else
- {
- backupData.size = 0;
- backupData.data = nullptr;
- }
- return backupData;
- }
- void ManagedResource::restore(const ResourceBackupData& data)
- {
- MonoObject* instance = mOwner->getManagedInstance();
- if (instance != nullptr)
- {
- if (data.data != nullptr)
- {
- MemorySerializer ms;
- SPtr<ManagedSerializableObject> serializableObject = std::static_pointer_cast<ManagedSerializableObject>(ms.decode(data.data, data.size));
-
- SPtr<ManagedResourceMetaData> managedResMetaData = std::static_pointer_cast<ManagedResourceMetaData>(mMetaData);
- SPtr<ManagedSerializableObjectInfo> currentObjInfo = nullptr;
- if (ScriptAssemblyManager::instance().getSerializableObjectInfo(managedResMetaData->typeNamespace, managedResMetaData->typeName, currentObjInfo))
- serializableObject->deserialize(instance, currentObjInfo);
- }
- }
- else
- {
- // Could not restore resource
- ManagedResourceManager::instance().unregisterManagedResource(mMyHandle);
- }
- }
- HManagedResource ManagedResource::create(MonoObject* managedResource)
- {
- SPtr<ManagedResource> newRes = bs_core_ptr<ManagedResource>(new (bs_alloc<ManagedResource>()) ManagedResource(managedResource));
- newRes->_setThisPtr(newRes);
- newRes->initialize();
- HManagedResource handle = static_resource_cast<ManagedResource>(gResources()._createResourceHandle(newRes));
- newRes->setHandle(managedResource, handle);
- return handle;
- }
- SPtr<ManagedResource> ManagedResource::createEmpty()
- {
- SPtr<ManagedResource> newRes = bs_core_ptr<ManagedResource>(new (bs_alloc<ManagedResource>()) ManagedResource());
- newRes->_setThisPtr(newRes);
- newRes->initialize();
- return newRes;
- }
- void ManagedResource::setHandle(MonoObject* object, const HManagedResource& myHandle)
- {
- mMyHandle = myHandle.getWeak();
- mOwner = ScriptResourceManager::instance().createManagedScriptResource(myHandle, object);
- ManagedResourceManager::instance().registerManagedResource(mMyHandle);
- }
- void ManagedResource::destroy()
- {
- Resource::destroy();
- mOwner->_notifyDestroyed();
- ManagedResourceManager::instance().unregisterManagedResource(mMyHandle);
- }
- RTTITypeBase* ManagedResource::getRTTIStatic()
- {
- return ManagedResourceRTTI::instance();
- }
- RTTITypeBase* ManagedResource::getRTTI() const
- {
- return ManagedResource::getRTTIStatic();
- }
- }
|