BsScriptPrefabUtility.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 "BsMonoUtil.h"
  12. #include "BsScriptGameObjectManager.h"
  13. namespace BansheeEngine
  14. {
  15. ScriptPrefabUtility::ScriptPrefabUtility(MonoObject* instance)
  16. :ScriptObject(instance)
  17. { }
  18. void ScriptPrefabUtility::initRuntimeData()
  19. {
  20. metaData.scriptClass->addInternalCall("Internal_BreakPrefab", &ScriptPrefabUtility::internal_breakPrefab);
  21. metaData.scriptClass->addInternalCall("Internal_ApplyPrefab", &ScriptPrefabUtility::internal_applyPrefab);
  22. metaData.scriptClass->addInternalCall("Internal_RevertPrefab", &ScriptPrefabUtility::internal_revertPrefab);
  23. metaData.scriptClass->addInternalCall("Internal_HasPrefabLink", &ScriptPrefabUtility::internal_hasPrefabLink);
  24. metaData.scriptClass->addInternalCall("Internal_GetPrefabParent", &ScriptPrefabUtility::internal_getPrefabParent);
  25. metaData.scriptClass->addInternalCall("Internal_GetPrefabUUID", &ScriptPrefabUtility::internal_GetPrefabUUID);
  26. metaData.scriptClass->addInternalCall("Internal_UpdateFromPrefab", &ScriptPrefabUtility::internal_UpdateFromPrefab);
  27. metaData.scriptClass->addInternalCall("Internal_RecordPrefabDiff", &ScriptPrefabUtility::internal_RecordPrefabDiff);
  28. }
  29. void ScriptPrefabUtility::internal_breakPrefab(ScriptSceneObject* nativeInstance)
  30. {
  31. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  32. return;
  33. nativeInstance->getNativeSceneObject()->breakPrefabLink();
  34. }
  35. void ScriptPrefabUtility::internal_applyPrefab(ScriptSceneObject* nativeInstance)
  36. {
  37. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  38. return;
  39. ResourceLoadFlags loadFlags = ResourceLoadFlag::KeepInternalRef | ResourceLoadFlag::KeepSourceData;
  40. String prefabLinkUUID = nativeInstance->getNativeSceneObject()->getPrefabLink();
  41. HPrefab prefab = static_resource_cast<Prefab>(gResources().loadFromUUID(prefabLinkUUID, false, loadFlags));
  42. if (prefab != nullptr)
  43. prefab->update(nativeInstance->getNativeSceneObject());
  44. gResources().save(prefab);
  45. }
  46. void ScriptPrefabUtility::internal_revertPrefab(ScriptSceneObject* nativeInstance)
  47. {
  48. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  49. return;
  50. PrefabUtility::revertToPrefab(nativeInstance->getNativeSceneObject());
  51. }
  52. bool ScriptPrefabUtility::internal_hasPrefabLink(ScriptSceneObject* nativeInstance)
  53. {
  54. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  55. return false;
  56. return !nativeInstance->getNativeSceneObject()->getPrefabLink().empty();
  57. }
  58. MonoObject* ScriptPrefabUtility::internal_getPrefabParent(ScriptSceneObject* nativeInstance)
  59. {
  60. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  61. return nullptr;
  62. HSceneObject so = nativeInstance->getNativeSceneObject();
  63. HSceneObject parent = so->getPrefabParent();
  64. if (parent != nullptr)
  65. {
  66. ScriptSceneObject* scriptParent = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(parent);
  67. return scriptParent->getManagedInstance();
  68. }
  69. return nullptr;
  70. }
  71. MonoString* ScriptPrefabUtility::internal_GetPrefabUUID(ScriptSceneObject* nativeInstance)
  72. {
  73. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  74. return nullptr;
  75. HSceneObject so = nativeInstance->getNativeSceneObject();
  76. String prefabUUID = nativeInstance->getNativeSceneObject()->getPrefabLink();
  77. if (prefabUUID.empty())
  78. return nullptr;
  79. return MonoUtil::stringToMono(prefabUUID);
  80. }
  81. void ScriptPrefabUtility::internal_UpdateFromPrefab(ScriptSceneObject* nativeInstance)
  82. {
  83. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  84. return;
  85. HSceneObject so = nativeInstance->getNativeSceneObject();
  86. PrefabUtility::updateFromPrefab(so);
  87. }
  88. void ScriptPrefabUtility::internal_RecordPrefabDiff(ScriptSceneObject* nativeInstance)
  89. {
  90. if (ScriptSceneObject::checkIfDestroyed(nativeInstance))
  91. return;
  92. HSceneObject so = nativeInstance->getNativeSceneObject();
  93. PrefabUtility::recordPrefabDiff(so);
  94. }
  95. }