MoveHandle.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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. Color axisHover = new Color(0.8f, 0.8f, 0.8f, 1.0f);
  86. if (xAxis.State == HandleSlider.StateType.Active)
  87. HandleDrawing.SetColor(Color.white);
  88. else if(xAxis.State == HandleSlider.StateType.Hover)
  89. HandleDrawing.SetColor(Color.red * axisHover);
  90. else
  91. HandleDrawing.SetColor(Color.red);
  92. Vector3 xConeStart = Vector3.xAxis*(1.0f - CONE_HEIGHT);
  93. HandleDrawing.DrawLine(Vector3.zero, xConeStart, handleSize);
  94. HandleDrawing.DrawCone(xConeStart, Vector3.xAxis, CONE_HEIGHT, CONE_RADIUS, handleSize);
  95. if (yAxis.State == HandleSlider.StateType.Active)
  96. HandleDrawing.SetColor(Color.white);
  97. else if (yAxis.State == HandleSlider.StateType.Hover)
  98. HandleDrawing.SetColor(Color.green * axisHover);
  99. else
  100. HandleDrawing.SetColor(Color.green);
  101. Vector3 yConeStart = Vector3.yAxis * (1.0f - CONE_HEIGHT);
  102. HandleDrawing.DrawLine(Vector3.zero, yConeStart, handleSize);
  103. HandleDrawing.DrawCone(yConeStart, Vector3.yAxis, CONE_HEIGHT, CONE_RADIUS, handleSize);
  104. if (zAxis.State == HandleSlider.StateType.Active)
  105. HandleDrawing.SetColor(Color.white);
  106. else if (zAxis.State == HandleSlider.StateType.Hover)
  107. HandleDrawing.SetColor(Color.blue * axisHover);
  108. else
  109. HandleDrawing.SetColor(Color.blue);
  110. Vector3 zConeStart = Vector3.zAxis * (1.0f - CONE_HEIGHT);
  111. HandleDrawing.DrawLine(Vector3.zero, zConeStart, handleSize);
  112. HandleDrawing.DrawCone(zConeStart, Vector3.zAxis, CONE_HEIGHT, CONE_RADIUS, handleSize);
  113. // Draw 2D planes
  114. Color planeNormal = new Color(1.0f, 1.0f, 1.0f, 0.2f);
  115. Color planeHover = new Color(1.0f, 1.0f, 1.0f, 0.4f);
  116. Color planeActive = new Color(1.0f, 1.0f, 1.0f, 0.6f);
  117. Vector3 planeXOffset = Vector3.xAxis * 0.3f;
  118. Vector3 planeYOffset = Vector3.yAxis * 0.3f;
  119. Vector3 planeZOffset = Vector3.zAxis * 0.3f;
  120. //// XY plane
  121. HandleDrawing.SetColor(Color.blue);
  122. HandleDrawing.DrawLine(planeXOffset, planeXOffset + planeYOffset, handleSize);
  123. HandleDrawing.DrawLine(planeYOffset, planeYOffset + planeXOffset, handleSize);
  124. if (xyPlane.State == HandleSlider.StateType.Active)
  125. HandleDrawing.SetColor(Color.blue * planeActive);
  126. else if (xyPlane.State == HandleSlider.StateType.Hover)
  127. HandleDrawing.SetColor(Color.blue * planeHover);
  128. else
  129. HandleDrawing.SetColor(Color.blue * planeNormal);
  130. Rect3 xyPlaneArea = new Rect3(
  131. (planeXOffset + planeYOffset) * 0.5f,
  132. new Vector3[] { Vector3.xAxis, Vector3.yAxis},
  133. new float[] { 0.15f, 0.15f});
  134. HandleDrawing.DrawRect(xyPlaneArea, handleSize);
  135. //// YZ plane
  136. HandleDrawing.SetColor(Color.red);
  137. HandleDrawing.DrawLine(planeYOffset, planeYOffset + planeZOffset, handleSize);
  138. HandleDrawing.DrawLine(planeZOffset, planeZOffset + planeYOffset, handleSize);
  139. if (yzPlane.State == HandleSlider.StateType.Active)
  140. HandleDrawing.SetColor(Color.red * planeActive);
  141. else if (yzPlane.State == HandleSlider.StateType.Hover)
  142. HandleDrawing.SetColor(Color.red * planeHover);
  143. else
  144. HandleDrawing.SetColor(Color.red * planeNormal);
  145. Rect3 yzPlaneArea = new Rect3(
  146. (planeYOffset + planeZOffset) * 0.5f,
  147. new Vector3[] { Vector3.yAxis, Vector3.zAxis },
  148. new float[] { 0.15f, 0.15f });
  149. HandleDrawing.DrawRect(yzPlaneArea, handleSize);
  150. //// ZX plane
  151. HandleDrawing.SetColor(Color.green);
  152. HandleDrawing.DrawLine(planeZOffset, planeZOffset + planeXOffset, handleSize);
  153. HandleDrawing.DrawLine(planeXOffset, planeXOffset + planeZOffset, handleSize);
  154. if (zxPlane.State == HandleSlider.StateType.Active)
  155. HandleDrawing.SetColor(Color.green * planeActive);
  156. else if (zxPlane.State == HandleSlider.StateType.Hover)
  157. HandleDrawing.SetColor(Color.green * planeHover);
  158. else
  159. HandleDrawing.SetColor(Color.green * planeNormal);
  160. Rect3 zxPlaneArea = new Rect3(
  161. (planeZOffset + planeXOffset) * 0.5f,
  162. new Vector3[] { Vector3.zAxis, Vector3.xAxis },
  163. new float[] { 0.15f, 0.15f });
  164. HandleDrawing.DrawRect(zxPlaneArea, handleSize);
  165. }
  166. private Vector3 GetXDir()
  167. {
  168. return rotation.Rotate(Vector3.xAxis);
  169. }
  170. private Vector3 GetYDir()
  171. {
  172. return rotation.Rotate(Vector3.yAxis);
  173. }
  174. private Vector3 GetZDir()
  175. {
  176. return rotation.Rotate(Vector3.zAxis);
  177. }
  178. }
  179. }