EditorDuplicator.as 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. // Urho3D Duplicator Editor
  2. Window@ duplicatorWindow;
  3. bool inDuplicatorRefresh = false;
  4. Vector3 Position;
  5. Vector3 Rotation;
  6. Vector3 Scale;
  7. uint DuplicatorCount;
  8. String tagName = "TagEditDuplicator";
  9. bool isSwitchOrder = false;
  10. bool isClonesInChild = false;
  11. void CreateDuplicatorEditor()
  12. {
  13. if (duplicatorWindow !is null)
  14. return;
  15. duplicatorWindow = ui.LoadLayout(cache.GetResource("XMLFile", "UI/EditorDuplicator.xml"));
  16. ui.root.AddChild(duplicatorWindow);
  17. duplicatorWindow.opacity = uiMaxOpacity;
  18. InitDuplicatorWindow();
  19. RefreshDuplicatorWindow();
  20. int height = Min(ui.root.height - 60, 750);
  21. duplicatorWindow.SetSize(400, 0);
  22. CenterDialog(duplicatorWindow);
  23. HideDuplicatorEditor();
  24. SubscribeToEvent(duplicatorWindow.GetChild("CloseButton", true), "Released", "HideDuplicatorEditor");
  25. SubscribeToEvent(duplicatorWindow.GetChild("Count", true), "TextChanged", "EditDuplicatorCount");
  26. SubscribeToEvent(duplicatorWindow.GetChild("PosX", true), "TextChanged", "EditDuplicatorPos");
  27. SubscribeToEvent(duplicatorWindow.GetChild("PosY", true), "TextChanged", "EditDuplicatorPos");
  28. SubscribeToEvent(duplicatorWindow.GetChild("PosZ", true), "TextChanged", "EditDuplicatorPos");
  29. SubscribeToEvent(duplicatorWindow.GetChild("RotX", true), "TextChanged", "EditDuplicatorRot");
  30. SubscribeToEvent(duplicatorWindow.GetChild("RotY", true), "TextChanged", "EditDuplicatorRot");
  31. SubscribeToEvent(duplicatorWindow.GetChild("RotZ", true), "TextChanged", "EditDuplicatorRot");
  32. SubscribeToEvent(duplicatorWindow.GetChild("ScaleX", true), "TextChanged", "EditDuplicatorScale");
  33. SubscribeToEvent(duplicatorWindow.GetChild("ScaleY", true), "TextChanged", "EditDuplicatorScale");
  34. SubscribeToEvent(duplicatorWindow.GetChild("ScaleZ", true), "TextChanged", "EditDuplicatorScale");
  35. SubscribeToEvent(duplicatorWindow.GetChild("CheckBox2", true), "Toggled", "OnCheckBox2");
  36. SubscribeToEvent(duplicatorWindow.GetChild("CheckBox3", true), "Toggled", "OnCheckBox3");
  37. SubscribeToEvent(duplicatorWindow.GetChild("ButtonPreview", true), "Released", "OnButtonPreview");
  38. SubscribeToEvent(duplicatorWindow.GetChild("ButtonClear", true), "Released", "OnButtonClear");
  39. SubscribeToEvent(duplicatorWindow.GetChild("ButtonApply", true), "Released", "OnButtonApply");
  40. }
  41. void InitDuplicatorWindow()
  42. {
  43. DuplicatorCount = 1;
  44. Position = Vector3(0,0,0);
  45. Rotation = Vector3(0,0,0);
  46. Scale = Vector3(1,1,1);
  47. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("Count", true)));
  48. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("PosX", true)));
  49. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("PosY", true)));
  50. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("PosZ", true)));
  51. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("RotX", true)));
  52. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("RotY", true)));
  53. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("RotZ", true)));
  54. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("ScaleX", true)));
  55. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("ScaleY", true)));
  56. CreateDragSlider(cast<LineEdit>(duplicatorWindow.GetChild("ScaleZ", true)));
  57. }
  58. void RefreshDuplicatorWindow()
  59. {
  60. inDuplicatorRefresh = true;
  61. RefreshDuplicatorWindowAttributes();
  62. inDuplicatorRefresh = false;
  63. }
  64. void RefreshDuplicatorWindowAttributes()
  65. {
  66. cast<LineEdit>(duplicatorWindow.GetChild("Count", true)).text = DuplicatorCount;
  67. cast<LineEdit>(duplicatorWindow.GetChild("PosX", true)).text = Position.x;
  68. cast<LineEdit>(duplicatorWindow.GetChild("PosY", true)).text = Position.y;
  69. cast<LineEdit>(duplicatorWindow.GetChild("PosZ", true)).text = Position.z;
  70. cast<LineEdit>(duplicatorWindow.GetChild("RotX", true)).text = Rotation.x;
  71. cast<LineEdit>(duplicatorWindow.GetChild("RotY", true)).text = Rotation.y;
  72. cast<LineEdit>(duplicatorWindow.GetChild("RotZ", true)).text = Rotation.z;
  73. cast<LineEdit>(duplicatorWindow.GetChild("ScaleX", true)).text = Scale.x;
  74. cast<LineEdit>(duplicatorWindow.GetChild("ScaleY", true)).text = Scale.y;
  75. cast<LineEdit>(duplicatorWindow.GetChild("ScaleZ", true)).text = Scale.z;
  76. cast<CheckBox>(duplicatorWindow.GetChild("CheckBox2", true)).checked = isSwitchOrder;
  77. cast<CheckBox>(duplicatorWindow.GetChild("CheckBox3", true)).checked = isClonesInChild;
  78. }
  79. bool ToggleDuplicatorEditor()
  80. {
  81. if (duplicatorWindow.visible == false)
  82. ShowDuplicatorEditor();
  83. else
  84. HideDuplicatorEditor();
  85. return true;
  86. }
  87. void ShowDuplicatorEditor()
  88. {
  89. RefreshDuplicatorWindow();
  90. duplicatorWindow.visible = true;
  91. duplicatorWindow.BringToFront();
  92. }
  93. void HideDuplicatorEditor()
  94. {
  95. duplicatorWindow.visible = false;
  96. }
  97. void EditDuplicatorCount(StringHash eventType, VariantMap& eventData)
  98. {
  99. if (inDuplicatorRefresh)
  100. return;
  101. LineEdit@ element = eventData["Element"].GetPtr();
  102. if (element.name == "Count")
  103. DuplicatorCount = element.text.ToFloat();
  104. }
  105. void EditDuplicatorPos(StringHash eventType, VariantMap& eventData)
  106. {
  107. if (inDuplicatorRefresh)
  108. return;
  109. LineEdit@ element = eventData["Element"].GetPtr();
  110. Vector3 v = Position;
  111. if (element.name == "PosX")
  112. Position = Vector3(element.text.ToFloat(), v.y, v.z);
  113. if (element.name == "PosY")
  114. Position = Vector3(v.x, element.text.ToFloat(), v.z);
  115. if (element.name == "PosZ")
  116. Position = Vector3(v.x, v.y, element.text.ToFloat());
  117. }
  118. void EditDuplicatorRot(StringHash eventType, VariantMap& eventData)
  119. {
  120. if (inDuplicatorRefresh)
  121. return;
  122. LineEdit@ element = eventData["Element"].GetPtr();
  123. Vector3 v = Rotation;
  124. if (element.name == "RotX")
  125. Rotation = Vector3(element.text.ToFloat(), v.y, v.z);
  126. if (element.name == "RotY")
  127. Rotation = Vector3(v.x, element.text.ToFloat(), v.z);
  128. if (element.name == "RotZ")
  129. Rotation = Vector3(v.x, v.y, element.text.ToFloat());
  130. }
  131. void EditDuplicatorScale(StringHash eventType, VariantMap& eventData)
  132. {
  133. if (inDuplicatorRefresh)
  134. return;
  135. LineEdit@ element = eventData["Element"].GetPtr();
  136. Vector3 v = Scale;
  137. if (element.name == "ScaleX")
  138. Scale = Vector3(element.text.ToFloat(), v.y, v.z);
  139. if (element.name == "ScaleY")
  140. Scale = Vector3(v.x, element.text.ToFloat(), v.z);
  141. if (element.name == "ScaleZ")
  142. Scale = Vector3(v.x, v.y, element.text.ToFloat());
  143. }
  144. void OnButtonPreview(StringHash eventType, VariantMap& eventData)
  145. {
  146. ProcessDuplicator();
  147. }
  148. void OnButtonClear(StringHash eventType, VariantMap& eventData)
  149. {
  150. DuplicatorClearAll();
  151. }
  152. void OnButtonApply(StringHash eventType, VariantMap& eventData)
  153. {
  154. DuplicatorApplyAll();
  155. }
  156. void OnCheckBox2(StringHash eventType, VariantMap& eventData)
  157. {
  158. CheckBox@ edit = eventData["Element"].GetPtr();
  159. if (edit !is null)
  160. isSwitchOrder = edit.checked;
  161. ProcessDuplicator();
  162. }
  163. void OnCheckBox3(StringHash eventType, VariantMap& eventData)
  164. {
  165. CheckBox@ edit = eventData["Element"].GetPtr();
  166. if (edit !is null)
  167. isClonesInChild = edit.checked;
  168. ProcessDuplicator();
  169. }
  170. void DuplicatorClearAll()
  171. {
  172. Array<Node@> nodes = editorScene.GetChildrenWithTag(tagName,true);
  173. for(uint i=0; i<nodes.length; i++)
  174. {
  175. nodes[i].Remove();
  176. }
  177. }
  178. void DuplicatorApplyAll()
  179. {
  180. Array<Node@> nodes = editorScene.GetChildrenWithTag(tagName,true);
  181. for(uint i=0; i<nodes.length; i++)
  182. {
  183. nodes[i].RemoveTag(tagName);
  184. }
  185. }
  186. void ProcessDuplicator()
  187. {
  188. DuplicatorClearAll();
  189. if(isClonesInChild)
  190. DuplicatorInNode();
  191. else
  192. DuplicatorInScene();
  193. }
  194. void DuplicatorInScene()
  195. {
  196. if(selectedNodes.length > 0)
  197. {
  198. // Apply multiplication only on first selected node
  199. Node@ currentNode = selectedNodes[0];
  200. Node@ baseClone = currentNode.Clone();
  201. baseClone.AddTag(tagName);
  202. Matrix3x4 mulMat(Position, Quaternion(Rotation), Scale);
  203. Matrix3x4 accu = baseClone.transform;
  204. for(uint i=1; i<DuplicatorCount; i++)
  205. {
  206. if(isSwitchOrder)
  207. accu = mulMat * accu;
  208. else
  209. accu = accu * mulMat;
  210. Node@ cloneNode = baseClone.Clone();
  211. cloneNode.SetTransform(accu);
  212. editorScene.AddChild(cloneNode);
  213. }
  214. baseClone.Remove();
  215. }
  216. }
  217. void DuplicatorInNode()
  218. {
  219. if(selectedNodes.length > 0)
  220. {
  221. // Apply multiplication only on first selected node
  222. Node@ currentNode = selectedNodes[0];
  223. Node@ baseClone = currentNode.Clone();
  224. baseClone.AddTag(tagName);
  225. Matrix3x4 mulMat(Position, Quaternion(Rotation), Scale);
  226. Matrix3x4 accu = mulMat;
  227. for(uint i=1; i<DuplicatorCount; i++)
  228. {
  229. Node@ cloneNode = baseClone.Clone();
  230. cloneNode.SetTransform(accu);
  231. currentNode.AddChild(cloneNode);
  232. accu = mulMat * accu;
  233. }
  234. baseClone.Remove();
  235. }
  236. }