diff --git a/build/three.js b/build/three.js index b40a645cd3ad3e9d0c19fd979e857bb08500e809..def2d277acbfe7081cbe0d235c7b67667d9a5cf2 100644 --- a/build/three.js +++ b/build/three.js @@ -3947,9 +3947,8 @@ THREE.Projector = function() { this.projectScene = function ( scene, camera, sortObjects, sortElements ) { var near = camera.near, far = camera.far, visible = false, - o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object, - modelMatrix, - geometry, geometryMaterials, vertices, vertex, vertexPositionScreen, + o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object, modelMatrix, + geometry, vertices, vertex, vertexPositionScreen, faces, face, faceVertexNormals, normal, faceVertexUvs, uvs, v1, v2, v3, v4, isFaceMaterial, material, side; @@ -3992,7 +3991,6 @@ THREE.Projector = function() { _normalMatrix.transpose(); isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial; - geometryMaterials = ( isFaceMaterial && object.material.materials.length > 0 ) ? object.material.materials : object.geometry.materials; side = object.material.side; @@ -4017,7 +4015,7 @@ THREE.Projector = function() { face = faces[ f ]; - material = isFaceMaterial === true ? geometryMaterials[ face.materialIndex ] : object.material; + material = isFaceMaterial === true ? object.material.materials[ face.materialIndex ] : object.material; if ( material === undefined ) continue; diff --git a/build/three.min.js b/build/three.min.js index ab89a3a5c383392287d227419e10cba720c8b7aa..91983bf74bf2e3f8cd14424cead146109e9104ee 100644 --- a/build/three.min.js +++ b/build/three.min.js @@ -80,17 +80,17 @@ a.matrixWorld.copy(this.matrixWorld);a.matrixRotationWorld.copy(this.matrixRotat return a},deallocate:function(){var a=THREE.Object3DLibrary.indexOf(this);-1!==a&&THREE.Object3DLibrary.splice(a,1)}};THREE.Object3D.__m1=new THREE.Matrix4;THREE.Object3D.defaultEulerOrder="XYZ";THREE.Object3DIdCount=0;THREE.Object3DLibrary=[]; THREE.Projector=function(){function a(){if(f===h){var a=new THREE.RenderableObject;g.push(a);h++;f++;return a}return g[f++]}function b(){if(j===n){var a=new THREE.RenderableVertex;m.push(a);n++;j++;return a}return m[j++]}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(0<=e&&0<=f&&0<=g&&0<=h)return!0;if(0>e&&0>f||0>g&&0>h)return!1;0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f)));0>g?c=Math.max(c,g/(g-h)):0>h&&(d=Math.min(d,g/(g-h)));if(d< c)return!1;a.lerpSelf(b,c);b.lerpSelf(a,1-d);return!0}var e,f,g=[],h=0,i,j,m=[],n=0,l,p,o=[],r=0,t,q=[],z=0,u,s,E=[],A=0,w,v,C=[],D=0,G={objects:[],sprites:[],lights:[],elements:[]},P=new THREE.Vector3,B=new THREE.Vector4,J=new THREE.Matrix4,H=new THREE.Matrix4,I=new THREE.Matrix3,L=new THREE.Frustum,N=new THREE.Vector4,S=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);J.multiply(b.projectionMatrix,b.matrixWorldInverse);J.multiplyVector3(a);return a}; -this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);J.multiply(b.matrixWorld,b.projectionMatrixInverse);J.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(g,h,n,Q){var Z=h.near,K=h.far,ja=!1,R,ga,fa,V,aa,ca,ia,wa,ua,Ca,Ka,va,db,xb,Ua;v=s=t=p=0;G.elements.length=0;g.updateMatrixWorld(); -void 0===h.parent&&h.updateMatrixWorld();h.matrixWorldInverse.getInverse(h.matrixWorld);J.multiply(h.projectionMatrix,h.matrixWorldInverse);L.setFromMatrix(J);f=0;G.objects.length=0;G.sprites.length=0;G.lights.length=0;var gb=function(b){for(var c=0,d=b.children.length;cZ&&i.positionScreen.z(ia.positionScreen.x-V.positionScreen.x)*(aa.positionScreen.y-V.positionScreen.y)-(ia.positionScreen.y-V.positionScreen.y)*(aa.positionScreen.x-V.positionScreen.x),ca===THREE.DoubleSide|| -ja===(ca===THREE.FrontSide))p===r?(va=new THREE.RenderableFace3,o.push(va),r++,p++,l=va):l=o[p++],l.v1.copy(V),l.v2.copy(aa),l.v3.copy(ia);else continue;else continue;else if(ga instanceof THREE.Face4)if(V=m[ga.a],aa=m[ga.b],ia=m[ga.c],va=m[ga.d],!0===V.visible&&!0===aa.visible&&!0===ia.visible&&!0===va.visible)if(ja=0>(va.positionScreen.x-V.positionScreen.x)*(aa.positionScreen.y-V.positionScreen.y)-(va.positionScreen.y-V.positionScreen.y)*(aa.positionScreen.x-V.positionScreen.x)||0>(aa.positionScreen.x- -ia.positionScreen.x)*(va.positionScreen.y-ia.positionScreen.y)-(aa.positionScreen.y-ia.positionScreen.y)*(va.positionScreen.x-ia.positionScreen.x),ca===THREE.DoubleSide||ja===(ca===THREE.FrontSide)){if(t===z){var lb=new THREE.RenderableFace4;q.push(lb);z++;t++;l=lb}else l=q[t++];l.v1.copy(V);l.v2.copy(aa);l.v3.copy(ia);l.v4.copy(va)}else continue;else continue;l.normalWorld.copy(ga.normal);!1===ja&&(ca===THREE.BackSide||ca===THREE.DoubleSide)&&l.normalWorld.negate();I.multiplyVector3(l.normalWorld).normalize(); -l.centroidWorld.copy(ga.centroid);ua.multiplyVector3(l.centroidWorld);l.centroidScreen.copy(l.centroidWorld);J.multiplyVector3(l.centroidScreen);ia=ga.vertexNormals;V=0;for(aa=ia.length;VB.z&&(v===D?(Z=new THREE.RenderableParticle,C.push(Z),D++,v++,w=Z):w=C[v++],w.object=wa,w.x=B.x/B.w,w.y=B.y/B.w,w.z=B.z,w.rotation=wa.rotation.z,w.scale.x= -wa.scale.x*Math.abs(w.x-(B.x+h.projectionMatrix.elements[0])/(B.w+h.projectionMatrix.elements[12])),w.scale.y=wa.scale.y*Math.abs(w.y-(B.y+h.projectionMatrix.elements[5])/(B.w+h.projectionMatrix.elements[13])),w.material=wa.material,G.elements.push(w)));!0===Q&&G.elements.sort(c);return G}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}; +this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);J.multiply(b.matrixWorld,b.projectionMatrixInverse);J.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(g,h,n,Q){var Z=h.near,K=h.far,ja=!1,R,ga,fa,V,aa,ca,ia,Aa,ua,Ba,Ka,va,eb,Ya;v=s=t=p=0;G.elements.length=0;g.updateMatrixWorld(); +void 0===h.parent&&h.updateMatrixWorld();h.matrixWorldInverse.getInverse(h.matrixWorld);J.multiply(h.projectionMatrix,h.matrixWorldInverse);L.setFromMatrix(J);f=0;G.objects.length=0;G.sprites.length=0;G.lights.length=0;var kb=function(b){for(var c=0,d=b.children.length;c +Z&&i.positionScreen.z(ia.positionScreen.x-V.positionScreen.x)*(aa.positionScreen.y-V.positionScreen.y)-(ia.positionScreen.y-V.positionScreen.y)*(aa.positionScreen.x-V.positionScreen.x),ca===THREE.DoubleSide||ja===(ca===THREE.FrontSide))p===r?(va= +new THREE.RenderableFace3,o.push(va),r++,p++,l=va):l=o[p++],l.v1.copy(V),l.v2.copy(aa),l.v3.copy(ia);else continue;else continue;else if(ga instanceof THREE.Face4)if(V=m[ga.a],aa=m[ga.b],ia=m[ga.c],va=m[ga.d],!0===V.visible&&!0===aa.visible&&!0===ia.visible&&!0===va.visible)if(ja=0>(va.positionScreen.x-V.positionScreen.x)*(aa.positionScreen.y-V.positionScreen.y)-(va.positionScreen.y-V.positionScreen.y)*(aa.positionScreen.x-V.positionScreen.x)||0>(aa.positionScreen.x-ia.positionScreen.x)*(va.positionScreen.y- +ia.positionScreen.y)-(aa.positionScreen.y-ia.positionScreen.y)*(va.positionScreen.x-ia.positionScreen.x),ca===THREE.DoubleSide||ja===(ca===THREE.FrontSide)){if(t===z){var gb=new THREE.RenderableFace4;q.push(gb);z++;t++;l=gb}else l=q[t++];l.v1.copy(V);l.v2.copy(aa);l.v3.copy(ia);l.v4.copy(va)}else continue;else continue;l.normalWorld.copy(ga.normal);!1===ja&&(ca===THREE.BackSide||ca===THREE.DoubleSide)&&l.normalWorld.negate();I.multiplyVector3(l.normalWorld).normalize();l.centroidWorld.copy(ga.centroid); +ua.multiplyVector3(l.centroidWorld);l.centroidScreen.copy(l.centroidWorld);J.multiplyVector3(l.centroidScreen);ia=ga.vertexNormals;V=0;for(aa=ia.length;VB.z&&(v===D?(Z=new THREE.RenderableParticle,C.push(Z),D++,v++,w=Z):w=C[v++],w.object=Aa,w.x=B.x/B.w,w.y=B.y/B.w,w.z=B.z,w.rotation=Aa.rotation.z,w.scale.x=Aa.scale.x*Math.abs(w.x- +(B.x+h.projectionMatrix.elements[0])/(B.w+h.projectionMatrix.elements[12])),w.scale.y=Aa.scale.y*Math.abs(w.y-(B.y+h.projectionMatrix.elements[5])/(B.w+h.projectionMatrix.elements[13])),w.material=Aa.material,G.elements.push(w)));!0===Q&&G.elements.sort(c);return G}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}; THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a,b){var c=Math.cos(a.x/2),d=Math.cos(a.y/2),e=Math.cos(a.z/2),f=Math.sin(a.x/2),g=Math.sin(a.y/2),h=Math.sin(a.z/2);void 0===b||"XYZ"===b?(this.x=f*d*e+c*g*h,this.y=c*g*e-f*d*h,this.z=c*d*h+f*g*e,this.w=c*d*e-f*g*h):"YXZ"===b?(this.x=f*d*e+c*g*h,this.y=c*g*e-f*d*h,this.z=c*d* h-f*g*e,this.w=c*d*e+f*g*h):"ZXY"===b?(this.x=f*d*e-c*g*h,this.y=c*g*e+f*d*h,this.z=c*d*h+f*g*e,this.w=c*d*e-f*g*h):"ZYX"===b?(this.x=f*d*e-c*g*h,this.y=c*g*e+f*d*h,this.z=c*d*h-f*g*e,this.w=c*d*e+f*g*h):"YZX"===b?(this.x=f*d*e+c*g*h,this.y=c*g*e+f*d*h,this.z=c*d*h-f*g*e,this.w=c*d*e-f*g*h):"XZY"===b&&(this.x=f*d*e-c*g*h,this.y=c*g*e-f*d*h,this.z=c*d*h+f*g*e,this.w=c*d*e+f*g*h);return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c); return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0],a=b[4],d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],i=b[6],b=b[10],j=c+f+b;0f&&c>b?(c=2*Math.sqrt(1+c-f-b),this.w=(i-g)/c,this.x=0.25*c,this.y=(a+e)/c,this.z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this.w=(d-h)/c,this.x=(a+e)/c,this.y=0.25*c,this.z=(g+i)/c):(c=2*Math.sqrt(1+b-c-f),this.w=(e-a)/c,this.x=(d+h)/c,this.y=(g+i)/c,this.z=0.25*c);return this},inverse:function(){this.conjugate().normalize(); @@ -278,34 +278,34 @@ THREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)-1===t THREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);-1!==b&&this.__lights.splice(b,1)}else a instanceof THREE.Camera||(b=this.__objects.indexOf(a),-1!==b&&(this.__objects.splice(b,1),this.__objectsRemoved.push(a),b=this.__objectsAdded.indexOf(a),-1!==b&&this.__objectsAdded.splice(b,1)));for(b=0;bq&&r.clearRect(Math.floor(xa.getX()),Math.floor(xa.getY()),Math.floor(xa.getWidth()), -Math.floor(xa.getHeight())),0=k||(k*=f.intensity,c.r+=g.r*k, +document.createElement("canvas"),n,l,p,o,r=m.getContext("2d"),t=new THREE.Color(0),q=0,z=1,u=0,s=null,E=null,A=null,w=null,v=null,C,D,G,P,B=new THREE.RenderableVertex,J=new THREE.RenderableVertex,H,I,L,N,S,U,M,O,Q,Z,K,ja,R=new THREE.Color,ga=new THREE.Color,fa=new THREE.Color,V=new THREE.Color,aa=new THREE.Color,ca=new THREE.Color,ia=new THREE.Color,Aa={},ua={},Ba,Ka,va,eb,Ya,kb,gb,zb,Ab,Bb,fb=new THREE.Rectangle,wa=new THREE.Rectangle,La=new THREE.Rectangle,lb=!1,Na=new THREE.Color,Za=new THREE.Color, +db=new THREE.Color,ka=new THREE.Vector3,$a,ab,mb,ta,nb,qb,a=16;$a=document.createElement("canvas");$a.width=$a.height=2;ab=$a.getContext("2d");ab.fillStyle="rgba(0,0,0,1)";ab.fillRect(0,0,2,2);mb=ab.getImageData(0,0,2,2);ta=mb.data;nb=document.createElement("canvas");nb.width=nb.height=a;qb=nb.getContext("2d");qb.translate(-a/2,-a/2);qb.scale(a,a);a--;this.domElement=m;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){n=a;l=b;p= +Math.floor(n/2);o=Math.floor(l/2);m.width=n;m.height=l;fb.set(-p,-o,p,o);wa.set(-p,-o,p,o);z=1;u=0;v=w=A=E=s=null};this.setClearColor=function(a,b){t.copy(a);q=void 0!==b?b:1;wa.set(-p,-o,p,o)};this.setClearColorHex=function(a,b){t.setHex(a);q=void 0!==b?b:1;wa.set(-p,-o,p,o)};this.getMaxAnisotropy=function(){return 0};this.clear=function(){r.setTransform(1,0,0,-1,p,o);!1===wa.isEmpty()&&(wa.minSelf(fb),wa.inflate(2),1>q&&r.clearRect(Math.floor(wa.getX()),Math.floor(wa.getY()),Math.floor(wa.getWidth()), +Math.floor(wa.getHeight())),0=k||(k*=f.intensity,c.r+=g.r*k, c.g+=g.g*k,c.b+=g.b*k)}else f instanceof THREE.PointLight&&(h=f.matrixWorld.getPosition(),k=b.dot(ka.sub(h,a).normalize()),0>=k||(k*=0==f.distance?1:1-Math.min(a.distanceTo(h)/f.distance,1),0!=k&&(k*=f.intensity,c.r+=g.r*k,c.g+=g.g*k,c.b+=g.b*k)))}}function n(a,d,e,g,h,k,i,j){f.info.render.vertices+=3;f.info.render.faces++;b(j.opacity);c(j.blending);H=a.positionScreen.x;I=a.positionScreen.y;L=d.positionScreen.x;N=d.positionScreen.y;S=e.positionScreen.x;U=e.positionScreen.y;q(H,I,L,N,S,U);(j instanceof -THREE.MeshLambertMaterial||j instanceof THREE.MeshPhongMaterial)&&null===j.map&&null===j.map?(ca.copy(j.color),ia.copy(j.emissive),j.vertexColors===THREE.FaceColors&&(ca.r*=i.color.r,ca.g*=i.color.g,ca.b*=i.color.b),!0===mb)?!1===j.wireframe&&j.shading==THREE.SmoothShading&&3==i.vertexNormalsLength?(ga.r=fa.r=V.r=Na.r,ga.g=fa.g=V.g=Na.g,ga.b=fa.b=V.b=Na.b,m(i.v1.positionWorld,i.vertexNormalsWorld[0],ga),m(i.v2.positionWorld,i.vertexNormalsWorld[1],fa),m(i.v3.positionWorld,i.vertexNormalsWorld[2], +THREE.MeshLambertMaterial||j instanceof THREE.MeshPhongMaterial)&&null===j.map&&null===j.map?(ca.copy(j.color),ia.copy(j.emissive),j.vertexColors===THREE.FaceColors&&(ca.r*=i.color.r,ca.g*=i.color.g,ca.b*=i.color.b),!0===lb)?!1===j.wireframe&&j.shading==THREE.SmoothShading&&3==i.vertexNormalsLength?(ga.r=fa.r=V.r=Na.r,ga.g=fa.g=V.g=Na.g,ga.b=fa.b=V.b=Na.b,m(i.v1.positionWorld,i.vertexNormalsWorld[0],ga),m(i.v2.positionWorld,i.vertexNormalsWorld[1],fa),m(i.v3.positionWorld,i.vertexNormalsWorld[2], V),ga.r=ga.r*ca.r+ia.r,ga.g=ga.g*ca.g+ia.g,ga.b=ga.b*ca.b+ia.b,fa.r=fa.r*ca.r+ia.r,fa.g=fa.g*ca.g+ia.g,fa.b=fa.b*ca.b+ia.b,V.r=V.r*ca.r+ia.r,V.g=V.g*ca.g+ia.g,V.b=V.b*ca.b+ia.b,aa.r=0.5*(fa.r+V.r),aa.g=0.5*(fa.g+V.g),aa.b=0.5*(fa.b+V.b),va=wc(ga,fa,V,aa),ma(H,I,L,N,S,U,0,0,1,0,0,1,va)):(R.r=Na.r,R.g=Na.g,R.b=Na.b,m(i.centroidWorld,i.normalWorld,R),R.r=R.r*ca.r+ia.r,R.g=R.g*ca.g+ia.g,R.b=R.b*ca.b+ia.b,!0===j.wireframe?s(R,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(R)):!0===j.wireframe? -s(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(j.color):j instanceof THREE.MeshBasicMaterial||j instanceof THREE.MeshLambertMaterial||j instanceof THREE.MeshPhongMaterial?null!==j.map?j.map.mapping instanceof THREE.UVMapping&&(db=i.uvs[0],z(H,I,L,N,S,U,db[g].u,db[g].v,db[h].u,db[h].v,db[k].u,db[k].v,j.map)):null!==j.envMap?j.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(a=l.matrixWorldInverse,ka.copy(i.vertexNormalsWorld[g]),xb=0.5*(ka.x*a.elements[0]+ka.y* -a.elements[4]+ka.z*a.elements[8])+0.5,Ua=0.5*(ka.x*a.elements[1]+ka.y*a.elements[5]+ka.z*a.elements[9])+0.5,ka.copy(i.vertexNormalsWorld[h]),gb=0.5*(ka.x*a.elements[0]+ka.y*a.elements[4]+ka.z*a.elements[8])+0.5,lb=0.5*(ka.x*a.elements[1]+ka.y*a.elements[5]+ka.z*a.elements[9])+0.5,ka.copy(i.vertexNormalsWorld[k]),Ab=0.5*(ka.x*a.elements[0]+ka.y*a.elements[4]+ka.z*a.elements[8])+0.5,Bb=0.5*(ka.x*a.elements[1]+ka.y*a.elements[5]+ka.z*a.elements[9])+0.5,z(H,I,L,N,S,U,xb,Ua,gb,lb,Ab,Bb,j.envMap)):(R.copy(j.color), -j.vertexColors===THREE.FaceColors&&(R.r*=i.color.r,R.g*=i.color.g,R.b*=i.color.b),!0===j.wireframe?s(R,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(R)):j instanceof THREE.MeshDepthMaterial?(Ca=l.near,Ka=l.far,ga.r=ga.g=ga.b=1-Cb(a.positionScreen.z,Ca,Ka),fa.r=fa.g=fa.b=1-Cb(d.positionScreen.z,Ca,Ka),V.r=V.g=V.b=1-Cb(e.positionScreen.z,Ca,Ka),aa.r=0.5*(fa.r+V.r),aa.g=0.5*(fa.g+V.g),aa.b=0.5*(fa.b+V.b),va=wc(ga,fa,V,aa),ma(H,I,L,N,S,U,0,0,1,0,0,1,va)):j instanceof THREE.MeshNormalMaterial&& +s(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(j.color):j instanceof THREE.MeshBasicMaterial||j instanceof THREE.MeshLambertMaterial||j instanceof THREE.MeshPhongMaterial?null!==j.map?j.map.mapping instanceof THREE.UVMapping&&(eb=i.uvs[0],z(H,I,L,N,S,U,eb[g].u,eb[g].v,eb[h].u,eb[h].v,eb[k].u,eb[k].v,j.map)):null!==j.envMap?j.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(a=l.matrixWorldInverse,ka.copy(i.vertexNormalsWorld[g]),Ya=0.5*(ka.x*a.elements[0]+ka.y* +a.elements[4]+ka.z*a.elements[8])+0.5,kb=0.5*(ka.x*a.elements[1]+ka.y*a.elements[5]+ka.z*a.elements[9])+0.5,ka.copy(i.vertexNormalsWorld[h]),gb=0.5*(ka.x*a.elements[0]+ka.y*a.elements[4]+ka.z*a.elements[8])+0.5,zb=0.5*(ka.x*a.elements[1]+ka.y*a.elements[5]+ka.z*a.elements[9])+0.5,ka.copy(i.vertexNormalsWorld[k]),Ab=0.5*(ka.x*a.elements[0]+ka.y*a.elements[4]+ka.z*a.elements[8])+0.5,Bb=0.5*(ka.x*a.elements[1]+ka.y*a.elements[5]+ka.z*a.elements[9])+0.5,z(H,I,L,N,S,U,Ya,kb,gb,zb,Ab,Bb,j.envMap)):(R.copy(j.color), +j.vertexColors===THREE.FaceColors&&(R.r*=i.color.r,R.g*=i.color.g,R.b*=i.color.b),!0===j.wireframe?s(R,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(R)):j instanceof THREE.MeshDepthMaterial?(Ba=l.near,Ka=l.far,ga.r=ga.g=ga.b=1-Cb(a.positionScreen.z,Ba,Ka),fa.r=fa.g=fa.b=1-Cb(d.positionScreen.z,Ba,Ka),V.r=V.g=V.b=1-Cb(e.positionScreen.z,Ba,Ka),aa.r=0.5*(fa.r+V.r),aa.g=0.5*(fa.g+V.g),aa.b=0.5*(fa.b+V.b),va=wc(ga,fa,V,aa),ma(H,I,L,N,S,U,0,0,1,0,0,1,va)):j instanceof THREE.MeshNormalMaterial&& (R.r=gc(i.normalWorld.x),R.g=gc(i.normalWorld.y),R.b=gc(i.normalWorld.z),!0===j.wireframe?s(R,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(R))}function q(a,b,c,d,e,f){r.beginPath();r.moveTo(a,b);r.lineTo(c,d);r.lineTo(e,f);r.closePath()}function t(a,b,c,d,e,f,g,h){r.beginPath();r.moveTo(a,b);r.lineTo(c,d);r.lineTo(e,f);r.lineTo(g,h);r.closePath()}function s(a,b,c,e){A!==b&&(A=r.lineWidth=b);w!==c&&(w=r.lineCap=c);v!==e&&(v=r.lineJoin=e);d(a.getContextStyle());r.stroke();La.inflate(2* -b)}function u(a){e(a.getContextStyle());r.fill()}function z(a,b,c,d,f,g,h,k,i,j,l,m,ma){if(!(ma instanceof THREE.DataTexture||void 0===ma.image||0==ma.image.width)){if(!0===ma.needsUpdate){var n=ma.wrapS==THREE.RepeatWrapping,o=ma.wrapT==THREE.RepeatWrapping;wa[ma.id]=r.createPattern(ma.image,!0===n&&!0===o?"repeat":!0===n&&!1===o?"repeat-x":!1===n&&!0===o?"repeat-y":"no-repeat");ma.needsUpdate=!1}void 0===wa[ma.id]?e("rgba(0,0,0,1)"):e(wa[ma.id]);var n=ma.offset.x/ma.repeat.x,o=ma.offset.y/ma.repeat.y, +b)}function u(a){e(a.getContextStyle());r.fill()}function z(a,b,c,d,f,g,h,k,i,j,l,m,ma){if(!(ma instanceof THREE.DataTexture||void 0===ma.image||0==ma.image.width)){if(!0===ma.needsUpdate){var n=ma.wrapS==THREE.RepeatWrapping,o=ma.wrapT==THREE.RepeatWrapping;Aa[ma.id]=r.createPattern(ma.image,!0===n&&!0===o?"repeat":!0===n&&!1===o?"repeat-x":!1===n&&!0===o?"repeat-y":"no-repeat");ma.needsUpdate=!1}void 0===Aa[ma.id]?e("rgba(0,0,0,1)"):e(Aa[ma.id]);var n=ma.offset.x/ma.repeat.x,o=ma.offset.y/ma.repeat.y, Cb=ma.image.width*ma.repeat.x,p=ma.image.height*ma.repeat.y,h=(h+n)*Cb,k=(1-k+o)*p,c=c-a,d=d-b,f=f-a,g=g-b,i=(i+n)*Cb-h,j=(1-j+o)*p-k,l=(l+n)*Cb-h,m=(1-m+o)*p-k,n=i*m-l*j;0===n?(void 0===ua[ma.id]&&(b=document.createElement("canvas"),b.width=ma.image.width,b.height=ma.image.height,b=b.getContext("2d"),b.drawImage(ma.image,0,0),ua[ma.id]=b.getImageData(0,0,ma.image.width,ma.image.height).data),b=ua[ma.id],h=4*(Math.floor(h)+Math.floor(k)*ma.image.width),R.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255),u(R)): (n=1/n,ma=(m*c-j*f)*n,j=(m*d-j*g)*n,c=(i*f-l*c)*n,d=(i*g-l*d)*n,a=a-ma*h-c*k,h=b-j*h-d*k,r.save(),r.transform(ma,j,c,d,a,h),r.fill(),r.restore())}}function ma(a,b,c,d,e,f,g,h,k,i,j,l,m){var ma,n;ma=m.width-1;n=m.height-1;g*=ma;h*=n;c-=a;d-=b;e-=a;f-=b;k=k*ma-g;i=i*n-h;j=j*ma-g;l=l*n-h;n=1/(k*l-j*i);ma=(l*c-i*e)*n;i=(l*d-i*f)*n;c=(k*e-j*c)*n;d=(k*f-j*d)*n;a=a-ma*g-c*h;b=b-i*g-d*h;r.save();r.transform(ma,i,c,d,a,b);r.clip();r.drawImage(m,0,0);r.restore()}function wc(a,b,c,d){ta[0]=255*a.r|0;ta[1]=255* -a.g|0;ta[2]=255*a.b|0;ta[4]=255*b.r|0;ta[5]=255*b.g|0;ta[6]=255*b.b|0;ta[8]=255*c.r|0;ta[9]=255*c.g|0;ta[10]=255*c.b|0;ta[12]=255*d.r|0;ta[13]=255*d.g|0;ta[14]=255*d.b|0;ab.putImageData(nb,0,0);qb.drawImage($a,0,0);return hb}function Cb(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function gc(a){a=0.5*(a+1);return 0>a?0:1>1,Pc=na.height>>1,rb=bb.scale.x*p,sb=bb.scale.y*o,E=rb*hc,zb=sb*Pc,La.set(oa.x-E,oa.y-zb,oa.x+E,oa.y+zb),!1!==fb.intersects(La)&&(r.save(),r.translate(oa.x,oa.y),r.rotate(-bb.rotation),r.scale(rb,-sb),r.translate(-hc,-Pc),r.drawImage(na,0,0),r.restore())):da instanceof THREE.ParticleCanvasMaterial&&(E=bb.scale.x*p,zb=bb.scale.y*o,La.set(oa.x- -E,oa.y-zb,oa.x+E,oa.y+zb),!1!==fb.intersects(La)&&(d(da.color.getContextStyle()),e(da.color.getContextStyle()),r.save(),r.translate(oa.x,oa.y),r.rotate(-bb.rotation),r.scale(E,zb),da.program(r),r.restore()))}else if(na instanceof THREE.RenderableLine){if(C=na.v1,D=na.v2,C.positionScreen.x*=p,C.positionScreen.y*=o,D.positionScreen.x*=p,D.positionScreen.y*=o,La.addPoint(C.positionScreen.x,C.positionScreen.y),La.addPoint(D.positionScreen.x,D.positionScreen.y),!0===fb.intersects(La)&&(oa=C,bb=D,b(da.opacity), +a.g|0;ta[2]=255*a.b|0;ta[4]=255*b.r|0;ta[5]=255*b.g|0;ta[6]=255*b.b|0;ta[8]=255*c.r|0;ta[9]=255*c.g|0;ta[10]=255*c.b|0;ta[12]=255*d.r|0;ta[13]=255*d.g|0;ta[14]=255*d.b|0;ab.putImageData(mb,0,0);qb.drawImage($a,0,0);return nb}function Cb(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function gc(a){a=0.5*(a+1);return 0>a?0:1>1,Pc=na.height>>1,rb=bb.scale.x*p,sb=bb.scale.y*o,E=rb*hc,yb=sb*Pc,La.set(oa.x-E,oa.y-yb,oa.x+E,oa.y+yb),!1!==fb.intersects(La)&&(r.save(),r.translate(oa.x,oa.y),r.rotate(-bb.rotation),r.scale(rb,-sb),r.translate(-hc,-Pc),r.drawImage(na,0,0),r.restore())):da instanceof THREE.ParticleCanvasMaterial&&(E=bb.scale.x*p,yb=bb.scale.y*o,La.set(oa.x- +E,oa.y-yb,oa.x+E,oa.y+yb),!1!==fb.intersects(La)&&(d(da.color.getContextStyle()),e(da.color.getContextStyle()),r.save(),r.translate(oa.x,oa.y),r.rotate(-bb.rotation),r.scale(E,yb),da.program(r),r.restore()))}else if(na instanceof THREE.RenderableLine){if(C=na.v1,D=na.v2,C.positionScreen.x*=p,C.positionScreen.y*=o,D.positionScreen.x*=p,D.positionScreen.y*=o,La.addPoint(C.positionScreen.x,C.positionScreen.y),La.addPoint(D.positionScreen.x,D.positionScreen.y),!0===fb.intersects(La)&&(oa=C,bb=D,b(da.opacity), c(da.blending),r.beginPath(),r.moveTo(oa.positionScreen.x,oa.positionScreen.y),r.lineTo(bb.positionScreen.x,bb.positionScreen.y),da instanceof THREE.LineBasicMaterial))oa=da.linewidth,A!==oa&&(A=r.lineWidth=oa),oa=da.linecap,w!==oa&&(w=r.lineCap=oa),oa=da.linejoin,v!==oa&&(v=r.lineJoin=oa),d(da.color.getContextStyle()),r.stroke(),La.inflate(2*da.linewidth)}else if(na instanceof THREE.RenderableFace3)C=na.v1,D=na.v2,G=na.v3,C.positionScreen.x*=p,C.positionScreen.y*=o,D.positionScreen.x*=p,D.positionScreen.y*= o,G.positionScreen.x*=p,G.positionScreen.y*=o,!0===da.overdraw&&(Xb(C.positionScreen,D.positionScreen),Xb(D.positionScreen,G.positionScreen),Xb(G.positionScreen,C.positionScreen)),La.add3Points(C.positionScreen.x,C.positionScreen.y,D.positionScreen.x,D.positionScreen.y,G.positionScreen.x,G.positionScreen.y),!0===fb.intersects(La)&&n(C,D,G,0,1,2,na,da,a);else if(na instanceof THREE.RenderableFace4&&(C=na.v1,D=na.v2,G=na.v3,P=na.v4,C.positionScreen.x*=p,C.positionScreen.y*=o,D.positionScreen.x*=p,D.positionScreen.y*= o,G.positionScreen.x*=p,G.positionScreen.y*=o,P.positionScreen.x*=p,P.positionScreen.y*=o,B.positionScreen.copy(D.positionScreen),J.positionScreen.copy(P.positionScreen),!0===da.overdraw&&(Xb(C.positionScreen,D.positionScreen),Xb(D.positionScreen,P.positionScreen),Xb(P.positionScreen,C.positionScreen),Xb(G.positionScreen,B.positionScreen),Xb(G.positionScreen,J.positionScreen)),La.addPoint(C.positionScreen.x,C.positionScreen.y),La.addPoint(D.positionScreen.x,D.positionScreen.y),La.addPoint(G.positionScreen.x, -G.positionScreen.y),La.addPoint(P.positionScreen.x,P.positionScreen.y),!0===fb.intersects(La)))(oa=C,bb=D,E=G,zb=P,rb=B,sb=J,hc=a,f.info.render.vertices+=4,f.info.render.faces++,b(da.opacity),c(da.blending),void 0!==da.map&&null!==da.map||void 0!==da.envMap&&null!==da.envMap)?(n(oa,bb,zb,0,1,3,na,da,hc),n(rb,E,sb,1,2,3,na,da,hc)):(H=oa.positionScreen.x,I=oa.positionScreen.y,L=bb.positionScreen.x,N=bb.positionScreen.y,S=E.positionScreen.x,U=E.positionScreen.y,M=zb.positionScreen.x,O=zb.positionScreen.y, -Q=rb.positionScreen.x,Z=rb.positionScreen.y,K=sb.positionScreen.x,ja=sb.positionScreen.y,da instanceof THREE.MeshLambertMaterial||da instanceof THREE.MeshPhongMaterial)?(ca.copy(da.color),ia.copy(da.emissive),da.vertexColors===THREE.FaceColors&&(ca.r*=na.color.r,ca.g*=na.color.g,ca.b*=na.color.b),!0===mb)?!1===da.wireframe&&da.shading==THREE.SmoothShading&&4==na.vertexNormalsLength?(ga.r=fa.r=V.r=aa.r=Na.r,ga.g=fa.g=V.g=aa.g=Na.g,ga.b=fa.b=V.b=aa.b=Na.b,m(na.v1.positionWorld,na.vertexNormalsWorld[0], +G.positionScreen.y),La.addPoint(P.positionScreen.x,P.positionScreen.y),!0===fb.intersects(La)))(oa=C,bb=D,E=G,yb=P,rb=B,sb=J,hc=a,f.info.render.vertices+=4,f.info.render.faces++,b(da.opacity),c(da.blending),void 0!==da.map&&null!==da.map||void 0!==da.envMap&&null!==da.envMap)?(n(oa,bb,yb,0,1,3,na,da,hc),n(rb,E,sb,1,2,3,na,da,hc)):(H=oa.positionScreen.x,I=oa.positionScreen.y,L=bb.positionScreen.x,N=bb.positionScreen.y,S=E.positionScreen.x,U=E.positionScreen.y,M=yb.positionScreen.x,O=yb.positionScreen.y, +Q=rb.positionScreen.x,Z=rb.positionScreen.y,K=sb.positionScreen.x,ja=sb.positionScreen.y,da instanceof THREE.MeshLambertMaterial||da instanceof THREE.MeshPhongMaterial)?(ca.copy(da.color),ia.copy(da.emissive),da.vertexColors===THREE.FaceColors&&(ca.r*=na.color.r,ca.g*=na.color.g,ca.b*=na.color.b),!0===lb)?!1===da.wireframe&&da.shading==THREE.SmoothShading&&4==na.vertexNormalsLength?(ga.r=fa.r=V.r=aa.r=Na.r,ga.g=fa.g=V.g=aa.g=Na.g,ga.b=fa.b=V.b=aa.b=Na.b,m(na.v1.positionWorld,na.vertexNormalsWorld[0], ga),m(na.v2.positionWorld,na.vertexNormalsWorld[1],fa),m(na.v4.positionWorld,na.vertexNormalsWorld[3],V),m(na.v3.positionWorld,na.vertexNormalsWorld[2],aa),ga.r=ga.r*ca.r+ia.r,ga.g=ga.g*ca.g+ia.g,ga.b=ga.b*ca.b+ia.b,fa.r=fa.r*ca.r+ia.r,fa.g=fa.g*ca.g+ia.g,fa.b=fa.b*ca.b+ia.b,V.r=V.r*ca.r+ia.r,V.g=V.g*ca.g+ia.g,V.b=V.b*ca.b+ia.b,aa.r=aa.r*ca.r+ia.r,aa.g=aa.g*ca.g+ia.g,aa.b=aa.b*ca.b+ia.b,va=wc(ga,fa,V,aa),q(H,I,L,N,M,O),ma(H,I,L,N,M,O,0,0,1,0,0,1,va),q(Q,Z,S,U,K,ja),ma(Q,Z,S,U,K,ja,1,0,1,1,0,1,va)): (R.r=Na.r,R.g=Na.g,R.b=Na.b,m(na.centroidWorld,na.normalWorld,R),R.r=R.r*ca.r+ia.r,R.g=R.g*ca.g+ia.g,R.b=R.b*ca.b+ia.b,t(H,I,L,N,S,U,M,O),!0===da.wireframe?s(R,da.wireframeLinewidth,da.wireframeLinecap,da.wireframeLinejoin):u(R)):(R.r=ca.r+ia.r,R.g=ca.g+ia.g,R.b=ca.b+ia.b,t(H,I,L,N,S,U,M,O),!0===da.wireframe?s(R,da.wireframeLinewidth,da.wireframeLinecap,da.wireframeLinejoin):u(R)):da instanceof THREE.MeshBasicMaterial?(R.copy(da.color),da.vertexColors===THREE.FaceColors&&(R.r*=na.color.r,R.g*=na.color.g, -R.b*=na.color.b),t(H,I,L,N,S,U,M,O),!0===da.wireframe?s(R,da.wireframeLinewidth,da.wireframeLinecap,da.wireframeLinejoin):u(R)):da instanceof THREE.MeshNormalMaterial?(R.r=gc(na.normalWorld.x),R.g=gc(na.normalWorld.y),R.b=gc(na.normalWorld.z),t(H,I,L,N,S,U,M,O),!0===da.wireframe?s(R,da.wireframeLinewidth,da.wireframeLinecap,da.wireframeLinejoin):u(R)):da instanceof THREE.MeshDepthMaterial&&(Ca=l.near,Ka=l.far,ga.r=ga.g=ga.b=1-Cb(oa.positionScreen.z,Ca,Ka),fa.r=fa.g=fa.b=1-Cb(bb.positionScreen.z,Ca, -Ka),V.r=V.g=V.b=1-Cb(zb.positionScreen.z,Ca,Ka),aa.r=aa.g=aa.b=1-Cb(E.positionScreen.z,Ca,Ka),va=wc(ga,fa,V,aa),q(H,I,L,N,M,O),ma(H,I,L,N,M,O,0,0,1,0,0,1,va),q(Q,Z,S,U,K,ja),ma(Q,Z,S,U,K,ja,1,0,1,1,0,1,va));xa.addRectangle(La)}r.setTransform(1,0,0,1,0,0)}}}; +R.b*=na.color.b),t(H,I,L,N,S,U,M,O),!0===da.wireframe?s(R,da.wireframeLinewidth,da.wireframeLinecap,da.wireframeLinejoin):u(R)):da instanceof THREE.MeshNormalMaterial?(R.r=gc(na.normalWorld.x),R.g=gc(na.normalWorld.y),R.b=gc(na.normalWorld.z),t(H,I,L,N,S,U,M,O),!0===da.wireframe?s(R,da.wireframeLinewidth,da.wireframeLinecap,da.wireframeLinejoin):u(R)):da instanceof THREE.MeshDepthMaterial&&(Ba=l.near,Ka=l.far,ga.r=ga.g=ga.b=1-Cb(oa.positionScreen.z,Ba,Ka),fa.r=fa.g=fa.b=1-Cb(bb.positionScreen.z,Ba, +Ka),V.r=V.g=V.b=1-Cb(yb.positionScreen.z,Ba,Ka),aa.r=aa.g=aa.b=1-Cb(E.positionScreen.z,Ba,Ka),va=wc(ga,fa,V,aa),q(H,I,L,N,M,O),ma(H,I,L,N,M,O,0,0,1,0,0,1,va),q(Q,Z,S,U,K,ja),ma(Q,Z,S,U,K,ja,1,0,1,1,0,1,va));wa.addRectangle(La)}r.setTransform(1,0,0,1,0,0)}}}; THREE.ShaderChunk={fog_pars_fragment:"#ifdef USE_FOG\nuniform vec3 fogColor;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;\nuniform float fogFar;\n#endif\n#endif",fog_fragment:"#ifdef USE_FOG\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n#ifdef FOG_EXP2\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform float flipEnvMap;\nuniform int combine;\n#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\nuniform bool useRefract;\nuniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif", envmap_fragment:"#ifdef USE_ENVMAP\nvec3 reflectVec;\n#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nreflectVec = refract( cameraToVertex, normal, refractionRatio );\n} else { \nreflectVec = reflect( cameraToVertex, normal );\n}\n#else\nreflectVec = vReflect;\n#endif\n#ifdef DOUBLE_SIDED\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#else\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#endif\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\nif ( combine == 1 ) {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\n} else if ( combine == 2 ) {\ngl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;\n} else {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\n}\n#endif", envmap_pars_vertex:"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\nvarying vec3 vReflect;\nuniform float refractionRatio;\nuniform bool useRefract;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n#ifdef USE_SKINNING\nvec4 worldPosition = modelMatrix * skinned;\n#endif\n#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );\n#endif\n#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n#endif\n#endif", @@ -357,22 +357,22 @@ g=4:"c"===f.type&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=k.create l;c++)a.__morphTargetsArrays.push(new Float32Array(3*i))}if(a.numMorphNormals){a.__morphNormalsArrays=[];c=0;for(l=a.numMorphNormals;cl;l++)K.autoScaleCubemaps&&!f?(m=j,n=l,q=c.image[l],t=Oc,q.width<=t&&q.height<=t||(u=Math.max(q.width,q.height),s=Math.floor(q.width*t/u),t=Math.floor(q.height*t/u),u=document.createElement("canvas"),u.width=s,u.height=t,u.getContext("2d").drawImage(q,0,0,q.width,q.height,0,0,s,t),q=u),m[n]=q):j[l]=c.image[l];l=j[0];m=0===(l.width&l.width-1)&&0===(l.height&l.height-1);n=H(c.format);q=H(c.type);P(k.TEXTURE_CUBE_MAP,c,m);for(l=0;6>l;l++)if(f){t=j[l].mipmaps;u=0;for(z=t.length;u=vc&&console.warn("Trying to use "+a+" texture units while this GPU supports only "+vc);wa+=1;return a}function A(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse, -a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function w(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function v(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function C(a,b,c){lb!==a&&(a?k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL),lb=a);if(a&&(Ab!==b||Bb!==c))k.polygonOffset(b,c),Ab=b,Bb=c}function D(a){for(var a=a.split("\n"),b=0,c=a.length;b=vc&&console.warn("Trying to use "+a+" texture units while this GPU supports only "+vc);Aa+=1;return a}function A(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse, +a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function w(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function v(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function C(a,b,c){zb!==a&&(a?k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL),zb=a);if(a&&(Ab!==b||Bb!==c))k.polygonOffset(b,c),Ab=b,Bb=c}function D(a){for(var a=a.split("\n"),b=0,c=a.length;bb;b++)k.deleteFramebuffer(a.__webglFramebuffer[b]),k.deleteRenderbuffer(a.__webglRenderbuffer[b]);else k.deleteFramebuffer(a.__webglFramebuffer),k.deleteRenderbuffer(a.__webglRenderbuffer)};this.deallocateMaterial=function(a){var b=a.program;if(b){a.program=void 0;var c,d,e=!1,a=0;for(c=ja.length;aya;ya++)Zb=eb[ya],ub[Xa]=Zb.x,ub[Xa+1]=Zb.y,ub[Xa+2]=Zb.z,Xa+=3;else for(ya=0;3>ya;ya++)ub[Xa]=$a.x,ub[Xa+1]=$a.y,ub[Xa+2]=$a.z,Xa+=3;F=0;for($=sa.length;F<$;F++)if(T=Ya[sa[F]],eb=T.vertexNormals,$a=T.normal,4===eb.length&&gb)for(ya= -0;4>ya;ya++)Zb=eb[ya],ub[Xa]=Zb.x,ub[Xa+1]=Zb.y,ub[Xa+2]=Zb.z,Xa+=3;else for(ya=0;4>ya;ya++)ub[Xa]=$a.x,ub[Xa+1]=$a.y,ub[Xa+2]=$a.z,Xa+=3;k.bindBuffer(k.ARRAY_BUFFER,qa.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,ub,xa)}if(mc&&Tc&&xb){F=0;for($=ra.length;F<$;F++)if(Za=ra[F],lb=Tc[Za],void 0!==lb)for(ya=0;3>ya;ya++)ic=lb[ya],nc[Vb]=ic.u,nc[Vb+1]=ic.v,Vb+=2;F=0;for($=sa.length;F<$;F++)if(Za=sa[F],lb=Tc[Za],void 0!==lb)for(ya=0;4>ya;ya++)ic=lb[ya],nc[Vb]=ic.u,nc[Vb+1]=ic.v,Vb+=2;0ya;ya++)jc=mb[ya],oc[Wb]=jc.u,oc[Wb+1]=jc.v,Wb+=2;F=0;for($=sa.length;F<$;F++)if(Za=sa[F],mb=Uc[Za],void 0!==mb)for(ya=0;4>ya;ya++)jc=mb[ya],oc[Wb]=jc.u,oc[Wb+1]=jc.v,Wb+=2;0xa;xa++)Zb=db[xa],ub[Wa]=Zb.x,ub[Wa+1]=Zb.y,ub[Wa+2]=Zb.z,Wa+=3;else for(xa=0;3>xa;xa++)ub[Wa]=$a.x,ub[Wa+1]=$a.y,ub[Wa+2]=$a.z,Wa+=3;F=0;for($=sa.length;F<$;F++)if(T=Xa[sa[F]],db=T.vertexNormals,$a=T.normal,4===db.length&&gb)for(xa= +0;4>xa;xa++)Zb=db[xa],ub[Wa]=Zb.x,ub[Wa+1]=Zb.y,ub[Wa+2]=Zb.z,Wa+=3;else for(xa=0;4>xa;xa++)ub[Wa]=$a.x,ub[Wa+1]=$a.y,ub[Wa+2]=$a.z,Wa+=3;k.bindBuffer(k.ARRAY_BUFFER,qa.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,ub,wa)}if(mc&&Tc&&nb){F=0;for($=ra.length;F<$;F++)if(Za=ra[F],lb=Tc[Za],void 0!==lb)for(xa=0;3>xa;xa++)ic=lb[xa],nc[Vb]=ic.u,nc[Vb+1]=ic.v,Vb+=2;F=0;for($=sa.length;F<$;F++)if(Za=sa[F],lb=Tc[Za],void 0!==lb)for(xa=0;4>xa;xa++)ic=lb[xa],nc[Vb]=ic.u,nc[Vb+1]=ic.v,Vb+=2;0xa;xa++)jc=ob[xa],oc[Wb]=jc.u,oc[Wb+1]=jc.v,Wb+=2;F=0;for($=sa.length;F<$;F++)if(Za=sa[F],ob=Uc[Za],void 0!==ob)for(xa=0;4>xa;xa++)jc=ob[xa],oc[Wb]=jc.u,oc[Wb+1]=jc.v,Wb+=2;0f;f++){a.__webglFramebuffer[f]=k.createFramebuffer();a.__webglRenderbuffer[f]=k.createRenderbuffer();k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width, a.height,0,d,e,null);var g=a,h=k.TEXTURE_CUBE_MAP_POSITIVE_X+f;k.bindFramebuffer(k.FRAMEBUFFER,a.__webglFramebuffer[f]);k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,h,g.__webglTexture,0);B(a.__webglRenderbuffer[f],a)}c&&k.generateMipmap(k.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=k.createFramebuffer(),a.__webglRenderbuffer=k.createRenderbuffer(),k.bindTexture(k.TEXTURE_2D,a.__webglTexture),P(k.TEXTURE_2D,a,c),k.texImage2D(k.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=k.TEXTURE_2D, -k.bindFramebuffer(k.FRAMEBUFFER,a.__webglFramebuffer),k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,d,a.__webglTexture,0),B(a.__webglRenderbuffer,a),c&&k.generateMipmap(k.TEXTURE_2D);b?k.bindTexture(k.TEXTURE_CUBE_MAP,null):k.bindTexture(k.TEXTURE_2D,null);k.bindRenderbuffer(k.RENDERBUFFER,null);k.bindFramebuffer(k.FRAMEBUFFER,null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=mb,a=Na,d=xa,e=La);b!==fa&&(k.bindFramebuffer(k.FRAMEBUFFER, -b),k.viewport(d,e,c,a),fa=b);Za=c;eb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)}; +k.bindFramebuffer(k.FRAMEBUFFER,a.__webglFramebuffer),k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,d,a.__webglTexture,0),B(a.__webglRenderbuffer,a),c&&k.generateMipmap(k.TEXTURE_2D);b?k.bindTexture(k.TEXTURE_CUBE_MAP,null):k.bindTexture(k.TEXTURE_2D,null);k.bindRenderbuffer(k.RENDERBUFFER,null);k.bindFramebuffer(k.FRAMEBUFFER,null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=lb,a=Na,d=wa,e=La);b!==fa&&(k.bindFramebuffer(k.FRAMEBUFFER, +b),k.viewport(d,e,c,a),fa=b);Za=c;db=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)}; THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format: THREE.RGBAFormat;this.type=void 0!==c.type?c.type:THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0}; THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.anisotropy=this.anisotropy;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps;return a}; diff --git a/examples/canvas_geometry_panorama.html b/examples/canvas_geometry_panorama.html index a62ea6e36803d4997a23e324e8ab86fafa2483b2..c37f101a327b0b898fbdbe350f08e85f3e642dfe 100644 --- a/examples/canvas_geometry_panorama.html +++ b/examples/canvas_geometry_panorama.html @@ -77,7 +77,7 @@ ]; - mesh = new THREE.Mesh( new THREE.CubeGeometry( 300, 300, 300, 7, 7, 7, materials ), new THREE.MeshFaceMaterial() ); + mesh = new THREE.Mesh( new THREE.CubeGeometry( 300, 300, 300, 7, 7, 7 ), new THREE.MeshFaceMaterial( materials ) ); mesh.scale.x = - 1; scene.add( mesh ); diff --git a/examples/canvas_geometry_panorama_fisheye.html b/examples/canvas_geometry_panorama_fisheye.html index f7dc11250c4e77082269870f1d047f10b7c73d5a..37bc874d3121f9f0a4851d938f71e01e6ebd181b 100644 --- a/examples/canvas_geometry_panorama_fisheye.html +++ b/examples/canvas_geometry_panorama_fisheye.html @@ -77,7 +77,7 @@ ]; - mesh = new THREE.Mesh( new THREE.CubeGeometry( 300, 300, 300, 7, 7, 7, materials ), new THREE.MeshFaceMaterial() ); + mesh = new THREE.Mesh( new THREE.CubeGeometry( 300, 300, 300, 7, 7, 7 ), new THREE.MeshFaceMaterial( materials ) ); mesh.scale.x = - 1; scene.add( mesh ); diff --git a/examples/canvas_materials.html b/examples/canvas_materials.html index b797d24bd3ee2f395d34053a1218b81d08fcf8bf..9a3dd11c39bbbe11148f7ed75170e16851f83e0a 100644 --- a/examples/canvas_materials.html +++ b/examples/canvas_materials.html @@ -65,7 +65,7 @@ var geometry = new THREE.SphereGeometry( 100, 14, 7, false ); - geometry.materials = [ + var materials = [ new THREE.MeshBasicMaterial( { color: 0x00ffff, wireframe: true, side: THREE.DoubleSide } ), new THREE.MeshBasicMaterial( { color: 0xff0000, blending: THREE.AdditiveBlending, side: THREE.DoubleSide } ), @@ -81,17 +81,17 @@ for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) { var face = geometry.faces[ i ]; - if ( Math.random() > 0.5 ) face.materialIndex = Math.floor( Math.random() * geometry.materials.length ); + if ( Math.random() > 0.5 ) face.materialIndex = Math.floor( Math.random() * materials.length ); } - geometry.materials.push( new THREE.MeshFaceMaterial() ); + materials.push( new THREE.MeshFaceMaterial( materials ) ); objects = []; - for ( var i = 0, l = geometry.materials.length; i < l; i ++ ) { + for ( var i = 0, l = materials.length; i < l; i ++ ) { - var sphere = new THREE.Mesh( geometry, geometry.materials[ i ] ); + var sphere = new THREE.Mesh( geometry, materials[ i ] ); sphere.position.x = ( i % 5 ) * 200 - 400; sphere.position.z = Math.floor( i / 5 ) * 200 - 200; diff --git a/examples/misc_ubiquity_test.html b/examples/misc_ubiquity_test.html index 3636261686f580955bf1e17b9c0d6def3592c2cb..8dd617134d935a0d540b7d9e629cbeb19603afba 100644 --- a/examples/misc_ubiquity_test.html +++ b/examples/misc_ubiquity_test.html @@ -96,6 +96,7 @@ // POLYFIELD var geometry = new THREE.Geometry(); + var materials = []; for ( var i = 0; i < 100; i ++ ) { @@ -109,12 +110,12 @@ v1.addSelf( v ); v2.addSelf( v ); - var face = new THREE.Face3( geometry.vertices.push( v0 ) - 1, geometry.vertices.push( v1 ) - 1, geometry.vertices.push( v2 ) - 1, null, null, geometry.materials.length ); - - geometry.materials.push( new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, side: THREE.DoubleSide } ) ); + var face = new THREE.Face3( geometry.vertices.push( v0 ) - 1, geometry.vertices.push( v1 ) - 1, geometry.vertices.push( v2 ) - 1, null, null, i ); geometry.faces.push( face ); + materials.push( new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, side: THREE.DoubleSide } ) ); + } geometry.computeFaceNormals(); @@ -124,7 +125,7 @@ group.scale.x = group.scale.y = group.scale.z = 2; scene.add( group ); - mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() ); + mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) ); group.add( mesh ); // LIGHTS diff --git a/examples/webgl_materials.html b/examples/webgl_materials.html index cc943d37e34838202ed3fa217422454cc72b1392..a6bf27c8533c6aa755e02cbcb937e68687c83f4c 100644 --- a/examples/webgl_materials.html +++ b/examples/webgl_materials.html @@ -96,22 +96,13 @@ for ( var i = 0, l = geometry_pieces.faces.length; i < l; i ++ ) { var face = geometry_pieces.faces[ i ]; - - if ( Math.random() > 0.7 ) { - - face.materialIndex = Math.floor( Math.random() * materials.length ); - - } else { - - face.materialIndex = 0; - - } + face.materialIndex = Math.floor( Math.random() * materials.length ); } geometry_pieces.materials = materials; - materials.push( new THREE.MeshFaceMaterial() ); + materials.push( new THREE.MeshFaceMaterial( materials ) ); objects = []; diff --git a/examples/webgl_sandbox.html b/examples/webgl_sandbox.html index 936415c4e072634fd0c567da73493da080188aaf..a846cefa04f81dd06ea75c398ff95903b14a7812 100644 --- a/examples/webgl_sandbox.html +++ b/examples/webgl_sandbox.html @@ -97,11 +97,7 @@ new THREE.MeshLambertMaterial( { color: 0xdddddd, shading: THREE.FlatShading } ), new THREE.MeshLambertMaterial( { color: 0xdddddd, shading: THREE.SmoothShading } ), new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0xdddddd, specular: 0x009900, shininess: 30, shading: THREE.FlatShading } ), - new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0xdddddd, specular: 0x009900, shininess: 30, shading: THREE.SmoothShading } ), -/* - new THREE.MeshBasicMaterial( { map: texture2, envMap: THREE.ImageUtils.loadTexture( 'textures/envmap.png', new THREE.SphericalReflectionMapping() ) } ), - new THREE.MeshLambertMaterial( { map: texture2, envMap: THREE.ImageUtils.loadTexture( 'textures/envmap.png', new THREE.SphericalReflectionMapping() ) } ), -*/ + new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0xdddddd, specular: 0x009900, shininess: 30, shading: THREE.SmoothShading } ) ]; @@ -114,17 +110,6 @@ } - /* - for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) { - - var face = geometry.faces[ i ]; - face.materialIndex = Math.floor( Math.random() * materials.length ); - - } - */ - - //materials.push( new THREE.MeshFaceMaterial() ); - for ( var i = 0; i < 5000; i ++ ) { // random order diff --git a/src/core/Projector.js b/src/core/Projector.js index 79a7e0351f108a859e8420b72ce46a6ae0f37072..20d8adc7a390284cbf249c1445ee86b37452eb15 100644 --- a/src/core/Projector.js +++ b/src/core/Projector.js @@ -171,9 +171,8 @@ THREE.Projector = function() { this.projectScene = function ( scene, camera, sortObjects, sortElements ) { var near = camera.near, far = camera.far, visible = false, - o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object, - modelMatrix, - geometry, geometryMaterials, vertices, vertex, vertexPositionScreen, + o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object, modelMatrix, + geometry, vertices, vertex, vertexPositionScreen, faces, face, faceVertexNormals, normal, faceVertexUvs, uvs, v1, v2, v3, v4, isFaceMaterial, material, side; @@ -216,7 +215,6 @@ THREE.Projector = function() { _normalMatrix.transpose(); isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial; - geometryMaterials = ( isFaceMaterial && object.material.materials.length > 0 ) ? object.material.materials : object.geometry.materials; side = object.material.side; @@ -241,7 +239,7 @@ THREE.Projector = function() { face = faces[ f ]; - material = isFaceMaterial === true ? geometryMaterials[ face.materialIndex ] : object.material; + material = isFaceMaterial === true ? object.material.materials[ face.materialIndex ] : object.material; if ( material === undefined ) continue;