BsScriptUndoRedo.cpp 9.3 KB

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