瀏覽代碼

Merge remote-tracking branch 'alteredq/unflip' into dev

Mr.doob 13 年之前
父節點
當前提交
5fd757763d
共有 6 個文件被更改,包括 21 次插入19 次删除
  1. 6 6
      build/Three.js
  2. 1 1
      build/custom/ThreeCanvas.js
  3. 5 4
      build/custom/ThreeExtras.js
  4. 1 1
      build/custom/ThreeWebGL.js
  5. 3 2
      src/extras/ImageUtils.js
  6. 5 5
      src/loaders/ImageLoader.js

+ 6 - 6
build/Three.js

@@ -150,7 +150,7 @@ r=E(a,B+20+16);o=E(a,B+20+20);q=E(a,B+20+24);s=E(a,B+20+28);x=E(a,B+20+32);t=E(a
 G.push(d/127,f/127,e/127)}}return n*3*Int8Array.BYTES_PER_ELEMENT}(B);B=B+z(n*3);B=B+function(b){if(p){var b=new Float32Array(a,b,p*2),c,d,f;for(c=0;c<p;c++){d=b[c*2];f=b[c*2+1];Q.push(d,f)}}return p*2*Float32Array.BYTES_PER_ELEMENT}(B);F=B+F+z(b*2);ba=F+ba+z(r*2);e=ba+e+z(o*2);l=e+l+z(q*2);c=l+c+z(s*2);i=c+i+z(x*2);j=i+j+z(t*2);(function(a){if(o){var b=a+o*Uint32Array.BYTES_PER_ELEMENT*3;H(o,a,b+o*Uint32Array.BYTES_PER_ELEMENT*3);A(o,b)}})(ba);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*
 3,c=b+q*Uint32Array.BYTES_PER_ELEMENT*3;M(q,a,b,c+q*Uint32Array.BYTES_PER_ELEMENT*3);A(q,c)}})(e);(function(a){if(t){var b=a+t*Uint32Array.BYTES_PER_ELEMENT*4;J(t,a,b+t*Uint32Array.BYTES_PER_ELEMENT*4);u(t,b)}})(i);(function(a){if(w){var b=a+w*Uint32Array.BYTES_PER_ELEMENT*4,c=b+w*Uint32Array.BYTES_PER_ELEMENT*4;O(w,a,b,c+w*Uint32Array.BYTES_PER_ELEMENT*4);u(w,c)}})(j);b&&H(b,B,B+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3;M(r,a,b,b+r*Uint32Array.BYTES_PER_ELEMENT*
 3)}})(F);s&&J(s,l,l+s*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(x){var b=a+x*Uint32Array.BYTES_PER_ELEMENT*4;O(x,a,b,b+x*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=Object.create(THREE.Geometry.prototype);b(new e(c))};THREE.ImageLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
-THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a){var b=this,c=new Image;c.addEventListener("load",function(){b.dispatchEvent({type:"load",content:c})},false);c.addEventListener("error",function(){b.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);if(b.crossOrigin)c.crossOrigin=b.crossOrigin;c.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);
+THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b){var c=this;b===void 0&&(b=new Image);b.addEventListener("load",function(){c.dispatchEvent({type:"load",content:b})},false);b.addEventListener("error",function(){c.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);if(c.crossOrigin)b.crossOrigin=c.crossOrigin;b.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);
 THREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};
 THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+f.status+"]");else if(f.readyState===f.LOADING){if(e){g===0&&(g=f.getResponseHeader("Content-Length"));
 e({total:g,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader("Content-Length"))};f.open("GET",b,true);f.overrideMimeType&&f.overrideMimeType("text/plain; charset=x-user-defined");f.setRequestHeader("Content-Type","text/plain");f.send(null)};
@@ -483,11 +483,11 @@ t.vertexNormals[2].copy(g);w.vertexNormals[0].copy(f);w.vertexNormals[3].copy(g)
 f.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);t.vertexNormals[2].copy(f);t.vertexNormals[3].copy(g);w.vertexNormals[0].copy(g);w.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);t.vertexColors[2].copy(f);t.vertexColors[3].copy(g);w.vertexColors[0].copy(g);w.vertexColors[1].copy(f)}e=1}z.push(t,w);a.vertices.push(p,l);
 f=0;for(g=a.faceVertexUvs.length;f<g;f++)if(a.faceVertexUvs[f].length){j=a.faceVertexUvs[f][c];w=j[0];h=j[1];t=j[2];j=j[3];if(e===0){l=w.clone();l.lerpSelf(h,0.5);m=t.clone();m.lerpSelf(j,0.5);w=[w.clone(),l.clone(),m.clone(),j.clone()];h=[l.clone(),h.clone(),t.clone(),m.clone()]}else{l=h.clone();l.lerpSelf(t,0.5);m=j.clone();m.lerpSelf(w,0.5);w=[w.clone(),h.clone(),l.clone(),m.clone()];h=[m.clone(),l.clone(),t.clone(),j.clone()]}C[f].push(w,h)}}else{z.push(e);f=0;for(g=a.faceVertexUvs.length;f<g;f++)C[f].push(a.faceVertexUvs[f][c])}}}a.faces=
 z;a.faceVertexUvs=C}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;
