| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /**
- * @author alteredq / http://alteredqualia.com/
- */
- THREE.MorphAnimMesh = function ( geometry, material ) {
- THREE.Mesh.call( this, geometry, material );
- // API
- this.duration = 1000; // milliseconds
- this.mirroredLoop = false;
- this.time = 0;
- // internals
- this.lastKeyframe = 0;
- this.currentKeyframe = 0;
- this.direction = 1;
- this.directionBackwards = false;
- this.setFrameRange( 0, this.geometry.morphTargets.length - 1 );
- };
- THREE.MorphAnimMesh.prototype = Object.create( THREE.Mesh.prototype );
- THREE.MorphAnimMesh.prototype.setFrameRange = function ( start, end ) {
- this.startKeyframe = start;
- this.endKeyframe = end;
- this.length = this.endKeyframe - this.startKeyframe + 1;
- };
- THREE.MorphAnimMesh.prototype.setDirectionForward = function () {
- this.direction = 1;
- this.directionBackwards = false;
- };
- THREE.MorphAnimMesh.prototype.setDirectionBackward = function () {
- this.direction = -1;
- this.directionBackwards = true;
- };
- THREE.MorphAnimMesh.prototype.parseAnimations = function () {
- var geometry = this.geometry;
- if ( ! geometry.animations ) geometry.animations = {};
- var firstAnimation, animations = geometry.animations;
- var pattern = /([a-z]+)(\d+)/;
- for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {
- var morph = geometry.morphTargets[ i ];
- var parts = morph.name.match( pattern );
- if ( parts && parts.length > 1 ) {
- var label = parts[ 1 ];
- var num = parts[ 2 ];
- if ( ! animations[ label ] ) animations[ label ] = { start: Infinity, end: -Infinity };
- var animation = animations[ label ];
- if ( i < animation.start ) animation.start = i;
- if ( i > animation.end ) animation.end = i;
- if ( ! firstAnimation ) firstAnimation = label;
- }
- }
- geometry.firstAnimation = firstAnimation;
- };
- THREE.MorphAnimMesh.prototype.setAnimationLabel = function ( label, start, end ) {
- if ( ! this.geometry.animations ) this.geometry.animations = {};
- this.geometry.animations[ label ] = { start: start, end: end };
- };
- THREE.MorphAnimMesh.prototype.playAnimation = function ( label, fps ) {
- var animation = this.geometry.animations[ label ];
- if ( animation ) {
- this.setFrameRange( animation.start, animation.end );
- this.duration = 1000 * ( ( animation.end - animation.start ) / fps );
- this.time = 0;
- } else {
- console.warn( "animation[" + label + "] undefined" );
- }
- };
- THREE.MorphAnimMesh.prototype.updateAnimation = function ( delta ) {
- var frameTime = this.duration / this.length;
- this.time += this.direction * delta;
- if ( this.mirroredLoop ) {
- if ( this.time > this.duration || this.time < 0 ) {
- this.direction *= -1;
- if ( this.time > this.duration ) {
- this.time = this.duration;
- this.directionBackwards = true;
- }
- if ( this.time < 0 ) {
- this.time = 0;
- this.directionBackwards = false;
- }
- }
- } else {
- this.time = this.time % this.duration;
- if ( this.time < 0 ) this.time += this.duration;
- }
- var keyframe = this.startKeyframe + THREE.Math.clamp( Math.floor( this.time / frameTime ), 0, this.length - 1 );
- if ( keyframe !== this.currentKeyframe ) {
- this.morphTargetInfluences[ this.lastKeyframe ] = 0;
- this.morphTargetInfluences[ this.currentKeyframe ] = 1;
- this.morphTargetInfluences[ keyframe ] = 0;
- this.lastKeyframe = this.currentKeyframe;
- this.currentKeyframe = keyframe;
- }
- var mix = ( this.time % frameTime ) / frameTime;
- if ( this.directionBackwards ) {
- mix = 1 - mix;
- }
- this.morphTargetInfluences[ this.currentKeyframe ] = mix;
- this.morphTargetInfluences[ this.lastKeyframe ] = 1 - mix;
- };
|