BsScriptPrefabUtility.cpp 2.7 KB

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