コード例 #1
0
        /// <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(HingeJoint joint)
        {
            bool enableLimit = joint.HasFlag(HingeJointFlag.Limit);

            if (enableLimitField.Value != enableLimit)
            {
                enableLimitField.Value = enableLimit;
                ToggleLimitFields(enableLimit);
            }

            limitGUI.Limit = joint.Limit;

            bool enableDrive = joint.HasFlag(HingeJointFlag.Drive);

            if (enableDriveField.Value != enableDrive)
            {
                enableDriveField.Value = enableDrive;
                ToggleDriveFields(enableDrive);
            }

            speedField.Value      = joint.Drive.speed;
            forceLimitField.Value = joint.Drive.forceLimit;
            gearRatioField.Value  = joint.Drive.gearRatio;
            freeSpinField.Value   = joint.Drive.freeSpin;

            base.Refresh(joint);
        }
コード例 #2
0
        /// <inheritdoc/>
        protected internal override void Initialize()
        {
            HingeJoint joint = (HingeJoint)InspectedObject;

            BuildGUI(joint, true);

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

            drawer.AddField("Enable limit",
                            () => joint.HasFlag(HingeJointFlag.Limit),
                            x => joint.SetFlag(HingeJointFlag.Limit, x));
            drawer.AddConditional("Limit", () => joint.HasFlag(HingeJointFlag.Limit));

            drawer.AddField("Enable drive",
                            () => joint.HasFlag(HingeJointFlag.Drive),
                            x => joint.SetFlag(HingeJointFlag.Drive, x));
            drawer.AddConditional("Drive", () => joint.HasFlag(HingeJointFlag.Drive));
        }
コード例 #3
0
        private static void DrawHingeJoint(HingeJoint joint)
        {
            Vector3 target = GetAnchor(joint, JointBody.Target);
            Vector3 anchor = GetAnchor(joint, JointBody.Anchor);
            Vector3 center = target;

            Rigidbody rigidbody = joint.GetBody(JointBody.Target);

            if (rigidbody != null)
            {
                center = rigidbody.SceneObject.Position;
            }

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

            Gizmos.Color = Color.Yellow;
            Gizmos.DrawSphere(target, 0.05f);
            Gizmos.DrawSphere(anchor, 0.05f);

            Gizmos.Color = Color.Green;
            Gizmos.DrawLine(target, center);

            const float radius = 0.25f;
            const float height = 0.5f;

            if (joint.HasFlag(HingeJointFlag.Limit))
            {
                Gizmos.Transform = joint.SceneObject.WorldTransform;

                LimitAngularRange limit = joint.Limit;

                Action <float> drawLimitedArc = x =>
                {
                    Degree lower = MathEx.WrapAngle(limit.lower);
                    Degree upper = MathEx.WrapAngle(limit.upper);

                    lower = MathEx.Min(lower, upper);
                    upper = MathEx.Max(upper, lower);

                    // Arc zero to lower limit
                    Gizmos.Color = Color.Red;
                    Gizmos.DrawWireArc(Vector3.XAxis * x, Vector3.XAxis, radius, new Degree(0.0f), lower);

                    // Arc lower to upper limit
                    Degree validRange = upper - lower;

                    Gizmos.Color = Color.Green;
                    Gizmos.DrawWireArc(Vector3.XAxis * x, Vector3.XAxis, radius, lower, validRange);

                    // Arc upper to full circle
                    Degree remainingRange = new Degree(360) - upper;

                    Gizmos.Color = Color.Red;
                    Gizmos.DrawWireArc(Vector3.XAxis * x, Vector3.XAxis, radius, upper, remainingRange);
                };

                drawLimitedArc(-height);
                drawLimitedArc(height);
            }
            else
            {
                Gizmos.Color     = Color.Green;
                Gizmos.Transform = joint.SceneObject.WorldTransform;

                Gizmos.DrawWireDisc(Vector3.XAxis * -height, Vector3.XAxis, radius);
                Gizmos.DrawWireDisc(Vector3.XAxis * height, Vector3.XAxis, radius);
            }

            Vector3[] lineStartPoints = new Vector3[4];
            lineStartPoints[0] = new Vector3(-height, radius, 0);
            lineStartPoints[1] = new Vector3(-height, -radius, 0);
            lineStartPoints[2] = new Vector3(-height, 0, radius);
            lineStartPoints[3] = new Vector3(-height, 0, -radius);

            Vector3[] lineEndPoints = new Vector3[4];
            lineEndPoints[0] = new Vector3(height, radius, 0);
            lineEndPoints[1] = new Vector3(height, -radius, 0);
            lineEndPoints[2] = new Vector3(height, 0, radius);
            lineEndPoints[3] = new Vector3(height, 0, -radius);

            Gizmos.Color = Color.Green;
            for (int i = 0; i < 4; i++)
            {
                Gizmos.DrawLine(lineStartPoints[i], lineEndPoints[i]);
            }
        }
