BsScriptUndoRedo.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptUndoRedo.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "Wrappers/BsScriptSceneObject.h"
  8. #include "BsMonoUtil.h"
  9. #include "BsScriptGameObjectManager.h"
  10. #include "UndoRedo/BsUndoRedo.h"
  11. #include "UndoRedo/BsCmdRecordSO.h"
  12. #include "UndoRedo/BsCmdCloneSO.h"
  13. #include "UndoRedo/BsCmdCreateSO.h"
  14. #include "UndoRedo/BsCmdDeleteSO.h"
  15. #include "UndoRedo/BsCmdInstantiateSO.h"
  16. #include "UndoRedo/BsCmdReparentSO.h"
  17. #include "UndoRedo/BsCmdBreakPrefab.h"
  18. #include "Wrappers/BsScriptPrefab.h"
  19. #include "BsManagedEditorCommand.h"
  20. #include "Scene/BsPrefab.h"
  21. #include "BsScriptObjectManager.h"
  22. namespace bs
  23. {
  24. ScriptUndoRedo* ScriptUndoRedo::sGlobalUndoRedo = nullptr;
  25. HEvent ScriptUndoRedo::sDomainLoadConn;
  26. ScriptUndoRedo::ScriptUndoRedo(MonoObject* instance, const SPtr<UndoRedo>& undoRedo)
  27. :ScriptObject(instance), mUndoRedo(undoRedo)
  28. { }
  29. void ScriptUndoRedo::initRuntimeData()
  30. {
  31. metaData.scriptClass->addInternalCall("Internal_CreateInstance", (void*)&ScriptUndoRedo::internal_CreateInstance);
  32. metaData.scriptClass->addInternalCall("Internal_Undo", (void*)&ScriptUndoRedo::internal_Undo);
  33. metaData.scriptClass->addInternalCall("Internal_Redo", (void*)&ScriptUndoRedo::internal_Redo);
  34. metaData.scriptClass->addInternalCall("Internal_RegisterCommand", (void*)&ScriptUndoRedo::internal_RegisterCommand);
  35. metaData.scriptClass->addInternalCall("Internal_PushGroup", (void*)&ScriptUndoRedo::internal_PushGroup);
  36. metaData.scriptClass->addInternalCall("Internal_PopGroup", (void*)&ScriptUndoRedo::internal_PopGroup);
  37. metaData.scriptClass->addInternalCall("Internal_Clear", (void*)&ScriptUndoRedo::internal_Clear);
  38. metaData.scriptClass->addInternalCall("Internal_GetTopCommandId", (void*)&ScriptUndoRedo::internal_GetTopCommandId);
  39. metaData.scriptClass->addInternalCall("Internal_PopCommand", (void*)&ScriptUndoRedo::internal_PopCommand);
  40. metaData.scriptClass->addInternalCall("Internal_RecordSO", (void*)&ScriptUndoRedo::internal_RecordSO);
  41. metaData.scriptClass->addInternalCall("Internal_CloneSO", (void*)&ScriptUndoRedo::internal_CloneSO);
  42. metaData.scriptClass->addInternalCall("Internal_CloneSOMulti", (void*)&ScriptUndoRedo::internal_CloneSOMulti);
  43. metaData.scriptClass->addInternalCall("Internal_Instantiate", (void*)&ScriptUndoRedo::internal_Instantiate);
  44. metaData.scriptClass->addInternalCall("Internal_CreateSO", (void*)&ScriptUndoRedo::internal_CreateSO);
  45. metaData.scriptClass->addInternalCall("Internal_DeleteSO", (void*)&ScriptUndoRedo::internal_DeleteSO);
  46. metaData.scriptClass->addInternalCall("Internal_ReparentSO", (void*)&ScriptUndoRedo::internal_ReparentSO);
  47. metaData.scriptClass->addInternalCall("Internal_ReparentSOMulti", (void*)&ScriptUndoRedo::internal_ReparentSOMulti);
  48. metaData.scriptClass->addInternalCall("Internal_BreakPrefab", (void*)&ScriptUndoRedo::internal_BreakPrefab);
  49. }
  50. void ScriptUndoRedo::startUp()
  51. {
  52. auto createPanel = []()
  53. {
  54. assert(sGlobalUndoRedo == nullptr);
  55. bool dummy = false;
  56. void* ctorParams[1] = { &dummy };
  57. MonoObject* instance = metaData.scriptClass->createInstance("bool", ctorParams);
  58. new (bs_alloc<ScriptUndoRedo>()) ScriptUndoRedo(instance, nullptr);
  59. MonoMethod* setGlobal = metaData.scriptClass->getMethod("Internal_SetGlobal", 1);
  60. void* setGlobalParams[1] = { instance };
  61. setGlobal->invoke(nullptr, setGlobalParams);
  62. };
  63. sDomainLoadConn = ScriptObjectManager::instance().onRefreshDomainLoaded.connect(createPanel);
  64. createPanel();
  65. }
  66. void ScriptUndoRedo::shutDown()
  67. {
  68. sDomainLoadConn.disconnect();
  69. }
  70. MonoObject* ScriptUndoRedo::create()
  71. {
  72. bool dummy = false;
  73. void* params[1] = { &dummy };
  74. MonoObject* instance = metaData.scriptClass->createInstance("bool", params);
  75. SPtr<UndoRedo> undoRedo = bs_shared_ptr_new<UndoRedo>();
  76. new (bs_alloc<ScriptUndoRedo>()) ScriptUndoRedo(instance, undoRedo);
  77. return instance;
  78. }
  79. void ScriptUndoRedo::internal_CreateInstance(MonoObject* instance)
  80. {
  81. SPtr<UndoRedo> undoRedo = bs_shared_ptr_new<UndoRedo>();
  82. new (bs_alloc<ScriptUndoRedo>()) ScriptUndoRedo(instance, undoRedo);
  83. }
  84. void ScriptUndoRedo::internal_Undo(ScriptUndoRedo* thisPtr)
  85. {
  86. UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
  87. undoRedo->undo();
  88. }
  89. void ScriptUndoRedo::internal_Redo(ScriptUndoRedo* thisPtr)
  90. {
  91. UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
  92. undoRedo->redo();
  93. }
  94. void ScriptUndoRedo::internal_RegisterCommand(ScriptUndoRedo* thisPtr, ScriptCmdManaged* command)
  95. {
  96. UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
  97. undoRedo->registerCommand(command->getInternal());
  98. }
  99. void ScriptUndoRedo::internal_PushGroup(ScriptUndoRedo* thisPtr, MonoString* name)
  100. {
  101. String nativeName = MonoUtil::monoToString(name);
  102. UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
  103. undoRedo->pushGroup(nativeName);
  104. }
  105. void ScriptUndoRedo::internal_PopGroup(ScriptUndoRedo* thisPtr, MonoString* name)
  106. {
  107. String nativeName = MonoUtil::monoToString(name);
  108. UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
  109. undoRedo->popGroup(nativeName);
  110. }
  111. void ScriptUndoRedo::internal_Clear(ScriptUndoRedo* thisPtr)
  112. {
  113. UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
  114. return undoRedo->clear();
  115. }
  116. UINT32 ScriptUndoRedo::internal_GetTopCommandId(ScriptUndoRedo* thisPtr)
  117. {
  118. UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
  119. return undoRedo->getTopCommandId();
  120. }
  121. void ScriptUndoRedo::internal_PopCommand(ScriptUndoRedo* thisPtr, UINT32 id)
  122. {
  123. UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
  124. undoRedo->popCommand(id);
  125. }
  126. void ScriptUndoRedo::internal_RecordSO(ScriptSceneObject* soPtr, bool recordHierarchy, MonoString* description)
  127. {
  128. String nativeDescription = MonoUtil::monoToString(description);
  129. CmdRecordSO::execute(soPtr->getHandle(), recordHierarchy, nativeDescription);
  130. }
  131. MonoObject* ScriptUndoRedo::internal_CloneSO(ScriptSceneObject* soPtr, MonoString* description)
  132. {
  133. String nativeDescription = MonoUtil::monoToString(description);
  134. HSceneObject clone = CmdCloneSO::execute(soPtr->getHandle(), nativeDescription);
  135. ScriptSceneObject* cloneSoPtr = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(clone);
  136. return cloneSoPtr->getManagedInstance();
  137. }
  138. MonoArray* ScriptUndoRedo::internal_CloneSOMulti(MonoArray* soPtrs, MonoString* description)
  139. {
  140. String nativeDescription = MonoUtil::monoToString(description);
  141. ScriptArray input(soPtrs);
  142. ScriptArray output = ScriptArray::create<ScriptSceneObject>(input.size());
  143. for (UINT32 i = 0; i < input.size(); i++)
  144. {
  145. ScriptSceneObject* soPtr = input.get<ScriptSceneObject*>(i);
  146. HSceneObject clone = CmdCloneSO::execute(soPtr->getHandle(), nativeDescription);
  147. ScriptSceneObject* cloneSoPtr = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(clone);
  148. output.set(i, cloneSoPtr->getManagedInstance());
  149. }
  150. return output.getInternal();
  151. }
  152. MonoObject* ScriptUndoRedo::internal_Instantiate(ScriptPrefab* prefabPtr, MonoString* description)
  153. {
  154. HPrefab prefab = prefabPtr->getHandle();
  155. if (!prefab.isLoaded())
  156. return nullptr;
  157. String nativeDescription = MonoUtil::monoToString(description);
  158. HSceneObject clone = CmdInstantiateSO::execute(prefab, nativeDescription);
  159. ScriptSceneObject* cloneSoPtr = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(clone);
  160. return cloneSoPtr->getManagedInstance();
  161. }
  162. MonoObject* ScriptUndoRedo::internal_CreateSO(MonoString* name, MonoString* description)
  163. {
  164. String nativeName = MonoUtil::monoToString(name);
  165. String nativeDescription = MonoUtil::monoToString(description);
  166. HSceneObject newObj = CmdCreateSO::execute(nativeName, 0, nativeDescription);
  167. return ScriptGameObjectManager::instance().createScriptSceneObject(newObj)->getManagedInstance();
  168. }
  169. void ScriptUndoRedo::internal_DeleteSO(ScriptSceneObject* soPtr, MonoString* description)
  170. {
  171. String nativeDescription = MonoUtil::monoToString(description);
  172. CmdDeleteSO::execute(soPtr->getHandle(), nativeDescription);
  173. }
  174. void ScriptUndoRedo::internal_ReparentSO(ScriptSceneObject* soPtr, ScriptSceneObject* parentSOPtr, MonoString* description)
  175. {
  176. HSceneObject parent;
  177. if (parentSOPtr != nullptr)
  178. parent = parentSOPtr->getHandle();
  179. String nativeDescription = MonoUtil::monoToString(description);
  180. HSceneObject so = soPtr->getHandle();
  181. CmdReparentSO::execute(so, parent, nativeDescription);
  182. }
  183. void ScriptUndoRedo::internal_ReparentSOMulti(MonoArray* soPtrs, ScriptSceneObject* parentSOPtr, MonoString* description)
  184. {
  185. HSceneObject parent;
  186. if (parentSOPtr != nullptr)
  187. parent = parentSOPtr->getHandle();
  188. String nativeDescription = MonoUtil::monoToString(description);
  189. ScriptArray input(soPtrs);
  190. for (UINT32 i = 0; i < input.size(); i++)
  191. {
  192. ScriptSceneObject* soPtr = input.get<ScriptSceneObject*>(i);
  193. HSceneObject so = soPtr->getHandle();
  194. CmdReparentSO::execute(so, parent, nativeDescription);
  195. }
  196. }
  197. void ScriptUndoRedo::internal_BreakPrefab(ScriptSceneObject* soPtr, MonoString* description)
  198. {
  199. String nativeDescription = MonoUtil::monoToString(description);
  200. HSceneObject so = soPtr->getHandle();
  201. CmdBreakPrefab::execute(so, nativeDescription);
  202. }
  203. }