public void verifyAnimation(SSSkeletalAnimation animation) { if (this.numJoints != animation.numJoints) { string str = string.Format( "Joint number mismatch: {0} in md5mesh, {1} in md5anim", this.numJoints, animation.numJoints); Console.WriteLine(str); throw new Exception(str); } for (int j = 0; j < numJoints; ++j) { SSSkeletalJoint thisJointInfo = this._joints [j].baseInfo; SSSkeletalJoint animJointInfo = animation.jointHierarchy [j]; if (thisJointInfo.name != animJointInfo.name) { string str = string.Format( "Joint name mismatch: {0} in md5mesh, {1} in md5anim", thisJointInfo.name, animJointInfo.name); Console.WriteLine(str); throw new Exception(str); } if (thisJointInfo.parentIndex != animJointInfo.parentIndex) { string str = string.Format( "Hierarchy parent mismatch for joint \"{0}\": {1} in md5mesh, {2} in md5anim", thisJointInfo.name, thisJointInfo.parentIndex, animJointInfo.parentIndex); Console.WriteLine(str); throw new Exception(str); } } }
/// <summary> /// This can be used to loop an animation without having to set up a state machine explicitly /// For a more sophisticated control use AddController() /// </summary> public void playAnimationLoop(SSSkeletalAnimation anim, float transitionTime = 0f, int[] topLevelJoints = null) { _hierarchy.verifyAnimation(anim); var loopSM = new SSAnimationStateMachine(); loopSM.addState("default", anim, true); loopSM.addAnimationEndsTransition("default", "default", transitionTime); if (topLevelJoints == null) { topLevelJoints = _hierarchy.topLevelJoints; } var loopController = new SSAnimationStateMachineSkeletalController(loopSM, topLevelJoints); addController(loopController); }
/// <summary> /// Update the animation channel based on time elapsed. /// </summary> /// <param name="timeElapsed">Time elapsed in seconds</param> public void update(float timeElapsed) { #if PREV_PREV_FADE if (_prevPrevAnimation != null) { _prevPrevT += timeElapsed; if (_prevPrevT >= _prevTransitionTime) { _prevPrevAnimation = null; _prevPrevT = 0f; } } #endif if (_prevAnimation != null) { _prevT += timeElapsed; if (_prevT >= _prevTimeout) { _prevAnimation = null; _prevT = 0f; } } if (_currAnimation != null) { _currT += timeElapsed; if (_currT >= _transitionTime) { _transitionTime = 0; } if (_currT >= _currAnimation.totalDuration) { _currAnimation = null; _currT = 0; } } else if (_currT < _transitionTime) { // maintain FadeIn ratio for use with interchannel interpolation _currT += timeElapsed; } }
public void playAnimation(SSSkeletalAnimation animation, float transitionTime) { //System.Console.WriteLine ("play: {0}, repeat: {1}, transitionTime {2}, ichf: {3}", // animation != null ? animation.Name : "null", repeat, transitionTime, interChannelFade); // update "previous" variables if (transitionTime == 0f) { _prevAnimation = null; _prevT = 0f; #if PREV_PREV_FADE _prevPrevAnimation = null; _prevPrevT = 0f; #endif } else // transitionTime != 0f { if (_currAnimation != null) { #if PREV_PREV_FADE if (_prevAnimation != null && _prevT < _transitionTime) { // update "previous" previous variables _prevPrevT = _prevT; _prevPrevAnimation = _prevAnimation; _prevTransitionTime = _transitionTime; } #endif _prevAnimation = _currAnimation; _prevT = _currT; } if (_prevAnimation != null) { _prevTimeout = _prevT + transitionTime; } } _currAnimation = animation; _currT = 0; _transitionTime = transitionTime; }
//----------------- /// <summary> /// Adds an animation state /// </summary> /// <param name="stateName">State name.</param> /// <param name="makeDefault">If set to <c>true</c> forces the state machine into this state.</param> public void addState(string stateName, SSSkeletalAnimation animation, bool makeDefault = false) { if (makeDefault) { foreach (var state in _animationStates.Values) { if (state.isDefault) { var errMsg = "Default state already defined."; System.Console.WriteLine (errMsg); throw new Exception (errMsg); } } } var newState = new AnimationState (); newState.isDefault = makeDefault; newState.animation = animation; _animationStates.Add (stateName, newState); }
//----------------- /// <summary> /// Adds an animation state /// </summary> /// <param name="stateName">State name.</param> /// <param name="makeDefault">If set to <c>true</c> forces the state machine into this state.</param> public void addState(string stateName, SSSkeletalAnimation animation, bool makeDefault = false) { if (makeDefault) { foreach (var state in _animationStates.Values) { if (state.isDefault) { var errMsg = "Default state already defined."; System.Console.WriteLine(errMsg); throw new Exception(errMsg); } } } var newState = new AnimationState(); newState.isDefault = makeDefault; newState.animation = animation; _animationStates.Add(stateName, newState); }
public void verifyAnimation(SSSkeletalAnimation animation) { if (this.numJoints != animation.numJoints) { string str = string.Format ( "Joint number mismatch: {0} in md5mesh, {1} in md5anim", this.numJoints, animation.numJoints); Console.WriteLine (str); throw new Exception (str); } for (int j = 0; j < numJoints; ++j) { SSSkeletalJoint thisJointInfo = this._joints [j].baseInfo; SSSkeletalJoint animJointInfo = animation.jointHierarchy [j]; if (thisJointInfo.name != animJointInfo.name) { string str = string.Format ( "Joint name mismatch: {0} in md5mesh, {1} in md5anim", thisJointInfo.name, animJointInfo.name); Console.WriteLine (str); throw new Exception (str); } if (thisJointInfo.parentIndex != animJointInfo.parentIndex) { string str = string.Format ( "Hierarchy parent mismatch for joint \"{0}\": {1} in md5mesh, {2} in md5anim", thisJointInfo.name, thisJointInfo.parentIndex, animJointInfo.parentIndex); Console.WriteLine (str); throw new Exception (str); } } }
public void playAnimationLoop(SSSkeletalAnimation anim, float transitionTime = 0f, params string[] topLevelJointNames) { playAnimationLoop(anim, transitionTime, _hierarchy.jointIndices(topLevelJointNames)); }
public void playAnimation(SSSkeletalAnimation animation, float transitionTime) { //System.Console.WriteLine ("play: {0}, repeat: {1}, transitionTime {2}, ichf: {3}", // animation != null ? animation.Name : "null", repeat, transitionTime, interChannelFade); // update "previous" variables if (transitionTime == 0f) { _prevAnimation = null; _prevT = 0f; #if PREV_PREV_FADE _prevPrevAnimation = null; _prevPrevT = 0f; #endif } else { // transitionTime != 0f if (_currAnimation != null) { #if PREV_PREV_FADE if (_prevAnimation != null && _prevT < _transitionTime) { // update "previous" previous variables _prevPrevT = _prevT; _prevPrevAnimation = _prevAnimation; _prevTransitionTime = _transitionTime; } #endif _prevAnimation = _currAnimation; _prevT = _currT; } if (_prevAnimation != null) { _prevTimeout = _prevT + transitionTime; } } _currAnimation = animation; _currT = 0; _transitionTime = transitionTime; }