From 60c235442419826cedfdea8ab91f713e5e981628 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Oct 2010 11:33:32 +0200 Subject: [PATCH] Added OBJ -> Three.js converter. Added OBJ converter test example. Modified Three.js to handle converted models: - extended WebGL renderer to use texturing - broke down model into multiple VBOs according to materials - textures are lazy created when images get loaded (converter takes care of resizing images to nearest power of 2 dimensions using 2d canvas) - changed material array semantics in Mesh object - before: multiple materials were applied to all faces (broken in WebGL, needs multitexturing shader) - now: there is only single material per face, but one mesh can have faces with different materials - added per vertex normals (to get smooth shading in WebGL) --- build/Three.js | 2 +- build/ThreeDebug.js | 2 +- examples/geometry/primitives/Sphere.js | 22 +- examples/obj/female02/.htaccess | 3 + .../obj/female02/_01_-_Default1noCulling.JPG | Bin 0 -> 24836 bytes .../obj/female02/_02_-_Default1noCulling.JPG | Bin 0 -> 25240 bytes .../obj/female02/_03_-_Default1noCulling.JPG | Bin 0 -> 96273 bytes examples/obj/female02/female02.js | 15975 ++++++++++++++ examples/obj/female02/female02.mtl | 67 + examples/obj/female02/female02.obj | 17809 ++++++++++++++++ examples/obj/female02/readme.txt | 3 + examples/obj_convert_test.html | 378 + src/core/Face3.js | 7 +- src/core/Face4.js | 8 +- src/core/Geometry.js | 85 +- src/materials/ParticleDOMMaterial.js | 30 +- src/objects/Mesh.js | 46 +- src/renderers/CanvasRenderer.js | 5 +- src/renderers/Projector.js | 4 +- src/renderers/WebGLRenderer.js | 388 +- utils/exporters/convert_obj_threejs.py | 839 + 21 files changed, 35503 insertions(+), 170 deletions(-) create mode 100644 examples/obj/female02/.htaccess create mode 100644 examples/obj/female02/_01_-_Default1noCulling.JPG create mode 100644 examples/obj/female02/_02_-_Default1noCulling.JPG create mode 100644 examples/obj/female02/_03_-_Default1noCulling.JPG create mode 100644 examples/obj/female02/female02.js create mode 100644 examples/obj/female02/female02.mtl create mode 100644 examples/obj/female02/female02.obj create mode 100644 examples/obj/female02/readme.txt create mode 100644 examples/obj_convert_test.html create mode 100644 utils/exporters/convert_obj_threejs.py diff --git a/build/Three.js b/build/Three.js index 764c46eee0..cfa111a65a 100644 --- a/build/Three.js +++ b/build/Three.js @@ -1,2 +1,2 @@ // Three.js r18 - http://github.com/mrdoob/three.js -var THREE=THREE||{};THREE.Color=function(a){this.autoUpdate=true;this.setHex(a)};THREE.Color.prototype={setRGBA:function(f,e,c,d){this.r=f;this.g=e;this.b=c;this.a=d;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHex:function(a){this.hex=a;if(this.autoUpdate){this.updateRGBA();this.updateStyleString()}},copyRGB:function(a){this.r=a.r;this.g=a.g;this.b=a.b},copyRGBA:function(a){this.r=a.r;this.g=a.g;this.b=a.b;this.a=a.a},multiplySelfRGB:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b},updateHex:function(){this.hex=Math.floor(this.a*255)<<24|Math.floor(this.r*255)<<16|Math.floor(this.g*255)<<8|Math.floor(this.b*255)},updateRGBA:function(){this.a=(this.hex>>24&255)/255;this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgba("+Math.floor(this.r*255)+","+Math.floor(this.g*255)+","+Math.floor(this.b*255)+","+this.a+")"},toString:function(){return"THREE.Color ( r: "+this.r+", g: "+this.g+", b: "+this.b+", a: "+this.a+", hex: "+this.hex+" )"}};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};THREE.Vector2.prototype={set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;return this},add:function(b,a){this.x=b.x+a.x;this.y=b.y+a.y;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;return this},sub:function(b,a){this.x=b.x-a.x;this.y=b.y-a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},unit:function(){this.multiplyScalar(1/this.length());return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthSq:function(){return this.x*this.x+this.y*this.y},negate:function(){this.x=-this.x;this.y=-this.y;return this},clone:function(){return new THREE.Vector2(this.x,this.y)},toString:function(){return"THREE.Vector2 ("+this.x+", "+this.y+")"}};THREE.Vector3=function(a,c,b){this.x=a||0;this.y=c||0;this.z=b||0};THREE.Vector3.prototype={set:function(a,c,b){this.x=a;this.y=c;this.z=b;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(b,a){this.x=b.x+a.x;this.y=b.y+a.y;this.z=b.z+a.z;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},sub:function(b,a){this.x=b.x-a.x;this.y=b.y-a.y;this.z=b.z-a.z;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},cross:function(b,a){this.x=b.y*a.z-b.z*a.y;this.y=b.z*a.x-b.x*a.z;this.z=b.x*a.y-b.y*a.x;return this},crossSelf:function(c){var b=this.x,a=this.y,d=this.z;this.x=a*c.z-d*c.y;this.y=d*c.x-b*c.z;this.z=b*c.y-a*c.x;return this},multiplySelf:function(a){this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},divideScalar:function(a){this.x/=a;this.y/=a;this.z/=a;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(d){var c=this.x-d.x,b=this.y-d.y,a=this.z-d.z;return c*c+b*b+a*a},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},normalize:function(){if(this.length()>0){this.multiplyScalar(1/this.length())}else{this.multiplyScalar(0)}return this},setLength:function(a){return this.normalize().multiplyScalar(a)},isZero:function(){var a=0.0001;return(Math.abs(this.x)=0&&Math.min(g,i.getY2())-Math.max(h,i.getY1())>=0};this.empty=function(){e=true;f=0;h=0;d=0;g=0;b()};this.isEmpty=function(){return e};this.toString=function(){return"THREE.Rectangle (x1: "+f+", y1: "+g+", x2: "+d+", y1: "+h+", width: "+a+", height: "+c+")"}};THREE.Matrix4=function(){this._x=new THREE.Vector3();this._y=new THREE.Vector3();this._z=new THREE.Vector3()};THREE.Matrix4.prototype={n11:1,n12:0,n13:0,n14:0,n21:0,n22:1,n23:0,n24:0,n31:0,n32:0,n33:1,n34:0,n41:0,n42:0,n43:0,n44:1,identity:function(){this.n11=1;this.n12=0;this.n13=0;this.n14=0;this.n21=0;this.n22=1;this.n23=0;this.n24=0;this.n31=0;this.n32=0;this.n33=1;this.n34=0;this.n41=0;this.n42=0;this.n43=0;this.n44=1},copy:function(a){this.n11=a.n11;this.n12=a.n12;this.n13=a.n13;this.n14=a.n14;this.n21=a.n21;this.n22=a.n22;this.n23=a.n23;this.n24=a.n24;this.n31=a.n31;this.n32=a.n32;this.n33=a.n33;this.n34=a.n34;this.n41=a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(d,c,b){var a=this._x,f=this._y,e=this._z;e.sub(d,c);e.normalize();a.cross(b,e);a.normalize();f.cross(e,a);f.normalize();this.n11=a.x;this.n12=a.y;this.n13=a.z;this.n14=-a.dot(d);this.n21=f.x;this.n22=f.y;this.n23=f.z;this.n24=-f.dot(d);this.n31=e.x;this.n32=e.y;this.n33=e.z;this.n34=-e.dot(d);this.n41=0;this.n42=0;this.n43=0;this.n44=1},transform:function(a){var d=a.x,c=a.y,b=a.z,e=a.w?a.w:1;a.x=this.n11*d+this.n12*c+this.n13*b+this.n14*e;a.y=this.n21*d+this.n22*c+this.n23*b+this.n24*e;a.z=this.n31*d+this.n32*c+this.n33*b+this.n34*e;e=this.n41*d+this.n42*c+this.n43*b+this.n44*e;if(a.w){a.w=e}else{a.x=a.x/e;a.y=a.y/e;a.z=a.z/e}return a},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(d,c){this.n11=d.n11*c.n11+d.n12*c.n21+d.n13*c.n31+d.n14*c.n41;this.n12=d.n11*c.n12+d.n12*c.n22+d.n13*c.n32+d.n14*c.n42;this.n13=d.n11*c.n13+d.n12*c.n23+d.n13*c.n33+d.n14*c.n43;this.n14=d.n11*c.n14+d.n12*c.n24+d.n13*c.n34+d.n14*c.n44;this.n21=d.n21*c.n11+d.n22*c.n21+d.n23*c.n31+d.n24*c.n41;this.n22=d.n21*c.n12+d.n22*c.n22+d.n23*c.n32+d.n24*c.n42;this.n23=d.n21*c.n13+d.n22*c.n23+d.n23*c.n33+d.n24*c.n43;this.n24=d.n21*c.n14+d.n22*c.n24+d.n23*c.n34+d.n24*c.n44;this.n31=d.n31*c.n11+d.n32*c.n21+d.n33*c.n31+d.n34*c.n41;this.n32=d.n31*c.n12+d.n32*c.n22+d.n33*c.n32+d.n34*c.n42;this.n33=d.n31*c.n13+d.n32*c.n23+d.n33*c.n33+d.n34*c.n43;this.n34=d.n31*c.n14+d.n32*c.n24+d.n33*c.n34+d.n34*c.n44;this.n41=d.n41*c.n11+d.n42*c.n21+d.n43*c.n31+d.n44*c.n41;this.n42=d.n41*c.n12+d.n42*c.n22+d.n43*c.n32+d.n44*c.n42;this.n43=d.n41*c.n13+d.n42*c.n23+d.n43*c.n33+d.n44*c.n43;this.n44=d.n41*c.n14+d.n42*c.n24+d.n43*c.n34+d.n44*c.n44},multiplySelf:function(c){var o=this.n11,n=this.n12,k=this.n13,i=this.n14,f=this.n21,e=this.n22,d=this.n23,b=this.n24,a=this.n31,r=this.n32,q=this.n33,p=this.n34,l=this.n41,j=this.n42,h=this.n43,g=this.n44;this.n11=o*c.n11+n*c.n21+k*c.n31+i*c.n41;this.n12=o*c.n12+n*c.n22+k*c.n32+i*c.n42;this.n13=o*c.n13+n*c.n23+k*c.n33+i*c.n43;this.n14=o*c.n14+n*c.n24+k*c.n34+i*c.n44;this.n21=f*c.n11+e*c.n21+d*c.n31+b*c.n41;this.n22=f*c.n12+e*c.n22+d*c.n32+b*c.n42;this.n23=f*c.n13+e*c.n23+d*c.n33+b*c.n43;this.n24=f*c.n14+e*c.n24+d*c.n34+b*c.n44;this.n31=a*c.n11+r*c.n21+q*c.n31+p*c.n41;this.n32=a*c.n12+r*c.n22+q*c.n32+p*c.n42;this.n33=a*c.n13+r*c.n23+q*c.n33+p*c.n43;this.n34=a*c.n14+r*c.n24+q*c.n34+p*c.n44;this.n41=l*c.n11+j*c.n21+h*c.n31+g*c.n41;this.n42=l*c.n12+j*c.n22+h*c.n32+g*c.n42;this.n43=l*c.n13+j*c.n23+h*c.n33+g*c.n43;this.n44=l*c.n14+j*c.n24+h*c.n34+g*c.n44},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a},determinant:function(){return(this.n14*this.n23*this.n32*this.n41-this.n13*this.n24*this.n32*this.n41-this.n14*this.n22*this.n33*this.n41+this.n12*this.n24*this.n33*this.n41+this.n13*this.n22*this.n34*this.n41-this.n12*this.n23*this.n34*this.n41-this.n14*this.n23*this.n31*this.n42+this.n13*this.n24*this.n31*this.n42+this.n14*this.n21*this.n33*this.n42-this.n11*this.n24*this.n33*this.n42-this.n13*this.n21*this.n34*this.n42+this.n11*this.n23*this.n34*this.n42+this.n14*this.n22*this.n31*this.n43-this.n12*this.n24*this.n31*this.n43-this.n14*this.n21*this.n32*this.n43+this.n11*this.n24*this.n32*this.n43+this.n12*this.n21*this.n34*this.n43-this.n11*this.n22*this.n34*this.n43-this.n13*this.n22*this.n31*this.n44+this.n12*this.n23*this.n31*this.n44+this.n13*this.n21*this.n32*this.n44-this.n11*this.n23*this.n32*this.n44-this.n12*this.n21*this.n33*this.n44+this.n11*this.n22*this.n33*this.n44)},transpose:function(){function a(d,e,c){var b=d[e];d[e]=d[c];d[c]=b}a(this,"n21","n12");a(this,"n31","n13");a(this,"n32","n23");a(this,"n41","n14");a(this,"n42","n24");a(this,"n43","n34");return this},clone:function(){var a=new THREE.Matrix4();a.n11=this.n11;a.n12=this.n12;a.n13=this.n13;a.n14=this.n14;a.n21=this.n21;a.n22=this.n22;a.n23=this.n23;a.n24=this.n24;a.n31=this.n31;a.n32=this.n32;a.n33=this.n33;a.n34=this.n34;a.n41=this.n41;a.n42=this.n42;a.n43=this.n43;a.n44=this.n44;return a},flatten:function(){return[this.n11,this.n21,this.n31,this.n41,this.n12,this.n22,this.n32,this.n42,this.n13,this.n23,this.n33,this.n43,this.n14,this.n24,this.n34,this.n44]},toString:function(){return"| "+this.n11+" "+this.n12+" "+this.n13+" "+this.n14+" |\n| "+this.n21+" "+this.n22+" "+this.n23+" "+this.n24+" |\n| "+this.n31+" "+this.n32+" "+this.n33+" "+this.n34+" |\n| "+this.n41+" "+this.n42+" "+this.n43+" "+this.n44+" |"}};THREE.Matrix4.translationMatrix=function(b,d,c){var a=new THREE.Matrix4();a.n14=b;a.n24=d;a.n34=c;return a};THREE.Matrix4.scaleMatrix=function(b,d,c){var a=new THREE.Matrix4();a.n11=b;a.n22=d;a.n33=c;return a};THREE.Matrix4.rotationXMatrix=function(b){var a=new THREE.Matrix4();a.n22=a.n33=Math.cos(b);a.n32=Math.sin(b);a.n23=-a.n32;return a};THREE.Matrix4.rotationYMatrix=function(b){var a=new THREE.Matrix4();a.n11=a.n33=Math.cos(b);a.n13=Math.sin(b);a.n31=-a.n13;return a};THREE.Matrix4.rotationZMatrix=function(b){var a=new THREE.Matrix4();a.n11=a.n22=Math.cos(b);a.n21=Math.sin(b);a.n12=-a.n21;return a};THREE.Matrix4.rotationAxisAngleMatrix=function(b,d){var a=new THREE.Matrix4(),f=Math.cos(d),j=Math.sin(d),i=1-f,h=b.x,g=b.y,e=b.z;a.n11=i*h*h+f;a.n12=i*h*g-j*e;a.n13=i*h*e+j*g;a.n21=i*h*g+j*e;a.n22=i*g*g+f;a.n23=i*g*e-j*h;a.n31=i*h*e-j*g;a.n32=i*g*e+j*h;a.n33=i*e*e+f;return a};THREE.Matrix4.makeInvert=function(b){var a=new THREE.Matrix4();a.n11=b.n23*b.n34*b.n42-b.n24*b.n33*b.n42+b.n24*b.n32*b.n43-b.n22*b.n34*b.n43-b.n23*b.n32*b.n44+b.n22*b.n33*b.n44;a.n12=b.n14*b.n33*b.n42-b.n13*b.n34*b.n42-b.n14*b.n32*b.n43+b.n12*b.n34*b.n43+b.n13*b.n32*b.n44-b.n12*b.n33*b.n44;a.n13=b.n13*b.n24*b.n42-b.n14*b.n23*b.n42+b.n14*b.n22*b.n43-b.n12*b.n24*b.n43-b.n13*b.n22*b.n44+b.n12*b.n23*b.n44;a.n14=b.n14*b.n23*b.n32-b.n13*b.n24*b.n32-b.n14*b.n22*b.n33+b.n12*b.n24*b.n33+b.n13*b.n22*b.n34-b.n12*b.n23*b.n34;a.n21=b.n24*b.n33*b.n41-b.n23*b.n34*b.n41-b.n24*b.n31*b.n43+b.n21*b.n34*b.n43+b.n23*b.n31*b.n44-b.n21*b.n33*b.n44;a.n22=b.n13*b.n34*b.n41-b.n14*b.n33*b.n41+b.n14*b.n31*b.n43-b.n11*b.n34*b.n43-b.n13*b.n31*b.n44+b.n11*b.n33*b.n44;a.n23=b.n14*b.n23*b.n41-b.n13*b.n24*b.n41-b.n14*b.n21*b.n43+b.n11*b.n24*b.n43+b.n13*b.n21*b.n44-b.n11*b.n23*b.n44;a.n24=b.n13*b.n24*b.n31-b.n14*b.n23*b.n31+b.n14*b.n21*b.n33-b.n11*b.n24*b.n33-b.n13*b.n21*b.n34+b.n11*b.n23*b.n34;a.n31=b.n22*b.n34*b.n41-b.n24*b.n32*b.n41+b.n24*b.n31*b.n42-b.n21*b.n34*b.n42-b.n22*b.n31*b.n44+b.n21*b.n32*b.n44;a.n32=b.n14*b.n32*b.n41-b.n12*b.n34*b.n41-b.n14*b.n31*b.n42+b.n11*b.n34*b.n42+b.n12*b.n31*b.n44-b.n11*b.n32*b.n44;a.n33=b.n13*b.n24*b.n41-b.n14*b.n22*b.n41+b.n14*b.n21*b.n42-b.n11*b.n24*b.n42-b.n12*b.n21*b.n44+b.n11*b.n22*b.n44;a.n34=b.n14*b.n22*b.n31-b.n12*b.n24*b.n31-b.n14*b.n21*b.n32+b.n11*b.n24*b.n32+b.n12*b.n21*b.n34-b.n11*b.n22*b.n34;a.n41=b.n23*b.n32*b.n41-b.n22*b.n33*b.n41-b.n23*b.n31*b.n42+b.n21*b.n33*b.n42+b.n22*b.n31*b.n43-b.n21*b.n32*b.n43;a.n42=b.n12*b.n33*b.n41-b.n13*b.n32*b.n41+b.n13*b.n31*b.n42-b.n11*b.n33*b.n42-b.n12*b.n31*b.n43+b.n11*b.n32*b.n43;a.n43=b.n13*b.n22*b.n41-b.n12*b.n23*b.n41-b.n13*b.n21*b.n42+b.n11*b.n23*b.n42+b.n12*b.n21*b.n43-b.n11*b.n22*b.n43;a.n44=b.n12*b.n23*b.n31-b.n13*b.n22*b.n31+b.n13*b.n21*b.n32-b.n11*b.n23*b.n32-b.n12*b.n21*b.n33+b.n11*b.n22*b.n33;a.multiplyScalar(1/b.determinant());return a};THREE.Matrix4.makeFrustum=function(f,r,e,o,i,h){var g,q,n,p,l,k,j;g=new THREE.Matrix4();q=2*i/(r-f);n=2*i/(o-e);p=(r+f)/(r-f);l=(o+e)/(o-e);k=-(h+i)/(h-i);j=-2*h*i/(h-i);g.n11=q;g.n12=0;g.n13=p;g.n14=0;g.n21=0;g.n22=n;g.n23=l;g.n24=0;g.n31=0;g.n32=0;g.n33=k;g.n34=j;g.n41=0;g.n42=0;g.n43=-1;g.n44=0;return g};THREE.Matrix4.makePerspective=function(e,c,g,b){var a,f,h,d;a=g*Math.tan(e*Math.PI/360);f=-a;h=f*c;d=a*c;return THREE.Matrix4.makeFrustum(h,d,f,a,g,b)};THREE.Matrix4.makeOrtho=function(c,o,k,a,g,f){var d,l,j,i,n,e,b;d=new THREE.Matrix4();n=o-c;e=a-k;b=f-g;l=(o+c)/n;j=(a+k)/e;i=(f+g)/b;d.n11=2/n;d.n12=0;d.n13=0;d.n14=-l;d.n21=0;d.n22=2/e;d.n23=0;d.n24=-j;d.n31=0;d.n32=0;d.n33=-2/b;d.n34=-i;d.n41=0;d.n42=0;d.n43=0;d.n44=1;return d};THREE.Vertex=function(a,b){this.position=a||new THREE.Vector3();this.positionWorld=new THREE.Vector3();this.positionScreen=new THREE.Vector3();this.normal=b||new THREE.Vector3();this.normalWorld=new THREE.Vector3();this.normalScreen=new THREE.Vector3();this.__visible=true};THREE.Vertex.prototype={toString:function(){return"THREE.Vertex ( position: "+this.position+", normal: "+this.normal+" )"}};THREE.Face3=function(e,d,h,g,f){this.a=e;this.b=d;this.c=h;this.centroid=new THREE.Vector3();this.normal=g||new THREE.Vector3();this.color=f||new THREE.Color(4278190080)};THREE.Face3.prototype={getCenter:function(){return this.a.clone().addSelf(this.b).addSelf(this.c).divideScalar(3)},toString:function(){return"THREE.Face3 ( "+this.a+", "+this.b+", "+this.c+" )"}};THREE.Face4=function(f,e,j,i,h,g){this.a=f;this.b=e;this.c=j;this.d=i;this.centroid=new THREE.Vector3();this.normal=h||new THREE.Vector3();this.color=g||new THREE.Color(4278190080)};THREE.Face4.prototype={getCenter:function(){return this.a.clone().addSelf(this.b).addSelf(this.c).addSelf(this.d).divideScalar(4)},toString:function(){return"THREE.Face4 ( "+this.a+", "+this.b+", "+this.c+" "+this.d+" )"}};THREE.UV=function(b,a){this.u=b||0;this.v=a||0};THREE.UV.prototype={copy:function(a){this.u=a.u;this.v=a.v},toString:function(){return"THREE.UV ("+this.u+", "+this.v+")"}};THREE.Geometry=function(){this.vertices=[];this.faces=[];this.uvs=[]};THREE.Geometry.prototype={computeCentroids:function(){var c,b,a;for(c=0,b=this.faces.length;c=0?(b*255)<<24:4278190080)|c)};THREE.LineColorMaterial.prototype={toString:function(){return"THREE.LineColorMaterial ( color: "+this.color+", lineWidth: "+this.lineWidth+" )"}};THREE.MeshBitmapUVMappingMaterial=function(a){this.bitmap=a;this.toString=function(){return"THREE.MeshBitmapUVMappingMaterial ( bitmap: "+this.bitmap+" )"}};THREE.MeshColorFillMaterial=function(b,a){this.color=new THREE.Color((a>=0?(a*255)<<24:4278190080)|b);this.toString=function(){return"THREE.MeshColorFillMaterial ( color: "+this.color+" )"}};THREE.MeshColorStrokeMaterial=function(c,b,a){this.lineWidth=a||1;this.color=new THREE.Color((b>=0?(b*255)<<24:4278190080)|c);this.toString=function(){return"THREE.MeshColorStrokeMaterial ( lineWidth: "+this.lineWidth+", color: "+this.color+" )"}};THREE.MeshFaceColorFillMaterial=function(){this.toString=function(){return"THREE.MeshFaceColorFillMaterial ( )"}};THREE.MeshFaceColorStrokeMaterial=function(a){this.lineWidth=a||1;this.toString=function(){return"THREE.MeshFaceColorStrokeMaterial ( lineWidth: "+this.lineWidth+" )"}};THREE.ParticleBitmapMaterial=function(a){this.bitmap=a;this.offset=new THREE.Vector2();this.toString=function(){return"THREE.ParticleBitmapMaterial ( bitmap: "+this.bitmap+" )"}};THREE.ParticleCircleMaterial=function(b,a){this.color=new THREE.Color((a>=0?(a*255)<<24:4278190080)|b);this.toString=function(){return"THREE.ParticleCircleMaterial ( color: "+this.color+" )"}};THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function(){return"THREE.ParticleDOMMaterial ( domElement: "+this.domElement+" )"}};THREE.Scene=function(){this.objects=[];this.lights=[];this.addObject=function(a){this.objects.push(a)};this.removeObject=function(b){for(var c=0,a=this.objects.length;c0&&w.z<1}x=M.geometry.faces;for(J=0,C=x.length;J0&&w.z<1;if(E>0){D=M.geometry.vertices[E-1];if(I.__visible&&D.__visible){k=i[m]=i[m]||new THREE.RenderableLine();k.v1.copy(I.positionScreen);k.v2.copy(D.positionScreen);k.z=Math.max(I.positionScreen.z,D.positionScreen.z);k.material=M.material;e.push(k);m++}}}}else{if(M instanceof THREE.Particle){g.set(M.position.x,M.position.y,M.position.z,1);H.matrix.transform(g);H.projectionMatrix.transform(g);M.screen.set(g.x/g.w,g.y/g.w,g.z/g.w);if(M.screen.z>0&&M.screen.z<1){j=a[h]=a[h]||new THREE.RenderableParticle();j.x=M.screen.x;j.y=M.screen.y;j.z=M.screen.z;j.rotation=M.rotation.z;j.scale.x=M.scale.x*Math.abs(g.x/g.w-(g.x+H.projectionMatrix.n11)/(g.w+H.projectionMatrix.n14));j.scale.y=M.scale.y*Math.abs(g.y/g.w-(g.y+H.projectionMatrix.n22)/(g.w+H.projectionMatrix.n24));j.material=M.material;j.color=M.color;e.push(j);h++}}}}}e.sort(n);return e};function n(s,r){return r.z-s.z}};THREE.DOMRenderer=function(){THREE.Renderer.call(this);var e=null,g=new THREE.Projector(),b=document.createElement("div"),a,c,f,d;this.domElement=b;this.setSize=function(i,h){a=i;c=h;f=a/2;d=c/2};this.render=function(p,r){var q,h,i,n,o,s,l,k,j;e=g.projectScene(p,r);for(q=0,h=e.length;q0){C.r+=A.color.r*D;C.g+=A.color.g*D;C.b+=A.color.b*D}}else{if(A instanceof THREE.PointLight){f.sub(A.position,E.centroidWorld);f.normalize();D=E.normalWorld.dot(f)*A.intensity;if(D>0){C.r+=A.color.r*D;C.g+=A.color.g*D;C.b+=A.color.b*D}}}}}function p(T,I,H,O,N,C,A,Q,P,E,D,M,L){var B,S,R,G,F,K,J;n.beginPath();n.moveTo(I,H);n.lineTo(O,N);n.lineTo(C,A);n.lineTo(I,H);n.closePath();n.save();n.clip();B=Q*(L-D)-E*L+M*D+(E-M)*P;S=-(P*(C-O)-D*C+L*O+(D-L)*I)/B;R=(D*A+P*(N-A)-L*N+(L-D)*H)/B;G=(Q*(C-O)-E*C+M*O+(E-M)*I)/B;F=-(E*A+Q*(N-A)-M*N+(M-E)*H)/B;K=(Q*(L*O-D*C)+P*(E*C-M*O)+(M*D-E*L)*I)/B;J=(Q*(L*N-D*A)+P*(E*A-M*N)+(M*D-E*L)*H)/B;n.transform(S,R,G,F,K,J);n.drawImage(T,0,0);n.restore()}function b(B,A){g.sub(A,B);g.unit();g.multiplyScalar(0.75);A.addSelf(g);B.subSelf(g)}};THREE.SVGRenderer=function(){var p=null,k=new THREE.Projector(),l=document.createElementNS("http://www.w3.org/2000/svg","svg"),e,t,i,a,r=new THREE.Rectangle(),o=new THREE.Rectangle(),f=new THREE.Color(4294967295),n=new THREE.Color(4294967295),b=new THREE.Color(4294967295),d=new THREE.Vector3(),c=[],g=[],s=1;this.domElement=l;this.autoClear=true;this.setQuality=function(u){switch(u){case"high":s=1;break;case"low":s=0;break}};this.setSize=function(v,u){e=v;t=u;i=e/2;a=t/2;l.setAttribute("viewBox",(-i)+" "+(-a)+" "+e+" "+t);l.setAttribute("width",e);l.setAttribute("height",t);r.set(-i,-a,i,a)};this.clear=function(){while(l.childNodes.length>0){l.removeChild(l.childNodes[0])}};this.render=function(N,K){var M,w,H,L,x,D,G=0,y=0,E,B,z,J,I,v,u,C,A,F;if(this.autoClear){this.clear()}p=k.projectScene(N,K);q(N,b);for(M=0,w=p.length;M0){w.r+=u.color.r*x;w.g+=u.color.g*x;w.b+=u.color.b*x}}else{if(u instanceof THREE.PointLight){d.sub(u.position,y.centroidWorld);d.normalize();x=y.normalWorld.dot(d)*u.intensity;if(x>0){w.r+=u.color.r*x;w.g+=u.color.g*x;w.b+=u.color.b*x}}}}}function h(u){if(c[u]==null){c[u]=document.createElementNS("http://www.w3.org/2000/svg","path");if(s==0){c[u].setAttribute("shape-rendering","crispEdges")}return c[u]}return c[u]}function m(u){if(g[u]==null){g[u]=document.createElementNS("http://www.w3.org/2000/svg","circle");if(s==0){g[u].setAttribute("shape-rendering","crispEdges")}return g[u]}return g[u]}};THREE.WebGLRenderer=function(){var e=document.createElement("canvas"),a,h,d=new THREE.Matrix4(),g;this.domElement=e;this.autoClear=true;f();c();this.setSize=function(j,i){e.width=j;e.height=i;a.viewport(0,0,e.width,e.height)};this.clear=function(){a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT)};this.render=function(K,G){var t,L,N,z,M,C,s,q,y,A,r,J,w,B,x,I,u,D,H,F,p,n,k,j,E,v;if(this.autoClear){this.clear()}a.uniform1i(h.enableLighting,K.lights.length);for(E=0,v=K.lights.length;E>24&255)/255;this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgba("+Math.floor(this.r*255)+","+Math.floor(this.g*255)+","+Math.floor(this.b*255)+","+this.a+")"},toString:function(){return"THREE.Color ( r: "+this.r+", g: "+this.g+", b: "+this.b+", a: "+this.a+", hex: "+this.hex+" )"}};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};THREE.Vector2.prototype={set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;return this},add:function(b,a){this.x=b.x+a.x;this.y=b.y+a.y;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;return this},sub:function(b,a){this.x=b.x-a.x;this.y=b.y-a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},unit:function(){this.multiplyScalar(1/this.length());return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthSq:function(){return this.x*this.x+this.y*this.y},negate:function(){this.x=-this.x;this.y=-this.y;return this},clone:function(){return new THREE.Vector2(this.x,this.y)},toString:function(){return"THREE.Vector2 ("+this.x+", "+this.y+")"}};THREE.Vector3=function(a,c,b){this.x=a||0;this.y=c||0;this.z=b||0};THREE.Vector3.prototype={set:function(a,c,b){this.x=a;this.y=c;this.z=b;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(b,a){this.x=b.x+a.x;this.y=b.y+a.y;this.z=b.z+a.z;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},sub:function(b,a){this.x=b.x-a.x;this.y=b.y-a.y;this.z=b.z-a.z;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},cross:function(b,a){this.x=b.y*a.z-b.z*a.y;this.y=b.z*a.x-b.x*a.z;this.z=b.x*a.y-b.y*a.x;return this},crossSelf:function(c){var b=this.x,a=this.y,d=this.z;this.x=a*c.z-d*c.y;this.y=d*c.x-b*c.z;this.z=b*c.y-a*c.x;return this},multiplySelf:function(a){this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},divideScalar:function(a){this.x/=a;this.y/=a;this.z/=a;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(d){var c=this.x-d.x,b=this.y-d.y,a=this.z-d.z;return c*c+b*b+a*a},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},normalize:function(){if(this.length()>0){this.multiplyScalar(1/this.length())}else{this.multiplyScalar(0)}return this},setLength:function(a){return this.normalize().multiplyScalar(a)},isZero:function(){var a=0.0001;return(Math.abs(this.x)=0&&Math.min(g,i.getY2())-Math.max(h,i.getY1())>=0};this.empty=function(){e=true;f=0;h=0;d=0;g=0;b()};this.isEmpty=function(){return e};this.toString=function(){return"THREE.Rectangle (x1: "+f+", y1: "+g+", x2: "+d+", y1: "+h+", width: "+a+", height: "+c+")"}};THREE.Matrix4=function(){this._x=new THREE.Vector3();this._y=new THREE.Vector3();this._z=new THREE.Vector3()};THREE.Matrix4.prototype={n11:1,n12:0,n13:0,n14:0,n21:0,n22:1,n23:0,n24:0,n31:0,n32:0,n33:1,n34:0,n41:0,n42:0,n43:0,n44:1,identity:function(){this.n11=1;this.n12=0;this.n13=0;this.n14=0;this.n21=0;this.n22=1;this.n23=0;this.n24=0;this.n31=0;this.n32=0;this.n33=1;this.n34=0;this.n41=0;this.n42=0;this.n43=0;this.n44=1},copy:function(a){this.n11=a.n11;this.n12=a.n12;this.n13=a.n13;this.n14=a.n14;this.n21=a.n21;this.n22=a.n22;this.n23=a.n23;this.n24=a.n24;this.n31=a.n31;this.n32=a.n32;this.n33=a.n33;this.n34=a.n34;this.n41=a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(d,c,b){var a=this._x,f=this._y,e=this._z;e.sub(d,c);e.normalize();a.cross(b,e);a.normalize();f.cross(e,a);f.normalize();this.n11=a.x;this.n12=a.y;this.n13=a.z;this.n14=-a.dot(d);this.n21=f.x;this.n22=f.y;this.n23=f.z;this.n24=-f.dot(d);this.n31=e.x;this.n32=e.y;this.n33=e.z;this.n34=-e.dot(d);this.n41=0;this.n42=0;this.n43=0;this.n44=1},transform:function(a){var d=a.x,c=a.y,b=a.z,e=a.w?a.w:1;a.x=this.n11*d+this.n12*c+this.n13*b+this.n14*e;a.y=this.n21*d+this.n22*c+this.n23*b+this.n24*e;a.z=this.n31*d+this.n32*c+this.n33*b+this.n34*e;e=this.n41*d+this.n42*c+this.n43*b+this.n44*e;if(a.w){a.w=e}else{a.x=a.x/e;a.y=a.y/e;a.z=a.z/e}return a},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(d,c){this.n11=d.n11*c.n11+d.n12*c.n21+d.n13*c.n31+d.n14*c.n41;this.n12=d.n11*c.n12+d.n12*c.n22+d.n13*c.n32+d.n14*c.n42;this.n13=d.n11*c.n13+d.n12*c.n23+d.n13*c.n33+d.n14*c.n43;this.n14=d.n11*c.n14+d.n12*c.n24+d.n13*c.n34+d.n14*c.n44;this.n21=d.n21*c.n11+d.n22*c.n21+d.n23*c.n31+d.n24*c.n41;this.n22=d.n21*c.n12+d.n22*c.n22+d.n23*c.n32+d.n24*c.n42;this.n23=d.n21*c.n13+d.n22*c.n23+d.n23*c.n33+d.n24*c.n43;this.n24=d.n21*c.n14+d.n22*c.n24+d.n23*c.n34+d.n24*c.n44;this.n31=d.n31*c.n11+d.n32*c.n21+d.n33*c.n31+d.n34*c.n41;this.n32=d.n31*c.n12+d.n32*c.n22+d.n33*c.n32+d.n34*c.n42;this.n33=d.n31*c.n13+d.n32*c.n23+d.n33*c.n33+d.n34*c.n43;this.n34=d.n31*c.n14+d.n32*c.n24+d.n33*c.n34+d.n34*c.n44;this.n41=d.n41*c.n11+d.n42*c.n21+d.n43*c.n31+d.n44*c.n41;this.n42=d.n41*c.n12+d.n42*c.n22+d.n43*c.n32+d.n44*c.n42;this.n43=d.n41*c.n13+d.n42*c.n23+d.n43*c.n33+d.n44*c.n43;this.n44=d.n41*c.n14+d.n42*c.n24+d.n43*c.n34+d.n44*c.n44},multiplySelf:function(c){var p=this.n11,o=this.n12,k=this.n13,i=this.n14,f=this.n21,e=this.n22,d=this.n23,b=this.n24,a=this.n31,s=this.n32,r=this.n33,q=this.n34,n=this.n41,j=this.n42,h=this.n43,g=this.n44;this.n11=p*c.n11+o*c.n21+k*c.n31+i*c.n41;this.n12=p*c.n12+o*c.n22+k*c.n32+i*c.n42;this.n13=p*c.n13+o*c.n23+k*c.n33+i*c.n43;this.n14=p*c.n14+o*c.n24+k*c.n34+i*c.n44;this.n21=f*c.n11+e*c.n21+d*c.n31+b*c.n41;this.n22=f*c.n12+e*c.n22+d*c.n32+b*c.n42;this.n23=f*c.n13+e*c.n23+d*c.n33+b*c.n43;this.n24=f*c.n14+e*c.n24+d*c.n34+b*c.n44;this.n31=a*c.n11+s*c.n21+r*c.n31+q*c.n41;this.n32=a*c.n12+s*c.n22+r*c.n32+q*c.n42;this.n33=a*c.n13+s*c.n23+r*c.n33+q*c.n43;this.n34=a*c.n14+s*c.n24+r*c.n34+q*c.n44;this.n41=n*c.n11+j*c.n21+h*c.n31+g*c.n41;this.n42=n*c.n12+j*c.n22+h*c.n32+g*c.n42;this.n43=n*c.n13+j*c.n23+h*c.n33+g*c.n43;this.n44=n*c.n14+j*c.n24+h*c.n34+g*c.n44},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a},determinant:function(){return(this.n14*this.n23*this.n32*this.n41-this.n13*this.n24*this.n32*this.n41-this.n14*this.n22*this.n33*this.n41+this.n12*this.n24*this.n33*this.n41+this.n13*this.n22*this.n34*this.n41-this.n12*this.n23*this.n34*this.n41-this.n14*this.n23*this.n31*this.n42+this.n13*this.n24*this.n31*this.n42+this.n14*this.n21*this.n33*this.n42-this.n11*this.n24*this.n33*this.n42-this.n13*this.n21*this.n34*this.n42+this.n11*this.n23*this.n34*this.n42+this.n14*this.n22*this.n31*this.n43-this.n12*this.n24*this.n31*this.n43-this.n14*this.n21*this.n32*this.n43+this.n11*this.n24*this.n32*this.n43+this.n12*this.n21*this.n34*this.n43-this.n11*this.n22*this.n34*this.n43-this.n13*this.n22*this.n31*this.n44+this.n12*this.n23*this.n31*this.n44+this.n13*this.n21*this.n32*this.n44-this.n11*this.n23*this.n32*this.n44-this.n12*this.n21*this.n33*this.n44+this.n11*this.n22*this.n33*this.n44)},transpose:function(){function a(d,e,c){var b=d[e];d[e]=d[c];d[c]=b}a(this,"n21","n12");a(this,"n31","n13");a(this,"n32","n23");a(this,"n41","n14");a(this,"n42","n24");a(this,"n43","n34");return this},clone:function(){var a=new THREE.Matrix4();a.n11=this.n11;a.n12=this.n12;a.n13=this.n13;a.n14=this.n14;a.n21=this.n21;a.n22=this.n22;a.n23=this.n23;a.n24=this.n24;a.n31=this.n31;a.n32=this.n32;a.n33=this.n33;a.n34=this.n34;a.n41=this.n41;a.n42=this.n42;a.n43=this.n43;a.n44=this.n44;return a},flatten:function(){return[this.n11,this.n21,this.n31,this.n41,this.n12,this.n22,this.n32,this.n42,this.n13,this.n23,this.n33,this.n43,this.n14,this.n24,this.n34,this.n44]},toString:function(){return"| "+this.n11+" "+this.n12+" "+this.n13+" "+this.n14+" |\n| "+this.n21+" "+this.n22+" "+this.n23+" "+this.n24+" |\n| "+this.n31+" "+this.n32+" "+this.n33+" "+this.n34+" |\n| "+this.n41+" "+this.n42+" "+this.n43+" "+this.n44+" |"}};THREE.Matrix4.translationMatrix=function(b,d,c){var a=new THREE.Matrix4();a.n14=b;a.n24=d;a.n34=c;return a};THREE.Matrix4.scaleMatrix=function(b,d,c){var a=new THREE.Matrix4();a.n11=b;a.n22=d;a.n33=c;return a};THREE.Matrix4.rotationXMatrix=function(b){var a=new THREE.Matrix4();a.n22=a.n33=Math.cos(b);a.n32=Math.sin(b);a.n23=-a.n32;return a};THREE.Matrix4.rotationYMatrix=function(b){var a=new THREE.Matrix4();a.n11=a.n33=Math.cos(b);a.n13=Math.sin(b);a.n31=-a.n13;return a};THREE.Matrix4.rotationZMatrix=function(b){var a=new THREE.Matrix4();a.n11=a.n22=Math.cos(b);a.n21=Math.sin(b);a.n12=-a.n21;return a};THREE.Matrix4.rotationAxisAngleMatrix=function(b,d){var a=new THREE.Matrix4(),f=Math.cos(d),j=Math.sin(d),i=1-f,h=b.x,g=b.y,e=b.z;a.n11=i*h*h+f;a.n12=i*h*g-j*e;a.n13=i*h*e+j*g;a.n21=i*h*g+j*e;a.n22=i*g*g+f;a.n23=i*g*e-j*h;a.n31=i*h*e-j*g;a.n32=i*g*e+j*h;a.n33=i*e*e+f;return a};THREE.Matrix4.makeInvert=function(b){var a=new THREE.Matrix4();a.n11=b.n23*b.n34*b.n42-b.n24*b.n33*b.n42+b.n24*b.n32*b.n43-b.n22*b.n34*b.n43-b.n23*b.n32*b.n44+b.n22*b.n33*b.n44;a.n12=b.n14*b.n33*b.n42-b.n13*b.n34*b.n42-b.n14*b.n32*b.n43+b.n12*b.n34*b.n43+b.n13*b.n32*b.n44-b.n12*b.n33*b.n44;a.n13=b.n13*b.n24*b.n42-b.n14*b.n23*b.n42+b.n14*b.n22*b.n43-b.n12*b.n24*b.n43-b.n13*b.n22*b.n44+b.n12*b.n23*b.n44;a.n14=b.n14*b.n23*b.n32-b.n13*b.n24*b.n32-b.n14*b.n22*b.n33+b.n12*b.n24*b.n33+b.n13*b.n22*b.n34-b.n12*b.n23*b.n34;a.n21=b.n24*b.n33*b.n41-b.n23*b.n34*b.n41-b.n24*b.n31*b.n43+b.n21*b.n34*b.n43+b.n23*b.n31*b.n44-b.n21*b.n33*b.n44;a.n22=b.n13*b.n34*b.n41-b.n14*b.n33*b.n41+b.n14*b.n31*b.n43-b.n11*b.n34*b.n43-b.n13*b.n31*b.n44+b.n11*b.n33*b.n44;a.n23=b.n14*b.n23*b.n41-b.n13*b.n24*b.n41-b.n14*b.n21*b.n43+b.n11*b.n24*b.n43+b.n13*b.n21*b.n44-b.n11*b.n23*b.n44;a.n24=b.n13*b.n24*b.n31-b.n14*b.n23*b.n31+b.n14*b.n21*b.n33-b.n11*b.n24*b.n33-b.n13*b.n21*b.n34+b.n11*b.n23*b.n34;a.n31=b.n22*b.n34*b.n41-b.n24*b.n32*b.n41+b.n24*b.n31*b.n42-b.n21*b.n34*b.n42-b.n22*b.n31*b.n44+b.n21*b.n32*b.n44;a.n32=b.n14*b.n32*b.n41-b.n12*b.n34*b.n41-b.n14*b.n31*b.n42+b.n11*b.n34*b.n42+b.n12*b.n31*b.n44-b.n11*b.n32*b.n44;a.n33=b.n13*b.n24*b.n41-b.n14*b.n22*b.n41+b.n14*b.n21*b.n42-b.n11*b.n24*b.n42-b.n12*b.n21*b.n44+b.n11*b.n22*b.n44;a.n34=b.n14*b.n22*b.n31-b.n12*b.n24*b.n31-b.n14*b.n21*b.n32+b.n11*b.n24*b.n32+b.n12*b.n21*b.n34-b.n11*b.n22*b.n34;a.n41=b.n23*b.n32*b.n41-b.n22*b.n33*b.n41-b.n23*b.n31*b.n42+b.n21*b.n33*b.n42+b.n22*b.n31*b.n43-b.n21*b.n32*b.n43;a.n42=b.n12*b.n33*b.n41-b.n13*b.n32*b.n41+b.n13*b.n31*b.n42-b.n11*b.n33*b.n42-b.n12*b.n31*b.n43+b.n11*b.n32*b.n43;a.n43=b.n13*b.n22*b.n41-b.n12*b.n23*b.n41-b.n13*b.n21*b.n42+b.n11*b.n23*b.n42+b.n12*b.n21*b.n43-b.n11*b.n22*b.n43;a.n44=b.n12*b.n23*b.n31-b.n13*b.n22*b.n31+b.n13*b.n21*b.n32-b.n11*b.n23*b.n32-b.n12*b.n21*b.n33+b.n11*b.n22*b.n33;a.multiplyScalar(1/b.determinant());return a};THREE.Matrix4.makeFrustum=function(f,s,e,p,i,h){var g,r,o,q,n,k,j;g=new THREE.Matrix4();r=2*i/(s-f);o=2*i/(p-e);q=(s+f)/(s-f);n=(p+e)/(p-e);k=-(h+i)/(h-i);j=-2*h*i/(h-i);g.n11=r;g.n12=0;g.n13=q;g.n14=0;g.n21=0;g.n22=o;g.n23=n;g.n24=0;g.n31=0;g.n32=0;g.n33=k;g.n34=j;g.n41=0;g.n42=0;g.n43=-1;g.n44=0;return g};THREE.Matrix4.makePerspective=function(e,c,g,b){var a,f,h,d;a=g*Math.tan(e*Math.PI/360);f=-a;h=f*c;d=a*c;return THREE.Matrix4.makeFrustum(h,d,f,a,g,b)};THREE.Matrix4.makeOrtho=function(c,q,k,a,g,f){var d,n,j,i,o,e,b;d=new THREE.Matrix4();o=q-c;e=a-k;b=f-g;n=(q+c)/o;j=(a+k)/e;i=(f+g)/b;d.n11=2/o;d.n12=0;d.n13=0;d.n14=-n;d.n21=0;d.n22=2/e;d.n23=0;d.n24=-j;d.n31=0;d.n32=0;d.n33=-2/b;d.n34=-i;d.n41=0;d.n42=0;d.n43=0;d.n44=1;return d};THREE.Vertex=function(a,b){this.position=a||new THREE.Vector3();this.positionWorld=new THREE.Vector3();this.positionScreen=new THREE.Vector3();this.normal=b||new THREE.Vector3();this.normalWorld=new THREE.Vector3();this.normalScreen=new THREE.Vector3();this.__visible=true};THREE.Vertex.prototype={toString:function(){return"THREE.Vertex ( position: "+this.position+", normal: "+this.normal+" )"}};THREE.Face3=function(e,d,i,h,f,g){this.a=e;this.b=d;this.c=i;this.centroid=new THREE.Vector3();this.normal=h instanceof THREE.Vector3?h:new THREE.Vector3();this.color=f||new THREE.Color(4278190080);this.vertexNormals=h instanceof Array?h:[];this.material=g||0};THREE.Face3.prototype={getCenter:function(){return this.a.clone().addSelf(this.b).addSelf(this.c).divideScalar(3)},toString:function(){return"THREE.Face3 ( "+this.a+", "+this.b+", "+this.c+" )"}};THREE.Face4=function(f,e,k,j,i,g,h){this.a=f;this.b=e;this.c=k;this.d=j;this.centroid=new THREE.Vector3();this.normal=i instanceof THREE.Vector3?i:new THREE.Vector3();this.color=g||new THREE.Color(4278190080);this.vertexNormals=i instanceof Array?i:[];this.material=h||0};THREE.Face4.prototype={getCenter:function(){return this.a.clone().addSelf(this.b).addSelf(this.c).addSelf(this.d).divideScalar(4)},toString:function(){return"THREE.Face4 ( "+this.a+", "+this.b+", "+this.c+" "+this.d+" )"}};THREE.UV=function(b,a){this.u=b||0;this.v=a||0};THREE.UV.prototype={copy:function(a){this.u=a.u;this.v=a.v},toString:function(){return"THREE.UV ("+this.u+", "+this.v+")"}};THREE.Geometry=function(){this.vertices=[];this.faces=[];this.uvs=[]};THREE.Geometry.prototype={computeCentroids:function(){var c,b,a;for(c=0,b=this.faces.length;c0){this.bbox={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]};var a,b;for(a=1,b=this.vertices.length;athis.bbox.x[1]){this.bbox.x[1]=vertex.position.x}}if(vertex.position.ythis.bbox.y[1]){this.bbox.y[1]=vertex.position.y}}if(vertex.position.zthis.bbox.z[1]){this.bbox.z[1]=vertex.position.z}}}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+" )"}};THREE.Camera=function(c,b,d,a){this.fov=c;this.aspect=b;this.position=new THREE.Vector3(0,0,0);this.target={position:new THREE.Vector3(0,0,0)};this.projectionMatrix=THREE.Matrix4.makePerspective(c,b,d,a);this.up=new THREE.Vector3(0,1,0);this.matrix=new THREE.Matrix4();this.autoUpdateMatrix=true;this.updateMatrix=function(){this.matrix.lookAt(this.position,this.target.position,this.up)};this.toString=function(){return"THREE.Camera ( "+this.position+", "+this.target.position+" )"}};THREE.Light=function(a){this.color=new THREE.Color(255<<24|a)};THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light();THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;THREE.DirectionalLight=function(b,a){THREE.Light.call(this,b);this.position=new THREE.Vector3(0,1,0);this.intensity=a||1};THREE.DirectionalLight.prototype=new THREE.Light();THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;THREE.PointLight=function(b,a){THREE.Light.call(this,b);this.position=new THREE.Vector3(0,0,0);this.intensity=a||1};THREE.DirectionalLight.prototype=new THREE.Light();THREE.DirectionalLight.prototype.constructor=THREE.PointLight;THREE.Object3D=function(a){this.position=new THREE.Vector3();this.rotation=new THREE.Vector3();this.scale=new THREE.Vector3(1,1,1);this.matrix=new THREE.Matrix4();this.matrixTranslation=new THREE.Matrix4();this.matrixRotation=new THREE.Matrix4();this.matrixScale=new THREE.Matrix4();this.screen=new THREE.Vector3();this.autoUpdateMatrix=true;this.updateMatrix=function(){this.matrixPosition=THREE.Matrix4.translationMatrix(this.position.x,this.position.y,this.position.z);this.matrixRotation=THREE.Matrix4.rotationXMatrix(this.rotation.x);this.matrixRotation.multiplySelf(THREE.Matrix4.rotationYMatrix(this.rotation.y));this.matrixRotation.multiplySelf(THREE.Matrix4.rotationZMatrix(this.rotation.z));this.matrixScale=THREE.Matrix4.scaleMatrix(this.scale.x,this.scale.y,this.scale.z);this.matrix.copy(this.matrixPosition);this.matrix.multiplySelf(this.matrixRotation);this.matrix.multiplySelf(this.matrixScale)}};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a instanceof Array?a:[a];this.autoUpdateMatrix=false};THREE.Particle.prototype=new THREE.Object3D();THREE.Particle.prototype.constructor=THREE.Particle;THREE.Line=function(b,a){THREE.Object3D.call(this);this.geometry=b;this.material=a instanceof Array?a:[a]};THREE.Line.prototype=new THREE.Object3D();THREE.Line.prototype.constructor=THREE.Line;THREE.Mesh=function(b,a,c){THREE.Object3D.call(this);this.geometry=b;this.material=a instanceof Array?a:[a];this.flipSided=false;this.doubleSided=false;this.overdraw=false;this.materialFaces={};this.sortFacesByMaterial();if(c){this.normalizeUVs()}this.geometry.computeBoundingBox()};THREE.Mesh.prototype=new THREE.Object3D();THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.sortFacesByMaterial=function(){var d,c,b,a;for(d=0,c=this.geometry.faces.length;d=0?(b*255)<<24:4278190080)|c)};THREE.LineColorMaterial.prototype={toString:function(){return"THREE.LineColorMaterial ( color: "+this.color+", lineWidth: "+this.lineWidth+" )"}};THREE.MeshBitmapUVMappingMaterial=function(a){this.bitmap=a;this.toString=function(){return"THREE.MeshBitmapUVMappingMaterial ( bitmap: "+this.bitmap+" )"}};THREE.MeshColorFillMaterial=function(b,a){this.color=new THREE.Color((a>=0?(a*255)<<24:4278190080)|b);this.toString=function(){return"THREE.MeshColorFillMaterial ( color: "+this.color+" )"}};THREE.MeshColorStrokeMaterial=function(c,b,a){this.lineWidth=a||1;this.color=new THREE.Color((b>=0?(b*255)<<24:4278190080)|c);this.toString=function(){return"THREE.MeshColorStrokeMaterial ( lineWidth: "+this.lineWidth+", color: "+this.color+" )"}};THREE.MeshFaceColorFillMaterial=function(){this.toString=function(){return"THREE.MeshFaceColorFillMaterial ( )"}};THREE.MeshFaceColorStrokeMaterial=function(a){this.lineWidth=a||1;this.toString=function(){return"THREE.MeshFaceColorStrokeMaterial ( lineWidth: "+this.lineWidth+" )"}};THREE.ParticleBitmapMaterial=function(a){this.bitmap=a;this.offset=new THREE.Vector2();this.toString=function(){return"THREE.ParticleBitmapMaterial ( bitmap: "+this.bitmap+" )"}};THREE.ParticleCircleMaterial=function(b,a){this.color=new THREE.Color((a>=0?(a*255)<<24:4278190080)|b);this.toString=function(){return"THREE.ParticleCircleMaterial ( color: "+this.color+" )"}};THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function(){return"THREE.ParticleDOMMaterial ( domElement: "+this.domElement+" )"}};THREE.Scene=function(){this.objects=[];this.lights=[];this.addObject=function(a){this.objects.push(a)};this.removeObject=function(b){for(var c=0,a=this.objects.length;c0&&x.z<1}y=N.geometry.faces;for(K=0,D=y.length;K0&&x.z<1;if(F>0){E=N.geometry.vertices[F-1];if(J.__visible&&E.__visible){k=i[n]=i[n]||new THREE.RenderableLine();k.v1.copy(J.positionScreen);k.v2.copy(E.positionScreen);k.z=Math.max(J.positionScreen.z,E.positionScreen.z);k.material=N.material;e.push(k);n++}}}}else{if(N instanceof THREE.Particle){g.set(N.position.x,N.position.y,N.position.z,1);I.matrix.transform(g);I.projectionMatrix.transform(g);N.screen.set(g.x/g.w,g.y/g.w,g.z/g.w);if(N.screen.z>0&&N.screen.z<1){j=a[h]=a[h]||new THREE.RenderableParticle();j.x=N.screen.x;j.y=N.screen.y;j.z=N.screen.z;j.rotation=N.rotation.z;j.scale.x=N.scale.x*Math.abs(g.x/g.w-(g.x+I.projectionMatrix.n11)/(g.w+I.projectionMatrix.n14));j.scale.y=N.scale.y*Math.abs(g.y/g.w-(g.y+I.projectionMatrix.n22)/(g.w+I.projectionMatrix.n24));j.material=N.material;j.color=N.color;e.push(j);h++}}}}}e.sort(o);return e};function o(t,s){return s.z-t.z}};THREE.DOMRenderer=function(){THREE.Renderer.call(this);var e=null,g=new THREE.Projector(),b=document.createElement("div"),a,c,f,d;this.domElement=b;this.setSize=function(i,h){a=i;c=h;f=a/2;d=c/2};this.render=function(q,s){var r,h,i,o,p,t,n,k,j;e=g.projectScene(q,s);for(r=0,h=e.length;r0){D.r+=B.color.r*E;D.g+=B.color.g*E;D.b+=B.color.b*E}}else{if(B instanceof THREE.PointLight){f.sub(B.position,F.centroidWorld);f.normalize();E=F.normalWorld.dot(f)*B.intensity;if(E>0){D.r+=B.color.r*E;D.g+=B.color.g*E;D.b+=B.color.b*E}}}}}function q(U,J,I,P,O,D,B,R,Q,F,E,N,M){var C,T,S,H,G,L,K;o.beginPath();o.moveTo(J,I);o.lineTo(P,O);o.lineTo(D,B);o.lineTo(J,I);o.closePath();o.save();o.clip();C=R*(M-E)-F*M+N*E+(F-N)*Q;T=-(Q*(D-P)-E*D+M*P+(E-M)*J)/C;S=(E*B+Q*(O-B)-M*O+(M-E)*I)/C;H=(R*(D-P)-F*D+N*P+(F-N)*J)/C;G=-(F*B+R*(O-B)-N*O+(N-F)*I)/C;L=(R*(M*P-E*D)+Q*(F*D-N*P)+(N*E-F*M)*J)/C;K=(R*(M*O-E*B)+Q*(F*B-N*O)+(N*E-F*M)*I)/C;o.transform(T,S,H,G,L,K);o.drawImage(U,0,0);o.restore()}function b(C,B){g.sub(B,C);g.unit();g.multiplyScalar(0.75);B.addSelf(g);C.subSelf(g)}};THREE.SVGRenderer=function(){var q=null,k=new THREE.Projector(),m=document.createElementNS("http://www.w3.org/2000/svg","svg"),e,u,i,a,s=new THREE.Rectangle(),p=new THREE.Rectangle(),f=new THREE.Color(4294967295),o=new THREE.Color(4294967295),b=new THREE.Color(4294967295),d=new THREE.Vector3(),c=[],g=[],t=1;this.domElement=m;this.autoClear=true;this.setQuality=function(v){switch(v){case"high":t=1;break;case"low":t=0;break}};this.setSize=function(w,v){e=w;u=v;i=e/2;a=u/2;m.setAttribute("viewBox",(-i)+" "+(-a)+" "+e+" "+u);m.setAttribute("width",e);m.setAttribute("height",u);s.set(-i,-a,i,a)};this.clear=function(){while(m.childNodes.length>0){m.removeChild(m.childNodes[0])}};this.render=function(O,L){var N,x,I,M,y,E,H=0,z=0,F,C,A,K,J,w,v,D,B,G;if(this.autoClear){this.clear()}q=k.projectScene(O,L);r(O,b);for(N=0,x=q.length;N0){x.r+=v.color.r*y;x.g+=v.color.g*y;x.b+=v.color.b*y}}else{if(v instanceof THREE.PointLight){d.sub(v.position,z.centroidWorld);d.normalize();y=z.normalWorld.dot(d)*v.intensity;if(y>0){x.r+=v.color.r*y;x.g+=v.color.g*y;x.b+=v.color.b*y}}}}}function h(v){if(c[v]==null){c[v]=document.createElementNS("http://www.w3.org/2000/svg","path");if(t==0){c[v].setAttribute("shape-rendering","crispEdges")}return c[v]}return c[v]}function n(v){if(g[v]==null){g[v]=document.createElementNS("http://www.w3.org/2000/svg","circle");if(t==0){g[v].setAttribute("shape-rendering","crispEdges")}return g[v]}return g[v]}};THREE.WebGLRenderer=function(){var e=document.createElement("canvas"),a,h,d=new THREE.Matrix4(),g;this.domElement=e;this.autoClear=true;f();c();this.setSize=function(j,i){e.width=j;e.height=i;a.viewport(0,0,e.width,e.height)};this.clear=function(){a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT)};this.render=function(O,K){var v,P,R,C,Q,G,u,q,B,D,s,N,y,F,A,M,w,H,L,J,p,n,k,j,I,x,t,E;if(this.autoClear){this.clear()}a.uniform1i(h.enableLighting,O.lights.length);for(I=0,x=O.lights.length;I>24&255)/255;this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgba("+Math.floor(this.r*255)+","+Math.floor(this.g*255)+","+Math.floor(this.b*255)+","+this.a+")"},toString:function(){return"THREE.Color ( r: "+this.r+", g: "+this.g+", b: "+this.b+", a: "+this.a+", hex: "+this.hex+" )"}};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};THREE.Vector2.prototype={set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;return this},add:function(b,a){this.x=b.x+a.x;this.y=b.y+a.y;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;return this},sub:function(b,a){this.x=b.x-a.x;this.y=b.y-a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},unit:function(){this.multiplyScalar(1/this.length());return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthSq:function(){return this.x*this.x+this.y*this.y},negate:function(){this.x=-this.x;this.y=-this.y;return this},clone:function(){return new THREE.Vector2(this.x,this.y)},toString:function(){return"THREE.Vector2 ("+this.x+", "+this.y+")"}};THREE.Vector3=function(a,c,b){this.x=a||0;this.y=c||0;this.z=b||0};THREE.Vector3.prototype={set:function(a,c,b){this.x=a;this.y=c;this.z=b;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(b,a){this.x=b.x+a.x;this.y=b.y+a.y;this.z=b.z+a.z;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},sub:function(b,a){this.x=b.x-a.x;this.y=b.y-a.y;this.z=b.z-a.z;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},cross:function(b,a){this.x=b.y*a.z-b.z*a.y;this.y=b.z*a.x-b.x*a.z;this.z=b.x*a.y-b.y*a.x;return this},crossSelf:function(c){var b=this.x,a=this.y,d=this.z;this.x=a*c.z-d*c.y;this.y=d*c.x-b*c.z;this.z=b*c.y-a*c.x;return this},multiplySelf:function(a){this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},divideScalar:function(a){this.x/=a;this.y/=a;this.z/=a;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(d){var c=this.x-d.x,b=this.y-d.y,a=this.z-d.z;return c*c+b*b+a*a},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},normalize:function(){if(this.length()>0){this.multiplyScalar(1/this.length())}else{this.multiplyScalar(0)}return this},setLength:function(a){return this.normalize().multiplyScalar(a)},isZero:function(){var a=0.0001;return(Math.abs(this.x)=0&&Math.min(g,i.getY2())-Math.max(h,i.getY1())>=0};this.empty=function(){e=true;f=0;h=0;d=0;g=0;b()};this.isEmpty=function(){return e};this.toString=function(){return"THREE.Rectangle (x1: "+f+", y1: "+g+", x2: "+d+", y1: "+h+", width: "+a+", height: "+c+")"}};THREE.Matrix4=function(){this._x=new THREE.Vector3();this._y=new THREE.Vector3();this._z=new THREE.Vector3()};THREE.Matrix4.prototype={n11:1,n12:0,n13:0,n14:0,n21:0,n22:1,n23:0,n24:0,n31:0,n32:0,n33:1,n34:0,n41:0,n42:0,n43:0,n44:1,identity:function(){this.n11=1;this.n12=0;this.n13=0;this.n14=0;this.n21=0;this.n22=1;this.n23=0;this.n24=0;this.n31=0;this.n32=0;this.n33=1;this.n34=0;this.n41=0;this.n42=0;this.n43=0;this.n44=1},copy:function(a){this.n11=a.n11;this.n12=a.n12;this.n13=a.n13;this.n14=a.n14;this.n21=a.n21;this.n22=a.n22;this.n23=a.n23;this.n24=a.n24;this.n31=a.n31;this.n32=a.n32;this.n33=a.n33;this.n34=a.n34;this.n41=a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(d,c,b){var a=this._x,f=this._y,e=this._z;e.sub(d,c);e.normalize();a.cross(b,e);a.normalize();f.cross(e,a);f.normalize();this.n11=a.x;this.n12=a.y;this.n13=a.z;this.n14=-a.dot(d);this.n21=f.x;this.n22=f.y;this.n23=f.z;this.n24=-f.dot(d);this.n31=e.x;this.n32=e.y;this.n33=e.z;this.n34=-e.dot(d);this.n41=0;this.n42=0;this.n43=0;this.n44=1},transform:function(a){var d=a.x,c=a.y,b=a.z,e=a.w?a.w:1;a.x=this.n11*d+this.n12*c+this.n13*b+this.n14*e;a.y=this.n21*d+this.n22*c+this.n23*b+this.n24*e;a.z=this.n31*d+this.n32*c+this.n33*b+this.n34*e;e=this.n41*d+this.n42*c+this.n43*b+this.n44*e;if(a.w){a.w=e}else{a.x=a.x/e;a.y=a.y/e;a.z=a.z/e}return a},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(d,c){this.n11=d.n11*c.n11+d.n12*c.n21+d.n13*c.n31+d.n14*c.n41;this.n12=d.n11*c.n12+d.n12*c.n22+d.n13*c.n32+d.n14*c.n42;this.n13=d.n11*c.n13+d.n12*c.n23+d.n13*c.n33+d.n14*c.n43;this.n14=d.n11*c.n14+d.n12*c.n24+d.n13*c.n34+d.n14*c.n44;this.n21=d.n21*c.n11+d.n22*c.n21+d.n23*c.n31+d.n24*c.n41;this.n22=d.n21*c.n12+d.n22*c.n22+d.n23*c.n32+d.n24*c.n42;this.n23=d.n21*c.n13+d.n22*c.n23+d.n23*c.n33+d.n24*c.n43;this.n24=d.n21*c.n14+d.n22*c.n24+d.n23*c.n34+d.n24*c.n44;this.n31=d.n31*c.n11+d.n32*c.n21+d.n33*c.n31+d.n34*c.n41;this.n32=d.n31*c.n12+d.n32*c.n22+d.n33*c.n32+d.n34*c.n42;this.n33=d.n31*c.n13+d.n32*c.n23+d.n33*c.n33+d.n34*c.n43;this.n34=d.n31*c.n14+d.n32*c.n24+d.n33*c.n34+d.n34*c.n44;this.n41=d.n41*c.n11+d.n42*c.n21+d.n43*c.n31+d.n44*c.n41;this.n42=d.n41*c.n12+d.n42*c.n22+d.n43*c.n32+d.n44*c.n42;this.n43=d.n41*c.n13+d.n42*c.n23+d.n43*c.n33+d.n44*c.n43;this.n44=d.n41*c.n14+d.n42*c.n24+d.n43*c.n34+d.n44*c.n44},multiplySelf:function(c){var o=this.n11,n=this.n12,k=this.n13,i=this.n14,f=this.n21,e=this.n22,d=this.n23,b=this.n24,a=this.n31,r=this.n32,q=this.n33,p=this.n34,l=this.n41,j=this.n42,h=this.n43,g=this.n44;this.n11=o*c.n11+n*c.n21+k*c.n31+i*c.n41;this.n12=o*c.n12+n*c.n22+k*c.n32+i*c.n42;this.n13=o*c.n13+n*c.n23+k*c.n33+i*c.n43;this.n14=o*c.n14+n*c.n24+k*c.n34+i*c.n44;this.n21=f*c.n11+e*c.n21+d*c.n31+b*c.n41;this.n22=f*c.n12+e*c.n22+d*c.n32+b*c.n42;this.n23=f*c.n13+e*c.n23+d*c.n33+b*c.n43;this.n24=f*c.n14+e*c.n24+d*c.n34+b*c.n44;this.n31=a*c.n11+r*c.n21+q*c.n31+p*c.n41;this.n32=a*c.n12+r*c.n22+q*c.n32+p*c.n42;this.n33=a*c.n13+r*c.n23+q*c.n33+p*c.n43;this.n34=a*c.n14+r*c.n24+q*c.n34+p*c.n44;this.n41=l*c.n11+j*c.n21+h*c.n31+g*c.n41;this.n42=l*c.n12+j*c.n22+h*c.n32+g*c.n42;this.n43=l*c.n13+j*c.n23+h*c.n33+g*c.n43;this.n44=l*c.n14+j*c.n24+h*c.n34+g*c.n44},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a},determinant:function(){return(this.n14*this.n23*this.n32*this.n41-this.n13*this.n24*this.n32*this.n41-this.n14*this.n22*this.n33*this.n41+this.n12*this.n24*this.n33*this.n41+this.n13*this.n22*this.n34*this.n41-this.n12*this.n23*this.n34*this.n41-this.n14*this.n23*this.n31*this.n42+this.n13*this.n24*this.n31*this.n42+this.n14*this.n21*this.n33*this.n42-this.n11*this.n24*this.n33*this.n42-this.n13*this.n21*this.n34*this.n42+this.n11*this.n23*this.n34*this.n42+this.n14*this.n22*this.n31*this.n43-this.n12*this.n24*this.n31*this.n43-this.n14*this.n21*this.n32*this.n43+this.n11*this.n24*this.n32*this.n43+this.n12*this.n21*this.n34*this.n43-this.n11*this.n22*this.n34*this.n43-this.n13*this.n22*this.n31*this.n44+this.n12*this.n23*this.n31*this.n44+this.n13*this.n21*this.n32*this.n44-this.n11*this.n23*this.n32*this.n44-this.n12*this.n21*this.n33*this.n44+this.n11*this.n22*this.n33*this.n44)},transpose:function(){function a(d,e,c){var b=d[e];d[e]=d[c];d[c]=b}a(this,"n21","n12");a(this,"n31","n13");a(this,"n32","n23");a(this,"n41","n14");a(this,"n42","n24");a(this,"n43","n34");return this},clone:function(){var a=new THREE.Matrix4();a.n11=this.n11;a.n12=this.n12;a.n13=this.n13;a.n14=this.n14;a.n21=this.n21;a.n22=this.n22;a.n23=this.n23;a.n24=this.n24;a.n31=this.n31;a.n32=this.n32;a.n33=this.n33;a.n34=this.n34;a.n41=this.n41;a.n42=this.n42;a.n43=this.n43;a.n44=this.n44;return a},flatten:function(){return[this.n11,this.n21,this.n31,this.n41,this.n12,this.n22,this.n32,this.n42,this.n13,this.n23,this.n33,this.n43,this.n14,this.n24,this.n34,this.n44]},toString:function(){return"| "+this.n11+" "+this.n12+" "+this.n13+" "+this.n14+" |\n| "+this.n21+" "+this.n22+" "+this.n23+" "+this.n24+" |\n| "+this.n31+" "+this.n32+" "+this.n33+" "+this.n34+" |\n| "+this.n41+" "+this.n42+" "+this.n43+" "+this.n44+" |"}};THREE.Matrix4.translationMatrix=function(b,d,c){var a=new THREE.Matrix4();a.n14=b;a.n24=d;a.n34=c;return a};THREE.Matrix4.scaleMatrix=function(b,d,c){var a=new THREE.Matrix4();a.n11=b;a.n22=d;a.n33=c;return a};THREE.Matrix4.rotationXMatrix=function(b){var a=new THREE.Matrix4();a.n22=a.n33=Math.cos(b);a.n32=Math.sin(b);a.n23=-a.n32;return a};THREE.Matrix4.rotationYMatrix=function(b){var a=new THREE.Matrix4();a.n11=a.n33=Math.cos(b);a.n13=Math.sin(b);a.n31=-a.n13;return a};THREE.Matrix4.rotationZMatrix=function(b){var a=new THREE.Matrix4();a.n11=a.n22=Math.cos(b);a.n21=Math.sin(b);a.n12=-a.n21;return a};THREE.Matrix4.rotationAxisAngleMatrix=function(b,d){var a=new THREE.Matrix4(),f=Math.cos(d),j=Math.sin(d),i=1-f,h=b.x,g=b.y,e=b.z;a.n11=i*h*h+f;a.n12=i*h*g-j*e;a.n13=i*h*e+j*g;a.n21=i*h*g+j*e;a.n22=i*g*g+f;a.n23=i*g*e-j*h;a.n31=i*h*e-j*g;a.n32=i*g*e+j*h;a.n33=i*e*e+f;return a};THREE.Matrix4.makeInvert=function(b){var a=new THREE.Matrix4();a.n11=b.n23*b.n34*b.n42-b.n24*b.n33*b.n42+b.n24*b.n32*b.n43-b.n22*b.n34*b.n43-b.n23*b.n32*b.n44+b.n22*b.n33*b.n44;a.n12=b.n14*b.n33*b.n42-b.n13*b.n34*b.n42-b.n14*b.n32*b.n43+b.n12*b.n34*b.n43+b.n13*b.n32*b.n44-b.n12*b.n33*b.n44;a.n13=b.n13*b.n24*b.n42-b.n14*b.n23*b.n42+b.n14*b.n22*b.n43-b.n12*b.n24*b.n43-b.n13*b.n22*b.n44+b.n12*b.n23*b.n44;a.n14=b.n14*b.n23*b.n32-b.n13*b.n24*b.n32-b.n14*b.n22*b.n33+b.n12*b.n24*b.n33+b.n13*b.n22*b.n34-b.n12*b.n23*b.n34;a.n21=b.n24*b.n33*b.n41-b.n23*b.n34*b.n41-b.n24*b.n31*b.n43+b.n21*b.n34*b.n43+b.n23*b.n31*b.n44-b.n21*b.n33*b.n44;a.n22=b.n13*b.n34*b.n41-b.n14*b.n33*b.n41+b.n14*b.n31*b.n43-b.n11*b.n34*b.n43-b.n13*b.n31*b.n44+b.n11*b.n33*b.n44;a.n23=b.n14*b.n23*b.n41-b.n13*b.n24*b.n41-b.n14*b.n21*b.n43+b.n11*b.n24*b.n43+b.n13*b.n21*b.n44-b.n11*b.n23*b.n44;a.n24=b.n13*b.n24*b.n31-b.n14*b.n23*b.n31+b.n14*b.n21*b.n33-b.n11*b.n24*b.n33-b.n13*b.n21*b.n34+b.n11*b.n23*b.n34;a.n31=b.n22*b.n34*b.n41-b.n24*b.n32*b.n41+b.n24*b.n31*b.n42-b.n21*b.n34*b.n42-b.n22*b.n31*b.n44+b.n21*b.n32*b.n44;a.n32=b.n14*b.n32*b.n41-b.n12*b.n34*b.n41-b.n14*b.n31*b.n42+b.n11*b.n34*b.n42+b.n12*b.n31*b.n44-b.n11*b.n32*b.n44;a.n33=b.n13*b.n24*b.n41-b.n14*b.n22*b.n41+b.n14*b.n21*b.n42-b.n11*b.n24*b.n42-b.n12*b.n21*b.n44+b.n11*b.n22*b.n44;a.n34=b.n14*b.n22*b.n31-b.n12*b.n24*b.n31-b.n14*b.n21*b.n32+b.n11*b.n24*b.n32+b.n12*b.n21*b.n34-b.n11*b.n22*b.n34;a.n41=b.n23*b.n32*b.n41-b.n22*b.n33*b.n41-b.n23*b.n31*b.n42+b.n21*b.n33*b.n42+b.n22*b.n31*b.n43-b.n21*b.n32*b.n43;a.n42=b.n12*b.n33*b.n41-b.n13*b.n32*b.n41+b.n13*b.n31*b.n42-b.n11*b.n33*b.n42-b.n12*b.n31*b.n43+b.n11*b.n32*b.n43;a.n43=b.n13*b.n22*b.n41-b.n12*b.n23*b.n41-b.n13*b.n21*b.n42+b.n11*b.n23*b.n42+b.n12*b.n21*b.n43-b.n11*b.n22*b.n43;a.n44=b.n12*b.n23*b.n31-b.n13*b.n22*b.n31+b.n13*b.n21*b.n32-b.n11*b.n23*b.n32-b.n12*b.n21*b.n33+b.n11*b.n22*b.n33;a.multiplyScalar(1/b.determinant());return a};THREE.Matrix4.makeFrustum=function(f,r,e,o,i,h){var g,q,n,p,l,k,j;g=new THREE.Matrix4();q=2*i/(r-f);n=2*i/(o-e);p=(r+f)/(r-f);l=(o+e)/(o-e);k=-(h+i)/(h-i);j=-2*h*i/(h-i);g.n11=q;g.n12=0;g.n13=p;g.n14=0;g.n21=0;g.n22=n;g.n23=l;g.n24=0;g.n31=0;g.n32=0;g.n33=k;g.n34=j;g.n41=0;g.n42=0;g.n43=-1;g.n44=0;return g};THREE.Matrix4.makePerspective=function(e,c,g,b){var a,f,h,d;a=g*Math.tan(e*Math.PI/360);f=-a;h=f*c;d=a*c;return THREE.Matrix4.makeFrustum(h,d,f,a,g,b)};THREE.Matrix4.makeOrtho=function(c,o,k,a,g,f){var d,l,j,i,n,e,b;d=new THREE.Matrix4();n=o-c;e=a-k;b=f-g;l=(o+c)/n;j=(a+k)/e;i=(f+g)/b;d.n11=2/n;d.n12=0;d.n13=0;d.n14=-l;d.n21=0;d.n22=2/e;d.n23=0;d.n24=-j;d.n31=0;d.n32=0;d.n33=-2/b;d.n34=-i;d.n41=0;d.n42=0;d.n43=0;d.n44=1;return d};THREE.Vertex=function(a,b){this.position=a||new THREE.Vector3();this.positionWorld=new THREE.Vector3();this.positionScreen=new THREE.Vector3();this.normal=b||new THREE.Vector3();this.normalWorld=new THREE.Vector3();this.normalScreen=new THREE.Vector3();this.__visible=true};THREE.Vertex.prototype={toString:function(){return"THREE.Vertex ( position: "+this.position+", normal: "+this.normal+" )"}};THREE.Face3=function(e,d,h,g,f){this.a=e;this.b=d;this.c=h;this.centroid=new THREE.Vector3();this.normal=g||new THREE.Vector3();this.color=f||new THREE.Color(4278190080)};THREE.Face3.prototype={getCenter:function(){return this.a.clone().addSelf(this.b).addSelf(this.c).divideScalar(3)},toString:function(){return"THREE.Face3 ( "+this.a+", "+this.b+", "+this.c+" )"}};THREE.Face4=function(f,e,j,i,h,g){this.a=f;this.b=e;this.c=j;this.d=i;this.centroid=new THREE.Vector3();this.normal=h||new THREE.Vector3();this.color=g||new THREE.Color(4278190080)};THREE.Face4.prototype={getCenter:function(){return this.a.clone().addSelf(this.b).addSelf(this.c).addSelf(this.d).divideScalar(4)},toString:function(){return"THREE.Face4 ( "+this.a+", "+this.b+", "+this.c+" "+this.d+" )"}};THREE.UV=function(b,a){this.u=b||0;this.v=a||0};THREE.UV.prototype={copy:function(a){this.u=a.u;this.v=a.v},toString:function(){return"THREE.UV ("+this.u+", "+this.v+")"}};THREE.Geometry=function(){this.vertices=[];this.faces=[];this.uvs=[]};THREE.Geometry.prototype={computeCentroids:function(){var c,b,a;for(c=0,b=this.faces.length;c=0?(b*255)<<24:4278190080)|c)};THREE.LineColorMaterial.prototype={toString:function(){return"THREE.LineColorMaterial ( color: "+this.color+", lineWidth: "+this.lineWidth+" )"}};THREE.MeshBitmapUVMappingMaterial=function(a){this.bitmap=a;this.toString=function(){return"THREE.MeshBitmapUVMappingMaterial ( bitmap: "+this.bitmap+" )"}};THREE.MeshColorFillMaterial=function(b,a){this.color=new THREE.Color((a>=0?(a*255)<<24:4278190080)|b);this.toString=function(){return"THREE.MeshColorFillMaterial ( color: "+this.color+" )"}};THREE.MeshColorStrokeMaterial=function(c,b,a){this.lineWidth=a||1;this.color=new THREE.Color((b>=0?(b*255)<<24:4278190080)|c);this.toString=function(){return"THREE.MeshColorStrokeMaterial ( lineWidth: "+this.lineWidth+", color: "+this.color+" )"}};THREE.MeshFaceColorFillMaterial=function(){this.toString=function(){return"THREE.MeshFaceColorFillMaterial ( )"}};THREE.MeshFaceColorStrokeMaterial=function(a){this.lineWidth=a||1;this.toString=function(){return"THREE.MeshFaceColorStrokeMaterial ( lineWidth: "+this.lineWidth+" )"}};THREE.ParticleBitmapMaterial=function(a){this.bitmap=a;this.offset=new THREE.Vector2();this.toString=function(){return"THREE.ParticleBitmapMaterial ( bitmap: "+this.bitmap+" )"}};THREE.ParticleCircleMaterial=function(b,a){this.color=new THREE.Color((a>=0?(a*255)<<24:4278190080)|b);this.toString=function(){return"THREE.ParticleCircleMaterial ( color: "+this.color+" )"}};THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function(){return"THREE.ParticleDOMMaterial ( domElement: "+this.domElement+" )"}};THREE.Scene=function(){this.objects=[];this.lights=[];this.addObject=function(a){this.objects.push(a)};this.removeObject=function(b){for(var c=0,a=this.objects.length;c0&&w.z<1}x=M.geometry.faces;for(J=0,C=x.length;J0&&w.z<1;if(E>0){D=M.geometry.vertices[E-1];if(I.__visible&&D.__visible){k=i[m]=i[m]||new THREE.RenderableLine();k.v1.copy(I.positionScreen);k.v2.copy(D.positionScreen);k.z=Math.max(I.positionScreen.z,D.positionScreen.z);k.material=M.material;e.push(k);m++}}}}else{if(M instanceof THREE.Particle){g.set(M.position.x,M.position.y,M.position.z,1);H.matrix.transform(g);H.projectionMatrix.transform(g);M.screen.set(g.x/g.w,g.y/g.w,g.z/g.w);if(M.screen.z>0&&M.screen.z<1){j=a[h]=a[h]||new THREE.RenderableParticle();j.x=M.screen.x;j.y=M.screen.y;j.z=M.screen.z;j.rotation=M.rotation.z;j.scale.x=M.scale.x*Math.abs(g.x/g.w-(g.x+H.projectionMatrix.n11)/(g.w+H.projectionMatrix.n14));j.scale.y=M.scale.y*Math.abs(g.y/g.w-(g.y+H.projectionMatrix.n22)/(g.w+H.projectionMatrix.n24));j.material=M.material;j.color=M.color;e.push(j);h++}}}}}e.sort(n);return e};function n(s,r){return r.z-s.z}};THREE.DOMRenderer=function(){THREE.Renderer.call(this);var e=null,g=new THREE.Projector(),b=document.createElement("div"),a,c,f,d;this.domElement=b;this.setSize=function(i,h){a=i;c=h;f=a/2;d=c/2};this.render=function(p,r){var q,h,i,n,o,s,l,k,j;e=g.projectScene(p,r);for(q=0,h=e.length;q0){C.r+=A.color.r*D;C.g+=A.color.g*D;C.b+=A.color.b*D}}else{if(A instanceof THREE.PointLight){f.sub(A.position,E.centroidWorld);f.normalize();D=E.normalWorld.dot(f)*A.intensity;if(D>0){C.r+=A.color.r*D;C.g+=A.color.g*D;C.b+=A.color.b*D}}}}}function p(T,I,H,O,N,C,A,Q,P,E,D,M,L){var B,S,R,G,F,K,J;n.beginPath();n.moveTo(I,H);n.lineTo(O,N);n.lineTo(C,A);n.lineTo(I,H);n.closePath();n.save();n.clip();B=Q*(L-D)-E*L+M*D+(E-M)*P;S=-(P*(C-O)-D*C+L*O+(D-L)*I)/B;R=(D*A+P*(N-A)-L*N+(L-D)*H)/B;G=(Q*(C-O)-E*C+M*O+(E-M)*I)/B;F=-(E*A+Q*(N-A)-M*N+(M-E)*H)/B;K=(Q*(L*O-D*C)+P*(E*C-M*O)+(M*D-E*L)*I)/B;J=(Q*(L*N-D*A)+P*(E*A-M*N)+(M*D-E*L)*H)/B;n.transform(S,R,G,F,K,J);n.drawImage(T,0,0);n.restore()}function b(B,A){g.sub(A,B);g.unit();g.multiplyScalar(0.75);A.addSelf(g);B.subSelf(g)}};THREE.SVGRenderer=function(){var p=null,k=new THREE.Projector(),l=document.createElementNS("http://www.w3.org/2000/svg","svg"),e,t,i,a,r=new THREE.Rectangle(),o=new THREE.Rectangle(),f=new THREE.Color(4294967295),n=new THREE.Color(4294967295),b=new THREE.Color(4294967295),d=new THREE.Vector3(),c=[],g=[],s=1;this.domElement=l;this.autoClear=true;this.setQuality=function(u){switch(u){case"high":s=1;break;case"low":s=0;break}};this.setSize=function(v,u){e=v;t=u;i=e/2;a=t/2;l.setAttribute("viewBox",(-i)+" "+(-a)+" "+e+" "+t);l.setAttribute("width",e);l.setAttribute("height",t);r.set(-i,-a,i,a)};this.clear=function(){while(l.childNodes.length>0){l.removeChild(l.childNodes[0])}};this.render=function(N,K){var M,w,H,L,x,D,G=0,y=0,E,B,z,J,I,v,u,C,A,F;if(this.autoClear){this.clear()}p=k.projectScene(N,K);q(N,b);for(M=0,w=p.length;M0){w.r+=u.color.r*x;w.g+=u.color.g*x;w.b+=u.color.b*x}}else{if(u instanceof THREE.PointLight){d.sub(u.position,y.centroidWorld);d.normalize();x=y.normalWorld.dot(d)*u.intensity;if(x>0){w.r+=u.color.r*x;w.g+=u.color.g*x;w.b+=u.color.b*x}}}}}function h(u){if(c[u]==null){c[u]=document.createElementNS("http://www.w3.org/2000/svg","path");if(s==0){c[u].setAttribute("shape-rendering","crispEdges")}return c[u]}return c[u]}function m(u){if(g[u]==null){g[u]=document.createElementNS("http://www.w3.org/2000/svg","circle");if(s==0){g[u].setAttribute("shape-rendering","crispEdges")}return g[u]}return g[u]}};THREE.WebGLRenderer=function(){var e=document.createElement("canvas"),a,h,d=new THREE.Matrix4(),g;this.domElement=e;this.autoClear=true;f();c();this.setSize=function(j,i){e.width=j;e.height=i;a.viewport(0,0,e.width,e.height)};this.clear=function(){a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT)};this.render=function(K,G){var t,L,N,z,M,C,s,q,y,A,r,J,w,B,x,I,u,D,H,F,p,n,k,j,E,v;if(this.autoClear){this.clear()}a.uniform1i(h.enableLighting,K.lights.length);for(E=0,v=K.lights.length;E>24&255)/255;this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgba("+Math.floor(this.r*255)+","+Math.floor(this.g*255)+","+Math.floor(this.b*255)+","+this.a+")"},toString:function(){return"THREE.Color ( r: "+this.r+", g: "+this.g+", b: "+this.b+", a: "+this.a+", hex: "+this.hex+" )"}};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};THREE.Vector2.prototype={set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;return this},add:function(b,a){this.x=b.x+a.x;this.y=b.y+a.y;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;return this},sub:function(b,a){this.x=b.x-a.x;this.y=b.y-a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},unit:function(){this.multiplyScalar(1/this.length());return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthSq:function(){return this.x*this.x+this.y*this.y},negate:function(){this.x=-this.x;this.y=-this.y;return this},clone:function(){return new THREE.Vector2(this.x,this.y)},toString:function(){return"THREE.Vector2 ("+this.x+", "+this.y+")"}};THREE.Vector3=function(a,c,b){this.x=a||0;this.y=c||0;this.z=b||0};THREE.Vector3.prototype={set:function(a,c,b){this.x=a;this.y=c;this.z=b;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(b,a){this.x=b.x+a.x;this.y=b.y+a.y;this.z=b.z+a.z;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},sub:function(b,a){this.x=b.x-a.x;this.y=b.y-a.y;this.z=b.z-a.z;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},cross:function(b,a){this.x=b.y*a.z-b.z*a.y;this.y=b.z*a.x-b.x*a.z;this.z=b.x*a.y-b.y*a.x;return this},crossSelf:function(c){var b=this.x,a=this.y,d=this.z;this.x=a*c.z-d*c.y;this.y=d*c.x-b*c.z;this.z=b*c.y-a*c.x;return this},multiplySelf:function(a){this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},divideScalar:function(a){this.x/=a;this.y/=a;this.z/=a;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(d){var c=this.x-d.x,b=this.y-d.y,a=this.z-d.z;return c*c+b*b+a*a},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},normalize:function(){if(this.length()>0){this.multiplyScalar(1/this.length())}else{this.multiplyScalar(0)}return this},setLength:function(a){return this.normalize().multiplyScalar(a)},isZero:function(){var a=0.0001;return(Math.abs(this.x)=0&&Math.min(g,i.getY2())-Math.max(h,i.getY1())>=0};this.empty=function(){e=true;f=0;h=0;d=0;g=0;b()};this.isEmpty=function(){return e};this.toString=function(){return"THREE.Rectangle (x1: "+f+", y1: "+g+", x2: "+d+", y1: "+h+", width: "+a+", height: "+c+")"}};THREE.Matrix4=function(){this._x=new THREE.Vector3();this._y=new THREE.Vector3();this._z=new THREE.Vector3()};THREE.Matrix4.prototype={n11:1,n12:0,n13:0,n14:0,n21:0,n22:1,n23:0,n24:0,n31:0,n32:0,n33:1,n34:0,n41:0,n42:0,n43:0,n44:1,identity:function(){this.n11=1;this.n12=0;this.n13=0;this.n14=0;this.n21=0;this.n22=1;this.n23=0;this.n24=0;this.n31=0;this.n32=0;this.n33=1;this.n34=0;this.n41=0;this.n42=0;this.n43=0;this.n44=1},copy:function(a){this.n11=a.n11;this.n12=a.n12;this.n13=a.n13;this.n14=a.n14;this.n21=a.n21;this.n22=a.n22;this.n23=a.n23;this.n24=a.n24;this.n31=a.n31;this.n32=a.n32;this.n33=a.n33;this.n34=a.n34;this.n41=a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(d,c,b){var a=this._x,f=this._y,e=this._z;e.sub(d,c);e.normalize();a.cross(b,e);a.normalize();f.cross(e,a);f.normalize();this.n11=a.x;this.n12=a.y;this.n13=a.z;this.n14=-a.dot(d);this.n21=f.x;this.n22=f.y;this.n23=f.z;this.n24=-f.dot(d);this.n31=e.x;this.n32=e.y;this.n33=e.z;this.n34=-e.dot(d);this.n41=0;this.n42=0;this.n43=0;this.n44=1},transform:function(a){var d=a.x,c=a.y,b=a.z,e=a.w?a.w:1;a.x=this.n11*d+this.n12*c+this.n13*b+this.n14*e;a.y=this.n21*d+this.n22*c+this.n23*b+this.n24*e;a.z=this.n31*d+this.n32*c+this.n33*b+this.n34*e;e=this.n41*d+this.n42*c+this.n43*b+this.n44*e;if(a.w){a.w=e}else{a.x=a.x/e;a.y=a.y/e;a.z=a.z/e}return a},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(d,c){this.n11=d.n11*c.n11+d.n12*c.n21+d.n13*c.n31+d.n14*c.n41;this.n12=d.n11*c.n12+d.n12*c.n22+d.n13*c.n32+d.n14*c.n42;this.n13=d.n11*c.n13+d.n12*c.n23+d.n13*c.n33+d.n14*c.n43;this.n14=d.n11*c.n14+d.n12*c.n24+d.n13*c.n34+d.n14*c.n44;this.n21=d.n21*c.n11+d.n22*c.n21+d.n23*c.n31+d.n24*c.n41;this.n22=d.n21*c.n12+d.n22*c.n22+d.n23*c.n32+d.n24*c.n42;this.n23=d.n21*c.n13+d.n22*c.n23+d.n23*c.n33+d.n24*c.n43;this.n24=d.n21*c.n14+d.n22*c.n24+d.n23*c.n34+d.n24*c.n44;this.n31=d.n31*c.n11+d.n32*c.n21+d.n33*c.n31+d.n34*c.n41;this.n32=d.n31*c.n12+d.n32*c.n22+d.n33*c.n32+d.n34*c.n42;this.n33=d.n31*c.n13+d.n32*c.n23+d.n33*c.n33+d.n34*c.n43;this.n34=d.n31*c.n14+d.n32*c.n24+d.n33*c.n34+d.n34*c.n44;this.n41=d.n41*c.n11+d.n42*c.n21+d.n43*c.n31+d.n44*c.n41;this.n42=d.n41*c.n12+d.n42*c.n22+d.n43*c.n32+d.n44*c.n42;this.n43=d.n41*c.n13+d.n42*c.n23+d.n43*c.n33+d.n44*c.n43;this.n44=d.n41*c.n14+d.n42*c.n24+d.n43*c.n34+d.n44*c.n44},multiplySelf:function(c){var p=this.n11,o=this.n12,k=this.n13,i=this.n14,f=this.n21,e=this.n22,d=this.n23,b=this.n24,a=this.n31,s=this.n32,r=this.n33,q=this.n34,n=this.n41,j=this.n42,h=this.n43,g=this.n44;this.n11=p*c.n11+o*c.n21+k*c.n31+i*c.n41;this.n12=p*c.n12+o*c.n22+k*c.n32+i*c.n42;this.n13=p*c.n13+o*c.n23+k*c.n33+i*c.n43;this.n14=p*c.n14+o*c.n24+k*c.n34+i*c.n44;this.n21=f*c.n11+e*c.n21+d*c.n31+b*c.n41;this.n22=f*c.n12+e*c.n22+d*c.n32+b*c.n42;this.n23=f*c.n13+e*c.n23+d*c.n33+b*c.n43;this.n24=f*c.n14+e*c.n24+d*c.n34+b*c.n44;this.n31=a*c.n11+s*c.n21+r*c.n31+q*c.n41;this.n32=a*c.n12+s*c.n22+r*c.n32+q*c.n42;this.n33=a*c.n13+s*c.n23+r*c.n33+q*c.n43;this.n34=a*c.n14+s*c.n24+r*c.n34+q*c.n44;this.n41=n*c.n11+j*c.n21+h*c.n31+g*c.n41;this.n42=n*c.n12+j*c.n22+h*c.n32+g*c.n42;this.n43=n*c.n13+j*c.n23+h*c.n33+g*c.n43;this.n44=n*c.n14+j*c.n24+h*c.n34+g*c.n44},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a},determinant:function(){return(this.n14*this.n23*this.n32*this.n41-this.n13*this.n24*this.n32*this.n41-this.n14*this.n22*this.n33*this.n41+this.n12*this.n24*this.n33*this.n41+this.n13*this.n22*this.n34*this.n41-this.n12*this.n23*this.n34*this.n41-this.n14*this.n23*this.n31*this.n42+this.n13*this.n24*this.n31*this.n42+this.n14*this.n21*this.n33*this.n42-this.n11*this.n24*this.n33*this.n42-this.n13*this.n21*this.n34*this.n42+this.n11*this.n23*this.n34*this.n42+this.n14*this.n22*this.n31*this.n43-this.n12*this.n24*this.n31*this.n43-this.n14*this.n21*this.n32*this.n43+this.n11*this.n24*this.n32*this.n43+this.n12*this.n21*this.n34*this.n43-this.n11*this.n22*this.n34*this.n43-this.n13*this.n22*this.n31*this.n44+this.n12*this.n23*this.n31*this.n44+this.n13*this.n21*this.n32*this.n44-this.n11*this.n23*this.n32*this.n44-this.n12*this.n21*this.n33*this.n44+this.n11*this.n22*this.n33*this.n44)},transpose:function(){function a(d,e,c){var b=d[e];d[e]=d[c];d[c]=b}a(this,"n21","n12");a(this,"n31","n13");a(this,"n32","n23");a(this,"n41","n14");a(this,"n42","n24");a(this,"n43","n34");return this},clone:function(){var a=new THREE.Matrix4();a.n11=this.n11;a.n12=this.n12;a.n13=this.n13;a.n14=this.n14;a.n21=this.n21;a.n22=this.n22;a.n23=this.n23;a.n24=this.n24;a.n31=this.n31;a.n32=this.n32;a.n33=this.n33;a.n34=this.n34;a.n41=this.n41;a.n42=this.n42;a.n43=this.n43;a.n44=this.n44;return a},flatten:function(){return[this.n11,this.n21,this.n31,this.n41,this.n12,this.n22,this.n32,this.n42,this.n13,this.n23,this.n33,this.n43,this.n14,this.n24,this.n34,this.n44]},toString:function(){return"| "+this.n11+" "+this.n12+" "+this.n13+" "+this.n14+" |\n| "+this.n21+" "+this.n22+" "+this.n23+" "+this.n24+" |\n| "+this.n31+" "+this.n32+" "+this.n33+" "+this.n34+" |\n| "+this.n41+" "+this.n42+" "+this.n43+" "+this.n44+" |"}};THREE.Matrix4.translationMatrix=function(b,d,c){var a=new THREE.Matrix4();a.n14=b;a.n24=d;a.n34=c;return a};THREE.Matrix4.scaleMatrix=function(b,d,c){var a=new THREE.Matrix4();a.n11=b;a.n22=d;a.n33=c;return a};THREE.Matrix4.rotationXMatrix=function(b){var a=new THREE.Matrix4();a.n22=a.n33=Math.cos(b);a.n32=Math.sin(b);a.n23=-a.n32;return a};THREE.Matrix4.rotationYMatrix=function(b){var a=new THREE.Matrix4();a.n11=a.n33=Math.cos(b);a.n13=Math.sin(b);a.n31=-a.n13;return a};THREE.Matrix4.rotationZMatrix=function(b){var a=new THREE.Matrix4();a.n11=a.n22=Math.cos(b);a.n21=Math.sin(b);a.n12=-a.n21;return a};THREE.Matrix4.rotationAxisAngleMatrix=function(b,d){var a=new THREE.Matrix4(),f=Math.cos(d),j=Math.sin(d),i=1-f,h=b.x,g=b.y,e=b.z;a.n11=i*h*h+f;a.n12=i*h*g-j*e;a.n13=i*h*e+j*g;a.n21=i*h*g+j*e;a.n22=i*g*g+f;a.n23=i*g*e-j*h;a.n31=i*h*e-j*g;a.n32=i*g*e+j*h;a.n33=i*e*e+f;return a};THREE.Matrix4.makeInvert=function(b){var a=new THREE.Matrix4();a.n11=b.n23*b.n34*b.n42-b.n24*b.n33*b.n42+b.n24*b.n32*b.n43-b.n22*b.n34*b.n43-b.n23*b.n32*b.n44+b.n22*b.n33*b.n44;a.n12=b.n14*b.n33*b.n42-b.n13*b.n34*b.n42-b.n14*b.n32*b.n43+b.n12*b.n34*b.n43+b.n13*b.n32*b.n44-b.n12*b.n33*b.n44;a.n13=b.n13*b.n24*b.n42-b.n14*b.n23*b.n42+b.n14*b.n22*b.n43-b.n12*b.n24*b.n43-b.n13*b.n22*b.n44+b.n12*b.n23*b.n44;a.n14=b.n14*b.n23*b.n32-b.n13*b.n24*b.n32-b.n14*b.n22*b.n33+b.n12*b.n24*b.n33+b.n13*b.n22*b.n34-b.n12*b.n23*b.n34;a.n21=b.n24*b.n33*b.n41-b.n23*b.n34*b.n41-b.n24*b.n31*b.n43+b.n21*b.n34*b.n43+b.n23*b.n31*b.n44-b.n21*b.n33*b.n44;a.n22=b.n13*b.n34*b.n41-b.n14*b.n33*b.n41+b.n14*b.n31*b.n43-b.n11*b.n34*b.n43-b.n13*b.n31*b.n44+b.n11*b.n33*b.n44;a.n23=b.n14*b.n23*b.n41-b.n13*b.n24*b.n41-b.n14*b.n21*b.n43+b.n11*b.n24*b.n43+b.n13*b.n21*b.n44-b.n11*b.n23*b.n44;a.n24=b.n13*b.n24*b.n31-b.n14*b.n23*b.n31+b.n14*b.n21*b.n33-b.n11*b.n24*b.n33-b.n13*b.n21*b.n34+b.n11*b.n23*b.n34;a.n31=b.n22*b.n34*b.n41-b.n24*b.n32*b.n41+b.n24*b.n31*b.n42-b.n21*b.n34*b.n42-b.n22*b.n31*b.n44+b.n21*b.n32*b.n44;a.n32=b.n14*b.n32*b.n41-b.n12*b.n34*b.n41-b.n14*b.n31*b.n42+b.n11*b.n34*b.n42+b.n12*b.n31*b.n44-b.n11*b.n32*b.n44;a.n33=b.n13*b.n24*b.n41-b.n14*b.n22*b.n41+b.n14*b.n21*b.n42-b.n11*b.n24*b.n42-b.n12*b.n21*b.n44+b.n11*b.n22*b.n44;a.n34=b.n14*b.n22*b.n31-b.n12*b.n24*b.n31-b.n14*b.n21*b.n32+b.n11*b.n24*b.n32+b.n12*b.n21*b.n34-b.n11*b.n22*b.n34;a.n41=b.n23*b.n32*b.n41-b.n22*b.n33*b.n41-b.n23*b.n31*b.n42+b.n21*b.n33*b.n42+b.n22*b.n31*b.n43-b.n21*b.n32*b.n43;a.n42=b.n12*b.n33*b.n41-b.n13*b.n32*b.n41+b.n13*b.n31*b.n42-b.n11*b.n33*b.n42-b.n12*b.n31*b.n43+b.n11*b.n32*b.n43;a.n43=b.n13*b.n22*b.n41-b.n12*b.n23*b.n41-b.n13*b.n21*b.n42+b.n11*b.n23*b.n42+b.n12*b.n21*b.n43-b.n11*b.n22*b.n43;a.n44=b.n12*b.n23*b.n31-b.n13*b.n22*b.n31+b.n13*b.n21*b.n32-b.n11*b.n23*b.n32-b.n12*b.n21*b.n33+b.n11*b.n22*b.n33;a.multiplyScalar(1/b.determinant());return a};THREE.Matrix4.makeFrustum=function(f,s,e,p,i,h){var g,r,o,q,n,k,j;g=new THREE.Matrix4();r=2*i/(s-f);o=2*i/(p-e);q=(s+f)/(s-f);n=(p+e)/(p-e);k=-(h+i)/(h-i);j=-2*h*i/(h-i);g.n11=r;g.n12=0;g.n13=q;g.n14=0;g.n21=0;g.n22=o;g.n23=n;g.n24=0;g.n31=0;g.n32=0;g.n33=k;g.n34=j;g.n41=0;g.n42=0;g.n43=-1;g.n44=0;return g};THREE.Matrix4.makePerspective=function(e,c,g,b){var a,f,h,d;a=g*Math.tan(e*Math.PI/360);f=-a;h=f*c;d=a*c;return THREE.Matrix4.makeFrustum(h,d,f,a,g,b)};THREE.Matrix4.makeOrtho=function(c,q,k,a,g,f){var d,n,j,i,o,e,b;d=new THREE.Matrix4();o=q-c;e=a-k;b=f-g;n=(q+c)/o;j=(a+k)/e;i=(f+g)/b;d.n11=2/o;d.n12=0;d.n13=0;d.n14=-n;d.n21=0;d.n22=2/e;d.n23=0;d.n24=-j;d.n31=0;d.n32=0;d.n33=-2/b;d.n34=-i;d.n41=0;d.n42=0;d.n43=0;d.n44=1;return d};THREE.Vertex=function(a,b){this.position=a||new THREE.Vector3();this.positionWorld=new THREE.Vector3();this.positionScreen=new THREE.Vector3();this.normal=b||new THREE.Vector3();this.normalWorld=new THREE.Vector3();this.normalScreen=new THREE.Vector3();this.__visible=true};THREE.Vertex.prototype={toString:function(){return"THREE.Vertex ( position: "+this.position+", normal: "+this.normal+" )"}};THREE.Face3=function(e,d,i,h,f,g){this.a=e;this.b=d;this.c=i;this.centroid=new THREE.Vector3();this.normal=h instanceof THREE.Vector3?h:new THREE.Vector3();this.color=f||new THREE.Color(4278190080);this.vertexNormals=h instanceof Array?h:[];this.material=g||0};THREE.Face3.prototype={getCenter:function(){return this.a.clone().addSelf(this.b).addSelf(this.c).divideScalar(3)},toString:function(){return"THREE.Face3 ( "+this.a+", "+this.b+", "+this.c+" )"}};THREE.Face4=function(f,e,k,j,i,g,h){this.a=f;this.b=e;this.c=k;this.d=j;this.centroid=new THREE.Vector3();this.normal=i instanceof THREE.Vector3?i:new THREE.Vector3();this.color=g||new THREE.Color(4278190080);this.vertexNormals=i instanceof Array?i:[];this.material=h||0};THREE.Face4.prototype={getCenter:function(){return this.a.clone().addSelf(this.b).addSelf(this.c).addSelf(this.d).divideScalar(4)},toString:function(){return"THREE.Face4 ( "+this.a+", "+this.b+", "+this.c+" "+this.d+" )"}};THREE.UV=function(b,a){this.u=b||0;this.v=a||0};THREE.UV.prototype={copy:function(a){this.u=a.u;this.v=a.v},toString:function(){return"THREE.UV ("+this.u+", "+this.v+")"}};THREE.Geometry=function(){this.vertices=[];this.faces=[];this.uvs=[]};THREE.Geometry.prototype={computeCentroids:function(){var c,b,a;for(c=0,b=this.faces.length;c0){this.bbox={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]};var a,b;for(a=1,b=this.vertices.length;athis.bbox.x[1]){this.bbox.x[1]=vertex.position.x}}if(vertex.position.ythis.bbox.y[1]){this.bbox.y[1]=vertex.position.y}}if(vertex.position.zthis.bbox.z[1]){this.bbox.z[1]=vertex.position.z}}}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+" )"}};THREE.Camera=function(c,b,d,a){this.fov=c;this.aspect=b;this.position=new THREE.Vector3(0,0,0);this.target={position:new THREE.Vector3(0,0,0)};this.projectionMatrix=THREE.Matrix4.makePerspective(c,b,d,a);this.up=new THREE.Vector3(0,1,0);this.matrix=new THREE.Matrix4();this.autoUpdateMatrix=true;this.updateMatrix=function(){this.matrix.lookAt(this.position,this.target.position,this.up)};this.toString=function(){return"THREE.Camera ( "+this.position+", "+this.target.position+" )"}};THREE.Light=function(a){this.color=new THREE.Color(255<<24|a)};THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light();THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;THREE.DirectionalLight=function(b,a){THREE.Light.call(this,b);this.position=new THREE.Vector3(0,1,0);this.intensity=a||1};THREE.DirectionalLight.prototype=new THREE.Light();THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;THREE.PointLight=function(b,a){THREE.Light.call(this,b);this.position=new THREE.Vector3(0,0,0);this.intensity=a||1};THREE.DirectionalLight.prototype=new THREE.Light();THREE.DirectionalLight.prototype.constructor=THREE.PointLight;THREE.Object3D=function(a){this.position=new THREE.Vector3();this.rotation=new THREE.Vector3();this.scale=new THREE.Vector3(1,1,1);this.matrix=new THREE.Matrix4();this.matrixTranslation=new THREE.Matrix4();this.matrixRotation=new THREE.Matrix4();this.matrixScale=new THREE.Matrix4();this.screen=new THREE.Vector3();this.autoUpdateMatrix=true;this.updateMatrix=function(){this.matrixPosition=THREE.Matrix4.translationMatrix(this.position.x,this.position.y,this.position.z);this.matrixRotation=THREE.Matrix4.rotationXMatrix(this.rotation.x);this.matrixRotation.multiplySelf(THREE.Matrix4.rotationYMatrix(this.rotation.y));this.matrixRotation.multiplySelf(THREE.Matrix4.rotationZMatrix(this.rotation.z));this.matrixScale=THREE.Matrix4.scaleMatrix(this.scale.x,this.scale.y,this.scale.z);this.matrix.copy(this.matrixPosition);this.matrix.multiplySelf(this.matrixRotation);this.matrix.multiplySelf(this.matrixScale)}};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a instanceof Array?a:[a];this.autoUpdateMatrix=false};THREE.Particle.prototype=new THREE.Object3D();THREE.Particle.prototype.constructor=THREE.Particle;THREE.Line=function(b,a){THREE.Object3D.call(this);this.geometry=b;this.material=a instanceof Array?a:[a]};THREE.Line.prototype=new THREE.Object3D();THREE.Line.prototype.constructor=THREE.Line;THREE.Mesh=function(b,a,c){THREE.Object3D.call(this);this.geometry=b;this.material=a instanceof Array?a:[a];this.flipSided=false;this.doubleSided=false;this.overdraw=false;this.materialFaces={};this.sortFacesByMaterial();if(c){this.normalizeUVs()}this.geometry.computeBoundingBox()};THREE.Mesh.prototype=new THREE.Object3D();THREE.Mesh.prototype.constructor=THREE.Mesh;THREE.Mesh.prototype.sortFacesByMaterial=function(){var d,c,b,a;for(d=0,c=this.geometry.faces.length;d=0?(b*255)<<24:4278190080)|c)};THREE.LineColorMaterial.prototype={toString:function(){return"THREE.LineColorMaterial ( color: "+this.color+", lineWidth: "+this.lineWidth+" )"}};THREE.MeshBitmapUVMappingMaterial=function(a){this.bitmap=a;this.toString=function(){return"THREE.MeshBitmapUVMappingMaterial ( bitmap: "+this.bitmap+" )"}};THREE.MeshColorFillMaterial=function(b,a){this.color=new THREE.Color((a>=0?(a*255)<<24:4278190080)|b);this.toString=function(){return"THREE.MeshColorFillMaterial ( color: "+this.color+" )"}};THREE.MeshColorStrokeMaterial=function(c,b,a){this.lineWidth=a||1;this.color=new THREE.Color((b>=0?(b*255)<<24:4278190080)|c);this.toString=function(){return"THREE.MeshColorStrokeMaterial ( lineWidth: "+this.lineWidth+", color: "+this.color+" )"}};THREE.MeshFaceColorFillMaterial=function(){this.toString=function(){return"THREE.MeshFaceColorFillMaterial ( )"}};THREE.MeshFaceColorStrokeMaterial=function(a){this.lineWidth=a||1;this.toString=function(){return"THREE.MeshFaceColorStrokeMaterial ( lineWidth: "+this.lineWidth+" )"}};THREE.ParticleBitmapMaterial=function(a){this.bitmap=a;this.offset=new THREE.Vector2();this.toString=function(){return"THREE.ParticleBitmapMaterial ( bitmap: "+this.bitmap+" )"}};THREE.ParticleCircleMaterial=function(b,a){this.color=new THREE.Color((a>=0?(a*255)<<24:4278190080)|b);this.toString=function(){return"THREE.ParticleCircleMaterial ( color: "+this.color+" )"}};THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function(){return"THREE.ParticleDOMMaterial ( domElement: "+this.domElement+" )"}};THREE.Scene=function(){this.objects=[];this.lights=[];this.addObject=function(a){this.objects.push(a)};this.removeObject=function(b){for(var c=0,a=this.objects.length;c0&&x.z<1}y=N.geometry.faces;for(K=0,D=y.length;K0&&x.z<1;if(F>0){E=N.geometry.vertices[F-1];if(J.__visible&&E.__visible){k=i[n]=i[n]||new THREE.RenderableLine();k.v1.copy(J.positionScreen);k.v2.copy(E.positionScreen);k.z=Math.max(J.positionScreen.z,E.positionScreen.z);k.material=N.material;e.push(k);n++}}}}else{if(N instanceof THREE.Particle){g.set(N.position.x,N.position.y,N.position.z,1);I.matrix.transform(g);I.projectionMatrix.transform(g);N.screen.set(g.x/g.w,g.y/g.w,g.z/g.w);if(N.screen.z>0&&N.screen.z<1){j=a[h]=a[h]||new THREE.RenderableParticle();j.x=N.screen.x;j.y=N.screen.y;j.z=N.screen.z;j.rotation=N.rotation.z;j.scale.x=N.scale.x*Math.abs(g.x/g.w-(g.x+I.projectionMatrix.n11)/(g.w+I.projectionMatrix.n14));j.scale.y=N.scale.y*Math.abs(g.y/g.w-(g.y+I.projectionMatrix.n22)/(g.w+I.projectionMatrix.n24));j.material=N.material;j.color=N.color;e.push(j);h++}}}}}e.sort(o);return e};function o(t,s){return s.z-t.z}};THREE.DOMRenderer=function(){THREE.Renderer.call(this);var e=null,g=new THREE.Projector(),b=document.createElement("div"),a,c,f,d;this.domElement=b;this.setSize=function(i,h){a=i;c=h;f=a/2;d=c/2};this.render=function(q,s){var r,h,i,o,p,t,n,k,j;e=g.projectScene(q,s);for(r=0,h=e.length;r0){D.r+=B.color.r*E;D.g+=B.color.g*E;D.b+=B.color.b*E}}else{if(B instanceof THREE.PointLight){f.sub(B.position,F.centroidWorld);f.normalize();E=F.normalWorld.dot(f)*B.intensity;if(E>0){D.r+=B.color.r*E;D.g+=B.color.g*E;D.b+=B.color.b*E}}}}}function q(U,J,I,P,O,D,B,R,Q,F,E,N,M){var C,T,S,H,G,L,K;o.beginPath();o.moveTo(J,I);o.lineTo(P,O);o.lineTo(D,B);o.lineTo(J,I);o.closePath();o.save();o.clip();C=R*(M-E)-F*M+N*E+(F-N)*Q;T=-(Q*(D-P)-E*D+M*P+(E-M)*J)/C;S=(E*B+Q*(O-B)-M*O+(M-E)*I)/C;H=(R*(D-P)-F*D+N*P+(F-N)*J)/C;G=-(F*B+R*(O-B)-N*O+(N-F)*I)/C;L=(R*(M*P-E*D)+Q*(F*D-N*P)+(N*E-F*M)*J)/C;K=(R*(M*O-E*B)+Q*(F*B-N*O)+(N*E-F*M)*I)/C;o.transform(T,S,H,G,L,K);o.drawImage(U,0,0);o.restore()}function b(C,B){g.sub(B,C);g.unit();g.multiplyScalar(0.75);B.addSelf(g);C.subSelf(g)}};THREE.SVGRenderer=function(){var q=null,k=new THREE.Projector(),m=document.createElementNS("http://www.w3.org/2000/svg","svg"),e,u,i,a,s=new THREE.Rectangle(),p=new THREE.Rectangle(),f=new THREE.Color(4294967295),o=new THREE.Color(4294967295),b=new THREE.Color(4294967295),d=new THREE.Vector3(),c=[],g=[],t=1;this.domElement=m;this.autoClear=true;this.setQuality=function(v){switch(v){case"high":t=1;break;case"low":t=0;break}};this.setSize=function(w,v){e=w;u=v;i=e/2;a=u/2;m.setAttribute("viewBox",(-i)+" "+(-a)+" "+e+" "+u);m.setAttribute("width",e);m.setAttribute("height",u);s.set(-i,-a,i,a)};this.clear=function(){while(m.childNodes.length>0){m.removeChild(m.childNodes[0])}};this.render=function(O,L){var N,x,I,M,y,E,H=0,z=0,F,C,A,K,J,w,v,D,B,G;if(this.autoClear){this.clear()}q=k.projectScene(O,L);r(O,b);for(N=0,x=q.length;N0){x.r+=v.color.r*y;x.g+=v.color.g*y;x.b+=v.color.b*y}}else{if(v instanceof THREE.PointLight){d.sub(v.position,z.centroidWorld);d.normalize();y=z.normalWorld.dot(d)*v.intensity;if(y>0){x.r+=v.color.r*y;x.g+=v.color.g*y;x.b+=v.color.b*y}}}}}function h(v){if(c[v]==null){c[v]=document.createElementNS("http://www.w3.org/2000/svg","path");if(t==0){c[v].setAttribute("shape-rendering","crispEdges")}return c[v]}return c[v]}function n(v){if(g[v]==null){g[v]=document.createElementNS("http://www.w3.org/2000/svg","circle");if(t==0){g[v].setAttribute("shape-rendering","crispEdges")}return g[v]}return g[v]}};THREE.WebGLRenderer=function(){var e=document.createElement("canvas"),a,h,d=new THREE.Matrix4(),g;this.domElement=e;this.autoClear=true;f();c();this.setSize=function(j,i){e.width=j;e.height=i;a.viewport(0,0,e.width,e.height)};this.clear=function(){a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT)};this.render=function(O,K){var v,P,R,C,Q,G,u,q,B,D,s,N,y,F,A,M,w,H,L,J,p,n,k,j,I,x,t,E;if(this.autoClear){this.clear()}a.uniform1i(h.enableLighting,O.lights.length);for(I=0,x=O.lights.length;I 1 ) { - this.faces.push( new THREE.Face3( aP1, aP3, aP4 ) ); + n1 = this.vertices[aP1].position.clone(); + n2 = this.vertices[aP3].position.clone(); + n3 = this.vertices[aP4].position.clone(); + n1.normalize(); + n2.normalize(); + n3.normalize(); + + this.faces.push( new THREE.Face3( aP1, aP3, aP4, [new THREE.Vector3(n1.x,n1.y,n1.z), new THREE.Vector3(n2.x,n2.y,n2.z), new THREE.Vector3(n3.x,n3.y,n3.z)] ) ); + //this.faces.push( new THREE.Face3( aP1, aP3, aP4 ) ); this.uvs.push( [ aP1uv, aP3uv, aP4uv ] ); } diff --git a/examples/obj/female02/.htaccess b/examples/obj/female02/.htaccess new file mode 100644 index 0000000000..4bc50298d5 --- /dev/null +++ b/examples/obj/female02/.htaccess @@ -0,0 +1,3 @@ + +SetOutputFilter DEFLATE + diff --git a/examples/obj/female02/_01_-_Default1noCulling.JPG b/examples/obj/female02/_01_-_Default1noCulling.JPG new file mode 100644 index 0000000000000000000000000000000000000000..245c661db59be9ad1f26fbb301310a240a88b43b GIT binary patch literal 24836 zcmbTdcTm$&*De~0M5GA{(t{$RB1n;5qM{TL5K)nifFiy35{igI1OXAL0i}u%>Agb& zB1Ky01QG}#v;ctwLO6NvcfWh?z5kpuXHRC5O!n;gJv)1?{j9Z~bvkv52AqGSqpt&C zU;zBrIGqJ()4%<%2O}c`1O3Io_}}Ayeq#L3BLA-y{y)?Hd;0(K{j>wXeU<^h0AOOc z0$}83VB%&t?E!!Q0ERRFwf6u0!~h0HCgw9Nz_YC9*ys~#&jT14n3x!una-SHW~R>$ zr~eLM=03x7S?(Uo1(R36E8Z97qmuK_ir=s7Y=cKhuHy1ILM5y-y&Kci#g6O*W^>6xWv40dG|w}xLQ z?(XfA4i3qbqyOOg56=G{|Ap-Thl`tzi;*>>VB9WW>qYpy@zyZ10rVf+AOL8x)( zxmMfs$4Mw%h2q5~4D$4#6#AJ4x|~CQ{g4ReMuu$eUsrG~@nRVhLof){iyDQ;`eNj& zpIzDZjDsJ>8O3Ua*P`~R16r4M_B|cm1TZSi<*JDDBxf^p&RYfcNOMb*MC6oC2r8Ch zw*@kgYY#)=@5F#c)e^dldlf2I-W=ksz&(9;C+|Sgg2$x4LG4y5uHk!wrZlXLH}w}h z`iDu1IsC_0GgmGA_EjkRDv9ql#QDvg02t;7ik{X9M9wO_Egr7eFSm2`L&e=b(N~1r zR;iiSakLxLG?TPkE2!xA6%|aKoRwlcm)e?FL{L)2MRiV~Z;bVn)oWuX+l3i-PaKca zBjxv5G~l;6Jom4XLWbk14g@%4YI8i|LBc1V8=o@5#98v`PuWHS~tOgjzq0Eg7%-m@PYgQs6G6UbcyK>&-_H zUCLKV0dr^!NUkYnmvjnE->CkxjVjxdP0}*w#VT)JI?=8d zXWFjgG#*EpV$`3{JH-yIkulDvfENWc;rI-UOSlKmYQ1>MV(Zo^pq%lJ9p*41E=@a6 z_av#T@}qnyE1L5#1x`KJ68G}osIuWtfLu;*P$y?MGiogN(I+M|6@lG+VUh_^ z*1HJf*>dZO_WR=Zh3i&Ek)WkP0l{5OJZx?*S65g{be?FF^LmL4LoB=)5*j`Qv_*6Z zrD?SW(YL=cO!55j(^q#Hg>t$@{=kU58-mt9>w6^5$bW0_pif9=Mm`RJE65@YQ9rYD za&A<#*WdDZSEqOJ9*+o1Pp1SPu1AGMs z@E;5bOe|NDuC_aGCq0&fcp6Oo^fZ1-zSzjG7r?)?9lE&^>{4 zXk^@ZIXLv=+dU~6769h(L24{D;u~CNhwoh#p;Gco`yCHi;E6mK^E_odyx2rtWlsTS z)iaGpQC-KiL}rpUk6+c7d}cs0ZQ!ob{J(;Ql;bkp3$M$xjvExm#fQEuTTY@McsIuD zCumKT;}mq#p9TZzGZrhIpNuax2s=m>&j04$kQ)pKE)V$6yB+HeT*fWB#khNAhNonB z7|A|a=l6W#mypJcfiHm4f`Yy2ichJA&gNR`z;gf@$E5?_)-z*jWR%&*+QL+zJ- zn?cXt?bwG)Wj)X?wPlQSSAaA}Z>gwYP62RRL(P2S>Y@e1pLOb=-+ab_(}K#!&ndd= zIYhqcz-RXb0sIKols8IcIes{ZKe!iS`!VN{T$Q1%O_AbXnQN)ypFWLAlG9TYCsMuH z0CFi|6F8p z^?kXOtNVrch8k=jx@tZR>-#&ELQCsS>b?EyVlF(@lL+aUYVw0AjG58&7It!)Wzt<9 zC7%L7KQ#7^HCL0fxH&Ke1GW^tZlY>KYQ0&}>(^-ArvULYk0$uC z!09^eOjW->)a8_+{ZbtIh8UVZ!154smTHcYwDZjyoGJJ7lD3(%9Tua^?zn0my@Bt( zzh(~M?k^wXq8ad$MTO6PmInGz_i632PeMKGvB7@H$@wmG!XJ_=QIf~T!h72` z;&92MyTFNtBe_$6;E~MkNYTeq-Kd!JLapaqDpL`fTqHOfk)zZyg;ix?U2luQ1FRA8 ze8Z8HUIWW6q&z_U0$pjRZ}*q|l6GG)0f|(molgm%KeaMw4*MS>(qqZvWq#|@=5 z25z40a*bA4VIo$!-3V+k{S_6E%WA`}=cUR&4Tfu)?Nt1niWMBNE(8tG06L=UZ$Pn| zN!f8CFCykJ&H#ofFR7WD1S{%8Kq-6jTsD_Uaj_?S53aE@n8Bh@zjBs>%ii=wlHhLt zesz*R|GF6Iz8cW4!L>0(M7m*V{wofZ=U&Fwjm@R(2YxJ9vA7Xf`IlTVS63bZZGEwr z9ded3JPvZ3&b%@hqJ{k8QL4eO{F4X?pF7)g7}{m?*u)-&{wgy(BJ2Q9==i0V&$NN@ z1Wh~aa)&Ptx{kC-%v_8y4D-3O){hpgRtCXo>Q+^=P8+xWc=;{Cj2k)}h>FvXejb%; zh79jMHd0Crh1gCcUfY#!Dp18iJ~xNhePfCcS8V;>nWg%S-QF@c+u`JVqHbjgeDf5r z?9E8GSLt#_%x_sSWU&|>$Hd6n&$MNL5^-fa0>a&fidz7S;5g^Aokob#n6 zDZ@)Zg&}cK<+`&q({hPAK=JZMe9WTad-+y;YskYeib;WZMOK!m^t+lTB!)LxOci>< z=m4C@8Sf^;Mu!M&_|*2WcjxFEVc6lf2!DLrjrzfsTddv2;8)Px4pFLb?!?gAf!^fN z08U7{qFxv>Y^eF!p}0KwNyV3I&8L9OI|qUFo+z4dd9X{@*5LDi)hPMM4;K6 zF2Q>G^=pAi!|+(jcS*w;`L_B~z-_|n%W%!Z>sXjXg5w#h3wZLuuU4IbfjV|CWKch0 zHVF` zfIdR05?>5>lrL>W`sSPS7~6Z`_;CvjziTsl^~<+q3jgHfzdmtand+~up3hr&<(-iA zPC#`|@S)q0|K_%hEyoAT$N-YbmTGV$Zps~=cgI~7cCS?kva;;M%8aFc!@!vZcYCVo zOcWb#!0Fp&I-LKrYxx#IYHjA^p_=>5JQyuL=;`*-#-c=6LFFnAbgPP!&d=V!gIvbc z=JL%>o{gm+$ev~W*LM61BtsOBg9df+tmDmUSg7ELxMosB$vZ?HQMo6B-VFa8CB6EcQbpf8@eHeM3~UL%P|2;{<@s}At+R_7M;MPnER{QSV0#W1?BsOAy`yRZR|WGBF>I;hj{ty`S_?g@GcqE zt`Attz~+nBJxa?YW~oV6j+JJmZ*eCd1gqks-(+}!xou#}vsRzZdOiPcb3d1J>h4wC zm=+Z!u9?p#=sY`|EC$p{9Y9vXEr`}1cd1HVMnonb6;(a{eNi0k=zF1S*`h1W;mM=P ze^bO(qrVkd5&3#7eC!JNviq$-)30zYBJVfLdUjM zw=XKJR=mJLvLVR_f#OMIUXMc95!d|MH!G*AxoB3Z%fd&`V>BmMA2RU=-ykY64SuFk zEmW9kcW~V|wn;p9UaF`Sve4hEm}GMb*y%xh%}uAZU%1`<^}CA0EhcWz-@9A=w~bv6 zq*(xqJRRrw6{|77`^UtQyKuFUSFM8tMw-acRX7AY9Eny>3$YOz`_?7+F;Hi)j zq|j#d220_2am~JdYFP{M3ybDcvIE&pTr}D|9o9#C-uLzcAnT5+%KV2mkNnNMP~8_iJOuVj#*H9h^8n_-!gvu?QhKQLf&YzmJc*LM_`p zjD)wzAj(fA7~a{uD#FLv&^g$Xm%2?;?9t{kHRcyk`dB{)Q)m!Po7MUG(j{bLX?6>(j4lyp-ey^|FpKQQv^27n&l63iaDz&1Yb##8%0sSiy~ z6L$5m4p6qNTFjMaZ$$cc3!eBcmWQNAFR@?@+`^id1&~+I#xd=PxDG)dXMUPO3ZaCZ zmf+WTh!eh}%2AP%r(h^7BB^Ih2x8VQIH*Li(amuBsc zz#nHl0;YB3n#s9cUJ#4DA12ajT5Z`ye*|3{Max|4pN}?3p8|OLfDgfbd#TOwJ0eCM z9A;)3``?&muR?{L;F?nF?k)o!l?9Q-&ZA3n4O`*I*@?A#tEEiWYRegm)nVCO%ezPC z@Ll6B1*BumaQpVBPDTf#D0&F6r^r#ieLo7eucNAwlaGKPev@47#Sn9^;`ni6z}YnT zLnXl67r=_!s+g#JApKaGDVI$*ecxhAdy!b^?T8C`KnavNzTvTbE+$S!VX3E@OZ1~_Yyt@xpS>Y{x{P&el^ox8_JA%#`$U2 zM2@;zVSp|Rn>ajdvNGcKOWp~p!fv+6xjwXvP{M2^>-MKxAy@!3h6 zyz9Y7G(}5{XeOji;|imwpU_kNElBOPyIw$WsA6wiucGyzlLeZE;Gejr8e01jbdkf^ za$kMr#@A!Rp-I-mfV4R;u9a;YnVDcV&_L&ud{C#n{@jU*3jCJ_sBmkvLi?Jp<^X$c zXQU*^2oBOvM&aK9u!!MSjdXnC|agdKXHUR#b0mYDx` z{5;o;ED}d!28$(5lrJR+2gR@Po&vs(WrKeGD8)z3RLomcTTR^-&Ua%EYzPZin>+=? zZhRza{FxF{9N<*L3<-3Ala_2+-OP^fkWk69rvS#vlrWzmv7 zD=y1J#}{Ei&`2tDS;R+a03*%6Z}qbTU_!u zZ?)b(M=`Yn)tl<9Oz3+Gyd;&&ATq4BZ8KIApC`%uAgB=SQxdAi~cXcIC9P@U7 ziUb?^D%N7EmYX+tS~dWR?RE45j^^9jN;T8qBB2~h2kw^jb3vXTHCY}fu+yPy%T;4$ov)Te@1DU`%;mfn-lySKE0W zX7y`XEu)VU3!ou84@0I6oo<#({yPP1mUOjV%$xbQ_P3R9I`$8v*1m^tb{NgTfuvaP z-^?w|}0zquE!~907klj&AXMeG0f>iSA~ycLF5u&OdIY!E(Hg&ZL4k3DQs+ z<|^9j(#zldC*ClNLt6poH`Z@91AN>D91``~8zkZ|R-UmnUsF4es`-zm=eN{DD;f)K zU-jcx9Ar0rlG|*=wUb;tG3#n5O|#L%(j=$3D)B+UPdwAI>U_BYK$v$XTC8SPG$R&y zBp9;y@tO(hWafxzxgxdtaiv|muVKwSWC7}tj_%{IZqaW9o7bMjseCEtFiIa3hIJYm zIz?MuixTCh-WE$gTb%y`U3q_4^WtBGtM8zHsJx;9d+F*bLvGB;V@J$lxxeVy-?u|c zD-;?@?2P<7uiP#qriEIJMNZyXd5)gztQQcIjh9Po$NBriIQGY`m6sN$4=J7j3Oja- z4QrZ_D&iZO(ci~VDd3~$(51K&OlTSH12MGhMUqJaQmon0p@Cg9#H^Yu-**!8$gWW| z{5y4_VMgA_d+c|Gl*!n^I?A=?Q3a&O8YLTbMkQo$+@!hN%1fl%g1hXNg9JwmUlMt9UJ0hCuEDXO2aV zRr6t_amZdo<<@L7Bsy-*odoHo{)Kbn$*7vxv$B2-{X!u-$g6>PTV>aPX8+b;FZo1d zkvzoDOK#+lDz%x!>l_uP{rz(`#G&i&)KZ%+C0Jlc6`rPHU=LZkOjPL*waVKUd1RR) zmk3V4Tk~7pe}2<->=fV;S*WXb+>V;_sLOmfLoHAGZKNj-;2?s&(fFyZ--sen50bD5 z0JEbo_A;}uZwELhG~!3mS&t;)lX#QpVpW-zoQ~u}*Lb2wP95jP_beP!0@979!Y5~Y zgI{X6rnx8+is-S)_`Z|De4y=Q9QTixt507#9iAt4T!z{m;PP<`t%RkD%qlMK>rWxe z#-+*+kvwfWLPf?_X1UIMQ4;n8{q^^vCLUcW844%NYYAE;DcE9G!uhCyoibbAG1)$@ z8gHck1lZ1>0;10se&3UORl}A?4h8w;gi0pE$eBr50-IwOPXSOhJKFTl{WOV!e^>g& zcFTV93biUUH3_)4v~#`%-8SCDj9_TmHx+U*BBuaEUE3{lDS{19T^qCkPxsQeK4Io1 zuz%It%8#g&8o1Uj6(Mn~E;X|_dTl4*OO^AU-<(s!JQOl)C$EBwfeNFB7Os!=mSi#U zf1QJUVLF_{UES~Y-Ksq>i>@IZvwg}B8z_xLbF$NN8ks{-gRt|rdU#yep!{2Irpy;| zhEr*WEI)IchIMU9!#6M7d||OZ47*m%Rf3OM>8zKI4v7&z&jNh%2xYJ&B^GAl#p-6i z`HeH!eER|*>M+Pculzw10vdmDwXgD=8lcZd2k1>fnJ$GsPwJ`nIp0yWfP*H=Y)1-* z{@k<43DbV|TGZVde9}&1$SnTp?!Uj5WJtd3cx}ApQ318jeag<^=BRC{$|)cy;`u*v zN~c*zeGK#R&iT6tg}`&!ks)pyH@PCc%UngJK(~*|-t>#;H?|5OJtj~=U5kHqp3gZ5 z4>$9l0*VP9x+1C-=h9}}ZNF2W8EWRH&mK`gTI))YK@lA}Q^$6XiMi}(b_Nu4gyQ;w zYCULbkqsss{=MIbDXatOkerB<#P@m$#=?UBK z_6n)?{W14D>^pJ3UyCW5SR8m0+eg~fC`P_`B%}Bk0Qpxj>sdNS2hX|J`FRdbYR2U$(vzm%PM*;z-)!v_G;{)Zb?Og z;{@EoEEJL=3un8(?cH>yGW|&;!=Ek+Xj`|w@f6_F%G4EN3%lr*CK-109S3l7Q;xJd z1+-cr-z^W7L`Itp;F!dmJk&$Z9Sp|>Forg(oJ(48vG@}!HRiggy9gy3%lD`>BB`J+ z$VVy8&Wro1pA;VMZk)Y2%}owZknPv<$hs4I54kKg-6BxPM9iT*(HpypO=QfuTs4K1 zOtM}6$x%>PV|tDADTpmvt^+*vn3fYf1et*w?noy_$jxQ*fGZ1T^f0u$TfW(TeYQg_ zfe9Y&dp7IfV^5qzzG>AXq~vlAt5Ne!N-$SpvjYG+!8#6Y(8l+YIV-rQ`nZPP}*FFM!$rg!68R zGL0e+I6vh3JUDU|_Z;~8^)apyA@@?S;&X9NQ(Z{u=kq%EdjI0CayAS}p~6^;-;eqk z`DX0@mTeSc`$$F@za``rDa`0(%Pii$O-uD0uhkhWD2MFHwn^aafvwW`vFF&fIFrz;Nc4`uok?WWtcnGJ z#)}tyoesTprXC*w!Z7bjUz5&0o&=kR{ZXFT-my&EXaW=9>%O@PqvG;mfJ7oSuv-`gkn40bXc|ihN9LkL2IhoBt|*A?vCZzJdeA|-M5iH zJlbYJOiVik@WP-^im$yDI^&yjFbTPhaxQ=M(aR@|9u8vjY4`o=MqoYMzXG3nMOd1T z<4&-WK&Heq-dYMD`MQ*tGA!nt^3a_lG;pEcf=rW%Z_sgram@`?wB**26FzgPB{0NP z=ePZw2AYRc#Z-WQNc|k9^WHFb?BYTy_128q&)wbe2-_XZow`qNq++`tunI%Nieq3a zHuF0Rul4=!>ROBLgm55Cp~{$eO1tj3@*D;t6Ui|f!t8O63dGqE&_XT7;d^x3er<(y z67r$+X+j4f;$zpFo=v1S!Ibnz`+BANc%iIM@#WH4TYMmHZItu zGuO=ys+a3yjk(H;m;XJIBI@~8UdH)K-G}EMco*CsK zA02Kou0c9~W~B%mEVmjX4PcyeCAJj1 z9%1%VK;Qkpb{7_f%7%N#S9*;!FC<~x_KI>8Z{9R?+1e-BrX}TUv%$D@WPO@?>@Z@n zT6AN}rtuPTrILpJMO^Z3c0YL!81k{N2H1ff?IzF<@W&gHk&1e|El$ZdhC(wBG`$1Y z7TG^Cxh&wZ0W_g|$%*Z9-=7OU+bpW0CTCyvmub3vazi*UDP8%f>3s0->|Ircy40GO z&4o5?q8cU8n|*)AORs-UTm#cSXlqZ#GmQIdq}&_(7SOjK&_`uGam9f6jNlP*UdVxH zHs9E!L|uES*}mIPYrf*8XlGXu+9|gy+A9!;F>@k%`;udzV~zGYsef&v43Y@8 zmVFu`JKKpCCGVJIVk5Wgx|z9<&$rni$_wE9CMx_+X+iCE*#zy9)i${@U@7rZH!3!r z)`<7ep9^QW(iU9$aL;2V;g|yXyB(jH>}oJe<3fkB6gxNfnB5EwausHXwAr%%!SZ8= z^XpaebB|-+HWAB`VOt){63N`47`&xmvMpK9Q%D2SrR+Q`OsTI>kC}o+xEe40)jI{8 ztHA=JoXb=(B4Gx~uTbwUrs-f$Kx?iWqbp-adm6Ci+H9Yo=SB;H$B!RlG)~H%QbLY4 zsb#(Xgv%m`T$o>YrkFecZS@-nFEeWi({W7g^wR%qPAWS)i@LIH@`A7kI^qomC5W2@ zzL`RZePH*q-S3RSk4*Yxtx~MuZ_?&#NA_A>#z7aIwLKtXd1s8|XvN-=lg*1!vaA|r zA+pLs<`e}$?TcWJ*!E9y9-EEs3w2+@t$hkKrvMZ@E$mfsS=fDI z!5hu?w%+ zXcl>I6{9lO-lQt9by3j|bY4QrApi&UVA4pL{iiEV&j_j81QV~BgRAbSUfjIpk>n7~ zth(RPp|~Gxc=k_`#iIFO2yIi5l52CN%mnU!$M(pKM0+iL=_%uuLNjw&g>N>?2OQq^ z0hwpbvss+IeL7X7BN{vj&<&&4@53Mk*7Y-&g{pJeZr=}Z%+-RGhu=f1N0x>d*l}px zHS#gSX^{3og?`>F0;a`(>zyMU(LWn&7GR@l(mDj%)jl?_&ju+$o$mU^!Z>o=3CTLQ z(N6*u#>qP5hfqBQINHuYxovby=WyChb3NQ1EXMrv5WcfWquN;;YXQYm0AT-eO-92I z1LDW4+?GRlR#5mAD#3q~`4nJUrN|3AX{5k+wUS0wx$k+famqMq>~J0EdiP z!rXHpwThLnFLh9(M~UA@xRCSOwJ*K49X^nxD|-o{h)V zWf4>1ko9^^UE}7uR;Y)_-o$P!xOZIT`uGcI%OY(i)VRZ^eWp!JEYba?zhf_l z?>M>U$E91j9-Dnij5#71;D14k2{it#e5qIIfe`vbKHeE9emJt~Fr=uWFq@OgfJA`~ zCqiH3X|LI`4>K$FW~ivH9k_NPg5WTJ^)E@<4ePoGvCY`e#`9UiPDO!SE(fS)a}CX% zYWCpV38WYXSEC`S{-&Z(%i`IJXT1dZ_9)gg)9R>h+~E{Zc+D4fUXt5IuvDXTOcg2J z)ef>U>uwWoHVvCnog&k-pn1X(iX=KkQLpkOJ-r7e%9yMfO-*5nAEUZ+#T$E%MUV;6 zdfU4g)#1Cr@RB7L)}flZh;3|=y8O>k{SDZ9BBsliskF0y;EpQVZ_j~{I|VKb=h!*8 z+q50`&4H$4s4H0vnyJ?=9xDt(qA6@H0h@iuFI1E5^yoRxYvaTQ_I?-1&;oM%#9ybhcQ@m4I7esjK9jzOu zcsr{?e{5w&VU9T3=HVQA)7`(QEyR>AwHPauGP3^CcCxq{t{P-Oj^2odV68{J@q@cQ zknN@gvi&3KoiWpxX2S^q2S0PD9n6*haFsZ7no z&@CNejlh!%U4VA;)x>EIE7T{LsH_zyxaJi`Q^CzgK6LMBG>oZ194Q|iv5x}841xa@ z+`I(ETxk{b8~^=WBGd-~I`XBq|6N_JeOWkZyrb8;oG_7qu(_;}J*Ui+_ZJ1+o428h z%+T#raf}!LZoh~QbINWI_DzdqZ#un{!dm>{g9?Y=eXMtsbSE=ck?REQf)(Xc9+mQ^ z-HU|AMQ>^H(KF@qVT!Bb<0Q z+L^YrUy_r3p?C}960AE2rnrZU_vm)rJ)<)8fpgnr#he?VqVgL2iEi;9_Z;A$EJ=g0 zaMhc-#rJxB5z^yE^AHivSSj=3*?n~wkBXL3mGv|t9tzN$9hA%tH5PhVtsGJ&Lrf2FG>HSI z?0O&^_vjH7H98m}TvidYI^o<-I)X`14eH+dHCjhq(SI2lea$3N>wU}EvX$xxRXs5= zJuw6mb6x{e(i^&n5K-tK5pys2nrl>CV*ccCp9x+bEZIYlZWGywxw$j4E>ow^yl2tfMVGxgyg5rLi@ze-wqD$0l(_ zW2gBFf`#1D!j1pVdE|c}3Uvf}HuOsRw$)D(k4iT9D5Am{mUtP7eBmW&HL`x(Qu?byAs}EWXHpuK_vV|i>j&3 zpW8$A7#%RyAK{r%M%Y?h5ntS@Xn~7o-=4j!Dl#yq6F}FC>_HH0i1e3}?=2ZcZdB%; z0vbFr@G-V`*Co9p&s>%6ZDtSX?r~j(#UHoV*JhV-OwO1v72SKusTnNxLiOR*$}fwK z<#cPjJ9fe3&zH#o2sJG`DW*b?cqW-6^2{IF3k`GtTG}JX1x-1M$5QLkd&1_yV=IK* z;>?vWvAAQOVb!Y!ezFikM8Q!#zpAJx}a@1<*JR76qToNP6)Y1#`@4vp$adLn$t2I0hXcC*Lt z+D848AAr}LooA~!i-z>{Vd}#Xt=cc{Yp4blD6^J0!I>8&1%{8MZB;)-2hEgAtF}L+ zIr$5wJhOv&?$Ui5Zr)|>6Av!A!P>HoQ_VdKYKN2D?F}_7L}e{4zW*by@om#8nKnAB zDu&$$pkiIQtDWU5SeSovJ(W-00iRLaoZ(;m5hO3(5NzR}-PR!bfHU}rYY5KGO9~0F z_?dFtXmYVwCYaP>wwef9mgp85G`T0K=CiA1&!&Uiia}+P%X)>Kg7 z7SBVUQ$Pl8)$EIBM0-Xtn#blO4sgpG0O$wkgPw$hqQ(~(o@5?C<@$&m{kTNSC*N>W zj&#Z;OVxmWdN|;~UKWF3WBsQmMw~kZ9F?s@SfWJhi~5tAEB^Q>*om22sYKoeS2*U6jv3#im&*T;HvA zz|D=D*e4;5!l2Q{+aFU4Jb4j%@-B~>>T6wci#-3U5B0BOX>ZmwQ;cxUysv zb=khPRL_TUEw?rKc!3vwjXz&rv?a6P>soS70e8G}6`w?in(MS|pvrTGZK@tH@E^We zZ87WR*=iY!^w1jTH4{*|^tFd6@qKGxukuI9nB_QldWrL{!wN{j%F=iEm<(qjohLUEC6!-ytX};5|k6P`4G3u<)E*kVi`^WevH0@rep)J%f$JkgG&l5 zVrWKpnMiP=U^9MfrOWTWb0H|Hhh2X5ja6c3!gsY0|5HFD%6$j1^2+^sO7Wrc zs|Jz9^lz*Hp-qxO`myAFeCfQ$FJ?RcDnUGoM;ZGhiavXUrb|IU$ZtMd( zpf?oOu}O5E!R#tKHw7IRGfS29scc!aaKE`EDpAdh7U7}X>sOg|uru35D(>IzVyt{? zQHH&tc2L=ut%-Cq7*6jh&Gv2>Wo!cO7~|80nAjD8EpOEuXg@z zTkx#~(b3rzz<&IwObc$S-gb*<A|t5z?oiU(4j*NZ z{2Ub5rdO6}n3ZGD>2n4wlg6S3eX}LfvD~zH(L(1|#r=|jx04y0DKD7P`bhhQ|HK#x zUD(J+_y9~|Lfa}|=dexMA9(-9LR0(g_?zH-GeXnYo-t8VWjaHTz2(P!wD-g#rF-;y z3E4Y%BkqGgJMwEd*uYLcNc;~VCO1Se+`*Mcz}AcZfYUvSn{e?DuCg~+PG$mzL_ zYbq7R-I=Q9wWcdxcRGwzB?F2WP6XPwGbeUpe?Ba8F2I02#-HunV>;HnOR3yVbS)p1 zw$~@wCmh~!eIYKLtyPc^Ss)xX>pNNtxA1qm);4OeNg;CYOcwx0^Z%VUoH$lvyOwb5EDxDi}K7qgGl%)Dre8wzpt&(H8^?)oqR=0_nl9&>!ZRWJ!QdygqF$ zQM{iiuQ#j{Q*W~Dx{7@H@3-9NM>4>AZ4x|`xJfn}f0>-}K_RDOiC!rU@q?#pxR-p? zc<3|RMinDwGu3`z8nM zMmZ4f_#>yT!|$5L#$p(nq+D)+u)go*H`wF<=wyk=XwR3n>WnJTI^z~1EGzfyYFqNo zL1EoN|A5^moe5N=s;ws~r-<_J! z2acdev&|FKW>LuT(?qQ)PO;68agnl_*<WJge&nRjg}#aMlOdHy z7-Cp3-dCe#d3KKWdv8b8cDfyawC?MAT|DBtBdYB^ehwWbQOW=*tJ`5S(g%=M2~f_t zq^`zoF2Xg5cX8tORy;sq${#c4BxB<()UDrU&qvL?4y?hAQha5|xxfXwJoyx$Kybfc zV;*K){N5|jdFD${pM?IHI~zOG5ct62NMWh1=J#8*4;+)M=Y`P@*BO(^W*rNnr~q=3 zQC1LmttoPQeA?3P!rTV`;jHalGFQ*a9nA*{n^&8NpN(v#hKmRBW39m?+0mj@1OM=r z%|pwhaeT44&0$-6{#Hm)oluXUjxdkg)}@%{Bqf;^Iw9EqCH2X~cDcm6CUvP*Lo~D? zxdf-#p@^+tkdU+*ec2~}t0JpJJTOCaEZb3;*OPn`;cpfaN_Zbyt_R(x=-pCN|)-J@e-H#ZEQ=s*^;z;hPKJp6^vk3!>eee zTZRN`#BaB}mKRahQw94xC#1Pu)fFcawr#XA8PLp2@8$ZqT|2nPSXNX4C$5v-rV#U@ z%rP1R@+rJ&G!#CLTWVv}>r~ZpFGbp$Zcykwd&VBF1nYDA297b&fR~t-r%2+8g~!kI4qK||;{q>l$@Swqv6E9xk7N?IV6>U*&uh1i zAvQY0AGdU;DiY3g;R7D&iILvV(ae8_a4c&g<3^O{epfRU6CW2#0&_K0gZ-;mbN|PA){erMIhU?ix__ zL0yM{jn+_c;^sn&)N;h{F>?Gm@6sxYIHc;|>FpD%od2n#me^8l7QNQ=AG?h73?4L`6=38Bw~h)hPnB}<#%-8^~RH&UN6wGjwIKCwls35AyC(TFWUN4#rW+rt4-b4(L#wc@@t9fLKOUBBZ8{l`+xk3`y`vK_ zXJ@y++LR+m&AC6M0HXl#GWR?JFQ`gDnz#zRA;QF`+a>qF*d2m zrGv$(o)A?8_Icq|R;kwZ>1$92^#OgCAqWyxAxQDfzJfhiz0O7Ng|U?*SE1XgZwLT% z`T5tt0Y+fk(YBAo<>uB|bcq}`mA2AgbE4%I!Miv7LHeru>s{qb&*|{J%m7YM23wPE zV(gu)n%B;d&8%DxdDAb2g|%i>eGP#dw9z!*Np4uz+bHm3&}3WuNQKZ~?JfBiyTee@ zl_emKUPV+R>+l(xcRVe4SP!faTn5|3F}6jHpxEiuKG4H^KU01VQ+|tf^Lc2qBpFV? zYFy2Xe@b^Q5q*us`#O9h11SN2vz^FMpLrlRZDZ5H8lz6$$E?Ep0%><8cWBQRKRBIgwV9}FJ8u#kiZgy$5dO9c z%^h&aP?OHP2uJNbOl}q!8ag?mrPVKM8V|f5c|UZy85%a9skE6WZ|J3T0kk;)UzWc5 zAUCh%EGs5&wSru}78 zt{m9hk1I(#3lupL4KXW=%)fN5Y}0xZo1*G65wY4_NJ*Ee*em}!-$0qfY0X~rQfEKc z_0OL%S8iO(p0&mP?E2kGj}|QSnW+`uL?<&WbM6rL9s~oG`v#gO;gVMF>aJiK-@ol3~IPaPY_gApPPK#;$OT!)Bj&OgQT?k4p~ zlwjd(QntV5uoPv2i`{6nzf{X7;??KyVr;gz)oOC^3LbOy3=2-H@%TZ|aM4XZ9+@Hq zLr;AOwu(x-M@rDiIXq0qT$rt~*7Yba?oW-aZ>NOp*GBpQD<18`U+n}`El#UNr_%d- z8gXL6DGVBZ{M0jH^99!25If>o4bW(gAue=@E&G-MS{=(jU$)CrX@fG-o(@Fer$6 z^Hb*h^?e#OdHR0s0{o~-ozUuxG9Q!GiRkujNX->=1n`6qpKsK@&q6-wJ4>l)IPXw| z4#AXYpx8nK69~!z%QLS~(3*tgq{j><_)8UGX2OvEZ06){x+&sB)YCG$?`WPQ>bE`|P-4#CrO z03XLh(gD82hxkiQD zlqh#m9``ZCu#rM?3+31YrQj%Ao5=f-Td_1o`n_6YVQ7SCkPds^$mmX8_$W$n#$TP-@rOEh#eYp z8Jh-G^RzRSot}GwpEHiqNx6h~@~TNC7mjmIko}o5hOR?nf4;u)-7?ztk}=fB$m?~^bNAsTbAMz>uD7 zHe=aCZ~Uj%#q(0biP zu$<`=8E=QBPakMtDxV94oW&7N=bcuAh#0+A^hX(z0;|AYVaR8`Q!6$CYel*YTDwF6 zb8M}qsZ_;r*3Dgw3ojqY3SoYV_#wN~v*0HgBua71UM)53Z+=*9xn9$}{yq;L$=B+( z=hIGD>BkF;i2@mtA+Un!o%SVz+a5POw-0ti>V|X{V%6AgVJD(qpf$&c3_b!dtiKrU zT}w$c@m1Ou!ao39WmB_BnfkjcSm||lV;lJglsg;8Qo7OQ{9SdW&@;3Dtl?ST0u-K8T)S2b3$m&>Et}t!G#pD7<|v~9*pq|32DN!L zXOt z``onnphwN6%XttsN!d>&rA}g3>JI?#JWA+)E9Ue24G}un@|w`n0OL7bw;hfgSWjiQeIcb^Dr*6t z%i6xFT@96)0rfm5HoNKb6VsW?P4mu8$G>S>VrzM7IO@u+&b*ZQsTp%}|4D@dief$* z&a53#pU8zv(jVg+n3(#K<&ZepqXR!fQq18Yug45cz>$+f=&4Thfw zZJG=0(#UJxO;ykhjP68{l005KpOwlYJ$d$FU5(SgXRr+~?6lGcmeXga4a&kU`#vht z`F%K6Bqu0ToZhU<{k7mxI|#-n#;#1h*^p2DXjMrcm&FQBwneM*8KFw4WStPPWl>k4 z1l$eucJVbSj{FCpYWdl*bhFYjt)(u$J0?xy0tE%jodLx2`yJkB#{hnYJ}AsC3_3Dy zTzq-hq@lEb!XR)`5rW6c%E*|b1gM2K4cwp0#h{%|Qk}6Qd4s*Jl1k07dl<`N*>(^_ zkEzD9Qfdf??(6T;jpmL8iL$e&j$S}~1w#(1r|+*ui7a}xr@csbY#EZDyZaExpj@q7 zjbrddST8@WDs4%nMRZ~7;%z^4SkW^4Ugc8Yq~N|q|}Un+p5ELQETw;Cv1O2Op0HGLD=<*)}h>_>>iffm+zSO zxA5TM_pwxw!|7Ql%V1rH3Bk&I65$Ev?Xif2OsAoNJ9BQKrW->s?H%|qV&GV_F&=Z@ z|BeyD%C0OLE7*ZNKh`BF&yRHcM>Dydbtob9p;S)1?2JdZ2}L~ih-8nbiM6t2uVhIo z5d)v^4UZMyqgd(ua}=AGm_{&UDtwpu&%HOK8u>}5F$;#K=0oe6 zE5CkfqCw%OrG?l}Y9GrmD5MH}eEN7~`O}B%z?{0d6;4BC!5_d$H{4{*{TDJ}OGm+CdCAe+$g6X#cR>gZBssM>9J0 zY4+NW*Omu<@kd|P7ME|m*BYi~QOmEg*m7%(bxYm)uVmaIO#yU-Ds-gb6C?Dpz`GUY zE|r7$#ssFwPIKmvi=b0kvC`)^BI3yl$`65D*lvA=h%C{ndLY4e*Icf|n#mdCqo!D% zQvX*wfdw)|jc-Upy#a_}J*B)YBKa@jV`|~6m;BAqX^;|Gc~tkWN+jQ+A5gN z`)v8cEwwzf=ctIc;V#kKyYkiQVZJ0`6lS0k!2JU-5YN3Po;X$Gb7A|hFFKI3Kp5e# z4}5*Q>BZcJ2c`^MYV6Ov2i4)k@^19|J={xd(uzOB(*6UOe0Z%Pp{AM5Q)`Oraq`)> zia91G@|#vsQ%*4AK?!gBrG08gn*~C9?uQP;DzF-nqADRXsk*Gqx6c9vmLEqyL@b+jq-=4E_=cKPEBf zPVaNLYdCBGJe9h$Q%$2Q-r(9^yB&CD)|y`sA~Tco*Qb7KDvB>A^anqlI8SfDeM;t6 z#5@7Z3s@=pf|{b8UeD?7AZu99C(3d#Nzf|h-|PO@8&U57_U^&=66r18_e&V=XetU3FKk713CG~Kj~KPE9(BxLFuL$wuv2>N+RO97>MAk6 zQE2e9x}WMkd>;Su7y^WA5ML7e18~z(0?>l4CMD^3TfjeS1L+kXX=~6ZBf1weCA`RQ zK-SnoeLCT;3Laa1m?ypH=H}ZYk3F}Es+w(UsSJoxg(pvh*=)$f{hcs>2EE93GY&Lx za5uqpGV^QNY;3*4F#EuY#UFA>)gH-?kzfA)>1Yzqiy_R;w2W&F|3bI<0BHrHc3DW& z(~=UimA#-J@}zQ%D5IhsQ4*nCRL2~w`hqbXX;5Y6-IXDa~G zQ_CcakoA_-gFKx=qO6c#wSZoSfkai>>-qjue*hh?{G8vlC*2wiKDD4lprUuC!M9%YYp%+G|y4L*IP*Z1yF=+{x| z3o3;3uC6B4QOqDb!O`K7VYdBw^g@#0>s4jF!D+;e3_sqFj}n$pxnCT=`og$~DVDSu z(byt2)60;v-or}y*%IaGyofD;Bj0+0GS46J?)QlOF#(W#C53ALl=8vn)IH4Igv3`a zYtVZ|e*g`o^wj{uIKo#)yi-1R2B%hyBvyr5*KM@+etpIY!HU%C?qYv=-`1igz4{oC zt11x(l=cjmLlZjXR{HVLRd0}^1J>4@x16=Hx(C^{J-1evFx3FL?l0Z^!8_j8WRYDq z@0{b3Q=V9J-_hK$V?gzbQJP)UaiYwe8q_oM7vssWhq@SKI-Upso`>2Y+V341_K-eo z_A%-ZqSYochbB#P`QRQS-BDn}XDx4BThUze3%2h6U`t;(RhAcZL0Q@NV5yTqUMJB} zF7fUNQLPUdWPaQcR^@pd_+0U1vH2#mYmJmSH@*QKdsblT-{#CXwk0gd8qwH~uDV68 zSv!_(U$Kcqhtmz$?=5%XmM7zA%?5SUt@++e%ky^o>*b5WqfmqZIAzfnTS#K zHOHDT*uGnsVQHNx;pfif@s}0qw^q7C7?Q`lSfwiav}f{bbi6M-wP@XAKP>R^@abV1P0okavZDMS6zJ7(slTUY4FiVf}>Dw4eL`p z0*|~$%Jgu_s{Bo4#4bc(U_{)Rkz*e7{rL8lC( z$wC>U8I)aq%G@<+cQ&TtAjQacg~_j00J#%7OJa7KsRN2xdjh!Oq@a#hi{T~VPWeD8 zw{wL!+4nOp?!c=pdYvV6;4#eA&NbVLS;^75T5L?VaUB0rrX-)Mwu1q`>rydw_50$> zFt)oWLJ4l%dit!RPbHW5cfIa=aOPzkwkn=WE~2WDk_|WUYrE1nZJgN~+A}LWM-IN6 zi!+*~RR@x8_MP@Xw`eedGE^XKS#yl>q|rAKdqy&GW5*8&Tl*B(|6D!zt6<@t6ToCJ z+f0O91$QVh0to*GB>PKs&Hp>7&`w?YH)O11+p>*D;;#?fOnbOfN29h<`SjheLvZQe zpjK3|jR7Bg<%hxN{0dRar!}37{Au~9B&1xTRQlT+go`_VvKxJI;7!jgQdwiud*z6D zk*;CMou(s3-_B8wnx96?LW~A#ZeXg4Wox}jZDix!>$7W}tdn}i|39>lnABl;wy5$r$NC|^{GLMh& zHg78|A%-Oj2CZW|}pWxQD+b1`>Y z)KWM>L$ZGBfq%}?iHkB;ui;;!y*ewK94RK^3bZH;uXAihBKcnh zY`U5V$cCyXri;9rhQ){UzZ?E!oJ$`GvxaVLq&dju0hvEN6!^BKBKQsUgtpM6YkvS^ z`C0c0i+iBoR{uT7a%bRue{e+k3S?a|rSVKWfh4QUn8v2AYCdc0RS(NNtt6iFOdumf zGVu?ziKjvjiJuupQx_$Vtc=$7~zh z6n(NYs8c6@*bYEbdu`9PqIoCO%-*^9y1WD-Y#8Q@#!9z`A_fA@99=KxNw~-mesNlE z-MK)5d3KKGNFmlbuzpE##>)WwS>Vy50nF3~Ms!YnQQz#nmNRpJPtx+WW9C>Aes2b6!3b z;^1Hy2IdTWXbaWe@>k-)QwEpKaEgBb?;BD>&GhSP--Kl6H^UR_v4Dli?CkA1#hGCS z7>vCHp<(vjUS2=UlAat*Uj*$7>(rOG@dLk@wU*WUZXUlkPMw1Rp9~r~_-CL=!07qf zeeW$Rp|t{N;{FjkTK%k zK_8Hq^3AUuB{fQ<-1{b)aAA z#|H;7Yrk6BeISE0B{gUUh^A+`$7n2&A5uUnBD>Rb%?oW%C%#|r7|pyCa}Lu^UVAy~ zJ-ws|;~W-a9J<;i_y+Ht)R5PYHt@j99$dAH#^OFhB{YH?W^nJqS@(oZbJF?p6W(iP zDVBxj?knf|!sW3Wj@w~k30?DVT3gqcs zPD5F1&;QLE7ea2|grQzJZZ)`9QRcdKY+hiO;G~A%a!ul<_)K)yK_|~D=GVIqw;b*R zi}?G0AkV4>c%k`}Yeb{js%h3$D)C2O3l5oIBz;GWmAWL1`JCuLxVULch z)5g`nocf41xnZ~1{ZigQQ@UZk%S%Klcaqm15L!7szhk-9@x!lf_3r>#2Ig{0_mDt= z?ui3x^nYW!zu=^bgLR&TVR6A4hC$H6$o#xi zS$;^jVn}d&tD(5$;jJ2zImO8G0Q3P(8W;at%kRu~vN?buV$9XJs@?J*+TiPv2pv2` zXqTwR*ctLZ@7T@@C~mmb&}@OmkKrvp>^C(F&))L5@0s{`*lK{@*c7yqHT1pGHvv$sFSy(I#CD|PA*^E6 zjA(J_f`~(0BiEaGO7V~>Mc$03z(ebAXl53l+)rC?9(dWiT4iryi1Z=d?j-rFOg=QQ zNd60_Bye!EEnxl3OV!mNrellCBQj6z7-%j>ok;U721x|tQT$^s^k z&Id-w0T&{^>g1z5#+xB^vsBF?$?hKviVi1!C~4rwA)19LW7z*A{pf0AY1en;lHsV^3$d4&V1r1x1dB&k$?E zgEF7pjc>Rw>grh75X*%&<+QFITpU7;s$Pg2rsrZ0)#8z9PXgZu^V`mH$`eYl-Cfh8 z^s&E*FCof2Y5RrgmU60;U`n}E{+vQG;>N#Q+ilUn`qkh3Yv)0l3fW|resY*1pqNDo zBd#KCzK@^hyJ-k^i8P_33doDW*=}T5OzPBtt4Yr`XYI1X(~W0gLU$vv2h(mbo);Gi z-GAzM8C_YZ$_Q-^sEp!Ft?154w>=Bs-NFg1I`}^sn2;pY??*9@PfLg%rK0Ba<8~MH ze66GG+bW@hYTqihTeueHFQ$cV5h#|x97}6S>@OUrfxvE!gU@dC;x_g=8bq1)6@7hc zM@WhbzxtWrqe;;yy+J3`7>g9P zAIj%0g07i?n*O=%)=qwnG%NCnI@n|*hblhJ@RmyopIYwWjy^nur09M1@?N?l!r2uk z0+X#lj$8Ge2F>4^e***;Vu*w;VNDp)ju1CPkJ-d?>O(IbM2Z+E_L$)oQa#&y_q#7Sx~ge?Ur2Kath^&E(*!sO@(P*Tzs|w0IZCIskPv`myc|Z-`KT3 zGxhzEvQarM zGYl=(tjSsYmc{Szq`o|O2HjtW-P!t57M4L4&u}p4-=w#X9Q4p>Rwx)yizs_KGIiyK z)@JOCjrsd~hXFL9f27m(@E18>!B^S4)I~x<`JESONJiRWSegulK_>5TgOt*2&_jDj z+~}kyK4t(>d|~$TLe1rr2f~QwvQ>}qozANu1`*oie9rE2R?O}y?19G3n;FSM3+aO< zBAx>L;)`GZ{Q;1%`G-5}WEc_rNU)O#S=&_u{4-HoiVXcWD?!E-222p3c+l?`W_e|*>t6~`~@ZZBb6kC znthFEcfDRBBO;VbLp`JNTZZkG)67%Lw@Gsxq)pejjgD6cj3}iYA8UVp82X)1KTAEy z5|S)G)F^b`zGc<*!ar2laG$>Kb!4V7$?UX z)(GtStIAvb-Mnf_ zJpPe}+6@8m!THbI`5ThZ&pj%CeX;il_SiBmm3f}v>Dq&5{|@x9&A<~(qu>-&MSY;Q zfFrXgU4bgUreW~mft4Z}cLL1$Wb)eR|22SXtKhYpHbu19Zq!2^^=sL)^_ttA{7E6< z-SITU`8~wM(IM%R&m-(lVJb7iiWFuUxnXhJ%-l=@M(Q_$CrmzQ@p!0Y(iws5$(pnglxg_F5Li2&cz`$yxB_(bD7N;IovV6wI9DQgv=wrJ<~ zV$g48tnu6@`8|$sJp30!`+NW^SpjTW8(TS{}>uw~J?PfTKP`AMS znhMn>4dQn}X!okB7H3sa)?*@&-v?5=ke4wX01=Y3V<&-$)Uk#sBXOFtrUcjo_5f-_ zb(w3e?baW-+<)UlllAUfAAWhLT!b|*Z{L{Wx9X9?F0D&Yb-$foUZ-Td^ZCN;bWHu$ zTdg4qFl)zz1)6M_HoaTeKVKuWuw%$)OPeb|v(@M+pO;VTt85XCr0zoInYcwC!43n- z%j@jPzgrPoh0|%PNjl}ZRi34noGrx;4&ZyYdD2B^zMKdSG1fX2Gq-(DrhCLfd3Sv0 z@~cF<^bTvV8v`xKHt~p-f(*UHp3*h8QOHSFdzN@qkft1oZ0~gx-7jki7i%9yz>r|wHOodH^BT*dJ7_5UiRlcVjj?k-6 z33^Mv_am2S7{1OAtmNOBw6jb0%kmos=6bgeEEV}039RwnD^xT*YYVaIV~Om7Xj@I` ziKfCZVwmVpVbk8j#N+mmswrfChj5MF=}shkF8|-ROWrSd8y9pK>vkO_r-ULdIwtPv xp*944C0;sSevftFqsfa>8q{}?Rb4EQCvA$I4%E^LOPih5j&S>KGnfBo>VKFRh)Dnd literal 0 HcmV?d00001 diff --git a/examples/obj/female02/_02_-_Default1noCulling.JPG b/examples/obj/female02/_02_-_Default1noCulling.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f7b322d466ff0586cf5ea8d5def1c350a5c9e622 GIT binary patch literal 25240 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