-THREE.ImageUtils={crossOrigin:"anonymous",loadTexture:function(a,b,c,d){var e=new THREE.Texture(void 0,b),b=new THREE.ImageLoader;b.addEventListener("load",function(a){e.image=a.content;e.needsUpdate=true;c&&c(e)});b.addEventListener("error",function(a){d&&d(a.message)});b.crossOrigin=this.crossOrigin;b.load(a);return e},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b);f.flipY=false;b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=e.loadCount+
-1;if(e.loadCount===6){f.needsUpdate=true;c&&c()}};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,b){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement("canvas");f.width=d;f.height=e;var g=f.getContext("2d");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,i=g.createImageData(d,e),j=i.data,l=0;l<d;l++)for(var m=0;m<e;m++){var n=m-1<0?0:m-1,p=m+1>e-1?e-1:m+1,r=
-l-1<0?0:l-1,o=l+1>d-1?d-1:l+1,q=[],s=[0,0,h[(m*d+l)*4]/255*b];q.push([-1,0,h[(m*d+r)*4]/255*b]);q.push([-1,-1,h[(n*d+r)*4]/255*b]);q.push([0,-1,h[(n*d+l)*4]/255*b]);q.push([1,-1,h[(n*d+o)*4]/255*b]);q.push([1,0,h[(m*d+o)*4]/255*b]);q.push([1,1,h[(p*d+o)*4]/255*b]);q.push([0,1,h[(p*d+l)*4]/255*b]);q.push([-1,1,h[(p*d+r)*4]/255*b]);n=[];r=q.length;for(p=0;p<r;p++){var o=q[p],x=q[(p+1)%r],o=[o[0]-s[0],o[1]-s[1],o[2]-s[2]],x=[x[0]-s[0],x[1]-s[1],x[2]-s[2]];n.push(c([o[1]*x[2]-o[2]*x[1],o[2]*x[0]-o[0]*
-x[2],o[0]*x[1]-o[1]*x[0]]))}q=[0,0,0];for(p=0;p<n.length;p++){q[0]=q[0]+n[p][0];q[1]=q[1]+n[p][1];q[2]=q[2]+n[p][2]}q[0]=q[0]/n.length;q[1]=q[1]/n.length;q[2]=q[2]/n.length;s=(m*d+l)*4;j[s]=(q[0]+1)/2*255|0;j[s+1]=(q[1]+1)/2*255|0;j[s+2]=q[2]*255|0;j[s+3]=255}g.putImageData(i,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,a,
-b,THREE.RGBFormat);a.needsUpdate=true;return a}};
+THREE.ImageUtils={crossOrigin:"anonymous",loadTexture:function(a,b,c,d){var e=new Image,f=new THREE.Texture(e,b),b=new THREE.ImageLoader;b.addEventListener("load",function(a){f.image=a.content;f.needsUpdate=true;c&&c(f)});b.addEventListener("error",function(a){d&&d(a.message)});b.crossOrigin=this.crossOrigin;b.load(a,e);return f},loadTextureCube:function(a,b,c){var d,e=[],f=new THREE.Texture(e,b);f.flipY=false;b=e.loadCount=0;for(d=a.length;b<d;++b){e[b]=new Image;e[b].onload=function(){e.loadCount=
+e.loadCount+1;if(e.loadCount===6){f.needsUpdate=true;c&&c()}};e[b].crossOrigin=this.crossOrigin;e[b].src=a[b]}return f},getNormalMap:function(a,b){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,e=a.height,f=document.createElement("canvas");f.width=d;f.height=e;var g=f.getContext("2d");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,e).data,i=g.createImageData(d,e),j=i.data,l=0;l<d;l++)for(var m=0;m<e;m++){var n=m-1<0?0:m-1,p=m+1>e-
+1?e-1:m+1,r=l-1<0?0:l-1,o=l+1>d-1?d-1:l+1,q=[],s=[0,0,h[(m*d+l)*4]/255*b];q.push([-1,0,h[(m*d+r)*4]/255*b]);q.push([-1,-1,h[(n*d+r)*4]/255*b]);q.push([0,-1,h[(n*d+l)*4]/255*b]);q.push([1,-1,h[(n*d+o)*4]/255*b]);q.push([1,0,h[(m*d+o)*4]/255*b]);q.push([1,1,h[(p*d+o)*4]/255*b]);q.push([0,1,h[(p*d+l)*4]/255*b]);q.push([-1,1,h[(p*d+r)*4]/255*b]);n=[];r=q.length;for(p=0;p<r;p++){var o=q[p],x=q[(p+1)%r],o=[o[0]-s[0],o[1]-s[1],o[2]-s[2]],x=[x[0]-s[0],x[1]-s[1],x[2]-s[2]];n.push(c([o[1]*x[2]-o[2]*x[1],o[2]*
+x[0]-o[0]*x[2],o[0]*x[1]-o[1]*x[0]]))}q=[0,0,0];for(p=0;p<n.length;p++){q[0]=q[0]+n[p][0];q[1]=q[1]+n[p][1];q[2]=q[2]+n[p][2]}q[0]=q[0]/n.length;q[1]=q[1]/n.length;q[2]=q[2]/n.length;s=(m*d+l)*4;j[s]=(q[0]+1)/2*255|0;j[s+1]=(q[1]+1)/2*255|0;j[s+2]=q[2]*255|0;j[s+3]=255}g.putImageData(i,0,0);return f},generateDataTexture:function(a,b,c){for(var d=a*b,e=new Uint8Array(3*d),f=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){e[h*3]=f;e[h*3+1]=g;e[h*3+2]=c}a=new THREE.DataTexture(e,
+a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};
 THREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,e=a.children.length;for(d=0;d<e;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(a,b[c]);e.add(f)}return e},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);
 b.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);
 else if(a instanceof THREE.ParticleSystem){b=new THREE.ParticleSystem(a.geometry,a.material);b.sortParticles=a.sortParticles}else if(a instanceof THREE.Particle)b=new THREE.Particle(a.material);else if(a instanceof THREE.Sprite){b=new THREE.Sprite({});b.color.copy(a.color);b.map=a.map;b.blending=a.blending;b.useScreenCoordinates=a.useScreenCoordinates;b.mergeWith3D=a.mergeWith3D;b.affectedByDistance=a.affectedByDistance;b.scaleByViewport=a.scaleByViewport;b.alignment=a.alignment;b.rotation3d.copy(a.rotation3d);

+ 1 - 1
build/custom/ThreeCanvas.js

@@ -143,7 +143,7 @@ y(a,t+20+16);l=y(a,t+20+20);p=y(a,t+20+24);r=y(a,t+20+28);u=y(a,t+20+32);v=y(a,t
 127,e/127,g/127)}}return i*3*Int8Array.BYTES_PER_ELEMENT}(t);t=t+x(i*3);t=t+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];I.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(t);O=t+O+x(b*2);P=O+P+x(q*2);f=P+f+x(l*2);h=f+h+x(p*2);c=h+c+x(r*2);m=c+m+x(u*2);k=m+k+x(v*2);(function(a){if(l){var b=a+l*Uint32Array.BYTES_PER_ELEMENT*3;w(l,a,b+l*Uint32Array.BYTES_PER_ELEMENT*3);E(l,b)}})(P);(function(a){if(p){var b=a+p*Uint32Array.BYTES_PER_ELEMENT*3,c=b+
 p*Uint32Array.BYTES_PER_ELEMENT*3;K(p,a,b,c+p*Uint32Array.BYTES_PER_ELEMENT*3);E(p,c)}})(f);(function(a){if(v){var b=a+v*Uint32Array.BYTES_PER_ELEMENT*4;C(v,a,b+v*Uint32Array.BYTES_PER_ELEMENT*4);s(v,b)}})(m);(function(a){if(B){var b=a+B*Uint32Array.BYTES_PER_ELEMENT*4,c=b+B*Uint32Array.BYTES_PER_ELEMENT*4;M(B,a,b,c+B*Uint32Array.BYTES_PER_ELEMENT*4);s(B,c)}})(k);b&&w(b,t,t+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;K(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*
 3)}})(O);r&&C(r,h,h+r*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(u){var b=a+u*Uint32Array.BYTES_PER_ELEMENT*4;M(u,a,b,b+u*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};f.prototype=Object.create(THREE.Geometry.prototype);b(new f(c))};THREE.ImageLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
-THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a){var b=this,c=new Image;c.addEventListener("load",function(){b.dispatchEvent({type:"load",content:c})},false);c.addEventListener("error",function(){b.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);if(b.crossOrigin)c.crossOrigin=b.crossOrigin;c.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);
+THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b){var c=this;b===void 0&&(b=new Image);b.addEventListener("load",function(){c.dispatchEvent({type:"load",content:b})},false);b.addEventListener("error",function(){c.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);if(c.crossOrigin)b.crossOrigin=c.crossOrigin;b.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);
 THREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};
 THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,f){var e=new XMLHttpRequest,g=0;e.onreadystatechange=function(){if(e.readyState===e.DONE)if(e.status===200||e.status===0){if(e.responseText){var j=JSON.parse(e.responseText);a.createModel(j,c,d)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+e.status+"]");else if(e.readyState===e.LOADING){if(f){g===0&&(g=e.getResponseHeader("Content-Length"));
 f({total:g,loaded:e.responseText.length})}}else e.readyState===e.HEADERS_RECEIVED&&(g=e.getResponseHeader("Content-Length"))};e.open("GET",b,true);e.overrideMimeType&&e.overrideMimeType("text/plain; charset=x-user-defined");e.setRequestHeader("Content-Type","text/plain");e.send(null)};

+ 5 - 4
build/custom/ThreeExtras.js

@@ -21,10 +21,11 @@ b.vertices.length+1;t=e.clone();r=e.clone();k>=o&&k>=q&&k>=p||q>=o&&q>=k&&q>=p?(
 f.lerpSelf(e.vertexColors[1],0.5),g=e.vertexColors[2].clone(),g.lerpSelf(e.vertexColors[3],0.5),t.vertexColors[1].copy(f),t.vertexColors[2].copy(g),r.vertexColors[0].copy(f),r.vertexColors[3].copy(g)),e=0):(k=l.clone(),k.lerpSelf(m,0.5),l=n.clone(),l.lerpSelf(j,0.5),t.a=f,t.b=g,t.c=s,t.d=u,r.a=u,r.b=s,r.c=h,r.d=i,4===e.vertexNormals.length&&(f=e.vertexNormals[1].clone(),f.lerpSelf(e.vertexNormals[2],0.5),g=e.vertexNormals[3].clone(),g.lerpSelf(e.vertexNormals[0],0.5),t.vertexNormals[2].copy(f),t.vertexNormals[3].copy(g),
 r.vertexNormals[0].copy(g),r.vertexNormals[1].copy(f)),4===e.vertexColors.length&&(f=e.vertexColors[1].clone(),f.lerpSelf(e.vertexColors[2],0.5),g=e.vertexColors[3].clone(),g.lerpSelf(e.vertexColors[0],0.5),t.vertexColors[2].copy(f),t.vertexColors[3].copy(g),r.vertexColors[0].copy(g),r.vertexColors[1].copy(f)),e=1);v.push(t,r);b.vertices.push(k,l);f=0;for(g=b.faceVertexUvs.length;f<g;f++)b.faceVertexUvs[f].length&&(j=b.faceVertexUvs[f][c],r=j[0],h=j[1],t=j[2],j=j[3],0===e?(l=r.clone(),l.lerpSelf(h,
 0.5),m=t.clone(),m.lerpSelf(j,0.5),r=[r.clone(),l.clone(),m.clone(),j.clone()],h=[l.clone(),h.clone(),t.clone(),m.clone()]):(l=h.clone(),l.lerpSelf(t,0.5),m=j.clone(),m.lerpSelf(r,0.5),r=[r.clone(),h.clone(),l.clone(),m.clone()],h=[m.clone(),l.clone(),t.clone(),j.clone()]),z[f].push(r,h))}else{v.push(e);f=0;for(g=b.faceVertexUvs.length;f<g;f++)z[f].push(b.faceVertexUvs[f][c])}b.faces=v;b.faceVertexUvs=z}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;
