// --------------- 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); }
// 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); }
// 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; } }
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); } } }
// 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); }