/** * @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; }; THREE.MorphAnimMesh.prototype = new THREE.Mesh(); THREE.MorphAnimMesh.prototype.constructor = THREE.MorphAnimMesh; THREE.MorphAnimMesh.prototype.updateAnimation = function ( delta ) { var frameTime = this.duration / ( this.geometry.morphTargets.length - 1 ); 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; } var keyframe = THREE.Math.clamp( Math.floor( this.time / frameTime ), 0, this.geometry.morphTargets.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; };