예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }