Browse Source

Merge branch 'ie11-collada' of https://github.com/MSOpenTech/three.js into dev

Mr.doob 11 years ago
parent
commit
c18fae3533
1 changed files with 55 additions and 86 deletions
  1. 55 86
      examples/js/loaders/ColladaLoader.js

+ 55 - 86
examples/js/loaders/ColladaLoader.js

@@ -131,16 +131,16 @@ THREE.ColladaLoader = function () {
 
 		parseAsset();
 		setUpConversion();
-		images = parseLib( "//dae:library_images/dae:image", _Image, "image" );
-		materials = parseLib( "//dae:library_materials/dae:material", Material, "material" );
-		effects = parseLib( "//dae:library_effects/dae:effect", Effect, "effect" );
-		geometries = parseLib( "//dae:library_geometries/dae:geometry", Geometry, "geometry" );
-		cameras = parseLib( ".//dae:library_cameras/dae:camera", Camera, "camera" );
-		lights = parseLib( ".//dae:library_lights/dae:light", Light, "light" );
-		controllers = parseLib( "//dae:library_controllers/dae:controller", Controller, "controller" );
-		animations = parseLib( "//dae:library_animations/dae:animation", Animation, "animation" );
-		visualScenes = parseLib( ".//dae:library_visual_scenes/dae:visual_scene", VisualScene, "visual_scene" );
-
+		images = parseLib( "library_images image", _Image, "image" );
+		materials = parseLib( "library_materials material", Material, "material" );
+		effects = parseLib( "library_effects effect", Effect, "effect" );
+		geometries = parseLib( "library_geometries geometry", Geometry, "geometry" );
+		cameras = parseLib( "library_cameras camera", Camera, "camera" );
+		lights = parseLib( "library_lights light", Light, "light" );
+		controllers = parseLib( "library_controllers controller", Controller, "controller" );
+		animations = parseLib( "library_animations animation", Animation, "animation" );
+		visualScenes = parseLib( "library_visual_scenes visual_scene", VisualScene, "visual_scene" );
+        
 		morphs = [];
 		skins = [];
 
@@ -197,15 +197,16 @@ THREE.ColladaLoader = function () {
 
 	function parseAsset () {
 
-		var elements = COLLADA.evaluate( '//dae:asset', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
-
-		var element = elements.iterateNext();
-
-		if ( element && element.childNodes ) {
+        var elements = COLLADA.querySelectorAll('asset');
+        
+        var elementsLength = elements.length; //cache loop length
+        for (var i = 0; i < elementsLength; i ++){
+            var element = elements[i];
+            
+            var elementChildNodesLength = element.childNodes.length;
+			for ( var j = 0; j < elementChildNodesLength; j ++ ) {
 
-			for ( var i = 0; i < element.childNodes.length; i ++ ) {
-
-				var child = element.childNodes[ i ];
+				var child = element.childNodes[ j ];
 
 				switch ( child.nodeName ) {
 
@@ -236,20 +237,20 @@ THREE.ColladaLoader = function () {
 
 	function parseLib ( q, classSpec, prefix ) {
 
-		var elements = COLLADA.evaluate(q, COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
+        var elements = COLLADA.querySelectorAll(q);
+
+        var lib = {};
 
-		var lib = {};
-		var element = elements.iterateNext();
 		var i = 0;
 
-		while ( element ) {
+        var elementsLength = elements.length;
+		for (var j = 0; j < elementsLength; j++){
+            var element = elements[j];
 
-			var daeElement = ( new classSpec() ).parse( element );
+            var daeElement = ( new classSpec() ).parse( element );
 			if ( !daeElement.id || daeElement.id.length == 0 ) daeElement.id = prefix + ( i ++ );
 			lib[ daeElement.id ] = daeElement;
 
-			element = elements.iterateNext();
-
 		}
 
 		return lib;
@@ -257,9 +258,9 @@ THREE.ColladaLoader = function () {
 	};
 
 	function parseScene() {
-
-		var sceneElement = COLLADA.evaluate( './/dae:scene/dae:instance_visual_scene', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ).iterateNext();
-
+    
+        var sceneElement = COLLADA.querySelectorAll('scene instance_visual_scene')[0];
+        
 		if ( sceneElement ) {
 
 			var url = sceneElement.getAttribute( 'url' ).replace( /^#/, '' );
@@ -494,15 +495,15 @@ THREE.ColladaLoader = function () {
 	function setupSkinningMatrices ( bones, skin ) {
 
 		// FIXME: this is dumb...
-
-		for ( var i = 0; i < bones.length; i ++ ) {
-
+        
+		for ( var i = 0; i < bones.length ; i ++ ) {
+        
 			var bone = bones[ i ];
 			var found = -1;
 
 			if ( bone.type != 'JOINT' ) continue;
 
-			for ( var j = 0; j < skin.joints.length; j ++ ) {
+			for ( var j = 0; j < skin.joints.length ; j ++ ) {
 
 				if ( bone.sid == skin.joints[ j ] ) {
 
@@ -523,8 +524,8 @@ THREE.ColladaLoader = function () {
 
 				bone.weights = [];
 
-				for ( var j = 0; j < skin.weights.length; j ++ ) {
-
+                for ( var j = 0; j < skin.weights.length ; j ++ ) {
+                    
 					for (var k = 0; k < skin.weights[ j ].length; k ++) {
 
 						var w = skin.weights[ j ][ k ];
@@ -926,8 +927,8 @@ THREE.ColladaLoader = function () {
 	};
 
 	function getLibraryNode( id ) {
-
-		return COLLADA.evaluate( './/dae:library_nodes//dae:node[@id=\'' + id + '\']', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ).iterateNext();
+    
+        return COLLADA.querySelectorAll('library_nodes node#'+id)[0];  //returns 'undefined' if nothing is matched
 
 	};
 
@@ -2203,21 +2204,17 @@ THREE.ColladaLoader = function () {
 					break;
 
 				case 'bind_material':
+            
+                    var instances = child.querySelectorAll('instance_material');
+                    
+					for (var j = 0; j < instances.length; j ++){
 
-					var instances = COLLADA.evaluate( './/dae:instance_material', child, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
-
-					if ( instances ) {
-
-						var instance = instances.iterateNext();
-
-						while ( instance ) {
+						var instance = instances[j];
 
-							this.instance_material.push( (new InstanceMaterial()).parse(instance) );
-							instance = instances.iterateNext();
+                        this.instance_material.push( (new InstanceMaterial()).parse(instance) );
+						
+                    }
 
-						}
-
-					}
 
 					break;
 
@@ -2268,19 +2265,11 @@ THREE.ColladaLoader = function () {
 
 			if ( child.nodeName == 'bind_material' ) {
 
-				var instances = COLLADA.evaluate( './/dae:instance_material', child, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
-
-				if ( instances ) {
-
-					var instance = instances.iterateNext();
-
-					while ( instance ) {
-
-						this.instance_material.push( (new InstanceMaterial()).parse(instance) );
-						instance = instances.iterateNext();
-
-					}
-
+                var instances = child.querySelectorAll('instance_material');
+                    
+            	for (var j = 0; j < instances.length; j++){
+                    var instance = instances[j];
+             		this.instance_material.push( (new InstanceMaterial()).parse(instance) );
 				}
 
 				break;
@@ -2425,8 +2414,8 @@ THREE.ColladaLoader = function () {
 		var source, numParams;
 		var vcIndex = 0, vcount = 3, maxOffset = 0;
 		var texture_sets = [];
-
-		for ( j = 0; j < inputs.length; j ++ ) {
+        
+		for ( j = 0; j < inputs.length ; j ++ ) {
 
 			input = inputs[ j ];
 			var offset = input.offset + 1;
@@ -3150,7 +3139,7 @@ THREE.ColladaLoader = function () {
 				case 'index_of_refraction':
 				case 'transparency':
 
-					var f = evaluateXPath( child, './/dae:float' );
+					var f = child.querySelectorAll('float');
 
 					if ( f.length > 0 )
 						this[ child.nodeName ] = parseFloat( f[ 0 ].textContent );
@@ -4414,34 +4403,14 @@ THREE.ColladaLoader = function () {
 
 	};
 
-	function evaluateXPath( node, query ) {
-
-		var instances = COLLADA.evaluate( query, node, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
-
-		var inst = instances.iterateNext();
-		var result = [];
-
-		while ( inst ) {
-
-			result.push( inst );
-			inst = instances.iterateNext();
-
-		}
-
-		return result;
-
-	};
-
 	function extractDoubleSided( obj, element ) {
 
 		obj.doubleSided = false;
 
-		var node = COLLADA.evaluate( './/dae:extra//dae:double_sided', element, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
-
+        var node = element.querySelectorAll('extra double_sided')[0];
+    
 		if ( node ) {
 
-			node = node.iterateNext();
-
 			if ( node && parseInt( node.textContent, 10 ) === 1 ) {
 
 				obj.doubleSided = true;