فهرست منبع

ColladaLoader2: Flattening node when possible.

Mr.doob 9 سال پیش
والد
کامیت
d04e045947
1فایلهای تغییر یافته به همراه38 افزوده شده و 18 حذف شده
  1. 38 18
      examples/js/loaders/ColladaLoader2.js

+ 38 - 18
examples/js/loaders/ColladaLoader2.js

@@ -569,11 +569,11 @@ THREE.ColladaLoader.prototype = {
 			var data = {
 				name: xml.getAttribute( 'name' ),
 				matrix: new THREE.Matrix4(),
+				nodes: [],
 				instanceCameras: [],
 				instanceLights: [],
 				instanceGeometries: [],
-				instanceNodes: [],
-				nodes: []
+				instanceNodes: []
 			};
 
 			for ( var i = 0; i < xml.childNodes.length; i ++ ) {
@@ -584,6 +584,11 @@ THREE.ColladaLoader.prototype = {
 
 				switch ( child.nodeName ) {
 
+					case 'node':
+						parseNode( child );
+						data.nodes.push( child.getAttribute( 'id' ) );
+						break;
+
 					case 'instance_camera':
 						data.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );
 						break;
@@ -605,11 +610,6 @@ THREE.ColladaLoader.prototype = {
 						data.matrix.multiply( matrix.fromArray( array ).transpose() ); // .transpose() when Z_UP?
 						break;
 
-					case 'node':
-						parseNode( child );
-						data.nodes.push( child.getAttribute( 'id' ) );
-						break;
-
 					case 'translate':
 						var array = parseFloats( child.textContent );
 						vector.fromArray( array );
@@ -650,47 +650,67 @@ THREE.ColladaLoader.prototype = {
 
 		function buildNode( data ) {
 
-			var group = new THREE.Group();
-			group.name = data.name;
-			data.matrix.decompose( group.position, group.quaternion, group.scale );
+			var objects = [];
 
+			var matrix = data.matrix;
+			var nodes = data.nodes;
 			var instanceCameras = data.instanceCameras;
 			var instanceLights = data.instanceLights;
 			var instanceGeometries = data.instanceGeometries;
 			var instanceNodes = data.instanceNodes;
-			var nodes = data.nodes;
+
+			for ( var i = 0, l = nodes.length; i < l; i ++ ) {
+
+				objects.push( getNode( nodes[ i ] ).clone() );
+
+			}
 
 			for ( var i = 0, l = instanceCameras.length; i < l; i ++ ) {
 
-				group.add( getCamera( instanceCameras[ i ] ).clone() );
+				objects.push( getCamera( instanceCameras[ i ] ).clone() );
 
 			}
 
 			for ( var i = 0, l = instanceLights.length; i < l; i ++ ) {
 
-				group.add( getLight( instanceLights[ i ] ).clone() );
+				objects.push( getLight( instanceLights[ i ] ).clone() );
 
 			}
 
 			for ( var i = 0, l = instanceGeometries.length; i < l; i ++ ) {
 
-				group.add( getGeometry( instanceGeometries[ i ] ).clone() );
+				objects.push( getGeometry( instanceGeometries[ i ] ).clone() );
 
 			}
 
 			for ( var i = 0, l = instanceNodes.length; i < l; i ++ ) {
 
-				group.add( getNode( instanceNodes[ i ] ).clone() );
+				objects.push( getNode( instanceNodes[ i ] ).clone() );
 
 			}
 
-			for ( var i = 0, l = nodes.length; i < l; i ++ ) {
+			var object;
+
+			if ( objects.length === 1 ) {
+
+				object = objects[ 0 ];
 
-				group.add( getNode( nodes[ i ] ).clone() );
+			} else {
+
+				object = new THREE.Group();
+
+				for ( var i = 0; i < objects.length; i ++ ) {
+
+					object.add( objects[ i ] );
+
+				}
 
 			}
 
-			return group;
+			object.name = data.name;
+			matrix.decompose( object.position, object.quaternion, object.scale );
+
+			return object;
 
 		}