public void Save(Animator animator)
        {
            gameObjectTransform = new TransformPoseSave.SaveData(animator.gameObject.transform);

            currentAnimatorStateInfo = new AnimatorStateInfo[animator.layerCount];
            nextAnimatorStateInfo    = new AnimatorStateInfo[animator.layerCount];
            for (int i = 0; i < animator.layerCount; i++)
            {
                currentAnimatorStateInfo[i] = animator.GetCurrentAnimatorStateInfo(i);
                nextAnimatorStateInfo[i]    = animator.GetNextAnimatorStateInfo(i);
            }
            animatorParamaters = new SaveParamater[animator.parameterCount];
            for (int i = 0; i < animator.parameterCount; i++)
            {
                var param = animator.parameters[i];
                animatorParamaters[i] = new SaveParamater()
                {
                    nameHash = param.nameHash,
                    type     = param.type,
                };
                switch (param.type)
                {
                case AnimatorControllerParameterType.Float: animatorParamaters[i].value = animator.GetFloat(param.nameHash); break;

                case AnimatorControllerParameterType.Int: animatorParamaters[i].value = animator.GetInteger(param.nameHash); break;

                case AnimatorControllerParameterType.Bool: animatorParamaters[i].value = animator.GetBool(param.nameHash); break;

                case AnimatorControllerParameterType.Trigger: break;

                default: Assert.IsTrue(false); break;
                }
            }
        }
Exemplo n.º 2
0
        public void SetTransformStart()
        {
            gameObjectTransform.SetParent(sourceObject.transform.parent);
            ResetOriginal();

            gameObjectTransform.SetPositionAndRotation(va.transformPoseSave.startPosition, va.transformPoseSave.startRotation);
            gameObjectTransform.localScale = va.transformPoseSave.startLocalScale;
            m_SetTransformRootSave         = new TransformPoseSave.SaveData(gameObjectTransform);

            SetOffset(va.transformPoseSave.startLocalPosition, va.transformPoseSave.startLocalRotation);
        }
Exemplo n.º 3
0
        public void SetTransformOutside()
        {
            gameObjectTransform.SetParent(null);
            //ResetOriginal();  Waste

            gameObjectTransform.SetPositionAndRotation(new Vector3(10000f, 10000f, 10000f), Quaternion.identity);
            gameObjectTransform.localScale = Vector3.one;
            m_SetTransformRootSave         = new TransformPoseSave.SaveData(gameObjectTransform);

            SetOffset(Vector3.zero, Quaternion.identity);
        }
Exemplo n.º 4
0
        public void SetTransformOrigin()
        {
            gameObjectTransform.SetParent(null);
            ResetOriginal();

            gameObjectTransform.localPosition = Vector3.zero;
            gameObjectTransform.localRotation = Quaternion.identity;
            gameObjectTransform.localScale    = Vector3.one;
            m_SetTransformRootSave            = new TransformPoseSave.SaveData(gameObjectTransform);

            SetOffset(Vector3.zero, Quaternion.identity);
        }
Exemplo n.º 5
0
        private void ToolsTemplatePose()
        {
            var transforms = EditorCommon.GetHierarchyTransform(activeRootObject.transform);

            Undo.RecordObjects(transforms.ToArray(), "Template Pose");
            var animator = activeRootObject.GetComponent <Animator>();

            if (animator != null && !animator.isInitialized)
            {
                animator.Rebind();
            }
            var save = new TransformPoseSave.SaveData(activeRootObject.transform);

            string[] paths = new string[transforms.Count];
            for (int i = 0; i < transforms.Count; i++)
            {
                paths[i] = AnimationUtility.CalculateTransformPath(transforms[i], activeRootObject.transform);
            }
            #region Human
            if (animator != null && animator.isHuman)
            {
                var uAnimator        = new UAnimator();
                var humanPoseHandler = new HumanPoseHandler(animator.avatar, uAnimator.GetAvatarRoot(animator));
                var humanPose        = new HumanPose();
                humanPoseHandler.GetHumanPose(ref humanPose);
                {
                    var musclePropertyName = new MusclePropertyName();
                    if (toolPoseTemplate.haveRootT)
                    {
                        humanPose.bodyPosition = toolPoseTemplate.rootT;
                    }
                    if (toolPoseTemplate.haveRootQ)
                    {
                        humanPose.bodyRotation = toolPoseTemplate.rootQ;
                    }
                    if (toolPoseTemplate.musclePropertyNames != null && toolPoseTemplate.muscleValues != null)
                    {
                        Assert.IsTrue(toolPoseTemplate.musclePropertyNames.Length == toolPoseTemplate.muscleValues.Length);
                        for (int i = 0; i < toolPoseTemplate.musclePropertyNames.Length; i++)
                        {
                            var muscleIndex = EditorCommon.ArrayIndexOf(musclePropertyName.PropertyNames, toolPoseTemplate.musclePropertyNames[i]);
                            if (muscleIndex < 0)
                            {
                                continue;
                            }
                            humanPose.muscles[muscleIndex] = toolPoseTemplate.muscleValues[i];
                        }
                    }
                    if (toolPoseTemplate.tdofIndices != null && toolPoseTemplate.tdofValues != null)
                    {
                        //not support
                    }
                }
                humanPoseHandler.SetHumanPose(ref humanPose);
            }
            #endregion
            #region Generic
            if (toolPoseTemplate.transformPaths != null && toolPoseTemplate.transformPaths != null)
            {
                Assert.IsTrue(toolPoseTemplate.transformPaths.Length == toolPoseTemplate.transformValues.Length);
                for (int i = 0; i < toolPoseTemplate.transformPaths.Length; i++)
                {
                    var index = EditorCommon.ArrayIndexOf(paths, toolPoseTemplate.transformPaths[i]);
                    if (index < 0)
                    {
                        continue;
                    }
                    transforms[index].localPosition = toolPoseTemplate.transformValues[i].position;
                    transforms[index].localRotation = toolPoseTemplate.transformValues[i].rotation;
                    transforms[index].localScale    = toolPoseTemplate.transformValues[i].scale;
                }
            }
            #endregion
            #region BlendShape
            if (toolPoseTemplate.blendShapePaths != null && toolPoseTemplate.blendShapeValues != null)
            {
                foreach (var renderer in activeRootObject.GetComponentsInChildren <SkinnedMeshRenderer>(true))
                {
                    if (renderer == null || renderer.sharedMesh == null || renderer.sharedMesh.blendShapeCount <= 0)
                    {
                        continue;
                    }
                    Undo.RecordObject(renderer, "Template Pose");
                    var path  = AnimationUtility.CalculateTransformPath(renderer.transform, activeRootObject.transform);
                    var index = EditorCommon.ArrayIndexOf(toolPoseTemplate.blendShapePaths, path);
                    if (index < 0)
                    {
                        continue;
                    }
                    var names = new string[renderer.sharedMesh.blendShapeCount];
                    for (int i = 0; i < renderer.sharedMesh.blendShapeCount; i++)
                    {
                        names[i] = renderer.sharedMesh.GetBlendShapeName(i);
                    }
                    for (int i = 0; i < toolPoseTemplate.blendShapeValues[index].names.Length; i++)
                    {
                        var nameindex = EditorCommon.ArrayIndexOf(names, toolPoseTemplate.blendShapeValues[index].names[i]);
                        if (nameindex < 0)
                        {
                            continue;
                        }
                        renderer.SetBlendShapeWeight(nameindex, toolPoseTemplate.blendShapeValues[index].weights[i]);
                    }
                }
            }
            #endregion
            save.LoadLocal(activeRootObject.transform);
        }