HQUQ2 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 + + + three.js - OBJ converter test + + + + + +

+ +
+ + + + + + + + + + + + + + + + + diff --git a/src/core/Face3.js b/src/core/Face3.js index df845109cd..6cb268a8a5 100644 --- a/src/core/Face3.js +++ b/src/core/Face3.js @@ -2,16 +2,19 @@ * @author mr.doob / http://mrdoob.com/ */ -THREE.Face3 = function ( a, b, c, normal, color ) { +THREE.Face3 = function ( a, b, c, normal, color, material ) { this.a = a; this.b = b; this.c = c; this.centroid = new THREE.Vector3(); - this.normal = normal || new THREE.Vector3(); + this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); this.color = color || new THREE.Color( 0xff000000 ); + + this.vertexNormals = normal instanceof Array ? normal : []; + this.material = material || 0; }; diff --git a/src/core/Face4.js b/src/core/Face4.js index f3b326a06b..ac4ecd22b7 100644 --- a/src/core/Face4.js +++ b/src/core/Face4.js @@ -2,7 +2,7 @@ * @author mr.doob / http://mrdoob.com/ */ -THREE.Face4 = function ( a, b, c, d, normal, color ) { +THREE.Face4 = function ( a, b, c, d, normal, color, material ) { this.a = a; this.b = b; @@ -10,12 +10,16 @@ THREE.Face4 = function ( a, b, c, d, normal, color ) { this.d = d; this.centroid = new THREE.Vector3(); - this.normal = normal || new THREE.Vector3(); + this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); this.color = color || new THREE.Color( 0xff000000 ); + this.vertexNormals = normal instanceof Array ? normal : []; + this.material = material || 0; + }; + THREE.Face4.prototype = { // TODO: Dupe? (Geometry/computeCentroid) diff --git a/src/core/Geometry.js b/src/core/Geometry.js index e0a851c9a7..ed67a20528 100644 --- a/src/core/Geometry.js +++ b/src/core/Geometry.js @@ -43,9 +43,9 @@ THREE.Geometry.prototype = { }, - computeNormals: function () { + computeNormals: function ( useVertexNormals ) { - var v, vl, vertex, f, fl, face, vA, vB, vC, cb = new THREE.Vector3(), ab = new THREE.Vector3(); + var n, nl, v, vl, vertex, f, fl, face, vA, vB, vC, cb = new THREE.Vector3(), ab = new THREE.Vector3(); for ( v = 0, vl = this.vertices.length; v < vl; v++ ) { @@ -58,25 +58,86 @@ THREE.Geometry.prototype = { face = this.faces[ f ]; - vA = this.vertices[ face.a ]; - vB = this.vertices[ face.b ]; - vC = this.vertices[ face.c ]; + if ( useVertexNormals && face.vertexNormals.length ) { + + // set face normal to average of vertex normals + + cb.set( 0, 0, 0 ); - cb.sub( vC.position, vB.position ); - ab.sub( vA.position, vB.position ); - cb.crossSelf( ab ); + for ( n = 0, nl = face.normal.length; n < nl; n++ ) { + cb.x += face.vertexNormals[n].x; + cb.y += face.vertexNormals[n].y; + cb.z += face.vertexNormals[n].z; + } - if ( !cb.isZero() ) { + cb.x /= 3; + cb.y /= 3; + cb.z /= 3; - cb.normalize(); + if ( !cb.isZero() ) { - } + cb.normalize(); + + } + + face.normal.copy( cb ); + } + + else { + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.sub( vC.position, vB.position ); + ab.sub( vA.position, vB.position ); + cb.crossSelf( ab ); + + if ( !cb.isZero() ) { + + cb.normalize(); + + } - face.normal.copy( cb ); + face.normal.copy( cb ); + } } }, + + computeBoundingBox: function ( ) { + + if ( this.vertices.length > 0 ) { + + this.bbox = { '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 ] }; + + var v, vl; + + for ( v = 1, vl = this.vertices.length; v < vl; v++ ) { + + vertex = this.vertices[ v ]; + + if ( vertex.position.x < this.bbox.x[ 0 ] ) + this.bbox.x[ 0 ] = vertex.position.x; + else if ( vertex.position.x > this.bbox.x[ 1 ] ) + this.bbox.x[ 1 ] = vertex.position.x; + + if ( vertex.position.y < this.bbox.y[ 0 ] ) + this.bbox.y[ 0 ] = vertex.position.y; + else if ( vertex.position.y > this.bbox.y[ 1 ] ) + this.bbox.y[ 1 ] = vertex.position.y; + + if ( vertex.position.z < this.bbox.z[ 0 ] ) + this.bbox.z[ 0 ] = vertex.position.z; + else if ( vertex.position.z > this.bbox.z[ 1 ] ) + this.bbox.z[ 1 ] = vertex.position.z; + + } + } + }, toString: function () { diff --git a/src/materials/ParticleDOMMaterial.js b/src/materials/ParticleDOMMaterial.js index e435a33646..3c25c88055 100644 --- a/src/materials/ParticleDOMMaterial.js +++ b/src/materials/ParticleDOMMaterial.js @@ -1,15 +1,15 @@ -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.ParticleDOMMaterial = function ( domElement ) { - - this.domElement = domElement; - - this.toString = function () { - - return 'THREE.ParticleDOMMaterial ( domElement: ' + this.domElement + ' )'; - - }; - -}; +/** + * @author mr.doob / http://mrdoob.com/ + */ + +THREE.ParticleDOMMaterial = function ( domElement ) { + + this.domElement = domElement; + + this.toString = function () { + + return 'THREE.ParticleDOMMaterial ( domElement: ' + this.domElement + ' )'; + + }; + +}; diff --git a/src/objects/Mesh.js b/src/objects/Mesh.js index 6fe43c1eb5..ac2538862d 100644 --- a/src/objects/Mesh.js +++ b/src/objects/Mesh.js @@ -2,7 +2,7 @@ * @author mr.doob / http://mrdoob.com/ */ -THREE.Mesh = function ( geometry, material ) { +THREE.Mesh = function ( geometry, material, normUVs ) { THREE.Object3D.call( this ); @@ -14,7 +14,51 @@ THREE.Mesh = function ( geometry, material ) { this.overdraw = false; + this.materialFaces = {}; + + this.sortFacesByMaterial(); + if( normUVs ) this.normalizeUVs(); + + this.geometry.computeBoundingBox(); + }; THREE.Mesh.prototype = new THREE.Object3D(); THREE.Mesh.prototype.constructor = THREE.Mesh; + +THREE.Mesh.prototype.sortFacesByMaterial = function () { + + var f, fl, face, material; + + for ( f = 0, fl = this.geometry.faces.length; f < fl; f++ ) { + + face = this.geometry.faces[ f ]; + material = face.material; + + if ( this.materialFaces[material] == undefined ) + this.materialFaces[material] = { 'faces': [] }; + + this.materialFaces[material].faces.push( f ); + + } + +} + +THREE.Mesh.prototype.normalizeUVs = function () { + + var i,j; + + for ( i = 0, l = this.geometry.uvs.length; i < l; i++ ) { + + var uvs = this.geometry.uvs[i]; + + for ( j = 0, jl = uvs.length; j < jl; j++ ) { + + // texture repeat + // (WebGL does this by default but canvas renderer needs to do it explicitly) + + if( uvs[j].u != 1.0 ) uvs[j].u = uvs[j].u - Math.floor(uvs[j].u); + if( uvs[j].v != 1.0 ) uvs[j].v = uvs[j].v - Math.floor(uvs[j].v); + } + } +} diff --git a/src/renderers/CanvasRenderer.js b/src/renderers/CanvasRenderer.js index 4f044fe3a1..f1b3b8f9b7 100644 --- a/src/renderers/CanvasRenderer.js +++ b/src/renderers/CanvasRenderer.js @@ -358,7 +358,6 @@ THREE.CanvasRenderer = function () { _context.moveTo( v1x, v1y ); _context.lineTo( v2x, v2y ); _context.lineTo( v3x, v3y ); - _context.lineTo( v4x, v4y ); _context.lineTo( v1x, v1y ); _context.closePath(); @@ -668,6 +667,10 @@ THREE.CanvasRenderer = function () { _context.save(); _context.clip(); + + // debug triangle outline + //_context.strokeStyle = "black"; + //_context.stroke(); denom = uv1u * ( uv3v - uv2v ) - uv2u * uv3v + uv3u * uv2v + ( uv2u - uv3u ) * uv1v; diff --git a/src/renderers/Projector.js b/src/renderers/Projector.js index f8d64d05d4..9b82b04b41 100644 --- a/src/renderers/Projector.js +++ b/src/renderers/Projector.js @@ -96,7 +96,7 @@ THREE.Projector = function() { _face3.z = Math.max( v1.positionScreen.z, Math.max( v2.positionScreen.z, v3.positionScreen.z ) ); - _face3.material = object.material; + _face3.material = [ object.material[face.material] ]; _face3.overdraw = object.overdraw; _face3.uvs = object.geometry.uvs[ f ]; _face3.color = face.color; @@ -135,7 +135,7 @@ THREE.Projector = function() { _face4.z = Math.max( v1.positionScreen.z, Math.max( v2.positionScreen.z, Math.max( v3.positionScreen.z, v4.positionScreen.z ) ) ); - _face4.material = object.material; + _face4.material = [ object.material[face.material] ]; _face4.overdraw = object.overdraw; _face4.uvs = object.geometry.uvs[ f ]; _face4.color = face.color; diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index f8ca507c93..316eb76e5c 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -33,7 +33,8 @@ THREE.WebGLRenderer = function () { var face, faceColor, object, material, normal, lightColor, lightPosition, light, vertexArray, faceArray, colorArray, normalArray, vertexIndex, o, ol, f, fl, m, ml, i, v1, v2, v3, v4, - l, ll; + l, ll, + uv, uvArray; if ( this.autoClear ) { @@ -68,99 +69,9 @@ THREE.WebGLRenderer = function () { object = scene.objects[ o ]; - if ( object instanceof THREE.Mesh ) { - - if ( !object.__webGLVertexBuffer ) { - - vertexArray = []; - faceArray = []; - colorArray = []; - normalArray = []; - vertexIndex = 0; - - for ( f = 0, fl = object.geometry.faces.length; f < fl; f++ ) { - - face = object.geometry.faces[ f ]; - faceColor = face.color; - normal = face.normal; - - if ( face instanceof THREE.Face3 ) { - - v1 = object.geometry.vertices[ face.a ].position; - v2 = object.geometry.vertices[ face.b ].position; - v3 = object.geometry.vertices[ face.c ].position; - - vertexArray.push( v1.x, v1.y, v1.z ); - vertexArray.push( v2.x, v2.y, v2.z ); - vertexArray.push( v3.x, v3.y, v3.z ); - - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); - - colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); - colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); - colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); - - faceArray.push( vertexIndex, vertexIndex + 1, vertexIndex + 2 ); - - vertexIndex += 3; - - } else if ( face instanceof THREE.Face4 ) { - - v1 = object.geometry.vertices[ face.a ].position; - v2 = object.geometry.vertices[ face.b ].position; - v3 = object.geometry.vertices[ face.c ].position; - v4 = object.geometry.vertices[ face.d ].position; - - vertexArray.push( v1.x, v1.y, v1.z ); - vertexArray.push( v2.x, v2.y, v2.z ); - vertexArray.push( v3.x, v3.y, v3.z ); - vertexArray.push( v4.x, v4.y, v4.z ); - - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); - - colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); - colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); - colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); - colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); - - faceArray.push( vertexIndex, vertexIndex + 1, vertexIndex + 2 ); - faceArray.push( vertexIndex, vertexIndex + 2, vertexIndex + 3 ); - - vertexIndex += 4; - } - } - - if ( !vertexArray.length ) { - - continue; - - } - - object.__webGLVertexBuffer = _gl.createBuffer(); - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( vertexArray ), _gl.STATIC_DRAW ); - - object.__webGLNormalBuffer = _gl.createBuffer(); - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( normalArray ), _gl.STATIC_DRAW ); - - object.__webGLColorBuffer = _gl.createBuffer(); - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( colorArray ), _gl.STATIC_DRAW ); - - object.__webGLFaceBuffer = _gl.createBuffer(); - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, object.__webGLFaceBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, new Uint16Array( faceArray ), _gl.STATIC_DRAW ); - - object.__webGLFaceCount = faceArray.length; - - } + var materialFace, fi; + if ( object instanceof THREE.Mesh ) { viewMatrix.multiply( camera.matrix, object.matrix ); @@ -174,51 +85,249 @@ THREE.WebGLRenderer = function () { _gl.uniformMatrix4fv( _program.projectionMatrix, false, _program.projectionMatrixArray ); _gl.uniformMatrix4fv( _program.normalMatrix, false, _program.normalMatrixArray ); - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer ); - _gl.vertexAttribPointer( _program.position, 3, _gl.FLOAT, false, 0, 0 ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer ); - _gl.vertexAttribPointer( _program.normal, 3, _gl.FLOAT, false, 0, 0 ); - - for ( m = 0, ml = object.material.length; m < ml; m++ ) { - - material = object.material[ m ]; - + // create separate VBOs per material + for (var m in object.materialFaces ) { + + materialFace = object.materialFaces[m]; + material = object.material[m]; + if( !material ) continue; + //log(material); + + if( !materialFace.__webGLVertexBuffer ) { + + vertexArray = []; + faceArray = []; + colorArray = []; + normalArray = []; + uvArray = []; + vertexIndex = 0; + + //log( "object.geometry.uvs: " + object.geometry.uvs.length + " " + object.geometry.uvs); + + for ( f = 0, fl = materialFace.faces.length; f < fl; f++ ) { + + fi = materialFace.faces[f]; + + face = object.geometry.faces[ fi ]; + faceColor = face.color; + vertexNormals = face.vertexNormals; + normal = face.normal; + uv = object.geometry.uvs[ fi ]; + + if ( face instanceof THREE.Face3 ) { + + v1 = object.geometry.vertices[ face.a ].position; + v2 = object.geometry.vertices[ face.b ].position; + v3 = object.geometry.vertices[ face.c ].position; + + vertexArray.push( v1.x, v1.y, v1.z ); + vertexArray.push( v2.x, v2.y, v2.z ); + vertexArray.push( v3.x, v3.y, v3.z ); + + if ( vertexNormals.length == 3 ) { + + normalArray.push( vertexNormals[0].x, vertexNormals[0].y, vertexNormals[0].z ); + normalArray.push( vertexNormals[1].x, vertexNormals[1].y, vertexNormals[1].z ); + normalArray.push( vertexNormals[2].x, vertexNormals[2].y, vertexNormals[2].z ); + + } + else { + + normalArray.push( normal.x, normal.y, normal.z ); + normalArray.push( normal.x, normal.y, normal.z ); + normalArray.push( normal.x, normal.y, normal.z ); + + } + + colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); + colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); + colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); + + if ( uv ) { + + uvArray.push( uv[0].u, uv[0].v ); + uvArray.push( uv[1].u, uv[1].v ); + uvArray.push( uv[2].u, uv[2].v ); + + } + + faceArray.push( vertexIndex, vertexIndex + 1, vertexIndex + 2 ); + + vertexIndex += 3; + + } else if ( face instanceof THREE.Face4 ) { + + v1 = object.geometry.vertices[ face.a ].position; + v2 = object.geometry.vertices[ face.b ].position; + v3 = object.geometry.vertices[ face.c ].position; + v4 = object.geometry.vertices[ face.d ].position; + + vertexArray.push( v1.x, v1.y, v1.z ); + vertexArray.push( v2.x, v2.y, v2.z ); + vertexArray.push( v3.x, v3.y, v3.z ); + vertexArray.push( v4.x, v4.y, v4.z ); + + if ( vertexNormals.length == 4 ) { + + normalArray.push( vertexNormals[0].x, vertexNormals[0].y, vertexNormals[0].z ); + normalArray.push( vertexNormals[1].x, vertexNormals[1].y, vertexNormals[1].z ); + normalArray.push( vertexNormals[2].x, vertexNormals[2].y, vertexNormals[2].z ); + normalArray.push( vertexNormals[3].x, vertexNormals[3].y, vertexNormals[3].z ); + + } + else { + + normalArray.push( normal.x, normal.y, normal.z ); + normalArray.push( normal.x, normal.y, normal.z ); + normalArray.push( normal.x, normal.y, normal.z ); + normalArray.push( normal.x, normal.y, normal.z ); + + } + + colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); + colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); + colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); + colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a ); + + if ( uv ) { + + uvArray.push( uv[0].u, uv[0].v ); + uvArray.push( uv[1].u, uv[1].v ); + uvArray.push( uv[2].u, uv[2].v ); + uvArray.push( uv[3].u, uv[3].v ); + + } + + faceArray.push( vertexIndex, vertexIndex + 1, vertexIndex + 2 ); + faceArray.push( vertexIndex, vertexIndex + 2, vertexIndex + 3 ); + + vertexIndex += 4; + } + } + + if ( !vertexArray.length ) { + + continue; + + } + + /* + log( "vertices: " + vertexArray.length/3 ); + log( "faces: " + faceArray.length/3 ); + log( "normals: " + normalArray.length/3 ); + log( "colors: " + colorArray.length/4 ); + log( "uvs: " + uvArray.length/2 ); + */ + + + materialFace.__webGLVertexBuffer = _gl.createBuffer(); + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLVertexBuffer ); + _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( vertexArray ), _gl.STATIC_DRAW ); + + materialFace.__webGLNormalBuffer = _gl.createBuffer(); + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLNormalBuffer ); + _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( normalArray ), _gl.STATIC_DRAW ); + + if( material instanceof THREE.MeshFaceColorFillMaterial || material instanceof THREE.MeshBitmapUVMappingMaterial ) { + materialFace.__webGLColorBuffer = _gl.createBuffer(); + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLColorBuffer ); + _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( colorArray ), _gl.STATIC_DRAW ); + } + + materialFace.__webGLUVBuffer = _gl.createBuffer(); + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLUVBuffer ); + _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( uvArray ), _gl.STATIC_DRAW ); + + materialFace.__webGLFaceBuffer = _gl.createBuffer(); + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, materialFace.__webGLFaceBuffer ); + _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, new Uint16Array( faceArray ), _gl.STATIC_DRAW ); + + materialFace.__webGLFaceCount = faceArray.length; + + } + if ( material instanceof THREE.MeshColorFillMaterial ) { - if ( !material.__webGLColorBuffer ) { + if ( !materialFace.__webGLColorBuffer ) { colorArray = []; - for ( i = 0; i < object.__webGLFaceCount; i ++ ) { + for ( i = 0; i < materialFace.__webGLFaceCount; i ++ ) { colorArray.push( material.color.r, material.color.g, material.color.b, material.color.a ); } - material.__webGLColorBuffer = _gl.createBuffer(); - _gl.bindBuffer( _gl.ARRAY_BUFFER, material.__webGLColorBuffer ); + materialFace.__webGLColorBuffer = _gl.createBuffer(); + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLColorBuffer ); _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( colorArray ), _gl.STATIC_DRAW ); } + + _gl.uniform1i( _program.enableTexture, 0 ); + + } else if ( material instanceof THREE.MeshFaceColorFillMaterial ) { + + _gl.uniform1i( _program.enableTexture, 0 ); + + } else if ( material instanceof THREE.MeshBitmapUVMappingMaterial ) { + + if ( !material.__webGLTexture && material.loaded ) { + + //log(material.bitmap); + + material.__webGLTexture = _gl.createTexture(); + _gl.bindTexture( _gl.TEXTURE_2D, material.__webGLTexture ); + _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, material.bitmap ) ; + _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.LINEAR ); + //_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.LINEAR_MIPMAP_NEAREST ); + _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.LINEAR_MIPMAP_LINEAR ); + _gl.generateMipmap( _gl.TEXTURE_2D ); + _gl.bindTexture( _gl.TEXTURE_2D, null ); + + } + + _gl.uniform1i( _program.enableTexture, 1 ); + _gl.activeTexture( _gl.TEXTURE0 ); + _gl.bindTexture( _gl.TEXTURE_2D, material.__webGLTexture ); + _gl.uniform1i( _program.diffuse, 0 ); + + } + + // vertices + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLVertexBuffer ); + _gl.vertexAttribPointer( _program.position, 3, _gl.FLOAT, false, 0, 0 ); + + // normals + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLNormalBuffer ); + _gl.vertexAttribPointer( _program.normal, 3, _gl.FLOAT, false, 0, 0 ); + + // uvs + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLUVBuffer ); + if ( object.geometry.uvs.length ) { + + _gl.enableVertexAttribArray( _program.uv ); + _gl.vertexAttribPointer( _program.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + else { + + _gl.disableVertexAttribArray( _program.uv ); + + } + + // colors + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLColorBuffer ); + _gl.enableVertexAttribArray( _program.color ); + _gl.vertexAttribPointer( _program.color, 4, _gl.FLOAT, false, 0, 0 ); + + // render faces + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, materialFace.__webGLFaceBuffer ); + _gl.drawElements( _gl.TRIANGLES, materialFace.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 ); + + } + } - _gl.bindBuffer( _gl.ARRAY_BUFFER, material.__webGLColorBuffer ); - _gl.vertexAttribPointer( _program.color, 4, _gl.FLOAT, false, 0, 0 ); - - } else if ( material instanceof THREE.MeshFaceColorFillMaterial ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLColorBuffer ); - _gl.enableVertexAttribArray( _program.color ); - _gl.vertexAttribPointer( _program.color, 4, _gl.FLOAT, false, 0, 0 ); - - } - - } - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, object.__webGLFaceBuffer ); - _gl.drawElements( _gl.TRIANGLES, object.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 ); - - } } }; @@ -227,7 +336,7 @@ THREE.WebGLRenderer = function () { try { - _gl = _canvas.getContext( 'experimental-webgl' ); + _gl = _canvas.getContext( 'experimental-webgl', { antialias: true} ); } catch(e) { } @@ -245,8 +354,9 @@ THREE.WebGLRenderer = function () { _gl.depthFunc( _gl.LEQUAL ); _gl.enable( _gl.BLEND ); - _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA ); + //_gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA ); // _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE ); // cool! + _gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA ); _gl.clearColor( 0, 0, 0, 0 ); } @@ -260,13 +370,20 @@ THREE.WebGLRenderer = function () { "precision highp float;", "#endif", + "uniform bool enableTexture;", + "uniform sampler2D diffuse;", + "varying vec2 vuv;", + "varying vec4 vcolor;", "varying vec3 lightWeighting;", "void main(){", - - "gl_FragColor = vec4(vcolor.rgb * lightWeighting, vcolor.a);", - + "if(enableTexture) {", + "vec4 texelColor = texture2D(diffuse, vuv);", + "gl_FragColor = vec4(texelColor.rgb * lightWeighting, texelColor.a);", + "} else {", + "gl_FragColor = vec4(vcolor.rgb * lightWeighting, vcolor.a);", + "}", "}" ].join("\n") ) ); @@ -274,6 +391,7 @@ THREE.WebGLRenderer = function () { "attribute vec3 position;", "attribute vec3 normal;", "attribute vec4 color;", + "attribute vec2 uv;", "uniform bool enableLighting;", "uniform vec3 ambientColor;", @@ -285,6 +403,7 @@ THREE.WebGLRenderer = function () { "uniform mat4 normalMatrix;", "varying vec4 vcolor;", "varying vec3 lightWeighting;", + "varying vec2 vuv;", "void main(void) {", @@ -292,11 +411,12 @@ THREE.WebGLRenderer = function () { "lightWeighting = vec3(1.0, 1.0, 1.0);", "} else {", "vec4 transformedNormal = normalMatrix * vec4(normal, 1.0);", - "float directionalLightWeighting = max(dot(transformedNormal.xyz, lightingDirection), 0.0);", + "float directionalLightWeighting = max(dot(normalize(transformedNormal.xyz), lightingDirection), 0.0);", "lightWeighting = ambientColor + directionalColor * directionalLightWeighting;", "}", "vcolor = color;", + "vuv = uv;", "gl_Position = projectionMatrix * viewMatrix * vec4( position, 1.0 );", "}"].join("\n") ) ); @@ -320,6 +440,8 @@ THREE.WebGLRenderer = function () { _program.directionalColor = _gl.getUniformLocation(_program, 'directionalColor'); _program.lightingDirection = _gl.getUniformLocation(_program, 'lightingDirection'); + _program.enableTexture = _gl.getUniformLocation(_program, 'enableTexture'); + _program.color = _gl.getAttribLocation( _program, "color" ); _gl.enableVertexAttribArray( _program.color ); @@ -329,6 +451,12 @@ THREE.WebGLRenderer = function () { _program.normal = _gl.getAttribLocation( _program, "normal" ); _gl.enableVertexAttribArray( _program.normal ); + _program.uv = _gl.getAttribLocation( _program, "uv" ); + _gl.enableVertexAttribArray( _program.uv ); + + _program.diffuse = _gl.getUniformLocation( _program, "diffuse"); + _gl.uniform1i( _program.diffuse, 0 ); + _program.viewMatrixArray = new Float32Array(16); _program.projectionMatrixArray = new Float32Array(16); diff --git a/utils/exporters/convert_obj_threejs.py b/utils/exporters/convert_obj_threejs.py new file mode 100644 index 0000000000..1ac239ad7b --- /dev/null +++ b/utils/exporters/convert_obj_threejs.py @@ -0,0 +1,839 @@ +"""Convert Wavefront OBJ / MTL files into Three.js + +------------------------- +How to use this converter +------------------------- + +python convert_obj_threejs.py -i filename.obj -o filename.js [-a center|top|bottom] + +Note: by default, model is centered (middle of bounding box goes to 0,0,0). + +-------------------------------------------------- +How to use generated JS file in your HTML document +-------------------------------------------------- + + + + + ... + + + +------------------------------------- +Parsers based on formats descriptions +------------------------------------- + + http://en.wikipedia.org/wiki/Obj + http://en.wikipedia.org/wiki/Material_Template_Library + +------------------- +Current limitations +------------------- + + - for the moment, only diffuse color and texture are used + (will need to extend shaders / renderers / materials in Three) + + - models cannot have more than 65,536 vertices + (this comes from WebGL using just 16-bit indices, + could be worked around by expanding indexed + faces into full vertex definitions) + + - texture coordinates can be wrong in canvas renderer + (there is crude normalization, but it doesn't + work for all cases) + + - everything is using smoothing + (if you want flat shading for whole mesh, + don't export normals, then Three will + compute own normals) + +---------------------------------------------- +How to get proper OBJ + MTL files with Blender +---------------------------------------------- + + 0. Remove default cube (press DEL and ENTER) + + 1. Import / create model + + 2. Select all meshes (Select -> Select All by Type -> Mesh) + + 3. Export to OBJ (File -> Export -> Wavefront .obj) [*] + - enable following options in exporter + Material Groups + Rotate X90 + Apply Modifiers + High Quality Normals + Copy Images + Selection Only + Objects as OBJ Objects + UVs + Normals + Materials + Edges + + - select empty folder + - give your exported file name with "obj" extension + - click on "Export OBJ" button + + 4. Your model is now all files in this folder (OBJ, MTL, number of images) + - this converter assumes all files staying in the same folder, + (OBJ / MTL files use relative paths) + + - for WebGL, textures must be power of 2 sized + + [*] If OBJ export fails (Blender 2.54 beta), patch your Blender installation + following instructions here: + + http://www.blendernation.com/2010/09/12/blender-2-54-beta-released/ + +------ +Author +------ +AlteredQualia http://alteredqualia.com + +""" + +import fileinput +import operator +import random +import os.path +import getopt +import sys + +# ##################################################### +# Configuration +# ##################################################### +ALIGN = "center" # center bottom top none + +# default colors for debugging (each material gets one distinct color): +# white, red, green, blue, yellow, cyan, magenta +COLORS = [0xffeeeeee, 0xffee0000, 0xff00ee00, 0xff0000ee, 0xffeeee00, 0xff00eeee, 0xffee00ee] + +# ##################################################### +# Templates +# ##################################################### +TEMPLATE_FILE = u"""\ +// Converted from: %(fname)s +// vertices: %(nvertex)d +// faces: %(nface)d +// materials: %(nmaterial)d +// +// This file was generated by "convert_obj_treejs.py" + +var %(name)s = function ( urlbase ) { + var scope = this; + + THREE.Geometry.call(this); + + var materials = [%(materials)s]; + + init_materials(); + + var normals = [%(normals)s]; + +%(vertices)s + +%(uvs)s + +%(faces)s + + this.computeCentroids(); + this.computeNormals(); + + function material_color( mi ) { + var m = materials[mi]; + if( m.col_diffuse ) + return (m.col_diffuse[0]*255 << 16) + (m.col_diffuse[1]*255 << 8) + m.col_diffuse[2]*255; + else if ( m.a_dbg_color ) + return m.a_dbg_color; + else + return 0xffeeeeee; + } + + function v( x, y, z ) { + scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) ); + } + + function f3( a, b, c, material ) { + var color = material_color(material); + scope.faces.push( new THREE.Face3( a, b, c, null, new THREE.Color(color), material ) ); + } + + function f4( a, b, c, d, material ) { + var color = material_color(material); + scope.faces.push( new THREE.Face4( a, b, c, d, null, new THREE.Color(color), material ) ); + } + + function f3n( a, b, c, material, n1, n2, n3 ) { + var color = material_color(material); + var n1x = normals[n1][0]; + var n1y = normals[n1][1]; + var n1z = normals[n1][2]; + var n2x = normals[n2][0]; + var n2y = normals[n2][1]; + var n2z = normals[n2][2]; + var n3x = normals[n3][0]; + var n3y = normals[n3][1]; + var n3z = normals[n3][2]; + scope.faces.push( new THREE.Face3( a, b, c, + [new THREE.Vector3( n1x, n1y, n1z ), new THREE.Vector3( n2x, n2y, n2z ), new THREE.Vector3( n3x, n3y, n3z )], + new THREE.Color(color), material ) ); + } + + function f4n( a, b, c, d, material, n1, n2, n3, n4 ) { + var color = material_color(material); + var n1x = normals[n1][0]; + var n1y = normals[n1][1]; + var n1z = normals[n1][2]; + var n2x = normals[n2][0]; + var n2y = normals[n2][1]; + var n2z = normals[n2][2]; + var n3x = normals[n3][0]; + var n3y = normals[n3][1]; + var n3z = normals[n3][2]; + var n4x = normals[n4][0]; + var n4y = normals[n4][1]; + var n4z = normals[n4][2]; + scope.faces.push( new THREE.Face4( a, b, c, d, + [new THREE.Vector3( n1x, n1y, n1z ), new THREE.Vector3( n2x, n2y, n2z ), new THREE.Vector3( n3x, n3y, n3z ), new THREE.Vector3( n4x, n4y, n4z )], + new THREE.Color(color), material ) ); + } + + function uv( u1, v1, u2, v2, u3, v3, u4, v4 ) { + var uv = []; + uv.push( new THREE.UV( u1, v1 ) ); + uv.push( new THREE.UV( u2, v2 ) ); + uv.push( new THREE.UV( u3, v3 ) ); + if ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) ); + scope.uvs.push( uv ); + } + + function init_materials() { + scope.materials = []; + for(var i=0; i "Fname"). + """ + + return os.path.basename(fname).split(".")[0].capitalize() + +def bbox(vertices): + """Compute bounding box of vertex array. + """ + + if len(vertices)>0: + minx = maxx = vertices[0][0] + miny = maxy = vertices[0][1] + minz = maxz = vertices[0][2] + + for v in vertices[1:]: + if v[0]maxx: + maxx = v[0] + + if v[1]maxy: + maxy = v[1] + + if v[2]maxz: + maxz = v[2] + + return { 'x':[minx,maxx], 'y':[miny,maxy], 'z':[minz,maxz] } + + else: + return { 'x':[0,0], 'y':[0,0], 'z':[0,0] } + +def translate(vertices, t): + """Translate array of vertices by vector t. + """ + + for i in xrange(len(vertices)): + vertices[i][0] += t[0] + vertices[i][1] += t[1] + vertices[i][2] += t[2] + +def center(vertices): + """Center model (middle of bounding box). + """ + + bb = bbox(vertices) + + cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0 + cy = bb['y'][0] + (bb['y'][1] - bb['y'][0])/2.0 + cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0 + + translate(vertices, [-cx,-cy,-cz]) + +def top(vertices): + """Align top of the model with the floor (Y-axis) and center it around X and Z. + """ + + bb = bbox(vertices) + + cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0 + cy = bb['y'][1] + cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0 + + translate(vertices, [-cx,-cy,-cz]) + +def bottom(vertices): + """Align bottom of the model with the floor (Y-axis) and center it around X and Z. + """ + + bb = bbox(vertices) + + cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0 + cy = bb['y'][0] + cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0 + + translate(vertices, [-cx,cy,-cz]) + +def normalize(v): + """Normalize 3d vector""" + + l = math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]) + v[0] /= l + v[1] /= l + v[2] /= l + +# ##################################################### +# MTL parser +# ##################################################### +def parse_mtl(fname): + """Parse MTL file. + """ + + materials = {} + + for line in fileinput.input(fname): + chunks = line.split() + if len(chunks) > 0: + + # Material start + # newmtl identifier + if chunks[0] == "newmtl" and len(chunks) == 2: + identifier = chunks[1] + if not identifier in materials: + materials[identifier] = {} + + # Diffuse color + # Kd 1.000 1.000 1.000 + if chunks[0] == "Kd" and len(chunks) == 4: + materials[identifier]["col_diffuse"] = [float(chunks[1]), float(chunks[2]), float(chunks[3])] + + # Ambient color + # Ka 1.000 1.000 1.000 + if chunks[0] == "Ka" and len(chunks) == 4: + materials[identifier]["col_ambient"] = [float(chunks[1]), float(chunks[2]), float(chunks[3])] + + # Specular color + # Ks 1.000 1.000 1.000 + if chunks[0] == "Ks" and len(chunks) == 4: + materials[identifier]["col_specular"] = [float(chunks[1]), float(chunks[2]), float(chunks[3])] + + # Specular coefficient + # Ns 154.000 + if chunks[0] == "Ns" and len(chunks) == 2: + materials[identifier]["specular_coef"] = float(chunks[1]) + + # Transparency + # Tr 0.9 or d 0.9 + if (chunks[0] == "Tr" or chunks[0] == "d") and len(chunks) == 2: + materials[identifier]["transparency"] = float(chunks[1]) + + # Optical density + # Ni 1.0 + if chunks[0] == "Ni" and len(chunks) == 2: + materials[identifier]["optical_density"] = float(chunks[1]) + + # Diffuse texture + # map_Kd texture_diffuse.jpg + if chunks[0] == "map_Kd" and len(chunks) == 2: + materials[identifier]["map_diffuse"] = chunks[1] + + # Ambient texture + # map_Ka texture_ambient.jpg + if chunks[0] == "map_Ka" and len(chunks) == 2: + materials[identifier]["map_ambient"] = chunks[1] + + # Specular texture + # map_Ks texture_specular.jpg + if chunks[0] == "map_Ks" and len(chunks) == 2: + materials[identifier]["map_specular"] = chunks[1] + + # Alpha texture + # map_d texture_alpha.png + if chunks[0] == "map_d" and len(chunks) == 2: + materials[identifier]["map_alpha"] = chunks[1] + + # Bump texture + # map_bump texture_bump.jpg or bump texture_bump.jpg + if (chunks[0] == "map_bump" or chunks[0] == "bump") and len(chunks) == 2: + materials[identifier]["map_bump"] = chunks[1] + + # Illumination + # illum 2 + # + # 0. Color on and Ambient off + # 1. Color on and Ambient on + # 2. Highlight on + # 3. Reflection on and Ray trace on + # 4. Transparency: Glass on, Reflection: Ray trace on + # 5. Reflection: Fresnel on and Ray trace on + # 6. Transparency: Refraction on, Reflection: Fresnel off and Ray trace on + # 7. Transparency: Refraction on, Reflection: Fresnel on and Ray trace on + # 8. Reflection on and Ray trace off + # 9. Transparency: Glass on, Reflection: Ray trace off + # 10. Casts shadows onto invisible surfaces + if chunks[0] == "illum" and len(chunks) == 2: + materials[identifier]["illumination"] = int(chunks[1]) + + return materials + +# ##################################################### +# OBJ parser +# ##################################################### +def parse_vertex(text): + """Parse text chunk specifying single vertex. + + Possible formats: + vertex index + vertex index / texture index + vertex index / texture index / normal index + vertex index / / normal index + """ + + v = 0 + t = 0 + n = 0 + + chunks = text.split("/") + + v = int(chunks[0]) + if len(chunks) > 1: + if chunks[1]: + t = int(chunks[1]) + if len(chunks) > 2: + if chunks[2]: + n = int(chunks[2]) + + return { 'v':v, 't':t, 'n':n } + +def parse_obj(fname): + """Parse OBJ file. + """ + + vertices = [] + normals = [] + uvs = [] + + faces = [] + + materials = {} + mcounter = 0 + mcurrent = 0 + + mtllib = "" + + # current face state + group = 0 + object = 0 + smooth = 0 + + for line in fileinput.input(fname): + chunks = line.split() + if len(chunks) > 0: + + # Vertices as (x,y,z) coordinates + # v 0.123 0.234 0.345 + if chunks[0] == "v" and len(chunks) == 4: + x = float(chunks[1]) + y = float(chunks[2]) + z = float(chunks[3]) + vertices.append([x,y,z]) + + # Normals in (x,y,z) form; normals might not be unit + # vn 0.707 0.000 0.707 + if chunks[0] == "vn" and len(chunks) == 4: + x = float(chunks[1]) + y = float(chunks[2]) + z = float(chunks[3]) + normals.append([x,y,z]) + + # Texture coordinates in (u,v[,w]) coordinates, w is optional + # vt 0.500 -1.352 [0.234] + if chunks[0] == "vt" and len(chunks) >= 3: + u = float(chunks[1]) + v = float(chunks[2]) + w = 0 + if len(chunks)>3: + w = float(chunks[3]) + uvs.append([u,v,w]) + + # Face + if chunks[0] == "f" and len(chunks) >= 4: + vertex_index = [] + uv_index = [] + normal_index = [] + + for v in chunks[1:]: + vertex = parse_vertex(v) + if vertex['v']: + vertex_index.append(vertex['v']) + if vertex['t']: + uv_index.append(vertex['t']) + if vertex['n']: + normal_index.append(vertex['n']) + + faces.append({ + 'vertex':vertex_index, + 'uv':uv_index, + 'normal':normal_index, + + 'material':mcurrent, + 'group':group, + 'object':object, + 'smooth':smooth, + }) + + # Group + if chunks[0] == "g" and len(chunks) == 2: + group = chunks[1] + + # Object + if chunks[0] == "o" and len(chunks) == 2: + object = chunks[1] + + # Materials definition + if chunks[0] == "mtllib" and len(chunks) == 2: + mtllib = chunks[1] + + # Material + if chunks[0] == "usemtl" and len(chunks) == 2: + material = chunks[1] + if not material in materials: + mcurrent = mcounter + materials[material] = mcounter + mcounter += 1 + else: + mcurrent = materials[material] + + # Smooth shading + if chunks[0] == "s" and len(chunks) == 2: + smooth = chunks[1] + + return faces, vertices, uvs, normals, materials, mtllib + +# ##################################################### +# Generator +# ##################################################### +def generate_vertex(v): + return TEMPLATE_VERTEX % (v[0], v[1], v[2]) + +def generate_uv(f, uvs): + ui = f['uv'] + if len(ui) == 3: + return TEMPLATE_UV3 % (uvs[ui[0]-1][0], 1.0 - uvs[ui[0]-1][1], + uvs[ui[1]-1][0], 1.0 - uvs[ui[1]-1][1], + uvs[ui[2]-1][0], 1.0 - uvs[ui[2]-1][1]) + elif len(ui) == 4: + return TEMPLATE_UV4 % (uvs[ui[0]-1][0], 1.0 - uvs[ui[0]-1][1], + uvs[ui[1]-1][0], 1.0 - uvs[ui[1]-1][1], + uvs[ui[2]-1][0], 1.0 - uvs[ui[2]-1][1], + uvs[ui[3]-1][0], 1.0 - uvs[ui[3]-1][1]) + return "" + +def generate_face(f): + vi = f['vertex'] + if f["normal"]: + ni = f['normal'] + if len(vi) == 3: + return TEMPLATE_FACE3N % (vi[0]-1, vi[1]-1, vi[2]-1, f['material'], ni[0]-1, ni[1]-1, ni[2]-1) + elif len(vi) == 4: + return TEMPLATE_FACE4N % (vi[0]-1, vi[1]-1, vi[2]-1, vi[3]-1, f['material'], ni[0]-1, ni[1]-1, ni[2]-1, n[3]-1) + else: + if len(vi) == 3: + return TEMPLATE_FACE3 % (vi[0]-1, vi[1]-1, vi[2]-1, f['material']) + elif len(vi) == 4: + return TEMPLATE_FACE4 % (vi[0]-1, vi[1]-1, vi[2]-1, vi[3]-1, f['material']) + return "" + +def generate_normal(n): + return TEMPLATE_N % (n[0], n[1], n[2]) + +def generate_color(i): + """Generate hex color corresponding to integer. + + Colors should have well defined ordering. + First N colors are hardcoded, then colors are random + (must seed random number generator with deterministic value + before getting colors). + """ + + if i < len(COLORS): + return "0x%x" % COLORS[i] + else: + return "0x%x" % (int(0xffffff * random.random()) + 0xff000000) + +def value2string(v): + if type(v)==str and v[0] != "0": + return '"%s"' % v + return str(v) + +def generate_materials(mtl, materials): + """Generate JS array of materials objects + + JS material objects are basically prettified one-to-one + mappings of MTL properties in JSON format. + """ + + mtl_array = [] + for m in mtl: + index = materials[m] + + # add debug information + # materials should be sorted according to how + # they appeared in OBJ file (for the first time) + # this index is identifier used in face definitions + mtl[m]['a_dbg_name'] = m + mtl[m]['a_dbg_index'] = index + mtl[m]['a_dbg_color'] = generate_color(index) + + mtl_raw = ",\n".join(['\t"%s" : %s' % (n, value2string(v)) for n,v in sorted(mtl[m].items())]) + mtl_string = "\t{\n%s\n\t}" % mtl_raw + mtl_array.append([index, mtl_string]) + + return ",\n\n".join([m for i,m in sorted(mtl_array)]) + +def generate_mtl(materials): + """Generate dummy materials (if there is no MTL file). + """ + + mtl = {} + for m in materials: + index = materials[m] + mtl[m] = { + 'a_dbg_name': m, + 'a_dbg_index': index, + 'a_dbg_color': generate_color(index) + } + return mtl + +# ##################################################### +# API +# ##################################################### +def convert(infile, outfile): + """Convert infile.obj to outfile.js + + Here is where everything happens. If you need to automate conversions, + just import this file as Python module and call this method. + """ + + if not file_exists(infile): + print "Couldn't find [%s]" % infile + return + + faces, vertices, uvs, normals, materials, mtllib = parse_obj(infile) + + if ALIGN == "center": + center(vertices) + elif ALIGN == "bottom": + bottom(vertices) + elif ALIGN == "top": + top(vertices) + + random.seed(42) # to get well defined color order for materials + + uv_string = "" + if len(uvs)>0: + uv_string = "\n".join([generate_uv(f, uvs) for f in faces]) + + + mtl = {} + if mtllib: + # create full pathname for MTL (included from OBJ) + path = os.path.dirname(infile) + fname = os.path.join(path, mtllib) + + if file_exists(fname): + mtl = parse_mtl(fname) + + else: + print "Couldn't find [%s]" % fname + + if not mtl: + # if there is no specified MTL or if loading failed, + # generate default materials with debug colors + mtl = generate_mtl(materials) + + + text = TEMPLATE_FILE % { + "name" : get_name(outfile), + "vertices" : "\n".join([generate_vertex(v) for v in vertices]), + "faces" : "\n".join([generate_face(f) for f in faces]), + "uvs" : uv_string, + "normals" : ",".join(generate_normal(n) for n in normals), + + "materials" : generate_materials(mtl, materials), + + "fname" : infile, + "nvertex" : len(vertices), + "nface" : len(faces), + "nmaterial" : len(materials) + } + + out = open(outfile, "w") + out.write(text) + out.close() + + print "%d vertices, %d faces, %d materials" % (len(vertices), len(faces), len(materials)) + +# ############################################################################# +# Helpers +# ############################################################################# +def usage(): + print "Usage: %s -i filename.obj -o filename.js [-a center|top|bottom]" % os.path.basename(sys.argv[0]) + +# ##################################################### +# Main +# ##################################################### +if __name__ == "__main__": + + # get parameters from the command line + try: + opts, args = getopt.getopt(sys.argv[1:], "hi:o:a:", ["help", "input=", "output=", "align="]) + + except getopt.GetoptError: + usage() + sys.exit(2) + + infile = outfile = "" + + for o, a in opts: + if o in ("-h", "--help"): + usage() + sys.exit() + + elif o in ("-i", "--input"): + infile = a + + elif o in ("-o", "--output"): + outfile = a + + elif o in ("-a", "--align"): + if a in ("top", "bottom", "center"): + ALIGN = a + + if infile == "" or outfile == "": + usage() + sys.exit(2) + + print "Converting [%s] into [%s] ..." % (infile, outfile) + convert(infile, outfile) + + \ No newline at end of file -- GitLab
+

OBJ to Three.js converter test

+ + 2d canvas renderer + WebGL renderer +
+ +

Model by Reallusion iClone. +

Using a modified version of Three.js by mrdoob. + +
+

Best viewed in Chrome 7/8 or Firefox 4 using WebGL renderer. +

Canvas renderer is very slow on anything other than Chrome. +