Browse Source

Animation: Tightened skeletal animation parser.

tschw 9 years ago
parent
commit
2da36b14e7
1 changed files with 25 additions and 15 deletions
  1. 25 15
      src/animation/AnimationClip.js

+ 25 - 15
src/animation/AnimationClip.js

@@ -216,17 +216,26 @@ Object.assign( THREE.AnimationClip, {
 
 		}
 
-		var convertTrack = function( trackName, animationKeys, propertyName, trackType ) {
+		var addNonemptyTrack = function(
+				trackType, trackName, animationKeys, propertyName, destTracks ) {
 
 			// only return track if there are actually keys.
-			if ( animationKeys.length === 0 ) return null;
+			if ( animationKeys.length !== 0 ) {
 
-			var times = [];
-			var values = [];
+				var times = [];
+				var values = [];
+
+				THREE.AnimationUtils.flattenJSON(
+						animationKeys, times, values, propertyName );
+
+				// empty keys are filtered out, so check again
+				if ( times.length !== 0 ) {
 
-			THREE.AnimationUtils.flattenJSON( animationKeys, times, values, propertyName );
+					destTracks.push( new trackType( trackName, times, values ) );
 
-			return new trackType( trackName, times, values );
+				}
+
+			}
 
 		};
 
@@ -291,20 +300,21 @@ Object.assign( THREE.AnimationClip, {
 				duration = morphTargetNames.length * ( fps || 1.0 );
 
 			} else {
+				// ...assume skeletal animation
 
 				var boneName = '.bones[' + bones[ h ].name + ']';
 
-				// track contains positions...
-				var positionTrack = convertTrack( boneName + '.position', animationKeys, 'pos', THREE.VectorKeyframeTrack );
-				if ( positionTrack ) tracks.push( positionTrack );
+				addNonemptyTrack(
+						THREE.VectorKeyframeTrack, boneName + '.position',
+						animationKeys, 'pos', tracks );
 
-				// track contains quaternions...
-				var quaternionTrack = convertTrack( boneName + '.quaternion', animationKeys, 'rot', THREE.QuaternionKeyframeTrack );
-				if ( quaternionTrack ) tracks.push( quaternionTrack );
+				addNonemptyTrack(
+						THREE.QuaternionKeyframeTrack, boneName + '.quaternion',
+						animationKeys, 'rot', tracks );
 
-				// track contains quaternions...
-				var scaleTrack = convertTrack( boneName + '.scale', animationKeys, 'scl', THREE.VectorKeyframeTrack );
-				if ( scaleTrack ) tracks.push( scaleTrack );
+				addNonemptyTrack(
+						THREE.VectorKeyframeTrack, boneName + '.scale',
+						animationKeys, 'scl', tracks );
 
 			}