-THREE.ImageUtils={crossOrigin:"anonymous",loadTexture:function(b,a,c,d){var e=new THREE.Texture(void 0,a),a=new THREE.ImageLoader;a.addEventListener("load",function(a){e.image=a.content;e.needsUpdate=!0;c&&c(e)});a.addEventListener("error",function(a){d&&d(a.message)});a.crossOrigin=this.crossOrigin;a.load(b);return e},loadTextureCube:function(b,a,c){var d,e=[],f=new THREE.Texture(e,a);f.flipY=!1;a=e.loadCount=0;for(d=b.length;a<d;++a)e[a]=new Image,e[a].onload=function(){e.loadCount+=1;6===e.loadCount&&
-(f.needsUpdate=!0,c&&c())},e[a].crossOrigin=this.crossOrigin,e[a].src=b[a];return f},getNormalMap:function(b,a){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},a=a|1,d=b.width,e=b.height,f=document.createElement("canvas");f.width=d;f.height=e;var g=f.getContext("2d");g.drawImage(b,0,0);for(var h=g.getImageData(0,0,d,e).data,i=g.createImageData(d,e),j=i.data,l=0;l<d;l++)for(var m=0;m<e;m++){var n=0>m-1?0:m-1,k=m+1>e-1?e-1:m+1,o=0>l-1?0:l-1,q=l+1>d-1?d-
-1:l+1,p=[],s=[0,0,h[4*(m*d+l)]/255*a];p.push([-1,0,h[4*(m*d+o)]/255*a]);p.push([-1,-1,h[4*(n*d+o)]/255*a]);p.push([0,-1,h[4*(n*d+l)]/255*a]);p.push([1,-1,h[4*(n*d+q)]/255*a]);p.push([1,0,h[4*(m*d+q)]/255*a]);p.push([1,1,h[4*(k*d+q)]/255*a]);p.push([0,1,h[4*(k*d+l)]/255*a]);p.push([-1,1,h[4*(k*d+o)]/255*a]);n=[];o=p.length;for(k=0;k<o;k++){var q=p[k],u=p[(k+1)%o],q=[q[0]-s[0],q[1]-s[1],q[2]-s[2]],u=[u[0]-s[0],u[1]-s[1],u[2]-s[2]];n.push(c([q[1]*u[2]-q[2]*u[1],q[2]*u[0]-q[0]*u[2],q[0]*u[1]-q[1]*u[0]]))}p=
-[0,0,0];for(k=0;k<n.length;k++)p[0]+=n[k][0],p[1]+=n[k][1],p[2]+=n[k][2];p[0]/=n.length;p[1]/=n.length;p[2]/=n.length;s=4*(m*d+l);j[s]=255*((p[0]+1)/2)|0;j[s+1]=255*((p[1]+1)/2)|0;j[s+2]=255*p[2]|0;j[s+3]=255}g.putImageData(i,0,0);return f},generateDataTexture:function(b,a,c){for(var d=b*a,e=new Uint8Array(3*d),f=Math.floor(255*c.r),g=Math.floor(255*c.g),c=Math.floor(255*c.b),h=0;h<d;h++)e[3*h]=f,e[3*h+1]=g,e[3*h+2]=c;b=new THREE.DataTexture(e,b,a,THREE.RGBFormat);b.needsUpdate=!0;return b}};
+THREE.ImageUtils={crossOrigin:"anonymous",loadTexture:function(b,a,c,d){var e=new Image,f=new THREE.Texture(e,a),a=new THREE.ImageLoader;a.addEventListener("load",function(a){f.image=a.content;f.needsUpdate=!0;c&&c(f)});a.addEventListener("error",function(a){d&&d(a.message)});a.crossOrigin=this.crossOrigin;a.load(b,e);return f},loadTextureCube:function(b,a,c){var d,e=[],f=new THREE.Texture(e,a);f.flipY=!1;a=e.loadCount=0;for(d=b.length;a<d;++a)e[a]=new Image,e[a].onload=function(){e.loadCount+=1;
+6===e.loadCount&&(f.needsUpdate=!0,c&&c())},e[a].crossOrigin=this.crossOrigin,e[a].src=b[a];return f},getNormalMap:function(b,a){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},a=a|1,d=b.width,e=b.height,f=document.createElement("canvas");f.width=d;f.height=e;var g=f.getContext("2d");g.drawImage(b,0,0);for(var h=g.getImageData(0,0,d,e).data,i=g.createImageData(d,e),j=i.data,l=0;l<d;l++)for(var m=0;m<e;m++){var n=0>m-1?0:m-1,k=m+1>e-1?e-1:m+1,o=0>l-1?
+0:l-1,q=l+1>d-1?d-1:l+1,p=[],s=[0,0,h[4*(m*d+l)]/255*a];p.push([-1,0,h[4*(m*d+o)]/255*a]);p.push([-1,-1,h[4*(n*d+o)]/255*a]);p.push([0,-1,h[4*(n*d+l)]/255*a]);p.push([1,-1,h[4*(n*d+q)]/255*a]);p.push([1,0,h[4*(m*d+q)]/255*a]);p.push([1,1,h[4*(k*d+q)]/255*a]);p.push([0,1,h[4*(k*d+l)]/255*a]);p.push([-1,1,h[4*(k*d+o)]/255*a]);n=[];o=p.length;for(k=0;k<o;k++){var q=p[k],u=p[(k+1)%o],q=[q[0]-s[0],q[1]-s[1],q[2]-s[2]],u=[u[0]-s[0],u[1]-s[1],u[2]-s[2]];n.push(c([q[1]*u[2]-q[2]*u[1],q[2]*u[0]-q[0]*u[2],
+q[0]*u[1]-q[1]*u[0]]))}p=[0,0,0];for(k=0;k<n.length;k++)p[0]+=n[k][0],p[1]+=n[k][1],p[2]+=n[k][2];p[0]/=n.length;p[1]/=n.length;p[2]/=n.length;s=4*(m*d+l);j[s]=255*((p[0]+1)/2)|0;j[s+1]=255*((p[1]+1)/2)|0;j[s+2]=255*p[2]|0;j[s+3]=255}g.putImageData(i,0,0);return f},generateDataTexture:function(b,a,c){for(var d=b*a,e=new Uint8Array(3*d),f=Math.floor(255*c.r),g=Math.floor(255*c.g),c=Math.floor(255*c.b),h=0;h<d;h++)e[3*h]=f,e[3*h+1]=g,e[3*h+2]=c;b=new THREE.DataTexture(e,b,a,THREE.RGBFormat);b.needsUpdate=
+!0;return b}};
 THREE.SceneUtils={showHierarchy:function(b,a){THREE.SceneUtils.traverseHierarchy(b,function(b){b.visible=a})},traverseHierarchy:function(b,a){var c,d,e=b.children.length;for(d=0;d<e;d++)c=b.children[d],a(c),THREE.SceneUtils.traverseHierarchy(c,a)},createMultiMaterialObject:function(b,a){var c,d=a.length,e=new THREE.Object3D;for(c=0;c<d;c++){var f=new THREE.Mesh(b,a[c]);e.add(f)}return e},cloneObject:function(b){var a;b instanceof THREE.MorphAnimMesh?(a=new THREE.MorphAnimMesh(b.geometry,b.material),
 a.duration=b.duration,a.mirroredLoop=b.mirroredLoop,a.time=b.time,a.lastKeyframe=b.lastKeyframe,a.currentKeyframe=b.currentKeyframe,a.direction=b.direction,a.directionBackwards=b.directionBackwards):b instanceof THREE.SkinnedMesh?a=new THREE.SkinnedMesh(b.geometry,b.material):b instanceof THREE.Mesh?a=new THREE.Mesh(b.geometry,b.material):b instanceof THREE.Line?a=new THREE.Line(b.geometry,b.material,b.type):b instanceof THREE.Ribbon?a=new THREE.Ribbon(b.geometry,b.material):b instanceof THREE.ParticleSystem?
 (a=new THREE.ParticleSystem(b.geometry,b.material),a.sortParticles=b.sortParticles):b instanceof THREE.Particle?a=new THREE.Particle(b.material):b instanceof THREE.Sprite?(a=new THREE.Sprite({}),a.color.copy(b.color),a.map=b.map,a.blending=b.blending,a.useScreenCoordinates=b.useScreenCoordinates,a.mergeWith3D=b.mergeWith3D,a.affectedByDistance=b.affectedByDistance,a.scaleByViewport=b.scaleByViewport,a.alignment=b.alignment,a.rotation3d.copy(b.rotation3d),a.rotation=b.rotation,a.opacity=b.opacity,

+ 1 - 1
build/custom/ThreeWebGL.js

@@ -149,7 +149,7 @@ u=A(a,z+20+16);q=A(a,z+20+20);r=A(a,z+20+24);p=A(a,z+20+28);x=A(a,z+20+32);w=A(a
 3+2];O.push(d/127,f/127,e/127)}}return n*3*Int8Array.BYTES_PER_ELEMENT}(z);z=z+v(n*3);z=z+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,f;for(c=0;c<o;c++){d=b[c*2];f=b[c*2+1];Q.push(d,f)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(z);F=z+F+v(b*2);ea=F+ea+v(u*2);e=ea+e+v(q*2);i=e+i+v(r*2);c=i+c+v(p*2);l=c+l+v(x*2);k=l+k+v(w*2);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;P(q,a,b+q*Uint32Array.BYTES_PER_ELEMENT*3);G(q,b)}})(ea);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*
 3,c=b+r*Uint32Array.BYTES_PER_ELEMENT*3;U(r,a,b,c+r*Uint32Array.BYTES_PER_ELEMENT*3);G(r,c)}})(e);(function(a){if(w){var b=a+w*Uint32Array.BYTES_PER_ELEMENT*4;I(w,a,b+w*Uint32Array.BYTES_PER_ELEMENT*4);C(w,b)}})(l);(function(a){if(H){var b=a+H*Uint32Array.BYTES_PER_ELEMENT*4,c=b+H*Uint32Array.BYTES_PER_ELEMENT*4;V(H,a,b,c+H*Uint32Array.BYTES_PER_ELEMENT*4);C(H,c)}})(k);b&&P(b,z,z+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(u){var b=a+u*Uint32Array.BYTES_PER_ELEMENT*3;U(u,a,b,b+u*Uint32Array.BYTES_PER_ELEMENT*
 3)}})(F);p&&I(p,i,i+p*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(x){var b=a+x*Uint32Array.BYTES_PER_ELEMENT*4;V(x,a,b,b+x*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=Object.create(THREE.Geometry.prototype);b(new e(c))};THREE.ImageLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
-THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a){var b=this,c=new Image;c.addEventListener("load",function(){b.dispatchEvent({type:"load",content:c})},false);c.addEventListener("error",function(){b.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);if(b.crossOrigin)c.crossOrigin=b.crossOrigin;c.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);
+THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b){var c=this;b===void 0&&(b=new Image);b.addEventListener("load",function(){c.dispatchEvent({type:"load",content:b})},false);b.addEventListener("error",function(){c.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);if(c.crossOrigin)b.crossOrigin=c.crossOrigin;b.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);
 THREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};
 THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,h=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(f.status===200||f.status===0){if(f.responseText){var j=JSON.parse(f.responseText);a.createModel(j,c,d)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+f.status+"]");else if(f.readyState===f.LOADING){if(e){h===0&&(h=f.getResponseHeader("Content-Length"));
 e({total:h,loaded:f.responseText.length})}}else f.readyState===f.HEADERS_RECEIVED&&(h=f.getResponseHeader("Content-Length"))};f.open("GET",b,true);f.overrideMimeType&&f.overrideMimeType("text/plain; charset=x-user-defined");f.setRequestHeader("Content-Type","text/plain");f.send(null)};

