/**
|
|
* @author Michael Guerrero / http://realitymeltdown.com
|
|
*/
|
|
|
|
THREE.BlendCharacter = function () {
|
|
|
|
this.animations = {};
|
|
this.weightSchedule = [];
|
|
this.warpSchedule = [];
|
|
|
|
this.load = function ( url, onLoad ) {
|
|
|
|
var scope = this;
|
|
|
|
var loader = new THREE.JSONLoader();
|
|
loader.load( url, function( geometry, materials ) {
|
|
|
|
var originalMaterial = materials[ 0 ];
|
|
originalMaterial.skinning = true;
|
|
|
|
THREE.SkinnedMesh.call( scope, geometry, originalMaterial );
|
|
|
|
scope.mixer = new THREE.AnimationMixer( scope );
|
|
|
|
// Create the animations
|
|
for ( var i = 0; i < geometry.animations.length; ++ i ) {
|
|
|
|
var animName = geometry.animations[ i ].name;
|
|
scope.animations[ animName ] = geometry.animations[ i ];
|
|
|
|
}
|
|
|
|
// Loading is complete, fire the callback
|
|
if ( onLoad !== undefined ) onLoad();
|
|
|
|
} );
|
|
|
|
};
|
|
|
|
this.update = function( dt ) {
|
|
|
|
this.mixer.update( dt );
|
|
|
|
};
|
|
|
|
this.play = function( animName, weight ) {
|
|
|
|
this.mixer.removeAllActions();
|
|
|
|
this.mixer.play( new THREE.AnimationAction( this.animations[ animName ] ) );
|
|
|
|
};
|
|
|
|
this.crossfade = function( fromAnimName, toAnimName, duration ) {
|
|
|
|
this.mixer.removeAllActions();
|
|
|
|
var fromAction = new THREE.AnimationAction( this.animations[ fromAnimName ] );
|
|
var toAction = new THREE.AnimationAction( this.animations[ toAnimName ] );
|
|
|
|
this.mixer.play( fromAction );
|
|
this.mixer.play( toAction );
|
|
|
|
this.mixer.crossFade( fromAction, toAction, duration, false );
|
|
|
|
};
|
|
|
|
this.warp = function( fromAnimName, toAnimName, duration ) {
|
|
|
|
this.mixer.removeAllActions();
|
|
|
|
var fromAction = new THREE.AnimationAction( this.animations[ fromAnimName ] );
|
|
var toAction = new THREE.AnimationAction( this.animations[ toAnimName ] );
|
|
|
|
this.mixer.play( fromAction );
|
|
this.mixer.play( toAction );
|
|
|
|
this.mixer.crossFade( fromAction, toAction, duration, true );
|
|
|
|
};
|
|
|
|
this.applyWeight = function( animName, weight ) {
|
|
|
|
var action = this.mixer.findActionByName( animName );
|
|
if( action ) {
|
|
action.weight = weight;
|
|
}
|
|
|
|
};
|
|
|
|
this.pauseAll = function() {
|
|
|
|
this.mixer.timeScale = 0;
|
|
|
|
};
|
|
|
|
this.unPauseAll = function() {
|
|
|
|
this.mixer.timeScale = 1;
|
|
|
|
};
|
|
|
|
|
|
this.stopAll = function() {
|
|
|
|
this.mixer.removeAllActions();
|
|
|
|
};
|
|
|
|
this.showModel = function( boolean ) {
|
|
|
|
this.visible = boolean;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
THREE.BlendCharacter.prototype = Object.create( THREE.SkinnedMesh.prototype );
|
|
THREE.BlendCharacter.prototype.constructor = THREE.BlendCharacter;
|
|
|
|
THREE.BlendCharacter.prototype.getForward = function() {
|
|
|
|
var forward = new THREE.Vector3();
|
|
|
|
return function() {
|
|
|
|
// pull the character's forward basis vector out of the matrix
|
|
forward.set(
|
|
- this.matrix.elements[ 8 ],
|
|
- this.matrix.elements[ 9 ],
|
|
- this.matrix.elements[ 10 ]
|
|
);
|
|
|
|
return forward;
|
|
|
|
}
|
|
|
|
};
|
|
|