#if (UNITY_EDITOR)
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
namespace ECE
{
public static class EasyColliderDraw
{
///
/// Draws a box
///
/// Transform of the box
/// Center of the box in local space
/// Half the size of the box
/// Color of lines used to draw the box
private static void DrawBox(Transform transform, Vector3 center, Vector3 halfSize, Color color)
{
Vector3 p1 = transform.TransformPoint(center + halfSize);
Vector3 p2 = transform.TransformPoint(center - halfSize);
Vector3 p3 = transform.TransformPoint(center + new Vector3(halfSize.x, halfSize.y, -halfSize.z));
Vector3 p4 = transform.TransformPoint(center + new Vector3(halfSize.x, -halfSize.y, halfSize.z));
Vector3 p5 = transform.TransformPoint(center + new Vector3(halfSize.x, -halfSize.y, -halfSize.z));
Vector3 p6 = transform.TransformPoint(center + new Vector3(-halfSize.x, halfSize.y, halfSize.z));
Vector3 p7 = transform.TransformPoint(center + new Vector3(-halfSize.x, -halfSize.y, halfSize.z));
Vector3 p8 = transform.TransformPoint(center + new Vector3(-halfSize.x, halfSize.y, -halfSize.z));
Handles.color = color;
Handles.DrawLine(p1, p3);
Handles.DrawLine(p1, p4);
Handles.DrawLine(p1, p6);
Handles.DrawLine(p8, p3);
Handles.DrawLine(p8, p6);
Handles.DrawLine(p8, p2);
Handles.DrawLine(p7, p6);
Handles.DrawLine(p7, p2);
Handles.DrawLine(p7, p4);
Handles.DrawLine(p5, p4);
Handles.DrawLine(p5, p2);
Handles.DrawLine(p5, p3);
}
///
/// Draws a box collider
///
/// Box collider to draw
/// Color of lines used to draw
private static void DrawBoxCollider(BoxCollider boxCollider, Color color)
{
DrawBox(boxCollider.transform, boxCollider.center, boxCollider.size / 2, color);
}
private static EasyColliderPreviewer previewer;
public static EasyColliderPreviewer Previewer
{
get
{
if (previewer == null)
{
previewer = ScriptableObject.CreateInstance();
}
return previewer;
}
}
///
/// Draws a capsule collider
///
/// Capsule collider to draw
/// Color of lines to draw
private static void DrawCapsuleCollider(CapsuleCollider capsuleCollider, Color color)
{
CapsuleColliderData data = new CapsuleColliderData();
data.ColliderType = CREATE_COLLIDER_TYPE.CAPSULE;
data.Height = capsuleCollider.height;
data.Radius = capsuleCollider.radius;
data.Center = capsuleCollider.center;
data.Direction = capsuleCollider.direction;
data.Matrix = capsuleCollider.transform.localToWorldMatrix;
Previewer.DrawCapsuleCollider(data, color);
return;
}
///
/// Draws a primitive collider (box, sphere, capsule) using lines.
///
/// Collider to draw
/// Color of lines to draw with
public static void DrawCollider(Collider collider, Color color)
{
if (collider == null) return;
if (collider is BoxCollider)
{
DrawBoxCollider(collider as BoxCollider, color);
}
else if (collider is SphereCollider)
{
DrawSphereCollider(collider as SphereCollider, color);
}
else if (collider is CapsuleCollider)
{
DrawCapsuleCollider(collider as CapsuleCollider, color);
}
else if (collider is MeshCollider)
{
DrawMeshCollider(collider as MeshCollider, color);
}
}
///
/// Shader used to draw mesh colliders.
///
static Shader MeshColliderShader;
///
/// Draws a mesh collider by drawing lines connecting it's meshs vertices.
///
/// Mesh Collider
/// Color to draw lines with
private static void DrawMeshCollider(MeshCollider collider, Color color)
{
// try to find mesh collider.
if (MeshColliderShader == null)
{
MeshColliderShader = Shader.Find("Custom/EasyColliderMeshColliderPreview");
}
// if we have the shader, draw it using the wireframe and the color
if (MeshColliderShader != null)
{
Material wireMat = new Material(MeshColliderShader);
wireMat.SetColor("_Color", color);
wireMat.SetPass(0);
GL.wireframe = true;
Graphics.DrawMeshNow(collider.sharedMesh, collider.transform.localToWorldMatrix);
GL.wireframe = false;
}
else
{
// no shader? fall back to old draw box method.
DrawBox(collider.transform, collider.transform.InverseTransformPoint(collider.bounds.center), collider.transform.InverseTransformVector(collider.bounds.extents), color);
}
}
// Draws a sphere collider, taken from previous version
///
/// Draws a sphere collider.
///
/// Sphere collider to draw
/// Color of lines used to draw
private static void DrawSphereCollider(SphereCollider sphereCollider, Color color)
{
SphereColliderData data = new SphereColliderData();
data.ColliderType = CREATE_COLLIDER_TYPE.SPHERE;
data.Center = sphereCollider.center;
data.Radius = sphereCollider.radius;
data.Matrix = sphereCollider.transform.localToWorldMatrix;
Previewer.DrawSphereCollider(data, color);
}
}
}
#endif