BsScriptManagedResource.cpp 3.2 KB

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