/// <summary> /// Displays a disc handle. /// </summary> /// <returns> /// The disc radius. /// </returns> /// <param name="id">Control identifier.</param> /// <param name="radius">Radius.</param> /// <param name="origin">Origin.</param> /// <param name="orientation">Orientation.</param> /// <param name="label">Label.</param> /// <param name="fillMode">Fill mode.</param> private static float DoDisc( int id, float radius, Vector3 origin, Quaternion orientation, string label, FillMode fillMode ) { // set handle matrix Matrix4x4 oldMatrix = Handles.matrix; Handles.matrix *= Matrix4x4.TRS(origin, orientation, Vector3.one); // create handles radius = LinearHandles.Dot(id, val: radius, origin: Vector3.zero, direction: Vector3.forward, label: label); radius = LinearHandles.Dot(id, val: radius, origin: Vector3.zero, direction: Vector3.right); radius = LinearHandles.Dot(id, val: radius, origin: Vector3.zero, direction: Vector3.back); radius = LinearHandles.Dot(id, val: radius, origin: Vector3.zero, direction: Vector3.left); // draw disc Color color = Handles.color; SceneGUI.SetHandleAlpha(color.a * SceneGUI.LineAlphaScalar); Handles.DrawWireDisc(Vector3.zero, Vector3.up, radius); // optionally fill the disc if (fillMode == FillMode.Solid) { SceneGUI.SetHandleAlpha(color.a * SceneGUI.FillAlphaScalar); Handles.DrawSolidDisc(Vector3.zero, Vector3.up, radius); } // reset color Handles.color = color; // reset handle matrix Handles.matrix = oldMatrix; // return the result return(radius); }
/// <summary> /// Displays an angle handle. /// </summary> /// <returns>The handle's angle value.</returns> /// <param name="id">Control identifier.</param> /// <param name="angle">Angle.</param> /// <param name="origin">Origin.</param> /// <param name="orientation">Orientation.</param> /// <param name="radius">Radius.</param> /// <param name="label">Label.</param> /// <param name="fillType">Fill type.</param> private static float Angle( int id, float angle, Vector3 origin, Quaternion orientation, float radius, string label, FillType fillType ) { // set handle matrix Matrix4x4 oldMatrix = Handles.matrix; Handles.matrix *= Matrix4x4.TRS(origin, orientation, Vector3.one); // BUG: Slider2D only works in a matrix with a scale of 1 float scaleFactor = Handles.matrix.GetScale().GetMaxValue(); radius *= scaleFactor; Handles.matrix = Matrix4x4.TRS( Handles.matrix.MultiplyPoint(Vector3.zero), Quaternion.LookRotation( Handles.matrix.MultiplyVector(Vector3.forward), Handles.matrix.MultiplyVector(Vector3.up) ), Vector3.one ); // create handle Vector3 handlePosition = Quaternion.AngleAxis(angle, Vector3.up) * Vector3.forward * radius; handlePosition = Handles.Slider2D( handlePosition, Vector3.right, Vector3.forward, Vector3.right, SceneGUI.GetFixedHandleSize(handlePosition, SceneGUI.DotHandleSize), Handles.DotCap, 0f ); Handles.DrawLine(Vector3.zero, handlePosition); float newAngle = Vector3.Angle( Vector3.forward, handlePosition ) * Mathf.Sign(Vector3.Dot(Vector3.right, handlePosition.normalized)); angle += GetDeltaAngle(angle % 360f, newAngle); // fill arc if (fillType == FillType.Solid) { Color c = Handles.color; SceneGUI.SetHandleAlpha(c.a * SceneGUI.FillAlphaScalar); Handles.DrawSolidArc(Vector3.zero, Vector3.up, Vector3.forward, angle, radius); Handles.color = c; } // draw the label if requested if (!string.IsNullOrEmpty(label)) { Handles.Label(Quaternion.AngleAxis(angle, Vector3.up) * Vector3.forward * radius, label); } // reset handle matrix Handles.matrix = oldMatrix; // return result return(angle); }