SceneEditOp.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. //
  2. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  3. // LICENSE: Atomic Game Engine Editor and Tools EULA
  4. // Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
  5. // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
  6. //
  7. #include <Atomic/IO/Log.h>
  8. #include <Atomic/Scene/Node.h>
  9. #include <Atomic/Scene/Component.h>
  10. #include <Atomic/Scene/PrefabComponent.h>
  11. #include <Atomic/Scene/Scene.h>
  12. #include "SceneEditOp.h"
  13. #include "SceneEditor3DEvents.h"
  14. namespace AtomicEditor
  15. {
  16. SelectionEditOp::SelectionEditOp(Scene *scene) : SceneEditOp(scene, SCENEEDIT_SELECTION)
  17. {
  18. }
  19. SelectionEditOp::~SelectionEditOp()
  20. {
  21. for (unsigned i = 0; i < editNodes_.Size(); i++)
  22. {
  23. EditNode* enode = editNodes_[i];
  24. for (unsigned j = 0; j < enode->components_.Size(); j++)
  25. delete enode->components_[j];
  26. delete enode;
  27. }
  28. }
  29. void SelectionEditOp::AddNode(Node* node)
  30. {
  31. for (unsigned i = 0; i < editNodes_.Size(); i++)
  32. {
  33. if (editNodes_[i]->node_ == node)
  34. return;
  35. }
  36. EditNode* enode = new EditNode();
  37. enode->node_ = node;
  38. enode->parentBegin_ = enode->parentEnd_ = node->GetParent();
  39. node->Serializable::Save(enode->stateBegin_);
  40. enode->stateBegin_.Seek(0);
  41. enode->stateEnd_ = enode->stateBegin_;
  42. const Vector<SharedPtr<Component>>& components = node->GetComponents();
  43. for (unsigned j = 0; j < components.Size(); j++)
  44. {
  45. Component* component = components[j];
  46. EditComponent* ecomponent = new EditComponent();
  47. ecomponent->component_ = component;
  48. ecomponent->nodeBegin_ = ecomponent->nodeEnd_ = node;
  49. ecomponent->temporaryBegin_ = ecomponent->temporaryEnd_ = component->IsTemporary();
  50. component->Serializable::Save(ecomponent->stateBegin_);
  51. ecomponent->stateBegin_.Seek(0);
  52. ecomponent->stateEnd_ = ecomponent->stateBegin_;
  53. enode->components_.Push(ecomponent);
  54. }
  55. editNodes_.Push(enode);
  56. }
  57. void SelectionEditOp::NodeAdded(Node* node, Node* parent)
  58. {
  59. AddNode(node);
  60. for (unsigned i = 0; i < editNodes_.Size(); i++)
  61. {
  62. if (editNodes_[i]->node_ == node)
  63. {
  64. editNodes_[i]->parentBegin_ = 0;
  65. editNodes_[i]->parentEnd_ = parent;
  66. return;
  67. }
  68. }
  69. }
  70. void SelectionEditOp::NodeRemoved(Node* node, Node* parent)
  71. {
  72. AddNode(node);
  73. for (unsigned i = 0; i < editNodes_.Size(); i++)
  74. {
  75. if (editNodes_[i]->node_ == node)
  76. {
  77. editNodes_[i]->parentBegin_ = parent;
  78. editNodes_[i]->parentEnd_ = 0;
  79. return;
  80. }
  81. }
  82. }
  83. void SelectionEditOp::SetNodes(Vector<SharedPtr<Node> > &nodes)
  84. {
  85. // Generate initial snapshot
  86. for (unsigned i = 0; i < nodes.Size(); i++)
  87. {
  88. AddNode(nodes[i]);
  89. }
  90. }
  91. bool SelectionEditOp::Commit()
  92. {
  93. // See if any nodes, components have been edited
  94. for (unsigned i = 0; i < editNodes_.Size(); i++)
  95. {
  96. EditNode* enode = editNodes_[i];
  97. if (enode->parentBegin_ != enode->parentEnd_)
  98. return true;
  99. if (!CompareStates(enode->stateBegin_, enode->stateEnd_))
  100. return true;
  101. for (unsigned j = 0; j < enode->components_.Size(); j++)
  102. {
  103. EditComponent* ecomponent = enode->components_[j];
  104. if (ecomponent->nodeBegin_ != ecomponent->nodeEnd_)
  105. return true;
  106. if (ecomponent->temporaryBegin_ != ecomponent->temporaryEnd_)
  107. return true;
  108. if (!CompareStates(ecomponent->stateBegin_, ecomponent->stateEnd_))
  109. return true;
  110. }
  111. }
  112. return false;
  113. }
  114. void SelectionEditOp::RegisterEdit()
  115. {
  116. for (unsigned i = 0; i < editNodes_.Size(); i++)
  117. {
  118. EditNode* enode = editNodes_[i];
  119. enode->stateEnd_.Clear();
  120. enode->node_->Serializable::Save(enode->stateEnd_);
  121. enode->stateEnd_.Seek(0);
  122. enode->parentEnd_ = enode->node_->GetParent();
  123. for (unsigned j = 0; j < enode->components_.Size(); j++)
  124. {
  125. EditComponent* ecomponent = enode->components_[j];
  126. ecomponent->stateEnd_.Clear();
  127. ecomponent->component_->Serializable::Save(ecomponent->stateEnd_);
  128. ecomponent->stateEnd_.Seek(0);
  129. ecomponent->nodeEnd_ = ecomponent->component_->GetNode();
  130. ecomponent->temporaryEnd_ = ecomponent->component_->IsTemporary();
  131. }
  132. }
  133. }
  134. bool SelectionEditOp::Undo()
  135. {
  136. scene_->SendEvent(E_SCENEEDITSTATECHANGESBEGIN);
  137. for (unsigned i = 0; i < editNodes_.Size(); i++)
  138. {
  139. EditNode* enode = editNodes_[i];
  140. Node* node = enode->node_;
  141. bool changed = !CompareStates(enode->stateBegin_, enode->stateEnd_);
  142. if (changed && !node->Serializable::Load(enode->stateBegin_))
  143. {
  144. LOGERRORF("Unable to Undo node serializable");
  145. return false;
  146. }
  147. if (changed)
  148. {
  149. VariantMap eventData;
  150. eventData[SceneEditStateChange::P_SERIALIZABLE] = node;
  151. node->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
  152. }
  153. enode->stateBegin_.Seek(0);
  154. if (node->GetParent() != enode->parentBegin_)
  155. {
  156. if(enode->parentBegin_.NotNull())
  157. {
  158. // moving back to original parent
  159. if (node->GetParent())
  160. {
  161. VariantMap nodeRemovedEventData;
  162. nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
  163. nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] = node->GetParent();
  164. nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
  165. scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
  166. }
  167. node->Remove();
  168. enode->parentBegin_->AddChild(node);
  169. VariantMap nodeAddedEventData;
  170. nodeAddedEventData[SceneEditNodeAdded::P_NODE] = node;
  171. nodeAddedEventData[SceneEditNodeAdded::P_PARENT] = enode->parentBegin_;
  172. nodeAddedEventData[SceneEditNodeAdded::P_SCENE] = scene_;
  173. scene_->SendEvent(E_SCENEEDITNODEADDED, nodeAddedEventData);
  174. }
  175. else
  176. {
  177. VariantMap nodeRemovedEventData;
  178. nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
  179. nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] = enode->parentEnd_;
  180. nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
  181. scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
  182. node->Remove();
  183. }
  184. }
  185. for (unsigned j = 0; j < enode->components_.Size(); j++)
  186. {
  187. EditComponent* ecomponent = enode->components_[j];
  188. Component* component = ecomponent->component_;
  189. changed = !CompareStates(ecomponent->stateBegin_, ecomponent->stateEnd_);
  190. if (changed && !component->Serializable::Load(ecomponent->stateBegin_))
  191. {
  192. LOGERRORF("Unable to Undo component serializable");
  193. return false;
  194. }
  195. if (changed)
  196. {
  197. VariantMap eventData;
  198. eventData[SceneEditStateChange::P_SERIALIZABLE] = component;
  199. component->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
  200. }
  201. ecomponent->stateBegin_.Seek(0);
  202. if (component->GetNode() != ecomponent->nodeBegin_ || component->IsTemporary() != ecomponent->temporaryBegin_)
  203. {
  204. component->Remove();
  205. bool add = ecomponent->nodeBegin_.NotNull();
  206. component->SetTemporary(ecomponent->temporaryBegin_);
  207. VariantMap caData;
  208. caData[SceneEditComponentAddedRemoved::P_SCENE] = scene_;
  209. caData[SceneEditComponentAddedRemoved::P_COMPONENT] = component;
  210. if (add)
  211. {
  212. ecomponent->nodeBegin_->AddComponent(component, 0, REPLICATED);
  213. caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeBegin_;
  214. caData[SceneEditComponentAddedRemoved::P_REMOVED] = false;
  215. }
  216. else
  217. {
  218. caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeEnd_;
  219. caData[SceneEditComponentAddedRemoved::P_REMOVED] = true;
  220. }
  221. scene_->SendEvent(E_SCENEEDITCOMPONENTADDEDREMOVED, caData);
  222. }
  223. }
  224. }
  225. scene_->SendEvent(E_SCENEEDITSTATECHANGESEND);
  226. return true;
  227. }
  228. bool SelectionEditOp::Redo()
  229. {
  230. scene_->SendEvent(E_SCENEEDITSTATECHANGESBEGIN);
  231. for (unsigned i = 0; i < editNodes_.Size(); i++)
  232. {
  233. EditNode* enode = editNodes_[i];
  234. Node* node = enode->node_;
  235. bool changed = !CompareStates(enode->stateBegin_, enode->stateEnd_);
  236. if ( changed && !node->Serializable::Load(enode->stateEnd_))
  237. {
  238. LOGERRORF("Unable to Redo node serializable");
  239. return false;
  240. }
  241. enode->stateEnd_.Seek(0);
  242. if (changed)
  243. {
  244. VariantMap eventData;
  245. eventData[SceneEditStateChange::P_SERIALIZABLE] = node;
  246. node->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
  247. }
  248. if (node->GetParent() != enode->parentEnd_)
  249. {
  250. if(enode->parentEnd_.NotNull())
  251. {
  252. if (node->GetParent())
  253. {
  254. VariantMap nodeRemovedEventData;
  255. nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
  256. nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] = node->GetParent();
  257. nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
  258. scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
  259. }
  260. node->Remove();
  261. enode->parentEnd_->AddChild(node);
  262. VariantMap nodeAddedEventData;
  263. nodeAddedEventData[SceneEditNodeAdded::P_NODE] = node;
  264. nodeAddedEventData[SceneEditNodeAdded::P_PARENT] = enode->parentEnd_;
  265. nodeAddedEventData[SceneEditNodeAdded::P_SCENE] = scene_;
  266. scene_->SendEvent(E_SCENEEDITNODEADDED, nodeAddedEventData);
  267. }
  268. else
  269. {
  270. VariantMap nodeRemovedEventData;
  271. nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
  272. nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] = enode->parentBegin_;
  273. nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
  274. scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
  275. node->Remove();
  276. }
  277. }
  278. for (unsigned j = 0; j < enode->components_.Size(); j++)
  279. {
  280. EditComponent* ecomponent = enode->components_[j];
  281. Component* component = ecomponent->component_;
  282. changed = !CompareStates(ecomponent->stateBegin_, ecomponent->stateEnd_);
  283. if ( changed && !component->Serializable::Load(ecomponent->stateEnd_))
  284. {
  285. LOGERRORF("Unable to Redo component serializable");
  286. return false;
  287. }
  288. ecomponent->stateEnd_.Seek(0);
  289. if (changed)
  290. {
  291. VariantMap eventData;
  292. eventData[SceneEditStateChange::P_SERIALIZABLE] = component;
  293. component->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
  294. }
  295. if (component->GetNode() != ecomponent->nodeEnd_ || component->IsTemporary() != ecomponent->temporaryEnd_)
  296. {
  297. component->Remove();
  298. bool add = ecomponent->nodeEnd_.NotNull();
  299. component->SetTemporary(ecomponent->temporaryEnd_);
  300. VariantMap caData;
  301. caData[SceneEditComponentAddedRemoved::P_SCENE] = scene_;
  302. caData[SceneEditComponentAddedRemoved::P_COMPONENT] = component;
  303. if (add)
  304. {
  305. ecomponent->nodeEnd_->AddComponent(component, 0, REPLICATED);
  306. caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeEnd_;
  307. caData[SceneEditComponentAddedRemoved::P_REMOVED] = false;
  308. }
  309. else
  310. {
  311. caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeBegin_;
  312. caData[SceneEditComponentAddedRemoved::P_REMOVED] = true;
  313. }
  314. scene_->SendEvent(E_SCENEEDITCOMPONENTADDEDREMOVED, caData);
  315. }
  316. }
  317. }
  318. scene_->SendEvent(E_SCENEEDITSTATECHANGESEND);
  319. return true;
  320. }
  321. }