|
@@ -1,5 +1,6 @@
|
|
/**
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
|
|
+ * @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
*/
|
|
|
|
|
|
THREE.ColladaLoader = function ( manager ) {
|
|
THREE.ColladaLoader = function ( manager ) {
|
|
@@ -438,6 +439,22 @@ THREE.ColladaLoader.prototype = {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ function buildController( data ) {
|
|
|
|
+
|
|
|
|
+ // for now, we only return the id of the skin in order to get the corresponding geometry
|
|
|
|
+
|
|
|
|
+ var keys = Object.keys( data.skin );
|
|
|
|
+
|
|
|
|
+ return { id: keys[ 0 ] };
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getController( id ) {
|
|
|
|
+
|
|
|
|
+ return getBuild( library.controllers[ id ], buildController );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
// image
|
|
// image
|
|
|
|
|
|
function parseImage( xml ) {
|
|
function parseImage( xml ) {
|
|
@@ -1276,9 +1293,6 @@ THREE.ColladaLoader.prototype = {
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
- default:
|
|
|
|
- console.log( child );
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -1525,6 +1539,7 @@ THREE.ColladaLoader.prototype = {
|
|
matrix: new THREE.Matrix4(),
|
|
matrix: new THREE.Matrix4(),
|
|
nodes: [],
|
|
nodes: [],
|
|
instanceCameras: [],
|
|
instanceCameras: [],
|
|
|
|
+ instanceControllers: [],
|
|
instanceLights: [],
|
|
instanceLights: [],
|
|
instanceGeometries: [],
|
|
instanceGeometries: [],
|
|
instanceNodes: []
|
|
instanceNodes: []
|
|
@@ -1553,12 +1568,16 @@ THREE.ColladaLoader.prototype = {
|
|
data.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );
|
|
data.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case 'instance_controller':
|
|
|
|
+ data.instanceControllers.push( parseNodeInstance( child ) );
|
|
|
|
+ break;
|
|
|
|
+
|
|
case 'instance_light':
|
|
case 'instance_light':
|
|
data.instanceLights.push( parseId( child.getAttribute( 'url' ) ) );
|
|
data.instanceLights.push( parseId( child.getAttribute( 'url' ) ) );
|
|
break;
|
|
break;
|
|
|
|
|
|
case 'instance_geometry':
|
|
case 'instance_geometry':
|
|
- data.instanceGeometries.push( parseNodeInstanceGeometry( child ) );
|
|
|
|
|
|
+ data.instanceGeometries.push( parseNodeInstance( child ) );
|
|
break;
|
|
break;
|
|
|
|
|
|
case 'instance_node':
|
|
case 'instance_node':
|
|
@@ -1607,7 +1626,7 @@ THREE.ColladaLoader.prototype = {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- function parseNodeInstanceGeometry( xml ) {
|
|
|
|
|
|
+ function parseNodeInstance( xml ) {
|
|
|
|
|
|
var data = {
|
|
var data = {
|
|
id: parseId( xml.getAttribute( 'url' ) ),
|
|
id: parseId( xml.getAttribute( 'url' ) ),
|
|
@@ -1618,21 +1637,29 @@ THREE.ColladaLoader.prototype = {
|
|
|
|
|
|
var child = xml.childNodes[ i ];
|
|
var child = xml.childNodes[ i ];
|
|
|
|
|
|
- if ( child.nodeName === 'bind_material' ) {
|
|
|
|
|
|
+ switch ( child.nodeName ) {
|
|
|
|
|
|
- var instances = child.getElementsByTagName( 'instance_material' );
|
|
|
|
|
|
+ case 'bind_material':
|
|
|
|
+ var instances = child.getElementsByTagName( 'instance_material' );
|
|
|
|
|
|
- for ( var j = 0; j < instances.length; j ++ ) {
|
|
|
|
|
|
+ for ( var j = 0; j < instances.length; j ++ ) {
|
|
|
|
|
|
- var instance = instances[ j ];
|
|
|
|
- var symbol = instance.getAttribute( 'symbol' );
|
|
|
|
- var target = instance.getAttribute( 'target' );
|
|
|
|
|
|
+ var instance = instances[ j ];
|
|
|
|
+ var symbol = instance.getAttribute( 'symbol' );
|
|
|
|
+ var target = instance.getAttribute( 'target' );
|
|
|
|
|
|
- data.materials[ symbol ] = parseId( target );
|
|
|
|
|
|
+ data.materials[ symbol ] = parseId( target );
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case 'skeleton':
|
|
|
|
+ data.skeleton = parseId( child.textContent );;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1649,6 +1676,7 @@ THREE.ColladaLoader.prototype = {
|
|
var matrix = data.matrix;
|
|
var matrix = data.matrix;
|
|
var nodes = data.nodes;
|
|
var nodes = data.nodes;
|
|
var instanceCameras = data.instanceCameras;
|
|
var instanceCameras = data.instanceCameras;
|
|
|
|
+ var instanceControllers = data.instanceControllers;
|
|
var instanceLights = data.instanceLights;
|
|
var instanceLights = data.instanceLights;
|
|
var instanceGeometries = data.instanceGeometries;
|
|
var instanceGeometries = data.instanceGeometries;
|
|
var instanceNodes = data.instanceNodes;
|
|
var instanceNodes = data.instanceNodes;
|
|
@@ -1665,6 +1693,28 @@ THREE.ColladaLoader.prototype = {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ for ( var i = 0, l = instanceControllers.length; i < l; i ++ ) {
|
|
|
|
+
|
|
|
|
+ var instance = instanceControllers[ i ];
|
|
|
|
+ var controller = getController( instance.id );
|
|
|
|
+ var geometries = getGeometry( controller.id );
|
|
|
|
+
|
|
|
|
+ for ( var key in geometries ) {
|
|
|
|
+
|
|
|
|
+ var object = geometries[ key ].clone();
|
|
|
|
+
|
|
|
|
+ if ( instance.materials[ key ] !== undefined ) {
|
|
|
|
+
|
|
|
|
+ object.material = getMaterial( instance.materials[ key ] );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ objects.push( object );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
for ( var i = 0, l = instanceLights.length; i < l; i ++ ) {
|
|
for ( var i = 0, l = instanceLights.length; i < l; i ++ ) {
|
|
|
|
|
|
objects.push( getLight( instanceLights[ i ] ).clone() );
|
|
objects.push( getLight( instanceLights[ i ] ).clone() );
|
|
@@ -1825,7 +1875,7 @@ THREE.ColladaLoader.prototype = {
|
|
console.time( 'THREE.ColladaLoader: Parse' );
|
|
console.time( 'THREE.ColladaLoader: Parse' );
|
|
|
|
|
|
// parseLibrary( collada, 'library_animations', 'animation', parseAnimation );
|
|
// parseLibrary( collada, 'library_animations', 'animation', parseAnimation );
|
|
- // parseLibrary( collada, 'library_controllers', 'controller', parseController );
|
|
|
|
|
|
+ parseLibrary( collada, 'library_controllers', 'controller', parseController );
|
|
parseLibrary( collada, 'library_images', 'image', parseImage );
|
|
parseLibrary( collada, 'library_images', 'image', parseImage );
|
|
parseLibrary( collada, 'library_effects', 'effect', parseEffect );
|
|
parseLibrary( collada, 'library_effects', 'effect', parseEffect );
|
|
parseLibrary( collada, 'library_materials', 'material', parseMaterial );
|
|
parseLibrary( collada, 'library_materials', 'material', parseMaterial );
|
|
@@ -1839,13 +1889,13 @@ THREE.ColladaLoader.prototype = {
|
|
|
|
|
|
console.time( 'THREE.ColladaLoader: Build' );
|
|
console.time( 'THREE.ColladaLoader: Build' );
|
|
|
|
|
|
|
|
+ buildLibrary( library.controllers, buildController );
|
|
buildLibrary( library.images, buildImage );
|
|
buildLibrary( library.images, buildImage );
|
|
buildLibrary( library.effects, buildEffect );
|
|
buildLibrary( library.effects, buildEffect );
|
|
buildLibrary( library.materials, buildMaterial );
|
|
buildLibrary( library.materials, buildMaterial );
|
|
buildLibrary( library.cameras, buildCamera );
|
|
buildLibrary( library.cameras, buildCamera );
|
|
buildLibrary( library.lights, buildLight );
|
|
buildLibrary( library.lights, buildLight );
|
|
buildLibrary( library.geometries, buildGeometry );
|
|
buildLibrary( library.geometries, buildGeometry );
|
|
- // buildLibrary( library.nodes, buildNode );
|
|
|
|
buildLibrary( library.visualScenes, buildVisualScene );
|
|
buildLibrary( library.visualScenes, buildVisualScene );
|
|
|
|
|
|
console.timeEnd( 'THREE.ColladaLoader: Build' );
|
|
console.timeEnd( 'THREE.ColladaLoader: Build' );
|