// --------------- methods (public) --------------------------------------------------

        // Pass clip that should be bound to this track. Returns false on failure.
        // Note: Passing null makes this node invalid and may result in invalid animation system result.
        public bool SetClip(MyAnimationClip animationClip)
        {
            m_animationClip = animationClip;
            m_currentKeyframes = animationClip != null ? new int[animationClip.Bones.Count] : null;
            m_boneIndicesMapping = null; // will be initialized later, we do not have sufficient data here
            return true;
        }
        // --------------- methods (public) --------------------------------------------------

        // Pass clip that should be bound to this track. Returns false on failure.
        // Note: Passing null makes this node invalid and may result in invalid animation system result.
        public bool SetClip(MyAnimationClip animationClip)
        {
            m_animationClip      = animationClip;
            m_currentKeyframes   = animationClip != null ? new int[animationClip.Bones.Count] : null;
            m_boneIndicesMapping = null; // will be initialized later, we do not have sufficient data here
            return(true);
        }
예제 #3
0
        // Initialize animation tree of the state machine node.
        private static VRage.Animations.MyAnimationTreeNode InitNodeAnimationTree(VRage.Game.ObjectBuilders.MyObjectBuilder_AnimationTreeNode objBuilderNode)
        {
            // ------- tree node track -------
            var objBuilderNodeTrack = objBuilderNode as VRage.Game.ObjectBuilders.MyObjectBuilder_AnimationTreeNodeTrack;

            if (objBuilderNodeTrack != null)
            {
                var     nodeTrack      = new VRage.Animations.AnimationNodes.MyAnimationTreeNodeTrack();
                MyModel modelAnimation = MyModels.GetModelOnlyAnimationData(objBuilderNodeTrack.PathToModel);
                if (modelAnimation != null)
                {
                    VRage.Animations.MyAnimationClip selectedClip = modelAnimation.Animations.Clips.FirstOrDefault(clipItem => clipItem.Name == objBuilderNodeTrack.AnimationName);
                    if (selectedClip == null)
                    {
                        Debug.Fail("File '" + objBuilderNodeTrack.PathToModel + "' does not contain animation clip '"
                                   + objBuilderNodeTrack.AnimationName + "'.");
                    }
                    nodeTrack.SetClip(selectedClip);
                    nodeTrack.Loop        = objBuilderNodeTrack.Loop;
                    nodeTrack.Speed       = objBuilderNodeTrack.Speed;
                    nodeTrack.Interpolate = objBuilderNodeTrack.Interpolate;
                }
                return(nodeTrack);
            }
            // ------ tree node mix -----------------------
            var objBuilderNodeMix1D = objBuilderNode as MyObjectBuilder_AnimationTreeNodeMix1D;

            if (objBuilderNodeMix1D != null)
            {
                var nodeMix1D = new VRage.Animations.AnimationNodes.MyAnimationTreeNodeMix1D();
                if (objBuilderNodeMix1D.Children != null)
                {
                    foreach (var mappingObjBuilder in objBuilderNodeMix1D.Children)
                    {
                        MyAnimationTreeNodeMix1D.MyParameterNodeMapping mapping = new MyAnimationTreeNodeMix1D.MyParameterNodeMapping()
                        {
                            ParamValueBinding = mappingObjBuilder.Param,
                            Child             = InitNodeAnimationTree(mappingObjBuilder.Node)
                        };
                        nodeMix1D.ChildMappings.Add(mapping);
                    }
                    nodeMix1D.ChildMappings.Sort((x, y) => x.ParamValueBinding.CompareTo(y.ParamValueBinding));
                }
                nodeMix1D.ParameterName = MyStringId.GetOrCompute(objBuilderNodeMix1D.ParameterName);
                return(nodeMix1D);
            }
            // ------ tree node add -----------------------
            var objBuilderNodeAdd = objBuilderNode as MyObjectBuilder_AnimationTreeNodeAdd;

            if (objBuilderNodeAdd != null)
            {
                Debug.Fail("Addition node: currently unsupported type of animation tree node.");
            }
            return(null);
        }
예제 #4
0
 // Constructor of node having single animation.
 // Parameter animationClip must not be null.
 public MyAnimationStateMachineNode(string name, MyAnimationClip animationClip)
     : base(name)
 {
     Debug.Assert(animationClip != null, "Creating single animation node in machine " + this.Name + ", node name "
                  + name + ": Animation clip must not be null!");
     if (animationClip != null)
     {
         var nodeTrack = new AnimationNodes.MyAnimationTreeNodeTrack();
         nodeTrack.SetClip(animationClip);
         m_rootAnimationNode = nodeTrack;
     }
 }
 // Constructor of node having single animation.
 // Parameter animationClip must not be null.
 public MyAnimationStateMachineNode(string name, MyAnimationClip animationClip)
     : base(name)
 {
     Debug.Assert(animationClip != null, "Creating single animation node in machine " + this.Name + ", node name " 
         + name + ": Animation clip must not be null!");
     if (animationClip != null)
     {
         var nodeTrack = new AnimationNodes.MyAnimationTreeNodeTrack();
         nodeTrack.SetClip(animationClip);
         m_rootAnimationNode = nodeTrack;
     }
 }
