BsScriptPrefabUtility.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. #include "BsScriptPrefab.h"
  14. namespace BansheeEngine
  15. {
  16. ScriptPrefabUtility::ScriptPrefabUtility(MonoObject* instance)
  17. :ScriptObject(instance)
  18. { }
  19. void ScriptPrefabUtility::initRuntimeData()
  20. {
  21. metaData.scriptClass->addInternalCall("Internal_BreakPrefab", &ScriptPrefabUtility::internal_breakPrefab);
  22. metaData.scriptClass->addInternalCall("Internal_ApplyPrefab", &ScriptPrefabUtility::internal_applyPrefab);
  23. metaData.scriptClass->addInternalCall("Internal_RevertPrefab", &ScriptPrefabUtility::internal_revertPrefab);
  24. metaData.scriptClass->addInternalCall("Internal_HasPrefabLink", &ScriptPrefabUtility::internal_hasPrefabLink);
  25. metaData.scriptClass->addInternalCall("Internal_GetPrefabParent", &ScriptPrefabUtility::internal_getPrefabParent);
  26. metaData.scriptClass->addInternalCall("Internal_GetPrefabUUID", &ScriptPrefabUtility::internal_GetPrefabUUID);
  27. metaData.scriptClass->addInternalCall("Internal_UpdateFromPrefab", &ScriptPrefabUtility::internal_UpdateFromPrefab);
  28. metaData.scriptClass->addInternalCall("Internal_RecordPrefabDiff", &ScriptPrefabUtility::internal_RecordPrefabDiff);
  29. }
  30. void ScriptPrefabUtility::internal_breakPrefab(ScriptSceneObject* soPtr)
  31. {
  32. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  33. return;
  34. soPtr->getNativeSceneObject()->breakPrefabLink();
  35. }
  36. void ScriptPrefabUtility::internal_applyPrefab(ScriptSceneObject* soPtr, ScriptPrefab* prefabPtr)
  37. {
  38. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  39. return;
  40. prefabPtr->getHandle()->update(soPtr->getNativeSceneObject());
  41. }
  42. void ScriptPrefabUtility::internal_revertPrefab(ScriptSceneObject* soPtr)
  43. {
  44. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  45. return;
  46. PrefabUtility::revertToPrefab(soPtr->getNativeSceneObject());
  47. }
  48. bool ScriptPrefabUtility::internal_hasPrefabLink(ScriptSceneObject* soPtr)
  49. {
  50. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  51. return false;
  52. return !soPtr->getNativeSceneObject()->getPrefabLink(true).empty();
  53. }
  54. MonoObject* ScriptPrefabUtility::internal_getPrefabParent(ScriptSceneObject* soPtr)
  55. {
  56. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  57. return nullptr;
  58. HSceneObject so = soPtr->getNativeSceneObject();
  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. MonoString* ScriptPrefabUtility::internal_GetPrefabUUID(ScriptSceneObject* soPtr)
  68. {
  69. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  70. return nullptr;
  71. HSceneObject so = soPtr->getNativeSceneObject();
  72. String prefabUUID = soPtr->getNativeSceneObject()->getPrefabLink(true);
  73. if (prefabUUID.empty())
  74. return nullptr;
  75. return MonoUtil::stringToMono(prefabUUID);
  76. }
  77. void ScriptPrefabUtility::internal_UpdateFromPrefab(ScriptSceneObject* soPtr)
  78. {
  79. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  80. return;
  81. HSceneObject so = soPtr->getNativeSceneObject();
  82. HSceneObject prefabParent = so->getPrefabParent();
  83. if(prefabParent != nullptr)
  84. PrefabUtility::updateFromPrefab(prefabParent);
  85. }
  86. void ScriptPrefabUtility::internal_RecordPrefabDiff(ScriptSceneObject* soPtr)
  87. {
  88. if (ScriptSceneObject::checkIfDestroyed(soPtr))
  89. return;
  90. HSceneObject so = soPtr->getNativeSceneObject();
  91. PrefabUtility::recordPrefabDiff(so);
  92. }
  93. }