//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
//**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************//
using bs;
namespace bs.Editor
{
/** @addtogroup Gizmos
* @{
*/
///
/// Handles drawing of gizmos for all the types of component.
///
internal class ColliderGizmos
{
///
/// Method called by the runtime when gizmos are meant to be drawn.
///
/// Collider to draw gizmos for.
[DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
private static void DrawBoxCollider(BoxCollider collider)
{
SceneObject so = collider.SceneObject;
Gizmos.Color = Color.Green;
Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One);
Vector3 scale = so.Scale;
Vector3 scaledExtents = collider.Extents*scale;
Gizmos.DrawWireCube(collider.Center * scale, scaledExtents);
}
///
/// Method called by the runtime when gizmos are meant to be drawn.
///
/// Collider to draw gizmos for.
[DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
private static void DrawSphereCollider(SphereCollider collider)
{
SceneObject so = collider.SceneObject;
Gizmos.Color = Color.Green;
Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One);
Vector3 scale = so.Scale;
float scaledRadius = collider.Radius * MathEx.Max(scale.x, scale.y, scale.z);
Gizmos.DrawWireSphere(collider.Center * scale, scaledRadius);
}
///
/// Method called by the runtime when gizmos are meant to be drawn.
///
/// Collider to draw gizmos for.
[DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
private static void DrawCapsuleCollider(CapsuleCollider collider)
{
SceneObject so = collider.SceneObject;
Vector3 offset = collider.Center;
Quaternion rotation = Quaternion.FromToRotation(Vector3.YAxis, collider.Normal);
// Rotate around origin
Matrix4 rotMatrix = Matrix4.TRS(offset, Quaternion.Identity, Vector3.One) *
Matrix4.TRS(Vector3.Zero, rotation, Vector3.One) *
Matrix4.TRS(-offset, Quaternion.Identity, Vector3.One);
Gizmos.Color = Color.Green;
Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One) * rotMatrix;
Vector3 scale = so.Scale;
float scaledHeight = collider.HalfHeight*2.0f*scale.y;
float scaledRadius = collider.Radius*MathEx.Max(scale.x, scale.z);
Gizmos.DrawWireCapsule(offset * scale, scaledHeight, scaledRadius);
}
///
/// Method called by the runtime when gizmos are meant to be drawn.
///
/// Collider to draw gizmos for.
[DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
private static void DrawMeshCollider(MeshCollider collider)
{
PhysicsMesh mesh = collider.Mesh.Value;
if (mesh == null)
return;
SceneObject so = collider.SceneObject;
Gizmos.Color = Color.Green;
Gizmos.Transform = so.WorldTransform;
MeshData meshData = mesh.MeshData;
Gizmos.DrawWireMesh(meshData);
}
///
/// Method called by the runtime when gizmos are meant to be drawn.
///
/// Collider to draw gizmos for.
[DrawGizmo(DrawGizmoFlags.Selected | DrawGizmoFlags.ParentSelected)]
private static void DrawPlaneCollider(PlaneCollider collider)
{
SceneObject so = collider.SceneObject;
Vector3 normal = collider.Normal;
Vector3 center = normal * collider.Distance;
// Rotate around origin
Quaternion rotation = Quaternion.FromToRotation(Vector3.XAxis, normal);
Matrix4 rotMatrix = Matrix4.TRS(center, Quaternion.Identity, Vector3.One) *
Matrix4.TRS(Vector3.Zero, rotation, Vector3.One) *
Matrix4.TRS(-center, Quaternion.Identity, Vector3.One);
Gizmos.Color = Color.Green;
Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One) * rotMatrix;
Vector3 bottomLeft = new Vector3(0.0f, -0.5f, -0.5f);
Vector3 topLeft = new Vector3(0.0f, 0.5f, -0.5f);
Vector3 topRight = new Vector3(0.0f, 0.5f, 0.5f);
Vector3 bottomRight = new Vector3(0.0f, -0.5f, 0.5f);
bottomLeft += center;
topLeft += center;
topRight += center;
bottomRight += center;
// Draw sides
Gizmos.DrawLine(bottomLeft, topLeft);
Gizmos.DrawLine(topLeft, topRight);
Gizmos.DrawLine(topRight, bottomRight);
Gizmos.DrawLine(bottomRight, bottomLeft);
// Draw normal
Vector3 scale = so.Scale;
Gizmos.DrawLine(center * scale, (center + Vector3.XAxis*0.5f) * scale);
}
}
/** @} */
}