|
@@ -254,11 +254,16 @@ THREE.ColladaLoader.prototype = {
|
|
|
|
|
|
// geometry
|
|
|
|
|
|
+ var lineMaterial = new THREE.LineBasicMaterial();
|
|
|
+ var meshMaterial = new THREE.MeshPhongMaterial();
|
|
|
+
|
|
|
function parseGeometry( xml ) {
|
|
|
|
|
|
var data = {
|
|
|
id: xml.getAttribute( 'id' ),
|
|
|
- sources: {}
|
|
|
+ name: xml.getAttribute( 'name' ),
|
|
|
+ sources: {},
|
|
|
+ primitives: []
|
|
|
};
|
|
|
|
|
|
var mesh = xml.getElementsByTagName( 'mesh' )[ 0 ];
|
|
@@ -287,7 +292,7 @@ THREE.ColladaLoader.prototype = {
|
|
|
case 'linestrips':
|
|
|
case 'polylist':
|
|
|
case 'triangles':
|
|
|
- data.primitive = parseGeometryPrimitive( child );
|
|
|
+ data.primitives.push( parseGeometryPrimitive( child ) );
|
|
|
break;
|
|
|
|
|
|
default:
|
|
@@ -299,119 +304,139 @@ THREE.ColladaLoader.prototype = {
|
|
|
|
|
|
//
|
|
|
|
|
|
- if ( data.primitive === undefined ) return;
|
|
|
+ var group = new THREE.Group();
|
|
|
|
|
|
var sources = data.sources;
|
|
|
- var primitive = data.primitive;
|
|
|
+ var primitives = data.primitives;
|
|
|
|
|
|
- var inputs = primitive.inputs;
|
|
|
- var stride = primitive.stride;
|
|
|
- var vcount = primitive.vcount;
|
|
|
+ if ( primitives.length === 0 ) return group;
|
|
|
|
|
|
- var indices = primitive.p;
|
|
|
- var vcount = primitive.vcount;
|
|
|
+ for ( var p = 0; p < primitives.length; p ++ ) {
|
|
|
|
|
|
- var maxcount = 0;
|
|
|
+ var primitive = primitives[ p ];
|
|
|
|
|
|
- var geometry = new THREE.BufferGeometry();
|
|
|
+ var inputs = primitive.inputs;
|
|
|
+ var stride = primitive.stride;
|
|
|
+ var vcount = primitive.vcount;
|
|
|
|
|
|
- for ( var name in inputs ) {
|
|
|
+ var indices = primitive.p;
|
|
|
+ var vcount = primitive.vcount;
|
|
|
|
|
|
- var input = inputs[ name ];
|
|
|
+ var maxcount = 0;
|
|
|
|
|
|
- var source = sources[ input.id ];
|
|
|
- var offset = input.offset;
|
|
|
+ var geometry = new THREE.BufferGeometry();
|
|
|
+ if ( data.name ) geometry.name = data.name;
|
|
|
|
|
|
- var array = [];
|
|
|
+ for ( var name in inputs ) {
|
|
|
|
|
|
- function pushVector( i ) {
|
|
|
+ var input = inputs[ name ];
|
|
|
|
|
|
- var index = indices[ i + offset ] * 3;
|
|
|
- array.push( source[ index + 0 ], source[ index + 1 ], source[ index + 2 ] );
|
|
|
+ var source = sources[ input.id ];
|
|
|
+ var offset = input.offset;
|
|
|
|
|
|
- }
|
|
|
+ var array = [];
|
|
|
+
|
|
|
+ function pushVector( i ) {
|
|
|
+
|
|
|
+ var index = indices[ i + offset ] * 3;
|
|
|
+ array.push( source[ index + 0 ], source[ index + 1 ], source[ index + 2 ] );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- if ( primitive.vcount !== undefined ) {
|
|
|
+ if ( primitive.vcount !== undefined ) {
|
|
|
|
|
|
- var index = 0;
|
|
|
+ var index = 0;
|
|
|
|
|
|
- for ( var i = 0, l = vcount.length; i < l; i ++ ) {
|
|
|
+ for ( var i = 0, l = vcount.length; i < l; i ++ ) {
|
|
|
|
|
|
- var count = vcount[ i ];
|
|
|
+ var count = vcount[ i ];
|
|
|
|
|
|
- if ( count === 4 ) {
|
|
|
+ if ( count === 4 ) {
|
|
|
|
|
|
- var a = index + stride * 0;
|
|
|
- var b = index + stride * 1;
|
|
|
- var c = index + stride * 2;
|
|
|
- var d = index + stride * 3;
|
|
|
+ var a = index + stride * 0;
|
|
|
+ var b = index + stride * 1;
|
|
|
+ var c = index + stride * 2;
|
|
|
+ var d = index + stride * 3;
|
|
|
|
|
|
- pushVector( a ); pushVector( b ); pushVector( d );
|
|
|
- pushVector( b ); pushVector( c ); pushVector( d );
|
|
|
+ pushVector( a ); pushVector( b ); pushVector( d );
|
|
|
+ pushVector( b ); pushVector( c ); pushVector( d );
|
|
|
|
|
|
- } else if ( count === 3 ) {
|
|
|
+ } else if ( count === 3 ) {
|
|
|
|
|
|
- var a = index + stride * 0;
|
|
|
- var b = index + stride * 1;
|
|
|
- var c = index + stride * 2;
|
|
|
+ var a = index + stride * 0;
|
|
|
+ var b = index + stride * 1;
|
|
|
+ var c = index + stride * 2;
|
|
|
|
|
|
- pushVector( a ); pushVector( b ); pushVector( c );
|
|
|
+ pushVector( a ); pushVector( b ); pushVector( c );
|
|
|
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
|
|
|
- maxcount = Math.max( maxcount, count );
|
|
|
+ maxcount = Math.max( maxcount, count );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ index += stride * count;
|
|
|
|
|
|
}
|
|
|
|
|
|
- index += stride * count;
|
|
|
+ } else {
|
|
|
+
|
|
|
+ for ( var i = 0, l = indices.length; i < l; i += stride ) {
|
|
|
+
|
|
|
+ pushVector( i );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- } else {
|
|
|
+ switch ( name ) {
|
|
|
|
|
|
- for ( var i = 0, l = indices.length; i < l; i += stride ) {
|
|
|
+ case 'VERTEX':
|
|
|
+ geometry.addAttribute( 'position', new THREE.Float32Attribute( array, 3 ) );
|
|
|
+ break;
|
|
|
|
|
|
- pushVector( i );
|
|
|
+ case 'NORMAL':
|
|
|
+ geometry.addAttribute( 'normal', new THREE.Float32Attribute( array, 3 ) );
|
|
|
+ break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- switch ( name ) {
|
|
|
-
|
|
|
- case 'VERTEX':
|
|
|
- geometry.addAttribute( 'position', new THREE.Float32Attribute( array, 3 ) );
|
|
|
- break;
|
|
|
+ if ( maxcount > 0 ) {
|
|
|
|
|
|
- case 'NORMAL':
|
|
|
- geometry.addAttribute( 'normal', new THREE.Float32Attribute( array, 3 ) );
|
|
|
- break;
|
|
|
+ console.log( 'ColladaLoader: Geometry', data.id, 'has faces with more than 4 vertices.' );
|
|
|
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ switch ( primitive.type ) {
|
|
|
|
|
|
- if ( maxcount > 0 ) {
|
|
|
+ case 'lines':
|
|
|
+ group.add( new THREE.LineSegments( geometry, lineMaterial ) );
|
|
|
+ break;
|
|
|
|
|
|
- console.log( 'ColladaLoader: Geometry', data.id, 'has faces with more than 4 vertices.' );
|
|
|
+ case 'linestrips':
|
|
|
+ group.add( new THREE.Line( geometry, lineMaterial ) );
|
|
|
+ break;
|
|
|
|
|
|
- }
|
|
|
+ case 'triangles':
|
|
|
+ case 'polylist':
|
|
|
+ group.add( new THREE.Mesh( geometry, meshMaterial ) );
|
|
|
+ break;
|
|
|
|
|
|
- switch ( data.primitive.type ) {
|
|
|
+ }
|
|
|
|
|
|
- case 'lines':
|
|
|
- return new THREE.LineSegments( geometry );
|
|
|
+ }
|
|
|
+
|
|
|
+ // flatten
|
|
|
|
|
|
- case 'linestrips':
|
|
|
- return new THREE.Line( geometry );
|
|
|
+ if ( group.children.length === 1 ) {
|
|
|
|
|
|
- case 'triangles':
|
|
|
- case 'polylist':
|
|
|
- return new THREE.Mesh( geometry );
|
|
|
+ return group.children[ 0 ];
|
|
|
|
|
|
}
|
|
|
|
|
|
- return;
|
|
|
+ return group;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -494,7 +519,7 @@ THREE.ColladaLoader.prototype = {
|
|
|
|
|
|
case 'matrix':
|
|
|
var array = parseFloats( child.textContent );
|
|
|
- node.matrix.multiply( matrix.fromArray( array ) ); // .transpose() when Z_UP?
|
|
|
+ node.matrix.multiply( matrix.fromArray( array ).transpose() ); // .transpose() when Z_UP?
|
|
|
break;
|
|
|
|
|
|
case 'node':
|