2
0
Эх сурвалжийг харах

SceneLoader: fixed bug where extra empties were created for hierarchy models.

Also hierarchy roots now get proper names (instead of those erroneous empties).
alteredq 12 жил өмнө
parent
commit
23da729a3b

+ 30 - 24
build/three.js

@@ -10025,51 +10025,55 @@ THREE.SceneLoader.prototype.parse = function ( json, callbackFinished, url ) {
 
 				// meshes
 
-				if ( objJSON.type && ( objJSON.type in scope.hierarchyHandlerMap ) && objJSON.loading === undefined ) {
+				if ( objJSON.type && ( objJSON.type in scope.hierarchyHandlerMap ) ) {
 
-					var reservedTypes = { "type": 1, "url": 1, "material": 1,
-										  "position": 1, "rotation": 1, "scale" : 1,
-										  "visible": 1, "children": 1, "properties": 1,
-										  "skin": 1, "morph": 1, "mirroredLoop": 1, "duration": 1 };
+					if ( objJSON.loading === undefined ) {
 
-					var loaderParameters = {};
+						var reservedTypes = { "type": 1, "url": 1, "material": 1,
+											  "position": 1, "rotation": 1, "scale" : 1,
+											  "visible": 1, "children": 1, "properties": 1,
+											  "skin": 1, "morph": 1, "mirroredLoop": 1, "duration": 1 };
 
-					for ( var parType in objJSON ) {
+						var loaderParameters = {};
 
-						if ( ! ( parType in reservedTypes ) ) {
+						for ( var parType in objJSON ) {
 
-							loaderParameters[ parType ] = objJSON[ parType ];
+							if ( ! ( parType in reservedTypes ) ) {
+
+								loaderParameters[ parType ] = objJSON[ parType ];
+
+							}
 
 						}
 
-					}
+						material = result.materials[ objJSON.material ];
 
-					material = result.materials[ objJSON.material ];
+						objJSON.loading = true;
 
-					objJSON.loading = true;
+						var loader = scope.hierarchyHandlerMap[ objJSON.type ][ "loaderObject" ];
 
-					var loader = scope.hierarchyHandlerMap[ objJSON.type ][ "loaderObject" ];
+						// OBJLoader
 
-					// OBJLoader
+						if ( loader.addEventListener ) {
 
-					if ( loader.addEventListener ) {
+							loader.addEventListener( 'load', create_callback_hierachy( objID, parent, material, objJSON ) );
+							loader.load( get_url( objJSON.url, data.urlBaseType ) );
 
-						loader.addEventListener( 'load', create_callback_hierachy( objID, parent, material, objJSON ) );
-						loader.load( get_url( objJSON.url, data.urlBaseType ) );
+						} else {
 
-					} else {
+							// ColladaLoader
 
-						// ColladaLoader
+							if ( loader.options ) {
 
-						if ( loader.options ) {
+								loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) );
 
-							loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) );
+							// UTF8Loader
 
-						// UTF8Loader
+							} else {
 
-						} else {
+								loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ), loaderParameters );
 
-							loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ), loaderParameters );
+							}
 
 						}
 
@@ -10386,6 +10390,8 @@ THREE.SceneLoader.prototype.parse = function ( json, callbackFinished, url ) {
 
 		parent.add( node );
 
+		node.name = id;
+
 		result.objects[ id ] = node;
 		handle_objects();
 

+ 7 - 7
build/three.min.js

@@ -195,18 +195,18 @@ a.bones;d.animation=a.animation;if(void 0!==a.morphTargets){i=0;for(k=a.morphTar
 [];F=d.morphColors[i].colors;C=a.morphColors[i].colors;e=0;for(t=C.length;e<t;e+=3)z=new THREE.Color(16755200),z.setRGB(C[e],C[e+1],C[e+2]),F.push(z)}}d.computeCentroids();d.computeFaceNormals();a=this.initMaterials(a.materials,c);this.needsTangents(a)&&d.computeTangents();b(d,a)};THREE.LoadingMonitor=function(){THREE.EventDispatcher.call(this);var a=this,b=0,c=0,d=function(){b++;a.dispatchEvent({type:"progress",loaded:b,total:c});b===c&&a.dispatchEvent({type:"load"})};this.add=function(a){c++;a.addEventListener("load",d,!1)}};THREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){};this.geometryHandlerMap={};this.hierarchyHandlerMap={};this.addGeometryHandler("ascii",THREE.JSONLoader);this.addGeometryHandler("binary",THREE.BinaryLoader)};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;
 THREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(4===d.readyState)if(200===d.status||0===d.status){var e=JSON.parse(d.responseText);c.parse(e,b,a)}else console.error("THREE.SceneLoader: Couldn't load ["+a+"] ["+d.status+"]")};d.open("GET",a,!0);d.send(null)};THREE.SceneLoader.prototype.addGeometryHandler=function(a,b){this.geometryHandlerMap[a]={loaderClass:b}};
 THREE.SceneLoader.prototype.addHierarchyHandler=function(a,b){this.hierarchyHandlerMap[a]={loaderClass:b}};
