Spaces:
Running
Running
| import { Matrix4 } from '../math/Matrix4.js'; | |
| /** | |
| * @author mikael emtinger / http://gomo.se/ | |
| * @author alteredq / http://alteredqualia.com/ | |
| * @author michael guerrero / http://realitymeltdown.com | |
| * @author ikerr / http://verold.com | |
| */ | |
| function Skeleton( bones, boneInverses ) { | |
| // copy the bone array | |
| bones = bones || []; | |
| this.bones = bones.slice( 0 ); | |
| this.boneMatrices = new Float32Array( this.bones.length * 16 ); | |
| // use the supplied bone inverses or calculate the inverses | |
| if ( boneInverses === undefined ) { | |
| this.calculateInverses(); | |
| } else { | |
| if ( this.bones.length === boneInverses.length ) { | |
| this.boneInverses = boneInverses.slice( 0 ); | |
| } else { | |
| console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); | |
| this.boneInverses = []; | |
| for ( var i = 0, il = this.bones.length; i < il; i ++ ) { | |
| this.boneInverses.push( new Matrix4() ); | |
| } | |
| } | |
| } | |
| } | |
| Object.assign( Skeleton.prototype, { | |
| calculateInverses: function () { | |
| this.boneInverses = []; | |
| for ( var i = 0, il = this.bones.length; i < il; i ++ ) { | |
| var inverse = new Matrix4(); | |
| if ( this.bones[ i ] ) { | |
| inverse.getInverse( this.bones[ i ].matrixWorld ); | |
| } | |
| this.boneInverses.push( inverse ); | |
| } | |
| }, | |
| pose: function () { | |
| var bone, i, il; | |
| // recover the bind-time world matrices | |
| for ( i = 0, il = this.bones.length; i < il; i ++ ) { | |
| bone = this.bones[ i ]; | |
| if ( bone ) { | |
| bone.matrixWorld.getInverse( this.boneInverses[ i ] ); | |
| } | |
| } | |
| // compute the local matrices, positions, rotations and scales | |
| for ( i = 0, il = this.bones.length; i < il; i ++ ) { | |
| bone = this.bones[ i ]; | |
| if ( bone ) { | |
| if ( bone.parent && bone.parent.isBone ) { | |
| bone.matrix.getInverse( bone.parent.matrixWorld ); | |
| bone.matrix.multiply( bone.matrixWorld ); | |
| } else { | |
| bone.matrix.copy( bone.matrixWorld ); | |
| } | |
| bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); | |
| } | |
| } | |
| }, | |
| update: ( function () { | |
| var offsetMatrix = new Matrix4(); | |
| var identityMatrix = new Matrix4(); | |
| return function update() { | |
| var bones = this.bones; | |
| var boneInverses = this.boneInverses; | |
| var boneMatrices = this.boneMatrices; | |
| var boneTexture = this.boneTexture; | |
| // flatten bone matrices to array | |
| for ( var i = 0, il = bones.length; i < il; i ++ ) { | |
| // compute the offset between the current and the original transform | |
| var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; | |
| offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); | |
| offsetMatrix.toArray( boneMatrices, i * 16 ); | |
| } | |
| if ( boneTexture !== undefined ) { | |
| boneTexture.needsUpdate = true; | |
| } | |
| }; | |
| } )(), | |
| clone: function () { | |
| return new Skeleton( this.bones, this.boneInverses ); | |
| }, | |
| getBoneByName: function ( name ) { | |
| for ( var i = 0, il = this.bones.length; i < il; i ++ ) { | |
| var bone = this.bones[ i ]; | |
| if ( bone.name === name ) { | |
| return bone; | |
| } | |
| } | |
| return undefined; | |
| } | |
| } ); | |
| export { Skeleton }; | |