Update JSModeler.
This commit is contained in:
parent
dc7004dacb
commit
923f1a85dd
@ -1,4 +1,4 @@
|
||||
/* JSModeler 0.33.241 - http://www.github.com/kovacsv/JSModeler */ 'use strict';var JSM={mainVersion:0,subVersion:33,Eps:1E-8,Inf:9999999999,RadDeg:57.29577951308232,DegRad:0.017453292519943,IsZero:function(a){return Math.abs(a)<JSM.Eps},IsPositive:function(a){return a>JSM.Eps},IsNegative:function(a){return a<-JSM.Eps},IsLower:function(a,b){return b-a>JSM.Eps},IsGreater:function(a,b){return a-b>JSM.Eps},IsEqual:function(a,b){return Math.abs(b-a)<JSM.Eps},IsEqualWithEps:function(a,b,c){return Math.abs(b-a)<c},IsLowerOrEqual:function(a,b){return JSM.IsLower(a,b)||
|
||||
/* JSModeler 0.33.246 - http://www.github.com/kovacsv/JSModeler */ 'use strict';var JSM={mainVersion:0,subVersion:33,Eps:1E-8,Inf:9999999999,RadDeg:57.29577951308232,DegRad:0.017453292519943,IsZero:function(a){return Math.abs(a)<JSM.Eps},IsPositive:function(a){return a>JSM.Eps},IsNegative:function(a){return a<-JSM.Eps},IsLower:function(a,b){return b-a>JSM.Eps},IsGreater:function(a,b){return a-b>JSM.Eps},IsEqual:function(a,b){return Math.abs(b-a)<JSM.Eps},IsEqualWithEps:function(a,b,c){return Math.abs(b-a)<c},IsLowerOrEqual:function(a,b){return JSM.IsLower(a,b)||
|
||||
JSM.IsEqual(a,b)},IsGreaterOrEqual:function(a,b){return JSM.IsGreater(a,b)||JSM.IsEqual(a,b)},Minimum:function(a,b){return JSM.IsLower(a,b)?a:b},Maximum:function(a,b){return JSM.IsGreater(a,b)?a:b},ArcSin:function(a){return JSM.IsGreaterOrEqual(a,1)?Math.PI/2:JSM.IsLowerOrEqual(a,-1)?-Math.PI/2:Math.asin(a)},ArcCos:function(a){return JSM.IsGreaterOrEqual(a,1)?0:JSM.IsLowerOrEqual(a,-1)?Math.PI:Math.acos(a)},RandomNumber:function(a,b){return Math.random()*(b-a)+a},RandomInt:function(a,b){return Math.floor(Math.random()*
|
||||
(b-a+1)+a)},SeededRandomInt:function(a,b,c){return Math.floor((9301*c+49297)%233280/233280*(b-a+1)+a)},ValueOrDefault:function(a,b){return void 0===a||null===a?b:a},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]},Assert:function(a,b){if(!a){var c="Assertion failed.";void 0!==b&&null!==b&&(c+=" "+b);alert(c)}},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};
|
||||
@ -9,7 +9,7 @@ JSM.IsFileApiEnabled=function(){return!window.File||!window.FileReader||!window.
|
||||
JSM.PolarCoord.prototype.Set=function(a,b){this.radius=a;this.angle=b};JSM.PolarCoord.prototype.ToString=function(){return"("+this.radius+", "+this.angle+")"};JSM.PolarCoord.prototype.Clone=function(){return new JSM.PolarCoord(this.radius,this.angle)};JSM.Coord=function(a,b,c){this.x=a;this.y=b;this.z=c};JSM.Coord.prototype.Set=function(a,b,c){this.x=a;this.y=b;this.z=c};JSM.Coord.prototype.ToString=function(){return"("+this.x+", "+this.y+", "+this.z+")"};
|
||||
JSM.Coord.prototype.Clone=function(){return new JSM.Coord(this.x,this.y,this.z)};JSM.SphericalCoord=function(a,b,c){this.radius=a;this.theta=b;this.phi=c};JSM.SphericalCoord.prototype.Set=function(a,b,c){this.radius=a;this.theta=b;this.phi=c};JSM.SphericalCoord.prototype.ToString=function(){return"("+this.radius+", "+this.theta+", "+this.phi+")"};JSM.SphericalCoord.prototype.Clone=function(){return new JSM.SphericalCoord(this.radius,this.theta,this.phi)};JSM.Vector2D=JSM.Coord2D;JSM.Vector=JSM.Coord;
|
||||
JSM.MatrixDeterminant2x2=function(a,b,c,d){return a*d-b*c};JSM.MatrixDeterminant3x3=function(a,b,c,d,e,f,g,h,k){var l=JSM.MatrixDeterminant2x2(e,f,h,k);f=JSM.MatrixDeterminant2x2(d,f,g,k);d=JSM.MatrixDeterminant2x2(d,e,g,h);return a*l-b*f+c*d};
|
||||
JSM.MatrixDeterminant4x4=function(a,b,c,d,e,f,g,h,k,l,m,n,p,q,r,t){var w=JSM.MatrixDeterminant3x3(f,g,h,l,m,n,q,r,t),u=JSM.MatrixDeterminant3x3(e,g,h,k,m,n,p,r,t);h=JSM.MatrixDeterminant3x3(e,f,h,k,l,n,p,q,t);e=JSM.MatrixDeterminant3x3(e,f,g,k,l,m,p,q,r);return w*a-u*b+h*c-e*d};JSM.CoordFromArray2D=function(a){return new JSM.Coord2D(a[0],a[1])};JSM.CoordFromArray=function(a){return new JSM.Coord(a[0],a[1],a[2])};JSM.CoordIsEqual2D=function(a,b){return JSM.IsEqual(a.x,b.x)&&JSM.IsEqual(a.y,b.y)};
|
||||
JSM.MatrixDeterminant4x4=function(a,b,c,d,e,f,g,h,k,l,m,n,p,q,r,s){var u=JSM.MatrixDeterminant3x3(f,g,h,l,m,n,q,r,s),v=JSM.MatrixDeterminant3x3(e,g,h,k,m,n,p,r,s);h=JSM.MatrixDeterminant3x3(e,f,h,k,l,n,p,q,s);e=JSM.MatrixDeterminant3x3(e,f,g,k,l,m,p,q,r);return u*a-v*b+h*c-e*d};JSM.CoordFromArray2D=function(a){return new JSM.Coord2D(a[0],a[1])};JSM.CoordFromArray=function(a){return new JSM.Coord(a[0],a[1],a[2])};JSM.CoordIsEqual2D=function(a,b){return JSM.IsEqual(a.x,b.x)&&JSM.IsEqual(a.y,b.y)};
|
||||
JSM.CoordIsEqual2DWithEps=function(a,b,c){return JSM.IsEqualWithEps(a.x,b.x,c)&&JSM.IsEqualWithEps(a.y,b.y,c)};JSM.CoordDistance2D=function(a,b){var c=a.x,d=a.y,e=b.x,f=b.y;return Math.sqrt((e-c)*(e-c)+(f-d)*(f-d))};JSM.MidCoord2D=function(a,b){return new JSM.Coord2D((a.x+b.x)/2,(a.y+b.y)/2)};JSM.PolarToCartesian=function(a,b){var c=new JSM.Coord2D(0,0);c.x=a*Math.cos(b);c.y=a*Math.sin(b);return c};JSM.GetArcLengthFromAngle=function(a,b){return b*a};
|
||||
JSM.GetAngleFromArcLength=function(a,b){return JSM.IsEqual(a,0)?0:b/a};JSM.CoordTurnType2D=function(a,b,c){a=JSM.MatrixDeterminant3x3(a.x,a.y,1,b.x,b.y,1,c.x,c.y,1);return JSM.IsPositive(a)?"CounterClockwise":JSM.IsNegative(a)?"Clockwise":"Collinear"};JSM.CoordIsEqual=function(a,b){return JSM.IsEqual(a.x,b.x)&&JSM.IsEqual(a.y,b.y)&&JSM.IsEqual(a.z,b.z)};JSM.CoordIsEqualWithEps=function(a,b,c){return JSM.IsEqualWithEps(a.x,b.x,c)&&JSM.IsEqualWithEps(a.y,b.y,c)&&JSM.IsEqualWithEps(a.z,b.z,c)};
|
||||
JSM.SphericalCoordIsEqual=function(a,b){return JSM.IsEqual(a.radius,b.radius)&&JSM.IsEqual(a.phi,b.phi)&&JSM.IsEqual(a.theta,b.theta)};JSM.CoordDistance=function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;return Math.sqrt((f-c)*(f-c)+(g-d)*(g-d)+(h-e)*(h-e))};JSM.CoordSignedDistance=function(a,b,c){var d=JSM.CoordSub(b,a);a=JSM.CoordDistance(a,b);c=JSM.GetVectorsAngle(d,c);JSM.IsPositive(c)&&(a=-a);return a};JSM.MidCoord=function(a,b){return new JSM.Coord((a.x+b.x)/2,(a.y+b.y)/2,(a.z+b.z)/2)};
|
||||
@ -25,11 +25,11 @@ JSM.CalculateNormal=function(a){var b=a.length,c=new JSM.Vector(0,0,0);if(3<=b){
|
||||
JSM.CartesianToSpherical=function(a,b,c){var d=new JSM.SphericalCoord(0,0,0);d.radius=Math.sqrt(a*a+b*b+c*c);if(JSM.IsZero(d.radius))return d;d.theta=Math.acos(c/d.radius);d.phi=Math.atan2(b,a);return d};JSM.SphericalToCartesianWithOrigo=function(a,b){var c=JSM.SphericalToCartesian(a.radius,a.theta,a.phi);return JSM.CoordAdd(c,b)};JSM.CartesianToSphericalWithOrigo=function(a,b){var c=JSM.CoordSub(a,b);return JSM.CartesianToSpherical(c.x,c.y,c.z)};
|
||||
JSM.MoveCoordOnSphere=function(a,b,c,d){a=JSM.CartesianToSphericalWithOrigo(a,b);a.theta+=c;a.phi+=d;return JSM.SphericalToCartesianWithOrigo(a,b)};JSM.CylindricalToCartesian=function(a,b,c){var d=new JSM.Coord(0,0,0);d.x=a*Math.cos(c);d.y=a*Math.sin(c);d.z=b;return d};JSM.GetArcLength=function(a,b,c){return JSM.GetVectorsAngle(a,b)*c};JSM.GetFullArcLength=function(a,b,c,d){return JSM.GetVectorsFullAngle(a,b,d)*c};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],g=a[1],h=a[2],k=a[3],l=a[5],m=a[6],n=a[7],p=a[9],q=a[10],r=a[11],t=a[13],w=a[14],u=a[15],s=[];s[0]=c*a[0]+d*a[4]+e*a[8]+f*a[12];s[1]=c*g+d*l+e*p+f*t;s[2]=c*h+d*m+e*q+f*w;s[3]=c*k+d*n+e*r+f*u;return s};
|
||||
JSM.MatrixMultiply=function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],g=a[4],h=a[5],k=a[6],l=a[7],m=a[8],n=a[9],p=a[10],q=a[11],r=a[12],t=a[13],w=a[14],u=a[15],s=b[0],x=b[1],B=b[2],C=b[3],v=b[4],G=b[5],z=b[6],L=b[7],N=b[8],E=b[9],y=b[10],A=b[11],J=b[12],O=b[13],M=b[14],H=b[15],F=[];F[0]=c*s+d*v+e*N+f*J;F[1]=c*x+d*G+e*E+f*O;F[2]=c*B+d*z+e*y+f*M;F[3]=c*C+d*L+e*A+f*H;F[4]=g*s+h*v+k*N+l*J;F[5]=g*x+h*G+k*E+l*O;F[6]=g*B+h*z+k*y+l*M;F[7]=g*C+h*L+k*A+l*H;F[8]=m*s+n*v+p*N+q*J;F[9]=m*x+n*G+p*E+q*O;F[10]=m*B+n*z+
|
||||
p*y+q*M;F[11]=m*C+n*L+p*A+q*H;F[12]=r*s+t*v+w*N+u*J;F[13]=r*x+t*G+w*E+u*O;F[14]=r*B+t*z+w*y+u*M;F[15]=r*C+t*L+w*A+u*H;return F};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],k=a[7],l=a[8],m=a[9],n=a[10],p=a[11],q=a[12],r=a[13],t=a[14];a=a[15];return(b*g-c*f)*(n*a-p*t)-(b*h-d*f)*(m*a-p*r)+(b*k-e*f)*(m*t-n*r)+(c*h-d*g)*(l*a-p*q)-(c*k-e*g)*(l*t-n*q)+(d*k-e*h)*(l*r-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],k=a[7],l=a[8],m=a[9],n=a[10],p=a[11],q=a[12],r=a[13],t=a[14];a=a[15];var w=b*g-c*f,u=b*h-d*f,s=b*k-e*f,x=c*h-d*g,B=c*k-e*g,C=d*k-e*h,v=l*r-m*q,G=l*t-n*q,z=l*a-p*q,L=m*t-n*r,N=m*a-p*r,E=n*a-p*t,y=w*E-u*N+s*L+x*z-B*G+C*v;if(JSM.IsZero(y))return null;var A=[];A[0]=(g*E-h*N+k*L)/y;A[1]=(d*N-c*E-e*L)/y;A[2]=(r*C-t*B+a*x)/y;A[3]=(n*B-m*C-p*x)/y;A[4]=(h*z-f*E-k*G)/y;A[5]=(b*E-d*z+e*G)/y;A[6]=(t*s-q*C-a*u)/y;A[7]=(l*C-n*s+p*
|
||||
u)/y;A[8]=(f*N-g*z+k*v)/y;A[9]=(c*z-b*N-e*v)/y;A[10]=(q*B-r*s+a*w)/y;A[11]=(m*s-l*B-p*w)/y;A[12]=(g*G-f*L-h*v)/y;A[13]=(b*L-c*G+d*v)/y;A[14]=(r*u-q*x-t*w)/y;A[15]=(l*x-m*u+n*w)/y;return A};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.MatrixVectorMultiply=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=a[1],h=a[2],k=a[3],l=a[5],m=a[6],n=a[7],p=a[9],q=a[10],r=a[11],s=a[13],u=a[14],v=a[15],t=[];t[0]=c*a[0]+d*a[4]+e*a[8]+f*a[12];t[1]=c*g+d*l+e*p+f*s;t[2]=c*h+d*m+e*q+f*u;t[3]=c*k+d*n+e*r+f*v;return t};
|
||||
JSM.MatrixMultiply=function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],g=a[4],h=a[5],k=a[6],l=a[7],m=a[8],n=a[9],p=a[10],q=a[11],r=a[12],s=a[13],u=a[14],v=a[15],t=b[0],x=b[1],B=b[2],C=b[3],w=b[4],G=b[5],z=b[6],L=b[7],N=b[8],E=b[9],y=b[10],A=b[11],J=b[12],O=b[13],M=b[14],H=b[15],F=[];F[0]=c*t+d*w+e*N+f*J;F[1]=c*x+d*G+e*E+f*O;F[2]=c*B+d*z+e*y+f*M;F[3]=c*C+d*L+e*A+f*H;F[4]=g*t+h*w+k*N+l*J;F[5]=g*x+h*G+k*E+l*O;F[6]=g*B+h*z+k*y+l*M;F[7]=g*C+h*L+k*A+l*H;F[8]=m*t+n*w+p*N+q*J;F[9]=m*x+n*G+p*E+q*O;F[10]=m*B+n*z+
|
||||
p*y+q*M;F[11]=m*C+n*L+p*A+q*H;F[12]=r*t+s*w+u*N+v*J;F[13]=r*x+s*G+u*E+v*O;F[14]=r*B+s*z+u*y+v*M;F[15]=r*C+s*L+u*A+v*H;return F};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],k=a[7],l=a[8],m=a[9],n=a[10],p=a[11],q=a[12],r=a[13],s=a[14];a=a[15];return(b*g-c*f)*(n*a-p*s)-(b*h-d*f)*(m*a-p*r)+(b*k-e*f)*(m*s-n*r)+(c*h-d*g)*(l*a-p*q)-(c*k-e*g)*(l*s-n*q)+(d*k-e*h)*(l*r-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],k=a[7],l=a[8],m=a[9],n=a[10],p=a[11],q=a[12],r=a[13],s=a[14];a=a[15];var u=b*g-c*f,v=b*h-d*f,t=b*k-e*f,x=c*h-d*g,B=c*k-e*g,C=d*k-e*h,w=l*r-m*q,G=l*s-n*q,z=l*a-p*q,L=m*s-n*r,N=m*a-p*r,E=n*a-p*s,y=u*E-v*N+t*L+x*z-B*G+C*w;if(JSM.IsZero(y))return null;var A=[];A[0]=(g*E-h*N+k*L)/y;A[1]=(d*N-c*E-e*L)/y;A[2]=(r*C-s*B+a*x)/y;A[3]=(n*B-m*C-p*x)/y;A[4]=(h*z-f*E-k*G)/y;A[5]=(b*E-d*z+e*G)/y;A[6]=(s*t-q*C-a*v)/y;A[7]=(l*C-n*t+p*
|
||||
v)/y;A[8]=(f*N-g*z+k*w)/y;A[9]=(c*z-b*N-e*w)/y;A[10]=(q*B-r*t+a*u)/y;A[11]=(m*t-l*B-p*u)/y;A[12]=(g*G-f*L-h*w)/y;A[13]=(b*L-c*G+d*w)/y;A[14]=(r*v-q*x-s*u)/y;A[15]=(l*x-m*v+n*u)/y;return A};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=JSM.VectorNormalize(a);a=d.x;var e=d.y,d=d.z,f=a*a,g=e*e,h=d*d,k=Math.sin(b);b=Math.cos(b);var l=[];if(void 0===c||null===c)l[0]=f+(g+h)*b,l[1]=a*e*(1-b)+d*k,l[2]=a*d*(1-b)-e*k,l[3]=0,l[4]=a*e*(1-b)-d*k,l[5]=g+(f+h)*b,l[6]=e*d*(1-b)+a*k,l[7]=0,l[8]=a*d*(1-b)+e*k,l[9]=e*d*(1-b)-a*k,l[10]=h+(f+g)*b,l[11]=0,l[12]=0,l[13]=0,l[14]=0;else{var m=c.x,n=c.y;c=c.z;l[0]=f+(g+h)*b;l[1]=a*e*(1-b)+d*k;l[2]=a*d*(1-b)-e*k;l[3]=0;l[4]=a*e*(1-b)-d*k;l[5]=g+(f+h)*b;l[6]=e*d*
|
||||
(1-b)+a*k;l[7]=0;l[8]=a*d*(1-b)+e*k;l[9]=e*d*(1-b)-a*k;l[10]=h+(f+g)*b;l[11]=0;l[12]=(m*(g+h)-a*(n*e+c*d))*(1-b)+(n*d-c*e)*k;l[13]=(n*(f+h)-e*(m*a+c*d))*(1-b)+(c*a-m*d)*k;l[14]=(c*(f+g)-d*(m*a+n*e))*(1-b)+(m*e-n*a)*k}l[15]=1;return l};
|
||||
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 k=b*g,b=b*h,l=c*g,c=c*h,d=d*h,f=e*f,g=e*g,e=e*h,h=[];h[0]=1-(l+d);h[1]=k+e;h[2]=b-g;h[3]=0;h[4]=k-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+l);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};
|
||||
@ -39,8 +39,11 @@ JSM.MatrixPerspective=function(a,b,c,d){var e=[];a=1/Math.tan(a/2);var f=1/(c-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.Clone=function(){return new JSM.CoordSystem(this.origo.Clone(),this.e1.Clone(),this.e2.Clone(),this.e3.Clone())};JSM.CoordSystemToDirectionVectors=function(a){return new JSM.CoordSystem(a.origo,JSM.CoordSub(a.e1,a.origo),JSM.CoordSub(a.e2,a.origo),JSM.CoordSub(a.e3,a.origo))};
|
||||
JSM.CoordSystemToAbsoluteCoords=function(a){return new JSM.CoordSystem(a.origo,JSM.CoordAdd(a.e1,a.origo),JSM.CoordAdd(a.e2,a.origo),JSM.CoordAdd(a.e3,a.origo))};
|
||||
JSM.ChangeCoordSystem=function(a,b,c){var d=JSM.VectorNormalize(b.e1),e=JSM.VectorNormalize(b.e2),f=JSM.VectorNormalize(b.e3),g=JSM.VectorNormalize(c.e1),h=JSM.VectorNormalize(c.e2),k=JSM.VectorNormalize(c.e3);a=JSM.CoordSub(a,b.origo);b=new JSM.Coord(0,0,0);b.x=JSM.VectorDot(g,d)*a.x+JSM.VectorDot(g,e)*a.y+JSM.VectorDot(g,f)*a.z;b.y=JSM.VectorDot(h,d)*a.x+JSM.VectorDot(h,e)*a.y+JSM.VectorDot(h,f)*a.z;b.z=JSM.VectorDot(k,d)*a.x+JSM.VectorDot(k,e)*a.y+JSM.VectorDot(k,f)*a.z;return b=JSM.CoordAdd(b,
|
||||
c.origo)};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.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.Clone=function(){return new JSM.Sector(this.beg.Clone(),this.end.Clone())};
|
||||
JSM.CoordSectorPosition2D=function(a,b){var c=a.x,d=a.y,e=b.beg.x,f=b.beg.y,g=b.end.x,h=b.end.y,k=Math.pow(g-e,2)+Math.pow(h-f,2);if(JSM.IsZero(k))return JSM.CoordIsEqual2D(a,b.beg)?"CoordOnSectorEndCoord":"CoordOutsideOfSector";k=((c-e)*(g-e)+(d-f)*(h-f))/k;if(JSM.IsLower(k,0)||JSM.IsGreater(k,1))return"CoordOutsideOfSector";f+=k*(h-f);return!JSM.IsEqual(e+k*(g-e),c)||!JSM.IsEqual(f,d)?"CoordOutsideOfSector":JSM.IsEqual(k,0)||JSM.IsEqual(k,1)?"CoordOnSectorEndCoord":"CoordInsideOfSector"};
|
||||
c.origo)};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 JSM.CoordDistance2D(this.beg,this.end)};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 JSM.CoordDistance(this.beg,this.end)};JSM.Sector.prototype.Clone=function(){return new JSM.Sector(this.beg.Clone(),this.end.Clone())};
|
||||
JSM.CoordSectorPosition2D=function(a,b){var c=a.x,d=a.y,e=b.beg.x,f=b.beg.y,g=b.end.x,h=b.end.y,k=b.GetLength();if(JSM.IsZero(k))return JSM.CoordIsEqual2D(a,b.beg)?"CoordOnSectorEndCoord":"CoordOutsideOfSector";k=((c-e)*(g-e)+(d-f)*(h-f))/(k*k);if(JSM.IsLower(k,0)||JSM.IsGreater(k,1))return"CoordOutsideOfSector";f+=k*(h-f);return!JSM.IsEqual(e+k*(g-e),c)||!JSM.IsEqual(f,d)?"CoordOutsideOfSector":JSM.IsEqual(k,0)||JSM.IsEqual(k,1)?"CoordOnSectorEndCoord":"CoordInsideOfSector"};
|
||||
JSM.CoordSectorPosition=function(a,b){var c=a.x,d=a.y,e=a.z,f=b.beg,g=JSM.CoordSub(b.end,b.beg),h=f.x,k=f.y,l=f.z,m=f.x+g.x,n=f.y+g.y,p=f.z+g.z,q=(m-h)*(m-h)+(n-k)*(n-k)+(p-l)*(p-l);if(JSM.IsZero(q))return JSM.CoordIsEqual(f,a)?"CoordOnSectorEndCoord":"CoordOutsideOfSector";c=((m-h)*(c-h)+(n-k)*(d-k)+(p-l)*(e-l))/q;f=JSM.CoordAdd(f,JSM.VectorMultiply(g,c));f=JSM.CoordDistance(a,f);return JSM.IsZero(f)?JSM.IsLower(c,0)||JSM.IsGreater(c,1)?"CoordOutsideOfSector":JSM.IsEqual(c,0)||JSM.IsEqual(c,1)?"CoordOnSectorEndCoord":
|
||||
"CoordInsideOfSector":"CoordOutsideOfSector"};
|
||||
JSM.SectorSectorPosition2D=function(a,b,c){var d=a.beg.x,e=a.beg.y,f=a.end.x,g=a.end.y,h=b.beg.x,k=b.beg.y,l=b.end.x,m=b.end.y,n=(l-h)*(e-k)-(m-k)*(d-h),p=(f-d)*(e-k)-(g-e)*(d-h);if(JSM.IsZero(n)&&JSM.IsZero(p))return c=JSM.CoordSectorPosition2D(a.beg,b),d=JSM.CoordSectorPosition2D(a.end,b),e=JSM.CoordSectorPosition2D(b.beg,a),a=JSM.CoordSectorPosition2D(b.end,a),"CoordInsideOfSector"===c||("CoordInsideOfSector"===d||"CoordInsideOfSector"===e||"CoordInsideOfSector"===a)||"CoordOnSectorEndCoord"===
|
||||
c&&"CoordOnSectorEndCoord"===d&&"CoordOnSectorEndCoord"===e&&"CoordOnSectorEndCoord"===a?"SectorsIntersectsCoincident":"CoordOnSectorEndCoord"===c||"CoordOnSectorEndCoord"===d||"CoordOnSectorEndCoord"===e||"CoordOnSectorEndCoord"===a?"SectorsIntersectsEndPoint":"SectorsDontIntersects";a=(m-k)*(f-d)-(l-h)*(g-e);if(JSM.IsZero(a))return"SectorsDontIntersects";n/=a;p/=a;if(JSM.IsLower(n,0)||JSM.IsGreater(n,1)||JSM.IsLower(p,0)||JSM.IsGreater(p,1))return"SectorsDontIntersects";void 0!==c&&(c.x=d+n*(f-
|
||||
d),c.y=e+n*(g-e));return JSM.IsEqual(n,0)||JSM.IsEqual(n,1)||JSM.IsEqual(p,0)||JSM.IsEqual(p,1)?"SectorsIntersectsEndPoint":"SectorsIntersectsOnePoint"};JSM.GetSectorSegmentation=function(a,b,c){var d=JSM.CoordSub(a.end,a.beg),e=JSM.CoordDistance(a.beg,a.end)/b,f=0,g;for(g=0;g<=b;g++)c.push(JSM.CoordOffset(a.beg,d,f)),f+=e};JSM.Line2D=function(a,b){this.start=a;this.direction=b};JSM.Line2D.prototype.Set=function(a,b){this.start=a;this.direction=b};
|
||||
@ -82,8 +85,8 @@ JSM.CoordPolygonPosition2D=function(a,b){var c=b.VertexCount(),d,e,f;for(d=0;d<c
|
||||
e,f),"SectorsDontIntersects"!==k&&("SectorsIntersectsOnePoint"===k?h++:"SectorsIntersectsEndPoint"===k&&(JSM.CoordIsEqual2D(f,e.beg)?JSM.IsGreater(e.beg.y,e.end.y)&&h++:JSM.CoordIsEqual2D(f,e.end)&&JSM.IsLower(e.beg.y,e.end.y)&&h++));return 0===h%2?"CoordOutsideOfPolygon":"CoordInsideOfPolygon"};
|
||||
JSM.SectorIntersectsPolygon2D=function(a,b,c,d){var e=a.VertexCount(),f,g,h;for(f=0;f<e;f++)if(g=f,h=(f+1)%e,!(g==c||h==c||g==d||h==d))if(g=new JSM.Sector2D(a.GetVertex(g),a.GetVertex(h)),g=JSM.SectorSectorPosition2D(b,g),"SectorsDontIntersects"!==g)return!0;return!1};
|
||||
JSM.IsPolygonVertexVisible2D=function(a,b,c){if(b===c)return!1;var d=a.VertexCount();if(c===(0<b?b-1:d-1)||c===(b<d-1?b+1:0))return!1;d=new JSM.Sector2D(a.GetVertex(b),a.GetVertex(c));if(JSM.SectorIntersectsPolygon2D(a,d,b,c))return!1;b=JSM.MidCoord2D(d.beg,d.end);return"CoordInsideOfPolygon"!==JSM.CoordPolygonPosition2D(b,a)?!1:!0};
|
||||
JSM.CreatePolygonWithHole2D=function(a){var b=[],c=[],d=0,e;c.push(-1);for(e=0;e<a.length;e++)null===a[e]&&(c.push(e),d+=1);c.push(e);d+=1;for(e=0;e<d;e++){var f=e,g=c[f]+1,h=c[f+1];if(0===f){f=void 0;for(f=g;f<h;f++)b.push(f)}else{for(var g=void 0,g=new JSM.Polygon2D,h=new JSM.Polygon2D,k=void 0,l=void 0,l=void 0,k=0;k<b.length;k++)l=a[b[k]],g.AddVertex(l.x,l.y);for(var m=c[f]+1,n=c[f+1],k=m;k<n;k++)l=a[k],h.AddVertex(l.x,l.y);for(var p=null,q=void 0,r=void 0,t=void 0,k=0;k<g.VertexCount();k++){r=
|
||||
b[k];for(l=m;l<n;l++)if(t=l-m,q=new JSM.Sector(a[r],a[l]),!JSM.SectorIntersectsPolygon2D(g,q,k,-1)&&!JSM.SectorIntersectsPolygon2D(h,q,-1,t)){p=[r,l];break}if(null!==p)break}g=p;h=c[f]+1;f=c[f+1];k=[];n=m=void 0;for(m=0;m<b.length;m++)k[m]=b[m];b=[];p=l=void 0;for(m=0;m<k.length;m++)if(b.push(k[m]),k[m]==g[0]){n=g[1];l=!0;for(p=!1;!p;)b.push(n),!l&&n==g[1]&&(p=!0),l&&(l=!1),n=n<f-1?n+1:h;b.push(k[m])}}}return b};
|
||||
JSM.CreatePolygonWithHole2D=function(a){var b=[],c=[],d=0,e;c.push(-1);for(e=0;e<a.length;e++)null===a[e]&&(c.push(e),d+=1);c.push(e);d+=1;for(e=0;e<d;e++){var f=e,g=c[f]+1,h=c[f+1];if(0===f){f=void 0;for(f=g;f<h;f++)b.push(f)}else{for(var g=void 0,g=new JSM.Polygon2D,h=new JSM.Polygon2D,k=void 0,l=void 0,l=void 0,k=0;k<b.length;k++)l=a[b[k]],g.AddVertex(l.x,l.y);for(var m=c[f]+1,n=c[f+1],k=m;k<n;k++)l=a[k],h.AddVertex(l.x,l.y);for(var p=null,q=void 0,r=void 0,s=void 0,k=0;k<g.VertexCount();k++){r=
|
||||
b[k];for(l=m;l<n;l++)if(s=l-m,q=new JSM.Sector(a[r],a[l]),!JSM.SectorIntersectsPolygon2D(g,q,k,-1)&&!JSM.SectorIntersectsPolygon2D(h,q,-1,s)){p=[r,l];break}if(null!==p)break}g=p;h=c[f]+1;f=c[f+1];k=[];n=m=void 0;for(m=0;m<b.length;m++)k[m]=b[m];b=[];p=l=void 0;for(m=0;m<k.length;m++)if(b.push(k[m]),k[m]==g[0]){n=g[1];l=!0;for(p=!1;!p;)b.push(n),!l&&n==g[1]&&(p=!0),l&&(l=!1),n=n<f-1?n+1:h;b.push(k[m])}}}return b};
|
||||
JSM.PolygonTriangulate2D=function(a){function b(){var a=[],b,c,d,e;for(b=0;b<g.length;b++)if(d=g[b],3===d.length)if("CounterClockwise"===l)a.push(d);else{e=[];for(c=d.length-1;0<=c;c--)e.push(f-d[c]-1);a.push(e)}return a}function c(a,b,c){if(b===c)return!1;var d=a.VertexCount(),e;if(!(e=(b<d-1?b+1:0)===c))e=(0<b?b-1:d-1)===c;return e?!1:JSM.IsPolygonVertexVisible2D(a,b,c)}function d(a,b,c){var d=a.length;if(3>=d)return!0;var e,f,h,l;for(e=0;2>e;e++){h=f=-1;0===e?(f=b,h=c):1===e&&(f=c,h=b);l=[];for(l.push(a[h]);f!==
|
||||
h;f=f<d-1?f+1:0)l.push(a[f]);g.push(l)}return!0}var e=a.Clone(),f=e.VertexCount();if(3>f)return[];var g=[],h=[],k;for(a=0;a<f;a++)h.push(a);g.push(h);if(3===f)return b();var h=JSM.PolygonComplexity2D(e),l=JSM.PolygonOrientation2D(e);if("Invalid"===h||"Invalid"===l)return[];if("CounterClockwise"!==l){var m,n,p;for(a=0;a<f/2;a++)m=a,n=f-a-1,p=e.vertices[m],e.vertices[m]=e.vertices[n],e.vertices[n]=p}if("Convex"===h){for(a=0;a<f-2;a++)e=[],e.push(0),e.push((a+1)%f),e.push((a+2)%f),g.push(e);return b()}var q;
|
||||
for(a=0;a<g.length;a++)if(m=g[a],n=m.length,3!==n){p=new JSM.Polygon2D;for(h=0;h<n;h++)k=e.GetVertex(m[h]),p.AddVertex(k.x,k.y);q=!1;for(h=0;h<n;h++){for(k=0;k<n;k++)if(c(p,h,k)){d(m,h,k);q=!0;break}if(q)break}}return b()};
|
||||
@ -91,15 +94,16 @@ JSM.CheckTriangulation2D=function(a,b){var c=JSM.PolygonSignedArea2D(a),d=0,e,f,
|
||||
JSM.CreatePolygonWithHole=function(a){var b=[],c;for(c=0;c<a.length;c++)null!==a[c]&&b.push(a[c]);var b=JSM.CalculateNormal(b),d=new JSM.Coord(0,0,0),e=[],f;for(c=0;c<a.length;c++)null!==a[c]?(f=JSM.GetCoord2DFromCoord(a[c],d,b),e.push(f)):e.push(null);return JSM.CreatePolygonWithHole2D(e)};
|
||||
JSM.PolygonTriangulate=function(a){var b=new JSM.Polygon2D,c=JSM.CalculateNormal(a.vertices),d=new JSM.Coord(0,0,0),e=a.VertexCount(),f,g;for(f=0;f<e;f++)g=JSM.GetCoord2DFromCoord(a.GetVertex(f),d,c),b.AddVertex(g.x,g.y);return JSM.PolygonTriangulate2D(b)};
|
||||
JSM.OffsetPolygonContour=function(a,b){var c=a.VertexCount(),d=JSM.CalculateNormal(a.vertices),e,f,g,h,k,l=new JSM.Polygon,m;for(m=0;m<c;m++)e=0===m?c-1:m-1,f=m,g=m===c-1?0:m+1,e=a.GetVertex(e),f=a.GetVertex(f),h=a.GetVertex(g),k=JSM.CoordSub(e,f),g=JSM.CoordSub(h,f),k=JSM.GetVectorsAngle(k,g)/2,"Clockwise"===JSM.CoordTurnType(e,f,h,d)&&(k=Math.PI-k),e=b/Math.sin(k),e=JSM.CoordOffset(f,g,e),e=JSM.CoordRotate(e,d,k,f),l.AddVertex(e.x,e.y,e.z);return l};
|
||||
JSM.CutPolygonWithPlane=function(a,b,c,d,e){function f(a,b,c,d,e){1==b?c.push(a):-1==b?d.push(a):e.push(a)}function g(a,b,c,d){function e(a,b){if(!(2>b.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;c<b.length;c++)g=a.GetVertex(b[c]),d.push(JSM.CoordPlaneSignedDistance(g,f));for(c=0;c<b.length-1;c++)for(f=0;f<b.length-c-1;f++)if(JSM.IsGreater(d[f],d[f+1])){g=d;var h=f+1,l=g[f];g[f]=g[h];g[h]=l;g=b;h=f+1;l=g[f];g[f]=
|
||||
g[h];g[h]=l}}}function f(a,b,c,d,e,g){function h(a,b){a[a[b]]=-1;a[b]=-1}var l=[];(function(a,b,c){var d;for(d=0;d<a.VertexCount();d++)c.push(-1);for(d=0;d<b.length;d+=2){a=c;var e=b,f=d;a[e[f]]=e[f+1];a[e[f+1]]=e[f]}})(a,b,l);var k=0;g&&(k=b.length-1);for(var m=b[k],n=m,p=!1,q=0,r=new JSM.Polygon,t;;){p||(q=c[n],0!==q&&(p=!0));if(0<r.VertexCount()&&n==m)if(1==q?d.push(r):-1==q&&e.push(r),r=new JSM.Polygon,0<k&&k<b.length){n=m=b[k];continue}else break;t=a.GetVertex(n);r.AddVertex(t.x,t.y,t.z);-1!=
|
||||
l[n]?(k=g?k-2:k+2,n=l[n],h(l,n)):n=n<a.VertexCount()-1?n+1:0}}var g=function(a){var b=[],c,d,e,f;for(c=0;c<a.length;c++)if(d=a[c],0===d){d=0<c?c-1:a.length-1;e=c<a.length-1?c+1:0;f=a[d];e=a[e];if(0!==e&&0===f){for(;0===a[d];)d=0<d?d-1:a.length-1;f=a[d]}(-1==f&&1==e||1==f&&-1==e)&&b.push(c)}return b}(b);0===g.length||0!==g.length%2||(e(a,g),f(a,g,b,c,d,!1),f(a,g,b,c,d,!0))}var h=new JSM.Polygon,k=[];b=function(a,b,c,d){function e(a,c,d,f,g){function h(a,c,d,e,f,g){var k=d[d.length-1];0!==k&&(0!==g&&
|
||||
k!=g)&&(e=a.GetVertex(e),a=a.GetVertex(f),a=new JSM.Line(a,JSM.CoordSub(a,e)),f=new JSM.Coord(0,0,0),"LineIntersectsPlane"==JSM.LinePlanePosition(a,b,f)&&(c.AddVertex(f.x,f.y,f.z),d.push(0)))}function k(a,b,c,d,e){a=a.GetVertex(d);b.AddVertex(a.x,a.y,a.z);c.push(e)}var l=0===c,n=c===a.VertexCount(),p;n?(c=0,p=a.VertexCount()-1):p=c-1;f=f[c];l||h(a,d,g,p,c,f);n||k(a,d,g,c,f);return f}var f=[],g=!1,h=!1,k,s,x;for(k=0;k<a.VertexCount();k++)s=a.GetVertex(k),s=JSM.CoordPlanePosition(s,b),x=0,"CoordInFrontOfPlane"==
|
||||
s?(x=1,h=!0):"CoordAtBackOfPlane"==s&&(x=-1,g=!0),f.push(x);if(g&&h)for(k=0;k<=a.VertexCount();k++)e(a,k,c,f,d);else{if(g)return-1;if(h)return 1}return 0}(a,b,h,k);0===h.VertexCount()&&0===k.length?f(a,b,c,d,e):g(h,k,c,d);return 0===c.length+d.length+e.length?!1:!0};JSM.Octree=function(a,b){this.coords=[];this.root={center:JSM.MidCoord(a,b),size:JSM.CoordSub(b,a),coord:-1,children:null}};JSM.Octree.prototype.AddCoord=function(a){return this.AddCoordToNode(a,this.root)};
|
||||
JSM.Octree.prototype.FindCoord=function(a){a=this.FindNode(a,this.root);return null===a?-1:a.coord};JSM.Octree.prototype.AddCoordToNode=function(a,b){var c=this.FindNode(a,b);if(null===c)return-1;if(-1==c.coord)return c.coord=this.coords.length,this.coords.push(a),c.coord;if(JSM.CoordIsEqual(a,this.coords[c.coord]))return c.coord;this.SplitNode(c);return this.AddCoordToNode(a,c)};
|
||||
JSM.CutPolygonWithPlane=function(a,b,c,d,e){function f(a,b,c,d,e){1==b?c.push(a):-1==b?d.push(a):e.push(a)}function g(a,b,c,d){function e(a,b){if(!(2>b.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;c<b.length;c++)g=a.GetVertex(b[c]),d.push(JSM.CoordPlaneSignedDistance(g,f));for(c=0;c<b.length-1;c++)for(f=0;f<b.length-c-1;f++)if(JSM.IsGreater(d[f],d[f+1])){g=d;var h=f+1,k=g[f];g[f]=g[h];g[h]=k;g=b;h=f+1;k=g[f];g[f]=
|
||||
g[h];g[h]=k}}}function f(a,b,c,d,e,g){function h(a,b){a[a[b]]=-1;a[b]=-1}var k=[];(function(a,b,c){var d;for(d=0;d<a.VertexCount();d++)c.push(-1);for(d=0;d<b.length;d+=2){a=c;var e=b,f=d;a[e[f]]=e[f+1];a[e[f+1]]=e[f]}})(a,b,k);var l=0;g&&(l=b.length-1);for(var m=b[l],n=m,p=!1,q=0,s=new JSM.Polygon,r;;){p||(q=c[n],0!==q&&(p=!0));if(0<s.VertexCount()&&n==m)if(1==q?d.push(s):-1==q&&e.push(s),s=new JSM.Polygon,0<l&&l<b.length){n=m=b[l];continue}else break;r=a.GetVertex(n);s.AddVertex(r.x,r.y,r.z);-1!=
|
||||
k[n]?(l=g?l-2:l+2,n=k[n],h(k,n)):n=n<a.VertexCount()-1?n+1:0}}var g=function(a){var b=[],c,d,e,f;for(c=0;c<a.length;c++)if(d=a[c],0===d){d=0<c?c-1:a.length-1;e=c<a.length-1?c+1:0;f=a[d];e=a[e];if(0!==e&&0===f){for(;0===a[d];)d=0<d?d-1:a.length-1;f=a[d]}(-1==f&&1==e||1==f&&-1==e)&&b.push(c)}return b}(b);0===g.length||0!==g.length%2||(e(a,g),f(a,g,b,c,d,!1),f(a,g,b,c,d,!0))}var h=new JSM.Polygon,k=[];b=function(a,b,c,d){function e(a,c,d,f,g){function h(a,c,d,e,f,g){var k=d[d.length-1];0!==k&&(0!==g&&
|
||||
k!=g)&&(e=a.GetVertex(e),a=a.GetVertex(f),a=new JSM.Line(a,JSM.CoordSub(a,e)),f=new JSM.Coord(0,0,0),"LineIntersectsPlane"==JSM.LinePlanePosition(a,b,f)&&(c.AddVertex(f.x,f.y,f.z),d.push(0)))}function k(a,b,c,d,e){a=a.GetVertex(d);b.AddVertex(a.x,a.y,a.z);c.push(e)}var l=0===c,n=c===a.VertexCount(),p;n?(c=0,p=a.VertexCount()-1):p=c-1;f=f[c];l||h(a,d,g,p,c,f);n||k(a,d,g,c,f);return f}var f=[],g=!1,h=!1,k,t,x;for(k=0;k<a.VertexCount();k++)t=a.GetVertex(k),t=JSM.CoordPlanePosition(t,b),x=0,"CoordInFrontOfPlane"==
|
||||
t?(x=1,h=!0):"CoordAtBackOfPlane"==t&&(x=-1,g=!0),f.push(x);if(g&&h)for(k=0;k<=a.VertexCount();k++)e(a,k,c,f,d);else{if(g)return-1;if(h)return 1}return 0}(a,b,h,k);0===h.VertexCount()&&0===k.length?f(a,b,c,d,e):g(h,k,c,d);return 0===c.length+d.length+e.length?!1:!0};
|
||||
JSM.Octree=function(a,b){this.coords=[];this.root={center:JSM.MidCoord(a.min,a.max),size:JSM.CoordSub(a.max,a.min),coords:[],children:null};this.maxCoordNumInNodes=b;if(void 0===this.maxCoordNumInNodes||null===this.maxCoordNumInNodes||0===this.maxCoordNumInNodes)this.maxCoordNumInNodes=50};JSM.Octree.prototype.AddCoord=function(a){return this.AddCoordToNode(a,this.root)};JSM.Octree.prototype.FindCoord=function(a){var b=this.FindNode(a,this.root);return null===b?-1:this.FindCoordInNode(a,b)};
|
||||
JSM.Octree.prototype.FindCoordInNode=function(a,b){var c,d;for(c=0;c<b.coords.length;c++)if(d=b.coords[c],JSM.CoordIsEqual(a,this.coords[d]))return d;return-1};JSM.Octree.prototype.AddCoordToNode=function(a,b){var c=this.FindNode(a,b);if(null===c)return-1;var d=this.FindCoordInNode(a,c);if(-1!=d)return d;if(c.coords.length>=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.FindNode=function(a,b){if(null===b.children)return b;var c=a.x>b.center.x,d=a.y>b.center.y,e=a.z>b.center.z;return!c&&!d&&!e?this.FindNode(a,b.children[0]):c&&!d&&!e?this.FindNode(a,b.children[1]):c&&d&&!e?this.FindNode(a,b.children[2]):!c&&d&&!e?this.FindNode(a,b.children[3]):!c&&!d&&e?this.FindNode(a,b.children[4]):c&&!d&&e?this.FindNode(a,b.children[5]):c&&d&&e?this.FindNode(a,b.children[6]):!c&&d&&e?this.FindNode(a,b.children[7]):null};
|
||||
JSM.Octree.prototype.SplitNode=function(a){function b(a,b){var e=a.center.Clone(),f=JSM.VectorMultiply(a.size,0.5);e.x+=0.5*b.x*f.x;e.y+=0.5*b.y*f.y;e.z+=0.5*b.z*f.z;return{center:e,size:f,coord:-1,children:null}}a.children=[b(a,new JSM.Coord(-1,-1,-1)),b(a,new JSM.Coord(1,-1,-1)),b(a,new JSM.Coord(1,1,-1)),b(a,new JSM.Coord(-1,1,-1)),b(a,new JSM.Coord(-1,-1,1)),b(a,new JSM.Coord(1,-1,1)),b(a,new JSM.Coord(1,1,1)),b(a,new JSM.Coord(-1,1,1))];this.FindNode(this.coords[a.coord],a).coord=a.coord;a.coord=
|
||||
-1};JSM.BSPTree=function(){this.root=null};JSM.BSPTree.prototype.AddPolygon=function(a,b){null===this.root&&(this.root=this.GetNewNode());return this.AddPolygonToNode(this.root,a,b)};JSM.BSPTree.prototype.Traverse=function(a){this.TraverseNode(this.root,a)};JSM.BSPTree.prototype.TraverseNode=function(a,b){null!==a&&(b(a),this.TraverseNode(a.inside,b),this.TraverseNode(a.outside,b))};JSM.BSPTree.prototype.GetNodes=function(){var a=[];this.Traverse(function(b){a.push(b)});return a};
|
||||
JSM.Octree.prototype.SplitNode=function(a){function b(a,b,c,d){var k=a.center.Clone();a=JSM.VectorMultiply(a.size,0.5);k.x+=0.5*b*a.x;k.y+=0.5*c*a.y;k.z+=0.5*d*a.z;return{center:k,size:a,coords:[],children:null}}if(JSM.IsZero(a.size.x)&&JSM.IsZero(a.size.y)&&JSM.IsZero(a.size.z))return!1;a.children=[b(a,-1,-1,-1),b(a,1,-1,-1),b(a,1,1,-1),b(a,-1,1,-1),b(a,-1,-1,1),b(a,1,-1,1),b(a,1,1,1),b(a,-1,1,1)];var c=a.coords;a.coords=[];var d;for(d=0;d<c.length;d++)this.FindNode(this.coords[c[d]],a).coords.push(c[d]);
|
||||
return!0};JSM.BSPTree=function(){this.root=null};JSM.BSPTree.prototype.AddPolygon=function(a,b){null===this.root&&(this.root=this.GetNewNode());return this.AddPolygonToNode(this.root,a,b)};JSM.BSPTree.prototype.Traverse=function(a){this.TraverseNode(this.root,a)};JSM.BSPTree.prototype.TraverseNode=function(a,b){null!==a&&(b(a),this.TraverseNode(a.inside,b),this.TraverseNode(a.outside,b))};JSM.BSPTree.prototype.GetNodes=function(){var a=[];this.Traverse(function(b){a.push(b)});return a};
|
||||
JSM.BSPTree.prototype.NodeCount=function(){var a=0;this.Traverse(function(){a+=1});return a};
|
||||
JSM.BSPTree.prototype.AddPolygonToNode=function(a,b,c){if(3>b.VertexCount())return!1;var d;if(null===a.polygon){d=JSM.CalculateNormal(b.vertices);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)&&(0<d.length&&this.AddInsidePolygonsToNode(a,d,c),0<f.length&&this.AddOutsidePolygonsToNode(a,f,c),0<e.length&&(d=JSM.CalculateNormal(b.vertices),0<JSM.VectorDot(d,a.plane.GetNormal())?
|
||||
this.AddInsidePolygonsToNode(a,e,c):this.AddOutsidePolygonsToNode(a,e,c)))}return!0};JSM.BSPTree.prototype.AddInsidePolygonsToNode=function(a,b,c){null===a.inside&&(a.inside=this.GetNewNode(),a.inside.parent=a);var d;for(d=0;d<b.length;d++)this.AddPolygonToNode(a.inside,b[d],c)};JSM.BSPTree.prototype.AddOutsidePolygonsToNode=function(a,b,c){null===a.outside&&(a.outside=this.GetNewNode(),a.outside.parent=a);var d;for(d=0;d<b.length;d++)this.AddPolygonToNode(a.outside,b[d],c)};
|
||||
@ -107,13 +111,14 @@ JSM.BSPTree.prototype.GetNewNode=function(){return{polygon:null,userData:null,pl
|
||||
JSM.ClipPolygonWithBSPTree=function(a,b,c,d,e,f){function g(a,b,c){if(null!==b){var d=[],e=[],f=[];JSM.CutPolygonWithPlane(a,b.plane,e,d,f)&&(0<d.length&&k(b,d,c),0<e.length&&l(b,e,c),0<f.length&&(a=JSM.CalculateNormal(a.vertices),0<JSM.VectorDot(a,b.plane.GetNormal())?k(b,f,!0):l(b,f,!0)))}}function h(a,b){var c;for(c=0;c<a.length;c++)b.push(a[c])}function k(a,b,c){if(null!==a.inside){a=a.inside;var e;for(e=0;e<b.length;e++)g(b[e],a,c)}else h(b,c?f:d)}function l(a,b,d){if(null!==a.outside){a=a.outside;
|
||||
var f;for(f=0;f<b.length;f++)g(b[f],a,d)}else h(b,d?e:c)}g(a,b.root,!1);return!0};JSM.GetGaussianCParameter=function(a,b,c,d){return Math.sqrt(-(Math.pow(a-c,2)/(2*Math.log(d/Math.abs(b)))))};JSM.GetGaussianValue=function(a,b,c,d){return b*Math.exp(-(Math.pow(a-c,2)/(2*Math.pow(d,2))))};JSM.GenerateCirclePoints=function(a,b,c){var d=[],e=2*Math.PI,f=2*Math.PI/b,g,h;for(g=0;g<b;g++)h=JSM.CylindricalToCartesian(a,0,e),void 0!==c&&null!==c&&(h=JSM.CoordAdd(h,c)),d.push(h),e+=f;return d};
|
||||
JSM.GetRuledMesh=function(a,b,c,d,e){if(a.length===b.length){var f=a.length-1,g=[],h=[],k;for(k=0;k<=f;k++)g.push(JSM.CoordSub(b[k],a[k])),h.push(JSM.CoordDistance(a[k],b[k]));var l,m;for(k=0;k<=f;k++){l=h[k]/c;for(b=0;b<=c;b++)m=JSM.CoordOffset(a[k],g[k],l*b),d.push(m)}for(k=0;k<f;k++)for(b=0;b<c;b++)a=k*(c+1)+b,d=a+1,g=a+c+1,h=g+1,a=[a,g,h,d],e.push(a)}};JSM.BodyVertex=function(a){this.position=a};JSM.BodyVertex.prototype.GetPosition=function(){return this.position};
|
||||
JSM.BodyVertex.prototype.SetPosition=function(a){this.position=a};JSM.BodyVertex.prototype.Clone=function(){return new JSM.BodyVertex(this.position.Clone())};JSM.BodyPolygon=function(a){this.vertices=a;this.curved=this.material=-1};JSM.BodyPolygon.prototype.AddVertexIndex=function(a){this.vertices.push(a)};JSM.BodyPolygon.prototype.GetVertexIndex=function(a){return this.vertices[a]};JSM.BodyPolygon.prototype.VertexIndexCount=function(){return this.vertices.length};
|
||||
JSM.BodyPolygon.prototype.HasMaterialIndex=function(){return-1!==this.material};JSM.BodyPolygon.prototype.GetMaterialIndex=function(){return this.material};JSM.BodyPolygon.prototype.SetMaterialIndex=function(a){this.material=a};JSM.BodyPolygon.prototype.HasCurveGroup=function(){return-1!==this.curved};JSM.BodyPolygon.prototype.GetCurveGroup=function(){return this.curved};JSM.BodyPolygon.prototype.SetCurveGroup=function(a){this.curved=a};
|
||||
JSM.BodyPolygon.prototype.InheritAttributes=function(a){this.material=a.material;this.curved=a.curved};JSM.BodyPolygon.prototype.Clone=function(){var a=new JSM.BodyPolygon([]),b;for(b=0;b<this.vertices.length;b++)a.vertices.push(this.vertices[b]);a.material=this.material;a.curved=this.curved;return a};JSM.Body=function(){this.vertices=[];this.polygons=[];this.SetCubicTextureProjection(new JSM.Coord(0,0,0),new JSM.Coord(1,0,0),new JSM.Coord(0,1,0),new JSM.Coord(0,0,1))};
|
||||
JSM.Body.prototype.AddVertex=function(a){this.vertices.push(a);return this.vertices.length-1};JSM.Body.prototype.AddPolygon=function(a){this.polygons.push(a);return this.polygons.length-1};JSM.Body.prototype.GetVertex=function(a){return this.vertices[a]};JSM.Body.prototype.GetVertexPosition=function(a){return this.vertices[a].position};JSM.Body.prototype.SetVertexPosition=function(a,b){this.vertices[a].position=b};JSM.Body.prototype.VertexCount=function(){return this.vertices.length};
|
||||
JSM.Body.prototype.GetPolygon=function(a){return this.polygons[a]};JSM.Body.prototype.PolygonCount=function(){return this.polygons.length};JSM.Body.prototype.SetPolygonsMaterialIndex=function(a){var b;for(b=0;b<this.polygons.length;b++)this.polygons[b].SetMaterialIndex(a)};JSM.Body.prototype.SetPolygonsCurveGroup=function(a){var b;for(b=0;b<this.polygons.length;b++)this.polygons[b].SetCurveGroup(a)};JSM.Body.prototype.GetTextureProjectionType=function(){return this.projection};
|
||||
JSM.Body.prototype.SetTextureProjectionType=function(a){this.projection=a};JSM.Body.prototype.GetTextureProjectionCoords=function(){return this.coords};JSM.Body.prototype.SetTextureProjectionCoords=function(a){this.coords=a};JSM.Body.prototype.SetPlanarTextureProjection=function(a,b,c){this.SetTextureProjectionType("Planar");this.SetTextureProjectionCoords(new JSM.CoordSystem(a,b,JSM.VectorCross(b,c),new JSM.Coord(0,0,0)))};
|
||||
JSM.Body.prototype.SetCubicTextureProjection=function(a,b,c,d){this.SetTextureProjectionType("Cubic");this.SetTextureProjectionCoords(new JSM.CoordSystem(a,b,c,d))};JSM.Body.prototype.SetCylindricalTextureProjection=function(a,b,c,d){this.SetTextureProjectionType("Cylindrical");this.SetTextureProjectionCoords(new JSM.CoordSystem(a,JSM.VectorSetLength(c,b),JSM.VectorSetLength(JSM.VectorCross(d,c),b),d))};
|
||||
JSM.BodyVertex.prototype.SetPosition=function(a){this.position=a};JSM.BodyVertex.prototype.Clone=function(){return new JSM.BodyVertex(this.position.Clone())};JSM.BodyPolygon=function(a){this.vertices=a;this.curved=this.material=-1};JSM.BodyPolygon.prototype.AddVertexIndex=function(a){this.vertices.push(a)};JSM.BodyPolygon.prototype.GetVertexIndex=function(a){return this.vertices[a]};JSM.BodyPolygon.prototype.GetVertexIndices=function(){return this.vertices};
|
||||
JSM.BodyPolygon.prototype.SetVertexIndices=function(a){this.vertices=a};JSM.BodyPolygon.prototype.VertexIndexCount=function(){return this.vertices.length};JSM.BodyPolygon.prototype.HasMaterialIndex=function(){return-1!==this.material};JSM.BodyPolygon.prototype.GetMaterialIndex=function(){return this.material};JSM.BodyPolygon.prototype.SetMaterialIndex=function(a){this.material=a};JSM.BodyPolygon.prototype.HasCurveGroup=function(){return-1!==this.curved};JSM.BodyPolygon.prototype.GetCurveGroup=function(){return this.curved};
|
||||
JSM.BodyPolygon.prototype.SetCurveGroup=function(a){this.curved=a};JSM.BodyPolygon.prototype.InheritAttributes=function(a){this.material=a.material;this.curved=a.curved};JSM.BodyPolygon.prototype.Clone=function(){var a=new JSM.BodyPolygon([]),b;for(b=0;b<this.vertices.length;b++)a.vertices.push(this.vertices[b]);a.material=this.material;a.curved=this.curved;return a};
|
||||
JSM.Body=function(){this.vertices=[];this.polygons=[];this.SetCubicTextureProjection(new JSM.Coord(0,0,0),new JSM.Coord(1,0,0),new JSM.Coord(0,1,0),new JSM.Coord(0,0,1))};JSM.Body.prototype.AddVertex=function(a){this.vertices.push(a);return this.vertices.length-1};JSM.Body.prototype.AddPolygon=function(a){this.polygons.push(a);return this.polygons.length-1};JSM.Body.prototype.GetVertex=function(a){return this.vertices[a]};JSM.Body.prototype.GetVertexPosition=function(a){return this.vertices[a].position};
|
||||
JSM.Body.prototype.SetVertexPosition=function(a,b){this.vertices[a].position=b};JSM.Body.prototype.VertexCount=function(){return this.vertices.length};JSM.Body.prototype.GetPolygon=function(a){return this.polygons[a]};JSM.Body.prototype.PolygonCount=function(){return this.polygons.length};JSM.Body.prototype.SetPolygonsMaterialIndex=function(a){var b;for(b=0;b<this.polygons.length;b++)this.polygons[b].SetMaterialIndex(a)};JSM.Body.prototype.SetPolygonsCurveGroup=function(a){var b;for(b=0;b<this.polygons.length;b++)this.polygons[b].SetCurveGroup(a)};
|
||||
JSM.Body.prototype.GetTextureProjectionType=function(){return this.projection};JSM.Body.prototype.SetTextureProjectionType=function(a){this.projection=a};JSM.Body.prototype.GetTextureProjectionCoords=function(){return this.coords};JSM.Body.prototype.SetTextureProjectionCoords=function(a){this.coords=a};
|
||||
JSM.Body.prototype.SetPlanarTextureProjection=function(a,b,c){this.SetTextureProjectionType("Planar");this.SetTextureProjectionCoords(new JSM.CoordSystem(a,b,JSM.VectorCross(b,c),new JSM.Coord(0,0,0)))};JSM.Body.prototype.SetCubicTextureProjection=function(a,b,c,d){this.SetTextureProjectionType("Cubic");this.SetTextureProjectionCoords(new JSM.CoordSystem(a,b,c,d))};
|
||||
JSM.Body.prototype.SetCylindricalTextureProjection=function(a,b,c,d){this.SetTextureProjectionType("Cylindrical");this.SetTextureProjectionCoords(new JSM.CoordSystem(a,JSM.VectorSetLength(c,b),JSM.VectorSetLength(JSM.VectorCross(d,c),b),d))};
|
||||
JSM.Body.prototype.Transform=function(a){var b;for(b=0;b<this.vertices.length;b++)this.vertices[b].position=a.Apply(this.vertices[b].position);null!==this.coords&&(b=JSM.CoordSystemToAbsoluteCoords(this.coords),b.origo=a.Apply(b.origo),b.e1=a.Apply(b.e1),b.e2=a.Apply(b.e2),b.e3=a.Apply(b.e3),this.coords=JSM.CoordSystemToDirectionVectors(b))};
|
||||
JSM.Body.prototype.GetBoundingBox=function(){var a=new JSM.Coord(JSM.Inf,JSM.Inf,JSM.Inf),b=new JSM.Coord(-JSM.Inf,-JSM.Inf,-JSM.Inf),c,d;for(c=0;c<this.vertices.length;c++)d=this.vertices[c].position,a.x=JSM.Minimum(a.x,d.x),a.y=JSM.Minimum(a.y,d.y),a.z=JSM.Minimum(a.z,d.z),b.x=JSM.Maximum(b.x,d.x),b.y=JSM.Maximum(b.y,d.y),b.z=JSM.Maximum(b.z,d.z);return new JSM.Box(a,b)};JSM.Body.prototype.GetCenter=function(){return this.GetBoundingBox().GetCenter()};
|
||||
JSM.Body.prototype.GetBoundingSphereRadius=function(){var a=this.GetCenter(),b=0,c,d;for(c=0;c<this.vertices.length;c++)d=JSM.CoordDistance(a,this.vertices[c].position),JSM.IsGreater(d,b)&&(b=d);return b};JSM.Body.prototype.OffsetToOrigo=function(){var a=this.GetCenter(),a=JSM.VectorMultiply(a,-1),b;for(b=0;b<this.vertices.length;b++)this.vertices[b].position=JSM.CoordAdd(this.vertices[b].position,a)};
|
||||
@ -121,14 +126,14 @@ JSM.Body.prototype.Merge=function(a){var b=this.vertices.length,c,d;for(c=0;c<a.
|
||||
JSM.Model.prototype.AddBody=function(a){this.bodies.push(a);return this.bodies.length-1};JSM.Model.prototype.GetBody=function(a){return this.bodies[a]};JSM.Model.prototype.BodyCount=function(){return this.bodies.length};JSM.Model.prototype.VertexCount=function(){var a=0,b;for(b=0;b<this.bodies.length;b++)a+=this.bodies[b].VertexCount();return a};JSM.Model.prototype.PolygonCount=function(){var a=0,b;for(b=0;b<this.bodies.length;b++)a+=this.bodies[b].PolygonCount();return a};
|
||||
JSM.HexColorToRGBComponents=function(a){for(var b=a.toString(16);6>b.length;)b="0"+b;a=parseInt(b.substr(0,2),16);var c=parseInt(b.substr(2,2),16),b=parseInt(b.substr(4,2),16);return[a,c,b]};JSM.HexColorToNormalizedRGBComponents=function(a){a=JSM.HexColorToRGBComponents(a);return[a[0]/255,a[1]/255,a[2]/255]};JSM.HexColorToRGBColor=function(a){return parseInt("0x"+a,16)};
|
||||
JSM.RGBComponentsToHexColor=function(a,b,c){function d(a){for(a=parseInt(a,10).toString(16);2>a.length;)a="0"+a;return a}a=d(a);b=d(b);c=d(c);return parseInt("0x"+a+b+c,16)};JSM.Light=function(a){var b={ambient:8355711,diffuse:8355711,specular:0,direction:new JSM.Vector(1,0,0)};JSM.CopyObjectProperties(a,this,!0);JSM.CopyObjectProperties(b,this,!1)};
|
||||
JSM.Material=function(a){JSM.CopyObjectProperties(a,this,!0);JSM.CopyObjectProperties({ambient:52224,diffuse:52224,specular:0,shininess:0,opacity:1,texture:null,textureWidth:1,textureHeight:1},this,!1)};JSM.Materials=function(){this.materials=[];this.defaultMaterial=new JSM.Material};JSM.Materials.prototype.GetMaterial=function(a){return 0>a||a>=this.materials.length?this.defaultMaterial:this.materials[a]};JSM.Materials.prototype.AddMaterial=function(a){this.materials.push(a)};
|
||||
JSM.Materials.prototype.GetDefaultMaterial=function(){return this.defaultMaterial};JSM.Materials.prototype.Count=function(){return this.materials.length};JSM.VertInfo=function(){this.edges=[];this.pgons=[]};JSM.EdgeInfo=function(){this.pgon2=this.pgon1=this.vert2=this.vert1=-1};JSM.PolyEdgeInfo=function(){this.index=-1;this.reverse=!1};JSM.PgonInfo=function(){this.verts=[];this.pedges=[]};JSM.AdjacencyInfo=function(){this.verts=[];this.edges=[];this.pgons=[]};
|
||||
JSM.GetPolyEdgeStartVertex=function(a,b){return a.reverse?b.edges[a.index].vert2:b.edges[a.index].vert1};JSM.GetPolyEdgeEndVertex=function(a,b){return a.reverse?b.edges[a.index].vert1:b.edges[a.index].vert2};JSM.GetAnotherPgonOfEdge=function(a,b){return-1!=a.pgon1&&a.pgon1!=b?a.pgon1:-1!=a.pgon2&&a.pgon2!=b?a.pgon2:-1};
|
||||
JSM.Material=function(a){JSM.CopyObjectProperties(a,this,!0);JSM.CopyObjectProperties({ambient:52224,diffuse:52224,specular:0,shininess:0,opacity:1,texture:null,textureWidth:1,textureHeight:1},this,!1)};JSM.Materials=function(){this.materials=[];this.defaultMaterial=new JSM.Material};JSM.Materials.prototype.GetMaterial=function(a){return 0>a||a>=this.materials.length?this.defaultMaterial:this.materials[a]};
|
||||
JSM.Materials.prototype.AddMaterial=function(a){this.materials.push(a);return this.materials.length-1};JSM.Materials.prototype.GetDefaultMaterial=function(){return this.defaultMaterial};JSM.Materials.prototype.Count=function(){return this.materials.length};JSM.VertInfo=function(){this.edges=[];this.pgons=[]};JSM.EdgeInfo=function(){this.pgon2=this.pgon1=this.vert2=this.vert1=-1};JSM.PolyEdgeInfo=function(){this.index=-1;this.reverse=!1};JSM.PgonInfo=function(){this.verts=[];this.pedges=[]};
|
||||
JSM.AdjacencyInfo=function(){this.verts=[];this.edges=[];this.pgons=[]};JSM.GetPolyEdgeStartVertex=function(a,b){return a.reverse?b.edges[a.index].vert2:b.edges[a.index].vert1};JSM.GetPolyEdgeEndVertex=function(a,b){return a.reverse?b.edges[a.index].vert1:b.edges[a.index].vert2};JSM.GetAnotherPgonOfEdge=function(a,b){return-1!=a.pgon1&&a.pgon1!=b?a.pgon1:-1!=a.pgon2&&a.pgon2!=b?a.pgon2:-1};
|
||||
JSM.CalculateBodyVertexToPolygon=function(a){var b=[],c,d;for(c=0;c<a.VertexCount();c++)b.push([]);var e;for(c=0;c<a.PolygonCount();c++){e=a.GetPolygon(c);for(d=0;d<e.VertexIndexCount();d++)b[e.GetVertexIndex(d)].push(c)}return b};
|
||||
JSM.CalculateAdjacencyInfo=function(a){var b=new JSM.AdjacencyInfo,c,d,e;for(c=0;c<a.VertexCount();c++)d=new JSM.VertInfo,b.verts.push(d);var f,g,h,k,l;for(c=0;c<a.PolygonCount();c++){f=a.GetPolygon(c);e=new JSM.PgonInfo;g=f.VertexIndexCount();for(d=0;d<g;d++){h=f.GetVertexIndex(d);k=f.GetVertexIndex(d<g-1?d+1:0);l=h;var m=k;k=c;for(var n=new JSM.PolyEdgeInfo,p=void 0,q=void 0,p=0;p<b.edges.length;p++)q=b.edges[p],q.vert1===l&&q.vert2===m?(n.index=p,n.reverse=!1):q.vert1===m&&q.vert2===l&&(n.index=
|
||||
p,n.reverse=!0);-1===n.index?(p=new JSM.EdgeInfo,p.vert1=l,p.vert2=m,p.pgon1=k,p.pgon2=-1,b.edges.push(p),n.index=b.edges.length-1,n.reverse=!1):(l=b.edges[n.index],-1===l.pgon1?l.pgon1=k:l.pgon1!==k&&-1===l.pgon2&&(l.pgon2=k));l=n;e.verts.push(h);e.pedges.push(l);b.verts[h].edges.push(l.index);b.verts[h].pgons.push(c)}b.pgons.push(e)}return b};JSM.IsSolidBody=function(a){a=JSM.CalculateAdjacencyInfo(a);var b,c;for(b=0;b<a.edges.length;b++)if(c=a.edges[b],-1===c.pgon1||-1===c.pgon2)return!1;return!0};
|
||||
JSM.CheckSolidBody=function(a){a=JSM.CalculateAdjacencyInfo(a);var b,c,d,e,f,g,h,k;for(b=0;b<a.edges.length;b++){d=a.edges[b];if(-1===d.pgon1||-1===d.pgon2)return!1;g=a.pgons[d.pgon1];f=!1;for(c=0;c<g.pedges.length;c++)if(e=g.pedges[c],e.index==b){h=e.reverse;f=!0;break}if(!f)return!1;d=a.pgons[d.pgon2];f=!1;for(c=0;c<d.pedges.length;c++)if(e=d.pedges[c],e.index==b){k=e.reverse;f=!0;break}if(!f||h==k)return!1}return!0};
|
||||
JSM.TraversePgonsAlongEdges=function(a,b,c){var d=[],e;for(e=0;e<b.pgons.length;e++)d.push(!1);for(a=[a];0<a.length;)if(e=a.pop(),!d[e]&&(d[e]=!0,c(e)))for(var f=b,g=a,h=f.pgons[e],k=void 0,l=void 0,l=void 0,k=0;k<h.pedges.length;k++)l=f.edges[h.pedges[k].index],l=JSM.GetAnotherPgonOfEdge(l,e),-1!=l&&g.push(l)};JSM.AddVertexToBody=function(a,b,c,d){a.AddVertex(new JSM.BodyVertex(new JSM.Coord(b,c,d)))};JSM.AddPolygonToBody=function(a,b){a.AddPolygon(new JSM.BodyPolygon(b))};
|
||||
JSM.CalculateBodyVertexToPolygon=function(a){var b=[],c,d;for(c=0;c<a.VertexCount();c++)b.push([]);var e;for(c=0;c<a.PolygonCount();c++){e=a.GetPolygon(c);for(d=0;d<e.VertexIndexCount();d++)b[e.GetVertexIndex(d)].push(c)}return b};
|
||||
JSM.TraversePgonsAlongEdges=function(a,b,c){var d={};a=[a];for(var e;0<a.length;)if(e=a.pop(),!d[e]&&(d[e]=!0,c(e)))for(var f=b,g=a,h=f.pgons[e],k=void 0,l=void 0,l=void 0,k=0;k<h.pedges.length;k++)l=f.edges[h.pedges[k].index],l=JSM.GetAnotherPgonOfEdge(l,e),-1!=l&&g.push(l)};JSM.AddVertexToBody=function(a,b,c,d){a.AddVertex(new JSM.BodyVertex(new JSM.Coord(b,c,d)))};JSM.AddPolygonToBody=function(a,b){a.AddPolygon(new JSM.BodyPolygon(b))};
|
||||
JSM.CalculateBodyPolygonNormal=function(a,b){var c=a.GetPolygon(b),d=c.VertexIndexCount(),e=new JSM.Vector(0,0,0);if(3<=d){var f,g,h;for(f=0;f<d;f++)g=f,h=(f+1)%d,g=a.GetVertexPosition(c.GetVertexIndex(g)),h=a.GetVertexPosition(c.GetVertexIndex(h)),e.x+=(g.y-h.y)*(g.z+h.z),e.y+=(g.z-h.z)*(g.x+h.x),e.z+=(g.x-h.x)*(g.y+h.y)}return JSM.VectorNormalize(e)};JSM.CalculateBodyPolygonNormals=function(a){var b=[],c;for(c=0;c<a.PolygonCount();c++)b.push(JSM.CalculateBodyPolygonNormal(a,c));return b};
|
||||
JSM.CalculateBodyVertexNormals=function(a){var b=[],c=JSM.CalculateBodyPolygonNormals(a),d=null,e,f,g,h,k,l,m,n;for(e=0;e<a.PolygonCount();e++)if(h=a.GetPolygon(e),b[e]=[],h.HasCurveGroup()){null===d&&(d=JSM.CalculateBodyVertexToPolygon(a));for(f=0;f<h.VertexIndexCount();f++){k=new JSM.Vector(0,0,0);l=0;m=d[h.GetVertexIndex(f)];for(g=0;g<m.length;g++)n=a.GetPolygon(m[g]),n.GetCurveGroup()===h.GetCurveGroup()&&(k=JSM.CoordAdd(k,c[m[g]]),l++);k=JSM.VectorMultiply(k,1/l);k=JSM.VectorNormalize(k);b[e].push(k)}}else{g=
|
||||
c[e];for(f=0;f<h.VertexIndexCount();f++)b[e].push(new JSM.Vector(g.x,g.y,g.z))}return b};JSM.MakeBodyInsideOut=function(a){var b,c,d,e,f;for(b=0;b<a.PolygonCount();b++){d=a.GetPolygon(b);f=d.vertices.slice(0);e=f.length;d.vertices=[];for(c=0;c<e;c++)d.vertices.push(f[e-c-1])}};
|
||||
@ -137,7 +142,10 @@ JSM.CalculatePolygonCentroid=function(a,b){var c=a.GetPolygon(b),d=c.VertexIndex
|
||||
JSM.TriangulateWithCentroids=function(a){var b=new JSM.Body,c,d;for(c=0;c<a.VertexCount();c++)d=a.GetVertex(c).position,b.AddVertex(new JSM.BodyVertex(new JSM.Coord(d.x,d.y,d.z)));var e,f,g,h,k;for(c=0;c<a.PolygonCount();c++){d=JSM.CalculatePolygonCentroid(a,c);k=b.VertexCount();b.AddVertex(new JSM.BodyVertex(new JSM.Coord(d.x,d.y,d.z)));f=a.GetPolygon(c);g=f.VertexIndexCount();for(d=0;d<g;d++)e=f.GetVertexIndex(d),h=f.GetVertexIndex(d<g-1?d+1:0),e=new JSM.BodyPolygon([e,h,k]),e.material=f.material,
|
||||
e.curved=f.curved,b.AddPolygon(e)}return b};
|
||||
JSM.TriangulatePolygons=function(a){var b=new JSM.Body,c,d,e;for(c=0;c<a.VertexCount();c++)e=a.GetVertexPosition(c),b.AddVertex(new JSM.BodyVertex(new JSM.Coord(e.x,e.y,e.z)));var f,g;for(c=0;c<a.PolygonCount();c++){f=new JSM.Polygon;g=a.GetPolygon(c);for(d=0;d<g.VertexIndexCount();d++)e=a.GetVertexPosition(g.GetVertexIndex(d)),f.AddVertex(e.x,e.y,e.z);e=JSM.PolygonTriangulate(f);for(d=0;d<e.length;d++)f=e[d],f=new JSM.BodyPolygon([g.GetVertexIndex(f[0]),g.GetVertexIndex(f[1]),g.GetVertexIndex(f[2])]),
|
||||
f.InheritAttributes(g),b.AddPolygon(f)}return b};JSM.GenerateRandomMaterials=function(a,b,c){var d,e;for(d=0;d<a.PolygonCount();d++)e=void 0!==c&&c?JSM.SeededRandomInt(0,16777215,d+1):JSM.RandomInt(0,16777215),b.AddMaterial(new JSM.Material({ambient:e,diffuse:e})),e=b.Count()-1,a.GetPolygon(d).SetMaterialIndex(e)};
|
||||
f.InheritAttributes(g),b.AddPolygon(f)}return b};JSM.GenerateRandomMaterials=function(a,b,c){var d,e;for(d=0;d<a.PolygonCount();d++)e=void 0!==c&&c?JSM.SeededRandomInt(0,16777215,d+1):JSM.RandomInt(0,16777215),e=b.AddMaterial(new JSM.Material({ambient:e,diffuse:e})),a.GetPolygon(d).SetMaterialIndex(e)};
|
||||
JSM.MergeCoplanarPolygons=function(a){function b(a,b,c,d,e){function f(a,b,c){var d,e,g={};for(d=0;d<a.length;d++)g[a[d]]=!0;var h=-1,k,l,m;for(d=0;d<a.length;d++){k=b.pgons[a[d]];for(e=0;e<k.pedges.length;e++)if(l=k.pedges[e],m=b.edges[l.index],!g[m.pgon1]||!g[m.pgon2])l.reverse?(l=m.vert2,m=m.vert1):(l=m.vert1,m=m.vert2),c[l]=m,-1==h&&(h=l)}return h}function g(a,b,c,d){var e=[],f,h,k;for(f=0;f<c.length;f++)h=c[f],k=d[h],void 0===k&&(k=a.GetVertexPosition(h),k=b.AddVertex(new JSM.BodyVertex(k.Clone())),
|
||||
d[h]=k),e.push(k);b.AddPolygon(new JSM.BodyPolygon(e))}if(0!==c.length){var h=[];if(1==c.length)h=a.GetPolygon(c[0]).GetVertexIndices();else{var u=[];b=f(c,b,u);if(-1==b)return;c=b;do{if(void 0===c)break;h.push(c);c=u[c]}while(c!=b)}g(a,e,h,d)}}var c=new JSM.Body,d=JSM.CalculateAdjacencyInfo(a),e=function(a,b){function c(a,b,d,e){if(e[a])return null;var f=[],g;JSM.TraversePgonsAlongEdges(a,b,function(b){g=JSM.GetVectorsAngle(d[a],d[b]);return JSM.IsEqual(g,0)?(f.push(b),e[b]=!0):!1});return f}var d=
|
||||
JSM.CalculateBodyPolygonNormals(a),e=[],f={},g;for(g=0;g<b.pgons.length;g++)h=c(g,b,d,f),null!==h&&e.push(h);return e}(a,d),f={},g,h;for(g=0;g<e.length;g++)h=e[g],b(a,d,h,f,c);return c};
|
||||
JSM.CalculatePlanarTextureCoord=function(a,b){var c=new JSM.Coord2D(0,0),d=JSM.VectorNormalize(b.e1),e=JSM.VectorNormalize(b.e2),f=JSM.VectorCross(b.e1,b.e2),f=JSM.GetPlaneFromCoordAndDirection(b.origo,f),e=JSM.GetPlaneFromCoordAndDirection(b.origo,e),d=JSM.GetPlaneFromCoordAndDirection(b.origo,d),f=JSM.ProjectCoordToPlane(a,f);c.x=JSM.CoordPlaneSignedDistance(f,d);c.y=JSM.CoordPlaneSignedDistance(f,e);return c};
|
||||
JSM.CalculateCubicTextureCoord=function(a,b,c){var d=new JSM.Coord2D(0,0),e=JSM.VectorNormalize(c.e1),f=JSM.VectorNormalize(c.e2),g=JSM.VectorNormalize(c.e3),h=-1,k=0,l,m,n;for(l=0;3>l;l++)0===l?m=e:1===l?m=f:2===l&&(m=g),n=Math.abs(JSM.VectorDot(b,m)),JSM.IsGreater(n,k)&&(h=l,k=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=JSM.VectorNormalize(c.e3);if(JSM.VectorsAreCollinear(e,b))return d=JSM.CalculateCubicTextureCoord(a,b,c),[d,0];b=new JSM.Line(c.origo,e);var f=JSM.ProjectCoordToLine(a,b);b=JSM.CoordSignedDistance(c.origo,f,e);var g=JSM.VectorNormalize(c.e1);a=JSM.CoordSub(a,f);e=JSM.GetVectorsFullAngle(a,g,e);c=JSM.VectorLength(c.e1);d.x=e*c;d.y=b;return[d,e]};
|
||||
@ -145,9 +153,9 @@ JSM.CalculatePolygonPlanarTextureCoords=function(a,b){var c=[],d=a.GetPolygon(b)
|
||||
JSM.CalculatePolygonCylindricalTextureCoords=function(a,b,c){var d=[],e=[],f=a.GetPolygon(b);b=a.GetTextureProjectionCoords();var g,h;for(g=0;g<f.VertexIndexCount();g++)h=a.GetVertexPosition(f.GetVertexIndex(g)),h=JSM.CalculateCylindricalTextureCoord(h,c,b),d.push(h[0]),e.push(h[1]);g=JSM.VectorNormalize(b.e3);if(JSM.VectorsAreCollinear(g,c))return d;a=!1;for(g=0;g<e.length;g++){for(c=g+1;c<e.length;c++)if(JSM.IsGreater(Math.abs(e[g]-e[c]),Math.PI)){a=!0;break}if(a)break}if(a){b=JSM.VectorLength(b.e1);
|
||||
for(g=0;g<e.length;g++)JSM.IsLower(e[g],Math.PI)&&(d[g].x=b*(e[g]+2*Math.PI))}return d};JSM.CalculateBodyPlanarTextureCoords=function(a){var b=[],c;for(c=0;c<a.PolygonCount();c++)b.push(JSM.CalculatePolygonPlanarTextureCoords(a,c));return b};JSM.CalculateBodyCubicTextureCoords=function(a){var b=[],c=JSM.CalculateBodyPolygonNormals(a),d,e;for(d=0;d<a.PolygonCount();d++)e=c[d],b.push(JSM.CalculatePolygonCubicTextureCoords(a,d,e));return b};
|
||||
JSM.CalculateBodyCylindricalTextureCoords=function(a){var b=[],c=JSM.CalculateBodyPolygonNormals(a),d,e;for(d=0;d<a.PolygonCount();d++)e=c[d],b.push(JSM.CalculatePolygonCylindricalTextureCoords(a,d,e));return b};JSM.CalculateBodyTextureCoords=function(a){var b=[],c=a.GetTextureProjectionType();"Planar"===c?b=JSM.CalculateBodyPlanarTextureCoords(a):"Cubic"===c?b=JSM.CalculateBodyCubicTextureCoords(a):"Cylindrical"===c&&(b=JSM.CalculateBodyCylindricalTextureCoords(a));return b};
|
||||
JSM.CutBodyByPlane=function(a,b){function c(a,b,c){function d(a){q.push(new JSM.Coord(p.x,p.y,p.z));r.push(a)}function e(c,d){t=JSM.VectorNormalize(JSM.CoordSub(a[d],a[c]));M=new JSM.Line(a[c],t);H=JSM.LinePlaneIntersection(M,b);q.push(new JSM.Coord(H.x,H.y,H.z));r.push(-1)}var f=void 0!==c&&null!==c,g=a.length,h=[],k=[],l=!1,m,n,p;for(m=0;m<g;m++)p=a[m],n=JSM.CoordPlanePosition(p,b),k.push("CoordAtBackOfPlane"!==n),0<m&&k[m-1]!==k[m]&&(l=!0);if(!l){if(!1===k[0])return h;for(m=0;m<g;m++)p=a[m],h.push(new JSM.Coord(p.x,
|
||||
p.y,p.z)),f&&c.push(m);return h}var q=[],r=[],t,M,H;for(m=0;m<g;m++)l=m-1,n=m,0===m&&(l=g-1),p=a[n],k[n]?(k[l]||e(l,n),d(n)):k[l]&&e(l,n);for(m=0;m<q.length;m++)g=q[m],k=h[h.length-1],0===m||!JSM.CoordIsEqual(k,g)?(h.push(new JSM.Coord(g.x,g.y,g.z)),f&&(g=r[m],c.push(g))):f&&(g=r[m],k=r[m-1],-1!==g?c[c.length-1]=g:-1!==k&&(c[c.length-1]=k));return h}function d(a){var b=-1,c;for(c=t;c<e.VertexCount();c++)if(JSM.CoordIsEqual(e.GetVertexPosition(c),a)){b=c;break}-1===b&&(b=e.AddVertex(new JSM.BodyVertex(new JSM.Coord(a.x,
|
||||
a.y,a.z))));return b}var e=new JSM.Body,f=[],g=[],h=[],k=[],l,m,n,p,q;for(l=0;l<a.PolygonCount();l++){n=a.GetPolygon(l);p=[];for(m=0;m<n.VertexIndexCount();m++)q=a.GetVertexPosition(n.GetVertexIndex(m)),p.push(new JSM.Coord(q.x,q.y,q.z));q=[];p=c(p,b,q);for(m=0;m<q.length;m++)-1!==q[m]&&(h[n.GetVertexIndex(q[m])]=!0);f.push(p);g.push(q)}var r;for(l=0;l<a.VertexCount();l++)h[l]&&(r=a.GetVertexPosition(l),k[l]=e.AddVertex(new JSM.BodyVertex(new JSM.Coord(r.x,r.y,r.z))));var t=e.VertexCount();for(l=
|
||||
JSM.CutBodyByPlane=function(a,b){function c(a,b,c){function d(a){q.push(new JSM.Coord(p.x,p.y,p.z));s.push(a)}function e(c,d){r=JSM.VectorNormalize(JSM.CoordSub(a[d],a[c]));M=new JSM.Line(a[c],r);H=JSM.LinePlaneIntersection(M,b);q.push(new JSM.Coord(H.x,H.y,H.z));s.push(-1)}var f=void 0!==c&&null!==c,g=a.length,h=[],k=[],l=!1,m,n,p;for(m=0;m<g;m++)p=a[m],n=JSM.CoordPlanePosition(p,b),k.push("CoordAtBackOfPlane"!==n),0<m&&k[m-1]!==k[m]&&(l=!0);if(!l){if(!1===k[0])return h;for(m=0;m<g;m++)p=a[m],h.push(new JSM.Coord(p.x,
|
||||
p.y,p.z)),f&&c.push(m);return h}var q=[],s=[],r,M,H;for(m=0;m<g;m++)l=m-1,n=m,0===m&&(l=g-1),p=a[n],k[n]?(k[l]||e(l,n),d(n)):k[l]&&e(l,n);for(m=0;m<q.length;m++)g=q[m],k=h[h.length-1],0===m||!JSM.CoordIsEqual(k,g)?(h.push(new JSM.Coord(g.x,g.y,g.z)),f&&(g=s[m],c.push(g))):f&&(g=s[m],k=s[m-1],-1!==g?c[c.length-1]=g:-1!==k&&(c[c.length-1]=k));return h}function d(a){var b=-1,c;for(c=s;c<e.VertexCount();c++)if(JSM.CoordIsEqual(e.GetVertexPosition(c),a)){b=c;break}-1===b&&(b=e.AddVertex(new JSM.BodyVertex(new JSM.Coord(a.x,
|
||||
a.y,a.z))));return b}var e=new JSM.Body,f=[],g=[],h=[],k=[],l,m,n,p,q;for(l=0;l<a.PolygonCount();l++){n=a.GetPolygon(l);p=[];for(m=0;m<n.VertexIndexCount();m++)q=a.GetVertexPosition(n.GetVertexIndex(m)),p.push(new JSM.Coord(q.x,q.y,q.z));q=[];p=c(p,b,q);for(m=0;m<q.length;m++)-1!==q[m]&&(h[n.GetVertexIndex(q[m])]=!0);f.push(p);g.push(q)}var r;for(l=0;l<a.VertexCount();l++)h[l]&&(r=a.GetVertexPosition(l),k[l]=e.AddVertex(new JSM.BodyVertex(new JSM.Coord(r.x,r.y,r.z))));var s=e.VertexCount();for(l=
|
||||
0;l<a.PolygonCount();l++)if(n=a.GetPolygon(l),p=f[l],q=g[l],0!==q.length){h=[];for(m=0;m<q.length;m++)-1!==q[m]?h.push(k[n.GetVertexIndex(q[m])]):(r=p[m],h.push(d(r)));m=new JSM.BodyPolygon(h);m.InheritAttributes(n);e.AddPolygon(m)}return e};
|
||||
JSM.GenerateRectangle=function(a,b){var c=new JSM.Body,d=a/2,e=b/2;c.AddVertex(new JSM.BodyVertex(new JSM.Coord(-d,-e,0)));c.AddVertex(new JSM.BodyVertex(new JSM.Coord(d,-e,0)));c.AddVertex(new JSM.BodyVertex(new JSM.Coord(d,e,0)));c.AddVertex(new JSM.BodyVertex(new JSM.Coord(-d,e,0)));c.AddPolygon(new JSM.BodyPolygon([0,1,2,3]));c.SetCubicTextureProjection(new JSM.Coord(-d,-e,0),new JSM.Coord(1,0,0),new JSM.Coord(0,1,0),new JSM.Coord(0,0,1));return c};
|
||||
JSM.GenerateCuboid=function(a,b,c){var d=new JSM.Body;a/=2;b/=2;c/=2;d.AddVertex(new JSM.BodyVertex(new JSM.Coord(-a,-b,-c)));d.AddVertex(new JSM.BodyVertex(new JSM.Coord(a,-b,-c)));d.AddVertex(new JSM.BodyVertex(new JSM.Coord(a,-b,c)));d.AddVertex(new JSM.BodyVertex(new JSM.Coord(-a,-b,c)));d.AddVertex(new JSM.BodyVertex(new JSM.Coord(-a,b,-c)));d.AddVertex(new JSM.BodyVertex(new JSM.Coord(a,b,-c)));d.AddVertex(new JSM.BodyVertex(new JSM.Coord(a,b,c)));d.AddVertex(new JSM.BodyVertex(new JSM.Coord(-a,
|
||||
@ -156,8 +164,8 @@ JSM.GenerateCuboidSides=function(a,b,c,d){var e=new JSM.Body;a/=2;b/=2;c/=2;e.Ad
|
||||
b,c)));d[0]&&e.AddPolygon(new JSM.BodyPolygon([0,1,2,3]));d[1]&&e.AddPolygon(new JSM.BodyPolygon([1,5,6,2]));d[2]&&e.AddPolygon(new JSM.BodyPolygon([5,4,7,6]));d[3]&&e.AddPolygon(new JSM.BodyPolygon([4,0,3,7]));d[4]&&e.AddPolygon(new JSM.BodyPolygon([0,4,5,1]));d[5]&&e.AddPolygon(new JSM.BodyPolygon([3,2,6,7]));e.SetCubicTextureProjection(new JSM.Coord(-a,-b,-c),new JSM.Coord(1,0,0),new JSM.Coord(0,1,0),new JSM.Coord(0,0,1));return e};
|
||||
JSM.GenerateSegmentedRectangle=function(a,b,c,d){var e=new JSM.Body,f=a/2,g=b/2,h=a/c,k=b/d;(function(){var a,b,n;for(a=0;a<=d;a++)for(b=0;b<=c;b++)n=new JSM.Coord(b*h-f,a*k-g,0),e.AddVertex(new JSM.BodyVertex(n))})();(function(){var a,b,f,g,h,k;for(b=0;b<d;b++)for(a=0;a<c;a++)f=b*(c+1)+a,g=f+1,h=f+c+1,k=h+1,e.AddPolygon(new JSM.BodyPolygon([f,g,k,h]))})();return e};
|
||||
JSM.GenerateSegmentedCuboid=function(a,b,c,d){function e(a){var b=0;0<a&&a<=d&&(b=(d+1)*(d+1)+(a-1)*4*d);return b}function f(a){var b=[],c=e(a);if(0===a||a===d){for(a=0;a<=d;a++)b.push(c+a);for(a=1;a<=d;a++)b.push(c+(a+1)*d+a);for(a=d-1;0<=a;a--)b.push(c+(d+1)*d+a);for(a=d-1;0<a;a--)b.push(c+a*(d+1))}else if(0<a&&a<d){for(a=0;a<=d;a++)b.push(c+a);for(a=1;a<d;a++)b.push(c+d+2*a);for(a=d;0<=a;a--)b.push(c+3*d+a-1);for(a=d-1;0<a;a--)b.push(c+d+2*a-1)}return b}function g(a){var b,c,e=a*r;if(0===a||a===
|
||||
d)for(a=0;a<=d;a++)for(b=0;b<=d;b++)c=new JSM.Coord(b*p-l,a*q-m,e-n),k.AddVertex(new JSM.BodyVertex(c));else if(0<a&&a<d)for(a=0;a<=d;a++)for(b=0;b<=d;b++)if(0===a||a===d||0===b||b===d)c=new JSM.Coord(b*p-l,a*q-m,e-n),k.AddVertex(new JSM.BodyVertex(c))}function h(a){var b,c,f,g,h,l;if(0===a||a===d){var m=e(a);for(b=0;b<d;b++)for(c=0;c<d;c++)f=m+b*(d+1)+c,g=f+1,h=f+d+1,l=h+1,0===a?k.AddPolygon(new JSM.BodyPolygon([f,h,l,g])):k.AddPolygon(new JSM.BodyPolygon([f,g,l,h]))}if(0<a&&a<=d){c=t[a-1];a=t[a];
|
||||
for(b=0;b<4*d;b++)f=c[b],h=a[b],b<4*d-1?(g=c[b+1],l=a[b+1]):(g=c[0],l=a[0]),k.AddPolygon(new JSM.BodyPolygon([f,g,l,h]))}}var k=new JSM.Body,l=a/2,m=b/2,n=c/2,p=a/d,q=b/d,r=c/d;for(a=0;a<=d;a++)g(a);var t=[];for(a=0;a<=d;a++)t.push(f(a));for(a=0;a<=d;a++)h(a);return k};
|
||||
d)for(a=0;a<=d;a++)for(b=0;b<=d;b++)c=new JSM.Coord(b*p-l,a*q-m,e-n),k.AddVertex(new JSM.BodyVertex(c));else if(0<a&&a<d)for(a=0;a<=d;a++)for(b=0;b<=d;b++)if(0===a||a===d||0===b||b===d)c=new JSM.Coord(b*p-l,a*q-m,e-n),k.AddVertex(new JSM.BodyVertex(c))}function h(a){var b,c,f,g,h,l;if(0===a||a===d){var m=e(a);for(b=0;b<d;b++)for(c=0;c<d;c++)f=m+b*(d+1)+c,g=f+1,h=f+d+1,l=h+1,0===a?k.AddPolygon(new JSM.BodyPolygon([f,h,l,g])):k.AddPolygon(new JSM.BodyPolygon([f,g,l,h]))}if(0<a&&a<=d){c=s[a-1];a=s[a];
|
||||
for(b=0;b<4*d;b++)f=c[b],h=a[b],b<4*d-1?(g=c[b+1],l=a[b+1]):(g=c[0],l=a[0]),k.AddPolygon(new JSM.BodyPolygon([f,g,l,h]))}}var k=new JSM.Body,l=a/2,m=b/2,n=c/2,p=a/d,q=b/d,r=c/d;for(a=0;a<=d;a++)g(a);var s=[];for(a=0;a<=d;a++)s.push(f(a));for(a=0;a<=d;a++)h(a);return k};
|
||||
JSM.GenerateCircle=function(a,b){var c=new JSM.Body,d=JSM.GenerateCirclePoints(a,b),e;for(e=0;e<d.length;e++)c.AddVertex(new JSM.BodyVertex(d[e]));d=new JSM.BodyPolygon([]);for(e=0;e<b;e++)d.AddVertexIndex(e);c.AddPolygon(d);c.SetCylindricalTextureProjection(new JSM.Coord(0,0,0),a,new JSM.Coord(1,0,0),new JSM.Coord(0,0,1));return c};
|
||||
JSM.GenerateSphere=function(a,b,c){var d=new JSM.Body,e=2*b,f=d.AddVertex(new JSM.BodyVertex(JSM.SphericalToCartesian(a,0,0))),g=Math.PI/b,h=g,k,l,m;for(k=1;k<b;k++){for(l=m=0;l<e;l++)d.AddVertex(new JSM.BodyVertex(JSM.SphericalToCartesian(a,h,m))),m+=g;h+=g}a=d.AddVertex(new JSM.BodyVertex(JSM.SphericalToCartesian(-a,0,0)));var n,p;for(k=1;k<=b;k++)if(1===k){g=1;for(l=0;l<e;l++)h=g+l,m=h+1,l===e-1&&(m=g),h=new JSM.BodyPolygon([h,m,f]),c&&h.SetCurveGroup(0),d.AddPolygon(h)}else if(k<b){g=(k-1)*e+
|
||||
1;for(l=0;l<e;l++)h=g+l,m=h+1,n=h-e,p=n+1,l===e-1&&(m=g,p=g-e),h=new JSM.BodyPolygon([h,m,p,n]),c&&h.SetCurveGroup(0),d.AddPolygon(h)}else if(k===b){g=(k-2)*e+1;for(l=0;l<e;l++)h=g+l,m=h+1,l===e-1&&(m=g),h=new JSM.BodyPolygon([h,a,m]),c&&h.SetCurveGroup(0),d.AddPolygon(h)}d.SetCubicTextureProjection(new JSM.Coord(0,0,0),new JSM.Coord(1,0,0),new JSM.Coord(0,1,0),new JSM.Coord(0,0,1));return d};
|
||||
@ -175,13 +183,13 @@ m,l])):k?(l=n,m=l+1,n===d-1&&(m=0),l=new JSM.BodyPolygon([l,m,d])):(l=2*n,m=l+2,
|
||||
0,-(c/2)),(a+b)/2,new JSM.Coord(1,0,0),new JSM.Coord(0,0,1));return g};
|
||||
JSM.GeneratePrism=function(a,b,c,d){var e=new JSM.Body,f=a.length,g;for(g=0;g<f;g++)e.AddVertex(new JSM.BodyVertex(a[g])),e.AddVertex(new JSM.BodyVertex(JSM.CoordOffset(a[g],b,c)));var h;for(g=0;g<f;g++)c=2*g,h=c+2,g===f-1&&(h=0),e.AddPolygon(new JSM.BodyPolygon([c,h,h+1,c+1]));if(d){d=new JSM.BodyPolygon([]);c=new JSM.BodyPolygon([]);for(g=0;g<f;g++)d.AddVertexIndex(2*g+1),c.AddVertexIndex(2*(f-g-1));e.AddPolygon(d);e.AddPolygon(c)}f=JSM.VectorNormalize(JSM.CoordSub(a[1],a[0]));a=new JSM.Coord(a[0].x,
|
||||
a[0].y,a[0].z);b=JSM.VectorNormalize(b);f=JSM.VectorCross(b,f);g=JSM.VectorCross(f,b);e.SetCubicTextureProjection(a,g,f,b);return e};JSM.GenerateCurvedPrism=function(a,b,c,d,e){c=JSM.GeneratePrism(a,c,d,e);if(void 0===b||null===b||a.length!=b.length)return c;for(d=0;d<a.length;d++)e=b[d],c.GetPolygon(d).SetCurveGroup(e);return c};
|
||||
JSM.GeneratePrismWithHole=function(a,b,c,d){function e(){var b=0,c=[],d;for(d=0;d<a.length;d++)null===a[d]&&(b+=1),c.push(d-b);var b=JSM.CreatePolygonWithHole(a),e=new JSM.Polygon,g;for(d=0;d<b.length;d++)g=a[b[d]],e.AddVertex(g.x,g.y,g.z);g=JSM.PolygonTriangulate(e);var h,k,w;for(d=0;d<g.length;d++){h=g[d];k=new JSM.BodyPolygon([]);w=new JSM.BodyPolygon([]);for(e=0;3>e;e++)k.AddVertexIndex(2*c[b[h[e]]]+1),w.AddVertexIndex(2*c[b[h[3-e-1]]]);f.AddPolygon(k);f.AddPolygon(w)}}var f=new JSM.Body;(function(){var d;
|
||||
JSM.GeneratePrismWithHole=function(a,b,c,d){function e(){var b=0,c=[],d;for(d=0;d<a.length;d++)null===a[d]&&(b+=1),c.push(d-b);var b=JSM.CreatePolygonWithHole(a),e=new JSM.Polygon,g;for(d=0;d<b.length;d++)g=a[b[d]],e.AddVertex(g.x,g.y,g.z);g=JSM.PolygonTriangulate(e);var h,k,u;for(d=0;d<g.length;d++){h=g[d];k=new JSM.BodyPolygon([]);u=new JSM.BodyPolygon([]);for(e=0;3>e;e++)k.AddVertexIndex(2*c[b[h[e]]]+1),u.AddVertexIndex(2*c[b[h[3-e-1]]]);f.AddPolygon(k);f.AddPolygon(u)}}var f=new JSM.Body;(function(){var d;
|
||||
for(d=0;d<a.length;d++)null!==a[d]&&(f.AddVertex(new JSM.BodyVertex(a[d])),f.AddVertex(new JSM.BodyVertex(JSM.CoordOffset(a[d],b,c))))})();(function(){var b=0,c=[];c.push(0);var d;for(d=0;d<a.length;d++)null===a[d]&&(c.push(d-b),b+=1);c.push(d-b);for(b=0;b<c.length-1;b++){var e=d=void 0,g=void 0,h=c[b],k=c[b+1];for(d=h;d<k;d++)e=2*d,g=e+2,d===k-1&&(g=2*h),f.AddPolygon(new JSM.BodyPolygon([e,g,g+1,e+1]))}})();d&&e();var g=JSM.VectorNormalize(JSM.CoordSub(a[1],a[0]));d=new JSM.Coord(a[0].x,a[0].y,a[0].z);
|
||||
var h=JSM.VectorNormalize(b),g=JSM.VectorCross(h,g),k=JSM.VectorCross(g,h);f.SetCubicTextureProjection(d,k,g,h);return f};JSM.GenerateCurvedPrismWithHole=function(a,b,c,d,e){c=JSM.GeneratePrismWithHole(a,c,d,e);if(void 0===b||null===b||a.length!=b.length)return c;d=0;var f;for(e=0;e<a.length;e++)f=b[e],null!==f&&(c.GetPolygon(d).SetCurveGroup(f),d++);return c};
|
||||
JSM.GeneratePrismShell=function(a,b,c,d,e){var f=new JSM.Body,g=a.length,h;for(h=0;h<g;h++)f.AddVertex(new JSM.BodyVertex(a[h]));h=new JSM.Polygon;h.vertices=a;d=JSM.OffsetPolygonContour(h,d).vertices;for(h=0;h<g;h++)f.AddVertex(new JSM.BodyVertex(d[h]));var k;for(h=0;h<g;h++)k=JSM.CoordOffset(a[h],b,c),f.AddVertex(new JSM.BodyVertex(k));for(h=0;h<g;h++)k=JSM.CoordOffset(d[h],b,c),f.AddVertex(new JSM.BodyVertex(k));var l;for(h=0;h<g;h++)c=h,d=c+1,k=c+2*g,l=k+1,h===g-1&&(d=0,l=2*g),f.AddPolygon(new JSM.BodyPolygon([c,
|
||||
d,l,k])),f.AddPolygon(new JSM.BodyPolygon([c+g,k+g,l+g,d+g]));if(e)for(h=0;h<g;h++)c=h,d=c+1,k=h+g,l=k+1,h===g-1&&(d=0,l=g),f.AddPolygon(new JSM.BodyPolygon([c,k,l,d])),f.AddPolygon(new JSM.BodyPolygon([c+2*g,d+2*g,l+2*g,k+2*g]));e=JSM.VectorNormalize(JSM.CoordSub(a[1],a[0]));a=new JSM.Coord(a[0].x,a[0].y,a[0].z);b=JSM.VectorNormalize(b);e=JSM.VectorCross(b,e);g=JSM.VectorCross(e,b);f.SetCubicTextureProjection(a,g,e,b);return f};
|
||||
JSM.GenerateCylinderShell=function(a,b,c,d,e,f){for(var g=new JSM.Vector(0,0,1),h=-b/2,k=[],l=2*Math.PI/d,m,n=0,n=0;n<d;n++)m=n*l,m=JSM.PolarToCartesian(a,m),k.push(new JSM.Coord(m.x,m.y,h));a=JSM.GeneratePrismShell(k,g,b,c,e);if(f)for(f=0;f<d;f++)a.GetPolygon(2*f).SetCurveGroup(0),a.GetPolygon(2*f+1).SetCurveGroup(0);return a};
|
||||
JSM.GenerateLineShell=function(a,b,c,d,e,f){var g=new JSM.Body,h=a.length,k=[],l,m,n,p,q,r;for(l=0;l<h;l++)0===l||l===h-1?q=Math.PI/2:(m=l-1,n=l,p=l+1,r=JSM.CoordSub(a[p],a[n]),q=JSM.CoordSub(a[m],a[n]),q=JSM.GetVectorsAngle(r,q)/2,"Clockwise"===JSM.CoordTurnType(a[m],a[n],a[p],b)&&(q=Math.PI-q)),k.push(q);r=new JSM.Vector(0,0,1);m=[];var t;for(l=0;l<h;l++)n=l,l===h-1?t=JSM.CoordSub(a[n-1],a[n]):(p=(l+1)%h,t=JSM.CoordSub(a[n],a[p])),q=k[n],p=d/Math.sin(q),p=JSM.CoordOffset(a[n],t,p),p=JSM.CoordRotate(p,
|
||||
JSM.GenerateLineShell=function(a,b,c,d,e,f){var g=new JSM.Body,h=a.length,k=[],l,m,n,p,q,r;for(l=0;l<h;l++)0===l||l===h-1?q=Math.PI/2:(m=l-1,n=l,p=l+1,r=JSM.CoordSub(a[p],a[n]),q=JSM.CoordSub(a[m],a[n]),q=JSM.GetVectorsAngle(r,q)/2,"Clockwise"===JSM.CoordTurnType(a[m],a[n],a[p],b)&&(q=Math.PI-q)),k.push(q);r=new JSM.Vector(0,0,1);m=[];var s;for(l=0;l<h;l++)n=l,l===h-1?s=JSM.CoordSub(a[n-1],a[n]):(p=(l+1)%h,s=JSM.CoordSub(a[n],a[p])),q=k[n],p=d/Math.sin(q),p=JSM.CoordOffset(a[n],s,p),p=JSM.CoordRotate(p,
|
||||
r,-(Math.PI-q),a[n]),m.push(p);for(l=0;l<h;l++)g.AddVertex(new JSM.BodyVertex(a[l]));for(l=0;l<h;l++)g.AddVertex(new JSM.BodyVertex(m[l]));for(l=0;l<h;l++)n=JSM.CoordOffset(a[l],b,c),g.AddVertex(new JSM.BodyVertex(n));for(l=0;l<h;l++)n=JSM.CoordOffset(m[l],b,c),g.AddVertex(new JSM.BodyVertex(n));for(l=0;l<h-1;l++)n=l,p=n+1,c=n+2*h,d=c+1,g.AddPolygon(new JSM.BodyPolygon([n,p,d,c])),g.AddPolygon(new JSM.BodyPolygon([n+h,c+h,d+h,p+h]));e&&(n=0,g.AddPolygon(new JSM.BodyPolygon([n,n+2*h,n+3*h,n+h])),n=
|
||||
h-1,g.AddPolygon(new JSM.BodyPolygon([n,n+h,n+3*h,n+2*h])));if(f)for(l=0;l<h-1;l++)n=l,p=n+1,c=l+h,d=c+1,g.AddPolygon(new JSM.BodyPolygon([n,c,d,p])),g.AddPolygon(new JSM.BodyPolygon([n+2*h,p+2*h,d+2*h,c+2*h]));e=JSM.VectorNormalize(JSM.CoordSub(a[1],a[0]));a=new JSM.Coord(a[0].x,a[0].y,a[0].z);b=JSM.VectorNormalize(b);e=JSM.VectorCross(b,e);f=JSM.VectorCross(e,b);g.SetCubicTextureProjection(a,f,e,b);return g};
|
||||
JSM.GenerateTorus=function(a,b,c,d,e){var f=new JSM.Body,g=0,h=2*Math.PI/d,k=[],l,m;for(l=0;l<d;l++)m=JSM.PolarToCartesian(b,g),m=new JSM.Coord(m.x+a,0,m.y),k.push(m),g+=h;b=new JSM.Coord(0,0,1);g=new JSM.Coord(0,0,0);h=2*Math.PI/c;for(l=0;l<c;l++)for(a=0;a<d;a++)m=JSM.CoordRotate(k[a],b,l*h,g),f.AddVertex(new JSM.BodyVertex(m));for(l=0;l<c;l++){new JSM.BodyPolygon([]);for(a=0;a<d;a++)h=l*d+a,b=h+d,k=h+1,g=b+1,a===d-1&&(k=l*d,g=(l+1)*d),l===c-1&&(b=a,g=a+1,a===d-1&&(g=0)),h=new JSM.BodyPolygon([h,
|
||||
@ -201,10 +209,10 @@ JSM.GenerateFunctionSurfaceSolid=function(a,b,c,d,e,f){var g=new JSM.Sector(new
|
||||
JSM.Camera=function(a,b,c,d,e,f){this.eye=JSM.ValueOrDefault(a,new JSM.Coord(1,1,1));this.center=JSM.ValueOrDefault(b,new JSM.Coord(0,0,0));this.up=JSM.ValueOrDefault(c,new JSM.Vector(0,0,1));this.fieldOfView=JSM.ValueOrDefault(d,45);this.nearClippingPlane=JSM.ValueOrDefault(e,0.1);this.farClippingPlane=JSM.ValueOrDefault(f,1E3)};
|
||||
JSM.Camera.prototype.Set=function(a,b,c,d,e,f){this.eye=a;this.center=b;this.up=c;this.fieldOfView=JSM.ValueOrDefault(d,45);this.nearClippingPlane=JSM.ValueOrDefault(e,0.1);this.farClippingPlane=JSM.ValueOrDefault(f,1E3)};JSM.Camera.prototype.Clone=function(){var a=new JSM.Camera;a.eye=this.eye;a.center=this.center;a.up=this.up;a.fieldOfView=this.fieldOfView;a.nearClippingPlane=this.nearClippingPlane;a.farClippingPlane=this.farClippingPlane;return a};
|
||||
JSM.ExplodeBodyToTriangles=function(a,b,c){if(void 0===c||null===c)return!1;var d=JSM.CalculateBodyVertexNormals(a),e,f,g=!1;if(void 0!==b&&null!==b)for(e=0;e<b.Count();e++)if(null!==b.GetMaterial(e).texture){g=!0;break}var h,k;if(g){h=JSM.CalculateBodyTextureCoords(a);for(e=0;e<h.length;e++)if(f=a.GetPolygon(e),f.HasMaterialIndex()){k=b.GetMaterial(f.GetMaterialIndex());for(f=0;f<h[e].length;f++)h[e][f].x/=k.textureWidth,h[e][f].y/=-k.textureHeight}}var l=!0;void 0!==c.hasConvexPolygons&&null!==
|
||||
c.hasConvexPolygons&&(l=c.hasConvexPolygons);(function(a,b,c,d,e){function f(h,k){var w=b.GetMaterial(k);if(void 0!==e.onGeometryStart&&null!==e.onGeometryStart)e.onGeometryStart(w);var t;for(t=0;t<h.length;t++){var s=h[t],x=a.GetPolygon(s),u=x.VertexIndexCount();if(!(3>u)){var E=void 0,y=void 0,A=void 0,J=void 0,O=void 0,M=void 0,H=void 0,F=void 0,I=void 0,K=void 0;if(3==u||l)for(K=0;K<u-2;K++){if(E=a.GetVertex(x.GetVertexIndex(0)).position,y=a.GetVertex(x.GetVertexIndex((K+1)%u)).position,A=a.GetVertex(x.GetVertexIndex((K+
|
||||
2)%u)).position,J=c[s][0],O=c[s][(K+1)%u],M=c[s][(K+2)%u],I=F=H=null,g&&(H=d[s][0],F=d[s][(K+1)%u],I=d[s][(K+2)%u]),void 0!==e.onTriangle&&null!==e.onTriangle)e.onTriangle(E,y,A,J,O,M,H,F,I)}else{E=new JSM.Polygon;y=void 0;for(K=0;K<u;K++)y=a.GetVertex(x.vertices[K]),E.AddVertex(y.position.x,y.position.y,y.position.z);for(var K=JSM.CalculateBodyPolygonNormal(a,s),u=JSM.PolygonTriangulate(E,K),P=void 0,K=0;K<u.length;K++)if(P=u[K],E=a.GetVertex(x.GetVertexIndex(P[0])).position,y=a.GetVertex(x.GetVertexIndex(P[1])).position,
|
||||
A=a.GetVertex(x.GetVertexIndex(P[2])).position,J=c[s][P[0]],O=c[s][P[1]],M=c[s][P[2]],I=F=H=null,g&&(H=d[s][P[0]],F=d[s][P[1]],I=d[s][P[2]]),void 0!==e.onTriangle&&null!==e.onTriangle)e.onTriangle(E,y,A,J,O,M,H,F,I)}}}if(void 0!==e.onGeometryEnd&&null!==e.onGeometryEnd)e.onGeometryEnd(w)}var h,k=[],s=[];if(void 0===b||null===b)b=new JSM.Materials;for(h=0;h<b.Count();h++)k[h]=[];var x;for(h=0;h<a.PolygonCount();h++)x=a.GetPolygon(h),x.HasMaterialIndex()?(x=x.GetMaterialIndex(),k[x].push(h)):s.push(h);
|
||||
for(h=0;h<k.length;h++)x=k[h],0!==x.length&&f(x,h);0!==s.length&&f(s,-1)})(a,b,d,h,c);return!0};
|
||||
c.hasConvexPolygons&&(l=c.hasConvexPolygons);(function(a,b,c,d,e){function f(h,k){var s=b.GetMaterial(k);if(void 0!==e.onGeometryStart&&null!==e.onGeometryStart)e.onGeometryStart(s);var t;for(t=0;t<h.length;t++){var u=h[t],x=a.GetPolygon(u),v=x.VertexIndexCount();if(!(3>v)){var E=void 0,y=void 0,A=void 0,J=void 0,O=void 0,M=void 0,H=void 0,F=void 0,I=void 0,K=void 0;if(3==v||l)for(K=0;K<v-2;K++){if(E=a.GetVertex(x.GetVertexIndex(0)).position,y=a.GetVertex(x.GetVertexIndex((K+1)%v)).position,A=a.GetVertex(x.GetVertexIndex((K+
|
||||
2)%v)).position,J=c[u][0],O=c[u][(K+1)%v],M=c[u][(K+2)%v],I=F=H=null,g&&(H=d[u][0],F=d[u][(K+1)%v],I=d[u][(K+2)%v]),void 0!==e.onTriangle&&null!==e.onTriangle)e.onTriangle(E,y,A,J,O,M,H,F,I)}else{E=new JSM.Polygon;y=void 0;for(K=0;K<v;K++)y=a.GetVertex(x.vertices[K]),E.AddVertex(y.position.x,y.position.y,y.position.z);for(var K=JSM.CalculateBodyPolygonNormal(a,u),v=JSM.PolygonTriangulate(E,K),P=void 0,K=0;K<v.length;K++)if(P=v[K],E=a.GetVertex(x.GetVertexIndex(P[0])).position,y=a.GetVertex(x.GetVertexIndex(P[1])).position,
|
||||
A=a.GetVertex(x.GetVertexIndex(P[2])).position,J=c[u][P[0]],O=c[u][P[1]],M=c[u][P[2]],I=F=H=null,g&&(H=d[u][P[0]],F=d[u][P[1]],I=d[u][P[2]]),void 0!==e.onTriangle&&null!==e.onTriangle)e.onTriangle(E,y,A,J,O,M,H,F,I)}}}if(void 0!==e.onGeometryEnd&&null!==e.onGeometryEnd)e.onGeometryEnd(s)}var h,k=[],t=[];if(void 0===b||null===b)b=new JSM.Materials;for(h=0;h<b.Count();h++)k[h]=[];var x;for(h=0;h<a.PolygonCount();h++)x=a.GetPolygon(h),x.HasMaterialIndex()?(x=x.GetMaterialIndex(),k[x].push(h)):t.push(h);
|
||||
for(h=0;h<k.length;h++)x=k[h],0!==x.length&&f(x,h);0!==t.length&&f(t,-1)})(a,b,d,h,c);return!0};
|
||||
JSM.ExportBodyContentToStl=function(a,b,c){function d(a){g+=a+"\n"}function e(a,b,c,e){d("\tfacet normal "+a.x+" "+a.y+" "+a.z);d("\t\touter loop");d("\t\t\tvertex "+b.x+" "+b.y+" "+b.z);d("\t\t\tvertex "+c.x+" "+c.y+" "+c.z);d("\t\t\tvertex "+e.x+" "+e.y+" "+e.z);d("\t\tendloop");d("\tendfacet")}function f(b){var d=a.GetPolygon(b),f=d.VertexIndexCount();if(!(3>f)){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;b<f;b++)n=a.GetVertex(d.vertices[b]),g.AddVertex(n.position.x,n.position.y,n.position.z);f=JSM.PolygonTriangulate(g,q);for(b=0;b<f.length;b++)p=f[b],g=a.GetVertex(d.GetVertexIndex(p[0])).position,n=a.GetVertex(d.GetVertexIndex(p[1])).position,p=a.GetVertex(d.GetVertexIndex(p[2])).position,e(q,g,n,p)}else for(b=0;b<f-2;b++)g=a.GetVertex(d.GetVertexIndex(0)).position,
|
||||
n=a.GetVertex(d.GetVertexIndex((b+1)%f)).position,p=a.GetVertex(d.GetVertexIndex((b+2)%f)).position,e(q,g,n,p)}}var g="";for(b=0;b<a.PolygonCount();b++)f(b);return g};JSM.ExportBodyToStl=function(a,b,c){a=""+("solid "+b+"\n")+JSM.ExportBodyContentToStl(a,b,c);return a+="endsolid "+b+"\n"};JSM.ExportModelToStl=function(a,b,c){var d;d=""+("solid "+b+"\n");var e,f;for(e=0;e<a.BodyCount();e++)f=a.GetBody(e),d+=JSM.ExportBodyContentToStl(f,b+(e+1).toString(),c);return d+("endsolid "+b+"\n")};
|
||||
@ -212,7 +220,7 @@ JSM.ExportBodyContentToObj=function(a,b,c){function d(b){b=a.GetVertex(b).positi
|
||||
JSM.ExportBodyToObj=function(a){return JSM.ExportBodyContentToObj(a,0,0)};JSM.ExportModelToObj=function(a){var b="",c=0,d=0,e,f;for(e=0;e<a.BodyCount();e++)f=a.GetBody(e),b+=JSM.ExportBodyContentToObj(f,c,d),c+=f.VertexCount(),d+=f.PolygonCount();return b};
|
||||
JSM.ExportMaterialsToGdl=function(a){function b(a,b){var d=JSM.HexColorToRGBComponents(a.diffuse);c+='define material "material'+b+'" 2, '+(d[0]/255+","+d[1]/255+","+d[2]/255)+" ! "+b+"\n"}var c="",d=!1;void 0!==a&&null!==a&&(d=!0);if(d){b(a.GetDefaultMaterial(),1);for(d=0;d<a.Count();d++)b(a.GetMaterial(d),d+2)}return c};
|
||||
JSM.ExportBodyGeometryToGdl=function(a,b){function c(a){if(200<a.length){var b=0,c,d;for(c=0;c<a.length;c++)d=a[c],h+=d,b++,200<b&&","==d&&(h+="\n",b=0)}else h+=a}function d(a){c(a+"\n")}function e(b){var c=a.GetVertex(b).position;d("vert "+c.x+", "+c.y+", "+c.z+" ! "+(b+1))}function f(b){var c=k.edges[b],e=0;-1!=c.pgon1&&-1!=c.pgon2&&a.GetPolygon(c.pgon1).HasCurveGroup()&&a.GetPolygon(c.pgon2).HasCurveGroup()&&a.GetPolygon(c.pgon1).GetCurveGroup()==a.GetPolygon(c.pgon2).GetCurveGroup()&&(e=2);d("edge "+
|
||||
(c.vert1+1)+", "+(c.vert2+1)+", -1, -1, "+e+" ! "+(b+1))}function g(e,f){var g=-1;b&&(g=a.GetPolygon(e).GetMaterialIndex()+2,g!=f&&d('set material "material'+g+'"'));var h=k.pgons[e],l=0;a.GetPolygon(e).HasCurveGroup()&&(l=2);c("pgon "+h.pedges.length+", 0, "+l+", ");var l="",m,u;for(m=0;m<h.pedges.length;m++)u=h.pedges[m],l=u.reverse?l+-(u.index+1):l+(u.index+1),m<h.pedges.length-1&&(l+=", ");c(l);c(" ! "+(e+1));d("");return g}var h="";d("base");var k=JSM.CalculateAdjacencyInfo(a),l;for(l=0;l<k.verts.length;l++)e(l);
|
||||
(c.vert1+1)+", "+(c.vert2+1)+", -1, -1, "+e+" ! "+(b+1))}function g(e,f){var g=-1;b&&(g=a.GetPolygon(e).GetMaterialIndex()+2,g!=f&&d('set material "material'+g+'"'));var h=k.pgons[e],l=0;a.GetPolygon(e).HasCurveGroup()&&(l=2);c("pgon "+h.pedges.length+", 0, "+l+", ");var l="",m,v;for(m=0;m<h.pedges.length;m++)v=h.pedges[m],l=v.reverse?l+-(v.index+1):l+(v.index+1),m<h.pedges.length-1&&(l+=", ");c(l);c(" ! "+(e+1));d("");return g}var h="";d("base");var k=JSM.CalculateAdjacencyInfo(a),l;for(l=0;l<k.verts.length;l++)e(l);
|
||||
for(l=0;l<k.edges.length;l++)f(l);var m=-1;for(l=0;l<k.pgons.length;l++)m=g(l,m);d("body -1");return h};JSM.ExportBodyToGdl=function(a,b){var c="",d=!1;void 0!==b&&null!==b&&(c+=JSM.ExportMaterialsToGdl(b),d=!0);return c+=JSM.ExportBodyGeometryToGdl(a,d)};JSM.ExportModelToGdl=function(a,b){var c="",d=!1;void 0!==b&&null!==b&&(c+=JSM.ExportMaterialsToGdl(b),d=!0);var e,f;for(e=0;e<a.BodyCount();e++)f=a.GetBody(e),c+=JSM.ExportBodyGeometryToGdl(f,d);return c};
|
||||
JSM.TriangleBody=function(a){this.name=a;this.vertices=[];this.normals=[];this.uvs=[];this.triangles=[];this.defaultUVIndex=-1};JSM.TriangleBody.prototype.SetName=function(a){this.name=a};JSM.TriangleBody.prototype.GetName=function(){return this.name};JSM.TriangleBody.prototype.AddVertex=function(a,b,c){this.vertices.push(new JSM.Coord(a,b,c));return this.vertices.length-1};JSM.TriangleBody.prototype.GetVertex=function(a){return this.vertices[a]};
|
||||
JSM.TriangleBody.prototype.SetVertex=function(a,b,c,d){this.vertices[a]=new JSM.Coord(b,c,d)};JSM.TriangleBody.prototype.VertexCount=function(){return this.vertices.length};JSM.TriangleBody.prototype.AddNormal=function(a,b,c){this.normals.push(new JSM.Coord(a,b,c));return this.normals.length-1};JSM.TriangleBody.prototype.GetNormal=function(a){return this.normals[a]};JSM.TriangleBody.prototype.NormalCount=function(){return this.normals.length};
|
||||
@ -235,13 +243,13 @@ JSM.ConvertTriangleModelToJsonData=function(a){function b(a,b,c){var d=[],e=a.Ma
|
||||
parameters:[]};for(e=0;e<p.length;e++)f=b.GetTriangle(p[e]),q.parameters.push(f.v0,f.v1,f.v2,f.n0,f.n1,f.n2,f.u0,f.u1,f.u2);c.triangles.push(q)}}var c={version:1,materials:[],meshes:[]};(function(a,b){var c,d,e;for(c=0;c<a.MaterialCount();c++)d=a.GetMaterial(c),e={name:JSM.ValueOrDefault(d.name,""),ambient:d.ambient,diffuse:d.diffuse,specular:d.specular,shininess:d.shininess,opacity:d.opacity},void 0!==d.texture&&null!==d.texture&&(e.texture=JSM.ValueOrDefault(d.texture,null),e.offset=d.offset,e.scale=
|
||||
d.scale,e.rotation=d.rotation),b.push(e)})(a,c.materials);var d,e,f;for(d=0;d<a.BodyCount();d++)e=a.GetBody(d),0!==e.TriangleCount()&&(f={name:e.GetName(),vertices:[],normals:[],uvs:[],triangles:[]},b(a,e,f),c.meshes.push(f));return c};
|
||||
JSM.MergeJsonDataMeshes=function(a){function b(a,b,c){function d(a,b,c){var h=b.material,k=c[h];void 0===k&&(a.triangles.push({material:h,parameters:[]}),k=a.triangles.length-1,c[h]=k);a=a.triangles[k].parameters;for(c=0;c<b.parameters.length;c+=9)a.push(b.parameters[c]+e,b.parameters[c+1]+e,b.parameters[c+2]+e,b.parameters[c+3]+f,b.parameters[c+4]+f,b.parameters[c+5]+f,b.parameters[c+6]+g,b.parameters[c+7]+g,b.parameters[c+8]+g)}var e=a.vertices.length/3,f=a.normals.length/3,g=a.uvs.length/2;(function(a,
|
||||
b){var c;for(c=0;c<b.vertices.length;c++)a.vertices.push(b.vertices[c]);for(c=0;c<b.normals.length;c++)a.normals.push(b.normals[c]);for(c=0;c<b.uvs.length;c++)a.uvs.push(b.uvs[c])})(a,b);var r,t;for(r=0;r<b.triangles.length;r++)t=b.triangles[r],d(a,t,c)}var c={version:a.version,materials:a.materials,meshes:[]},d={name:"Merged",vertices:[],normals:[],uvs:[],triangles:[]},e={},f,g;for(f=0;f<a.meshes.length;f++)g=a.meshes[f],b(d,g,e);c.meshes.push(d);return c};
|
||||
JSM.Read3dsFile=function(a,b){var c,d,e,f,g,h,k,l,m,n,p,q,r,t,w,u,s,x,B,C,v,G,z,L,N,E,y,A,J,O,M,H,F,I,K,P,T,S,U,Y;function D(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 Q(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;k=41024;l=41025;m=41040;n=16;p=17;q=18;r=19;t=41472;w=41728;u=41816;s=41818;x=41812;B=41814;C=41820;v=48;G=49;z=16384;L=16640;N=17920;E=18176;y=16656;A=16704;J=16672;O=16736;M=16688;H=16720;F=45056;I=45058;K=45072;P=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;Q(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==r?(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;Q(a,b,function(b,c){b==v?d=a.ReadUnsignedInteger16()/100:b==G?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;Q(a,b,function(b,c){b==w?d.texture=R(a):b==u?d.offset[0]=a.ReadFloat32():b==s?d.offset[1]=a.ReadFloat32():b==x?d.scale[0]=a.ReadFloat32():b==B?d.scale[1]=a.ReadFloat32():b==C?d.rotation=a.ReadFloat32():a.Skip(c-6)})}function $(a,c,d){D("Read material chunk ("+c.toString(16)+", "+d+")",2);var n={},p=a.GetPosition()+d-6;Q(a,p,function(b,p){b==e?(D("Read material name chunk ("+c.toString(16)+", "+d+")",3),n.name=R(a)):b==f?(D("Read material ambient chunk ("+c.toString(16)+
|
||||
b){var c;for(c=0;c<b.vertices.length;c++)a.vertices.push(b.vertices[c]);for(c=0;c<b.normals.length;c++)a.normals.push(b.normals[c]);for(c=0;c<b.uvs.length;c++)a.uvs.push(b.uvs[c])})(a,b);var r,s;for(r=0;r<b.triangles.length;r++)s=b.triangles[r],d(a,s,c)}var c={version:a.version,materials:a.materials,meshes:[]},d={name:"Merged",vertices:[],normals:[],uvs:[],triangles:[]},e={},f,g;for(f=0;f<a.meshes.length;f++)g=a.meshes[f],b(d,g,e);c.meshes.push(d);return c};
|
||||
JSM.Read3dsFile=function(a,b){var c,d,e,f,g,h,k,l,m,n,p,q,r,s,u,v,t,x,B,C,w,G,z,L,N,E,y,A,J,O,M,H,F,I,K,P,T,S,U,Y;function D(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 Q(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;k=41024;l=41025;m=41040;n=16;p=17;q=18;r=19;s=41472;u=41728;v=41816;t=41818;x=41812;B=41814;C=41820;w=48;G=49;z=16384;L=16640;N=17920;E=18176;y=16656;A=16704;J=16672;O=16736;M=16688;H=16720;F=45056;I=45058;K=45072;P=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;Q(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==r?(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;Q(a,b,function(b,c){b==w?d=a.ReadUnsignedInteger16()/100:b==G?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;Q(a,b,function(b,c){b==u?d.texture=R(a):b==v?d.offset[0]=a.ReadFloat32():b==t?d.offset[1]=a.ReadFloat32():b==x?d.scale[0]=a.ReadFloat32():b==B?d.scale[1]=a.ReadFloat32():b==C?d.rotation=a.ReadFloat32():a.Skip(c-6)})}function $(a,c,d){D("Read material chunk ("+c.toString(16)+", "+d+")",2);var n={},p=a.GetPosition()+d-6;Q(a,p,function(b,p){b==e?(D("Read material name chunk ("+c.toString(16)+", "+d+")",3),n.name=R(a)):b==f?(D("Read material ambient chunk ("+c.toString(16)+
|
||||
", "+d+")",3),n.ambient=V(a,b,p)):b==g?(D("Read material diffuse chunk ("+c.toString(16)+", "+d+")",3),n.diffuse=V(a,b,p)):b==h?(D("Read material specular chunk ("+c.toString(16)+", "+d+")",3),n.specular=V(a,b,p)):b==k?(D("Read material shininess chunk ("+c.toString(16)+", "+d+")",3),n.shininess=W(a,b,p)):b==l?(D("Read material shininess strength chunk ("+c.toString(16)+", "+d+")",3),n.shininessStrength=W(a,b,p)):b==m?(D("Read material transparency chunk ("+c.toString(16)+", "+d+")",3),n.transparency=
|
||||
W(a,b,p)):b==t?(D("Read material texture map chunk ("+c.toString(16)+", "+d+")",3),Z(a,b,p,n)):(D("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){D("Read faces chunk ("+c.toString(16)+", "+d+")",4);c=a.GetPosition()+d-6;var e=a.ReadUnsignedInteger16(),f,g,h,k;for(d=0;d<e;d++)if(f=a.ReadUnsignedInteger16(),g=a.ReadUnsignedInteger16(),h=a.ReadUnsignedInteger16(),k=a.ReadUnsignedInteger16(),void 0!==b.onFace&&
|
||||
W(a,b,p)):b==s?(D("Read material texture map chunk ("+c.toString(16)+", "+d+")",3),Z(a,b,p,n)):(D("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){D("Read faces chunk ("+c.toString(16)+", "+d+")",4);c=a.GetPosition()+d-6;var e=a.ReadUnsignedInteger16(),f,g,h,k;for(d=0;d<e;d++)if(f=a.ReadUnsignedInteger16(),g=a.ReadUnsignedInteger16(),h=a.ReadUnsignedInteger16(),k=a.ReadUnsignedInteger16(),void 0!==b.onFace&&
|
||||
null!==b.onFace)b.onFace(f,g,h,k);Q(a,c,function(c,d){if(c==M){D("Read face materials chunk ("+c.toString(16)+", "+d+")",5);var f=R(a),g=a.ReadUnsignedInteger16(),h,k;for(h=0;h<g;h++)if(k=a.ReadUnsignedInteger16(),void 0!==b.onFaceMaterial&&null!==b.onFaceMaterial)b.onFaceMaterial(k,f)}else if(c==H){D("Read face smoothing groups chunk ("+c.toString(16)+", "+d+")",5);for(f=0;f<e;f++)if(g=a.ReadUnsignedInteger32(),void 0!==b.onFaceSmoothingGroup&&null!==b.onFaceSmoothingGroup)b.onFaceSmoothingGroup(f,
|
||||
g)}else D("Skip chunk ("+c.toString(16)+", "+d+")",5),a.Skip(d-6)})}function ba(a,c,d,e){D("Read mesh chunk ("+c+", "+d.toString(16)+", "+e+")",3);if(void 0!==b.onMesh&&null!==b.onMesh)b.onMesh(c);c=a.GetPosition()+e-6;Q(a,c,function(c,d){if(c==y){D("Read vertices chunk ("+c.toString(16)+", "+d+")",4);var e=a.ReadUnsignedInteger16(),f,g,h,k;for(f=0;f<e;f++)if(g=a.ReadFloat32(),h=a.ReadFloat32(),k=a.ReadFloat32(),void 0!==b.onVertex&&null!==b.onVertex)b.onVertex(g,h,k)}else if(c==A){D("Read texture vertices chunk ("+
|
||||
c.toString(16)+", "+d+")",4);e=a.ReadUnsignedInteger16();for(f=0;f<e;f++)if(g=a.ReadFloat32(),h=a.ReadFloat32(),void 0!==b.onTextureVertex&&null!==b.onTextureVertex)b.onTextureVertex(g,h)}else if(c==J)aa(a,c,d);else if(c==O){D("Read transformation chunk ("+c.toString(16)+", "+d+")",4);e=[];for(f=0;4>f;f++){for(g=0;3>g;g++)e.push(a.ReadFloat32());3>f?e.push(0):e.push(1)}if(void 0!==b.onTransformation&&null!==b.onTransformation)b.onTransformation(e)}else D("Skip chunk ("+c.toString(16)+", "+d+")",4),
|
||||
@ -255,11 +263,11 @@ e&&(e.meshData.transformation=a)},onObjectNode:function(a){var b=h.nodes.length;
|
||||
b)},onFileRequested:c});(function(a,b,c){function d(a,b,c){function e(a,b){var c=b[0],d=b[1],f=b[2],g;for(g=0;4>g;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;c<a.VertexCount();c++)d=a.GetVertex(c),d=JSM.ApplyTransformation(b,d),a.SetVertex(c,d.x,d.y,d.z)}function h(a,b,c){var d=JSM.MatrixDeterminant(b);JSM.IsNegative(d)&&(b=JSM.MatrixClone(b),e(b,[-1,1,1]),c=JSM.MatrixMultiply(c,
|
||||
b),g(a,c))}function k(a,b){if(void 0!==a.matrix)return a.matrix;var c=JSM.MatrixIdentity(),d;d=0===a.positions.length?[0,0,0]:a.positions[0];c=f(c,d);if(0===a.rotations.length)d=[0,0,0,0];else{d=a.rotations[0];var g=[0,0,0,1],h=Math.sqrt(d[0]*d[0]+d[1]*d[1]+d[2]*d[2]);JSM.IsPositive(h)&&(g=-0.5*d[3],h=Math.sin(g)/h,g=[h*d[0],h*d[1],h*d[2],Math.cos(g)]);d=g}d=JSM.MatrixRotationQuaternion(d);c=JSM.MatrixMultiply(d,c);d=0===a.scales.length?[0,0,0,0]:a.scales[0];c=e(c,d);65535!=a.userId&&(d=b.nodeIdToIndex[a.userId],
|
||||
void 0!==d&&(d=k(b.nodes[d],b),c=JSM.MatrixMultiply(c,d)));return a.matrix=c}var l=a.meshData;l=void 0===l||null===l?null:l.transformation;if(null!==l){var m=null,m=null!==b?k(b,c):l;c=JSM.MatrixClone(m);m=JSM.MatrixClone(l);l=JSM.MatrixInvert(m);null!==l&&(h(a,m,l),b=void 0===b||null===b?[0,0,0]:b.pivot,f(c,[-b[0],-b[1],-b[2]]),b=JSM.MatrixMultiply(l,c),g(a,b))}}function e(a,b,c,f){d(a,b,f);b=a.UVCount()==a.VertexCount();f=a.meshData;var g,h,k;for(g=0;g<a.TriangleCount();g++)h=a.GetTriangle(g),b&&
|
||||
(h.u0=h.v0,h.u1=h.v1,h.u2=h.v2),k=f.faceToMaterial[g],void 0!==k&&(k=c[k],void 0!==k&&(h.mat=k)),k=f.faceToSmoothingGroup[g],void 0!==k&&(h.curve=k)}function f(a,b,c,d){b=b.Clone();b.SetName(b.GetName()+" ("+d+")");c<a.BodyCount()?a.AddBodyToIndex(b,c):a.AddBody(b);return b}var g,h,w,u,s,x,B;for(g=0;g<b.BodyCount();g++)if(w=b.GetBody(g),u=w.meshData,0===u.objectNodes.length)e(w,null,c,a);else{x=a.nodes[u.objectNodes[0]];for(h=1;h<u.objectNodes.length;h++)s=a.nodes[u.objectNodes[h]],B=f(b,w,g+1,h+
|
||||
1),B.meshData=w.meshData,e(B,s,c,a),g+=1;e(w,x,c,a)}})(h,d,f);d.Finalize();return JSM.ConvertTriangleModelToJsonData(d)};
|
||||
(h.u0=h.v0,h.u1=h.v1,h.u2=h.v2),k=f.faceToMaterial[g],void 0!==k&&(k=c[k],void 0!==k&&(h.mat=k)),k=f.faceToSmoothingGroup[g],void 0!==k&&(h.curve=k)}function f(a,b,c,d){b=b.Clone();b.SetName(b.GetName()+" ("+d+")");c<a.BodyCount()?a.AddBodyToIndex(b,c):a.AddBody(b);return b}var g,h,u,v,t,x,B;for(g=0;g<b.BodyCount();g++)if(u=b.GetBody(g),v=u.meshData,0===v.objectNodes.length)e(u,null,c,a);else{x=a.nodes[v.objectNodes[0]];for(h=1;h<v.objectNodes.length;h++)t=a.nodes[v.objectNodes[h]],B=f(b,u,g+1,h+
|
||||
1),B.meshData=u.meshData,e(B,t,c,a),g+=1;e(u,x,c,a)}})(h,d,f);d.Finalize();return JSM.ConvertTriangleModelToJsonData(d)};
|
||||
JSM.ReadObjFile=function(a,b){function c(a,c,d,e){if(void 0!==b.onMaterialComponent&&null!==b.onMaterialComponent)b.onMaterialComponent(a,c,d,e)}function d(a,c,d){if(void 0!==b.onVertex&&null!==b.onVertex)b.onVertex(a,c,d)}function e(a,c,d){if(void 0!==b.onNormal&&null!==b.onNormal)b.onNormal(a,c,d)}function f(a,c){if(void 0!==b.onTexCoord&&null!==b.onTexCoord)b.onTexCoord(a,c)}function g(a){return void 0!==b.onFileRequested&&null!==b.onFileRequested?b.onFileRequested(a):null}function h(a){function h(a,
|
||||
b){var c=a.indexOf(b)+b.length;return a.substr(c,a.length-c).trim()}if(0!==a.length&&"#"!=a[0]){var n=a.split(/\s+/);if(!(0===n.length||"#"==n[0][0]))if("g"==n[0]){if(!(2>n.length)){var p="";for(a=1;a<n.length;a++)p+=n[a],a<n.length-1&&(p+=" ");if(void 0!==b.onMesh&&null!==b.onMesh)b.onMesh(p)}}else if("v"==n[0])4>n.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=[],r=[],t;for(a=1;a<n.length;a++)t=n[a].split("/"),p.push(parseInt(t[0],10)-1),1<t.length&&0<t[1].length&&r.push(parseInt(t[1],10)-1),2<t.length&&0<t[2].length&&q.push(parseInt(t[2],10)-1);if(void 0!==b.onFace&&null!==b.onFace)b.onFace(p,q,r)}}else if("usemtl"==n[0]){if(!(2>n.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"==
|
||||
parseFloat(n[2]));else if("f"==n[0]){if(!(4>n.length)){var p=[],q=[],r=[],s;for(a=1;a<n.length;a++)s=n[a].split("/"),p.push(parseInt(s[0],10)-1),1<s.length&&0<s[1].length&&r.push(parseInt(s[1],10)-1),2<s.length&&0<s[2].length&&q.push(parseInt(s[2],10)-1);if(void 0!==b.onFace&&null!==b.onFace)b.onFace(p,q,r)}}else if("usemtl"==n[0]){if(!(2>n.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=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&&k(n))}}function k(a){a=a.split("\n");
|
||||
var b,c;for(b=0;b<a.length;b++)c=a[b].trim(),h(c)}k(a)};
|
||||
JSM.ConvertObjToJsonData=function(a,b){function c(a){return void 0!==b.onFileRequested&&null!==b.onFileRequested?b.onFileRequested(a):null}var d=new JSM.TriangleModel,e=d.AddBody(new JSM.TriangleBody("Default")),f=d.GetBody(e),g={},h=null,k=null,l=[],m=[],n=[];JSM.ReadObjFile(a,{onNewMaterial:function(a){var b=d.AddMaterial({name:a});h=d.GetMaterial(b);g[a]=b},onMaterialComponent:function(a,b,c,d){null!==h&&("Ka"==a?h.ambient=[b,c,d]:"Kd"==a?h.diffuse=[b,c,d]:"Ks"==a&&(h.specular=[b,c,d]))},onMaterialParameter:function(a,
|
||||
@ -276,9 +284,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;b<this.descriptors.length;b++){c=this.descriptors[b];d=c.originalObject;var e=this.IsFile();c=".OBJ"==c.extension||".MTL"==c.extension?!1:!0;d={originalObject:d,isFile:e,isArrayBuffer:c};a.push(d)}return a};JSM.ImportFileList.prototype.GetFileName=function(a){var b=a.split("/");1==b.length&&(b=a.split("\\"));return 0===b.length?"":b[b.length-1]};JSM.ImportFileList.prototype.GetFileDescriptor=function(a){return this.descriptors[a]};
|
||||
JSM.ImportFileList.prototype.IsFile=function(){return this.isFile};JSM.ImportFileList.prototype.GetMainFileIndex=function(){var a,b;for(a=0;a<this.descriptors.length;a++)if(b=this.descriptors[a],this.IsSupportedExtension(b.extension))return a;return-1};JSM.ImportFileList.prototype.GetFileIndexByName=function(a){var b,c,d;for(b=0;b<this.descriptors.length;b++)if(c=this.descriptors[b],d=this.GetFileName(a),c.fileName==d.toUpperCase())return b;return-1};
|
||||
JSM.ImportFileList.prototype.IsSupportedExtension=function(a){return".3DS"==a||".OBJ"==a||".STL"==a?!0:!1};JSM.ImportFileList.prototype.GetFileExtension=function(a){var b=a.lastIndexOf(".");if(-1==b)return"";a=a.substr(b);return a=a.toUpperCase()};
|
||||
JSM.ConvertImportFileListToJsonData=function(a,b){function c(){if(void 0!==b.onError&&null!==b.onError)b.onError()}function d(a,c){if(void 0!==b.onReady&&null!==b.onReady)b.onReady(a,c)}function e(a,b,c,d){var e=a.GetFileIndexByName(c);a=a.GetFileName(c);if(-1==e)return d.missing.push(a),null;d.requested.push(a);return b[e]}var f=a.GetMainFileIndex();if(-1===f)c();else{var g=a.GetFileDescriptor(f),h={main:g.originalFileName,requested:[],missing:[]},k=a.GetInputList();try{".3DS"==g.extension?JSM.LoadMultipleBuffers(k,
|
||||
function(b){var c=JSM.Convert3dsToJsonData(b[f],{onFileRequested:function(c){return e(a,b,c,h)}});d(h,c)}):".OBJ"==g.extension?JSM.LoadMultipleBuffers(k,function(b){var c=JSM.ConvertObjToJsonData(b[f],{onFileRequested:function(c){return e(a,b,c,h)}});d(h,c)}):".STL"==g.extension&&JSM.LoadMultipleBuffers(k,function(a){a=a[f];if(JSM.IsBinaryStlFile(a))a=JSM.ConvertStlToJsonData(a,null),d(h,a);else{for(a=0;a<k.length;a++)k[a].isArrayBuffer=!1;JSM.LoadMultipleBuffers(k,function(a){a=JSM.ConvertStlToJsonData(null,
|
||||
a[f]);d(h,a)})}})}catch(l){c()}}};JSM.ConvertFileListToJsonData=function(a,b){var c=new JSM.ImportFileList;c.InitFromFiles(a);JSM.ConvertImportFileListToJsonData(c,b)};JSM.ConvertURLListToJsonData=function(a,b){var c=new JSM.ImportFileList;c.InitFromURLs(a);JSM.ConvertImportFileListToJsonData(c,b)};
|
||||
JSM.ConvertImportFileListToJsonData=function(a,b){function c(){if(void 0!==b.onError&&null!==b.onError)b.onError()}function d(a,c){if(void 0!==b.onReady&&null!==b.onReady)b.onReady(a,c)}function e(a,b,c,d){var e=a.GetFileIndexByName(c);a=a.GetFileName(c);if(-1==e)return d.missing.push(a),null;-1==d.requested.indexOf(a)&&d.requested.push(a);return b[e]}var f=a.GetMainFileIndex();if(-1===f)c();else{var g=a.GetFileDescriptor(f),h={main:g.originalFileName,requested:[],missing:[]},k=a.GetInputList();try{".3DS"==
|
||||
g.extension?JSM.LoadMultipleBuffers(k,function(b){var c=JSM.Convert3dsToJsonData(b[f],{onFileRequested:function(c){return e(a,b,c,h)}});d(h,c)}):".OBJ"==g.extension?JSM.LoadMultipleBuffers(k,function(b){var c=JSM.ConvertObjToJsonData(b[f],{onFileRequested:function(c){return e(a,b,c,h)}});d(h,c)}):".STL"==g.extension&&JSM.LoadMultipleBuffers(k,function(a){a=a[f];if(JSM.IsBinaryStlFile(a))a=JSM.ConvertStlToJsonData(a,null),d(h,a);else{for(a=0;a<k.length;a++)k[a].isArrayBuffer=!1;JSM.LoadMultipleBuffers(k,
|
||||
function(a){a=JSM.ConvertStlToJsonData(null,a[f]);d(h,a)})}})}catch(l){c()}}};JSM.ConvertFileListToJsonData=function(a,b){var c=new JSM.ImportFileList;c.InitFromFiles(a);JSM.ConvertImportFileListToJsonData(c,b)};JSM.ConvertURLListToJsonData=function(a,b){var c=new JSM.ImportFileList;c.InitFromURLs(a);JSM.ConvertImportFileListToJsonData(c,b)};
|
||||
JSM.GenerateSolidWithRadius=function(a,b){var c=new JSM.Body,d=!0;"Tetrahedron"===a?c=JSM.GenerateTetrahedron():"Hexahedron"===a?c=JSM.GenerateHexahedron():"Octahedron"===a?c=JSM.GenerateOctahedron():"Dodecahedron"===a?c=JSM.GenerateDodecahedron():"Icosahedron"===a?c=JSM.GenerateIcosahedron():"TruncatedTetrahedron"===a?c=JSM.GenerateTruncatedTetrahedron():"Cuboctahedron"===a?c=JSM.GenerateCuboctahedron():"TruncatedCube"===a?c=JSM.GenerateTruncatedCube():"TruncatedOctahedron"===a?c=JSM.GenerateTruncatedOctahedron():
|
||||
"Rhombicuboctahedron"===a?c=JSM.GenerateRhombicuboctahedron():"TruncatedCuboctahedron"===a?c=JSM.GenerateTruncatedCuboctahedron():"SnubCube"===a?c=JSM.GenerateSnubCube():"Icosidodecahedron"===a?c=JSM.GenerateIcosidodecahedron():"TruncatedDodecahedron"===a?c=JSM.GenerateTruncatedDodecahedron():"TruncatedIcosahedron"===a?c=JSM.GenerateTruncatedIcosahedron():"Rhombicosidodecahedron"===a?c=JSM.GenerateRhombicosidodecahedron():"TruncatedIcosidodecahedron"===a?c=JSM.GenerateTruncatedIcosidodecahedron():
|
||||
"SnubDodecahedron"===a?c=JSM.GenerateSnubDodecahedron():"TetrakisHexahedron"===a?(c=JSM.GenerateTetrakisHexahedron(),d=!1):"RhombicDodecahedron"===a?(c=JSM.GenerateRhombicDodecahedron(),d=!1):"PentakisDodecahedron"===a?(c=JSM.GeneratePentakisDodecahedron(),d=!1):"SmallStellatedDodecahedron"===a?(c=JSM.GenerateSmallStellatedDodecahedron(),d=!1):"GreatDodecahedron"===a?(c=JSM.GenerateGreatDodecahedron(),d=!1):"SmallTriambicIcosahedron"===a?(c=JSM.GenerateSmallTriambicIcosahedron(),d=!1):"GreatStellatedDodecahedron"===
|
||||
@ -359,11 +367,11 @@ JSM.GenerateTruncatedIcosidodecahedron=function(){var a=new JSM.Body,b=(1+Math.s
|
||||
[18,22,46,70,66,42]);JSM.AddPolygonToBody(a,[20,44,68,71,47,23]);JSM.AddPolygonToBody(a,[72,112,88,104,80,96]);JSM.AddPolygonToBody(a,[73,97,83,107,90,114]);JSM.AddPolygonToBody(a,[74,98,81,105,91,115]);JSM.AddPolygonToBody(a,[75,99,82,106,89,113]);JSM.AddPolygonToBody(a,[76,118,94,109,85,100]);JSM.AddPolygonToBody(a,[78,117,93,108,84,102]);JSM.AddPolygonToBody(a,[79,103,87,111,95,119]);JSM.AddPolygonToBody(a,[86,101,77,116,92,110]);JSM.AddPolygonToBody(a,[0,2,26,74,115,67,64,112,72,24]);JSM.AddPolygonToBody(a,
|
||||
[1,25,73,114,66,70,118,76,28,4]);JSM.AddPolygonToBody(a,[3,27,75,113,65,69,117,78,30,6]);JSM.AddPolygonToBody(a,[5,7,31,79,119,71,68,116,77,29]);JSM.AddPolygonToBody(a,[8,10,34,82,99,51,48,96,80,32]);JSM.AddPolygonToBody(a,[9,33,81,98,50,54,102,84,36,12]);JSM.AddPolygonToBody(a,[11,35,83,97,49,53,101,86,38,14]);JSM.AddPolygonToBody(a,[13,15,39,87,103,55,52,100,85,37]);JSM.AddPolygonToBody(a,[16,18,42,90,107,59,56,104,88,40]);JSM.AddPolygonToBody(a,[17,41,89,106,58,62,110,92,44,20]);JSM.AddPolygonToBody(a,
|
||||
[19,43,91,105,57,61,109,94,46,22]);JSM.AddPolygonToBody(a,[21,23,47,95,111,63,60,108,93,45]);return a};
|
||||
JSM.GenerateSnubDodecahedron=function(){var a=new JSM.Body,b=(1+Math.sqrt(5))/2,c=Math.pow(b/2+0.5*Math.sqrt(b-5/27),1/3)+Math.pow(b/2-0.5*Math.sqrt(b-5/27),1/3),d=c-1/c,e=c*b+Math.pow(b,2)+b/c,c=2*d,f=2*e,g=d+e/b+b,h=-(d*b)+e+1/b,k=d/b+e*b-1,l=-(d/b)+e*b+1,m=-d+e/b-b,n=d*b+e-1/b,p=-(d/b)+e*b-1,q=d-e/b-b,r=d*b+e+1/b,t=d+e/b-b,w=d*b-e+1/b,b=d/b+e*b+1;JSM.AddVertexToBody(a,+c,2,-f);JSM.AddVertexToBody(a,+c,-2,+f);JSM.AddVertexToBody(a,-c,2,+f);JSM.AddVertexToBody(a,-c,-2,-f);JSM.AddVertexToBody(a,2,
|
||||
JSM.GenerateSnubDodecahedron=function(){var a=new JSM.Body,b=(1+Math.sqrt(5))/2,c=Math.pow(b/2+0.5*Math.sqrt(b-5/27),1/3)+Math.pow(b/2-0.5*Math.sqrt(b-5/27),1/3),d=c-1/c,e=c*b+Math.pow(b,2)+b/c,c=2*d,f=2*e,g=d+e/b+b,h=-(d*b)+e+1/b,k=d/b+e*b-1,l=-(d/b)+e*b+1,m=-d+e/b-b,n=d*b+e-1/b,p=-(d/b)+e*b-1,q=d-e/b-b,r=d*b+e+1/b,s=d+e/b-b,u=d*b-e+1/b,b=d/b+e*b+1;JSM.AddVertexToBody(a,+c,2,-f);JSM.AddVertexToBody(a,+c,-2,+f);JSM.AddVertexToBody(a,-c,2,+f);JSM.AddVertexToBody(a,-c,-2,-f);JSM.AddVertexToBody(a,2,
|
||||
-f,+c);JSM.AddVertexToBody(a,-2,+f,+c);JSM.AddVertexToBody(a,2,+f,-c);JSM.AddVertexToBody(a,-2,-f,-c);JSM.AddVertexToBody(a,-f,+c,2);JSM.AddVertexToBody(a,+f,+c,-2);JSM.AddVertexToBody(a,+f,-c,2);JSM.AddVertexToBody(a,-f,-c,-2);JSM.AddVertexToBody(a,+g,+h,-k);JSM.AddVertexToBody(a,+g,-h,+k);JSM.AddVertexToBody(a,-g,+h,+k);JSM.AddVertexToBody(a,-g,-h,-k);JSM.AddVertexToBody(a,+h,-k,+g);JSM.AddVertexToBody(a,-h,+k,+g);JSM.AddVertexToBody(a,+h,+k,-g);JSM.AddVertexToBody(a,-h,-k,-g);JSM.AddVertexToBody(a,
|
||||
-k,+g,+h);JSM.AddVertexToBody(a,+k,+g,-h);JSM.AddVertexToBody(a,+k,-g,+h);JSM.AddVertexToBody(a,-k,-g,-h);JSM.AddVertexToBody(a,+l,+m,-n);JSM.AddVertexToBody(a,+l,-m,+n);JSM.AddVertexToBody(a,-l,+m,+n);JSM.AddVertexToBody(a,-l,-m,-n);JSM.AddVertexToBody(a,+m,-n,+l);JSM.AddVertexToBody(a,-m,+n,+l);JSM.AddVertexToBody(a,+m,+n,-l);JSM.AddVertexToBody(a,-m,-n,-l);JSM.AddVertexToBody(a,-n,+l,+m);JSM.AddVertexToBody(a,+n,+l,-m);JSM.AddVertexToBody(a,+n,-l,+m);JSM.AddVertexToBody(a,-n,-l,-m);JSM.AddVertexToBody(a,
|
||||
+p,+q,-r);JSM.AddVertexToBody(a,+p,-q,+r);JSM.AddVertexToBody(a,-p,+q,+r);JSM.AddVertexToBody(a,-p,-q,-r);JSM.AddVertexToBody(a,+q,-r,+p);JSM.AddVertexToBody(a,-q,+r,+p);JSM.AddVertexToBody(a,+q,+r,-p);JSM.AddVertexToBody(a,-q,-r,-p);JSM.AddVertexToBody(a,-r,+p,+q);JSM.AddVertexToBody(a,+r,+p,-q);JSM.AddVertexToBody(a,+r,-p,+q);JSM.AddVertexToBody(a,-r,-p,-q);JSM.AddVertexToBody(a,+t,+w,-b);JSM.AddVertexToBody(a,+t,-w,+b);JSM.AddVertexToBody(a,-t,+w,+b);JSM.AddVertexToBody(a,-t,-w,-b);JSM.AddVertexToBody(a,
|
||||
+w,-b,+t);JSM.AddVertexToBody(a,-w,+b,+t);JSM.AddVertexToBody(a,+w,+b,-t);JSM.AddVertexToBody(a,-w,-b,-t);JSM.AddVertexToBody(a,-b,+t,+w);JSM.AddVertexToBody(a,+b,+t,-w);JSM.AddVertexToBody(a,+b,-t,+w);JSM.AddVertexToBody(a,-b,-t,-w);JSM.AddPolygonToBody(a,[0,3,51]);JSM.AddPolygonToBody(a,[0,30,12]);JSM.AddPolygonToBody(a,[0,48,3]);JSM.AddPolygonToBody(a,[0,51,30]);JSM.AddPolygonToBody(a,[1,2,50]);JSM.AddPolygonToBody(a,[1,28,13]);JSM.AddPolygonToBody(a,[1,49,2]);JSM.AddPolygonToBody(a,[1,50,28]);
|
||||
+p,+q,-r);JSM.AddVertexToBody(a,+p,-q,+r);JSM.AddVertexToBody(a,-p,+q,+r);JSM.AddVertexToBody(a,-p,-q,-r);JSM.AddVertexToBody(a,+q,-r,+p);JSM.AddVertexToBody(a,-q,+r,+p);JSM.AddVertexToBody(a,+q,+r,-p);JSM.AddVertexToBody(a,-q,-r,-p);JSM.AddVertexToBody(a,-r,+p,+q);JSM.AddVertexToBody(a,+r,+p,-q);JSM.AddVertexToBody(a,+r,-p,+q);JSM.AddVertexToBody(a,-r,-p,-q);JSM.AddVertexToBody(a,+s,+u,-b);JSM.AddVertexToBody(a,+s,-u,+b);JSM.AddVertexToBody(a,-s,+u,+b);JSM.AddVertexToBody(a,-s,-u,-b);JSM.AddVertexToBody(a,
|
||||
+u,-b,+s);JSM.AddVertexToBody(a,-u,+b,+s);JSM.AddVertexToBody(a,+u,+b,-s);JSM.AddVertexToBody(a,-u,-b,-s);JSM.AddVertexToBody(a,-b,+s,+u);JSM.AddVertexToBody(a,+b,+s,-u);JSM.AddVertexToBody(a,+b,-s,+u);JSM.AddVertexToBody(a,-b,-s,-u);JSM.AddPolygonToBody(a,[0,3,51]);JSM.AddPolygonToBody(a,[0,30,12]);JSM.AddPolygonToBody(a,[0,48,3]);JSM.AddPolygonToBody(a,[0,51,30]);JSM.AddPolygonToBody(a,[1,2,50]);JSM.AddPolygonToBody(a,[1,28,13]);JSM.AddPolygonToBody(a,[1,49,2]);JSM.AddPolygonToBody(a,[1,50,28]);
|
||||
JSM.AddPolygonToBody(a,[2,29,14]);JSM.AddPolygonToBody(a,[2,49,29]);JSM.AddPolygonToBody(a,[3,31,15]);JSM.AddPolygonToBody(a,[3,48,31]);JSM.AddPolygonToBody(a,[4,7,55]);JSM.AddPolygonToBody(a,[4,34,16]);JSM.AddPolygonToBody(a,[4,52,7]);JSM.AddPolygonToBody(a,[4,55,34]);JSM.AddPolygonToBody(a,[5,6,54]);JSM.AddPolygonToBody(a,[5,32,17]);JSM.AddPolygonToBody(a,[5,53,6]);JSM.AddPolygonToBody(a,[5,54,32]);JSM.AddPolygonToBody(a,[6,33,18]);JSM.AddPolygonToBody(a,[6,53,33]);JSM.AddPolygonToBody(a,[7,35,
|
||||
19]);JSM.AddPolygonToBody(a,[7,52,35]);JSM.AddPolygonToBody(a,[8,11,59]);JSM.AddPolygonToBody(a,[8,26,20]);JSM.AddPolygonToBody(a,[8,56,11]);JSM.AddPolygonToBody(a,[8,59,26]);JSM.AddPolygonToBody(a,[9,10,58]);JSM.AddPolygonToBody(a,[9,24,21]);JSM.AddPolygonToBody(a,[9,57,10]);JSM.AddPolygonToBody(a,[9,58,24]);JSM.AddPolygonToBody(a,[10,25,22]);JSM.AddPolygonToBody(a,[10,57,25]);JSM.AddPolygonToBody(a,[11,27,23]);JSM.AddPolygonToBody(a,[11,56,27]);JSM.AddPolygonToBody(a,[12,18,21]);JSM.AddPolygonToBody(a,
|
||||
[12,21,24]);JSM.AddPolygonToBody(a,[12,30,18]);JSM.AddPolygonToBody(a,[13,16,22]);JSM.AddPolygonToBody(a,[13,22,25]);JSM.AddPolygonToBody(a,[13,28,16]);JSM.AddPolygonToBody(a,[14,17,20]);JSM.AddPolygonToBody(a,[14,20,26]);JSM.AddPolygonToBody(a,[14,29,17]);JSM.AddPolygonToBody(a,[15,19,23]);JSM.AddPolygonToBody(a,[15,23,27]);JSM.AddPolygonToBody(a,[15,31,19]);JSM.AddPolygonToBody(a,[16,34,22]);JSM.AddPolygonToBody(a,[17,32,20]);JSM.AddPolygonToBody(a,[18,33,21]);JSM.AddPolygonToBody(a,[19,35,23]);
|
||||
@ -385,46 +393,46 @@ JSM.GenerateCumulatedIcosahedron=function(a){var b=new JSM.Body,c=(1+Math.sqrt(5
|
||||
JSM.GeneratePentakisDodecahedron=function(){var a=Math.sqrt((65+22*Math.sqrt(5))/5)/19;return JSM.GenerateCumulatedDodecahedron(a)};JSM.GenerateSmallStellatedDodecahedron=function(){var a=Math.sqrt((5+2*Math.sqrt(5))/5);return JSM.GenerateCumulatedDodecahedron(a)};JSM.GenerateGreatDodecahedron=function(){var a=Math.sqrt(3)*(Math.sqrt(5)-3)/6;return JSM.GenerateCumulatedIcosahedron(a)};JSM.GenerateSmallTriambicIcosahedron=function(){var a=Math.sqrt(15)/15;return JSM.GenerateCumulatedIcosahedron(a)};
|
||||
JSM.GenerateGreatStellatedDodecahedron=function(){var a=Math.sqrt(3)*(3+Math.sqrt(5))/6;return JSM.GenerateCumulatedIcosahedron(a)};JSM.GenerateSmallTriakisOctahedron=function(){var a=Math.sqrt(3)-2*Math.sqrt(6)/3;return JSM.GenerateCumulatedOctahedron(a)};JSM.GenerateStellaOctangula=function(){var a=Math.sqrt(6)/3;return JSM.GenerateCumulatedOctahedron(a)};JSM.GenerateTriakisTetrahedron=function(){var a=Math.sqrt(6)/15;return JSM.GenerateCumulatedTetrahedron(a)};
|
||||
JSM.LegoDimensions=function(){this.legoWidth=0.78;this.legoSmallHeight=0.32;this.legoLargeHeight=0.96;this.legoWallWidth=0.16;this.legoCylinderWidth=0.5;this.legoCylinderHeight=0.17;this.legoBottomSmallCylinderWidth=0.3;this.legoBottomLargeCylinderWidth=0.6;this.legoBottomLargeCylinderWallWidth=0.1};
|
||||
JSM.GenerateLegoBrick=function(a,b,c,d,e,f,g){function h(a,b){var c,d;for(c=0;c<a.VertexCount();c++)d=a.GetVertex(c),d.position=JSM.CoordAdd(d.position,b)}var k=new JSM.LegoDimensions,l=new JSM.Vector(0,0,1),m=k.legoWidth,n=k.legoLargeHeight;c||(n=k.legoSmallHeight);c=k.legoWallWidth;var p=k.legoCylinderWidth,q=k.legoCylinderHeight,r=k.legoBottomSmallCylinderWidth,t=k.legoBottomLargeCylinderWidth,w=k.legoBottomLargeCylinderWallWidth,u=[];u.push(new JSM.Coord(0,0,0));u.push(new JSM.Coord(m*a,0,0));
|
||||
u.push(new JSM.Coord(m*a,m*b,0));u.push(new JSM.Coord(0,m*b,0));var k=new JSM.Body,s=JSM.GeneratePrismShell(u,l,n-c,c,!0);k.Merge(s);for(s=0;4>s;s++)u[s].z=n-c;s=JSM.GeneratePrism(u,l,c,!0);k.Merge(s);if(d)for(s=0;s<a;s++)for(u=0;u<b;u++)d=new JSM.Coord(m*s+m/2,m*u+m/2,n+q/2),l=JSM.GenerateCylinder(p/2,q,f,!0,g),h(l,d),k.Merge(l);if(e)if(1===a&&1<b||1===b&&1<a){e=b;p=!0;a>b&&(e=a,p=!1);for(s=0;s<e-1;s++)d=p?new JSM.Coord(m/2,m*(s+1),(n-c)/2):new JSM.Coord(m*(s+1),m/2,(n-c)/2),l=JSM.GenerateCylinder(r/
|
||||
2,n-c,f,!0,g),h(l,d),k.Merge(l)}else if(1<a&&1<b)for(s=0;s<a-1;s++)for(u=0;u<b-1;u++)d=new JSM.Coord(m*(s+1),m*(u+1),(n-c)/2),l=JSM.GenerateCylinderShell(t/2,n-c,w,f,!0,g),h(l,d),k.Merge(l);k.SetCubicTextureProjection(new JSM.Coord(0,0,0),new JSM.Coord(1,0,0),new JSM.Coord(0,1,0),new JSM.Coord(0,0,1));return k};
|
||||
JSM.GenerateLegoBrick=function(a,b,c,d,e,f,g){function h(a,b){var c,d;for(c=0;c<a.VertexCount();c++)d=a.GetVertex(c),d.position=JSM.CoordAdd(d.position,b)}var k=new JSM.LegoDimensions,l=new JSM.Vector(0,0,1),m=k.legoWidth,n=k.legoLargeHeight;c||(n=k.legoSmallHeight);c=k.legoWallWidth;var p=k.legoCylinderWidth,q=k.legoCylinderHeight,r=k.legoBottomSmallCylinderWidth,s=k.legoBottomLargeCylinderWidth,u=k.legoBottomLargeCylinderWallWidth,v=[];v.push(new JSM.Coord(0,0,0));v.push(new JSM.Coord(m*a,0,0));
|
||||
v.push(new JSM.Coord(m*a,m*b,0));v.push(new JSM.Coord(0,m*b,0));var k=new JSM.Body,t=JSM.GeneratePrismShell(v,l,n-c,c,!0);k.Merge(t);for(t=0;4>t;t++)v[t].z=n-c;t=JSM.GeneratePrism(v,l,c,!0);k.Merge(t);if(d)for(t=0;t<a;t++)for(v=0;v<b;v++)d=new JSM.Coord(m*t+m/2,m*v+m/2,n+q/2),l=JSM.GenerateCylinder(p/2,q,f,!0,g),h(l,d),k.Merge(l);if(e)if(1===a&&1<b||1===b&&1<a){e=b;p=!0;a>b&&(e=a,p=!1);for(t=0;t<e-1;t++)d=p?new JSM.Coord(m/2,m*(t+1),(n-c)/2):new JSM.Coord(m*(t+1),m/2,(n-c)/2),l=JSM.GenerateCylinder(r/
|
||||
2,n-c,f,!0,g),h(l,d),k.Merge(l)}else if(1<a&&1<b)for(t=0;t<a-1;t++)for(v=0;v<b-1;v++)d=new JSM.Coord(m*(t+1),m*(v+1),(n-c)/2),l=JSM.GenerateCylinderShell(s/2,n-c,u,f,!0,g),h(l,d),k.Merge(l);k.SetCubicTextureProjection(new JSM.Coord(0,0,0),new JSM.Coord(1,0,0),new JSM.Coord(0,1,0),new JSM.Coord(0,0,1));return k};
|
||||
JSM.GenerateConvexHullBody=function(a){var b=new JSM.Body,c=JSM.ConvexHull3D(a),d={},e,f,g,h;for(e=0;e<c.length;e++){g=c[e];for(f=0;f<g.length;f++)h=g[f],h in d||(d[h]=b.VertexCount(),b.AddVertex(new JSM.BodyVertex(a[h])))}for(e=0;e<c.length;e++){g=c[e];a=[];for(f=0;f<g.length;f++)h=g[f],a.push(d[h]);b.AddPolygon(new JSM.BodyPolygon(a))}return b};
|
||||
JSM.GenerateSuperShape=function(a,b,c,d,e,f,g,h,k,l,m,n,p,q){function r(a){var b=Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z),c=Math.asin(a.z/b);a=Math.atan2(a.y,a.x);return[b,c,a]}function t(a,b,c,d,e,f,g){b=Math.abs(Math.cos(d*a/4)/b);a=Math.abs(Math.sin(d*a/4)/c);return Math.pow(Math.pow(b,f)+Math.pow(a,g),-1/e)}function w(p,q){var w=new JSM.Coord(0,0,0),s=t(p,g,h,k,l,m,n),r=t(q,a,b,c,d,e,f);w.x=r*Math.cos(q)*s*Math.cos(p);w.y=r*Math.sin(q)*s*Math.cos(p);w.z=s*Math.sin(p);return w}p=JSM.GenerateSphere(1,
|
||||
p,q);var u,s;for(q=0;q<p.VertexCount();q++)u=p.GetVertex(q),s=u.position,s=r(s),s=w(s[1],s[2]),u.SetPosition(s);return p};
|
||||
JSM.OrderPolygons=function(a,b,c){var d=[],e=[],f=[],g=[],h=[],k=[],l=[],m=a.PolygonCount(),n,p;for(n=0;n<m;n++){k.push(n);l.push([]);for(p=0;p<m;p++)l[n].push(null)}(function(){var k=JSM.VectorNormalize(JSM.CoordSub(c,b)),k=JSM.GetPlaneFromCoordAndDirection(b,k),l,m,n,p,s,x;for(l=0;l<a.PolygonCount();l++){s=JSM.Inf;x=-JSM.Inf;n=a.GetPolygon(l);for(m=0;m<n.VertexIndexCount();m++)p=a.GetVertexPosition(n.GetVertexIndex(m)),p=JSM.CoordPlaneDistance(p,k),JSM.IsLower(p,s)&&(s=p),JSM.IsGreater(p,x)&&(x=
|
||||
p);d.push(s);e.push(x);m=a.GetPolygon(l);n=new JSM.Coord(0,0,0);x=s=void 0;for(s=0;s<m.VertexIndexCount();s++)x=a.GetVertexPosition(m.GetVertexIndex(s)),n=JSM.CoordAdd(n,x);m=n=JSM.VectorMultiply(n,1/m.VertexIndexCount());n=JSM.CoordPlaneDistance(m,k);f.push(m);g.push(n);n=JSM.CalculateBodyPolygonNormal(a,l);s=JSM.VectorNormalize(JSM.CoordSub(m,b));s=JSM.VectorDot(n,s);JSM.IsGreaterOrEqual(s,0)&&(n=JSM.VectorMultiply(n,-1));m=JSM.GetPlaneFromCoordAndDirection(m,n);h.push(m)}})();(function(){var a=
|
||||
k.length,b,c;for(b=0;b<a-1;b++)for(c=0;c<a-b-1;c++){var d;d=k[c];var f=k[c+1];d=JSM.IsLower(e[d],e[f])?!0:JSM.IsEqual(e[d],e[f])&&JSM.IsLower(g[d],g[f])?!0:!1;if(d){d=k;var f=c+1,h=d[c];d[c]=d[f];d[f]=h}}})();(function(){var b=k.length,c,f;for(c=0;c<b-1;c++)for(f=0;f<b-c-1;f++){var g;g=k[f];var m=k[f+1];if(null!==l[g][m])g=l[g][m];else{var n;if(n=JSM.IsLowerOrEqual(d[g],e[m])){var p=m;n=h[g];for(var B=h[p],C=void 0,v=void 0,G=!0,z=a.GetPolygon(g),C=0;C<z.VertexIndexCount();C++)if(v=a.GetVertexPosition(z.GetVertexIndex(C)),
|
||||
"CoordInFrontOfPlane"===JSM.CoordPlanePosition(v,B)){G=!1;break}if(G)n=!1;else{B=!0;p=a.GetPolygon(p);for(C=0;C<p.VertexIndexCount();C++)if(v=a.GetVertexPosition(p.GetVertexIndex(C)),"CoordAtBackOfPlane"===JSM.CoordPlanePosition(v,n)){B=!1;break}n=B?!1:!0}}g=n?l[g][m]=!0:l[g][m]=!1}g&&(g=k,m=f+1,n=g[f],g[f]=g[m],g[m]=n)}})();return k};JSM.CanvasDrawer=function(a){this.canvas=a;this.context=this.canvas.getContext("2d")};JSM.CanvasDrawer.prototype.GetWidth=function(){return this.canvas.width};
|
||||
JSM.GenerateSuperShape=function(a,b,c,d,e,f,g,h,k,l,m,n,p,q){function r(a){var b=Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z),c=Math.asin(a.z/b);a=Math.atan2(a.y,a.x);return[b,c,a]}function s(a,b,c,d,e,f,g){b=Math.abs(Math.cos(d*a/4)/b);a=Math.abs(Math.sin(d*a/4)/c);return Math.pow(Math.pow(b,f)+Math.pow(a,g),-1/e)}function u(p,q){var u=new JSM.Coord(0,0,0),t=s(p,g,h,k,l,m,n),r=s(q,a,b,c,d,e,f);u.x=r*Math.cos(q)*t*Math.cos(p);u.y=r*Math.sin(q)*t*Math.cos(p);u.z=t*Math.sin(p);return u}p=JSM.GenerateSphere(1,
|
||||
p,q);var v,t;for(q=0;q<p.VertexCount();q++)v=p.GetVertex(q),t=v.position,t=r(t),t=u(t[1],t[2]),v.SetPosition(t);return p};
|
||||
JSM.OrderPolygons=function(a,b,c){var d=[],e=[],f=[],g=[],h=[],k=[],l=[],m=a.PolygonCount(),n,p;for(n=0;n<m;n++){k.push(n);l.push([]);for(p=0;p<m;p++)l[n].push(null)}(function(){var k=JSM.VectorNormalize(JSM.CoordSub(c,b)),k=JSM.GetPlaneFromCoordAndDirection(b,k),l,m,n,p,t,x;for(l=0;l<a.PolygonCount();l++){t=JSM.Inf;x=-JSM.Inf;n=a.GetPolygon(l);for(m=0;m<n.VertexIndexCount();m++)p=a.GetVertexPosition(n.GetVertexIndex(m)),p=JSM.CoordPlaneDistance(p,k),JSM.IsLower(p,t)&&(t=p),JSM.IsGreater(p,x)&&(x=
|
||||
p);d.push(t);e.push(x);m=a.GetPolygon(l);n=new JSM.Coord(0,0,0);x=t=void 0;for(t=0;t<m.VertexIndexCount();t++)x=a.GetVertexPosition(m.GetVertexIndex(t)),n=JSM.CoordAdd(n,x);m=n=JSM.VectorMultiply(n,1/m.VertexIndexCount());n=JSM.CoordPlaneDistance(m,k);f.push(m);g.push(n);n=JSM.CalculateBodyPolygonNormal(a,l);t=JSM.VectorNormalize(JSM.CoordSub(m,b));t=JSM.VectorDot(n,t);JSM.IsGreaterOrEqual(t,0)&&(n=JSM.VectorMultiply(n,-1));m=JSM.GetPlaneFromCoordAndDirection(m,n);h.push(m)}})();(function(){var a=
|
||||
k.length,b,c;for(b=0;b<a-1;b++)for(c=0;c<a-b-1;c++){var d;d=k[c];var f=k[c+1];d=JSM.IsLower(e[d],e[f])?!0:JSM.IsEqual(e[d],e[f])&&JSM.IsLower(g[d],g[f])?!0:!1;if(d){d=k;var f=c+1,h=d[c];d[c]=d[f];d[f]=h}}})();(function(){var b=k.length,c,f;for(c=0;c<b-1;c++)for(f=0;f<b-c-1;f++){var g;g=k[f];var m=k[f+1];if(null!==l[g][m])g=l[g][m];else{var n;if(n=JSM.IsLowerOrEqual(d[g],e[m])){var p=m;n=h[g];for(var B=h[p],C=void 0,w=void 0,G=!0,z=a.GetPolygon(g),C=0;C<z.VertexIndexCount();C++)if(w=a.GetVertexPosition(z.GetVertexIndex(C)),
|
||||
"CoordInFrontOfPlane"===JSM.CoordPlanePosition(w,B)){G=!1;break}if(G)n=!1;else{B=!0;p=a.GetPolygon(p);for(C=0;C<p.VertexIndexCount();C++)if(w=a.GetVertexPosition(p.GetVertexIndex(C)),"CoordAtBackOfPlane"===JSM.CoordPlanePosition(w,n)){B=!1;break}n=B?!1:!0}}g=n?l[g][m]=!0:l[g][m]=!1}g&&(g=k,m=f+1,n=g[f],g[f]=g[m],g[m]=n)}})();return k};JSM.CanvasDrawer=function(a){this.canvas=a;this.context=this.canvas.getContext("2d")};JSM.CanvasDrawer.prototype.GetWidth=function(){return this.canvas.width};
|
||||
JSM.CanvasDrawer.prototype.GetHeight=function(){return this.canvas.height};JSM.CanvasDrawer.prototype.BeginPath=function(){this.context.beginPath()};JSM.CanvasDrawer.prototype.EndPath=function(){this.context.stroke()};JSM.CanvasDrawer.prototype.Clear=function(){this.context.clearRect(0,0,this.canvas.width,this.canvas.height);this.context.fillStyle="#ffffff";this.context.fillRect(0,0,this.canvas.width,this.canvas.height)};
|
||||
JSM.CanvasDrawer.prototype.DrawLine=function(a,b){this.context.moveTo(a.x,this.canvas.height-a.y);this.context.lineTo(b.x,this.canvas.height-b.y)};
|
||||
JSM.CanvasDrawer.prototype.DrawPolygon=function(a,b){var c=this.context,d=JSM.HexColorToRGBComponents(b);c.fillStyle="rgb("+d[0]+","+d[1]+","+d[2]+")";this.context.beginPath();for(var e,c=0;c<a.VertexCount();c++)d=a.GetVertex(c),0===c?this.context.moveTo(d.x,this.canvas.height-d.y):this.context.lineTo(d.x,this.canvas.height-d.y);this.context.closePath();this.context.fill();this.BeginPath();for(c=0;c<a.VertexCount();c++)d=a.GetVertex(c),e=a.GetVertex(c<a.VertexCount()-1?c+1:0),this.DrawLine(d,e);this.EndPath()};
|
||||
JSM.SVGDrawer=function(a){this.svgObject=a;this.svgNameSpace="http://www.w3.org/2000/svg"};JSM.SVGDrawer.prototype.GetWidth=function(){return this.svgObject.getAttribute("width")};JSM.SVGDrawer.prototype.GetHeight=function(){return this.svgObject.getAttribute("height")};JSM.SVGDrawer.prototype.BeginPath=function(){};JSM.SVGDrawer.prototype.EndPath=function(){};JSM.SVGDrawer.prototype.Clear=function(){for(;this.svgObject.lastChild;)this.svgObject.removeChild(this.svgObject.lastChild)};
|
||||
JSM.SVGDrawer.prototype.DrawLine=function(a,b){var c=document.createElementNS(this.svgNameSpace,"line"),d=this.GetHeight();c.setAttributeNS(null,"stroke","black");c.setAttributeNS(null,"x1",a.x);c.setAttributeNS(null,"y1",d-a.y);c.setAttributeNS(null,"x2",b.x);c.setAttributeNS(null,"y2",d-b.y);this.svgObject.appendChild(c)};
|
||||
JSM.SVGDrawer.prototype.DrawPolygon=function(a,b){var c="",d=this.GetHeight(),e,f;for(e=0;e<a.VertexCount();e++)f=a.GetVertex(e),c=c+f.x+", "+(d-f.y),e<a.VertexCount()-1&&(c+=", ");d=document.createElementNS(this.svgNameSpace,"polygon");d.setAttributeNS(null,"points",c);d.setAttributeNS(null,"fill",function(a){a=JSM.HexColorToRGBComponents(a);return"rgb("+a[0]+","+a[1]+","+a[2]+")"}(b));d.setAttributeNS(null,"fill-opacity","1.0");d.setAttributeNS(null,"stroke","black");this.svgObject.appendChild(d)};
|
||||
JSM.DrawProjectedBody=function(a,b,c,d,e,f){function g(b){var c=new JSM.Polygon2D,d,e,f;for(d=0;d<b.VertexIndexCount();d++)e=a.GetVertexPosition(b.GetVertexIndex(d)),f=JSM.Project(e,k,l,m,n*JSM.DegRad,p,q,r,t),e=f.x,f=f.y,c.AddVertex(e,f);return c}e&&f.Clear();e=f.GetWidth();var h=f.GetHeight(),k=c.eye,l=c.center,m=c.up,n=c.fieldOfView,p=e/h,q=c.nearClippingPlane,r=c.farClippingPlane,t=[0,0,e,h];if("HiddenLinePainter"==d){h=JSM.OrderPolygons(a,k,l);if(void 0===b||null===b)b=new JSM.Materials;for(c=
|
||||
0;c<h.length;c++)e=a.GetPolygon(h[c]),d=g(e),e=e.GetMaterialIndex(),e=b.GetMaterial(e).diffuse,f.DrawPolygon(d,e)}else if("HiddenLineFrontFacing"==d){if(void 0===b||null===b)b=new JSM.Materials;for(c=0;c<a.PolygonCount();c++)e=a.GetPolygon(c),d=g(e),"CounterClockwise"==JSM.PolygonOrientation2D(d)&&(e=e.GetMaterialIndex(),e=b.GetMaterial(e).diffuse,f.DrawPolygon(d,e))}else if("Wireframe"==d){var w,u,s;f.BeginPath();var x=[];for(c=0;c<a.PolygonCount();c++){u=w=null;e=a.GetPolygon(c);h=e.VertexIndexCount();
|
||||
for(b=0;b<=h;b++)s=e.GetVertexIndex(b%h),d=a.GetVertexPosition(s),d=JSM.Project(d,k,l,m,n*JSM.DegRad,p,q,r,t),null!==w&&(null!==u&&void 0===x[[u,s]])&&(f.DrawLine(w,d),x[[u,s]]=!0,x[[s,u]]=!0),u=s,w=d}f.EndPath()}return!0};
|
||||
JSM.DrawProjectedBody=function(a,b,c,d,e,f){function g(b){var c=new JSM.Polygon2D,d,e,f;for(d=0;d<b.VertexIndexCount();d++)e=a.GetVertexPosition(b.GetVertexIndex(d)),f=JSM.Project(e,k,l,m,n*JSM.DegRad,p,q,r,s),e=f.x,f=f.y,c.AddVertex(e,f);return c}e&&f.Clear();e=f.GetWidth();var h=f.GetHeight(),k=c.eye,l=c.center,m=c.up,n=c.fieldOfView,p=e/h,q=c.nearClippingPlane,r=c.farClippingPlane,s=[0,0,e,h];if("HiddenLinePainter"==d){h=JSM.OrderPolygons(a,k,l);if(void 0===b||null===b)b=new JSM.Materials;for(c=
|
||||
0;c<h.length;c++)e=a.GetPolygon(h[c]),d=g(e),e=e.GetMaterialIndex(),e=b.GetMaterial(e).diffuse,f.DrawPolygon(d,e)}else if("HiddenLineFrontFacing"==d){if(void 0===b||null===b)b=new JSM.Materials;for(c=0;c<a.PolygonCount();c++)e=a.GetPolygon(c),d=g(e),"CounterClockwise"==JSM.PolygonOrientation2D(d)&&(e=e.GetMaterialIndex(),e=b.GetMaterial(e).diffuse,f.DrawPolygon(d,e))}else if("Wireframe"==d){var u,v,t;f.BeginPath();var x=[];for(c=0;c<a.PolygonCount();c++){v=u=null;e=a.GetPolygon(c);h=e.VertexIndexCount();
|
||||
for(b=0;b<=h;b++)t=e.GetVertexIndex(b%h),d=a.GetVertexPosition(t),d=JSM.Project(d,k,l,m,n*JSM.DegRad,p,q,r,s),null!==u&&(null!==v&&void 0===x[[v,t]])&&(f.DrawLine(u,d),x[[v,t]]=!0,x[[t,v]]=!0),v=t,u=d}f.EndPath()}return!0};
|
||||
JSM.CatmullClarkSubdivisionOneIteration=function(a){var b=new JSM.Body,c=JSM.CalculateAdjacencyInfo(a);(function(){var d,e;for(d=0;d<c.verts.length;d++)e=a.GetVertex(d).position,b.AddVertex(new JSM.BodyVertex(new JSM.Coord(e.x,e.y,e.z)))})();var d=[];(function(){var e,g,h,k,l;for(e=0;e<c.pgons.length;e++){h=c.pgons[e];l=new JSM.Coord(0,0,0);for(g=0;g<h.verts.length;g++)k=a.GetVertex(h.verts[g]).position,l=JSM.CoordAdd(l,k);l=JSM.VectorMultiply(l,1/h.verts.length);d.push(b.AddVertex(new JSM.BodyVertex(l)))}})();
|
||||
var e=[];(function(){var f,g,h,k,l;for(f=0;f<c.edges.length;f++){h=c.edges[f];k=new JSM.Coord(0,0,0);k=JSM.CoordAdd(k,JSM.VectorMultiply(a.GetVertex(h.vert1).position,0.25));k=JSM.CoordAdd(k,JSM.VectorMultiply(a.GetVertex(h.vert2).position,0.25));for(g=0;2>g;g++)l=0===g?h.pgon1:h.pgon2,-1===l&&(l=0===g?h.pgon2:h.pgon1),l=b.GetVertex(d[l]).position,k=JSM.CoordAdd(k,JSM.VectorMultiply(l,0.25));e.push(b.AddVertex(new JSM.BodyVertex(k)))}})();(function(){var e=[],g,h,k,l;for(k=0;k<c.edges.length;k++)g=
|
||||
c.edges[k],h=JSM.MidCoord(a.GetVertex(g.vert1).position,a.GetVertex(g.vert2).position),e.push(h);var m,n,p;for(k=0;k<c.verts.length;k++){m=c.verts[k];p=new JSM.Coord(0,0,0);g=new JSM.Coord(0,0,0);n=1/m.pgons.length;for(l=0;l<m.pgons.length;l++)h=b.GetVertex(d[m.pgons[l]]).position,p=JSM.CoordAdd(p,JSM.VectorMultiply(h,n));n=1/m.edges.length;for(l=0;l<m.edges.length;l++)h=e[m.edges[l]],g=JSM.CoordAdd(g,JSM.VectorMultiply(h,n));m=m.edges.length;l=b.GetVertex(k).position;l.x=(p.x+2*g.x+(m-3)*l.x)/m;
|
||||
l.y=(p.y+2*g.y+(m-3)*l.y)/m;l.z=(p.z+2*g.z+(m-3)*l.z)/m}})();(function(){var f,g,h,k,l,m,n,p;for(m=0;m<c.pgons.length;m++){p=c.pgons[m];f=p.verts.length;for(n=0;n<f;n++)g=p.pedges[n],h=p.pedges[(n+1)%f],k=d[m],g=e[g.index],l=JSM.GetPolyEdgeStartVertex(h,c),h=e[h.index],k=new JSM.BodyPolygon([k,g,l,h]),h=a.GetPolygon(m),k.material=h.material,k.curved=h.curved,b.AddPolygon(k)}})();return b};
|
||||
JSM.CatmullClarkSubdivision=function(a,b){var c=a,d;for(d=0;d<b;d++)c=JSM.CatmullClarkSubdivisionOneIteration(c);return c};
|
||||
JSM.SvgToModel=function(a,b,c){function d(a,b){function c(a,b,d,e,f,g){a=a.createSVGPoint();a.x=f;a.y=g;e=a.matrixTransform(e.getCTM());a=new JSM.Coord2D(e.x,e.y);f=new JSM.Coord2D(f,g);g=b.VertexCount(d);if(0<g&&JSM.CoordIsEqual2DWithEps(b.GetVertex(d,g-1),a,0.1))return f;b.AddVertex(d,e.x,e.y);return f}function d(a,b,e,f,g,h,k){var l=document.createElementNS("http://www.w3.org/2000/svg","path"),m="M "+f.x+" "+f.y+" ",n,q,s,r,t;for(n=0;n<g.length;n++)if(q=g[n],q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS||
|
||||
q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL)s=q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS?"C":"c",m+=s+" "+q.x1+" "+q.y1+" "+q.x2+" "+q.y2+" "+q.x+" "+q.y+" ";else if(q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS||q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL)s=q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS?"Q":"q",m+=s+" "+q.x1+" "+q.y1+" "+q.x+" "+q.y+" ";else if(q.pathSegType==SVGPathSeg.PATHSEG_ARC_ABS||q.pathSegType==SVGPathSeg.PATHSEG_ARC_REL)s=q.pathSegType==
|
||||
SVGPathSeg.PATHSEG_ARC_ABS?"A":"a",r=q.largeArcFlag?1:0,t=q.sweepFlag?1:0,m+=s+" "+q.r1+" "+q.r2+" "+q.angle+" "+r+" "+t+" "+q.x+" "+q.y+" ";else if(q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL)s=q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS?"S":"s",m+=s+" "+q.x2+" "+q.y2+" "+q.x+" "+q.y+" ";l.setAttributeNS(null,"d",m);m=l.getTotalLength();g=0;0<e&&(g=parseInt(m/e,10));3>g&&(g=3);e=m/g;for(m=1;m<=g;m++)f=l.getPointAtLength(m*
|
||||
JSM.SvgToModel=function(a,b,c){function d(a,b){function c(a,b,d,e,f,g){a=a.createSVGPoint();a.x=f;a.y=g;e=a.matrixTransform(e.getCTM());a=new JSM.Coord2D(e.x,e.y);f=new JSM.Coord2D(f,g);g=b.VertexCount(d);if(0<g&&JSM.CoordIsEqual2DWithEps(b.GetVertex(d,g-1),a,0.1))return f;b.AddVertex(d,e.x,e.y);return f}function d(a,b,e,f,g,h,k){var l=document.createElementNS("http://www.w3.org/2000/svg","path"),m="M "+f.x+" "+f.y+" ",n,q,t,s,r;for(n=0;n<g.length;n++)if(q=g[n],q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS||
|
||||
q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL)t=q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS?"C":"c",m+=t+" "+q.x1+" "+q.y1+" "+q.x2+" "+q.y2+" "+q.x+" "+q.y+" ";else if(q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS||q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL)t=q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS?"Q":"q",m+=t+" "+q.x1+" "+q.y1+" "+q.x+" "+q.y+" ";else if(q.pathSegType==SVGPathSeg.PATHSEG_ARC_ABS||q.pathSegType==SVGPathSeg.PATHSEG_ARC_REL)t=q.pathSegType==
|
||||
SVGPathSeg.PATHSEG_ARC_ABS?"A":"a",s=q.largeArcFlag?1:0,r=q.sweepFlag?1:0,m+=t+" "+q.r1+" "+q.r2+" "+q.angle+" "+s+" "+r+" "+q.x+" "+q.y+" ";else if(q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL)t=q.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS?"S":"s",m+=t+" "+q.x2+" "+q.y2+" "+q.x+" "+q.y+" ";l.setAttributeNS(null,"d",m);m=l.getTotalLength();g=0;0<e&&(g=parseInt(m/e,10));3>g&&(g=3);e=m/g;for(m=1;m<=g;m++)f=l.getPointAtLength(m*
|
||||
e),f=c(a,h,k,b,f.x,f.y);return f}function e(a,b){var c=a.VertexCount(b);if(0!==c){var d=a.GetVertex(b,0),c=a.GetVertex(b,c-1);JSM.CoordIsEqual2DWithEps(d,c,0.1)&&a.GetContour(b).vertices.pop()}}function f(a,b){return 0<a.VertexCount(b)?(e(a,b),a.AddContour(),b+1):b}var g=new JSM.ContourPolygon2D,h=document.createElementNS("http://www.w3.org/2000/svg","svg"),k;if(a instanceof SVGPathElement){var l=new JSM.Coord2D(0,0),B=new JSM.Coord2D(0,0),C=b;a.hasAttribute("segmentlength")&&(C=parseFloat(a.getAttribute("segmentlength")));
|
||||
var v,G,z=0;for(k=0;k<a.pathSegList.numberOfItems;k++)if(v=a.pathSegList.getItem(k),v.pathSegType!=SVGPathSeg.PATHSEG_CLOSEPATH)if(v.pathSegType==SVGPathSeg.PATHSEG_MOVETO_ABS)z=f(g,z),l=c(h,g,z,a,v.x,v.y),B=l.Clone();else if(v.pathSegType==SVGPathSeg.PATHSEG_MOVETO_REL)z=f(g,z),l=c(h,g,z,a,B.x+v.x,B.y+v.y),B=l.Clone();else if(v.pathSegType==SVGPathSeg.PATHSEG_LINETO_ABS)l=c(h,g,z,a,v.x,v.y);else if(v.pathSegType==SVGPathSeg.PATHSEG_LINETO_REL)l=c(h,g,z,a,l.x+v.x,l.y+v.y);else if(v.pathSegType==SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS)l=
|
||||
c(h,g,z,a,v.x,l.y);else if(v.pathSegType==SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS)l=c(h,g,z,a,l.x,v.y);else if(v.pathSegType==SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL)l=c(h,g,z,a,l.x+v.x,l.y);else if(v.pathSegType==SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL)l=c(h,g,z,a,l.x,l.y+v.y);else if(v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS||v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL||v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS||v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL||
|
||||
v.pathSegType==SVGPathSeg.PATHSEG_ARC_ABS||v.pathSegType==SVGPathSeg.PATHSEG_ARC_REL||v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL){G=[];if(v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL){for(;k<a.pathSegList.numberOfItems;k++){v=a.pathSegList.getItem(k);if(!(v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||v.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL))break;
|
||||
G.push(v)}k-=1}else G.push(v);l=d(h,a,C,l,G,g,z)}e(g,z)}else if(a instanceof SVGRectElement)c(h,g,0,a,a.x.baseVal.value,a.y.baseVal.value),c(h,g,0,a,a.x.baseVal.value+a.width.baseVal.value,a.y.baseVal.value),c(h,g,0,a,a.x.baseVal.value+a.width.baseVal.value,a.y.baseVal.value+a.height.baseVal.value),c(h,g,0,a,a.x.baseVal.value,a.y.baseVal.value+a.height.baseVal.value);else if(a instanceof SVGPolygonElement)for(k=0;k<a.points.numberOfItems;k++)l=a.points.getItem(k),c(h,g,0,a,l.x,l.y);g.color=function(a){for(var b=
|
||||
var w,G,z=0;for(k=0;k<a.pathSegList.numberOfItems;k++)if(w=a.pathSegList.getItem(k),w.pathSegType!=SVGPathSeg.PATHSEG_CLOSEPATH)if(w.pathSegType==SVGPathSeg.PATHSEG_MOVETO_ABS)z=f(g,z),l=c(h,g,z,a,w.x,w.y),B=l.Clone();else if(w.pathSegType==SVGPathSeg.PATHSEG_MOVETO_REL)z=f(g,z),l=c(h,g,z,a,B.x+w.x,B.y+w.y),B=l.Clone();else if(w.pathSegType==SVGPathSeg.PATHSEG_LINETO_ABS)l=c(h,g,z,a,w.x,w.y);else if(w.pathSegType==SVGPathSeg.PATHSEG_LINETO_REL)l=c(h,g,z,a,l.x+w.x,l.y+w.y);else if(w.pathSegType==SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS)l=
|
||||
c(h,g,z,a,w.x,l.y);else if(w.pathSegType==SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS)l=c(h,g,z,a,l.x,w.y);else if(w.pathSegType==SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL)l=c(h,g,z,a,l.x+w.x,l.y);else if(w.pathSegType==SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL)l=c(h,g,z,a,l.x,l.y+w.y);else if(w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS||w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL||w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS||w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL||
|
||||
w.pathSegType==SVGPathSeg.PATHSEG_ARC_ABS||w.pathSegType==SVGPathSeg.PATHSEG_ARC_REL||w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL){G=[];if(w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL){for(;k<a.pathSegList.numberOfItems;k++){w=a.pathSegList.getItem(k);if(!(w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||w.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL))break;
|
||||
G.push(w)}k-=1}else G.push(w);l=d(h,a,C,l,G,g,z)}e(g,z)}else if(a instanceof SVGRectElement)c(h,g,0,a,a.x.baseVal.value,a.y.baseVal.value),c(h,g,0,a,a.x.baseVal.value+a.width.baseVal.value,a.y.baseVal.value),c(h,g,0,a,a.x.baseVal.value+a.width.baseVal.value,a.y.baseVal.value+a.height.baseVal.value),c(h,g,0,a,a.x.baseVal.value,a.y.baseVal.value+a.height.baseVal.value);else if(a instanceof SVGPolygonElement)for(k=0;k<a.points.numberOfItems;k++)l=a.points.getItem(k),c(h,g,0,a,l.x,l.y);g.color=function(a){for(var b=
|
||||
"";null!==a&&void 0!==a&&0===b.length;)b=a.getAttribute("fill"),null===b&&(b=a.style.fill),a=a.parentElement;a=0;if(0===b.length)return a;if("#"==b[0])a=JSM.HexColorToRGBColor(b.substring(1));else{var c=b.indexOf("("),d=b.indexOf(")");if(-1==c||-1==d)return a;b=b.substring(c+1,d).split(", ");if(3!=b.length)return a;a=JSM.RGBComponentsToHexColor(b[0],b[1],b[2])}return a}(a);return g}function e(a,b){function c(a,b){var d=[],e,f;if("Clockwise"==b)for(e=0;e<a.VertexCount();e++)f=a.GetVertex(e),d.push(new JSM.Coord(f.x,
|
||||
0,-f.y));else for(e=a.VertexCount()-1;0<=e;e--)f=a.GetVertex(e),d.push(new JSM.Coord(f.x,0,-f.y));return d}function d(a,b,c){a.push(null);var e;if("CounterClockwise"==c)for(c=0;c<b.VertexCount();c++)e=b.GetVertex(c),a.push(new JSM.Coord(e.x,0,-e.y));else for(c=b.VertexCount()-1;0<=c;c--)e=b.GetVertex(c),a.push(new JSM.Coord(e.x,0,-e.y))}var e=[],f=new JSM.Vector(0,-1,0),g,h;h=a.ContourCount();if(1==h)h=JSM.PolygonOrientation2D(a.GetContour(0)),g=c(a.GetContour(0),h),g=JSM.GeneratePrism(g,f,b,!0),
|
||||
e.push(g);else if(1<h){h=JSM.PolygonOrientation2D(a.GetContour(0));var k=c(a.GetContour(0),h),l=!1,B;for(B=1;B<a.ContourCount();B++)g=JSM.PolygonOrientation2D(a.GetContour(B)),g==h?(g=c(a.GetContour(B),h),g=JSM.GeneratePrism(g,f,b,!0),e.push(g)):(d(k,a.GetContour(B),g),l=!0);g=l?JSM.GeneratePrismWithHole(k,f,b,!0):JSM.GeneratePrism(k,f,b,!0);e.push(g)}f=new JSM.Material({ambient:a.color,diffuse:a.color});return[e,f]}var f=new JSM.Model,g=new JSM.Materials;c=function(a,b){function c(a,b,d){a=a.getElementsByTagName(b);
|
||||
for(b=0;b<a.length;b++)d.push(a[b])}var e=[],f=[];c(a,"path",f);c(a,"rect",f);c(a,"polygon",f);var g=b;a.hasAttribute("segmentlength")&&(g=parseFloat(a.getAttribute("segmentlength")));var h,k;for(h=0;h<f.length;h++)k=d(f[h],g),e.push(k);return e}(a,c);a.hasAttribute("modelheight")&&(b=parseFloat(a.getAttribute("modelheight")));var h,k,l;for(a=0;a<c.length;a++){h=e(c[a],b);k=h[0];h=h[1];g.AddMaterial(h);for(h=0;h<k.length;h++)l=k[h],l.SetPolygonsMaterialIndex(g.Count()-1),f.AddBody(l)}return[f,g]};
|
||||
JSM.BSPPolygonUserData=function(){this.material=this.id=null};JSM.AddBodyToBSPTree=function(a,b,c){var d,e,f;for(d=0;d<a.PolygonCount();d++){f=new JSM.BSPPolygonUserData;f.id=c;e=a;var g=f,h=e.GetPolygon(d);g.material=h.GetMaterialIndex();for(var g=new JSM.Polygon,k=void 0,l=void 0,k=0;k<h.VertexIndexCount();k++)l=e.GetVertexPosition(h.GetVertexIndex(k)),g.AddVertex(l.x,l.y,l.z);e=g;b.AddPolygon(e,f)}};
|
||||
JSM.BooleanOperation=function(a,b,c){function d(a,b,c){function d(a){b.AddVertex(new JSM.BodyVertex(a));return b.VertexCount()-1}var e=new JSM.BodyPolygon([]),f;if(c)for(c=a.VertexCount()-1;0<=c;c--)f=d(a.GetVertex(c)),e.AddVertexIndex(f);else for(c=0;c<a.VertexCount();c++)f=d(a.GetVertex(c)),e.AddVertexIndex(f);void 0!==a.userData&&e.SetMaterialIndex(a.userData.material);b.AddPolygon(e)}function e(a,b,c){var e;for(e=0;e<a.length;e++)d(a[e],b,c)}function f(a,b,c,d,e,f){function g(a,b){var c;for(c=
|
||||
0;c<a.length;c++)a[c].userData=b}var h,k;for(h=0;h<a.length;h++)k=a[h],JSM.ClipPolygonWithBSPTree(k.polygon,b,c,d,e,f),g(c,k.userData),g(d,k.userData),g(e,k.userData),g(f,k.userData)}var g=new JSM.BSPTree,h=new JSM.BSPTree;JSM.AddBodyToBSPTree(b,g,"a");JSM.AddBodyToBSPTree(c,h,"b");b=new JSM.Body;c=[];var k=[],l=[],m=[];f(g.GetNodes(),h,c,k,l,m);var n=[],p=[],q=[];f(h.GetNodes(),g,n,p,q,[]);"Union"==a?(e(c,b,!1),e(l,b,!1),e(m,b,!1),e(n,b,!1),e(q,b,!1)):"Difference"==a?(e(c,b,!1),e(l,b,!1),e(p,b,!0)):
|
||||
"Intersection"==a&&(e(k,b,!1),e(m,b,!1),e(p,b,!1));return b};
|
||||
JSM.BooleanOperation=function(a,b,c){function d(a,b,c,d){function e(a,c){return b.AddVertex(new JSM.BodyVertex(a))}var f=new JSM.BodyPolygon([]),g;if(d)for(d=a.VertexCount()-1;0<=d;d--)g=e(a.GetVertex(d),c),f.AddVertexIndex(g);else for(d=0;d<a.VertexCount();d++)g=e(a.GetVertex(d),c),f.AddVertexIndex(g);void 0!==a.userData&&f.SetMaterialIndex(a.userData.material);b.AddPolygon(f)}function e(a,b,c,e){var f;for(f=0;f<a.length;f++)d(a[f],b,c,e)}function f(a,b,c,d,e,f){function g(a,b){var c;for(c=0;c<a.length;c++)a[c].userData=
|
||||
b}var h,k;for(h=0;h<a.length;h++)k=a[h],JSM.ClipPolygonWithBSPTree(k.polygon,b,c,d,e,f),g(c,k.userData),g(d,k.userData),g(e,k.userData),g(f,k.userData)}var g=new JSM.BSPTree,h=new JSM.BSPTree;JSM.AddBodyToBSPTree(b,g,"a");JSM.AddBodyToBSPTree(c,h,"b");var k=[],l=[],m=[],n=[];f(g.GetNodes(),h,k,l,m,n);var p=[],q=[],r=[];f(h.GetNodes(),g,p,q,r,[]);g=new JSM.Body;b=new JSM.Octree(JSM.BoxUnion(b.GetBoundingBox(),c.GetBoundingBox()));"Union"==a?(e(k,g,b,!1),e(m,g,b,!1),e(n,g,b,!1),e(p,g,b,!1),e(r,g,b,
|
||||
!1)):"Difference"==a?(e(k,g,b,!1),e(m,g,b,!1),e(q,g,b,!0)):"Intersection"==a&&(e(l,g,b,!1),e(n,g,b,!1),e(q,g,b,!1));return g};
|
||||
JSM.GenerateSurface=function(a,b,c,d,e,f,g,h){var k=new JSM.Body,l=a[0],m=b[0],n=(a[1]-a[0])/c,p=(b[1]-b[0])/d;(function(){var a,b,e,f;for(a=0;a<=d;a++)for(b=0;b<=c;b++)e=l+b*n,f=m+a*p,e=g(a,b,e,f,h),k.AddVertex(new JSM.BodyVertex(e))})();(function(){var a,b,g,h,l,m;for(b=0;b<d;b++)for(a=0;a<c;a++)g=b*(c+1)+a,h=g+1,l=g+c+1,m=l+1,e?(h=new JSM.BodyPolygon([g,h,m]),f&&h.SetCurveGroup(0),k.AddPolygon(h),h=new JSM.BodyPolygon([g,m,l])):h=new JSM.BodyPolygon([g,h,m,l]),f&&h.SetCurveGroup(0),k.AddPolygon(h)})();
|
||||
return k};JSM.SurfaceControlPoints=function(a,b){this.n=a;this.m=b;this.points=[];var c,d;for(c=0;c<=this.n;c++){this.points.push([]);for(d=0;d<=this.m;d++)this.points[c].push(new JSM.Coord(0,0,0))}};JSM.SurfaceControlPoints.prototype.GetNValue=function(){return this.n};JSM.SurfaceControlPoints.prototype.GetMValue=function(){return this.m};JSM.SurfaceControlPoints.prototype.GetControlPoint=function(a,b){return this.points[a][b]};
|
||||
JSM.SurfaceControlPoints.prototype.InitPlanar=function(a,b){var c=a/this.n,d=b/this.m,e,f,g;for(e=0;e<=this.n;e++)for(f=0;f<=this.m;f++)g=this.points[e][f],g.x=e*c,g.y=f*d};
|
||||
@ -463,7 +471,7 @@ JSM.PointCloudRenderer.prototype.Render=function(){this.context.viewport(0,0,thi
|
||||
this.camera.up);this.context.uniformMatrix4fv(this.shader.vMatrixUniform,!1,a);this.context.uniform1f(this.shader.pointSizeUniform,this.pointSize);for(var b,c,a=0;a<this.points.length;a++)b=this.points[a].pointBuffer,c=this.points[a].colorBuffer,this.context.bindBuffer(this.context.ARRAY_BUFFER,b),this.context.vertexAttribPointer(this.shader.vertexPositionAttribute,b.itemSize,this.context.FLOAT,!1,0,0),this.context.bindBuffer(this.context.ARRAY_BUFFER,c),this.context.vertexAttribPointer(this.shader.vertexColorAttribute,
|
||||
c.itemSize,this.context.FLOAT,!1,0,0),this.context.drawArrays(this.context.POINTS,0,b.numItems)};
|
||||
JSM.ConvertBodyToRenderGeometries=function(a,b){var c=[],d=null,e=null,f=null,g=null;JSM.ExplodeBodyToTriangles(a,b,{hasConvexPolygons:!1,onGeometryStart:function(a){e=[];f=[];g=[];var b=JSM.HexColorToNormalizedRGBComponents(a.ambient),l=JSM.HexColorToNormalizedRGBComponents(a.diffuse),m=JSM.HexColorToNormalizedRGBComponents(a.specular);a=new JSM.RenderMaterial(b,l,m,a.shininess,a.texture,a.textureWidth,a.textureHeight);d=new JSM.RenderGeometry;d.SetMaterial(a);c.push(d)},onGeometryEnd:function(a){d.SetVertexArray(e);
|
||||
d.SetNormalArray(f);null!==a.texture&&d.SetUVArray(g)},onTriangle:function(a,b,c,d,n,p,q,r,t){e.push(a.x,a.y,a.z);e.push(b.x,b.y,b.z);e.push(c.x,c.y,c.z);f.push(d.x,d.y,d.z);f.push(n.x,n.y,n.z);f.push(p.x,p.y,p.z);null!==q&&(null!==r&&null!==t)&&(g.push(q.x,q.y),g.push(r.x,r.y),g.push(t.x,t.y))}});return c};JSM.ConvertModelToRenderGeometries=function(a,b){var c=[],d,e;for(d=0;d<a.BodyCount();d++){e=a.GetBody(d);var f=JSM.ConvertBodyToRenderGeometries(e,b,c);for(e=0;e<f.length;e++)c.push(f[e])}return c};
|
||||
d.SetNormalArray(f);null!==a.texture&&d.SetUVArray(g)},onTriangle:function(a,b,c,d,n,p,q,r,s){e.push(a.x,a.y,a.z);e.push(b.x,b.y,b.z);e.push(c.x,c.y,c.z);f.push(d.x,d.y,d.z);f.push(n.x,n.y,n.z);f.push(p.x,p.y,p.z);null!==q&&(null!==r&&null!==s)&&(g.push(q.x,q.y),g.push(r.x,r.y),g.push(s.x,s.y))}});return c};JSM.ConvertModelToRenderGeometries=function(a,b){var c=[],d,e;for(d=0;d<a.BodyCount();d++){e=a.GetBody(d);var f=JSM.ConvertBodyToRenderGeometries(e,b,c);for(e=0;e<f.length;e++)c.push(f[e])}return c};
|
||||
JSM.JSONFileLoader=function(a){this.onReady=a};JSM.JSONFileLoader.prototype.Load=function(a){var b=this,c=new XMLHttpRequest;c.overrideMimeType("application/json");c.open("GET",a,!0);c.onreadystatechange=function(){4==c.readyState&&b.OnReady(c.responseText)};c.send(null)};JSM.JSONFileLoader.prototype.OnReady=function(a){null!==this.onReady&&(a=JSON.parse(a),this.onReady(a))};
|
||||
JSM.Mouse=function(){this.down=!1;this.button=0;this.alt=this.ctrl=this.shift=!1;this.diffY=this.diffX=this.currY=this.currX=this.prevY=this.prevX=0};JSM.Mouse.prototype.Down=function(a,b){var c=a;void 0===c&&(c=window.event);this.down=!0;this.button=a.which;this.shift=a.shiftKey;this.ctrl=a.ctrlKey;this.alt=a.altKey;this.SetCurrent(c,b);this.prevX=this.currX;this.prevY=this.currY};
|
||||
JSM.Mouse.prototype.Move=function(a,b){var c=a;void 0===c&&(c=window.event);this.shift=a.shiftKey;this.ctrl=a.ctrlKey;this.alt=a.altKey;this.SetCurrent(c,b);this.diffX=this.currX-this.prevX;this.diffY=this.currY-this.prevY;this.prevX=this.currX;this.prevY=this.currY};JSM.Mouse.prototype.Up=function(a,b){var c=a;void 0===c&&(c=window.event);this.down=!1;this.SetCurrent(c,b)};JSM.Mouse.prototype.Out=function(a,b){var c=a;void 0===c&&(c=window.event);this.down=!1;this.SetCurrent(c,b)};
|
||||
@ -509,13 +517,13 @@ JSM.PointCloudViewer.prototype.GetBoundingSphereRadius=function(a){if(void 0===a
|
||||
JSM.IsPowerOfTwo=function(a){return a&0===a-1};JSM.NextPowerOfTwo=function(a){if(JSM.IsPowerOfTwo(a))return a;for(var b=1;b<a;)b*=2;return b};JSM.ResizeImageToPowerOfTwoSides=function(a){if(JSM.IsPowerOfTwo(a.width)&&!JSM.IsPowerOfTwo(a.height))return a;var b=JSM.NextPowerOfTwo(a.width),c=JSM.NextPowerOfTwo(a.height),d=document.createElement("canvas");d.width=b;d.height=c;d=d.getContext("2d");d.drawImage(a,0,0,b,c);return d.getImageData(0,0,b,c)};
|
||||
JSM.ConvertBodyToThreeMeshes=function(a,b,c){var d={textureLoadedCallback:null,hasConvexPolygons:!1,doubleSided:!0};void 0!==c&&null!==c&&(d.textureLoadedCallback=JSM.ValueOrDefault(c.textureLoadedCallback,d.textureLoadedCallback),d.hasConvexPolygons=JSM.ValueOrDefault(c.hasConvexPolygons,d.hasConvexPolygons),d.doubleSided=JSM.ValueOrDefault(c.doubleSided,d.doubleSided));var e=[],f=null;JSM.ExplodeBodyToTriangles(a,b,{hasConvexPolygons:d.hasConvexPolygons,onGeometryStart:function(){f=new THREE.Geometry},
|
||||
onGeometryEnd:function(a){var b=null!==a.texture,c=1!==a.opacity,l=new THREE.MeshPhongMaterial({ambient:a.ambient,color:a.diffuse,specular:a.specular,shininess:a.shininess});d.doubleSided&&(l.side=THREE.DoubleSide);c&&(l.opacity=a.opacity,l.transparent=!0);if(b){var m=THREE.ImageUtils.loadTexture(a.texture,new THREE.UVMapping,function(){m.image=JSM.ResizeImageToPowerOfTwoSides(m.image);null!==d.textureLoadedCallback&&d.textureLoadedCallback()});m.wrapS=THREE.RepeatWrapping;m.wrapT=THREE.RepeatWrapping;
|
||||
l.map=m}f.computeFaceNormals();a=new THREE.Mesh(f,l);e.push(a)},onTriangle:function(a,b,c,d,e,n,p,q,r){var t=f.vertices.length;f.vertices.push(new THREE.Vector3(a.x,a.y,a.z));f.vertices.push(new THREE.Vector3(b.x,b.y,b.z));f.vertices.push(new THREE.Vector3(c.x,c.y,c.z));a=new THREE.Face3(t+0,t+1,t+2);f.faces.push(a);null!==d&&(null!==e&&null!==n)&&(a=[],a.push(new THREE.Vector3(d.x,d.y,d.z)),a.push(new THREE.Vector3(e.x,e.y,e.z)),a.push(new THREE.Vector3(n.x,n.y,n.z)),f.faces[f.faces.length-1].vertexNormals=
|
||||
l.map=m}f.computeFaceNormals();a=new THREE.Mesh(f,l);e.push(a)},onTriangle:function(a,b,c,d,e,n,p,q,r){var s=f.vertices.length;f.vertices.push(new THREE.Vector3(a.x,a.y,a.z));f.vertices.push(new THREE.Vector3(b.x,b.y,b.z));f.vertices.push(new THREE.Vector3(c.x,c.y,c.z));a=new THREE.Face3(s+0,s+1,s+2);f.faces.push(a);null!==d&&(null!==e&&null!==n)&&(a=[],a.push(new THREE.Vector3(d.x,d.y,d.z)),a.push(new THREE.Vector3(e.x,e.y,e.z)),a.push(new THREE.Vector3(n.x,n.y,n.z)),f.faces[f.faces.length-1].vertexNormals=
|
||||
a);null!==p&&(null!==q&&null!==r)&&(d=[],d.push(new THREE.Vector2(p.x,-p.y)),d.push(new THREE.Vector2(q.x,-q.y)),d.push(new THREE.Vector2(r.x,-r.y)),f.faceVertexUvs[0].push(d))}});return e};JSM.ConvertModelToThreeMeshes=function(a,b,c){var d=[],e=[],f,g;for(f=0;f<a.BodyCount();f++){e=a.GetBody(f);e=JSM.ConvertBodyToThreeMeshes(e,b,c);for(g=0;g<e.length;g++)d.push(e[g])}return d};
|
||||
JSM.ConvertJSONDataToThreeMeshes=function(a,b,c){function d(a,c){function d(a){function k(a,b,c,d,e){c=new THREE.Vector2(a,b);JSM.IsZero(e)||(d=Math.sin(e*JSM.DegRad),e=Math.cos(e*JSM.DegRad),c.x=e*a-d*b,c.y=d*a+e*b);c.x=t[0]+c.x*C[0];c.y=t[1]+c.y*C[1];return c}var m=a.parameters,r=f[a.material];a=r.texture;var t=r.offset,C=r.scale,v=r.rotation,G=new THREE.Color,z=new THREE.Color,L=new THREE.Color,N=r.shininess;G.setRGB(r.ambient[0],r.ambient[1],r.ambient[2]);z.setRGB(r.diffuse[0],r.diffuse[1],r.diffuse[2]);
|
||||
L.setRGB(r.specular[0],r.specular[1],r.specular[2]);if(void 0!==a&&null!==a){G.setRGB(1,1,1);z.setRGB(1,1,1);L.setRGB(1,1,1);if(void 0===t||null===t)t=[0,0];if(void 0===C||null===C)C=[1,1];if(void 0===v||null===v)v=0}G=new THREE.MeshPhongMaterial({ambient:z.getHex(),color:z.getHex(),specular:L.getHex(),shininess:N,side:THREE.DoubleSide});1!==r.opacity&&(G.opacity=r.opacity,G.transparent=!0);void 0!==a&&null!==a&&(r=THREE.ImageUtils.loadTexture(a,new THREE.UVMapping,function(a){a.image=JSM.ResizeImageToPowerOfTwoSides(a.image);
|
||||
JSM.ConvertJSONDataToThreeMeshes=function(a,b,c){function d(a,c){function d(a){function k(a,b,c,d,e){c=new THREE.Vector2(a,b);JSM.IsZero(e)||(d=Math.sin(e*JSM.DegRad),e=Math.cos(e*JSM.DegRad),c.x=e*a-d*b,c.y=d*a+e*b);c.x=s[0]+c.x*C[0];c.y=s[1]+c.y*C[1];return c}var m=a.parameters,r=f[a.material];a=r.texture;var s=r.offset,C=r.scale,w=r.rotation,G=new THREE.Color,z=new THREE.Color,L=new THREE.Color,N=r.shininess;G.setRGB(r.ambient[0],r.ambient[1],r.ambient[2]);z.setRGB(r.diffuse[0],r.diffuse[1],r.diffuse[2]);
|
||||
L.setRGB(r.specular[0],r.specular[1],r.specular[2]);if(void 0!==a&&null!==a){G.setRGB(1,1,1);z.setRGB(1,1,1);L.setRGB(1,1,1);if(void 0===s||null===s)s=[0,0];if(void 0===C||null===C)C=[1,1];if(void 0===w||null===w)w=0}G=new THREE.MeshPhongMaterial({ambient:z.getHex(),color:z.getHex(),specular:L.getHex(),shininess:N,side:THREE.DoubleSide});1!==r.opacity&&(G.opacity=r.opacity,G.transparent=!0);void 0!==a&&null!==a&&(r=THREE.ImageUtils.loadTexture(a,new THREE.UVMapping,function(a){a.image=JSM.ResizeImageToPowerOfTwoSides(a.image);
|
||||
void 0!==b&&null!==b&&b()}),r.wrapS=THREE.RepeatWrapping,r.wrapT=THREE.RepeatWrapping,G.map=r);var r=new THREE.Geometry,E,y,A,J,O,M,H,F,I;for(I=0;I<m.length;I+=9)E=3*m[I+0],y=3*m[I+1],A=3*m[I+2],J=3*m[I+3],O=3*m[I+4],M=3*m[I+5],z=2*m[I+6],L=2*m[I+7],N=2*m[I+8],H=r.vertices.length,F=r.faces.length,r.vertices.push(new THREE.Vector3(g[E+0],g[E+1],g[E+2])),r.vertices.push(new THREE.Vector3(g[y+0],g[y+1],g[y+2])),r.vertices.push(new THREE.Vector3(g[A+0],g[A+1],g[A+2])),r.faces.push(new THREE.Face3(H+0,
|
||||
H+1,H+2)),E=[],E.push(new THREE.Vector3(h[J+0],h[J+1],h[J+2])),E.push(new THREE.Vector3(h[O+0],h[O+1],h[O+2])),E.push(new THREE.Vector3(h[M+0],h[M+1],h[M+2])),r.faces[F].vertexNormals=E,void 0!==a&&null!==a&&(J=[],J.push(k(q[z+0],q[z+1],t,C,v)),J.push(k(q[L+0],q[L+1],t,C,v)),J.push(k(q[N+0],q[N+1],t,C,v)),r.faceVertexUvs[0].push(J));m=new THREE.Mesh(r,G);m.originalJsonIndex=c;e.push(m)}var g=a.vertices;if(void 0!==g){var h=a.normals;if(void 0!==h){var q=a.uvs;if(void 0!==q){var r=a.triangles,t;for(t=
|
||||
0;t<r.length;t++)d(r[t])}}}}var e=[],f=a.materials;if(void 0===f)return e;var g=a.meshes;if(void 0===g)return e;var h=0;JSM.AsyncRunTask(function(){d(g[h],h);h+=1;return!0},c,g.length,0,e);return e};JSM.JSONFileConverter=function(a,b){this.onReady=a;this.onTextureLoaded=b};JSM.JSONFileConverter.prototype.Convert=function(a){(new JSM.JSONFileLoader(this.OnReady.bind(this))).Load(a)};
|
||||
H+1,H+2)),E=[],E.push(new THREE.Vector3(h[J+0],h[J+1],h[J+2])),E.push(new THREE.Vector3(h[O+0],h[O+1],h[O+2])),E.push(new THREE.Vector3(h[M+0],h[M+1],h[M+2])),r.faces[F].vertexNormals=E,void 0!==a&&null!==a&&(J=[],J.push(k(q[z+0],q[z+1],s,C,w)),J.push(k(q[L+0],q[L+1],s,C,w)),J.push(k(q[N+0],q[N+1],s,C,w)),r.faceVertexUvs[0].push(J));m=new THREE.Mesh(r,G);m.originalJsonIndex=c;e.push(m)}var g=a.vertices;if(void 0!==g){var h=a.normals;if(void 0!==h){var q=a.uvs;if(void 0!==q){var r=a.triangles,s;for(s=
|
||||
0;s<r.length;s++)d(r[s])}}}}var e=[],f=a.materials;if(void 0===f)return e;var g=a.meshes;if(void 0===g)return e;var h=0;JSM.AsyncRunTask(function(){d(g[h],h);h+=1;return!0},c,g.length,0,e);return e};JSM.JSONFileConverter=function(a,b){this.onReady=a;this.onTextureLoaded=b};JSM.JSONFileConverter.prototype.Convert=function(a){(new JSM.JSONFileLoader(this.OnReady.bind(this))).Load(a)};
|
||||
JSM.JSONFileConverter.prototype.OnReady=function(a){null!==this.onReady&&(a=JSM.ConvertJSONDataToThreeMeshes(a,this.onTextureLoaded),this.onReady(a))};JSM.ThreeViewer=function(){this.enableDraw=this.drawLoop=this.settings=this.navigation=this.cameraMove=this.runAfterRender=this.runBeforeRender=this.directionalLight=this.ambientLight=this.renderer=this.camera=this.scene=this.canvas=null};
|
||||
JSM.ThreeViewer.prototype.Start=function(a,b){if(!JSM.IsWebGLEnabled()||!this.InitSettings(b)||!this.InitThree(a)||!this.InitCamera(b)||!this.InitLights())return!1;this.drawLoop=!1;this.enableDraw=!0;this.DrawIfNeeded();return!0};
|
||||
JSM.ThreeViewer.prototype.InitSettings=function(a){this.settings={cameraEyePosition:new JSM.Coord(1,1,1),cameraCenterPosition:new JSM.Coord(0,0,0),cameraUpVector:new JSM.Coord(0,0,1),lightAmbientColor:[0.5,0.5,0.5],lightDiffuseColor:[0.5,0.5,0.5]};void 0!==a&&(void 0!==a.cameraEyePosition&&(this.settings.cameraEyePosition=JSM.CoordFromArray(a.cameraEyePosition)),void 0!==a.cameraCenterPosition&&(this.settings.cameraCenterPosition=JSM.CoordFromArray(a.cameraCenterPosition)),void 0!==a.cameraUpVector&&
|
||||
|
||||
Loading…
Reference in New Issue
Block a user