MoveHandle.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using BansheeEngine;
  2. namespace BansheeEditor
  3. {
  4. public sealed class MoveHandle : DefaultHandle
  5. {
  6. private const float CONE_HEIGHT = 0.25f;
  7. private const float CONE_RADIUS = 0.175f;
  8. private Vector3 delta;
  9. private HandleSliderLine xAxis;
  10. private HandleSliderLine yAxis;
  11. private HandleSliderLine zAxis;
  12. private HandleSliderPlane xyPlane;
  13. private HandleSliderPlane yzPlane;
  14. private HandleSliderPlane zxPlane;
  15. public Vector3 Delta
  16. {
  17. get { return delta; }
  18. }
  19. internal override bool IsDragged()
  20. {
  21. return xAxis.State == HandleSlider.StateType.Active ||
  22. yAxis.State == HandleSlider.StateType.Active ||
  23. zAxis.State == HandleSlider.StateType.Active ||
  24. xyPlane.State == HandleSlider.StateType.Active ||
  25. yzPlane.State == HandleSlider.StateType.Active ||
  26. zxPlane.State == HandleSlider.StateType.Active;
  27. }
  28. public MoveHandle()
  29. {
  30. xAxis = new HandleSliderLine(this, Vector3.xAxis, 1.0f);
  31. yAxis = new HandleSliderLine(this, Vector3.yAxis, 1.0f);
  32. zAxis = new HandleSliderLine(this, Vector3.zAxis, 1.0f);
  33. xyPlane = new HandleSliderPlane(this, Vector3.xAxis, Vector3.yAxis, 0.3f);
  34. yzPlane = new HandleSliderPlane(this, Vector3.yAxis, Vector3.zAxis, 0.3f);
  35. zxPlane = new HandleSliderPlane(this, Vector3.zAxis, Vector3.xAxis, 0.3f);
  36. }
  37. protected override void PreInput()
  38. {
  39. xAxis.Position = position;
  40. yAxis.Position = position;
  41. zAxis.Position = position;
  42. xyPlane.Position = position;
  43. yzPlane.Position = position;
  44. zxPlane.Position = position;
  45. xAxis.Rotation = rotation;
  46. yAxis.Rotation = rotation;
  47. zAxis.Rotation = rotation;
  48. xyPlane.Rotation = rotation;
  49. yzPlane.Rotation = rotation;
  50. zxPlane.Rotation = rotation;
  51. }
  52. protected override void PostInput()
  53. {
  54. delta = Vector3.zero;
  55. if (Handles.MoveHandleSnapActive)
  56. {
  57. delta += Handles.SnapValue(xAxis.Delta, Handles.MoveSnapAmount) * GetXDir();
  58. delta += Handles.SnapValue(yAxis.Delta, Handles.MoveSnapAmount) * GetYDir();
  59. delta += Handles.SnapValue(zAxis.Delta, Handles.MoveSnapAmount) * GetZDir();
  60. delta += Handles.SnapValue(xyPlane.Delta.x, Handles.MoveSnapAmount) * GetXDir();
  61. delta += Handles.SnapValue(xyPlane.Delta.y, Handles.MoveSnapAmount) * GetYDir();
  62. delta += Handles.SnapValue(yzPlane.Delta.x, Handles.MoveSnapAmount) * GetYDir();
  63. delta += Handles.SnapValue(yzPlane.Delta.y, Handles.MoveSnapAmount) * GetZDir();
  64. delta += Handles.SnapValue(zxPlane.Delta.x, Handles.MoveSnapAmount) * GetZDir();
  65. delta += Handles.SnapValue(zxPlane.Delta.y, Handles.MoveSnapAmount) * GetXDir();
  66. }
  67. else
  68. {
  69. delta += xAxis.Delta * GetXDir();
  70. delta += yAxis.Delta * GetYDir();
  71. delta += zAxis.Delta * GetZDir();
  72. delta += xyPlane.Delta.x * GetXDir();
  73. delta += xyPlane.Delta.y * GetYDir();
  74. delta += yzPlane.Delta.x * GetYDir();
  75. delta += yzPlane.Delta.y * GetZDir();
  76. delta += zxPlane.Delta.x * GetZDir();
  77. delta += zxPlane.Delta.y * GetXDir();
  78. }
  79. }
  80. protected override void Draw()
  81. {
  82. HandleDrawing.SetTransform(Matrix4.TRS(Position, Rotation, Vector3.one));
  83. float handleSize = Handles.GetHandleSize(EditorApplication.SceneViewCamera, position);
  84. // Draw 1D arrows
  85. if (xAxis.State == HandleSlider.StateType.Active)
  86. HandleDrawing.SetColor(Color.White);
  87. else if(xAxis.State == HandleSlider.StateType.Hover)
  88. HandleDrawing.SetColor(Color.BansheeOrange);
  89. else
  90. HandleDrawing.SetColor(Color.Red);
  91. Vector3 xConeStart = Vector3.xAxis*(1.0f - CONE_HEIGHT);
  92. HandleDrawing.DrawLine(Vector3.zero, xConeStart, handleSize);
  93. HandleDrawing.DrawCone(xConeStart, Vector3.xAxis, CONE_HEIGHT, CONE_RADIUS, handleSize);
  94. if (yAxis.State == HandleSlider.StateType.Active)
  95. HandleDrawing.SetColor(Color.White);
  96. else if (yAxis.State == HandleSlider.StateType.Hover)
  97. HandleDrawing.SetColor(Color.BansheeOrange);
  98. else
  99. HandleDrawing.SetColor(Color.Green);
  100. Vector3 yConeStart = Vector3.yAxis * (1.0f - CONE_HEIGHT);
  101. HandleDrawing.DrawLine(Vector3.zero, yConeStart, handleSize);
  102. HandleDrawing.DrawCone(yConeStart, Vector3.yAxis, CONE_HEIGHT, CONE_RADIUS, handleSize);
  103. if (zAxis.State == HandleSlider.StateType.Active)
  104. HandleDrawing.SetColor(Color.White);
  105. else if (zAxis.State == HandleSlider.StateType.Hover)
  106. HandleDrawing.SetColor(Color.BansheeOrange);
  107. else
  108. HandleDrawing.SetColor(Color.Blue);
  109. Vector3 zConeStart = Vector3.zAxis * (1.0f - CONE_HEIGHT);
  110. HandleDrawing.DrawLine(Vector3.zero, zConeStart, handleSize);
  111. HandleDrawing.DrawCone(zConeStart, Vector3.zAxis, CONE_HEIGHT, CONE_RADIUS, handleSize);
  112. // Draw 2D planes
  113. Color planeNormal = new Color(1.0f, 1.0f, 1.0f, 0.2f);
  114. Color planeHover = new Color(1.0f, 1.0f, 1.0f, 0.4f);
  115. Color planeActive = new Color(1.0f, 1.0f, 1.0f, 0.6f);
  116. Vector3 planeXOffset = Vector3.xAxis * 0.3f;
  117. Vector3 planeYOffset = Vector3.yAxis * 0.3f;
  118. Vector3 planeZOffset = Vector3.zAxis * 0.3f;
  119. //// XY plane
  120. HandleDrawing.SetColor(Color.Blue);
  121. HandleDrawing.DrawLine(planeXOffset, planeXOffset + planeYOffset, handleSize);
  122. HandleDrawing.DrawLine(planeYOffset, planeYOffset + planeXOffset, handleSize);
  123. if (xyPlane.State == HandleSlider.StateType.Active)
  124. HandleDrawing.SetColor(Color.Blue * planeActive);
  125. else if (xyPlane.State == HandleSlider.StateType.Hover)
  126. HandleDrawing.SetColor(Color.Blue * planeHover);
  127. else
  128. HandleDrawing.SetColor(Color.Blue * planeNormal);
  129. Rect3 xyPlaneArea = new Rect3(
  130. (planeXOffset + planeYOffset) * 0.5f,
  131. new Vector3[] { Vector3.xAxis, Vector3.yAxis},
  132. new float[] { 0.15f, 0.15f});
  133. HandleDrawing.DrawRect(xyPlaneArea, handleSize);
  134. //// YZ plane
  135. HandleDrawing.SetColor(Color.Red);
  136. HandleDrawing.DrawLine(planeYOffset, planeYOffset + planeZOffset, handleSize);
  137. HandleDrawing.DrawLine(planeZOffset, planeZOffset + planeYOffset, handleSize);
  138. if (yzPlane.State == HandleSlider.StateType.Active)
  139. HandleDrawing.SetColor(Color.Red * planeActive);
  140. else if (yzPlane.State == HandleSlider.StateType.Hover)
  141. HandleDrawing.SetColor(Color.Red * planeHover);
  142. else
  143. HandleDrawing.SetColor(Color.Red * planeNormal);
  144. Rect3 yzPlaneArea = new Rect3(
  145. (planeYOffset + planeZOffset) * 0.5f,
  146. new Vector3[] { Vector3.yAxis, Vector3.zAxis },
  147. new float[] { 0.15f, 0.15f });
  148. HandleDrawing.DrawRect(yzPlaneArea, handleSize);
  149. //// ZX plane
  150. HandleDrawing.SetColor(Color.Green);
  151. HandleDrawing.DrawLine(planeZOffset, planeZOffset + planeXOffset, handleSize);
  152. HandleDrawing.DrawLine(planeXOffset, planeXOffset + planeZOffset, handleSize);
  153. if (zxPlane.State == HandleSlider.StateType.Active)
  154. HandleDrawing.SetColor(Color.Green * planeActive);
  155. else if (zxPlane.State == HandleSlider.StateType.Hover)
  156. HandleDrawing.SetColor(Color.Green * planeHover);
  157. else
  158. HandleDrawing.SetColor(Color.Green * planeNormal);
  159. Rect3 zxPlaneArea = new Rect3(
  160. (planeZOffset + planeXOffset) * 0.5f,
  161. new Vector3[] { Vector3.zAxis, Vector3.xAxis },
  162. new float[] { 0.15f, 0.15f });
  163. HandleDrawing.DrawRect(zxPlaneArea, handleSize);
  164. }
  165. private Vector3 GetXDir()
  166. {
  167. return rotation.Rotate(Vector3.xAxis);
  168. }
  169. private Vector3 GetYDir()
  170. {
  171. return rotation.Rotate(Vector3.yAxis);
  172. }
  173. private Vector3 GetZDir()
  174. {
  175. return rotation.Rotate(Vector3.zAxis);
  176. }
  177. }
  178. }