BsScriptPrefabUtility.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptPrefabUtility.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsPrefabUtility.h"
  7. #include "BsScriptSceneObject.h"
  8. #include "BsSceneObject.h"
  9. #include "BsPrefab.h"
  10. #include "BsResources.h"
  11. #include "BsScriptGameObjectManager.h"
  12. namespace BansheeEngine
  13. {
  14. ScriptPrefabUtility::ScriptPrefabUtility(MonoObject* instance)
  15. :ScriptObject(instance)
  16. { }
  17. void ScriptPrefabUtility::initRuntimeData()
  18. {
  19. metaData.scriptClass->addInternalCall("Internal_BreakPrefab", &ScriptPrefabUtility::internal_breakPrefab);
  20. metaData.scriptClass->addInternalCall("Internal_ApplyPrefab", &ScriptPrefabUtility::internal_applyPrefab);
  21. metaData.scriptClass->addInternalCall("Internal_RevertPrefab", &ScriptPrefabUtility::internal_revertPrefab);
  22. metaData.scriptClass->addInternalCall("Internal_HasPrefabLink", &ScriptPrefabUtility::internal_hasPrefabLink);
  23. metaData.scriptClass->addInternalCall("Internal_GetPrefabParent", &ScriptPrefabUtility::internal_getPrefabParent);
  24. }
  25. void ScriptPrefabUtility::internal_breakPrefab(ScriptSceneObject* nativeInstance)
  26. {
  27. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  28. return;
  29. nativeInstance->getNativeSceneObject()->breakPrefabLink();
  30. }
  31. void ScriptPrefabUtility::internal_applyPrefab(ScriptSceneObject* nativeInstance)
  32. {
  33. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  34. return;
  35. String prefabLinkUUID = nativeInstance->getNativeSceneObject()->getPrefabLink();
  36. HPrefab prefab = static_resource_cast<Prefab>(gResources().loadFromUUID(prefabLinkUUID, false, false));
  37. if (prefab != nullptr)
  38. prefab->update(nativeInstance->getNativeSceneObject());
  39. gResources().save(prefab);
  40. }
  41. void ScriptPrefabUtility::internal_revertPrefab(ScriptSceneObject* nativeInstance)
  42. {
  43. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  44. return;
  45. PrefabUtility::revertToPrefab(nativeInstance->getNativeSceneObject());
  46. }
  47. bool ScriptPrefabUtility::internal_hasPrefabLink(ScriptSceneObject* nativeInstance)
  48. {
  49. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  50. return false;
  51. return !nativeInstance->getNativeSceneObject()->getPrefabLink().empty();
  52. }
  53. MonoObject* ScriptPrefabUtility::internal_getPrefabParent(ScriptSceneObject* nativeInstance)
  54. {
  55. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  56. return nullptr;
  57. HSceneObject so = nativeInstance->getNativeSceneObject();
  58. HSceneObject parent = so->getPrefabParent();
  59. if(parent != nullptr)
  60. {
  61. ScriptSceneObject* scriptParent = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(parent);
  62. return scriptParent->getManagedInstance();
  63. }
  64. return nullptr;
  65. }
  66. }