瀏覽代碼

ColladaLoader2: Simplified library parsing. instance_node support.

Mr.doob 9 年之前
父節點
當前提交
32807be8a8
共有 1 個文件被更改,包括 20 次插入59 次删除
  1. 20 59
      examples/js/loaders/ColladaLoader2.js

+ 20 - 59
examples/js/loaders/ColladaLoader2.js

@@ -74,31 +74,33 @@ THREE.ColladaLoader.prototype = {
 
 
 		}
 		}
 
 
-		// cameras
+		// library
 
 
-		function parseCamerasLibrary( xml ) {
+		function parseLibrary( xml, libraryName, nodeName, parser ) {
 
 
-			var library = {};
+			var data = {};
 
 
-			var cameras = xml.getElementsByTagName( 'library_cameras' )[ 0 ];
+			var library = xml.getElementsByTagName( libraryName )[ 0 ];
 
 
-			if ( cameras !== undefined ) {
+			if ( library !== undefined ) {
 
 
-				var elements = cameras.getElementsByTagName( 'camera' );
+				var elements = library.getElementsByTagName( nodeName );
 
 
 				for ( var i = 0; i < elements.length; i ++ ) {
 				for ( var i = 0; i < elements.length; i ++ ) {
 
 
 					var element = elements[ i ];
 					var element = elements[ i ];
-					library[ element.getAttribute( 'id' ) ] = parseCamera( element );
+					data[ element.getAttribute( 'id' ) ] = parser( element );
 
 
 				}
 				}
 
 
 			}
 			}
 
 
-			return library;
+			return data;
 
 
 		}
 		}
 
 
+		// camera
+
 		function parseCamera( xml ) {
 		function parseCamera( xml ) {
 
 
 			console.log( 'ColladaLoader.parseCamera: TODO')
 			console.log( 'ColladaLoader.parseCamera: TODO')
@@ -109,27 +111,7 @@ THREE.ColladaLoader.prototype = {
 
 
 		}
 		}
 
 
-		// geometries
-
-		function parseGeometriesLibrary( xml ) {
-
-			var library = {};
-
-			var geometries = xml.getElementsByTagName( 'library_geometries' )[ 0 ];
-			var elements = geometries.getElementsByTagName( 'geometry' );
-
-			for ( var i = 0; i < elements.length; i ++ ) {
-
-				var element = elements[ i ];
-				var geometry = parseGeometry( element );
-
-				library[ element.getAttribute( 'id' ) ] = createGeometry( geometry );
-
-			}
-
-			return library;
-
-		}
+		// geometry
 
 
 		function parseGeometry( xml ) {
 		function parseGeometry( xml ) {
 
 
@@ -172,7 +154,7 @@ THREE.ColladaLoader.prototype = {
 
 
 			}
 			}
 
 
-			return data;
+			return createGeometry( data );
 
 
 		}
 		}
 
 
@@ -328,13 +310,6 @@ THREE.ColladaLoader.prototype = {
 
 
 		// nodes
 		// nodes
 
 
-		function parseNodesLibrary( xml ) {
-
-			var library = {};
-			return library;
-
-		}
-
 		var material = new THREE.MeshPhongMaterial();
 		var material = new THREE.MeshPhongMaterial();
 		var matrix = new THREE.Matrix4();
 		var matrix = new THREE.Matrix4();
 		var vector = new THREE.Vector3();
 		var vector = new THREE.Vector3();
@@ -363,6 +338,10 @@ THREE.ColladaLoader.prototype = {
 						node.geometry = geometriesLibrary[ parseId( child.getAttribute( 'url' ) ) ];
 						node.geometry = geometriesLibrary[ parseId( child.getAttribute( 'url' ) ) ];
 						break;
 						break;
 
 
+					case 'instance_node':
+						node.children.push( nodesLibrary[ parseId( child.getAttribute( 'url' ) ) ] );
+						break;
+
 					case 'matrix':
 					case 'matrix':
 						var array = parseFloats( child.textContent );
 						var array = parseFloats( child.textContent );
 						node.matrix.multiply( matrix.fromArray( array ) );
 						node.matrix.multiply( matrix.fromArray( array ) );
@@ -433,24 +412,6 @@ THREE.ColladaLoader.prototype = {
 
 
 		// visual scenes
 		// visual scenes
 
 
-		function parseVisualScenesLibrary( xml ) {
-
-			var library = {};
-
-			var visualScenes = xml.getElementsByTagName( 'library_visual_scenes' )[ 0 ];
-			var elements = visualScenes.getElementsByTagName( 'visual_scene' );
-
-			for ( var i = 0; i < elements.length; i ++ ) {
-
-				var element = elements[ i ];
-				library[ element.getAttribute( 'id' ) ] = parseVisualScene( element );
-
-			}
-
-			return library;
-
-		}
-
 		function parseVisualScene( xml ) {
 		function parseVisualScene( xml ) {
 
 
 			var group = new THREE.Group();
 			var group = new THREE.Group();
@@ -487,10 +448,10 @@ THREE.ColladaLoader.prototype = {
 
 
 		console.timeEnd( 'ColladaLoader: DOMParser' );
 		console.timeEnd( 'ColladaLoader: DOMParser' );
 
 
-		var camerasLibrary = parseCamerasLibrary( xml );
-		var geometriesLibrary = parseGeometriesLibrary( xml );
-		var nodesLibrary = parseNodesLibrary( xml );
-		var visualScenesLibrary = parseVisualScenesLibrary( xml );
+		var camerasLibrary = parseLibrary( xml, 'library_cameras', 'camera', parseCamera );
+		var geometriesLibrary = parseLibrary( xml, 'library_geometries', 'geometry', parseGeometry );
+		var nodesLibrary = parseLibrary( xml, 'library_nodes', 'node', parseNode );
+		var visualScenesLibrary = parseLibrary( xml, 'library_visual_scenes', 'visual_scene', parseVisualScene );
 		var scene = parseScene( xml );
 		var scene = parseScene( xml );
 
 
 		console.timeEnd( 'ColladaLoader' );
 		console.timeEnd( 'ColladaLoader' );