public float GetScore(HumanoidControl humanoid, Side side)
        {
            float score = 0;

            HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(side, boneRef.sideBoneId);
            if (targetedBone == null)
            {
                return(score);
            }

            Vector3    referencePosition = Vector3.zero;
            Quaternion referenceRotation = Quaternion.identity;
            Vector3    referenceScale    = Vector3.zero;

            HumanoidTarget.TargetedBone referenceBone = humanoid.GetBone(side, referenceBoneRef.sideBoneId);//referenceBoneRef.boneId);
            if (referenceBone != null && referenceBone.bone.transform != null)
            {
                referencePosition = referenceBone.target.transform.position;
                referenceRotation = referenceBone.bone.targetRotation;
                referenceScale    = referenceBone.target.transform.lossyScale;
            }
            else
            {
                referencePosition = humanoid.transform.position;
                referenceRotation = humanoid.transform.rotation;
                referenceScale    = humanoid.transform.lossyScale;
            }

            if (setRotation)
            {
                float angle = Quaternion.Angle(targetedBone.bone.targetRotation, referenceRotation * rotation);
                score = Mathf.Clamp01((90 - angle) / 90);
            }
            return(score);
        }
        public void Reset(HumanoidControl humanoid)
        {
            rotation    = Quaternion.identity;
            translation = Vector3.zero;

            HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(boneRef.boneId);
            targetedBone.target.transform.localRotation = rotation;
            targetedBone.target.transform.localPosition = translation;
        }
Exemplo n.º 3
0
 private static void ResetBoneButton(BonePose selectedBone, HumanoidControl humanoid)
 {
     if (GUILayout.Button("Reset Bone", GUILayout.Width(100)))
     {
         Debug.Log("Got it to work.");
         selectedBone.setRotation = false;
         selectedBone.rotation    = Quaternion.identity;
         HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(selectedBone.boneRef.boneId);
         targetedBone.target.transform.localRotation = selectedBone.rotation;
     }
 }
        public void ResetAffectedBones(HumanoidControl humanoid, Side showSide)
        {
            // This will not reset the bones when no mixed pose is active
            // We do want this, because otherwise the hand is not reset....

            //bool anyActive = false;
            //foreach (MixedPose mixedPose in mixedPoses)
            //    if (mixedPose.value > 0)
            //        anyActive = true;

            //if (!anyActive)
            //    return;

            foreach (MixedPose mixedPose in mixedPoses)
            {
                if (mixedPose != null && mixedPose.pose != null && mixedPose.pose.bonePoses != null)
                {
                    foreach (BonePose bonePose in mixedPose.pose.bonePoses)
                    {
                        HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(showSide, bonePose.boneRef.sideBoneId);
                        if (targetedBone == null || targetedBone.target.transform == null)
                        {
                            continue;
                        }

                        if (bonePose.setTranslation)
                        {
                            targetedBone.target.transform.position = targetedBone.TargetBasePosition();
                        }
                        if (bonePose.setRotation)
                        {
                            targetedBone.target.transform.rotation = targetedBone.TargetBaseRotation();
                        }
                        if (bonePose.setRotation)
                        {
                            targetedBone.target.transform.localScale = Vector3.one;
                        }
                    }
                }
            }
        }
        public void SetReferenceLocal(HumanoidControl humanoid, Side side = Side.AnySide)
        {
            if (side == Side.AnySide)
            {
                if (boneRef.boneId < 0 || boneRef.boneId > Bone.Count)
                {
                    return;
                }

                HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(boneRef.boneId);
                if (targetedBone.parent == null)
                {
                    SetReferenceRoot();
                }
                else
                {
                    referenceBoneRef.type   = BoneType.AllBones;
                    referenceBoneRef.boneId = targetedBone.parent.boneId;
                }
            }
            else
            {
                if (boneRef.sideBoneId < 0 || boneRef.sideBoneId > SideBone.Count)
                {
                    return;
                }

                HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(side, boneRef.sideBoneId);
                if (targetedBone.parent == null)
                {
                    SetReferenceRoot();
                }
                else
                {
                    referenceBoneRef.type = BoneType.SideBones;
                    SideBone parentSideBoneId = BoneReference.HumanoidSideBone(targetedBone.parent.boneId);
                    referenceBoneRef.sideBoneId = parentSideBoneId;
                }
            }
        }
        public void ShowPose(HumanoidControl humanoid, float value)
        {
            HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(boneRef.boneId);
            if (targetedBone == null || targetedBone.target.transform == null)
            {
                return;
            }

            Vector3    referencePosition = Vector3.zero;
            Quaternion referenceRotation = Quaternion.identity;
            Vector3    referenceScale    = Vector3.zero;

            HumanoidTarget.TargetedBone referenceBone = humanoid.GetBone(referenceBoneRef.boneId);
            if (referenceBoneRef.boneId != Bone.None && referenceBone.target.transform != null)
            {
                referencePosition = referenceBone.target.transform.position;
                referenceRotation = referenceBone.bone.targetRotation;
                referenceScale    = referenceBone.target.transform.lossyScale;
            }
            else
            {
                referencePosition = humanoid.transform.position;
                referenceRotation = humanoid.transform.rotation;
                referenceScale    = humanoid.transform.lossyScale;
            }

            if (setTranslation)
            {
                targetedBone.target.transform.position = targetedBone.TargetBasePosition() + Vector3.Lerp(Vector3.zero, referenceRotation * translation, value);
            }
            if (setRotation)
            {
                targetedBone.target.transform.rotation = Quaternion.Slerp(targetedBone.TargetBaseRotation(), referenceRotation * rotation, value);
            }
            if (setScale)
            {
                targetedBone.target.transform.localScale = Vector3.Scale(referenceScale, Vector3.Lerp(Vector3.one, referenceRotation * scale, value));
            }
        }
