using System; using UnityEngine; namespace ProceduralToolkit { /// /// Collection of drawing methods similar to Debug.DrawLine /// public static class DebugE { #region DrawLine /// /// Draws a line between specified from and to points /// public static void DrawLine(Vector3 from, Vector3 to) { Debug.DrawLine(from, to, Color.white); } /// /// Draws a line between specified from and to points /// public static void DrawLine(Vector3 from, Vector3 to, Color color, float duration = 0, bool depthTest = true) { Debug.DrawLine(from, to, color, duration, depthTest); } #endregion DrawLine #region DrawRay /// /// Draws a ray starting at ray.origin to ray.origin + ray.direction /// public static void DrawRay(Ray ray) { DrawLine(ray.origin, ray.origin + ray.direction, Color.white); } /// /// Draws a ray starting at ray.origin to ray.origin + ray.direction /// public static void DrawRay(Ray ray, Color color, float duration = 0, bool depthTest = true) { DrawLine(ray.origin, ray.origin + ray.direction, color, duration, depthTest); } #endregion DrawRay #region DrawSegment2 /// /// Draws a segment /// public static void DrawSegment2(Segment2 segment) { DrawLine((Vector3) segment.a, (Vector3) segment.b, Color.white); } /// /// Draws a segment /// public static void DrawSegment2(Segment2 segment, Color color, float duration = 0, bool depthTest = true) { DrawLine((Vector3) segment.a, (Vector3) segment.b, color, duration, depthTest); } #endregion DrawSegment2 #region DrawSegment3 /// /// Draws a segment /// public static void DrawSegment3(Segment3 segment) { DrawLine(segment.a, segment.b, Color.white); } /// /// Draws a segment /// public static void DrawSegment3(Segment3 segment, Color color, float duration = 0, bool depthTest = true) { DrawLine(segment.a, segment.b, color, duration, depthTest); } #endregion DrawSegment3 #region DrawWireQuad /// /// Draws a wireframe quad with position, rotation and scale /// public static void DrawWireQuadXY(Vector3 position, Quaternion rotation, Vector2 scale) { DrawWireQuad(position, rotation, scale, Vector3.right, Vector3.up, Color.white); } /// /// Draws a wireframe quad with position, rotation and scale /// public static void DrawWireQuadXY(Vector3 position, Quaternion rotation, Vector2 scale, Color color, float duration = 0, bool depthTest = true) { DrawWireQuad(position, rotation, scale, Vector3.right, Vector3.up, color, duration, depthTest); } /// /// Draws a wireframe quad with position, rotation and scale /// public static void DrawWireQuadXZ(Vector3 position, Quaternion rotation, Vector2 scale) { DrawWireQuad(position, rotation, scale, Vector3.right, Vector3.forward, Color.white); } /// /// Draws a wireframe quad with position, rotation and scale /// public static void DrawWireQuadXZ(Vector3 position, Quaternion rotation, Vector2 scale, Color color, float duration = 0, bool depthTest = true) { DrawWireQuad(position, rotation, scale, Vector3.right, Vector3.forward, color, duration, depthTest); } /// /// Draws a wireframe quad with position, rotation and scale /// public static void DrawWireQuadYZ(Vector3 position, Quaternion rotation, Vector2 scale) { DrawWireQuad(position, rotation, scale, Vector3.up, Vector3.forward, Color.white); } /// /// Draws a wireframe quad with position, rotation and scale /// public static void DrawWireQuadYZ(Vector3 position, Quaternion rotation, Vector2 scale, Color color, float duration = 0, bool depthTest = true) { DrawWireQuad(position, rotation, scale, Vector3.up, Vector3.forward, color, duration, depthTest); } /// /// Draws a wireframe quad with position, rotation and scale /// public static void DrawWireQuad(Vector3 position, Quaternion rotation, Vector2 scale, Vector3 planeRight, Vector3 planeForward) { Vector3 right = rotation*planeRight*scale.x; Vector3 forward = rotation*planeForward*scale.y; Vector3 forwardRight = position + right*0.5f + forward*0.5f; Vector3 backRight = forwardRight - forward; Vector3 backLeft = backRight - right; Vector3 forwardLeft = forwardRight - right; DrawLine(forwardRight, backRight, Color.white); DrawLine(backRight, backLeft, Color.white); DrawLine(backLeft, forwardLeft, Color.white); DrawLine(forwardLeft, forwardRight, Color.white); } /// /// Draws a wireframe quad with position, rotation and scale /// public static void DrawWireQuad(Vector3 position, Quaternion rotation, Vector2 scale, Vector3 planeRight, Vector3 planeForward, Color color, float duration = 0, bool depthTest = true) { Vector3 right = rotation*planeRight*scale.x; Vector3 forward = rotation*planeForward*scale.y; Vector3 forwardRight = position + right*0.5f + forward*0.5f; Vector3 backRight = forwardRight - forward; Vector3 backLeft = backRight - right; Vector3 forwardLeft = forwardRight - right; DrawLine(forwardRight, backRight, color, duration, depthTest); DrawLine(backRight, backLeft, color, duration, depthTest); DrawLine(backLeft, forwardLeft, color, duration, depthTest); DrawLine(forwardLeft, forwardRight, color, duration, depthTest); } #endregion DrawWireQuad #region DrawWireCube /// /// Draws a wireframe cube with position, rotation and scale /// public static void DrawWireCube(Vector3 position, Quaternion rotation, Vector3 scale) { Vector3 right = rotation*Vector3.right*scale.x; Vector3 up = rotation*Vector3.up*scale.y; Vector3 forward = rotation*Vector3.forward*scale.z; Vector3 a1 = position + right*0.5f + up*0.5f + forward*0.5f; Vector3 b1 = a1 - up; Vector3 c1 = b1 - right; Vector3 d1 = a1 - right; Vector3 a2 = a1 - forward; Vector3 b2 = b1 - forward; Vector3 c2 = c1 - forward; Vector3 d2 = d1 - forward; DrawLine(a1, b1, Color.white); DrawLine(b1, c1, Color.white); DrawLine(c1, d1, Color.white); DrawLine(d1, a1, Color.white); DrawLine(a2, b2, Color.white); DrawLine(b2, c2, Color.white); DrawLine(c2, d2, Color.white); DrawLine(d2, a2, Color.white); DrawLine(a1, a2, Color.white); DrawLine(b1, b2, Color.white); DrawLine(c1, c2, Color.white); DrawLine(d1, d2, Color.white); } /// /// Draws a wireframe cube with position, rotation and scale /// public static void DrawWireCube(Vector3 position, Quaternion rotation, Vector3 scale, Color color, float duration = 0, bool depthTest = true) { Vector3 right = rotation*Vector3.right*scale.x; Vector3 up = rotation*Vector3.up*scale.y; Vector3 forward = rotation*Vector3.forward*scale.z; Vector3 a1 = position + right*0.5f + up*0.5f + forward*0.5f; Vector3 b1 = a1 - up; Vector3 c1 = b1 - right; Vector3 d1 = a1 - right; Vector3 a2 = a1 - forward; Vector3 b2 = b1 - forward; Vector3 c2 = c1 - forward; Vector3 d2 = d1 - forward; DrawLine(a1, b1, color, duration, depthTest); DrawLine(b1, c1, color, duration, depthTest); DrawLine(c1, d1, color, duration, depthTest); DrawLine(d1, a1, color, duration, depthTest); DrawLine(a2, b2, color, duration, depthTest); DrawLine(b2, c2, color, duration, depthTest); DrawLine(c2, d2, color, duration, depthTest); DrawLine(d2, a2, color, duration, depthTest); DrawLine(a1, a2, color, duration, depthTest); DrawLine(b1, b2, color, duration, depthTest); DrawLine(c1, c2, color, duration, depthTest); DrawLine(d1, d2, color, duration, depthTest); } #endregion DrawWireCube #region DrawWireCircle /// /// Draws a wireframe circle with position and radius /// public static void DrawWireCircleXY(Vector3 position, float radius) { DrawWireCircle(Draw.pointOnCircleXY, position, radius, Color.white); } /// /// Draws a wireframe circle with position and radius /// public static void DrawWireCircleXY(Vector3 position, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireCircle(Draw.pointOnCircleXY, position, radius, color, duration, depthTest); } /// /// Draws a wireframe circle with position, rotation and radius /// public static void DrawWireCircleXY(Vector3 position, Quaternion rotation, float radius) { DrawWireCircle(Draw.pointOnCircleXY, position, rotation, radius, Color.white); } /// /// Draws a wireframe circle with position, rotation and radius /// public static void DrawWireCircleXY(Vector3 position, Quaternion rotation, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireCircle(Draw.pointOnCircleXY, position, rotation, radius, color, duration, depthTest); } /// /// Draws a wireframe circle with position and radius /// public static void DrawWireCircleXZ(Vector3 position, float radius) { DrawWireCircle(Draw.pointOnCircleXZ, position, radius, Color.white); } /// /// Draws a wireframe circle with position and radius /// public static void DrawWireCircleXZ(Vector3 position, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireCircle(Draw.pointOnCircleXZ, position, radius, color, duration, depthTest); } /// /// Draws a wireframe circle with position, rotation and radius /// public static void DrawWireCircleXZ(Vector3 position, Quaternion rotation, float radius) { DrawWireCircle(Draw.pointOnCircleXZ, position, rotation, radius, Color.white); } /// /// Draws a wireframe circle with position, rotation and radius /// public static void DrawWireCircleXZ(Vector3 position, Quaternion rotation, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireCircle(Draw.pointOnCircleXZ, position, rotation, radius, color, duration, depthTest); } /// /// Draws a wireframe circle with position and radius /// public static void DrawWireCircleYZ(Vector3 position, float radius) { DrawWireCircle(Draw.pointOnCircleYZ, position, radius, Color.white); } /// /// Draws a wireframe circle with position and radius /// public static void DrawWireCircleYZ(Vector3 position, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireCircle(Draw.pointOnCircleYZ, position, radius, color, duration, depthTest); } /// /// Draws a wireframe circle with position, rotation and radius /// public static void DrawWireCircleYZ(Vector3 position, Quaternion rotation, float radius) { DrawWireCircle(Draw.pointOnCircleYZ, position, rotation, radius, Color.white); } /// /// Draws a wireframe circle with position, rotation and radius /// public static void DrawWireCircleYZ(Vector3 position, Quaternion rotation, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireCircle(Draw.pointOnCircleYZ, position, rotation, radius, color, duration, depthTest); } #endregion DrawWireCircle #region DrawWireCircle Universal /// /// Draws a wireframe circle with position and radius /// public static void DrawWireCircle(Func pointOnCircle, Vector3 position, float radius) { DrawWireArc(pointOnCircle, position, radius, 0, Draw.circleSegments, Draw.circleSegmentAngle, Color.white); } /// /// Draws a wireframe circle with position and radius /// public static void DrawWireCircle(Func pointOnCircle, Vector3 position, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireArc(pointOnCircle, position, radius, 0, Draw.circleSegments, Draw.circleSegmentAngle, color, duration, depthTest); } /// /// Draws a wireframe circle with position, rotation and radius /// public static void DrawWireCircle(Func pointOnCircle, Vector3 position, Quaternion rotation, float radius) { DrawWireArc(pointOnCircle, position, rotation, radius, 0, Draw.circleSegments, Draw.circleSegmentAngle, Color.white); } /// /// Draws a wireframe circle with position, rotation and radius /// public static void DrawWireCircle(Func pointOnCircle, Vector3 position, Quaternion rotation, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireArc(pointOnCircle, position, rotation, radius, 0, Draw.circleSegments, Draw.circleSegmentAngle, color, duration, depthTest); } #endregion DrawWireCircle Universal #region DrawWireArc /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArcXY(Vector3 position, float radius, float fromAngle, float toAngle) { DrawWireArc(Draw.pointOnCircleXY, position, radius, fromAngle, toAngle, Color.white); } /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArcXY(Vector3 position, float radius, float fromAngle, float toAngle, Color color, float duration = 0, bool depthTest = true) { DrawWireArc(Draw.pointOnCircleXY, position, radius, fromAngle, toAngle, color, duration, depthTest); } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArcXY(Vector3 position, Quaternion rotation, float radius, float fromAngle, float toAngle) { DrawWireArc(Draw.pointOnCircleXY, position, rotation, radius, fromAngle, toAngle, Color.white); } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArcXY(Vector3 position, Quaternion rotation, float radius, float fromAngle, float toAngle, Color color, float duration = 0, bool depthTest = true) { DrawWireArc(Draw.pointOnCircleXY, position, rotation, radius, fromAngle, toAngle, color, duration, depthTest); } /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArcXZ(Vector3 position, float radius, float fromAngle, float toAngle) { DrawWireArc(Draw.pointOnCircleXZ, position, radius, fromAngle, toAngle, Color.white); } /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArcXZ(Vector3 position, float radius, float fromAngle, float toAngle, Color color, float duration = 0, bool depthTest = true) { DrawWireArc(Draw.pointOnCircleXZ, position, radius, fromAngle, toAngle, color, duration, depthTest); } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArcXZ(Vector3 position, Quaternion rotation, float radius, float fromAngle, float toAngle) { DrawWireArc(Draw.pointOnCircleXZ, position, rotation, radius, fromAngle, toAngle, Color.white); } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArcXZ(Vector3 position, Quaternion rotation, float radius, float fromAngle, float toAngle, Color color, float duration = 0, bool depthTest = true) { DrawWireArc(Draw.pointOnCircleXZ, position, rotation, radius, fromAngle, toAngle, color, duration, depthTest); } /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArcYZ(Vector3 position, float radius, float fromAngle, float toAngle) { DrawWireArc(Draw.pointOnCircleYZ, position, radius, fromAngle, toAngle, Color.white); } /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArcYZ(Vector3 position, float radius, float fromAngle, float toAngle, Color color, float duration = 0, bool depthTest = true) { DrawWireArc(Draw.pointOnCircleYZ, position, radius, fromAngle, toAngle, color, duration, depthTest); } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArcYZ(Vector3 position, Quaternion rotation, float radius, float fromAngle, float toAngle) { DrawWireArc(Draw.pointOnCircleYZ, position, rotation, radius, fromAngle, toAngle, Color.white); } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArcYZ(Vector3 position, Quaternion rotation, float radius, float fromAngle, float toAngle, Color color, float duration = 0, bool depthTest = true) { DrawWireArc(Draw.pointOnCircleYZ, position, rotation, radius, fromAngle, toAngle, color, duration, depthTest); } #endregion DrawWireArc #region DrawWireArc Universal /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArc(Func pointOnCircle, Vector3 position, float radius, float fromAngle, float toAngle) { Draw.GetSegmentsAndSegmentAngle(fromAngle, toAngle, out int segments, out float segmentAngle); DrawWireArc(pointOnCircle, position, radius, fromAngle, segments, segmentAngle, Color.white); } /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArc(Func pointOnCircle, Vector3 position, float radius, float fromAngle, float toAngle, Color color, float duration = 0, bool depthTest = true) { Draw.GetSegmentsAndSegmentAngle(fromAngle, toAngle, out int segments, out float segmentAngle); DrawWireArc(pointOnCircle, position, radius, fromAngle, segments, segmentAngle, color, duration, depthTest); } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArc(Func pointOnCircle, Vector3 position, Quaternion rotation, float radius, float fromAngle, float toAngle) { Draw.GetSegmentsAndSegmentAngle(fromAngle, toAngle, out int segments, out float segmentAngle); DrawWireArc(pointOnCircle, position, rotation, radius, fromAngle, segments, segmentAngle, Color.white); } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArc(Func pointOnCircle, Vector3 position, Quaternion rotation, float radius, float fromAngle, float toAngle, Color color, float duration = 0, bool depthTest = true) { Draw.GetSegmentsAndSegmentAngle(fromAngle, toAngle, out int segments, out float segmentAngle); DrawWireArc(pointOnCircle, position, rotation, radius, fromAngle, segments, segmentAngle, color, duration, depthTest); } /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArc(Func pointOnCircle, Vector3 position, float radius, float fromAngle, int segments, float segmentAngle) { float currentAngle = fromAngle; for (var i = 0; i < segments; i++) { Vector3 a = position + pointOnCircle(radius, currentAngle); currentAngle += segmentAngle; Vector3 b = position + pointOnCircle(radius, currentAngle); DrawLine(a, b, Color.white); } } /// /// Draws a wireframe circular arc with position and radius /// public static void DrawWireArc(Func pointOnCircle, Vector3 position, float radius, float fromAngle, int segments, float segmentAngle, Color color, float duration = 0, bool depthTest = true) { float currentAngle = fromAngle; for (var i = 0; i < segments; i++) { Vector3 a = position + pointOnCircle(radius, currentAngle); currentAngle += segmentAngle; Vector3 b = position + pointOnCircle(radius, currentAngle); DrawLine(a, b, color, duration, depthTest); } } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArc(Func pointOnCircle, Vector3 position, Quaternion rotation, float radius, float fromAngle, int segments, float segmentAngle) { float currentAngle = fromAngle; for (var i = 0; i < segments; i++) { Vector3 a = position + rotation*pointOnCircle(radius, currentAngle); currentAngle += segmentAngle; Vector3 b = position + rotation*pointOnCircle(radius, currentAngle); DrawLine(a, b, Color.white); } } /// /// Draws a wireframe circular arc with position, rotation and radius /// public static void DrawWireArc(Func pointOnCircle, Vector3 position, Quaternion rotation, float radius, float fromAngle, int segments, float segmentAngle, Color color, float duration = 0, bool depthTest = true) { float currentAngle = fromAngle; for (var i = 0; i < segments; i++) { Vector3 a = position + rotation*pointOnCircle(radius, currentAngle); currentAngle += segmentAngle; Vector3 b = position + rotation*pointOnCircle(radius, currentAngle); DrawLine(a, b, color, duration, depthTest); } } #endregion DrawWireArc Universal #region DrawWireSphere /// /// Draws a wireframe sphere with position, rotation and radius /// public static void DrawWireSphere(Vector3 position, Quaternion rotation, float radius) { DrawWireCircleXY(position, rotation, radius, Color.white); DrawWireCircleXZ(position, rotation, radius, Color.white); DrawWireCircleYZ(position, rotation, radius, Color.white); } /// /// Draws a wireframe sphere with position, rotation and radius /// public static void DrawWireSphere(Vector3 position, Quaternion rotation, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireCircleXY(position, rotation, radius, color, duration, depthTest); DrawWireCircleXZ(position, rotation, radius, color, duration, depthTest); DrawWireCircleYZ(position, rotation, radius, color, duration, depthTest); } #endregion DrawWireSphere #region DrawWireHemisphere /// /// Draws a wireframe hemisphere with position, rotation and radius /// public static void DrawWireHemisphere(Vector3 position, Quaternion rotation, float radius) { DrawWireArcXY(position, rotation, radius, -90, 90, Color.white); DrawWireCircleXZ(position, rotation, radius, Color.white); DrawWireArcYZ(position, rotation, radius, 0, 180, Color.white); } /// /// Draws a wireframe hemisphere with position, rotation and radius /// public static void DrawWireHemisphere(Vector3 position, Quaternion rotation, float radius, Color color, float duration = 0, bool depthTest = true) { DrawWireArcXY(position, rotation, radius, -90, 90, color, duration, depthTest); DrawWireCircleXZ(position, rotation, radius, color, duration, depthTest); DrawWireArcYZ(position, rotation, radius, 0, 180, color, duration, depthTest); } #endregion DrawWireHemisphere #region DrawWireCone /// /// Draws a wireframe cone with position and rotation /// public static void DrawWireCone(Vector3 position, Quaternion rotation, float apexRadius, float angle, float length) { Vector3 baseCenter = position + rotation*Vector3.up*length; float baseRadius = Mathf.Tan(angle*Mathf.Deg2Rad)*length + apexRadius; DrawWireCircleXZ(baseCenter, rotation, baseRadius, Color.white); Vector3 a2 = baseCenter + rotation*Geometry.PointOnCircle3XZ(baseRadius, 0); Vector3 b2 = baseCenter + rotation*Geometry.PointOnCircle3XZ(baseRadius, 90); Vector3 c2 = baseCenter + rotation*Geometry.PointOnCircle3XZ(baseRadius, 180); Vector3 d2 = baseCenter + rotation*Geometry.PointOnCircle3XZ(baseRadius, 270); if (apexRadius == 0) { DrawLine(position, a2, Color.white); DrawLine(position, b2, Color.white); DrawLine(position, c2, Color.white); DrawLine(position, d2, Color.white); } else { DrawWireCircleXZ(position, rotation, apexRadius, Color.white); Vector3 a1 = position + rotation*Geometry.PointOnCircle3XZ(apexRadius, 0); Vector3 b1 = position + rotation*Geometry.PointOnCircle3XZ(apexRadius, 90); Vector3 c1 = position + rotation*Geometry.PointOnCircle3XZ(apexRadius, 180); Vector3 d1 = position + rotation*Geometry.PointOnCircle3XZ(apexRadius, 270); DrawLine(a1, a2, Color.white); DrawLine(b1, b2, Color.white); DrawLine(c1, c2, Color.white); DrawLine(d1, d2, Color.white); } } /// /// Draws a wireframe cone with position and rotation /// public static void DrawWireCone(Vector3 position, Quaternion rotation, float apexRadius, float angle, float length, Color color, float duration = 0, bool depthTest = true) { Vector3 baseCenter = position + rotation*Vector3.up*length; float baseRadius = Mathf.Tan(angle*Mathf.Deg2Rad)*length + apexRadius; DrawWireCircleXZ(baseCenter, rotation, baseRadius, color, duration, depthTest); Vector3 a2 = baseCenter + rotation*Geometry.PointOnCircle3XZ(baseRadius, 0); Vector3 b2 = baseCenter + rotation*Geometry.PointOnCircle3XZ(baseRadius, 90); Vector3 c2 = baseCenter + rotation*Geometry.PointOnCircle3XZ(baseRadius, 180); Vector3 d2 = baseCenter + rotation*Geometry.PointOnCircle3XZ(baseRadius, 270); if (apexRadius == 0) { DrawLine(position, a2, color, duration, depthTest); DrawLine(position, b2, color, duration, depthTest); DrawLine(position, c2, color, duration, depthTest); DrawLine(position, d2, color, duration, depthTest); } else { DrawWireCircleXZ(position, rotation, apexRadius, color, duration, depthTest); Vector3 a1 = position + rotation*Geometry.PointOnCircle3XZ(apexRadius, 0); Vector3 b1 = position + rotation*Geometry.PointOnCircle3XZ(apexRadius, 90); Vector3 c1 = position + rotation*Geometry.PointOnCircle3XZ(apexRadius, 180); Vector3 d1 = position + rotation*Geometry.PointOnCircle3XZ(apexRadius, 270); DrawLine(a1, a2, color, duration, depthTest); DrawLine(b1, b2, color, duration, depthTest); DrawLine(c1, c2, color, duration, depthTest); DrawLine(d1, d2, color, duration, depthTest); } } #endregion DrawWireCone } }