/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <summary> /// Returns an element back to the pool. /// </summary> /// <param name="rEdge"></param> public static void Release(IKBoneModifier rInstance) { sPool.Release(rInstance); }