-THREE.SceneLoader.prototype.parse=function(a,b,c){function d(a,b){return"relativeToHTML"==b?a:p+"/"+a}function e(){f(A.scene,G.objects)}function f(a,b){var c,e,g,i,k,p;for(p in b)if(void 0===A.objects[p]){var l=b[p],q=null;if(l.type&&l.type in n.hierarchyHandlerMap&&void 0===l.loading){c={type:1,url:1,material:1,position:1,rotation:1,scale:1,visible:1,children:1,properties:1,skin:1,morph:1,mirroredLoop:1,duration:1};e={};for(var t in l)t in c||(e[t]=l[t]);r=A.materials[l.material];l.loading=!0;c=
-n.hierarchyHandlerMap[l.type].loaderObject;c.addEventListener?(c.addEventListener("load",h(p,a,r,l)),c.load(d(l.url,G.urlBaseType))):c.options?c.load(d(l.url,G.urlBaseType),h(p,a,r,l)):c.load(d(l.url,G.urlBaseType),h(p,a,r,l),e)}else if(void 0!==l.geometry){if(m=A.geometries[l.geometry]){q=!1;r=A.materials[l.material];q=r instanceof THREE.ShaderMaterial;e=l.position;g=l.rotation;i=l.scale;c=l.matrix;k=0;l.material||(r=new THREE.MeshFaceMaterial(A.face_materials[l.geometry]));r instanceof THREE.MeshFaceMaterial&&
+THREE.SceneLoader.prototype.parse=function(a,b,c){function d(a,b){return"relativeToHTML"==b?a:p+"/"+a}function e(){f(A.scene,G.objects)}function f(a,b){var c,e,g,i,k,p;for(p in b)if(void 0===A.objects[p]){var l=b[p],q=null;if(l.type&&l.type in n.hierarchyHandlerMap){if(void 0===l.loading){c={type:1,url:1,material:1,position:1,rotation:1,scale:1,visible:1,children:1,properties:1,skin:1,morph:1,mirroredLoop:1,duration:1};e={};for(var t in l)t in c||(e[t]=l[t]);r=A.materials[l.material];l.loading=!0;
+c=n.hierarchyHandlerMap[l.type].loaderObject;c.addEventListener?(c.addEventListener("load",h(p,a,r,l)),c.load(d(l.url,G.urlBaseType))):c.options?c.load(d(l.url,G.urlBaseType),h(p,a,r,l)):c.load(d(l.url,G.urlBaseType),h(p,a,r,l),e)}}else if(void 0!==l.geometry){if(m=A.geometries[l.geometry]){q=!1;r=A.materials[l.material];q=r instanceof THREE.ShaderMaterial;e=l.position;g=l.rotation;i=l.scale;c=l.matrix;k=0;l.material||(r=new THREE.MeshFaceMaterial(A.face_materials[l.geometry]));r instanceof THREE.MeshFaceMaterial&&
 0===r.materials.length&&(r=new THREE.MeshFaceMaterial(A.face_materials[l.geometry]));if(r instanceof THREE.MeshFaceMaterial)for(var y=0;y<r.materials.length;y++)q=q||r.materials[y]instanceof THREE.ShaderMaterial;q&&m.computeTangents();l.skin?q=new THREE.SkinnedMesh(m,r):l.morph?(q=new THREE.MorphAnimMesh(m,r),void 0!==l.duration&&(q.duration=l.duration),void 0!==l.time&&(q.time=l.time),void 0!==l.mirroredLoop&&(q.mirroredLoop=l.mirroredLoop),r.morphNormals&&m.computeMorphNormals()):q=new THREE.Mesh(m,
 r);q.name=p;c?(q.matrixAutoUpdate=!1,q.matrix.set(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15])):(q.position.set(e[0],e[1],e[2]),k?(q.quaternion.set(k[0],k[1],k[2],k[3]),q.useQuaternion=!0):q.rotation.set(g[0],g[1],g[2]),q.scale.set(i[0],i[1],i[2]));q.visible=l.visible;q.castShadow=l.castShadow;q.receiveShadow=l.receiveShadow;a.add(q);A.objects[p]=q}}else"DirectionalLight"===l.type||"PointLight"===l.type||"AmbientLight"===l.type?(B=void 0!==l.color?l.color:
 16777215,x=void 0!==l.intensity?l.intensity:1,"DirectionalLight"===l.type?(e=l.direction,u=new THREE.DirectionalLight(B,x),u.position.set(e[0],e[1],e[2]),l.target&&(H.push({object:u,targetName:l.target}),u.target=null)):"PointLight"===l.type?(e=l.position,c=l.distance,u=new THREE.PointLight(B,x,c),u.position.set(e[0],e[1],e[2])):"AmbientLight"===l.type&&(u=new THREE.AmbientLight(B)),a.add(u),u.name=p,A.lights[p]=u,A.objects[p]=u):"PerspectiveCamera"===l.type||"OrthographicCamera"===l.type?("PerspectiveCamera"===
 l.type?s=new THREE.PerspectiveCamera(l.fov,l.aspect,l.near,l.far):"OrthographicCamera"===l.type&&(s=new THREE.OrthographicCamera(l.left,l.right,l.top,l.bottom,l.near,l.far)),e=l.position,s.position.set(e[0],e[1],e[2]),a.add(s),s.name=p,A.cameras[p]=s,A.objects[p]=s):(e=l.position,g=l.rotation,i=l.scale,k=0,q=new THREE.Object3D,q.name=p,q.position.set(e[0],e[1],e[2]),k?(q.quaternion.set(k[0],k[1],k[2],k[3]),q.useQuaternion=!0):q.rotation.set(g[0],g[1],g[2]),q.scale.set(i[0],i[1],i[2]),q.visible=void 0!==
 l.visible?l.visible:!1,a.add(q),A.objects[p]=q,A.empties[p]=q);if(q){if(void 0!==l.properties)for(var z in l.properties)q.properties[z]=l.properties[z];void 0!==l.children&&f(q,l.children)}}}function g(a){return function(b,c){A.geometries[a]=b;A.face_materials[a]=c;e();t-=1;n.onLoadComplete();k()}}function h(a,b,c,d){return function(f){var f=f.content?f.content:f.dae?f.scene:f,g=d.position,h=d.rotation,i=d.quaternion,l=d.scale;f.position.set(g[0],g[1],g[2]);i?(f.quaternion.set(i[0],i[1],i[2],i[3]),
-f.useQuaternion=!0):f.rotation.set(h[0],h[1],h[2]);f.scale.set(l[0],l[1],l[2]);c&&f.traverse(function(a){a.material=c});b.add(f);A.objects[a]=f;e();t-=1;n.onLoadComplete();k()}}function i(a){return function(b,c){A.geometries[a]=b;A.face_materials[a]=c}}function k(){n.callbackProgress({totalModels:C,totalTextures:z,loadedModels:C-t,loadedTextures:z-F},A);n.onLoadProgress();if(0===t&&0===F){for(var a=0;a<H.length;a++){var c=H[a],d=A.objects[c.targetName];d?c.object.target=d:(c.object.target=new THREE.Object3D,
-A.scene.add(c.object.target));c.object.target.properties.targetInverse=c.object}b(A)}}var n=this,p=THREE.Loader.prototype.extractUrlBase(c),m,r,s,l,q,u,B,x,t,F,C,z,A,H=[],G=a,I;for(I in this.geometryHandlerMap)a=this.geometryHandlerMap[I].loaderClass,this.geometryHandlerMap[I].loaderObject=new a;for(I in this.hierarchyHandlerMap)a=this.hierarchyHandlerMap[I].loaderClass,this.hierarchyHandlerMap[I].loaderObject=new a;F=t=0;A={scene:new THREE.Scene,geometries:{},face_materials:{},materials:{},textures:{},
-objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(G.transform&&(I=G.transform.position,a=G.transform.rotation,c=G.transform.scale,I&&A.scene.position.set(I[0],I[1],I[2]),a&&A.scene.rotation.set(a[0],a[1],a[2]),c&&A.scene.scale.set(c[0],c[1],c[2]),I||a||c))A.scene.updateMatrix(),A.scene.updateMatrixWorld();I=function(a){return function(){F-=a;k();n.onLoadComplete()}};for(var $ in G.fogs)a=G.fogs[$],"linear"===a.type?l=new THREE.Fog(0,a.near,a.far):"exp2"===a.type&&(l=new THREE.FogExp2(0,a.density)),
-a=a.color,l.color.setRGB(a[0],a[1],a[2]),A.fogs[$]=l;for(var D in G.geometries)l=G.geometries[D],l.type in this.geometryHandlerMap&&(t+=1,n.onLoadStart());for(var L in G.objects)l=G.objects[L],l.type&&l.type in this.hierarchyHandlerMap&&(t+=1,n.onLoadStart());C=t;for(D in G.geometries)if(l=G.geometries[D],"cube"===l.type)m=new THREE.CubeGeometry(l.width,l.height,l.depth,l.widthSegments,l.heightSegments,l.depthSegments),A.geometries[D]=m;else if("plane"===l.type)m=new THREE.PlaneGeometry(l.width,l.height,
-l.widthSegments,l.heightSegments),A.geometries[D]=m;else if("sphere"===l.type)m=new THREE.SphereGeometry(l.radius,l.widthSegments,l.heightSegments),A.geometries[D]=m;else if("cylinder"===l.type)m=new THREE.CylinderGeometry(l.topRad,l.botRad,l.height,l.radSegs,l.heightSegs),A.geometries[D]=m;else if("torus"===l.type)m=new THREE.TorusGeometry(l.radius,l.tube,l.segmentsR,l.segmentsT),A.geometries[D]=m;else if("icosahedron"===l.type)m=new THREE.IcosahedronGeometry(l.radius,l.subdivisions),A.geometries[D]=
+f.useQuaternion=!0):f.rotation.set(h[0],h[1],h[2]);f.scale.set(l[0],l[1],l[2]);c&&f.traverse(function(a){a.material=c});b.add(f);f.name=a;A.objects[a]=f;e();t-=1;n.onLoadComplete();k()}}function i(a){return function(b,c){A.geometries[a]=b;A.face_materials[a]=c}}function k(){n.callbackProgress({totalModels:C,totalTextures:z,loadedModels:C-t,loadedTextures:z-F},A);n.onLoadProgress();if(0===t&&0===F){for(var a=0;a<H.length;a++){var c=H[a],d=A.objects[c.targetName];d?c.object.target=d:(c.object.target=
+new THREE.Object3D,A.scene.add(c.object.target));c.object.target.properties.targetInverse=c.object}b(A)}}var n=this,p=THREE.Loader.prototype.extractUrlBase(c),m,r,s,l,q,u,B,x,t,F,C,z,A,H=[],G=a,I;for(I in this.geometryHandlerMap)a=this.geometryHandlerMap[I].loaderClass,this.geometryHandlerMap[I].loaderObject=new a;for(I in this.hierarchyHandlerMap)a=this.hierarchyHandlerMap[I].loaderClass,this.hierarchyHandlerMap[I].loaderObject=new a;F=t=0;A={scene:new THREE.Scene,geometries:{},face_materials:{},
+materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(G.transform&&(I=G.transform.position,a=G.transform.rotation,c=G.transform.scale,I&&A.scene.position.set(I[0],I[1],I[2]),a&&A.scene.rotation.set(a[0],a[1],a[2]),c&&A.scene.scale.set(c[0],c[1],c[2]),I||a||c))A.scene.updateMatrix(),A.scene.updateMatrixWorld();I=function(a){return function(){F-=a;k();n.onLoadComplete()}};for(var $ in G.fogs)a=G.fogs[$],"linear"===a.type?l=new THREE.Fog(0,a.near,a.far):"exp2"===a.type&&(l=
+new THREE.FogExp2(0,a.density)),a=a.color,l.color.setRGB(a[0],a[1],a[2]),A.fogs[$]=l;for(var D in G.geometries)l=G.geometries[D],l.type in this.geometryHandlerMap&&(t+=1,n.onLoadStart());for(var L in G.objects)l=G.objects[L],l.type&&l.type in this.hierarchyHandlerMap&&(t+=1,n.onLoadStart());C=t;for(D in G.geometries)if(l=G.geometries[D],"cube"===l.type)m=new THREE.CubeGeometry(l.width,l.height,l.depth,l.widthSegments,l.heightSegments,l.depthSegments),A.geometries[D]=m;else if("plane"===l.type)m=new THREE.PlaneGeometry(l.width,
+l.height,l.widthSegments,l.heightSegments),A.geometries[D]=m;else if("sphere"===l.type)m=new THREE.SphereGeometry(l.radius,l.widthSegments,l.heightSegments),A.geometries[D]=m;else if("cylinder"===l.type)m=new THREE.CylinderGeometry(l.topRad,l.botRad,l.height,l.radSegs,l.heightSegs),A.geometries[D]=m;else if("torus"===l.type)m=new THREE.TorusGeometry(l.radius,l.tube,l.segmentsR,l.segmentsT),A.geometries[D]=m;else if("icosahedron"===l.type)m=new THREE.IcosahedronGeometry(l.radius,l.subdivisions),A.geometries[D]=
 m;else if(l.type in this.geometryHandlerMap){L={};for(q in l)"type"!==q&&"url"!==q&&(L[q]=l[q]);this.geometryHandlerMap[l.type].loaderObject.load(d(l.url,G.urlBaseType),g(D),L)}else"embedded"===l.type&&(L=G.embeds[l.id],L.metadata=G.metadata,L&&this.geometryHandlerMap.ascii.loaderObject.createModel(L,i(D),""));for(var y in G.textures)if(D=G.textures[y],D.url instanceof Array){F+=D.url.length;for(q=0;q<D.url.length;q++)n.onLoadStart()}else F+=1,n.onLoadStart();z=F;for(y in G.textures){D=G.textures[y];
 void 0!==D.mapping&&void 0!==THREE[D.mapping]&&(D.mapping=new THREE[D.mapping]);if(D.url instanceof Array){L=D.url.length;l=[];for(q=0;q<L;q++)l[q]=d(D.url[q],G.urlBaseType);q=(q=l[0].endsWith(".dds"))?THREE.ImageUtils.loadCompressedTextureCube(l,D.mapping,I(L)):THREE.ImageUtils.loadTextureCube(l,D.mapping,I(L))}else q=D.url.toLowerCase().endsWith(".dds"),L=d(D.url,G.urlBaseType),l=I(1),q=q?THREE.ImageUtils.loadCompressedTexture(L,D.mapping,l):THREE.ImageUtils.loadTexture(L,D.mapping,l),void 0!==
 THREE[D.minFilter]&&(q.minFilter=THREE[D.minFilter]),void 0!==THREE[D.magFilter]&&(q.magFilter=THREE[D.magFilter]),D.anisotropy&&(q.anisotropy=D.anisotropy),D.repeat&&(q.repeat.set(D.repeat[0],D.repeat[1]),1!==D.repeat[0]&&(q.wrapS=THREE.RepeatWrapping),1!==D.repeat[1]&&(q.wrapT=THREE.RepeatWrapping)),D.offset&&q.offset.set(D.offset[0],D.offset[1]),D.wrap&&(L={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping},void 0!==L[D.wrap[0]]&&(q.wrapS=L[D.wrap[0]]),void 0!==L[D.wrap[1]]&&(q.wrapT=

+ 30 - 24
src/loaders/SceneLoader.js

@@ -181,51 +181,55 @@ THREE.SceneLoader.prototype.parse = function ( json, callbackFinished, url ) {
 
 				// meshes
 
-				if ( objJSON.type && ( objJSON.type in scope.hierarchyHandlerMap ) && objJSON.loading === undefined ) {
+				if ( objJSON.type && ( objJSON.type in scope.hierarchyHandlerMap ) ) {
 
-					var reservedTypes = { "type": 1, "url": 1, "material": 1,
-										  "position": 1, "rotation": 1, "scale" : 1,
-										  "visible": 1, "children": 1, "properties": 1,
-										  "skin": 1, "morph": 1, "mirroredLoop": 1, "duration": 1 };
+					if ( objJSON.loading === undefined ) {
 
-					var loaderParameters = {};
+						var reservedTypes = { "type": 1, "url": 1, "material": 1,
+											  "position": 1, "rotation": 1, "scale" : 1,
+											  "visible": 1, "children": 1, "properties": 1,
+											  "skin": 1, "morph": 1, "mirroredLoop": 1, "duration": 1 };
 
-					for ( var parType in objJSON ) {
+						var loaderParameters = {};
 
-						if ( ! ( parType in reservedTypes ) ) {
+						for ( var parType in objJSON ) {
 
-							loaderParameters[ parType ] = objJSON[ parType ];
+							if ( ! ( parType in reservedTypes ) ) {
+
+								loaderParameters[ parType ] = objJSON[ parType ];
+
+							}
 
 						}
 
-					}
+						material = result.materials[ objJSON.material ];
 
-					material = result.materials[ objJSON.material ];
+						objJSON.loading = true;
 
-					objJSON.loading = true;
+						var loader = scope.hierarchyHandlerMap[ objJSON.type ][ "loaderObject" ];
 
-					var loader = scope.hierarchyHandlerMap[ objJSON.type ][ "loaderObject" ];
+						// OBJLoader
 
-					// OBJLoader
+						if ( loader.addEventListener ) {
 
-					if ( loader.addEventListener ) {
+							loader.addEventListener( 'load', create_callback_hierachy( objID, parent, material, objJSON ) );
+							loader.load( get_url( objJSON.url, data.urlBaseType ) );
 
-						loader.addEventListener( 'load', create_callback_hierachy( objID, parent, material, objJSON ) );
-						loader.load( get_url( objJSON.url, data.urlBaseType ) );
+						} else {
 
-					} else {
+							// ColladaLoader
 
-						// ColladaLoader
+							if ( loader.options ) {
 
-						if ( loader.options ) {
+								loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) );
 
-							loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) );
+							// UTF8Loader
 
-						// UTF8Loader
+							} else {
 
-						} else {
+								loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ), loaderParameters );
 
-							loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ), loaderParameters );
+							}
 
 						}
 
@@ -542,6 +546,8 @@ THREE.SceneLoader.prototype.parse = function ( json, callbackFinished, url ) {
 
 		parent.add( node );
 
+		node.name = id;
+
 		result.objects[ id ] = node;
 		handle_objects();