BsScriptResource.cpp 2.5 KB

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