BsScriptPrefabUtility.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptPrefabUtility.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "Scene/BsPrefabUtility.h"
  7. #include "Wrappers/BsScriptSceneObject.h"
  8. #include "Scene/BsSceneObject.h"
  9. #include "Scene/BsPrefab.h"
  10. #include "Resources/BsResources.h"
  11. #include "BsMonoUtil.h"
  12. #include "BsScriptGameObjectManager.h"
  13. #include "Wrappers/BsScriptPrefab.h"
  14. namespace bs
  15. {
  16. ScriptPrefabUtility::ScriptPrefabUtility(MonoObject* instance)
  17. :ScriptObject(instance)
  18. { }
  19. void ScriptPrefabUtility::initRuntimeData()
  20. {
  21. metaData.scriptClass->addInternalCall("Internal_BreakPrefab", (void*)&ScriptPrefabUtility::internal_breakPrefab);
  22. metaData.scriptClass->addInternalCall("Internal_ApplyPrefab", (void*)&ScriptPrefabUtility::internal_applyPrefab);
  23. metaData.scriptClass->addInternalCall("Internal_RevertPrefab", (void*)&ScriptPrefabUtility::internal_revertPrefab);
  24. metaData.scriptClass->addInternalCall("Internal_HasPrefabLink", (void*)&ScriptPrefabUtility::internal_hasPrefabLink);
  25. metaData.scriptClass->addInternalCall("Internal_GetPrefabParent", (void*)&ScriptPrefabUtility::internal_getPrefabParent);
  26. metaData.scriptClass->addInternalCall("Internal_GetPrefabUUID", (void*)&ScriptPrefabUtility::internal_GetPrefabUUID);
  27. metaData.scriptClass->addInternalCall("Internal_UpdateFromPrefab", (void*)&ScriptPrefabUtility::internal_UpdateFromPrefab);
  28. metaData.scriptClass->addInternalCall("Internal_RecordPrefabDiff", (void*)&ScriptPrefabUtility::internal_RecordPrefabDiff);
  29. }
  30. void ScriptPrefabUtility::internal_breakPrefab(ScriptSceneObject* soPtr)
  31. {
  32. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  33. return;
  34. soPtr->getHandle()->breakPrefabLink();
  35. }
  36. void ScriptPrefabUtility::internal_applyPrefab(ScriptSceneObject* soPtr, ScriptPrefab* prefabPtr)
  37. {
  38. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  39. return;
  40. prefabPtr->getHandle()->update(soPtr->getHandle());
  41. }
  42. void ScriptPrefabUtility::internal_revertPrefab(ScriptSceneObject* soPtr)
  43. {
  44. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  45. return;
  46. PrefabUtility::revertToPrefab(soPtr->getHandle());
  47. }
  48. bool ScriptPrefabUtility::internal_hasPrefabLink(ScriptSceneObject* soPtr)
  49. {
  50. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  51. return false;
  52. return !soPtr->getHandle()->getPrefabLink(true).empty();
  53. }
  54. MonoObject* ScriptPrefabUtility::internal_getPrefabParent(ScriptSceneObject* soPtr)
  55. {
  56. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  57. return nullptr;
  58. HSceneObject so = soPtr->getHandle();
  59. HSceneObject parent = so->getPrefabParent();
  60. if (parent != nullptr)
  61. {
  62. ScriptSceneObject* scriptParent = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(parent);
  63. return scriptParent->getManagedInstance();
  64. }
  65. return nullptr;
  66. }
  67. void ScriptPrefabUtility::internal_GetPrefabUUID(ScriptSceneObject* soPtr, UUID* uuid)
  68. {
  69. *uuid = UUID::EMPTY;
  70. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  71. return;
  72. HSceneObject so = soPtr->getHandle();
  73. *uuid = soPtr->getHandle()->getPrefabLink(true);
  74. }
  75. void ScriptPrefabUtility::internal_UpdateFromPrefab(ScriptSceneObject* soPtr)
  76. {
  77. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  78. return;
  79. HSceneObject so = soPtr->getHandle();
  80. HSceneObject prefabParent = so->getPrefabParent();
  81. if(prefabParent != nullptr)
  82. PrefabUtility::updateFromPrefab(prefabParent);
  83. }
  84. void ScriptPrefabUtility::internal_RecordPrefabDiff(ScriptSceneObject* soPtr)
  85. {
  86. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  87. return;
  88. HSceneObject so = soPtr->getHandle();
  89. PrefabUtility::recordPrefabDiff(so);
  90. }
  91. }