| import { Matrix4 } from '../math/Matrix4.js'; |
|
|
| |
| |
| |
| |
| |
| |
|
|
| function Skeleton( bones, boneInverses ) { |
|
|
| |
|
|
| bones = bones || []; |
|
|
| this.bones = bones.slice( 0 ); |
| this.boneMatrices = new Float32Array( this.bones.length * 16 ); |
|
|
| |
|
|
| 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; |
|
|
| |
|
|
| for ( i = 0, il = this.bones.length; i < il; i ++ ) { |
|
|
| bone = this.bones[ i ]; |
|
|
| if ( bone ) { |
|
|
| bone.matrixWorld.getInverse( this.boneInverses[ i ] ); |
|
|
| } |
|
|
| } |
|
|
| |
|
|
| 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; |
|
|
| |
|
|
| for ( var i = 0, il = bones.length; i < il; i ++ ) { |
|
|
| |
|
|
| 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 }; |
|
|