예제 #6
0
 protected void Write(MyAnimationClip clip)
 {
     m_writer.Write(clip.Name);
     m_writer.Write(clip.Duration);
     m_writer.Write(clip.Bones.Count);
     foreach (MyAnimationClip.Bone bone in clip.Bones)
     {
         m_writer.Write(bone.Name);
         m_writer.Write(bone.Keyframes.Count);
         foreach (MyAnimationClip.Keyframe keyframe in bone.Keyframes)
         {
             m_writer.Write(keyframe.Time);
             WriteQuaternion(keyframe.Rotation);
             WriteVector(keyframe.Translation);
         }
     }
 }
예제 #7
0
        // Initialize animation tree of the state machine node.
        private static MyAnimationTreeNode InitNodeAnimationTree(VRage.Game.ObjectBuilders.MyObjectBuilder_AnimationTreeNode objBuilderNode)
        {
            // ------- tree node track -------
            var objBuilderNodeTrack = objBuilderNode as VRage.Game.ObjectBuilders.MyObjectBuilder_AnimationTreeNodeTrack;

            if (objBuilderNodeTrack != null)
            {
                var     nodeTrack      = new MyAnimationTreeNodeTrack();
                MyModel modelAnimation = objBuilderNodeTrack.PathToModel != null?MyModels.GetModelOnlyAnimationData(objBuilderNodeTrack.PathToModel) : null;

                if (modelAnimation != null && modelAnimation.Animations != null && modelAnimation.Animations.Clips != null && modelAnimation.Animations.Clips.Count > 0)
                {
                    VRage.Animations.MyAnimationClip selectedClip = modelAnimation.Animations.Clips.FirstOrDefault(clipItem => clipItem.Name == objBuilderNodeTrack.AnimationName);
                    selectedClip = selectedClip ?? modelAnimation.Animations.Clips[0]; // fallback
                    if (selectedClip == null)
                    {
                        Debug.Fail("File '" + objBuilderNodeTrack.PathToModel + "' does not contain animation clip '"
                                   + objBuilderNodeTrack.AnimationName + "'.");
                    }
                    nodeTrack.SetClip(selectedClip);
                    nodeTrack.Loop        = objBuilderNodeTrack.Loop;
                    nodeTrack.Speed       = objBuilderNodeTrack.Speed;
                    nodeTrack.Interpolate = objBuilderNodeTrack.Interpolate;
                }
                else if (objBuilderNodeTrack.PathToModel != null)
                {
                    MyLog.Default.Log(MyLogSeverity.Error, "Cannot load MWM track {0}.", objBuilderNodeTrack.PathToModel);
                    Debug.Fail("Cannot load MWM track " + objBuilderNodeTrack.PathToModel);
                }
                return(nodeTrack);
            }
            // ------ tree node mix -----------------------
            var objBuilderNodeMix1D = objBuilderNode as MyObjectBuilder_AnimationTreeNodeMix1D;

            if (objBuilderNodeMix1D != null)
            {
                var nodeMix1D = new MyAnimationTreeNodeMix1D();
                if (objBuilderNodeMix1D.Children != null)
                {
                    foreach (var mappingObjBuilder in objBuilderNodeMix1D.Children)
                    {
                        MyAnimationTreeNodeMix1D.MyParameterNodeMapping mapping = new MyAnimationTreeNodeMix1D.MyParameterNodeMapping()
                        {
                            ParamValueBinding = mappingObjBuilder.Param,
                            Child             = InitNodeAnimationTree(mappingObjBuilder.Node)
                        };
                        nodeMix1D.ChildMappings.Add(mapping);
                    }
                    nodeMix1D.ChildMappings.Sort((x, y) => x.ParamValueBinding.CompareTo(y.ParamValueBinding));
                }
                nodeMix1D.ParameterName = MyStringId.GetOrCompute(objBuilderNodeMix1D.ParameterName);
                nodeMix1D.Circular      = objBuilderNodeMix1D.Circular;
                nodeMix1D.Sensitivity   = objBuilderNodeMix1D.Sensitivity;
                nodeMix1D.MaxChange     = objBuilderNodeMix1D.MaxChange ?? float.PositiveInfinity;
                if (nodeMix1D.MaxChange <= 0.0f)
                {
                    nodeMix1D.MaxChange = float.PositiveInfinity;
                }
                return(nodeMix1D);
            }
            // ------ tree node add -----------------------
            var objBuilderNodeAdd = objBuilderNode as MyObjectBuilder_AnimationTreeNodeAdd;

            if (objBuilderNodeAdd != null)
            {
                Debug.Fail("Addition node: currently unsupported type of animation tree node.");
            }
            return(null);
        }
            public void Init(MyAnimationClip.Bone bone, AnimationPlayer player)
            {
                this.ClipBone = bone;
                Player = player;

                SetKeyframes();
                SetPosition(0);

                m_isConst = ClipBone.Keyframes.Count == 1;
            }
 public BoneInfo(MyAnimationClip.Bone bone, AnimationPlayer player)
 {
     Init(bone, player);
 }