コード例 #1
0
        /// <summary>
        /// Allow for rendering in the editor
        /// </summary>
        /// <returns></returns>
        public override bool OnSceneConstraintGUI(bool rIsSelected)
        {
            bool lIsDirty = false;

#if UNITY_EDITOR
            IKBoneModifier lModifier = IKBoneModifier.Allocate();
            lModifier.Swing = _Swing;
            lModifier.Twist = _Twist;

            bool lIsSwingDirty = HandlesHelper.JointSwingHandle(mBone, lModifier);
            if (lIsSwingDirty)
            {
                lIsDirty = true;
            }

            bool lIsTwistDirty = HandlesHelper.JointTwistHandle(mBone, lModifier);
            if (lIsTwistDirty)
            {
                lIsDirty = true;
            }

            if (lIsDirty)
            {
                _Swing = lModifier.Swing;
                _Twist = lModifier.Twist;
                mBone.SetLocalRotation(_Swing, _Twist, 1f);
            }

            IKBoneModifier.Release(lModifier);
#endif

            return(lIsDirty);
        }
コード例 #2
0
        /// <summary>
        /// Allows us to render joint info into the scene. This GUI is
        /// used for displaying and manipulating the joint itself.
        /// </summary>
        /// <returns>Reports if the object's value was changed</returns>
        public override bool OnSceneManipulatorGUI(IKBoneModifier rModifier)
        {
#if UNITY_EDITOR
            //Quaternion lSwing = mBone.Swing;
            //Quaternion lTwist = mBone.Twist;

            bool lIsSwingDirty = HandlesHelper.JointSwingHandle(mBone, rModifier);
            if (lIsSwingDirty)
            {
                //rModifier.Swing = lSwing;
                rModifier.IsDirty = true;
            }

            if (_AllowTwist)
            {
                bool lIsTwistDirty = HandlesHelper.JointTwistHandle(mBone, rModifier);
                if (lIsTwistDirty)
                {
                    //rModifier.Twist = lTwist;
                    rModifier.IsDirty = true;
                }
            }

            if (rModifier.IsDirty)
            {
                ApplyLimits(ref rModifier.Swing, ref rModifier.Twist);
            }
#endif

            return(rModifier.IsDirty);
        }
コード例 #3
0
        /// <summary>
        /// Allows us to render joint info into the scene. This GUI is
        /// used for displaying and manipulating the joint itself.
        /// </summary>
        /// <returns>Reports if the object's value was changed</returns>
        public override bool OnSceneManipulatorGUI(IKBoneModifier rModifier)
        {
#if UNITY_EDITOR
            bool lIsSwingDirty = HandlesHelper.JointSwingAxisHandle(mBone, _SwingAxis, rModifier);
            if (lIsSwingDirty)
            {
                rModifier.IsDirty = true;
            }

            if (_AllowTwist)
            {
                bool lIsTwistDirty = HandlesHelper.JointTwistHandle(mBone, rModifier);
                if (lIsTwistDirty)
                {
                    rModifier.IsDirty = true;
                }
            }

            if (rModifier.IsDirty)
            {
                ApplyLimits(ref rModifier.Swing, ref rModifier.Twist);
            }
#endif

            return(rModifier.IsDirty);
        }
