From 615f8720235c4eeca70af7aaf0346f29107adce9 Mon Sep 17 00:00:00 2001 From: Mikael Emtinger Date: Thu, 7 Apr 2011 15:52:57 +0200 Subject: [PATCH 1/7] Added sprite support. See Sprite.js for details. No support for custom shader at this point. --- build/Three.js | 522 +++++++++++++++++---------------- src/objects/Sprite.js | 80 +++++ src/renderers/WebGLRenderer.js | 174 +++++++++-- src/renderers/WebGLShaders.js | 51 +++- utils/build.py | 1 + 5 files changed, 545 insertions(+), 283 deletions(-) create mode 100644 src/objects/Sprite.js diff --git a/build/Three.js b/build/Three.js index b884207e..e8626d91 100755 --- a/build/Three.js +++ b/build/Three.js @@ -12,21 +12,21 @@ this.length();b>0?this.multiplyScalar(1/b):this.set(0,0,0);return this},setPosit 1.0E-4&&Math.abs(this.z)<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(b,c,d,f){this.set(b||0,c||0,d||0,f||1)}; THREE.Vector4.prototype={set:function(b,c,d,f){this.x=b;this.y=c;this.z=d;this.w=f;return this},copy:function(b){this.set(b.x,b.y,b.z,b.w||1);return this},add:function(b,c){this.set(b.x+c.x,b.y+c.y,b.z+c.z,b.w+c.w);return this},addSelf:function(b){this.set(this.x+b.x,this.y+b.y,this.z+b.z,this.w+b.w);return this},sub:function(b,c){this.set(b.x-c.x,b.y-c.y,b.z-c.z,b.w-c.w);return this},subSelf:function(b){this.set(this.x-b.x,this.y-b.y,this.z-b.z,this.w-b.w);return this},multiplyScalar:function(b){this.set(this.x* b,this.y*b,this.z*b,this.w*b);return this},divideScalar:function(b){this.set(this.x/b,this.y/b,this.z/b,this.w/b);return this},lerpSelf:function(b,c){this.set(this.x+(b.x-this.x)*c,this.y+(b.y-this.y)*c,this.z+(b.z-this.z)*c,this.w+(b.w-this.w)*c)},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Ray=function(b,c){this.origin=b||new THREE.Vector3;this.direction=c||new THREE.Vector3}; -THREE.Ray.prototype={intersectScene:function(b){var c,d,f=b.objects,g=[];b=0;for(c=f.length;b0&&G>0&&P+G<1}var d,f,g,h,j,k,n,p,o,x, -y,v=b.geometry,B=v.vertices,F=[];d=0;for(f=v.faces.length;d0:o<0)){p=p.dot((new THREE.Vector3).sub(h,x))/ -o;x=x.addSelf(y.multiplyScalar(p));if(g instanceof THREE.Face3){if(c(x,h,j,k)){g={distance:this.origin.distanceTo(x),point:x,face:g,object:b};F.push(g)}}else if(g instanceof THREE.Face4&&(c(x,h,j,n)||c(x,j,k,n))){g={distance:this.origin.distanceTo(x),point:x,face:g,object:b};F.push(g)}}}return F}}; -THREE.Rectangle=function(){function b(){h=f-c;j=g-d}var c,d,f,g,h,j,k=!0;this.getX=function(){return c};this.getY=function(){return d};this.getWidth=function(){return h};this.getHeight=function(){return j};this.getLeft=function(){return c};this.getTop=function(){return d};this.getRight=function(){return f};this.getBottom=function(){return g};this.set=function(n,p,o,x){k=!1;c=n;d=p;f=o;g=x;b()};this.addPoint=function(n,p){if(k){k=!1;c=n;d=p;f=n;g=p}else{c=cn?f:n;g=g>p?g:p}b()}; -this.add3Points=function(n,p,o,x,y,v){if(k){k=!1;c=no?n>y?n:y:o>y?o:y;g=p>x?p>v?p:v:x>v?x:v}else{c=no?n>y?n>f?n:f:y>f?y:f:o>y?o>f?o:f:y>f?y:f;g=p>x?p>v?p>g?p:g:v>g?v:g:x>v?x>g?x:g:v>g?v:g}b()};this.addRectangle=function(n){if(k){k=!1;c=n.getLeft();d=n.getTop();f=n.getRight();g=n.getBottom()}else{c=cn.getRight()? +THREE.Ray.prototype={intersectScene:function(b){var c,d,f=b.objects,g=[];b=0;for(c=f.length;b0&&H>0&&O+H<1}var d,f,g,h,j,k,n,p,o,w, +y,v=b.geometry,C=v.vertices,G=[];d=0;for(f=v.faces.length;d0:o<0)){p=p.dot((new THREE.Vector3).sub(h,w))/ +o;w=w.addSelf(y.multiplyScalar(p));if(g instanceof THREE.Face3){if(c(w,h,j,k)){g={distance:this.origin.distanceTo(w),point:w,face:g,object:b};G.push(g)}}else if(g instanceof THREE.Face4&&(c(w,h,j,n)||c(w,j,k,n))){g={distance:this.origin.distanceTo(w),point:w,face:g,object:b};G.push(g)}}}return G}}; +THREE.Rectangle=function(){function b(){h=f-c;j=g-d}var c,d,f,g,h,j,k=!0;this.getX=function(){return c};this.getY=function(){return d};this.getWidth=function(){return h};this.getHeight=function(){return j};this.getLeft=function(){return c};this.getTop=function(){return d};this.getRight=function(){return f};this.getBottom=function(){return g};this.set=function(n,p,o,w){k=!1;c=n;d=p;f=o;g=w;b()};this.addPoint=function(n,p){if(k){k=!1;c=n;d=p;f=n;g=p}else{c=cn?f:n;g=g>p?g:p}b()}; +this.add3Points=function(n,p,o,w,y,v){if(k){k=!1;c=no?n>y?n:y:o>y?o:y;g=p>w?p>v?p:v:w>v?w:v}else{c=no?n>y?n>f?n:f:y>f?y:f:o>y?o>f?o:f:y>f?y:f;g=p>w?p>v?p>g?p:g:v>g?v:g:w>v?w>g?w:g:v>g?v:g}b()};this.addRectangle=function(n){if(k){k=!1;c=n.getLeft();d=n.getTop();f=n.getRight();g=n.getBottom()}else{c=cn.getRight()? f:n.getRight();g=g>n.getBottom()?g:n.getBottom()}b()};this.inflate=function(n){c-=n;d-=n;f+=n;g+=n;b()};this.minSelf=function(n){c=c>n.getLeft()?c:n.getLeft();d=d>n.getTop()?d:n.getTop();f=f=0&&Math.min(g,n.getBottom())-Math.max(d,n.getTop())>=0};this.empty=function(){k=!0;g=f=d=c=0;b()};this.isEmpty=function(){return k}}; THREE.Matrix3=function(){this.m=[]};THREE.Matrix3.prototype={transpose:function(){var b,c=this.m;b=c[1];c[1]=c[3];c[3]=b;b=c[2];c[2]=c[6];c[6]=b;b=c[5];c[5]=c[7];c[7]=b;return this},transposeIntoArray:function(b){var c=this.m;b[0]=c[0];b[1]=c[3];b[2]=c[6];b[3]=c[1];b[4]=c[4];b[5]=c[7];b[6]=c[2];b[7]=c[5];b[8]=c[8];return this}}; -THREE.Matrix4=function(b,c,d,f,g,h,j,k,n,p,o,x,y,v,B,F){this.set(b||1,c||0,d||0,f||0,g||0,h||1,j||0,k||0,n||0,p||0,o||1,x||0,y||0,v||0,B||0,F||1);this.flat=Array(16);this.m33=new THREE.Matrix3}; -THREE.Matrix4.prototype={set:function(b,c,d,f,g,h,j,k,n,p,o,x,y,v,B,F){this.n11=b;this.n12=c;this.n13=d;this.n14=f;this.n21=g;this.n22=h;this.n23=j;this.n24=k;this.n31=n;this.n32=p;this.n33=o;this.n34=x;this.n41=y;this.n42=v;this.n43=B;this.n44=F;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(b){this.set(b.n11,b.n12,b.n13,b.n14,b.n21,b.n22,b.n23,b.n24,b.n31,b.n32,b.n33,b.n34,b.n41,b.n42,b.n43,b.n44);return this},lookAt:function(b,c,d){var f=THREE.Matrix4.__v1, +THREE.Matrix4=function(b,c,d,f,g,h,j,k,n,p,o,w,y,v,C,G){this.set(b||1,c||0,d||0,f||0,g||0,h||1,j||0,k||0,n||0,p||0,o||1,w||0,y||0,v||0,C||0,G||1);this.flat=Array(16);this.m33=new THREE.Matrix3}; +THREE.Matrix4.prototype={set:function(b,c,d,f,g,h,j,k,n,p,o,w,y,v,C,G){this.n11=b;this.n12=c;this.n13=d;this.n14=f;this.n21=g;this.n22=h;this.n23=j;this.n24=k;this.n31=n;this.n32=p;this.n33=o;this.n34=w;this.n41=y;this.n42=v;this.n43=C;this.n44=G;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(b){this.set(b.n11,b.n12,b.n13,b.n14,b.n21,b.n22,b.n23,b.n24,b.n31,b.n32,b.n33,b.n34,b.n41,b.n42,b.n43,b.n44);return this},lookAt:function(b,c,d){var f=THREE.Matrix4.__v1, g=THREE.Matrix4.__v2,h=THREE.Matrix4.__v3;h.sub(b,c).normalize();if(h.length()===0)h.z=1;f.cross(d,h).normalize();if(f.length()===0){h.x+=1.0E-4;f.cross(d,h).normalize()}g.cross(h,f).normalize();this.n11=f.x;this.n12=g.x;this.n13=h.x;this.n21=f.y;this.n22=g.y;this.n23=h.y;this.n31=f.z;this.n32=g.z;this.n33=h.z;return this},multiplyVector3:function(b){var c=b.x,d=b.y,f=b.z,g=1/(this.n41*c+this.n42*d+this.n43*f+this.n44);b.x=(this.n11*c+this.n12*d+this.n13*f+this.n14)*g;b.y=(this.n21*c+this.n22*d+this.n23* f+this.n24)*g;b.z=(this.n31*c+this.n32*d+this.n33*f+this.n34)*g;return b},multiplyVector4:function(b){var c=b.x,d=b.y,f=b.z,g=b.w;b.x=this.n11*c+this.n12*d+this.n13*f+this.n14*g;b.y=this.n21*c+this.n22*d+this.n23*f+this.n24*g;b.z=this.n31*c+this.n32*d+this.n33*f+this.n34*g;b.w=this.n41*c+this.n42*d+this.n43*f+this.n44*g;return b},rotateAxis:function(b){var c=b.x,d=b.y,f=b.z;b.x=c*this.n11+d*this.n12+f*this.n13;b.y=c*this.n21+d*this.n22+f*this.n23;b.z=c*this.n31+d*this.n32+f*this.n33;b.normalize(); -return b},crossVector:function(b){var c=new THREE.Vector4;c.x=this.n11*b.x+this.n12*b.y+this.n13*b.z+this.n14*b.w;c.y=this.n21*b.x+this.n22*b.y+this.n23*b.z+this.n24*b.w;c.z=this.n31*b.x+this.n32*b.y+this.n33*b.z+this.n34*b.w;c.w=b.w?this.n41*b.x+this.n42*b.y+this.n43*b.z+this.n44*b.w:1;return c},multiply:function(b,c){var d=b.n11,f=b.n12,g=b.n13,h=b.n14,j=b.n21,k=b.n22,n=b.n23,p=b.n24,o=b.n31,x=b.n32,y=b.n33,v=b.n34,B=b.n41,F=b.n42,G=b.n43,N=b.n44,W=c.n11,z=c.n12,O=c.n13,P=c.n14,S=c.n21,xa=c.n22, -sa=c.n23,qa=c.n24,e=c.n31,fa=c.n32,da=c.n33,ya=c.n34;this.n11=d*W+f*S+g*e;this.n12=d*z+f*xa+g*fa;this.n13=d*O+f*sa+g*da;this.n14=d*P+f*qa+g*ya+h;this.n21=j*W+k*S+n*e;this.n22=j*z+k*xa+n*fa;this.n23=j*O+k*sa+n*da;this.n24=j*P+k*qa+n*ya+p;this.n31=o*W+x*S+y*e;this.n32=o*z+x*xa+y*fa;this.n33=o*O+x*sa+y*da;this.n34=o*P+x*qa+y*ya+v;this.n41=B*W+F*S+G*e;this.n42=B*z+F*xa+G*fa;this.n43=B*O+F*sa+G*da;this.n44=B*P+F*qa+G*ya+N;return this},multiplyToArray:function(b,c,d){this.multiply(b,c);d[0]=this.n11;d[1]= +return b},crossVector:function(b){var c=new THREE.Vector4;c.x=this.n11*b.x+this.n12*b.y+this.n13*b.z+this.n14*b.w;c.y=this.n21*b.x+this.n22*b.y+this.n23*b.z+this.n24*b.w;c.z=this.n31*b.x+this.n32*b.y+this.n33*b.z+this.n34*b.w;c.w=b.w?this.n41*b.x+this.n42*b.y+this.n43*b.z+this.n44*b.w:1;return c},multiply:function(b,c){var d=b.n11,f=b.n12,g=b.n13,h=b.n14,j=b.n21,k=b.n22,n=b.n23,p=b.n24,o=b.n31,w=b.n32,y=b.n33,v=b.n34,C=b.n41,G=b.n42,H=b.n43,K=b.n44,W=c.n11,A=c.n12,N=c.n13,O=c.n14,R=c.n21,Fa=c.n22, +ka=c.n23,ua=c.n24,ca=c.n31,e=c.n32,ea=c.n33,Aa=c.n34;this.n11=d*W+f*R+g*ca;this.n12=d*A+f*Fa+g*e;this.n13=d*N+f*ka+g*ea;this.n14=d*O+f*ua+g*Aa+h;this.n21=j*W+k*R+n*ca;this.n22=j*A+k*Fa+n*e;this.n23=j*N+k*ka+n*ea;this.n24=j*O+k*ua+n*Aa+p;this.n31=o*W+w*R+y*ca;this.n32=o*A+w*Fa+y*e;this.n33=o*N+w*ka+y*ea;this.n34=o*O+w*ua+y*Aa+v;this.n41=C*W+G*R+H*ca;this.n42=C*A+G*Fa+H*e;this.n43=C*N+G*ka+H*ea;this.n44=C*O+G*ua+H*Aa+K;return this},multiplyToArray:function(b,c,d){this.multiply(b,c);d[0]=this.n11;d[1]= this.n21;d[2]=this.n31;d[3]=this.n41;d[4]=this.n12;d[5]=this.n22;d[6]=this.n32;d[7]=this.n42;d[8]=this.n13;d[9]=this.n23;d[10]=this.n33;d[11]=this.n43;d[12]=this.n14;d[13]=this.n24;d[14]=this.n34;d[15]=this.n44;return this},multiplySelf:function(b){this.multiply(this,b);return this},multiplyScalar:function(b){this.n11*=b;this.n12*=b;this.n13*=b;this.n14*=b;this.n21*=b;this.n22*=b;this.n23*=b;this.n24*=b;this.n31*=b;this.n32*=b;this.n33*=b;this.n34*=b;this.n41*=b;this.n42*=b;this.n43*=b;this.n44*= -b;return this},determinant:function(){var b=this.n11,c=this.n12,d=this.n13,f=this.n14,g=this.n21,h=this.n22,j=this.n23,k=this.n24,n=this.n31,p=this.n32,o=this.n33,x=this.n34,y=this.n41,v=this.n42,B=this.n43,F=this.n44;return f*j*p*y-d*k*p*y-f*h*o*y+c*k*o*y+d*h*x*y-c*j*x*y-f*j*n*v+d*k*n*v+f*g*o*v-b*k*o*v-d*g*x*v+b*j*x*v+f*h*n*B-c*k*n*B-f*g*p*B+b*k*p*B+c*g*x*B-b*h*x*B-d*h*n*F+c*j*n*F+d*g*p*F-b*j*p*F-c*g*o*F+b*h*o*F},transpose:function(){var b;b=this.n21;this.n21=this.n12;this.n12=b;b=this.n31;this.n31= +b;return this},determinant:function(){var b=this.n11,c=this.n12,d=this.n13,f=this.n14,g=this.n21,h=this.n22,j=this.n23,k=this.n24,n=this.n31,p=this.n32,o=this.n33,w=this.n34,y=this.n41,v=this.n42,C=this.n43,G=this.n44;return f*j*p*y-d*k*p*y-f*h*o*y+c*k*o*y+d*h*w*y-c*j*w*y-f*j*n*v+d*k*n*v+f*g*o*v-b*k*o*v-d*g*w*v+b*j*w*v+f*h*n*C-c*k*n*C-f*g*p*C+b*k*p*C+c*g*w*C-b*h*w*C-d*h*n*G+c*j*n*G+d*g*p*G-b*j*p*G-c*g*o*G+b*h*o*G},transpose:function(){var b;b=this.n21;this.n21=this.n12;this.n12=b;b=this.n31;this.n31= this.n13;this.n13=b;b=this.n32;this.n32=this.n23;this.n23=b;b=this.n41;this.n41=this.n14;this.n14=b;b=this.n42;this.n42=this.n24;this.n24=b;b=this.n43;this.n43=this.n34;this.n43=b;return this},clone:function(){var b=new THREE.Matrix4;b.n11=this.n11;b.n12=this.n12;b.n13=this.n13;b.n14=this.n14;b.n21=this.n21;b.n22=this.n22;b.n23=this.n23;b.n24=this.n24;b.n31=this.n31;b.n32=this.n32;b.n33=this.n33;b.n34=this.n34;b.n41=this.n41;b.n42=this.n42;b.n43=this.n43;b.n44=this.n44;return b},flatten:function(){this.flat[0]= this.n11;this.flat[1]=this.n21;this.flat[2]=this.n31;this.flat[3]=this.n41;this.flat[4]=this.n12;this.flat[5]=this.n22;this.flat[6]=this.n32;this.flat[7]=this.n42;this.flat[8]=this.n13;this.flat[9]=this.n23;this.flat[10]=this.n33;this.flat[11]=this.n43;this.flat[12]=this.n14;this.flat[13]=this.n24;this.flat[14]=this.n34;this.flat[15]=this.n44;return this.flat},flattenToArray:function(b){b[0]=this.n11;b[1]=this.n21;b[2]=this.n31;b[3]=this.n41;b[4]=this.n12;b[5]=this.n22;b[6]=this.n32;b[7]=this.n42; b[8]=this.n13;b[9]=this.n23;b[10]=this.n33;b[11]=this.n43;b[12]=this.n14;b[13]=this.n24;b[14]=this.n34;b[15]=this.n44;return b},flattenToArrayOffset:function(b,c){b[c]=this.n11;b[c+1]=this.n21;b[c+2]=this.n31;b[c+3]=this.n41;b[c+4]=this.n12;b[c+5]=this.n22;b[c+6]=this.n32;b[c+7]=this.n42;b[c+8]=this.n13;b[c+9]=this.n23;b[c+10]=this.n33;b[c+11]=this.n43;b[c+12]=this.n14;b[c+13]=this.n24;b[c+14]=this.n34;b[c+15]=this.n44;return b},setTranslation:function(b,c,d){this.set(1,0,0,b,0,1,0,c,0,0,1,d,0,0, @@ -34,9 +34,9 @@ b[8]=this.n13;b[9]=this.n23;b[10]=this.n33;b[11]=this.n43;b[12]=this.n14;b[13]=t 1-d,h=b.x,j=b.y,k=b.z,n=g*h,p=g*j;this.set(n*h+d,n*j-f*k,n*k+f*j,0,n*j+f*k,p*j+d,p*k-f*h,0,n*k-f*j,p*k+f*h,g*k*k+d,0,0,0,0,1);return this},setPosition:function(b){this.n14=b.x;this.n24=b.y;this.n34=b.z;return this},setRotationFromEuler:function(b){var c=b.x,d=b.y,f=b.z;b=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(f);f=Math.sin(f);var j=b*d,k=c*d;this.n11=g*h;this.n12=-g*f;this.n13=d;this.n21=k*h+b*f;this.n22=-k*f+b*h;this.n23=-c*g;this.n31=-j*h+c*f;this.n32=j*f+c*h;this.n33= b*g;return this},setRotationFromQuaternion:function(b){var c=b.x,d=b.y,f=b.z,g=b.w,h=c+c,j=d+d,k=f+f;b=c*h;var n=c*j;c*=k;var p=d*j;d*=k;f*=k;h*=g;j*=g;g*=k;this.n11=1-(p+f);this.n12=n-g;this.n13=c+j;this.n21=n+g;this.n22=1-(b+f);this.n23=d-h;this.n31=c-j;this.n32=d+h;this.n33=1-(b+p);return this},scale:function(b){var c=b.x,d=b.y;b=b.z;this.n11*=c;this.n12*=d;this.n13*=b;this.n21*=c;this.n22*=d;this.n23*=b;this.n31*=c;this.n32*=d;this.n33*=b;this.n41*=c;this.n42*=d;this.n43*=b;return this},extractPosition:function(b){this.n14= b.n14;this.n24=b.n24;this.n34=b.n34},extractRotation:function(b,c){var d=1/c.x,f=1/c.y,g=1/c.z;this.n11=b.n11*d;this.n21=b.n21*d;this.n31=b.n31*d;this.n12=b.n12*f;this.n22=b.n22*f;this.n32=b.n32*f;this.n13=b.n13*g;this.n23=b.n23*g;this.n33=b.n33*g}}; -THREE.Matrix4.makeInvert=function(b,c){var d=b.n11,f=b.n12,g=b.n13,h=b.n14,j=b.n21,k=b.n22,n=b.n23,p=b.n24,o=b.n31,x=b.n32,y=b.n33,v=b.n34,B=b.n41,F=b.n42,G=b.n43,N=b.n44;c===undefined&&(c=new THREE.Matrix4);c.n11=n*v*F-p*y*F+p*x*G-k*v*G-n*x*N+k*y*N;c.n12=h*y*F-g*v*F-h*x*G+f*v*G+g*x*N-f*y*N;c.n13=g*p*F-h*n*F+h*k*G-f*p*G-g*k*N+f*n*N;c.n14=h*n*x-g*p*x-h*k*y+f*p*y+g*k*v-f*n*v;c.n21=p*y*B-n*v*B-p*o*G+j*v*G+n*o*N-j*y*N;c.n22=g*v*B-h*y*B+h*o*G-d*v*G-g*o*N+d*y*N;c.n23=h*n*B-g*p*B-h*j*G+d*p*G+g*j*N-d*n*N; -c.n24=g*p*o-h*n*o+h*j*y-d*p*y-g*j*v+d*n*v;c.n31=k*v*B-p*x*B+p*o*F-j*v*F-k*o*N+j*x*N;c.n32=h*x*B-f*v*B-h*o*F+d*v*F+f*o*N-d*x*N;c.n33=g*p*B-h*k*B+h*j*F-d*p*F-f*j*N+d*k*N;c.n34=h*k*o-f*p*o-h*j*x+d*p*x+f*j*v-d*k*v;c.n41=n*x*B-k*y*B-n*o*F+j*y*F+k*o*G-j*x*G;c.n42=f*y*B-g*x*B+g*o*F-d*y*F-f*o*G+d*x*G;c.n43=g*k*B-f*n*B-g*j*F+d*n*F+f*j*G-d*k*G;c.n44=f*n*o-g*k*o+g*j*x-d*n*x-f*j*y+d*k*y;c.multiplyScalar(1/b.determinant());return c}; -THREE.Matrix4.makeInvert3x3=function(b){var c=b.m33,d=c.m,f=b.n33*b.n22-b.n32*b.n23,g=-b.n33*b.n21+b.n31*b.n23,h=b.n32*b.n21-b.n31*b.n22,j=-b.n33*b.n12+b.n32*b.n13,k=b.n33*b.n11-b.n31*b.n13,n=-b.n32*b.n11+b.n31*b.n12,p=b.n23*b.n12-b.n22*b.n13,o=-b.n23*b.n11+b.n21*b.n13,x=b.n22*b.n11-b.n21*b.n12;b=b.n11*f+b.n21*j+b.n31*p;if(b==0)throw"matrix not invertible";b=1/b;d[0]=b*f;d[1]=b*g;d[2]=b*h;d[3]=b*j;d[4]=b*k;d[5]=b*n;d[6]=b*p;d[7]=b*o;d[8]=b*x;return c}; +THREE.Matrix4.makeInvert=function(b,c){var d=b.n11,f=b.n12,g=b.n13,h=b.n14,j=b.n21,k=b.n22,n=b.n23,p=b.n24,o=b.n31,w=b.n32,y=b.n33,v=b.n34,C=b.n41,G=b.n42,H=b.n43,K=b.n44;c===undefined&&(c=new THREE.Matrix4);c.n11=n*v*G-p*y*G+p*w*H-k*v*H-n*w*K+k*y*K;c.n12=h*y*G-g*v*G-h*w*H+f*v*H+g*w*K-f*y*K;c.n13=g*p*G-h*n*G+h*k*H-f*p*H-g*k*K+f*n*K;c.n14=h*n*w-g*p*w-h*k*y+f*p*y+g*k*v-f*n*v;c.n21=p*y*C-n*v*C-p*o*H+j*v*H+n*o*K-j*y*K;c.n22=g*v*C-h*y*C+h*o*H-d*v*H-g*o*K+d*y*K;c.n23=h*n*C-g*p*C-h*j*H+d*p*H+g*j*K-d*n*K; +c.n24=g*p*o-h*n*o+h*j*y-d*p*y-g*j*v+d*n*v;c.n31=k*v*C-p*w*C+p*o*G-j*v*G-k*o*K+j*w*K;c.n32=h*w*C-f*v*C-h*o*G+d*v*G+f*o*K-d*w*K;c.n33=g*p*C-h*k*C+h*j*G-d*p*G-f*j*K+d*k*K;c.n34=h*k*o-f*p*o-h*j*w+d*p*w+f*j*v-d*k*v;c.n41=n*w*C-k*y*C-n*o*G+j*y*G+k*o*H-j*w*H;c.n42=f*y*C-g*w*C+g*o*G-d*y*G-f*o*H+d*w*H;c.n43=g*k*C-f*n*C-g*j*G+d*n*G+f*j*H-d*k*H;c.n44=f*n*o-g*k*o+g*j*w-d*n*w-f*j*y+d*k*y;c.multiplyScalar(1/b.determinant());return c}; +THREE.Matrix4.makeInvert3x3=function(b){var c=b.m33,d=c.m,f=b.n33*b.n22-b.n32*b.n23,g=-b.n33*b.n21+b.n31*b.n23,h=b.n32*b.n21-b.n31*b.n22,j=-b.n33*b.n12+b.n32*b.n13,k=b.n33*b.n11-b.n31*b.n13,n=-b.n32*b.n11+b.n31*b.n12,p=b.n23*b.n12-b.n22*b.n13,o=-b.n23*b.n11+b.n21*b.n13,w=b.n22*b.n11-b.n21*b.n12;b=b.n11*f+b.n21*j+b.n31*p;if(b==0)throw"matrix not invertible";b=1/b;d[0]=b*f;d[1]=b*g;d[2]=b*h;d[3]=b*j;d[4]=b*k;d[5]=b*n;d[6]=b*p;d[7]=b*o;d[8]=b*w;return c}; THREE.Matrix4.makeFrustum=function(b,c,d,f,g,h){var j;j=new THREE.Matrix4;j.n11=2*g/(c-b);j.n12=0;j.n13=(c+b)/(c-b);j.n14=0;j.n21=0;j.n22=2*g/(f-d);j.n23=(f+d)/(f-d);j.n24=0;j.n31=0;j.n32=0;j.n33=-(h+g)/(h-g);j.n34=-2*h*g/(h-g);j.n41=0;j.n42=0;j.n43=-1;j.n44=0;return j};THREE.Matrix4.makePerspective=function(b,c,d,f){var g;b=d*Math.tan(b*Math.PI/360);g=-b;return THREE.Matrix4.makeFrustum(g*c,b*c,g,b,d,f)}; THREE.Matrix4.makeOrtho=function(b,c,d,f,g,h){var j,k,n,p;j=new THREE.Matrix4;k=c-b;n=d-f;p=h-g;j.n11=2/k;j.n12=0;j.n13=0;j.n14=-((c+b)/k);j.n21=0;j.n22=2/n;j.n23=0;j.n24=-((d+f)/n);j.n31=0;j.n32=0;j.n33=-2/p;j.n34=-((h+g)/p);j.n41=0;j.n42=0;j.n43=0;j.n44=1;return j};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3; THREE.Object3D=function(){this.parent=undefined;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.scale=new THREE.Vector3(1,1,1);this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixAutoUpdate=!0;this.matrixWorldNeedsUpdate=!0;this.quaternion=new THREE.Quaternion;this.useQuaternion=!1;this.boundRadius=0;this.boundRadiusScale=1;this.visible= @@ -47,7 +47,7 @@ undefined&&b.parent.removeChild(b);b.parent=this;this.children.push(b);for(var c c,d)}};THREE.Quaternion=function(b,c,d,f){this.set(b||0,c||0,d||0,f!==undefined?f:1)}; THREE.Quaternion.prototype={set:function(b,c,d,f){this.x=b;this.y=c;this.z=d;this.w=f;return this},setFromEuler:function(b){var c=0.5*Math.PI/360,d=b.x*c,f=b.y*c,g=b.z*c;b=Math.cos(f);f=Math.sin(f);c=Math.cos(-g);g=Math.sin(-g);var h=Math.cos(d);d=Math.sin(d);var j=b*c,k=f*g;this.w=j*h-k*d;this.x=j*d+k*h;this.y=f*c*h+b*g*d;this.z=b*g*h-f*c*d;return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x*=-1;this.y*= -1;this.z*=-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var b=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(b==0)this.w=this.z=this.y=this.x=0;else{b=1/b;this.x*=b;this.y*=b;this.z*=b;this.w*=b}return this},multiplySelf:function(b){var c=this.x,d=this.y,f=this.z,g=this.w,h=b.x,j=b.y,k=b.z;b=b.w;this.x=c*b+g*h+d*k-f*j;this.y=d*b+g*j+f*h-c*k;this.z=f*b+g*k+c*j-d*h;this.w=g*b-c*h-d*j-f*k;return this}, -multiplyVector3:function(b,c){c||(c=b);var d=b.x,f=b.y,g=b.z,h=this.x,j=this.y,k=this.z,n=this.w,p=n*d+j*g-k*f,o=n*f+k*d-h*g,x=n*g+h*f-j*d;d=-h*d-j*f-k*g;c.x=p*n+d*-h+o*-k-x*-j;c.y=o*n+d*-j+x*-h-p*-k;c.z=x*n+d*-k+p*-j-o*-h;return c}}; +multiplyVector3:function(b,c){c||(c=b);var d=b.x,f=b.y,g=b.z,h=this.x,j=this.y,k=this.z,n=this.w,p=n*d+j*g-k*f,o=n*f+k*d-h*g,w=n*g+h*f-j*d;d=-h*d-j*f-k*g;c.x=p*n+d*-h+o*-k-w*-j;c.y=o*n+d*-j+w*-h-p*-k;c.z=w*n+d*-k+p*-j-o*-h;return c}}; THREE.Quaternion.slerp=function(b,c,d,f){var g=b.w*c.w+b.x*c.x+b.y*c.y+b.z*c.z;if(Math.abs(g)>=1){d.w=b.w;d.x=b.x;d.y=b.y;d.z=b.z;return d}var h=Math.acos(g),j=Math.sqrt(1-g*g);if(Math.abs(j)<0.0010){d.w=0.5*(b.w+c.w);d.x=0.5*(b.x+c.x);d.y=0.5*(b.y+c.y);d.z=0.5*(b.z+c.z);return d}g=Math.sin((1-f)*h)/j;f=Math.sin(f*h)/j;d.w=b.w*g+c.w*f;d.x=b.x*g+c.x*f;d.y=b.y*g+c.y*f;d.z=b.z*g+c.z*f;return d};THREE.Vertex=function(b){this.position=b||new THREE.Vector3}; THREE.Face3=function(b,c,d,f,g,h){this.a=b;this.b=c;this.c=d;this.normal=f instanceof THREE.Vector3?f:new THREE.Vector3;this.vertexNormals=f instanceof Array?f:[];this.color=g instanceof THREE.Color?g:new THREE.Color;this.vertexColors=g instanceof Array?g:[];this.vertexTangents=[];this.materials=h instanceof Array?h:[h];this.centroid=new THREE.Vector3}; THREE.Face4=function(b,c,d,f,g,h,j){this.a=b;this.b=c;this.c=d;this.d=f;this.normal=g instanceof THREE.Vector3?g:new THREE.Vector3;this.vertexNormals=g instanceof Array?g:[];this.color=h instanceof THREE.Color?h:new THREE.Color;this.vertexColors=h instanceof Array?h:[];this.vertexTangents=[];this.materials=j instanceof Array?j:[j];this.centroid=new THREE.Vector3};THREE.UV=function(b,c){this.set(b||0,c||0)}; @@ -56,17 +56,17 @@ THREE.Geometry.prototype={computeCentroids:function(){var b,c,d;b=0;for(c=this.f d.centroid.addSelf(this.vertices[d.d].position);d.centroid.divideScalar(4)}}},computeFaceNormals:function(b){var c,d,f,g,h,j,k=new THREE.Vector3,n=new THREE.Vector3;f=0;for(g=this.faces.length;f0){this.boundingBox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var c=1,d=this.vertices.length;cthis.boundingBox.x[1])this.boundingBox.x[1]=b.position.x; +d.vertexNormals[1].copy(f[d.b]);d.vertexNormals[2].copy(f[d.c])}else if(d instanceof THREE.Face4){d.vertexNormals[0].copy(f[d.a]);d.vertexNormals[1].copy(f[d.b]);d.vertexNormals[2].copy(f[d.c]);d.vertexNormals[3].copy(f[d.d])}}},computeTangents:function(){function b(da,pa,Ba,ga,$,la,Ga){k=da.vertices[pa].position;n=da.vertices[Ba].position;p=da.vertices[ga].position;o=j[$];w=j[la];y=j[Ga];v=n.x-k.x;C=p.x-k.x;G=n.y-k.y;H=p.y-k.y;K=n.z-k.z;W=p.z-k.z;A=w.u-o.u;N=y.u-o.u;O=w.v-o.v;R=y.v-o.v;Fa=1/(A*R- +N*O);e.set((R*v-O*C)*Fa,(R*G-O*H)*Fa,(R*K-O*W)*Fa);ea.set((A*C-N*v)*Fa,(A*H-N*G)*Fa,(A*W-N*K)*Fa);ua[pa].addSelf(e);ua[Ba].addSelf(e);ua[ga].addSelf(e);ca[pa].addSelf(ea);ca[Ba].addSelf(ea);ca[ga].addSelf(ea)}var c,d,f,g,h,j,k,n,p,o,w,y,v,C,G,H,K,W,A,N,O,R,Fa,ka,ua=[],ca=[],e=new THREE.Vector3,ea=new THREE.Vector3,Aa=new THREE.Vector3,xa=new THREE.Vector3,Ha=new THREE.Vector3;c=0;for(d=this.vertices.length;c0){this.boundingBox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var c=1,d=this.vertices.length;cthis.boundingBox.x[1])this.boundingBox.x[1]=b.position.x; if(b.position.ythis.boundingBox.y[1])this.boundingBox.y[1]=b.position.y;if(b.position.zthis.boundingBox.z[1])this.boundingBox.z[1]=b.position.z}}},computeBoundingSphere:function(){for(var b=this.boundingSphere===null?0:this.boundingSphere.radius,c=0,d=this.vertices.length;cthis.points.length-2?h:h+1;d[3]=h>this.points.length-3?h:h+2;p=this.points[d[0]];o=this.points[d[1]]; -x=this.points[d[2]];y=this.points[d[3]];k=j*j;n=j*k;f.x=c(p.x,o.x,x.x,y.x,j,k,n);f.y=c(p.y,o.y,x.y,y.y,j,k,n);f.z=c(p.z,o.z,x.z,y.z,j,k,n);return f};this.getControlPointsArray=function(){var v,B,F=this.points.length,G=[];for(v=0;vthis.points.length-2?h:h+1;d[3]=h>this.points.length-3?h:h+2;p=this.points[d[0]];o=this.points[d[1]]; +w=this.points[d[2]];y=this.points[d[3]];k=j*j;n=j*k;f.x=c(p.x,o.x,w.x,y.x,j,k,n);f.y=c(p.y,o.y,w.y,y.y,j,k,n);f.z=c(p.z,o.z,w.z,y.z,j,k,n);return f};this.getControlPointsArray=function(){var v,C,G=this.points.length,H=[];for(v=0;v1){console.log("THREE.Animation.update: Warning! Scale out of bounds:"+f+" on bone "+v);f=f<0?0:1}if(d==="pos"){d=b.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){d.x=g[0]+(h[0]-g[0])*f;d.y=g[1]+(h[1]-g[1])*f;d.z=g[2]+(h[2]-g[2])*f}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]= +THREE.Animation.prototype.update=function(b){if(this.isPlaying){var c=["pos","rot","scl"],d,f,g,h,j,k,n,p,o=this.data.JIT.hierarchy,w,y;this.currentTime+=b*this.timeScale;y=this.currentTime;w=this.currentTime%=this.data.length;p=parseInt(Math.min(w*this.data.fps,this.data.length*this.data.fps),10);for(var v=0,C=this.hierarchy.length;v1){console.log("THREE.Animation.update: Warning! Scale out of bounds:"+f+" on bone "+v);f=f<0?0:1}if(d==="pos"){d=b.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){d.x=g[0]+(h[0]-g[0])*f;d.y=g[1]+(h[1]-g[1])*f;d.z=g[2]+(h[2]-g[2])*f}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]= this.getPrevKeyWith("pos",v,j.index-1).pos;this.points[1]=g;this.points[2]=h;this.points[3]=this.getNextKeyWith("pos",v,k.index+1).pos;f=f*0.33+0.33;g=this.interpolateCatmullRom(this.points,f);d.x=g[0];d.y=g[1];d.z=g[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){f=this.interpolateCatmullRom(this.points,f*1.01);this.target.set(f[0],f[1],f[2]);this.target.subSelf(d);this.target.y=0;this.target.normalize();f=Math.atan2(this.target.x,this.target.z);b.rotation.set(0,f,0)}}}else if(d=== "rot")THREE.Quaternion.slerp(g,h,b.quaternion,f);else if(d==="scl"){d=b.scale;d.x=g[0]+(h[0]-g[0])*f;d.y=g[1]+(h[1]-g[1])*f;d.z=g[2]+(h[2]-g[2])*f}}}}if(this.JITCompile&&o[0][p]===undefined){this.hierarchy[0].update(undefined,!0);for(v=0;vb.length-2?h:h+1;d[3]=h>b.length-3?h:h+2;h=b[d[0]];k=b[d[1]];n=b[d[2]];p=b[d[3]];d=g*g;j=g*d;f[0]=this.interpolate(h[0],k[0],n[0],p[0],g,d,j);f[1]=this.interpolate(h[1],k[1],n[1],p[1],g,d,j);f[2]=this.interpolate(h[2],k[2],n[2],p[2],g,d,j);return f}; @@ -91,7 +91,7 @@ THREE.Camera.prototype.update=function(b,c,d){if(this.useTarget){this.matrix.loo THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;THREE.DirectionalLight=function(b,c,d){THREE.Light.call(this,b);this.position=new THREE.Vector3(0,1,0);this.intensity=c||1;this.distance=d||0};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;THREE.PointLight=function(b,c,d){THREE.Light.call(this,b);this.position=new THREE.Vector3;this.intensity=c||1;this.distance=d||0};THREE.PointLight.prototype=new THREE.Light; THREE.PointLight.prototype.constructor=THREE.PointLight;THREE.LensFlare=function(b,c,d,f){THREE.Object3D.call(this);this.positionScreen=new THREE.Vector3;this.lensFlares=[];this.customUpdateCallback=undefined;b!==undefined&&this.add(b,c,d,f)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;THREE.LensFlare.prototype.supr=THREE.Object3D.prototype; THREE.LensFlare.prototype.add=function(b,c,d,f){c===undefined&&(c=-1);d===undefined&&(d=0);if(f===undefined)f=THREE.BillboardBlending;d=Math.min(d,Math.max(0,d));this.lensFlares.push({texture:b,size:c,distance:d,x:0,y:0,z:0,scale:1,rotation:1,opacity:1,blending:f})}; -THREE.LensFlare.prototype.updateLensFlares=function(b){var c,d=this.lensFlares.length,f,g=-this.positionScreen.x*2,h=-this.positionScreen.y*2;for(c=0;c1){b=d.matrixWorldInverse;b=-(b.n31*this.position.x+b.n32*this.position.y+b.n33*this.position.z+b.n34);this.LODs[0].object3D.visible=!0;for(var f=1;f=this.LODs[f].visibleAtDistance){this.LODs[f-1].object3D.visible= !1;this.LODs[f].object3D.visible=!0}else break;for(;f=0&&ra>=0&&aa>=0&&pa>=0)return!0;else if(Ga<0&&ra<0||aa<0&&pa<0)return!1;else{if(Ga<0)ya=Math.max(ya,Ga/(Ga-ra));else ra<0&&(Fa=Math.min(Fa,Ga/(Ga-ra)));if(aa<0)ya=Math.max(ya,aa/(aa-pa));else pa<0&&(Fa=Math.min(Fa,aa/(aa-pa)));if(FaGa&&j.positionScreen.z0&&P.z<1){Sa=z[W]=z[W]||new THREE.RenderableParticle;W++;N=Sa;N.x=P.x/P.w;N.y=P.y/P.w;N.z=P.z;N.rotation=Ea.rotation.z;N.scale.x=Ea.scale.x*Math.abs(N.x-(P.x+da.projectionMatrix.n11)/(P.w+da.projectionMatrix.n14));N.scale.y=Ea.scale.y*Math.abs(N.y-(P.y+da.projectionMatrix.n22)/(P.w+da.projectionMatrix.n24));N.materials=Ea.materials;Fa.push(N)}}}}ya&&Fa.sort(c);return Fa}}; -THREE.DOMRenderer=function(){THREE.Renderer.call(this);var b=null,c=new THREE.Projector,d,f,g,h;this.domElement=document.createElement("div");this.setSize=function(j,k){d=j;f=k;g=d/2;h=f/2};this.render=function(j,k){var n,p,o,x,y,v,B,F;b=c.projectScene(j,k);n=0;for(p=b.length;n>1;Na=ga.height>>1;ea=ta.scale.x*n;ua=ta.scale.y*p;ca=ea*Q;va=ua*Na;u.set(X.x-ca,X.y-va,X.x+ca,X.y+va);if(m.instersects(u)){o.save();o.translate(X.x,X.y); -o.rotate(-ta.rotation);o.scale(ea,-ua);o.translate(-Q,-Na);o.drawImage(ga,0,0);o.restore()}}}else if(ea instanceof THREE.ParticleCanvasMaterial){ca=ta.scale.x*n;va=ta.scale.y*p;u.set(X.x-ca,X.y-va,X.x+ca,X.y+va);if(m.instersects(u)){d(ea.color.__styleString);ua=ea.color.__styleString;if(G!=ua)o.fillStyle=G=ua;o.save();o.translate(X.x,X.y);o.rotate(-ta.rotation);o.scale(ca,va);ea.program(o);o.restore()}}}function Ja(X,ta,ea,ca){b(ca.opacity);c(ca.blending);o.beginPath();o.moveTo(X.positionScreen.x, -X.positionScreen.y);o.lineTo(ta.positionScreen.x,ta.positionScreen.y);o.closePath();if(ca instanceof THREE.LineBasicMaterial){ma.__styleString=ca.color.__styleString;X=ca.linewidth;if(N!=X)o.lineWidth=N=X;X=ca.linecap;if(W!=X)o.lineCap=W=X;X=ca.linejoin;if(z!=X)o.lineJoin=z=X;d(ma.__styleString);o.stroke();u.inflate(ca.linewidth*2)}}function Qa(X,ta,ea,ca,va,ua,ga,Q,Na){b(Q.opacity);c(Q.blending);e=X.positionScreen.x;fa=X.positionScreen.y;da=ta.positionScreen.x;ya=ta.positionScreen.y;Fa=ea.positionScreen.x; -Ga=ea.positionScreen.y;Z(e,fa,da,ya,Fa,Ga);if(Q instanceof THREE.MeshBasicMaterial)if(Q.map){if(Q.map.mapping instanceof THREE.UVMapping){Ta=ga.uvs[0];Ma(e,fa,da,ya,Fa,Ga,Q.map.image,Ta[ca].u,Ta[ca].v,Ta[va].u,Ta[va].v,Ta[ua].u,Ta[ua].v)}}else if(Q.envMap){if(Q.envMap.mapping instanceof THREE.SphericalReflectionMapping){X=wa.matrixWorldInverse;H.copy(ga.vertexNormalsWorld[0]);R=(H.x*X.n11+H.y*X.n12+H.z*X.n13)*0.5+0.5;$=-(H.x*X.n21+H.y*X.n22+H.z*X.n23)*0.5+0.5;H.copy(ga.vertexNormalsWorld[1]);na=(H.x* -X.n11+H.y*X.n12+H.z*X.n13)*0.5+0.5;Ba=-(H.x*X.n21+H.y*X.n22+H.z*X.n23)*0.5+0.5;H.copy(ga.vertexNormalsWorld[2]);ha=(H.x*X.n11+H.y*X.n12+H.z*X.n13)*0.5+0.5;ka=-(H.x*X.n21+H.y*X.n22+H.z*X.n23)*0.5+0.5;Ma(e,fa,da,ya,Fa,Ga,Q.envMap.image,R,$,na,Ba,ha,ka)}}else Q.wireframe?ab(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):fb(Q.color.__styleString);else if(Q instanceof THREE.MeshLambertMaterial){if(Q.map&&!Q.wireframe){if(Q.map.mapping instanceof THREE.UVMapping){Ta= -ga.uvs[0];Ma(e,fa,da,ya,Fa,Ga,Q.map.image,Ta[ca].u,Ta[ca].v,Ta[va].u,Ta[va].v,Ta[ua].u,Ta[ua].v)}c(THREE.SubtractiveBlending)}if(w)if(!Q.wireframe&&Q.shading==THREE.SmoothShading&&ga.vertexNormalsWorld.length==3){Da.r=ja.r=la.r=M.r;Da.g=ja.g=la.g=M.g;Da.b=ja.b=la.b=M.b;Aa(Na,ga.v1.positionWorld,ga.vertexNormalsWorld[0],Da);Aa(Na,ga.v2.positionWorld,ga.vertexNormalsWorld[1],ja);Aa(Na,ga.v3.positionWorld,ga.vertexNormalsWorld[2],la);Ea.r=(ja.r+la.r)*0.5;Ea.g=(ja.g+la.g)*0.5;Ea.b=(ja.b+la.b)*0.5;Ya= -Va(Da,ja,la,Ea);Ma(e,fa,da,ya,Fa,Ga,Ya,0,0,1,0,0,1)}else{A.r=M.r;A.g=M.g;A.b=M.b;Aa(Na,ga.centroidWorld,ga.normalWorld,A);ma.r=Q.color.r*A.r;ma.g=Q.color.g*A.g;ma.b=Q.color.b*A.b;ma.updateStyleString();Q.wireframe?ab(ma.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):fb(ma.__styleString)}else Q.wireframe?ab(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):fb(Q.color.__styleString)}else if(Q instanceof THREE.MeshDepthMaterial){Sa=wa.near; -$a=wa.far;Da.r=Da.g=Da.b=1-gb(X.positionScreen.z,Sa,$a);ja.r=ja.g=ja.b=1-gb(ta.positionScreen.z,Sa,$a);la.r=la.g=la.b=1-gb(ea.positionScreen.z,Sa,$a);Ea.r=(ja.r+la.r)*0.5;Ea.g=(ja.g+la.g)*0.5;Ea.b=(ja.b+la.b)*0.5;Ya=Va(Da,ja,la,Ea);Ma(e,fa,da,ya,Fa,Ga,Ya,0,0,1,0,0,1)}else if(Q instanceof THREE.MeshNormalMaterial){ma.r=hb(ga.normalWorld.x);ma.g=hb(ga.normalWorld.y);ma.b=hb(ga.normalWorld.z);ma.updateStyleString();Q.wireframe?ab(ma.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin): -fb(ma.__styleString)}}function D(X,ta,ea,ca,va,ua,ga,Q,Na){b(Q.opacity);c(Q.blending);if(Q.map||Q.envMap){Qa(X,ta,ca,0,1,3,ga,Q,Na);Qa(va,ea,ua,1,2,3,ga,Q,Na)}else{e=X.positionScreen.x;fa=X.positionScreen.y;da=ta.positionScreen.x;ya=ta.positionScreen.y;Fa=ea.positionScreen.x;Ga=ea.positionScreen.y;ra=ca.positionScreen.x;aa=ca.positionScreen.y;pa=va.positionScreen.x;za=va.positionScreen.y;ia=ua.positionScreen.x;Y=ua.positionScreen.y;if(Q instanceof THREE.MeshBasicMaterial){t(e,fa,da,ya,Fa,Ga,ra,aa); -Q.wireframe?ab(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):fb(Q.color.__styleString)}else if(Q instanceof THREE.MeshLambertMaterial)if(w)if(!Q.wireframe&&Q.shading==THREE.SmoothShading&&ga.vertexNormalsWorld.length==4){Da.r=ja.r=la.r=Ea.r=M.r;Da.g=ja.g=la.g=Ea.g=M.g;Da.b=ja.b=la.b=Ea.b=M.b;Aa(Na,ga.v1.positionWorld,ga.vertexNormalsWorld[0],Da);Aa(Na,ga.v2.positionWorld,ga.vertexNormalsWorld[1],ja);Aa(Na,ga.v4.positionWorld,ga.vertexNormalsWorld[3],la);Aa(Na, -ga.v3.positionWorld,ga.vertexNormalsWorld[2],Ea);Ya=Va(Da,ja,la,Ea);Z(e,fa,da,ya,ra,aa);Ma(e,fa,da,ya,ra,aa,Ya,0,0,1,0,0,1);Z(pa,za,Fa,Ga,ia,Y);Ma(pa,za,Fa,Ga,ia,Y,Ya,1,0,1,1,0,1)}else{A.r=M.r;A.g=M.g;A.b=M.b;Aa(Na,ga.centroidWorld,ga.normalWorld,A);ma.r=Q.color.r*A.r;ma.g=Q.color.g*A.g;ma.b=Q.color.b*A.b;ma.updateStyleString();t(e,fa,da,ya,Fa,Ga,ra,aa);Q.wireframe?ab(ma.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):fb(ma.__styleString)}else{t(e,fa,da,ya,Fa,Ga,ra,aa); -Q.wireframe?ab(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):fb(Q.color.__styleString)}else if(Q instanceof THREE.MeshNormalMaterial){ma.r=hb(ga.normalWorld.x);ma.g=hb(ga.normalWorld.y);ma.b=hb(ga.normalWorld.z);ma.updateStyleString();t(e,fa,da,ya,Fa,Ga,ra,aa);Q.wireframe?ab(ma.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):fb(ma.__styleString)}else if(Q instanceof THREE.MeshDepthMaterial){Sa=wa.near;$a=wa.far;Da.r=Da.g=Da.b=1-gb(X.positionScreen.z, -Sa,$a);ja.r=ja.g=ja.b=1-gb(ta.positionScreen.z,Sa,$a);la.r=la.g=la.b=1-gb(ca.positionScreen.z,Sa,$a);Ea.r=Ea.g=Ea.b=1-gb(ea.positionScreen.z,Sa,$a);Ya=Va(Da,ja,la,Ea);Z(e,fa,da,ya,ra,aa);Ma(e,fa,da,ya,ra,aa,Ya,0,0,1,0,0,1);Z(pa,za,Fa,Ga,ia,Y);Ma(pa,za,Fa,Ga,ia,Y,Ya,1,0,1,1,0,1)}}}function Z(X,ta,ea,ca,va,ua){o.beginPath();o.moveTo(X,ta);o.lineTo(ea,ca);o.lineTo(va,ua);o.lineTo(X,ta);o.closePath()}function t(X,ta,ea,ca,va,ua,ga,Q){o.beginPath();o.moveTo(X,ta);o.lineTo(ea,ca);o.lineTo(va,ua);o.lineTo(ga, -Q);o.lineTo(X,ta);o.closePath()}function ab(X,ta,ea,ca){if(N!=ta)o.lineWidth=N=ta;if(W!=ea)o.lineCap=W=ea;if(z!=ca)o.lineJoin=z=ca;d(X);o.stroke();u.inflate(ta*2)}function fb(X){if(G!=X)o.fillStyle=G=X;o.fill()}function Ma(X,ta,ea,ca,va,ua,ga,Q,Na,db,Ua,bb,lb){var Pa,ib;Pa=ga.width-1;ib=ga.height-1;Q*=Pa;Na*=ib;db*=Pa;Ua*=ib;bb*=Pa;lb*=ib;ea-=X;ca-=ta;va-=X;ua-=ta;db-=Q;Ua-=Na;bb-=Q;lb-=Na;Pa=db*lb-bb*Ua;if(Pa!=0){ib=1/Pa;Pa=(lb*ea-Ua*va)*ib;Ua=(lb*ca-Ua*ua)*ib;ea=(db*va-bb*ea)*ib;ca=(db*ua-bb*ca)* -ib;X=X-Pa*Q-ea*Na;ta=ta-Ua*Q-ca*Na;o.save();o.transform(Pa,Ua,ea,ca,X,ta);o.clip();o.drawImage(ga,0,0);o.restore()}}function Va(X,ta,ea,ca){var va=~~(X.r*255),ua=~~(X.g*255);X=~~(X.b*255);var ga=~~(ta.r*255),Q=~~(ta.g*255);ta=~~(ta.b*255);var Na=~~(ea.r*255),db=~~(ea.g*255);ea=~~(ea.b*255);var Ua=~~(ca.r*255),bb=~~(ca.g*255);ca=~~(ca.b*255);U[0]=va<0?0:va>255?255:va;U[1]=ua<0?0:ua>255?255:ua;U[2]=X<0?0:X>255?255:X;U[4]=ga<0?0:ga>255?255:ga;U[5]=Q<0?0:Q>255?255:Q;U[6]=ta<0?0:ta>255?255:ta;U[8]=Na< -0?0:Na>255?255:Na;U[9]=db<0?0:db>255?255:db;U[10]=ea<0?0:ea>255?255:ea;U[12]=Ua<0?0:Ua>255?255:Ua;U[13]=bb<0?0:bb>255?255:bb;U[14]=ca<0?0:ca>255?255:ca;J.putImageData(L,0,0);Ca.drawImage(E,0,0);return V}function gb(X,ta,ea){X=(X-ta)/(ea-ta);return X*X*(3-2*X)}function hb(X){X=(X+1)*0.5;return X<0?0:X>1?1:X}function Wa(X,ta){var ea=ta.x-X.x,ca=ta.y-X.y,va=1/Math.sqrt(ea*ea+ca*ca);ea*=va;ca*=va;ta.x+=ea;ta.y+=ca;X.x-=ea;X.y-=ca}var eb,Oa,Ka,La,T,Ra,Xa,Za;this.autoClear?this.clear():o.setTransform(1, -0,0,-1,n,p);f=g.projectScene(oa,wa,this.sortElements);(w=oa.lights.length>0)&&cb(oa);eb=0;for(Oa=f.length;eb0){pa.r+=Y.color.r*ma;pa.g+=Y.color.g*ma;pa.b+=Y.color.b*ma}}else if(Y instanceof THREE.PointLight){qa.sub(Y.position,aa.centroidWorld);qa.normalize();ma=aa.normalWorld.dot(qa)*Y.intensity;if(ma>0){pa.r+=Y.color.r*ma;pa.g+=Y.color.g*ma;pa.b+=Y.color.b*ma}}}}function c(ra,aa,pa,za,ia,Y){da= -f(ya++);da.setAttribute("d","M "+ra.positionScreen.x+" "+ra.positionScreen.y+" L "+aa.positionScreen.x+" "+aa.positionScreen.y+" L "+pa.positionScreen.x+","+pa.positionScreen.y+"z");if(ia instanceof THREE.MeshBasicMaterial)z.__styleString=ia.color.__styleString;else if(ia instanceof THREE.MeshLambertMaterial)if(W){O.r=P.r;O.g=P.g;O.b=P.b;b(Y,za,O);z.r=ia.color.r*O.r;z.g=ia.color.g*O.g;z.b=ia.color.b*O.b;z.updateStyleString()}else z.__styleString=ia.color.__styleString;else if(ia instanceof THREE.MeshDepthMaterial){sa= -1-ia.__2near/(ia.__farPlusNear-za.z*ia.__farMinusNear);z.setRGB(sa,sa,sa)}else ia instanceof THREE.MeshNormalMaterial&&z.setRGB(g(za.normalWorld.x),g(za.normalWorld.y),g(za.normalWorld.z));ia.wireframe?da.setAttribute("style","fill: none; stroke: "+z.__styleString+"; stroke-width: "+ia.wireframeLinewidth+"; stroke-opacity: "+ia.opacity+"; stroke-linecap: "+ia.wireframeLinecap+"; stroke-linejoin: "+ia.wireframeLinejoin):da.setAttribute("style","fill: "+z.__styleString+"; fill-opacity: "+ia.opacity); -k.appendChild(da)}function d(ra,aa,pa,za,ia,Y,ma){da=f(ya++);da.setAttribute("d","M "+ra.positionScreen.x+" "+ra.positionScreen.y+" L "+aa.positionScreen.x+" "+aa.positionScreen.y+" L "+pa.positionScreen.x+","+pa.positionScreen.y+" L "+za.positionScreen.x+","+za.positionScreen.y+"z");if(Y instanceof THREE.MeshBasicMaterial)z.__styleString=Y.color.__styleString;else if(Y instanceof THREE.MeshLambertMaterial)if(W){O.r=P.r;O.g=P.g;O.b=P.b;b(ma,ia,O);z.r=Y.color.r*O.r;z.g=Y.color.g*O.g;z.b=Y.color.b* -O.b;z.updateStyleString()}else z.__styleString=Y.color.__styleString;else if(Y instanceof THREE.MeshDepthMaterial){sa=1-Y.__2near/(Y.__farPlusNear-ia.z*Y.__farMinusNear);z.setRGB(sa,sa,sa)}else Y instanceof THREE.MeshNormalMaterial&&z.setRGB(g(ia.normalWorld.x),g(ia.normalWorld.y),g(ia.normalWorld.z));Y.wireframe?da.setAttribute("style","fill: none; stroke: "+z.__styleString+"; stroke-width: "+Y.wireframeLinewidth+"; stroke-opacity: "+Y.opacity+"; stroke-linecap: "+Y.wireframeLinecap+"; stroke-linejoin: "+ -Y.wireframeLinejoin):da.setAttribute("style","fill: "+z.__styleString+"; fill-opacity: "+Y.opacity);k.appendChild(da)}function f(ra){if(e[ra]==null){e[ra]=document.createElementNS("http://www.w3.org/2000/svg","path");Ga==0&&e[ra].setAttribute("shape-rendering","crispEdges")}return e[ra]}function g(ra){return ra<0?Math.min((1+ra)*0.5,0.5):0.5+Math.min(ra*0.5,0.5)}var h=null,j=new THREE.Projector,k=document.createElementNS("http://www.w3.org/2000/svg","svg"),n,p,o,x,y,v,B,F,G=new THREE.Rectangle,N= -new THREE.Rectangle,W=!1,z=new THREE.Color(16777215),O=new THREE.Color(16777215),P=new THREE.Color(0),S=new THREE.Color(0),xa=new THREE.Color(0),sa,qa=new THREE.Vector3,e=[],fa=[],da,ya,Fa,Ga=1;this.domElement=k;this.autoClear=!0;this.sortObjects=!0;this.sortElements=!0;this.setQuality=function(ra){switch(ra){case "high":Ga=1;break;case "low":Ga=0}};this.setSize=function(ra,aa){n=ra;p=aa;o=n/2;x=p/2;k.setAttribute("viewBox",-o+" "+-x+" "+n+" "+p);k.setAttribute("width",n);k.setAttribute("height", -p);G.set(-o,-x,o,x)};this.clear=function(){for(;k.childNodes.length>0;)k.removeChild(k.childNodes[0])};this.render=function(ra,aa){var pa,za,ia,Y,ma,Da,ja,la;this.autoClear&&this.clear();h=j.projectScene(ra,aa,this.sortElements);Fa=ya=0;if(W=ra.lights.length>0){ja=ra.lights;P.setRGB(0,0,0);S.setRGB(0,0,0);xa.setRGB(0,0,0);pa=0;for(za=ja.length;pa=0&&oa>=0&&da>=0&&pa>=0)return!0;else if(Ha<0&&oa<0||da<0&&pa<0)return!1;else{if(Ha<0)Aa=Math.max(Aa,Ha/(Ha-oa));else oa<0&&(xa=Math.min(xa,Ha/(Ha-oa)));if(da<0)Aa=Math.max(Aa,da/(da-pa));else pa<0&&(xa=Math.min(xa,da/(da-pa)));if(xaHa&&j.positionScreen.z0&&O.z<1){Ra=A[W]=A[W]||new THREE.RenderableParticle;W++;K=Ra;K.x=O.x/O.w;K.y=O.y/O.w;K.z=O.z;K.rotation=ta.rotation.z;K.scale.x=ta.scale.x*Math.abs(K.x-(O.x+ea.projectionMatrix.n11)/(O.w+ea.projectionMatrix.n14));K.scale.y=ta.scale.y*Math.abs(K.y-(O.y+ea.projectionMatrix.n22)/(O.w+ea.projectionMatrix.n24));K.materials=ta.materials;xa.push(K)}}}}Aa&&xa.sort(c);return xa}}; +THREE.DOMRenderer=function(){THREE.Renderer.call(this);var b=null,c=new THREE.Projector,d,f,g,h;this.domElement=document.createElement("div");this.setSize=function(j,k){d=j;f=k;g=d/2;h=f/2};this.render=function(j,k){var n,p,o,w,y,v,C,G;b=c.projectScene(j,k);n=0;for(p=b.length;n>1;Ea=ha.height>>1;na=za.scale.x*n;qa=za.scale.y*p;Y=na*Q;Ca=qa*Ea;B.set(V.x-Y,V.y-Ca,V.x+Y,V.y+Ca);if(fa.instersects(B)){o.save();o.translate(V.x,V.y);o.rotate(-za.rotation);o.scale(na, +-qa);o.translate(-Q,-Ea);o.drawImage(ha,0,0);o.restore()}}}else if(na instanceof THREE.ParticleCanvasMaterial){Y=za.scale.x*n;Ca=za.scale.y*p;B.set(V.x-Y,V.y-Ca,V.x+Y,V.y+Ca);if(fa.instersects(B)){d(na.color.__styleString);qa=na.color.__styleString;if(H!=qa)o.fillStyle=H=qa;o.save();o.translate(V.x,V.y);o.rotate(-za.rotation);o.scale(Y,Ca);na.program(o);o.restore()}}}function Ja(V,za,na,Y){b(Y.opacity);c(Y.blending);o.beginPath();o.moveTo(V.positionScreen.x,V.positionScreen.y);o.lineTo(za.positionScreen.x, +za.positionScreen.y);o.closePath();if(Y instanceof THREE.LineBasicMaterial){la.__styleString=Y.color.__styleString;V=Y.linewidth;if(K!=V)o.lineWidth=K=V;V=Y.linecap;if(W!=V)o.lineCap=W=V;V=Y.linejoin;if(A!=V)o.lineJoin=A=V;d(la.__styleString);o.stroke();B.inflate(Y.linewidth*2)}}function Ia(V,za,na,Y,Ca,qa,ha,Q,Ea){b(Q.opacity);c(Q.blending);ca=V.positionScreen.x;e=V.positionScreen.y;ea=za.positionScreen.x;Aa=za.positionScreen.y;xa=na.positionScreen.x;Ha=na.positionScreen.y;D(ca,e,ea,Aa,xa,Ha);if(Q instanceof +THREE.MeshBasicMaterial)if(Q.map){if(Q.map.mapping instanceof THREE.UVMapping){Oa=ha.uvs[0];eb(ca,e,ea,Aa,xa,Ha,Q.map.image,Oa[Y].u,Oa[Y].v,Oa[Ca].u,Oa[Ca].v,Oa[qa].u,Oa[qa].v)}}else if(Q.envMap){if(Q.envMap.mapping instanceof THREE.SphericalReflectionMapping){V=ra.matrixWorldInverse;E.copy(ha.vertexNormalsWorld[0]);S=(E.x*V.n11+E.y*V.n12+E.z*V.n13)*0.5+0.5;Z=-(E.x*V.n21+E.y*V.n22+E.z*V.n23)*0.5+0.5;E.copy(ha.vertexNormalsWorld[1]);ma=(E.x*V.n11+E.y*V.n12+E.z*V.n13)*0.5+0.5;Da=-(E.x*V.n21+E.y*V.n22+ +E.z*V.n23)*0.5+0.5;E.copy(ha.vertexNormalsWorld[2]);Ma=(E.x*V.n11+E.y*V.n12+E.z*V.n13)*0.5+0.5;wa=-(E.x*V.n21+E.y*V.n22+E.z*V.n23)*0.5+0.5;eb(ca,e,ea,Aa,xa,Ha,Q.envMap.image,S,Z,ma,Da,Ma,wa)}}else Q.wireframe?t(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(Q.color.__styleString);else if(Q instanceof THREE.MeshLambertMaterial){if(Q.map&&!Q.wireframe){if(Q.map.mapping instanceof THREE.UVMapping){Oa=ha.uvs[0];eb(ca,e,ea,Aa,xa,Ha,Q.map.image,Oa[Y].u,Oa[Y].v,Oa[Ca].u, +Oa[Ca].v,Oa[qa].u,Oa[qa].v)}c(THREE.SubtractiveBlending)}if(x)if(!Q.wireframe&&Q.shading==THREE.SmoothShading&&ha.vertexNormalsWorld.length==3){Ga.r=ia.r=ja.r=z.r;Ga.g=ia.g=ja.g=z.g;Ga.b=ia.b=ja.b=z.b;Sa(Ea,ha.v1.positionWorld,ha.vertexNormalsWorld[0],Ga);Sa(Ea,ha.v2.positionWorld,ha.vertexNormalsWorld[1],ia);Sa(Ea,ha.v3.positionWorld,ha.vertexNormalsWorld[2],ja);ta.r=(ia.r+ja.r)*0.5;ta.g=(ia.g+ja.g)*0.5;ta.b=(ia.b+ja.b)*0.5;ab=Ta(Ga,ia,ja,ta);eb(ca,e,ea,Aa,xa,Ha,ab,0,0,1,0,0,1)}else{u.r=z.r;u.g= +z.g;u.b=z.b;Sa(Ea,ha.centroidWorld,ha.normalWorld,u);la.r=Q.color.r*u.r;la.g=Q.color.g*u.g;la.b=Q.color.b*u.b;la.updateStyleString();Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}else Q.wireframe?t(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(Q.color.__styleString)}else if(Q instanceof THREE.MeshDepthMaterial){Ra=ra.near;$a=ra.far;Ga.r=Ga.g=Ga.b=1-Qa(V.positionScreen.z,Ra,$a);ia.r=ia.g=ia.b= +1-Qa(za.positionScreen.z,Ra,$a);ja.r=ja.g=ja.b=1-Qa(na.positionScreen.z,Ra,$a);ta.r=(ia.r+ja.r)*0.5;ta.g=(ia.g+ja.g)*0.5;ta.b=(ia.b+ja.b)*0.5;ab=Ta(Ga,ia,ja,ta);eb(ca,e,ea,Aa,xa,Ha,ab,0,0,1,0,0,1)}else if(Q instanceof THREE.MeshNormalMaterial){la.r=hb(ha.normalWorld.x);la.g=hb(ha.normalWorld.y);la.b=hb(ha.normalWorld.z);la.updateStyleString();Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}}function Wa(V,za,na,Y,Ca,qa,ha,Q,Ea){b(Q.opacity); +c(Q.blending);if(Q.map||Q.envMap){Ia(V,za,Y,0,1,3,ha,Q,Ea);Ia(Ca,na,qa,1,2,3,ha,Q,Ea)}else{ca=V.positionScreen.x;e=V.positionScreen.y;ea=za.positionScreen.x;Aa=za.positionScreen.y;xa=na.positionScreen.x;Ha=na.positionScreen.y;oa=Y.positionScreen.x;da=Y.positionScreen.y;pa=Ca.positionScreen.x;Ba=Ca.positionScreen.y;ga=qa.positionScreen.x;$=qa.positionScreen.y;if(Q instanceof THREE.MeshBasicMaterial){aa(ca,e,ea,Aa,xa,Ha,oa,da);Q.wireframe?t(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap, +Q.wireframeLinejoin):bb(Q.color.__styleString)}else if(Q instanceof THREE.MeshLambertMaterial)if(x)if(!Q.wireframe&&Q.shading==THREE.SmoothShading&&ha.vertexNormalsWorld.length==4){Ga.r=ia.r=ja.r=ta.r=z.r;Ga.g=ia.g=ja.g=ta.g=z.g;Ga.b=ia.b=ja.b=ta.b=z.b;Sa(Ea,ha.v1.positionWorld,ha.vertexNormalsWorld[0],Ga);Sa(Ea,ha.v2.positionWorld,ha.vertexNormalsWorld[1],ia);Sa(Ea,ha.v4.positionWorld,ha.vertexNormalsWorld[3],ja);Sa(Ea,ha.v3.positionWorld,ha.vertexNormalsWorld[2],ta);ab=Ta(Ga,ia,ja,ta);D(ca,e,ea, +Aa,oa,da);eb(ca,e,ea,Aa,oa,da,ab,0,0,1,0,0,1);D(pa,Ba,xa,Ha,ga,$);eb(pa,Ba,xa,Ha,ga,$,ab,1,0,1,1,0,1)}else{u.r=z.r;u.g=z.g;u.b=z.b;Sa(Ea,ha.centroidWorld,ha.normalWorld,u);la.r=Q.color.r*u.r;la.g=Q.color.g*u.g;la.b=Q.color.b*u.b;la.updateStyleString();aa(ca,e,ea,Aa,xa,Ha,oa,da);Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}else{aa(ca,e,ea,Aa,xa,Ha,oa,da);Q.wireframe?t(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin): +bb(Q.color.__styleString)}else if(Q instanceof THREE.MeshNormalMaterial){la.r=hb(ha.normalWorld.x);la.g=hb(ha.normalWorld.y);la.b=hb(ha.normalWorld.z);la.updateStyleString();aa(ca,e,ea,Aa,xa,Ha,oa,da);Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}else if(Q instanceof THREE.MeshDepthMaterial){Ra=ra.near;$a=ra.far;Ga.r=Ga.g=Ga.b=1-Qa(V.positionScreen.z,Ra,$a);ia.r=ia.g=ia.b=1-Qa(za.positionScreen.z,Ra,$a);ja.r=ja.g=ja.b=1-Qa(Y.positionScreen.z, +Ra,$a);ta.r=ta.g=ta.b=1-Qa(na.positionScreen.z,Ra,$a);ab=Ta(Ga,ia,ja,ta);D(ca,e,ea,Aa,oa,da);eb(ca,e,ea,Aa,oa,da,ab,0,0,1,0,0,1);D(pa,Ba,xa,Ha,ga,$);eb(pa,Ba,xa,Ha,ga,$,ab,1,0,1,1,0,1)}}}function D(V,za,na,Y,Ca,qa){o.beginPath();o.moveTo(V,za);o.lineTo(na,Y);o.lineTo(Ca,qa);o.lineTo(V,za);o.closePath()}function aa(V,za,na,Y,Ca,qa,ha,Q){o.beginPath();o.moveTo(V,za);o.lineTo(na,Y);o.lineTo(Ca,qa);o.lineTo(ha,Q);o.lineTo(V,za);o.closePath()}function t(V,za,na,Y){if(K!=za)o.lineWidth=K=za;if(W!=na)o.lineCap= +W=na;if(A!=Y)o.lineJoin=A=Y;d(V);o.stroke();B.inflate(za*2)}function bb(V){if(H!=V)o.fillStyle=H=V;o.fill()}function eb(V,za,na,Y,Ca,qa,ha,Q,Ea,ib,Ya,Za,db){var jb,Ua;jb=ha.width-1;Ua=ha.height-1;Q*=jb;Ea*=Ua;ib*=jb;Ya*=Ua;Za*=jb;db*=Ua;na-=V;Y-=za;Ca-=V;qa-=za;ib-=Q;Ya-=Ea;Za-=Q;db-=Ea;jb=ib*db-Za*Ya;if(jb!=0){Ua=1/jb;jb=(db*na-Ya*Ca)*Ua;Ya=(db*Y-Ya*qa)*Ua;na=(ib*Ca-Za*na)*Ua;Y=(ib*qa-Za*Y)*Ua;V=V-jb*Q-na*Ea;za=za-Ya*Q-Y*Ea;o.save();o.transform(jb,Ya,na,Y,V,za);o.clip();o.drawImage(ha,0,0);o.restore()}} +function Ta(V,za,na,Y){var Ca=~~(V.r*255),qa=~~(V.g*255);V=~~(V.b*255);var ha=~~(za.r*255),Q=~~(za.g*255);za=~~(za.b*255);var Ea=~~(na.r*255),ib=~~(na.g*255);na=~~(na.b*255);var Ya=~~(Y.r*255),Za=~~(Y.g*255);Y=~~(Y.b*255);I[0]=Ca<0?0:Ca>255?255:Ca;I[1]=qa<0?0:qa>255?255:qa;I[2]=V<0?0:V>255?255:V;I[4]=ha<0?0:ha>255?255:ha;I[5]=Q<0?0:Q>255?255:Q;I[6]=za<0?0:za>255?255:za;I[8]=Ea<0?0:Ea>255?255:Ea;I[9]=ib<0?0:ib>255?255:ib;I[10]=na<0?0:na>255?255:na;I[12]=Ya<0?0:Ya>255?255:Ya;I[13]=Za<0?0:Za>255?255: +Za;I[14]=Y<0?0:Y>255?255:Y;F.putImageData(M,0,0);U.drawImage(P,0,0);return X}function Qa(V,za,na){V=(V-za)/(na-za);return V*V*(3-2*V)}function hb(V){V=(V+1)*0.5;return V<0?0:V>1?1:V}function gb(V,za){var na=za.x-V.x,Y=za.y-V.y,Ca=1/Math.sqrt(na*na+Y*Y);na*=Ca;Y*=Ca;za.x+=na;za.y+=Y;V.x-=na;V.y-=Y}var cb,fb,sa,Va,Pa,T,Xa,La;this.autoClear?this.clear():o.setTransform(1,0,0,-1,n,p);f=g.projectScene(va,ra,this.sortElements);(x=va.lights.length>0)&&Na(va);cb=0;for(fb=f.length;cb0){pa.r+=$.color.r*la;pa.g+=$.color.g*la;pa.b+=$.color.b*la}}else if($ instanceof THREE.PointLight){ua.sub($.position,da.centroidWorld);ua.normalize();la=da.normalWorld.dot(ua)*$.intensity;if(la>0){pa.r+=$.color.r*la;pa.g+=$.color.g*la;pa.b+=$.color.b*la}}}}function c(oa,da,pa,Ba,ga,$){ea= +f(Aa++);ea.setAttribute("d","M "+oa.positionScreen.x+" "+oa.positionScreen.y+" L "+da.positionScreen.x+" "+da.positionScreen.y+" L "+pa.positionScreen.x+","+pa.positionScreen.y+"z");if(ga instanceof THREE.MeshBasicMaterial)A.__styleString=ga.color.__styleString;else if(ga instanceof THREE.MeshLambertMaterial)if(W){N.r=O.r;N.g=O.g;N.b=O.b;b($,Ba,N);A.r=ga.color.r*N.r;A.g=ga.color.g*N.g;A.b=ga.color.b*N.b;A.updateStyleString()}else A.__styleString=ga.color.__styleString;else if(ga instanceof THREE.MeshDepthMaterial){ka= +1-ga.__2near/(ga.__farPlusNear-Ba.z*ga.__farMinusNear);A.setRGB(ka,ka,ka)}else ga instanceof THREE.MeshNormalMaterial&&A.setRGB(g(Ba.normalWorld.x),g(Ba.normalWorld.y),g(Ba.normalWorld.z));ga.wireframe?ea.setAttribute("style","fill: none; stroke: "+A.__styleString+"; stroke-width: "+ga.wireframeLinewidth+"; stroke-opacity: "+ga.opacity+"; stroke-linecap: "+ga.wireframeLinecap+"; stroke-linejoin: "+ga.wireframeLinejoin):ea.setAttribute("style","fill: "+A.__styleString+"; fill-opacity: "+ga.opacity); +k.appendChild(ea)}function d(oa,da,pa,Ba,ga,$,la){ea=f(Aa++);ea.setAttribute("d","M "+oa.positionScreen.x+" "+oa.positionScreen.y+" L "+da.positionScreen.x+" "+da.positionScreen.y+" L "+pa.positionScreen.x+","+pa.positionScreen.y+" L "+Ba.positionScreen.x+","+Ba.positionScreen.y+"z");if($ instanceof THREE.MeshBasicMaterial)A.__styleString=$.color.__styleString;else if($ instanceof THREE.MeshLambertMaterial)if(W){N.r=O.r;N.g=O.g;N.b=O.b;b(la,ga,N);A.r=$.color.r*N.r;A.g=$.color.g*N.g;A.b=$.color.b* +N.b;A.updateStyleString()}else A.__styleString=$.color.__styleString;else if($ instanceof THREE.MeshDepthMaterial){ka=1-$.__2near/($.__farPlusNear-ga.z*$.__farMinusNear);A.setRGB(ka,ka,ka)}else $ instanceof THREE.MeshNormalMaterial&&A.setRGB(g(ga.normalWorld.x),g(ga.normalWorld.y),g(ga.normalWorld.z));$.wireframe?ea.setAttribute("style","fill: none; stroke: "+A.__styleString+"; stroke-width: "+$.wireframeLinewidth+"; stroke-opacity: "+$.opacity+"; stroke-linecap: "+$.wireframeLinecap+"; stroke-linejoin: "+ +$.wireframeLinejoin):ea.setAttribute("style","fill: "+A.__styleString+"; fill-opacity: "+$.opacity);k.appendChild(ea)}function f(oa){if(ca[oa]==null){ca[oa]=document.createElementNS("http://www.w3.org/2000/svg","path");Ha==0&&ca[oa].setAttribute("shape-rendering","crispEdges")}return ca[oa]}function g(oa){return oa<0?Math.min((1+oa)*0.5,0.5):0.5+Math.min(oa*0.5,0.5)}var h=null,j=new THREE.Projector,k=document.createElementNS("http://www.w3.org/2000/svg","svg"),n,p,o,w,y,v,C,G,H=new THREE.Rectangle, +K=new THREE.Rectangle,W=!1,A=new THREE.Color(16777215),N=new THREE.Color(16777215),O=new THREE.Color(0),R=new THREE.Color(0),Fa=new THREE.Color(0),ka,ua=new THREE.Vector3,ca=[],e=[],ea,Aa,xa,Ha=1;this.domElement=k;this.autoClear=!0;this.sortObjects=!0;this.sortElements=!0;this.setQuality=function(oa){switch(oa){case "high":Ha=1;break;case "low":Ha=0}};this.setSize=function(oa,da){n=oa;p=da;o=n/2;w=p/2;k.setAttribute("viewBox",-o+" "+-w+" "+n+" "+p);k.setAttribute("width",n);k.setAttribute("height", +p);H.set(-o,-w,o,w)};this.clear=function(){for(;k.childNodes.length>0;)k.removeChild(k.childNodes[0])};this.render=function(oa,da){var pa,Ba,ga,$,la,Ga,ia,ja;this.autoClear&&this.clear();h=j.projectScene(oa,da,this.sortElements);xa=Aa=0;if(W=oa.lights.length>0){ia=oa.lights;O.setRGB(0,0,0);R.setRGB(0,0,0);Fa.setRGB(0,0,0);pa=0;for(Ba=ia.length;paE){J=L;E=H[J]}e.bindBuffer(e.ARRAY_BUFFER,A.__webglMorphTargetsBuffers[J]);e.vertexAttribPointer(C["morphTarget"+u],3,e.FLOAT,!1,0,0);M.__webglMorphTargetInfluences[u]=E;K[J]=1;E=-1;u++}}e.uniform1fv(w.program.uniforms.morphTargetInfluences,M.__webglMorphTargetInfluences)}else{e.bindBuffer(e.ARRAY_BUFFER,A.__webglVertexBuffer);e.vertexAttribPointer(m.position,3,e.FLOAT,!1,0,0)}if(A.__webglCustomAttributes)for(I in A.__webglCustomAttributes)if(m[I]>= -0){C=A.__webglCustomAttributes[I];e.bindBuffer(e.ARRAY_BUFFER,C.buffer);e.vertexAttribPointer(m[I],C.size,e.FLOAT,!1,0,0)}if(m.color>=0){e.bindBuffer(e.ARRAY_BUFFER,A.__webglColorBuffer);e.vertexAttribPointer(m.color,3,e.FLOAT,!1,0,0)}if(m.normal>=0){e.bindBuffer(e.ARRAY_BUFFER,A.__webglNormalBuffer);e.vertexAttribPointer(m.normal,3,e.FLOAT,!1,0,0)}if(m.tangent>=0){e.bindBuffer(e.ARRAY_BUFFER,A.__webglTangentBuffer);e.vertexAttribPointer(m.tangent,4,e.FLOAT,!1,0,0)}if(m.uv>=0)if(A.__webglUVBuffer){e.bindBuffer(e.ARRAY_BUFFER, -A.__webglUVBuffer);e.vertexAttribPointer(m.uv,2,e.FLOAT,!1,0,0);e.enableVertexAttribArray(m.uv)}else e.disableVertexAttribArray(m.uv);if(m.uv2>=0)if(A.__webglUV2Buffer){e.bindBuffer(e.ARRAY_BUFFER,A.__webglUV2Buffer);e.vertexAttribPointer(m.uv2,2,e.FLOAT,!1,0,0);e.enableVertexAttribArray(m.uv2)}else e.disableVertexAttribArray(m.uv2);if(w.skinning&&m.skinVertexA>=0&&m.skinVertexB>=0&&m.skinIndex>=0&&m.skinWeight>=0){e.bindBuffer(e.ARRAY_BUFFER,A.__webglSkinVertexABuffer);e.vertexAttribPointer(m.skinVertexA, -4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,A.__webglSkinVertexBBuffer);e.vertexAttribPointer(m.skinVertexB,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,A.__webglSkinIndicesBuffer);e.vertexAttribPointer(m.skinIndex,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,A.__webglSkinWeightsBuffer);e.vertexAttribPointer(m.skinWeight,4,e.FLOAT,!1,0,0)}if(M instanceof THREE.Mesh)if(w.wireframe){e.lineWidth(w.wireframeLinewidth);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,A.__webglLineBuffer);e.drawElements(e.LINES, -A.__webglLineCount,e.UNSIGNED_SHORT,0)}else{e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,A.__webglFaceBuffer);e.drawElements(e.TRIANGLES,A.__webglFaceCount,e.UNSIGNED_SHORT,0)}else if(M instanceof THREE.Line){M=M.type==THREE.LineStrip?e.LINE_STRIP:e.LINES;e.lineWidth(w.linewidth);e.drawArrays(M,0,A.__webglLineCount)}else if(M instanceof THREE.ParticleSystem)e.drawArrays(e.POINTS,0,A.__webglParticleCount);else M instanceof THREE.Ribbon&&e.drawArrays(e.TRIANGLE_STRIP,0,A.__webglVertexCount)}}function g(m,C, -u){if(!m.__webglVertexBuffer)m.__webglVertexBuffer=e.createBuffer();if(!m.__webglNormalBuffer)m.__webglNormalBuffer=e.createBuffer();if(m.hasPos){e.bindBuffer(e.ARRAY_BUFFER,m.__webglVertexBuffer);e.bufferData(e.ARRAY_BUFFER,m.positionArray,e.DYNAMIC_DRAW);e.enableVertexAttribArray(C.attributes.position);e.vertexAttribPointer(C.attributes.position,3,e.FLOAT,!1,0,0)}if(m.hasNormal){e.bindBuffer(e.ARRAY_BUFFER,m.__webglNormalBuffer);if(u==THREE.FlatShading){var w,A,M,I,K,H,E,J,L,U,V=m.count*3;for(U= -0;U0.0010&&H.scale>0.0010){U[0]=H.x;U[1]=H.y;U[2]=H.z;J=H.size*H.scale/ja;L[0]=J*E;L[1]=J;e.uniform3fv(wa.screenPosition,U);e.uniform1f(wa.rotation,H.rotation);e.uniform2fv(wa.scale,L);e.uniform1f(wa.opacity,H.opacity);z(H.blending);P(H.texture,0);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(Ga)}function F(m,C){m._modelViewMatrix.multiplyToArray(C.matrixWorldInverse, -m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function G(m){var C,u,w,A,M;if(m instanceof THREE.Mesh){u=m.geometry;for(C in u.geometryGroups){w=u.geometryGroups[C];M=!1;for(A in w.__webglCustomAttributes)if(w.__webglCustomAttributes[A].needsUpdate){M=!0;break}if(u.__dirtyVertices||u.__dirtyMorphTargets||u.__dirtyElements||u.__dirtyUvs||u.__dirtyNormals||u.__dirtyColors||u.__dirtyTangents||M){M=e.DYNAMIC_DRAW;var I=void 0, -K=void 0,H=void 0,E=void 0;H=void 0;var J=void 0,L=void 0,U=void 0,V=void 0,Ca=void 0,Ha=void 0,oa=void 0,wa=void 0,cb=void 0,Aa=void 0,Ia=void 0,Ja=void 0,Qa=void 0;L=void 0;U=void 0;E=void 0;V=void 0;E=void 0;var D=void 0,Z=void 0;L=void 0;D=void 0;Z=void 0;var t=void 0,ab=void 0;D=void 0;Z=void 0;t=void 0;ab=void 0;D=void 0;Z=void 0;t=void 0;ab=void 0;D=void 0;Z=void 0;t=void 0;E=void 0;V=void 0;J=void 0;H=void 0;H=void 0;D=void 0;Z=void 0;t=void 0;var fb=void 0,Ma=0,Va=0,gb=0,hb=0,Wa=0,eb=0,Oa= -0,Ka=0,La=0,T=0,Ra=0;Z=D=0;var Xa=w.__vertexArray,Za=w.__uvArray,X=w.__uv2Array,ta=w.__normalArray,ea=w.__tangentArray,ca=w.__colorArray,va=w.__skinVertexAArray,ua=w.__skinVertexBArray,ga=w.__skinIndexArray,Q=w.__skinWeightArray,Na=w.__morphTargetsArrays,db=w.__webglCustomAttributes;t=void 0;var Ua=w.__faceArray,bb=w.__lineArray,lb=w.__needsSmoothNormals;Ha=w.__vertexColorType;Ca=w.__uvType;oa=w.__normalType;var Pa=m.geometry,ib=Pa.__dirtyVertices,sb=Pa.__dirtyElements,rb=Pa.__dirtyUvs,tb=Pa.__dirtyNormals, -ub=Pa.__dirtyTangents,vb=Pa.__dirtyColors,wb=Pa.__dirtyMorphTargets,nb=Pa.vertices,xb=w.faces,Ab=Pa.faces,yb=Pa.faceVertexUvs[0],zb=Pa.faceVertexUvs[1],ob=Pa.skinVerticesA,pb=Pa.skinVerticesB,qb=Pa.skinIndices,kb=Pa.skinWeights,mb=Pa.edgeFaces,jb=Pa.morphTargets;if(db)for(fb in db){db[fb].offset=0;db[fb].offsetSrc=0}I=0;for(K=xb.length;I0){e.bindBuffer(e.ARRAY_BUFFER, -w.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER,ca,M)}if(tb){e.bindBuffer(e.ARRAY_BUFFER,w.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,ta,M)}if(ub&&Pa.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,w.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,ea,M)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER,w.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER,Za,M)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,w.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,X,M)}if(sb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,w.__webglFaceBuffer); -e.bufferData(e.ELEMENT_ARRAY_BUFFER,Ua,M);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,w.__webglLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,bb,M)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER,w.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,va,M);e.bindBuffer(e.ARRAY_BUFFER,w.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ua,M);e.bindBuffer(e.ARRAY_BUFFER,w.__webglSkinIndicesBuffer);e.bufferData(e.ARRAY_BUFFER,ga,M);e.bindBuffer(e.ARRAY_BUFFER,w.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER, -Q,M)}}}u.__dirtyVertices=!1;u.__dirtyMorphTargets=!1;u.__dirtyElements=!1;u.__dirtyUvs=!1;u.__dirtyNormals=!1;u.__dirtyTangents=!1;u.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){u=m.geometry;if(u.__dirtyVertices||u.__dirtyColors){m=u;C=e.DYNAMIC_DRAW;Ha=m.vertices;w=m.colors;oa=Ha.length;M=w.length;wa=m.__vertexArray;I=m.__colorArray;cb=m.__dirtyColors;if(m.__dirtyVertices){for(K=0;K65535){J[H].counter+=1;E=J[H].hash+"_"+J[H].counter;m.geometryGroups[E]==undefined&&(m.geometryGroups[E]={faces:[],materials:K,vertices:0,numMorphTargets:L})}m.geometryGroups[E].faces.push(A);m.geometryGroups[E].vertices+=I}}function W(m,C,u){m.push({buffer:C,object:u,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function z(m){if(m!=za){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD); -e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}za=m}}function O(m,C,u){if((u.width&u.width-1)==0&&(u.height&u.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,qa(C.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,qa(C.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,qa(C.magFilter)); -e.texParameteri(m,e.TEXTURE_MIN_FILTER,qa(C.minFilter));e.generateMipmap(m)}else{e.texParameteri(m,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_MAG_FILTER,sa(C.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,sa(C.minFilter))}}function P(m,C){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture(); -e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null);m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+C);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function S(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer===undefined)m.depthBuffer=!0;if(m.stencilBuffer===undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer(); -m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,qa(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,qa(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,qa(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,qa(m.minFilter));e.texImage2D(e.TEXTURE_2D,0,qa(m.format),m.width,m.height,0,qa(m.format),qa(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER, -m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,m.__webglTexture,0);if(m.depthBuffer&&!m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else if(m.depthBuffer&&m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER, -m.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,m.width,m.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var C,u;if(m){C=m.__webglFramebuffer;u=m.width;m=m.height}else{C=null;u=Da;m=ja}if(C!=Fa){e.bindFramebuffer(e.FRAMEBUFFER,C);e.viewport(Y,ma,u,m);Fa=C}}function xa(m,C){var u;if(m=="fragment")u=e.createShader(e.FRAGMENT_SHADER);else m=="vertex"&&(u=e.createShader(e.VERTEX_SHADER));e.shaderSource(u, -C);e.compileShader(u);if(!e.getShaderParameter(u,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(u));console.error(C);return null}return u}function sa(m){switch(m){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;default:return e.LINEAR}}function qa(m){switch(m){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST; -case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT;case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT; -case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var e,fa=document.createElement("canvas"),da=[],ya=null,Fa=null,Ga=!0,ra=this,aa=null,pa=null,za=null,ia=null,Y=0,ma=0,Da=0,ja=0,la=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4, -new THREE.Vector4,new THREE.Vector4],Ea=new THREE.Matrix4,Sa=new Float32Array(16),$a=new Float32Array(16),Ya=new THREE.Vector4,Ta={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},R=!0,$=!0,na=new THREE.Color(0),Ba=0;if(b){if(b.stencil!=undefined)R=b.stencil;if(b.antialias!==undefined)$=b.antialias;b.clearColor!==undefined&&na.setHex(b.clearColor);if(b.clearAlpha!==undefined)Ba=b.clearAlpha}this.maxMorphTargets=8;this.domElement=fa; -this.autoClear=!0;this.sortObjects=!0;(function(m,C,u,w){try{if(!(e=fa.getContext("experimental-webgl",{antialias:m,stencil:w})))throw"Error creating WebGL context.";}catch(A){console.error(A)}e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);e.cullFace(e.BACK);e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.clearColor(C.r,C.g,C.b,u)})($,na,Ba,R);this.context=e;if(R){var ha={}; -ha.vertices=new Float32Array(12);ha.faces=new Uint16Array(6);ha.darkness=0.5;ha.vertices[0]=-20;ha.vertices[1]=-20;ha.vertices[2]=-1;ha.vertices[3]=20;ha.vertices[4]=-20;ha.vertices[5]=-1;ha.vertices[6]=20;ha.vertices[7]=20;ha.vertices[8]=-1;ha.vertices[9]=-20;ha.vertices[10]=20;ha.vertices[11]=-1;ha.faces[0]=0;ha.faces[1]=1;ha.faces[2]=2;ha.faces[3]=0;ha.faces[4]=2;ha.faces[5]=3;ha.vertexBuffer=e.createBuffer();ha.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,ha.vertexBuffer);e.bufferData(e.ARRAY_BUFFER, -ha.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,ha.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,ha.faces,e.STATIC_DRAW);ha.program=e.createProgram();e.attachShader(ha.program,xa("fragment",THREE.ShaderLib.shadowPost.fragmentShader));e.attachShader(ha.program,xa("vertex",THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(ha.program);ha.vertexLocation=e.getAttribLocation(ha.program,"position");ha.projectionLocation=e.getUniformLocation(ha.program,"projectionMatrix");ha.darknessLocation= -e.getUniformLocation(ha.program,"darkness")}var ka={};ka.vertices=new Float32Array(16);ka.faces=new Uint16Array(6);ka.transparency=0.5;b=0;ka.vertices[b++]=-1;ka.vertices[b++]=-1;ka.vertices[b++]=0;ka.vertices[b++]=0;ka.vertices[b++]=1;ka.vertices[b++]=-1;ka.vertices[b++]=1;ka.vertices[b++]=0;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=-1;ka.vertices[b++]=1;ka.vertices[b++]=0;ka.vertices[b++]=1;b=0;ka.faces[b++]=0;ka.faces[b++]=1;ka.faces[b++]=2;ka.faces[b++]= -0;ka.faces[b++]=2;ka.faces[b++]=3;ka.vertexBuffer=e.createBuffer();ka.elementBuffer=e.createBuffer();ka.tempTexture=e.createTexture();ka.readBackPixels=new Uint8Array(1024);e.bindBuffer(e.ARRAY_BUFFER,ka.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,ka.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,ka.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,ka.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,ka.tempTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D, -e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);ka.program=e.createProgram();e.attachShader(ka.program,xa("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(ka.program,xa("vertex",THREE.ShaderLib.lensFlare.vertexShader));e.linkProgram(ka.program);ka.attributes={};ka.uniforms={};ka.attributes.vertex=e.getAttribLocation(ka.program, -"position");ka.attributes.uv=e.getAttribLocation(ka.program,"UV");ka.uniforms.map=e.getUniformLocation(ka.program,"map");ka.uniforms.opacity=e.getUniformLocation(ka.program,"opacity");ka.uniforms.scale=e.getUniformLocation(ka.program,"scale");ka.uniforms.rotation=e.getUniformLocation(ka.program,"rotation");ka.uniforms.screenPosition=e.getUniformLocation(ka.program,"screenPosition");ka.uniforms.renderPink=e.getUniformLocation(ka.program,"renderPink");this.setSize=function(m,C){fa.width=m;fa.height= -C;this.setViewport(0,0,fa.width,fa.height)};this.setViewport=function(m,C,u,w){Y=m;ma=C;Da=u;ja=w;e.viewport(Y,ma,Da,ja)};this.setScissor=function(m,C,u,w){e.scissor(m,C,u,w)};this.enableScissorTest=function(m){m?e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=function(m){Ga=m;e.depthMask(m)};this.setClearColorHex=function(m,C){var u=new THREE.Color(m);e.clearColor(u.r,u.g,u.b,C)};this.setClearColor=function(m,C){e.clearColor(m.r,m.g,m.b,C)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT| -e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(m){ha.darkness=m};this.initMaterial=function(m,C,u,w){var A,M,I;if(m instanceof THREE.MeshDepthMaterial)I="depth";else if(m instanceof THREE.ShadowVolumeDynamicMaterial)I="shadowVolumeDynamic";else if(m instanceof THREE.MeshNormalMaterial)I="normal";else if(m instanceof THREE.MeshBasicMaterial)I="basic";else if(m instanceof THREE.MeshLambertMaterial)I="lambert";else if(m instanceof THREE.MeshPhongMaterial)I="phong";else if(m instanceof -THREE.LineBasicMaterial)I="basic";else m instanceof THREE.ParticleBasicMaterial&&(I="particle_basic");if(I){var K=THREE.ShaderLib[I];m.uniforms=Uniforms.clone(K.uniforms);m.vertexShader=K.vertexShader;m.fragmentShader=K.fragmentShader}var H,E,J;H=J=K=0;for(E=C.length;H -0?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+u.maxDirLights,"#define MAX_POINT_LIGHTS "+u.maxPointLights,"#define MAX_BONES "+u.maxBones,u.map?"#define USE_MAP":"",u.envMap?"#define USE_ENVMAP":"",u.lightMap?"#define USE_LIGHTMAP":"",u.vertexColors?"#define USE_COLOR":"",u.skinning?"#define USE_SKINNING":"",u.morphTargets?"#define USE_MORPHTARGETS":"",u.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n"); -e.attachShader(U,xa("fragment",prefix_fragment+H));e.attachShader(U,xa("vertex",prefix_vertex+E));e.linkProgram(U);e.getProgramParameter(U,e.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+e.getProgramParameter(U,e.VALIDATE_STATUS)+", gl error ["+e.getError()+"]");U.uniforms={};U.attributes={};var V;H=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(V in K)H.push(V); -V=H;K=0;for(H=V.length;K=0&&e.enableVertexAttribArray(L.color);L.normal>= -0&&e.enableVertexAttribArray(L.normal);L.tangent>=0&&e.enableVertexAttribArray(L.tangent);if(m.skinning&&L.skinVertexA>=0&&L.skinVertexB>=0&&L.skinIndex>=0&&L.skinWeight>=0){e.enableVertexAttribArray(L.skinVertexA);e.enableVertexAttribArray(L.skinVertexB);e.enableVertexAttribArray(L.skinIndex);e.enableVertexAttribArray(L.skinWeight)}for(A in m.attributes)L[A]>=0&&e.enableVertexAttribArray(L[A]);if(m.morphTargets){m.numSupportedMorphTargets=0;if(L.morphTarget0>=0){e.enableVertexAttribArray(L.morphTarget0); -m.numSupportedMorphTargets++}if(L.morphTarget1>=0){e.enableVertexAttribArray(L.morphTarget1);m.numSupportedMorphTargets++}if(L.morphTarget2>=0){e.enableVertexAttribArray(L.morphTarget2);m.numSupportedMorphTargets++}if(L.morphTarget3>=0){e.enableVertexAttribArray(L.morphTarget3);m.numSupportedMorphTargets++}if(L.morphTarget4>=0){e.enableVertexAttribArray(L.morphTarget4);m.numSupportedMorphTargets++}if(L.morphTarget5>=0){e.enableVertexAttribArray(L.morphTarget5);m.numSupportedMorphTargets++}if(L.morphTarget6>= -0){e.enableVertexAttribArray(L.morphTarget6);m.numSupportedMorphTargets++}if(L.morphTarget7>=0){e.enableVertexAttribArray(L.morphTarget7);m.numSupportedMorphTargets++}w.__webglMorphTargetInfluences=new Float32Array(this.maxMorphTargets);m=0;for(A=this.maxMorphTargets;m0||U.faceVertexUvs.length>0)I.__uvArray=new Float32Array(H*2);if(U.faceUvs.length>1||U.faceVertexUvs.length>1)I.__uv2Array=new Float32Array(H*2)}if(K.geometry.skinWeights.length&&K.geometry.skinIndices.length){I.__skinVertexAArray=new Float32Array(H*4);I.__skinVertexBArray= -new Float32Array(H*4);I.__skinIndexArray=new Float32Array(H*4);I.__skinWeightArray=new Float32Array(H*4)}I.__faceArray=new Uint16Array(Ca*3+(K.geometry.edgeFaces?K.geometry.edgeFaces.length*6:0));I.__lineArray=new Uint16Array(Ha*2);if(I.numMorphTargets){I.__morphTargetsArrays=[];U=0;for(V=I.numMorphTargets;U=0;A--){w=u.__webglObjects[A].object;C==w&&u.__webglObjects.splice(A,1)}m.__objectsRemoved.splice(0,1)}C=0;for(u=m.__webglObjects.length;C0}}; +THREE.WebGLRenderer=function(b){function c(m,B,x){var u,z,J,L=m.vertices,E=L.length,P=m.colors,F=P.length,M=m.__vertexArray,I=m.__colorArray,X=m.__sortArray,U=m.__dirtyVertices,ya=m.__dirtyColors;if(x.sortParticles){Ra.multiplySelf(x.matrixWorld);for(u=0;uF){M=I;F=P[M]}e.bindBuffer(e.ARRAY_BUFFER,z.__webglMorphTargetsBuffers[M]);e.vertexAttribPointer(B["morphTarget"+x],3,e.FLOAT,!1,0,0);J.__webglMorphTargetInfluences[x]=F;E[M]=1;F=-1;x++}}e.uniform1fv(u.program.uniforms.morphTargetInfluences,J.__webglMorphTargetInfluences)}else{e.bindBuffer(e.ARRAY_BUFFER,z.__webglVertexBuffer);e.vertexAttribPointer(m.position,3,e.FLOAT,!1,0,0)}if(z.__webglCustomAttributes)for(L in z.__webglCustomAttributes)if(m[L]>= +0){B=z.__webglCustomAttributes[L];e.bindBuffer(e.ARRAY_BUFFER,B.buffer);e.vertexAttribPointer(m[L],B.size,e.FLOAT,!1,0,0)}if(m.color>=0){e.bindBuffer(e.ARRAY_BUFFER,z.__webglColorBuffer);e.vertexAttribPointer(m.color,3,e.FLOAT,!1,0,0)}if(m.normal>=0){e.bindBuffer(e.ARRAY_BUFFER,z.__webglNormalBuffer);e.vertexAttribPointer(m.normal,3,e.FLOAT,!1,0,0)}if(m.tangent>=0){e.bindBuffer(e.ARRAY_BUFFER,z.__webglTangentBuffer);e.vertexAttribPointer(m.tangent,4,e.FLOAT,!1,0,0)}if(m.uv>=0)if(z.__webglUVBuffer){e.bindBuffer(e.ARRAY_BUFFER, +z.__webglUVBuffer);e.vertexAttribPointer(m.uv,2,e.FLOAT,!1,0,0);e.enableVertexAttribArray(m.uv)}else e.disableVertexAttribArray(m.uv);if(m.uv2>=0)if(z.__webglUV2Buffer){e.bindBuffer(e.ARRAY_BUFFER,z.__webglUV2Buffer);e.vertexAttribPointer(m.uv2,2,e.FLOAT,!1,0,0);e.enableVertexAttribArray(m.uv2)}else e.disableVertexAttribArray(m.uv2);if(u.skinning&&m.skinVertexA>=0&&m.skinVertexB>=0&&m.skinIndex>=0&&m.skinWeight>=0){e.bindBuffer(e.ARRAY_BUFFER,z.__webglSkinVertexABuffer);e.vertexAttribPointer(m.skinVertexA, +4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,z.__webglSkinVertexBBuffer);e.vertexAttribPointer(m.skinVertexB,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,z.__webglSkinIndicesBuffer);e.vertexAttribPointer(m.skinIndex,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,z.__webglSkinWeightsBuffer);e.vertexAttribPointer(m.skinWeight,4,e.FLOAT,!1,0,0)}if(J instanceof THREE.Mesh)if(u.wireframe){e.lineWidth(u.wireframeLinewidth);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,z.__webglLineBuffer);e.drawElements(e.LINES, +z.__webglLineCount,e.UNSIGNED_SHORT,0)}else{e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,z.__webglFaceBuffer);e.drawElements(e.TRIANGLES,z.__webglFaceCount,e.UNSIGNED_SHORT,0)}else if(J instanceof THREE.Line){J=J.type==THREE.LineStrip?e.LINE_STRIP:e.LINES;e.lineWidth(u.linewidth);e.drawArrays(J,0,z.__webglLineCount)}else if(J instanceof THREE.ParticleSystem)e.drawArrays(e.POINTS,0,z.__webglParticleCount);else J instanceof THREE.Ribbon&&e.drawArrays(e.TRIANGLE_STRIP,0,z.__webglVertexCount)}}function g(m,B, +x){if(!m.__webglVertexBuffer)m.__webglVertexBuffer=e.createBuffer();if(!m.__webglNormalBuffer)m.__webglNormalBuffer=e.createBuffer();if(m.hasPos){e.bindBuffer(e.ARRAY_BUFFER,m.__webglVertexBuffer);e.bufferData(e.ARRAY_BUFFER,m.positionArray,e.DYNAMIC_DRAW);e.enableVertexAttribArray(B.attributes.position);e.vertexAttribPointer(B.attributes.position,3,e.FLOAT,!1,0,0)}if(m.hasNormal){e.bindBuffer(e.ARRAY_BUFFER,m.__webglNormalBuffer);if(x==THREE.FlatShading){var u,z,J,L,E,P,F,M,I,X,U=m.count*3;for(X= +0;X0&&va[0]0&&va[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;X=E.size*E.scale/ja;U[0]=X*F;U[1]=X;e.uniform3fv(ra.screenPosition,ya);e.uniform2fv(ra.scale,U);e.uniform1f(ra.rotation,E.rotation);e.uniform1f(ra.opacity,E.opacity);N(E.blending);R(E.texture,1);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function H(m, +B){m._modelViewMatrix.multiplyToArray(B.matrixWorldInverse,m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function K(m){var B,x,u,z,J;if(m instanceof THREE.Mesh){x=m.geometry;for(B in x.geometryGroups){u=x.geometryGroups[B];J=!1;for(z in u.__webglCustomAttributes)if(u.__webglCustomAttributes[z].needsUpdate){J=!0;break}if(x.__dirtyVertices||x.__dirtyMorphTargets||x.__dirtyElements||x.__dirtyUvs||x.__dirtyNormals||x.__dirtyColors|| +x.__dirtyTangents||J){J=e.DYNAMIC_DRAW;var L=void 0,E=void 0,P=void 0,F=void 0;P=void 0;var M=void 0,I=void 0,X=void 0,U=void 0,ya=void 0,va=void 0,ra=void 0,Na=void 0,Sa=void 0,Ka=void 0,Ja=void 0,Ia=void 0,Wa=void 0;I=void 0;X=void 0;F=void 0;U=void 0;F=void 0;var D=void 0,aa=void 0;I=void 0;D=void 0;aa=void 0;var t=void 0,bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;F=void 0;U=void 0;M=void 0;P=void 0;P=void 0;D=void 0;aa=void 0; +t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;aa=D=0;var La=u.__vertexArray,V=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,Y=u.__tangentArray,Ca=u.__colorArray,qa=u.__skinVertexAArray,ha=u.__skinVertexBArray,Q=u.__skinIndexArray,Ea=u.__skinWeightArray,ib=u.__morphTargetsArrays,Ya=u.__webglCustomAttributes;t=void 0;var Za=u.__faceArray,db=u.__lineArray,jb=u.__needsSmoothNormals;va=u.__vertexColorType;ya=u.__uvType;ra=u.__normalType;var Ua=m.geometry,sb=Ua.__dirtyVertices, +tb=Ua.__dirtyElements,rb=Ua.__dirtyUvs,ub=Ua.__dirtyNormals,vb=Ua.__dirtyTangents,wb=Ua.__dirtyColors,xb=Ua.__dirtyMorphTargets,nb=Ua.vertices,yb=u.faces,Bb=Ua.faces,zb=Ua.faceVertexUvs[0],Ab=Ua.faceVertexUvs[1],ob=Ua.skinVerticesA,pb=Ua.skinVerticesB,qb=Ua.skinIndices,lb=Ua.skinWeights,mb=Ua.edgeFaces,kb=Ua.morphTargets;if(Ya)for(eb in Ya){Ya[eb].offset=0;Ya[eb].offsetSrc=0}L=0;for(E=yb.length;L0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER,Ca,J)}if(ub){e.bindBuffer(e.ARRAY_BUFFER,u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,J)}if(vb&&Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,Y,J)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER,V,J)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER, +u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,J)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,J);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,db,J)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,qa,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ha,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinIndicesBuffer); +e.bufferData(e.ARRAY_BUFFER,Q,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,Ea,J)}}}x.__dirtyVertices=!1;x.__dirtyMorphTargets=!1;x.__dirtyElements=!1;x.__dirtyUvs=!1;x.__dirtyNormals=!1;x.__dirtyTangents=!1;x.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){x=m.geometry;if(x.__dirtyVertices||x.__dirtyColors){m=x;B=e.DYNAMIC_DRAW;va=m.vertices;u=m.colors;ra=va.length;J=u.length;Na=m.__vertexArray;L=m.__colorArray;Sa=m.__dirtyColors;if(m.__dirtyVertices){for(E= +0;E65535){M[P].counter+=1;F=M[P].hash+"_"+M[P].counter;m.geometryGroups[F]==undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z);m.geometryGroups[F].vertices+=L}}function A(m,B,x){m.push({buffer:B,object:x,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function N(m){if(m!= +ga){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}ga=m}}function O(m,B,x){if((x.width&x.width-1)==0&&(x.height& +x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,ca(B.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,ca(B.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,ca(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ca(B.minFilter));e.generateMipmap(m)}else{e.texParameteri(m,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_MAG_FILTER,ua(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ua(B.minFilter))}}function R(m,B){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D, +m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null);m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+B);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function Fa(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer===undefined)m.depthBuffer=!0;if(m.stencilBuffer=== +undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer();m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,ca(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,ca(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,ca(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,ca(m.minFilter));e.texImage2D(e.TEXTURE_2D,0,ca(m.format),m.width,m.height, +0,ca(m.format),ca(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,m.__webglTexture,0);if(m.depthBuffer&&!m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else if(m.depthBuffer&&m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER, +e.DEPTH_STENCIL,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,m.width,m.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var B,x;if(m){B=m.__webglFramebuffer;x=m.width;m=m.height}else{B=null;x=ia;m=ja}if(B!=Ha){e.bindFramebuffer(e.FRAMEBUFFER,B);e.viewport(la,Ga,x,m);Ha=B}}function ka(m,B){var x;if(m=="fragment")x= +e.createShader(e.FRAGMENT_SHADER);else m=="vertex"&&(x=e.createShader(e.VERTEX_SHADER));e.shaderSource(x,B);e.compileShader(x);if(!e.getShaderParameter(x,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(x));console.error(B);return null}return x}function ua(m){switch(m){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;default:return e.LINEAR}}function ca(m){switch(m){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE; +case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST;case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT; +case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT;case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var e,ea=document.createElement("canvas"),Aa=[],xa=null,Ha=null,oa=!0,da=this,pa=null,Ba=null,ga=null,$=null, +la=0,Ga=0,ia=0,ja=0,ta=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Ra=new THREE.Matrix4,$a=new Float32Array(16),ab=new Float32Array(16),Oa=new THREE.Vector4,S={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},Z=!0,ma=!0,Da=new THREE.Color(0),Ma=0;if(b){if(b.stencil!=undefined)Z=b.stencil;if(b.antialias!==undefined)ma=b.antialias;b.clearColor!==undefined&&Da.setHex(b.clearColor); +if(b.clearAlpha!==undefined)Ma=b.clearAlpha}this.maxMorphTargets=8;this.domElement=ea;this.autoClear=!0;this.sortObjects=!0;(function(m,B,x,u){try{if(!(e=ea.getContext("experimental-webgl",{antialias:m,stencil:u})))throw"Error creating WebGL context.";}catch(z){console.error(z)}e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);e.cullFace(e.BACK);e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA); +e.clearColor(B.r,B.g,B.b,x)})(ma,Da,Ma,Z);this.context=e;if(Z){var wa={};wa.vertices=new Float32Array(12);wa.faces=new Uint16Array(6);wa.darkness=0.5;wa.vertices[0]=-20;wa.vertices[1]=-20;wa.vertices[2]=-1;wa.vertices[3]=20;wa.vertices[4]=-20;wa.vertices[5]=-1;wa.vertices[6]=20;wa.vertices[7]=20;wa.vertices[8]=-1;wa.vertices[9]=-20;wa.vertices[10]=20;wa.vertices[11]=-1;wa.faces[0]=0;wa.faces[1]=1;wa.faces[2]=2;wa.faces[3]=0;wa.faces[4]=2;wa.faces[5]=3;wa.vertexBuffer=e.createBuffer();wa.elementBuffer= +e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,wa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,wa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,wa.faces,e.STATIC_DRAW);wa.program=e.createProgram();e.attachShader(wa.program,ka("fragment",THREE.ShaderLib.shadowPost.fragmentShader));e.attachShader(wa.program,ka("vertex",THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(wa.program);wa.vertexLocation=e.getAttribLocation(wa.program,"position"); +wa.projectionLocation=e.getUniformLocation(wa.program,"projectionMatrix");wa.darknessLocation=e.getUniformLocation(wa.program,"darkness")}var fa={};fa.vertices=new Float32Array(16);fa.faces=new Uint16Array(6);b=0;fa.vertices[b++]=-1;fa.vertices[b++]=-1;fa.vertices[b++]=0;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0; +fa.vertices[b++]=1;b=0;fa.faces[b++]=0;fa.faces[b++]=1;fa.faces[b++]=2;fa.faces[b++]=0;fa.faces[b++]=2;fa.faces[b++]=3;fa.vertexBuffer=e.createBuffer();fa.elementBuffer=e.createBuffer();fa.tempTexture=e.createTexture();fa.occlusionTexture=e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,fa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,fa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,fa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,fa.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,fa.tempTexture); +e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.bindTexture(e.TEXTURE_2D,fa.occlusionTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE); +e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){fa.hasVertexTexture=!1;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{fa.hasVertexTexture=!0;fa.program=e.createProgram(); +e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(fa.program);fa.attributes={};fa.uniforms={};fa.attributes.vertex=e.getAttribLocation(fa.program,"position");fa.attributes.uv=e.getAttribLocation(fa.program,"UV");fa.uniforms.renderType=e.getUniformLocation(fa.program,"renderType");fa.uniforms.map=e.getUniformLocation(fa.program,"map");fa.uniforms.occlusionMap= +e.getUniformLocation(fa.program,"occlusionMap");fa.uniforms.opacity=e.getUniformLocation(fa.program,"opacity");fa.uniforms.scale=e.getUniformLocation(fa.program,"scale");fa.uniforms.rotation=e.getUniformLocation(fa.program,"rotation");fa.uniforms.screenPosition=e.getUniformLocation(fa.program,"screenPosition");_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]= +1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer=e.createBuffer();_sprite.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER, +_sprite.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,_sprite.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,_sprite.faces,e.STATIC_DRAW);_sprite.program=e.createProgram();e.attachShader(_sprite.program,ka("fragment",THREE.ShaderLib.sprite.fragmentShader));e.attachShader(_sprite.program,ka("vertex",THREE.ShaderLib.sprite.vertexShader));e.linkProgram(_sprite.program);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position= +e.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=e.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=e.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=e.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=e.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=e.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment=e.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map= +e.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=e.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=e.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=e.getUniformLocation(_sprite.program,"affectedByDistance");_sprite.uniforms.screenPosition=e.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix=e.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix= +e.getUniformLocation(_sprite.program,"projectionMatrix");this.setSize=function(m,B){ea.width=m;ea.height=B;this.setViewport(0,0,ea.width,ea.height)};this.setViewport=function(m,B,x,u){la=m;Ga=B;ia=x;ja=u;e.viewport(la,Ga,ia,ja)};this.setScissor=function(m,B,x,u){e.scissor(m,B,x,u)};this.enableScissorTest=function(m){m?e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=function(m){oa=m;e.depthMask(m)};this.setClearColorHex=function(m,B){var x=new THREE.Color(m);e.clearColor(x.r, +x.g,x.b,B)};this.setClearColor=function(m,B){e.clearColor(m.r,m.g,m.b,B)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(m){wa.darkness=m};this.initMaterial=function(m,B,x,u){var z,J,L;if(m instanceof THREE.MeshDepthMaterial)L="depth";else if(m instanceof THREE.ShadowVolumeDynamicMaterial)L="shadowVolumeDynamic";else if(m instanceof THREE.MeshNormalMaterial)L="normal";else if(m instanceof THREE.MeshBasicMaterial)L= +"basic";else if(m instanceof THREE.MeshLambertMaterial)L="lambert";else if(m instanceof THREE.MeshPhongMaterial)L="phong";else if(m instanceof THREE.LineBasicMaterial)L="basic";else m instanceof THREE.ParticleBasicMaterial&&(L="particle_basic");if(L){var E=THREE.ShaderLib[L];m.uniforms=Uniforms.clone(E.uniforms);m.vertexShader=E.vertexShader;m.fragmentShader=E.fragmentShader}var P,F,M;P=M=E=0;for(F=B.length;P0?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+x.maxDirLights,"#define MAX_POINT_LIGHTS "+x.maxPointLights,"#define MAX_BONES "+x.maxBones,x.map?"#define USE_MAP":"",x.envMap?"#define USE_ENVMAP":"",x.lightMap?"#define USE_LIGHTMAP":"",x.vertexColors?"#define USE_COLOR":"",x.skinning?"#define USE_SKINNING":"",x.morphTargets?"#define USE_MORPHTARGETS": +"",x.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n"); +e.attachShader(X,ka("fragment",prefix_fragment+P));e.attachShader(X,ka("vertex",prefix_vertex+F));e.linkProgram(X);e.getProgramParameter(X,e.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+e.getProgramParameter(X,e.VALIDATE_STATUS)+", gl error ["+e.getError()+"]");X.uniforms={};X.attributes={};var U;P=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(U in E)P.push(U); +U=P;E=0;for(P=U.length;E=0&&e.enableVertexAttribArray(I.color);I.normal>= +0&&e.enableVertexAttribArray(I.normal);I.tangent>=0&&e.enableVertexAttribArray(I.tangent);if(m.skinning&&I.skinVertexA>=0&&I.skinVertexB>=0&&I.skinIndex>=0&&I.skinWeight>=0){e.enableVertexAttribArray(I.skinVertexA);e.enableVertexAttribArray(I.skinVertexB);e.enableVertexAttribArray(I.skinIndex);e.enableVertexAttribArray(I.skinWeight)}for(z in m.attributes)I[z]>=0&&e.enableVertexAttribArray(I[z]);if(m.morphTargets){m.numSupportedMorphTargets=0;if(I.morphTarget0>=0){e.enableVertexAttribArray(I.morphTarget0); +m.numSupportedMorphTargets++}if(I.morphTarget1>=0){e.enableVertexAttribArray(I.morphTarget1);m.numSupportedMorphTargets++}if(I.morphTarget2>=0){e.enableVertexAttribArray(I.morphTarget2);m.numSupportedMorphTargets++}if(I.morphTarget3>=0){e.enableVertexAttribArray(I.morphTarget3);m.numSupportedMorphTargets++}if(I.morphTarget4>=0){e.enableVertexAttribArray(I.morphTarget4);m.numSupportedMorphTargets++}if(I.morphTarget5>=0){e.enableVertexAttribArray(I.morphTarget5);m.numSupportedMorphTargets++}if(I.morphTarget6>= +0){e.enableVertexAttribArray(I.morphTarget6);m.numSupportedMorphTargets++}if(I.morphTarget7>=0){e.enableVertexAttribArray(I.morphTarget7);m.numSupportedMorphTargets++}u.__webglMorphTargetInfluences=new Float32Array(this.maxMorphTargets);m=0;for(z=this.maxMorphTargets;m0||X.faceVertexUvs.length>0)L.__uvArray=new Float32Array(P*2);if(X.faceUvs.length>1||X.faceVertexUvs.length>1)L.__uv2Array=new Float32Array(P*2)}if(E.geometry.skinWeights.length&&E.geometry.skinIndices.length){L.__skinVertexAArray= +new Float32Array(P*4);L.__skinVertexBArray=new Float32Array(P*4);L.__skinIndexArray=new Float32Array(P*4);L.__skinWeightArray=new Float32Array(P*4)}L.__faceArray=new Uint16Array(ya*3+(E.geometry.edgeFaces?E.geometry.edgeFaces.length*6:0));L.__lineArray=new Uint16Array(va*2);if(L.numMorphTargets){L.__morphTargetsArrays=[];X=0;for(U=L.numMorphTargets;X=0;z--){u=x.__webglObjects[z].object;if(B==u){x.__webglObjects.splice(z,1);break}}m.__objectsRemoved.splice(0,1)}B=0;for(x=m.__webglObjects.length;B0}}; THREE.WebGLRenderTarget=function(b,c,d){this.width=b;this.height=c;d=d||{};this.wrapS=d.wrapS!==undefined?d.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=d.wrapT!==undefined?d.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=d.magFilter!==undefined?d.magFilter:THREE.LinearFilter;this.minFilter=d.minFilter!==undefined?d.minFilter:THREE.LinearMipMapLinearFilter;this.format=d.format!==undefined?d.format:THREE.RGBFormat;this.type=d.type!==undefined?d.type:THREE.UnsignedByteType;this.depthBuffer=d.depthBuffer!== undefined?d.depthBuffer:!0;this.stencilBuffer=d.stencilBuffer!==undefined?d.stencilBuffer:!0}; THREE.SoundRenderer=function(){this.volume=1;this.domElement=document.createElement("div");this.domElement.id="THREESound";this.cameraPosition=new THREE.Vector3;this.soundPosition=new THREE.Vector3;this.render=function(b,c,d){d&&b.update(undefined,!1,c);d=b.sounds;var f,g=d.length;for(f=0;fc.max.z)return Number.MAX_VALUE;c.normal=new THR THREE.CollisionSystem.prototype.raySphere=function(b,c){var d=c.center.clone().subSelf(b.origin);if(d.lengthSq=0)return Math.abs(f)-Math.sqrt(d);return Number.MAX_VALUE};THREE.CollisionSystem.__v1=new THREE.Vector3;THREE.CollisionSystem.__v2=new THREE.Vector3;THREE.CollisionSystem.__v3=new THREE.Vector3;THREE.CollisionUtils={}; THREE.CollisionUtils.MeshOBB=function(b){b.geometry.computeBoundingBox();var c=b.geometry.boundingBox,d=new THREE.Vector3(c.x[0],c.y[0],c.z[0]);c=new THREE.Vector3(c.x[1],c.y[1],c.z[1]);d=new THREE.BoxCollider(d,c);d.mesh=b;return d};THREE.CollisionUtils.MeshAABB=function(b){var c=THREE.CollisionUtils.MeshOBB(b);c.min.addSelf(b.position);c.max.addSelf(b.position);c.dynamic=!1;return c}; THREE.CollisionUtils.MeshColliderWBox=function(b){for(var c=b.geometry.vertices,d=c.length,f=b.geometry.faces,g=f.length,h=[],j=[],k=[],n=0;n=0?y:y+g;y=this.verticalAngleMap.srcRange;v=this.verticalAngleMap.dstRange; -this.phi=(this.phi-y[0])*(v[1]-v[0])/(y[1]-y[0])+v[0];y=this.horizontalAngleMap.srcRange;v=this.horizontalAngleMap.dstRange;this.theta=(this.theta-y[0])*(v[1]-v[0])/(y[1]-y[0])+v[0];y=this.target.position;y.x=100*Math.sin(this.phi)*Math.cos(this.theta);y.y=100*Math.cos(this.phi);y.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.supr.update.call(this,p,o,x)};this.onMouseMove=function(p){this.mouseX=p.clientX-this.windowHalfX;this.mouseY=p.clientY-this.windowHalfY};this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints); +this.lat=this.mouseY=this.mouseX=0;this.windowHalfX=window.innerWidth/2;this.windowHalfY=window.innerHeight/2;var g=Math.PI*2,h=Math.PI/180;this.update=function(p,o,w){var y,v;this.lookHorizontal&&(this.lon+=this.mouseX*this.lookSpeed);this.lookVertical&&(this.lat-=this.mouseY*this.lookSpeed);this.lon=Math.max(0,Math.min(360,this.lon));this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*h;this.theta=this.lon*h;y=this.phi%g;this.phi=y>=0?y:y+g;y=this.verticalAngleMap.srcRange;v=this.verticalAngleMap.dstRange; +this.phi=(this.phi-y[0])*(v[1]-v[0])/(y[1]-y[0])+v[0];y=this.horizontalAngleMap.srcRange;v=this.horizontalAngleMap.dstRange;this.theta=(this.theta-y[0])*(v[1]-v[0])/(y[1]-y[0])+v[0];y=this.target.position;y.x=100*Math.sin(this.phi)*Math.cos(this.theta);y.y=100*Math.cos(this.phi);y.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.supr.update.call(this,p,o,w)};this.onMouseMove=function(p){this.mouseX=p.clientX-this.windowHalfX;this.mouseY=p.clientY-this.windowHalfY};this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints); this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){b=new THREE.MeshLambertMaterial({color:30719});var j=new THREE.MeshLambertMaterial({color:65280}),k=new Cube(10,10,20),n=new Cube(2,2,10);this.animationParent=new THREE.Mesh(k,b);b=new THREE.Mesh(n,j);b.position.set(0,10,0);this.animation=c(this.animationParent,this.spline,this.id,this.duration);this.animationParent.addChild(this);this.animationParent.addChild(this.target);this.animationParent.addChild(b)}else{this.animation= c(this.animationParent,this.spline,this.id,this.duration);this.animationParent.addChild(this.target);this.animationParent.addChild(this)}this.createDebugPath&&f(this.debugPath,this.spline);this.domElement.addEventListener("mousemove",function(p,o){return function(){o.apply(p,arguments)}}(this,this.onMouseMove),!1)};THREE.PathCamera.prototype=new THREE.Camera;THREE.PathCamera.prototype.constructor=THREE.PathCamera;THREE.PathCamera.prototype.supr=THREE.Camera.prototype;THREE.PathCameraIdCounter=0; -var Cube=function(b,c,d,f,g,h,j,k,n){function p(G,N,W,z,O,P,S,xa){var sa,qa,e=f||1,fa=g||1,da=O/2,ya=P/2,Fa=o.vertices.length;if(G=="x"&&N=="y"||G=="y"&&N=="x")sa="z";else if(G=="x"&&N=="z"||G=="z"&&N=="x"){sa="y";fa=h||1}else if(G=="z"&&N=="y"||G=="y"&&N=="z"){sa="x";e=h||1}var Ga=e+1,ra=fa+1;O/=e;var aa=P/fa;for(qa=0;qa0){j(0,0,-p-(h||0));for(f=b;f0){j(0,0,p+(g||0)); +var Cube=function(b,c,d,f,g,h,j,k,n){function p(H,K,W,A,N,O,R,Fa){var ka,ua,ca=f||1,e=g||1,ea=N/2,Aa=O/2,xa=o.vertices.length;if(H=="x"&&K=="y"||H=="y"&&K=="x")ka="z";else if(H=="x"&&K=="z"||H=="z"&&K=="x"){ka="y";e=h||1}else if(H=="z"&&K=="y"||H=="y"&&K=="z"){ka="x";ca=h||1}var Ha=ca+1,oa=e+1;N/=ca;var da=O/e;for(ua=0;ua0){j(0,0,-p-(h||0));for(f=b;f0){j(0,0,p+(g||0)); for(f=b+b/2;f<2*b;f++)k.faces.push(new THREE.Face4(2*b+1,(2*f-2*b+2)%b+b,(2*f-2*b+1)%b+b,(2*f-2*b)%b+b))}this.computeCentroids();this.computeFaceNormals()};Cylinder.prototype=new THREE.Geometry;Cylinder.prototype.constructor=Cylinder; -var Icosahedron=function(b){function c(x,y,v){var B=Math.sqrt(x*x+y*y+v*v);return g.vertices.push(new THREE.Vertex(new THREE.Vector3(x/B,y/B,v/B)))-1}function d(x,y,v,B){B.faces.push(new THREE.Face3(x,y,v))}function f(x,y){var v=g.vertices[x].position,B=g.vertices[y].position;return c((v.x+B.x)/2,(v.y+B.y)/2,(v.z+B.z)/2)}var g=this,h=new THREE.Geometry,j;this.subdivisions=b||0;THREE.Geometry.call(this);b=(1+Math.sqrt(5))/2;c(-1,b,0);c(1,b,0);c(-1,-b,0);c(1,-b,0);c(0,-1,b);c(0,1,b);c(0,-1,-b);c(0, +var Icosahedron=function(b){function c(w,y,v){var C=Math.sqrt(w*w+y*y+v*v);return g.vertices.push(new THREE.Vertex(new THREE.Vector3(w/C,y/C,v/C)))-1}function d(w,y,v,C){C.faces.push(new THREE.Face3(w,y,v))}function f(w,y){var v=g.vertices[w].position,C=g.vertices[y].position;return c((v.x+C.x)/2,(v.y+C.y)/2,(v.z+C.z)/2)}var g=this,h=new THREE.Geometry,j;this.subdivisions=b||0;THREE.Geometry.call(this);b=(1+Math.sqrt(5))/2;c(-1,b,0);c(1,b,0);c(-1,-b,0);c(1,-b,0);c(0,-1,b);c(0,1,b);c(0,-1,-b);c(0, 1,-b);c(b,0,-1);c(b,0,1);c(-b,0,-1);c(-b,0,1);d(0,11,5,h);d(0,5,1,h);d(0,1,7,h);d(0,7,10,h);d(0,10,11,h);d(1,5,9,h);d(5,11,4,h);d(11,10,2,h);d(10,7,6,h);d(7,1,8,h);d(3,9,4,h);d(3,4,2,h);d(3,2,6,h);d(3,6,8,h);d(3,8,9,h);d(4,9,5,h);d(2,4,11,h);d(6,2,10,h);d(8,6,7,h);d(9,8,1,h);for(b=0;b0||(o=this.vertices.push(new THREE.Vertex(new THREE.Vector3(x,k,y)))-1);p.push(o)}c.push(p)}var v,B,F;g=c.length;for(d=0;d0)for(f=0;f1){v=this.vertices[j].position.clone(); -B=this.vertices[n].position.clone();F=this.vertices[p].position.clone();v.normalize();B.normalize();F.normalize();this.faces.push(new THREE.Face3(j,n,p,[new THREE.Vector3(v.x,v.y,v.z),new THREE.Vector3(B.x,B.y,B.z),new THREE.Vector3(F.x,F.y,F.z)]));this.faceVertexUvs[0].push([o,x,G])}}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals();this.boundingSphere={radius:b}};Sphere.prototype=new THREE.Geometry;Sphere.prototype.constructor=Sphere; +var Sphere=function(b,c,d){THREE.Geometry.call(this);var f,g=Math.PI,h=Math.max(3,c||8),j=Math.max(2,d||6);c=[];for(d=0;d0||(o=this.vertices.push(new THREE.Vertex(new THREE.Vector3(w,k,y)))-1);p.push(o)}c.push(p)}var v,C,G;g=c.length;for(d=0;d0)for(f=0;f1){v=this.vertices[j].position.clone(); +C=this.vertices[n].position.clone();G=this.vertices[p].position.clone();v.normalize();C.normalize();G.normalize();this.faces.push(new THREE.Face3(j,n,p,[new THREE.Vector3(v.x,v.y,v.z),new THREE.Vector3(C.x,C.y,C.z),new THREE.Vector3(G.x,G.y,G.z)]));this.faceVertexUvs[0].push([o,w,H])}}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals();this.boundingSphere={radius:b}};Sphere.prototype=new THREE.Geometry;Sphere.prototype.constructor=Sphere; var Torus=function(b,c,d,f){this.radius=b||100;this.tube=c||40;this.segmentsR=d||8;this.segmentsT=f||6;b=[];THREE.Geometry.call(this);for(c=0;c<=this.segmentsR;++c)for(d=0;d<=this.segmentsT;++d){f=d/this.segmentsT*2*Math.PI;var g=c/this.segmentsR*2*Math.PI;this.vertices.push(new THREE.Vertex(new THREE.Vector3((this.radius+this.tube*Math.cos(g))*Math.cos(f),(this.radius+this.tube*Math.cos(g))*Math.sin(f),this.tube*Math.sin(g))));b.push([d/this.segmentsT,1-c/this.segmentsR])}for(c=1;c<=this.segmentsR;++c)for(d= 1;d<=this.segmentsT;++d){f=(this.segmentsT+1)*c+d;g=(this.segmentsT+1)*c+d-1;var h=(this.segmentsT+1)*(c-1)+d-1,j=(this.segmentsT+1)*(c-1)+d;this.faces.push(new THREE.Face4(f,g,h,j));this.faceVertexUvs[0].push([new THREE.UV(b[f][0],b[f][1]),new THREE.UV(b[g][0],b[g][1]),new THREE.UV(b[h][0],b[h][1]),new THREE.UV(b[j][0],b[j][1])])}delete b;this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};Torus.prototype=new THREE.Geometry;Torus.prototype.constructor=Torus; -var TorusKnot=function(b,c,d,f,g,h,j){function k(x,y,v,B,F,G){y=v/B*x;v=Math.cos(y);return new THREE.Vector3(F*(2+v)*0.5*Math.cos(x),F*(2+v)*Math.sin(x)*0.5,G*F*Math.sin(y)*0.5)}THREE.Geometry.call(this);this.radius=b||200;this.tube=c||40;this.segmentsR=d||64;this.segmentsT=f||8;this.p=g||2;this.q=h||3;this.heightScale=j||1;this.grid=Array(this.segmentsR);d=new THREE.Vector3;f=new THREE.Vector3;h=new THREE.Vector3;for(b=0;b>7)-127;na|=(ha&127)<<16|Ba<<8;if(na==0&&m==-127)return 0;return(1-2*(ka>>7))*(1+na*Math.pow(2,-23))*Math.pow(2,m)}function k(R,$){var na=o(R,$),Ba=o(R,$+1),ha=o(R,$+2);return(o(R,$+3)<<24)+(ha<<16)+(Ba<<8)+na}function n(R,$){var na=o(R,$);return(o(R,$+1)<<8)+na}function p(R,$){var na=o(R,$);return na>127? -na-256:na}function o(R,$){return R.charCodeAt($)&255}function x(R){var $,na,Ba;$=k(b,R);na=k(b,R+S);Ba=k(b,R+xa);R=n(b,R+sa);THREE.BinaryLoader.prototype.f3(N,$,na,Ba,R)}function y(R){var $,na,Ba,ha,ka,m;$=k(b,R);na=k(b,R+S);Ba=k(b,R+xa);ha=n(b,R+sa);ka=k(b,R+qa);m=k(b,R+e);R=k(b,R+fa);THREE.BinaryLoader.prototype.f3n(N,O,$,na,Ba,ha,ka,m,R)}function v(R){var $,na,Ba,ha;$=k(b,R);na=k(b,R+da);Ba=k(b,R+ya);ha=k(b,R+Fa);R=n(b,R+Ga);THREE.BinaryLoader.prototype.f4(N,$,na,Ba,ha,R)}function B(R){var $,na, -Ba,ha,ka,m,C,u;$=k(b,R);na=k(b,R+da);Ba=k(b,R+ya);ha=k(b,R+Fa);ka=n(b,R+Ga);m=k(b,R+ra);C=k(b,R+aa);u=k(b,R+pa);R=k(b,R+za);THREE.BinaryLoader.prototype.f4n(N,O,$,na,Ba,ha,ka,m,C,u,R)}function F(R){var $,na;$=k(b,R);na=k(b,R+ia);R=k(b,R+Y);THREE.BinaryLoader.prototype.uv3(N.faceVertexUvs[0],P[$*2],P[$*2+1],P[na*2],P[na*2+1],P[R*2],P[R*2+1])}function G(R){var $,na,Ba;$=k(b,R);na=k(b,R+ma);Ba=k(b,R+Da);R=k(b,R+ja);THREE.BinaryLoader.prototype.uv4(N.faceVertexUvs[0],P[$*2],P[$*2+1],P[na*2],P[na*2+1], -P[Ba*2],P[Ba*2+1],P[R*2],P[R*2+1])}var N=this,W=0,z,O=[],P=[],S,xa,sa,qa,e,fa,da,ya,Fa,Ga,ra,aa,pa,za,ia,Y,ma,Da,ja,la,Ea,Sa,$a,Ya,Ta;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(N,f,h);z={signature:b.substr(W,8),header_bytes:o(b,W+8),vertex_coordinate_bytes:o(b,W+9),normal_coordinate_bytes:o(b,W+10),uv_coordinate_bytes:o(b,W+11),vertex_index_bytes:o(b,W+12),normal_index_bytes:o(b,W+13),uv_index_bytes:o(b,W+14),material_index_bytes:o(b,W+15),nvertices:k(b,W+16),nnormals:k(b,W+16+ -4),nuvs:k(b,W+16+8),ntri_flat:k(b,W+16+12),ntri_smooth:k(b,W+16+16),ntri_flat_uv:k(b,W+16+20),ntri_smooth_uv:k(b,W+16+24),nquad_flat:k(b,W+16+28),nquad_smooth:k(b,W+16+32),nquad_flat_uv:k(b,W+16+36),nquad_smooth_uv:k(b,W+16+40)};W+=z.header_bytes;S=z.vertex_index_bytes;xa=z.vertex_index_bytes*2;sa=z.vertex_index_bytes*3;qa=z.vertex_index_bytes*3+z.material_index_bytes;e=z.vertex_index_bytes*3+z.material_index_bytes+z.normal_index_bytes;fa=z.vertex_index_bytes*3+z.material_index_bytes+z.normal_index_bytes* -2;da=z.vertex_index_bytes;ya=z.vertex_index_bytes*2;Fa=z.vertex_index_bytes*3;Ga=z.vertex_index_bytes*4;ra=z.vertex_index_bytes*4+z.material_index_bytes;aa=z.vertex_index_bytes*4+z.material_index_bytes+z.normal_index_bytes;pa=z.vertex_index_bytes*4+z.material_index_bytes+z.normal_index_bytes*2;za=z.vertex_index_bytes*4+z.material_index_bytes+z.normal_index_bytes*3;ia=z.uv_index_bytes;Y=z.uv_index_bytes*2;ma=z.uv_index_bytes;Da=z.uv_index_bytes*2;ja=z.uv_index_bytes*3;h=z.vertex_index_bytes*3+z.material_index_bytes; -Ta=z.vertex_index_bytes*4+z.material_index_bytes;la=z.ntri_flat*h;Ea=z.ntri_smooth*(h+z.normal_index_bytes*3);Sa=z.ntri_flat_uv*(h+z.uv_index_bytes*3);$a=z.ntri_smooth_uv*(h+z.normal_index_bytes*3+z.uv_index_bytes*3);Ya=z.nquad_flat*Ta;h=z.nquad_smooth*(Ta+z.normal_index_bytes*4);Ta=z.nquad_flat_uv*(Ta+z.uv_index_bytes*4);W+=function(R){for(var $,na,Ba,ha=z.vertex_coordinate_bytes*3,ka=R+z.nvertices*ha;R>7)-127;ma|=(Ma&127)<<16|Da<<8;if(ma==0&&fa==-127)return 0;return(1-2*(wa>>7))*(1+ma*Math.pow(2,-23))*Math.pow(2,fa)}function k(S,Z){var ma=o(S,Z),Da=o(S,Z+1),Ma=o(S,Z+2);return(o(S,Z+3)<<24)+(Ma<<16)+(Da<<8)+ma}function n(S,Z){var ma=o(S,Z);return(o(S,Z+1)<<8)+ma}function p(S,Z){var ma=o(S,Z);return ma> +127?ma-256:ma}function o(S,Z){return S.charCodeAt(Z)&255}function w(S){var Z,ma,Da;Z=k(b,S);ma=k(b,S+R);Da=k(b,S+Fa);S=n(b,S+ka);THREE.BinaryLoader.prototype.f3(K,Z,ma,Da,S)}function y(S){var Z,ma,Da,Ma,wa,fa;Z=k(b,S);ma=k(b,S+R);Da=k(b,S+Fa);Ma=n(b,S+ka);wa=k(b,S+ua);fa=k(b,S+ca);S=k(b,S+e);THREE.BinaryLoader.prototype.f3n(K,N,Z,ma,Da,Ma,wa,fa,S)}function v(S){var Z,ma,Da,Ma;Z=k(b,S);ma=k(b,S+ea);Da=k(b,S+Aa);Ma=k(b,S+xa);S=n(b,S+Ha);THREE.BinaryLoader.prototype.f4(K,Z,ma,Da,Ma,S)}function C(S){var Z, +ma,Da,Ma,wa,fa,m,B;Z=k(b,S);ma=k(b,S+ea);Da=k(b,S+Aa);Ma=k(b,S+xa);wa=n(b,S+Ha);fa=k(b,S+oa);m=k(b,S+da);B=k(b,S+pa);S=k(b,S+Ba);THREE.BinaryLoader.prototype.f4n(K,N,Z,ma,Da,Ma,wa,fa,m,B,S)}function G(S){var Z,ma;Z=k(b,S);ma=k(b,S+ga);S=k(b,S+$);THREE.BinaryLoader.prototype.uv3(K.faceVertexUvs[0],O[Z*2],O[Z*2+1],O[ma*2],O[ma*2+1],O[S*2],O[S*2+1])}function H(S){var Z,ma,Da;Z=k(b,S);ma=k(b,S+la);Da=k(b,S+Ga);S=k(b,S+ia);THREE.BinaryLoader.prototype.uv4(K.faceVertexUvs[0],O[Z*2],O[Z*2+1],O[ma*2],O[ma* +2+1],O[Da*2],O[Da*2+1],O[S*2],O[S*2+1])}var K=this,W=0,A,N=[],O=[],R,Fa,ka,ua,ca,e,ea,Aa,xa,Ha,oa,da,pa,Ba,ga,$,la,Ga,ia,ja,ta,Ra,$a,ab,Oa;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(K,f,h);A={signature:b.substr(W,8),header_bytes:o(b,W+8),vertex_coordinate_bytes:o(b,W+9),normal_coordinate_bytes:o(b,W+10),uv_coordinate_bytes:o(b,W+11),vertex_index_bytes:o(b,W+12),normal_index_bytes:o(b,W+13),uv_index_bytes:o(b,W+14),material_index_bytes:o(b,W+15),nvertices:k(b,W+16),nnormals:k(b, +W+16+4),nuvs:k(b,W+16+8),ntri_flat:k(b,W+16+12),ntri_smooth:k(b,W+16+16),ntri_flat_uv:k(b,W+16+20),ntri_smooth_uv:k(b,W+16+24),nquad_flat:k(b,W+16+28),nquad_smooth:k(b,W+16+32),nquad_flat_uv:k(b,W+16+36),nquad_smooth_uv:k(b,W+16+40)};W+=A.header_bytes;R=A.vertex_index_bytes;Fa=A.vertex_index_bytes*2;ka=A.vertex_index_bytes*3;ua=A.vertex_index_bytes*3+A.material_index_bytes;ca=A.vertex_index_bytes*3+A.material_index_bytes+A.normal_index_bytes;e=A.vertex_index_bytes*3+A.material_index_bytes+A.normal_index_bytes* +2;ea=A.vertex_index_bytes;Aa=A.vertex_index_bytes*2;xa=A.vertex_index_bytes*3;Ha=A.vertex_index_bytes*4;oa=A.vertex_index_bytes*4+A.material_index_bytes;da=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes;pa=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes*2;Ba=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes*3;ga=A.uv_index_bytes;$=A.uv_index_bytes*2;la=A.uv_index_bytes;Ga=A.uv_index_bytes*2;ia=A.uv_index_bytes*3;h=A.vertex_index_bytes*3+A.material_index_bytes; +Oa=A.vertex_index_bytes*4+A.material_index_bytes;ja=A.ntri_flat*h;ta=A.ntri_smooth*(h+A.normal_index_bytes*3);Ra=A.ntri_flat_uv*(h+A.uv_index_bytes*3);$a=A.ntri_smooth_uv*(h+A.normal_index_bytes*3+A.uv_index_bytes*3);ab=A.nquad_flat*Oa;h=A.nquad_smooth*(Oa+A.normal_index_bytes*4);Oa=A.nquad_flat_uv*(Oa+A.uv_index_bytes*4);W+=function(S){for(var Z,ma,Da,Ma=A.vertex_coordinate_bytes*3,wa=S+A.nvertices*Ma;S=this.maxCount-3&&k(this)};this.begin=function(){this.count=0;this.hasPos=!1;this.hasNormal=!1};this.end=function(d){if(this.count!=0){for(var f=this.count*3;fthis.size-1&&(n=this.size-1);var y=Math.floor(p-k);y<1&&(y=1);p=Math.floor(p+k);p>this.size-1&&(p= -this.size-1);var v=Math.floor(o-k);v<1&&(v=1);k=Math.floor(o+k);k>this.size-1&&(k=this.size-1);for(var B,F,G,N,W,z;x0&&(this.field[G+B]+=N)}}}};this.addPlaneX=function(d,f){var g,h,j,k,n,p=this.size,o=this.yd,x=this.zd,y=this.field,v=p*Math.sqrt(d/f);v>p&&(v=p);for(g=0;g0)for(h=0;ho&&(B=o);for(h=0;h0){n=h*x;for(g=0;gsize&&(dist=size);for(j=0;j0){n=zd*j;for(h=0;h=this.maxCount-3&&k(this)};this.begin=function(){this.count=0;this.hasPos=!1;this.hasNormal=!1};this.end=function(d){if(this.count!=0){for(var f=this.count*3;fthis.size-1&&(n=this.size-1);var y=Math.floor(p-k);y<1&&(y=1);p=Math.floor(p+k);p>this.size-1&&(p= +this.size-1);var v=Math.floor(o-k);v<1&&(v=1);k=Math.floor(o+k);k>this.size-1&&(k=this.size-1);for(var C,G,H,K,W,A;w0&&(this.field[H+C]+=K)}}}};this.addPlaneX=function(d,f){var g,h,j,k,n,p=this.size,o=this.yd,w=this.zd,y=this.field,v=p*Math.sqrt(d/f);v>p&&(v=p);for(g=0;g0)for(h=0;ho&&(C=o);for(h=0;h0){n=h*w;for(g=0;gsize&&(dist=size);for(j=0;j0){n=zd*j;for(h=0;h 0 && + if( _lensFlare.hasVertexTexture || + ( screenPositionPixels[ 0 ] > 0 && screenPositionPixels[ 0 ] < _viewportWidth && screenPositionPixels[ 1 ] > 0 && - screenPositionPixels[ 1 ] < _viewportHeight ) { + screenPositionPixels[ 1 ] < _viewportHeight )) { // save current RGB to temp texture _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); - _gl.copyTexSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16 ); + //_gl.copyTexSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16 ); + _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16, 0 ); // render pink quad @@ -3410,7 +3540,8 @@ THREE.WebGLRenderer = function ( parameters ) { // copy result to occlusionMap _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture ); - _gl.copyTexSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16 ); + //_gl.copyTexSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16 ); + _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16, 0 ); // restore graphics @@ -3665,7 +3796,13 @@ THREE.WebGLRenderer = function ( parameters ) { addBufferImmediate( scene.__webglObjectsImmediate, object ); - }/*else if ( object instanceof THREE.Particle ) { + } else if ( object instanceof THREE.Sprite ) { + + scene.__webglSprites.push( object ); + } + + + /*else if ( object instanceof THREE.Particle ) { }*/ @@ -3775,10 +3912,13 @@ THREE.WebGLRenderer = function ( parameters ) { if ( object == zobject ) { scene.__webglObjects.splice( o, 1 ); + return; } } + + // add shadwos/sprites etc. }; diff --git a/src/renderers/WebGLShaders.js b/src/renderers/WebGLShaders.js index 33727942..fbc2b276 100644 --- a/src/renderers/WebGLShaders.js +++ b/src/renderers/WebGLShaders.js @@ -602,13 +602,13 @@ THREE.ShaderLib = { "texture2D( occlusionMap, vec2( 0.1, 0.9 )) +", "texture2D( occlusionMap, vec2( 0.1, 0.5 )) +", "texture2D( occlusionMap, vec2( 0.5, 0.5 ));", -/* + "vVisibility = ( visibility.r / 9.0 ) *", "( 1.0 - visibility.g / 9.0 ) *", "( visibility.b / 9.0 ) *", "( 1.0 - visibility.a / 9.0 );", -*/ - "vVisibility = ( 1.0 - visibility.a / 9.0 );", + +// "vVisibility = ( 1.0 - visibility.a / 9.0 );", "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", @@ -638,7 +638,8 @@ THREE.ShaderLib = { "if( renderType == 0 ) {", - "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", +// "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", // restore @@ -741,25 +742,46 @@ THREE.ShaderLib = { 'sprite': { vertexShader: [ - - "uniform vec3 screenPosition;", - "uniform vec2 scale;", - "uniform float rotation;", + "uniform int useScreenCoordinates;", + "uniform int affectedByDistance;", + "uniform vec3 screenPosition;", + "uniform mat4 modelViewMatrix;", + "uniform mat4 projectionMatrix;", + "uniform float rotation;", + "uniform vec2 scale;", + "uniform vec2 alignment;", + "uniform vec2 uvOffset;", + "uniform vec2 uvScale;", "attribute vec2 position;", - "attribute vec2 UV;", + "attribute vec2 uv;", "varying vec2 vUV;", "void main(void)", "{", - "vUV = UV;", + "vUV = uvOffset + uv * uvScale;", - "vec2 pos;", - "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", - "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + "vec2 alignedPosition = position + alignment;", + + "vec2 rotatedPosition;", + "rotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;", + "rotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;", + + "vec4 finalPosition;", - "gl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + "if( useScreenCoordinates != 0 ) {", + + "finalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );", + + "} else {", + + "finalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );", + "finalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );", + + "}", + + "gl_Position = finalPosition;", "}" ].join( "\n" ), @@ -780,6 +802,7 @@ THREE.ShaderLib = { "vec4 color = texture2D( map, vUV );", "color.a *= opacity;", "gl_FragColor = color;", +// "gl_FragColor = vec4( 1.0, 0.0, 1.0, 1.0 );", "}" ].join( "\n" ) diff --git a/utils/build.py b/utils/build.py index 43b5b397..80b3c048 100644 --- a/utils/build.py +++ b/utils/build.py @@ -64,6 +64,7 @@ COMMON_FILES = [ 'objects/Sound.js', 'objects/LOD.js', 'objects/ShadowVolume.js', +'objects/Sprite.js', 'scenes/Scene.js', 'scenes/Fog.js', 'scenes/FogExp2.js', From 08127af611c9c87645ddc1510f152468479386da Mon Sep 17 00:00:00 2001 From: Mikael Emtinger Date: Thu, 7 Apr 2011 17:10:54 +0200 Subject: [PATCH 2/7] Fixed blending bug with sprites. Added example. --- build/Three.js | 92 +++++++++++----------- examples/textures/sprite0.jpg | Bin 0 -> 3892 bytes examples/textures/sprite1.jpg | Bin 0 -> 3876 bytes examples/webgl_sprites.html | 136 +++++++++++++++++++++++++++++++++ src/objects/Sprite.js | 5 +- src/renderers/WebGLRenderer.js | 16 ++-- 6 files changed, 194 insertions(+), 55 deletions(-) create mode 100644 examples/textures/sprite0.jpg create mode 100644 examples/textures/sprite1.jpg create mode 100644 examples/webgl_sprites.html diff --git a/build/Three.js b/build/Three.js index e8626d91..99f0c40e 100755 --- a/build/Three.js +++ b/build/Three.js @@ -143,10 +143,10 @@ THREE.ShadowVolume.prototype.calculateShadowVolumeGeometry=function(b){this.geom 0;k0&&va[0]0&&va[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;X=E.size*E.scale/ja;U[0]=X*F;U[1]=X;e.uniform3fv(ra.screenPosition,ya);e.uniform2fv(ra.scale,U);e.uniform1f(ra.rotation,E.rotation);e.uniform1f(ra.opacity,E.opacity);N(E.blending);R(E.texture,1);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function H(m, -B){m._modelViewMatrix.multiplyToArray(B.matrixWorldInverse,m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function K(m){var B,x,u,z,J;if(m instanceof THREE.Mesh){x=m.geometry;for(B in x.geometryGroups){u=x.geometryGroups[B];J=!1;for(z in u.__webglCustomAttributes)if(u.__webglCustomAttributes[z].needsUpdate){J=!0;break}if(x.__dirtyVertices||x.__dirtyMorphTargets||x.__dirtyElements||x.__dirtyUvs||x.__dirtyNormals||x.__dirtyColors|| -x.__dirtyTangents||J){J=e.DYNAMIC_DRAW;var L=void 0,E=void 0,P=void 0,F=void 0;P=void 0;var M=void 0,I=void 0,X=void 0,U=void 0,ya=void 0,va=void 0,ra=void 0,Na=void 0,Sa=void 0,Ka=void 0,Ja=void 0,Ia=void 0,Wa=void 0;I=void 0;X=void 0;F=void 0;U=void 0;F=void 0;var D=void 0,aa=void 0;I=void 0;D=void 0;aa=void 0;var t=void 0,bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;F=void 0;U=void 0;M=void 0;P=void 0;P=void 0;D=void 0;aa=void 0; -t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;aa=D=0;var La=u.__vertexArray,V=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,Y=u.__tangentArray,Ca=u.__colorArray,qa=u.__skinVertexAArray,ha=u.__skinVertexBArray,Q=u.__skinIndexArray,Ea=u.__skinWeightArray,ib=u.__morphTargetsArrays,Ya=u.__webglCustomAttributes;t=void 0;var Za=u.__faceArray,db=u.__lineArray,jb=u.__needsSmoothNormals;va=u.__vertexColorType;ya=u.__uvType;ra=u.__normalType;var Ua=m.geometry,sb=Ua.__dirtyVertices, -tb=Ua.__dirtyElements,rb=Ua.__dirtyUvs,ub=Ua.__dirtyNormals,vb=Ua.__dirtyTangents,wb=Ua.__dirtyColors,xb=Ua.__dirtyMorphTargets,nb=Ua.vertices,yb=u.faces,Bb=Ua.faces,zb=Ua.faceVertexUvs[0],Ab=Ua.faceVertexUvs[1],ob=Ua.skinVerticesA,pb=Ua.skinVerticesB,qb=Ua.skinIndices,lb=Ua.skinWeights,mb=Ua.edgeFaces,kb=Ua.morphTargets;if(Ya)for(eb in Ya){Ya[eb].offset=0;Ya[eb].offsetSrc=0}L=0;for(E=yb.length;L0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER,Ca,J)}if(ub){e.bindBuffer(e.ARRAY_BUFFER,u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,J)}if(vb&&Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,Y,J)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER,V,J)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER, -u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,J)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,J);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,db,J)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,qa,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ha,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinIndicesBuffer); -e.bufferData(e.ARRAY_BUFFER,Q,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,Ea,J)}}}x.__dirtyVertices=!1;x.__dirtyMorphTargets=!1;x.__dirtyElements=!1;x.__dirtyUvs=!1;x.__dirtyNormals=!1;x.__dirtyTangents=!1;x.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){x=m.geometry;if(x.__dirtyVertices||x.__dirtyColors){m=x;B=e.DYNAMIC_DRAW;va=m.vertices;u=m.colors;ra=va.length;J=u.length;Na=m.__vertexArray;L=m.__colorArray;Sa=m.__dirtyColors;if(m.__dirtyVertices){for(E= -0;E65535){M[P].counter+=1;F=M[P].hash+"_"+M[P].counter;m.geometryGroups[F]==undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z);m.geometryGroups[F].vertices+=L}}function A(m,B,x){m.push({buffer:B,object:x,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function N(m){if(m!= -ga){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}ga=m}}function O(m,B,x){if((x.width&x.width-1)==0&&(x.height& -x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,ca(B.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,ca(B.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,ca(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ca(B.minFilter));e.generateMipmap(m)}else{e.texParameteri(m,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_MAG_FILTER,ua(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ua(B.minFilter))}}function R(m,B){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D, -m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null);m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+B);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function Fa(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer===undefined)m.depthBuffer=!0;if(m.stencilBuffer=== -undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer();m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,ca(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,ca(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,ca(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,ca(m.minFilter));e.texImage2D(e.TEXTURE_2D,0,ca(m.format),m.width,m.height, -0,ca(m.format),ca(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,m.__webglTexture,0);if(m.depthBuffer&&!m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else if(m.depthBuffer&&m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER, +I=!0;e.useProgram(_sprite.program);xa=_sprite.program;ga="";e.disable(e.CULL_FACE);e.enable(e.BLEND);e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.vertexAttribPointer(x.position,2,e.FLOAT,!1,16,0);e.vertexAttribPointer(x.uv,2,e.FLOAT,!1,16,8);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.uniformMatrix4fv(J.projectionMatrix,!1,$a);e.activeTexture(e.TEXTURE0);e.uniform1i(J.map,0);x=0;for(u=m.__webglSprites.length;x0&&va[0]0&&va[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;X=E.size*E.scale/ja;U[0]=X*F;U[1]=X;e.uniform3fv(ra.screenPosition,ya);e.uniform2fv(ra.scale,U);e.uniform1f(ra.rotation,E.rotation);e.uniform1f(ra.opacity,E.opacity);N(E.blending);R(E.texture,1);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT, +0)}}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function H(m,B){m._modelViewMatrix.multiplyToArray(B.matrixWorldInverse,m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function K(m){var B,x,u,z,J;if(m instanceof THREE.Mesh){x=m.geometry;for(B in x.geometryGroups){u=x.geometryGroups[B];J=!1;for(z in u.__webglCustomAttributes)if(u.__webglCustomAttributes[z].needsUpdate){J=!0;break}if(x.__dirtyVertices|| +x.__dirtyMorphTargets||x.__dirtyElements||x.__dirtyUvs||x.__dirtyNormals||x.__dirtyColors||x.__dirtyTangents||J){J=e.DYNAMIC_DRAW;var L=void 0,E=void 0,P=void 0,F=void 0;P=void 0;var M=void 0,I=void 0,X=void 0,U=void 0,ya=void 0,va=void 0,ra=void 0,Na=void 0,Sa=void 0,Ka=void 0,Ja=void 0,Ia=void 0,Wa=void 0;I=void 0;X=void 0;F=void 0;U=void 0;F=void 0;var D=void 0,aa=void 0;I=void 0;D=void 0;aa=void 0;var t=void 0,bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0; +D=void 0;aa=void 0;t=void 0;F=void 0;U=void 0;M=void 0;P=void 0;P=void 0;D=void 0;aa=void 0;t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;aa=D=0;var La=u.__vertexArray,V=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,Y=u.__tangentArray,Ca=u.__colorArray,qa=u.__skinVertexAArray,ha=u.__skinVertexBArray,Q=u.__skinIndexArray,Ea=u.__skinWeightArray,ib=u.__morphTargetsArrays,Ya=u.__webglCustomAttributes;t=void 0;var Za=u.__faceArray,db=u.__lineArray,jb=u.__needsSmoothNormals; +va=u.__vertexColorType;ya=u.__uvType;ra=u.__normalType;var Ua=m.geometry,sb=Ua.__dirtyVertices,tb=Ua.__dirtyElements,rb=Ua.__dirtyUvs,ub=Ua.__dirtyNormals,vb=Ua.__dirtyTangents,wb=Ua.__dirtyColors,xb=Ua.__dirtyMorphTargets,nb=Ua.vertices,yb=u.faces,Bb=Ua.faces,zb=Ua.faceVertexUvs[0],Ab=Ua.faceVertexUvs[1],ob=Ua.skinVerticesA,pb=Ua.skinVerticesB,qb=Ua.skinIndices,lb=Ua.skinWeights,mb=Ua.edgeFaces,kb=Ua.morphTargets;if(Ya)for(eb in Ya){Ya[eb].offset=0;Ya[eb].offsetSrc=0}L=0;for(E=yb.length;L0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER,Ca,J)}if(ub){e.bindBuffer(e.ARRAY_BUFFER,u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,J)}if(vb&&Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,Y,J)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER, +V,J)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,J)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,J);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,db,J)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,qa,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ha,J);e.bindBuffer(e.ARRAY_BUFFER, +u.__webglSkinIndicesBuffer);e.bufferData(e.ARRAY_BUFFER,Q,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,Ea,J)}}}x.__dirtyVertices=!1;x.__dirtyMorphTargets=!1;x.__dirtyElements=!1;x.__dirtyUvs=!1;x.__dirtyNormals=!1;x.__dirtyTangents=!1;x.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){x=m.geometry;if(x.__dirtyVertices||x.__dirtyColors){m=x;B=e.DYNAMIC_DRAW;va=m.vertices;u=m.colors;ra=va.length;J=u.length;Na=m.__vertexArray;L=m.__colorArray;Sa=m.__dirtyColors; +if(m.__dirtyVertices){for(E=0;E65535){M[P].counter+=1;F=M[P].hash+"_"+M[P].counter;m.geometryGroups[F]==undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z);m.geometryGroups[F].vertices+=L}}function A(m,B,x){m.push({buffer:B,object:x,opaque:{list:[],count:0},transparent:{list:[], +count:0}})}function N(m){if(m!=ga){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}ga=m}}function O(m,B,x){if((x.width& +x.width-1)==0&&(x.height&x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,ca(B.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,ca(B.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,ca(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ca(B.minFilter));e.generateMipmap(m)}else{e.texParameteri(m,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_MAG_FILTER,ua(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ua(B.minFilter))}}function R(m, +B){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null);m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+B);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function Fa(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer=== +undefined)m.depthBuffer=!0;if(m.stencilBuffer===undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer();m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,ca(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,ca(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,ca(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,ca(m.minFilter));e.texImage2D(e.TEXTURE_2D, +0,ca(m.format),m.width,m.height,0,ca(m.format),ca(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,m.__webglTexture,0);if(m.depthBuffer&&!m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else if(m.depthBuffer&&m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER, e.DEPTH_STENCIL,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,m.width,m.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var B,x;if(m){B=m.__webglFramebuffer;x=m.width;m=m.height}else{B=null;x=ia;m=ja}if(B!=Ha){e.bindFramebuffer(e.FRAMEBUFFER,B);e.viewport(la,Ga,x,m);Ha=B}}function ka(m,B){var x;if(m=="fragment")x= e.createShader(e.FRAGMENT_SHADER);else m=="vertex"&&(x=e.createShader(e.VERTEX_SHADER));e.shaderSource(x,B);e.compileShader(x);if(!e.getShaderParameter(x,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(x));console.error(B);return null}return x}function ua(m){switch(m){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;default:return e.LINEAR}}function ca(m){switch(m){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE; case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST;case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT; @@ -343,8 +343,8 @@ ra;L.__webglFaceCount=ya*3+(E.geometry.edgeFaces?E.geometry.edgeFaces.length*6:0 !0;z.__dirtyUvs=!0;z.__dirtyNormals=!0;z.__dirtyTangents=!0;z.__dirtyColors=!0}B instanceof THREE.ShadowVolume?A(x.__webglShadowVolumes,J,B):A(x.__webglObjects,J,B)}}else if(B instanceof THREE.LensFlare)A(x.__webglLensFlares,undefined,B);else if(B instanceof THREE.Ribbon){z=B.geometry;if(!z.__webglVertexBuffer){u=z;u.__webglVertexBuffer=e.createBuffer();u.__webglColorBuffer=e.createBuffer();u=z;J=u.vertices.length;u.__vertexArray=new Float32Array(J*3);u.__colorArray=new Float32Array(J*3);u.__webglVertexCount= J;z.__dirtyVertices=!0;z.__dirtyColors=!0}A(x.__webglObjects,z,B)}else if(B instanceof THREE.Line){z=B.geometry;if(!z.__webglVertexBuffer){u=z;u.__webglVertexBuffer=e.createBuffer();u.__webglColorBuffer=e.createBuffer();u=z;J=u.vertices.length;u.__vertexArray=new Float32Array(J*3);u.__colorArray=new Float32Array(J*3);u.__webglLineCount=J;z.__dirtyVertices=!0;z.__dirtyColors=!0}A(x.__webglObjects,z,B)}else if(B instanceof THREE.ParticleSystem){z=B.geometry;if(!z.__webglVertexBuffer){u=z;u.__webglVertexBuffer= e.createBuffer();u.__webglColorBuffer=e.createBuffer();u=z;J=u.vertices.length;u.__vertexArray=new Float32Array(J*3);u.__colorArray=new Float32Array(J*3);u.__sortArray=[];u.__webglParticleCount=J;z.__dirtyVertices=!0;z.__dirtyColors=!0}A(x.__webglObjects,z,B)}else if(THREE.MarchingCubes!==undefined&&B instanceof THREE.MarchingCubes)x.__webglObjectsImmediate.push({object:B,opaque:{list:[],count:0},transparent:{list:[],count:0}});else B instanceof THREE.Sprite&&x.__webglSprites.push(B);m.__objectsAdded.splice(0, -1)}for(;m.__objectsRemoved.length;){B=m.__objectsRemoved[0];x=m;z=void 0;u=void 0;for(z=x.__webglObjects.length-1;z>=0;z--){u=x.__webglObjects[z].object;if(B==u){x.__webglObjects.splice(z,1);break}}m.__objectsRemoved.splice(0,1)}B=0;for(x=m.__webglObjects.length;B0}}; +1)}for(;m.__objectsRemoved.length;){B=m.__objectsRemoved[0];x=m;z=void 0;u=void 0;for(z=x.__webglObjects.length-1;z>=0;z--){u=x.__webglObjects[z].object;if(B==u){x.__webglObjects.splice(z,1);break}}m.__objectsRemoved.splice(0,1)}B=0;for(x=m.__webglObjects.length;B0}}; THREE.WebGLRenderTarget=function(b,c,d){this.width=b;this.height=c;d=d||{};this.wrapS=d.wrapS!==undefined?d.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=d.wrapT!==undefined?d.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=d.magFilter!==undefined?d.magFilter:THREE.LinearFilter;this.minFilter=d.minFilter!==undefined?d.minFilter:THREE.LinearMipMapLinearFilter;this.format=d.format!==undefined?d.format:THREE.RGBFormat;this.type=d.type!==undefined?d.type:THREE.UnsignedByteType;this.depthBuffer=d.depthBuffer!== undefined?d.depthBuffer:!0;this.stencilBuffer=d.stencilBuffer!==undefined?d.stencilBuffer:!0}; THREE.SoundRenderer=function(){this.volume=1;this.domElement=document.createElement("div");this.domElement.id="THREESound";this.cameraPosition=new THREE.Vector3;this.soundPosition=new THREE.Vector3;this.render=function(b,c,d){d&&b.update(undefined,!1,c);d=b.sounds;var f,g=d.length;for(f=0;f?@875@@F7J$SfpE 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 literal 0 HcmV?d00001 diff --git a/examples/textures/sprite1.jpg b/examples/textures/sprite1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3203148837c84a6addbb500d59e53734efa29463 GIT binary patch literal 3876 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 + + + three.js - webgl + + + + + + + + + + + diff --git a/src/objects/Sprite.js b/src/objects/Sprite.js index abd25f9f..2619f5c4 100644 --- a/src/objects/Sprite.js +++ b/src/objects/Sprite.js @@ -21,7 +21,7 @@ THREE.Sprite = function( parameters ) { } this.useScreenCoordinates = parameters.useScreenCoordinates !== undefined ? parameters.useScreenCoordinates : true; - this.mergeWith3D = parameters.mergeWith3D !== undefined ? parameters.mergeWith3D : false; + this.mergeWith3D = parameters.mergeWith3D !== undefined ? parameters.mergeWith3D : !parameters.useScreenCoordinates; this.affectedByDistance = parameters.affectedByDistance !== undefined ? parameters.affectedByDistance : !parameters.useScreenCoordinates; this.alignment = parameters.alignment instanceof THREE.Vector2 ? parameters.alignment : THREE.SpriteAlignment.center; @@ -52,8 +52,7 @@ THREE.Sprite.prototype.updateMatrix = function () { if ( this.scale.x !== 1 || this.scale.y !== 1 ) { - this.scale3d.set( this.scale.x, this.scale.y, 1 ); - this.matrix.scale( this.scale3d ); + this.matrix.scale( this.scale ); this.boundRadiusScale = Math.max( this.scale.x, this.scale.y ); } diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index d23ba132..d544c877 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -3129,6 +3129,7 @@ THREE.WebGLRenderer = function ( parameters ) { } } + // render 2d if ( scene.__webglSprites.length ) { @@ -3330,6 +3331,7 @@ THREE.WebGLRenderer = function ( parameters ) { _oldBlending = ""; _gl.disable( _gl.CULL_FACE ); + _gl.enable( _gl.BLEND ); _gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer ); _gl.vertexAttribPointer( attributes.position, 2, _gl.FLOAT, false, 2 * 8, 0 ); @@ -3341,8 +3343,6 @@ THREE.WebGLRenderer = function ( parameters ) { _gl.activeTexture( _gl.TEXTURE0 ); _gl.uniform1i( uniforms.map, 0 ); - - _gl.depthMask( false ); // render all non-custom shader sprites @@ -3374,8 +3374,8 @@ THREE.WebGLRenderer = function ( parameters ) { } size = object.map.image.width / ( object.affectedByDistance ? 1 : _viewportHeight ); - scale[ 0 ] = size * invAspect; - scale[ 1 ] = size; + scale[ 0 ] = size * invAspect * object.scale.x; + scale[ 1 ] = size * object.scale.y; _gl.uniform2f( uniforms.uvScale, object.uvScale.x, object.uvScale.y ); _gl.uniform2f( uniforms.uvOffset, object.uvOffset.x, object.uvOffset.y ); @@ -3387,11 +3387,15 @@ THREE.WebGLRenderer = function ( parameters ) { if( object.mergeWith3D && !mergeWith3D ) { _gl.enable( _gl.DEPTH_TEST ); + _gl.depthMask( true ); + mergeWith3D = true; } else if( !object.mergeWith3D && mergeWith3D ) { _gl.disable( _gl.DEPTH_TEST ); + _gl.depthMask( false ); + mergeWith3D = false; } @@ -3669,11 +3673,11 @@ THREE.WebGLRenderer = function ( parameters ) { } - for ( var o = 0, ol = scene.__webglSprites.length; o < ol; o ++ ) { +/* for ( var o = 0, ol = scene.__webglSprites.length; o < ol; o ++ ) { updateObject( scene.__webglSprites[ o ].object, scene ); - } + }*/ }; From 50b6745ad6a5405de1de4394a09381681e616b4c Mon Sep 17 00:00:00 2001 From: Mikael Emtinger Date: Thu, 7 Apr 2011 18:03:22 +0200 Subject: [PATCH 3/7] Added sorting to sprites and updated example. Removed pink square method from lens flares in opengl (no partial screen occlusion) --- build/Three.js | 132 ++++++++++++++++----------------- examples/textures/sprite0.png | Bin 0 -> 6885 bytes examples/textures/sprite1.png | Bin 0 -> 7349 bytes examples/webgl_sprites.html | 6 +- src/renderers/WebGLRenderer.js | 33 +++++++-- src/renderers/WebGLShaders.js | 29 +++----- 6 files changed, 107 insertions(+), 93 deletions(-) create mode 100644 examples/textures/sprite0.png create mode 100644 examples/textures/sprite1.png diff --git a/build/Three.js b/build/Three.js index 99f0c40e..1e19001c 100755 --- a/build/Three.js +++ b/build/Three.js @@ -215,7 +215,7 @@ default_vertex:"#ifndef USE_MORPHTARGETS\n#ifndef USE_SKINNING\ngl_Position = pr THREE.UniformsLib={common:{diffuse:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},map:{type:"t",value:0,texture:null},lightMap:{type:"t",value:2,texture:null},envMap:{type:"t",value:1,texture:null},useRefract:{type:"i",value:0},reflectivity:{type:"f",value:1},refractionRatio:{type:"f",value:0.98},combine:{type:"i",value:0},fogDensity:{type:"f",value:2.5E-4},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2E3},fogColor:{type:"c",value:new THREE.Color(16777215)},morphTargetInfluences:{type:"f", value:0}},lights:{enableLighting:{type:"i",value:1},ambientLightColor:{type:"fv",value:[]},directionalLightDirection:{type:"fv",value:[]},directionalLightColor:{type:"fv",value:[]},pointLightColor:{type:"fv",value:[]},pointLightPosition:{type:"fv",value:[]},pointLightDistance:{type:"fv1",value:[]}},particle:{psColor:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},size:{type:"f",value:1},scale:{type:"f",value:1},map:{type:"t",value:0,texture:null},fogDensity:{type:"f",value:2.5E-4}, fogNear:{type:"f",value:1},fogFar:{type:"f",value:2E3},fogColor:{type:"c",value:new THREE.Color(16777215)}}}; -THREE.ShaderLib={lensFlareVertexTexture:{vertexShader:"uniform \tvec3 \tscreenPosition;\nuniform\tvec2\tscale;\nuniform\tfloat\trotation;\nuniform int renderType;\nuniform\tsampler2D\tocclusionMap;\nattribute \tvec2 \tposition;\nattribute vec2\tUV;\nvarying\tvec2\tvUV;\nvarying\tfloat\tvVisibility;\nvoid main(void)\n{\nvUV = UV;\nvec2 pos = position;\nif( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.1, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ));\nvVisibility = ( visibility.r / 9.0 ) *\n( 1.0 - visibility.g / 9.0 ) *\n( visibility.b / 9.0 ) *\n( 1.0 - visibility.a / 9.0 );\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",fragmentShader:"#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tfloat\t\topacity;\nuniform int renderType;\nvarying\tvec2\t\tvUV;\nvarying\tfloat\t\tvVisibility;\nvoid main( void )\n{\nif( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity * vVisibility;\ngl_FragColor = color;\n}\n}"}, +THREE.ShaderLib={lensFlareVertexTexture:{vertexShader:"uniform \tvec3 \tscreenPosition;\nuniform\tvec2\tscale;\nuniform\tfloat\trotation;\nuniform int renderType;\nuniform\tsampler2D\tocclusionMap;\nattribute \tvec2 \tposition;\nattribute vec2\tUV;\nvarying\tvec2\tvUV;\nvarying\tfloat\tvVisibility;\nvoid main(void)\n{\nvUV = UV;\nvec2 pos = position;\nif( renderType == 2 ) {\nfloat visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.5 )).a;\nvVisibility = ( 1.0 - visibility / 9.0 );\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",fragmentShader:"#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tfloat\t\topacity;\nuniform int renderType;\nvarying\tvec2\t\tvUV;\nvarying\tfloat\t\tvVisibility;\nvoid main( void )\n{\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity * vVisibility;\ngl_FragColor = color;\n}\n}"}, lensFlare:{vertexShader:"uniform \tvec3 \tscreenPosition;\nuniform\tvec2\tscale;\nuniform\tfloat\trotation;\nuniform int renderType;\nattribute \tvec2 \tposition;\nattribute vec2\tUV;\nvarying\tvec2\tvUV;\nvoid main(void)\n{\nvUV = UV;\nvec2 pos = position;\nif( renderType == 2 ) {\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}", fragmentShader:"#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tsampler2D\tocclusionMap;\nuniform\tfloat\t\topacity;\nuniform int renderType;\nvarying\tvec2\t\tvUV;\nvoid main( void )\n{\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 )).a;\nvisibility = ( 1.0 - visibility / 4.0 );\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity * visibility;\ngl_FragColor = color;\n}\n}"}, sprite:{vertexShader:"uniform\tint\t\tuseScreenCoordinates;\nuniform int affectedByDistance;\nuniform\tvec3\tscreenPosition;\nuniform \tmat4 \tmodelViewMatrix;\nuniform \tmat4 \tprojectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 alignment;\nuniform vec2 uvOffset;\nuniform\tvec2 uvScale;\nattribute \tvec2 \tposition;\nattribute vec2\tuv;\nvarying\tvec2\tvUV;\nvoid main(void)\n{\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position + alignment;\nvec2 rotatedPosition;\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\nvec4 finalPosition;\nif( useScreenCoordinates != 0 ) {\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\n} else {\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\n}\ngl_Position = finalPosition;\n}", @@ -259,71 +259,71 @@ e.depthMask(!1);e.colorMask(!1,!1,!1,!1);e.stencilFunc(e.ALWAYS,1,255);e.stencil z,undefined,u);E=E.program;P=E.uniforms;F=E.attributes;if(xa!==E){e.useProgram(E);xa=E;e.uniformMatrix4fv(P.projectionMatrix,!1,$a);e.uniformMatrix4fv(P.viewMatrix,!1,ab);e.uniform3fv(P.directionalLightDirection,J)}u.matrixWorld.flattenToArray(u._objectMatrixArray);e.uniformMatrix4fv(P.objectMatrix,!1,u._objectMatrixArray);e.bindBuffer(e.ARRAY_BUFFER,L.__webglVertexBuffer);e.vertexAttribPointer(F.position,3,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,L.__webglNormalBuffer);e.vertexAttribPointer(F.normal, 3,e.FLOAT,!1,0,0);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,L.__webglFaceBuffer);e.cullFace(e.FRONT);e.drawElements(e.TRIANGLES,L.__webglFaceCount,e.UNSIGNED_SHORT,0);e.cullFace(e.BACK);e.drawElements(e.TRIANGLES,L.__webglFaceCount,e.UNSIGNED_SHORT,0)}}}e.disable(e.POLYGON_OFFSET_FILL);e.colorMask(!0,!0,!0,!0);e.stencilFunc(e.NOTEQUAL,0,255);e.stencilOp(e.KEEP,e.KEEP,e.KEEP);e.disable(e.DEPTH_TEST);ga="";xa=wa.program;e.useProgram(wa.program);e.uniformMatrix4fv(wa.projectionLocation,!1,$a);e.uniform1f(wa.darknessLocation, wa.darkness);e.bindBuffer(e.ARRAY_BUFFER,wa.vertexBuffer);e.vertexAttribPointer(wa.vertexLocation,3,e.FLOAT,!1,0,0);e.enableVertexAttribArray(wa.vertexLocation);e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA);e.blendEquation(e.FUNC_ADD);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,wa.elementBuffer);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0);e.disable(e.STENCIL_TEST);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function C(m,B){var x,u,z;x=_sprite.attributes;var J=_sprite.uniforms,L=ja/ia,E,P=[],F=ia*0.5,M=ja*0.5, -I=!0;e.useProgram(_sprite.program);xa=_sprite.program;ga="";e.disable(e.CULL_FACE);e.enable(e.BLEND);e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.vertexAttribPointer(x.position,2,e.FLOAT,!1,16,0);e.vertexAttribPointer(x.uv,2,e.FLOAT,!1,16,8);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.uniformMatrix4fv(J.projectionMatrix,!1,$a);e.activeTexture(e.TEXTURE0);e.uniform1i(J.map,0);x=0;for(u=m.__webglSprites.length;x0&&va[0]0&&va[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;X=E.size*E.scale/ja;U[0]=X*F;U[1]=X;e.uniform3fv(ra.screenPosition,ya);e.uniform2fv(ra.scale,U);e.uniform1f(ra.rotation,E.rotation);e.uniform1f(ra.opacity,E.opacity);N(E.blending);R(E.texture,1);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT, -0)}}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function H(m,B){m._modelViewMatrix.multiplyToArray(B.matrixWorldInverse,m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function K(m){var B,x,u,z,J;if(m instanceof THREE.Mesh){x=m.geometry;for(B in x.geometryGroups){u=x.geometryGroups[B];J=!1;for(z in u.__webglCustomAttributes)if(u.__webglCustomAttributes[z].needsUpdate){J=!0;break}if(x.__dirtyVertices|| -x.__dirtyMorphTargets||x.__dirtyElements||x.__dirtyUvs||x.__dirtyNormals||x.__dirtyColors||x.__dirtyTangents||J){J=e.DYNAMIC_DRAW;var L=void 0,E=void 0,P=void 0,F=void 0;P=void 0;var M=void 0,I=void 0,X=void 0,U=void 0,ya=void 0,va=void 0,ra=void 0,Na=void 0,Sa=void 0,Ka=void 0,Ja=void 0,Ia=void 0,Wa=void 0;I=void 0;X=void 0;F=void 0;U=void 0;F=void 0;var D=void 0,aa=void 0;I=void 0;D=void 0;aa=void 0;var t=void 0,bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0; -D=void 0;aa=void 0;t=void 0;F=void 0;U=void 0;M=void 0;P=void 0;P=void 0;D=void 0;aa=void 0;t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;aa=D=0;var La=u.__vertexArray,V=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,Y=u.__tangentArray,Ca=u.__colorArray,qa=u.__skinVertexAArray,ha=u.__skinVertexBArray,Q=u.__skinIndexArray,Ea=u.__skinWeightArray,ib=u.__morphTargetsArrays,Ya=u.__webglCustomAttributes;t=void 0;var Za=u.__faceArray,db=u.__lineArray,jb=u.__needsSmoothNormals; -va=u.__vertexColorType;ya=u.__uvType;ra=u.__normalType;var Ua=m.geometry,sb=Ua.__dirtyVertices,tb=Ua.__dirtyElements,rb=Ua.__dirtyUvs,ub=Ua.__dirtyNormals,vb=Ua.__dirtyTangents,wb=Ua.__dirtyColors,xb=Ua.__dirtyMorphTargets,nb=Ua.vertices,yb=u.faces,Bb=Ua.faces,zb=Ua.faceVertexUvs[0],Ab=Ua.faceVertexUvs[1],ob=Ua.skinVerticesA,pb=Ua.skinVerticesB,qb=Ua.skinIndices,lb=Ua.skinWeights,mb=Ua.edgeFaces,kb=Ua.morphTargets;if(Ya)for(eb in Ya){Ya[eb].offset=0;Ya[eb].offsetSrc=0}L=0;for(E=yb.length;L0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER,Ca,J)}if(ub){e.bindBuffer(e.ARRAY_BUFFER,u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,J)}if(vb&&Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,Y,J)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER, -V,J)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,J)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,J);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,db,J)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,qa,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ha,J);e.bindBuffer(e.ARRAY_BUFFER, -u.__webglSkinIndicesBuffer);e.bufferData(e.ARRAY_BUFFER,Q,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,Ea,J)}}}x.__dirtyVertices=!1;x.__dirtyMorphTargets=!1;x.__dirtyElements=!1;x.__dirtyUvs=!1;x.__dirtyNormals=!1;x.__dirtyTangents=!1;x.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){x=m.geometry;if(x.__dirtyVertices||x.__dirtyColors){m=x;B=e.DYNAMIC_DRAW;va=m.vertices;u=m.colors;ra=va.length;J=u.length;Na=m.__vertexArray;L=m.__colorArray;Sa=m.__dirtyColors; -if(m.__dirtyVertices){for(E=0;E65535){M[P].counter+=1;F=M[P].hash+"_"+M[P].counter;m.geometryGroups[F]==undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z);m.geometryGroups[F].vertices+=L}}function A(m,B,x){m.push({buffer:B,object:x,opaque:{list:[],count:0},transparent:{list:[], -count:0}})}function N(m){if(m!=ga){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}ga=m}}function O(m,B,x){if((x.width& -x.width-1)==0&&(x.height&x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,ca(B.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,ca(B.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,ca(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ca(B.minFilter));e.generateMipmap(m)}else{e.texParameteri(m,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_MAG_FILTER,ua(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ua(B.minFilter))}}function R(m, -B){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null);m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+B);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function Fa(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer=== -undefined)m.depthBuffer=!0;if(m.stencilBuffer===undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer();m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,ca(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,ca(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,ca(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,ca(m.minFilter));e.texImage2D(e.TEXTURE_2D, -0,ca(m.format),m.width,m.height,0,ca(m.format),ca(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,m.__webglTexture,0);if(m.depthBuffer&&!m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else if(m.depthBuffer&&m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER, -e.DEPTH_STENCIL,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,m.width,m.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var B,x;if(m){B=m.__webglFramebuffer;x=m.width;m=m.height}else{B=null;x=ia;m=ja}if(B!=Ha){e.bindFramebuffer(e.FRAMEBUFFER,B);e.viewport(la,Ga,x,m);Ha=B}}function ka(m,B){var x;if(m=="fragment")x= -e.createShader(e.FRAGMENT_SHADER);else m=="vertex"&&(x=e.createShader(e.VERTEX_SHADER));e.shaderSource(x,B);e.compileShader(x);if(!e.getShaderParameter(x,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(x));console.error(B);return null}return x}function ua(m){switch(m){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;default:return e.LINEAR}}function ca(m){switch(m){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE; -case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST;case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT; -case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT;case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var e,ea=document.createElement("canvas"),Aa=[],xa=null,Ha=null,oa=!0,da=this,pa=null,Ba=null,ga=null,$=null, -la=0,Ga=0,ia=0,ja=0,ta=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Ra=new THREE.Matrix4,$a=new Float32Array(16),ab=new Float32Array(16),Oa=new THREE.Vector4,S={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},Z=!0,ma=!0,Da=new THREE.Color(0),Ma=0;if(b){if(b.stencil!=undefined)Z=b.stencil;if(b.antialias!==undefined)ma=b.antialias;b.clearColor!==undefined&&Da.setHex(b.clearColor); -if(b.clearAlpha!==undefined)Ma=b.clearAlpha}this.maxMorphTargets=8;this.domElement=ea;this.autoClear=!0;this.sortObjects=!0;(function(m,B,x,u){try{if(!(e=ea.getContext("experimental-webgl",{antialias:m,stencil:u})))throw"Error creating WebGL context.";}catch(z){console.error(z)}e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);e.cullFace(e.BACK);e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA); -e.clearColor(B.r,B.g,B.b,x)})(ma,Da,Ma,Z);this.context=e;if(Z){var wa={};wa.vertices=new Float32Array(12);wa.faces=new Uint16Array(6);wa.darkness=0.5;wa.vertices[0]=-20;wa.vertices[1]=-20;wa.vertices[2]=-1;wa.vertices[3]=20;wa.vertices[4]=-20;wa.vertices[5]=-1;wa.vertices[6]=20;wa.vertices[7]=20;wa.vertices[8]=-1;wa.vertices[9]=-20;wa.vertices[10]=20;wa.vertices[11]=-1;wa.faces[0]=0;wa.faces[1]=1;wa.faces[2]=2;wa.faces[3]=0;wa.faces[4]=2;wa.faces[5]=3;wa.vertexBuffer=e.createBuffer();wa.elementBuffer= -e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,wa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,wa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,wa.faces,e.STATIC_DRAW);wa.program=e.createProgram();e.attachShader(wa.program,ka("fragment",THREE.ShaderLib.shadowPost.fragmentShader));e.attachShader(wa.program,ka("vertex",THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(wa.program);wa.vertexLocation=e.getAttribLocation(wa.program,"position"); -wa.projectionLocation=e.getUniformLocation(wa.program,"projectionMatrix");wa.darknessLocation=e.getUniformLocation(wa.program,"darkness")}var fa={};fa.vertices=new Float32Array(16);fa.faces=new Uint16Array(6);b=0;fa.vertices[b++]=-1;fa.vertices[b++]=-1;fa.vertices[b++]=0;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0; -fa.vertices[b++]=1;b=0;fa.faces[b++]=0;fa.faces[b++]=1;fa.faces[b++]=2;fa.faces[b++]=0;fa.faces[b++]=2;fa.faces[b++]=3;fa.vertexBuffer=e.createBuffer();fa.elementBuffer=e.createBuffer();fa.tempTexture=e.createTexture();fa.occlusionTexture=e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,fa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,fa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,fa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,fa.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,fa.tempTexture); -e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.bindTexture(e.TEXTURE_2D,fa.occlusionTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE); -e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){fa.hasVertexTexture=!1;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{fa.hasVertexTexture=!0;fa.program=e.createProgram(); -e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(fa.program);fa.attributes={};fa.uniforms={};fa.attributes.vertex=e.getAttribLocation(fa.program,"position");fa.attributes.uv=e.getAttribLocation(fa.program,"UV");fa.uniforms.renderType=e.getUniformLocation(fa.program,"renderType");fa.uniforms.map=e.getUniformLocation(fa.program,"map");fa.uniforms.occlusionMap= -e.getUniformLocation(fa.program,"occlusionMap");fa.uniforms.opacity=e.getUniformLocation(fa.program,"opacity");fa.uniforms.scale=e.getUniformLocation(fa.program,"scale");fa.uniforms.rotation=e.getUniformLocation(fa.program,"rotation");fa.uniforms.screenPosition=e.getUniformLocation(fa.program,"screenPosition");_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]= -1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer=e.createBuffer();_sprite.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER, -_sprite.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,_sprite.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,_sprite.faces,e.STATIC_DRAW);_sprite.program=e.createProgram();e.attachShader(_sprite.program,ka("fragment",THREE.ShaderLib.sprite.fragmentShader));e.attachShader(_sprite.program,ka("vertex",THREE.ShaderLib.sprite.vertexShader));e.linkProgram(_sprite.program);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position= -e.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=e.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=e.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=e.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=e.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=e.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment=e.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map= -e.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=e.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=e.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=e.getUniformLocation(_sprite.program,"affectedByDistance");_sprite.uniforms.screenPosition=e.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix=e.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix= -e.getUniformLocation(_sprite.program,"projectionMatrix");this.setSize=function(m,B){ea.width=m;ea.height=B;this.setViewport(0,0,ea.width,ea.height)};this.setViewport=function(m,B,x,u){la=m;Ga=B;ia=x;ja=u;e.viewport(la,Ga,ia,ja)};this.setScissor=function(m,B,x,u){e.scissor(m,B,x,u)};this.enableScissorTest=function(m){m?e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=function(m){oa=m;e.depthMask(m)};this.setClearColorHex=function(m,B){var x=new THREE.Color(m);e.clearColor(x.r, -x.g,x.b,B)};this.setClearColor=function(m,B){e.clearColor(m.r,m.g,m.b,B)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(m){wa.darkness=m};this.initMaterial=function(m,B,x,u){var z,J,L;if(m instanceof THREE.MeshDepthMaterial)L="depth";else if(m instanceof THREE.ShadowVolumeDynamicMaterial)L="shadowVolumeDynamic";else if(m instanceof THREE.MeshNormalMaterial)L="normal";else if(m instanceof THREE.MeshBasicMaterial)L= -"basic";else if(m instanceof THREE.MeshLambertMaterial)L="lambert";else if(m instanceof THREE.MeshPhongMaterial)L="phong";else if(m instanceof THREE.LineBasicMaterial)L="basic";else m instanceof THREE.ParticleBasicMaterial&&(L="particle_basic");if(L){var E=THREE.ShaderLib[L];m.uniforms=Uniforms.clone(E.uniforms);m.vertexShader=E.vertexShader;m.fragmentShader=E.fragmentShader}var P,F,M;P=M=E=0;for(F=B.length;P0?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+x.maxDirLights,"#define MAX_POINT_LIGHTS "+x.maxPointLights,"#define MAX_BONES "+x.maxBones,x.map?"#define USE_MAP":"",x.envMap?"#define USE_ENVMAP":"",x.lightMap?"#define USE_LIGHTMAP":"",x.vertexColors?"#define USE_COLOR":"",x.skinning?"#define USE_SKINNING":"",x.morphTargets?"#define USE_MORPHTARGETS": -"",x.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n"); +I=!0;e.useProgram(_sprite.program);xa=_sprite.program;ga="";e.disable(e.CULL_FACE);e.enable(e.BLEND);e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.vertexAttribPointer(x.position,2,e.FLOAT,!1,16,0);e.vertexAttribPointer(x.uv,2,e.FLOAT,!1,16,8);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.uniformMatrix4fv(J.projectionMatrix,!1,$a);e.activeTexture(e.TEXTURE0);e.uniform1i(J.map,0);x=0;for(u=m.__webglSprites.length;x0&&va[0]0&&va[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;X=E.size*E.scale/ja;U[0]=X*F;U[1]=X;e.uniform3fv(ra.screenPosition, +ya);e.uniform2fv(ra.scale,U);e.uniform1f(ra.rotation,E.rotation);e.uniform1f(ra.opacity,E.opacity);N(E.blending);R(E.texture,1);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function H(m,B){m._modelViewMatrix.multiplyToArray(B.matrixWorldInverse,m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function K(m){var B,x,u,z,J;if(m instanceof THREE.Mesh){x=m.geometry; +for(B in x.geometryGroups){u=x.geometryGroups[B];J=!1;for(z in u.__webglCustomAttributes)if(u.__webglCustomAttributes[z].needsUpdate){J=!0;break}if(x.__dirtyVertices||x.__dirtyMorphTargets||x.__dirtyElements||x.__dirtyUvs||x.__dirtyNormals||x.__dirtyColors||x.__dirtyTangents||J){J=e.DYNAMIC_DRAW;var L=void 0,E=void 0,P=void 0,F=void 0;P=void 0;var M=void 0,I=void 0,X=void 0,U=void 0,ya=void 0,va=void 0,ra=void 0,Na=void 0,Sa=void 0,Ka=void 0,Ja=void 0,Ia=void 0,Wa=void 0;I=void 0;X=void 0;F=void 0; +U=void 0;F=void 0;var D=void 0,aa=void 0;I=void 0;D=void 0;aa=void 0;var t=void 0,bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;F=void 0;U=void 0;M=void 0;P=void 0;P=void 0;D=void 0;aa=void 0;t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;aa=D=0;var La=u.__vertexArray,V=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,Y=u.__tangentArray,Ca=u.__colorArray,qa=u.__skinVertexAArray,ha=u.__skinVertexBArray, +Q=u.__skinIndexArray,Ea=u.__skinWeightArray,ib=u.__morphTargetsArrays,Ya=u.__webglCustomAttributes;t=void 0;var Za=u.__faceArray,db=u.__lineArray,jb=u.__needsSmoothNormals;va=u.__vertexColorType;ya=u.__uvType;ra=u.__normalType;var Ua=m.geometry,sb=Ua.__dirtyVertices,tb=Ua.__dirtyElements,rb=Ua.__dirtyUvs,ub=Ua.__dirtyNormals,vb=Ua.__dirtyTangents,wb=Ua.__dirtyColors,xb=Ua.__dirtyMorphTargets,nb=Ua.vertices,yb=u.faces,Bb=Ua.faces,zb=Ua.faceVertexUvs[0],Ab=Ua.faceVertexUvs[1],ob=Ua.skinVerticesA,pb= +Ua.skinVerticesB,qb=Ua.skinIndices,lb=Ua.skinWeights,mb=Ua.edgeFaces,kb=Ua.morphTargets;if(Ya)for(eb in Ya){Ya[eb].offset=0;Ya[eb].offsetSrc=0}L=0;for(E=yb.length;L0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER,Ca,J)}if(ub){e.bindBuffer(e.ARRAY_BUFFER,u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,J)}if(vb&& +Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,Y,J)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER,V,J)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,J)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,J);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,db,J)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER, +u.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,qa,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ha,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinIndicesBuffer);e.bufferData(e.ARRAY_BUFFER,Q,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,Ea,J)}}}x.__dirtyVertices=!1;x.__dirtyMorphTargets=!1;x.__dirtyElements=!1;x.__dirtyUvs=!1;x.__dirtyNormals=!1;x.__dirtyTangents=!1;x.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){x= +m.geometry;if(x.__dirtyVertices||x.__dirtyColors){m=x;B=e.DYNAMIC_DRAW;va=m.vertices;u=m.colors;ra=va.length;J=u.length;Na=m.__vertexArray;L=m.__colorArray;Sa=m.__dirtyColors;if(m.__dirtyVertices){for(E=0;E65535){M[P].counter+=1;F=M[P].hash+"_"+M[P].counter;m.geometryGroups[F]==undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z); +m.geometryGroups[F].vertices+=L}}function A(m,B,x){m.push({buffer:B,object:x,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function N(m){if(m!=ga){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD, +e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}ga=m}}function O(m,B,x){if((x.width&x.width-1)==0&&(x.height&x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,ca(B.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,ca(B.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,ca(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ca(B.minFilter));e.generateMipmap(m)}else{e.texParameteri(m,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE); +e.texParameteri(m,e.TEXTURE_MAG_FILTER,ua(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ua(B.minFilter))}}function R(m,B){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null); +m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+B);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function Fa(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer===undefined)m.depthBuffer=!0;if(m.stencilBuffer===undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer();m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,ca(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T, +ca(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,ca(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,ca(m.minFilter));e.texImage2D(e.TEXTURE_2D,0,ca(m.format),m.width,m.height,0,ca(m.format),ca(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,m.__webglTexture,0);if(m.depthBuffer&&!m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER, +e.DEPTH_COMPONENT16,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else if(m.depthBuffer&&m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,m.width,m.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER, +null)}var B,x;if(m){B=m.__webglFramebuffer;x=m.width;m=m.height}else{B=null;x=ia;m=ja}if(B!=Ha){e.bindFramebuffer(e.FRAMEBUFFER,B);e.viewport(la,Ga,x,m);Ha=B}}function ka(m,B){var x;if(m=="fragment")x=e.createShader(e.FRAGMENT_SHADER);else m=="vertex"&&(x=e.createShader(e.VERTEX_SHADER));e.shaderSource(x,B);e.compileShader(x);if(!e.getShaderParameter(x,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(x));console.error(B);return null}return x}function ua(m){switch(m){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST; +default:return e.LINEAR}}function ca(m){switch(m){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST;case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR; +case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT;case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT;case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0} +var e,ea=document.createElement("canvas"),Aa=[],xa=null,Ha=null,oa=!0,da=this,pa=null,Ba=null,ga=null,$=null,la=0,Ga=0,ia=0,ja=0,ta=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Ra=new THREE.Matrix4,$a=new Float32Array(16),ab=new Float32Array(16),Oa=new THREE.Vector4,S={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},Z=!0,ma=!0,Da=new THREE.Color(0),Ma=0;if(b){if(b.stencil!= +undefined)Z=b.stencil;if(b.antialias!==undefined)ma=b.antialias;b.clearColor!==undefined&&Da.setHex(b.clearColor);if(b.clearAlpha!==undefined)Ma=b.clearAlpha}this.maxMorphTargets=8;this.domElement=ea;this.autoClear=!0;this.sortObjects=!0;(function(m,B,x,u){try{if(!(e=ea.getContext("experimental-webgl",{antialias:m,stencil:u})))throw"Error creating WebGL context.";}catch(z){console.error(z)}e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);e.cullFace(e.BACK); +e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.clearColor(B.r,B.g,B.b,x)})(ma,Da,Ma,Z);this.context=e;if(Z){var wa={};wa.vertices=new Float32Array(12);wa.faces=new Uint16Array(6);wa.darkness=0.5;wa.vertices[0]=-20;wa.vertices[1]=-20;wa.vertices[2]=-1;wa.vertices[3]=20;wa.vertices[4]=-20;wa.vertices[5]=-1;wa.vertices[6]=20;wa.vertices[7]=20;wa.vertices[8]=-1;wa.vertices[9]=-20;wa.vertices[10]=20;wa.vertices[11]=-1;wa.faces[0]=0; +wa.faces[1]=1;wa.faces[2]=2;wa.faces[3]=0;wa.faces[4]=2;wa.faces[5]=3;wa.vertexBuffer=e.createBuffer();wa.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,wa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,wa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,wa.faces,e.STATIC_DRAW);wa.program=e.createProgram();e.attachShader(wa.program,ka("fragment",THREE.ShaderLib.shadowPost.fragmentShader));e.attachShader(wa.program,ka("vertex", +THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(wa.program);wa.vertexLocation=e.getAttribLocation(wa.program,"position");wa.projectionLocation=e.getUniformLocation(wa.program,"projectionMatrix");wa.darknessLocation=e.getUniformLocation(wa.program,"darkness")}var fa={};fa.vertices=new Float32Array(16);fa.faces=new Uint16Array(6);b=0;fa.vertices[b++]=-1;fa.vertices[b++]=-1;fa.vertices[b++]=0;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]= +1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]=1;b=0;fa.faces[b++]=0;fa.faces[b++]=1;fa.faces[b++]=2;fa.faces[b++]=0;fa.faces[b++]=2;fa.faces[b++]=3;fa.vertexBuffer=e.createBuffer();fa.elementBuffer=e.createBuffer();fa.tempTexture=e.createTexture();fa.occlusionTexture=e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,fa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,fa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, +fa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,fa.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,fa.tempTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.bindTexture(e.TEXTURE_2D,fa.occlusionTexture);e.texImage2D(e.TEXTURE_2D, +0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){fa.hasVertexTexture=!1;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(fa.program, +ka("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{fa.hasVertexTexture=!0;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(fa.program);fa.attributes={};fa.uniforms={};fa.attributes.vertex=e.getAttribLocation(fa.program,"position");fa.attributes.uv=e.getAttribLocation(fa.program,"UV");fa.uniforms.renderType=e.getUniformLocation(fa.program, +"renderType");fa.uniforms.map=e.getUniformLocation(fa.program,"map");fa.uniforms.occlusionMap=e.getUniformLocation(fa.program,"occlusionMap");fa.uniforms.opacity=e.getUniformLocation(fa.program,"opacity");fa.uniforms.scale=e.getUniformLocation(fa.program,"scale");fa.uniforms.rotation=e.getUniformLocation(fa.program,"rotation");fa.uniforms.screenPosition=e.getUniformLocation(fa.program,"screenPosition");_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]= +-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer= +e.createBuffer();_sprite.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,_sprite.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,_sprite.faces,e.STATIC_DRAW);_sprite.program=e.createProgram();e.attachShader(_sprite.program,ka("fragment",THREE.ShaderLib.sprite.fragmentShader));e.attachShader(_sprite.program,ka("vertex",THREE.ShaderLib.sprite.vertexShader));e.linkProgram(_sprite.program); +_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=e.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=e.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=e.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=e.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=e.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=e.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment= +e.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map=e.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=e.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=e.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=e.getUniformLocation(_sprite.program,"affectedByDistance");_sprite.uniforms.screenPosition=e.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix= +e.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix=e.getUniformLocation(_sprite.program,"projectionMatrix");this.setSize=function(m,B){ea.width=m;ea.height=B;this.setViewport(0,0,ea.width,ea.height)};this.setViewport=function(m,B,x,u){la=m;Ga=B;ia=x;ja=u;e.viewport(la,Ga,ia,ja)};this.setScissor=function(m,B,x,u){e.scissor(m,B,x,u)};this.enableScissorTest=function(m){m?e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=function(m){oa= +m;e.depthMask(m)};this.setClearColorHex=function(m,B){var x=new THREE.Color(m);e.clearColor(x.r,x.g,x.b,B)};this.setClearColor=function(m,B){e.clearColor(m.r,m.g,m.b,B)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(m){wa.darkness=m};this.initMaterial=function(m,B,x,u){var z,J,L;if(m instanceof THREE.MeshDepthMaterial)L="depth";else if(m instanceof THREE.ShadowVolumeDynamicMaterial)L="shadowVolumeDynamic";else if(m instanceof +THREE.MeshNormalMaterial)L="normal";else if(m instanceof THREE.MeshBasicMaterial)L="basic";else if(m instanceof THREE.MeshLambertMaterial)L="lambert";else if(m instanceof THREE.MeshPhongMaterial)L="phong";else if(m instanceof THREE.LineBasicMaterial)L="basic";else m instanceof THREE.ParticleBasicMaterial&&(L="particle_basic");if(L){var E=THREE.ShaderLib[L];m.uniforms=Uniforms.clone(E.uniforms);m.vertexShader=E.vertexShader;m.fragmentShader=E.fragmentShader}var P,F,M;P=M=E=0;for(F=B.length;P0?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+x.maxDirLights,"#define MAX_POINT_LIGHTS "+x.maxPointLights,"#define MAX_BONES "+x.maxBones,x.map?"#define USE_MAP":"",x.envMap?"#define USE_ENVMAP":"",x.lightMap?"#define USE_LIGHTMAP":"",x.vertexColors? +"#define USE_COLOR":"",x.skinning?"#define USE_SKINNING":"",x.morphTargets?"#define USE_MORPHTARGETS":"",x.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n"); e.attachShader(X,ka("fragment",prefix_fragment+P));e.attachShader(X,ka("vertex",prefix_vertex+F));e.linkProgram(X);e.getProgramParameter(X,e.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+e.getProgramParameter(X,e.VALIDATE_STATUS)+", gl error ["+e.getError()+"]");X.uniforms={};X.attributes={};var U;P=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(U in E)P.push(U); U=P;E=0;for(P=U.length;E=0&&e.enableVertexAttribArray(I.color);I.normal>= 0&&e.enableVertexAttribArray(I.normal);I.tangent>=0&&e.enableVertexAttribArray(I.tangent);if(m.skinning&&I.skinVertexA>=0&&I.skinVertexB>=0&&I.skinIndex>=0&&I.skinWeight>=0){e.enableVertexAttribArray(I.skinVertexA);e.enableVertexAttribArray(I.skinVertexB);e.enableVertexAttribArray(I.skinIndex);e.enableVertexAttribArray(I.skinWeight)}for(z in m.attributes)I[z]>=0&&e.enableVertexAttribArray(I[z]);if(m.morphTargets){m.numSupportedMorphTargets=0;if(I.morphTarget0>=0){e.enableVertexAttribArray(I.morphTarget0); diff --git a/examples/textures/sprite0.png b/examples/textures/sprite0.png new file mode 100644 index 0000000000000000000000000000000000000000..35538a64540bec63f4a10bcdbaf5549577f0917e GIT binary patch literal 6885 zcmaJ`XIN9)woQW&iUJAT3rG^qZBs4)3Q$K$`UW@V-#~78K$XfCHdi@yM9!ib+VKB;*vNBo)NP z;s1URr`ZBr-4skUwf~*#G*U)*1O*Wk#Kb~ELPSHPMDYRcViMP`UHhXUDTz8opaO6C z1v!PH`~vy^R?x%+x&(L3`bxH26>BayhTjBnR0074gT}`xk=)|%;ESY=s)^V8I_D8*9TXiy6m!$Tc zS^WZ{4<)L2rc96JQKbRqal%ZR+2eM9)1p=h=E>Lg&sY^jbLx8AU&4RDZ<@~0wWha6 zE&+n9K|FLkI_kq-tE0<54(5XgnrqDgJjDyf@7+~3tDMT6 zA{4{nPc;Cfrl$vRr=CH4)**vuKu2-3hp;Xap*!!@HSf_mXs+tzOGDZMYTFEUY0t42Hboy|4h>e-}L^N(roH6g& zyD+7miXGoa-^M80!Ia~#6c*k?mFBGW3srTnV%x$vND6|)u`(Y_4K~0_*&GODuNA|# zg-9J70EWV!QXM6=g(tr8-M`6V3+E(#Xm6@OeWF00wIw48kJEf3+0`>O3t!2^GXjxR zXtXtTCRl3v6?moAf5hWEY`@hA$l(A&eqYipUHqNG>d%&VG3+Pnb_2v`-v~Ry_4K!q zG8bo%dge+C8*dsW=FT~I`;P*~wP0!>S^ve2+zs9AP!Ms*l*+xo)uXFL?$vxABOo@j z=V+qTSatOtBz09n+nUK|R}Oo`z^}O=LFZ%xkupZU7nDu|oLNh?IWz6LyTiTU!^1eG zaB5~6oGw+Nh*wBR=GL9;P4#csM4EbiQ^y`hP^(7FRp1m}=aS}}sqllFTGghrAD$k9kuze%5VJgYu>U(wqmV)jFB)dZ22rR~{bXL$nZ#S}5%jyCvNe`!h+)pj`IY;%OJH@}J-Uk*`l-w!ukewM&0ARL zDhEa6?2ybLcXF`2AD=oia?#VJ#~-ahM+K;QlBT@?(|qC*l$=AF?ET5;B&mGGH>F%E zQ9Z2G4~o%~cq=Z)l6Z^IMPX`}Dy?NHLb}m{zZLBU8yI1YNHTYcs2CB7){Tp57CT#jXeBYnz{o&YUTUh=Fa0IN>UUg;^d$g zWv(0Vk^KpKz)uNm*jJ!^cvl7ik%+k@U^5fb%?yV`e4VcKY;qvw!heNujuJWRR!pgf zmRf1O;09Yf%}O(GrebYC6>U+R>MoEl9r^JqzXj9zv&oi5AhF21XYLCBaA+Ext)Q)` zgQr0rz)1`d%B`zwEvtDwxf@#8@p-!A@y&w-z1Rl8p?A53O+6O9mCW`1&B>=)5}sK9 zY6VWmn)`x{`q)asIATmF+At2ThD?A2^ONKhy2kpO{5BLLN>`si`*!uIdW%2VOk0X4 zM$QiscQvrHy^BJ7kAx$#Y8HpC7e{$M4|C?JxczX>^JU^{o`sBw5V~AD25pPMJ|dqt zelMC6w!P@k8@~x&Q_Pp3RXxIANSfAMRnls-;z=p{YtpZnX%}Hu01Ej^)3ATlWpC$I zn5VG4W9#9M^4$ivwHrg<8a}OFs`TS2zha$ct6*pji%_1xOY}vtAHJbeX{)@b0xT)K zx{G);J?($pS3lCq0rn**H9*FK-9P$%^j^??xg#3FtyKCuijf)DJ`mGOFZ|p;Q&M`D zzJBu@E(R~MxlrU#@3&2JSZ=1ew=0@kI8|Pz^H5BnFkffOco8-{W(`i6*AtSR|84$A z6|9oZZ4g7&DADCd`z7DEy3AraOPqc(9WuK&PD(;gm4ruM#OIBd!*)%VS^6=TO#*Mc z2FcHJTS&iRf{EvPu5;`*xJI<94)IV_u5?y?dorD zP*XRj`xWCwzSPWSq>cGGIdUo~9V`2_<$)>p%=-j%{zn4MzDGfvHmKZ^oszx^-V?MLA3rI&GHKavbEcaxtPf2%=) zLiwmr+?1W~$<3ECjBaJcUQbsKX^K+HzJ|q<919L~cjV04I~;)zCHIymG8`EdfZ?hw z1mRC`6M@|_)ACDO?$wT72h#Rq39#b#W{(1VAHT!jXB|3Jm@?8wgppE3;73+&v+f1z6|H}F4FEYe7(_>*spA(DxJrA#j@ao zBs8<9ZgH^#QydA(td6cMQF{*gb+&ZZo~BPwLsisedvV`YKxn$|b=1y8rIy9?64Kcu z-}O)kQ)K&CWDqv!EOLg;g@#qoqxt7S;9M?a<{BrJb^l0e>DVLt1)v%K9O`35LmfJ_k$_S#5YBebNGrZc@=SP@>Vk zDBQdgEW_c?yzRM=CC*w$hfR;z3M1CMnKzR@$Sv5*Ep)i9zdd}lY4sN%yR0J0|>=poT_het@x56_|>3r_^2_R{%5Wtjm943}vU_eQ$Zdm7kCdmvl78RfY#weT6m84 z@)4FyV2fitbAtCG`bj{id{|wU-u5%uW$~v+q+ENfuM0{nsW9yZ!TUg;?bQ5^o(4vH z_Ei*gBq=K(y!rn!%75}A43=}B0CwQxNUpF3a59dn6Q#l>+dN!N%65mR|@J4O6EOy6}QY#1KnKEaY>A``xtK-Sb_C|~p(Qgs10?uu2uJrPEl zCiBahr8GNxRT^^}W0*6SnC$v4>P&H}t}G;65p*GW>R;Ev+K}S3hW|C-)1kAhtC#*&p)Pp$L?>~^ZbFu zjeh?0Y!+-f*Huf8q6l|JDgwQYkSteaI|r{sG{znmE?1&RKSef5NPTMtosjsF?!s@n zUKNI{EB2afW=Qy9;S1qX#^cUniHkLxXGJ-vY;=&oQqlF8>MfO2E5g(`@{@(I7# z)5h=f0_wUXH^a)(5hLxQPY9DwJa6uf!rQD7$Tt3S>Y!yiu)352(2lpeevriF$)z8M zGwx@in@kdSu>lm<*j^BTT!`oO&+BhSimAk}J#ODP7G!ZgzV4fUHRoz4TCJ+O+17wP z*bj3$`@XKYM(T8Xqo+wmfR=LB*DfZL{2wm=$1 zlH$K|9zx5Je4ptT_~8f>_dWgAAx1#L;kQ`+;@fpMFAoInl<83`SO9J?xPHnqtqS)& zk(iX!q{1hPqYv|(L~fsFgDj$;P14yXO%Etfo9Yl3uI(jrlTW74?$m7JIsl%r5O8@a z;BMu*HqwNpr_VKYF?hQ=rgi)L6$Lu(4Kbx|>6va(?QDN;W*#T=so(6d!JKBp!DK-u zO>4gHlJnz83Oq2;1rM%wkz*GAP0XBVhHCks9q%y=>M~oCfKKCYDD|%|#wYIaPC=Hf zUu+OLfKNUtlt^7Er^`zrpRi5&NZ}Q@Gj6|NJ_>0B`1}qB#`1KP9x!s81Ane0QD_)x z<;bPi_LVB~^=F^FmNveS`pcfCJE|t~4$YNJ;Q30xyNlg#0K-vdd}i&ZllVNI7$49& zyg>LF4-r+h@p6uYqR$oRXPj@Ce@J2chHGi$Hzn~aNoooCzzraQG|@adb{utg?<~)G zQ@xOi725q>?Ex1`=U-R%6Z1c)iw~EBa&l>JdO-#=?ipCMf#PhU9Y<)Cz&;B}X07ku z`(dX~HpX{ev8Xk&GZ+*8qN+o#{Gk2uQaK5!X@XXkshdFZ%h=Jy6i+}dK{-`qrko^i( zYP8Ca>LQn@CArbWwA#1)a=yn$^7RK^ggu()N3d420FS~csYy~tvXrs= zYFbcI2P=Rbl!%ClxPO$WlL36=_Nsc(xyWy*;6#-qLpzQs#R2ypoEX&6BlzZs(81-wf14!^uUwmjC@sdp$TQS6Ci4u7yw<`n`H;`xR0<& zcQELgYq=hFs1}!s)Ot~u_K4!3!ou$6VK{Tes>l=N4cpMe^y?pRO5#v?l!HZy_dcl3vjO;IE(h;XHVyk=mP(T$j*%33vqgMAe;g>N?rI1t5S zJy|Y$yE5zexnk6-pP*Jd^_pK)4gs0)0pQE`-*2z8zR8EBtUT)>W(iN1ZzpXZh>kcC zia+bYsMjjNBAl|1S}NtnK-f;#>KrYkR{Ul~8Lsyvq;E&A_(P40&By8cL%8WD+wZOW z!}aQ{bkW&%UoMVE`Fw`%#|gswI%rNn4O6`bUtnLvRqJ1CA)OGx#~INNP5>n~1)a7K z>W(!QVP9RqmDf)+dk5h^mi9Lh7V37eR`{kKZ_kf{eGjrzbqfvZe*_KPx z(oN07TOCjJ<~;JQsyQS#iO%u2>2!p6=W;sESfj9o)Ntl^AI+P6y6EU7mrt z3apAnXYgWe3)lnY%e3~D2}x_h6RY7&0swWLWZ;e9`*UHBkF&bXA_y>a{nAomJILxw)=Pyg+9?DCt2a(-MZTqS{^Fay;U z!l}_G42m8suE(Md3(|Zl($;HRQv?Y#K|NzhtZOcMBRF(PEaSrV@x7muPWiL3>9W{{ zOO?AjF(M(B-rq{IS;)QLxg1oy#sU~P`#vp)s@^_~4C?lY^k9v<0pZ{@rIqlR7yd(mRyDo!R@a^{Z1C_<9_#~Hn zqg=lY=wNM;0$^-(oD?T&jB8ma)h5~#6||nvK_SKpgA)~>F9oNt2LLBc640h~7~?E} z?21EQv9=@Khs;UXL#SEI6e*Jks>$V;e#y_B@XJW75Hf078z9BrZLNl)_2F2{Dpd7I z^q2e`|Ls{k>LX7X#f?ppMp|ijLd6nh%*e_7{M)53W|MYVWlW#du}PeRU6Mfh6d(=d zOwJ%{P4wk^;y<%qA2a(uN^aS5C~B_0K#~%giB-G-W7&R-$;wm1kW!aIas$HQhs^*m Z;3kIsa`p8e0e^lx>1r8jmZ@W7{tM%!U|j$J literal 0 HcmV?d00001 diff --git a/examples/textures/sprite1.png b/examples/textures/sprite1.png new file mode 100644 index 0000000000000000000000000000000000000000..d78fbbe3ea394b57f06ba087c663ef19d2cac903 GIT binary patch literal 7349 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 literal 0 HcmV?d00001 diff --git a/examples/webgl_sprites.html b/examples/webgl_sprites.html index 7912528b..e3eddbcf 100644 --- a/examples/webgl_sprites.html +++ b/examples/webgl_sprites.html @@ -51,14 +51,14 @@ var amount = 200; var radius = 500; - var mapA = ImageUtils.loadTexture( "textures/sprite0.jpg" ); - var mapB = ImageUtils.loadTexture( "textures/sprite1.jpg" ); + var mapA = ImageUtils.loadTexture( "textures/sprite0.png" ); + var mapB = ImageUtils.loadTexture( "textures/sprite1.png" ); nodeA = new THREE.Mesh( new Cube( 10, 10, 10 ), new THREE.MeshLambertMaterial( { color: 0xff0000 } )); for( var a = 0; a < amount; a++ ) { - var sprite = new THREE.Sprite( { map: mapA, useScreenCoordinates: false, mergeWith3D: false, blending: THREE.AdditiveBlending } ); + var sprite = new THREE.Sprite( { map: mapA, useScreenCoordinates: false } ); sprite.position.set( Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5 ); diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index d544c877..fe738ec6 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -3344,6 +3344,27 @@ THREE.WebGLRenderer = function ( parameters ) { _gl.activeTexture( _gl.TEXTURE0 ); _gl.uniform1i( uniforms.map, 0 ); + // update positions and sort + + for( o = 0, ol = scene.__webglSprites.length; o < ol; o++ ) { + + object = scene.__webglSprites[ o ]; + + if( !object.useScreenCoordinates ) { + + object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray ); + object.z = -object._modelViewMatrix.n34; + + } else { + + object.z = -object.position.z; + + } + + } + + scene.__webglSprites.sort( painterSort ); + // render all non-custom shader sprites @@ -3365,7 +3386,6 @@ THREE.WebGLRenderer = function ( parameters ) { } else { - object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray ); _gl.uniform1i( uniforms.useScreenCoordinates, 0 ); _gl.uniform1i( uniforms.affectedByDistance, object.affectedByDistance ? 1 : 0 ); @@ -3394,12 +3414,13 @@ THREE.WebGLRenderer = function ( parameters ) { } else if( !object.mergeWith3D && mergeWith3D ) { _gl.disable( _gl.DEPTH_TEST ); - _gl.depthMask( false ); + _gl.depthMask( object.blending === THREE.NormalBlending ? true : false ); mergeWith3D = false; } + _gl.depthMask( true ); setBlending( object.blending ); setTexture( object.map, 0 ); @@ -3515,17 +3536,16 @@ THREE.WebGLRenderer = function ( parameters ) { // screen cull - if( _lensFlare.hasVertexTexture || - ( screenPositionPixels[ 0 ] > 0 && + //if( _lensFlare.hasVertexTexture || + if( screenPositionPixels[ 0 ] > 0 && screenPositionPixels[ 0 ] < _viewportWidth && screenPositionPixels[ 1 ] > 0 && - screenPositionPixels[ 1 ] < _viewportHeight )) { + screenPositionPixels[ 1 ] < _viewportHeight ) { // save current RGB to temp texture _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); - //_gl.copyTexSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16 ); _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16, 0 ); @@ -3544,7 +3564,6 @@ THREE.WebGLRenderer = function ( parameters ) { // copy result to occlusionMap _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture ); - //_gl.copyTexSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16 ); _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16, 0 ); diff --git a/src/renderers/WebGLShaders.js b/src/renderers/WebGLShaders.js index fbc2b276..e42034b0 100644 --- a/src/renderers/WebGLShaders.js +++ b/src/renderers/WebGLShaders.js @@ -593,22 +593,17 @@ THREE.ShaderLib = { "if( renderType == 2 ) {", - "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )) +", - "texture2D( occlusionMap, vec2( 0.5, 0.1 )) +", - "texture2D( occlusionMap, vec2( 0.9, 0.1 )) +", - "texture2D( occlusionMap, vec2( 0.9, 0.5 )) +", - "texture2D( occlusionMap, vec2( 0.9, 0.9 )) +", - "texture2D( occlusionMap, vec2( 0.5, 0.9 )) +", - "texture2D( occlusionMap, vec2( 0.1, 0.9 )) +", - "texture2D( occlusionMap, vec2( 0.1, 0.5 )) +", - "texture2D( occlusionMap, vec2( 0.5, 0.5 ));", + "float visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )).a +", + "texture2D( occlusionMap, vec2( 0.5, 0.1 )).a +", + "texture2D( occlusionMap, vec2( 0.9, 0.1 )).a +", + "texture2D( occlusionMap, vec2( 0.9, 0.5 )).a +", + "texture2D( occlusionMap, vec2( 0.9, 0.9 )).a +", + "texture2D( occlusionMap, vec2( 0.5, 0.9 )).a +", + "texture2D( occlusionMap, vec2( 0.1, 0.9 )).a +", + "texture2D( occlusionMap, vec2( 0.1, 0.5 )).a +", + "texture2D( occlusionMap, vec2( 0.5, 0.5 )).a;", - "vVisibility = ( visibility.r / 9.0 ) *", - "( 1.0 - visibility.g / 9.0 ) *", - "( visibility.b / 9.0 ) *", - "( 1.0 - visibility.a / 9.0 );", - -// "vVisibility = ( 1.0 - visibility.a / 9.0 );", + "vVisibility = ( 1.0 - visibility / 9.0 );", "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", @@ -638,8 +633,8 @@ THREE.ShaderLib = { "if( renderType == 0 ) {", -// "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", - "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", +// "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", // restore From d87224face21a379b8d22523b764b39321e5e376 Mon Sep 17 00:00:00 2001 From: Mikael Emtinger Date: Thu, 7 Apr 2011 18:12:12 +0200 Subject: [PATCH 4/7] Put back the pink square method to allow for partial screen border occlusion in opengl --- src/renderers/WebGLRenderer.js | 6 +++--- src/renderers/WebGLShaders.js | 26 ++++++++++++++------------ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index fe738ec6..29163aa1 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -3536,11 +3536,11 @@ THREE.WebGLRenderer = function ( parameters ) { // screen cull - //if( _lensFlare.hasVertexTexture || - if( screenPositionPixels[ 0 ] > 0 && + if( _lensFlare.hasVertexTexture || + ( screenPositionPixels[ 0 ] > 0 && screenPositionPixels[ 0 ] < _viewportWidth && screenPositionPixels[ 1 ] > 0 && - screenPositionPixels[ 1 ] < _viewportHeight ) { + screenPositionPixels[ 1 ] < _viewportHeight )) { // save current RGB to temp texture diff --git a/src/renderers/WebGLShaders.js b/src/renderers/WebGLShaders.js index e42034b0..98e002ad 100644 --- a/src/renderers/WebGLShaders.js +++ b/src/renderers/WebGLShaders.js @@ -593,17 +593,20 @@ THREE.ShaderLib = { "if( renderType == 2 ) {", - "float visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )).a +", - "texture2D( occlusionMap, vec2( 0.5, 0.1 )).a +", - "texture2D( occlusionMap, vec2( 0.9, 0.1 )).a +", - "texture2D( occlusionMap, vec2( 0.9, 0.5 )).a +", - "texture2D( occlusionMap, vec2( 0.9, 0.9 )).a +", - "texture2D( occlusionMap, vec2( 0.5, 0.9 )).a +", - "texture2D( occlusionMap, vec2( 0.1, 0.9 )).a +", - "texture2D( occlusionMap, vec2( 0.1, 0.5 )).a +", - "texture2D( occlusionMap, vec2( 0.5, 0.5 )).a;", + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )) +", + "texture2D( occlusionMap, vec2( 0.5, 0.1 )) +", + "texture2D( occlusionMap, vec2( 0.9, 0.1 )) +", + "texture2D( occlusionMap, vec2( 0.9, 0.5 )) +", + "texture2D( occlusionMap, vec2( 0.9, 0.9 )) +", + "texture2D( occlusionMap, vec2( 0.5, 0.9 )) +", + "texture2D( occlusionMap, vec2( 0.1, 0.9 )) +", + "texture2D( occlusionMap, vec2( 0.1, 0.5 )) +", + "texture2D( occlusionMap, vec2( 0.5, 0.5 ));", - "vVisibility = ( 1.0 - visibility / 9.0 );", + "vVisibility = ( visibility.r / 9.0 ) *", + "( 1.0 - visibility.g / 9.0 ) *", + "( visibility.b / 9.0 ) *", + "( 1.0 - visibility.a / 9.0 );", "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", @@ -633,8 +636,7 @@ THREE.ShaderLib = { "if( renderType == 0 ) {", - "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", -// "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", // restore From 3379648153d45bb7c2a393cbeed921f8b655a874 Mon Sep 17 00:00:00 2001 From: Mikael Emtinger Date: Thu, 7 Apr 2011 18:12:29 +0200 Subject: [PATCH 5/7] ...forgot file. --- build/Three.js | 122 ++++++++++++++++++++++++------------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/build/Three.js b/build/Three.js index 1e19001c..cbd1654c 100755 --- a/build/Three.js +++ b/build/Three.js @@ -215,7 +215,7 @@ default_vertex:"#ifndef USE_MORPHTARGETS\n#ifndef USE_SKINNING\ngl_Position = pr THREE.UniformsLib={common:{diffuse:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},map:{type:"t",value:0,texture:null},lightMap:{type:"t",value:2,texture:null},envMap:{type:"t",value:1,texture:null},useRefract:{type:"i",value:0},reflectivity:{type:"f",value:1},refractionRatio:{type:"f",value:0.98},combine:{type:"i",value:0},fogDensity:{type:"f",value:2.5E-4},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2E3},fogColor:{type:"c",value:new THREE.Color(16777215)},morphTargetInfluences:{type:"f", value:0}},lights:{enableLighting:{type:"i",value:1},ambientLightColor:{type:"fv",value:[]},directionalLightDirection:{type:"fv",value:[]},directionalLightColor:{type:"fv",value:[]},pointLightColor:{type:"fv",value:[]},pointLightPosition:{type:"fv",value:[]},pointLightDistance:{type:"fv1",value:[]}},particle:{psColor:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},size:{type:"f",value:1},scale:{type:"f",value:1},map:{type:"t",value:0,texture:null},fogDensity:{type:"f",value:2.5E-4}, fogNear:{type:"f",value:1},fogFar:{type:"f",value:2E3},fogColor:{type:"c",value:new THREE.Color(16777215)}}}; -THREE.ShaderLib={lensFlareVertexTexture:{vertexShader:"uniform \tvec3 \tscreenPosition;\nuniform\tvec2\tscale;\nuniform\tfloat\trotation;\nuniform int renderType;\nuniform\tsampler2D\tocclusionMap;\nattribute \tvec2 \tposition;\nattribute vec2\tUV;\nvarying\tvec2\tvUV;\nvarying\tfloat\tvVisibility;\nvoid main(void)\n{\nvUV = UV;\nvec2 pos = position;\nif( renderType == 2 ) {\nfloat visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.5 )).a;\nvVisibility = ( 1.0 - visibility / 9.0 );\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",fragmentShader:"#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tfloat\t\topacity;\nuniform int renderType;\nvarying\tvec2\t\tvUV;\nvarying\tfloat\t\tvVisibility;\nvoid main( void )\n{\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity * vVisibility;\ngl_FragColor = color;\n}\n}"}, +THREE.ShaderLib={lensFlareVertexTexture:{vertexShader:"uniform \tvec3 \tscreenPosition;\nuniform\tvec2\tscale;\nuniform\tfloat\trotation;\nuniform int renderType;\nuniform\tsampler2D\tocclusionMap;\nattribute \tvec2 \tposition;\nattribute vec2\tUV;\nvarying\tvec2\tvUV;\nvarying\tfloat\tvVisibility;\nvoid main(void)\n{\nvUV = UV;\nvec2 pos = position;\nif( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.1, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ));\nvVisibility = ( visibility.r / 9.0 ) *\n( 1.0 - visibility.g / 9.0 ) *\n( visibility.b / 9.0 ) *\n( 1.0 - visibility.a / 9.0 );\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",fragmentShader:"#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tfloat\t\topacity;\nuniform int renderType;\nvarying\tvec2\t\tvUV;\nvarying\tfloat\t\tvVisibility;\nvoid main( void )\n{\nif( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity * vVisibility;\ngl_FragColor = color;\n}\n}"}, lensFlare:{vertexShader:"uniform \tvec3 \tscreenPosition;\nuniform\tvec2\tscale;\nuniform\tfloat\trotation;\nuniform int renderType;\nattribute \tvec2 \tposition;\nattribute vec2\tUV;\nvarying\tvec2\tvUV;\nvoid main(void)\n{\nvUV = UV;\nvec2 pos = position;\nif( renderType == 2 ) {\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}", fragmentShader:"#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tsampler2D\tocclusionMap;\nuniform\tfloat\t\topacity;\nuniform int renderType;\nvarying\tvec2\t\tvUV;\nvoid main( void )\n{\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 )).a;\nvisibility = ( 1.0 - visibility / 4.0 );\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity * visibility;\ngl_FragColor = color;\n}\n}"}, sprite:{vertexShader:"uniform\tint\t\tuseScreenCoordinates;\nuniform int affectedByDistance;\nuniform\tvec3\tscreenPosition;\nuniform \tmat4 \tmodelViewMatrix;\nuniform \tmat4 \tprojectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 alignment;\nuniform vec2 uvOffset;\nuniform\tvec2 uvScale;\nattribute \tvec2 \tposition;\nattribute vec2\tuv;\nvarying\tvec2\tvUV;\nvoid main(void)\n{\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position + alignment;\nvec2 rotatedPosition;\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\nvec4 finalPosition;\nif( useScreenCoordinates != 0 ) {\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\n} else {\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\n}\ngl_Position = finalPosition;\n}", @@ -264,66 +264,66 @@ else{z._modelViewMatrix.multiplyToArray(B.matrixWorldInverse,z.matrixWorld,z._mo z.affectedByDistance?1:0);e.uniformMatrix4fv(J.modelViewMatrix,!1,z._modelViewMatrixArray)}E=z.map.image.width/(z.affectedByDistance?1:ja);P[0]=E*L*z.scale.x;P[1]=E*z.scale.y;e.uniform2f(J.uvScale,z.uvScale.x,z.uvScale.y);e.uniform2f(J.uvOffset,z.uvOffset.x,z.uvOffset.y);e.uniform2f(J.alignment,z.alignment.x,z.alignment.y);e.uniform1f(J.opacity,z.opacity);e.uniform1f(J.rotation,z.rotation);e.uniform2fv(J.scale,P);if(z.mergeWith3D&&!I){e.enable(e.DEPTH_TEST);e.depthMask(!0);I=!0}else if(!z.mergeWith3D&& I){e.disable(e.DEPTH_TEST);e.depthMask(z.blending===THREE.NormalBlending?!0:!1);I=!1}e.depthMask(!0);N(z.blending);R(z.map,0);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function G(m,B){var x,u,z=m.__webglLensFlares.length,J,L,E,P=new THREE.Vector3,F=ja/ia,M=ia*0.5,I=ja*0.5,X=16/ja,U=[X*F,X],ya=[1,1,0],va=[1,1],ra=fa.uniforms;x=fa.attributes;e.useProgram(fa.program);xa=fa.program;ga="";e.uniform1i(ra.occlusionMap,0);e.uniform1i(ra.map, 1);e.bindBuffer(e.ARRAY_BUFFER,fa.vertexBuffer);e.vertexAttribPointer(x.vertex,2,e.FLOAT,!1,16,0);e.vertexAttribPointer(x.uv,2,e.FLOAT,!1,16,8);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,fa.elementBuffer);e.disable(e.CULL_FACE);e.depthMask(!1);e.activeTexture(e.TEXTURE0);e.bindTexture(e.TEXTURE_2D,fa.occlusionTexture);e.activeTexture(e.TEXTURE1);for(u=0;u0&&va[0]0&&va[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;X=E.size*E.scale/ja;U[0]=X*F;U[1]=X;e.uniform3fv(ra.screenPosition, -ya);e.uniform2fv(ra.scale,U);e.uniform1f(ra.rotation,E.rotation);e.uniform1f(ra.opacity,E.opacity);N(E.blending);R(E.texture,1);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function H(m,B){m._modelViewMatrix.multiplyToArray(B.matrixWorldInverse,m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function K(m){var B,x,u,z,J;if(m instanceof THREE.Mesh){x=m.geometry; -for(B in x.geometryGroups){u=x.geometryGroups[B];J=!1;for(z in u.__webglCustomAttributes)if(u.__webglCustomAttributes[z].needsUpdate){J=!0;break}if(x.__dirtyVertices||x.__dirtyMorphTargets||x.__dirtyElements||x.__dirtyUvs||x.__dirtyNormals||x.__dirtyColors||x.__dirtyTangents||J){J=e.DYNAMIC_DRAW;var L=void 0,E=void 0,P=void 0,F=void 0;P=void 0;var M=void 0,I=void 0,X=void 0,U=void 0,ya=void 0,va=void 0,ra=void 0,Na=void 0,Sa=void 0,Ka=void 0,Ja=void 0,Ia=void 0,Wa=void 0;I=void 0;X=void 0;F=void 0; -U=void 0;F=void 0;var D=void 0,aa=void 0;I=void 0;D=void 0;aa=void 0;var t=void 0,bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;F=void 0;U=void 0;M=void 0;P=void 0;P=void 0;D=void 0;aa=void 0;t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;aa=D=0;var La=u.__vertexArray,V=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,Y=u.__tangentArray,Ca=u.__colorArray,qa=u.__skinVertexAArray,ha=u.__skinVertexBArray, -Q=u.__skinIndexArray,Ea=u.__skinWeightArray,ib=u.__morphTargetsArrays,Ya=u.__webglCustomAttributes;t=void 0;var Za=u.__faceArray,db=u.__lineArray,jb=u.__needsSmoothNormals;va=u.__vertexColorType;ya=u.__uvType;ra=u.__normalType;var Ua=m.geometry,sb=Ua.__dirtyVertices,tb=Ua.__dirtyElements,rb=Ua.__dirtyUvs,ub=Ua.__dirtyNormals,vb=Ua.__dirtyTangents,wb=Ua.__dirtyColors,xb=Ua.__dirtyMorphTargets,nb=Ua.vertices,yb=u.faces,Bb=Ua.faces,zb=Ua.faceVertexUvs[0],Ab=Ua.faceVertexUvs[1],ob=Ua.skinVerticesA,pb= -Ua.skinVerticesB,qb=Ua.skinIndices,lb=Ua.skinWeights,mb=Ua.edgeFaces,kb=Ua.morphTargets;if(Ya)for(eb in Ya){Ya[eb].offset=0;Ya[eb].offsetSrc=0}L=0;for(E=yb.length;L0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER,Ca,J)}if(ub){e.bindBuffer(e.ARRAY_BUFFER,u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,J)}if(vb&& -Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,Y,J)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER,V,J)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,J)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,J);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,db,J)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER, -u.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,qa,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ha,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinIndicesBuffer);e.bufferData(e.ARRAY_BUFFER,Q,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,Ea,J)}}}x.__dirtyVertices=!1;x.__dirtyMorphTargets=!1;x.__dirtyElements=!1;x.__dirtyUvs=!1;x.__dirtyNormals=!1;x.__dirtyTangents=!1;x.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){x= -m.geometry;if(x.__dirtyVertices||x.__dirtyColors){m=x;B=e.DYNAMIC_DRAW;va=m.vertices;u=m.colors;ra=va.length;J=u.length;Na=m.__vertexArray;L=m.__colorArray;Sa=m.__dirtyColors;if(m.__dirtyVertices){for(E=0;E65535){M[P].counter+=1;F=M[P].hash+"_"+M[P].counter;m.geometryGroups[F]==undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z); -m.geometryGroups[F].vertices+=L}}function A(m,B,x){m.push({buffer:B,object:x,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function N(m){if(m!=ga){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD, -e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}ga=m}}function O(m,B,x){if((x.width&x.width-1)==0&&(x.height&x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,ca(B.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,ca(B.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,ca(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ca(B.minFilter));e.generateMipmap(m)}else{e.texParameteri(m,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE); -e.texParameteri(m,e.TEXTURE_MAG_FILTER,ua(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ua(B.minFilter))}}function R(m,B){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null); -m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+B);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function Fa(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer===undefined)m.depthBuffer=!0;if(m.stencilBuffer===undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer();m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,ca(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T, -ca(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,ca(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,ca(m.minFilter));e.texImage2D(e.TEXTURE_2D,0,ca(m.format),m.width,m.height,0,ca(m.format),ca(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,m.__webglTexture,0);if(m.depthBuffer&&!m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER, -e.DEPTH_COMPONENT16,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else if(m.depthBuffer&&m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,m.width,m.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER, -null)}var B,x;if(m){B=m.__webglFramebuffer;x=m.width;m=m.height}else{B=null;x=ia;m=ja}if(B!=Ha){e.bindFramebuffer(e.FRAMEBUFFER,B);e.viewport(la,Ga,x,m);Ha=B}}function ka(m,B){var x;if(m=="fragment")x=e.createShader(e.FRAGMENT_SHADER);else m=="vertex"&&(x=e.createShader(e.VERTEX_SHADER));e.shaderSource(x,B);e.compileShader(x);if(!e.getShaderParameter(x,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(x));console.error(B);return null}return x}function ua(m){switch(m){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST; -default:return e.LINEAR}}function ca(m){switch(m){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST;case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR; -case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT;case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT;case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0} -var e,ea=document.createElement("canvas"),Aa=[],xa=null,Ha=null,oa=!0,da=this,pa=null,Ba=null,ga=null,$=null,la=0,Ga=0,ia=0,ja=0,ta=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Ra=new THREE.Matrix4,$a=new Float32Array(16),ab=new Float32Array(16),Oa=new THREE.Vector4,S={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},Z=!0,ma=!0,Da=new THREE.Color(0),Ma=0;if(b){if(b.stencil!= -undefined)Z=b.stencil;if(b.antialias!==undefined)ma=b.antialias;b.clearColor!==undefined&&Da.setHex(b.clearColor);if(b.clearAlpha!==undefined)Ma=b.clearAlpha}this.maxMorphTargets=8;this.domElement=ea;this.autoClear=!0;this.sortObjects=!0;(function(m,B,x,u){try{if(!(e=ea.getContext("experimental-webgl",{antialias:m,stencil:u})))throw"Error creating WebGL context.";}catch(z){console.error(z)}e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);e.cullFace(e.BACK); -e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.clearColor(B.r,B.g,B.b,x)})(ma,Da,Ma,Z);this.context=e;if(Z){var wa={};wa.vertices=new Float32Array(12);wa.faces=new Uint16Array(6);wa.darkness=0.5;wa.vertices[0]=-20;wa.vertices[1]=-20;wa.vertices[2]=-1;wa.vertices[3]=20;wa.vertices[4]=-20;wa.vertices[5]=-1;wa.vertices[6]=20;wa.vertices[7]=20;wa.vertices[8]=-1;wa.vertices[9]=-20;wa.vertices[10]=20;wa.vertices[11]=-1;wa.faces[0]=0; -wa.faces[1]=1;wa.faces[2]=2;wa.faces[3]=0;wa.faces[4]=2;wa.faces[5]=3;wa.vertexBuffer=e.createBuffer();wa.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,wa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,wa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,wa.faces,e.STATIC_DRAW);wa.program=e.createProgram();e.attachShader(wa.program,ka("fragment",THREE.ShaderLib.shadowPost.fragmentShader));e.attachShader(wa.program,ka("vertex", -THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(wa.program);wa.vertexLocation=e.getAttribLocation(wa.program,"position");wa.projectionLocation=e.getUniformLocation(wa.program,"projectionMatrix");wa.darknessLocation=e.getUniformLocation(wa.program,"darkness")}var fa={};fa.vertices=new Float32Array(16);fa.faces=new Uint16Array(6);b=0;fa.vertices[b++]=-1;fa.vertices[b++]=-1;fa.vertices[b++]=0;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]= -1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]=1;b=0;fa.faces[b++]=0;fa.faces[b++]=1;fa.faces[b++]=2;fa.faces[b++]=0;fa.faces[b++]=2;fa.faces[b++]=3;fa.vertexBuffer=e.createBuffer();fa.elementBuffer=e.createBuffer();fa.tempTexture=e.createTexture();fa.occlusionTexture=e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,fa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,fa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, -fa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,fa.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,fa.tempTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.bindTexture(e.TEXTURE_2D,fa.occlusionTexture);e.texImage2D(e.TEXTURE_2D, -0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){fa.hasVertexTexture=!1;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(fa.program, -ka("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{fa.hasVertexTexture=!0;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(fa.program);fa.attributes={};fa.uniforms={};fa.attributes.vertex=e.getAttribLocation(fa.program,"position");fa.attributes.uv=e.getAttribLocation(fa.program,"UV");fa.uniforms.renderType=e.getUniformLocation(fa.program, -"renderType");fa.uniforms.map=e.getUniformLocation(fa.program,"map");fa.uniforms.occlusionMap=e.getUniformLocation(fa.program,"occlusionMap");fa.uniforms.opacity=e.getUniformLocation(fa.program,"opacity");fa.uniforms.scale=e.getUniformLocation(fa.program,"scale");fa.uniforms.rotation=e.getUniformLocation(fa.program,"rotation");fa.uniforms.screenPosition=e.getUniformLocation(fa.program,"screenPosition");_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]= --1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer= -e.createBuffer();_sprite.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,_sprite.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,_sprite.faces,e.STATIC_DRAW);_sprite.program=e.createProgram();e.attachShader(_sprite.program,ka("fragment",THREE.ShaderLib.sprite.fragmentShader));e.attachShader(_sprite.program,ka("vertex",THREE.ShaderLib.sprite.vertexShader));e.linkProgram(_sprite.program); -_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=e.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=e.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=e.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=e.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=e.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=e.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment= -e.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map=e.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=e.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=e.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=e.getUniformLocation(_sprite.program,"affectedByDistance");_sprite.uniforms.screenPosition=e.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix= -e.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix=e.getUniformLocation(_sprite.program,"projectionMatrix");this.setSize=function(m,B){ea.width=m;ea.height=B;this.setViewport(0,0,ea.width,ea.height)};this.setViewport=function(m,B,x,u){la=m;Ga=B;ia=x;ja=u;e.viewport(la,Ga,ia,ja)};this.setScissor=function(m,B,x,u){e.scissor(m,B,x,u)};this.enableScissorTest=function(m){m?e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=function(m){oa= -m;e.depthMask(m)};this.setClearColorHex=function(m,B){var x=new THREE.Color(m);e.clearColor(x.r,x.g,x.b,B)};this.setClearColor=function(m,B){e.clearColor(m.r,m.g,m.b,B)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(m){wa.darkness=m};this.initMaterial=function(m,B,x,u){var z,J,L;if(m instanceof THREE.MeshDepthMaterial)L="depth";else if(m instanceof THREE.ShadowVolumeDynamicMaterial)L="shadowVolumeDynamic";else if(m instanceof -THREE.MeshNormalMaterial)L="normal";else if(m instanceof THREE.MeshBasicMaterial)L="basic";else if(m instanceof THREE.MeshLambertMaterial)L="lambert";else if(m instanceof THREE.MeshPhongMaterial)L="phong";else if(m instanceof THREE.LineBasicMaterial)L="basic";else m instanceof THREE.ParticleBasicMaterial&&(L="particle_basic");if(L){var E=THREE.ShaderLib[L];m.uniforms=Uniforms.clone(E.uniforms);m.vertexShader=E.vertexShader;m.fragmentShader=E.fragmentShader}var P,F,M;P=M=E=0;for(F=B.length;P0?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+x.maxDirLights,"#define MAX_POINT_LIGHTS "+x.maxPointLights,"#define MAX_BONES "+x.maxBones,x.map?"#define USE_MAP":"",x.envMap?"#define USE_ENVMAP":"",x.lightMap?"#define USE_LIGHTMAP":"",x.vertexColors? -"#define USE_COLOR":"",x.skinning?"#define USE_SKINNING":"",x.morphTargets?"#define USE_MORPHTARGETS":"",x.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n"); +ya[0]=P.x;ya[1]=P.y;ya[2]=P.z;va[0]=ya[0]*M+M;va[1]=ya[1]*I+I;if(fa.hasVertexTexture||va[0]>0&&va[0]0&&va[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;X=E.size*E.scale/ja;U[0]= +X*F;U[1]=X;e.uniform3fv(ra.screenPosition,ya);e.uniform2fv(ra.scale,U);e.uniform1f(ra.rotation,E.rotation);e.uniform1f(ra.opacity,E.opacity);N(E.blending);R(E.texture,1);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(oa)}function H(m,B){m._modelViewMatrix.multiplyToArray(B.matrixWorldInverse,m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function K(m){var B, +x,u,z,J;if(m instanceof THREE.Mesh){x=m.geometry;for(B in x.geometryGroups){u=x.geometryGroups[B];J=!1;for(z in u.__webglCustomAttributes)if(u.__webglCustomAttributes[z].needsUpdate){J=!0;break}if(x.__dirtyVertices||x.__dirtyMorphTargets||x.__dirtyElements||x.__dirtyUvs||x.__dirtyNormals||x.__dirtyColors||x.__dirtyTangents||J){J=e.DYNAMIC_DRAW;var L=void 0,E=void 0,P=void 0,F=void 0;P=void 0;var M=void 0,I=void 0,X=void 0,U=void 0,ya=void 0,va=void 0,ra=void 0,Na=void 0,Sa=void 0,Ka=void 0,Ja=void 0, +Ia=void 0,Wa=void 0;I=void 0;X=void 0;F=void 0;U=void 0;F=void 0;var D=void 0,aa=void 0;I=void 0;D=void 0;aa=void 0;var t=void 0,bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;bb=void 0;D=void 0;aa=void 0;t=void 0;F=void 0;U=void 0;M=void 0;P=void 0;P=void 0;D=void 0;aa=void 0;t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;aa=D=0;var La=u.__vertexArray,V=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,Y=u.__tangentArray,Ca=u.__colorArray,qa= +u.__skinVertexAArray,ha=u.__skinVertexBArray,Q=u.__skinIndexArray,Ea=u.__skinWeightArray,ib=u.__morphTargetsArrays,Ya=u.__webglCustomAttributes;t=void 0;var Za=u.__faceArray,db=u.__lineArray,jb=u.__needsSmoothNormals;va=u.__vertexColorType;ya=u.__uvType;ra=u.__normalType;var Ua=m.geometry,sb=Ua.__dirtyVertices,tb=Ua.__dirtyElements,rb=Ua.__dirtyUvs,ub=Ua.__dirtyNormals,vb=Ua.__dirtyTangents,wb=Ua.__dirtyColors,xb=Ua.__dirtyMorphTargets,nb=Ua.vertices,yb=u.faces,Bb=Ua.faces,zb=Ua.faceVertexUvs[0], +Ab=Ua.faceVertexUvs[1],ob=Ua.skinVerticesA,pb=Ua.skinVerticesB,qb=Ua.skinIndices,lb=Ua.skinWeights,mb=Ua.edgeFaces,kb=Ua.morphTargets;if(Ya)for(eb in Ya){Ya[eb].offset=0;Ya[eb].offsetSrc=0}L=0;for(E=yb.length;L0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER,Ca,J)}if(ub){e.bindBuffer(e.ARRAY_BUFFER, +u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,J)}if(vb&&Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,Y,J)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER,V,J)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,J)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,J);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglLineBuffer); +e.bufferData(e.ELEMENT_ARRAY_BUFFER,db,J)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,qa,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ha,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinIndicesBuffer);e.bufferData(e.ARRAY_BUFFER,Q,J);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,Ea,J)}}}x.__dirtyVertices=!1;x.__dirtyMorphTargets=!1;x.__dirtyElements=!1;x.__dirtyUvs=!1;x.__dirtyNormals= +!1;x.__dirtyTangents=!1;x.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){x=m.geometry;if(x.__dirtyVertices||x.__dirtyColors){m=x;B=e.DYNAMIC_DRAW;va=m.vertices;u=m.colors;ra=va.length;J=u.length;Na=m.__vertexArray;L=m.__colorArray;Sa=m.__dirtyColors;if(m.__dirtyVertices){for(E=0;E65535){M[P].counter+=1;F=M[P].hash+"_"+M[P].counter;m.geometryGroups[F]== +undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z);m.geometryGroups[F].vertices+=L}}function A(m,B,x){m.push({buffer:B,object:x,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function N(m){if(m!=ga){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD); +e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}ga=m}}function O(m,B,x){if((x.width&x.width-1)==0&&(x.height&x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,ca(B.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,ca(B.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,ca(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ca(B.minFilter));e.generateMipmap(m)}else{e.texParameteri(m, +e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_MAG_FILTER,ua(B.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,ua(B.minFilter))}}function R(m,B){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE, +m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null);m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+B);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function Fa(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer===undefined)m.depthBuffer=!0;if(m.stencilBuffer===undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer();m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D, +e.TEXTURE_WRAP_S,ca(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,ca(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,ca(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,ca(m.minFilter));e.texImage2D(e.TEXTURE_2D,0,ca(m.format),m.width,m.height,0,ca(m.format),ca(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,m.__webglTexture, +0);if(m.depthBuffer&&!m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else if(m.depthBuffer&&m.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,m.width,m.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,m.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,m.width,m.height);e.bindTexture(e.TEXTURE_2D, +null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var B,x;if(m){B=m.__webglFramebuffer;x=m.width;m=m.height}else{B=null;x=ia;m=ja}if(B!=Ha){e.bindFramebuffer(e.FRAMEBUFFER,B);e.viewport(la,Ga,x,m);Ha=B}}function ka(m,B){var x;if(m=="fragment")x=e.createShader(e.FRAGMENT_SHADER);else m=="vertex"&&(x=e.createShader(e.VERTEX_SHADER));e.shaderSource(x,B);e.compileShader(x);if(!e.getShaderParameter(x,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(x));console.error(B); +return null}return x}function ua(m){switch(m){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;default:return e.LINEAR}}function ca(m){switch(m){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST;case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR; +case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT;case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT;case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA; +case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var e,ea=document.createElement("canvas"),Aa=[],xa=null,Ha=null,oa=!0,da=this,pa=null,Ba=null,ga=null,$=null,la=0,Ga=0,ia=0,ja=0,ta=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Ra=new THREE.Matrix4,$a=new Float32Array(16),ab=new Float32Array(16),Oa=new THREE.Vector4, +S={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},Z=!0,ma=!0,Da=new THREE.Color(0),Ma=0;if(b){if(b.stencil!=undefined)Z=b.stencil;if(b.antialias!==undefined)ma=b.antialias;b.clearColor!==undefined&&Da.setHex(b.clearColor);if(b.clearAlpha!==undefined)Ma=b.clearAlpha}this.maxMorphTargets=8;this.domElement=ea;this.autoClear=!0;this.sortObjects=!0;(function(m,B,x,u){try{if(!(e=ea.getContext("experimental-webgl",{antialias:m,stencil:u})))throw"Error creating WebGL context."; +}catch(z){console.error(z)}e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);e.cullFace(e.BACK);e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.clearColor(B.r,B.g,B.b,x)})(ma,Da,Ma,Z);this.context=e;if(Z){var wa={};wa.vertices=new Float32Array(12);wa.faces=new Uint16Array(6);wa.darkness=0.5;wa.vertices[0]=-20;wa.vertices[1]=-20;wa.vertices[2]=-1;wa.vertices[3]=20;wa.vertices[4]= +-20;wa.vertices[5]=-1;wa.vertices[6]=20;wa.vertices[7]=20;wa.vertices[8]=-1;wa.vertices[9]=-20;wa.vertices[10]=20;wa.vertices[11]=-1;wa.faces[0]=0;wa.faces[1]=1;wa.faces[2]=2;wa.faces[3]=0;wa.faces[4]=2;wa.faces[5]=3;wa.vertexBuffer=e.createBuffer();wa.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,wa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,wa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,wa.faces,e.STATIC_DRAW);wa.program= +e.createProgram();e.attachShader(wa.program,ka("fragment",THREE.ShaderLib.shadowPost.fragmentShader));e.attachShader(wa.program,ka("vertex",THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(wa.program);wa.vertexLocation=e.getAttribLocation(wa.program,"position");wa.projectionLocation=e.getUniformLocation(wa.program,"projectionMatrix");wa.darknessLocation=e.getUniformLocation(wa.program,"darkness")}var fa={};fa.vertices=new Float32Array(16);fa.faces=new Uint16Array(6);b=0;fa.vertices[b++]=-1; +fa.vertices[b++]=-1;fa.vertices[b++]=0;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]=1;b=0;fa.faces[b++]=0;fa.faces[b++]=1;fa.faces[b++]=2;fa.faces[b++]=0;fa.faces[b++]=2;fa.faces[b++]=3;fa.vertexBuffer=e.createBuffer();fa.elementBuffer=e.createBuffer();fa.tempTexture=e.createTexture();fa.occlusionTexture= +e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,fa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,fa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,fa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,fa.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,fa.tempTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER, +e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.bindTexture(e.TEXTURE_2D,fa.occlusionTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){fa.hasVertexTexture= +!1;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{fa.hasVertexTexture=!0;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(fa.program);fa.attributes={};fa.uniforms={};fa.attributes.vertex= +e.getAttribLocation(fa.program,"position");fa.attributes.uv=e.getAttribLocation(fa.program,"UV");fa.uniforms.renderType=e.getUniformLocation(fa.program,"renderType");fa.uniforms.map=e.getUniformLocation(fa.program,"map");fa.uniforms.occlusionMap=e.getUniformLocation(fa.program,"occlusionMap");fa.uniforms.opacity=e.getUniformLocation(fa.program,"opacity");fa.uniforms.scale=e.getUniformLocation(fa.program,"scale");fa.uniforms.rotation=e.getUniformLocation(fa.program,"rotation");fa.uniforms.screenPosition= +e.getUniformLocation(fa.program,"screenPosition");_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]= +1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer=e.createBuffer();_sprite.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,_sprite.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,_sprite.faces,e.STATIC_DRAW);_sprite.program=e.createProgram();e.attachShader(_sprite.program, +ka("fragment",THREE.ShaderLib.sprite.fragmentShader));e.attachShader(_sprite.program,ka("vertex",THREE.ShaderLib.sprite.vertexShader));e.linkProgram(_sprite.program);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=e.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=e.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=e.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=e.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation= +e.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=e.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment=e.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map=e.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=e.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=e.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=e.getUniformLocation(_sprite.program, +"affectedByDistance");_sprite.uniforms.screenPosition=e.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix=e.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix=e.getUniformLocation(_sprite.program,"projectionMatrix");this.setSize=function(m,B){ea.width=m;ea.height=B;this.setViewport(0,0,ea.width,ea.height)};this.setViewport=function(m,B,x,u){la=m;Ga=B;ia=x;ja=u;e.viewport(la,Ga,ia,ja)};this.setScissor=function(m,B,x,u){e.scissor(m, +B,x,u)};this.enableScissorTest=function(m){m?e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=function(m){oa=m;e.depthMask(m)};this.setClearColorHex=function(m,B){var x=new THREE.Color(m);e.clearColor(x.r,x.g,x.b,B)};this.setClearColor=function(m,B){e.clearColor(m.r,m.g,m.b,B)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(m){wa.darkness=m};this.initMaterial=function(m,B,x,u){var z,J, +L;if(m instanceof THREE.MeshDepthMaterial)L="depth";else if(m instanceof THREE.ShadowVolumeDynamicMaterial)L="shadowVolumeDynamic";else if(m instanceof THREE.MeshNormalMaterial)L="normal";else if(m instanceof THREE.MeshBasicMaterial)L="basic";else if(m instanceof THREE.MeshLambertMaterial)L="lambert";else if(m instanceof THREE.MeshPhongMaterial)L="phong";else if(m instanceof THREE.LineBasicMaterial)L="basic";else m instanceof THREE.ParticleBasicMaterial&&(L="particle_basic");if(L){var E=THREE.ShaderLib[L]; +m.uniforms=Uniforms.clone(E.uniforms);m.vertexShader=E.vertexShader;m.fragmentShader=E.fragmentShader}var P,F,M;P=M=E=0;for(F=B.length;P0?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+x.maxDirLights,"#define MAX_POINT_LIGHTS "+x.maxPointLights,"#define MAX_BONES "+ +x.maxBones,x.map?"#define USE_MAP":"",x.envMap?"#define USE_ENVMAP":"",x.lightMap?"#define USE_LIGHTMAP":"",x.vertexColors?"#define USE_COLOR":"",x.skinning?"#define USE_SKINNING":"",x.morphTargets?"#define USE_MORPHTARGETS":"",x.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n"); e.attachShader(X,ka("fragment",prefix_fragment+P));e.attachShader(X,ka("vertex",prefix_vertex+F));e.linkProgram(X);e.getProgramParameter(X,e.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+e.getProgramParameter(X,e.VALIDATE_STATUS)+", gl error ["+e.getError()+"]");X.uniforms={};X.attributes={};var U;P=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(U in E)P.push(U); U=P;E=0;for(P=U.length;E=0&&e.enableVertexAttribArray(I.color);I.normal>= 0&&e.enableVertexAttribArray(I.normal);I.tangent>=0&&e.enableVertexAttribArray(I.tangent);if(m.skinning&&I.skinVertexA>=0&&I.skinVertexB>=0&&I.skinIndex>=0&&I.skinWeight>=0){e.enableVertexAttribArray(I.skinVertexA);e.enableVertexAttribArray(I.skinVertexB);e.enableVertexAttribArray(I.skinIndex);e.enableVertexAttribArray(I.skinWeight)}for(z in m.attributes)I[z]>=0&&e.enableVertexAttribArray(I[z]);if(m.morphTargets){m.numSupportedMorphTargets=0;if(I.morphTarget0>=0){e.enableVertexAttribArray(I.morphTarget0); From de2dcdf5c05d3bfae42f543fc77ee3d9f7e99938 Mon Sep 17 00:00:00 2001 From: alteredq Date: Thu, 7 Apr 2011 21:12:48 +0200 Subject: [PATCH 6/7] Changed WebGLRenderTarget / FBO default color format to RGBA. This makes lens flares work with postprocessing. Had to change lines color example to use clearAlpha = 1 to get back bloom. --- build/Three.js | 2 +- build/custom/ThreeWebGL.js | 2 +- examples/webgl_lines_colors.html | 168 +++++++++++++++-------------- src/renderers/WebGLRenderTarget.js | 2 +- 4 files changed, 92 insertions(+), 82 deletions(-) diff --git a/build/Three.js b/build/Three.js index f302b24c..b7560abc 100755 --- a/build/Three.js +++ b/build/Three.js @@ -334,7 +334,7 @@ J;B.__dirtyVertices=!0;B.__dirtyColors=!0}V(u.__webglObjects,B,C)}else if(C inst e.createBuffer();x.__webglColorBuffer=e.createBuffer();x=B;J=x.vertices.length;x.__vertexArray=new Float32Array(J*3);x.__colorArray=new Float32Array(J*3);x.__sortArray=[];x.__webglParticleCount=J;B.__dirtyVertices=!0;B.__dirtyColors=!0}V(u.__webglObjects,B,C)}else THREE.MarchingCubes!==undefined&&C instanceof THREE.MarchingCubes&&u.__webglObjectsImmediate.push({object:C,opaque:{list:[],count:0},transparent:{list:[],count:0}});n.__objectsAdded.splice(0,1)}for(;n.__objectsRemoved.length;){C=n.__objectsRemoved[0]; u=n;B=void 0;x=void 0;for(B=u.__webglObjects.length-1;B>=0;B--){x=u.__webglObjects[B].object;C==x&&u.__webglObjects.splice(B,1)}n.__objectsRemoved.splice(0,1)}C=0;for(u=n.__webglObjects.length;C0}}; -THREE.WebGLRenderTarget=function(b,c,d){this.width=b;this.height=c;d=d||{};this.wrapS=d.wrapS!==undefined?d.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=d.wrapT!==undefined?d.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=d.magFilter!==undefined?d.magFilter:THREE.LinearFilter;this.minFilter=d.minFilter!==undefined?d.minFilter:THREE.LinearMipMapLinearFilter;this.format=d.format!==undefined?d.format:THREE.RGBFormat;this.type=d.type!==undefined?d.type:THREE.UnsignedByteType;this.depthBuffer=d.depthBuffer!== +THREE.WebGLRenderTarget=function(b,c,d){this.width=b;this.height=c;d=d||{};this.wrapS=d.wrapS!==undefined?d.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=d.wrapT!==undefined?d.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=d.magFilter!==undefined?d.magFilter:THREE.LinearFilter;this.minFilter=d.minFilter!==undefined?d.minFilter:THREE.LinearMipMapLinearFilter;this.format=d.format!==undefined?d.format:THREE.RGBAFormat;this.type=d.type!==undefined?d.type:THREE.UnsignedByteType;this.depthBuffer=d.depthBuffer!== undefined?d.depthBuffer:!0;this.stencilBuffer=d.stencilBuffer!==undefined?d.stencilBuffer:!0}; THREE.SoundRenderer=function(){this.volume=1;this.domElement=document.createElement("div");this.domElement.id="THREESound";this.cameraPosition=new THREE.Vector3;this.soundPosition=new THREE.Vector3;this.render=function(b,c,d){d&&b.update(undefined,!1,c);d=b.sounds;var f,g=d.length;for(f=0;f=0;r--){m=n.__webglObjects[r].object;s==m&&n.__webglObjects.splice(r,1)}f.__objectsRemoved.splice(0,1)}s=0;for(n=f.__webglObjects.length;s0}}; -THREE.WebGLRenderTarget=function(b,d,e){this.width=b;this.height=d;e=e||{};this.wrapS=e.wrapS!==undefined?e.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=e.wrapT!==undefined?e.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=e.magFilter!==undefined?e.magFilter:THREE.LinearFilter;this.minFilter=e.minFilter!==undefined?e.minFilter:THREE.LinearMipMapLinearFilter;this.format=e.format!==undefined?e.format:THREE.RGBFormat;this.type=e.type!==undefined?e.type:THREE.UnsignedByteType;this.depthBuffer=e.depthBuffer!== +THREE.WebGLRenderTarget=function(b,d,e){this.width=b;this.height=d;e=e||{};this.wrapS=e.wrapS!==undefined?e.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=e.wrapT!==undefined?e.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=e.magFilter!==undefined?e.magFilter:THREE.LinearFilter;this.minFilter=e.minFilter!==undefined?e.minFilter:THREE.LinearMipMapLinearFilter;this.format=e.format!==undefined?e.format:THREE.RGBAFormat;this.type=e.type!==undefined?e.type:THREE.UnsignedByteType;this.depthBuffer=e.depthBuffer!== undefined?e.depthBuffer:!0;this.stencilBuffer=e.stencilBuffer!==undefined?e.stencilBuffer:!0}; diff --git a/examples/webgl_lines_colors.html b/examples/webgl_lines_colors.html index 0c469613..3677f53a 100644 --- a/examples/webgl_lines_colors.html +++ b/examples/webgl_lines_colors.html @@ -60,8 +60,8 @@ camera, scene, renderer, material; - var cameraOrtho, sceneScreen, rtTexture1, rtTexture2, rtTexture3, materialScreen, materialConvolution, blurx, blury, quadScreen; - + var postprocessing = { enabled: true }; + init(); animate(); @@ -77,9 +77,9 @@ scene = new THREE.Scene(); - renderer = new THREE.WebGLRenderer( { antialias: false } ); + renderer = new THREE.WebGLRenderer( { clearColor: 0x000000, clearAlpha: 1, antialias: false } ); renderer.setSize( window.innerWidth, window.innerHeight ); - renderer.autoClear = false; + container.appendChild( renderer.domElement ); var geometry = new THREE.Geometry(), @@ -132,59 +132,7 @@ } - // postprocessing - - cameraOrtho = new THREE.Camera(); - cameraOrtho.projectionMatrix = THREE.Matrix4.makeOrtho( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 ); - cameraOrtho.position.z = 100; - - sceneScreen = new THREE.Scene(); - - var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter }; - rtTexture1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, pars ); - rtTexture2 = new THREE.WebGLRenderTarget( 512, 512, pars ); - rtTexture3 = new THREE.WebGLRenderTarget( 512, 512, pars ); - - var screen_shader = ShaderUtils.lib["screen"]; - var screen_uniforms = Uniforms.clone( screen_shader.uniforms ); - - screen_uniforms["tDiffuse"].texture = rtTexture1; - screen_uniforms["opacity"].value = 1.0; - - materialScreen = new THREE.MeshShaderMaterial( { - - uniforms: screen_uniforms, - vertexShader: screen_shader.vertexShader, - fragmentShader: screen_shader.fragmentShader, - blending: THREE.AdditiveBlending, - transparent: true - - } ); - - var convolution_shader = ShaderUtils.lib["convolution"]; - var convolution_uniforms = Uniforms.clone( convolution_shader.uniforms ); - - blurx = new THREE.Vector2( 0.001953125, 0.0 ), - blury = new THREE.Vector2( 0.0, 0.001953125 ); - - convolution_uniforms["tDiffuse"].texture = rtTexture1; - convolution_uniforms["uImageIncrement"].value = blurx; - convolution_uniforms["cKernel"].value = ShaderUtils.buildKernel( 4.0 ); - - materialConvolution = new THREE.MeshShaderMaterial( { - - uniforms: convolution_uniforms, - vertexShader: "#define KERNEL_SIZE 25.0\n" + convolution_shader.vertexShader, - fragmentShader: "#define KERNEL_SIZE 25\n" + convolution_shader.fragmentShader - - } ); - - var plane = new Plane( window.innerWidth, window.innerHeight ); - - quadScreen = new THREE.Mesh( plane, materialConvolution ); - quadScreen.position.z = -100; - sceneScreen.addObject( quadScreen ); - + stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.top = '0px'; @@ -195,6 +143,9 @@ document.addEventListener( 'touchstart', onDocumentTouchStart, false ); document.addEventListener( 'touchmove', onDocumentTouchMove, false ); + initPostprocessing(); + renderer.autoClear = false; + } // port of Processing Java code by Thomas Diewald @@ -240,6 +191,59 @@ } // + + function initPostprocessing() { + + postprocessing.scene = new THREE.Scene(); + + postprocessing.camera = new THREE.Camera(); + postprocessing.camera.projectionMatrix = THREE.Matrix4.makeOrtho( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 ); + postprocessing.camera.position.z = 100; + + var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter }; + postprocessing.rtTexture1 = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, pars ); + postprocessing.rtTexture2 = new THREE.WebGLRenderTarget( 512, 512, pars ); + postprocessing.rtTexture3 = new THREE.WebGLRenderTarget( 512, 512, pars ); + + var screen_shader = ShaderUtils.lib["screen"]; + var screen_uniforms = Uniforms.clone( screen_shader.uniforms ); + + screen_uniforms["tDiffuse"].texture = postprocessing.rtTexture1; + screen_uniforms["opacity"].value = 1.0; + + postprocessing.materialScreen = new THREE.MeshShaderMaterial( { + + uniforms: screen_uniforms, + vertexShader: screen_shader.vertexShader, + fragmentShader: screen_shader.fragmentShader, + blending: THREE.AdditiveBlending, + transparent: true + + } ); + + var convolution_shader = ShaderUtils.lib["convolution"]; + var convolution_uniforms = Uniforms.clone( convolution_shader.uniforms ); + + postprocessing.blurx = new THREE.Vector2( 0.001953125, 0.0 ), + postprocessing.blury = new THREE.Vector2( 0.0, 0.001953125 ); + + convolution_uniforms["tDiffuse"].texture = postprocessing.rtTexture1; + convolution_uniforms["uImageIncrement"].value = postprocessing.blurx; + convolution_uniforms["cKernel"].value = ShaderUtils.buildKernel( 4.0 ); + + postprocessing.materialConvolution = new THREE.MeshShaderMaterial( { + + uniforms: convolution_uniforms, + vertexShader: "#define KERNEL_SIZE 25.0\n" + convolution_shader.vertexShader, + fragmentShader: "#define KERNEL_SIZE 25\n" + convolution_shader.fragmentShader + + } ); + + postprocessing.quad = new THREE.Mesh( new Plane( window.innerWidth, window.innerHeight ), postprocessing.materialConvolution ); + postprocessing.quad.position.z = -500; + postprocessing.scene.addObject( postprocessing.quad ); + + } function onDocumentMouseMove(event) { @@ -283,7 +287,6 @@ camera.position.x += ( mouseX - camera.position.x ) * .05; camera.position.y += ( - mouseY + 200 - camera.position.y ) * .05; - camera.updateMatrix(); var time = new Date().getTime() * 0.0005; @@ -293,43 +296,50 @@ } - //renderer.render( scene, camera ); + if ( postprocessing.enabled ) { - renderer.clear(); + renderer.clear(); - // Render scene into texture + // Render scene into texture - renderer.render( scene, camera, rtTexture1, true ); + renderer.render( scene, camera, postprocessing.rtTexture1, true ); - // Render quad with blured scene into texture (convolution pass 1) + // Render quad with blured scene into texture (convolution pass 1) - quadScreen.materials = [ materialConvolution ]; + postprocessing.quad.materials = [ postprocessing.materialConvolution ]; - materialConvolution.uniforms.tDiffuse.texture = rtTexture1; - materialConvolution.uniforms.uImageIncrement.value = blurx; + postprocessing.materialConvolution.uniforms.tDiffuse.texture = postprocessing.rtTexture1; + postprocessing.materialConvolution.uniforms.uImageIncrement.value = postprocessing.blurx; - renderer.render( sceneScreen, cameraOrtho, rtTexture2, true ); + renderer.render( postprocessing.scene, postprocessing.camera, postprocessing.rtTexture2, true ); - // Render quad with blured scene into texture (convolution pass 2) + // Render quad with blured scene into texture (convolution pass 2) - materialConvolution.uniforms.tDiffuse.texture = rtTexture2; - materialConvolution.uniforms.uImageIncrement.value = blury; + postprocessing.materialConvolution.uniforms.tDiffuse.texture = postprocessing.rtTexture2; + postprocessing.materialConvolution.uniforms.uImageIncrement.value = postprocessing.blury; - renderer.render( sceneScreen, cameraOrtho, rtTexture3, true ); + renderer.render( postprocessing.scene, postprocessing.camera, postprocessing.rtTexture3, true ); - // Render original scene with superimposed blur to texture + // Render original scene with superimposed blur to texture - quadScreen.materials = [ materialScreen ]; + postprocessing.quad.materials = [ postprocessing.materialScreen ]; - materialScreen.uniforms.tDiffuse.texture = rtTexture3; - materialScreen.uniforms.opacity.value = 1.3; + postprocessing.materialScreen.uniforms.tDiffuse.texture = postprocessing.rtTexture3; + postprocessing.materialScreen.uniforms.opacity.value = 1.3; - renderer.render( sceneScreen, cameraOrtho, rtTexture1, false ); + renderer.render( postprocessing.scene, postprocessing.camera, postprocessing.rtTexture1, false ); - // Render to screen + // Render to screen - materialScreen.uniforms.tDiffuse.texture = rtTexture1; - renderer.render( sceneScreen, cameraOrtho ); + postprocessing.materialScreen.uniforms.tDiffuse.texture = postprocessing.rtTexture1; + renderer.render( postprocessing.scene, postprocessing.camera ); + + } else { + + renderer.clear(); + renderer.render( scene, camera ); + + } } diff --git a/src/renderers/WebGLRenderTarget.js b/src/renderers/WebGLRenderTarget.js index 4218ab9e..3902e0d7 100644 --- a/src/renderers/WebGLRenderTarget.js +++ b/src/renderers/WebGLRenderTarget.js @@ -15,7 +15,7 @@ THREE.WebGLRenderTarget = function ( width, height, options ) { this.magFilter = options.magFilter !== undefined ? options.magFilter : THREE.LinearFilter; this.minFilter = options.minFilter !== undefined ? options.minFilter : THREE.LinearMipMapLinearFilter; - this.format = options.format !== undefined ? options.format : THREE.RGBFormat; + this.format = options.format !== undefined ? options.format : THREE.RGBAFormat; this.type = options.type !== undefined ? options.type : THREE.UnsignedByteType; this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; From 58bbd02e9e0603d72f6fc77f59fb57cf3b0e6cdc Mon Sep 17 00:00:00 2001 From: alteredq Date: Fri, 8 Apr 2011 06:13:12 +0200 Subject: [PATCH 7/7] Added handling of mesh colliders to scene loader. Changed Blender scene exporter to make mesh colliders invisible. --- build/Three.js | 196 +++++++++--------- build/custom/ThreeExtras.js | 36 ++-- src/extras/io/SceneLoader.js | 8 + src/physics/CollisionUtils.js | 6 +- src/physics/Collisions.js | 4 + .../op/io_mesh_threejs/export_threejs.py | 15 +- 6 files changed, 141 insertions(+), 124 deletions(-) diff --git a/build/Three.js b/build/Three.js index 1dc41776..6bb38fca 100755 --- a/build/Three.js +++ b/build/Three.js @@ -12,7 +12,7 @@ this.length();b>0?this.multiplyScalar(1/b):this.set(0,0,0);return this},setPosit 1.0E-4&&Math.abs(this.z)<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(b,c,d,f){this.set(b||0,c||0,d||0,f||1)}; THREE.Vector4.prototype={set:function(b,c,d,f){this.x=b;this.y=c;this.z=d;this.w=f;return this},copy:function(b){this.set(b.x,b.y,b.z,b.w||1);return this},add:function(b,c){this.set(b.x+c.x,b.y+c.y,b.z+c.z,b.w+c.w);return this},addSelf:function(b){this.set(this.x+b.x,this.y+b.y,this.z+b.z,this.w+b.w);return this},sub:function(b,c){this.set(b.x-c.x,b.y-c.y,b.z-c.z,b.w-c.w);return this},subSelf:function(b){this.set(this.x-b.x,this.y-b.y,this.z-b.z,this.w-b.w);return this},multiplyScalar:function(b){this.set(this.x* b,this.y*b,this.z*b,this.w*b);return this},divideScalar:function(b){this.set(this.x/b,this.y/b,this.z/b,this.w/b);return this},lerpSelf:function(b,c){this.set(this.x+(b.x-this.x)*c,this.y+(b.y-this.y)*c,this.z+(b.z-this.z)*c,this.w+(b.w-this.w)*c)},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Ray=function(b,c){this.origin=b||new THREE.Vector3;this.direction=c||new THREE.Vector3}; -THREE.Ray.prototype={intersectScene:function(b){var c,d,f=b.objects,g=[];b=0;for(c=f.length;b0&&H>0&&O+H<1}var d,f,g,h,j,k,n,p,o,w, +THREE.Ray.prototype={intersectScene:function(b){var c,d,f=b.objects,g=[];b=0;for(c=f.length;b0&&H>0&&O+H<1}var d,f,g,h,j,k,n,p,o,w, y,v=b.geometry,B=v.vertices,G=[];d=0;for(f=v.faces.length;d0:o<0)){p=p.dot((new THREE.Vector3).sub(h,w))/ o;w=w.addSelf(y.multiplyScalar(p));if(g instanceof THREE.Face3){if(c(w,h,j,k)){g={distance:this.origin.distanceTo(w),point:w,face:g,object:b};G.push(g)}}else if(g instanceof THREE.Face4&&(c(w,h,j,n)||c(w,j,k,n))){g={distance:this.origin.distanceTo(w),point:w,face:g,object:b};G.push(g)}}}return G}}; THREE.Rectangle=function(){function b(){h=f-c;j=g-d}var c,d,f,g,h,j,k=!0;this.getX=function(){return c};this.getY=function(){return d};this.getWidth=function(){return h};this.getHeight=function(){return j};this.getLeft=function(){return c};this.getTop=function(){return d};this.getRight=function(){return f};this.getBottom=function(){return g};this.set=function(n,p,o,w){k=!1;c=n;d=p;f=o;g=w;b()};this.addPoint=function(n,p){if(k){k=!1;c=n;d=p;f=n;g=p}else{c=cn?f:n;g=g>p?g:p}b()}; @@ -23,8 +23,8 @@ THREE.Matrix4=function(b,c,d,f,g,h,j,k,n,p,o,w,y,v,B,G){this.set(b||1,c||0,d||0, THREE.Matrix4.prototype={set:function(b,c,d,f,g,h,j,k,n,p,o,w,y,v,B,G){this.n11=b;this.n12=c;this.n13=d;this.n14=f;this.n21=g;this.n22=h;this.n23=j;this.n24=k;this.n31=n;this.n32=p;this.n33=o;this.n34=w;this.n41=y;this.n42=v;this.n43=B;this.n44=G;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(b){this.set(b.n11,b.n12,b.n13,b.n14,b.n21,b.n22,b.n23,b.n24,b.n31,b.n32,b.n33,b.n34,b.n41,b.n42,b.n43,b.n44);return this},lookAt:function(b,c,d){var f=THREE.Matrix4.__v1, g=THREE.Matrix4.__v2,h=THREE.Matrix4.__v3;h.sub(b,c).normalize();if(h.length()===0)h.z=1;f.cross(d,h).normalize();if(f.length()===0){h.x+=1.0E-4;f.cross(d,h).normalize()}g.cross(h,f).normalize();this.n11=f.x;this.n12=g.x;this.n13=h.x;this.n21=f.y;this.n22=g.y;this.n23=h.y;this.n31=f.z;this.n32=g.z;this.n33=h.z;return this},multiplyVector3:function(b){var c=b.x,d=b.y,f=b.z,g=1/(this.n41*c+this.n42*d+this.n43*f+this.n44);b.x=(this.n11*c+this.n12*d+this.n13*f+this.n14)*g;b.y=(this.n21*c+this.n22*d+this.n23* f+this.n24)*g;b.z=(this.n31*c+this.n32*d+this.n33*f+this.n34)*g;return b},multiplyVector4:function(b){var c=b.x,d=b.y,f=b.z,g=b.w;b.x=this.n11*c+this.n12*d+this.n13*f+this.n14*g;b.y=this.n21*c+this.n22*d+this.n23*f+this.n24*g;b.z=this.n31*c+this.n32*d+this.n33*f+this.n34*g;b.w=this.n41*c+this.n42*d+this.n43*f+this.n44*g;return b},rotateAxis:function(b){var c=b.x,d=b.y,f=b.z;b.x=c*this.n11+d*this.n12+f*this.n13;b.y=c*this.n21+d*this.n22+f*this.n23;b.z=c*this.n31+d*this.n32+f*this.n33;b.normalize(); -return b},crossVector:function(b){var c=new THREE.Vector4;c.x=this.n11*b.x+this.n12*b.y+this.n13*b.z+this.n14*b.w;c.y=this.n21*b.x+this.n22*b.y+this.n23*b.z+this.n24*b.w;c.z=this.n31*b.x+this.n32*b.y+this.n33*b.z+this.n34*b.w;c.w=b.w?this.n41*b.x+this.n42*b.y+this.n43*b.z+this.n44*b.w:1;return c},multiply:function(b,c){var d=b.n11,f=b.n12,g=b.n13,h=b.n14,j=b.n21,k=b.n22,n=b.n23,p=b.n24,o=b.n31,w=b.n32,y=b.n33,v=b.n34,B=b.n41,G=b.n42,H=b.n43,L=b.n44,W=c.n11,A=c.n12,J=c.n13,O=c.n14,R=c.n21,Fa=c.n22, -ka=c.n23,va=c.n24,$=c.n31,e=c.n32,ea=c.n33,Aa=c.n34;this.n11=d*W+f*R+g*$;this.n12=d*A+f*Fa+g*e;this.n13=d*J+f*ka+g*ea;this.n14=d*O+f*va+g*Aa+h;this.n21=j*W+k*R+n*$;this.n22=j*A+k*Fa+n*e;this.n23=j*J+k*ka+n*ea;this.n24=j*O+k*va+n*Aa+p;this.n31=o*W+w*R+y*$;this.n32=o*A+w*Fa+y*e;this.n33=o*J+w*ka+y*ea;this.n34=o*O+w*va+y*Aa+v;this.n41=B*W+G*R+H*$;this.n42=B*A+G*Fa+H*e;this.n43=B*J+G*ka+H*ea;this.n44=B*O+G*va+H*Aa+L;return this},multiplyToArray:function(b,c,d){this.multiply(b,c);d[0]=this.n11;d[1]=this.n21; +return b},crossVector:function(b){var c=new THREE.Vector4;c.x=this.n11*b.x+this.n12*b.y+this.n13*b.z+this.n14*b.w;c.y=this.n21*b.x+this.n22*b.y+this.n23*b.z+this.n24*b.w;c.z=this.n31*b.x+this.n32*b.y+this.n33*b.z+this.n34*b.w;c.w=b.w?this.n41*b.x+this.n42*b.y+this.n43*b.z+this.n44*b.w:1;return c},multiply:function(b,c){var d=b.n11,f=b.n12,g=b.n13,h=b.n14,j=b.n21,k=b.n22,n=b.n23,p=b.n24,o=b.n31,w=b.n32,y=b.n33,v=b.n34,B=b.n41,G=b.n42,H=b.n43,L=b.n44,V=c.n11,A=c.n12,J=c.n13,O=c.n14,R=c.n21,Fa=c.n22, +ka=c.n23,va=c.n24,$=c.n31,e=c.n32,ea=c.n33,Aa=c.n34;this.n11=d*V+f*R+g*$;this.n12=d*A+f*Fa+g*e;this.n13=d*J+f*ka+g*ea;this.n14=d*O+f*va+g*Aa+h;this.n21=j*V+k*R+n*$;this.n22=j*A+k*Fa+n*e;this.n23=j*J+k*ka+n*ea;this.n24=j*O+k*va+n*Aa+p;this.n31=o*V+w*R+y*$;this.n32=o*A+w*Fa+y*e;this.n33=o*J+w*ka+y*ea;this.n34=o*O+w*va+y*Aa+v;this.n41=B*V+G*R+H*$;this.n42=B*A+G*Fa+H*e;this.n43=B*J+G*ka+H*ea;this.n44=B*O+G*va+H*Aa+L;return this},multiplyToArray:function(b,c,d){this.multiply(b,c);d[0]=this.n11;d[1]=this.n21; d[2]=this.n31;d[3]=this.n41;d[4]=this.n12;d[5]=this.n22;d[6]=this.n32;d[7]=this.n42;d[8]=this.n13;d[9]=this.n23;d[10]=this.n33;d[11]=this.n43;d[12]=this.n14;d[13]=this.n24;d[14]=this.n34;d[15]=this.n44;return this},multiplySelf:function(b){this.multiply(this,b);return this},multiplyScalar:function(b){this.n11*=b;this.n12*=b;this.n13*=b;this.n14*=b;this.n21*=b;this.n22*=b;this.n23*=b;this.n24*=b;this.n31*=b;this.n32*=b;this.n33*=b;this.n34*=b;this.n41*=b;this.n42*=b;this.n43*=b;this.n44*=b;return this}, determinant:function(){var b=this.n11,c=this.n12,d=this.n13,f=this.n14,g=this.n21,h=this.n22,j=this.n23,k=this.n24,n=this.n31,p=this.n32,o=this.n33,w=this.n34,y=this.n41,v=this.n42,B=this.n43,G=this.n44;return f*j*p*y-d*k*p*y-f*h*o*y+c*k*o*y+d*h*w*y-c*j*w*y-f*j*n*v+d*k*n*v+f*g*o*v-b*k*o*v-d*g*w*v+b*j*w*v+f*h*n*B-c*k*n*B-f*g*p*B+b*k*p*B+c*g*w*B-b*h*w*B-d*h*n*G+c*j*n*G+d*g*p*G-b*j*p*G-c*g*o*G+b*h*o*G},transpose:function(){var b;b=this.n21;this.n21=this.n12;this.n12=b;b=this.n31;this.n31=this.n13;this.n13= b;b=this.n32;this.n32=this.n23;this.n23=b;b=this.n41;this.n41=this.n14;this.n14=b;b=this.n42;this.n42=this.n24;this.n24=b;b=this.n43;this.n43=this.n34;this.n43=b;return this},clone:function(){var b=new THREE.Matrix4;b.n11=this.n11;b.n12=this.n12;b.n13=this.n13;b.n14=this.n14;b.n21=this.n21;b.n22=this.n22;b.n23=this.n23;b.n24=this.n24;b.n31=this.n31;b.n32=this.n32;b.n33=this.n33;b.n34=this.n34;b.n41=this.n41;b.n42=this.n42;b.n43=this.n43;b.n44=this.n44;return b},flatten:function(){this.flat[0]=this.n11; @@ -56,16 +56,16 @@ THREE.Geometry.prototype={computeCentroids:function(){var b,c,d;b=0;for(c=this.f d.centroid.addSelf(this.vertices[d.d].position);d.centroid.divideScalar(4)}}},computeFaceNormals:function(b){var c,d,f,g,h,j,k=new THREE.Vector3,n=new THREE.Vector3;f=0;for(g=this.faces.length;f0){this.boundingBox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var c=1,d=this.vertices.length;cthis.boundingBox.x[1])this.boundingBox.x[1]=b.position.x; if(b.position.ythis.boundingBox.y[1])this.boundingBox.y[1]=b.position.y;if(b.position.zthis.boundingBox.z[1])this.boundingBox.z[1]=b.position.z}}},computeBoundingSphere:function(){for(var b=this.boundingSphere===null?0:this.boundingSphere.radius,c=0,d=this.vertices.length;cthis.points.length-2?h:h+1;d[3]=h>this.points.length-3?h:h+2;p=this.points[d[0]];o=this.points[d[1]]; -w=this.points[d[2]];y=this.points[d[3]];k=j*j;n=j*k;f.x=c(p.x,o.x,w.x,y.x,j,k,n);f.y=c(p.y,o.y,w.y,y.y,j,k,n);f.z=c(p.z,o.z,w.z,y.z,j,k,n);return f};this.getControlPointsArray=function(){var v,B,G=this.points.length,H=[];for(v=0;vthis.points.length-2?h:h+1;d[3]=h>this.points.length-3?h:h+2;p=this.points[d[0]];o=this.points[d[1]]; +w=this.points[d[2]];y=this.points[d[3]];k=j*j;n=j*k;f.x=c(p.x,o.x,w.x,y.x,j,k,n);f.y=c(p.y,o.y,w.y,y.y,j,k,n);f.z=c(p.z,o.z,w.z,y.z,j,k,n);return f};this.getControlPointsArray=function(){var v,B,G=this.points.length,H=[];for(v=0;v=0&&X>=0&&oa>=0&&pa>=0)return!0;else if(Ha<0&&X<0||oa<0&&pa<0)return!1;else{if(Ha<0)Aa=Math.max(Aa,Ha/(Ha-X));else X<0&&(Ca=Math.min(Ca,Ha/(Ha-X)));if(oa<0)Aa=Math.max(Aa,oa/(oa-pa));else pa<0&&(Ca=Math.min(Ca,oa/(oa-pa)));if(CaHa&&j.positionScreen.zHa&&j.positionScreen.z0&&O.z<1){Ra=A[W]=A[W]||new THREE.RenderableParticle;W++;L=Ra;L.x=O.x/O.w;L.y=O.y/O.w;L.z=O.z;L.rotation=ua.rotation.z;L.scale.x=ua.scale.x*Math.abs(L.x-(O.x+ea.projectionMatrix.n11)/(O.w+ea.projectionMatrix.n14));L.scale.y=ua.scale.y*Math.abs(L.y-(O.y+ea.projectionMatrix.n22)/(O.w+ea.projectionMatrix.n24));L.materials=ua.materials;Ca.push(L)}}}}Aa&&Ca.sort(c);return Ca}}; +R.multiplyVector3(p.centroidScreen);Ga=ta.vertexNormals;Z=0;for(la=Ga.length;Z0&&O.z<1){Ra=A[V]=A[V]||new THREE.RenderableParticle;V++;L=Ra;L.x=O.x/O.w;L.y=O.y/O.w;L.z=O.z;L.rotation=ua.rotation.z;L.scale.x=ua.scale.x*Math.abs(L.x-(O.x+ea.projectionMatrix.n11)/(O.w+ea.projectionMatrix.n14));L.scale.y=ua.scale.y*Math.abs(L.y-(O.y+ea.projectionMatrix.n22)/(O.w+ea.projectionMatrix.n24));L.materials=ua.materials;Ca.push(L)}}}}Aa&&Ca.sort(c);return Ca}}; THREE.DOMRenderer=function(){THREE.Renderer.call(this);var b=null,c=new THREE.Projector,d,f,g,h;this.domElement=document.createElement("div");this.setSize=function(j,k){d=j;f=k;g=d/2;h=f/2};this.render=function(j,k){var n,p,o,w,y,v,B,G;b=c.projectScene(j,k);n=0;for(p=b.length;n>1;Ea=ha.height>>1;na=za.scale.x*n;qa=za.scale.y*p;aa=na*Q;Ba=qa*Ea;C.set(V.x-aa,V.y-Ba,V.x+aa,V.y+Ba);if(fa.instersects(C)){o.save();o.translate(V.x,V.y); -o.rotate(-za.rotation);o.scale(na,-qa);o.translate(-Q,-Ea);o.drawImage(ha,0,0);o.restore()}}}else if(na instanceof THREE.ParticleCanvasMaterial){aa=za.scale.x*n;Ba=za.scale.y*p;C.set(V.x-aa,V.y-Ba,V.x+aa,V.y+Ba);if(fa.instersects(C)){d(na.color.__styleString);qa=na.color.__styleString;if(H!=qa)o.fillStyle=H=qa;o.save();o.translate(V.x,V.y);o.rotate(-za.rotation);o.scale(aa,Ba);na.program(o);o.restore()}}}function Ja(V,za,na,aa){b(aa.opacity);c(aa.blending);o.beginPath();o.moveTo(V.positionScreen.x, -V.positionScreen.y);o.lineTo(za.positionScreen.x,za.positionScreen.y);o.closePath();if(aa instanceof THREE.LineBasicMaterial){la.__styleString=aa.color.__styleString;V=aa.linewidth;if(L!=V)o.lineWidth=L=V;V=aa.linecap;if(W!=V)o.lineCap=W=V;V=aa.linejoin;if(A!=V)o.lineJoin=A=V;d(la.__styleString);o.stroke();C.inflate(aa.linewidth*2)}}function Ia(V,za,na,aa,Ba,qa,ha,Q,Ea){b(Q.opacity);c(Q.blending);$=V.positionScreen.x;e=V.positionScreen.y;ea=za.positionScreen.x;Aa=za.positionScreen.y;Ca=na.positionScreen.x; -Ha=na.positionScreen.y;D($,e,ea,Aa,Ca,Ha);if(Q instanceof THREE.MeshBasicMaterial)if(Q.map){if(Q.map.mapping instanceof THREE.UVMapping){Oa=ha.uvs[0];eb($,e,ea,Aa,Ca,Ha,Q.map.image,Oa[aa].u,Oa[aa].v,Oa[Ba].u,Oa[Ba].v,Oa[qa].u,Oa[qa].v)}}else if(Q.envMap){if(Q.envMap.mapping instanceof THREE.SphericalReflectionMapping){V=ra.matrixWorldInverse;E.copy(ha.vertexNormalsWorld[0]);S=(E.x*V.n11+E.y*V.n12+E.z*V.n13)*0.5+0.5;ca=-(E.x*V.n21+E.y*V.n22+E.z*V.n23)*0.5+0.5;E.copy(ha.vertexNormalsWorld[1]);ma=(E.x* -V.n11+E.y*V.n12+E.z*V.n13)*0.5+0.5;Da=-(E.x*V.n21+E.y*V.n22+E.z*V.n23)*0.5+0.5;E.copy(ha.vertexNormalsWorld[2]);Ma=(E.x*V.n11+E.y*V.n12+E.z*V.n13)*0.5+0.5;xa=-(E.x*V.n21+E.y*V.n22+E.z*V.n23)*0.5+0.5;eb($,e,ea,Aa,Ca,Ha,Q.envMap.image,S,ca,ma,Da,Ma,xa)}}else Q.wireframe?t(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(Q.color.__styleString);else if(Q instanceof THREE.MeshLambertMaterial){if(Q.map&&!Q.wireframe){if(Q.map.mapping instanceof THREE.UVMapping){Oa=ha.uvs[0]; +G=null,H=null,L=null,V=null,A=null,J,O,R,Fa,ka=new THREE.RenderableVertex,va=new THREE.RenderableVertex,$,e,ea,Aa,Ca,Ha,X,oa,pa,ta,fa,Z,la=new THREE.Color,Ga=new THREE.Color,ia=new THREE.Color,ja=new THREE.Color,ua=new THREE.Color,Ra,$a,ab,Oa,S,ca,ma,Da,Ma,xa,ga=new THREE.Rectangle,m=new THREE.Rectangle,C=new THREE.Rectangle,x=!1,u=new THREE.Color,z=new THREE.Color,K=new THREE.Color,M=new THREE.Color,E=new THREE.Vector3,P,F,N,I,Y,U,ya=16;P=document.createElement("canvas");P.width=P.height=2;F=P.getContext("2d"); +F.fillStyle="rgba(0,0,0,1)";F.fillRect(0,0,2,2);N=F.getImageData(0,0,2,2);I=N.data;Y=document.createElement("canvas");Y.width=Y.height=ya;U=Y.getContext("2d");U.translate(-ya/2,-ya/2);U.scale(ya,ya);ya--;this.domElement=h;this.autoClear=!0;this.sortObjects=!0;this.sortElements=!0;this.setSize=function(wa,ra){j=wa;k=ra;n=j/2;p=k/2;h.width=j;h.height=k;ga.set(-n,-p,n,p);v=1;B=0;A=V=L=H=G=null};this.setClearColor=function(wa,ra){w=wa;y=ra};this.setClearColorHex=function(wa,ra){w.setHex(wa);y=ra};this.clear= +function(){o.setTransform(1,0,0,-1,n,p);if(!m.isEmpty()){m.inflate(1);m.minSelf(ga);if(w.hex==0&&y==0)o.clearRect(m.getX(),m.getY(),m.getWidth(),m.getHeight());else{c(THREE.NormalBlending);b(1);o.fillStyle="rgba("+Math.floor(w.r*255)+","+Math.floor(w.g*255)+","+Math.floor(w.b*255)+","+y+")";o.fillRect(m.getX(),m.getY(),m.getWidth(),m.getHeight())}m.empty()}};this.render=function(wa,ra){function Na(W){var za,na,aa,Ba=W.lights;z.setRGB(0,0,0);K.setRGB(0,0,0);M.setRGB(0,0,0);W=0;for(za=Ba.length;W>1;Ea=ha.height>>1;na=za.scale.x*n;qa=za.scale.y*p;aa=na*Q;Ba=qa*Ea;C.set(W.x-aa,W.y-Ba,W.x+aa,W.y+Ba);if(ga.instersects(C)){o.save();o.translate(W.x,W.y); +o.rotate(-za.rotation);o.scale(na,-qa);o.translate(-Q,-Ea);o.drawImage(ha,0,0);o.restore()}}}else if(na instanceof THREE.ParticleCanvasMaterial){aa=za.scale.x*n;Ba=za.scale.y*p;C.set(W.x-aa,W.y-Ba,W.x+aa,W.y+Ba);if(ga.instersects(C)){d(na.color.__styleString);qa=na.color.__styleString;if(H!=qa)o.fillStyle=H=qa;o.save();o.translate(W.x,W.y);o.rotate(-za.rotation);o.scale(aa,Ba);na.program(o);o.restore()}}}function Ja(W,za,na,aa){b(aa.opacity);c(aa.blending);o.beginPath();o.moveTo(W.positionScreen.x, +W.positionScreen.y);o.lineTo(za.positionScreen.x,za.positionScreen.y);o.closePath();if(aa instanceof THREE.LineBasicMaterial){la.__styleString=aa.color.__styleString;W=aa.linewidth;if(L!=W)o.lineWidth=L=W;W=aa.linecap;if(V!=W)o.lineCap=V=W;W=aa.linejoin;if(A!=W)o.lineJoin=A=W;d(la.__styleString);o.stroke();C.inflate(aa.linewidth*2)}}function Ia(W,za,na,aa,Ba,qa,ha,Q,Ea){b(Q.opacity);c(Q.blending);$=W.positionScreen.x;e=W.positionScreen.y;ea=za.positionScreen.x;Aa=za.positionScreen.y;Ca=na.positionScreen.x; +Ha=na.positionScreen.y;D($,e,ea,Aa,Ca,Ha);if(Q instanceof THREE.MeshBasicMaterial)if(Q.map){if(Q.map.mapping instanceof THREE.UVMapping){Oa=ha.uvs[0];eb($,e,ea,Aa,Ca,Ha,Q.map.image,Oa[aa].u,Oa[aa].v,Oa[Ba].u,Oa[Ba].v,Oa[qa].u,Oa[qa].v)}}else if(Q.envMap){if(Q.envMap.mapping instanceof THREE.SphericalReflectionMapping){W=ra.matrixWorldInverse;E.copy(ha.vertexNormalsWorld[0]);S=(E.x*W.n11+E.y*W.n12+E.z*W.n13)*0.5+0.5;ca=-(E.x*W.n21+E.y*W.n22+E.z*W.n23)*0.5+0.5;E.copy(ha.vertexNormalsWorld[1]);ma=(E.x* +W.n11+E.y*W.n12+E.z*W.n13)*0.5+0.5;Da=-(E.x*W.n21+E.y*W.n22+E.z*W.n23)*0.5+0.5;E.copy(ha.vertexNormalsWorld[2]);Ma=(E.x*W.n11+E.y*W.n12+E.z*W.n13)*0.5+0.5;xa=-(E.x*W.n21+E.y*W.n22+E.z*W.n23)*0.5+0.5;eb($,e,ea,Aa,Ca,Ha,Q.envMap.image,S,ca,ma,Da,Ma,xa)}}else Q.wireframe?t(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(Q.color.__styleString);else if(Q instanceof THREE.MeshLambertMaterial){if(Q.map&&!Q.wireframe){if(Q.map.mapping instanceof THREE.UVMapping){Oa=ha.uvs[0]; eb($,e,ea,Aa,Ca,Ha,Q.map.image,Oa[aa].u,Oa[aa].v,Oa[Ba].u,Oa[Ba].v,Oa[qa].u,Oa[qa].v)}c(THREE.SubtractiveBlending)}if(x)if(!Q.wireframe&&Q.shading==THREE.SmoothShading&&ha.vertexNormalsWorld.length==3){Ga.r=ia.r=ja.r=z.r;Ga.g=ia.g=ja.g=z.g;Ga.b=ia.b=ja.b=z.b;Sa(Ea,ha.v1.positionWorld,ha.vertexNormalsWorld[0],Ga);Sa(Ea,ha.v2.positionWorld,ha.vertexNormalsWorld[1],ia);Sa(Ea,ha.v3.positionWorld,ha.vertexNormalsWorld[2],ja);ua.r=(ia.r+ja.r)*0.5;ua.g=(ia.g+ja.g)*0.5;ua.b=(ia.b+ja.b)*0.5;ab=Ta(Ga,ia,ja, ua);eb($,e,ea,Aa,Ca,Ha,ab,0,0,1,0,0,1)}else{u.r=z.r;u.g=z.g;u.b=z.b;Sa(Ea,ha.centroidWorld,ha.normalWorld,u);la.r=Q.color.r*u.r;la.g=Q.color.g*u.g;la.b=Q.color.b*u.b;la.updateStyleString();Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}else Q.wireframe?t(Q.color.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(Q.color.__styleString)}else if(Q instanceof THREE.MeshDepthMaterial){Ra=ra.near;$a=ra.far;Ga.r= -Ga.g=Ga.b=1-Qa(V.positionScreen.z,Ra,$a);ia.r=ia.g=ia.b=1-Qa(za.positionScreen.z,Ra,$a);ja.r=ja.g=ja.b=1-Qa(na.positionScreen.z,Ra,$a);ua.r=(ia.r+ja.r)*0.5;ua.g=(ia.g+ja.g)*0.5;ua.b=(ia.b+ja.b)*0.5;ab=Ta(Ga,ia,ja,ua);eb($,e,ea,Aa,Ca,Ha,ab,0,0,1,0,0,1)}else if(Q instanceof THREE.MeshNormalMaterial){la.r=hb(ha.normalWorld.x);la.g=hb(ha.normalWorld.y);la.b=hb(ha.normalWorld.z);la.updateStyleString();Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}} -function Wa(V,za,na,aa,Ba,qa,ha,Q,Ea){b(Q.opacity);c(Q.blending);if(Q.map||Q.envMap){Ia(V,za,aa,0,1,3,ha,Q,Ea);Ia(Ba,na,qa,1,2,3,ha,Q,Ea)}else{$=V.positionScreen.x;e=V.positionScreen.y;ea=za.positionScreen.x;Aa=za.positionScreen.y;Ca=na.positionScreen.x;Ha=na.positionScreen.y;X=aa.positionScreen.x;oa=aa.positionScreen.y;pa=Ba.positionScreen.x;ta=Ba.positionScreen.y;ga=qa.positionScreen.x;Z=qa.positionScreen.y;if(Q instanceof THREE.MeshBasicMaterial){da($,e,ea,Aa,Ca,Ha,X,oa);Q.wireframe?t(Q.color.__styleString, +Ga.g=Ga.b=1-Qa(W.positionScreen.z,Ra,$a);ia.r=ia.g=ia.b=1-Qa(za.positionScreen.z,Ra,$a);ja.r=ja.g=ja.b=1-Qa(na.positionScreen.z,Ra,$a);ua.r=(ia.r+ja.r)*0.5;ua.g=(ia.g+ja.g)*0.5;ua.b=(ia.b+ja.b)*0.5;ab=Ta(Ga,ia,ja,ua);eb($,e,ea,Aa,Ca,Ha,ab,0,0,1,0,0,1)}else if(Q instanceof THREE.MeshNormalMaterial){la.r=hb(ha.normalWorld.x);la.g=hb(ha.normalWorld.y);la.b=hb(ha.normalWorld.z);la.updateStyleString();Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}} +function Wa(W,za,na,aa,Ba,qa,ha,Q,Ea){b(Q.opacity);c(Q.blending);if(Q.map||Q.envMap){Ia(W,za,aa,0,1,3,ha,Q,Ea);Ia(Ba,na,qa,1,2,3,ha,Q,Ea)}else{$=W.positionScreen.x;e=W.positionScreen.y;ea=za.positionScreen.x;Aa=za.positionScreen.y;Ca=na.positionScreen.x;Ha=na.positionScreen.y;X=aa.positionScreen.x;oa=aa.positionScreen.y;pa=Ba.positionScreen.x;ta=Ba.positionScreen.y;fa=qa.positionScreen.x;Z=qa.positionScreen.y;if(Q instanceof THREE.MeshBasicMaterial){da($,e,ea,Aa,Ca,Ha,X,oa);Q.wireframe?t(Q.color.__styleString, Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(Q.color.__styleString)}else if(Q instanceof THREE.MeshLambertMaterial)if(x)if(!Q.wireframe&&Q.shading==THREE.SmoothShading&&ha.vertexNormalsWorld.length==4){Ga.r=ia.r=ja.r=ua.r=z.r;Ga.g=ia.g=ja.g=ua.g=z.g;Ga.b=ia.b=ja.b=ua.b=z.b;Sa(Ea,ha.v1.positionWorld,ha.vertexNormalsWorld[0],Ga);Sa(Ea,ha.v2.positionWorld,ha.vertexNormalsWorld[1],ia);Sa(Ea,ha.v4.positionWorld,ha.vertexNormalsWorld[3],ja);Sa(Ea,ha.v3.positionWorld,ha.vertexNormalsWorld[2], -ua);ab=Ta(Ga,ia,ja,ua);D($,e,ea,Aa,X,oa);eb($,e,ea,Aa,X,oa,ab,0,0,1,0,0,1);D(pa,ta,Ca,Ha,ga,Z);eb(pa,ta,Ca,Ha,ga,Z,ab,1,0,1,1,0,1)}else{u.r=z.r;u.g=z.g;u.b=z.b;Sa(Ea,ha.centroidWorld,ha.normalWorld,u);la.r=Q.color.r*u.r;la.g=Q.color.g*u.g;la.b=Q.color.b*u.b;la.updateStyleString();da($,e,ea,Aa,Ca,Ha,X,oa);Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}else{da($,e,ea,Aa,Ca,Ha,X,oa);Q.wireframe?t(Q.color.__styleString,Q.wireframeLinewidth, -Q.wireframeLinecap,Q.wireframeLinejoin):bb(Q.color.__styleString)}else if(Q instanceof THREE.MeshNormalMaterial){la.r=hb(ha.normalWorld.x);la.g=hb(ha.normalWorld.y);la.b=hb(ha.normalWorld.z);la.updateStyleString();da($,e,ea,Aa,Ca,Ha,X,oa);Q.wireframe?t(la.__styleString,Q.wireframeLinewidth,Q.wireframeLinecap,Q.wireframeLinejoin):bb(la.__styleString)}else if(Q instanceof THREE.MeshDepthMaterial){Ra=ra.near;$a=ra.far;Ga.r=Ga.g=Ga.b=1-Qa(V.positionScreen.z,Ra,$a);ia.r=ia.g=ia.b=1-Qa(za.positionScreen.z, -Ra,$a);ja.r=ja.g=ja.b=1-Qa(aa.positionScreen.z,Ra,$a);ua.r=ua.g=ua.b=1-Qa(na.positionScreen.z,Ra,$a);ab=Ta(Ga,ia,ja,ua);D($,e,ea,Aa,X,oa);eb($,e,ea,Aa,X,oa,ab,0,0,1,0,0,1);D(pa,ta,Ca,Ha,ga,Z);eb(pa,ta,Ca,Ha,ga,Z,ab,1,0,1,1,0,1)}}}function D(V,za,na,aa,Ba,qa){o.beginPath();o.moveTo(V,za);o.lineTo(na,aa);o.lineTo(Ba,qa);o.lineTo(V,za);o.closePath()}function da(V,za,na,aa,Ba,qa,ha,Q){o.beginPath();o.moveTo(V,za);o.lineTo(na,aa);o.lineTo(Ba,qa);o.lineTo(ha,Q);o.lineTo(V,za);o.closePath()}function t(V, -za,na,aa){if(L!=za)o.lineWidth=L=za;if(W!=na)o.lineCap=W=na;if(A!=aa)o.lineJoin=A=aa;d(V);o.stroke();C.inflate(za*2)}function bb(V){if(H!=V)o.fillStyle=H=V;o.fill()}function eb(V,za,na,aa,Ba,qa,ha,Q,Ea,ib,Ya,Za,db){var jb,Ua;jb=ha.width-1;Ua=ha.height-1;Q*=jb;Ea*=Ua;ib*=jb;Ya*=Ua;Za*=jb;db*=Ua;na-=V;aa-=za;Ba-=V;qa-=za;ib-=Q;Ya-=Ea;Za-=Q;db-=Ea;jb=ib*db-Za*Ya;if(jb!=0){Ua=1/jb;jb=(db*na-Ya*Ba)*Ua;Ya=(db*aa-Ya*qa)*Ua;na=(ib*Ba-Za*na)*Ua;aa=(ib*qa-Za*aa)*Ua;V=V-jb*Q-na*Ea;za=za-Ya*Q-aa*Ea;o.save(); -o.transform(jb,Ya,na,aa,V,za);o.clip();o.drawImage(ha,0,0);o.restore()}}function Ta(V,za,na,aa){var Ba=~~(V.r*255),qa=~~(V.g*255);V=~~(V.b*255);var ha=~~(za.r*255),Q=~~(za.g*255);za=~~(za.b*255);var Ea=~~(na.r*255),ib=~~(na.g*255);na=~~(na.b*255);var Ya=~~(aa.r*255),Za=~~(aa.g*255);aa=~~(aa.b*255);I[0]=Ba<0?0:Ba>255?255:Ba;I[1]=qa<0?0:qa>255?255:qa;I[2]=V<0?0:V>255?255:V;I[4]=ha<0?0:ha>255?255:ha;I[5]=Q<0?0:Q>255?255:Q;I[6]=za<0?0:za>255?255:za;I[8]=Ea<0?0:Ea>255?255:Ea;I[9]=ib<0?0:ib>255?255:ib; -I[10]=na<0?0:na>255?255:na;I[12]=Ya<0?0:Ya>255?255:Ya;I[13]=Za<0?0:Za>255?255:Za;I[14]=aa<0?0:aa>255?255:aa;F.putImageData(N,0,0);U.drawImage(P,0,0);return Y}function Qa(V,za,na){V=(V-za)/(na-za);return V*V*(3-2*V)}function hb(V){V=(V+1)*0.5;return V<0?0:V>1?1:V}function gb(V,za){var na=za.x-V.x,aa=za.y-V.y,Ba=1/Math.sqrt(na*na+aa*aa);na*=Ba;aa*=Ba;za.x+=na;za.y+=aa;V.x-=na;V.y-=aa}var cb,fb,sa,Va,Pa,T,Xa,La;this.autoClear?this.clear():o.setTransform(1,0,0,-1,n,p);f=g.projectScene(wa,ra,this.sortElements); -(x=wa.lights.length>0)&&Na(wa);cb=0;for(fb=f.length;cb255?255:Ba;I[1]=qa<0?0:qa>255?255:qa;I[2]=W<0?0:W>255?255:W;I[4]=ha<0?0:ha>255?255:ha;I[5]=Q<0?0:Q>255?255:Q;I[6]=za<0?0:za>255?255:za;I[8]=Ea<0?0:Ea>255?255:Ea;I[9]=ib<0?0:ib>255?255:ib; +I[10]=na<0?0:na>255?255:na;I[12]=Ya<0?0:Ya>255?255:Ya;I[13]=Za<0?0:Za>255?255:Za;I[14]=aa<0?0:aa>255?255:aa;F.putImageData(N,0,0);U.drawImage(P,0,0);return Y}function Qa(W,za,na){W=(W-za)/(na-za);return W*W*(3-2*W)}function hb(W){W=(W+1)*0.5;return W<0?0:W>1?1:W}function gb(W,za){var na=za.x-W.x,aa=za.y-W.y,Ba=1/Math.sqrt(na*na+aa*aa);na*=Ba;aa*=Ba;za.x+=na;za.y+=aa;W.x-=na;W.y-=aa}var cb,fb,sa,Va,Pa,T,Xa,La;this.autoClear?this.clear():o.setTransform(1,0,0,-1,n,p);f=g.projectScene(wa,ra,this.sortElements); +(x=wa.lights.length>0)&&Na(wa);cb=0;for(fb=f.length;cb0){pa.r+=Z.color.r*la;pa.g+=Z.color.g*la;pa.b+=Z.color.b*la}}else if(Z instanceof THREE.PointLight){va.sub(Z.position,oa.centroidWorld);va.normalize();la=oa.normalWorld.dot(va)*Z.intensity;if(la>0){pa.r+=Z.color.r*la;pa.g+=Z.color.g*la;pa.b+=Z.color.b*la}}}}function c(X,oa,pa,ta,ga,Z){ea=f(Aa++); -ea.setAttribute("d","M "+X.positionScreen.x+" "+X.positionScreen.y+" L "+oa.positionScreen.x+" "+oa.positionScreen.y+" L "+pa.positionScreen.x+","+pa.positionScreen.y+"z");if(ga instanceof THREE.MeshBasicMaterial)A.__styleString=ga.color.__styleString;else if(ga instanceof THREE.MeshLambertMaterial)if(W){J.r=O.r;J.g=O.g;J.b=O.b;b(Z,ta,J);A.r=ga.color.r*J.r;A.g=ga.color.g*J.g;A.b=ga.color.b*J.b;A.updateStyleString()}else A.__styleString=ga.color.__styleString;else if(ga instanceof THREE.MeshDepthMaterial){ka= -1-ga.__2near/(ga.__farPlusNear-ta.z*ga.__farMinusNear);A.setRGB(ka,ka,ka)}else ga instanceof THREE.MeshNormalMaterial&&A.setRGB(g(ta.normalWorld.x),g(ta.normalWorld.y),g(ta.normalWorld.z));ga.wireframe?ea.setAttribute("style","fill: none; stroke: "+A.__styleString+"; stroke-width: "+ga.wireframeLinewidth+"; stroke-opacity: "+ga.opacity+"; stroke-linecap: "+ga.wireframeLinecap+"; stroke-linejoin: "+ga.wireframeLinejoin):ea.setAttribute("style","fill: "+A.__styleString+"; fill-opacity: "+ga.opacity); -k.appendChild(ea)}function d(X,oa,pa,ta,ga,Z,la){ea=f(Aa++);ea.setAttribute("d","M "+X.positionScreen.x+" "+X.positionScreen.y+" L "+oa.positionScreen.x+" "+oa.positionScreen.y+" L "+pa.positionScreen.x+","+pa.positionScreen.y+" L "+ta.positionScreen.x+","+ta.positionScreen.y+"z");if(Z instanceof THREE.MeshBasicMaterial)A.__styleString=Z.color.__styleString;else if(Z instanceof THREE.MeshLambertMaterial)if(W){J.r=O.r;J.g=O.g;J.b=O.b;b(la,ga,J);A.r=Z.color.r*J.r;A.g=Z.color.g*J.g;A.b=Z.color.b*J.b; -A.updateStyleString()}else A.__styleString=Z.color.__styleString;else if(Z instanceof THREE.MeshDepthMaterial){ka=1-Z.__2near/(Z.__farPlusNear-ga.z*Z.__farMinusNear);A.setRGB(ka,ka,ka)}else Z instanceof THREE.MeshNormalMaterial&&A.setRGB(g(ga.normalWorld.x),g(ga.normalWorld.y),g(ga.normalWorld.z));Z.wireframe?ea.setAttribute("style","fill: none; stroke: "+A.__styleString+"; stroke-width: "+Z.wireframeLinewidth+"; stroke-opacity: "+Z.opacity+"; stroke-linecap: "+Z.wireframeLinecap+"; stroke-linejoin: "+ +C.addPoint(Fa.positionScreen.x,Fa.positionScreen.y);if(ga.instersects(C)){Va=0;for(Pa=sa.meshMaterials.length;Va0){pa.r+=Z.color.r*la;pa.g+=Z.color.g*la;pa.b+=Z.color.b*la}}else if(Z instanceof THREE.PointLight){va.sub(Z.position,oa.centroidWorld);va.normalize();la=oa.normalWorld.dot(va)*Z.intensity;if(la>0){pa.r+=Z.color.r*la;pa.g+=Z.color.g*la;pa.b+=Z.color.b*la}}}}function c(X,oa,pa,ta,fa,Z){ea=f(Aa++); +ea.setAttribute("d","M "+X.positionScreen.x+" "+X.positionScreen.y+" L "+oa.positionScreen.x+" "+oa.positionScreen.y+" L "+pa.positionScreen.x+","+pa.positionScreen.y+"z");if(fa instanceof THREE.MeshBasicMaterial)A.__styleString=fa.color.__styleString;else if(fa instanceof THREE.MeshLambertMaterial)if(V){J.r=O.r;J.g=O.g;J.b=O.b;b(Z,ta,J);A.r=fa.color.r*J.r;A.g=fa.color.g*J.g;A.b=fa.color.b*J.b;A.updateStyleString()}else A.__styleString=fa.color.__styleString;else if(fa instanceof THREE.MeshDepthMaterial){ka= +1-fa.__2near/(fa.__farPlusNear-ta.z*fa.__farMinusNear);A.setRGB(ka,ka,ka)}else fa instanceof THREE.MeshNormalMaterial&&A.setRGB(g(ta.normalWorld.x),g(ta.normalWorld.y),g(ta.normalWorld.z));fa.wireframe?ea.setAttribute("style","fill: none; stroke: "+A.__styleString+"; stroke-width: "+fa.wireframeLinewidth+"; stroke-opacity: "+fa.opacity+"; stroke-linecap: "+fa.wireframeLinecap+"; stroke-linejoin: "+fa.wireframeLinejoin):ea.setAttribute("style","fill: "+A.__styleString+"; fill-opacity: "+fa.opacity); +k.appendChild(ea)}function d(X,oa,pa,ta,fa,Z,la){ea=f(Aa++);ea.setAttribute("d","M "+X.positionScreen.x+" "+X.positionScreen.y+" L "+oa.positionScreen.x+" "+oa.positionScreen.y+" L "+pa.positionScreen.x+","+pa.positionScreen.y+" L "+ta.positionScreen.x+","+ta.positionScreen.y+"z");if(Z instanceof THREE.MeshBasicMaterial)A.__styleString=Z.color.__styleString;else if(Z instanceof THREE.MeshLambertMaterial)if(V){J.r=O.r;J.g=O.g;J.b=O.b;b(la,fa,J);A.r=Z.color.r*J.r;A.g=Z.color.g*J.g;A.b=Z.color.b*J.b; +A.updateStyleString()}else A.__styleString=Z.color.__styleString;else if(Z instanceof THREE.MeshDepthMaterial){ka=1-Z.__2near/(Z.__farPlusNear-fa.z*Z.__farMinusNear);A.setRGB(ka,ka,ka)}else Z instanceof THREE.MeshNormalMaterial&&A.setRGB(g(fa.normalWorld.x),g(fa.normalWorld.y),g(fa.normalWorld.z));Z.wireframe?ea.setAttribute("style","fill: none; stroke: "+A.__styleString+"; stroke-width: "+Z.wireframeLinewidth+"; stroke-opacity: "+Z.opacity+"; stroke-linecap: "+Z.wireframeLinecap+"; stroke-linejoin: "+ Z.wireframeLinejoin):ea.setAttribute("style","fill: "+A.__styleString+"; fill-opacity: "+Z.opacity);k.appendChild(ea)}function f(X){if($[X]==null){$[X]=document.createElementNS("http://www.w3.org/2000/svg","path");Ha==0&&$[X].setAttribute("shape-rendering","crispEdges")}return $[X]}function g(X){return X<0?Math.min((1+X)*0.5,0.5):0.5+Math.min(X*0.5,0.5)}var h=null,j=new THREE.Projector,k=document.createElementNS("http://www.w3.org/2000/svg","svg"),n,p,o,w,y,v,B,G,H=new THREE.Rectangle,L=new THREE.Rectangle, -W=!1,A=new THREE.Color(16777215),J=new THREE.Color(16777215),O=new THREE.Color(0),R=new THREE.Color(0),Fa=new THREE.Color(0),ka,va=new THREE.Vector3,$=[],e=[],ea,Aa,Ca,Ha=1;this.domElement=k;this.autoClear=!0;this.sortObjects=!0;this.sortElements=!0;this.setQuality=function(X){switch(X){case "high":Ha=1;break;case "low":Ha=0}};this.setSize=function(X,oa){n=X;p=oa;o=n/2;w=p/2;k.setAttribute("viewBox",-o+" "+-w+" "+n+" "+p);k.setAttribute("width",n);k.setAttribute("height",p);H.set(-o,-w,o,w)};this.clear= -function(){for(;k.childNodes.length>0;)k.removeChild(k.childNodes[0])};this.render=function(X,oa){var pa,ta,ga,Z,la,Ga,ia,ja;this.autoClear&&this.clear();h=j.projectScene(X,oa,this.sortElements);Ca=Aa=0;if(W=X.lights.length>0){ia=X.lights;O.setRGB(0,0,0);R.setRGB(0,0,0);Fa.setRGB(0,0,0);pa=0;for(ta=ia.length;pa0;)k.removeChild(k.childNodes[0])};this.render=function(X,oa){var pa,ta,fa,Z,la,Ga,ia,ja;this.autoClear&&this.clear();h=j.projectScene(X,oa,this.sortElements);Ca=Aa=0;if(V=X.lights.length>0){ia=X.lights;O.setRGB(0,0,0);R.setRGB(0,0,0);Fa.setRGB(0,0,0);pa=0;for(ta=ia.length;pa0&&wa[0]0&&wa[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;Y=E.size*E.scale/ja;U[0]= +I){e.disable(e.DEPTH_TEST);e.depthMask(z.blending===THREE.NormalBlending?!0:!1);I=!1}e.depthMask(!0);J(z.blending);R(z.map,0);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(X)}function G(m,C){var x,u,z=m.__webglLensFlares.length,K,M,E,P=new THREE.Vector3,F=ja/ia,N=ia*0.5,I=ja*0.5,Y=16/ja,U=[Y*F,Y],ya=[1,1,0],wa=[1,1],ra=ga.uniforms;x=ga.attributes;e.useProgram(ga.program);Ca=ga.program;fa="";e.uniform1i(ra.occlusionMap,0);e.uniform1i(ra.map, +1);e.bindBuffer(e.ARRAY_BUFFER,ga.vertexBuffer);e.vertexAttribPointer(x.vertex,2,e.FLOAT,!1,16,0);e.vertexAttribPointer(x.uv,2,e.FLOAT,!1,16,8);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,ga.elementBuffer);e.disable(e.CULL_FACE);e.depthMask(!1);e.activeTexture(e.TEXTURE0);e.bindTexture(e.TEXTURE_2D,ga.occlusionTexture);e.activeTexture(e.TEXTURE1);for(u=0;u0&&wa[0]0&&wa[1]0.0010&&E.scale>0.0010){ya[0]=E.x;ya[1]=E.y;ya[2]=E.z;Y=E.size*E.scale/ja;U[0]= Y*F;U[1]=Y;e.uniform3fv(ra.screenPosition,ya);e.uniform2fv(ra.scale,U);e.uniform1f(ra.rotation,E.rotation);e.uniform1f(ra.opacity,E.opacity);J(E.blending);R(E.texture,1);e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}}}e.enable(e.CULL_FACE);e.enable(e.DEPTH_TEST);e.depthMask(X)}function H(m,C){m._modelViewMatrix.multiplyToArray(C.matrixWorldInverse,m.matrixWorld,m._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(m._modelViewMatrix).transposeIntoArray(m._normalMatrixArray)}function L(m){var C, x,u,z,K;if(m instanceof THREE.Mesh){x=m.geometry;for(C in x.geometryGroups){u=x.geometryGroups[C];K=!1;for(z in u.__webglCustomAttributes)if(u.__webglCustomAttributes[z].needsUpdate){K=!0;break}if(x.__dirtyVertices||x.__dirtyMorphTargets||x.__dirtyElements||x.__dirtyUvs||x.__dirtyNormals||x.__dirtyColors||x.__dirtyTangents||K){K=e.DYNAMIC_DRAW;var M=void 0,E=void 0,P=void 0,F=void 0;P=void 0;var N=void 0,I=void 0,Y=void 0,U=void 0,ya=void 0,wa=void 0,ra=void 0,Na=void 0,Sa=void 0,Ka=void 0,Ja=void 0, -Ia=void 0,Wa=void 0;I=void 0;Y=void 0;F=void 0;U=void 0;F=void 0;var D=void 0,da=void 0;I=void 0;D=void 0;da=void 0;var t=void 0,bb=void 0;D=void 0;da=void 0;t=void 0;bb=void 0;D=void 0;da=void 0;t=void 0;bb=void 0;D=void 0;da=void 0;t=void 0;F=void 0;U=void 0;N=void 0;P=void 0;P=void 0;D=void 0;da=void 0;t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;da=D=0;var La=u.__vertexArray,V=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,aa=u.__tangentArray,Ba=u.__colorArray, +Ia=void 0,Wa=void 0;I=void 0;Y=void 0;F=void 0;U=void 0;F=void 0;var D=void 0,da=void 0;I=void 0;D=void 0;da=void 0;var t=void 0,bb=void 0;D=void 0;da=void 0;t=void 0;bb=void 0;D=void 0;da=void 0;t=void 0;bb=void 0;D=void 0;da=void 0;t=void 0;F=void 0;U=void 0;N=void 0;P=void 0;P=void 0;D=void 0;da=void 0;t=void 0;var eb=void 0,Ta=0,Qa=0,hb=0,gb=0,cb=0,fb=0,sa=0,Va=0,Pa=0,T=0,Xa=0;da=D=0;var La=u.__vertexArray,W=u.__uvArray,za=u.__uv2Array,na=u.__normalArray,aa=u.__tangentArray,Ba=u.__colorArray, qa=u.__skinVertexAArray,ha=u.__skinVertexBArray,Q=u.__skinIndexArray,Ea=u.__skinWeightArray,ib=u.__morphTargetsArrays,Ya=u.__webglCustomAttributes;t=void 0;var Za=u.__faceArray,db=u.__lineArray,jb=u.__needsSmoothNormals;wa=u.__vertexColorType;ya=u.__uvType;ra=u.__normalType;var Ua=m.geometry,sb=Ua.__dirtyVertices,tb=Ua.__dirtyElements,rb=Ua.__dirtyUvs,ub=Ua.__dirtyNormals,vb=Ua.__dirtyTangents,wb=Ua.__dirtyColors,xb=Ua.__dirtyMorphTargets,nb=Ua.vertices,yb=u.faces,Bb=Ua.faces,zb=Ua.faceVertexUvs[0], Ab=Ua.faceVertexUvs[1],ob=Ua.skinVerticesA,pb=Ua.skinVerticesB,qb=Ua.skinIndices,lb=Ua.skinWeights,mb=Ua.edgeFaces,kb=Ua.morphTargets;if(Ya)for(eb in Ya){Ya[eb].offset=0;Ya[eb].offsetSrc=0}M=0;for(E=yb.length;M0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglColorBuffer);e.bufferData(e.ARRAY_BUFFER, -Ba,K)}if(ub){e.bindBuffer(e.ARRAY_BUFFER,u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,K)}if(vb&&Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,aa,K)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER,V,K)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,K)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,K); +Ba,K)}if(ub){e.bindBuffer(e.ARRAY_BUFFER,u.__webglNormalBuffer);e.bufferData(e.ARRAY_BUFFER,na,K)}if(vb&&Ua.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,u.__webglTangentBuffer);e.bufferData(e.ARRAY_BUFFER,aa,K)}if(rb&&hb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUVBuffer);e.bufferData(e.ARRAY_BUFFER,W,K)}if(rb&&gb>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglUV2Buffer);e.bufferData(e.ARRAY_BUFFER,za,K)}if(tb){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Za,K); e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,u.__webglLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,db,K)}if(T>0){e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,qa,K);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,ha,K);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinIndicesBuffer);e.bufferData(e.ARRAY_BUFFER,Q,K);e.bindBuffer(e.ARRAY_BUFFER,u.__webglSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,Ea,K)}}}x.__dirtyVertices=!1;x.__dirtyMorphTargets= !1;x.__dirtyElements=!1;x.__dirtyUvs=!1;x.__dirtyNormals=!1;x.__dirtyTangents=!1;x.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){x=m.geometry;if(x.__dirtyVertices||x.__dirtyColors){m=x;C=e.DYNAMIC_DRAW;wa=m.vertices;u=m.colors;ra=wa.length;K=u.length;Na=m.__vertexArray;M=m.__colorArray;Sa=m.__dirtyColors;if(m.__dirtyVertices){for(E=0;E65535){N[P].counter+=1;F=N[P].hash+"_"+N[P].counter;m.geometryGroups[F]==undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z);m.geometryGroups[F].vertices+=M}}function A(m,C,x){m.push({buffer:C,object:x,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function J(m){if(m!=ga){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD); -e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}ga=m}}function O(m,C,x){if((x.width&x.width-1)==0&&(x.height&x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,$(C.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,$(C.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,$(C.magFilter)); +M>65535){N[P].counter+=1;F=N[P].hash+"_"+N[P].counter;m.geometryGroups[F]==undefined&&(m.geometryGroups[F]={faces:[],materials:E,vertices:0,numMorphTargets:I})}m.geometryGroups[F].faces.push(z);m.geometryGroups[F].vertices+=M}}function A(m,C,x){m.push({buffer:C,object:x,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function J(m){if(m!=fa){switch(m){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD); +e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}fa=m}}function O(m,C,x){if((x.width&x.width-1)==0&&(x.height&x.height-1)==0){e.texParameteri(m,e.TEXTURE_WRAP_S,$(C.wrapS));e.texParameteri(m,e.TEXTURE_WRAP_T,$(C.wrapT));e.texParameteri(m,e.TEXTURE_MAG_FILTER,$(C.magFilter)); e.texParameteri(m,e.TEXTURE_MIN_FILTER,$(C.minFilter));e.generateMipmap(m)}else{e.texParameteri(m,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(m,e.TEXTURE_MAG_FILTER,va(C.magFilter));e.texParameteri(m,e.TEXTURE_MIN_FILTER,va(C.minFilter))}}function R(m,C){if(m.needsUpdate){if(m.__webglInit){e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,m.image)}else{m.__webglTexture=e.createTexture(); e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,m.image);m.__webglInit=!0}O(e.TEXTURE_2D,m,m.image);e.bindTexture(e.TEXTURE_2D,null);m.needsUpdate=!1}e.activeTexture(e.TEXTURE0+C);e.bindTexture(e.TEXTURE_2D,m.__webglTexture)}function Fa(m){if(m&&!m.__webglFramebuffer){if(m.depthBuffer===undefined)m.depthBuffer=!0;if(m.stencilBuffer===undefined)m.stencilBuffer=!0;m.__webglFramebuffer=e.createFramebuffer();m.__webglRenderbuffer=e.createRenderbuffer(); m.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,m.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,$(m.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,$(m.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,$(m.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,$(m.minFilter));e.texImage2D(e.TEXTURE_2D,0,$(m.format),m.width,m.height,0,$(m.format),$(m.type),null);e.bindRenderbuffer(e.RENDERBUFFER,m.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER, @@ -303,17 +303,17 @@ m.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e m.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,m.width,m.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var C,x;if(m){C=m.__webglFramebuffer;x=m.width;m=m.height}else{C=null;x=ia;m=ja}if(C!=Ha){e.bindFramebuffer(e.FRAMEBUFFER,C);e.viewport(la,Ga,x,m);Ha=C}}function ka(m,C){var x;if(m=="fragment")x=e.createShader(e.FRAGMENT_SHADER);else m=="vertex"&&(x=e.createShader(e.VERTEX_SHADER));e.shaderSource(x, C);e.compileShader(x);if(!e.getShaderParameter(x,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(x));console.error(C);return null}return x}function va(m){switch(m){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;default:return e.LINEAR}}function $(m){switch(m){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST; case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT;case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT; -case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var e,ea=document.createElement("canvas"),Aa=[],Ca=null,Ha=null,X=!0,oa=this,pa=null,ta=null,ga=null,Z=null,la=0,Ga=0,ia=0,ja=0,ua=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4, +case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var e,ea=document.createElement("canvas"),Aa=[],Ca=null,Ha=null,X=!0,oa=this,pa=null,ta=null,fa=null,Z=null,la=0,Ga=0,ia=0,ja=0,ua=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4, new THREE.Vector4,new THREE.Vector4],Ra=new THREE.Matrix4,$a=new Float32Array(16),ab=new Float32Array(16),Oa=new THREE.Vector4,S={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},ca=!0,ma=!0,Da=new THREE.Color(0),Ma=0;if(b){if(b.stencil!=undefined)ca=b.stencil;if(b.antialias!==undefined)ma=b.antialias;b.clearColor!==undefined&&Da.setHex(b.clearColor);if(b.clearAlpha!==undefined)Ma=b.clearAlpha}this.maxMorphTargets=8;this.domElement= ea;this.autoClear=!0;this.sortObjects=!0;(function(m,C,x,u){try{if(!(e=ea.getContext("experimental-webgl",{antialias:m,stencil:u})))throw"Error creating WebGL context.";}catch(z){console.error(z)}e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);e.cullFace(e.BACK);e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.clearColor(C.r,C.g,C.b,x)})(ma,Da,Ma,ca);this.context=e;if(ca){var xa= {};xa.vertices=new Float32Array(12);xa.faces=new Uint16Array(6);xa.darkness=0.5;xa.vertices[0]=-20;xa.vertices[1]=-20;xa.vertices[2]=-1;xa.vertices[3]=20;xa.vertices[4]=-20;xa.vertices[5]=-1;xa.vertices[6]=20;xa.vertices[7]=20;xa.vertices[8]=-1;xa.vertices[9]=-20;xa.vertices[10]=20;xa.vertices[11]=-1;xa.faces[0]=0;xa.faces[1]=1;xa.faces[2]=2;xa.faces[3]=0;xa.faces[4]=2;xa.faces[5]=3;xa.vertexBuffer=e.createBuffer();xa.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,xa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER, xa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,xa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,xa.faces,e.STATIC_DRAW);xa.program=e.createProgram();e.attachShader(xa.program,ka("fragment",THREE.ShaderLib.shadowPost.fragmentShader));e.attachShader(xa.program,ka("vertex",THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(xa.program);xa.vertexLocation=e.getAttribLocation(xa.program,"position");xa.projectionLocation=e.getUniformLocation(xa.program,"projectionMatrix");xa.darknessLocation= -e.getUniformLocation(xa.program,"darkness")}var fa={};fa.vertices=new Float32Array(16);fa.faces=new Uint16Array(6);b=0;fa.vertices[b++]=-1;fa.vertices[b++]=-1;fa.vertices[b++]=0;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=1;fa.vertices[b++]=-1;fa.vertices[b++]=1;fa.vertices[b++]=0;fa.vertices[b++]=1;b=0;fa.faces[b++]=0;fa.faces[b++]=1;fa.faces[b++]=2;fa.faces[b++]=0;fa.faces[b++]= -2;fa.faces[b++]=3;fa.vertexBuffer=e.createBuffer();fa.elementBuffer=e.createBuffer();fa.tempTexture=e.createTexture();fa.occlusionTexture=e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,fa.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,fa.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,fa.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,fa.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,fa.tempTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D, -e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.bindTexture(e.TEXTURE_2D,fa.occlusionTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER, -e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){fa.hasVertexTexture=!1;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(fa.program,ka("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{fa.hasVertexTexture=!0;fa.program=e.createProgram();e.attachShader(fa.program,ka("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(fa.program, -ka("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(fa.program);fa.attributes={};fa.uniforms={};fa.attributes.vertex=e.getAttribLocation(fa.program,"position");fa.attributes.uv=e.getAttribLocation(fa.program,"UV");fa.uniforms.renderType=e.getUniformLocation(fa.program,"renderType");fa.uniforms.map=e.getUniformLocation(fa.program,"map");fa.uniforms.occlusionMap=e.getUniformLocation(fa.program,"occlusionMap");fa.uniforms.opacity=e.getUniformLocation(fa.program,"opacity"); -fa.uniforms.scale=e.getUniformLocation(fa.program,"scale");fa.uniforms.rotation=e.getUniformLocation(fa.program,"rotation");fa.uniforms.screenPosition=e.getUniformLocation(fa.program,"screenPosition");_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]= +e.getUniformLocation(xa.program,"darkness")}var ga={};ga.vertices=new Float32Array(16);ga.faces=new Uint16Array(6);b=0;ga.vertices[b++]=-1;ga.vertices[b++]=-1;ga.vertices[b++]=0;ga.vertices[b++]=0;ga.vertices[b++]=1;ga.vertices[b++]=-1;ga.vertices[b++]=1;ga.vertices[b++]=0;ga.vertices[b++]=1;ga.vertices[b++]=1;ga.vertices[b++]=1;ga.vertices[b++]=1;ga.vertices[b++]=-1;ga.vertices[b++]=1;ga.vertices[b++]=0;ga.vertices[b++]=1;b=0;ga.faces[b++]=0;ga.faces[b++]=1;ga.faces[b++]=2;ga.faces[b++]=0;ga.faces[b++]= +2;ga.faces[b++]=3;ga.vertexBuffer=e.createBuffer();ga.elementBuffer=e.createBuffer();ga.tempTexture=e.createTexture();ga.occlusionTexture=e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,ga.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,ga.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,ga.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,ga.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,ga.tempTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D, +e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.bindTexture(e.TEXTURE_2D,ga.occlusionTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER, +e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){ga.hasVertexTexture=!1;ga.program=e.createProgram();e.attachShader(ga.program,ka("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(ga.program,ka("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{ga.hasVertexTexture=!0;ga.program=e.createProgram();e.attachShader(ga.program,ka("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(ga.program, +ka("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(ga.program);ga.attributes={};ga.uniforms={};ga.attributes.vertex=e.getAttribLocation(ga.program,"position");ga.attributes.uv=e.getAttribLocation(ga.program,"UV");ga.uniforms.renderType=e.getUniformLocation(ga.program,"renderType");ga.uniforms.map=e.getUniformLocation(ga.program,"map");ga.uniforms.occlusionMap=e.getUniformLocation(ga.program,"occlusionMap");ga.uniforms.opacity=e.getUniformLocation(ga.program,"opacity"); +ga.uniforms.scale=e.getUniformLocation(ga.program,"scale");ga.uniforms.rotation=e.getUniformLocation(ga.program,"rotation");ga.uniforms.screenPosition=e.getUniformLocation(ga.program,"screenPosition");_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]= 1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer=e.createBuffer();_sprite.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,_sprite.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,_sprite.faces,e.STATIC_DRAW);_sprite.program=e.createProgram();e.attachShader(_sprite.program,ka("fragment",THREE.ShaderLib.sprite.fragmentShader));e.attachShader(_sprite.program,ka("vertex",THREE.ShaderLib.sprite.vertexShader));e.linkProgram(_sprite.program);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=e.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=e.getAttribLocation(_sprite.program,"uv"); _sprite.uniforms.uvOffset=e.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=e.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=e.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=e.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment=e.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map=e.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=e.getUniformLocation(_sprite.program,"opacity"); @@ -333,7 +333,7 @@ Ra.multiply(C.projectionMatrix,C.matrixWorldInverse);k(Ra);this.initWebGLObjects for(u=0;u0){j(0,0,-o-(h||0));for(n=b;n0){j(0,0,o+(g||0));for(n= b+b/2;n<2*b;n++)k.faces.push(new THREE.Face4(2*b+1,(2*n-2*b+2)%b+b,(2*n-2*b+1)%b+b,(2*n-2*b)%b+b))}n=0;for(b=this.faces.length;n>7)-127;ma|=(Ma&127)<<16|Da<<8;if(ma==0&&fa==-127)return 0;return(1-2*(xa>>7))*(1+ma*Math.pow(2,-23))*Math.pow(2,fa)}function k(S,ca){var ma=o(S,ca),Da=o(S,ca+1),Ma=o(S,ca+2);return(o(S,ca+3)<<24)+(Ma<<16)+(Da<<8)+ma}function n(S,ca){var ma=o(S,ca);return(o(S,ca+1)<<8)+ma}function p(S,ca){var ma=o(S, -ca);return ma>127?ma-256:ma}function o(S,ca){return S.charCodeAt(ca)&255}function w(S){var ca,ma,Da;ca=k(b,S);ma=k(b,S+R);Da=k(b,S+Fa);S=n(b,S+ka);THREE.BinaryLoader.prototype.f3(L,ca,ma,Da,S)}function y(S){var ca,ma,Da,Ma,xa,fa;ca=k(b,S);ma=k(b,S+R);Da=k(b,S+Fa);Ma=n(b,S+ka);xa=k(b,S+va);fa=k(b,S+$);S=k(b,S+e);THREE.BinaryLoader.prototype.f3n(L,J,ca,ma,Da,Ma,xa,fa,S)}function v(S){var ca,ma,Da,Ma;ca=k(b,S);ma=k(b,S+ea);Da=k(b,S+Aa);Ma=k(b,S+Ca);S=n(b,S+Ha);THREE.BinaryLoader.prototype.f4(L,ca,ma, -Da,Ma,S)}function B(S){var ca,ma,Da,Ma,xa,fa,m,C;ca=k(b,S);ma=k(b,S+ea);Da=k(b,S+Aa);Ma=k(b,S+Ca);xa=n(b,S+Ha);fa=k(b,S+X);m=k(b,S+oa);C=k(b,S+pa);S=k(b,S+ta);THREE.BinaryLoader.prototype.f4n(L,J,ca,ma,Da,Ma,xa,fa,m,C,S)}function G(S){var ca,ma;ca=k(b,S);ma=k(b,S+ga);S=k(b,S+Z);THREE.BinaryLoader.prototype.uv3(L.faceVertexUvs[0],O[ca*2],O[ca*2+1],O[ma*2],O[ma*2+1],O[S*2],O[S*2+1])}function H(S){var ca,ma,Da;ca=k(b,S);ma=k(b,S+la);Da=k(b,S+Ga);S=k(b,S+ia);THREE.BinaryLoader.prototype.uv4(L.faceVertexUvs[0], -O[ca*2],O[ca*2+1],O[ma*2],O[ma*2+1],O[Da*2],O[Da*2+1],O[S*2],O[S*2+1])}var L=this,W=0,A,J=[],O=[],R,Fa,ka,va,$,e,ea,Aa,Ca,Ha,X,oa,pa,ta,ga,Z,la,Ga,ia,ja,ua,Ra,$a,ab,Oa;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(L,f,h);A={signature:b.substr(W,8),header_bytes:o(b,W+8),vertex_coordinate_bytes:o(b,W+9),normal_coordinate_bytes:o(b,W+10),uv_coordinate_bytes:o(b,W+11),vertex_index_bytes:o(b,W+12),normal_index_bytes:o(b,W+13),uv_index_bytes:o(b,W+14),material_index_bytes:o(b,W+15),nvertices:k(b, -W+16),nnormals:k(b,W+16+4),nuvs:k(b,W+16+8),ntri_flat:k(b,W+16+12),ntri_smooth:k(b,W+16+16),ntri_flat_uv:k(b,W+16+20),ntri_smooth_uv:k(b,W+16+24),nquad_flat:k(b,W+16+28),nquad_smooth:k(b,W+16+32),nquad_flat_uv:k(b,W+16+36),nquad_smooth_uv:k(b,W+16+40)};W+=A.header_bytes;R=A.vertex_index_bytes;Fa=A.vertex_index_bytes*2;ka=A.vertex_index_bytes*3;va=A.vertex_index_bytes*3+A.material_index_bytes;$=A.vertex_index_bytes*3+A.material_index_bytes+A.normal_index_bytes;e=A.vertex_index_bytes*3+A.material_index_bytes+ -A.normal_index_bytes*2;ea=A.vertex_index_bytes;Aa=A.vertex_index_bytes*2;Ca=A.vertex_index_bytes*3;Ha=A.vertex_index_bytes*4;X=A.vertex_index_bytes*4+A.material_index_bytes;oa=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes;pa=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes*2;ta=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes*3;ga=A.uv_index_bytes;Z=A.uv_index_bytes*2;la=A.uv_index_bytes;Ga=A.uv_index_bytes*2;ia=A.uv_index_bytes*3;h=A.vertex_index_bytes* -3+A.material_index_bytes;Oa=A.vertex_index_bytes*4+A.material_index_bytes;ja=A.ntri_flat*h;ua=A.ntri_smooth*(h+A.normal_index_bytes*3);Ra=A.ntri_flat_uv*(h+A.uv_index_bytes*3);$a=A.ntri_smooth_uv*(h+A.normal_index_bytes*3+A.uv_index_bytes*3);ab=A.nquad_flat*Oa;h=A.nquad_smooth*(Oa+A.normal_index_bytes*4);Oa=A.nquad_flat_uv*(Oa+A.uv_index_bytes*4);W+=function(S){for(var ca,ma,Da,Ma=A.vertex_coordinate_bytes*3,xa=S+A.nvertices*Ma;S>7)-127;ma|=(Ma&127)<<16|Da<<8;if(ma==0&&ga==-127)return 0;return(1-2*(xa>>7))*(1+ma*Math.pow(2,-23))*Math.pow(2,ga)}function k(S,ca){var ma=o(S,ca),Da=o(S,ca+1),Ma=o(S,ca+2);return(o(S,ca+3)<<24)+(Ma<<16)+(Da<<8)+ma}function n(S,ca){var ma=o(S,ca);return(o(S,ca+1)<<8)+ma}function p(S,ca){var ma=o(S, +ca);return ma>127?ma-256:ma}function o(S,ca){return S.charCodeAt(ca)&255}function w(S){var ca,ma,Da;ca=k(b,S);ma=k(b,S+R);Da=k(b,S+Fa);S=n(b,S+ka);THREE.BinaryLoader.prototype.f3(L,ca,ma,Da,S)}function y(S){var ca,ma,Da,Ma,xa,ga;ca=k(b,S);ma=k(b,S+R);Da=k(b,S+Fa);Ma=n(b,S+ka);xa=k(b,S+va);ga=k(b,S+$);S=k(b,S+e);THREE.BinaryLoader.prototype.f3n(L,J,ca,ma,Da,Ma,xa,ga,S)}function v(S){var ca,ma,Da,Ma;ca=k(b,S);ma=k(b,S+ea);Da=k(b,S+Aa);Ma=k(b,S+Ca);S=n(b,S+Ha);THREE.BinaryLoader.prototype.f4(L,ca,ma, +Da,Ma,S)}function B(S){var ca,ma,Da,Ma,xa,ga,m,C;ca=k(b,S);ma=k(b,S+ea);Da=k(b,S+Aa);Ma=k(b,S+Ca);xa=n(b,S+Ha);ga=k(b,S+X);m=k(b,S+oa);C=k(b,S+pa);S=k(b,S+ta);THREE.BinaryLoader.prototype.f4n(L,J,ca,ma,Da,Ma,xa,ga,m,C,S)}function G(S){var ca,ma;ca=k(b,S);ma=k(b,S+fa);S=k(b,S+Z);THREE.BinaryLoader.prototype.uv3(L.faceVertexUvs[0],O[ca*2],O[ca*2+1],O[ma*2],O[ma*2+1],O[S*2],O[S*2+1])}function H(S){var ca,ma,Da;ca=k(b,S);ma=k(b,S+la);Da=k(b,S+Ga);S=k(b,S+ia);THREE.BinaryLoader.prototype.uv4(L.faceVertexUvs[0], +O[ca*2],O[ca*2+1],O[ma*2],O[ma*2+1],O[Da*2],O[Da*2+1],O[S*2],O[S*2+1])}var L=this,V=0,A,J=[],O=[],R,Fa,ka,va,$,e,ea,Aa,Ca,Ha,X,oa,pa,ta,fa,Z,la,Ga,ia,ja,ua,Ra,$a,ab,Oa;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(L,f,h);A={signature:b.substr(V,8),header_bytes:o(b,V+8),vertex_coordinate_bytes:o(b,V+9),normal_coordinate_bytes:o(b,V+10),uv_coordinate_bytes:o(b,V+11),vertex_index_bytes:o(b,V+12),normal_index_bytes:o(b,V+13),uv_index_bytes:o(b,V+14),material_index_bytes:o(b,V+15),nvertices:k(b, +V+16),nnormals:k(b,V+16+4),nuvs:k(b,V+16+8),ntri_flat:k(b,V+16+12),ntri_smooth:k(b,V+16+16),ntri_flat_uv:k(b,V+16+20),ntri_smooth_uv:k(b,V+16+24),nquad_flat:k(b,V+16+28),nquad_smooth:k(b,V+16+32),nquad_flat_uv:k(b,V+16+36),nquad_smooth_uv:k(b,V+16+40)};V+=A.header_bytes;R=A.vertex_index_bytes;Fa=A.vertex_index_bytes*2;ka=A.vertex_index_bytes*3;va=A.vertex_index_bytes*3+A.material_index_bytes;$=A.vertex_index_bytes*3+A.material_index_bytes+A.normal_index_bytes;e=A.vertex_index_bytes*3+A.material_index_bytes+ +A.normal_index_bytes*2;ea=A.vertex_index_bytes;Aa=A.vertex_index_bytes*2;Ca=A.vertex_index_bytes*3;Ha=A.vertex_index_bytes*4;X=A.vertex_index_bytes*4+A.material_index_bytes;oa=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes;pa=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes*2;ta=A.vertex_index_bytes*4+A.material_index_bytes+A.normal_index_bytes*3;fa=A.uv_index_bytes;Z=A.uv_index_bytes*2;la=A.uv_index_bytes;Ga=A.uv_index_bytes*2;ia=A.uv_index_bytes*3;h=A.vertex_index_bytes* +3+A.material_index_bytes;Oa=A.vertex_index_bytes*4+A.material_index_bytes;ja=A.ntri_flat*h;ua=A.ntri_smooth*(h+A.normal_index_bytes*3);Ra=A.ntri_flat_uv*(h+A.uv_index_bytes*3);$a=A.ntri_smooth_uv*(h+A.normal_index_bytes*3+A.uv_index_bytes*3);ab=A.nquad_flat*Oa;h=A.nquad_smooth*(Oa+A.normal_index_bytes*4);Oa=A.nquad_flat_uv*(Oa+A.uv_index_bytes*4);V+=function(S){for(var ca,ma,Da,Ma=A.vertex_coordinate_bytes*3,xa=S+A.nvertices*Ma;S=this.maxCount-3&&k(this)};this.begin=function(){this.count=0;this.hasPos=!1;this.hasNormal=!1};this.end=function(d){if(this.count!=0){for(var f=this.count*3;fthis.size-1&&(n=this.size-1);var y=Math.floor(p-k);y<1&&(y=1);p=Math.floor(p+k);p>this.size-1&&(p= -this.size-1);var v=Math.floor(o-k);v<1&&(v=1);k=Math.floor(o+k);k>this.size-1&&(k=this.size-1);for(var B,G,H,L,W,A;w0&&(this.field[H+B]+=L)}}}};this.addPlaneX=function(d,f){var g,h,j,k,n,p=this.size,o=this.yd,w=this.zd,y=this.field,v=p*Math.sqrt(d/f);v>p&&(v=p);for(g=0;g0)for(h=0;hthis.size-1&&(k=this.size-1);for(var B,G,H,L,V,A;w0&&(this.field[H+B]+=L)}}}};this.addPlaneX=function(d,f){var g,h,j,k,n,p=this.size,o=this.yd,w=this.zd,y=this.field,v=p*Math.sqrt(d/f);v>p&&(v=p);for(g=0;g0)for(h=0;ho&&(B=o);for(h=0;h0){n=h*w;for(g=0;gsize&&(dist=size);for(j=0;j0){n=zd*j;for(h=0;h>7)-127;A|=(H&127)<<16|D<<8;if(A==0&&U==-127)return 0;return(1-2*(S>>7))*(1+A*Math.pow(2,-23))*Math.pow(2,U)}function h(o,v){var A=k(o,v),D=k(o,v+1),H=k(o,v+2);return(k(o,v+3)<<24)+(H<<16)+(D<<8)+A}function j(o,v){var A=k(o,v);return(k(o,v+1)<<8)+A}function m(o,v){var A=k(o,v);return A>127?A-256:A}function k(o, -v){return o.charCodeAt(v)&255}function n(o){var v,A,D;v=h(a,o);A=h(a,o+G);D=h(a,o+K);o=j(a,o+J);THREE.BinaryLoader.prototype.f3(B,v,A,D,o)}function p(o){var v,A,D,H,S,U;v=h(a,o);A=h(a,o+G);D=h(a,o+K);H=j(a,o+J);S=h(a,o+I);U=h(a,o+E);o=h(a,o+L);THREE.BinaryLoader.prototype.f3n(B,y,v,A,D,H,S,U,o)}function t(o){var v,A,D,H;v=h(a,o);A=h(a,o+P);D=h(a,o+Q);H=h(a,o+R);o=j(a,o+M);THREE.BinaryLoader.prototype.f4(B,v,A,D,H,o)}function w(o){var v,A,D,H,S,U,ca,da;v=h(a,o);A=h(a,o+P);D=h(a,o+Q);H=h(a,o+R);S=j(a, -o+M);U=h(a,o+F);ca=h(a,o+N);da=h(a,o+O);o=h(a,o+T);THREE.BinaryLoader.prototype.f4n(B,y,v,A,D,H,S,U,ca,da,o)}function x(o){var v,A;v=h(a,o);A=h(a,o+W);o=h(a,o+X);THREE.BinaryLoader.prototype.uv3(B.faceVertexUvs[0],C[v*2],C[v*2+1],C[A*2],C[A*2+1],C[o*2],C[o*2+1])}function u(o){var v,A,D;v=h(a,o);A=h(a,o+ea);D=h(a,o+fa);o=h(a,o+ga);THREE.BinaryLoader.prototype.uv4(B.faceVertexUvs[0],C[v*2],C[v*2+1],C[A*2],C[A*2+1],C[D*2],C[D*2+1],C[o*2],C[o*2+1])}var B=this,z=0,l,y=[],C=[],G,K,J,I,E,L,P,Q,R,M,F,N,O, -T,W,X,ea,fa,ga,Y,Z,$,aa,ba,V;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(B,e,d);l={signature:a.substr(z,8),header_bytes:k(a,z+8),vertex_coordinate_bytes:k(a,z+9),normal_coordinate_bytes:k(a,z+10),uv_coordinate_bytes:k(a,z+11),vertex_index_bytes:k(a,z+12),normal_index_bytes:k(a,z+13),uv_index_bytes:k(a,z+14),material_index_bytes:k(a,z+15),nvertices:h(a,z+16),nnormals:h(a,z+16+4),nuvs:h(a,z+16+8),ntri_flat:h(a,z+16+12),ntri_smooth:h(a,z+16+16),ntri_flat_uv:h(a,z+16+20),ntri_smooth_uv:h(a, +g.setRequestHeader("Content-Type","text/plain");g.send(null)},createBinModel:function(a,f,b,e){var c=function(d){function g(o,v){var A=k(o,v),D=k(o,v+1),H=k(o,v+2),S=k(o,v+3),V=(S<<1&255|H>>7)-127;A|=(H&127)<<16|D<<8;if(A==0&&V==-127)return 0;return(1-2*(S>>7))*(1+A*Math.pow(2,-23))*Math.pow(2,V)}function h(o,v){var A=k(o,v),D=k(o,v+1),H=k(o,v+2);return(k(o,v+3)<<24)+(H<<16)+(D<<8)+A}function j(o,v){var A=k(o,v);return(k(o,v+1)<<8)+A}function m(o,v){var A=k(o,v);return A>127?A-256:A}function k(o, +v){return o.charCodeAt(v)&255}function n(o){var v,A,D;v=h(a,o);A=h(a,o+G);D=h(a,o+K);o=j(a,o+J);THREE.BinaryLoader.prototype.f3(B,v,A,D,o)}function p(o){var v,A,D,H,S,V;v=h(a,o);A=h(a,o+G);D=h(a,o+K);H=j(a,o+J);S=h(a,o+I);V=h(a,o+E);o=h(a,o+L);THREE.BinaryLoader.prototype.f3n(B,y,v,A,D,H,S,V,o)}function t(o){var v,A,D,H;v=h(a,o);A=h(a,o+P);D=h(a,o+Q);H=h(a,o+R);o=j(a,o+M);THREE.BinaryLoader.prototype.f4(B,v,A,D,H,o)}function w(o){var v,A,D,H,S,V,ca,da;v=h(a,o);A=h(a,o+P);D=h(a,o+Q);H=h(a,o+R);S=j(a, +o+M);V=h(a,o+F);ca=h(a,o+N);da=h(a,o+O);o=h(a,o+T);THREE.BinaryLoader.prototype.f4n(B,y,v,A,D,H,S,V,ca,da,o)}function x(o){var v,A;v=h(a,o);A=h(a,o+U);o=h(a,o+X);THREE.BinaryLoader.prototype.uv3(B.faceVertexUvs[0],C[v*2],C[v*2+1],C[A*2],C[A*2+1],C[o*2],C[o*2+1])}function u(o){var v,A,D;v=h(a,o);A=h(a,o+ea);D=h(a,o+fa);o=h(a,o+ga);THREE.BinaryLoader.prototype.uv4(B.faceVertexUvs[0],C[v*2],C[v*2+1],C[A*2],C[A*2+1],C[D*2],C[D*2+1],C[o*2],C[o*2+1])}var B=this,z=0,l,y=[],C=[],G,K,J,I,E,L,P,Q,R,M,F,N,O, +T,U,X,ea,fa,ga,Y,Z,$,aa,ba,W;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(B,e,d);l={signature:a.substr(z,8),header_bytes:k(a,z+8),vertex_coordinate_bytes:k(a,z+9),normal_coordinate_bytes:k(a,z+10),uv_coordinate_bytes:k(a,z+11),vertex_index_bytes:k(a,z+12),normal_index_bytes:k(a,z+13),uv_index_bytes:k(a,z+14),material_index_bytes:k(a,z+15),nvertices:h(a,z+16),nnormals:h(a,z+16+4),nuvs:h(a,z+16+8),ntri_flat:h(a,z+16+12),ntri_smooth:h(a,z+16+16),ntri_flat_uv:h(a,z+16+20),ntri_smooth_uv:h(a, z+16+24),nquad_flat:h(a,z+16+28),nquad_smooth:h(a,z+16+32),nquad_flat_uv:h(a,z+16+36),nquad_smooth_uv:h(a,z+16+40)};z+=l.header_bytes;G=l.vertex_index_bytes;K=l.vertex_index_bytes*2;J=l.vertex_index_bytes*3;I=l.vertex_index_bytes*3+l.material_index_bytes;E=l.vertex_index_bytes*3+l.material_index_bytes+l.normal_index_bytes;L=l.vertex_index_bytes*3+l.material_index_bytes+l.normal_index_bytes*2;P=l.vertex_index_bytes;Q=l.vertex_index_bytes*2;R=l.vertex_index_bytes*3;M=l.vertex_index_bytes*4;F=l.vertex_index_bytes* -4+l.material_index_bytes;N=l.vertex_index_bytes*4+l.material_index_bytes+l.normal_index_bytes;O=l.vertex_index_bytes*4+l.material_index_bytes+l.normal_index_bytes*2;T=l.vertex_index_bytes*4+l.material_index_bytes+l.normal_index_bytes*3;W=l.uv_index_bytes;X=l.uv_index_bytes*2;ea=l.uv_index_bytes;fa=l.uv_index_bytes*2;ga=l.uv_index_bytes*3;d=l.vertex_index_bytes*3+l.material_index_bytes;V=l.vertex_index_bytes*4+l.material_index_bytes;Y=l.ntri_flat*d;Z=l.ntri_smooth*(d+l.normal_index_bytes*3);$=l.ntri_flat_uv* -(d+l.uv_index_bytes*3);aa=l.ntri_smooth_uv*(d+l.normal_index_bytes*3+l.uv_index_bytes*3);ba=l.nquad_flat*V;d=l.nquad_smooth*(V+l.normal_index_bytes*4);V=l.nquad_flat_uv*(V+l.uv_index_bytes*4);z+=function(o){for(var v,A,D,H=l.vertex_coordinate_bytes*3,S=o+l.nvertices*H;o 0: group_string = generate_string_list(group_ids) - castsShadow = generate_bool_property(obj.THREE_castsShadow) - meshCollider = generate_bool_property(obj.THREE_meshCollider) + castsShadow = obj.THREE_castsShadow + meshCollider = obj.THREE_meshCollider + visible = True + if obj.draw_type in ["BOUNDS", "WIRE"] and meshCollider: + visible = False + object_string = TEMPLATE_OBJECT % { "object_id" : generate_string(object_id), "geometry_id" : generate_string(geometry_id), @@ -1008,8 +1012,9 @@ def generate_objects(data): "quaternion" : generate_vec4(quaternion), "scale" : generate_vec3(scale), - "castsShadow" : castsShadow, - "meshCollider" : meshCollider + "castsShadow" : generate_bool_property(castsShadow), + "meshCollider" : generate_bool_property(meshCollider), + "visible" : generate_bool_property(visible) } chunks.append(object_string)