BsScriptManagedResource.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "BsScriptManagedResource.h"
  2. #include "BsScriptResourceManager.h"
  3. #include "BsScriptMeta.h"
  4. #include "BsMonoField.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoManager.h"
  7. #include "BsManagedResource.h"
  8. #include "BsResources.h"
  9. #include "BsException.h"
  10. namespace BansheeEngine
  11. {
  12. ScriptManagedResource::ScriptManagedResource(MonoObject* instance, const HManagedResource& resource)
  13. :ScriptObject(instance), mResource(resource)
  14. {
  15. }
  16. void ScriptManagedResource::initRuntimeData()
  17. {
  18. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptManagedResource::internal_createInstance);
  19. }
  20. void ScriptManagedResource::internal_createInstance(MonoObject* instance)
  21. {
  22. HManagedResource resource = ManagedResource::create(instance);
  23. ScriptResourceManager::instance().createManagedResource(instance, resource);
  24. }
  25. void ScriptManagedResource::_onManagedInstanceDeleted()
  26. {
  27. mManagedInstance = nullptr;
  28. // The only way this method should be reachable is when Resource::unload is called, which means the resource
  29. // has had to been already freed. Even if all managed instances are released ManagedResource itself holds the last
  30. // instance which is only freed on unload().
  31. // Note: During domain unload this could get called even if not all instances are released, but ManagedResourceManager
  32. // should make sure all instances are unloaded before that happens.
  33. assert(mResource == nullptr || !mResource.isLoaded());
  34. ScriptResourceManager::instance().destroyScriptResource(this);
  35. }
  36. void ScriptManagedResource::setNativeHandle(const HResource& resource)
  37. {
  38. mResource = static_resource_cast<ManagedResource>(resource);
  39. }
  40. }