BsScriptResource.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 <assert.h>
  8. namespace bs
  9. {
  10. ScriptResourceBase::ScriptResourceBase(MonoObject* instance)
  11. :PersistentScriptObjectBase(instance), mRefreshInProgress(false), mGCHandle(0)
  12. { }
  13. ScriptResourceBase::~ScriptResourceBase()
  14. {
  15. BS_ASSERT(mGCHandle == 0 && "Object being destroyed without its managed instance being freed first.");
  16. }
  17. ScriptObjectBackup ScriptResourceBase::beginRefresh()
  18. {
  19. mRefreshInProgress = true;
  20. return PersistentScriptObjectBase::beginRefresh();
  21. }
  22. void ScriptResourceBase::endRefresh(const ScriptObjectBackup& backupData)
  23. {
  24. mRefreshInProgress = false;
  25. PersistentScriptObjectBase::endRefresh(backupData);
  26. }
  27. MonoObject* ScriptResourceBase::getManagedInstance() const
  28. {
  29. return MonoUtil::getObjectFromGCHandle(mGCHandle);
  30. }
  31. void ScriptResourceBase::setManagedInstance(::MonoObject* instance)
  32. {
  33. BS_ASSERT(mGCHandle == 0 && "Attempting to set a new managed instance without freeing the old one.");
  34. mGCHandle = MonoUtil::newGCHandle(instance, false);
  35. }
  36. void ScriptResourceBase::freeManagedInstance()
  37. {
  38. if (mGCHandle != 0)
  39. {
  40. MonoUtil::freeGCHandle(mGCHandle);
  41. mGCHandle = 0;
  42. }
  43. }
  44. void ScriptResourceBase::destroy()
  45. {
  46. if (!mRefreshInProgress)
  47. ScriptResourceManager::instance().destroyScriptResource(this);
  48. }
  49. void ScriptResource::initRuntimeData()
  50. {
  51. metaData.scriptClass->addInternalCall("Internal_GetName", (void*)&ScriptResource::internal_getName);
  52. metaData.scriptClass->addInternalCall("Internal_GetUUID", (void*)&ScriptResource::internal_getUUID);
  53. metaData.scriptClass->addInternalCall("Internal_Release", (void*)&ScriptResource::internal_release);
  54. }
  55. MonoString* ScriptResource::internal_getName(ScriptResourceBase* nativeInstance)
  56. {
  57. return MonoUtil::wstringToMono(nativeInstance->getGenericHandle()->getName());
  58. }
  59. void ScriptResource::internal_getUUID(ScriptResourceBase* nativeInstance, UUID* uuid)
  60. {
  61. *uuid = nativeInstance->getGenericHandle().getUUID();
  62. }
  63. void ScriptResource::internal_release(ScriptResourceBase* nativeInstance)
  64. {
  65. nativeInstance->getGenericHandle().release();
  66. }
  67. ScriptUUID::ScriptUUID(MonoObject* instance)
  68. :ScriptObject(instance)
  69. { }
  70. void ScriptUUID::initRuntimeData()
  71. { }
  72. MonoObject* ScriptUUID::box(const UUID& value)
  73. {
  74. // We're casting away const but it's fine since structs are passed by value anyway
  75. return MonoUtil::box(metaData.scriptClass->_getInternalClass(), (void*)&value);
  76. }
  77. UUID ScriptUUID::unbox(MonoObject* obj)
  78. {
  79. return *(UUID*)MonoUtil::unbox(obj);
  80. }
  81. }