//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). 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 metaData = bs_shared_ptr_new(); 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 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 serializableObject = std::static_pointer_cast(ms.decode(data.data, data.size)); SPtr managedResMetaData = std::static_pointer_cast(mMetaData); SPtr 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 newRes = bs_core_ptr(new (bs_alloc()) ManagedResource(managedResource)); newRes->_setThisPtr(newRes); newRes->initialize(); HManagedResource handle = static_resource_cast(gResources()._createResourceHandle(newRes)); newRes->setHandle(managedResource, handle); return handle; } SPtr ManagedResource::createEmpty() { SPtr newRes = bs_core_ptr(new (bs_alloc()) 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(); } }