BsScriptManagedResource.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. BS_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. }
  28. MonoObject* ScriptManagedResource::_createManagedInstance(bool construct)
  29. {
  30. ManagedSerializableObjectInfoPtr currentObjInfo = nullptr;
  31. // See if this type even still exists
  32. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(mNamespace, mType, currentObjInfo))
  33. return nullptr;
  34. return currentObjInfo->mMonoClass->createInstance(construct);
  35. }
  36. ScriptObjectBackup ScriptManagedResource::beginRefresh()
  37. {
  38. ScriptResourceBase::beginRefresh();
  39. ScriptObjectBackup backupData;
  40. backupData.data = mResource->backup(true);
  41. return backupData;
  42. }
  43. void ScriptManagedResource::endRefresh(const ScriptObjectBackup& backupData)
  44. {
  45. ResourceBackupData resourceBackup = any_cast<ResourceBackupData>(backupData.data);
  46. mResource->restore(mManagedInstance, resourceBackup);
  47. // If we could not find resource type after refresh, treat it as if it was destroyed
  48. if (mManagedInstance == nullptr)
  49. _onManagedInstanceDeleted();
  50. ScriptResourceBase::endRefresh(backupData);
  51. }
  52. void ScriptManagedResource::_onManagedInstanceDeleted()
  53. {
  54. mManagedInstance = nullptr;
  55. if (!mRefreshInProgress)
  56. {
  57. // The only way this method should be reachable is when Resource::unload is called, which means the resource
  58. // has had to been already freed. Even if all managed instances are released ManagedResource itself holds the last
  59. // instance which is only freed on unload().
  60. // Note: During domain unload this could get called even if not all instances are released, but ManagedResourceManager
  61. // should make sure all instances are unloaded before that happens.
  62. BS_ASSERT(mResource == nullptr || !mResource.isLoaded());
  63. ScriptResourceManager::instance().destroyScriptResource(this);
  64. }
  65. }
  66. void ScriptManagedResource::setResource(const HResource& resource)
  67. {
  68. mResource = static_resource_cast<ManagedResource>(resource);
  69. }
  70. MonoObject* ScriptManagedResource::createInstance()
  71. {
  72. // Implementation of this method is only relevant for native resources, this is just here to stop compiler from complaining
  73. BS_ASSERT(false);
  74. return nullptr;
  75. }
  76. }