BsScriptResources.cpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptResources.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsMonoUtil.h"
  8. #include "Resources/BsResources.h"
  9. #include "Resources/BsGameResourceManager.h"
  10. #include "BsScriptResourceManager.h"
  11. #include "Wrappers/BsScriptResource.h"
  12. #include "Wrappers/BsScriptResourceRef.h"
  13. #include "BsApplication.h"
  14. namespace bs
  15. {
  16. ScriptResources::ScriptResources(MonoObject* instance)
  17. :ScriptObject(instance)
  18. { }
  19. void ScriptResources::initRuntimeData()
  20. {
  21. metaData.scriptClass->addInternalCall("Internal_Load", (void*)&ScriptResources::internal_Load);
  22. metaData.scriptClass->addInternalCall("Internal_LoadRef", (void*)&ScriptResources::internal_LoadRef);
  23. metaData.scriptClass->addInternalCall("Internal_UnloadUnused", (void*)&ScriptResources::internal_UnloadUnused);
  24. metaData.scriptClass->addInternalCall("Internal_Release", (void*)&ScriptResources::internal_Release);
  25. metaData.scriptClass->addInternalCall("Internal_ReleaseRef", (void*)&ScriptResources::internal_ReleaseRef);
  26. }
  27. MonoObject* ScriptResources::internal_Load(MonoString* path, bool keepLoaded)
  28. {
  29. Path nativePath = MonoUtil::monoToString(path);
  30. HResource resource = GameResourceManager::instance().load(nativePath, keepLoaded);
  31. if (resource == nullptr)
  32. return nullptr;
  33. ScriptResourceBase* scriptResource = ScriptResourceManager::instance().getScriptResource(resource, true);
  34. return scriptResource->getManagedInstance();
  35. }
  36. MonoObject* ScriptResources::internal_LoadRef(MonoObject* reference, bool keepLoaded)
  37. {
  38. ScriptResourceRef* scriptRef = ScriptResourceRef::toNative(reference);
  39. if (scriptRef == nullptr)
  40. return nullptr;
  41. ResourceLoadFlags loadFlags = ResourceLoadFlag::LoadDependencies;
  42. if (keepLoaded)
  43. loadFlags |= ResourceLoadFlag::KeepInternalRef;
  44. if (gApplication().isEditor())
  45. loadFlags |= ResourceLoadFlag::KeepSourceData;
  46. HResource resource = gResources().load(scriptRef->getHandle(), loadFlags);
  47. if (resource == nullptr)
  48. return nullptr;
  49. ScriptResourceBase* scriptResource = ScriptResourceManager::instance().getScriptResource(resource, true);
  50. return scriptResource->getManagedInstance();
  51. }
  52. void ScriptResources::internal_Release(ScriptResourceBase* resource)
  53. {
  54. resource->getGenericHandle().release();
  55. }
  56. void ScriptResources::internal_ReleaseRef(ScriptResourceRef* resourceRef)
  57. {
  58. resourceRef->getHandle().release();
  59. }
  60. void ScriptResources::internal_UnloadUnused()
  61. {
  62. gResources().unloadAllUnused();
  63. }
  64. }