|
@@ -158,6 +158,79 @@ var AnimationUtils = {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ },
|
|
|
+
|
|
|
+ subclip: function ( sourceClip, name, startFrame, endFrame, fps ) {
|
|
|
+
|
|
|
+ fps = fps || 30;
|
|
|
+
|
|
|
+ var clip = sourceClip.clone();
|
|
|
+
|
|
|
+ clip.name = name;
|
|
|
+
|
|
|
+ var tracks = [];
|
|
|
+
|
|
|
+ for ( var i = 0; i < clip.tracks.length; ++ i ) {
|
|
|
+
|
|
|
+ var track = clip.tracks[ i ];
|
|
|
+ var valueSize = track.getValueSize();
|
|
|
+
|
|
|
+ var times = [];
|
|
|
+ var values = [];
|
|
|
+
|
|
|
+ for ( var j = 0; j < track.times.length; ++ j ) {
|
|
|
+
|
|
|
+ var frame = track.times[ j ] * fps;
|
|
|
+
|
|
|
+ if ( frame < startFrame || frame >= endFrame ) continue;
|
|
|
+
|
|
|
+ times.push( track.times[ j ] );
|
|
|
+
|
|
|
+ for ( var k = 0; k < valueSize; ++ k ) {
|
|
|
+
|
|
|
+ values.push( track.values[ j * valueSize + k ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( times.length === 0 ) continue;
|
|
|
+
|
|
|
+ track.times = AnimationUtils.convertArray( times, track.times.constructor );
|
|
|
+ track.values = AnimationUtils.convertArray( values, track.values.constructor );
|
|
|
+
|
|
|
+ tracks.push( track );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ clip.tracks = tracks;
|
|
|
+
|
|
|
+ // find minimum .times value across all tracks in the trimmed clip
|
|
|
+
|
|
|
+ var minStartTime = Infinity;
|
|
|
+
|
|
|
+ for ( var i = 0; i < clip.tracks.length; ++ i ) {
|
|
|
+
|
|
|
+ if ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {
|
|
|
+
|
|
|
+ minStartTime = clip.tracks[ i ].times[ 0 ];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // shift all tracks such that clip begins at t=0
|
|
|
+
|
|
|
+ for ( var i = 0; i < clip.tracks.length; ++ i ) {
|
|
|
+
|
|
|
+ clip.tracks[ i ].shift( - 1 * minStartTime );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ clip.resetDuration();
|
|
|
+
|
|
|
+ return clip;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
};
|