コード例 #4
0
        /// <summary>
        /// Allow the joint to render it's own GUI. This GUI is used
        /// for displaying and manipulating the joint itself.
        /// </summary>
        /// <returns>Reports if the object's value was changed</returns>
        public override bool OnInspectorManipulatorGUI(IKBoneModifier rModifier)
        {
#if UNITY_EDITOR
            // Determine if the swing is changing
            if (mBone != null)
            {
                Vector3 lSwing    = rModifier.Swing.eulerAngles;
                Vector3 lNewSwing = InspectorHelper.Vector3Fields("Swing", "Euler angles to swing the bone.", lSwing, true, true, false);
                if (lNewSwing != lSwing)
                {
                    // Grab the amount that was just rotated by based on the current rotation.
                    // We do this so the change is relative to the current swing rotation
                    Vector3 lDeltaRotations = lNewSwing - lSwing;
                    rModifier.Swing = rModifier.Swing * Quaternion.Euler(lDeltaRotations);

                    rModifier.IsDirty = true;
                }

                // Determine if the twist is changing
                //float lTwist = mBone.Twist.eulerAngles.y;
                float lTwist    = Vector3Ext.SignedAngle(Vector3.up, rModifier.Twist * Vector3.up, Vector3.forward);
                float lNewTwist = EditorGUILayout.FloatField("Twist", lTwist);
                if (_AllowTwist && lNewTwist != lTwist)
                {
                    rModifier.Twist   = Quaternion.AngleAxis(lNewTwist, Vector3.forward);
                    rModifier.IsDirty = true;
                }

                // Reset the values if needed
                if (GUILayout.Button("reset rotation", EditorStyles.miniButton))
                {
                    rModifier.Swing   = Quaternion.identity;
                    rModifier.Twist   = (_AllowTwist ? Quaternion.identity : mBone._Twist);
                    rModifier.IsDirty = true;

                    mBone._Transform.localRotation = mBone._BindRotation;
                }

                if (rModifier.IsDirty)
                {
                    // Before we go to far, see if we are within the joint limits. If not,
                    // we need to go back to a good position.
                    bool lIsInLimits = ApplyLimits(ref rModifier.Swing, ref rModifier.Twist);
                    if (lIsInLimits || QuaternionExt.IsEqual(rModifier.Swing, Quaternion.identity))
                    {
                        mLastSwing = rModifier.Swing;
                        mLastTwist = rModifier.Twist;
                    }
                    else
                    {
                        rModifier.Swing = mLastSwing;
                        rModifier.Twist = mLastTwist;
                    }
                }
            }
#endif

            return(rModifier.IsDirty);
        }
コード例 #5
0
        /// <summary>
        /// Pulls an object from the pool.
        /// </summary>
        /// <returns></returns>
        public static IKBoneModifier Allocate()
        {
            // Grab the next available object
            IKBoneModifier lInstance = sPool.Allocate();

            // Initialize
            lInstance.Type     = EnumIKBoneModifierType.LOCAL_ROTATION;
            lInstance.Swing    = Quaternion.identity;
            lInstance.Twist    = Quaternion.identity;
            lInstance.Position = Vector3.zero;
            lInstance.Up       = Vector3.zero;
            lInstance.Weight   = 1f;
            lInstance.IsDirty  = false;

            return(lInstance);
        }
コード例 #6
0
        /// <summary>
        /// Pulls an object from the pool.
        /// </summary>
        /// <returns></returns>
        public static IKBoneModifier Allocate(int rType, Vector3 rPosition, Vector3 rUp, float rWeight)
        {
            // Grab the next available object
            IKBoneModifier lInstance = sPool.Allocate();

            // Initialize
            lInstance.Type     = rType;
            lInstance.Swing    = Quaternion.identity;
            lInstance.Twist    = Quaternion.identity;
            lInstance.Position = rPosition;
            lInstance.Up       = rUp;
            lInstance.Weight   = rWeight;
            lInstance.IsDirty  = false;

            return(lInstance);
        }
コード例 #7
0
        /// <summary>
        /// Pulls an object from the pool.
        /// </summary>
        /// <returns></returns>
        public static IKBoneModifier Allocate(int rType, Quaternion rSwing, Quaternion rTwist, float rWeight)
        {
            // Grab the next available object
            IKBoneModifier lInstance = sPool.Allocate();

            // Initialize
            lInstance.Type     = rType;
            lInstance.Swing    = rSwing;
            lInstance.Twist    = rTwist;
            lInstance.Position = Vector3.zero;
            lInstance.Up       = Vector3.zero;
            lInstance.Weight   = rWeight;
            lInstance.IsDirty  = false;

            return(lInstance);
        }
