From 3ef6ae2823e6054e03b08e49eab07fc859c493ff Mon Sep 17 00:00:00 2001 From: kovacsv Date: Mon, 28 Sep 2015 20:46:02 +0200 Subject: [PATCH] Update JSModeler. --- jsmodeler/jsmodeler.js | 420 +++++++++++++++++----------------- jsmodeler/jsmodeler.viewer.js | 6 +- 2 files changed, 215 insertions(+), 211 deletions(-) diff --git a/jsmodeler/jsmodeler.js b/jsmodeler/jsmodeler.js index c8e5faa..e996767 100644 --- a/jsmodeler/jsmodeler.js +++ b/jsmodeler/jsmodeler.js @@ -1,9 +1,9 @@ -/* JSModeler 0.37 - http://www.github.com/kovacsv/JSModeler */ 'use strict';var JSM=function(){this.mainVersion=0;this.subVersion=37};JSM.RandomNumber=function(a,b){return Math.random()*(b-a)+a};JSM.RandomInt=function(a,b){return Math.floor(Math.random()*(b-a+1)+a)};JSM.SeededRandomInt=function(a,b,c){return Math.floor((9301*c+49297)%233280/233280*(b-a+1)+a)};JSM.ValueOrDefault=function(a,b){return void 0===a||null===a?b:a}; +/* JSModeler 0.38 - http://www.github.com/kovacsv/JSModeler */ 'use strict';var JSM=function(){this.mainVersion=0;this.subVersion=38};JSM.RandomNumber=function(a,b){return Math.random()*(b-a)+a};JSM.RandomInt=function(a,b){return Math.floor(Math.random()*(b-a+1)+a)};JSM.SeededRandomInt=function(a,b,c){return Math.floor((9301*c+49297)%233280/233280*(b-a+1)+a)};JSM.ValueOrDefault=function(a,b){return void 0===a||null===a?b:a}; JSM.CopyObjectProperties=function(a,b,c){if(!(void 0===a||null===a||void 0===b||null===b))for(var d in a)if(a.hasOwnProperty(d)&&(c||void 0===b[d]||null===b[d]))b[d]=a[d]};JSM.Assert=function(a,b){if(!a){var c="Assertion failed.";void 0!==b&&null!==b&&(c+=" "+b);alert(c)}};JSM.Timer=function(){this.stop=this.start=0};JSM.Timer.prototype.Start=function(){this.start=(new Date).getTime()};JSM.Timer.prototype.Stop=function(){this.end=(new Date).getTime()}; JSM.Timer.prototype.Result=function(){return this.end-this.start};JSM.FPSCounter=function(){this.current=this.frames=this.start=null};JSM.FPSCounter.prototype.Get=function(a){var b=(new Date).getTime();null===this.start&&(this.start=b,this.current=this.frames=0);if(null===a||void 0===a)a=1E3;this.frames+=1;var c=b-this.start;c>=a&&(this.current=1E3*(this.frames/c),this.start=b,this.frames=0);return parseInt(this.current,10)}; -JSM.BubbleSort=function(a,b){if(!(2>a.length||void 0===b||null===b)){var c,d;for(c=0;ca.length||void 0===b||null===b)){var c,d;for(c=0;cJSM.Eps};JSM.IsNegative=function(a){return a<-JSM.Eps};JSM.IsLower=function(a,b){return b-a>JSM.Eps};JSM.IsGreater=function(a,b){return a-b>JSM.Eps};JSM.IsEqual=function(a,b){return Math.abs(b-a)a?0:Math.sqrt(a)}var l=a.DistanceTo(b),k=b.DistanceTo(c),m=c.DistanceTo(a);a=a.DistanceTo(h);b=b.DistanceTo(h);h=c.DistanceTo(h);c=g(l,k,m);if(JSM.IsZero(c))return d;l=g(l,a,b);k=g(k,b,h);m=g(m,a,h);d=d.Clone().MultiplyScalar(k);e=e.Clone().MultiplyScalar(m);f=f.Clone().MultiplyScalar(l);f=JSM.CoordAdd(JSM.CoordAdd(d,e),f);f.MultiplyScalar(1/c);return f}; +JSM.BarycentricInterpolation=function(a,b,c,d,e,f,g){function h(a,b,c){var d=(a+b+c)/2;a=d*(d-a)*(d-b)*(d-c);return 0>a?0:Math.sqrt(a)}var l=a.DistanceTo(b),k=b.DistanceTo(c),m=c.DistanceTo(a);a=a.DistanceTo(g);b=b.DistanceTo(g);g=c.DistanceTo(g);c=h(l,k,m);if(JSM.IsZero(c))return d;l=h(l,a,b);k=h(k,b,g);m=h(m,a,g);d=d.Clone().MultiplyScalar(k);e=e.Clone().MultiplyScalar(m);f=f.Clone().MultiplyScalar(l);f=JSM.CoordAdd(JSM.CoordAdd(d,e),f);f.MultiplyScalar(1/c);return f}; JSM.MatrixIdentity=function(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]};JSM.MatrixClone=function(a){var b=[];b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return b}; -JSM.MatrixTranspose=function(a){var b=[];b[0]=a[0];b[1]=a[4];b[2]=a[8];b[3]=a[12];b[4]=a[1];b[5]=a[5];b[6]=a[9];b[7]=a[13];b[8]=a[2];b[9]=a[6];b[10]=a[10];b[11]=a[14];b[12]=a[3];b[13]=a[7];b[14]=a[11];b[15]=a[15];return b};JSM.MatrixVectorMultiply=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],h=a[1],g=a[2],l=a[3],k=a[5],m=a[6],n=a[7],p=a[9],q=a[10],t=a[11],s=a[13],w=a[14],u=a[15],r=[];r[0]=c*a[0]+d*a[4]+e*a[8]+f*a[12];r[1]=c*h+d*k+e*p+f*s;r[2]=c*g+d*m+e*q+f*w;r[3]=c*l+d*n+e*t+f*u;return r}; -JSM.MatrixMultiply=function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],h=a[4],g=a[5],l=a[6],k=a[7],m=a[8],n=a[9],p=a[10],q=a[11],t=a[12],s=a[13],w=a[14],u=a[15],r=b[0],v=b[1],C=b[2],D=b[3],y=b[4],x=b[5],F=b[6],K=b[7],L=b[8],H=b[9],z=b[10],B=b[11],N=b[12],O=b[13],J=b[14],I=b[15],E=[];E[0]=c*r+d*y+e*L+f*N;E[1]=c*v+d*x+e*H+f*O;E[2]=c*C+d*F+e*z+f*J;E[3]=c*D+d*K+e*B+f*I;E[4]=h*r+g*y+l*L+k*N;E[5]=h*v+g*x+l*H+k*O;E[6]=h*C+g*F+l*z+k*J;E[7]=h*D+g*K+l*B+k*I;E[8]=m*r+n*y+p*L+q*N;E[9]=m*v+n*x+p*H+q*O;E[10]=m*C+n*F+ -p*z+q*J;E[11]=m*D+n*K+p*B+q*I;E[12]=t*r+s*y+w*L+u*N;E[13]=t*v+s*x+w*H+u*O;E[14]=t*C+s*F+w*z+u*J;E[15]=t*D+s*K+w*B+u*I;return E};JSM.MatrixDeterminant=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],h=a[5],g=a[6],l=a[7],k=a[8],m=a[9],n=a[10],p=a[11],q=a[12],t=a[13],s=a[14];a=a[15];return(b*h-c*f)*(n*a-p*s)-(b*g-d*f)*(m*a-p*t)+(b*l-e*f)*(m*s-n*t)+(c*g-d*h)*(k*a-p*q)-(c*l-e*h)*(k*s-n*q)+(d*l-e*g)*(k*t-m*q)}; -JSM.MatrixInvert=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],h=a[5],g=a[6],l=a[7],k=a[8],m=a[9],n=a[10],p=a[11],q=a[12],t=a[13],s=a[14];a=a[15];var w=b*h-c*f,u=b*g-d*f,r=b*l-e*f,v=c*g-d*h,C=c*l-e*h,D=d*l-e*g,y=k*t-m*q,x=k*s-n*q,F=k*a-p*q,K=m*s-n*t,L=m*a-p*t,H=n*a-p*s,z=w*H-u*L+r*K+v*F-C*x+D*y;if(JSM.IsZero(z))return null;var B=[];B[0]=(h*H-g*L+l*K)/z;B[1]=(d*L-c*H-e*K)/z;B[2]=(t*D-s*C+a*v)/z;B[3]=(n*C-m*D-p*v)/z;B[4]=(g*F-f*H-l*x)/z;B[5]=(b*H-d*F+e*x)/z;B[6]=(s*r-q*D-a*u)/z;B[7]=(k*D-n*r+p* -u)/z;B[8]=(f*L-h*F+l*y)/z;B[9]=(c*F-b*L-e*y)/z;B[10]=(q*C-t*r+a*w)/z;B[11]=(m*r-k*C-p*w)/z;B[12]=(h*x-f*K-g*y)/z;B[13]=(b*K-c*x+d*y)/z;B[14]=(t*u-q*v-s*w)/z;B[15]=(k*v-m*u+n*w)/z;return B};JSM.MatrixTranslation=function(a,b,c){var d=[1,0,0,0,0,1,0,0,0,0,1,0];d[12]=a;d[13]=b;d[14]=c;d[15]=1;return d}; -JSM.MatrixRotation=function(a,b,c){var d=a.Clone().Normalize();a=d.x;var e=d.y,d=d.z,f=a*a,h=e*e,g=d*d,l=Math.sin(b);b=Math.cos(b);var k=[];if(void 0===c||null===c)k[0]=f+(h+g)*b,k[1]=a*e*(1-b)+d*l,k[2]=a*d*(1-b)-e*l,k[3]=0,k[4]=a*e*(1-b)-d*l,k[5]=h+(f+g)*b,k[6]=e*d*(1-b)+a*l,k[7]=0,k[8]=a*d*(1-b)+e*l,k[9]=e*d*(1-b)-a*l,k[10]=g+(f+h)*b,k[11]=0,k[12]=0,k[13]=0,k[14]=0;else{var m=c.x,n=c.y;c=c.z;k[0]=f+(h+g)*b;k[1]=a*e*(1-b)+d*l;k[2]=a*d*(1-b)-e*l;k[3]=0;k[4]=a*e*(1-b)-d*l;k[5]=h+(f+g)*b;k[6]=e*d*(1- -b)+a*l;k[7]=0;k[8]=a*d*(1-b)+e*l;k[9]=e*d*(1-b)-a*l;k[10]=g+(f+h)*b;k[11]=0;k[12]=(m*(h+g)-a*(n*e+c*d))*(1-b)+(n*d-c*e)*l;k[13]=(n*(f+g)-e*(m*a+c*d))*(1-b)+(c*a-m*d)*l;k[14]=(c*(f+h)-d*(m*a+n*e))*(1-b)+(m*e-n*a)*l}k[15]=1;return k}; -JSM.MatrixRotationQuaternion=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=b+b,h=c+c,g=d+d;a=b*f;var l=b*h,b=b*g,k=c*h,c=c*g,d=d*g,f=e*f,h=e*h,e=e*g,g=[];g[0]=1-(k+d);g[1]=l+e;g[2]=b-h;g[3]=0;g[4]=l-e;g[5]=1-(a+d);g[6]=c+f;g[7]=0;g[8]=b+h;g[9]=c-f;g[10]=1-(a+k);g[11]=0;g[12]=0;g[13]=0;g[14]=0;g[15]=1;return g};JSM.MatrixRotationX=function(a){var b=Math.sin(a);a=Math.cos(a);var c=[1,0,0,0,0];c[5]=a;c[6]=b;c[7]=0;c[8]=0;c[9]=-b;c[10]=a;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return c}; +JSM.MatrixTranspose=function(a){var b=[];b[0]=a[0];b[1]=a[4];b[2]=a[8];b[3]=a[12];b[4]=a[1];b[5]=a[5];b[6]=a[9];b[7]=a[13];b[8]=a[2];b[9]=a[6];b[10]=a[10];b[11]=a[14];b[12]=a[3];b[13]=a[7];b[14]=a[11];b[15]=a[15];return b};JSM.MatrixVectorMultiply=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=a[1],h=a[2],l=a[3],k=a[5],m=a[6],n=a[7],p=a[9],q=a[10],t=a[11],s=a[13],w=a[14],u=a[15],r=[];r[0]=c*a[0]+d*a[4]+e*a[8]+f*a[12];r[1]=c*g+d*k+e*p+f*s;r[2]=c*h+d*m+e*q+f*w;r[3]=c*l+d*n+e*t+f*u;return r}; +JSM.MatrixMultiply=function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],g=a[4],h=a[5],l=a[6],k=a[7],m=a[8],n=a[9],p=a[10],q=a[11],t=a[12],s=a[13],w=a[14],u=a[15],r=b[0],v=b[1],C=b[2],D=b[3],y=b[4],x=b[5],F=b[6],K=b[7],L=b[8],H=b[9],z=b[10],B=b[11],N=b[12],O=b[13],J=b[14],I=b[15],E=[];E[0]=c*r+d*y+e*L+f*N;E[1]=c*v+d*x+e*H+f*O;E[2]=c*C+d*F+e*z+f*J;E[3]=c*D+d*K+e*B+f*I;E[4]=g*r+h*y+l*L+k*N;E[5]=g*v+h*x+l*H+k*O;E[6]=g*C+h*F+l*z+k*J;E[7]=g*D+h*K+l*B+k*I;E[8]=m*r+n*y+p*L+q*N;E[9]=m*v+n*x+p*H+q*O;E[10]=m*C+n*F+ +p*z+q*J;E[11]=m*D+n*K+p*B+q*I;E[12]=t*r+s*y+w*L+u*N;E[13]=t*v+s*x+w*H+u*O;E[14]=t*C+s*F+w*z+u*J;E[15]=t*D+s*K+w*B+u*I;return E};JSM.MatrixDeterminant=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7],k=a[8],m=a[9],n=a[10],p=a[11],q=a[12],t=a[13],s=a[14];a=a[15];return(b*g-c*f)*(n*a-p*s)-(b*h-d*f)*(m*a-p*t)+(b*l-e*f)*(m*s-n*t)+(c*h-d*g)*(k*a-p*q)-(c*l-e*g)*(k*s-n*q)+(d*l-e*h)*(k*t-m*q)}; +JSM.MatrixInvert=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7],k=a[8],m=a[9],n=a[10],p=a[11],q=a[12],t=a[13],s=a[14];a=a[15];var w=b*g-c*f,u=b*h-d*f,r=b*l-e*f,v=c*h-d*g,C=c*l-e*g,D=d*l-e*h,y=k*t-m*q,x=k*s-n*q,F=k*a-p*q,K=m*s-n*t,L=m*a-p*t,H=n*a-p*s,z=w*H-u*L+r*K+v*F-C*x+D*y;if(JSM.IsZero(z))return null;var B=[];B[0]=(g*H-h*L+l*K)/z;B[1]=(d*L-c*H-e*K)/z;B[2]=(t*D-s*C+a*v)/z;B[3]=(n*C-m*D-p*v)/z;B[4]=(h*F-f*H-l*x)/z;B[5]=(b*H-d*F+e*x)/z;B[6]=(s*r-q*D-a*u)/z;B[7]=(k*D-n*r+p* +u)/z;B[8]=(f*L-g*F+l*y)/z;B[9]=(c*F-b*L-e*y)/z;B[10]=(q*C-t*r+a*w)/z;B[11]=(m*r-k*C-p*w)/z;B[12]=(g*x-f*K-h*y)/z;B[13]=(b*K-c*x+d*y)/z;B[14]=(t*u-q*v-s*w)/z;B[15]=(k*v-m*u+n*w)/z;return B};JSM.MatrixTranslation=function(a,b,c){var d=[1,0,0,0,0,1,0,0,0,0,1,0];d[12]=a;d[13]=b;d[14]=c;d[15]=1;return d}; +JSM.MatrixRotation=function(a,b,c){var d=a.Clone().Normalize();a=d.x;var e=d.y,d=d.z,f=a*a,g=e*e,h=d*d,l=Math.sin(b);b=Math.cos(b);var k=[];if(void 0===c||null===c)k[0]=f+(g+h)*b,k[1]=a*e*(1-b)+d*l,k[2]=a*d*(1-b)-e*l,k[3]=0,k[4]=a*e*(1-b)-d*l,k[5]=g+(f+h)*b,k[6]=e*d*(1-b)+a*l,k[7]=0,k[8]=a*d*(1-b)+e*l,k[9]=e*d*(1-b)-a*l,k[10]=h+(f+g)*b,k[11]=0,k[12]=0,k[13]=0,k[14]=0;else{var m=c.x,n=c.y;c=c.z;k[0]=f+(g+h)*b;k[1]=a*e*(1-b)+d*l;k[2]=a*d*(1-b)-e*l;k[3]=0;k[4]=a*e*(1-b)-d*l;k[5]=g+(f+h)*b;k[6]=e*d*(1- +b)+a*l;k[7]=0;k[8]=a*d*(1-b)+e*l;k[9]=e*d*(1-b)-a*l;k[10]=h+(f+g)*b;k[11]=0;k[12]=(m*(g+h)-a*(n*e+c*d))*(1-b)+(n*d-c*e)*l;k[13]=(n*(f+h)-e*(m*a+c*d))*(1-b)+(c*a-m*d)*l;k[14]=(c*(f+g)-d*(m*a+n*e))*(1-b)+(m*e-n*a)*l}k[15]=1;return k}; +JSM.MatrixRotationQuaternion=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=b+b,g=c+c,h=d+d;a=b*f;var l=b*g,b=b*h,k=c*g,c=c*h,d=d*h,f=e*f,g=e*g,e=e*h,h=[];h[0]=1-(k+d);h[1]=l+e;h[2]=b-g;h[3]=0;h[4]=l-e;h[5]=1-(a+d);h[6]=c+f;h[7]=0;h[8]=b+g;h[9]=c-f;h[10]=1-(a+k);h[11]=0;h[12]=0;h[13]=0;h[14]=0;h[15]=1;return h};JSM.MatrixRotationX=function(a){var b=Math.sin(a);a=Math.cos(a);var c=[1,0,0,0,0];c[5]=a;c[6]=b;c[7]=0;c[8]=0;c[9]=-b;c[10]=a;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return c}; JSM.MatrixRotationY=function(a){var b=Math.sin(a);a=Math.cos(a);var c=[];c[0]=a;c[1]=0;c[2]=-b;c[3]=0;c[4]=0;c[5]=1;c[6]=0;c[7]=0;c[8]=b;c[9]=0;c[10]=a;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return c};JSM.MatrixRotationZ=function(a){var b=Math.sin(a);a=Math.cos(a);var c=[];c[0]=a;c[1]=b;c[2]=0;c[3]=0;c[4]=-b;c[5]=a;c[6]=0;c[7]=0;c[8]=0;c[9]=0;c[10]=1;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return c}; JSM.MatrixView=function(a,b,c){if(a.IsEqual(b))return JSM.MatrixIdentity();var d=[];b=JSM.CoordSub(a,b).Normalize();c=JSM.VectorCross(c,b).Normalize();var e=JSM.VectorCross(b,c).Normalize();d[0]=c.x;d[1]=e.x;d[2]=b.x;d[3]=0;d[4]=c.y;d[5]=e.y;d[6]=b.y;d[7]=0;d[8]=c.z;d[9]=e.z;d[10]=b.z;d[11]=0;d[12]=-JSM.VectorDot(c,a);d[13]=-JSM.VectorDot(e,a);d[14]=-JSM.VectorDot(b,a);d[15]=1;return d}; JSM.MatrixPerspective=function(a,b,c,d){var e=[];a=1/Math.tan(a/2);var f=1/(c-d);e[0]=a/b;e[1]=0;e[2]=0;e[3]=0;e[4]=0;e[5]=a;e[6]=0;e[7]=0;e[8]=0;e[9]=0;e[10]=(d+c)*f;e[11]=-1;e[12]=0;e[13]=0;e[14]=2*d*c*f;e[15]=0;return e};JSM.ApplyTransformation=function(a,b){var c=[];c[0]=b.x;c[1]=b.y;c[2]=b.z;c[3]=1;c=JSM.MatrixVectorMultiply(a,c);return new JSM.Coord(c[0],c[1],c[2])};JSM.CoordSystem=function(a,b,c,d){this.origo=a;this.e1=b;this.e2=c;this.e3=d}; JSM.CoordSystem.prototype.Set=function(a,b,c,d){this.origo=a;this.e1=b;this.e2=c;this.e3=d};JSM.CoordSystem.prototype.ToDirectionVectors=function(){this.e1=JSM.CoordSub(this.e1,this.origo);this.e2=JSM.CoordSub(this.e2,this.origo);this.e3=JSM.CoordSub(this.e3,this.origo);return this};JSM.CoordSystem.prototype.ToAbsoluteCoords=function(){this.e1=JSM.CoordAdd(this.e1,this.origo);this.e2=JSM.CoordAdd(this.e2,this.origo);this.e3=JSM.CoordAdd(this.e3,this.origo);return this}; JSM.CoordSystem.prototype.Clone=function(){return new JSM.CoordSystem(this.origo.Clone(),this.e1.Clone(),this.e2.Clone(),this.e3.Clone())};JSM.CoordSectorPosition2D={CoordInsideOfSector:0,CoordOnSectorEndCoord:1,CoordOutsideOfSector:2};JSM.SectorSectorPosition2D={SectorsDontIntersect:0,SectorsIntersectCoincident:1,SectorsIntersectEndPoint:2,SectorsIntersectOnePoint:3};JSM.CoordSectorPosition={CoordInsideOfSector:0,CoordOnSectorEndCoord:1,CoordOutsideOfSector:2}; JSM.Sector2D=function(a,b){this.beg=a;this.end=b};JSM.Sector2D.prototype.Set=function(a,b){this.beg=a;this.end=b};JSM.Sector2D.prototype.GetLength=function(){return this.beg.DistanceTo(this.end)}; -JSM.Sector2D.prototype.CoordPosition=function(a){var b=a.x,c=a.y,d=this.beg.x,e=this.beg.y,f=this.end.x,h=this.end.y,g=this.GetLength();if(JSM.IsZero(g))return a.IsEqual(this.beg)?JSM.CoordSectorPosition2D.CoordOnSectorEndCoord:JSM.CoordSectorPosition2D.CoordOutsideOfSector;a=((b-d)*(f-d)+(c-e)*(h-e))/(g*g);if(JSM.IsLower(a,0)||JSM.IsGreater(a,1))return JSM.CoordSectorPosition2D.CoordOutsideOfSector;e+=a*(h-e);return!JSM.IsEqual(d+a*(f-d),b)||!JSM.IsEqual(e,c)?JSM.CoordSectorPosition2D.CoordOutsideOfSector: +JSM.Sector2D.prototype.CoordPosition=function(a){var b=a.x,c=a.y,d=this.beg.x,e=this.beg.y,f=this.end.x,g=this.end.y,h=this.GetLength();if(JSM.IsZero(h))return a.IsEqual(this.beg)?JSM.CoordSectorPosition2D.CoordOnSectorEndCoord:JSM.CoordSectorPosition2D.CoordOutsideOfSector;a=((b-d)*(f-d)+(c-e)*(g-e))/(h*h);if(JSM.IsLower(a,0)||JSM.IsGreater(a,1))return JSM.CoordSectorPosition2D.CoordOutsideOfSector;e+=a*(g-e);return!JSM.IsEqual(d+a*(f-d),b)||!JSM.IsEqual(e,c)?JSM.CoordSectorPosition2D.CoordOutsideOfSector: JSM.IsEqual(a,0)||JSM.IsEqual(a,1)?JSM.CoordSectorPosition2D.CoordOnSectorEndCoord:JSM.CoordSectorPosition2D.CoordInsideOfSector}; -JSM.Sector2D.prototype.SectorPosition=function(a,b){function c(a,b,c){return!c.IsEqual(a)&&!c.IsEqual(b)&&JSM.IsLowerOrEqual(c.x,Math.max(a.x,b.x))&&JSM.IsLowerOrEqual(c.y,Math.max(a.y,b.y))&&JSM.IsGreaterOrEqual(c.x,Math.min(a.x,b.x))&&JSM.IsGreaterOrEqual(c.y,Math.min(a.y,b.y))?!0:!1}var d=void 0!==b&&null!==b,e=this.beg,f=this.end,h=a.beg,g=a.end,l=e.IsEqual(h)||e.IsEqual(g),k=f.IsEqual(h)||f.IsEqual(g);if(l&&k)return JSM.SectorSectorPosition2D.SectorsIntersectCoincident;var m=e.x,n=e.y,p=f.x, -q=f.y,t=h.x,s=h.y,w=g.x,u=g.y,r=(w-t)*(n-s)-(u-s)*(m-t),v=(p-m)*(n-s)-(q-n)*(m-t),t=(u-s)*(p-m)-(w-t)*(q-n);if(JSM.IsZero(t)){if(JSM.IsZero(r)&&JSM.IsZero(v)){if(c(e,f,h)||c(e,f,g)||c(h,g,e)||c(h,g,f))return JSM.SectorSectorPosition2D.SectorsIntersectCoincident;if(l)return d&&(b.x=e.x,b.y=e.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;if(k)return d&&(b.x=f.x,b.y=f.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint}return JSM.SectorSectorPosition2D.SectorsDontIntersect}h=r/t;v/=t;if(JSM.IsLower(h, -0)||JSM.IsGreater(h,1)||JSM.IsLower(v,0)||JSM.IsGreater(v,1))return JSM.SectorSectorPosition2D.SectorsDontIntersect;if(l)return d&&(b.x=e.x,b.y=e.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;if(k)return d&&(b.x=f.x,b.y=f.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;d&&(b.x=m+h*(p-m),b.y=n+h*(q-n));return JSM.SectorSectorPosition2D.SectorsIntersectOnePoint}; -JSM.Sector2D.prototype.ProjectCoord=function(a){var b=a.x,c=a.y;a=this.beg;var d=this.end,e=a.x,f=a.y,h=d.x,g=d.y,l=(h-e)*(h-e)+(g-f)*(g-f);if(JSM.IsZero(l))return a.Clone();b=((h-e)*(b-e)+(g-f)*(c-f))/l;if(JSM.IsLower(b,0))return a.Clone();if(JSM.IsGreater(b,1))return d.Clone();b=JSM.CoordSub2D(d,a).MultiplyScalar(b);return JSM.CoordAdd2D(a,b)};JSM.Sector2D.prototype.Clone=function(){return new JSM.Sector2D(this.beg.Clone(),this.end.Clone())};JSM.Sector=function(a,b){this.beg=a;this.end=b}; +JSM.Sector2D.prototype.SectorPosition=function(a,b){function c(a,b,c){return!c.IsEqual(a)&&!c.IsEqual(b)&&JSM.IsLowerOrEqual(c.x,Math.max(a.x,b.x))&&JSM.IsLowerOrEqual(c.y,Math.max(a.y,b.y))&&JSM.IsGreaterOrEqual(c.x,Math.min(a.x,b.x))&&JSM.IsGreaterOrEqual(c.y,Math.min(a.y,b.y))?!0:!1}var d=void 0!==b&&null!==b,e=this.beg,f=this.end,g=a.beg,h=a.end,l=e.IsEqual(g)||e.IsEqual(h),k=f.IsEqual(g)||f.IsEqual(h);if(l&&k)return JSM.SectorSectorPosition2D.SectorsIntersectCoincident;var m=e.x,n=e.y,p=f.x, +q=f.y,t=g.x,s=g.y,w=h.x,u=h.y,r=(w-t)*(n-s)-(u-s)*(m-t),v=(p-m)*(n-s)-(q-n)*(m-t),t=(u-s)*(p-m)-(w-t)*(q-n);if(JSM.IsZero(t)){if(JSM.IsZero(r)&&JSM.IsZero(v)){if(c(e,f,g)||c(e,f,h)||c(g,h,e)||c(g,h,f))return JSM.SectorSectorPosition2D.SectorsIntersectCoincident;if(l)return d&&(b.x=e.x,b.y=e.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;if(k)return d&&(b.x=f.x,b.y=f.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint}return JSM.SectorSectorPosition2D.SectorsDontIntersect}g=r/t;v/=t;if(JSM.IsLower(g, +0)||JSM.IsGreater(g,1)||JSM.IsLower(v,0)||JSM.IsGreater(v,1))return JSM.SectorSectorPosition2D.SectorsDontIntersect;if(l)return d&&(b.x=e.x,b.y=e.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;if(k)return d&&(b.x=f.x,b.y=f.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;d&&(b.x=m+g*(p-m),b.y=n+g*(q-n));return JSM.SectorSectorPosition2D.SectorsIntersectOnePoint}; +JSM.Sector2D.prototype.ProjectCoord=function(a){var b=a.x,c=a.y;a=this.beg;var d=this.end,e=a.x,f=a.y,g=d.x,h=d.y,l=(g-e)*(g-e)+(h-f)*(h-f);if(JSM.IsZero(l))return a.Clone();b=((g-e)*(b-e)+(h-f)*(c-f))/l;if(JSM.IsLower(b,0))return a.Clone();if(JSM.IsGreater(b,1))return d.Clone();b=JSM.CoordSub2D(d,a).MultiplyScalar(b);return JSM.CoordAdd2D(a,b)};JSM.Sector2D.prototype.Clone=function(){return new JSM.Sector2D(this.beg.Clone(),this.end.Clone())};JSM.Sector=function(a,b){this.beg=a;this.end=b}; JSM.Sector.prototype.Set=function(a,b){this.beg=a;this.end=b};JSM.Sector.prototype.GetLength=function(){return this.beg.DistanceTo(this.end)}; -JSM.Sector.prototype.CoordPosition=function(a){var b=a.x,c=a.y,d=a.z,e=this.beg,f=JSM.CoordSub(this.end,this.beg),h=e.x,g=e.y,l=e.z,k=e.x+f.x,m=e.y+f.y,n=e.z+f.z,p=(k-h)*(k-h)+(m-g)*(m-g)+(n-l)*(n-l);if(JSM.IsZero(p))return e.IsEqual(a)?JSM.CoordSectorPosition.CoordOnSectorEndCoord:JSM.CoordSectorPosition.CoordOutsideOfSector;b=((k-h)*(b-h)+(m-g)*(c-g)+(n-l)*(d-l))/p;f=f.Clone().MultiplyScalar(b);e=JSM.CoordAdd(e,f);a=a.DistanceTo(e);return JSM.IsZero(a)?JSM.IsLower(b,0)||JSM.IsGreater(b,1)?JSM.CoordSectorPosition.CoordOutsideOfSector: -JSM.IsEqual(b,0)||JSM.IsEqual(b,1)?JSM.CoordSectorPosition.CoordOnSectorEndCoord:JSM.CoordSectorPosition.CoordInsideOfSector:JSM.CoordSectorPosition.CoordOutsideOfSector};JSM.Sector.prototype.Clone=function(){return new JSM.Sector(this.beg.Clone(),this.end.Clone())};JSM.GetSectorSegmentation=function(a,b,c){var d=JSM.CoordSub(a.end,a.beg),e=a.beg.DistanceTo(a.end)/b,f=0,h,g;for(h=0;h<=b;h++)g=a.beg.Clone().Offset(d,f),c.push(g),f+=e};JSM.CoordLinePosition2D={CoordOnLine:0,CoordAtLineLeft:1,CoordAtLineRight:2}; +JSM.Sector.prototype.CoordPosition=function(a){var b=a.x,c=a.y,d=a.z,e=this.beg,f=JSM.CoordSub(this.end,this.beg),g=e.x,h=e.y,l=e.z,k=e.x+f.x,m=e.y+f.y,n=e.z+f.z,p=(k-g)*(k-g)+(m-h)*(m-h)+(n-l)*(n-l);if(JSM.IsZero(p))return e.IsEqual(a)?JSM.CoordSectorPosition.CoordOnSectorEndCoord:JSM.CoordSectorPosition.CoordOutsideOfSector;b=((k-g)*(b-g)+(m-h)*(c-h)+(n-l)*(d-l))/p;f=f.Clone().MultiplyScalar(b);e=JSM.CoordAdd(e,f);a=a.DistanceTo(e);return JSM.IsZero(a)?JSM.IsLower(b,0)||JSM.IsGreater(b,1)?JSM.CoordSectorPosition.CoordOutsideOfSector: +JSM.IsEqual(b,0)||JSM.IsEqual(b,1)?JSM.CoordSectorPosition.CoordOnSectorEndCoord:JSM.CoordSectorPosition.CoordInsideOfSector:JSM.CoordSectorPosition.CoordOutsideOfSector};JSM.Sector.prototype.Clone=function(){return new JSM.Sector(this.beg.Clone(),this.end.Clone())};JSM.GetSectorSegmentation=function(a,b,c){var d=JSM.CoordSub(a.end,a.beg),e=a.beg.DistanceTo(a.end)/b,f=0,g,h;for(g=0;g<=b;g++)h=a.beg.Clone().Offset(d,f),c.push(h),f+=e};JSM.CoordLinePosition2D={CoordOnLine:0,CoordAtLineLeft:1,CoordAtLineRight:2}; JSM.CoordLinePosition={CoordOnLine:0,CoordOutsideOfLine:1};JSM.LineLinePosition={LinesDontIntersect:0,LinesIntersectsOnePoint:1,LinesIntersectsCoincident:2};JSM.Line2D=function(a,b){this.start=a;this.direction=b};JSM.Line2D.prototype.Set=function(a,b){this.start=a;this.direction=b}; JSM.Line2D.prototype.CoordPosition=function(a){var b=this.start,c=this.direction;a=c.x*(a.y-b.y)-c.y*(a.x-b.x);return JSM.IsPositive(a)?JSM.CoordLinePosition2D.CoordAtLineLeft:JSM.IsNegative(a)?JSM.CoordLinePosition2D.CoordAtLineRight:JSM.CoordLinePosition2D.CoordOnLine};JSM.Line2D.prototype.Clone=function(){return new JSM.Line2D(this.start.Clone(),this.direction.Clone())};JSM.Line=function(a,b){this.start=a;this.direction=b};JSM.Line.prototype.Set=function(a,b){this.start=a;this.direction=b}; -JSM.Line.prototype.CoordPosition=function(a,b){var c=a.x,d=a.y,e=a.z,f=this.start,h=this.direction,g=f.x,l=f.y,k=f.z,m=f.x+h.x,n=f.y+h.y,p=f.z+h.z,q=(m-g)*(m-g)+(n-l)*(n-l)+(p-k)*(p-k);if(JSM.IsZero(q))return void 0!==b&&b.Set(f.x,f.y,f.z),f.IsEqual(a)?JSM.CoordLinePosition.CoordOnLine:JSM.CoordLinePosition.CoordOutsideOfLine;c=h.Clone().MultiplyScalar(((m-g)*(c-g)+(n-l)*(d-l)+(p-k)*(e-k))/q);f=JSM.CoordAdd(f,c);void 0!==b&&b.Set(f.x,f.y,f.z);f=a.DistanceTo(f);return JSM.IsZero(f)?JSM.CoordLinePosition.CoordOnLine: -JSM.CoordLinePosition.CoordOutsideOfLine};JSM.Line.prototype.ProjectCoord=function(a){var b=a.x,c=a.y,d=a.z;a=this.start;var e=this.direction,f=a.x,h=a.y,g=a.z,l=a.x+e.x,k=a.y+e.y,m=a.z+e.z,n=(l-f)*(l-f)+(k-h)*(k-h)+(m-g)*(m-g);if(JSM.IsZero(n))return a.Clone();b=e.Clone().MultiplyScalar(((l-f)*(b-f)+(k-h)*(c-h)+(m-g)*(d-g))/n);return JSM.CoordAdd(a,b)}; -JSM.Line.prototype.ClosestPoint=function(a,b,c){function d(a,b,c,d,e){return(a[b].x-a[c].x)*(a[d].x-a[e].x)+(a[b].y-a[c].y)*(a[d].y-a[e].y)+(a[b].z-a[c].z)*(a[d].z-a[e].z)}var e=this.direction.Clone().Normalize(),f=this.start,h=JSM.CoordAdd(f,e),g=a.direction.Clone().Normalize();a=a.start;var l=JSM.CoordAdd(a,g),k=[f,h,a,l],m=d(k,1,0,1,0),n=d(k,0,2,1,0),h=d(k,0,2,3,2),l=d(k,3,2,1,0),k=d(k,3,2,3,2),m=m*k-l*l;if(JSM.IsEqual(m,0))return!1;n=(h*l-n*k)/m;h=(h+n*l)/k;void 0!==b&&(e.MultiplyScalar(n),e= -JSM.CoordAdd(f,e),b.Set(e.x,e.y,e.z));void 0!==c&&(g.MultiplyScalar(h),b=JSM.CoordAdd(a,g),c.Set(b.x,b.y,b.z));return!0};JSM.Line.prototype.LinePosition=function(a,b){var c=new JSM.Coord(0,0,0),d=new JSM.Coord(0,0,0);return!this.ClosestPoint(a,c,d)?JSM.LineLinePosition.LinesIntersectsCoincident:c.IsEqual(d)?(void 0!==b&&b.Set(c.x,c.y,c.z),JSM.LineLinePosition.LinesIntersectsOnePoint):JSM.LineLinePosition.LinesDontIntersect}; +JSM.Line.prototype.CoordPosition=function(a,b){var c=a.x,d=a.y,e=a.z,f=this.start,g=this.direction,h=f.x,l=f.y,k=f.z,m=f.x+g.x,n=f.y+g.y,p=f.z+g.z,q=(m-h)*(m-h)+(n-l)*(n-l)+(p-k)*(p-k);if(JSM.IsZero(q))return void 0!==b&&b.Set(f.x,f.y,f.z),f.IsEqual(a)?JSM.CoordLinePosition.CoordOnLine:JSM.CoordLinePosition.CoordOutsideOfLine;c=g.Clone().MultiplyScalar(((m-h)*(c-h)+(n-l)*(d-l)+(p-k)*(e-k))/q);f=JSM.CoordAdd(f,c);void 0!==b&&b.Set(f.x,f.y,f.z);f=a.DistanceTo(f);return JSM.IsZero(f)?JSM.CoordLinePosition.CoordOnLine: +JSM.CoordLinePosition.CoordOutsideOfLine};JSM.Line.prototype.ProjectCoord=function(a){var b=a.x,c=a.y,d=a.z;a=this.start;var e=this.direction,f=a.x,g=a.y,h=a.z,l=a.x+e.x,k=a.y+e.y,m=a.z+e.z,n=(l-f)*(l-f)+(k-g)*(k-g)+(m-h)*(m-h);if(JSM.IsZero(n))return a.Clone();b=e.Clone().MultiplyScalar(((l-f)*(b-f)+(k-g)*(c-g)+(m-h)*(d-h))/n);return JSM.CoordAdd(a,b)}; +JSM.Line.prototype.ClosestPoint=function(a,b,c){function d(a,b,c,d,e){return(a[b].x-a[c].x)*(a[d].x-a[e].x)+(a[b].y-a[c].y)*(a[d].y-a[e].y)+(a[b].z-a[c].z)*(a[d].z-a[e].z)}var e=this.direction.Clone().Normalize(),f=this.start,g=JSM.CoordAdd(f,e),h=a.direction.Clone().Normalize();a=a.start;var l=JSM.CoordAdd(a,h),k=[f,g,a,l],m=d(k,1,0,1,0),n=d(k,0,2,1,0),g=d(k,0,2,3,2),l=d(k,3,2,1,0),k=d(k,3,2,3,2),m=m*k-l*l;if(JSM.IsEqual(m,0))return!1;n=(g*l-n*k)/m;g=(g+n*l)/k;void 0!==b&&(e.MultiplyScalar(n),e= +JSM.CoordAdd(f,e),b.Set(e.x,e.y,e.z));void 0!==c&&(h.MultiplyScalar(g),b=JSM.CoordAdd(a,h),c.Set(b.x,b.y,b.z));return!0};JSM.Line.prototype.LinePosition=function(a,b){var c=new JSM.Coord(0,0,0),d=new JSM.Coord(0,0,0);return!this.ClosestPoint(a,c,d)?JSM.LineLinePosition.LinesIntersectsCoincident:c.IsEqual(d)?(void 0!==b&&b.Set(c.x,c.y,c.z),JSM.LineLinePosition.LinesIntersectsOnePoint):JSM.LineLinePosition.LinesDontIntersect}; JSM.Line.prototype.Clone=function(){return new JSM.Line(this.start.Clone(),this.direction.Clone())};JSM.Box2D=function(a,b){this.min=a;this.max=b};JSM.Box2D.prototype.Set=function(a,b){this.min=a;this.max=b};JSM.Box2D.prototype.GetCenter=function(){return JSM.MidCoord2D(this.min,this.max)};JSM.Box2D.prototype.Clone=function(){return new JSM.Box2D(this.min.Clone(),this.max.Clone())};JSM.Box=function(a,b){this.min=a;this.max=b};JSM.Box.prototype.Set=function(a,b){this.min=a;this.max=b}; JSM.Box.prototype.GetCenter=function(){return JSM.MidCoord(this.min,this.max)};JSM.Box.prototype.GetSize=function(){return JSM.CoordSub(this.max,this.min)};JSM.Box.prototype.IsCoordInside=function(a){return JSM.IsLower(a.x,this.min.x)||JSM.IsLower(a.y,this.min.y)||JSM.IsLower(a.z,this.min.z)||JSM.IsGreater(a.x,this.max.x)||JSM.IsGreater(a.y,this.max.y)||JSM.IsGreater(a.z,this.max.z)?!1:!0};JSM.Box.prototype.Clone=function(){return new JSM.Box(this.min.Clone(),this.max.Clone())}; JSM.BoxUnion=function(a,b){var c=new JSM.Coord(JSM.Minimum(a.min.x,b.min.x),JSM.Minimum(a.min.y,b.min.y),JSM.Minimum(a.min.z,b.min.z)),d=new JSM.Coord(JSM.Maximum(a.max.x,b.max.x),JSM.Maximum(a.max.y,b.max.y),JSM.Maximum(a.max.z,b.max.z));return new JSM.Box(c,d)};JSM.Sphere=function(a,b){this.center=a;this.radius=b};JSM.Sphere.prototype.Set=function(a,b){this.center=a;this.radius=b};JSM.Sphere.prototype.GetCenter=function(){return this.center};JSM.Sphere.prototype.GetRadius=function(){return this.radius}; @@ -63,18 +63,18 @@ JSM.RotationYTransformation=function(a,b){var c=new JSM.Transformation;void 0=== JSM.RotationZTransformation=function(a,b){var c=new JSM.Transformation;void 0===b||null===b?c.matrix=JSM.MatrixRotationZ(a):(c.Append(JSM.TranslationTransformation(new JSM.Vector(-b.x,-b.y,-b.z))),c.Append(JSM.RotationZTransformation(a)),c.Append(JSM.TranslationTransformation(new JSM.Vector(b.x,b.y,b.z))));return c}; JSM.RotationXYZTransformation=function(a,b,c,d){var e=new JSM.Transformation;e.Append(JSM.RotationXTransformation(a,d));e.Append(JSM.RotationYTransformation(b,d));e.Append(JSM.RotationZTransformation(c,d));return e};JSM.CoordPlanePosition={CoordOnPlane:0,CoordInFrontOfPlane:1,CoordAtBackOfPlane:2};JSM.LinePlanePosition={LineParallelToPlane:0,LineIntersectsPlane:1};JSM.Plane=function(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d}; JSM.Plane.prototype.Set=function(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d};JSM.Plane.prototype.GetNormal=function(){return new JSM.Vector(this.a,this.b,this.c)};JSM.Plane.prototype.CoordSignedDistance=function(a){var b=this.a,c=this.b,d=this.c;return(b*a.x+c*a.y+d*a.z+this.d)/Math.sqrt(b*b+c*c+d*d)};JSM.Plane.prototype.CoordDistance=function(a){a=this.CoordSignedDistance(a);return Math.abs(a)}; -JSM.Plane.prototype.ProjectCoord=function(a){var b=a.x,c=a.y,d=a.z,e=this.a,f=this.b,h=this.c,g=this.d,l=this.CoordDistance(a);JSM.IsGreater(e*b+f*c+h*d+g,0)&&(l=-l);b=this.GetNormal().Normalize();return a.Clone().Offset(b,l)};JSM.Plane.prototype.CoordPosition=function(a){a=this.a*a.x+this.b*a.y+this.c*a.z+this.d;return JSM.IsPositive(a)?JSM.CoordPlanePosition.CoordInFrontOfPlane:JSM.IsNegative(a)?JSM.CoordPlanePosition.CoordAtBackOfPlane:JSM.CoordPlanePosition.CoordOnPlane}; -JSM.Plane.prototype.LinePosition=function(a,b){var c=a.direction.Clone().Normalize(),d=a.start.x,e=a.start.y,f=a.start.z,h=this.a,g=this.b,l=this.c,k=this.d,m=h*(d-(a.start.x+c.x))+g*(e-(a.start.y+c.y))+l*(f-(a.start.z+c.z));if(JSM.IsZero(m))return JSM.LinePlanePosition.LineParallelToPlane;void 0!==b&&(c.MultiplyScalar((h*d+g*e+l*f+k)/m),c=JSM.CoordAdd(a.start,c),b.Set(c.x,c.y,c.z));return JSM.LinePlanePosition.LineIntersectsPlane}; -JSM.Plane.prototype.LineIntersection=function(a){var b=a.direction.Clone().Normalize(),c=a.start.x,d=a.start.y,e=a.start.z,f=this.a,h=this.b,g=this.c,l=this.d,k=f*(c-(a.start.x+b.x))+h*(d-(a.start.y+b.y))+g*(e-(a.start.z+b.z));if(JSM.IsZero(k))return null;b.MultiplyScalar((f*c+h*d+g*e+l)/k);return JSM.CoordAdd(a.start,b)};JSM.Plane.prototype.Clone=function(){return new JSM.Plane(this.a,this.b,this.c,this.d)}; +JSM.Plane.prototype.ProjectCoord=function(a){var b=a.x,c=a.y,d=a.z,e=this.a,f=this.b,g=this.c,h=this.d,l=this.CoordDistance(a);JSM.IsGreater(e*b+f*c+g*d+h,0)&&(l=-l);b=this.GetNormal().Normalize();return a.Clone().Offset(b,l)};JSM.Plane.prototype.CoordPosition=function(a){a=this.a*a.x+this.b*a.y+this.c*a.z+this.d;return JSM.IsPositive(a)?JSM.CoordPlanePosition.CoordInFrontOfPlane:JSM.IsNegative(a)?JSM.CoordPlanePosition.CoordAtBackOfPlane:JSM.CoordPlanePosition.CoordOnPlane}; +JSM.Plane.prototype.LinePosition=function(a,b){var c=a.direction.Clone().Normalize(),d=a.start.x,e=a.start.y,f=a.start.z,g=this.a,h=this.b,l=this.c,k=this.d,m=g*(d-(a.start.x+c.x))+h*(e-(a.start.y+c.y))+l*(f-(a.start.z+c.z));if(JSM.IsZero(m))return JSM.LinePlanePosition.LineParallelToPlane;void 0!==b&&(c.MultiplyScalar((g*d+h*e+l*f+k)/m),c=JSM.CoordAdd(a.start,c),b.Set(c.x,c.y,c.z));return JSM.LinePlanePosition.LineIntersectsPlane}; +JSM.Plane.prototype.LineIntersection=function(a){var b=a.direction.Clone().Normalize(),c=a.start.x,d=a.start.y,e=a.start.z,f=this.a,g=this.b,h=this.c,l=this.d,k=f*(c-(a.start.x+b.x))+g*(d-(a.start.y+b.y))+h*(e-(a.start.z+b.z));if(JSM.IsZero(k))return null;b.MultiplyScalar((f*c+g*d+h*e+l)/k);return JSM.CoordAdd(a.start,b)};JSM.Plane.prototype.Clone=function(){return new JSM.Plane(this.a,this.b,this.c,this.d)}; JSM.GetPlaneFromCoordAndDirection=function(a,b){var c=new JSM.Plane,d=b.Clone().Normalize(),e=d.x,f=d.y,d=d.z;c.Set(e,f,d,-(e*a.x+f*a.y+d*a.z));return c};JSM.GetPlaneFromThreeCoords=function(a,b,c){var d=new JSM.Plane,e=(b.y-a.y)*(c.z-a.z)-(c.y-a.y)*(b.z-a.z),f=(b.z-a.z)*(c.x-a.x)-(c.z-a.z)*(b.x-a.x);b=(b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);d.Set(e,f,b,-(e*a.x+f*a.y+b*a.z));return d}; -JSM.CoordPlaneSignedDirectionalDistance=function(a,b,c){var d=b.Clone().Normalize();b=a.x;var e=a.y,f=a.z,h=c.a,g=c.b,l=c.c;c=c.d;var k=h*(b-(a.x+d.x))+g*(e-(a.y+d.y))+l*(f-(a.z+d.z));if(JSM.IsZero(k))return 0;d.MultiplyScalar((h*b+g*e+l*f+c)/k);d=JSM.CoordAdd(a,d);a=a.DistanceTo(d);JSM.IsNegative(h*b+g*e+l*f+c)&&(a=-a);return a};JSM.CoordPlaneDirectionalDistance=function(a,b,c){return Math.abs(JSM.CoordPlaneSignedDirectionalDistance(a,b,c))}; -JSM.Project=function(a,b,c,d,e,f,h,g,l){b=JSM.MatrixView(b,c,d);h=JSM.MatrixPerspective(e,f,h,g);e=new JSM.Coord(0,0,0);g=[];f=[];g[0]=a.x;g[1]=a.y;g[2]=a.z;g[3]=1;f=JSM.MatrixVectorMultiply(h,JSM.MatrixVectorMultiply(b,g));a=f[3];JSM.IsZero(a)?l=null:(f[0]=0.5*(f[0]/a)+0.5,f[1]=0.5*(f[1]/a)+0.5,f[2]=0.5*(f[2]/a)+0.5,f[0]=f[0]*l[2]+l[0],f[1]=f[1]*l[3]+l[1],e.x=f[0],e.y=f[1],e.z=f[2],l=e);return l}; +JSM.CoordPlaneSignedDirectionalDistance=function(a,b,c){var d=b.Clone().Normalize();b=a.x;var e=a.y,f=a.z,g=c.a,h=c.b,l=c.c;c=c.d;var k=g*(b-(a.x+d.x))+h*(e-(a.y+d.y))+l*(f-(a.z+d.z));if(JSM.IsZero(k))return 0;d.MultiplyScalar((g*b+h*e+l*f+c)/k);d=JSM.CoordAdd(a,d);a=a.DistanceTo(d);JSM.IsNegative(g*b+h*e+l*f+c)&&(a=-a);return a};JSM.CoordPlaneDirectionalDistance=function(a,b,c){return Math.abs(JSM.CoordPlaneSignedDirectionalDistance(a,b,c))}; +JSM.Project=function(a,b,c,d,e,f,g,h,l){b=JSM.MatrixView(b,c,d);g=JSM.MatrixPerspective(e,f,g,h);e=new JSM.Coord(0,0,0);h=[];f=[];h[0]=a.x;h[1]=a.y;h[2]=a.z;h[3]=1;f=JSM.MatrixVectorMultiply(g,JSM.MatrixVectorMultiply(b,h));a=f[3];JSM.IsZero(a)?l=null:(f[0]=0.5*(f[0]/a)+0.5,f[1]=0.5*(f[1]/a)+0.5,f[2]=0.5*(f[2]/a)+0.5,f[0]=f[0]*l[2]+l[0],f[1]=f[1]*l[3]+l[1],e.x=f[0],e.y=f[1],e.z=f[2],l=e);return l}; JSM.ConvexHull2D=function(a){function b(a,b){var c=a.length,d=0,e;for(e=1;ea.length)return c;var d=function(a){var b=a.length,c=JSM.Inf,d=-1,e,f;for(e=0;en)return m;var p=new function(){this.vertices=[];this.edges=[];this.triangles=[]},q;for(q=0;qn)return m;var p=new function(){this.vertices=[];this.edges=[];this.triangles=[]},q;for(q=0;qa)return JSM.Complexity.Invalid;var b=JSM.Complexity.Invalid;if(this.GetOrientation()!=JSM.Orientation.Invalid){var b=JSM.Complexity.Convex,c;for(c=0;ce)return d;var f,h,g,l,k;for(f=0;fe)return d;var f,g,h,l,k;for(f=0;fb.length)){for(var c=a.GetVertex(b[0]),d=a.GetVertex(b[1]),d=JSM.CoordSub(d,c),f=JSM.GetPlaneFromCoordAndDirection(c,d),g,d=[],c=0;cb.length)){for(var c=a.GetVertex(b[0]),d=a.GetVertex(b[1]),d=JSM.CoordSub(d,c),f=JSM.GetPlaneFromCoordAndDirection(c,d),g,d=[],c=0;cf))if(3==f)a.push(e.map);else{f=b(e.polygon);if(null===f)return null;e=c(e,f);d.push(e.resultData1);d.push(e.resultData2)}return a}; JSM.TriangulatePolygon2D=function(a){if(null===a)return null;var b=a.VertexCount();if(3>b)return null;if(3==b)return[[0,1,2]];b=a.GetComplexity();return b===JSM.Complexity.Invalid?null:b==JSM.Complexity.Convex?JSM.TriangulateConvexPolygon(a):JSM.TriangulateConcavePolygon2D(a)};JSM.TriangulatePolygon=function(a){a=a.ToPolygon2D();return JSM.TriangulatePolygon2D(a)}; -JSM.TraverseOctreeNodes=function(a,b){function c(a,b){if(b(a)&&null!==a.children){var f,h;for(f=0;f=this.maxCoordNumInNodes&&this.SplitNode(c))return this.AddCoordToNode(a,c);d=this.coords.length;this.coords.push(a);c.coords.push(d);return d}; JSM.Octree.prototype.FindNodeForCoord=function(a,b){if(null===b.children)return b;var c=b.box.GetCenter(),d=a.x>c.x,e=a.y>c.y,c=a.z>c.z;return!d&&!e&&!c?this.FindNodeForCoord(a,b.children[0]):d&&!e&&!c?this.FindNodeForCoord(a,b.children[1]):d&&e&&!c?this.FindNodeForCoord(a,b.children[2]):!d&&e&&!c?this.FindNodeForCoord(a,b.children[3]):!d&&!e&&c?this.FindNodeForCoord(a,b.children[4]):d&&!e&&c?this.FindNodeForCoord(a,b.children[5]):d&&e&&c?this.FindNodeForCoord(a,b.children[6]):!d&&e&&c?this.FindNodeForCoord(a, b.children[7]):null};JSM.Octree.prototype.SplitNode=function(a){var b=this,c=JSM.CreateOctreeChildNodes(a.box,function(c){return b.CreateNewNode(a,c)});if(null===c)return!1;a.children=c;c=a.coords;a.coords=[];var d,e;for(d=0;db.VertexCount())return!1;var d;if(null===a.polygon){d=b.GetNormal();var e=JSM.GetPlaneFromCoordAndDirection(b.GetVertex(0),d);a.polygon=b;void 0!==c&&(a.userData=c);a.plane=e}else{d=[];var f=[],e=[];JSM.CutPolygonWithPlane(b,a.plane,f,d,e)&&(0b?c[e]=f:c[e]=f+1;f=c[0];d=c[d-1];if(0===f&&f!=d)for(e=0;c[e]==f;e++)c[e]=d;return c}; -JSM.MakeBodyInsideOut=function(a){var b,c,d,e,f;for(b=0;bb?c[e]=f:c[e]=f+1;f=c[0];d=c[d-1];if(0===f&&f!=d)for(e=0;c[e]==f;e++)c[e]=d;return c}; +JSM.MakeBodyInsideOut=function(a){var b,c,d,e,f;for(b=0;bk;k++)0===k?m=e:1===k?m=f:2===k&&(m=h),n=Math.abs(JSM.VectorDot(b,m)),JSM.IsGreater(n,l)&&(g=k,l=n);if(-1===g)return d;b=null;0===g?b=new JSM.CoordSystem(c.origo,f,h,new JSM.Coord(0,0,0)):1===g?b=new JSM.CoordSystem(c.origo,e,h,new JSM.Coord(0,0,0)):2===g&&(b=new JSM.CoordSystem(c.origo,e,f,new JSM.Coord(0,0,0)));return null=== -b?d:JSM.CalculatePlanarTextureCoord(a,b)};JSM.CalculateCylindricalTextureCoord=function(a,b,c){var d=new JSM.Coord2D(0,0),e=c.e3.Clone().Normalize();if(e.IsCollinearWith(b))return d=JSM.CalculateCubicTextureCoord(a,b,c),[d,0];var f=(new JSM.Line(c.origo,e)).ProjectCoord(a);b=JSM.CoordSignedDistance(c.origo,f,e);var h=c.e1.Clone().Normalize();a=JSM.CoordSub(a,f);e=JSM.GetVectorsFullAngle(a,h,e);c=c.e1.Length();d.x=e*c;d.y=b;return[d,e]}; -JSM.CalculatePolygonPlanarTextureCoords=function(a,b){var c=[],d=a.GetPolygon(b),e=a.GetTextureProjectionCoords(),f,h;for(f=0;fk;k++)0===k?m=e:1===k?m=f:2===k&&(m=g),n=Math.abs(JSM.VectorDot(b,m)),JSM.IsGreater(n,l)&&(h=k,l=n);if(-1===h)return d;b=null;0===h?b=new JSM.CoordSystem(c.origo,f,g,new JSM.Coord(0,0,0)):1===h?b=new JSM.CoordSystem(c.origo,e,g,new JSM.Coord(0,0,0)):2===h&&(b=new JSM.CoordSystem(c.origo,e,f,new JSM.Coord(0,0,0)));return null=== +b?d:JSM.CalculatePlanarTextureCoord(a,b)};JSM.CalculateCylindricalTextureCoord=function(a,b,c){var d=new JSM.Coord2D(0,0),e=c.e3.Clone().Normalize();if(e.IsCollinearWith(b))return d=JSM.CalculateCubicTextureCoord(a,b,c),[d,0];var f=(new JSM.Line(c.origo,e)).ProjectCoord(a);b=JSM.CoordSignedDistance(c.origo,f,e);var g=c.e1.Clone().Normalize();a=JSM.CoordSub(a,f);e=JSM.GetVectorsFullAngle(a,g,e);c=c.e1.Length();d.x=e*c;d.y=b;return[d,e]}; +JSM.CalculatePolygonPlanarTextureCoords=function(a,b){var c=[],d=a.GetPolygon(b),e=a.GetTextureProjectionCoords(),f,g;for(f=0;ff;f++)l=c[g[f]],u.AddVertexIndex(2*b[l[0]]+2*l[1]+1),l=c[g[2-f]],r.AddVertexIndex(2*b[l[0]]+2*l[1]);h.AddPolygon(u);h.AddPolygon(r)}}}var h=new JSM.Body,g=[],l=new JSM.ContourPolygon;l.FromArray(a); -(function(a,b,c,d){var e,f,g,h,l;for(e=0;ef;f++)l=c[h[f]],u.AddVertexIndex(2*b[l[0]]+2*l[1]+1),l=c[h[2-f]],r.AddVertexIndex(2*b[l[0]]+2*l[1]);g.AddPolygon(u);g.AddPolygon(r)}}}var g=new JSM.Body,h=[],l=new JSM.ContourPolygon;l.FromArray(a); +(function(a,b,c,d){var e,f,g,h,l;for(e=0;ev)){var H=void 0,z=void 0,B=void 0,N=void 0,O=void 0,J=void 0,I=void 0,E=void 0,Q=void 0,G=void 0;if(3==v||k)for(G=0;Gf)){var h,n,p,q=null;if(3===f)q=JSM.CalculateBodyPolygonNormal(a,b),h=a.GetVertex(d.GetVertexIndex(0)).position,n=a.GetVertex(d.GetVertexIndex(1)).position, -p=a.GetVertex(d.GetVertexIndex(2)).position,e(q,h,n,p);else if(h=!0,void 0!==c&&c&&(h=!1),q=JSM.CalculateBodyPolygonNormal(a,b),h){h=new JSM.Polygon;for(b=0;bv)){var H=void 0,z=void 0,B=void 0,N=void 0,O=void 0,J=void 0,I=void 0,E=void 0,Q=void 0,G=void 0;if(3==v||k)for(G=0;Gf)){var g,n,p,q=null;if(3===f)q=JSM.CalculateBodyPolygonNormal(a,b),g=a.GetVertex(d.GetVertexIndex(0)).position,n=a.GetVertex(d.GetVertexIndex(1)).position, +p=a.GetVertex(d.GetVertexIndex(2)).position,e(q,g,n,p);else if(g=!0,void 0!==c&&c&&(g=!1),q=JSM.CalculateBodyPolygonNormal(a,b),g){g=new JSM.Polygon;for(b=0;bp.mat)p.mat=a.GetDefaultMaterialIndex();if(void 0===p.n0||void 0===p.n1||void 0===p.n2)void 0===p.curve||0>p.curve?(c=d[e],c=b.AddNormal(c.x, -c.y,c.z),p.n0=c,p.n1=c,p.n2=c,p.curve=-1):(p.n0=h(b,p.v0,c,d,f),p.n1=h(b,p.v1,c,d,f),p.n2=h(b,p.v2,c,d,f));if(void 0===p.u0||void 0===p.u1||void 0===p.u2)p.u0=b.AddDefaultUV(),p.u1=b.AddDefaultUV(),p.u2=b.AddDefaultUV()}var c=[],d={},e;for(e=0;ep.mat)p.mat=a.GetDefaultMaterialIndex();if(void 0===p.n0||void 0===p.n1||void 0===p.n2)void 0===p.curve||0>p.curve?(c=d[e],c=b.AddNormal(c.x, +c.y,c.z),p.n0=c,p.n1=c,p.n2=c,p.curve=-1):(p.n0=g(b,p.v0,c,d,f),p.n1=g(b,p.v1,c,d,f),p.n2=g(b,p.v2,c,d,f));if(void 0===p.u0||void 0===p.u1||void 0===p.u2)p.u0=b.AddDefaultUV(),p.u1=b.AddDefaultUV(),p.u2=b.AddDefaultUV()}var c=[],d={},e;for(e=0;eg))if(3==g)f=h.GetVertexIndex(0),g=h.GetVertexIndex(1),k=h.GetVertexIndex(2),b(c,h,f,g,k);else{l= -new JSM.Polygon;for(e=0;eh))if(3==h)f=g.GetVertexIndex(0),h=g.GetVertexIndex(1),k=g.GetVertexIndex(2),b(c,g,f,h,k);else{l= +new JSM.Polygon;for(e=0;ef.mat||f.mat>=e)||d[f.mat].push(a);var p,q;for(a=0;ak;k++)JSM.IsLower(f[k],b[k])?(h[k]=-1,g[k]=b[k],l=!1):JSM.IsGreater(f[k],c[k])?(h[k]=1,g[k]=c[k],l=!1):h[k]=0;k=null;if(l)return k={position:d,distance:0};l=[0,0,0];for(k=0;3>k;k++)0!==h[k]&&!JSM.IsZero(e[k])?l[k]=(g[k]-f[k])/e[k]:l[k]=-1;h=0;for(k=1;3>k;k++)JSM.IsLower(l[h],l[k])&&(h=k);if(JSM.IsNegative(l[h]))return null; -var m=[0,0,0];for(k=0;3>k;k++)if(h!=k){if(m[k]=f[k]+l[h]*e[k],JSM.IsLower(m[k],b[k])||JSM.IsGreater(m[k],c[k]))return null}else m[k]=g[k];f=JSM.CoordFromArray(m);d=d.DistanceTo(f);return a.IsLengthReached(d)?null:k={position:f,distance:d}}; +JSM.RayBoxIntersection=function(a,b,c){var d=a.GetOrigin(),e=a.GetDirection(),f=JSM.CoordToArray(d),e=JSM.CoordToArray(e);b=JSM.CoordToArray(b);c=JSM.CoordToArray(c);var g=[0,0,0],h=[0,0,0],l=!0,k;for(k=0;3>k;k++)JSM.IsLower(f[k],b[k])?(g[k]=-1,h[k]=b[k],l=!1):JSM.IsGreater(f[k],c[k])?(g[k]=1,h[k]=c[k],l=!1):g[k]=0;k=null;if(l)return k={position:d,distance:0};l=[0,0,0];for(k=0;3>k;k++)0!==g[k]&&!JSM.IsZero(e[k])?l[k]=(h[k]-f[k])/e[k]:l[k]=-1;g=0;for(k=1;3>k;k++)JSM.IsLower(l[g],l[k])&&(g=k);if(JSM.IsNegative(l[g]))return null; +var m=[0,0,0];for(k=0;3>k;k++)if(g!=k){if(m[k]=f[k]+l[g]*e[k],JSM.IsLower(m[k],b[k])||JSM.IsGreater(m[k],c[k]))return null}else m[k]=h[k];f=JSM.CoordFromArray(m);d=d.DistanceTo(f);return a.IsLengthReached(d)?null:k={position:f,distance:d}}; JSM.RayOctreeIntersection=function(a,b,c){var d=null,e=!1,f=null!==c&&void 0!==c;JSM.TraverseOctreeNodes(b,function(b){if(!f&&e||!JSM.RayBoxIntersection(a,b.box.min,b.box.max))return!1;var c;for(c=0;c=this.arrayBuffer.byteLength}; JSM.BinaryReader.prototype.ReadBoolean=function(){var a=this.dataView.getInt8(this.position);this.position+=1;return a?!0:!1};JSM.BinaryReader.prototype.ReadCharacter=function(){var a=this.dataView.getInt8(this.position);this.position+=1;return a};JSM.BinaryReader.prototype.ReadUnsignedCharacter=function(){var a=this.dataView.getUint8(this.position);this.position+=1;return a}; JSM.BinaryReader.prototype.ReadInteger16=function(){var a=this.dataView.getInt16(this.position,this.isLittleEndian);this.position+=2;return a};JSM.BinaryReader.prototype.ReadUnsignedInteger16=function(){var a=this.dataView.getUint16(this.position,this.isLittleEndian);this.position+=2;return a};JSM.BinaryReader.prototype.ReadInteger32=function(){var a=this.dataView.getInt32(this.position,this.isLittleEndian);this.position+=4;return a}; @@ -286,11 +287,11 @@ JSM.BinaryReader.prototype.ReadUnsignedInteger32=function(){var a=this.dataView. JSM.GetArrayBufferFromURL=function(a,b){var c=new XMLHttpRequest;c.open("GET",a,!0);c.responseType="arraybuffer";c.onload=function(){var a=c.response;a&&b(a)};c.send(null)};JSM.GetArrayBufferFromFile=function(a,b){var c=new FileReader;c.onloadend=function(a){a.target.readyState==FileReader.DONE&&b(a.target.result)};c.readAsArrayBuffer(a)};JSM.GetStringBufferFromURL=function(a,b){var c=new XMLHttpRequest;c.open("GET",a,!0);c.responseType="text";c.onload=function(){var a=c.response;a&&b(a)};c.send(null)}; JSM.GetStringBufferFromFile=function(a,b){var c=new FileReader;c.onloadend=function(a){a.target.readyState==FileReader.DONE&&b(a.target.result)};c.readAsText(a)};JSM.LoadMultipleBuffersInternal=function(a,b,c,d){if(b>=a.length)d(c);else{var e=a[b],f=null,f=e.isFile?e.isArrayBuffer?JSM.GetArrayBufferFromFile:JSM.GetStringBufferFromFile:e.isArrayBuffer?JSM.GetArrayBufferFromURL:JSM.GetStringBufferFromURL;f(e.originalObject,function(e){c.push(e);JSM.LoadMultipleBuffersInternal(a,b+1,c,d)})}}; JSM.LoadMultipleBuffers=function(a,b){JSM.LoadMultipleBuffersInternal(a,0,[],function(a){b(a)})}; -JSM.Read3dsFile=function(a,b){var c,d,e,f,h,g,l,k,m,n,p,q,t,s,w,u,r,v,C,D,y,x,F,K,L,H,z,B,N,O,J,I,E,Q,G,M,T,S,U,Y;function A(a,c){if(void 0!==b.onLog&&null!==b.onLog)b.onLog(a,c)}function R(a){for(var b="",c=0,d=0;64>d;){c=a.ReadCharacter();if(0===c)break;b+=String.fromCharCode(c);d+=1}return b}function X(a){var b=[],c;for(c=0;3>c;c++)b[c]=a.ReadFloat32();return b}function P(a,b,c){for(;a.GetPosition()<=b-6;){var d=a,e=c,f=d.ReadUnsignedInteger16(),d=d.ReadUnsignedInteger32();e(f,d)}}if(void 0=== -b||null===b)b={};c=15677;d=45055;e=40960;f=40976;h=40992;g=41008;l=41024;k=41025;m=41040;n=16;p=17;q=18;t=19;s=41472;w=41728;u=41816;r=41818;v=41812;C=41814;D=41820;y=48;x=49;F=16384;K=16640;L=17920;H=18176;z=16656;B=16704;N=16672;O=16736;J=16688;I=16720;E=45056;Q=45058;G=45072;M=45075;T=45088;S=45089;U=45090;Y=45104;(function(a){function V(a,b,c){var d=[0,0,0];b=a.GetPosition()+c-6;var e=!1;P(a,b,function(b,c){b==p?e||(d[0]=a.ReadUnsignedCharacter()/255,d[1]=a.ReadUnsignedCharacter()/255,d[2]=a.ReadUnsignedCharacter()/ +JSM.Read3dsFile=function(a,b){var c,d,e,f,g,h,l,k,m,n,p,q,t,s,w,u,r,v,C,D,y,x,F,K,L,H,z,B,N,O,J,I,E,Q,G,M,T,S,U,Y;function A(a,c){if(void 0!==b.onLog&&null!==b.onLog)b.onLog(a,c)}function R(a){for(var b="",c=0,d=0;64>d;){c=a.ReadCharacter();if(0===c)break;b+=String.fromCharCode(c);d+=1}return b}function X(a){var b=[],c;for(c=0;3>c;c++)b[c]=a.ReadFloat32();return b}function P(a,b,c){for(;a.GetPosition()<=b-6;){var d=a,e=c,f=d.ReadUnsignedInteger16(),d=d.ReadUnsignedInteger32();e(f,d)}}if(void 0=== +b||null===b)b={};c=15677;d=45055;e=40960;f=40976;g=40992;h=41008;l=41024;k=41025;m=41040;n=16;p=17;q=18;t=19;s=41472;w=41728;u=41816;r=41818;v=41812;C=41814;D=41820;y=48;x=49;F=16384;K=16640;L=17920;H=18176;z=16656;B=16704;N=16672;O=16736;J=16688;I=16720;E=45056;Q=45058;G=45072;M=45075;T=45088;S=45089;U=45090;Y=45104;(function(a){function V(a,b,c){var d=[0,0,0];b=a.GetPosition()+c-6;var e=!1;P(a,b,function(b,c){b==p?e||(d[0]=a.ReadUnsignedCharacter()/255,d[1]=a.ReadUnsignedCharacter()/255,d[2]=a.ReadUnsignedCharacter()/ 255):b==q?(d[0]=a.ReadUnsignedCharacter()/255,d[1]=a.ReadUnsignedCharacter()/255,d[2]=a.ReadUnsignedCharacter()/255,e=!0):b==n?e||(d[0]=a.ReadFloat32(),d[1]=a.ReadFloat32(),d[2]=a.ReadFloat32()):b==t?(d[0]=a.ReadFloat32(),d[1]=a.ReadFloat32(),d[2]=a.ReadFloat32(),e=!0):a.Skip(c-6)});return d}function W(a,b,c){var d=0;b=a.GetPosition()+c-6;P(a,b,function(b,c){b==y?d=a.ReadUnsignedInteger16()/100:b==x?d=a.ReadFloat32():a.Skip(c-6)});return d}function Z(a,b,c,d){d.texture=null;d.offset=[0,0];d.scale= [1,1];d.rotation=0;b=a.GetPosition()+c-6;P(a,b,function(b,c){b==w?d.texture=R(a):b==u?d.offset[0]=a.ReadFloat32():b==r?d.offset[1]=a.ReadFloat32():b==v?d.scale[0]=a.ReadFloat32():b==C?d.scale[1]=a.ReadFloat32():b==D?d.rotation=a.ReadFloat32():a.Skip(c-6)})}function $(a,c,d){A("Read material chunk ("+c.toString(16)+", "+d+")",2);var n={},p=a.GetPosition()+d-6;P(a,p,function(b,p){b==e?(A("Read material name chunk ("+c.toString(16)+", "+d+")",3),n.name=R(a)):b==f?(A("Read material ambient chunk ("+c.toString(16)+ -", "+d+")",3),n.ambient=V(a,b,p)):b==h?(A("Read material diffuse chunk ("+c.toString(16)+", "+d+")",3),n.diffuse=V(a,b,p)):b==g?(A("Read material specular chunk ("+c.toString(16)+", "+d+")",3),n.specular=V(a,b,p)):b==l?(A("Read material shininess chunk ("+c.toString(16)+", "+d+")",3),n.shininess=W(a,b,p)):b==k?(A("Read material shininess strength chunk ("+c.toString(16)+", "+d+")",3),n.shininessStrength=W(a,b,p)):b==m?(A("Read material transparency chunk ("+c.toString(16)+", "+d+")",3),n.transparency= +", "+d+")",3),n.ambient=V(a,b,p)):b==g?(A("Read material diffuse chunk ("+c.toString(16)+", "+d+")",3),n.diffuse=V(a,b,p)):b==h?(A("Read material specular chunk ("+c.toString(16)+", "+d+")",3),n.specular=V(a,b,p)):b==l?(A("Read material shininess chunk ("+c.toString(16)+", "+d+")",3),n.shininess=W(a,b,p)):b==k?(A("Read material shininess strength chunk ("+c.toString(16)+", "+d+")",3),n.shininessStrength=W(a,b,p)):b==m?(A("Read material transparency chunk ("+c.toString(16)+", "+d+")",3),n.transparency= W(a,b,p)):b==s?(A("Read material texture map chunk ("+c.toString(16)+", "+d+")",3),Z(a,b,p,n)):(A("Skip chunk ("+b.toString(16)+", "+p+")",3),a.Skip(p-6))});if(void 0!==b.onMaterial&&null!==b.onMaterial)b.onMaterial(n)}function aa(a,c,d){A("Read faces chunk ("+c.toString(16)+", "+d+")",4);c=a.GetPosition()+d-6;var e=a.ReadUnsignedInteger16(),f,g,h,l;for(d=0;dg;g++)a[0+g]*=c,a[4+g]*=d,a[8+g]*=f;return a}function f(a,b){var c=b[0],d=b[1],e=b[2],g;for(g=0;3>g;g++)a[12+g]+=a[0+g]*c+a[4+g]*d+a[8+g]*e;return a}function g(a,b){var c,d;for(c=0;cn.length)){var p="";for(a=1;an.length||d(parseFloat(n[1]),parseFloat(n[2]),parseFloat(n[3]));else if("vn"==n[0])4>n.length||e(parseFloat(n[1]),parseFloat(n[2]),parseFloat(n[3]));else if("vt"==n[0])3>n.length||f(parseFloat(n[1]), parseFloat(n[2]));else if("f"==n[0]){if(!(4>n.length)){var p=[],q=[],t=[],s;for(a=1;an.length)&&void 0!==b.onUseMaterial&&null!==b.onUseMaterial)b.onUseMaterial(n[1])}else if("newmtl"==n[0]){if(!(2>n.length)&&void 0!==b.onNewMaterial&&null!==b.onNewMaterial)b.onNewMaterial(n[1])}else if("Ka"== -n[0]||"Kd"==n[0]||"Ks"==n[0])4>n.length||c(n[0],parseFloat(n[1]),parseFloat(n[2]),parseFloat(n[3]));else if("Ns"==n[0]||"Tr"==n[0]||"d"==n[0]){if(!(2>n.length)&&void 0!==b.onMaterialParameter&&null!==b.onMaterialParameter)b.onMaterialParameter(n[0],n[1])}else if("map_Kd"==n[0]){if(!(2>n.length)&&(n=g(a,"map_Kd"),void 0!==b.onMaterialTexture&&null!==b.onMaterialTexture))b.onMaterialTexture(n)}else"mtllib"==n[0]&&!(2>n.length)&&(n=g(a,"mtllib"),n=h(n.trim()),null!==n&&l(n))}}function l(a){a=a.split("\n"); -var b,c;for(b=0;bn.length||c(n[0],parseFloat(n[1]),parseFloat(n[2]),parseFloat(n[3]));else if("Ns"==n[0]||"Tr"==n[0]||"d"==n[0]){if(!(2>n.length)&&void 0!==b.onMaterialParameter&&null!==b.onMaterialParameter)b.onMaterialParameter(n[0],n[1])}else if("map_Kd"==n[0]){if(!(2>n.length)&&(n=h(a,"map_Kd"),void 0!==b.onMaterialTexture&&null!==b.onMaterialTexture))b.onMaterialTexture(n)}else"mtllib"==n[0]&&!(2>n.length)&&(n=h(a,"mtllib"),n=g(n.trim()),null!==n&&l(n))}}function l(a){a=a.split("\n"); +var b,c;for(b=0;bc||c>=b.length))return b=b[c],0===f?g=a.AddVertex(b.x,b.y,b.z):1===f?g=a.AddNormal(b.x,b.y,b.z):2===f&&(g=a.AddUV(b.x,b.y)),e[c]=g}}var e,f,g,h,l,k,m;for(e=0;ec;c++)b[c]=a.ReadFloat32();return b}if(void 0===b||null===b)b={};var d=new JSM.BinaryReader(a,!0);d.Skip(80);var e=d.ReadUnsignedInteger32(),f,h,g,l,k;for(f=0;fc;c++)b[c]=a.ReadFloat32();return b}if(void 0===b||null===b)b={};var d=new JSM.BinaryReader(a,!0);d.Skip(80);var e=d.ReadUnsignedInteger32(),f,g,h,l,k;for(f=0;fd.length)return-1;var d=[parseFloat(d[2]),parseFloat(d[3]),parseFloat(d[4])],e=[],k,m;for(k=c+1;ke.length;k++)if(m=a[k].trim(),0!==m.length&&(m=m.split(/\s+/),0!==m.length&&"vertex"==m[0]))if(4>m.length)break;else m=[parseFloat(m[1]),parseFloat(m[2]),parseFloat(m[3])],e.push(m);k+=1;if(3!=e.length)return-1; if(void 0!==b.onFace&&null!==b.onFace)b.onFace(e[0],e[1],e[2],d);return k}return c+1}if(void 0===b||null===b)b={};for(var d=0,e=a.split("\n");db)return!1;a=new JSM.BinaryReader(a,!0);a.Skip(80);a=a.ReadUnsignedInteger32();return b!=50*a+84?!1:!0}; JSM.ConvertStlToJsonData=function(a,b){var c=new JSM.TriangleModel,d=c.AddBody(new JSM.TriangleBody("Default")),e=c.GetBody(d);null!==a?JSM.ReadBinaryStlFile(a,{onFace:function(a,b,c,d){a=e.AddVertex(a[0],a[1],a[2]);b=e.AddVertex(b[0],b[1],b[2]);c=e.AddVertex(c[0],c[1],c[2]);d=(new JSM.Vector(d[0],d[1],d[2])).Normalize();d=e.AddNormal(d.x,d.y,d.z);e.AddTriangle(a,b,c,d,d,d)}}):null!==b&&JSM.ReadAsciiStlFile(b,{onFace:function(a,b,c,d){a=e.AddVertex(a[0],a[1],a[2]);b=e.AddVertex(b[0],b[1],b[2]);c= @@ -326,9 +327,9 @@ JSM.ImportFileList.prototype.InitFromURLs=function(a){this.originalList=a;this.d JSM.ImportFileList.prototype.GetInputList=function(){var a=[],b,c,d;for(b=0;br;r++)u[r].z=n-c;r=JSM.GeneratePrism(u,k,c,!0,null);l.Merge(r);if(d)for(r=0;rb&&(e=a,p=!1);for(r=0;rr;r++)u[r].z=n-c;r=JSM.GeneratePrism(u,k,c,!0,null);l.Merge(r);if(d)for(r=0;rb&&(e=a,p=!1);for(r=0;rh;h++)k=0===h?g.pgon1:g.pgon2,-1===k&&(k=0===h?g.pgon2:g.pgon1),k=b.GetVertex(d[k]).position.Clone(),l=JSM.CoordAdd(l,k.MultiplyScalar(0.25));e.push(b.AddVertex(new JSM.BodyVertex(l)))}})();(function(){var e=[],h,g,l,k;for(l=0;lg;g++)k=0===g?h.pgon1:h.pgon2,-1===k&&(k=0===g?h.pgon2:h.pgon1),k=b.GetVertex(d[k]).position.Clone(),l=JSM.CoordAdd(l,k.MultiplyScalar(0.25));e.push(b.AddVertex(new JSM.BodyVertex(l)))}})();(function(){var e=[],g,h,l,k;for(l=0;lthis.cameraFarDistanceLimit)return 0;c*=0.1;a||(c*=-1);this.camera.eye.Offset(b,c)};JSM.Navigation.prototype.DrawCallback=function(){void 0!==this.drawCallback&&null!==this.drawCallback&&this.drawCallback()};JSM.Navigation.prototype.ResizeCallback=function(){void 0!==this.resizeCallback&&null!==this.resizeCallback&&this.resizeCallback()}; -JSM.Navigation.prototype.OnMouseDown=function(a){a.preventDefault();this.mouse.Down(a,this.canvas)};JSM.Navigation.prototype.OnMouseMove=function(a){a.preventDefault();this.mouse.Move(a,this.canvas);this.mouse.down&&(a=0,1==this.mouse.button?this.cameraEnableOrbit&&(a=0.5,this.Orbit(this.mouse.diffX*a,this.mouse.diffY*a),this.DrawCallback()):3==this.mouse.button&&this.cameraEnablePan&&(a=0.001*this.camera.eye.DistanceTo(this.camera.center),this.Pan(this.mouse.diffX*a,this.mouse.diffY*a),this.DrawCallback()))}; -JSM.Navigation.prototype.OnMouseUp=function(a){a.preventDefault();this.mouse.Up(a,this.canvas)};JSM.Navigation.prototype.OnMouseOut=function(a){a.preventDefault();this.mouse.Out(a,this.canvas)};JSM.Navigation.prototype.OnMouseWheel=function(a){a.preventDefault();if(this.cameraEnableZoom){null===a&&(a=window.event);var b=0;a.detail?b=-a.detail:a.wheelDelta&&(b=a.wheelDelta/40);this.Zoom(0this.cameraFarDistanceLimit)return 0;this.camera.eye.Offset(b,c*a)};JSM.Navigation.prototype.DrawCallback=function(){void 0!==this.drawCallback&&null!==this.drawCallback&&this.drawCallback()};JSM.Navigation.prototype.ResizeCallback=function(){void 0!==this.resizeCallback&&null!==this.resizeCallback&&this.resizeCallback()}; +JSM.Navigation.prototype.OnMouseDown=function(a){a.preventDefault();this.mouse.Down(a,this.canvas)}; +JSM.Navigation.prototype.OnMouseMove=function(a){a.preventDefault();this.mouse.Move(a,this.canvas);if(this.mouse.down){a=0;if(1==this.mouse.button){if(!this.cameraEnableOrbit)return;a=0.5;this.Orbit(this.mouse.diff.x*a,this.mouse.diff.y*a)}else if(3==this.mouse.button){if(!this.cameraEnablePan)return;a=0.001*this.camera.eye.DistanceTo(this.camera.center);this.Pan(this.mouse.diff.x*a,this.mouse.diff.y*a)}this.DrawCallback()}}; +JSM.Navigation.prototype.OnMouseUp=function(a){a.preventDefault();this.mouse.Up(a,this.canvas)};JSM.Navigation.prototype.OnMouseOut=function(a){a.preventDefault();this.mouse.Out(a,this.canvas)};JSM.Navigation.prototype.OnMouseWheel=function(a){a.preventDefault();if(this.cameraEnableZoom){var b=a;null===b&&(b=window.event);a=0;b.detail?a=-b.detail:b.wheelDelta&&(a=b.wheelDelta/40);b=0.1;0>a&&(b*=-1);this.Zoom(b);this.DrawCallback()}}; +JSM.Navigation.prototype.OnTouchStart=function(a){a.preventDefault();this.touch.Start(a,this.canvas)}; +JSM.Navigation.prototype.OnTouchMove=function(a){a.preventDefault();this.touch.Move(a,this.canvas);if(this.touch.down){a=0;if(1==this.touch.fingers){if(!this.cameraEnableOrbit)return;a=0.5;this.Orbit(this.touch.diff.x*a,this.touch.diff.y*a)}else if(2==this.touch.fingers){if(!this.cameraEnableZoom)return;this.Zoom(0.005*this.touch.diff.x)}else if(3==this.touch.fingers){if(!this.cameraEnablePan)return;a=0.001*this.camera.eye.DistanceTo(this.camera.center);this.Pan(this.touch.diff.x*a,this.touch.diff.y* +a)}this.DrawCallback()}};JSM.Navigation.prototype.OnTouchEnd=function(a){a.preventDefault();this.touch.End(a,this.canvas)};JSM.Navigation.prototype.OnContextMenu=function(a){a.preventDefault()};JSM.Navigation.prototype.OnResize=function(a){a.preventDefault();this.ResizeCallback()};JSM.SoftwareViewer=function(){this.navigation=this.drawMode=this.drawer=this.bodies=this.camera=this.canvas=null};JSM.SoftwareViewer.prototype.Start=function(a,b){return!this.InitCanvas(a)||!this.InitCamera(b)?!1:!0}; JSM.SoftwareViewer.prototype.InitCanvas=function(a){this.bodies=[];this.canvas=a;if(!this.canvas)return!1;this.canvas instanceof HTMLCanvasElement?this.drawer=new JSM.CanvasDrawer(this.canvas):this.canvas instanceof SVGSVGElement&&(this.drawer=new JSM.SVGDrawer(this.canvas));if(!this.drawer)return!1;this.drawMode="Wireframe";return!0}; JSM.SoftwareViewer.prototype.InitCamera=function(a){this.camera=JSM.ValueOrDefault(a,new JSM.Camera);if(!this.camera)return!1;this.navigation=new JSM.Navigation;return!this.navigation.Init(this.canvas,this.camera,this.Draw.bind(this),this.Resize.bind(this))?!1:!0};JSM.SoftwareViewer.prototype.AddBody=function(a,b){this.bodies.push([a,b])};JSM.SoftwareViewer.prototype.RemoveBodies=function(){this.bodies=[]}; JSM.SoftwareViewer.prototype.FitInWindow=function(){var a=this.GetBoundingSphere();this.navigation.FitInWindow(a.GetCenter(),a.GetRadius());this.Draw()};JSM.SoftwareViewer.prototype.GetCenter=function(){return this.GetBoundingBox().GetCenter()}; @@ -544,8 +548,8 @@ JSM.SoftwareViewer.prototype.GetBoundingSphere=function(){var a=this.GetCenter() JSM.SoftwareViewer.prototype.Draw=function(){var a,b;this.drawer.Clear();for(a=0;a