コード例 #4
0
        /// <summary>
        /// Creates GUI elements for fields specific to the hinge joint.
        /// </summary>
        protected void BuildGUI(HingeJoint joint)
        {
            enableLimitField.OnChanged += x =>
            {
                joint.SetFlag(HingeJointFlag.Limit, x);
                MarkAsModified();
                ConfirmModify();

                ToggleLimitFields(x);
            };

            enableDriveField.OnChanged += x =>
            {
                joint.SetFlag(HingeJointFlag.Drive, x);
                MarkAsModified();
                ConfirmModify();

                ToggleDriveFields(x);
            };

            speedField.OnChanged += x =>
            {
                HingeJointDrive driveData = joint.Drive;
                driveData.speed = x;
                joint.Drive     = driveData;

                MarkAsModified();
            };
            speedField.OnFocusLost += ConfirmModify;
            speedField.OnConfirmed += ConfirmModify;

            forceLimitField.OnChanged += x =>
            {
                HingeJointDrive driveData = joint.Drive;
                driveData.forceLimit = x;
                joint.Drive          = driveData;

                MarkAsModified();
            };
            forceLimitField.OnFocusLost += ConfirmModify;
            forceLimitField.OnConfirmed += ConfirmModify;

            gearRatioField.OnChanged += x =>
            {
                HingeJointDrive driveData = joint.Drive;
                driveData.gearRatio = x;
                joint.Drive         = driveData;

                MarkAsModified();
            };
            gearRatioField.OnFocusLost += ConfirmModify;
            gearRatioField.OnConfirmed += ConfirmModify;

            freeSpinField.OnChanged += x =>
            {
                HingeJointDrive driveData = joint.Drive;
                driveData.freeSpin = x;
                joint.Drive        = driveData;

                MarkAsModified();
                ConfirmModify();
            };

            Layout.AddElement(enableLimitField);
            limitLayout = Layout.AddLayoutX();
            {
                limitLayout.AddSpace(10);

                GUILayoutY limitContentsLayout = limitLayout.AddLayoutY();
                limitGUI            = new LimitAngularRangeGUI(joint.Limit, limitContentsLayout, Persistent);
                limitGUI.OnChanged += (x, y) =>
                {
                    joint.Limit = x;
                    joint.Limit.SetBase(y);

                    MarkAsModified();
                };
                limitGUI.OnConfirmed += ConfirmModify;
            }

            Layout.AddElement(enableDriveField);
            driveLayout = Layout.AddLayoutX();
            {
                driveLayout.AddSpace(10);

                GUILayoutY driveContentsLayout = driveLayout.AddLayoutY();
                driveContentsLayout.AddElement(speedField);
                driveContentsLayout.AddElement(forceLimitField);
                driveContentsLayout.AddElement(gearRatioField);
                driveContentsLayout.AddElement(freeSpinField);
            }

            ToggleLimitFields(joint.HasFlag(HingeJointFlag.Limit));
            ToggleDriveFields(joint.HasFlag(HingeJointFlag.Drive));

            base.BuildGUI(joint, true);
        }