diff --git a/build/three.js b/build/three.js index 58ff4f8a07556a2560fc128fcb7a1cab3f79ad38..3d1bd3140696c2a2449c9f9b9e8f344c4427c5bd 100644 --- a/build/three.js +++ b/build/three.js @@ -6846,13 +6846,11 @@ THREE.Loader.prototype = { }, - hasNormals: function ( scope ) { + needsTangents: function ( materials ) { - var m, i, il = scope.materials.length; + for( var i = 0, il = materials.length; i < il; i ++ ) { - for( i = 0; i < il; i ++ ) { - - m = scope.materials[ i ]; + var m = materials[ i ]; if ( m instanceof THREE.ShaderMaterial ) return true; @@ -7318,7 +7316,7 @@ THREE.BinaryLoader.prototype.loadAjaxBuffers = function ( json, callback, binary // Binary AJAX parser -THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texturePath, materials ) { +THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texturePath, jsonMaterials ) { var Model = function ( texturePath ) { @@ -7399,8 +7397,6 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture this.computeCentroids(); this.computeFaceNormals(); - if ( THREE.Loader.prototype.hasNormals( this ) ) this.computeTangents(); - function handlePadding( n ) { return ( n % 4 ) ? ( 4 - n % 4 ) : 0; @@ -7961,7 +7957,12 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture Model.prototype = Object.create( THREE.Geometry.prototype ); - callback( new Model( texturePath ), this.initMaterials( materials, texturePath ) ); + var geometry = new Model( texturePath ); + var materials = this.initMaterials( jsonMaterials, texturePath ); + + if ( this.needsTangents( materials ) ) geometry.computeTangents(); + + callback( geometry, materials ); }; /** @@ -8111,9 +8112,6 @@ THREE.JSONLoader.prototype.createModel = function ( json, callback, texturePath geometry.computeCentroids(); geometry.computeFaceNormals(); - if ( this.hasNormals( geometry ) ) geometry.computeTangents(); - - function parseModel( scale ) { function isBitSet( value, position ) { @@ -8431,6 +8429,8 @@ THREE.JSONLoader.prototype.createModel = function ( json, callback, texturePath var materials = this.initMaterials( json.materials, texturePath ); + if ( this.needsTangents( materials ) ) geometry.computeTangents(); + callback( geometry, materials ); }; @@ -8706,16 +8706,10 @@ THREE.SceneLoader.prototype.parse = function ( json, callbackFinished, url ) { if ( geometry ) { - var hasNormals = false; + var needsTangents = false; material = result.materials[ o.material ]; - hasNormals = material instanceof THREE.ShaderMaterial; - - if ( hasNormals ) { - - geometry.computeTangents(); - - } + needsTangents = material instanceof THREE.ShaderMaterial; p = o.position; r = o.rotation; @@ -8746,6 +8740,22 @@ THREE.SceneLoader.prototype.parse = function ( json, callbackFinished, url ) { } + if ( material instanceof THREE.MeshFaceMaterial ) { + + for ( var i = 0; i < material.materials.length; i ++ ) { + + needsTangents = needsTangents || ( material.materials[ i ] instanceof THREE.ShaderMaterial ); + + } + + } + + if ( needsTangents ) { + + geometry.computeTangents(); + + } + if ( o.skin ) { object = new THREE.SkinnedMesh( geometry, material ); diff --git a/build/three.min.js b/build/three.min.js index 3beac53f8b394e9bad56b11a82d4c8f6d795a5de..ed2670cc9204da2aca3b4def7817d9152ec748d8 100644 --- a/build/three.min.js +++ b/build/three.min.js @@ -145,14 +145,14 @@ THREE.HemisphereLight=function(a,b,c){THREE.Light.call(this,a);this.groundColor= THREE.SpotLight=function(a,b,c,d,e){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=void 0!==b?b:1;this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/2;this.exponent=void 0!==e?e:10;this.onlyShadow=this.castShadow=!1;this.shadowCameraNear=50;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowCameraVisible=!1;this.shadowBias=0;this.shadowDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=this.shadowCamera= this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=Object.create(THREE.Light.prototype);THREE.Loader=function(a){this.statusDomElement=(this.showStatus=a)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}; THREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:"anonymous",addStatusElement:function(){var a=document.createElement("div");a.style.position="absolute";a.style.right="0px";a.style.top="0px";a.style.fontSize="0.8em";a.style.textAlign="left";a.style.background="rgba(0,0,0,0.25)";a.style.color="#fff";a.style.width="120px";a.style.padding="0.5em 0.5em 0.5em 0.5em";a.style.zIndex=1E3;a.innerHTML="Loading ...";return a},updateProgress:function(a){var b="Loaded ",b=a.total?b+((100*a.loaded/ -a.total).toFixed(0)+"%"):b+((a.loaded/1E3).toFixed(2)+" KB");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split("/");a.pop();return(1>a.length?".":a.join("/"))+"/"},initMaterials:function(a,b){for(var c=[],d=0;da.opacity)i.transparent=a.transparent;void 0!==a.depthTest&&(i.depthTest=a.depthTest);void 0!==a.depthWrite&&(i.depthWrite=a.depthWrite);void 0!==a.visible&&(i.visible=a.visible);void 0!== -a.flipSided&&(i.side=THREE.BackSide);void 0!==a.doubleSided&&(i.side=THREE.DoubleSide);void 0!==a.wireframe&&(i.wireframe=a.wireframe);void 0!==a.vertexColors&&("face"===a.vertexColors?i.vertexColors=THREE.FaceColors:a.vertexColors&&(i.vertexColors=THREE.VertexColors));a.colorDiffuse?i.color=f(a.colorDiffuse):a.DbgColor&&(i.color=a.DbgColor);a.colorSpecular&&(i.specular=f(a.colorSpecular));a.colorAmbient&&(i.ambient=f(a.colorAmbient));a.transparency&&(i.opacity=a.transparency);a.specularCoef&&(i.shininess= -a.specularCoef);a.mapDiffuse&&b&&e(i,"map",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap,a.mapDiffuseAnisotropy);a.mapLight&&b&&e(i,"lightMap",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap,a.mapLightAnisotropy);a.mapBump&&b&&e(i,"bumpMap",a.mapBump,a.mapBumpRepeat,a.mapBumpOffset,a.mapBumpWrap,a.mapBumpAnisotropy);a.mapNormal&&b&&e(i,"normalMap",a.mapNormal,a.mapNormalRepeat,a.mapNormalOffset,a.mapNormalWrap,a.mapNormalAnisotropy);a.mapSpecular&&b&&e(i,"specularMap", -a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset,a.mapSpecularWrap,a.mapSpecularAnisotropy);a.mapBumpScale&&(i.bumpScale=a.mapBumpScale);a.mapNormal?(h=THREE.ShaderUtils.lib.normal,j=THREE.UniformsUtils.clone(h.uniforms),j.tNormal.value=i.normalMap,a.mapNormalFactor&&j.uNormalScale.value.set(a.mapNormalFactor,a.mapNormalFactor),i.map&&(j.tDiffuse.value=i.map,j.enableDiffuse.value=!0),i.specularMap&&(j.tSpecular.value=i.specularMap,j.enableSpecular.value=!0),i.lightMap&&(j.tAO.value=i.lightMap, -j.enableAO.value=!0),j.uDiffuseColor.value.setHex(i.color),j.uSpecularColor.value.setHex(i.specular),j.uAmbientColor.value.setHex(i.ambient),j.uShininess.value=i.shininess,void 0!==i.opacity&&(j.uOpacity.value=i.opacity),i=new THREE.ShaderMaterial({fragmentShader:h.fragmentShader,vertexShader:h.vertexShader,uniforms:j,lights:!0,fog:!0})):i=new THREE[h](i);void 0!==a.DbgName&&(i.name=a.DbgName);return i}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};THREE.BinaryLoader.prototype=Object.create(THREE.Loader.prototype); +a.total).toFixed(0)+"%"):b+((a.loaded/1E3).toFixed(2)+" KB");this.statusDomElement.innerHTML=b},extractUrlBase:function(a){a=a.split("/");a.pop();return(1>a.length?".":a.join("/"))+"/"},initMaterials:function(a,b){for(var c=[],d=0;da.opacity)i.transparent=a.transparent;void 0!==a.depthTest&&(i.depthTest=a.depthTest);void 0!==a.depthWrite&&(i.depthWrite=a.depthWrite);void 0!==a.visible&&(i.visible=a.visible);void 0!==a.flipSided&&(i.side=THREE.BackSide); +void 0!==a.doubleSided&&(i.side=THREE.DoubleSide);void 0!==a.wireframe&&(i.wireframe=a.wireframe);void 0!==a.vertexColors&&("face"===a.vertexColors?i.vertexColors=THREE.FaceColors:a.vertexColors&&(i.vertexColors=THREE.VertexColors));a.colorDiffuse?i.color=f(a.colorDiffuse):a.DbgColor&&(i.color=a.DbgColor);a.colorSpecular&&(i.specular=f(a.colorSpecular));a.colorAmbient&&(i.ambient=f(a.colorAmbient));a.transparency&&(i.opacity=a.transparency);a.specularCoef&&(i.shininess=a.specularCoef);a.mapDiffuse&& +b&&e(i,"map",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap,a.mapDiffuseAnisotropy);a.mapLight&&b&&e(i,"lightMap",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap,a.mapLightAnisotropy);a.mapBump&&b&&e(i,"bumpMap",a.mapBump,a.mapBumpRepeat,a.mapBumpOffset,a.mapBumpWrap,a.mapBumpAnisotropy);a.mapNormal&&b&&e(i,"normalMap",a.mapNormal,a.mapNormalRepeat,a.mapNormalOffset,a.mapNormalWrap,a.mapNormalAnisotropy);a.mapSpecular&&b&&e(i,"specularMap",a.mapSpecular,a.mapSpecularRepeat, +a.mapSpecularOffset,a.mapSpecularWrap,a.mapSpecularAnisotropy);a.mapBumpScale&&(i.bumpScale=a.mapBumpScale);a.mapNormal?(h=THREE.ShaderUtils.lib.normal,j=THREE.UniformsUtils.clone(h.uniforms),j.tNormal.value=i.normalMap,a.mapNormalFactor&&j.uNormalScale.value.set(a.mapNormalFactor,a.mapNormalFactor),i.map&&(j.tDiffuse.value=i.map,j.enableDiffuse.value=!0),i.specularMap&&(j.tSpecular.value=i.specularMap,j.enableSpecular.value=!0),i.lightMap&&(j.tAO.value=i.lightMap,j.enableAO.value=!0),j.uDiffuseColor.value.setHex(i.color), +j.uSpecularColor.value.setHex(i.specular),j.uAmbientColor.value.setHex(i.ambient),j.uShininess.value=i.shininess,void 0!==i.opacity&&(j.uOpacity.value=i.opacity),i=new THREE.ShaderMaterial({fragmentShader:h.fragmentShader,vertexShader:h.vertexShader,uniforms:j,lights:!0,fog:!0})):i=new THREE[h](i);void 0!==a.DbgName&&(i.name=a.DbgName);return i}};THREE.BinaryLoader=function(a){THREE.Loader.call(this,a)};THREE.BinaryLoader.prototype=Object.create(THREE.Loader.prototype); THREE.BinaryLoader.prototype.load=function(a,b,c,d){var c=c&&"string"===typeof c?c:this.extractUrlBase(a),d=d&&"string"===typeof d?d:this.extractUrlBase(a),e=this.showProgress?THREE.Loader.prototype.updateProgress:null;this.onLoadStart();this.loadAjaxJSON(this,a,b,c,d,e)}; THREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(4==g.readyState)if(200==g.status||0==g.status){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error("THREE.BinaryLoader: Couldn't load ["+b+"] ["+g.status+"]")};g.open("GET",b,!0);g.send(null)}; THREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+"/"+a.buffers,h=0;f.onreadystatechange=function(){if(4==f.readyState)if(200==f.status||0==f.status){var c=f.response;void 0===c&&(c=(new Uint8Array(f.responseBody)).buffer);THREE.BinaryLoader.prototype.createBinModel(c,b,d,a.materials)}else console.error("THREE.BinaryLoader: Couldn't load ["+g+"] ["+f.status+"]");else 3==f.readyState?e&&(0==h&&(h=f.getResponseHeader("Content-Length")),e({total:h,loaded:f.responseText.length})): @@ -164,8 +164,8 @@ j],I[3*j+1],I[3*j+2]),new THREE.Vector3(o,p,l),new THREE.Vector3(s,q,n)],null,i) q,n),new THREE.Vector3(r,t,m),new THREE.Vector3(u,v,o)],null,j))}}var J=this,H=0,I=[],L=[],P,S,U;THREE.Geometry.call(this);r=a;S=H;A=new Uint8Array(r,S,12);o="";for(q=0;12>q;q++)o+=String.fromCharCode(A[S+q]);b=z(r,S+12);z(r,S+13);z(r,S+14);z(r,S+15);c=z(r,S+16);d=z(r,S+17);e=z(r,S+18);j=z(r,S+19);l=v(r,S+20);m=v(r,S+20+4);n=v(r,S+20+8);p=v(r,S+20+12);o=v(r,S+20+16);s=v(r,S+20+20);t=v(r,S+20+24);q=v(r,S+20+28);A=v(r,S+20+32);w=v(r,S+20+36);r=v(r,S+20+40);H+=b;S=3*c+j;U=4*c+j;P=p*S;b=o*(S+3*d);c=s* (S+3*e);j=t*(S+3*d+3*e);S=q*U;d=A*(U+4*d);e=w*(U+4*e);U=H;var H=new Float32Array(a,H,3*l),M,O,Q,Z;for(M=0;Mq.parameters.opacity&&(q.parameters.transparent=!0);q.parameters.normalMap?(s=THREE.ShaderUtils.lib.normal,Z=THREE.UniformsUtils.clone(s.uniforms),n=q.parameters.color,B=q.parameters.specular,K=q.parameters.ambient,o=q.parameters.shininess,Z.tNormal.value=M.textures[q.parameters.normalMap],q.parameters.normalScale&&Z.uNormalScale.value.set(q.parameters.normalScale[0],q.parameters.normalScale[1]),q.parameters.map&& -(Z.tDiffuse.value=q.parameters.map,Z.enableDiffuse.value=!0),q.parameters.envMap&&(Z.tCube.value=q.parameters.envMap,Z.enableReflection.value=!0,Z.uReflectivity.value=q.parameters.reflectivity),q.parameters.lightMap&&(Z.tAO.value=q.parameters.lightMap,Z.enableAO.value=!0),q.parameters.specularMap&&(Z.tSpecular.value=M.textures[q.parameters.specularMap],Z.enableSpecular.value=!0),q.parameters.displacementMap&&(Z.tDisplacement.value=M.textures[q.parameters.displacementMap],Z.enableDisplacement.value= -!0,Z.uDisplacementBias.value=q.parameters.displacementBias,Z.uDisplacementScale.value=q.parameters.displacementScale),Z.uDiffuseColor.value.setHex(n),Z.uSpecularColor.value.setHex(B),Z.uAmbientColor.value.setHex(K),Z.uShininess.value=o,q.parameters.opacity&&(Z.uOpacity.value=q.parameters.opacity),C=new THREE.ShaderMaterial({fragmentShader:s.fragmentShader,vertexShader:s.vertexShader,uniforms:Z,lights:!0,fog:!0})):C=new THREE[q.type](q.parameters);M.materials[p]=C}for(p in Q.materials)if(q=Q.materials[p], -q.parameters.materials){u=[];for(B=0;Bq.parameters.opacity&&(q.parameters.transparent=!0);q.parameters.normalMap?(s=THREE.ShaderUtils.lib.normal,Z=THREE.UniformsUtils.clone(s.uniforms),n=q.parameters.color,B=q.parameters.specular,K=q.parameters.ambient,o=q.parameters.shininess,Z.tNormal.value=M.textures[q.parameters.normalMap],q.parameters.normalScale&&Z.uNormalScale.value.set(q.parameters.normalScale[0], +q.parameters.normalScale[1]),q.parameters.map&&(Z.tDiffuse.value=q.parameters.map,Z.enableDiffuse.value=!0),q.parameters.envMap&&(Z.tCube.value=q.parameters.envMap,Z.enableReflection.value=!0,Z.uReflectivity.value=q.parameters.reflectivity),q.parameters.lightMap&&(Z.tAO.value=q.parameters.lightMap,Z.enableAO.value=!0),q.parameters.specularMap&&(Z.tSpecular.value=M.textures[q.parameters.specularMap],Z.enableSpecular.value=!0),q.parameters.displacementMap&&(Z.tDisplacement.value=M.textures[q.parameters.displacementMap], +Z.enableDisplacement.value=!0,Z.uDisplacementBias.value=q.parameters.displacementBias,Z.uDisplacementScale.value=q.parameters.displacementScale),Z.uDiffuseColor.value.setHex(n),Z.uSpecularColor.value.setHex(B),Z.uAmbientColor.value.setHex(K),Z.uShininess.value=o,q.parameters.opacity&&(Z.uOpacity.value=q.parameters.opacity),C=new THREE.ShaderMaterial({fragmentShader:s.fragmentShader,vertexShader:s.vertexShader,uniforms:Z,lights:!0,fog:!0})):C=new THREE[q.type](q.parameters);M.materials[p]=C}for(p in Q.materials)if(q= +Q.materials[p],q.parameters.materials){u=[];for(B=0;B