// Constructor of node having single animation.
 // Parameter animationClip must not be null.
 public MyAnimationStateMachineNode(string name, MyAnimationClip animationClip)
     : base(name)
 {
     if (animationClip != null)
     {
         var nodeTrack = new MyAnimationTreeNodeTrack();
         nodeTrack.SetClip(animationClip);
         m_rootAnimationNode = nodeTrack;
     }
     else
     {
         Debug.Fail("Creating single animation node in machine " + this.Name + ", node name "
         + name + ": Animation clip must not be null!");            
     }
 }
 // Constructor of node having single animation.
 // Parameter animationClip must not be null.
 public MyAnimationStateMachineNode(string name, MyAnimationClip animationClip)
     : base(name)
 {
     if (animationClip != null)
     {
         var nodeTrack = new MyAnimationTreeNodeTrack();
         nodeTrack.SetClip(animationClip);
         m_rootAnimationNode = nodeTrack;
     }
     else
     {
         Debug.Fail("Creating single animation node in machine " + this.Name + ", node name "
                    + name + ": Animation clip must not be null!");
     }
 }
 // Initialize animation tree of the state machine node.
 private static MyAnimationTreeNode InitNodeAnimationTree(VRage.Game.ObjectBuilders.MyObjectBuilder_AnimationTreeNode objBuilderNode, bool forceReloadMwm)
 {
     // ------- 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, forceReloadMwm) : null;
         if (modelAnimation != null && modelAnimation.Animations != null && modelAnimation.Animations.Clips != null && modelAnimation.Animations.Clips.Count > 0)
         {
             VRageRender.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;
             nodeTrack.SynchronizeWithLayer = objBuilderNodeTrack.SynchronizeWithLayer;
         }
         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, forceReloadMwm)
                 };
                 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;
 }