BsScriptResource.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptResource.h"
  4. #include "BsScriptResourceManager.h"
  5. #include "Resources/BsResource.h"
  6. #include "BsMonoUtil.h"
  7. #include "Serialization/BsScriptAssemblyManager.h"
  8. #include "BsManagedResource.h"
  9. #include "Reflection/BsRTTIType.h"
  10. namespace bs
  11. {
  12. ScriptResourceBase::ScriptResourceBase(MonoObject* instance)
  13. :PersistentScriptObjectBase(instance), mGCHandle(0)
  14. { }
  15. ScriptResourceBase::~ScriptResourceBase()
  16. {
  17. BS_ASSERT(mGCHandle == 0 && "Object being destroyed without its managed instance being freed first.");
  18. }
  19. MonoObject* ScriptResourceBase::getManagedInstance() const
  20. {
  21. return MonoUtil::getObjectFromGCHandle(mGCHandle);
  22. }
  23. MonoObject* ScriptResourceBase::getRRef(const HResource& resource, UINT32 rttiId)
  24. {
  25. ::MonoClass* rrefClass = getRRefClass(rttiId);
  26. if(!rrefClass)
  27. return nullptr;
  28. ScriptRRefBase* rref = ScriptResourceManager::instance().getScriptRRef(resource, rrefClass);
  29. if(!rref)
  30. return nullptr;
  31. return rref->getManagedInstance();
  32. }
  33. void ScriptResourceBase::setManagedInstance(::MonoObject* instance)
  34. {
  35. BS_ASSERT(mGCHandle == 0 && "Attempting to set a new managed instance without freeing the old one.");
  36. mGCHandle = MonoUtil::newGCHandle(instance, false);
  37. }
  38. void ScriptResourceBase::freeManagedInstance()
  39. {
  40. if (mGCHandle != 0)
  41. {
  42. MonoUtil::freeGCHandle(mGCHandle);
  43. mGCHandle = 0;
  44. }
  45. }
  46. void ScriptResourceBase::destroy()
  47. {
  48. ScriptResourceManager::instance().destroyScriptResource(this);
  49. }
  50. ::MonoClass* ScriptResourceBase::getManagedResourceClass(UINT32 rttiId)
  51. {
  52. if(rttiId == Resource::getRTTIStatic()->getRTTIId())
  53. return ScriptResource::getMetaData()->scriptClass->_getInternalClass();
  54. else if(rttiId == ManagedResource::getRTTIStatic()->getRTTIId())
  55. return ScriptResource::getMetaData()->scriptClass->_getInternalClass();
  56. else
  57. {
  58. BuiltinResourceInfo* info = ScriptAssemblyManager::instance().getBuiltinResourceInfo(rttiId);
  59. if (info == nullptr)
  60. return nullptr;
  61. return info->monoClass->_getInternalClass();
  62. }
  63. }
  64. ::MonoClass* ScriptResourceBase::getRRefClass(UINT32 rttiId)
  65. {
  66. ::MonoClass* monoClass = getManagedResourceClass(rttiId);
  67. if (!monoClass)
  68. return nullptr;
  69. return ScriptRRefBase::bindGenericParam(monoClass);
  70. }
  71. void ScriptResource::initRuntimeData()
  72. {
  73. metaData.scriptClass->addInternalCall("Internal_GetName", (void*)&ScriptResource::internal_getName);
  74. metaData.scriptClass->addInternalCall("Internal_GetUUID", (void*)&ScriptResource::internal_getUUID);
  75. metaData.scriptClass->addInternalCall("Internal_Release", (void*)&ScriptResource::internal_release);
  76. }
  77. MonoString* ScriptResource::internal_getName(ScriptResourceBase* nativeInstance)
  78. {
  79. return MonoUtil::stringToMono(nativeInstance->getGenericHandle()->getName());
  80. }
  81. void ScriptResource::internal_getUUID(ScriptResourceBase* nativeInstance, UUID* uuid)
  82. {
  83. *uuid = nativeInstance->getGenericHandle().getUUID();
  84. }
  85. void ScriptResource::internal_release(ScriptResourceBase* nativeInstance)
  86. {
  87. nativeInstance->getGenericHandle().release();
  88. }
  89. ScriptUUID::ScriptUUID(MonoObject* instance)
  90. :ScriptObject(instance)
  91. { }
  92. void ScriptUUID::initRuntimeData()
  93. { }
  94. MonoObject* ScriptUUID::box(const UUID& value)
  95. {
  96. // We're casting away const but it's fine since structs are passed by value anyway
  97. return MonoUtil::box(metaData.scriptClass->_getInternalClass(), (void*)&value);
  98. }
  99. UUID ScriptUUID::unbox(MonoObject* obj)
  100. {
  101. return *(UUID*)MonoUtil::unbox(obj);
  102. }
  103. }