Browse Source

Fixed ColladaLoader issue where node id was non-existent.
Fixes issue #747

Mr.doob 13 năm trước cách đây
mục cha
commit
db6cb6d1cf
3 tập tin đã thay đổi với 11 bổ sung34 xóa
  1. 1 1
      build/Three.js
  2. 1 1
      build/custom/ThreeExtras.js
  3. 9 32
      src/extras/loaders/ColladaLoader.js

+ 1 - 1
build/Three.js

@@ -582,7 +582,7 @@ r.nquad_smooth;if(b){var c=a+b*Uint32Array.BYTES_PER_ELEMENT*4;t(b,a,c,c+b*Uint3
 THREE.ColladaLoader=function(){function a(a,d,f){R=a;d=d||ca;f!==void 0&&(a=f.split("/"),a.pop(),Da=a.length<1?"":a.join("/")+"/");if((a=R.evaluate("//dae:asset",R,K,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null).iterateNext())&&a.children)for(f=0;f<a.children.length;f++){var i=a.children[f];switch(i.nodeName){case "unit":(i=i.getAttribute("meter"))&&parseFloat(i);break;case "up_axis":na=i.textContent.charAt(0)}}if(!oa.convertUpAxis||na===oa.upAxis)X=null;else switch(na){case "X":X=oa.upAxis==="Y"?
 "XtoY":"XtoZ";break;case "Y":X=oa.upAxis==="X"?"YtoX":"YtoZ";break;case "Z":X=oa.upAxis==="X"?"ZtoX":"ZtoY"}ya=c("//dae:library_images/dae:image",e,"image");qa=c("//dae:library_materials/dae:material",x,"material");ma=c("//dae:library_effects/dae:effect",Q,"effect");pa=c("//dae:library_geometries/dae:geometry",q,"geometry");ra=c("//dae:library_controllers/dae:controller",h,"controller");ta=c("//dae:library_animations/dae:animation",W,"animation");Aa=c(".//dae:library_visual_scenes/dae:visual_scene",
 l,"visual_scene");ua=[];wa=[];(a=R.evaluate(".//dae:scene/dae:instance_visual_scene",R,K,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null).iterateNext())?(a=a.getAttribute("url").replace(/^#/,""),ea=Aa[a]):ea=null;fa=new THREE.Object3D;for(a=0;a<ea.nodes.length;a++)fa.add(g(ea.nodes[a]));za=[];b(fa);a={scene:fa,morphs:ua,skins:wa,animations:za,dae:{images:ya,materials:qa,effects:ma,geometries:pa,controllers:ra,animations:ta,visualScenes:Aa,scene:ea}};d&&d(a);return a}function c(a,b,c){for(var a=R.evaluate(a,
-R,K,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null),d={},e=a.iterateNext(),g=0;e;){e=(new b).parse(e);if(e.id.length==0)e.id=c+g++;d[e.id]=e;e=a.iterateNext()}return d}function b(a){var c=ea.getChildById(a.name,!0),d=null;if(c&&c.keys){d={fps:60,hierarchy:[{node:c,keys:c.keys,sids:c.sids}],node:a,name:"animation_"+a.name,length:0};za.push(d);for(var e=0,g=c.keys.length;e<g;e++)d.length=Math.max(d.length,c.keys[e].time)}else d={hierarchy:[{keys:[],sids:[]}]};e=0;for(g=a.children.length;e<g;e++)for(var c=
+R,K,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null),d={},e=a.iterateNext(),g=0;e;){e=(new b).parse(e);if(!e.id||e.id.length==0)e.id=c+g++;d[e.id]=e;e=a.iterateNext()}return d}function b(a){var c=ea.getChildById(a.name,!0),d=null;if(c&&c.keys){d={fps:60,hierarchy:[{node:c,keys:c.keys,sids:c.sids}],node:a,name:"animation_"+a.name,length:0};za.push(d);for(var e=0,g=c.keys.length;e<g;e++)d.length=Math.max(d.length,c.keys[e].time)}else d={hierarchy:[{keys:[],sids:[]}]};e=0;for(g=a.children.length;e<g;e++)for(var c=
 0,f=b(a.children[e]).hierarchy.length;c<f;c++)d.hierarchy.push({keys:[],sids:[]});return d}function d(a,b,c,e){a.world=a.world||new THREE.Matrix4;a.world.copy(a.matrix);if(a.channels&&a.channels.length){var g=a.channels[0].sampler.output[c];g instanceof THREE.Matrix4&&a.world.copy(g)}e&&a.world.multiply(e,a.world);b.push(a);for(e=0;e<a.nodes.length;e++)d(a.nodes[e],b,c,a.world)}function f(a,b,c){var e=ra[b.url];if(!e||!e.skin)console.log("ColladaLoader: Could not find skin controller.");else if(!b.skeleton||
 !b.skeleton.length)console.log("ColladaLoader: Could not find the skeleton for the skin. ");else{var g,c=1E6,f=-c,h=0;for(g in ta)for(var i=ta[g],j=0;j<i.sampler.length;j++){var l=i.sampler[j];l.create();c=Math.min(c,l.startTime);f=Math.max(f,l.endTime);h=Math.max(h,l.input.length)}g={start:c,end:f,frames:h};for(var b=ea.getChildById(b.skeleton[0],!0)||ea.getChildBySid(b.skeleton[0],!0),k,m,f=new THREE.Vector3,n,j=0;j<a.vertices.length;j++)e.skin.bindShapeMatrix.multiplyVector3(a.vertices[j].position);
 for(c=0;c<g.frames;c++){h=[];i=[];for(j=0;j<a.vertices.length;j++)i.push(new THREE.Vertex(new THREE.Vector3));d(b,h,c);j=h;l=e.skin;for(m=0;m<j.length;m++)if(k=j[m],n=-1,k.type=="JOINT"){for(var o=0;o<l.joints.length;o++)if(k.sid==l.joints[o]){n=o;break}if(n>=0){o=l.invBindMatrices[n];k.invBindMatrix=o;k.skinningMatrix=new THREE.Matrix4;k.skinningMatrix.multiply(k.world,o);k.weights=[];for(o=0;o<l.weights.length;o++)for(var p=0;p<l.weights[o].length;p++){var r=l.weights[o][p];r.joint==n&&k.weights.push(r)}}else throw"ColladaLoader: Could not find joint '"+

+ 1 - 1
build/custom/ThreeExtras.js

@@ -228,7 +228,7 @@ l.nquad_smooth;if(b){var c=a+b*Uint32Array.BYTES_PER_ELEMENT*4;s(b,a,c,c+b*Uint3
 THREE.ColladaLoader=function(){function a(a,d,g){P=a;d=d||ia;g!==void 0&&(a=g.split("/"),a.pop(),ja=a.length<1?"":a.join("/")+"/");if((a=P.evaluate("//dae:asset",P,C,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null).iterateNext())&&a.children)for(g=0;g<a.children.length;g++){var i=a.children[g];switch(i.nodeName){case "unit":(i=i.getAttribute("meter"))&&parseFloat(i);break;case "up_axis":Z=i.textContent.charAt(0)}}if(!Q.convertUpAxis||Z===Q.upAxis)U=null;else switch(Z){case "X":U=Q.upAxis==="Y"?"XtoY":
 "XtoZ";break;case "Y":U=Q.upAxis==="X"?"YtoX":"YtoZ";break;case "Z":U=Q.upAxis==="X"?"ZtoX":"ZtoY"}ca=c("//dae:library_images/dae:image",e,"image");da=c("//dae:library_materials/dae:material",y,"material");ea=c("//dae:library_effects/dae:effect",B,"effect");V=c("//dae:library_geometries/dae:geometry",p,"geometry");T=c("//dae:library_controllers/dae:controller",h,"controller");W=c("//dae:library_animations/dae:animation",J,"animation");fa=c(".//dae:library_visual_scenes/dae:visual_scene",j,"visual_scene");
 $=[];aa=[];(a=P.evaluate(".//dae:scene/dae:instance_visual_scene",P,C,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null).iterateNext())?(a=a.getAttribute("url").replace(/^#/,""),S=fa[a]):S=null;X=new THREE.Object3D;for(a=0;a<S.nodes.length;a++)X.add(f(S.nodes[a]));ga=[];b(X);a={scene:X,morphs:$,skins:aa,animations:ga,dae:{images:ca,materials:da,effects:ea,geometries:V,controllers:T,animations:W,visualScenes:fa,scene:S}};d&&d(a);return a}function c(a,b,c){for(var a=P.evaluate(a,P,C,XPathResult.ORDERED_NODE_ITERATOR_TYPE,
-null),d={},e=a.iterateNext(),f=0;e;){e=(new b).parse(e);if(e.id.length==0)e.id=c+f++;d[e.id]=e;e=a.iterateNext()}return d}function b(a){var c=S.getChildById(a.name,!0),d=null;if(c&&c.keys){d={fps:60,hierarchy:[{node:c,keys:c.keys,sids:c.sids}],node:a,name:"animation_"+a.name,length:0};ga.push(d);for(var e=0,f=c.keys.length;e<f;e++)d.length=Math.max(d.length,c.keys[e].time)}else d={hierarchy:[{keys:[],sids:[]}]};e=0;for(f=a.children.length;e<f;e++)for(var c=0,g=b(a.children[e]).hierarchy.length;c<
+null),d={},e=a.iterateNext(),f=0;e;){e=(new b).parse(e);if(!e.id||e.id.length==0)e.id=c+f++;d[e.id]=e;e=a.iterateNext()}return d}function b(a){var c=S.getChildById(a.name,!0),d=null;if(c&&c.keys){d={fps:60,hierarchy:[{node:c,keys:c.keys,sids:c.sids}],node:a,name:"animation_"+a.name,length:0};ga.push(d);for(var e=0,f=c.keys.length;e<f;e++)d.length=Math.max(d.length,c.keys[e].time)}else d={hierarchy:[{keys:[],sids:[]}]};e=0;for(f=a.children.length;e<f;e++)for(var c=0,g=b(a.children[e]).hierarchy.length;c<
 g;c++)d.hierarchy.push({keys:[],sids:[]});return d}function d(a,b,c,e){a.world=a.world||new THREE.Matrix4;a.world.copy(a.matrix);if(a.channels&&a.channels.length){var f=a.channels[0].sampler.output[c];f instanceof THREE.Matrix4&&a.world.copy(f)}e&&a.world.multiply(e,a.world);b.push(a);for(e=0;e<a.nodes.length;e++)d(a.nodes[e],b,c,a.world)}function g(a,b,c){var e=T[b.url];if(!e||!e.skin)console.log("ColladaLoader: Could not find skin controller.");else if(!b.skeleton||!b.skeleton.length)console.log("ColladaLoader: Could not find the skeleton for the skin. ");
 else{var f,c=1E6,g=-c,h=0;for(f in W)for(var i=W[f],j=0;j<i.sampler.length;j++){var k=i.sampler[j];k.create();c=Math.min(c,k.startTime);g=Math.max(g,k.endTime);h=Math.max(h,k.input.length)}f={start:c,end:g,frames:h};for(var b=S.getChildById(b.skeleton[0],!0)||S.getChildBySid(b.skeleton[0],!0),l,m,g=new THREE.Vector3,n,j=0;j<a.vertices.length;j++)e.skin.bindShapeMatrix.multiplyVector3(a.vertices[j].position);for(c=0;c<f.frames;c++){h=[];i=[];for(j=0;j<a.vertices.length;j++)i.push(new THREE.Vertex(new THREE.Vector3));
 d(b,h,c);j=h;k=e.skin;for(m=0;m<j.length;m++)if(l=j[m],n=-1,l.type=="JOINT"){for(var o=0;o<k.joints.length;o++)if(l.sid==k.joints[o]){n=o;break}if(n>=0){o=k.invBindMatrices[n];l.invBindMatrix=o;l.skinningMatrix=new THREE.Matrix4;l.skinningMatrix.multiply(l.world,o);l.weights=[];for(o=0;o<k.weights.length;o++)for(var p=0;p<k.weights[o].length;p++){var r=k.weights[o][p];r.joint==n&&l.weights.push(r)}}else throw"ColladaLoader: Could not find joint '"+l.sid+"'.";}for(j=0;j<h.length;j++)if(h[j].type==

+ 9 - 32
src/extras/loaders/ColladaLoader.js

@@ -207,11 +207,7 @@ THREE.ColladaLoader = function () {
 
 	function parseLib ( q, classSpec, prefix ) {
 
-		var elements = COLLADA.evaluate(q,
-										COLLADA,
-										_nsResolver,
-										XPathResult.ORDERED_NODE_ITERATOR_TYPE,
-										null) ;
+		var elements = COLLADA.evaluate(q, COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
 
 		var lib = {};
 		var element = elements.iterateNext();
@@ -220,8 +216,9 @@ THREE.ColladaLoader = function () {
 		while ( element ) {
 
 			var daeElement = ( new classSpec() ).parse( element );
-			if ( daeElement.id.length == 0 ) daeElement.id = prefix + ( i++ );
+			if ( !daeElement.id || daeElement.id.length == 0 ) daeElement.id = prefix + ( i ++ );
 			lib[ daeElement.id ] = daeElement;
+
 			element = elements.iterateNext();
 
 		}
@@ -232,11 +229,7 @@ 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.evaluate( './/dae:scene/dae:instance_visual_scene', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ).iterateNext();
 
 		if ( sceneElement ) {
 
@@ -828,11 +821,7 @@ 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.evaluate( './/dae:library_nodes//dae:node[@id=\'' + id + '\']', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ).iterateNext();
 
 	};
 
@@ -2005,11 +1994,7 @@ THREE.ColladaLoader = function () {
 
 				case 'bind_material':
 
-					var instances = COLLADA.evaluate(".//dae:instance_material",
-														child,
-														_nsResolver,
-														XPathResult.ORDERED_NODE_ITERATOR_TYPE,
-														null);
+					var instances = COLLADA.evaluate( './/dae:instance_material', child, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
 
 					if ( instances ) {
 
@@ -2073,11 +2058,7 @@ THREE.ColladaLoader = function () {
 
 			if ( child.nodeName == 'bind_material' ) {
 
-				var instances = COLLADA.evaluate(".//dae:instance_material",
-					child,
-					_nsResolver,
-					XPathResult.ORDERED_NODE_ITERATOR_TYPE,
-					null);
+				var instances = COLLADA.evaluate( './/dae:instance_material', child, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
 
 				if ( instances ) {
 
@@ -2820,7 +2801,7 @@ THREE.ColladaLoader = function () {
 				case 'reflectivity':
 				case 'transparency':
 
-					var f = evaluateXPath( child, ".//dae:float" );
+					var f = evaluateXPath( child, './/dae:float' );
 
 					if ( f.length > 0 )
 						this[ child.nodeName ] = parseFloat( f[ 0 ].textContent );
@@ -3766,11 +3747,7 @@ THREE.ColladaLoader = function () {
 
 	function evaluateXPath ( node, query ) {
 
-		var instances = COLLADA.evaluate(query,
-			node,
-			_nsResolver,
-			XPathResult.ORDERED_NODE_ITERATOR_TYPE,
-			null);
+		var instances = COLLADA.evaluate( query, node, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
 
 		var inst = instances.iterateNext();
 		var result = [];