コード例 #8
0
        /// <summary>
        /// Allow the joint to render it's own GUI. This GUI is used
        /// for displaying and manipulating the joint itself.
        /// </summary>
        /// <returns>Reports if the object's value was changed</returns>
        public override bool OnInspectorManipulatorGUI(IKBoneModifier rModifier)
        {
#if UNITY_EDITOR
            // Determine if the swing is changing
            if (mBone != null)
            {
                // Determine if the swing is changing
                Vector3 lSwing    = rModifier.Swing.eulerAngles;
                Vector3 lNewSwing = InspectorHelper.Vector3Fields("Swing", "Euler angles to swing the bone.", lSwing, true, true, false); //lBoneForward.x == 0f, lBoneForward.y == 0f, lBoneForward.z == 0f);
                if (lNewSwing != lSwing)
                {
                    // Grab the amount that was just rotated by based on the current rotation.
                    // We do this so the change is relative to the current swing rotation
                    Vector3 lDeltaRotations = lNewSwing - lSwing;
                    rModifier.Swing = rModifier.Swing * Quaternion.Euler(lDeltaRotations);

                    rModifier.IsDirty = true;
                }

                float lTwist    = Vector3Ext.SignedAngle(Vector3.up, rModifier.Twist * Vector3.up, Vector3.forward);
                float lNewTwist = EditorGUILayout.FloatField("Twist", lTwist);
                if (lNewTwist != lTwist)
                {
                    rModifier.Twist   = Quaternion.AngleAxis(lNewTwist, Vector3.forward);
                    rModifier.IsDirty = true;
                }

                // Reset the values if needed
                if (GUILayout.Button("reset rotation", EditorStyles.miniButton))
                {
                    rModifier.Swing   = Quaternion.identity;
                    rModifier.Twist   = Quaternion.identity;
                    rModifier.IsDirty = true;

                    mBone._Transform.localRotation = mBone._BindRotation;
                }

                if (rModifier.IsDirty)
                {
                    ApplyLimits(ref rModifier.Swing, ref rModifier.Twist);
                }
            }
#endif

            return(rModifier.IsDirty);
        }
コード例 #9
0
        /// <summary>
        /// Allows us to render joint info into the scene. This GUI is
        /// used for displaying and manipulating the joint itself.
        /// </summary>
        /// <returns>Reports if the object's value was changed</returns>
        public override bool OnSceneManipulatorGUI(IKBoneModifier rModifier)
        {
#if UNITY_EDITOR
            //Quaternion lSwing = mBone.Swing;
            //Quaternion lTwist = mBone.Twist;

            bool lIsSwingDirty = HandlesHelper.JointSwingHandle(mBone, rModifier);
            if (lIsSwingDirty)
            {
                //rModifier.Swing = lSwing;
                rModifier.IsDirty = true;
            }

            bool lIsTwistDirty = HandlesHelper.JointTwistHandle(mBone, rModifier);
            if (lIsTwistDirty)
            {
                //rModifier.Twist = lTwist;
                rModifier.IsDirty = true;
            }

            if (rModifier.IsDirty)
            {
                // Before we go to far, see if we are within the joint limits. If not,
                // we need to go back to a good position.
                bool lIsInLimits = ApplyLimits(ref rModifier.Swing, ref rModifier.Twist);
                if (lIsInLimits || QuaternionExt.IsEqual(rModifier.Swing, Quaternion.identity))
                {
                    mLastSwing = rModifier.Swing;
                    mLastTwist = rModifier.Twist;
                }
                else
                {
                    rModifier.Swing = mLastSwing;
                    rModifier.Twist = mLastTwist;
                }
            }
#endif

            return(rModifier.IsDirty);
        }
コード例 #10
0
 /// <summary>
 /// Allows us to render joint info into the scene. This GUI is
 /// used for displaying and manipulating the joint itself.
 /// </summary>
 /// <returns>Reports if the object's value was changed</returns>
 public virtual bool OnSceneManipulatorGUI(IKBoneModifier rModifier)
 {
     return(false);
 }
コード例 #11
0
 /// <summary>
 /// Returns an element back to the pool.
 /// </summary>
 /// <param name="rEdge"></param>
 public static void Release(IKBoneModifier rInstance)
 {
     sPool.Release(rInstance);
 }