|
@@ -30,6 +30,9 @@ import { LineLoop } from '../objects/LineLoop.js';
|
|
|
import { LineSegments } from '../objects/LineSegments.js';
|
|
|
import { LOD } from '../objects/LOD.js';
|
|
|
import { Mesh } from '../objects/Mesh.js';
|
|
|
+import { SkinnedMesh } from '../objects/SkinnedMesh.js';
|
|
|
+import { Bone } from '../objects/Bone.js';
|
|
|
+import { Skeleton } from '../objects/Skeleton.js';
|
|
|
import { Shape } from '../extras/core/Shape.js';
|
|
|
import { Fog } from '../scenes/Fog.js';
|
|
|
import { FogExp2 } from '../scenes/FogExp2.js';
|
|
@@ -110,7 +113,7 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
parse( json, onLoad ) {
|
|
|
|
|
|
- const shapes = this.parseShape( json.shapes );
|
|
|
+ const shapes = this.parseShapes( json.shapes );
|
|
|
const geometries = this.parseGeometries( json.geometries, shapes );
|
|
|
|
|
|
const images = this.parseImages( json.images, function () {
|
|
@@ -123,6 +126,9 @@ class ObjectLoader extends Loader {
|
|
|
const materials = this.parseMaterials( json.materials, textures );
|
|
|
|
|
|
const object = this.parseObject( json.object, geometries, materials );
|
|
|
+ const skeletons = this.parseSkeletons( json.skeletons, object );
|
|
|
+
|
|
|
+ this.bindSkeletons( object, skeletons );
|
|
|
|
|
|
if ( json.animations ) {
|
|
|
|
|
@@ -140,7 +146,7 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
}
|
|
|
|
|
|
- parseShape( json ) {
|
|
|
+ parseShapes( json ) {
|
|
|
|
|
|
const shapes = {};
|
|
|
|
|
@@ -160,6 +166,37 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ parseSkeletons( json, object ) {
|
|
|
+
|
|
|
+ const skeletons = {};
|
|
|
+ const bones = {};
|
|
|
+
|
|
|
+ // generate bone lookup table
|
|
|
+
|
|
|
+ object.traverse( function ( child ) {
|
|
|
+
|
|
|
+ if ( child.isBone ) bones[ child.uuid ] = child;
|
|
|
+
|
|
|
+ } );
|
|
|
+
|
|
|
+ // create skeletons
|
|
|
+
|
|
|
+ if ( json !== undefined ) {
|
|
|
+
|
|
|
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ const skeleton = new Skeleton().fromJSON( json[ i ], bones );
|
|
|
+
|
|
|
+ skeletons[ skeleton.uuid ] = skeleton;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return skeletons;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
parseGeometries( json, shapes ) {
|
|
|
|
|
|
const geometries = {};
|
|
@@ -826,7 +863,16 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
case 'SkinnedMesh':
|
|
|
|
|
|
- console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );
|
|
|
+ geometry = getGeometry( data.geometry );
|
|
|
+ material = getMaterial( data.material );
|
|
|
+
|
|
|
+ object = new SkinnedMesh( geometry, material );
|
|
|
+
|
|
|
+ if ( data.bindMode !== undefined ) object.bindMode = data.bindMode;
|
|
|
+ if ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );
|
|
|
+ if ( data.skeleton !== undefined ) object.skeleton = data.skeleton;
|
|
|
+
|
|
|
+ break;
|
|
|
|
|
|
case 'Mesh':
|
|
|
|
|
@@ -892,6 +938,12 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
break;
|
|
|
|
|
|
+ case 'Bone':
|
|
|
+
|
|
|
+ object = new Bone();
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
|
|
|
object = new Object3D();
|
|
@@ -974,6 +1026,32 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ bindSkeletons( object, skeletons ) {
|
|
|
+
|
|
|
+ if ( Object.keys( skeletons ).length === 0 ) return;
|
|
|
+
|
|
|
+ object.traverse( function ( child ) {
|
|
|
+
|
|
|
+ if ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {
|
|
|
+
|
|
|
+ const skeleton = skeletons[ child.skeleton ];
|
|
|
+
|
|
|
+ if ( skeleton === undefined ) {
|
|
|
+
|
|
|
+ console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ child.bind( skeleton, child.bindMatrix );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/* DEPRECATED */
|
|
|
|
|
|
setTexturePath( value ) {
|