Exemplo n.º 7
0
        public static void UpdateScene(HumanoidControl humanoid, ITarget target, PoseMixer poseMixer, ref BonePose selectedBone, Side side = Side.AnySide)
        {
            //if (!Application.isPlaying)
            //    poseMixer.ShowPose(humanoid);

            MixedPose currentPose = poseMixer.GetEditedPose();

            if (currentPose == null || !currentPose.isEdited)
            {
                Tools.hidden = false;
                return;
            }

            Tools.hidden = true;

            HumanoidTarget.TargetedBone[] bones = target.GetBones();
            int[]  controlIds = new int[bones.Length];
            Bone[] boneIds    = new Bone[bones.Length];

            for (int i = 0; i < bones.Length; i++)
            {
                if (bones[i] == null || bones[i].bone == null || bones[i].bone.transform == null)
                {
                    continue;
                }

                Handles.FreeMoveHandle(bones[i].bone.transform.position, bones[i].bone.transform.rotation, 0.002F, Vector3.zero, DotHandleCapSaveID);
                controlIds[i] = lastControlID;
                boneIds[i]    = bones[i].boneId;
            }

            FindSelectedHandle(controlIds, boneIds, ref boneIndex);
            if (boneIndex == -1)
            {
                return;
            }

            HumanoidTarget.TargetedBone targetedBone = FindTargetedBone(bones, boneIds[boneIndex]);
            if (targetedBone == null || targetedBone.bone.transform == null)
            {
                return;
            }

            GUIStyle style = new GUIStyle();

            style.normal.textColor = Color.yellow;
            Handles.Label(targetedBone.bone.transform.position + Vector3.up * 0.01F, targetedBone.name, style);
            Handles.color = Color.white;

            switch (Tools.current)
            {
            case Tool.Move:
                selectedBone = currentPose.pose.CheckBone(boneIds[boneIndex], true);
                Vector3 handlePosition = Handles.PositionHandle(targetedBone.target.transform.position, targetedBone.bone.transform.rotation);
                targetedBone.target.transform.position = handlePosition;
                selectedBone.setTranslation            = true;
                selectedBone.SetReferenceLocal(humanoid, side);
                selectedBone.UpdateTranslation(humanoid, side);
                break;

            case Tool.Rotate:
                selectedBone = currentPose.pose.CheckBone(boneIds[boneIndex], true);
                Quaternion handleRotation = Handles.RotationHandle(targetedBone.target.transform.rotation, targetedBone.bone.transform.position);
                targetedBone.target.transform.rotation = handleRotation;
                selectedBone.setRotation = true;
                selectedBone.SetReferenceLocal(humanoid, side);
                selectedBone.UpdateRotation(humanoid, side);
                break;

            case Tool.Scale:
                //Handles.ScaleHandle(selectedBone.transform.localScale, selectedBone.transform.position, selectedBone.transform.rotation, HandleUtility.GetHandleSize(selectedBone.transform.position));
                // need to all morphScale first...
                break;
            }

            Handles.BeginGUI();
            ResetBoneButton(selectedBone, humanoid);
            Handles.EndGUI();
        }
        public void ShowPose(HumanoidControl humanoid, Side showSide, float value)
        {
            HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(showSide, boneRef.sideBoneId);
            if (targetedBone == null || targetedBone.target.transform == null)
            {
                return;
            }

            Vector3    referencePosition = Vector3.zero;
            Quaternion referenceRotation = Quaternion.identity;
            Vector3    referenceScale    = Vector3.zero;

            HumanoidTarget.TargetedBone referenceBone = humanoid.GetBone(showSide, referenceBoneRef.sideBoneId);

            if (referenceBone != null && referenceBone.bone.transform != null)
            {
                referencePosition = referenceBone.target.transform.position;
                referenceRotation = referenceBone.target.transform.rotation;
                referenceScale    = referenceBone.target.transform.lossyScale;
            }
            else
            {
                referencePosition = humanoid.transform.position;
                referenceRotation = humanoid.transform.rotation;
                referenceScale    = humanoid.transform.lossyScale;
            }

            if (boneRef.type == BoneType.SideBones && boneRef.side == Side.AnySide && showSide == Side.Right)
            {
                // We need to convert the left-orientated anyside to a right side
                // For this, we mirror the translation/rotation along the YZ-plane (not scale!)
                if (setTranslation)
                {
                    Vector3 mirroredTranslation = new Vector3(-translation.x, translation.y, translation.z);
                    targetedBone.target.transform.position = targetedBone.TargetBasePosition() + Vector3.Lerp(Vector3.zero, referenceRotation * mirroredTranslation, value);
                }
                if (setRotation)
                {
                    Quaternion mirroredRotation = new Quaternion(rotation.x, -rotation.y, -rotation.z, rotation.w);
                    targetedBone.target.transform.rotation = Quaternion.Slerp(targetedBone.TargetBaseRotation(), referenceRotation * mirroredRotation, value);
                }
                if (setScale)
                {
                    targetedBone.target.transform.localScale = Vector3.Scale(referenceScale, Vector3.Lerp(Vector3.one, referenceRotation * scale, value));
                }
            }
            else
            {
                if (setTranslation)
                {
                    targetedBone.target.transform.position = targetedBone.TargetBasePosition() + Vector3.Lerp(Vector3.zero, referenceRotation * translation, value);
                }
                if (setRotation)
                {
                    targetedBone.target.transform.rotation = Quaternion.Slerp(targetedBone.TargetBaseRotation(), referenceRotation * rotation, value);
                }
                if (setScale)
                {
                    targetedBone.target.transform.localScale = Vector3.Scale(referenceScale, Vector3.Lerp(Vector3.one, referenceRotation * scale, value));
                }
            }
        }
        public void UpdateRotation(HumanoidControl humanoid, Side side = Side.AnySide)
        {
            if (side == Side.AnySide)
            {
                if (boneRef.boneId < 0 || boneRef.boneId > Bone.Count)
                {
                    return;
                }

                HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(boneRef.boneId);
                if (targetedBone.target.transform == null)
                {
                    return;
                }

                setRotation = true;
                if (referenceBoneRef.boneId == Bone.None)
                {
                    rotation = Quaternion.Inverse(humanoid.transform.rotation) * targetedBone.target.transform.rotation;
                    return;
                }

                HumanoidTarget.TargetedBone referenceBone = humanoid.GetBone(referenceBoneRef.boneId);
                if (referenceBone.target.transform == null)
                {
                    rotation = Quaternion.Inverse(humanoid.transform.rotation) * targetedBone.target.transform.rotation;
                }
                else
                {
                    rotation = Quaternion.Inverse(referenceBone.target.transform.rotation) * targetedBone.target.transform.rotation;
                }
            }
            else
            {
                if (boneRef.sideBoneId < 0 || boneRef.sideBoneId > SideBone.Count)
                {
                    return;
                }

                HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(side, boneRef.sideBoneId);
                if (targetedBone.target.transform == null)
                {
                    return;
                }

                setRotation = true;
                if (referenceBoneRef.sideBoneId == SideBone.None)
                {
                    rotation = Quaternion.Inverse(humanoid.transform.rotation) * targetedBone.target.transform.rotation;
                    return;
                }

                HumanoidTarget.TargetedBone referenceBone = humanoid.GetBone(side, referenceBoneRef.sideBoneId);
                if (referenceBone.target.transform == null)
                {
                    rotation = Quaternion.Inverse(humanoid.transform.rotation) * targetedBone.target.transform.rotation;
                }
                else
                {
                    rotation = Quaternion.Inverse(referenceBone.target.transform.rotation) * targetedBone.target.transform.rotation;
                }
                if (side == Side.Right)
                {
                    // Sidebones need to be stored like left bones
                    rotation = Quaternion.Inverse(rotation);
                }
            }
        }
        public void UpdateTranslation(HumanoidControl humanoid, Side side = Side.AnySide)
        {
            if (side == Side.AnySide)
            {
                if (boneRef.boneId < 0 || boneRef.boneId > Bone.Count)
                {
                    return;
                }

                HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(boneRef.boneId);
                if (targetedBone.target.transform == null)
                {
                    return;
                }

                setTranslation = true;
                Vector3 targetBasePosition = targetedBone.TargetBasePosition();
                if (referenceBoneRef.boneId == Bone.None)
                {
                    translation = Quaternion.Inverse(humanoid.transform.rotation) * (targetedBone.target.transform.position - targetBasePosition);
                    return;
                }

                HumanoidTarget.TargetedBone referenceBone = humanoid.GetBone(referenceBoneRef.boneId);
                if (referenceBone.target.transform != null)
                {
                    translation = Quaternion.Inverse(referenceBone.bone.targetRotation) * (targetedBone.target.transform.position - targetBasePosition);
                }
                else
                {
                    translation = Quaternion.Inverse(humanoid.transform.rotation) * (targetedBone.target.transform.position - targetBasePosition);
                }

                setTranslation = (translation.sqrMagnitude > 0.001F);
            }
            else
            {
                if (boneRef.sideBoneId < 0 || boneRef.sideBoneId > SideBone.Count)
                {
                    return;
                }

                HumanoidTarget.TargetedBone targetedBone = humanoid.GetBone(side, boneRef.sideBoneId);
                if (targetedBone.target.transform == null)
                {
                    return;
                }

                setTranslation = true;
                Vector3 targetBasePosition = targetedBone.TargetBasePosition();
                if (referenceBoneRef.sideBoneId == SideBone.None)
                {
                    translation = Quaternion.Inverse(humanoid.transform.rotation) * (targetedBone.target.transform.position - targetBasePosition);
                    return;
                }

                HumanoidTarget.TargetedBone referenceBone = humanoid.GetBone(side, referenceBoneRef.sideBoneId);
                if (referenceBone.target.transform != null)
                {
                    translation = Quaternion.Inverse(referenceBone.bone.targetRotation) * (targetedBone.target.transform.position - targetBasePosition);
                }
                else
                {
                    translation = Quaternion.Inverse(humanoid.transform.rotation) * (targetedBone.target.transform.position - targetBasePosition);
                }

                setTranslation = (translation.sqrMagnitude > 0.001F);
            }
        }