+ 3 - 2
src/extras/ImageUtils.js

@@ -9,7 +9,8 @@ THREE.ImageUtils = {
 
 	loadTexture: function ( url, mapping, onLoad, onError ) {
 
-		var texture = new THREE.Texture( undefined, mapping );
+		var image = new Image();
+		var texture = new THREE.Texture( image, mapping );
 
 		var loader = new THREE.ImageLoader();
 
@@ -29,7 +30,7 @@ THREE.ImageUtils = {
 		} );
 
 		loader.crossOrigin = this.crossOrigin;
-		loader.load( url );
+		loader.load( url, image );
 
 		return texture;
 

+ 5 - 5
src/loaders/ImageLoader.js

@@ -14,12 +14,12 @@ THREE.ImageLoader.prototype = {
 
 	constructor: THREE.ImageLoader,
 
-	load: function ( url ) {
+	load: function ( url, image ) {
 
 		var scope = this;
 
-		var image = new Image();
-		
+		if ( image === undefined ) image = new Image();
+
 		image.addEventListener( 'load', function () {
 
 			scope.dispatchEvent( { type: 'load', content: image } );
@@ -27,9 +27,9 @@ THREE.ImageLoader.prototype = {
 		}, false );
 
 		image.addEventListener( 'error', function () {
-		
+
 			scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
-		
+
 		}, false );
 
 		if ( scope.crossOrigin ) image.crossOrigin = scope.crossOrigin;