if(!Array.prototype.indexOf)Array.prototype.indexOf=function(c){var b=this.length,a=Number(arguments[1])||0;a=a<0?Math.ceil(a):Math.floor(a);if(a<0)a+=b;for(;a<b;a++)if(a in this&&this[a]===c)return a;return-1};var pacem3D={};pacem3D._resources={ERR_INVALIDARGUMENTTYPE:"Argument {0} isn't of type {1}.",ERR_ARGUMENTOUTOFRANGE:"Argument {0} is out of range {1}.",ERR_ARGUMENTNULL:"Argument {0} is null.",ERR_NULLREFERENCE:"Object not set to an instance of an object.",ERR_INVALIDOPERATION:"Invalid operation.",ERR_NOTSUPPORTEDOPERATION:"Operation is not supported.",ERR_ARRAYOUTOFBOUNDS:"Element is out of array's bounds."};pacem3D._getLeft=function(a){var b=0;if(a.offsetParent)while(1){b+=a.offsetLeft;if(!a.offsetParent)break;a=a.offsetParent}else if(a.x)b+=a.x;return b};pacem3D._getTop=function(a){var b=0;if(a.offsetParent)while(1){b+=a.offsetTop;if(!a.offsetParent)break;a=a.offsetParent}else if(a.y)b+=a.y;return b};pacem3D._stringFormat=function(a){if(!a||!a.length)return a;var d=/({[\d]+})/i,b=d.exec(a);if(b==null)return a;var e=arguments;while(b!=null){var c=b[0],g=parseInt(c.substring(1,c.length-1)),f="";if(e.length>=g+2)f=e[g+1];a=a.replace(c,f);b=d.exec(a)}return a};pacem3D.maths={};pacem3D.maths._utils={degToRad:function(a){return a*Math.PI/180},radToDeg:function(a){return a*180/Math.PI}};pacem3D.maths.vector3D=function(a,b,c){this.x=a;this.y=b;this.z=c};pacem3D.maths.vector3D.i=function(){return new pacem3D.maths.vector3D(1,0,0)};pacem3D.maths.vector3D.j=function(){return new pacem3D.maths.vector3D(0,1,0)};pacem3D.maths.vector3D.k=function(){return new pacem3D.maths.vector3D(0,0,1)};pacem3D.maths.vector3D.dotProduct=function(a,b){if(!(a instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"v1","vector3D");if(!(b instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"v2","vector3D");return a.x*b.x+a.y*b.y+a.z*b.z};pacem3D.maths.vector3D.crossProduct=function(a,b){if(!(a instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"v1","vector3D");if(!(b instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"v2","vector3D");return new pacem3D.maths.vector3D(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x)};pacem3D.maths.vector3D.prototype.lengthSqr=function(){return this.x*this.x+this.y*this.y+this.z*this.z};pacem3D.maths.vector3D.prototype.length=function(){return Math.sqrt(this.lengthSqr())};pacem3D.maths.vector3D.prototype.normalize=function(){var a=Math.abs(this.x),g=Math.abs(this.y),f=Math.abs(this.z);if(g>a)a=g;if(f>a)a=f;var b=this.x/a,c=this.y/a,d=this.z/a,e=Math.sqrt(b*b+c*c+d*d);b/=e;c/=e;d/=e;return new pacem3D.maths.vector3D(b,c,d)};pacem3D.maths.vector3D.angleBetween=function(d,e){if(!(d instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"vector1","vector3D");if(!(e instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"vector2","vector3D");var c,a=d.normalize(),b=e.normalize(),g=pacem3D.maths.vector3D.dotProduct(a,b);if(g<0){var f=new pacem3D.maths.vector3D(-a.x-b.x,-a.y-b.y,-a.z-b.z);c=Math.PI-2*Math.asin(f.length()/2)}else{var f=new pacem3D.maths.vector3D(a.x-b.x,a.y-b.y,a.z-b.z);c=2*Math.asin(f.length()/2)}return pacem3D.maths._utils.radToDeg(c)};pacem3D.maths.vector3D.prototype.toPoint=function(){return new pacem3D.maths.point3D(this.x,this.y,this.z)};pacem3D.maths.vector3D.prototype.toString=function(){return pacem3D._stringFormat("v[{0}; {1}; {2}]",this.x,this.y,this.z)};pacem3D.maths.point3D=function(a,b,c){this.x=a;this.y=b;this.z=c};pacem3D.maths.point3D.empty=function(){return new pacem3D.maths.point3D(0,0,0)};pacem3D.maths.point3D.prototype.toVector=function(){return new pacem3D.maths.vector3D(this.x,this.y,this.z)};pacem3D.maths.point3D.prototype.toString=function(){return pacem3D._stringFormat("p({0}; {1}; {2})",this.x,this.y,this.z)};pacem3D.maths.matrix3D=function(d,e,f,g,h,i,j,k,l,m,n,o,a,b,c,p){this.m11=d;this.m12=e;this.m13=f;this.m14=g;this.m21=h;this.m22=i;this.m23=j;this.m24=k;this.m31=l;this.m32=m;this.m33=n;this.m34=o;this.offsetX=a;this.offsetY=b;this.offsetZ=c;this.m44=p};pacem3D.maths.matrix3D.prototype.isIdentity=function(){return this.m11==1&&this.m12==0&&this.m13==0&&this.m14==0&&this.m21==0&&this.m22==1&&this.m23==0&&this.m24==0&&this.m31==0&&this.m32==0&&this.m33==1&&this.m34==0&&this.offsetX==0&&this.offsetY==0&&this.offsetZ==0&&this.m44==1};pacem3D.maths.matrix3D.prototype.isAffine=function(){return this.m14==0&&this.m24==0&&this.m34==0&&this.m44==1};pacem3D.maths.matrix3D.identity=function(){return new pacem3D.maths.matrix3D(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)};pacem3D.maths.matrix3D.prototype.determinant=function(){if(this.isIdentity())return 1;else if(this.isAffine())return this.m11*(this.m22*this.m33-this.m32*this.m23)-this.m12*(this.m21*this.m33-this.m31*this.m23)+this.m13*(this.m21*this.m32-this.m31*this.m22);else{var e=this.m13*this.m24-this.m23*this.m14,d=this.m13*this.m34-this.m33*this.m14,c=this.m13*this.m44-this.offsetZ*this.m14,b=this.m23*this.m34-this.m33*this.m24,a=this.m23*this.m44-this.offsetZ*this.m24,f=this.m33*this.m44-this.offsetZ*this.m34,g=this.m22*d-this.m32*e-this.m12*b,j=this.m12*a-this.m22*c+this.offsetY*e,i=this.m32*c-this.offsetY*d-this.m12*f,h=this.m22*f-this.m32*a+this.offsetY*b,k=this.offsetX*g+this.m31*j+this.m21*i+this.m11*h;return k}};pacem3D.maths.matrix3D.multiply=function(a,b){if(!(a instanceof pacem3D.maths.matrix3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"m1","matrix3D");if(!(b instanceof pacem3D.maths.matrix3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"m2","matrix3D");return a.isIdentity()?b:b.isIdentity()?a:new pacem3D.maths.matrix3D(a.m11*b.m11+a.m12*b.m21+a.m13*b.m31+a.m14*b.offsetX,a.m11*b.m12+a.m12*b.m22+a.m13*b.m32+a.m14*b.offsetY,a.m11*b.m13+a.m12*b.m23+a.m13*b.m33+a.m14*b.offsetZ,a.m11*b.m14+a.m12*b.m24+a.m13*b.m34+a.m14*b.m44,a.m21*b.m11+a.m22*b.m21+a.m23*b.m31+a.m24*b.offsetX,a.m21*b.m12+a.m22*b.m22+a.m23*b.m32+a.m24*b.offsetY,a.m21*b.m13+a.m22*b.m23+a.m23*b.m33+a.m24*b.offsetZ,a.m21*b.m14+a.m22*b.m24+a.m23*b.m34+a.m24*b.m44,a.m31*b.m11+a.m32*b.m21+a.m33*b.m31+a.m34*b.offsetX,a.m31*b.m12+a.m32*b.m22+a.m33*b.m32+a.m34*b.offsetY,a.m31*b.m13+a.m32*b.m23+a.m33*b.m33+a.m34*b.offsetZ,a.m31*b.m14+a.m32*b.m24+a.m33*b.m34+a.m34*b.m44,a.offsetX*b.m11+a.offsetY*b.m21+a.offsetZ*b.m31+a.m44*b.offsetX,a.offsetX*b.m12+a.offsetY*b.m22+a.offsetZ*b.m32+a.m44*b.offsetY,a.offsetX*b.m13+a.offsetY*b.m23+a.offsetZ*b.m33+a.m44*b.offsetZ,a.offsetX*b.m14+a.offsetY*b.m24+a.offsetZ*b.m34+a.m44*b.m44)};pacem3D.maths.matrix3D.prototype.invert=function(){if(this.isAffine()){var u=this.m12*this.m23-this.m22*this.m13,t=this.m32*this.m13-this.m12*this.m33,s=this.m22*this.m33-this.m32*this.m23,c=this.determinant();if(c==0)return null;var r=this.m21*this.m13-this.m11*this.m23,q=this.m11*this.m33-this.m31*this.m13,p=this.m31*this.m23-this.m21*this.m33,i=this.m11*this.m22-this.m21*this.m12,h=this.m11*this.m32-this.m31*this.m12,g=this.m11*this.offsetY-this.offsetX*this.m12,f=this.m21*this.m32-this.m31*this.m22,e=this.m21*this.offsetY-this.offsetX*this.m22,d=this.m31*this.offsetY-this.offsetX*this.m32,o=this.m23*g-this.offsetZ*i-this.m13*e,n=this.m13*d-this.m33*g+this.offsetZ*h,m=this.m33*e-this.offsetZ*f-this.m23*d,l=i,k=-h,j=f,b=1/c,E=new pacem3D.maths.matrix3D(s*b,t*b,u*b,0,p*b,q*b,r*b,0,j*b,k*b,l*b,0,m*b,n*b,o*b,1);return E}else{var c=this.determinant();if(c==0)return null;var B=this.m33*this.m44-this.m34*this.offsetZ,d=this.m32*this.m44-this.m34*this.offsetY,e=this.m31*this.m44-this.m34*this.offsetX,f=this.m32*this.offsetZ-this.m33*this.offsetY,g=this.m31*this.offsetZ-this.m33*this.offsetX,h=this.m31*this.offsetY-this.m32*this.offsetX,i=this.m33*this.m44-this.m34*this.offsetZ,C=this.m32*this.m44-this.m34*this.offsetY,D=this.m31*this.m44-this.m34*this.offsetX,v=this.m32*this.offsetZ-this.m33*this.offsetY,w=this.m31*this.offsetZ-this.m33*this.offsetX,j=this.m31*this.offsetY-this.m32*this.offsetX,k=this.m23*this.m44-this.m24*this.offsetZ,l=this.m22*this.m44-this.m24*this.offsetY,m=this.m21*this.m44-this.m24*this.offsetX,n=this.m22*this.offsetZ-this.m23*this.offsetY,o=this.m21*this.offsetZ-this.m23*this.offsetX,p=this.m21*this.offsetY-this.m22*this.offsetX,q=this.m23*this.m34-this.m24*this.m33,r=this.m22*this.m34-this.m24*this.m32,x=this.m21*this.m34-this.m24*this.m31,y=this.m22*this.m33-this.m23*this.m32,z=this.m21*this.m33-this.m23*this.m31,A=this.m21*this.m32-this.m22*this.m31,s=this.m22*B-this.m23*d+this.m24*f,F=-(this.m21*B-this.m23*e+this.m24*g),G=this.m21*d-this.m22*e+this.m24*h,H=-(this.m21*f-this.m22*g+this.m23*h),t=-(this.m12*i-this.m13*C+this.m14*v),I=this.m11*i-this.m13*D+this.m14*w,J=-(this.m11*C-this.m12*D+this.m14*j),K=this.m11*v-this.m12*w+this.m13*j,u=this.m12*k-this.m13*l+this.m14*n,L=-(this.m11*k-this.m13*m+this.m14*o),M=this.m11*l-this.m12*m+this.m14*p,N=-(this.m11*n-this.m12*o+this.m13*p),O=-(this.m12*q-this.m13*r+this.m14*y),P=this.m11*q-this.m13*x+this.m14*z,Q=-(this.m11*r-this.m12*x+this.m14*A),R=this.m11*y-this.m12*z+this.m13*A,a=1/c,E=new pacem3D.maths.matrix3D(s*a,t*a,u*a,O*a,F*a,I*a,L*a,P*a,G*a,J*a,M*a,Q*a,H*a,K*a,N*a,R*a);return E}};pacem3D.maths.matrix3D.transform=function(c,a){if(!(c instanceof pacem3D.maths.point3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"point","point3D");if(!(a instanceof pacem3D.maths.matrix3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"matrix","matrix3D");var b=new pacem3D.maths.point3D(c.x,c.y,c.z);if(!a.isIdentity()){var e=b.x,f=b.y,g=b.z;b.x=e*a.m11+f*a.m21+g*a.m31+a.offsetX;b.y=e*a.m12+f*a.m22+g*a.m32+a.offsetY;b.z=e*a.m13+f*a.m23+g*a.m33+a.offsetZ;if(!a.isAffine()){var d=e*a.m14+f*a.m24+g*a.m34+a.m44;if(d!=0){b.x/=d;b.y/=d;b.z/=d}}}return b};pacem3D.maths.matrix3D.prototype.toString=function(){return pacem3D._stringFormat("m[{0}; {1}; {2}; {3};  {4}; {5}; {6}; {7};  {8}; {9}; {10}; {11};  {12}; {13}; {14}; {15};]",this.m11,this.m12,this.m13,this.m14,this.m21,this.m22,this.m23,this.m24,this.m31,this.m32,this.m33,this.m34,this.offsetX,this.offsetY,this.offsetZ,this.m44)};pacem3D.maths.quaternion=function(b,c,d,a){this.x=b;this.y=c;this.z=d;this.w=a};pacem3D.maths.quaternion.identity=function(){return new pacem3D.maths.quaternion(0,0,0,1)};pacem3D.maths.quaternion.fromAxisAngle=function(a,d){if(!(a instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"axis","vector3D");d%=360;var c=pacem3D.maths._utils.degToRad(d),e=a.length();if(e==0)throw pacem3D._resources.ERR_INVALIDOPERATION;var b=Math.sin(.5*c)/e,f=a.x*b,g=a.y*b,h=a.z*b;return new pacem3D.maths.quaternion(f,g,h,Math.cos(.5*c))};pacem3D.maths.quaternion.fromRotationMatrix=function(a){if(!(matrix instanceof pacem3D.maths.matrix3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"matrix","matrix3D");var g=a.m11+a.m22+a.m33+a.m44;if(g>0){var b=.5/Math.sqrt(g),c=.25/b,d=(a.m23-a.m32)*b,e=(a.m31-a.m13)*b,f=(a.m12-a.m21)*b;return new pacem3D.maths.quaternion(d,e,f,c)}else if(a.m11>a.m22&&a.m11>a.m22){var b=.5/Math.sqrt(a.m44+a.m11-a.m22-a.m33),c=(a.m23-a.m32)*b,d=.25/b,e=(a.m12+a.m21)*b,f=(a.m31+a.m13)*b;return new pacem3D.maths.quaternion(d,e,f,c)}else if(a.m22>a.m33){var b=.5/Math.sqrt(a.m44+a.m22-a.m11-a.m33),f=(a.m23+a.m32)*b,e=.25/b,d=(a.m12+a.m21)*b,c=(a.m31-a.m13)*b;return new pacem3D.maths.quaternion(d,e,f,c)}else{var b=.5/Math.sqrt(a.m44+a.m33-a.m11-a.m22),e=(a.m23+a.m32)*b,f=.25/b,c=(a.m12-a.m21)*b,d=(a.m31-a.m13)*b;return new pacem3D.maths.quaternion(d,e,f,c)}};pacem3D.maths.quaternion.prototype.toString=function(){return pacem3D._stringFormat("q[{0}; {1}; {2}; {3}]",this.x,this.y,this.z,this.w)};pacem3D.maths.quaternion.prototype.conjugate=function(){return new pacem3D.maths.quaternion(-this.x,-this.y,-this.z,this.w)};pacem3D.maths.quaternion.prototype.norm=function(){return this.x*this.x+this.y*this.y+this.z*this.z};pacem3D.maths.quaternion.prototype.axis=function(){if(this.x==0&&this.y==0&&this.z==0)return pacem3D.maths.vector3D.j();var a=new pacem3D.maths.vector3D(this.x,this.y,this.z);return a.normalize()};pacem3D.maths.quaternion.prototype.angle=function(){var b=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z),f=this.w;if(b>Number.MAX_VALUE){var a=Math.max(Math.abs(this.x),Math.max(Math.abs(this.y),Math.abs(this.z))),e=this.x/a,d=this.y/a,c=this.z/a;b=Math.sqrt(e*e+d*d+c*c);f/=a}return Math.atan2(b,f)*114.59155902616465};pacem3D.maths.quaternion.prototype.toRotationMatrix=function(){var a=pacem3D.maths.matrix3D.identity(),b=this.x,c=this.y,d=this.z,e=this.w;a.m11=1-2*c*c-2*d*d;a.m12=2*b*c+2*e*d;a.m13=2*b*d-2*e*c;a.m21=2*b*c-2*e*d;a.m22=1-2*b*b-2*d*d;a.m23=2*c*d+2*e*b;a.m31=2*e*c+2*b*d;a.m32=2*c*d-2*e*b;a.m33=1-2*b*b-2*c*c;return a};pacem3D.maths.quaternion.prototype.invert=function(){var b=1/this.norm(),a=this.conjugate();a.x*=b;a.y*=b;a.z*=b;a.w*=b;return a};pacem3D.maths.quaternion.multiply=function(a,b){if(!(a instanceof pacem3D.maths.quaternion))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"q1","quaternion");if(!(b instanceof pacem3D.maths.quaternion))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"q2","quaternion");return new pacem3D.maths.quaternion(a.w*b.x+a.x+b.w+a.y*b.z-a.z*b.y,a.w*b.y-a.x*b.z+a.y*b.w+a.z*b.x,a.w*b.z+a.x*b.y-a.y*b.x+a.z*b.w,a.w*b.w-a.x*b.x-a.y*b.y-a.z*b.z)};pacem3D.maths.quaternion.dotProduct=function(a,b){if(!(a instanceof pacem3D.maths.quaternion))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"q1","quaternion");if(!(b instanceof pacem3D.maths.quaternion))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"q2","quaternion");var c=pacem3D.maths.quaternion.multiply(a,b.conjugate());return c.w};pacem3D.engine={};pacem3D.engine.camera=function(e,f,h,g,b,d,a,c){if(!(b instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"upDirection","vector3D");if(!(d instanceof pacem3D.maths.point3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"eye","point3D");if(!(a instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"lookDirection","vector3D");if(!(c instanceof pacem3D.maths.point3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"target","point3D");this.nearPlaneDistance=e;this.farPlaneDistance=f;this.fieldOfView=h;this.aspectRatio=g;this.upDirection=b;this.eye=d;this.lookDirection=a;this.target=c};pacem3D.engine.camera.standard=function(){return new pacem3D.engine.camera(.25,Number.POSITIVE_INFINITY,45,1.33333,pacem3D.maths.vector3D.j(),pacem3D.maths.point3D.empty(),new pacem3D.maths.vector3D(0,0,-1),new pacem3D.maths.point3D(0,0,-1))};pacem3D.engine.camera.prototype.cameraMatrix=function(){return pacem3D.maths.matrix3D.multiply(this.viewMatrix(),this.projectionMatrix())};pacem3D.engine.camera.prototype.viewMatrix=function(){var e=new pacem3D.maths.vector3D(this.target.x-this.eye.x,this.target.y-this.eye.y,this.target.z-this.eye.z),f=this.upDirection,d=this.eye.toVector(),a=e;a=a.normalize();this.lookDirection=e;var b=pacem3D.maths.vector3D.crossProduct(f,a);b=b.normalize();var c=this.upDirection=pacem3D.maths.vector3D.crossProduct(a,b),g=-pacem3D.maths.vector3D.dotProduct(b,d),h=-pacem3D.maths.vector3D.dotProduct(c,d),i=-pacem3D.maths.vector3D.dotProduct(a,d);return new pacem3D.maths.matrix3D(b.x,c.x,a.x,0,b.y,c.y,a.y,0,b.z,c.z,a.z,0,g,h,i,1)};pacem3D.engine.camera.prototype.projectionMatrix=function(){var a=this.nearPlaneDistance,c=this.farPlaneDistance,f=this.aspectRatio,g=pacem3D.maths._utils.degToRad(this.fieldOfView),e=2*a*Math.tan(g/2),h=e/f,b=pacem3D.maths.matrix3D.identity();b.m11=2*a/e;b.m22=2*a/h;if(Number.POSITIVE_INFINITY!=c&&Number.NEGATIVE_INFINITY!=c){b.m33=-(c+a)/(c-a);b.offsetZ=2*a*c/(a-c)}else{var d=c>=0?1:-1;b.m33=-1*d;b.offsetZ=-2*a*d}b.m34=-1;return b};pacem3D.engine.nodeGeometry=function(a){if(a!=null&&!(a instanceof Array))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"positions","Array");this.positions=a||[]};pacem3D.engine.nodeGeometry.prototype.barycenter=function(){if(!this.positions||this.positions.length)return pacem3D.maths.point3D.empty();for(var a=pacem3D.maths.point3D.empty(),e=this.positions.length,d=0;d<this.positions.length;d++){var c=this.positions[d];a.x+=c.x;a.y+=c.y;a.z+=c.z}var b=1*e;a.x/=b;a.y/=b;a.z/=b;return a};pacem3D.engine.mesh=function(c,a,b){if(c!=null&&!(c instanceof Array))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"positions","Array");if(a!=null&&!(a instanceof Array))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"triangleIndices","Array");if(b!=null&&!(b instanceof Array))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"textureCoords","Array");this.positions=c||[];this.triangleIndices=a||[];this.textureCoordinates=b||[]};pacem3D.engine.mesh.prototype=new pacem3D.engine.nodeGeometry;pacem3D.engine.mesh.prototype.constructor=pacem3D.engine.mesh;pacem3D.engine.poly=function(b,c,a){if(b!=null&&!(b instanceof Array))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"positions","Array");if(c!=null&&!(c instanceof Array))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"indices","Array");if(a!=null&&!(a instanceof Array))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"textureCoords","Array");this.positions=b||[];this.polygonIndices=c||[];this.textureCoordinates=a||[]};pacem3D.engine.poly.prototype=new pacem3D.engine.nodeGeometry;pacem3D.engine.poly.prototype.constructor=pacem3D.engine.poly;pacem3D.engine.transform=function(){this.matrix=pacem3D.maths.matrix3D.identity()};pacem3D.engine.translateTransform=function(a,b,c){this.matrix=pacem3D.maths.matrix3D.identity();this.matrix.offsetX=a;this.matrix.offsetY=b;this.matrix.offsetZ=c};pacem3D.engine.translateTransform.prototype=new pacem3D.engine.transform;pacem3D.engine.translateTransform.prototype.constructor=pacem3D.engine.translateTransform;pacem3D.engine.rotateTransform=function(a,b,c){if(a!=null&&!(a instanceof pacem3D.maths.point3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"center","point3D");if(b!=null&&!(b instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"axis","vector3D");if(typeof c!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"angle","Number");c%=360;if(b.length()>0){var d=pacem3D.maths.quaternion.fromAxisAngle(b,c);this.matrix=d.toRotationMatrix()}else this.matrix=pacem3D.maths.matrix3D.identity();this.matrix.offsetX-=a.x;this.matrix.offsetY-=a.y;this.matrix.offsetZ-=a.z};pacem3D.engine.rotateTransform.prototype=new pacem3D.engine.transform;pacem3D.engine.rotateTransform.prototype.constructor=pacem3D.engine.rotateTransform;pacem3D.engine.scaleTransform=function(a,b,c,d){if(a!=null&&!(a instanceof pacem3D.maths.point3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"center","point3D");if(typeof b!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"scaleX","Number");if(typeof c!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"scaleY","Number");if(typeof d!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"scaleZ","Number");this.matrix.m11=b;this.matrix.m22=c;this.matrix.m33=d;this.matrix.offsetX-=a.x;this.matrix.offsetY-=a.y;this.matrix.offsetZ-=a.z};pacem3D.engine.scaleTransform.prototype=new pacem3D.engine.transform;pacem3D.engine.scaleTransform.prototype.constructor=pacem3D.engine.scaleTransform;pacem3D.engine.color=function(a,d,c,b){this.a=a||1;this.r=d||0;this.g=c||0;this.b=b||0;if(typeof this.a!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"a","Number");if(typeof this.r!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"r","Number");if(typeof this.g!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"g","Number");if(typeof this.b!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"b","Number");if(this.a<0||this.a>1)throw pacem3D._stringFormat(pacem3D._resources.ERR_ARGUMENTOUTOFRANGE,"a","[0; 1]");if(this.r<0||this.r>255)throw pacem3D._stringFormat(pacem3D._resources.ERR_ARGUMENTOUTOFRANGE,"r","[0; 255]");if(this.g<0||this.g>255)throw pacem3D._stringFormat(pacem3D._resources.ERR_ARGUMENTOUTOFRANGE,"g","[0; 255]");if(this.b<0||this.b>255)throw pacem3D._stringFormat(pacem3D._resources.ERR_ARGUMENTOUTOFRANGE,"b","[0; 255]");};pacem3D.engine.color.convertToFillStyle=function(a,d,c,b){return pacem3D._stringFormat("rgba({0},{1},{2},{3})",Math.round(d).toFixed(0),Math.round(c).toFixed(0),Math.round(b).toFixed(0),a.toFixed(1))};pacem3D.engine.color.prototype.toFillStyle=function(){return pacem3D.engine.color.convertToFillStyle(this.a,this.r,this.g,this.b)};pacem3D.engine.material=function(){this.subjectToLight=true};pacem3D.engine.material.prototype.brush=function(){};pacem3D.engine.solidColorMaterial=function(a){this.color=a||new pacem3D.engine.color(1,192,192,192);if(!(this.color instanceof pacem3D.engine.color))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"clr","color");};pacem3D.engine.solidColorMaterial.prototype=new pacem3D.engine.material;pacem3D.engine.solidColorMaterial.prototype.constructor=pacem3D.engine.solidColorMaterial;pacem3D.engine.solidColorMaterial.prototype.brush=function(a){if(arguments.length<=1||!this.subjectToLight)a.fillStyle=this.color.toFillStyle();else{var c=arguments[1],b=c.light,e=c.normal,d=function(a,h,j,k){var d=a.r*1,c=a.g*1,b=a.b*1;if(h!=0){var i=j.normalize(),l=k.normalize(),e=pacem3D.maths.vector3D.dotProduct(i,l);if(e!=0){var g=e>=0?0:255,f=h*Math.abs(e);d=a.r+(g-a.r)*f;c=a.g+(g-a.g)*f;b=a.b+(g-a.b)*f;d=d<0||isNaN(d)?0:d>255?255:d;c=c<0||isNaN(c)?0:c>255?255:c;b=b<0||isNaN(b)?0:b>255?255:b}}return pacem3D.engine.color.convertToFillStyle(a.a,d,c,b)};a.fillStyle=d(this.color,b.intensity,b.direction,e)}};pacem3D.engine.modelVisual3D=function(d,c,b){if(d&&!(d instanceof pacem3D.engine.nodeGeometry))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"geom","nodeGeometry");this.isHitTestVisible=true;this.geometry=d;this.transforms=[];this.materials=[];this.backMaterials=[];this.children=[];if(c instanceof Array)for(var a=0;a<c.length;a++){if(!(c[a]instanceof pacem3D.engine.material))continue;this.materials.push(c[a])}else c instanceof pacem3D.engine.material&&this.materials.push(c);if(b instanceof Array)for(var a=0;a<b.length;a++){if(!(b[a]instanceof pacem3D.engine.material))continue;this.backMaterials.push(b[a])}else b instanceof pacem3D.engine.material&&this.backMaterials.push(b)};pacem3D.engine.modelVisual3D.prototype.faces=function(k,w){if(!k)throw pacem3D._stringFormat(pacem3D._resources.ERR_ARGUMENTNULL,"viewport");if(!k.camera)throw pacem3D._resources.ERR_NULLREFERENCE;var a=w||pacem3D.maths.matrix3D.identity();if(!(a instanceof pacem3D.maths.matrix3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"parentTransformMatrix","matrix3D");for(var r=pacem3D.maths.matrix3D.identity(),c=0;c<this.transforms.length;c++)r=pacem3D.maths.matrix3D.multiply(r,this.transforms[c].matrix);a=pacem3D.maths.matrix3D.multiply(r,a);if(!this.geometry)return{faces:[],transformMatrix:a};if(this.geometry instanceof pacem3D.engine.mesh){for(var i=this.geometry,h=[],c=0;c<i.positions.length;c++){var v=pacem3D.maths.matrix3D.transform(i.positions[c],a);h.push(v)}for(var l=[],b=k.camera,c=0;c<i.triangleIndices.length;c+=3){var x=i.triangleIndices[c],y=i.triangleIndices[c+1],z=i.triangleIndices[c+2],f=h[x],d=h[y],g=h[z],e={node1:f,node2:d,node3:g,owner:this,normal:pacem3D.maths.vector3D.crossProduct(new pacem3D.maths.vector3D(d.x-f.x,d.y-f.y,d.z-f.z),new pacem3D.maths.vector3D(g.x-d.x,g.y-d.y,g.z-d.z)).normalize(),barycenter:new pacem3D.maths.point3D(.3333*(f.x+d.x+g.x),.3333*(f.y+d.y+g.y),.3333*(f.z+d.z+g.z)),materials:this.materials,backMaterials:this.backMaterials},u=new pacem3D.maths.vector3D(e.barycenter.x-(b.eye.x-b.lookDirection.x*b.nearPlaneDistance),e.barycenter.y-(b.eye.y-b.lookDirection.y*b.nearPlaneDistance),e.barycenter.z-(b.eye.z-b.lookDirection.z*b.nearPlaneDistance));e.zIndex=-u.lengthSqr();l.push(e)}return{faces:l,transformMatrix:new pacem3D.maths.matrix3D(a.m11,a.m12,a.m13,a.m14,a.m21,a.m22,a.m23,a.m24,a.m31,a.m32,a.m33,a.m34,a.offsetX,a.offsetY,a.offsetZ,a.m44)}}else if(this.geometry instanceof pacem3D.engine.poly){for(var n=this.geometry,h=[],c=0;c<n.positions.length;c++){var v=pacem3D.maths.matrix3D.transform(n.positions[c],a);h.push(v)}for(var l=[],b=k.camera,c=0;c<n.polygonIndices.length;c++){var o=n.polygonIndices[c];if(o.length<3)throw pacem3D._resources.ERR_ARRAYOUTOFBOUNDS;var j=[],s=0,t=0;bary_z=0;for(var q=0;q<o.length;q++){var m=h[o[q]];j.push(m);s+=m.x;t+=m.y;bary_z+=m.z}var p=1/o.length,f=j[0],d=j[1],g=j[2],e={nodes:j,owner:this,normal:pacem3D.maths.vector3D.crossProduct(new pacem3D.maths.vector3D(d.x-f.x,d.y-f.y,d.z-f.z),new pacem3D.maths.vector3D(g.x-d.x,g.y-d.y,g.z-d.z)).normalize(),barycenter:new pacem3D.maths.point3D(s*p,t*p,bary_z*p),materials:this.materials,backMaterials:this.backMaterials},u=new pacem3D.maths.vector3D(e.barycenter.x-(b.eye.x-b.lookDirection.x*b.nearPlaneDistance),e.barycenter.y-(b.eye.y-b.lookDirection.y*b.nearPlaneDistance),e.barycenter.z-(b.eye.z-b.lookDirection.z*b.nearPlaneDistance));e.zIndex=-u.lengthSqr();l.push(e)}return{faces:l,transformMatrix:a}}return[]};pacem3D.engine.modelVisual3D.prototype.toString=function(){return"pacem3D.engine.modelVisual3D"};pacem3D.engine.light=function(b,a){this.intensity=b||0;this.direction=a||new pacem3D.maths.vector3D(0,-1,0);if(typeof this.intensity!="number")throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"intensity","Number");if(!(this.direction instanceof pacem3D.maths.vector3D))throw pacem3D._stringFormat(pacem3D._resources.ERR_INVALIDARGUMENTTYPE,"direction","vector3D");};pacem3D.engine.viewport3D=function(a,g){this.stretch=pacem3D.engine.viewport3DStretch.uniform;this.context2D=null;this.context3D=null;try{this.context2D=a.getContext("2d")}catch(h){}try{this.context3D=a.getContext("webgl")}catch(h){}this.isWebGL=this.context3D!=null;this.isHTML5=this.context2D!=null;if(!this.isWebGL&&!this.isHTML5)return;var b=this,f=function(){b._lastMousePos=null},e=function(){b._lastMousePos={x:Number.NaN,y:Number.NaN}},d=function(c){if(b._lastMousePos)b._lastMousePos={x:c.clientX-pacem3D._getLeft(a),y:c.clientY-pacem3D._getTop(a)}},c=function(){var d=b._hitTestResults;if(d.length)for(var e=d[0],c=e._clickCallbacks,f=c.length,a=0;a<f;a++)c[a](e,{position:b._lastMousePos})};a.addEventListener("click",c,false);a.addEventListener("mouseout",f,false);a.addEventListener("mouseover",e,false);a.addEventListener("mousemove",d,false);window.addEventListener("unload",function(){a.removeEventListener("click",c);a.removeEventListener("mouseout",f);a.removeEventListener("mouseover",e);a.removeEventListener("mousemove",d);b.timer&&window.clearInterval(b.timer)},false);this.light=new pacem3D.engine.light(.75);this.camera=pacem3D.engine.camera.standard();this.children=[];this.timer=null;this.frameRate=g||17;this.backfaceCulling=true;this._renderedCallbacks=[];this._hitTestResults=[];this._lastHitTestResult=null};pacem3D.engine.viewport3D.prototype.startRenderer=function(){if(!this.isWebGL&&!this.isHTML5)throw pacem3D._resources.ERR_NOTSUPPORTEDOPERATION;var a=this;this.timer=window.setInterval(function(){a.draw.apply(a)},this.frameRate)};pacem3D.engine.viewport3D.prototype.stopRenderer=function(){if(!this.isWebGL&&!this.isHTML5)throw pacem3D._resources.ERR_NOTSUPPORTEDOPERATION;window.clearInterval(this.timer)};pacem3D.engine.modelVisual3D.prototype.add_mouseover=function(a){this._mouseoverCallbacks=this._mouseoverCallbacks||[];typeof a=="function"&&this._mouseoverCallbacks.indexOf(a)==-1&&this._mouseoverCallbacks.push(a)};pacem3D.engine.modelVisual3D.prototype.remove_mouseover=function(a){this._mouseoverCallbacks&&this._mouseoverCallbacks.length&&this._mouseoverCallbacks.pop(a)};pacem3D.engine.modelVisual3D.prototype.add_mouseout=function(a){this._mouseoutCallbacks=this._mouseoutCallbacks||[];typeof a=="function"&&this._mouseoutCallbacks.indexOf(a)==-1&&this._mouseoutCallbacks.push(a)};pacem3D.engine.modelVisual3D.prototype.remove_mouseout=function(a){this._mouseoutCallbacks&&this._mouseoutCallbacks.length&&this._mouseoutCallbacks.pop(a)};pacem3D.engine.modelVisual3D.prototype.add_click=function(a){this._clickCallbacks=this._clickCallbacks||[];typeof a=="function"&&this._clickCallbacks.indexOf(a)==-1&&this._clickCallbacks.push(a)};pacem3D.engine.modelVisual3D.prototype.remove_click=function(a){this._clickCallbacks&&this._clickCallbacks.length&&this._clickCallbacks.pop(a)};pacem3D.engine.viewport3D.prototype.add_rendered=function(a){typeof a=="function"&&this._renderedCallbacks.indexOf(a)==-1&&this._renderedCallbacks.push(a)};pacem3D.engine.viewport3D.prototype.remove_rendered=function(a){this._renderedCallbacks.pop(a)};pacem3D.engine.viewport3DStretch={uniform:0,uniformToFill:1};pacem3D.engine.viewport3D.prototype.draw=function(){var c=this;if(!(c.isWebGL&&false))if(c.isHTML5){this._hitTestResults=[];var k=this._lastHitTestResult,b=c.context2D,C=c.camera,A=c.children;b.canvas.width=b.canvas.clientWidth;b.canvas.height=b.canvas.clientHeight;var s=[],M=b.canvas.width,w=b.canvas.height,d={width:1*M,height:1*w},q=C.aspectRatio,H=d.width/d.height,B=c.stretch==pacem3D.engine.viewport3DStretch.uniform,o,n;if(q>=H)if(B){o=d.width;n=d.width/q}else{o=d.height*q;n=d.height}else if(B){o=d.height*q;n=d.height}else{o=d.width;n=d.width/q}for(var J=d.width/2-o/2,K=d.height/2-n/2,v=c.frustum={x:J,y:K,width:o,height:n},z=function(a,f){for(var b=a.faces(c,f),d=0;d<b.faces.length;d++)s.push(b.faces[d]);for(var e=0;e<a.children.length;e++)z(a.children[e],b.transformMatrix)},f=0;f<A.length;f++){var I=A[f];z(I)}s.sort(function(c,d){var a=c.zIndex,b=d.zIndex;return a==b?0:a>b?1:-1});for(var G=C.cameraMatrix(),i=function(c){var a=pacem3D.maths.matrix3D.transform(c,G),b=a.z;return{x:a.x/b,y:a.y/b}},j=function(a){var b=v.x+v.width*(a.x+1)*.5,c=v.y+v.height*(a.y+1)*.5;return{x:b,y:c}},f=0;f<s.length;f++){var a=s[f];if(a.node1){var g=j(i(a.node1)),e=j(i(a.node2)),h=j(i(a.node3)),F=(e.x-g.x)*(h.y-e.y)-(h.x-e.x)*(e.y-g.y),l=F>0;if(l&&c.backfaceCulling)continue;var u=l?a.backMaterials:a.materials;if(u.length>0){var D=u[0];D.brush(b,{light:c.light,normal:l?new pacem3D.maths.vector3D(-a.normal.x,-a.normal.y,-a.normal.z):a.normal});b.beginPath();b.moveTo(g.x,g.y);b.lineTo(e.x,e.y);b.lineTo(h.x,h.y);b.closePath();b.fill();a.owner&&a.owner.isHitTestVisible&&this._hitTest(a)}}else if(a.nodes){var t=a.nodes,L=a.nodes.length,g=j(i(t[0])),e=j(i(t[1])),h=j(i(t[2])),F=(e.x-g.x)*(h.y-e.y)-(h.x-e.x)*(e.y-g.y),l=F>0;if(l&&c.backfaceCulling)continue;var u=l?a.backMaterials:a.materials;if(u.length>0){var D=u[0];D.brush(b,{light:c.light,normal:l?new pacem3D.maths.vector3D(-a.normal.x,-a.normal.y,-a.normal.z):a.normal});b.beginPath();b.moveTo(g.x,g.y);b.lineTo(e.x,e.y);b.lineTo(h.x,h.y);for(var x=3;x<L;x++){var E=j(i(t[x]));b.lineTo(E.x,E.y)}b.closePath();b.fill();a.owner&&a.owner.isHitTestVisible&&this._hitTest(a)}}}var r=this._hitTestResults,y=r.length;if(k!=null)if(!y||k!=r[0]){var m=k._mouseoutCallbacks;if(m)for(var p=0;p<m.length;p++)m[p](k,{position:this._lastMousePos});this._lastHitTestResult=k=null}if(y&&k!=r[0]){var w=this._lastHitTestResult=r[0],m=w._mouseoverCallbacks;if(m)for(var p=0;p<m.length;p++)m[p](w,{position:this._lastMousePos})}for(var f=0;f<this._renderedCallbacks.length;f++)this._renderedCallbacks[f].call(c,null)}};pacem3D.engine.viewport3D.prototype._hitTest=function(c){var a=this;if(!a._lastMousePos)return;var b=a._lastMousePos,d=a.context2D,e=d.isPointInPath(b.x,b.y);e&&a._hitTestResults.indexOf(c.owner)==-1&&a._hitTestResults.unshift(c.owner)}
