/// <summary>
        /// Updates all GUI elements from current values in the joint.
        /// </summary>
        /// <param name="joint">Joint to update the GUI from.</param>
        protected void Refresh(DistanceJoint joint)
        {
            bool enableMinDistanceLimit = joint.HasFlag(DistanceJointFlag.MinDistance);

            if (enableMinLimitField.Value != enableMinDistanceLimit)
            {
                enableMinLimitField.Value = enableMinDistanceLimit;
                minLimitField.Active      = enableMinDistanceLimit;
            }

            minLimitField.Value = joint.MinDistance;

            bool enableMaxDistanceLimit = joint.HasFlag(DistanceJointFlag.MaxDistance);

            if (enableMaxLimitField.Value != enableMaxDistanceLimit)
            {
                enableMaxLimitField.Value = enableMaxDistanceLimit;
                maxLimitField.Active      = enableMaxDistanceLimit;
            }

            maxLimitField.Value  = joint.MaxDistance;
            toleranceField.Value = joint.Tolerance;

            bool enableSpring = joint.HasFlag(DistanceJointFlag.Spring);

            if (enableSpringField.Value != enableSpring)
            {
                enableSpringField.Value = enableSpring;
                springLayout.Active     = enableSpring;
            }

            springGUI.Spring = joint.Spring;

            base.Refresh(joint);
        }
Exemple #2
0
        private static void DrawDistanceJoint(DistanceJoint joint)
        {
            Vector3 anchorA = GetAnchor(joint, JointBody.Target);
            Vector3 anchorB = GetAnchor(joint, JointBody.Anchor);

            Gizmos.Color = Color.White;
            Gizmos.DrawSphere(anchorA, 0.05f);
            Gizmos.DrawSphere(anchorB, 0.05f);

            Gizmos.Color = Color.Red;
            Vector3 diff = anchorB - anchorA;

            float   length = diff.Length;
            Vector3 normal = diff.Normalized;

            float min = 0.0f;
            float max = length;

            if (joint.HasFlag(DistanceJointFlag.MinDistance))
            {
                min = MathEx.Max(0.0f, joint.MinDistance);
                if (joint.HasFlag(DistanceJointFlag.MaxDistance))
                {
                    min = MathEx.Min(min, MathEx.Min(10000.0f, joint.MaxDistance));
                }

                Gizmos.DrawLine(anchorA, anchorA + normal * min);
            }

            if (joint.HasFlag(DistanceJointFlag.MaxDistance))
            {
                max = MathEx.Min(10000.0f, joint.MaxDistance);
                if (joint.HasFlag(DistanceJointFlag.MinDistance))
                {
                    max = MathEx.Max(max, min);
                }

                if (length > max)
                {
                    Gizmos.DrawLine(anchorA + normal * max, anchorA + normal * length);
                }
            }

            Gizmos.Color = Color.Green;
            Gizmos.DrawLine(anchorA + normal * min, anchorA + normal * MathEx.Min(max, length));
        }
Exemple #3
0
        /// <inheritdoc/>
        protected internal override void Initialize()
        {
            DistanceJoint joint = (DistanceJoint)InspectedObject;

            BuildGUI(joint, true);

            drawer.AddDefault(joint, typeof(DistanceJoint));

            drawer.AddField("Enable minimum limit",
                            () => joint.HasFlag(DistanceJointFlag.MinDistance),
                            x => joint.SetFlag(DistanceJointFlag.MinDistance, x));
            drawer.AddConditional("MinDistance", () => joint.HasFlag(DistanceJointFlag.MinDistance));

            drawer.AddField("Enable maximum limit",
                            () => joint.HasFlag(DistanceJointFlag.MaxDistance),
                            x => joint.SetFlag(DistanceJointFlag.MaxDistance, x));
            drawer.AddConditional("MaxDistance", () => joint.HasFlag(DistanceJointFlag.MaxDistance));

            drawer.AddField("Enable spring",
                            () => joint.HasFlag(DistanceJointFlag.Spring),
                            x => joint.SetFlag(DistanceJointFlag.Spring, x));
            drawer.AddConditional("Spring", () => joint.HasFlag(DistanceJointFlag.Spring));
        }
        /// <summary>
        /// Creates GUI elements for fields specific to the distance joint.
        /// </summary>
        protected void BuildGUI(DistanceJoint joint)
        {
            enableMinLimitField.OnChanged += x =>
            {
                joint.SetFlag(DistanceJointFlag.MinDistance, x);
                MarkAsModified();
                ConfirmModify();

                minLimitField.Active = x;
            };

            minLimitField.OnChanged   += x => { joint.MinDistance = x; MarkAsModified(); };
            minLimitField.OnFocusLost += ConfirmModify;
            minLimitField.OnConfirmed += ConfirmModify;

            enableMaxLimitField.OnChanged += x =>
            {
                joint.SetFlag(DistanceJointFlag.MaxDistance, x);
                MarkAsModified();
                ConfirmModify();

                maxLimitField.Active = x;
            };

            maxLimitField.OnChanged   += x => { joint.MaxDistance = x; MarkAsModified(); };
            maxLimitField.OnFocusLost += ConfirmModify;
            maxLimitField.OnConfirmed += ConfirmModify;

            toleranceField.OnChanged   += x => { joint.Tolerance = x; MarkAsModified(); };
            toleranceField.OnFocusLost += ConfirmModify;
            toleranceField.OnConfirmed += ConfirmModify;

            enableSpringField.OnChanged += x =>
            {
                joint.SetFlag(DistanceJointFlag.Spring, x);
                MarkAsModified();
                ConfirmModify();

                springLayout.Active = x;
            };

            Layout.AddElement(enableMinLimitField);
            GUILayoutX minLimitLayout = Layout.AddLayoutX();

            {
                minLimitLayout.AddSpace(10);
                minLimitLayout.AddElement(minLimitField);
            }

            Layout.AddElement(enableMaxLimitField);
            GUILayoutX maxLimitLayout = Layout.AddLayoutX();

            {
                maxLimitLayout.AddSpace(10);
                maxLimitLayout.AddElement(maxLimitField);
            }

            Layout.AddElement(toleranceField);
            Layout.AddElement(enableSpringField);
            springLayout = Layout.AddLayoutX();
            {
                springLayout.AddSpace(10);
                springGUI              = new SpringGUI(joint.Spring, springLayout);
                springGUI.OnChanged   += x => { joint.Spring = x; MarkAsModified(); };
                springGUI.OnConfirmed += ConfirmModify;
            }

            minLimitField.Active = joint.HasFlag(DistanceJointFlag.MinDistance);
            maxLimitField.Active = joint.HasFlag(DistanceJointFlag.MaxDistance);
            springLayout.Active  = joint.HasFlag(DistanceJointFlag.Spring);

            base.BuildGUI(joint, true);
        }