BsScriptManagedResource.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "BsScriptManagedResource.h"
  2. #include "BsScriptResourceManager.h"
  3. #include "BsScriptAssemblyManager.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. #include "BsManagedResource.h"
  9. #include "BsResources.h"
  10. #include "BsException.h"
  11. #include "BsMonoUtil.h"
  12. namespace BansheeEngine
  13. {
  14. ScriptManagedResource::ScriptManagedResource(MonoObject* instance, const HManagedResource& resource)
  15. :ScriptObject(instance), mResource(resource)
  16. {
  17. assert(instance != nullptr);
  18. MonoUtil::getClassName(instance, mNamespace, mType);
  19. }
  20. void ScriptManagedResource::initRuntimeData()
  21. {
  22. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptManagedResource::internal_createInstance);
  23. }
  24. void ScriptManagedResource::internal_createInstance(MonoObject* instance)
  25. {
  26. HManagedResource resource = ManagedResource::create(instance);
  27. ScriptResourceManager::instance().createManagedResource(instance, resource);
  28. }
  29. MonoObject* ScriptManagedResource::_createManagedInstance(bool construct)
  30. {
  31. ManagedSerializableObjectInfoPtr currentObjInfo = nullptr;
  32. // See if this type even still exists
  33. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(mNamespace, mType, currentObjInfo))
  34. return nullptr;
  35. return currentObjInfo->mMonoClass->createInstance(construct);
  36. }
  37. ScriptObjectBackup ScriptManagedResource::beginRefresh()
  38. {
  39. ScriptResourceBase::beginRefresh();
  40. ScriptObjectBackup backupData;
  41. backupData.data = mResource->backup(true);
  42. return backupData;
  43. }
  44. void ScriptManagedResource::endRefresh(const ScriptObjectBackup& backupData)
  45. {
  46. ResourceBackupData resourceBackup = any_cast<ResourceBackupData>(backupData.data);
  47. mResource->restore(mManagedInstance, resourceBackup);
  48. // If we could not find resource type after refresh, treat it as if it was destroyed
  49. if (mManagedInstance == nullptr)
  50. _onManagedInstanceDeleted();
  51. ScriptResourceBase::endRefresh(backupData);
  52. }
  53. void ScriptManagedResource::_onManagedInstanceDeleted()
  54. {
  55. mManagedInstance = nullptr;
  56. if (!mRefreshInProgress)
  57. {
  58. // The only way this method should be reachable is when Resource::unload is called, which means the resource
  59. // has had to been already freed. Even if all managed instances are released ManagedResource itself holds the last
  60. // instance which is only freed on unload().
  61. // Note: During domain unload this could get called even if not all instances are released, but ManagedResourceManager
  62. // should make sure all instances are unloaded before that happens.
  63. assert(mResource == nullptr || !mResource.isLoaded());
  64. ScriptResourceManager::instance().destroyScriptResource(this);
  65. }
  66. }
  67. void ScriptManagedResource::setNativeHandle(const HResource& resource)
  68. {
  69. mResource = static_resource_cast<ManagedResource>(resource);
  70. }
  71. }