/* * Create a disc handle for val using the specified parameters * */ private static void DiscHandle(ref float val, Vector3 origin, Quaternion orientation, string label, Color col, bool isFilled) { // compute handle locations based on disc orientation Vector3 right = orientation * Vector3.right; Vector3 up = orientation * Vector3.up; Vector3 forward = orientation * Vector3.forward; // set handle color Color oldColor = Handles.color; CustomHandleUtilities.SetHandleColor(col); // ensure it will still render even if alpha is 0 // create handles LinearHandles.ValueSlider(ref val, origin, forward, label, Handles.color); LinearHandles.ValueSlider(ref val, origin, right, Handles.color); LinearHandles.ValueSlider(ref val, origin, -forward, Handles.color); LinearHandles.ValueSlider(ref val, origin, -right, Handles.color); // draw disc CustomHandleUtilities.SetHandleColor(col, col.a * 0.5f); // ensure it will still render even if alpha is 0 Handles.DrawWireDisc(origin, up, val); // optionally fill the disc if (isFilled) { CustomHandleUtilities.SetHandleColor(col, col.a * 0.1f); Handles.DrawSolidDisc(origin, up, val); } // reset handle color CustomHandleUtilities.SetHandleColor(oldColor); }
// manually specify label and color public static void WireBox(ref Vector3 size, Vector3 center, Quaternion orientation, string label, Color col) { // set handle color Color oldColor = Handles.color; CustomHandleUtilities.SetHandleColor(col); // TODO: do something with label? // create linear handles to adjust size LinearHandles.ValueSlider(ref size.x, center - orientation * Vector3.right * size.x * 0.5f, orientation * Vector3.right); LinearHandles.ValueSlider(ref size.x, center + orientation * Vector3.right * size.x * 0.5f, orientation * Vector3.left); LinearHandles.ValueSlider(ref size.y, center - orientation * Vector3.up * size.y * 0.5f, orientation * Vector3.up); LinearHandles.ValueSlider(ref size.y, center + orientation * Vector3.up * size.y * 0.5f, orientation * Vector3.down); LinearHandles.ValueSlider(ref size.z, center - orientation * Vector3.forward * size.z * 0.5f, orientation * Vector3.forward); LinearHandles.ValueSlider(ref size.z, center + orientation * Vector3.forward * size.z * 0.5f, orientation * Vector3.back); // draw the shape Vector3[] corners = new Vector3[8]; corners[0] = center + orientation * (new Vector3(size.x * 0.5f, size.y * 0.5f, size.z * 0.5f)); corners[1] = center + orientation * (new Vector3(size.x * 0.5f, -size.y * 0.5f, size.z * 0.5f)); corners[2] = center + orientation * (new Vector3(size.x * 0.5f, size.y * 0.5f, -size.z * 0.5f)); corners[3] = center + orientation * (new Vector3(size.x * 0.5f, -size.y * 0.5f, -size.z * 0.5f)); corners[4] = center + orientation * (new Vector3(-size.x * 0.5f, -size.y * 0.5f, -size.z * 0.5f)); corners[5] = center + orientation * (new Vector3(-size.x * 0.5f, size.y * 0.5f, size.z * 0.5f)); corners[6] = center + orientation * (new Vector3(-size.x * 0.5f, -size.y * 0.5f, size.z * 0.5f)); corners[7] = center + orientation * (new Vector3(-size.x * 0.5f, size.y * 0.5f, -size.z * 0.5f)); Handles.DrawLine(corners[0], corners[1]); Handles.DrawLine(corners[0], corners[2]); Handles.DrawLine(corners[0], corners[5]); Handles.DrawLine(corners[1], corners[3]); Handles.DrawLine(corners[1], corners[6]); Handles.DrawLine(corners[2], corners[3]); Handles.DrawLine(corners[2], corners[7]); Handles.DrawLine(corners[3], corners[4]); Handles.DrawLine(corners[4], corners[6]); Handles.DrawLine(corners[4], corners[7]); Handles.DrawLine(corners[5], corners[6]); Handles.DrawLine(corners[5], corners[7]); // reset handle color CustomHandleUtilities.SetHandleColor(oldColor); }
/* * Create a disc handle for radius at t using the specified parameters * */ private static void CylinderHandle(ref float radius, ref float height, Vector3 center, Quaternion orientation, string label, Color col, bool isCapsule) { // clamp values radius = Mathf.Abs(radius); height = Mathf.Abs(height); float oldRadius = radius; // TODO: do something with label? // set handle color Color oldColor = Handles.color; CustomHandleUtilities.SetHandleColor(col); // compute disc handle locations based on orientation Vector3 right = orientation * Vector3.right * radius; Vector3 up = orientation * Vector3.up * height * 0.5f; Vector3 forward = orientation * Vector3.forward * radius; // create a disc handle at each end of the cylinder Vector3 upperPoint = center + (orientation * Vector3.up) * (height * 0.5f - (isCapsule?radius:0f)); Vector3 lowerPoint = center + (orientation * Vector3.up) * (height * -0.5f + (isCapsule?radius:0f)); if (!isCapsule) { DiscHandles.WireDisc(ref radius, upperPoint, orientation, label, col); DiscHandles.WireDisc(ref radius, lowerPoint, orientation, label, col); } else { Handles.DrawWireDisc(upperPoint, up, radius); Handles.DrawWireDisc(lowerPoint, up, radius); DiscHandles.WireDisc(ref radius, center, orientation, label, col); } // draw a line connecting the handles to visualize the height Handles.DrawLine(upperPoint + forward, lowerPoint + forward); Handles.DrawLine(upperPoint - forward, lowerPoint - forward); Handles.DrawLine(upperPoint + right, lowerPoint + right); Handles.DrawLine(upperPoint - right, lowerPoint - right); // create a linear handles to adjust height LinearHandles.ValueSlider(ref height, center - up, up); LinearHandles.ValueSlider(ref height, center + up, -up); // create caps if requested if (isCapsule) { Handles.DrawWireArc(center - up + up.normalized * radius, right, forward, 180f, radius); Handles.DrawWireArc(center - up + up.normalized * radius, forward, right, -180f, radius); Handles.DrawWireArc(center + up - up.normalized * radius, right, forward, -180f, radius); Handles.DrawWireArc(center + up - up.normalized * radius, forward, right, 180f, radius); // ensure that height and radius values are valid if (radius > height * 0.5f) { // user was operating a radius handle if (radius > oldRadius) { radius = height * 0.5f; } // user was operating a height handle else { height = radius * 2f; } } } // reset handle color CustomHandleUtilities.SetHandleColor(oldColor); }