SceneEditOp.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. //
  2. // Copyright (c) 2014-2016 THUNDERBEAST GAMES LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to deal
  6. // in the Software without restriction, including without limitation the rights
  7. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. // copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20. // THE SOFTWARE.
  21. //
  22. #include <Atomic/IO/Log.h>
  23. #include <Atomic/Scene/Node.h>
  24. #include <Atomic/Scene/Component.h>
  25. #include <Atomic/Scene/PrefabComponent.h>
  26. #include <Atomic/Scene/Scene.h>
  27. #include "SceneEditOp.h"
  28. #include "SceneEditor3DEvents.h"
  29. namespace AtomicEditor
  30. {
  31. SelectionEditOp::SelectionEditOp(Scene *scene) : SceneEditOp(scene, SCENEEDIT_SELECTION)
  32. {
  33. }
  34. SelectionEditOp::~SelectionEditOp()
  35. {
  36. for (unsigned i = 0; i < editNodes_.Size(); i++)
  37. {
  38. EditNode* enode = editNodes_[i];
  39. for (unsigned j = 0; j < enode->components_.Size(); j++)
  40. delete enode->components_[j];
  41. delete enode;
  42. }
  43. }
  44. bool SelectionEditOp::EraseNode(Node *node)
  45. {
  46. PODVector<EditNode*>::Iterator itr = editNodes_.Begin();
  47. while (itr != editNodes_.End())
  48. {
  49. if ((*itr)->node_ == node)
  50. {
  51. for (unsigned j = 0; j < (*itr)->components_.Size(); j++)
  52. delete (*itr)->components_[j];
  53. delete *itr;
  54. editNodes_.Erase(itr);
  55. break;
  56. }
  57. itr++;
  58. }
  59. return editNodes_.Size() == 0;
  60. }
  61. void SelectionEditOp::AddNode(Node* node)
  62. {
  63. for (unsigned i = 0; i < editNodes_.Size(); i++)
  64. {
  65. if (editNodes_[i]->node_ == node)
  66. return;
  67. }
  68. EditNode* enode = new EditNode();
  69. enode->node_ = node;
  70. enode->parentBegin_ = enode->parentEnd_ = node->GetParent();
  71. node->Serializable::Save(enode->stateBegin_);
  72. enode->stateBegin_.Seek(0);
  73. enode->stateEnd_ = enode->stateBegin_;
  74. const Vector<SharedPtr<Component>>& components = node->GetComponents();
  75. for (unsigned j = 0; j < components.Size(); j++)
  76. {
  77. Component* component = components[j];
  78. EditComponent* ecomponent = new EditComponent();
  79. ecomponent->component_ = component;
  80. ecomponent->nodeBegin_ = ecomponent->nodeEnd_ = node;
  81. component->Serializable::Save(ecomponent->stateBegin_);
  82. ecomponent->stateBegin_.Seek(0);
  83. ecomponent->stateEnd_ = ecomponent->stateBegin_;
  84. enode->components_.Push(ecomponent);
  85. }
  86. editNodes_.Push(enode);
  87. }
  88. void SelectionEditOp::NodeAdded(Node* node, Node* parent)
  89. {
  90. AddNode(node);
  91. for (unsigned i = 0; i < editNodes_.Size(); i++)
  92. {
  93. if (editNodes_[i]->node_ == node)
  94. {
  95. editNodes_[i]->parentBegin_ = 0;
  96. editNodes_[i]->parentEnd_ = parent;
  97. return;
  98. }
  99. }
  100. }
  101. void SelectionEditOp::NodeRemoved(Node* node, Node* parent)
  102. {
  103. AddNode(node);
  104. for (unsigned i = 0; i < editNodes_.Size(); i++)
  105. {
  106. if (editNodes_[i]->node_ == node)
  107. {
  108. editNodes_[i]->parentBegin_ = parent;
  109. editNodes_[i]->parentEnd_ = 0;
  110. return;
  111. }
  112. }
  113. }
  114. void SelectionEditOp::SetNodes(Vector<SharedPtr<Node> > &nodes)
  115. {
  116. // Generate initial snapshot
  117. for (unsigned i = 0; i < nodes.Size(); i++)
  118. {
  119. AddNode(nodes[i]);
  120. }
  121. }
  122. bool SelectionEditOp::Commit()
  123. {
  124. // See if any nodes, components have been edited
  125. for (unsigned i = 0; i < editNodes_.Size(); i++)
  126. {
  127. EditNode* enode = editNodes_[i];
  128. if (enode->parentBegin_ != enode->parentEnd_)
  129. return true;
  130. if (!CompareStates(enode->stateBegin_, enode->stateEnd_))
  131. return true;
  132. for (unsigned j = 0; j < enode->components_.Size(); j++)
  133. {
  134. EditComponent* ecomponent = enode->components_[j];
  135. if (ecomponent->nodeBegin_ != ecomponent->nodeEnd_)
  136. return true;
  137. if (!CompareStates(ecomponent->stateBegin_, ecomponent->stateEnd_))
  138. return true;
  139. }
  140. }
  141. return false;
  142. }
  143. void SelectionEditOp::RegisterEdit()
  144. {
  145. for (unsigned i = 0; i < editNodes_.Size(); i++)
  146. {
  147. EditNode* enode = editNodes_[i];
  148. enode->stateEnd_.Clear();
  149. enode->node_->Serializable::Save(enode->stateEnd_);
  150. enode->stateEnd_.Seek(0);
  151. enode->parentEnd_ = enode->node_->GetParent();
  152. for (unsigned j = 0; j < enode->components_.Size(); j++)
  153. {
  154. EditComponent* ecomponent = enode->components_[j];
  155. ecomponent->stateEnd_.Clear();
  156. ecomponent->component_->Serializable::Save(ecomponent->stateEnd_);
  157. ecomponent->stateEnd_.Seek(0);
  158. ecomponent->nodeEnd_ = ecomponent->component_->GetNode();
  159. }
  160. }
  161. }
  162. bool SelectionEditOp::Undo()
  163. {
  164. scene_->SendEvent(E_SCENEEDITSTATECHANGESBEGIN);
  165. for (unsigned i = 0; i < editNodes_.Size(); i++)
  166. {
  167. EditNode* enode = editNodes_[i];
  168. Node* node = enode->node_;
  169. bool changed = !CompareStates(enode->stateBegin_, enode->stateEnd_);
  170. if (changed && !node->Serializable::Load(enode->stateBegin_))
  171. {
  172. ATOMIC_LOGERRORF("Unable to Undo node serializable");
  173. return false;
  174. }
  175. if (changed)
  176. {
  177. VariantMap eventData;
  178. eventData[SceneEditStateChange::P_SERIALIZABLE] = node;
  179. node->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
  180. }
  181. enode->stateBegin_.Seek(0);
  182. if (node->GetParent() != enode->parentBegin_)
  183. {
  184. if(enode->parentBegin_.NotNull())
  185. {
  186. // moving back to original parent
  187. if (node->GetParent())
  188. {
  189. VariantMap nodeRemovedEventData;
  190. nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
  191. nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] = node->GetParent();
  192. nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
  193. scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
  194. }
  195. node->Remove();
  196. enode->parentBegin_->AddChild(node);
  197. VariantMap nodeAddedEventData;
  198. nodeAddedEventData[SceneEditNodeAdded::P_NODE] = node;
  199. nodeAddedEventData[SceneEditNodeAdded::P_PARENT] = enode->parentBegin_;
  200. nodeAddedEventData[SceneEditNodeAdded::P_SCENE] = scene_;
  201. scene_->SendEvent(E_SCENEEDITNODEADDED, nodeAddedEventData);
  202. }
  203. else
  204. {
  205. VariantMap nodeRemovedEventData;
  206. nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
  207. nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] = enode->parentEnd_;
  208. nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
  209. scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
  210. node->Remove();
  211. }
  212. }
  213. for (unsigned j = 0; j < enode->components_.Size(); j++)
  214. {
  215. EditComponent* ecomponent = enode->components_[j];
  216. Component* component = ecomponent->component_;
  217. changed = !CompareStates(ecomponent->stateBegin_, ecomponent->stateEnd_);
  218. if (changed && !component->Serializable::Load(ecomponent->stateBegin_))
  219. {
  220. ATOMIC_LOGERRORF("Unable to Undo component serializable");
  221. return false;
  222. }
  223. if (changed)
  224. {
  225. VariantMap eventData;
  226. eventData[SceneEditStateChange::P_SERIALIZABLE] = component;
  227. component->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
  228. }
  229. ecomponent->stateBegin_.Seek(0);
  230. if (component->GetNode() != ecomponent->nodeBegin_)
  231. {
  232. component->Remove();
  233. bool add = ecomponent->nodeBegin_.NotNull();
  234. VariantMap caData;
  235. caData[SceneEditComponentAddedRemoved::P_SCENE] = scene_;
  236. caData[SceneEditComponentAddedRemoved::P_COMPONENT] = component;
  237. if (add)
  238. {
  239. ecomponent->nodeBegin_->AddComponent(component, 0, REPLICATED);
  240. caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeBegin_;
  241. caData[SceneEditComponentAddedRemoved::P_REMOVED] = false;
  242. }
  243. else
  244. {
  245. caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeEnd_;
  246. caData[SceneEditComponentAddedRemoved::P_REMOVED] = true;
  247. }
  248. scene_->SendEvent(E_SCENEEDITCOMPONENTADDEDREMOVED, caData);
  249. }
  250. }
  251. }
  252. scene_->SendEvent(E_SCENEEDITSTATECHANGESEND);
  253. return true;
  254. }
  255. bool SelectionEditOp::Redo()
  256. {
  257. scene_->SendEvent(E_SCENEEDITSTATECHANGESBEGIN);
  258. for (unsigned i = 0; i < editNodes_.Size(); i++)
  259. {
  260. EditNode* enode = editNodes_[i];
  261. Node* node = enode->node_;
  262. bool changed = !CompareStates(enode->stateBegin_, enode->stateEnd_);
  263. if ( changed && !node->Serializable::Load(enode->stateEnd_))
  264. {
  265. ATOMIC_LOGERRORF("Unable to Redo node serializable");
  266. return false;
  267. }
  268. enode->stateEnd_.Seek(0);
  269. if (changed)
  270. {
  271. VariantMap eventData;
  272. eventData[SceneEditStateChange::P_SERIALIZABLE] = node;
  273. node->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
  274. }
  275. if (node->GetParent() != enode->parentEnd_)
  276. {
  277. if(enode->parentEnd_.NotNull())
  278. {
  279. if (node->GetParent())
  280. {
  281. VariantMap nodeRemovedEventData;
  282. nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
  283. nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] = node->GetParent();
  284. nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
  285. scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
  286. }
  287. node->Remove();
  288. enode->parentEnd_->AddChild(node);
  289. VariantMap nodeAddedEventData;
  290. nodeAddedEventData[SceneEditNodeAdded::P_NODE] = node;
  291. nodeAddedEventData[SceneEditNodeAdded::P_PARENT] = enode->parentEnd_;
  292. nodeAddedEventData[SceneEditNodeAdded::P_SCENE] = scene_;
  293. scene_->SendEvent(E_SCENEEDITNODEADDED, nodeAddedEventData);
  294. }
  295. else
  296. {
  297. VariantMap nodeRemovedEventData;
  298. nodeRemovedEventData[SceneEditNodeRemoved::P_NODE] = node;
  299. nodeRemovedEventData[SceneEditNodeRemoved::P_PARENT] = enode->parentBegin_;
  300. nodeRemovedEventData[SceneEditNodeRemoved::P_SCENE] = scene_;
  301. scene_->SendEvent(E_SCENEEDITNODEREMOVED, nodeRemovedEventData);
  302. node->Remove();
  303. }
  304. }
  305. for (unsigned j = 0; j < enode->components_.Size(); j++)
  306. {
  307. EditComponent* ecomponent = enode->components_[j];
  308. Component* component = ecomponent->component_;
  309. changed = !CompareStates(ecomponent->stateBegin_, ecomponent->stateEnd_);
  310. if ( changed && !component->Serializable::Load(ecomponent->stateEnd_))
  311. {
  312. ATOMIC_LOGERRORF("Unable to Redo component serializable");
  313. return false;
  314. }
  315. ecomponent->stateEnd_.Seek(0);
  316. if (changed)
  317. {
  318. VariantMap eventData;
  319. eventData[SceneEditStateChange::P_SERIALIZABLE] = component;
  320. component->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
  321. }
  322. if (component->GetNode() != ecomponent->nodeEnd_)
  323. {
  324. component->Remove();
  325. bool add = ecomponent->nodeEnd_.NotNull();
  326. VariantMap caData;
  327. caData[SceneEditComponentAddedRemoved::P_SCENE] = scene_;
  328. caData[SceneEditComponentAddedRemoved::P_COMPONENT] = component;
  329. if (add)
  330. {
  331. ecomponent->nodeEnd_->AddComponent(component, 0, REPLICATED);
  332. caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeEnd_;
  333. caData[SceneEditComponentAddedRemoved::P_REMOVED] = false;
  334. }
  335. else
  336. {
  337. caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeBegin_;
  338. caData[SceneEditComponentAddedRemoved::P_REMOVED] = true;
  339. }
  340. scene_->SendEvent(E_SCENEEDITCOMPONENTADDEDREMOVED, caData);
  341. }
  342. }
  343. }
  344. scene_->SendEvent(E_SCENEEDITSTATECHANGESEND);
  345. return true;
  346. }
  347. }