ColliderGizmos.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using BansheeEngine;
  4. namespace BansheeEditor
  5. {
  6. /// <summary>
  7. /// Handles drawing of gizmos for all the types of <see cref="Collider"/> component.
  8. /// </summary>
  9. internal class ColliderGizmos
  10. {
  11. /// <summary>
  12. /// Method called by the runtime when gizmos are meant to be drawn.
  13. /// </summary>
  14. /// <param name="collider">Collider to draw gizmos for.</param>
  15. [DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
  16. private static void DrawBoxCollider(BoxCollider collider)
  17. {
  18. SceneObject so = collider.SceneObject;
  19. Gizmos.Color = Color.Green;
  20. Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One);
  21. Vector3 scaledExtents = collider.Extents*so.Scale;
  22. Gizmos.DrawWireCube(collider.Center, scaledExtents);
  23. }
  24. /// <summary>
  25. /// Method called by the runtime when gizmos are meant to be drawn.
  26. /// </summary>
  27. /// <param name="collider">Collider to draw gizmos for.</param>
  28. [DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
  29. private static void DrawSphereCollider(SphereCollider collider)
  30. {
  31. SceneObject so = collider.SceneObject;
  32. Gizmos.Color = Color.Green;
  33. Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One);
  34. Vector3 scale = so.Scale;
  35. float scaledRadius = collider.Radius * MathEx.Max(scale.x, scale.y, scale.z);
  36. Gizmos.DrawWireSphere(collider.Center, scaledRadius);
  37. }
  38. /// <summary>
  39. /// Method called by the runtime when gizmos are meant to be drawn.
  40. /// </summary>
  41. /// <param name="collider">Collider to draw gizmos for.</param>
  42. [DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
  43. private static void DrawCapsuleCollider(CapsuleCollider collider)
  44. {
  45. SceneObject so = collider.SceneObject;
  46. Vector3 offset = collider.Center;
  47. Quaternion rotation = Quaternion.FromToRotation(Vector3.YAxis, collider.Normal);
  48. // Rotate around origin
  49. Matrix4 rotMatrix = Matrix4.TRS(offset, Quaternion.Identity, Vector3.One) *
  50. Matrix4.TRS(Vector3.Zero, rotation, Vector3.One) *
  51. Matrix4.TRS(-offset, Quaternion.Identity, Vector3.One);
  52. Gizmos.Color = Color.Green;
  53. Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One) * rotMatrix;
  54. Vector3 scale = so.Scale;
  55. float scaledHeight = collider.HalfHeight*2.0f*scale.y;
  56. float scaledRadius = collider.Radius*MathEx.Max(scale.x, scale.z);
  57. Gizmos.DrawWireCapsule(offset, scaledHeight, scaledRadius);
  58. }
  59. /// <summary>
  60. /// Method called by the runtime when gizmos are meant to be drawn.
  61. /// </summary>
  62. /// <param name="collider">Collider to draw gizmos for.</param>
  63. [DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
  64. private static void DrawMeshCollider(MeshCollider collider)
  65. {
  66. PhysicsMesh mesh = collider.Mesh;
  67. if (mesh == null)
  68. return;
  69. SceneObject so = collider.SceneObject;
  70. Gizmos.Color = Color.Green;
  71. Gizmos.Transform = so.WorldTransform;
  72. MeshData meshData = mesh.MeshData;
  73. Gizmos.DrawWireMesh(meshData);
  74. }
  75. /// <summary>
  76. /// Method called by the runtime when gizmos are meant to be drawn.
  77. /// </summary>
  78. /// <param name="collider">Collider to draw gizmos for.</param>
  79. [DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
  80. private static void DrawPlaneCollider(PlaneCollider collider)
  81. {
  82. SceneObject so = collider.SceneObject;
  83. Vector3 normal = collider.Normal;
  84. Vector3 center = normal * collider.Distance;
  85. // Rotate around origin
  86. Quaternion rotation = Quaternion.FromToRotation(Vector3.XAxis, normal);
  87. Matrix4 rotMatrix = Matrix4.TRS(center, Quaternion.Identity, Vector3.One) *
  88. Matrix4.TRS(Vector3.Zero, rotation, Vector3.One) *
  89. Matrix4.TRS(-center, Quaternion.Identity, Vector3.One);
  90. Gizmos.Color = Color.Green;
  91. Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One) * rotMatrix;
  92. Vector3 bottomLeft = new Vector3(0.0f, -0.5f, -0.5f);
  93. Vector3 topLeft = new Vector3(0.0f, 0.5f, -0.5f);
  94. Vector3 topRight = new Vector3(0.0f, 0.5f, 0.5f);
  95. Vector3 bottomRight = new Vector3(0.0f, -0.5f, 0.5f);
  96. bottomLeft += center;
  97. topLeft += center;
  98. topRight += center;
  99. bottomRight += center;
  100. // Draw sides
  101. Gizmos.DrawLine(bottomLeft, topLeft);
  102. Gizmos.DrawLine(topLeft, topRight);
  103. Gizmos.DrawLine(topRight, bottomRight);
  104. Gizmos.DrawLine(bottomRight, bottomLeft);
  105. // Draw normal
  106. Gizmos.DrawLine(center, center + Vector3.XAxis*0.5f);
  107. }
  108. }
  109. }