Update JSModeler.
This commit is contained in:
parent
88fa8b50b5
commit
3ef6ae2823
@ -1,9 +1,9 @@
|
||||
/* JSModeler 0.37 - http://www.github.com/kovacsv/JSModeler */ 'use strict';var JSM=function(){this.mainVersion=0;this.subVersion=37};JSM.RandomNumber=function(a,b){return Math.random()*(b-a)+a};JSM.RandomInt=function(a,b){return Math.floor(Math.random()*(b-a+1)+a)};JSM.SeededRandomInt=function(a,b,c){return Math.floor((9301*c+49297)%233280/233280*(b-a+1)+a)};JSM.ValueOrDefault=function(a,b){return void 0===a||null===a?b:a};
|
||||
/* JSModeler 0.38 - http://www.github.com/kovacsv/JSModeler */ 'use strict';var JSM=function(){this.mainVersion=0;this.subVersion=38};JSM.RandomNumber=function(a,b){return Math.random()*(b-a)+a};JSM.RandomInt=function(a,b){return Math.floor(Math.random()*(b-a+1)+a)};JSM.SeededRandomInt=function(a,b,c){return Math.floor((9301*c+49297)%233280/233280*(b-a+1)+a)};JSM.ValueOrDefault=function(a,b){return void 0===a||null===a?b:a};
|
||||
JSM.CopyObjectProperties=function(a,b,c){if(!(void 0===a||null===a||void 0===b||null===b))for(var d in a)if(a.hasOwnProperty(d)&&(c||void 0===b[d]||null===b[d]))b[d]=a[d]};JSM.Assert=function(a,b){if(!a){var c="Assertion failed.";void 0!==b&&null!==b&&(c+=" "+b);alert(c)}};JSM.Timer=function(){this.stop=this.start=0};JSM.Timer.prototype.Start=function(){this.start=(new Date).getTime()};JSM.Timer.prototype.Stop=function(){this.end=(new Date).getTime()};
|
||||
JSM.Timer.prototype.Result=function(){return this.end-this.start};JSM.FPSCounter=function(){this.current=this.frames=this.start=null};JSM.FPSCounter.prototype.Get=function(a){var b=(new Date).getTime();null===this.start&&(this.start=b,this.current=this.frames=0);if(null===a||void 0===a)a=1E3;this.frames+=1;var c=b-this.start;c>=a&&(this.current=1E3*(this.frames/c),this.start=b,this.frames=0);return parseInt(this.current,10)};
|
||||
JSM.BubbleSort=function(a,b){if(!(2>a.length||void 0===b||null===b)){var c,d;for(c=0;c<a.length-1;c++)for(d=0;d<a.length-c-1;d++)if(!b(a[d],a[d+1])){var e=a,f=d+1,h=e[d];e[d]=e[f];e[f]=h}}};JSM.ShiftArray=function(a,b){var c;for(c=0;c<b;c++)a.push(a.shift())};JSM.AsyncEnvironment=function(a){this.parameters=a};JSM.AsyncEnvironment.prototype.OnStart=function(a,b){if(void 0!==this.parameters&&void 0!==this.parameters.onStart)this.parameters.onStart(a,b)};
|
||||
JSM.BubbleSort=function(a,b){if(!(2>a.length||void 0===b||null===b)){var c,d;for(c=0;c<a.length-1;c++)for(d=0;d<a.length-c-1;d++)if(!b(a[d],a[d+1])){var e=a,f=d+1,g=e[d];e[d]=e[f];e[f]=g}}};JSM.ShiftArray=function(a,b){var c;for(c=0;c<b;c++)a.push(a.shift())};JSM.AsyncEnvironment=function(a){this.parameters=a};JSM.AsyncEnvironment.prototype.OnStart=function(a,b){if(void 0!==this.parameters&&void 0!==this.parameters.onStart)this.parameters.onStart(a,b)};
|
||||
JSM.AsyncEnvironment.prototype.OnProcess=function(a,b){if(void 0!==this.parameters&&void 0!==this.parameters.onProcess)this.parameters.onProcess(a,b)};JSM.AsyncEnvironment.prototype.OnFinish=function(a){if(void 0!==this.parameters&&void 0!==this.parameters.onFinish)this.parameters.onFinish(a)};
|
||||
JSM.AsyncRunTask=function(a,b,c,d,e){function f(g){var h=a();b.OnProcess(g,e);h&&g<c-1?setTimeout(function(){f(g+1)},d):setTimeout(function(){b.OnFinish(e)},d)}if(void 0===b||null===b){var h,g;for(h=0;h<c&&!(g=a(),!g);h++);}else b.OnStart(c,e),f(0)};JSM.IsWebGLEnabled=function(){if(!window.WebGLRenderingContext)return!1;try{var a=document.createElement("canvas");if(!a.getContext("experimental-webgl")&&!a.getContext("webgl"))return!1}catch(b){return!1}return!0};
|
||||
JSM.AsyncRunTask=function(a,b,c,d,e){function f(g){var h=a();b.OnProcess(g,e);h&&g<c-1?setTimeout(function(){f(g+1)},d):setTimeout(function(){b.OnFinish(e)},d)}if(void 0===b||null===b){var g,h;for(g=0;g<c&&!(h=a(),!h);g++);}else b.OnStart(c,e),f(0)};JSM.IsWebGLEnabled=function(){if(!window.WebGLRenderingContext)return!1;try{var a=document.createElement("canvas");if(!a.getContext("experimental-webgl")&&!a.getContext("webgl"))return!1}catch(b){return!1}return!0};
|
||||
JSM.IsFileApiEnabled=function(){return!window.File||!window.FileReader||!window.FileList||!window.Blob||!window.URL?!1:!0};JSM.Eps=1E-8;JSM.Inf=9999999999;JSM.RadDeg=57.29577951308232;JSM.DegRad=0.017453292519943;JSM.IsZero=function(a){return Math.abs(a)<JSM.Eps};JSM.IsPositive=function(a){return a>JSM.Eps};JSM.IsNegative=function(a){return a<-JSM.Eps};JSM.IsLower=function(a,b){return b-a>JSM.Eps};JSM.IsGreater=function(a,b){return a-b>JSM.Eps};JSM.IsEqual=function(a,b){return Math.abs(b-a)<JSM.Eps};
|
||||
JSM.IsEqualWithEps=function(a,b,c){return Math.abs(b-a)<c};JSM.IsLowerOrEqual=function(a,b){return JSM.IsLower(a,b)||JSM.IsEqual(a,b)};JSM.IsGreaterOrEqual=function(a,b){return JSM.IsGreater(a,b)||JSM.IsEqual(a,b)};JSM.Minimum=function(a,b){return JSM.IsLower(a,b)?a:b};JSM.Maximum=function(a,b){return JSM.IsGreater(a,b)?a:b};JSM.ArcSin=function(a){return JSM.IsGreaterOrEqual(a,1)?Math.PI/2:JSM.IsLowerOrEqual(a,-1)?-Math.PI/2:Math.asin(a)};
|
||||
JSM.ArcCos=function(a){return JSM.IsGreaterOrEqual(a,1)?0:JSM.IsLowerOrEqual(a,-1)?Math.PI:Math.acos(a)};JSM.Coord2D=function(a,b){this.x=a;this.y=b};JSM.Coord2D.prototype.Set=function(a,b){this.x=a;this.y=b};JSM.Coord2D.prototype.IsEqual=function(a){return JSM.IsEqual(this.x,a.x)&&JSM.IsEqual(this.y,a.y)};JSM.Coord2D.prototype.IsEqualWithEps=function(a,b){return JSM.IsEqualWithEps(this.x,a.x,b)&&JSM.IsEqualWithEps(this.y,a.y,b)};
|
||||
@ -13,46 +13,46 @@ JSM.Coord2D.prototype.Clone=function(){return new JSM.Coord2D(this.x,this.y)};JS
|
||||
JSM.Coord.prototype.IsEqual=function(a){return JSM.IsEqual(this.x,a.x)&&JSM.IsEqual(this.y,a.y)&&JSM.IsEqual(this.z,a.z)};JSM.Coord.prototype.IsEqualWithEps=function(a,b){return JSM.IsEqualWithEps(this.x,a.x,b)&&JSM.IsEqualWithEps(this.y,a.y,b)&&JSM.IsEqualWithEps(this.z,a.z,b)};JSM.Coord.prototype.DistanceTo=function(a){return Math.sqrt((a.x-this.x)*(a.x-this.x)+(a.y-this.y)*(a.y-this.y)+(a.z-this.z)*(a.z-this.z))};
|
||||
JSM.Coord.prototype.AngleTo=function(a){var b=this.Clone().Normalize();a=a.Clone().Normalize();if(b.IsEqual(a))return 0;b=JSM.VectorDot(b,a);return JSM.ArcCos(b)};JSM.Coord.prototype.IsCollinearWith=function(a){a=this.AngleTo(a);return JSM.IsEqual(a,0)||JSM.IsEqual(a,Math.PI)};JSM.Coord.prototype.Length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)};JSM.Coord.prototype.MultiplyScalar=function(a){this.x*=a;this.y*=a;this.z*=a;return this};
|
||||
JSM.Coord.prototype.Normalize=function(){var a=this.Length();JSM.IsPositive(a)&&this.MultiplyScalar(1/a);return this};JSM.Coord.prototype.SetLength=function(a){var b=this.Length();JSM.IsPositive(b)&&this.MultiplyScalar(a/b);return this};JSM.Coord.prototype.Offset=function(a,b){var c=a.Clone().Normalize();this.x+=c.x*b;this.y+=c.y*b;this.z+=c.z*b;return this};
|
||||
JSM.Coord.prototype.Rotate=function(a,b,c){var d=a.Clone().Normalize();a=d.x;var e=d.y,d=d.z,f=this.x-c.x,h=this.y-c.y,g=this.z-c.z,l=Math.sin(b);b=Math.cos(b);this.x=-a*(-a*f-e*h-d*g)*(1-b)+f*b+(-d*h+e*g)*l;this.y=-e*(-a*f-e*h-d*g)*(1-b)+h*b+(d*f-a*g)*l;this.z=-d*(-a*f-e*h-d*g)*(1-b)+g*b+(-e*f+a*h)*l;this.x+=c.x;this.y+=c.y;this.z+=c.z;return this};
|
||||
JSM.Coord.prototype.Rotate=function(a,b,c){var d=a.Clone().Normalize();a=d.x;var e=d.y,d=d.z,f=this.x-c.x,g=this.y-c.y,h=this.z-c.z,l=Math.sin(b);b=Math.cos(b);this.x=-a*(-a*f-e*g-d*h)*(1-b)+f*b+(-d*g+e*h)*l;this.y=-e*(-a*f-e*g-d*h)*(1-b)+g*b+(d*f-a*h)*l;this.z=-d*(-a*f-e*g-d*h)*(1-b)+h*b+(-e*f+a*g)*l;this.x+=c.x;this.y+=c.y;this.z+=c.z;return this};
|
||||
JSM.Coord.prototype.ToCoord2D=function(a){var b=new JSM.Coord(0,0,0),c=new JSM.Vector(0,0,1),d=JSM.VectorCross(a,c);a=a.AngleTo(c);b=this.Clone().Rotate(d,a,b);return new JSM.Coord2D(b.x,b.y)};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.Vector=JSM.Coord;JSM.CoordFromArray=function(a){return new JSM.Coord(a[0],a[1],a[2])};JSM.CoordToArray=function(a){return[a.x,a.y,a.z]};
|
||||
JSM.CoordAdd=function(a,b){return new JSM.Coord(a.x+b.x,a.y+b.y,a.z+b.z)};JSM.CoordSub=function(a,b){return new JSM.Coord(a.x-b.x,a.y-b.y,a.z-b.z)};JSM.VectorDot=function(a,b){return a.x*b.x+a.y*b.y+a.z*b.z};JSM.VectorCross=function(a,b){var c=new JSM.Vector(0,0,0);c.x=a.y*b.z-a.z*b.y;c.y=a.z*b.x-a.x*b.z;c.z=a.x*b.y-a.y*b.x;return c};JSM.MatrixDeterminant2x2=function(a,b,c,d){return a*d-b*c};
|
||||
JSM.MatrixDeterminant3x3=function(a,b,c,d,e,f,h,g,l){var k=JSM.MatrixDeterminant2x2(e,f,g,l);f=JSM.MatrixDeterminant2x2(d,f,h,l);d=JSM.MatrixDeterminant2x2(d,e,h,g);return a*k-b*f+c*d};JSM.MatrixDeterminant4x4=function(a,b,c,d,e,f,h,g,l,k,m,n,p,q,t,s){var w=JSM.MatrixDeterminant3x3(f,h,g,k,m,n,q,t,s),u=JSM.MatrixDeterminant3x3(e,h,g,l,m,n,p,t,s);g=JSM.MatrixDeterminant3x3(e,f,g,l,k,n,p,q,s);e=JSM.MatrixDeterminant3x3(e,f,h,l,k,m,p,q,t);return w*a-u*b+g*c-e*d};
|
||||
JSM.MatrixDeterminant3x3=function(a,b,c,d,e,f,g,h,l){var k=JSM.MatrixDeterminant2x2(e,f,h,l);f=JSM.MatrixDeterminant2x2(d,f,g,l);d=JSM.MatrixDeterminant2x2(d,e,g,h);return a*k-b*f+c*d};JSM.MatrixDeterminant4x4=function(a,b,c,d,e,f,g,h,l,k,m,n,p,q,t,s){var w=JSM.MatrixDeterminant3x3(f,g,h,k,m,n,q,t,s),u=JSM.MatrixDeterminant3x3(e,g,h,l,m,n,p,t,s);h=JSM.MatrixDeterminant3x3(e,f,h,l,k,n,p,q,s);e=JSM.MatrixDeterminant3x3(e,f,g,l,k,m,p,q,t);return w*a-u*b+h*c-e*d};
|
||||
JSM.Orientation={Invalid:0,CounterClockwise:1,Clockwise:2};JSM.MidCoord2D=function(a,b){return new JSM.Coord2D((a.x+b.x)/2,(a.y+b.y)/2)};JSM.CoordOrientation2D=function(a,b,c){var d=a.x;a=a.y;var e=b.x;b=b.y;var f=c.x;c=c.y;d=d*b+a*f+e*c-b*f-a*e-d*c;return JSM.IsPositive(d)?JSM.Orientation.CounterClockwise:JSM.IsNegative(d)?JSM.Orientation.Clockwise:JSM.Orientation.Invalid};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.MidCoord=function(a,b){return new JSM.Coord((a.x+b.x)/2,(a.y+b.y)/2,(a.z+b.z)/2)};JSM.CoordSignedDistance=function(a,b,c){var d=JSM.CoordSub(b,a);a=a.DistanceTo(b);c=d.AngleTo(c);JSM.IsPositive(c)&&(a=-a);return a};JSM.GetVectorsFullAngle=function(a,b,c){var d=a.AngleTo(b),e=new JSM.Coord(0,0,0);JSM.CoordOrientation(a,e,b,c)==JSM.Orientation.Clockwise&&(d=2*Math.PI-d);return d};
|
||||
JSM.CoordOrientation=function(a,b,c,d){a=a.ToCoord2D(d);b=b.ToCoord2D(d);c=c.ToCoord2D(d);c=JSM.CoordOrientation2D(a,b,c);a=new JSM.Vector(0,0,1);d=d.AngleTo(a);JSM.IsEqual(d,Math.PI)&&(c==JSM.Orientation.CounterClockwise?c=JSM.Orientation.Clockwise:c==JSM.Orientation.Clockwise&&(c=JSM.Orientation.CounterClockwise));return c};JSM.SphericalToCartesian=function(a,b,c){var d=new JSM.Coord(0,0,0);d.x=a*Math.sin(b)*Math.cos(c);d.y=a*Math.sin(b)*Math.sin(c);d.z=a*Math.cos(b);return d};
|
||||
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 a.AngleTo(b)*c};JSM.GetFullArcLength=function(a,b,c,d){return JSM.GetVectorsFullAngle(a,b,d)*c};JSM.CalculateCentroid=function(a){var b=a.length,c=new JSM.Coord(0,0,0);if(1<=b){var d;for(d=0;d<b;d++)c=JSM.CoordAdd(c,a[d]);c.MultiplyScalar(1/b)}return c};
|
||||
JSM.CalculateTriangleNormal=function(a,b,c){b=JSM.CoordSub(b,a);a=JSM.CoordSub(c,a);c=new JSM.Vector(0,0,0);c.x=b.y*a.z-b.z*a.y;c.y=b.z*a.x-b.x*a.z;c.z=b.x*a.y-b.y*a.x;c.Normalize();return c};JSM.CalculateNormal=function(a){var b=a.length,c=new JSM.Vector(0,0,0);if(3<=b){var d,e,f;for(d=0;d<b;d++)e=d%b,f=(d+1)%b,e=a[e],f=a[f],c.x+=(e.y-f.y)*(e.z+f.z),c.y+=(e.z-f.z)*(e.x+f.x),c.z+=(e.x-f.x)*(e.y+f.y)}c.Normalize();return c};
|
||||
JSM.BarycentricInterpolation=function(a,b,c,d,e,f,h){function g(a,b,c){var d=(a+b+c)/2;a=d*(d-a)*(d-b)*(d-c);return 0>a?0:Math.sqrt(a)}var l=a.DistanceTo(b),k=b.DistanceTo(c),m=c.DistanceTo(a);a=a.DistanceTo(h);b=b.DistanceTo(h);h=c.DistanceTo(h);c=g(l,k,m);if(JSM.IsZero(c))return d;l=g(l,a,b);k=g(k,b,h);m=g(m,a,h);d=d.Clone().MultiplyScalar(k);e=e.Clone().MultiplyScalar(m);f=f.Clone().MultiplyScalar(l);f=JSM.CoordAdd(JSM.CoordAdd(d,e),f);f.MultiplyScalar(1/c);return f};
|
||||
JSM.BarycentricInterpolation=function(a,b,c,d,e,f,g){function h(a,b,c){var d=(a+b+c)/2;a=d*(d-a)*(d-b)*(d-c);return 0>a?0:Math.sqrt(a)}var l=a.DistanceTo(b),k=b.DistanceTo(c),m=c.DistanceTo(a);a=a.DistanceTo(g);b=b.DistanceTo(g);g=c.DistanceTo(g);c=h(l,k,m);if(JSM.IsZero(c))return d;l=h(l,a,b);k=h(k,b,g);m=h(m,a,g);d=d.Clone().MultiplyScalar(k);e=e.Clone().MultiplyScalar(m);f=f.Clone().MultiplyScalar(l);f=JSM.CoordAdd(JSM.CoordAdd(d,e),f);f.MultiplyScalar(1/c);return f};
|
||||
JSM.MatrixIdentity=function(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]};JSM.MatrixClone=function(a){var b=[];b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return b};
|
||||
JSM.MatrixTranspose=function(a){var b=[];b[0]=a[0];b[1]=a[4];b[2]=a[8];b[3]=a[12];b[4]=a[1];b[5]=a[5];b[6]=a[9];b[7]=a[13];b[8]=a[2];b[9]=a[6];b[10]=a[10];b[11]=a[14];b[12]=a[3];b[13]=a[7];b[14]=a[11];b[15]=a[15];return b};JSM.MatrixVectorMultiply=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],h=a[1],g=a[2],l=a[3],k=a[5],m=a[6],n=a[7],p=a[9],q=a[10],t=a[11],s=a[13],w=a[14],u=a[15],r=[];r[0]=c*a[0]+d*a[4]+e*a[8]+f*a[12];r[1]=c*h+d*k+e*p+f*s;r[2]=c*g+d*m+e*q+f*w;r[3]=c*l+d*n+e*t+f*u;return r};
|
||||
JSM.MatrixMultiply=function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],h=a[4],g=a[5],l=a[6],k=a[7],m=a[8],n=a[9],p=a[10],q=a[11],t=a[12],s=a[13],w=a[14],u=a[15],r=b[0],v=b[1],C=b[2],D=b[3],y=b[4],x=b[5],F=b[6],K=b[7],L=b[8],H=b[9],z=b[10],B=b[11],N=b[12],O=b[13],J=b[14],I=b[15],E=[];E[0]=c*r+d*y+e*L+f*N;E[1]=c*v+d*x+e*H+f*O;E[2]=c*C+d*F+e*z+f*J;E[3]=c*D+d*K+e*B+f*I;E[4]=h*r+g*y+l*L+k*N;E[5]=h*v+g*x+l*H+k*O;E[6]=h*C+g*F+l*z+k*J;E[7]=h*D+g*K+l*B+k*I;E[8]=m*r+n*y+p*L+q*N;E[9]=m*v+n*x+p*H+q*O;E[10]=m*C+n*F+
|
||||
p*z+q*J;E[11]=m*D+n*K+p*B+q*I;E[12]=t*r+s*y+w*L+u*N;E[13]=t*v+s*x+w*H+u*O;E[14]=t*C+s*F+w*z+u*J;E[15]=t*D+s*K+w*B+u*I;return E};JSM.MatrixDeterminant=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],h=a[5],g=a[6],l=a[7],k=a[8],m=a[9],n=a[10],p=a[11],q=a[12],t=a[13],s=a[14];a=a[15];return(b*h-c*f)*(n*a-p*s)-(b*g-d*f)*(m*a-p*t)+(b*l-e*f)*(m*s-n*t)+(c*g-d*h)*(k*a-p*q)-(c*l-e*h)*(k*s-n*q)+(d*l-e*g)*(k*t-m*q)};
|
||||
JSM.MatrixInvert=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],h=a[5],g=a[6],l=a[7],k=a[8],m=a[9],n=a[10],p=a[11],q=a[12],t=a[13],s=a[14];a=a[15];var w=b*h-c*f,u=b*g-d*f,r=b*l-e*f,v=c*g-d*h,C=c*l-e*h,D=d*l-e*g,y=k*t-m*q,x=k*s-n*q,F=k*a-p*q,K=m*s-n*t,L=m*a-p*t,H=n*a-p*s,z=w*H-u*L+r*K+v*F-C*x+D*y;if(JSM.IsZero(z))return null;var B=[];B[0]=(h*H-g*L+l*K)/z;B[1]=(d*L-c*H-e*K)/z;B[2]=(t*D-s*C+a*v)/z;B[3]=(n*C-m*D-p*v)/z;B[4]=(g*F-f*H-l*x)/z;B[5]=(b*H-d*F+e*x)/z;B[6]=(s*r-q*D-a*u)/z;B[7]=(k*D-n*r+p*
|
||||
u)/z;B[8]=(f*L-h*F+l*y)/z;B[9]=(c*F-b*L-e*y)/z;B[10]=(q*C-t*r+a*w)/z;B[11]=(m*r-k*C-p*w)/z;B[12]=(h*x-f*K-g*y)/z;B[13]=(b*K-c*x+d*y)/z;B[14]=(t*u-q*v-s*w)/z;B[15]=(k*v-m*u+n*w)/z;return B};JSM.MatrixTranslation=function(a,b,c){var d=[1,0,0,0,0,1,0,0,0,0,1,0];d[12]=a;d[13]=b;d[14]=c;d[15]=1;return d};
|
||||
JSM.MatrixRotation=function(a,b,c){var d=a.Clone().Normalize();a=d.x;var e=d.y,d=d.z,f=a*a,h=e*e,g=d*d,l=Math.sin(b);b=Math.cos(b);var k=[];if(void 0===c||null===c)k[0]=f+(h+g)*b,k[1]=a*e*(1-b)+d*l,k[2]=a*d*(1-b)-e*l,k[3]=0,k[4]=a*e*(1-b)-d*l,k[5]=h+(f+g)*b,k[6]=e*d*(1-b)+a*l,k[7]=0,k[8]=a*d*(1-b)+e*l,k[9]=e*d*(1-b)-a*l,k[10]=g+(f+h)*b,k[11]=0,k[12]=0,k[13]=0,k[14]=0;else{var m=c.x,n=c.y;c=c.z;k[0]=f+(h+g)*b;k[1]=a*e*(1-b)+d*l;k[2]=a*d*(1-b)-e*l;k[3]=0;k[4]=a*e*(1-b)-d*l;k[5]=h+(f+g)*b;k[6]=e*d*(1-
|
||||
b)+a*l;k[7]=0;k[8]=a*d*(1-b)+e*l;k[9]=e*d*(1-b)-a*l;k[10]=g+(f+h)*b;k[11]=0;k[12]=(m*(h+g)-a*(n*e+c*d))*(1-b)+(n*d-c*e)*l;k[13]=(n*(f+g)-e*(m*a+c*d))*(1-b)+(c*a-m*d)*l;k[14]=(c*(f+h)-d*(m*a+n*e))*(1-b)+(m*e-n*a)*l}k[15]=1;return k};
|
||||
JSM.MatrixRotationQuaternion=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=b+b,h=c+c,g=d+d;a=b*f;var l=b*h,b=b*g,k=c*h,c=c*g,d=d*g,f=e*f,h=e*h,e=e*g,g=[];g[0]=1-(k+d);g[1]=l+e;g[2]=b-h;g[3]=0;g[4]=l-e;g[5]=1-(a+d);g[6]=c+f;g[7]=0;g[8]=b+h;g[9]=c-f;g[10]=1-(a+k);g[11]=0;g[12]=0;g[13]=0;g[14]=0;g[15]=1;return g};JSM.MatrixRotationX=function(a){var b=Math.sin(a);a=Math.cos(a);var c=[1,0,0,0,0];c[5]=a;c[6]=b;c[7]=0;c[8]=0;c[9]=-b;c[10]=a;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return c};
|
||||
JSM.MatrixTranspose=function(a){var b=[];b[0]=a[0];b[1]=a[4];b[2]=a[8];b[3]=a[12];b[4]=a[1];b[5]=a[5];b[6]=a[9];b[7]=a[13];b[8]=a[2];b[9]=a[6];b[10]=a[10];b[11]=a[14];b[12]=a[3];b[13]=a[7];b[14]=a[11];b[15]=a[15];return b};JSM.MatrixVectorMultiply=function(a,b){var c=b[0],d=b[1],e=b[2],f=b[3],g=a[1],h=a[2],l=a[3],k=a[5],m=a[6],n=a[7],p=a[9],q=a[10],t=a[11],s=a[13],w=a[14],u=a[15],r=[];r[0]=c*a[0]+d*a[4]+e*a[8]+f*a[12];r[1]=c*g+d*k+e*p+f*s;r[2]=c*h+d*m+e*q+f*w;r[3]=c*l+d*n+e*t+f*u;return r};
|
||||
JSM.MatrixMultiply=function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],g=a[4],h=a[5],l=a[6],k=a[7],m=a[8],n=a[9],p=a[10],q=a[11],t=a[12],s=a[13],w=a[14],u=a[15],r=b[0],v=b[1],C=b[2],D=b[3],y=b[4],x=b[5],F=b[6],K=b[7],L=b[8],H=b[9],z=b[10],B=b[11],N=b[12],O=b[13],J=b[14],I=b[15],E=[];E[0]=c*r+d*y+e*L+f*N;E[1]=c*v+d*x+e*H+f*O;E[2]=c*C+d*F+e*z+f*J;E[3]=c*D+d*K+e*B+f*I;E[4]=g*r+h*y+l*L+k*N;E[5]=g*v+h*x+l*H+k*O;E[6]=g*C+h*F+l*z+k*J;E[7]=g*D+h*K+l*B+k*I;E[8]=m*r+n*y+p*L+q*N;E[9]=m*v+n*x+p*H+q*O;E[10]=m*C+n*F+
|
||||
p*z+q*J;E[11]=m*D+n*K+p*B+q*I;E[12]=t*r+s*y+w*L+u*N;E[13]=t*v+s*x+w*H+u*O;E[14]=t*C+s*F+w*z+u*J;E[15]=t*D+s*K+w*B+u*I;return E};JSM.MatrixDeterminant=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7],k=a[8],m=a[9],n=a[10],p=a[11],q=a[12],t=a[13],s=a[14];a=a[15];return(b*g-c*f)*(n*a-p*s)-(b*h-d*f)*(m*a-p*t)+(b*l-e*f)*(m*s-n*t)+(c*h-d*g)*(k*a-p*q)-(c*l-e*g)*(k*s-n*q)+(d*l-e*h)*(k*t-m*q)};
|
||||
JSM.MatrixInvert=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7],k=a[8],m=a[9],n=a[10],p=a[11],q=a[12],t=a[13],s=a[14];a=a[15];var w=b*g-c*f,u=b*h-d*f,r=b*l-e*f,v=c*h-d*g,C=c*l-e*g,D=d*l-e*h,y=k*t-m*q,x=k*s-n*q,F=k*a-p*q,K=m*s-n*t,L=m*a-p*t,H=n*a-p*s,z=w*H-u*L+r*K+v*F-C*x+D*y;if(JSM.IsZero(z))return null;var B=[];B[0]=(g*H-h*L+l*K)/z;B[1]=(d*L-c*H-e*K)/z;B[2]=(t*D-s*C+a*v)/z;B[3]=(n*C-m*D-p*v)/z;B[4]=(h*F-f*H-l*x)/z;B[5]=(b*H-d*F+e*x)/z;B[6]=(s*r-q*D-a*u)/z;B[7]=(k*D-n*r+p*
|
||||
u)/z;B[8]=(f*L-g*F+l*y)/z;B[9]=(c*F-b*L-e*y)/z;B[10]=(q*C-t*r+a*w)/z;B[11]=(m*r-k*C-p*w)/z;B[12]=(g*x-f*K-h*y)/z;B[13]=(b*K-c*x+d*y)/z;B[14]=(t*u-q*v-s*w)/z;B[15]=(k*v-m*u+n*w)/z;return B};JSM.MatrixTranslation=function(a,b,c){var d=[1,0,0,0,0,1,0,0,0,0,1,0];d[12]=a;d[13]=b;d[14]=c;d[15]=1;return d};
|
||||
JSM.MatrixRotation=function(a,b,c){var d=a.Clone().Normalize();a=d.x;var e=d.y,d=d.z,f=a*a,g=e*e,h=d*d,l=Math.sin(b);b=Math.cos(b);var k=[];if(void 0===c||null===c)k[0]=f+(g+h)*b,k[1]=a*e*(1-b)+d*l,k[2]=a*d*(1-b)-e*l,k[3]=0,k[4]=a*e*(1-b)-d*l,k[5]=g+(f+h)*b,k[6]=e*d*(1-b)+a*l,k[7]=0,k[8]=a*d*(1-b)+e*l,k[9]=e*d*(1-b)-a*l,k[10]=h+(f+g)*b,k[11]=0,k[12]=0,k[13]=0,k[14]=0;else{var m=c.x,n=c.y;c=c.z;k[0]=f+(g+h)*b;k[1]=a*e*(1-b)+d*l;k[2]=a*d*(1-b)-e*l;k[3]=0;k[4]=a*e*(1-b)-d*l;k[5]=g+(f+h)*b;k[6]=e*d*(1-
|
||||
b)+a*l;k[7]=0;k[8]=a*d*(1-b)+e*l;k[9]=e*d*(1-b)-a*l;k[10]=h+(f+g)*b;k[11]=0;k[12]=(m*(g+h)-a*(n*e+c*d))*(1-b)+(n*d-c*e)*l;k[13]=(n*(f+h)-e*(m*a+c*d))*(1-b)+(c*a-m*d)*l;k[14]=(c*(f+g)-d*(m*a+n*e))*(1-b)+(m*e-n*a)*l}k[15]=1;return k};
|
||||
JSM.MatrixRotationQuaternion=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],f=b+b,g=c+c,h=d+d;a=b*f;var l=b*g,b=b*h,k=c*g,c=c*h,d=d*h,f=e*f,g=e*g,e=e*h,h=[];h[0]=1-(k+d);h[1]=l+e;h[2]=b-g;h[3]=0;h[4]=l-e;h[5]=1-(a+d);h[6]=c+f;h[7]=0;h[8]=b+g;h[9]=c-f;h[10]=1-(a+k);h[11]=0;h[12]=0;h[13]=0;h[14]=0;h[15]=1;return h};JSM.MatrixRotationX=function(a){var b=Math.sin(a);a=Math.cos(a);var c=[1,0,0,0,0];c[5]=a;c[6]=b;c[7]=0;c[8]=0;c[9]=-b;c[10]=a;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return c};
|
||||
JSM.MatrixRotationY=function(a){var b=Math.sin(a);a=Math.cos(a);var c=[];c[0]=a;c[1]=0;c[2]=-b;c[3]=0;c[4]=0;c[5]=1;c[6]=0;c[7]=0;c[8]=b;c[9]=0;c[10]=a;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return c};JSM.MatrixRotationZ=function(a){var b=Math.sin(a);a=Math.cos(a);var c=[];c[0]=a;c[1]=b;c[2]=0;c[3]=0;c[4]=-b;c[5]=a;c[6]=0;c[7]=0;c[8]=0;c[9]=0;c[10]=1;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return c};
|
||||
JSM.MatrixView=function(a,b,c){if(a.IsEqual(b))return JSM.MatrixIdentity();var d=[];b=JSM.CoordSub(a,b).Normalize();c=JSM.VectorCross(c,b).Normalize();var e=JSM.VectorCross(b,c).Normalize();d[0]=c.x;d[1]=e.x;d[2]=b.x;d[3]=0;d[4]=c.y;d[5]=e.y;d[6]=b.y;d[7]=0;d[8]=c.z;d[9]=e.z;d[10]=b.z;d[11]=0;d[12]=-JSM.VectorDot(c,a);d[13]=-JSM.VectorDot(e,a);d[14]=-JSM.VectorDot(b,a);d[15]=1;return d};
|
||||
JSM.MatrixPerspective=function(a,b,c,d){var e=[];a=1/Math.tan(a/2);var f=1/(c-d);e[0]=a/b;e[1]=0;e[2]=0;e[3]=0;e[4]=0;e[5]=a;e[6]=0;e[7]=0;e[8]=0;e[9]=0;e[10]=(d+c)*f;e[11]=-1;e[12]=0;e[13]=0;e[14]=2*d*c*f;e[15]=0;return e};JSM.ApplyTransformation=function(a,b){var c=[];c[0]=b.x;c[1]=b.y;c[2]=b.z;c[3]=1;c=JSM.MatrixVectorMultiply(a,c);return new JSM.Coord(c[0],c[1],c[2])};JSM.CoordSystem=function(a,b,c,d){this.origo=a;this.e1=b;this.e2=c;this.e3=d};
|
||||
JSM.CoordSystem.prototype.Set=function(a,b,c,d){this.origo=a;this.e1=b;this.e2=c;this.e3=d};JSM.CoordSystem.prototype.ToDirectionVectors=function(){this.e1=JSM.CoordSub(this.e1,this.origo);this.e2=JSM.CoordSub(this.e2,this.origo);this.e3=JSM.CoordSub(this.e3,this.origo);return this};JSM.CoordSystem.prototype.ToAbsoluteCoords=function(){this.e1=JSM.CoordAdd(this.e1,this.origo);this.e2=JSM.CoordAdd(this.e2,this.origo);this.e3=JSM.CoordAdd(this.e3,this.origo);return this};
|
||||
JSM.CoordSystem.prototype.Clone=function(){return new JSM.CoordSystem(this.origo.Clone(),this.e1.Clone(),this.e2.Clone(),this.e3.Clone())};JSM.CoordSectorPosition2D={CoordInsideOfSector:0,CoordOnSectorEndCoord:1,CoordOutsideOfSector:2};JSM.SectorSectorPosition2D={SectorsDontIntersect:0,SectorsIntersectCoincident:1,SectorsIntersectEndPoint:2,SectorsIntersectOnePoint:3};JSM.CoordSectorPosition={CoordInsideOfSector:0,CoordOnSectorEndCoord:1,CoordOutsideOfSector:2};
|
||||
JSM.Sector2D=function(a,b){this.beg=a;this.end=b};JSM.Sector2D.prototype.Set=function(a,b){this.beg=a;this.end=b};JSM.Sector2D.prototype.GetLength=function(){return this.beg.DistanceTo(this.end)};
|
||||
JSM.Sector2D.prototype.CoordPosition=function(a){var b=a.x,c=a.y,d=this.beg.x,e=this.beg.y,f=this.end.x,h=this.end.y,g=this.GetLength();if(JSM.IsZero(g))return a.IsEqual(this.beg)?JSM.CoordSectorPosition2D.CoordOnSectorEndCoord:JSM.CoordSectorPosition2D.CoordOutsideOfSector;a=((b-d)*(f-d)+(c-e)*(h-e))/(g*g);if(JSM.IsLower(a,0)||JSM.IsGreater(a,1))return JSM.CoordSectorPosition2D.CoordOutsideOfSector;e+=a*(h-e);return!JSM.IsEqual(d+a*(f-d),b)||!JSM.IsEqual(e,c)?JSM.CoordSectorPosition2D.CoordOutsideOfSector:
|
||||
JSM.Sector2D.prototype.CoordPosition=function(a){var b=a.x,c=a.y,d=this.beg.x,e=this.beg.y,f=this.end.x,g=this.end.y,h=this.GetLength();if(JSM.IsZero(h))return a.IsEqual(this.beg)?JSM.CoordSectorPosition2D.CoordOnSectorEndCoord:JSM.CoordSectorPosition2D.CoordOutsideOfSector;a=((b-d)*(f-d)+(c-e)*(g-e))/(h*h);if(JSM.IsLower(a,0)||JSM.IsGreater(a,1))return JSM.CoordSectorPosition2D.CoordOutsideOfSector;e+=a*(g-e);return!JSM.IsEqual(d+a*(f-d),b)||!JSM.IsEqual(e,c)?JSM.CoordSectorPosition2D.CoordOutsideOfSector:
|
||||
JSM.IsEqual(a,0)||JSM.IsEqual(a,1)?JSM.CoordSectorPosition2D.CoordOnSectorEndCoord:JSM.CoordSectorPosition2D.CoordInsideOfSector};
|
||||
JSM.Sector2D.prototype.SectorPosition=function(a,b){function c(a,b,c){return!c.IsEqual(a)&&!c.IsEqual(b)&&JSM.IsLowerOrEqual(c.x,Math.max(a.x,b.x))&&JSM.IsLowerOrEqual(c.y,Math.max(a.y,b.y))&&JSM.IsGreaterOrEqual(c.x,Math.min(a.x,b.x))&&JSM.IsGreaterOrEqual(c.y,Math.min(a.y,b.y))?!0:!1}var d=void 0!==b&&null!==b,e=this.beg,f=this.end,h=a.beg,g=a.end,l=e.IsEqual(h)||e.IsEqual(g),k=f.IsEqual(h)||f.IsEqual(g);if(l&&k)return JSM.SectorSectorPosition2D.SectorsIntersectCoincident;var m=e.x,n=e.y,p=f.x,
|
||||
q=f.y,t=h.x,s=h.y,w=g.x,u=g.y,r=(w-t)*(n-s)-(u-s)*(m-t),v=(p-m)*(n-s)-(q-n)*(m-t),t=(u-s)*(p-m)-(w-t)*(q-n);if(JSM.IsZero(t)){if(JSM.IsZero(r)&&JSM.IsZero(v)){if(c(e,f,h)||c(e,f,g)||c(h,g,e)||c(h,g,f))return JSM.SectorSectorPosition2D.SectorsIntersectCoincident;if(l)return d&&(b.x=e.x,b.y=e.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;if(k)return d&&(b.x=f.x,b.y=f.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint}return JSM.SectorSectorPosition2D.SectorsDontIntersect}h=r/t;v/=t;if(JSM.IsLower(h,
|
||||
0)||JSM.IsGreater(h,1)||JSM.IsLower(v,0)||JSM.IsGreater(v,1))return JSM.SectorSectorPosition2D.SectorsDontIntersect;if(l)return d&&(b.x=e.x,b.y=e.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;if(k)return d&&(b.x=f.x,b.y=f.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;d&&(b.x=m+h*(p-m),b.y=n+h*(q-n));return JSM.SectorSectorPosition2D.SectorsIntersectOnePoint};
|
||||
JSM.Sector2D.prototype.ProjectCoord=function(a){var b=a.x,c=a.y;a=this.beg;var d=this.end,e=a.x,f=a.y,h=d.x,g=d.y,l=(h-e)*(h-e)+(g-f)*(g-f);if(JSM.IsZero(l))return a.Clone();b=((h-e)*(b-e)+(g-f)*(c-f))/l;if(JSM.IsLower(b,0))return a.Clone();if(JSM.IsGreater(b,1))return d.Clone();b=JSM.CoordSub2D(d,a).MultiplyScalar(b);return JSM.CoordAdd2D(a,b)};JSM.Sector2D.prototype.Clone=function(){return new JSM.Sector2D(this.beg.Clone(),this.end.Clone())};JSM.Sector=function(a,b){this.beg=a;this.end=b};
|
||||
JSM.Sector2D.prototype.SectorPosition=function(a,b){function c(a,b,c){return!c.IsEqual(a)&&!c.IsEqual(b)&&JSM.IsLowerOrEqual(c.x,Math.max(a.x,b.x))&&JSM.IsLowerOrEqual(c.y,Math.max(a.y,b.y))&&JSM.IsGreaterOrEqual(c.x,Math.min(a.x,b.x))&&JSM.IsGreaterOrEqual(c.y,Math.min(a.y,b.y))?!0:!1}var d=void 0!==b&&null!==b,e=this.beg,f=this.end,g=a.beg,h=a.end,l=e.IsEqual(g)||e.IsEqual(h),k=f.IsEqual(g)||f.IsEqual(h);if(l&&k)return JSM.SectorSectorPosition2D.SectorsIntersectCoincident;var m=e.x,n=e.y,p=f.x,
|
||||
q=f.y,t=g.x,s=g.y,w=h.x,u=h.y,r=(w-t)*(n-s)-(u-s)*(m-t),v=(p-m)*(n-s)-(q-n)*(m-t),t=(u-s)*(p-m)-(w-t)*(q-n);if(JSM.IsZero(t)){if(JSM.IsZero(r)&&JSM.IsZero(v)){if(c(e,f,g)||c(e,f,h)||c(g,h,e)||c(g,h,f))return JSM.SectorSectorPosition2D.SectorsIntersectCoincident;if(l)return d&&(b.x=e.x,b.y=e.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;if(k)return d&&(b.x=f.x,b.y=f.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint}return JSM.SectorSectorPosition2D.SectorsDontIntersect}g=r/t;v/=t;if(JSM.IsLower(g,
|
||||
0)||JSM.IsGreater(g,1)||JSM.IsLower(v,0)||JSM.IsGreater(v,1))return JSM.SectorSectorPosition2D.SectorsDontIntersect;if(l)return d&&(b.x=e.x,b.y=e.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;if(k)return d&&(b.x=f.x,b.y=f.y),JSM.SectorSectorPosition2D.SectorsIntersectEndPoint;d&&(b.x=m+g*(p-m),b.y=n+g*(q-n));return JSM.SectorSectorPosition2D.SectorsIntersectOnePoint};
|
||||
JSM.Sector2D.prototype.ProjectCoord=function(a){var b=a.x,c=a.y;a=this.beg;var d=this.end,e=a.x,f=a.y,g=d.x,h=d.y,l=(g-e)*(g-e)+(h-f)*(h-f);if(JSM.IsZero(l))return a.Clone();b=((g-e)*(b-e)+(h-f)*(c-f))/l;if(JSM.IsLower(b,0))return a.Clone();if(JSM.IsGreater(b,1))return d.Clone();b=JSM.CoordSub2D(d,a).MultiplyScalar(b);return JSM.CoordAdd2D(a,b)};JSM.Sector2D.prototype.Clone=function(){return new JSM.Sector2D(this.beg.Clone(),this.end.Clone())};JSM.Sector=function(a,b){this.beg=a;this.end=b};
|
||||
JSM.Sector.prototype.Set=function(a,b){this.beg=a;this.end=b};JSM.Sector.prototype.GetLength=function(){return this.beg.DistanceTo(this.end)};
|
||||
JSM.Sector.prototype.CoordPosition=function(a){var b=a.x,c=a.y,d=a.z,e=this.beg,f=JSM.CoordSub(this.end,this.beg),h=e.x,g=e.y,l=e.z,k=e.x+f.x,m=e.y+f.y,n=e.z+f.z,p=(k-h)*(k-h)+(m-g)*(m-g)+(n-l)*(n-l);if(JSM.IsZero(p))return e.IsEqual(a)?JSM.CoordSectorPosition.CoordOnSectorEndCoord:JSM.CoordSectorPosition.CoordOutsideOfSector;b=((k-h)*(b-h)+(m-g)*(c-g)+(n-l)*(d-l))/p;f=f.Clone().MultiplyScalar(b);e=JSM.CoordAdd(e,f);a=a.DistanceTo(e);return JSM.IsZero(a)?JSM.IsLower(b,0)||JSM.IsGreater(b,1)?JSM.CoordSectorPosition.CoordOutsideOfSector:
|
||||
JSM.IsEqual(b,0)||JSM.IsEqual(b,1)?JSM.CoordSectorPosition.CoordOnSectorEndCoord:JSM.CoordSectorPosition.CoordInsideOfSector:JSM.CoordSectorPosition.CoordOutsideOfSector};JSM.Sector.prototype.Clone=function(){return new JSM.Sector(this.beg.Clone(),this.end.Clone())};JSM.GetSectorSegmentation=function(a,b,c){var d=JSM.CoordSub(a.end,a.beg),e=a.beg.DistanceTo(a.end)/b,f=0,h,g;for(h=0;h<=b;h++)g=a.beg.Clone().Offset(d,f),c.push(g),f+=e};JSM.CoordLinePosition2D={CoordOnLine:0,CoordAtLineLeft:1,CoordAtLineRight:2};
|
||||
JSM.Sector.prototype.CoordPosition=function(a){var b=a.x,c=a.y,d=a.z,e=this.beg,f=JSM.CoordSub(this.end,this.beg),g=e.x,h=e.y,l=e.z,k=e.x+f.x,m=e.y+f.y,n=e.z+f.z,p=(k-g)*(k-g)+(m-h)*(m-h)+(n-l)*(n-l);if(JSM.IsZero(p))return e.IsEqual(a)?JSM.CoordSectorPosition.CoordOnSectorEndCoord:JSM.CoordSectorPosition.CoordOutsideOfSector;b=((k-g)*(b-g)+(m-h)*(c-h)+(n-l)*(d-l))/p;f=f.Clone().MultiplyScalar(b);e=JSM.CoordAdd(e,f);a=a.DistanceTo(e);return JSM.IsZero(a)?JSM.IsLower(b,0)||JSM.IsGreater(b,1)?JSM.CoordSectorPosition.CoordOutsideOfSector:
|
||||
JSM.IsEqual(b,0)||JSM.IsEqual(b,1)?JSM.CoordSectorPosition.CoordOnSectorEndCoord:JSM.CoordSectorPosition.CoordInsideOfSector:JSM.CoordSectorPosition.CoordOutsideOfSector};JSM.Sector.prototype.Clone=function(){return new JSM.Sector(this.beg.Clone(),this.end.Clone())};JSM.GetSectorSegmentation=function(a,b,c){var d=JSM.CoordSub(a.end,a.beg),e=a.beg.DistanceTo(a.end)/b,f=0,g,h;for(g=0;g<=b;g++)h=a.beg.Clone().Offset(d,f),c.push(h),f+=e};JSM.CoordLinePosition2D={CoordOnLine:0,CoordAtLineLeft:1,CoordAtLineRight:2};
|
||||
JSM.CoordLinePosition={CoordOnLine:0,CoordOutsideOfLine:1};JSM.LineLinePosition={LinesDontIntersect:0,LinesIntersectsOnePoint:1,LinesIntersectsCoincident:2};JSM.Line2D=function(a,b){this.start=a;this.direction=b};JSM.Line2D.prototype.Set=function(a,b){this.start=a;this.direction=b};
|
||||
JSM.Line2D.prototype.CoordPosition=function(a){var b=this.start,c=this.direction;a=c.x*(a.y-b.y)-c.y*(a.x-b.x);return JSM.IsPositive(a)?JSM.CoordLinePosition2D.CoordAtLineLeft:JSM.IsNegative(a)?JSM.CoordLinePosition2D.CoordAtLineRight:JSM.CoordLinePosition2D.CoordOnLine};JSM.Line2D.prototype.Clone=function(){return new JSM.Line2D(this.start.Clone(),this.direction.Clone())};JSM.Line=function(a,b){this.start=a;this.direction=b};JSM.Line.prototype.Set=function(a,b){this.start=a;this.direction=b};
|
||||
JSM.Line.prototype.CoordPosition=function(a,b){var c=a.x,d=a.y,e=a.z,f=this.start,h=this.direction,g=f.x,l=f.y,k=f.z,m=f.x+h.x,n=f.y+h.y,p=f.z+h.z,q=(m-g)*(m-g)+(n-l)*(n-l)+(p-k)*(p-k);if(JSM.IsZero(q))return void 0!==b&&b.Set(f.x,f.y,f.z),f.IsEqual(a)?JSM.CoordLinePosition.CoordOnLine:JSM.CoordLinePosition.CoordOutsideOfLine;c=h.Clone().MultiplyScalar(((m-g)*(c-g)+(n-l)*(d-l)+(p-k)*(e-k))/q);f=JSM.CoordAdd(f,c);void 0!==b&&b.Set(f.x,f.y,f.z);f=a.DistanceTo(f);return JSM.IsZero(f)?JSM.CoordLinePosition.CoordOnLine:
|
||||
JSM.CoordLinePosition.CoordOutsideOfLine};JSM.Line.prototype.ProjectCoord=function(a){var b=a.x,c=a.y,d=a.z;a=this.start;var e=this.direction,f=a.x,h=a.y,g=a.z,l=a.x+e.x,k=a.y+e.y,m=a.z+e.z,n=(l-f)*(l-f)+(k-h)*(k-h)+(m-g)*(m-g);if(JSM.IsZero(n))return a.Clone();b=e.Clone().MultiplyScalar(((l-f)*(b-f)+(k-h)*(c-h)+(m-g)*(d-g))/n);return JSM.CoordAdd(a,b)};
|
||||
JSM.Line.prototype.ClosestPoint=function(a,b,c){function d(a,b,c,d,e){return(a[b].x-a[c].x)*(a[d].x-a[e].x)+(a[b].y-a[c].y)*(a[d].y-a[e].y)+(a[b].z-a[c].z)*(a[d].z-a[e].z)}var e=this.direction.Clone().Normalize(),f=this.start,h=JSM.CoordAdd(f,e),g=a.direction.Clone().Normalize();a=a.start;var l=JSM.CoordAdd(a,g),k=[f,h,a,l],m=d(k,1,0,1,0),n=d(k,0,2,1,0),h=d(k,0,2,3,2),l=d(k,3,2,1,0),k=d(k,3,2,3,2),m=m*k-l*l;if(JSM.IsEqual(m,0))return!1;n=(h*l-n*k)/m;h=(h+n*l)/k;void 0!==b&&(e.MultiplyScalar(n),e=
|
||||
JSM.CoordAdd(f,e),b.Set(e.x,e.y,e.z));void 0!==c&&(g.MultiplyScalar(h),b=JSM.CoordAdd(a,g),c.Set(b.x,b.y,b.z));return!0};JSM.Line.prototype.LinePosition=function(a,b){var c=new JSM.Coord(0,0,0),d=new JSM.Coord(0,0,0);return!this.ClosestPoint(a,c,d)?JSM.LineLinePosition.LinesIntersectsCoincident:c.IsEqual(d)?(void 0!==b&&b.Set(c.x,c.y,c.z),JSM.LineLinePosition.LinesIntersectsOnePoint):JSM.LineLinePosition.LinesDontIntersect};
|
||||
JSM.Line.prototype.CoordPosition=function(a,b){var c=a.x,d=a.y,e=a.z,f=this.start,g=this.direction,h=f.x,l=f.y,k=f.z,m=f.x+g.x,n=f.y+g.y,p=f.z+g.z,q=(m-h)*(m-h)+(n-l)*(n-l)+(p-k)*(p-k);if(JSM.IsZero(q))return void 0!==b&&b.Set(f.x,f.y,f.z),f.IsEqual(a)?JSM.CoordLinePosition.CoordOnLine:JSM.CoordLinePosition.CoordOutsideOfLine;c=g.Clone().MultiplyScalar(((m-h)*(c-h)+(n-l)*(d-l)+(p-k)*(e-k))/q);f=JSM.CoordAdd(f,c);void 0!==b&&b.Set(f.x,f.y,f.z);f=a.DistanceTo(f);return JSM.IsZero(f)?JSM.CoordLinePosition.CoordOnLine:
|
||||
JSM.CoordLinePosition.CoordOutsideOfLine};JSM.Line.prototype.ProjectCoord=function(a){var b=a.x,c=a.y,d=a.z;a=this.start;var e=this.direction,f=a.x,g=a.y,h=a.z,l=a.x+e.x,k=a.y+e.y,m=a.z+e.z,n=(l-f)*(l-f)+(k-g)*(k-g)+(m-h)*(m-h);if(JSM.IsZero(n))return a.Clone();b=e.Clone().MultiplyScalar(((l-f)*(b-f)+(k-g)*(c-g)+(m-h)*(d-h))/n);return JSM.CoordAdd(a,b)};
|
||||
JSM.Line.prototype.ClosestPoint=function(a,b,c){function d(a,b,c,d,e){return(a[b].x-a[c].x)*(a[d].x-a[e].x)+(a[b].y-a[c].y)*(a[d].y-a[e].y)+(a[b].z-a[c].z)*(a[d].z-a[e].z)}var e=this.direction.Clone().Normalize(),f=this.start,g=JSM.CoordAdd(f,e),h=a.direction.Clone().Normalize();a=a.start;var l=JSM.CoordAdd(a,h),k=[f,g,a,l],m=d(k,1,0,1,0),n=d(k,0,2,1,0),g=d(k,0,2,3,2),l=d(k,3,2,1,0),k=d(k,3,2,3,2),m=m*k-l*l;if(JSM.IsEqual(m,0))return!1;n=(g*l-n*k)/m;g=(g+n*l)/k;void 0!==b&&(e.MultiplyScalar(n),e=
|
||||
JSM.CoordAdd(f,e),b.Set(e.x,e.y,e.z));void 0!==c&&(h.MultiplyScalar(g),b=JSM.CoordAdd(a,h),c.Set(b.x,b.y,b.z));return!0};JSM.Line.prototype.LinePosition=function(a,b){var c=new JSM.Coord(0,0,0),d=new JSM.Coord(0,0,0);return!this.ClosestPoint(a,c,d)?JSM.LineLinePosition.LinesIntersectsCoincident:c.IsEqual(d)?(void 0!==b&&b.Set(c.x,c.y,c.z),JSM.LineLinePosition.LinesIntersectsOnePoint):JSM.LineLinePosition.LinesDontIntersect};
|
||||
JSM.Line.prototype.Clone=function(){return new JSM.Line(this.start.Clone(),this.direction.Clone())};JSM.Box2D=function(a,b){this.min=a;this.max=b};JSM.Box2D.prototype.Set=function(a,b){this.min=a;this.max=b};JSM.Box2D.prototype.GetCenter=function(){return JSM.MidCoord2D(this.min,this.max)};JSM.Box2D.prototype.Clone=function(){return new JSM.Box2D(this.min.Clone(),this.max.Clone())};JSM.Box=function(a,b){this.min=a;this.max=b};JSM.Box.prototype.Set=function(a,b){this.min=a;this.max=b};
|
||||
JSM.Box.prototype.GetCenter=function(){return JSM.MidCoord(this.min,this.max)};JSM.Box.prototype.GetSize=function(){return JSM.CoordSub(this.max,this.min)};JSM.Box.prototype.IsCoordInside=function(a){return JSM.IsLower(a.x,this.min.x)||JSM.IsLower(a.y,this.min.y)||JSM.IsLower(a.z,this.min.z)||JSM.IsGreater(a.x,this.max.x)||JSM.IsGreater(a.y,this.max.y)||JSM.IsGreater(a.z,this.max.z)?!1:!0};JSM.Box.prototype.Clone=function(){return new JSM.Box(this.min.Clone(),this.max.Clone())};
|
||||
JSM.BoxUnion=function(a,b){var c=new JSM.Coord(JSM.Minimum(a.min.x,b.min.x),JSM.Minimum(a.min.y,b.min.y),JSM.Minimum(a.min.z,b.min.z)),d=new JSM.Coord(JSM.Maximum(a.max.x,b.max.x),JSM.Maximum(a.max.y,b.max.y),JSM.Maximum(a.max.z,b.max.z));return new JSM.Box(c,d)};JSM.Sphere=function(a,b){this.center=a;this.radius=b};JSM.Sphere.prototype.Set=function(a,b){this.center=a;this.radius=b};JSM.Sphere.prototype.GetCenter=function(){return this.center};JSM.Sphere.prototype.GetRadius=function(){return this.radius};
|
||||
@ -63,18 +63,18 @@ JSM.RotationYTransformation=function(a,b){var c=new JSM.Transformation;void 0===
|
||||
JSM.RotationZTransformation=function(a,b){var c=new JSM.Transformation;void 0===b||null===b?c.matrix=JSM.MatrixRotationZ(a):(c.Append(JSM.TranslationTransformation(new JSM.Vector(-b.x,-b.y,-b.z))),c.Append(JSM.RotationZTransformation(a)),c.Append(JSM.TranslationTransformation(new JSM.Vector(b.x,b.y,b.z))));return c};
|
||||
JSM.RotationXYZTransformation=function(a,b,c,d){var e=new JSM.Transformation;e.Append(JSM.RotationXTransformation(a,d));e.Append(JSM.RotationYTransformation(b,d));e.Append(JSM.RotationZTransformation(c,d));return e};JSM.CoordPlanePosition={CoordOnPlane:0,CoordInFrontOfPlane:1,CoordAtBackOfPlane:2};JSM.LinePlanePosition={LineParallelToPlane:0,LineIntersectsPlane:1};JSM.Plane=function(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d};
|
||||
JSM.Plane.prototype.Set=function(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d};JSM.Plane.prototype.GetNormal=function(){return new JSM.Vector(this.a,this.b,this.c)};JSM.Plane.prototype.CoordSignedDistance=function(a){var b=this.a,c=this.b,d=this.c;return(b*a.x+c*a.y+d*a.z+this.d)/Math.sqrt(b*b+c*c+d*d)};JSM.Plane.prototype.CoordDistance=function(a){a=this.CoordSignedDistance(a);return Math.abs(a)};
|
||||
JSM.Plane.prototype.ProjectCoord=function(a){var b=a.x,c=a.y,d=a.z,e=this.a,f=this.b,h=this.c,g=this.d,l=this.CoordDistance(a);JSM.IsGreater(e*b+f*c+h*d+g,0)&&(l=-l);b=this.GetNormal().Normalize();return a.Clone().Offset(b,l)};JSM.Plane.prototype.CoordPosition=function(a){a=this.a*a.x+this.b*a.y+this.c*a.z+this.d;return JSM.IsPositive(a)?JSM.CoordPlanePosition.CoordInFrontOfPlane:JSM.IsNegative(a)?JSM.CoordPlanePosition.CoordAtBackOfPlane:JSM.CoordPlanePosition.CoordOnPlane};
|
||||
JSM.Plane.prototype.LinePosition=function(a,b){var c=a.direction.Clone().Normalize(),d=a.start.x,e=a.start.y,f=a.start.z,h=this.a,g=this.b,l=this.c,k=this.d,m=h*(d-(a.start.x+c.x))+g*(e-(a.start.y+c.y))+l*(f-(a.start.z+c.z));if(JSM.IsZero(m))return JSM.LinePlanePosition.LineParallelToPlane;void 0!==b&&(c.MultiplyScalar((h*d+g*e+l*f+k)/m),c=JSM.CoordAdd(a.start,c),b.Set(c.x,c.y,c.z));return JSM.LinePlanePosition.LineIntersectsPlane};
|
||||
JSM.Plane.prototype.LineIntersection=function(a){var b=a.direction.Clone().Normalize(),c=a.start.x,d=a.start.y,e=a.start.z,f=this.a,h=this.b,g=this.c,l=this.d,k=f*(c-(a.start.x+b.x))+h*(d-(a.start.y+b.y))+g*(e-(a.start.z+b.z));if(JSM.IsZero(k))return null;b.MultiplyScalar((f*c+h*d+g*e+l)/k);return JSM.CoordAdd(a.start,b)};JSM.Plane.prototype.Clone=function(){return new JSM.Plane(this.a,this.b,this.c,this.d)};
|
||||
JSM.Plane.prototype.ProjectCoord=function(a){var b=a.x,c=a.y,d=a.z,e=this.a,f=this.b,g=this.c,h=this.d,l=this.CoordDistance(a);JSM.IsGreater(e*b+f*c+g*d+h,0)&&(l=-l);b=this.GetNormal().Normalize();return a.Clone().Offset(b,l)};JSM.Plane.prototype.CoordPosition=function(a){a=this.a*a.x+this.b*a.y+this.c*a.z+this.d;return JSM.IsPositive(a)?JSM.CoordPlanePosition.CoordInFrontOfPlane:JSM.IsNegative(a)?JSM.CoordPlanePosition.CoordAtBackOfPlane:JSM.CoordPlanePosition.CoordOnPlane};
|
||||
JSM.Plane.prototype.LinePosition=function(a,b){var c=a.direction.Clone().Normalize(),d=a.start.x,e=a.start.y,f=a.start.z,g=this.a,h=this.b,l=this.c,k=this.d,m=g*(d-(a.start.x+c.x))+h*(e-(a.start.y+c.y))+l*(f-(a.start.z+c.z));if(JSM.IsZero(m))return JSM.LinePlanePosition.LineParallelToPlane;void 0!==b&&(c.MultiplyScalar((g*d+h*e+l*f+k)/m),c=JSM.CoordAdd(a.start,c),b.Set(c.x,c.y,c.z));return JSM.LinePlanePosition.LineIntersectsPlane};
|
||||
JSM.Plane.prototype.LineIntersection=function(a){var b=a.direction.Clone().Normalize(),c=a.start.x,d=a.start.y,e=a.start.z,f=this.a,g=this.b,h=this.c,l=this.d,k=f*(c-(a.start.x+b.x))+g*(d-(a.start.y+b.y))+h*(e-(a.start.z+b.z));if(JSM.IsZero(k))return null;b.MultiplyScalar((f*c+g*d+h*e+l)/k);return JSM.CoordAdd(a.start,b)};JSM.Plane.prototype.Clone=function(){return new JSM.Plane(this.a,this.b,this.c,this.d)};
|
||||
JSM.GetPlaneFromCoordAndDirection=function(a,b){var c=new JSM.Plane,d=b.Clone().Normalize(),e=d.x,f=d.y,d=d.z;c.Set(e,f,d,-(e*a.x+f*a.y+d*a.z));return c};JSM.GetPlaneFromThreeCoords=function(a,b,c){var d=new JSM.Plane,e=(b.y-a.y)*(c.z-a.z)-(c.y-a.y)*(b.z-a.z),f=(b.z-a.z)*(c.x-a.x)-(c.z-a.z)*(b.x-a.x);b=(b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);d.Set(e,f,b,-(e*a.x+f*a.y+b*a.z));return d};
|
||||
JSM.CoordPlaneSignedDirectionalDistance=function(a,b,c){var d=b.Clone().Normalize();b=a.x;var e=a.y,f=a.z,h=c.a,g=c.b,l=c.c;c=c.d;var k=h*(b-(a.x+d.x))+g*(e-(a.y+d.y))+l*(f-(a.z+d.z));if(JSM.IsZero(k))return 0;d.MultiplyScalar((h*b+g*e+l*f+c)/k);d=JSM.CoordAdd(a,d);a=a.DistanceTo(d);JSM.IsNegative(h*b+g*e+l*f+c)&&(a=-a);return a};JSM.CoordPlaneDirectionalDistance=function(a,b,c){return Math.abs(JSM.CoordPlaneSignedDirectionalDistance(a,b,c))};
|
||||
JSM.Project=function(a,b,c,d,e,f,h,g,l){b=JSM.MatrixView(b,c,d);h=JSM.MatrixPerspective(e,f,h,g);e=new JSM.Coord(0,0,0);g=[];f=[];g[0]=a.x;g[1]=a.y;g[2]=a.z;g[3]=1;f=JSM.MatrixVectorMultiply(h,JSM.MatrixVectorMultiply(b,g));a=f[3];JSM.IsZero(a)?l=null:(f[0]=0.5*(f[0]/a)+0.5,f[1]=0.5*(f[1]/a)+0.5,f[2]=0.5*(f[2]/a)+0.5,f[0]=f[0]*l[2]+l[0],f[1]=f[1]*l[3]+l[1],e.x=f[0],e.y=f[1],e.z=f[2],l=e);return l};
|
||||
JSM.CoordPlaneSignedDirectionalDistance=function(a,b,c){var d=b.Clone().Normalize();b=a.x;var e=a.y,f=a.z,g=c.a,h=c.b,l=c.c;c=c.d;var k=g*(b-(a.x+d.x))+h*(e-(a.y+d.y))+l*(f-(a.z+d.z));if(JSM.IsZero(k))return 0;d.MultiplyScalar((g*b+h*e+l*f+c)/k);d=JSM.CoordAdd(a,d);a=a.DistanceTo(d);JSM.IsNegative(g*b+h*e+l*f+c)&&(a=-a);return a};JSM.CoordPlaneDirectionalDistance=function(a,b,c){return Math.abs(JSM.CoordPlaneSignedDirectionalDistance(a,b,c))};
|
||||
JSM.Project=function(a,b,c,d,e,f,g,h,l){b=JSM.MatrixView(b,c,d);g=JSM.MatrixPerspective(e,f,g,h);e=new JSM.Coord(0,0,0);h=[];f=[];h[0]=a.x;h[1]=a.y;h[2]=a.z;h[3]=1;f=JSM.MatrixVectorMultiply(g,JSM.MatrixVectorMultiply(b,h));a=f[3];JSM.IsZero(a)?l=null:(f[0]=0.5*(f[0]/a)+0.5,f[1]=0.5*(f[1]/a)+0.5,f[2]=0.5*(f[2]/a)+0.5,f[0]=f[0]*l[2]+l[0],f[1]=f[1]*l[3]+l[1],e.x=f[0],e.y=f[1],e.z=f[2],l=e);return l};
|
||||
JSM.ConvexHull2D=function(a){function b(a,b){var c=a.length,d=0,e;for(e=1;e<c;e++)b==d?d=e:JSM.CoordOrientation2D(a[b],a[d],a[e])==JSM.Orientation.Clockwise&&(d=e);return d}var c=[];if(3>a.length)return c;var d=function(a){var b=a.length,c=JSM.Inf,d=-1,e,f;for(e=0;e<b;e++)f=a[e].x,JSM.IsLower(f,c)&&(c=f,d=e);return d}(a),e=d,f;do c.push(e),e=f=b(a,e);while(f!=d);return c};
|
||||
JSM.ConvexHull3D=function(a){function b(){this.position=null}function c(){this.tri2=this.tri1=this.vert2=this.vert1=null}function d(){this.valid=this.edges=this.vertices=null}function e(a,c){var d=new b;d.position=c;a.vertices.push(d);return a.vertices.length-1}function f(a,b,d,e){var f=-1,g,h;for(g=0;g<a.edges.length;g++)if(h=a.edges[g],h.vert1==d&&h.vert2==e||h.vert1==e&&h.vert2==d){f=g;break}-1==f&&(f=new c,f.vert1=d,f.vert2=e,f.tri1=-1,f.tri2=-1,a.edges.push(f),f=a.edges.length-1);a=a.edges[f];
|
||||
a.tri1!=b&&a.tri2!=b&&(-1==a.tri1?a.tri1=b:-1==a.tri2&&(a.tri2=b));return f}function h(a,b,c,e){var g=a.triangles.length,h=f(a,g,b,c),l=f(a,g,c,e),g=f(a,g,e,b),k=new d;k.vertices=[b,c,e];k.edges=[h,l,g];k.valid=!0;a.triangles.push(k);return a.triangles.length-1}function g(a,b,c){a=a.edges[c];a.tri1==b?a.tri1=-1:a.tri2==b&&(a.tri2=-1)}function l(a,b,c,d,e){c=a.vertices[c].position;d=a.vertices[d].position;e=a.vertices[e].position;a=JSM.CoordSub(a.vertices[b].position,e);b=JSM.CoordSub(c,e);c=JSM.CoordSub(d,
|
||||
a.tri1!=b&&a.tri2!=b&&(-1==a.tri1?a.tri1=b:-1==a.tri2&&(a.tri2=b));return f}function g(a,b,c,e){var g=a.triangles.length,h=f(a,g,b,c),l=f(a,g,c,e),g=f(a,g,e,b),k=new d;k.vertices=[b,c,e];k.edges=[h,l,g];k.valid=!0;a.triangles.push(k);return a.triangles.length-1}function h(a,b,c){a=a.edges[c];a.tri1==b?a.tri1=-1:a.tri2==b&&(a.tri2=-1)}function l(a,b,c,d,e){c=a.vertices[c].position;d=a.vertices[d].position;e=a.vertices[e].position;a=JSM.CoordSub(a.vertices[b].position,e);b=JSM.CoordSub(c,e);c=JSM.CoordSub(d,
|
||||
e);return JSM.VectorDot(a,JSM.VectorCross(b,c))/6}function k(a,b){var c=[],d,e;for(d=0;d<a.triangles.length;d++)e=a.triangles[d],e.valid?!JSM.IsLower(l(a,e.vertices[0],e.vertices[2],e.vertices[1],b),0)?c.push(!0):c.push(!1):c.push(!1);var f,k,n,m=[];for(d=0;d<c.length;d++)c[d]&&(e=a.triangles[d],e.valid&&(f=a.edges[e.edges[0]],k=a.edges[e.edges[1]],n=a.edges[e.edges[2]],f=-1==f.tri1||-1==f.tri2||c[f.tri1]!=c[f.tri2],k=-1==k.tri1||-1==k.tri2||c[k.tri1]!=c[k.tri2],n=-1==n.tri1||-1==n.tri2||c[n.tri1]!=
|
||||
c[n.tri2],f&&m.push([e.vertices[0],e.vertices[1],b]),k&&m.push([e.vertices[1],e.vertices[2],b]),n&&m.push([e.vertices[2],e.vertices[0],b])));for(d=0;d<c.length;d++)c[d]&&(e=a.triangles[d],e.valid&&(e=a,n=d,f=e.triangles[n],f.valid&&(g(e,n,f.edges[0]),g(e,n,f.edges[1]),g(e,n,f.edges[2]),f.valid=!1)));for(d=0;d<m.length;d++)c=m[d],h(a,c[0],c[1],c[2])}var m=[],n=a.length;if(4>n)return m;var p=new function(){this.vertices=[];this.edges=[];this.triangles=[]},q;for(q=0;q<n;q++)e(p,a[q]);(function(a){var b=
|
||||
-1,b=!JSM.IsLower(l(a,0,1,2,3),0)?h(a,0,1,2):h(a,0,2,1),b=a.triangles[b];h(a,b.vertices[0],b.vertices[2],3);h(a,b.vertices[2],b.vertices[1],3);h(a,b.vertices[1],b.vertices[0],3)})(p);for(q=4;q<n;q++)k(p,q);for(q=0;q<p.triangles.length;q++)a=p.triangles[q],a.valid&&m.push(a.vertices);return m};JSM.Complexity={Invalid:0,Convex:1,Concave:2,Complex:3};JSM.CoordPolygonPosition2D={OnVertex:0,OnEdge:1,Inside:2,Outside:3};
|
||||
c[n.tri2],f&&m.push([e.vertices[0],e.vertices[1],b]),k&&m.push([e.vertices[1],e.vertices[2],b]),n&&m.push([e.vertices[2],e.vertices[0],b])));for(d=0;d<c.length;d++)c[d]&&(e=a.triangles[d],e.valid&&(e=a,n=d,f=e.triangles[n],f.valid&&(h(e,n,f.edges[0]),h(e,n,f.edges[1]),h(e,n,f.edges[2]),f.valid=!1)));for(d=0;d<m.length;d++)c=m[d],g(a,c[0],c[1],c[2])}var m=[],n=a.length;if(4>n)return m;var p=new function(){this.vertices=[];this.edges=[];this.triangles=[]},q;for(q=0;q<n;q++)e(p,a[q]);(function(a){var b=
|
||||
-1,b=!JSM.IsLower(l(a,0,1,2,3),0)?g(a,0,1,2):g(a,0,2,1),b=a.triangles[b];g(a,b.vertices[0],b.vertices[2],3);g(a,b.vertices[2],b.vertices[1],3);g(a,b.vertices[1],b.vertices[0],3)})(p);for(q=4;q<n;q++)k(p,q);for(q=0;q<p.triangles.length;q++)a=p.triangles[q],a.valid&&m.push(a.vertices);return m};JSM.Complexity={Invalid:0,Convex:1,Concave:2,Complex:3};JSM.CoordPolygonPosition2D={OnVertex:0,OnEdge:1,Inside:2,Outside:3};
|
||||
JSM.SectorPolygonPosition2D={IntersectionOnePoint:0,IntersectionCoincident:1,IntersectionOnVertex:2,NoIntersection:3};JSM.Polygon2D=function(){this.cache=this.vertices=null;this.Clear()};JSM.Polygon2D.prototype.AddVertex=function(a,b){this.AddVertexCoord(new JSM.Coord2D(a,b))};JSM.Polygon2D.prototype.AddVertexCoord=function(a){this.vertices.push(a);this.ClearCache()};JSM.Polygon2D.prototype.GetVertex=function(a){return this.vertices[a]};JSM.Polygon2D.prototype.VertexCount=function(){return this.vertices.length};
|
||||
JSM.Polygon2D.prototype.EnumerateVertices=function(a,b,c){var d=this.vertices.length;for(c(a);a!=b;)a=(a+1)%d,c(a)};JSM.Polygon2D.prototype.GetNextVertex=function(a){return a<this.vertices.length-1?a+1:0};JSM.Polygon2D.prototype.GetPrevVertex=function(a){var b=this.vertices.length;return 0<a?a-1:b-1};JSM.Polygon2D.prototype.ShiftVertices=function(a){JSM.ShiftArray(this.vertices,a);this.ClearCache()};
|
||||
JSM.Polygon2D.prototype.GetSignedArea=function(){if(null!==this.cache.signedArea)return this.cache.signedArea;var a=this.vertices.length,b=0;if(3<=a){var c,d,e;for(c=0;c<a;c++)d=this.vertices[c],e=this.vertices[(c+1)%a],b+=d.x*e.y-e.x*d.y;b*=0.5}return this.cache.signedArea=b};JSM.Polygon2D.prototype.GetArea=function(){var a=this.GetSignedArea();return Math.abs(a)};
|
||||
@ -82,11 +82,11 @@ JSM.Polygon2D.prototype.GetOrientation=function(){if(null!==this.cache.orientati
|
||||
JSM.Polygon2D.prototype.GetComplexity=function(){if(null!==this.cache.complexity)return this.cache.complexity;var a=this.vertices.length;if(3>a)return JSM.Complexity.Invalid;var b=JSM.Complexity.Invalid;if(this.GetOrientation()!=JSM.Orientation.Invalid){var b=JSM.Complexity.Convex,c;for(c=0;c<a;c++)if(this.IsConcaveVertex(c)){b=JSM.Complexity.Concave;break}}return this.cache.complexity=b};
|
||||
JSM.Polygon2D.prototype.GetVertexOrientation=function(a){if(void 0!==this.cache.vertexOrientations[a])return this.cache.vertexOrientations[a];var b=this.vertices[this.GetPrevVertex(a)],c=this.vertices[a],d=this.vertices[this.GetNextVertex(a)],b=JSM.CoordOrientation2D(b,c,d);return this.cache.vertexOrientations[a]=b};JSM.Polygon2D.prototype.IsConvexVertex=function(a){var b=this.GetOrientation();a=this.GetVertexOrientation(a);return a==JSM.Orientation.Invalid?!1:a==b};
|
||||
JSM.Polygon2D.prototype.IsConcaveVertex=function(a){var b=this.GetOrientation();a=this.GetVertexOrientation(a);return a==JSM.Orientation.Invalid?!1:a!=b};
|
||||
JSM.Polygon2D.prototype.CoordPosition=function(a){function b(a,b,c){var d=b.y-a.y,e=c.y-a.y,f=JSM.IsNegative(d),g=JSM.IsPositive(d),d=JSM.IsNegative(e),e=JSM.IsPositive(e);if(f&&d||g&&e)return 0;f=!f&&!g;d=!d&&!e;if(f&&d)return 0;e=new JSM.Coord2D(b.x,a.y);JSM.IsEqual(b.y,a.y)||(g=Math.abs((b.y-a.y)/(c.y-b.y)),e.x=b.x+(c.x-b.x)*g);return JSM.IsLower(e.x,a.x)?0:JSM.IsGreater(e.x,a.x)&&(f||d)?(a=JSM.IsGreater(c.y,b.y),f&&a||d&&!a?1:0):1}var c=this.vertices.length,d=0,e,f,h,g;for(e=0;e<c;e++){f=this.vertices[e];
|
||||
h=this.vertices[(e+1)%c];g=new JSM.Sector2D(f,h);g=g.CoordPosition(a);if(g==JSM.CoordSectorPosition2D.CoordInsideOfSector)return JSM.CoordPolygonPosition2D.OnEdge;if(g==JSM.CoordSectorPosition2D.CoordOnSectorEndCoord)return JSM.CoordPolygonPosition2D.OnVertex;d+=b(a,f,h)}return 0!==d%2?JSM.CoordPolygonPosition2D.Inside:JSM.CoordPolygonPosition2D.Outside};
|
||||
JSM.Polygon2D.prototype.SectorPosition=function(a,b,c){var d=JSM.SectorPolygonPosition2D.NoIntersection,e=this.vertices.length;if(3>e)return d;var f,h,g,l,k;for(f=0;f<e;f++)if(h=f,g=(f+1)%e,l=this.vertices[h],k=this.vertices[g],!(h==b||g==b||h==c||g==c)){h=new JSM.Sector2D(l,k);h=a.SectorPosition(h);if(h==JSM.SectorSectorPosition2D.SectorsIntersectOnePoint)return JSM.SectorPolygonPosition2D.IntersectionOnePoint;if(h==JSM.SectorSectorPosition2D.SectorsIntersectCoincident)return JSM.SectorPolygonPosition2D.IntersectionCoincident;
|
||||
h==JSM.SectorSectorPosition2D.SectorsIntersectEndPoint&&(d=JSM.SectorPolygonPosition2D.IntersectionOnVertex)}return d};
|
||||
JSM.Polygon2D.prototype.IsDiagonal=function(a,b){return a==b||(this.GetPrevVertex(a)==b||this.GetNextVertex(a)==b)||this.vertices[a].IsEqual(this.vertices[b])||function(a,b,e){var f=a.GetVertex(b),h=a.GetVertex(e),f=new JSM.Sector2D(f,h);return a.SectorPosition(f,b,e)!=JSM.SectorPolygonPosition2D.NoIntersection?!0:!1}(this,a,b)||!function(a,b,e){b=a.GetVertex(b);e=a.GetVertex(e);e=new JSM.Coord2D((b.x+e.x)/2,(b.y+e.y)/2);return a.CoordPosition(e)==JSM.CoordPolygonPosition2D.Inside}(this,a,b)?!1:!0};
|
||||
JSM.Polygon2D.prototype.CoordPosition=function(a){function b(a,b,c){var d=b.y-a.y,e=c.y-a.y,f=JSM.IsNegative(d),g=JSM.IsPositive(d),d=JSM.IsNegative(e),e=JSM.IsPositive(e);if(f&&d||g&&e)return 0;f=!f&&!g;d=!d&&!e;if(f&&d)return 0;e=new JSM.Coord2D(b.x,a.y);JSM.IsEqual(b.y,a.y)||(g=Math.abs((b.y-a.y)/(c.y-b.y)),e.x=b.x+(c.x-b.x)*g);return JSM.IsLower(e.x,a.x)?0:JSM.IsGreater(e.x,a.x)&&(f||d)?(a=JSM.IsGreater(c.y,b.y),f&&a||d&&!a?1:0):1}var c=this.vertices.length,d=0,e,f,g,h;for(e=0;e<c;e++){f=this.vertices[e];
|
||||
g=this.vertices[(e+1)%c];h=new JSM.Sector2D(f,g);h=h.CoordPosition(a);if(h==JSM.CoordSectorPosition2D.CoordInsideOfSector)return JSM.CoordPolygonPosition2D.OnEdge;if(h==JSM.CoordSectorPosition2D.CoordOnSectorEndCoord)return JSM.CoordPolygonPosition2D.OnVertex;d+=b(a,f,g)}return 0!==d%2?JSM.CoordPolygonPosition2D.Inside:JSM.CoordPolygonPosition2D.Outside};
|
||||
JSM.Polygon2D.prototype.SectorPosition=function(a,b,c){var d=JSM.SectorPolygonPosition2D.NoIntersection,e=this.vertices.length;if(3>e)return d;var f,g,h,l,k;for(f=0;f<e;f++)if(g=f,h=(f+1)%e,l=this.vertices[g],k=this.vertices[h],!(g==b||h==b||g==c||h==c)){g=new JSM.Sector2D(l,k);g=a.SectorPosition(g);if(g==JSM.SectorSectorPosition2D.SectorsIntersectOnePoint)return JSM.SectorPolygonPosition2D.IntersectionOnePoint;if(g==JSM.SectorSectorPosition2D.SectorsIntersectCoincident)return JSM.SectorPolygonPosition2D.IntersectionCoincident;
|
||||
g==JSM.SectorSectorPosition2D.SectorsIntersectEndPoint&&(d=JSM.SectorPolygonPosition2D.IntersectionOnVertex)}return d};
|
||||
JSM.Polygon2D.prototype.IsDiagonal=function(a,b){return a==b||(this.GetPrevVertex(a)==b||this.GetNextVertex(a)==b)||this.vertices[a].IsEqual(this.vertices[b])||function(a,b,e){var f=a.GetVertex(b),g=a.GetVertex(e),f=new JSM.Sector2D(f,g);return a.SectorPosition(f,b,e)!=JSM.SectorPolygonPosition2D.NoIntersection?!0:!1}(this,a,b)||!function(a,b,e){b=a.GetVertex(b);e=a.GetVertex(e);e=new JSM.Coord2D((b.x+e.x)/2,(b.y+e.y)/2);return a.CoordPosition(e)==JSM.CoordPolygonPosition2D.Inside}(this,a,b)?!1:!0};
|
||||
JSM.Polygon2D.prototype.ToArray=function(){var a=[],b,c;for(b=0;b<this.vertices.length;b++)c=this.vertices[b],a.push(c.Clone());return a};JSM.Polygon2D.prototype.FromArray=function(a){this.Clear();var b,c;for(b=0;b<a.length;b++)c=a[b],this.AddVertex(c.x,c.y)};JSM.Polygon2D.prototype.Clear=function(){this.vertices=[];this.ClearCache()};JSM.Polygon2D.prototype.ClearCache=function(){this.cache={signedArea:null,orientation:null,vertexOrientations:{},complexity:null}};
|
||||
JSM.Polygon2D.prototype.Clone=function(){var a=new JSM.Polygon2D,b,c;for(b=0;b<this.vertices.length;b++)c=this.vertices[b],a.AddVertexCoord(c.Clone());return a};JSM.ContourPolygon2D=function(){this.contours=null;this.Clear()};JSM.ContourPolygon2D.prototype.AddVertex=function(a,b){this.lastContour.AddVertex(a,b)};JSM.ContourPolygon2D.prototype.AddVertexCoord=function(a){this.lastContour.AddVertexCoord(a)};
|
||||
JSM.ContourPolygon2D.prototype.AddContourVertex=function(a,b,c){return this.contours[a].AddVertex(b,c)};JSM.ContourPolygon2D.prototype.AddContourVertexCoord=function(a,b){return this.contours[a].AddVertexCoord(b)};JSM.ContourPolygon2D.prototype.VertexCount=function(){var a=0,b;for(b=0;b<this.contours.length;b++)a+=this.contours[b].VertexCount();return a};JSM.ContourPolygon2D.prototype.ContourVertexCount=function(a){return this.contours[a].VertexCount()};
|
||||
@ -104,36 +104,36 @@ JSM.ContourPolygon.prototype.VertexCount=function(){var a=0,b;for(b=0;b<this.con
|
||||
JSM.ContourPolygon.prototype.GetContourVertex=function(a,b){return this.contours[a].GetVertex(b)};JSM.ContourPolygon.prototype.GetContour=function(a){return this.contours[a]};JSM.ContourPolygon.prototype.ContourCount=function(){return this.contours.length};
|
||||
JSM.ContourPolygon.prototype.ToContourPolygon2D=function(){var a=this.contours[0].GetNormal(),b=new JSM.ContourPolygon2D,c,d,e,f;for(c=0;c<this.contours.length;c++){b.AddContour();e=this.contours[c];for(d=0;d<e.VertexCount();d++)f=e.GetVertex(d),b.AddVertexCoord(f.ToCoord2D(a))}return b};JSM.ContourPolygon.prototype.ToArray=function(){var a=[],b,c,d,e;for(b=0;b<this.contours.length;b++){d=this.contours[b];for(c=0;c<d.VertexCount();c++)e=d.GetVertex(c),a.push(e.Clone());b<this.contours.length-1&&a.push(null)}return a};
|
||||
JSM.ContourPolygon.prototype.FromArray=function(a){this.Clear();this.AddContour();var b,c;for(b=0;b<a.length;b++)c=a[b],null===c?this.AddContour():this.AddVertex(c.x,c.y,c.z)};JSM.ContourPolygon.prototype.Clear=function(){this.contours=[];this.lastContour=null};JSM.ContourPolygon.prototype.Clone=function(){var a=new JSM.ContourPolygon,b,c;for(b=0;b<this.contours.length;b++)c=this.contours[b],a.AddContour(c.Clone());return a};
|
||||
JSM.OffsetPolygonContour=function(a,b){var c=a.VertexCount(),d=a.GetNormal(),e,f,h,g,l,k=new JSM.Polygon,m;for(m=0;m<c;m++)e=a.GetPrevVertex(m),f=m,h=a.GetNextVertex(m),e=a.GetVertex(e),f=a.GetVertex(f),g=a.GetVertex(h),l=JSM.CoordSub(e,f),h=JSM.CoordSub(g,f),l=l.AngleTo(h)/2,JSM.CoordOrientation(e,f,g,d)==JSM.Orientation.Clockwise&&(l=Math.PI-l),e=b/Math.sin(l),g=f.Clone(),g.Offset(h,e),g.Rotate(d,l,f),k.AddVertex(g.x,g.y,g.z);return k};
|
||||
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 h(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(f.CoordSignedDistance(g));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]=
|
||||
JSM.OffsetPolygonContour=function(a,b){var c=a.VertexCount(),d=a.GetNormal(),e,f,g,h,l,k=new JSM.Polygon,m;for(m=0;m<c;m++)e=a.GetPrevVertex(m),f=m,g=a.GetNextVertex(m),e=a.GetVertex(e),f=a.GetVertex(f),h=a.GetVertex(g),l=JSM.CoordSub(e,f),g=JSM.CoordSub(h,f),l=l.AngleTo(g)/2,JSM.CoordOrientation(e,f,h,d)==JSM.Orientation.Clockwise&&(l=Math.PI-l),e=b/Math.sin(l),h=f.Clone(),h.Offset(g,e),h.Rotate(d,l,f),k.AddVertex(h.x,h.y,h.z);return k};
|
||||
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(f.CoordSignedDistance(g));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 n=b[l],m=n,p=!1,q=0,s=new JSM.Polygon,t;;){p||(q=c[m],0!==q&&(p=!0));if(0<s.VertexCount()&&m==n)if(1==q?d.push(s):-1==q&&e.push(s),s=new JSM.Polygon,0<l&&l<b.length){m=n=b[l];continue}else break;t=a.GetVertex(m);s.AddVertex(t.x,t.y,t.z);-1!=k[m]?(l=g?
|
||||
l-2:l+2,m=k[m],h(k,m)):m=m<a.VertexCount()-1?m+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 g=new JSM.Polygon,l=[];b=function(a,b,c,d){function e(a,c,d,f,g){function h(a,c,d,e,f,g){var l=d[d.length-1];0!==l&&(0!==g&&l!=g)&&(e=
|
||||
l-2:l+2,m=k[m],h(k,m)):m=m<a.VertexCount()-1?m+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,l=[];b=function(a,b,c,d){function e(a,c,d,f,g){function h(a,c,d,e,f,g){var l=d[d.length-1];0!==l&&(0!==g&&l!=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),b.LinePosition(a,f)==JSM.LinePlanePosition.LineIntersectsPlane&&(c.AddVertex(f.x,f.y,f.z),d.push(0)))}function l(a,b,c,d,e){a=a.GetVertex(d);b.AddVertex(a.x,a.y,a.z);c.push(e)}var k=0===c,n=c===a.VertexCount(),p;n?(c=0,p=a.VertexCount()-1):p=c-1;f=f[c];k||h(a,d,g,p,c,f);n||l(a,d,g,c,f);return f}var f=[],g=!1,h=!1,l,r,v;for(l=0;l<a.VertexCount();l++)r=a.GetVertex(l),r=b.CoordPosition(r),v=0,r==JSM.CoordPlanePosition.CoordInFrontOfPlane?
|
||||
(v=1,h=!0):r==JSM.CoordPlanePosition.CoordAtBackOfPlane&&(v=-1,g=!0),f.push(v);if(g&&h)for(l=0;l<=a.VertexCount();l++)e(a,l,c,f,d);else{if(g)return-1;if(h)return 1}return 0}(a,b,g,l);0===g.VertexCount()&&0===l.length?f(a,b,c,d,e):h(g,l,c,d);return 0===c.length+d.length+e.length?!1:!0};
|
||||
(v=1,h=!0):r==JSM.CoordPlanePosition.CoordAtBackOfPlane&&(v=-1,g=!0),f.push(v);if(g&&h)for(l=0;l<=a.VertexCount();l++)e(a,l,c,f,d);else{if(g)return-1;if(h)return 1}return 0}(a,b,h,l);0===h.VertexCount()&&0===l.length?f(a,b,c,d,e):g(h,l,c,d);return 0===c.length+d.length+e.length?!1:!0};
|
||||
JSM.ConvertContourPolygonToPolygon2D=function(a,b){function c(a,b,c,d,e){a.AddVertexCoord(b);void 0!==c&&null!==c&&c.push([d,e])}function d(a,b,d,e,f){f=function(a,b,c,d){function e(a,b,c,d,f){function g(a,b,c){b=new JSM.Sector2D(b,c);a=a.SectorPosition(b,-1,-1);return a==JSM.SectorPolygonPosition2D.IntersectionOnePoint||a==JSM.SectorPolygonPosition2D.IntersectionCoincident?!0:!1}if(g(b,c,d))return!1;var h;for(b=1;b<a.ContourCount();b++)if(void 0===f.addedHoles[b]&&(h=a.GetContour(b),g(h,c,d)))return!1;
|
||||
return!0}function f(a,b){var c;for(c=0;c<b.entryPositions.length;c++)if(a.IsEqual(b.entryPositions[c]))return!0;return!1}c=a.GetContour(c);var g,h,l,k;for(g=0;g<b.VertexCount();g++)for(h=0;h<c.VertexCount();h++)if(l=b.GetVertex(g),k=c.GetVertex(h),e(a,b,l,k,d)&&!f(l,d)&&!f(k,d))return d.entryPositions.push(l.Clone()),d.entryPositions.push(k.Clone()),{beg:g,end:h};return null}(a,b,d,f);if(null===f)return!1;(function(a,b,d,e,f){var g=b.GetContour(d),h=e.beg;b=a.GetVertex(h).Clone();a.ShiftVertices(h+
|
||||
1);var l=0,k=0;void 0!==f&&null!==f&&(l=f[h][0],k=f[h][1],JSM.ShiftArray(f,h+1));e=e.end;h=g.GetPrevVertex(e);g.EnumerateVertices(e,h,function(b){c(a,g.GetVertex(b).Clone(),f,d,b)});c(a,g.GetVertex(e).Clone(),f,d,e);c(a,b,f,l,k)})(b,a,d,f,e);return!0}var e=a.ContourCount(),f=a.GetContour(0),h=new JSM.Polygon2D,g,l;for(g=0;g<f.VertexCount();g++)l=f.GetVertex(g),c(h,l.Clone(),b,0,g);if(1==e)return h;f=[];for(g=1;g<e;g++)f.push(g);for(e={addedHoles:{},holeTryouts:{},entryPositions:[]};0<f.length;)if(g=
|
||||
f.shift(),d(a,h,g,b,e))e.addedHoles[g]=!0;else{void 0===e.holeTryouts[g]&&(e.holeTryouts[g]=0);e.holeTryouts[g]+=1;if(10<e.holeTryouts[g])return null;f.push(g)}return h};JSM.TriangulateConvexPolygon=function(a){var b=[],c;for(c=1;c<a.VertexCount()-1;c++)b.push([0,c,c+1]);return b};
|
||||
1);var l=0,k=0;void 0!==f&&null!==f&&(l=f[h][0],k=f[h][1],JSM.ShiftArray(f,h+1));e=e.end;h=g.GetPrevVertex(e);g.EnumerateVertices(e,h,function(b){c(a,g.GetVertex(b).Clone(),f,d,b)});c(a,g.GetVertex(e).Clone(),f,d,e);c(a,b,f,l,k)})(b,a,d,f,e);return!0}var e=a.ContourCount(),f=a.GetContour(0),g=new JSM.Polygon2D,h,l;for(h=0;h<f.VertexCount();h++)l=f.GetVertex(h),c(g,l.Clone(),b,0,h);if(1==e)return g;f=[];for(h=1;h<e;h++)f.push(h);for(e={addedHoles:{},holeTryouts:{},entryPositions:[]};0<f.length;)if(h=
|
||||
f.shift(),d(a,g,h,b,e))e.addedHoles[h]=!0;else{void 0===e.holeTryouts[h]&&(e.holeTryouts[h]=0);e.holeTryouts[h]+=1;if(10<e.holeTryouts[h])return null;f.push(h)}return g};JSM.TriangulateConvexPolygon=function(a){var b=[],c;for(c=1;c<a.VertexCount()-1;c++)b.push([0,c,c+1]);return b};
|
||||
JSM.TriangulateConcavePolygon2D=function(a){function b(a){var b=a.VertexCount(),c,d;for(c=0;c<b;c++)for(d=0;d<b;d++)if(c!=d&&a.IsDiagonal(c,d))return{beg:c,end:d};return null}function c(a,b){function c(a,b,d){b.polygon.AddVertexCoord(a.polygon.GetVertex(d));b.map.push(a.map[d])}var d={polygon:new JSM.Polygon2D,map:[]},e={polygon:new JSM.Polygon2D,map:[]},f,p;f=b.beg;p=a.polygon.GetPrevVertex(b.end);c(a,d,b.end);a.polygon.EnumerateVertices(f,p,function(b){c(a,d,b)});f=b.end;p=a.polygon.GetPrevVertex(b.beg);
|
||||
c(a,e,b.beg);a.polygon.EnumerateVertices(f,p,function(b){c(a,e,b)});return{resultData1:d,resultData2:e}}var d=[],e=function(a){var b=[],c;for(c=0;c<a;c++)b[c]=c;return b}(a.VertexCount());d.push({polygon:a,map:e});a=[];for(var f;0<d.length;)if(e=d.pop(),f=e.polygon.VertexCount(),!(3>f))if(3==f)a.push(e.map);else{f=b(e.polygon);if(null===f)return null;e=c(e,f);d.push(e.resultData1);d.push(e.resultData2)}return a};
|
||||
JSM.TriangulatePolygon2D=function(a){if(null===a)return null;var b=a.VertexCount();if(3>b)return null;if(3==b)return[[0,1,2]];b=a.GetComplexity();return b===JSM.Complexity.Invalid?null:b==JSM.Complexity.Convex?JSM.TriangulateConvexPolygon(a):JSM.TriangulateConcavePolygon2D(a)};JSM.TriangulatePolygon=function(a){a=a.ToPolygon2D();return JSM.TriangulatePolygon2D(a)};
|
||||
JSM.TraverseOctreeNodes=function(a,b){function c(a,b){if(b(a)&&null!==a.children){var f,h;for(f=0;f<a.children.length;f++)h=a.children[f],c(h,b)}}c(a.root,b)};
|
||||
JSM.TraverseOctreeNodes=function(a,b){function c(a,b){if(b(a)&&null!==a.children){var f,g;for(f=0;f<a.children.length;f++)g=a.children[f],c(g,b)}}c(a.root,b)};
|
||||
JSM.CreateOctreeChildNodes=function(a,b){function c(a,b,c,d,l){var k=a.GetSize().Clone();k.MultiplyScalar(0.5);a=new JSM.Coord(a.min.x+c*k.x,a.min.y+d*k.y,a.min.z+l*k.z);k=JSM.CoordAdd(a,k);k=new JSM.Box(a,k);return b(k)}var d=a.GetSize();return JSM.IsZero(d.x)&&JSM.IsZero(d.y)&&JSM.IsZero(d.z)?null:[c(a,b,0,0,0),c(a,b,1,0,0),c(a,b,1,1,0),c(a,b,0,1,0),c(a,b,0,0,1),c(a,b,1,0,1),c(a,b,1,1,1),c(a,b,0,1,1)]};
|
||||
JSM.Octree=function(a,b){this.coords=[];this.root=this.CreateNewNode(null,a);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.FindNodeForCoord(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],a.IsEqual(this.coords[d]))return d;return-1};JSM.Octree.prototype.AddCoordToNode=function(a,b){var c=this.FindNodeForCoord(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.FindNodeForCoord=function(a,b){if(null===b.children)return b;var c=b.box.GetCenter(),d=a.x>c.x,e=a.y>c.y,c=a.z>c.z;return!d&&!e&&!c?this.FindNodeForCoord(a,b.children[0]):d&&!e&&!c?this.FindNodeForCoord(a,b.children[1]):d&&e&&!c?this.FindNodeForCoord(a,b.children[2]):!d&&e&&!c?this.FindNodeForCoord(a,b.children[3]):!d&&!e&&c?this.FindNodeForCoord(a,b.children[4]):d&&!e&&c?this.FindNodeForCoord(a,b.children[5]):d&&e&&c?this.FindNodeForCoord(a,b.children[6]):!d&&e&&c?this.FindNodeForCoord(a,
|
||||
b.children[7]):null};JSM.Octree.prototype.SplitNode=function(a){var b=this,c=JSM.CreateOctreeChildNodes(a.box,function(c){return b.CreateNewNode(a,c)});if(null===c)return!1;a.children=c;c=a.coords;a.coords=[];var d,e;for(d=0;d<c.length;d++)e=this.FindNodeForCoord(this.coords[c[d]],a),e.coords.push(c[d]);return!0};JSM.Octree.prototype.CreateNewNode=function(a,b){return{parent:a,box:b,coords:[],children:null}};JSM.TriangleOctree=function(a){this.root=this.CreateNewNode(null,a)};
|
||||
JSM.TriangleOctree.prototype.AddTriangle=function(a,b,c,d){return this.AddTriangleToNode(a,b,c,this.root,d)};
|
||||
JSM.TriangleOctree.prototype.AddTriangleToNode=function(a,b,c,d,e){if(!d.box.IsCoordInside(a)||!d.box.IsCoordInside(b)||!d.box.IsCoordInside(c))return!1;if(null===d.children){var f=this;d.children=JSM.CreateOctreeChildNodes(d.box,function(a){return f.CreateNewNode(d,a)})}if(null!==d.children){var h,g;for(h=0;h<d.children.length;h++)if(g=d.children[h],this.AddTriangleToNode(a,b,c,g,e))return!0}d.triangles.push({v0:a,v1:b,v2:c,userData:e});return!0};
|
||||
JSM.TriangleOctree.prototype.AddTriangleToNode=function(a,b,c,d,e){if(!d.box.IsCoordInside(a)||!d.box.IsCoordInside(b)||!d.box.IsCoordInside(c))return!1;if(null===d.children){var f=this;d.children=JSM.CreateOctreeChildNodes(d.box,function(a){return f.CreateNewNode(d,a)})}if(null!==d.children){var g,h;for(g=0;g<d.children.length;g++)if(h=d.children[g],this.AddTriangleToNode(a,b,c,h,e))return!0}d.triangles.push({v0:a,v1:b,v2:c,userData:e});return!0};
|
||||
JSM.TriangleOctree.prototype.CreateNewNode=function(a,b){return{parent:a,box:b,triangles:[],children:null}};JSM.BSPTree=function(){this.root=null};JSM.BSPTree.prototype.AddPolygon=function(a,b){null===this.root&&(this.root=this.CreateNewNode());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=b.GetNormal();var e=JSM.GetPlaneFromCoordAndDirection(b.GetVertex(0),d);a.polygon=b;void 0!==c&&(a.userData=c);a.plane=e}else{d=[];var f=[],e=[];JSM.CutPolygonWithPlane(b,a.plane,f,d,e)&&(0<d.length&&this.AddInsidePolygonsToNode(a,d,c),0<f.length&&this.AddOutsidePolygonsToNode(a,f,c),0<e.length&&(d=b.GetNormal(),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.CreateNewNode(),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.CreateNewNode(),a.outside.parent=a);var d;for(d=0;d<b.length;d++)this.AddPolygonToNode(a.outside,b[d],c)};
|
||||
JSM.BSPTree.prototype.CreateNewNode=function(){return{polygon:null,userData:null,plane:null,parent:null,inside:null,outside:null}};
|
||||
JSM.ClipPolygonWithBSPTree=function(a,b,c,d,e,f){function h(a,b,c){if(null!==b){var d=[],e=[],f=[];JSM.CutPolygonWithPlane(a,b.plane,e,d,f)&&(0<d.length&&l(b,d,c),0<e.length&&k(b,e,c),0<f.length&&(a=a.GetNormal(),0<JSM.VectorDot(a,b.plane.GetNormal())?l(b,f,!0):k(b,f,!0)))}}function g(a,b){var c;for(c=0;c<a.length;c++)b.push(a[c])}function l(a,b,c){if(null!==a.inside){a=a.inside;var e;for(e=0;e<b.length;e++)h(b[e],a,c)}else g(b,c?f:d)}function k(a,b,d){if(null!==a.outside){a=a.outside;var f;for(f=
|
||||
0;f<b.length;f++)h(b[f],a,d)}else g(b,d?e:c)}h(a,b.root,!1);return!0};JSM.TraverseBSPTreeForEyePosition=function(a,b,c){function d(a){if(null!==a){var f=a.plane.CoordPosition(b);f==JSM.CoordPlanePosition.CoordInFrontOfPlane?(d(a.inside),c(a),d(a.outside)):(f==JSM.CoordPlanePosition.CoordAtBackOfPlane?(d(a.outside),c(a)):d(a.outside),d(a.inside))}}d(a.root)};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,h,g;for(h=0;h<b;h++)g=JSM.CylindricalToCartesian(a,0,e),void 0!==c&&null!==c&&(g=JSM.CoordAdd(g,c)),d.push(g),e+=f;return d};
|
||||
JSM.GetRuledMesh=function(a,b,c,d,e){if(a.length===b.length){var f=a.length-1,h=[],g=[],l;for(l=0;l<=f;l++)h.push(JSM.CoordSub(b[l],a[l])),g.push(a[l].DistanceTo(b[l]));var k,m;for(l=0;l<=f;l++){k=g[l]/c;for(b=0;b<=c;b++)m=a[l].Clone().Offset(h[l],k*b),d.push(m)}for(l=0;l<f;l++)for(b=0;b<c;b++)a=l*(c+1)+b,d=a+1,h=a+c+1,g=h+1,a=[a,h,g,d],e.push(a)}};JSM.Ray=function(a,b,c){this.origin=a;this.direction=b.Normalize();this.length=c};
|
||||
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&&l(b,d,c),0<e.length&&k(b,e,c),0<f.length&&(a=a.GetNormal(),0<JSM.VectorDot(a,b.plane.GetNormal())?l(b,f,!0):k(b,f,!0)))}}function h(a,b){var c;for(c=0;c<a.length;c++)b.push(a[c])}function l(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 k(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.TraverseBSPTreeForEyePosition=function(a,b,c){function d(a){if(null!==a){var f=a.plane.CoordPosition(b);f==JSM.CoordPlanePosition.CoordInFrontOfPlane?(d(a.inside),c(a),d(a.outside)):(f==JSM.CoordPlanePosition.CoordAtBackOfPlane?(d(a.outside),c(a)):d(a.outside),d(a.inside))}}d(a.root)};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=[],l;for(l=0;l<=f;l++)g.push(JSM.CoordSub(b[l],a[l])),h.push(a[l].DistanceTo(b[l]));var k,m;for(l=0;l<=f;l++){k=h[l]/c;for(b=0;b<=c;b++)m=a[l].Clone().Offset(g[l],k*b),d.push(m)}for(l=0;l<f;l++)for(b=0;b<c;b++)a=l*(c+1)+b,d=a+1,g=a+c+1,h=g+1,a=[a,g,h,d],e.push(a)}};JSM.Ray=function(a,b,c){this.origin=a;this.direction=b.Normalize();this.length=c};
|
||||
JSM.Ray.prototype.Set=function(a,b,c){this.origin=a;this.direction=b.Normalize();this.length=c};JSM.Ray.prototype.GetOrigin=function(){return this.origin};JSM.Ray.prototype.GetDirection=function(){return this.direction};JSM.Ray.prototype.IsLengthReached=function(a){return void 0===this.length||null===this.length?!1:JSM.IsGreater(a,this.length)};JSM.Ray.prototype.Clone=function(){return new JSM.Ray(this.origin.Clone(),this.direction.Clone(),this.length)};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.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};
|
||||
@ -154,131 +154,132 @@ JSM.Material=function(a){JSM.CopyObjectProperties(a,this,!0);JSM.CopyObjectPrope
|
||||
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,h,g,l,k;for(c=0;c<a.PolygonCount();c++){f=a.GetPolygon(c);e=new JSM.PgonInfo;h=f.VertexIndexCount();for(d=0;d<h;d++){g=f.GetVertexIndex(d);l=f.GetVertexIndex(d<h-1?d+1:0);k=g;var m=l;l=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===k&&q.vert2===m?(n.index=p,n.reverse=!1):q.vert1===m&&q.vert2===k&&(n.index=
|
||||
p,n.reverse=!0);-1===n.index?(p=new JSM.EdgeInfo,p.vert1=k,p.vert2=m,p.pgon1=l,p.pgon2=-1,b.edges.push(p),n.index=b.edges.length-1,n.reverse=!1):(k=b.edges[n.index],-1===k.pgon1?k.pgon1=l:k.pgon1!==l&&-1===k.pgon2&&(k.pgon2=l));k=n;e.verts.push(g);e.pedges.push(k);b.verts[g].edges.push(k.index);b.verts[g].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,h,g,l;for(b=0;b<a.edges.length;b++){d=a.edges[b];if(-1===d.pgon1||-1===d.pgon2)return!1;h=a.pgons[d.pgon1];f=!1;for(c=0;c<h.pedges.length;c++)if(e=h.pedges[c],e.index==b){g=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){l=e.reverse;f=!0;break}if(!f||g==l)return!1}return!0};
|
||||
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,h=a,g=f.pgons[e],l=void 0,k=void 0,k=void 0,l=0;l<g.pedges.length;l++)k=f.edges[g.pedges[l].index],k=JSM.GetAnotherPgonOfEdge(k,e),-1!=k&&h.push(k)};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,h,g;for(f=0;f<d;f++)h=f,g=(f+1)%d,h=a.GetVertexPosition(c.GetVertexIndex(h)),g=a.GetVertexPosition(c.GetVertexIndex(g)),e.x+=(h.y-g.y)*(h.z+g.z),e.y+=(h.z-g.z)*(h.x+g.x),e.z+=(h.x-g.x)*(h.y+g.y)}e.Normalize();return 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,h,g,l,k,m,n;for(e=0;e<a.PolygonCount();e++)if(g=a.GetPolygon(e),b[e]=[],g.HasCurveGroup()){null===d&&(d=JSM.CalculateBodyVertexToPolygon(a));for(f=0;f<g.VertexIndexCount();f++){l=new JSM.Vector(0,0,0);k=0;m=d[g.GetVertexIndex(f)];for(h=0;h<m.length;h++)n=a.GetPolygon(m[h]),n.GetCurveGroup()===g.GetCurveGroup()&&(l=JSM.CoordAdd(l,c[m[h]]),k++);l.MultiplyScalar(1/k);l.Normalize();b[e].push(l)}}else{h=
|
||||
c[e];for(f=0;f<g.VertexIndexCount();f++)b[e].push(new JSM.Vector(h.x,h.y,h.z))}return b};JSM.CalculatePolygonCurveGroups=function(a,b){var c=[],d=a.VertexCount(),e,f;for(e=0;e<d;e++)c.push(0);for(e=0;e<d;e++)f=c[a.GetPrevVertex(e)],a.GetVertexAngle(e)>b?c[e]=f:c[e]=f+1;f=c[0];d=c[d-1];if(0===f&&f!=d)for(e=0;c[e]==f;e++)c[e]=d;return c};
|
||||
JSM.MakeBodyInsideOut=function(a){var b,c,d,e,f;for(b=0;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])}};JSM.SoftMoveBodyVertex=function(a,b,c,d,e){b=a.GetVertexPosition(b).Clone();var f=JSM.GetGaussianCParameter(c,e,0,1E-5),h,g;for(h=0;h<a.VertexCount();h++)g=b.DistanceTo(a.GetVertex(h).position),JSM.IsGreater(g,c)||(g=JSM.GetGaussianValue(g,e,0,f),a.GetVertexPosition(h).Offset(d,g))};
|
||||
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,l,k;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);l=f.GetVertexIndex(d<g-1?d+1:0);k=h;var m=l;l=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===k&&q.vert2===m?(n.index=p,n.reverse=!1):q.vert1===m&&q.vert2===k&&(n.index=
|
||||
p,n.reverse=!0);-1===n.index?(p=new JSM.EdgeInfo,p.vert1=k,p.vert2=m,p.pgon1=l,p.pgon2=-1,b.edges.push(p),n.index=b.edges.length-1,n.reverse=!1):(k=b.edges[n.index],-1===k.pgon1?k.pgon1=l:k.pgon1!==l&&-1===k.pgon2&&(k.pgon2=l));k=n;e.verts.push(h);e.pedges.push(k);b.verts[h].edges.push(k.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,l;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){l=e.reverse;f=!0;break}if(!f||h==l)return!1}return!0};
|
||||
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],l=void 0,k=void 0,k=void 0,l=0;l<h.pedges.length;l++)k=f.edges[h.pedges[l].index],k=JSM.GetAnotherPgonOfEdge(k,e),-1!=k&&g.push(k)};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)}e.Normalize();return 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,l,k,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++){l=new JSM.Vector(0,0,0);k=0;m=d[h.GetVertexIndex(f)];for(g=0;g<m.length;g++)n=a.GetPolygon(m[g]),n.GetCurveGroup()===h.GetCurveGroup()&&(l=JSM.CoordAdd(l,c[m[g]]),k++);l.MultiplyScalar(1/k);l.Normalize();b[e].push(l)}}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.CalculatePolygonCurveGroups=function(a,b){var c=[],d=a.VertexCount(),e,f;for(e=0;e<d;e++)c.push(0);for(e=0;e<d;e++)f=c[a.GetPrevVertex(e)],a.GetVertexAngle(e)>b?c[e]=f:c[e]=f+1;f=c[0];d=c[d-1];if(0===f&&f!=d)for(e=0;c[e]==f;e++)c[e]=d;return c};
|
||||
JSM.MakeBodyInsideOut=function(a){var b,c,d,e,f;for(b=0;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])}};JSM.SoftMoveBodyVertex=function(a,b,c,d,e){b=a.GetVertexPosition(b).Clone();var f=JSM.GetGaussianCParameter(c,e,0,1E-5),g,h;for(g=0;g<a.VertexCount();g++)h=b.DistanceTo(a.GetVertex(g).position),JSM.IsGreater(h,c)||(h=JSM.GetGaussianValue(h,e,0,f),a.GetVertexPosition(g).Offset(d,h))};
|
||||
JSM.CalculatePolygonCentroid=function(a,b){var c=a.GetPolygon(b),d=c.VertexIndexCount(),e=new JSM.Coord(0,0,0),f;for(f=0;f<d;f++)e=JSM.CoordAdd(e,a.GetVertexPosition(c.GetVertexIndex(f)));e.MultiplyScalar(1/d);return e};
|
||||
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,h,g,l;for(c=0;c<a.PolygonCount();c++){d=JSM.CalculatePolygonCentroid(a,c);l=b.VertexCount();b.AddVertex(new JSM.BodyVertex(new JSM.Coord(d.x,d.y,d.z)));f=a.GetPolygon(c);h=f.VertexIndexCount();for(d=0;d<h;d++)e=f.GetVertexIndex(d),g=f.GetVertexIndex(d<h-1?d+1:0),e=new JSM.BodyPolygon([e,g,l]),e.material=f.material,
|
||||
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,l;for(c=0;c<a.PolygonCount();c++){d=JSM.CalculatePolygonCentroid(a,c);l=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,l]),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,h;for(c=0;c<a.PolygonCount();c++){f=new JSM.Polygon;h=a.GetPolygon(c);for(d=0;d<h.VertexIndexCount();d++)e=a.GetVertexPosition(h.GetVertexIndex(d)),f.AddVertex(e.x,e.y,e.z);e=JSM.TriangulatePolygon(f);if(null!==e)for(d=0;d<e.length;d++)f=e[d],f=new JSM.BodyPolygon([h.GetVertexIndex(f[0]),h.GetVertexIndex(f[1]),h.GetVertexIndex(f[2])]),
|
||||
f.InheritAttributes(h),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.AddBodyToBSPTree=function(a,b,c){var d,e,f;for(d=0;d<a.PolygonCount();d++){f={id:c,originalPolygon:d,material:-1};e=a;var h=f,g=e.GetPolygon(d);h.material=g.GetMaterialIndex();for(var h=new JSM.Polygon,l=void 0,k=void 0,l=0;l<g.VertexIndexCount();l++)k=e.GetVertexPosition(g.GetVertexIndex(l)),h.AddVertex(k.x,k.y,k.z);e=h;b.AddPolygon(e,f)}};
|
||||
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.TriangulatePolygon(f);if(null!==e)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),e=b.AddMaterial(new JSM.Material({ambient:e,diffuse:e})),a.GetPolygon(d).SetMaterialIndex(e)};
|
||||
JSM.AddBodyToBSPTree=function(a,b,c){var d,e,f;for(d=0;d<a.PolygonCount();d++){f={id:c,originalPolygon:d,material:-1};e=a;var g=f,h=e.GetPolygon(d);g.material=h.GetMaterialIndex();for(var g=new JSM.Polygon,l=void 0,k=void 0,l=0;l<h.VertexIndexCount();l++)k=e.GetVertexPosition(h.GetVertexIndex(l)),g.AddVertex(k.x,k.y,k.z);e=g;b.AddPolygon(e,f)}};
|
||||
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,l,k,n;for(d=0;d<a.length;d++){l=b.pgons[a[d]];for(e=0;e<l.pedges.length;e++)if(k=l.pedges[e],n=b.edges[k.index],!g[n.pgon1]||!g[n.pgon2])k.reverse?(k=n.vert2,n=n.vert1):(k=n.vert1,n=n.vert2),c[k]=n,-1==h&&(h=k)}return h}function g(a,b,c,d){var e=[],f,h,l;for(f=0;f<c.length;f++)h=c[f],l=d[h],void 0===l&&(l=a.GetVertexPosition(h),l=b.AddVertex(new JSM.BodyVertex(l.Clone())),
|
||||
d[h]=l),e.push(l);b.AddPolygon(new JSM.BodyPolygon(e))}if(0!==c.length){var h=[];if(1==c.length)h=a.GetPolygon(c[0]).GetVertexIndices();else{var w=[];b=f(c,b,w);if(-1==b)return;c=b;do{if(void 0===c)break;h.push(c);c=w[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=d[a].AngleTo(d[b]);return JSM.IsEqual(g,0)?(f.push(b),e[b]=!0):!1});return f}var d=JSM.CalculateBodyPolygonNormals(a),
|
||||
e=[],f={},h;for(h=0;h<b.pgons.length;h++)g=c(h,b,d,f),null!==g&&e.push(g);return e}(a,d),f={},h,g;for(h=0;h<e.length;h++)g=e[h],b(a,d,g,f,c);return c};
|
||||
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=b.e1.Clone().Normalize(),e=b.e2.Clone().Normalize(),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=f.ProjectCoord(a);c.x=d.CoordSignedDistance(f);c.y=e.CoordSignedDistance(f);return c};
|
||||
JSM.CalculateCubicTextureCoord=function(a,b,c){var d=new JSM.Coord2D(0,0),e=c.e1.Clone().Normalize(),f=c.e2.Clone().Normalize(),h=c.e3.Clone().Normalize(),g=-1,l=0,k,m,n;for(k=0;3>k;k++)0===k?m=e:1===k?m=f:2===k&&(m=h),n=Math.abs(JSM.VectorDot(b,m)),JSM.IsGreater(n,l)&&(g=k,l=n);if(-1===g)return d;b=null;0===g?b=new JSM.CoordSystem(c.origo,f,h,new JSM.Coord(0,0,0)):1===g?b=new JSM.CoordSystem(c.origo,e,h,new JSM.Coord(0,0,0)):2===g&&(b=new JSM.CoordSystem(c.origo,e,f,new JSM.Coord(0,0,0)));return null===
|
||||
b?d:JSM.CalculatePlanarTextureCoord(a,b)};JSM.CalculateCylindricalTextureCoord=function(a,b,c){var d=new JSM.Coord2D(0,0),e=c.e3.Clone().Normalize();if(e.IsCollinearWith(b))return d=JSM.CalculateCubicTextureCoord(a,b,c),[d,0];var f=(new JSM.Line(c.origo,e)).ProjectCoord(a);b=JSM.CoordSignedDistance(c.origo,f,e);var h=c.e1.Clone().Normalize();a=JSM.CoordSub(a,f);e=JSM.GetVectorsFullAngle(a,h,e);c=c.e1.Length();d.x=e*c;d.y=b;return[d,e]};
|
||||
JSM.CalculatePolygonPlanarTextureCoords=function(a,b){var c=[],d=a.GetPolygon(b),e=a.GetTextureProjectionCoords(),f,h;for(f=0;f<d.VertexIndexCount();f++)h=a.GetVertexPosition(d.GetVertexIndex(f)),c.push(JSM.CalculatePlanarTextureCoord(h,e));return c};JSM.CalculatePolygonCubicTextureCoords=function(a,b,c){var d=[];b=a.GetPolygon(b);var e=a.GetTextureProjectionCoords(),f,h;for(f=0;f<b.VertexIndexCount();f++)h=a.GetVertexPosition(b.GetVertexIndex(f)),d.push(JSM.CalculateCubicTextureCoord(h,c,e));return d};
|
||||
JSM.CalculatePolygonCylindricalTextureCoords=function(a,b,c){var d=[],e=[],f=a.GetPolygon(b),h=a.GetTextureProjectionCoords(),g;for(b=0;b<f.VertexIndexCount();b++)g=a.GetVertexPosition(f.GetVertexIndex(b)),g=JSM.CalculateCylindricalTextureCoord(g,c,h),d.push(g[0]),e.push(g[1]);if(h.e3.Clone().Normalize().IsCollinearWith(c))return d;c=!1;for(b=0;b<e.length;b++){for(a=b+1;a<e.length;a++)if(JSM.IsGreater(Math.abs(e[b]-e[a]),Math.PI)){c=!0;break}if(c)break}if(c){h=h.e1.Length();for(b=0;b<e.length;b++)JSM.IsLower(e[b],
|
||||
Math.PI)&&(d[b].x=h*(e[b]+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.CalculateCubicTextureCoord=function(a,b,c){var d=new JSM.Coord2D(0,0),e=c.e1.Clone().Normalize(),f=c.e2.Clone().Normalize(),g=c.e3.Clone().Normalize(),h=-1,l=0,k,m,n;for(k=0;3>k;k++)0===k?m=e:1===k?m=f:2===k&&(m=g),n=Math.abs(JSM.VectorDot(b,m)),JSM.IsGreater(n,l)&&(h=k,l=n);if(-1===h)return d;b=null;0===h?b=new JSM.CoordSystem(c.origo,f,g,new JSM.Coord(0,0,0)):1===h?b=new JSM.CoordSystem(c.origo,e,g,new JSM.Coord(0,0,0)):2===h&&(b=new JSM.CoordSystem(c.origo,e,f,new JSM.Coord(0,0,0)));return null===
|
||||
b?d:JSM.CalculatePlanarTextureCoord(a,b)};JSM.CalculateCylindricalTextureCoord=function(a,b,c){var d=new JSM.Coord2D(0,0),e=c.e3.Clone().Normalize();if(e.IsCollinearWith(b))return d=JSM.CalculateCubicTextureCoord(a,b,c),[d,0];var f=(new JSM.Line(c.origo,e)).ProjectCoord(a);b=JSM.CoordSignedDistance(c.origo,f,e);var g=c.e1.Clone().Normalize();a=JSM.CoordSub(a,f);e=JSM.GetVectorsFullAngle(a,g,e);c=c.e1.Length();d.x=e*c;d.y=b;return[d,e]};
|
||||
JSM.CalculatePolygonPlanarTextureCoords=function(a,b){var c=[],d=a.GetPolygon(b),e=a.GetTextureProjectionCoords(),f,g;for(f=0;f<d.VertexIndexCount();f++)g=a.GetVertexPosition(d.GetVertexIndex(f)),c.push(JSM.CalculatePlanarTextureCoord(g,e));return c};JSM.CalculatePolygonCubicTextureCoords=function(a,b,c){var d=[];b=a.GetPolygon(b);var e=a.GetTextureProjectionCoords(),f,g;for(f=0;f<b.VertexIndexCount();f++)g=a.GetVertexPosition(b.GetVertexIndex(f)),d.push(JSM.CalculateCubicTextureCoord(g,c,e));return d};
|
||||
JSM.CalculatePolygonCylindricalTextureCoords=function(a,b,c){var d=[],e=[],f=a.GetPolygon(b),g=a.GetTextureProjectionCoords(),h;for(b=0;b<f.VertexIndexCount();b++)h=a.GetVertexPosition(f.GetVertexIndex(b)),h=JSM.CalculateCylindricalTextureCoord(h,c,g),d.push(h[0]),e.push(h[1]);if(g.e3.Clone().Normalize().IsCollinearWith(c))return d;c=!1;for(b=0;b<e.length;b++){for(a=b+1;a<e.length;a++)if(JSM.IsGreater(Math.abs(e[b]-e[a]),Math.PI)){c=!0;break}if(c)break}if(c){g=g.e1.Length();for(b=0;b<e.length;b++)JSM.IsLower(e[b],
|
||||
Math.PI)&&(d[b].x=g*(e[b]+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));s.push(a)}function e(c,d){t=JSM.CoordSub(a[d],a[c]).Normalize();J=new JSM.Line(a[c],t);I=b.LineIntersection(J);q.push(new JSM.Coord(I.x,I.y,I.z));s.push(-1)}var f=void 0!==c&&null!==c,g=a.length,h=[],l=[],k=!1,n,m,p;for(n=0;n<g;n++)p=a[n],m=b.CoordPosition(p),l.push(m!==JSM.CoordPlanePosition.CoordAtBackOfPlane),0<n&&l[n-1]!==l[n]&&(k=!0);if(!k){if(!1===l[0])return h;for(n=0;n<g;n++)p=a[n],h.push(new JSM.Coord(p.x,
|
||||
p.y,p.z)),f&&c.push(n);return h}var q=[],s=[],t,J,I;for(n=0;n<g;n++)k=n-1,m=n,0===n&&(k=g-1),p=a[m],l[m]?(l[k]||e(k,m),d(m)):l[k]&&e(k,m);for(n=0;n<q.length;n++)g=q[n],l=h[h.length-1],0===n||!l.IsEqual(g)?(h.push(new JSM.Coord(g.x,g.y,g.z)),f&&(g=s[n],c.push(g))):f&&(g=s[n],l=s[n-1],-1!==g?c[c.length-1]=g:-1!==l&&(c[c.length-1]=l));return h}function d(a){var b=-1,c;for(c=s;c<e.VertexCount();c++)if(a.IsEqual(e.GetVertexPosition(c))){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=[],h=[],g=[],l=[],k,m,n,p,q;for(k=0;k<a.PolygonCount();k++){n=a.GetPolygon(k);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]&&(g[n.GetVertexIndex(q[m])]=!0);f.push(p);h.push(q)}var t;for(k=0;k<a.VertexCount();k++)g[k]&&(t=a.GetVertexPosition(k),l[k]=e.AddVertex(new JSM.BodyVertex(new JSM.Coord(t.x,t.y,t.z))));var s=e.VertexCount();for(k=
|
||||
0;k<a.PolygonCount();k++)if(n=a.GetPolygon(k),p=f[k],q=h[k],0!==q.length){g=[];for(m=0;m<q.length;m++)-1!==q[m]?g.push(l[n.GetVertexIndex(q[m])]):(t=p[m],g.push(d(t)));m=new JSM.BodyPolygon(g);m.InheritAttributes(n);e.AddPolygon(m)}return e};
|
||||
a.y,a.z))));return b}var e=new JSM.Body,f=[],g=[],h=[],l=[],k,m,n,p,q;for(k=0;k<a.PolygonCount();k++){n=a.GetPolygon(k);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 t;for(k=0;k<a.VertexCount();k++)h[k]&&(t=a.GetVertexPosition(k),l[k]=e.AddVertex(new JSM.BodyVertex(new JSM.Coord(t.x,t.y,t.z))));var s=e.VertexCount();for(k=
|
||||
0;k<a.PolygonCount();k++)if(n=a.GetPolygon(k),p=f[k],q=g[k],0!==q.length){h=[];for(m=0;m<q.length;m++)-1!==q[m]?h.push(l[n.GetVertexIndex(q[m])]):(t=p[m],h.push(d(t)));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,
|
||||
b,c)));d.AddPolygon(new JSM.BodyPolygon([0,1,2,3]));d.AddPolygon(new JSM.BodyPolygon([1,5,6,2]));d.AddPolygon(new JSM.BodyPolygon([5,4,7,6]));d.AddPolygon(new JSM.BodyPolygon([4,0,3,7]));d.AddPolygon(new JSM.BodyPolygon([0,4,5,1]));d.AddPolygon(new JSM.BodyPolygon([3,2,6,7]));d.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 d};
|
||||
JSM.GenerateCuboidSides=function(a,b,c,d){var e=new JSM.Body;a/=2;b/=2;c/=2;e.AddVertex(new JSM.BodyVertex(new JSM.Coord(-a,-b,-c)));e.AddVertex(new JSM.BodyVertex(new JSM.Coord(a,-b,-c)));e.AddVertex(new JSM.BodyVertex(new JSM.Coord(a,-b,c)));e.AddVertex(new JSM.BodyVertex(new JSM.Coord(-a,-b,c)));e.AddVertex(new JSM.BodyVertex(new JSM.Coord(-a,b,-c)));e.AddVertex(new JSM.BodyVertex(new JSM.Coord(a,b,-c)));e.AddVertex(new JSM.BodyVertex(new JSM.Coord(a,b,c)));e.AddVertex(new JSM.BodyVertex(new JSM.Coord(-a,
|
||||
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,h=b/2,g=a/c,l=b/d;(function(){var a,b,n;for(a=0;a<=d;a++)for(b=0;b<=c;b++)n=new JSM.Coord(b*g-f,a*l-h,0),e.AddVertex(new JSM.BodyVertex(n))})();(function(){var a,b,f,g,h,l;for(b=0;b<d;b++)for(a=0;a<c;a++)f=b*(c+1)+a,g=f+1,h=f+c+1,l=h+1,e.AddPolygon(new JSM.BodyPolygon([f,g,l,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 h(a){var b,c,e=a*t;if(0===a||a===
|
||||
d)for(a=0;a<=d;a++)for(b=0;b<=d;b++)c=new JSM.Coord(b*p-k,a*q-m,e-n),l.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-k,a*q-m,e-n),l.AddVertex(new JSM.BodyVertex(c))}function g(a){var b,c,f,g,h,k;if(0===a||a===d){var n=e(a);for(b=0;b<d;b++)for(c=0;c<d;c++)f=n+b*(d+1)+c,g=f+1,h=f+d+1,k=h+1,0===a?l.AddPolygon(new JSM.BodyPolygon([f,h,k,g])):l.AddPolygon(new JSM.BodyPolygon([f,g,k,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],k=a[b+1]):(g=c[0],k=a[0]),l.AddPolygon(new JSM.BodyPolygon([f,g,k,h]))}}var l=new JSM.Body,k=a/2,m=b/2,n=c/2,p=a/d,q=b/d,t=c/d;for(a=0;a<=d;a++)h(a);var s=[];for(a=0;a<=d;a++)s.push(f(a));for(a=0;a<=d;a++)g(a);return l};
|
||||
JSM.GenerateSegmentedRectangle=function(a,b,c,d){var e=new JSM.Body,f=a/2,g=b/2,h=a/c,l=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*l-g,0),e.AddVertex(new JSM.BodyVertex(n))})();(function(){var a,b,f,g,h,l;for(b=0;b<d;b++)for(a=0;a<c;a++)f=b*(c+1)+a,g=f+1,h=f+c+1,l=h+1,e.AddPolygon(new JSM.BodyPolygon([f,g,l,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*t;if(0===a||a===
|
||||
d)for(a=0;a<=d;a++)for(b=0;b<=d;b++)c=new JSM.Coord(b*p-k,a*q-m,e-n),l.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-k,a*q-m,e-n),l.AddVertex(new JSM.BodyVertex(c))}function h(a){var b,c,f,g,h,k;if(0===a||a===d){var n=e(a);for(b=0;b<d;b++)for(c=0;c<d;c++)f=n+b*(d+1)+c,g=f+1,h=f+d+1,k=h+1,0===a?l.AddPolygon(new JSM.BodyPolygon([f,h,k,g])):l.AddPolygon(new JSM.BodyPolygon([f,g,k,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],k=a[b+1]):(g=c[0],k=a[0]),l.AddPolygon(new JSM.BodyPolygon([f,g,k,h]))}}var l=new JSM.Body,k=a/2,m=b/2,n=c/2,p=a/d,q=b/d,t=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 l};
|
||||
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))),h=Math.PI/b,g=h,l,k,m;for(l=1;l<b;l++){for(k=m=0;k<e;k++)d.AddVertex(new JSM.BodyVertex(JSM.SphericalToCartesian(a,g,m))),m+=h;g+=h}a=d.AddVertex(new JSM.BodyVertex(JSM.SphericalToCartesian(-a,0,0)));var n,p;for(l=1;l<=b;l++)if(1===l){h=1;for(k=0;k<e;k++)g=h+k,m=g+1,k===e-1&&(m=h),g=new JSM.BodyPolygon([g,m,f]),c&&g.SetCurveGroup(0),d.AddPolygon(g)}else if(l<b){h=(l-1)*e+
|
||||
1;for(k=0;k<e;k++)g=h+k,m=g+1,n=g-e,p=n+1,k===e-1&&(m=h,p=h-e),g=new JSM.BodyPolygon([g,m,p,n]),c&&g.SetCurveGroup(0),d.AddPolygon(g)}else if(l===b){h=(l-2)*e+1;for(k=0;k<e;k++)g=h+k,m=g+1,k===e-1&&(m=h),g=new JSM.BodyPolygon([g,a,m]),c&&g.SetCurveGroup(0),d.AddPolygon(g)}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};
|
||||
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,l,k,m;for(l=1;l<b;l++){for(k=m=0;k<e;k++)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(l=1;l<=b;l++)if(1===l){g=1;for(k=0;k<e;k++)h=g+k,m=h+1,k===e-1&&(m=g),h=new JSM.BodyPolygon([h,m,f]),c&&h.SetCurveGroup(0),d.AddPolygon(h)}else if(l<b){g=(l-1)*e+
|
||||
1;for(k=0;k<e;k++)h=g+k,m=h+1,n=h-e,p=n+1,k===e-1&&(m=g,p=g-e),h=new JSM.BodyPolygon([h,m,p,n]),c&&h.SetCurveGroup(0),d.AddPolygon(h)}else if(l===b){g=(l-2)*e+1;for(k=0;k<e;k++)h=g+k,m=h+1,k===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};
|
||||
JSM.GenerateTriangulatedSphere=function(a,b,c){var d;d=new JSM.Body;var e=(1+Math.sqrt(5))/2;JSM.AddVertexToBody(d,0,1,+e);JSM.AddVertexToBody(d,0,1,-e);JSM.AddVertexToBody(d,0,-1,+e);JSM.AddVertexToBody(d,0,-1,-e);JSM.AddVertexToBody(d,1,+e,0);JSM.AddVertexToBody(d,1,-e,0);JSM.AddVertexToBody(d,-1,+e,0);JSM.AddVertexToBody(d,-1,-e,0);JSM.AddVertexToBody(d,+e,0,1);JSM.AddVertexToBody(d,-e,0,1);JSM.AddVertexToBody(d,+e,0,-1);JSM.AddVertexToBody(d,-e,0,-1);JSM.AddPolygonToBody(d,[0,2,8]);JSM.AddPolygonToBody(d,
|
||||
[0,4,6]);JSM.AddPolygonToBody(d,[0,6,9]);JSM.AddPolygonToBody(d,[0,8,4]);JSM.AddPolygonToBody(d,[0,9,2]);JSM.AddPolygonToBody(d,[1,3,11]);JSM.AddPolygonToBody(d,[1,4,10]);JSM.AddPolygonToBody(d,[1,6,4]);JSM.AddPolygonToBody(d,[1,10,3]);JSM.AddPolygonToBody(d,[1,11,6]);JSM.AddPolygonToBody(d,[2,5,8]);JSM.AddPolygonToBody(d,[2,7,5]);JSM.AddPolygonToBody(d,[2,9,7]);JSM.AddPolygonToBody(d,[3,5,7]);JSM.AddPolygonToBody(d,[3,7,11]);JSM.AddPolygonToBody(d,[3,10,5]);JSM.AddPolygonToBody(d,[4,8,10]);JSM.AddPolygonToBody(d,
|
||||
[6,11,9]);JSM.AddPolygonToBody(d,[5,10,8]);JSM.AddPolygonToBody(d,[7,9,11]);for(var e=d.GetVertexPosition(0).Length(),f=a/e,h,g,e=0;e<d.VertexCount();e++)g=d.GetVertex(e),g.position.MultiplyScalar(f);for(var l,k,m,n,f=0;f<b;f++){h=d;d=new JSM.Body;g=JSM.CalculateAdjacencyInfo(h);for(e=0;e<g.verts.length;e++)l=h.GetVertexPosition(e),JSM.AddVertexToBody(d,l.x,l.y,l.z);l=[];for(e=0;e<g.edges.length;e++)k=g.edges[e],k=JSM.MidCoord(h.GetVertexPosition(k.vert1),h.GetVertexPosition(k.vert2)),l.push(d.AddVertex(new JSM.BodyVertex(k.SetLength(a))));
|
||||
for(e=0;e<g.pgons.length;e++){k=g.pgons[e];m=[];for(h=0;h<k.pedges.length;h++)n=k.pedges[h],m.push(JSM.GetPolyEdgeStartVertex(n,g)),m.push(l[n.index]);JSM.AddPolygonToBody(d,[m[0],m[1],m[5]]);JSM.AddPolygonToBody(d,[m[1],m[2],m[3]]);JSM.AddPolygonToBody(d,[m[3],m[4],m[5]]);JSM.AddPolygonToBody(d,[m[1],m[3],m[5]])}}if(c)for(e=0;e<d.PolygonCount();e++)d.GetPolygon(e).SetCurveGroup(0);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};
|
||||
JSM.GenerateCylinder=function(a,b,c,d,e){var f=new JSM.Body,h=2*Math.PI,g=2*Math.PI/c,l;for(l=0;l<c;l++)f.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,b/2,h))),f.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,-b/2,h))),h-=g;for(l=0;l<c;l++)h=2*l,g=h+2,l===c-1&&(g=0),h=new JSM.BodyPolygon([h,g,g+1,h+1]),e&&h.SetCurveGroup(0),f.AddPolygon(h);if(d){d=new JSM.BodyPolygon([]);e=new JSM.BodyPolygon([]);for(l=0;l<c;l++)d.AddVertexIndex(2*(c-l-1)),e.AddVertexIndex(2*l+1);f.AddPolygon(d);
|
||||
[6,11,9]);JSM.AddPolygonToBody(d,[5,10,8]);JSM.AddPolygonToBody(d,[7,9,11]);for(var e=d.GetVertexPosition(0).Length(),f=a/e,g,h,e=0;e<d.VertexCount();e++)h=d.GetVertex(e),h.position.MultiplyScalar(f);for(var l,k,m,n,f=0;f<b;f++){g=d;d=new JSM.Body;h=JSM.CalculateAdjacencyInfo(g);for(e=0;e<h.verts.length;e++)l=g.GetVertexPosition(e),JSM.AddVertexToBody(d,l.x,l.y,l.z);l=[];for(e=0;e<h.edges.length;e++)k=h.edges[e],k=JSM.MidCoord(g.GetVertexPosition(k.vert1),g.GetVertexPosition(k.vert2)),l.push(d.AddVertex(new JSM.BodyVertex(k.SetLength(a))));
|
||||
for(e=0;e<h.pgons.length;e++){k=h.pgons[e];m=[];for(g=0;g<k.pedges.length;g++)n=k.pedges[g],m.push(JSM.GetPolyEdgeStartVertex(n,h)),m.push(l[n.index]);JSM.AddPolygonToBody(d,[m[0],m[1],m[5]]);JSM.AddPolygonToBody(d,[m[1],m[2],m[3]]);JSM.AddPolygonToBody(d,[m[3],m[4],m[5]]);JSM.AddPolygonToBody(d,[m[1],m[3],m[5]])}}if(c)for(e=0;e<d.PolygonCount();e++)d.GetPolygon(e).SetCurveGroup(0);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};
|
||||
JSM.GenerateCylinder=function(a,b,c,d,e){var f=new JSM.Body,g=2*Math.PI,h=2*Math.PI/c,l;for(l=0;l<c;l++)f.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,b/2,g))),f.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,-b/2,g))),g-=h;for(l=0;l<c;l++)g=2*l,h=g+2,l===c-1&&(h=0),g=new JSM.BodyPolygon([g,h,h+1,g+1]),e&&g.SetCurveGroup(0),f.AddPolygon(g);if(d){d=new JSM.BodyPolygon([]);e=new JSM.BodyPolygon([]);for(l=0;l<c;l++)d.AddVertexIndex(2*(c-l-1)),e.AddVertexIndex(2*l+1);f.AddPolygon(d);
|
||||
f.AddPolygon(e)}f.SetCylindricalTextureProjection(new JSM.Coord(0,0,-(b/2)),a,new JSM.Coord(1,0,0),new JSM.Coord(0,0,1));return f};
|
||||
JSM.GeneratePie=function(a,b,c,d,e,f){var h=new JSM.Body,g=c,l=c/(d-1);h.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(0,b/2,0)));h.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(0,-b/2,0)));for(c=0;c<d;c++)h.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,b/2,g))),h.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,-b/2,g))),g-=l;for(c=0;c<=d;c++)g=2*c,l=g+2,c===d&&(l=0),g=new JSM.BodyPolygon([g,l,l+1,g+1]),f&&(0<c&&c<d)&&g.SetCurveGroup(0),h.AddPolygon(g);if(e){e=
|
||||
new JSM.BodyPolygon([]);f=new JSM.BodyPolygon([]);for(c=0;c<=d;c++)e.AddVertexIndex(2*(d-c)),f.AddVertexIndex(2*c+1);h.AddPolygon(e);h.AddPolygon(f)}h.SetCylindricalTextureProjection(new JSM.Coord(0,0,-(b/2)),a,new JSM.Coord(1,0,0),new JSM.Coord(0,0,1));return h};
|
||||
JSM.GenerateCone=function(a,b,c,d,e,f){var h=new JSM.Body,g=JSM.IsZero(a),l=JSM.IsZero(b),k=2*Math.PI,m=2*Math.PI/d;g&&h.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(0,c/2,0)));var n;for(n=0;n<d;n++)g||h.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,c/2,k))),l||h.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(b,-c/2,k))),k-=m;l&&h.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(0,-c/2,0)));for(n=0;n<d;n++)g?(k=n+1,m=k+1,n===d-1&&(m=1),k=new JSM.BodyPolygon([0,
|
||||
m,k])):l?(k=n,m=k+1,n===d-1&&(m=0),k=new JSM.BodyPolygon([k,m,d])):(k=2*n,m=k+2,n===d-1&&(m=0),k=new JSM.BodyPolygon([k,m,m+1,k+1])),f&&k.SetCurveGroup(0),h.AddPolygon(k);if(e)if(g){f=new JSM.BodyPolygon([]);for(n=0;n<d;n++)f.AddVertexIndex(n+1);h.AddPolygon(f)}else if(l){e=new JSM.BodyPolygon([]);for(n=0;n<d;n++)e.AddVertexIndex(d-n-1);h.AddPolygon(e)}else{e=new JSM.BodyPolygon([]);f=new JSM.BodyPolygon([]);for(n=0;n<d;n++)e.AddVertexIndex(2*(d-n-1)),f.AddVertexIndex(2*n+1);h.AddPolygon(e);h.AddPolygon(f)}h.SetCylindricalTextureProjection(new JSM.Coord(0,
|
||||
0,-(c/2)),(a+b)/2,new JSM.Coord(1,0,0),new JSM.Coord(0,0,1));return h};
|
||||
JSM.GeneratePrism=function(a,b,c,d,e){var f=new JSM.Body,h=new JSM.Polygon;h.FromArray(a);a=h.VertexCount();var g=null;void 0!==e&&null!==e&&(g=JSM.CalculatePolygonCurveGroups(h,e));for(e=0;e<a;e++)f.AddVertex(new JSM.BodyVertex(h.GetVertex(e).Clone())),f.AddVertex(new JSM.BodyVertex(h.GetVertex(e).Clone().Clone().Offset(b,c)));var l;for(e=0;e<a;e++)c=2*e,l=c+2,e===a-1&&(l=0),c=new JSM.BodyPolygon([c,l,l+1,c+1]),null!==g&&c.SetCurveGroup(g[e]),f.AddPolygon(c);if(d){d=new JSM.BodyPolygon([]);g=new JSM.BodyPolygon([]);
|
||||
for(e=0;e<a;e++)d.AddVertexIndex(2*e+1),g.AddVertexIndex(2*(a-e-1));f.AddPolygon(d);f.AddPolygon(g)}a=h.GetVertex(0).Clone();h=h.GetVertex(1).Clone();h=JSM.CoordSub(h,a).Normalize();b=b.Clone().Normalize();h=JSM.VectorCross(b,h);d=JSM.VectorCross(h,b);f.SetCubicTextureProjection(a,d,h,b);return f};
|
||||
JSM.GeneratePrismWithHole=function(a,b,c,d,e){function f(a,b){var c=[],d=a.ToContourPolygon2D(),d=JSM.ConvertContourPolygonToPolygon2D(d,c);if(null!==d&&(d=JSM.TriangulatePolygon2D(d),null!==d)){var e,f,g,l,u,r;for(e=0;e<d.length;e++){g=d[e];u=new JSM.BodyPolygon([]);r=new JSM.BodyPolygon([]);for(f=0;3>f;f++)l=c[g[f]],u.AddVertexIndex(2*b[l[0]]+2*l[1]+1),l=c[g[2-f]],r.AddVertexIndex(2*b[l[0]]+2*l[1]);h.AddPolygon(u);h.AddPolygon(r)}}}var h=new JSM.Body,g=[],l=new JSM.ContourPolygon;l.FromArray(a);
|
||||
(function(a,b,c,d){var e,f,g,h,l;for(e=0;e<a.ContourCount();e++){g=a.GetContour(e);for(f=0;f<g.VertexCount();f++)h=g.GetVertex(f).Clone(),l=g.GetVertex(f).Clone().Offset(b,c),d.AddVertex(new JSM.BodyVertex(h)),d.AddVertex(new JSM.BodyVertex(l))}})(l,b,c,h);(function(a,b,c,d){var e=0,f,g,h,l,r,v;for(f=0;f<a.ContourCount();f++){g=a.GetContour(f);v=null;void 0!==c&&null!==c&&(v=JSM.CalculatePolygonCurveGroups(g,c));h=g.VertexCount();b.push(e);for(g=0;g<h;g++)l=2*e+2*g,r=l+2,g==h-1&&(r=2*e),l=new JSM.BodyPolygon([l,
|
||||
r,r+1,l+1]),null!==v&&l.SetCurveGroup(v[g]),d.AddPolygon(l);e+=h}})(l,g,e,h);d&&f(l,g);c=JSM.CoordSub(a[1],a[0]).Normalize();a=new JSM.Coord(a[0].x,a[0].y,a[0].z);b=b.Clone().Normalize();c=JSM.VectorCross(b,c);d=JSM.VectorCross(c,b);h.SetCubicTextureProjection(a,d,c,b);return h};
|
||||
JSM.GeneratePrismShell=function(a,b,c,d,e){var f=new JSM.Body,h=a.length,g;for(g=0;g<h;g++)f.AddVertex(new JSM.BodyVertex(a[g]));g=new JSM.Polygon;g.vertices=a;d=JSM.OffsetPolygonContour(g,d).vertices;for(g=0;g<h;g++)f.AddVertex(new JSM.BodyVertex(d[g]));var l;for(g=0;g<h;g++)l=a[g].Clone().Offset(b,c),f.AddVertex(new JSM.BodyVertex(l));for(g=0;g<h;g++)l=d[g].Clone().Offset(b,c),f.AddVertex(new JSM.BodyVertex(l));var k;for(g=0;g<h;g++)c=g,d=c+1,l=c+2*h,k=l+1,g===h-1&&(d=0,k=2*h),f.AddPolygon(new JSM.BodyPolygon([c,
|
||||
d,k,l])),f.AddPolygon(new JSM.BodyPolygon([c+h,l+h,k+h,d+h]));if(e)for(g=0;g<h;g++)c=g,d=c+1,l=g+h,k=l+1,g===h-1&&(d=0,k=h),f.AddPolygon(new JSM.BodyPolygon([c,l,k,d])),f.AddPolygon(new JSM.BodyPolygon([c+2*h,d+2*h,k+2*h,l+2*h]));e=JSM.CoordSub(a[1],a[0]).Normalize();a=new JSM.Coord(a[0].x,a[0].y,a[0].z);b=b.Clone().Normalize();e=JSM.VectorCross(b,e);h=JSM.VectorCross(e,b);f.SetCubicTextureProjection(a,h,e,b);return f};
|
||||
JSM.GenerateCylinderShell=function(a,b,c,d,e,f){for(var h=new JSM.Vector(0,0,1),g=-b/2,l=[],k=2*Math.PI/d,m,n=0,n=0;n<d;n++)m=n*k,m=JSM.PolarToCartesian(a,m),l.push(new JSM.Coord(m.x,m.y,g));a=JSM.GeneratePrismShell(l,h,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 h=new JSM.Body,g=a.length,l=[],k,m,n,p,q,t;for(k=0;k<g;k++)0===k||k===g-1?q=Math.PI/2:(m=k-1,n=k,p=k+1,t=JSM.CoordSub(a[p],a[n]),q=JSM.CoordSub(a[m],a[n]),q=t.AngleTo(q)/2,JSM.CoordOrientation(a[m],a[n],a[p],b)==JSM.Orientation.Clockwise&&(q=Math.PI-q)),l.push(q);t=new JSM.Vector(0,0,1);m=[];var s,w;for(k=0;k<g;k++)n=k,k===g-1?w=JSM.CoordSub(a[n-1],a[n]):(p=(k+1)%g,w=JSM.CoordSub(a[n],a[p])),q=l[n],p=d/Math.sin(q),s=a[n].Clone(),s.Offset(w,p),s.Rotate(t,
|
||||
-(Math.PI-q),a[n]),m.push(s);for(k=0;k<g;k++)h.AddVertex(new JSM.BodyVertex(a[k]));for(k=0;k<g;k++)h.AddVertex(new JSM.BodyVertex(m[k]));for(k=0;k<g;k++)n=a[k].Clone().Offset(b,c),h.AddVertex(new JSM.BodyVertex(n));for(k=0;k<g;k++)n=m[k].Clone().Offset(b,c),h.AddVertex(new JSM.BodyVertex(n));for(k=0;k<g-1;k++)n=k,p=n+1,c=n+2*g,d=c+1,h.AddPolygon(new JSM.BodyPolygon([n,p,d,c])),h.AddPolygon(new JSM.BodyPolygon([n+g,c+g,d+g,p+g]));e&&(n=0,h.AddPolygon(new JSM.BodyPolygon([n,n+2*g,n+3*g,n+g])),n=g-1,
|
||||
h.AddPolygon(new JSM.BodyPolygon([n,n+g,n+3*g,n+2*g])));if(f)for(k=0;k<g-1;k++)n=k,p=n+1,c=k+g,d=c+1,h.AddPolygon(new JSM.BodyPolygon([n,c,d,p])),h.AddPolygon(new JSM.BodyPolygon([n+2*g,p+2*g,d+2*g,c+2*g]));e=JSM.CoordSub(a[1],a[0]).Normalize();a=new JSM.Coord(a[0].x,a[0].y,a[0].z);b=b.Clone().Normalize();e=JSM.VectorCross(b,e);f=JSM.VectorCross(e,b);h.SetCubicTextureProjection(a,f,e,b);return h};
|
||||
JSM.GenerateTorus=function(a,b,c,d,e){var f=new JSM.Body,h=0,g=2*Math.PI/d,l=[],k,m;for(k=0;k<d;k++)m=JSM.PolarToCartesian(b,h),m=new JSM.Coord(m.x+a,0,m.y),l.push(m),h+=g;b=new JSM.Coord(0,0,1);h=new JSM.Coord(0,0,0);g=2*Math.PI/c;for(k=0;k<c;k++)for(a=0;a<d;a++)m=l[a].Clone().Rotate(b,k*g,h),f.AddVertex(new JSM.BodyVertex(m));for(k=0;k<c;k++){new JSM.BodyPolygon([]);for(a=0;a<d;a++)g=k*d+a,b=g+d,l=g+1,h=b+1,a===d-1&&(l=k*d,h=(k+1)*d),k===c-1&&(b=a,h=a+1,a===d-1&&(h=0)),g=new JSM.BodyPolygon([g,
|
||||
b,h,l]),e&&g.SetCurveGroup(0),f.AddPolygon(g)}f.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 f};
|
||||
JSM.GeneratePolyTorus=function(a,b,c,d){var e=new JSM.Body,f=a.length,h=2*Math.PI/f,g=[],l;for(l=0;l<f;l++)h=a[l],h=new JSM.Coord(h.x+b,0,h.y),g.push(h);b=new JSM.Coord(0,0,1);var k=new JSM.Coord(0,0,0),h=2*Math.PI/c,m;for(l=0;l<c;l++)for(a=0;a<f;a++)m=g[a].Clone().Rotate(b,l*h,k),e.AddVertex(new JSM.BodyVertex(m));for(l=0;l<c;l++){new JSM.BodyPolygon([]);for(a=0;a<f;a++)g=l*f+a,b=g+f,h=g+1,k=b+1,a===f-1&&(h=l*f,k=(l+1)*f),l===c-1&&(b=a,k=a+1,a===f-1&&(k=0)),g=new JSM.BodyPolygon([g,b,k,h]),d&&g.SetCurveGroup(a),
|
||||
e.AddPolygon(g)}e.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 e};
|
||||
JSM.GenerateRuledFromSectors=function(a,b,c,d,e){var f=new JSM.Body,h=[],g=[];JSM.GetSectorSegmentation(a,c,h);JSM.GetSectorSegmentation(b,c,g);b=[];a=[];JSM.GetRuledMesh(h,g,d,b,a);for(d=0;d<b.length;d++)f.AddVertex(new JSM.BodyVertex(b[d]));for(d=0;d<a.length;d++)h=a[d],h=new JSM.BodyPolygon(h),e&&h.SetCurveGroup(0),f.AddPolygon(h);f.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 f};
|
||||
JSM.GeneratePie=function(a,b,c,d,e,f){var g=new JSM.Body,h=c,l=c/(d-1);g.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(0,b/2,0)));g.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(0,-b/2,0)));for(c=0;c<d;c++)g.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,b/2,h))),g.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,-b/2,h))),h-=l;for(c=0;c<=d;c++)h=2*c,l=h+2,c===d&&(l=0),h=new JSM.BodyPolygon([h,l,l+1,h+1]),f&&(0<c&&c<d)&&h.SetCurveGroup(0),g.AddPolygon(h);if(e){e=
|
||||
new JSM.BodyPolygon([]);f=new JSM.BodyPolygon([]);for(c=0;c<=d;c++)e.AddVertexIndex(2*(d-c)),f.AddVertexIndex(2*c+1);g.AddPolygon(e);g.AddPolygon(f)}g.SetCylindricalTextureProjection(new JSM.Coord(0,0,-(b/2)),a,new JSM.Coord(1,0,0),new JSM.Coord(0,0,1));return g};
|
||||
JSM.GenerateCone=function(a,b,c,d,e,f){var g=new JSM.Body,h=JSM.IsZero(a),l=JSM.IsZero(b),k=2*Math.PI,m=2*Math.PI/d;h&&g.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(0,c/2,0)));var n;for(n=0;n<d;n++)h||g.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(a,c/2,k))),l||g.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(b,-c/2,k))),k-=m;l&&g.AddVertex(new JSM.BodyVertex(JSM.CylindricalToCartesian(0,-c/2,0)));for(n=0;n<d;n++)h?(k=n+1,m=k+1,n===d-1&&(m=1),k=new JSM.BodyPolygon([0,
|
||||
m,k])):l?(k=n,m=k+1,n===d-1&&(m=0),k=new JSM.BodyPolygon([k,m,d])):(k=2*n,m=k+2,n===d-1&&(m=0),k=new JSM.BodyPolygon([k,m,m+1,k+1])),f&&k.SetCurveGroup(0),g.AddPolygon(k);if(e)if(h){f=new JSM.BodyPolygon([]);for(n=0;n<d;n++)f.AddVertexIndex(n+1);g.AddPolygon(f)}else if(l){e=new JSM.BodyPolygon([]);for(n=0;n<d;n++)e.AddVertexIndex(d-n-1);g.AddPolygon(e)}else{e=new JSM.BodyPolygon([]);f=new JSM.BodyPolygon([]);for(n=0;n<d;n++)e.AddVertexIndex(2*(d-n-1)),f.AddVertexIndex(2*n+1);g.AddPolygon(e);g.AddPolygon(f)}g.SetCylindricalTextureProjection(new JSM.Coord(0,
|
||||
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,e){var f=new JSM.Body,g=new JSM.Polygon;g.FromArray(a);a=g.VertexCount();var h=null;void 0!==e&&null!==e&&(h=JSM.CalculatePolygonCurveGroups(g,e));for(e=0;e<a;e++)f.AddVertex(new JSM.BodyVertex(g.GetVertex(e).Clone())),f.AddVertex(new JSM.BodyVertex(g.GetVertex(e).Clone().Clone().Offset(b,c)));var l;for(e=0;e<a;e++)c=2*e,l=c+2,e===a-1&&(l=0),c=new JSM.BodyPolygon([c,l,l+1,c+1]),null!==h&&c.SetCurveGroup(h[e]),f.AddPolygon(c);if(d){d=new JSM.BodyPolygon([]);h=new JSM.BodyPolygon([]);
|
||||
for(e=0;e<a;e++)d.AddVertexIndex(2*e+1),h.AddVertexIndex(2*(a-e-1));f.AddPolygon(d);f.AddPolygon(h)}a=g.GetVertex(0).Clone();g=g.GetVertex(1).Clone();g=JSM.CoordSub(g,a).Normalize();b=b.Clone().Normalize();g=JSM.VectorCross(b,g);d=JSM.VectorCross(g,b);f.SetCubicTextureProjection(a,d,g,b);return f};
|
||||
JSM.GeneratePrismWithHole=function(a,b,c,d,e){function f(a,b){var c=[],d=a.ToContourPolygon2D(),d=JSM.ConvertContourPolygonToPolygon2D(d,c);if(null!==d&&(d=JSM.TriangulatePolygon2D(d),null!==d)){var e,f,h,l,u,r;for(e=0;e<d.length;e++){h=d[e];u=new JSM.BodyPolygon([]);r=new JSM.BodyPolygon([]);for(f=0;3>f;f++)l=c[h[f]],u.AddVertexIndex(2*b[l[0]]+2*l[1]+1),l=c[h[2-f]],r.AddVertexIndex(2*b[l[0]]+2*l[1]);g.AddPolygon(u);g.AddPolygon(r)}}}var g=new JSM.Body,h=[],l=new JSM.ContourPolygon;l.FromArray(a);
|
||||
(function(a,b,c,d){var e,f,g,h,l;for(e=0;e<a.ContourCount();e++){g=a.GetContour(e);for(f=0;f<g.VertexCount();f++)h=g.GetVertex(f).Clone(),l=g.GetVertex(f).Clone().Offset(b,c),d.AddVertex(new JSM.BodyVertex(h)),d.AddVertex(new JSM.BodyVertex(l))}})(l,b,c,g);(function(a,b,c,d){var e=0,f,g,h,l,r,v;for(f=0;f<a.ContourCount();f++){g=a.GetContour(f);v=null;void 0!==c&&null!==c&&(v=JSM.CalculatePolygonCurveGroups(g,c));h=g.VertexCount();b.push(e);for(g=0;g<h;g++)l=2*e+2*g,r=l+2,g==h-1&&(r=2*e),l=new JSM.BodyPolygon([l,
|
||||
r,r+1,l+1]),null!==v&&l.SetCurveGroup(v[g]),d.AddPolygon(l);e+=h}})(l,h,e,g);d&&f(l,h);c=JSM.CoordSub(a[1],a[0]).Normalize();a=new JSM.Coord(a[0].x,a[0].y,a[0].z);b=b.Clone().Normalize();c=JSM.VectorCross(b,c);d=JSM.VectorCross(c,b);g.SetCubicTextureProjection(a,d,c,b);return g};
|
||||
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 l;for(h=0;h<g;h++)l=a[h].Clone().Offset(b,c),f.AddVertex(new JSM.BodyVertex(l));for(h=0;h<g;h++)l=d[h].Clone().Offset(b,c),f.AddVertex(new JSM.BodyVertex(l));var k;for(h=0;h<g;h++)c=h,d=c+1,l=c+2*g,k=l+1,h===g-1&&(d=0,k=2*g),f.AddPolygon(new JSM.BodyPolygon([c,
|
||||
d,k,l])),f.AddPolygon(new JSM.BodyPolygon([c+g,l+g,k+g,d+g]));if(e)for(h=0;h<g;h++)c=h,d=c+1,l=h+g,k=l+1,h===g-1&&(d=0,k=g),f.AddPolygon(new JSM.BodyPolygon([c,l,k,d])),f.AddPolygon(new JSM.BodyPolygon([c+2*g,d+2*g,k+2*g,l+2*g]));e=JSM.CoordSub(a[1],a[0]).Normalize();a=new JSM.Coord(a[0].x,a[0].y,a[0].z);b=b.Clone().Normalize();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,l=[],k=2*Math.PI/d,m,n=0,n=0;n<d;n++)m=n*k,m=JSM.PolarToCartesian(a,m),l.push(new JSM.Coord(m.x,m.y,h));a=JSM.GeneratePrismShell(l,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,l=[],k,m,n,p,q,t;for(k=0;k<h;k++)0===k||k===h-1?q=Math.PI/2:(m=k-1,n=k,p=k+1,t=JSM.CoordSub(a[p],a[n]),q=JSM.CoordSub(a[m],a[n]),q=t.AngleTo(q)/2,JSM.CoordOrientation(a[m],a[n],a[p],b)==JSM.Orientation.Clockwise&&(q=Math.PI-q)),l.push(q);t=new JSM.Vector(0,0,1);m=[];var s,w;for(k=0;k<h;k++)n=k,k===h-1?w=JSM.CoordSub(a[n-1],a[n]):(p=(k+1)%h,w=JSM.CoordSub(a[n],a[p])),q=l[n],p=d/Math.sin(q),s=a[n].Clone(),s.Offset(w,p),s.Rotate(t,
|
||||
-(Math.PI-q),a[n]),m.push(s);for(k=0;k<h;k++)g.AddVertex(new JSM.BodyVertex(a[k]));for(k=0;k<h;k++)g.AddVertex(new JSM.BodyVertex(m[k]));for(k=0;k<h;k++)n=a[k].Clone().Offset(b,c),g.AddVertex(new JSM.BodyVertex(n));for(k=0;k<h;k++)n=m[k].Clone().Offset(b,c),g.AddVertex(new JSM.BodyVertex(n));for(k=0;k<h-1;k++)n=k,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(k=0;k<h-1;k++)n=k,p=n+1,c=k+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.CoordSub(a[1],a[0]).Normalize();a=new JSM.Coord(a[0].x,a[0].y,a[0].z);b=b.Clone().Normalize();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,l=[],k,m;for(k=0;k<d;k++)m=JSM.PolarToCartesian(b,g),m=new JSM.Coord(m.x+a,0,m.y),l.push(m),g+=h;b=new JSM.Coord(0,0,1);g=new JSM.Coord(0,0,0);h=2*Math.PI/c;for(k=0;k<c;k++)for(a=0;a<d;a++)m=l[a].Clone().Rotate(b,k*h,g),f.AddVertex(new JSM.BodyVertex(m));for(k=0;k<c;k++){new JSM.BodyPolygon([]);for(a=0;a<d;a++)h=k*d+a,b=h+d,l=h+1,g=b+1,a===d-1&&(l=k*d,g=(k+1)*d),k===c-1&&(b=a,g=a+1,a===d-1&&(g=0)),h=new JSM.BodyPolygon([h,
|
||||
b,g,l]),e&&h.SetCurveGroup(0),f.AddPolygon(h)}f.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 f};
|
||||
JSM.GeneratePolyTorus=function(a,b,c,d){var e=new JSM.Body,f=a.length,g=2*Math.PI/f,h=[],l;for(l=0;l<f;l++)g=a[l],g=new JSM.Coord(g.x+b,0,g.y),h.push(g);b=new JSM.Coord(0,0,1);var k=new JSM.Coord(0,0,0),g=2*Math.PI/c,m;for(l=0;l<c;l++)for(a=0;a<f;a++)m=h[a].Clone().Rotate(b,l*g,k),e.AddVertex(new JSM.BodyVertex(m));for(l=0;l<c;l++){new JSM.BodyPolygon([]);for(a=0;a<f;a++)h=l*f+a,b=h+f,g=h+1,k=b+1,a===f-1&&(g=l*f,k=(l+1)*f),l===c-1&&(b=a,k=a+1,a===f-1&&(k=0)),h=new JSM.BodyPolygon([h,b,k,g]),d&&h.SetCurveGroup(a),
|
||||
e.AddPolygon(h)}e.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 e};
|
||||
JSM.GenerateRuledFromSectors=function(a,b,c,d,e){var f=new JSM.Body,g=[],h=[];JSM.GetSectorSegmentation(a,c,g);JSM.GetSectorSegmentation(b,c,h);b=[];a=[];JSM.GetRuledMesh(g,h,d,b,a);for(d=0;d<b.length;d++)f.AddVertex(new JSM.BodyVertex(b[d]));for(d=0;d<a.length;d++)g=a[d],g=new JSM.BodyPolygon(g),e&&g.SetCurveGroup(0),f.AddPolygon(g);f.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 f};
|
||||
JSM.GenerateGrid=function(a,b,c,d,e){var f=new JSM.Sector(new JSM.Coord(0,0,0),new JSM.Coord(a,0,0));a=new JSM.Sector(new JSM.Coord(0,b,0),new JSM.Coord(a,b,0));return JSM.GenerateRuledFromSectors(f,a,c,d,e)};JSM.GenerateSquareGrid=function(a,b,c){return JSM.GenerateGrid(a,a,b,b,c)};
|
||||
JSM.GenerateRuledFromSectorsWithHeight=function(a,b,c,d,e,f){var h=new JSM.Body,g=[],l=[];JSM.GetSectorSegmentation(a,c,g);JSM.GetSectorSegmentation(b,c,l);b=[];a=[];JSM.GetRuledMesh(g,l,d,b,a);for(g=0;g<b.length;g++)h.AddVertex(new JSM.BodyVertex(b[g]));for(var k,g=0;g<a.length;g++)k=a[g],k=new JSM.BodyPolygon(k),e&&k.SetCurveGroup(0),h.AddPolygon(k);l=h.VertexCount();for(g=0;g<b.length;g++)k=b[g],k=new JSM.Coord(k.x,k.y,k.z),k.z-=f,h.AddVertex(new JSM.BodyVertex(k));for(g=0;g<a.length;g++){k=a[g];
|
||||
b=[];for(f=k.length-1;0<=f;f--)b.push(k[f]+l);k=new JSM.BodyPolygon(b);e&&k.SetCurveGroup(0);h.AddPolygon(k)}for(g=0;g<d;g++)e=g+l,f=e+1,a=e-l,b=a+1,k=new JSM.BodyPolygon([e,f,b,a]),h.AddPolygon(k);for(g=0;g<d;g++)e=g+c*(d+1)+l,f=e+1,a=e-l,b=a+1,k=new JSM.BodyPolygon([e,a,b,f]),h.AddPolygon(k);for(g=0;g<c;g++)e=g*(d+1)+l,f=e+d+1,a=e-l,b=a+d+1,k=new JSM.BodyPolygon([e,a,b,f]),h.AddPolygon(k);for(g=0;g<c;g++)e=(g+1)*d+g+l,f=e+d+1,a=e-l,b=a+d+1,k=new JSM.BodyPolygon([e,f,b,a]),h.AddPolygon(k);h.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 h};JSM.GenerateRuledFromCoords=function(a,b,c,d){var e=new JSM.Body,f=[],h=[];JSM.GetRuledMesh(a,b,c,f,h);for(a=0;a<f.length;a++)e.AddVertex(new JSM.BodyVertex(f[a]));for(a=0;a<h.length;a++)f=h[a],f=new JSM.BodyPolygon(f),d&&f.SetCurveGroup(0),e.AddPolygon(f);e.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 e};
|
||||
JSM.GenerateRevolved=function(a,b,c,d,e,f){var h=new JSM.Body,g=JSM.IsEqual(c,2*Math.PI),l=a.length,k=c/d;c=JSM.CoordSub(b.end,b.beg);var m,n,p;for(m=0;m<l;m++)for(n=0;n<=d;n++)g&&n===d||(p=a[m].Clone().Rotate(c,n*k,b.beg),h.AddVertex(new JSM.BodyVertex(p)));k=0;"CurveSegments"==f?k=1:"CurveAll"==f&&(k=2);var q,t;for(m=0;m<l-1;m++)for(n=0;n<d;n++)f=m*(d+1)+n,p=f+d+1,q=f+1,t=p+1,g&&(f=m*d+n,p=f+d,q=f+1,t=p+1,n===d-1&&(q=m*d,t=(m+1)*d)),f=new JSM.BodyPolygon([f,q,t,p]),1==k?f.SetCurveGroup(m):2==k&&
|
||||
f.SetCurveGroup(0),h.AddPolygon(f);if(g&&e){e=new JSM.BodyPolygon([]);g=new JSM.BodyPolygon([]);for(m=0;m<d;m++)e.AddVertexIndex(d*(l-1)+m),g.AddVertexIndex(d-m-1);h.AddPolygon(e);h.AddPolygon(g)}d=c.Clone().Normalize();g=new JSM.Line(b.beg,d);for(m=e=0;m<l;m++)n=g.ProjectCoord(a[m]),e+=n.DistanceTo(a[m]);e/=l;b=new JSM.Coord(b.beg.x,b.beg.y,b.beg.z);l=(new JSM.Line(b,c)).ProjectCoord(a[0]);a=JSM.CoordSub(a[0],l).Normalize();h.SetCylindricalTextureProjection(b,e,a,d);return h};
|
||||
JSM.GenerateTube=function(a,b){var c=new JSM.Body,d=a.length,e=a[0].length,f,h;for(h=0;h<e;h++)for(f=0;f<d;f++)c.AddVertex(new JSM.BodyVertex(a[f][h]));var g,l;for(h=0;h<d-1;h++)for(f=0;f<e;f++)g=h+d*f,l=g+d,f===e-1&&(l=h),c.AddPolygon(new JSM.BodyPolygon([g,l,l+1,g+1]));if(b){h=new JSM.BodyPolygon([]);g=new JSM.BodyPolygon([]);for(f=0;f<e;f++)h.AddVertexIndex(d*f+d-1);for(f=e-1;0<=f;f--)g.AddVertexIndex(d*f);c.AddPolygon(h);c.AddPolygon(g)}c.SetCubicTextureProjection(new JSM.Coord(0,0,0),new JSM.Coord(1,
|
||||
JSM.GenerateRuledFromSectorsWithHeight=function(a,b,c,d,e,f){var g=new JSM.Body,h=[],l=[];JSM.GetSectorSegmentation(a,c,h);JSM.GetSectorSegmentation(b,c,l);b=[];a=[];JSM.GetRuledMesh(h,l,d,b,a);for(h=0;h<b.length;h++)g.AddVertex(new JSM.BodyVertex(b[h]));for(var k,h=0;h<a.length;h++)k=a[h],k=new JSM.BodyPolygon(k),e&&k.SetCurveGroup(0),g.AddPolygon(k);l=g.VertexCount();for(h=0;h<b.length;h++)k=b[h],k=new JSM.Coord(k.x,k.y,k.z),k.z-=f,g.AddVertex(new JSM.BodyVertex(k));for(h=0;h<a.length;h++){k=a[h];
|
||||
b=[];for(f=k.length-1;0<=f;f--)b.push(k[f]+l);k=new JSM.BodyPolygon(b);e&&k.SetCurveGroup(0);g.AddPolygon(k)}for(h=0;h<d;h++)e=h+l,f=e+1,a=e-l,b=a+1,k=new JSM.BodyPolygon([e,f,b,a]),g.AddPolygon(k);for(h=0;h<d;h++)e=h+c*(d+1)+l,f=e+1,a=e-l,b=a+1,k=new JSM.BodyPolygon([e,a,b,f]),g.AddPolygon(k);for(h=0;h<c;h++)e=h*(d+1)+l,f=e+d+1,a=e-l,b=a+d+1,k=new JSM.BodyPolygon([e,a,b,f]),g.AddPolygon(k);for(h=0;h<c;h++)e=(h+1)*d+h+l,f=e+d+1,a=e-l,b=a+d+1,k=new JSM.BodyPolygon([e,f,b,a]),g.AddPolygon(k);g.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 g};JSM.GenerateRuledFromCoords=function(a,b,c,d){var e=new JSM.Body,f=[],g=[];JSM.GetRuledMesh(a,b,c,f,g);for(a=0;a<f.length;a++)e.AddVertex(new JSM.BodyVertex(f[a]));for(a=0;a<g.length;a++)f=g[a],f=new JSM.BodyPolygon(f),d&&f.SetCurveGroup(0),e.AddPolygon(f);e.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 e};
|
||||
JSM.GenerateRevolved=function(a,b,c,d,e,f){var g=new JSM.Body,h=JSM.IsEqual(c,2*Math.PI),l=a.length,k=c/d;c=JSM.CoordSub(b.end,b.beg);var m,n,p;for(m=0;m<l;m++)for(n=0;n<=d;n++)h&&n===d||(p=a[m].Clone().Rotate(c,n*k,b.beg),g.AddVertex(new JSM.BodyVertex(p)));k=0;"CurveSegments"==f?k=1:"CurveAll"==f&&(k=2);var q,t;for(m=0;m<l-1;m++)for(n=0;n<d;n++)f=m*(d+1)+n,p=f+d+1,q=f+1,t=p+1,h&&(f=m*d+n,p=f+d,q=f+1,t=p+1,n===d-1&&(q=m*d,t=(m+1)*d)),f=new JSM.BodyPolygon([f,q,t,p]),1==k?f.SetCurveGroup(m):2==k&&
|
||||
f.SetCurveGroup(0),g.AddPolygon(f);if(h&&e){e=new JSM.BodyPolygon([]);h=new JSM.BodyPolygon([]);for(m=0;m<d;m++)e.AddVertexIndex(d*(l-1)+m),h.AddVertexIndex(d-m-1);g.AddPolygon(e);g.AddPolygon(h)}d=c.Clone().Normalize();h=new JSM.Line(b.beg,d);for(m=e=0;m<l;m++)n=h.ProjectCoord(a[m]),e+=n.DistanceTo(a[m]);e/=l;b=new JSM.Coord(b.beg.x,b.beg.y,b.beg.z);l=(new JSM.Line(b,c)).ProjectCoord(a[0]);a=JSM.CoordSub(a[0],l).Normalize();g.SetCylindricalTextureProjection(b,e,a,d);return g};
|
||||
JSM.GenerateTube=function(a,b){var c=new JSM.Body,d=a.length,e=a[0].length,f,g;for(g=0;g<e;g++)for(f=0;f<d;f++)c.AddVertex(new JSM.BodyVertex(a[f][g]));var h,l;for(g=0;g<d-1;g++)for(f=0;f<e;f++)h=g+d*f,l=h+d,f===e-1&&(l=g),c.AddPolygon(new JSM.BodyPolygon([h,l,l+1,h+1]));if(b){g=new JSM.BodyPolygon([]);h=new JSM.BodyPolygon([]);for(f=0;f<e;f++)g.AddVertexIndex(d*f+d-1);for(f=e-1;0<=f;f--)h.AddVertexIndex(d*f);c.AddPolygon(g);c.AddPolygon(h)}c.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 c};JSM.GenerateFunctionSurface=function(a,b,c,d,e){var f=new JSM.Sector(new JSM.Coord(b.x,b.y,0),new JSM.Coord(c.x,b.y,0));b=new JSM.Sector(new JSM.Coord(b.x,c.y,0),new JSM.Coord(c.x,c.y,0));d=JSM.GenerateRuledFromSectors(f,b,d,d,e);for(e=0;e<d.VertexCount();e++)f=d.GetVertexPosition(e),f.z=a(f.x,f.y);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};
|
||||
JSM.GenerateFunctionSurfaceSolid=function(a,b,c,d,e,f){var h=new JSM.Sector(new JSM.Coord(c.x,b.y,0),new JSM.Coord(b.x,b.y,0));b=new JSM.Sector(new JSM.Coord(c.x,c.y,0),new JSM.Coord(b.x,c.y,0));e=JSM.GenerateRuledFromSectorsWithHeight(h,b,d,d,e,f);h=(d+1)*(d+1);for(d=0;d<h;d++)f=e.GetVertexPosition(d),f.z=a(f.x,f.y);e.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 e};
|
||||
JSM.GenerateFunctionSurfaceSolid=function(a,b,c,d,e,f){var g=new JSM.Sector(new JSM.Coord(c.x,b.y,0),new JSM.Coord(b.x,b.y,0));b=new JSM.Sector(new JSM.Coord(c.x,c.y,0),new JSM.Coord(b.x,c.y,0));e=JSM.GenerateRuledFromSectorsWithHeight(g,b,d,d,e,f);g=(d+1)*(d+1);for(d=0;d<g;d++)f=e.GetVertexPosition(d),f.z=a(f.x,f.y);e.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 e};
|
||||
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,h=!1;if(void 0!==b&&null!==b)for(e=0;e<b.Count();e++)if(null!==b.GetMaterial(e).texture){h=!0;break}var g,l;if(h){g=JSM.CalculateBodyTextureCoords(a);for(e=0;e<g.length;e++)if(f=a.GetPolygon(e),f.HasMaterialIndex()){l=b.GetMaterial(f.GetMaterialIndex());for(f=0;f<g[e].length;f++)g[e][f].x/=l.textureWidth,g[e][f].y/=-l.textureHeight}}var k=!0;void 0!==c.hasConvexPolygons&&null!==
|
||||
c.hasConvexPolygons&&(k=c.hasConvexPolygons);(function(a,b,c,d,e){function f(g,l){var r=b.GetMaterial(l);if(void 0!==e.onGeometryStart&&null!==e.onGeometryStart)e.onGeometryStart(r);var s;for(s=0;s<g.length;s++){var u=g[s],w=a.GetPolygon(u),v=w.VertexIndexCount();if(!(3>v)){var H=void 0,z=void 0,B=void 0,N=void 0,O=void 0,J=void 0,I=void 0,E=void 0,Q=void 0,G=void 0;if(3==v||k)for(G=0;G<v-2;G++){if(H=a.GetVertex(w.GetVertexIndex(0)).position,z=a.GetVertex(w.GetVertexIndex((G+1)%v)).position,B=a.GetVertex(w.GetVertexIndex((G+
|
||||
2)%v)).position,N=c[u][0],O=c[u][(G+1)%v],J=c[u][(G+2)%v],Q=E=I=null,h&&(I=d[u][0],E=d[u][(G+1)%v],Q=d[u][(G+2)%v]),void 0!==e.onTriangle&&null!==e.onTriangle)e.onTriangle(H,z,B,N,O,J,I,E,Q)}else{H=new JSM.Polygon;z=void 0;for(G=0;G<v;G++)z=a.GetVertex(w.vertices[G]),H.AddVertex(z.position.x,z.position.y,z.position.z);G=JSM.CalculateBodyPolygonNormal(a,u);v=JSM.TriangulatePolygon(H,G);if(null!==v)for(var M=void 0,G=0;G<v.length;G++)if(M=v[G],H=a.GetVertex(w.GetVertexIndex(M[0])).position,z=a.GetVertex(w.GetVertexIndex(M[1])).position,
|
||||
B=a.GetVertex(w.GetVertexIndex(M[2])).position,N=c[u][M[0]],O=c[u][M[1]],J=c[u][M[2]],Q=E=I=null,h&&(I=d[u][M[0]],E=d[u][M[1]],Q=d[u][M[2]]),void 0!==e.onTriangle&&null!==e.onTriangle)e.onTriangle(H,z,B,N,O,J,I,E,Q)}}}if(void 0!==e.onGeometryEnd&&null!==e.onGeometryEnd)e.onGeometryEnd(r)}var g,l=[],r=[];if(void 0===b||null===b)b=new JSM.Materials;for(g=0;g<b.Count();g++)l[g]=[];var v;for(g=0;g<a.PolygonCount();g++)v=a.GetPolygon(g),v.HasMaterialIndex()?(v=v.GetMaterialIndex(),l[v].push(g)):r.push(g);
|
||||
for(g=0;g<l.length;g++)v=l[g],0!==v.length&&f(v,g);0!==r.length&&f(r,-1)})(a,b,d,g,c);return!0};
|
||||
JSM.ExportBodyContentToStl=function(a,b,c){function d(a){h+=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 h,n,p,q=null;if(3===f)q=JSM.CalculateBodyPolygonNormal(a,b),h=a.GetVertex(d.GetVertexIndex(0)).position,n=a.GetVertex(d.GetVertexIndex(1)).position,
|
||||
p=a.GetVertex(d.GetVertexIndex(2)).position,e(q,h,n,p);else if(h=!0,void 0!==c&&c&&(h=!1),q=JSM.CalculateBodyPolygonNormal(a,b),h){h=new JSM.Polygon;for(b=0;b<f;b++)n=a.GetVertex(d.vertices[b]),h.AddVertex(n.position.x,n.position.y,n.position.z);f=JSM.TriangulatePolygon(h,q);if(null!==f)for(b=0;b<f.length;b++)p=f[b],h=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,h,n,p)}else for(b=0;b<f-2;b++)h=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,h,n,p)}}var h="";for(b=0;b<a.PolygonCount();b++)f(b);return h};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")};
|
||||
JSM.ExportBodyContentToObj=function(a,b,c){function d(b){b=a.GetVertex(b).position;h+="v "+b.x+" "+b.y+" "+b.z+"\n"}function e(b){b=JSM.CalculateBodyPolygonNormal(a,b);h+="vn "+b.x+" "+b.y+" "+b.z+"\n"}function f(d){var e=a.GetPolygon(d);h+="f ";var f;for(f=0;f<e.VertexIndexCount();f++){var g=b+e.GetVertexIndex(f)+1+"//"+(c+d+1)+" ";h+=g}h+="\n"}var h="",g;for(g=0;g<a.VertexCount();g++)d(g);for(g=0;g<a.PolygonCount();g++)e(g);for(g=0;g<a.PolygonCount();g++)f(g);return h};
|
||||
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,l;if(g){h=JSM.CalculateBodyTextureCoords(a);for(e=0;e<h.length;e++)if(f=a.GetPolygon(e),f.HasMaterialIndex()){l=b.GetMaterial(f.GetMaterialIndex());for(f=0;f<h[e].length;f++)h[e][f].x/=l.textureWidth,h[e][f].y/=-l.textureHeight}}var k=!1;void 0!==c.hasConvexPolygons&&null!==
|
||||
c.hasConvexPolygons&&(k=c.hasConvexPolygons);(function(a,b,c,d,e){function f(h,l){var r=b.GetMaterial(l);if(void 0!==e.onGeometryStart&&null!==e.onGeometryStart)e.onGeometryStart(r);var s;for(s=0;s<h.length;s++){var u=h[s],w=a.GetPolygon(u),v=w.VertexIndexCount();if(!(3>v)){var H=void 0,z=void 0,B=void 0,N=void 0,O=void 0,J=void 0,I=void 0,E=void 0,Q=void 0,G=void 0;if(3==v||k)for(G=0;G<v-2;G++){if(H=a.GetVertex(w.GetVertexIndex(0)).position,z=a.GetVertex(w.GetVertexIndex((G+1)%v)).position,B=a.GetVertex(w.GetVertexIndex((G+
|
||||
2)%v)).position,N=c[u][0],O=c[u][(G+1)%v],J=c[u][(G+2)%v],Q=E=I=null,g&&(I=d[u][0],E=d[u][(G+1)%v],Q=d[u][(G+2)%v]),void 0!==e.onTriangle&&null!==e.onTriangle)e.onTriangle(H,z,B,N,O,J,I,E,Q)}else{H=new JSM.Polygon;z=void 0;for(G=0;G<v;G++)z=a.GetVertex(w.vertices[G]),H.AddVertex(z.position.x,z.position.y,z.position.z);G=JSM.CalculateBodyPolygonNormal(a,u);v=JSM.TriangulatePolygon(H,G);if(null!==v)for(var M=void 0,G=0;G<v.length;G++)if(M=v[G],H=a.GetVertex(w.GetVertexIndex(M[0])).position,z=a.GetVertex(w.GetVertexIndex(M[1])).position,
|
||||
B=a.GetVertex(w.GetVertexIndex(M[2])).position,N=c[u][M[0]],O=c[u][M[1]],J=c[u][M[2]],Q=E=I=null,g&&(I=d[u][M[0]],E=d[u][M[1]],Q=d[u][M[2]]),void 0!==e.onTriangle&&null!==e.onTriangle)e.onTriangle(H,z,B,N,O,J,I,E,Q)}}}if(void 0!==e.onGeometryEnd&&null!==e.onGeometryEnd)e.onGeometryEnd(r)}var h,l=[],r=[];if(void 0===b||null===b)b=new JSM.Materials;for(h=0;h<b.Count();h++)l[h]=[];var v;for(h=0;h<a.PolygonCount();h++)v=a.GetPolygon(h),v.HasMaterialIndex()?(v=v.GetMaterialIndex(),l[v].push(h)):r.push(h);
|
||||
for(h=0;h<l.length;h++)v=l[h],0!==v.length&&f(v,h);0!==r.length&&f(r,-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.TriangulatePolygon(g,q);if(null!==f)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")};
|
||||
JSM.ExportBodyContentToObj=function(a,b,c){function d(b){b=a.GetVertex(b).position;g+="v "+b.x+" "+b.y+" "+b.z+"\n"}function e(b){b=JSM.CalculateBodyPolygonNormal(a,b);g+="vn "+b.x+" "+b.y+" "+b.z+"\n"}function f(d){var e=a.GetPolygon(d);g+="f ";var f;for(f=0;f<e.VertexIndexCount();f++){var h=b+e.GetVertexIndex(f)+1+"//"+(c+d+1)+" ";g+=h}g+="\n"}var g="",h;for(h=0;h<a.VertexCount();h++)d(h);for(h=0;h<a.PolygonCount();h++)e(h);for(h=0;h<a.PolygonCount();h++)f(h);return g};
|
||||
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],g+=d,b++,200<b&&","==d&&(g+="\n",b=0)}else g+=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=l.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 h(e,f){var g=-1;b&&(g=a.GetPolygon(e).GetMaterialIndex()+2,g!=f&&d('set material "material'+g+'"'));var h=l.pgons[e],k=0;a.GetPolygon(e).HasCurveGroup()&&(k=2);c("pgon "+h.pedges.length+", 0, "+k+", ");var k="",m,u;for(m=0;m<h.pedges.length;m++)u=h.pedges[m],k=u.reverse?k+-(u.index+1):k+(u.index+1),m<h.pedges.length-1&&(k+=", ");c(k);c(" ! "+(e+1));d("");return g}var g="";d("base");var l=JSM.CalculateAdjacencyInfo(a),k;for(k=0;k<l.verts.length;k++)e(k);
|
||||
for(k=0;k<l.edges.length;k++)f(k);var m=-1;for(k=0;k<l.pgons.length;k++)m=h(k,m);d("body -1");return g};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.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=l.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=l.pgons[e],k=0;a.GetPolygon(e).HasCurveGroup()&&(k=2);c("pgon "+h.pedges.length+", 0, "+k+", ");var k="",m,u;for(m=0;m<h.pedges.length;m++)u=h.pedges[m],k=u.reverse?k+-(u.index+1):k+(u.index+1),m<h.pedges.length-1&&(k+=", ");c(k);c(" ! "+(e+1));d("");return g}var h="";d("base");var l=JSM.CalculateAdjacencyInfo(a),k;for(k=0;k<l.verts.length;k++)e(k);
|
||||
for(k=0;k<l.edges.length;k++)f(k);var m=-1;for(k=0;k<l.pgons.length;k++)m=g(k,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.Vector(a,b,c));return this.normals.length-1};JSM.TriangleBody.prototype.GetNormal=function(a){return this.normals[a]};
|
||||
JSM.TriangleBody.prototype.GetTriangleNormal=function(a,b){var c=null,d=this.triangles[a];if(-1==d.curve)c=this.GetNormal(d.n0);else var c=this.GetVertex(d.v0),e=this.GetVertex(d.v1),f=this.GetVertex(d.v2),h=this.GetNormal(d.n0),g=this.GetNormal(d.n1),d=this.GetNormal(d.n2),c=JSM.BarycentricInterpolation(c,e,f,h,g,d,b);return c};JSM.TriangleBody.prototype.NormalCount=function(){return this.normals.length};
|
||||
JSM.TriangleBody.prototype.GetTriangleNormal=function(a,b){var c=null,d=this.triangles[a];if(-1==d.curve)c=this.GetNormal(d.n0);else var c=this.GetVertex(d.v0),e=this.GetVertex(d.v1),f=this.GetVertex(d.v2),g=this.GetNormal(d.n0),h=this.GetNormal(d.n1),d=this.GetNormal(d.n2),c=JSM.BarycentricInterpolation(c,e,f,g,h,d,b);return c};JSM.TriangleBody.prototype.NormalCount=function(){return this.normals.length};
|
||||
JSM.TriangleBody.prototype.AddUV=function(a,b){this.uvs.push(new JSM.Coord2D(a,b));return this.uvs.length-1};JSM.TriangleBody.prototype.AddDefaultUV=function(){return-1!=this.defaultUVIndex?this.defaultUVIndex:this.defaultUVIndex=this.AddUV(0,0)};JSM.TriangleBody.prototype.GetUV=function(a){return this.uvs[a]};JSM.TriangleBody.prototype.UVCount=function(){return this.uvs.length};
|
||||
JSM.TriangleBody.prototype.AddTriangle=function(a,b,c,d,e,f,h,g,l,k,m){this.triangles.push({v0:a,v1:b,v2:c,n0:d,n1:e,n2:f,u0:h,u1:g,u2:l,mat:k,curve:m});return this.triangles.length-1};JSM.TriangleBody.prototype.GetTriangle=function(a){return this.triangles[a]};JSM.TriangleBody.prototype.TriangleCount=function(){return this.triangles.length};
|
||||
JSM.TriangleBody.prototype.AddTriangle=function(a,b,c,d,e,f,g,h,l,k,m){this.triangles.push({v0:a,v1:b,v2:c,n0:d,n1:e,n2:f,u0:g,u1:h,u2:l,mat:k,curve:m});return this.triangles.length-1};JSM.TriangleBody.prototype.GetTriangle=function(a){return this.triangles[a]};JSM.TriangleBody.prototype.TriangleCount=function(){return this.triangles.length};
|
||||
JSM.TriangleBody.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],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.TriangleBody.prototype.GetCenter=function(){return this.GetBoundingBox().GetCenter()};
|
||||
JSM.TriangleBody.prototype.GetBoundingSphere=function(){var a=this.GetCenter(),b=0,c,d;for(c=0;c<this.vertices.length;c++)d=a.DistanceTo(this.vertices[c]),JSM.IsGreater(d,b)&&(b=d);return new JSM.Sphere(a,b)};
|
||||
JSM.TriangleBody.prototype.Finalize=function(a){function b(b,c,d,f){function h(a,b,c,d,e){var f=new JSM.Vector(0,0,0),g=0;c=a.GetTriangle(c);b=e[b];var l,k;for(e=0;e<b.length;e++)l=b[e],k=a.GetTriangle(l),c.curve==k.curve&&(f=JSM.CoordAdd(f,d[l]),g+=1);f.MultiplyScalar(1/g);f.Normalize();return a.AddNormal(f.x,f.y,f.z)}var p=b.triangles[e];if(void 0===p.mat||0>p.mat)p.mat=a.GetDefaultMaterialIndex();if(void 0===p.n0||void 0===p.n1||void 0===p.n2)void 0===p.curve||0>p.curve?(c=d[e],c=b.AddNormal(c.x,
|
||||
c.y,c.z),p.n0=c,p.n1=c,p.n2=c,p.curve=-1):(p.n0=h(b,p.v0,c,d,f),p.n1=h(b,p.v1,c,d,f),p.n2=h(b,p.v2,c,d,f));if(void 0===p.u0||void 0===p.u1||void 0===p.u2)p.u0=b.AddDefaultUV(),p.u1=b.AddDefaultUV(),p.u2=b.AddDefaultUV()}var c=[],d={},e;for(e=0;e<this.vertices.length;e++)d[e]=[];var f,h;for(e=0;e<this.triangles.length;e++)f=this.triangles[e],h=JSM.CalculateTriangleNormal(this.vertices[f.v0],this.vertices[f.v1],this.vertices[f.v2]),c.push(h),d[f.v0].push(e),d[f.v1].push(e),d[f.v2].push(e);for(e=0;e<
|
||||
JSM.TriangleBody.prototype.Finalize=function(a){function b(b,c,d,f){function g(a,b,c,d,e){var f=new JSM.Vector(0,0,0),h=0;c=a.GetTriangle(c);b=e[b];var l,k;for(e=0;e<b.length;e++)l=b[e],k=a.GetTriangle(l),c.curve==k.curve&&(f=JSM.CoordAdd(f,d[l]),h+=1);f.MultiplyScalar(1/h);f.Normalize();return a.AddNormal(f.x,f.y,f.z)}var p=b.triangles[e];if(void 0===p.mat||0>p.mat)p.mat=a.GetDefaultMaterialIndex();if(void 0===p.n0||void 0===p.n1||void 0===p.n2)void 0===p.curve||0>p.curve?(c=d[e],c=b.AddNormal(c.x,
|
||||
c.y,c.z),p.n0=c,p.n1=c,p.n2=c,p.curve=-1):(p.n0=g(b,p.v0,c,d,f),p.n1=g(b,p.v1,c,d,f),p.n2=g(b,p.v2,c,d,f));if(void 0===p.u0||void 0===p.u1||void 0===p.u2)p.u0=b.AddDefaultUV(),p.u1=b.AddDefaultUV(),p.u2=b.AddDefaultUV()}var c=[],d={},e;for(e=0;e<this.vertices.length;e++)d[e]=[];var f,g;for(e=0;e<this.triangles.length;e++)f=this.triangles[e],g=JSM.CalculateTriangleNormal(this.vertices[f.v0],this.vertices[f.v1],this.vertices[f.v2]),c.push(g),d[f.v0].push(e),d[f.v1].push(e),d[f.v2].push(e);for(e=0;e<
|
||||
this.triangles.length;e++)b(this,e,c,d)};
|
||||
JSM.TriangleBody.prototype.Clone=function(){var a=new JSM.TriangleBody(this.name),b,c;for(b=0;b<this.vertices.length;b++)a.vertices.push(this.vertices[b].Clone());for(b=0;b<this.normals.length;b++)a.normals.push(this.normals[b].Clone());for(b=0;b<this.uvs.length;b++)a.uvs.push(this.uvs[b].Clone());for(b=0;b<this.triangles.length;b++)c=this.triangles[b],a.triangles.push({v0:c.v0,v1:c.v1,v2:c.v2,n0:c.n0,n1:c.n1,n2:c.n2,u0:c.u0,u1:c.u1,u2:c.u2,mat:c.mat,curve:c.curve});return a};
|
||||
JSM.TriangleModel=function(){this.materials=[];this.bodies=[];this.defaultMaterial=-1};JSM.TriangleModel.prototype.AddMaterial=function(a){if(void 0===a||null===a)a={};var b={};JSM.CopyObjectProperties(a,b,!0);this.materials.push(b);return this.materials.length-1};JSM.TriangleModel.prototype.GetMaterial=function(a){return this.materials[a]};JSM.TriangleModel.prototype.AddDefaultMaterial=function(){-1==this.defaultMaterial&&(this.defaultMaterial=this.AddMaterial());return this.defaultMaterial};
|
||||
JSM.TriangleModel.prototype.GetDefaultMaterialIndex=function(){return this.AddDefaultMaterial()};JSM.TriangleModel.prototype.MaterialCount=function(){return this.materials.length};JSM.TriangleModel.prototype.AddBody=function(a){this.bodies.push(a);return this.bodies.length-1};JSM.TriangleModel.prototype.AddBodyToIndex=function(a,b){this.bodies.splice(b,0,a);return b};JSM.TriangleModel.prototype.GetBody=function(a){return this.bodies[a]};
|
||||
JSM.TriangleModel.prototype.VertexCount=function(){var a=0,b,c;for(b=0;b<this.bodies.length;b++)c=this.bodies[b],a+=c.VertexCount();return a};JSM.TriangleModel.prototype.TriangleCount=function(){var a=0,b,c;for(b=0;b<this.bodies.length;b++)c=this.bodies[b],a+=c.TriangleCount();return a};JSM.TriangleModel.prototype.BodyCount=function(){return this.bodies.length};
|
||||
JSM.ConvertTriangleBodyToOctree=function(a){var b=new JSM.TriangleOctree(a.GetBoundingBox()),c,d,e,f;for(c=0;c<a.TriangleCount();c++)d=a.GetTriangle(c),e=a.GetVertex(d.v0),f=a.GetVertex(d.v1),d=a.GetVertex(d.v2),b.AddTriangle(e,f,d,{triangleIndex:c});return b};JSM.TriangleModel=function(){this.materials=[];this.bodies=[];this.defaultMaterial=-1};
|
||||
JSM.TriangleModel.prototype.AddMaterial=function(a){if(void 0===a||null===a)a={};var b={};JSM.CopyObjectProperties(a,b,!0);this.materials.push(b);return this.materials.length-1};JSM.TriangleModel.prototype.GetMaterial=function(a){return this.materials[a]};JSM.TriangleModel.prototype.AddDefaultMaterial=function(){-1==this.defaultMaterial&&(this.defaultMaterial=this.AddMaterial());return this.defaultMaterial};JSM.TriangleModel.prototype.GetDefaultMaterialIndex=function(){return this.AddDefaultMaterial()};
|
||||
JSM.TriangleModel.prototype.MaterialCount=function(){return this.materials.length};JSM.TriangleModel.prototype.AddBody=function(a){this.bodies.push(a);return this.bodies.length-1};JSM.TriangleModel.prototype.AddBodyToIndex=function(a,b){this.bodies.splice(b,0,a);return b};JSM.TriangleModel.prototype.GetBody=function(a){return this.bodies[a]};JSM.TriangleModel.prototype.VertexCount=function(){var a=0,b,c;for(b=0;b<this.bodies.length;b++)c=this.bodies[b],a+=c.VertexCount();return a};
|
||||
JSM.TriangleModel.prototype.TriangleCount=function(){var a=0,b,c;for(b=0;b<this.bodies.length;b++)c=this.bodies[b],a+=c.TriangleCount();return a};JSM.TriangleModel.prototype.BodyCount=function(){return this.bodies.length};
|
||||
JSM.TriangleModel.prototype.FinalizeMaterials=function(){var a={name:"Default",ambient:[0.5,0.5,0.5],diffuse:[0.5,0.5,0.5],specular:[0.1,0.1,0.1],shininess:0,opacity:1,reflection:0,texture:null,offset:null,scale:null,rotation:null},b,c;for(b=0;b<this.materials.length;b++)c=this.materials[b],JSM.CopyObjectProperties(a,c,!1)};JSM.TriangleModel.prototype.FinalizeBodies=function(){var a,b;for(a=0;a<this.bodies.length;a++)b=this.bodies[a],b.Finalize(this)};
|
||||
JSM.TriangleModel.prototype.Finalize=function(){this.FinalizeBodies();this.FinalizeMaterials()};JSM.ConvertTriangleBodyToOctree=function(a){var b=new JSM.TriangleOctree(a.GetBoundingBox()),c,d,e,f;for(c=0;c<a.TriangleCount();c++)d=a.GetTriangle(c),e=a.GetVertex(d.v0),f=a.GetVertex(d.v1),d=a.GetVertex(d.v2),b.AddTriangle(e,f,d,{triangleIndex:c});return b};
|
||||
JSM.ConvertBodyToTriangleBody=function(a){function b(a,b,c,d,e){c=a.AddTriangle(c,d,e);a=a.GetTriangle(c);b.HasMaterialIndex()&&(a.mat=b.GetMaterialIndex());b.HasCurveGroup()&&(a.curve=b.GetCurveGroup())}var c=new JSM.TriangleBody,d,e,f;for(d=0;d<a.VertexCount();d++)f=a.GetVertexPosition(d),c.AddVertex(f.x,f.y,f.z);var h,g,l,k;for(d=0;d<a.PolygonCount();d++)if(h=a.GetPolygon(d),g=h.VertexIndexCount(),!(3>g))if(3==g)f=h.GetVertexIndex(0),g=h.GetVertexIndex(1),k=h.GetVertexIndex(2),b(c,h,f,g,k);else{l=
|
||||
new JSM.Polygon;for(e=0;e<g;e++)f=a.GetVertexPosition(h.GetVertexIndex(e)),l.AddVertex(f.x,f.y,f.z);e=JSM.CalculateBodyPolygonNormal(a,d);l=JSM.TriangulatePolygon(l,e);if(null!==l)for(e=0;e<l.length;e++)k=l[e],f=h.GetVertexIndex(k[0]),g=h.GetVertexIndex(k[1]),k=h.GetVertexIndex(k[2]),b(c,h,f,g,k)}return c};
|
||||
JSM.TriangleModel.prototype.Finalize=function(){this.FinalizeBodies();this.FinalizeMaterials()};
|
||||
JSM.ConvertBodyToTriangleBody=function(a){function b(a,b,c,d,e){c=a.AddTriangle(c,d,e);a=a.GetTriangle(c);b.HasMaterialIndex()&&(a.mat=b.GetMaterialIndex());b.HasCurveGroup()&&(a.curve=b.GetCurveGroup())}var c=new JSM.TriangleBody,d,e,f;for(d=0;d<a.VertexCount();d++)f=a.GetVertexPosition(d),c.AddVertex(f.x,f.y,f.z);var g,h,l,k;for(d=0;d<a.PolygonCount();d++)if(g=a.GetPolygon(d),h=g.VertexIndexCount(),!(3>h))if(3==h)f=g.GetVertexIndex(0),h=g.GetVertexIndex(1),k=g.GetVertexIndex(2),b(c,g,f,h,k);else{l=
|
||||
new JSM.Polygon;for(e=0;e<h;e++)f=a.GetVertexPosition(g.GetVertexIndex(e)),l.AddVertex(f.x,f.y,f.z);e=JSM.CalculateBodyPolygonNormal(a,d);l=JSM.TriangulatePolygon(l,e);if(null!==l)for(e=0;e<l.length;e++)k=l[e],f=g.GetVertexIndex(k[0]),h=g.GetVertexIndex(k[1]),k=g.GetVertexIndex(k[2]),b(c,g,f,h,k)}return c};
|
||||
JSM.ConvertModelToTriangleModel=function(a,b){var c=new JSM.TriangleModel,d,e;if(void 0!==b&&null!==b)for(d=0;d<b.Count();d++)e=b.GetMaterial(d),c.AddMaterial({name:"Material"+d,ambient:JSM.HexColorToNormalizedRGBComponents(e.ambient),diffuse:JSM.HexColorToNormalizedRGBComponents(e.diffuse),specular:JSM.HexColorToNormalizedRGBComponents(e.specular),shininess:e.shininess,opacity:e.opacity,reflection:e.reflection});for(d=0;d<a.BodyCount();d++)e=a.GetBody(d),e=JSM.ConvertBodyToTriangleBody(e),c.AddBody(e);
|
||||
c.Finalize();return c};
|
||||
JSM.ConvertTriangleModelToJsonData=function(a){function b(a,b,c){var d=[],e=a.MaterialCount(),f;for(a=0;a<b.VertexCount();a++)f=b.GetVertex(a),c.vertices.push(f.x,f.y,f.z);for(a=0;a<b.NormalCount();a++)f=b.GetNormal(a),c.normals.push(f.x,f.y,f.z);for(a=0;a<b.UVCount();a++)f=b.GetUV(a),c.uvs.push(f.x,f.y);for(a=0;a<e;a++)d.push([]);for(a=0;a<b.TriangleCount();a++)f=b.GetTriangle(a),void 0===f.mat||(0>f.mat||f.mat>=e)||d[f.mat].push(a);var p,q;for(a=0;a<d.length;a++)if(p=d[a],0!==p.length){q={material:a,
|
||||
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 g=b.material,l=c[g];void 0===l&&(a.triangles.push({material:g,parameters:[]}),l=a.triangles.length-1,c[g]=l);a=a.triangles[l].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]+h,b.parameters[c+7]+h,b.parameters[c+8]+h)}var e=a.vertices.length/3,f=a.normals.length/3,h=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 t,s;for(t=0;t<b.triangles.length;t++)s=b.triangles[t],d(a,s,c)}var c={version:a.version,materials:a.materials,meshes:[]},d={name:"Merged",vertices:[],normals:[],uvs:[],triangles:[]},e={},f,h;for(f=0;f<a.meshes.length;f++)h=a.meshes[f],b(d,h,e);c.meshes.push(d);return c};
|
||||
JSM.RayTriangleIntersection=function(a,b,c,d){var e=a.GetOrigin(),f=a.GetDirection();c=JSM.CoordSub(c,b);d=JSM.CoordSub(d,b);var h=JSM.VectorCross(f,d),g=JSM.VectorDot(c,h);if(JSM.IsZero(g)||!JSM.IsPositive(g))return null;var g=1/g,l=JSM.CoordSub(e,b);b=JSM.VectorDot(l,h)*g;if(JSM.IsLower(b,0)||JSM.IsGreater(b,1))return null;c=JSM.VectorCross(l,c);h=JSM.VectorDot(f,c)*g;if(JSM.IsLower(h,0)||JSM.IsGreater(b+h,1))return null;d=JSM.VectorDot(d,c)*g;if(!JSM.IsPositive(d)||a.IsLengthReached(d))return null;
|
||||
JSM.MergeJsonDataMeshes=function(a){function b(a,b,c){function d(a,b,c){var h=b.material,l=c[h];void 0===l&&(a.triangles.push({material:h,parameters:[]}),l=a.triangles.length-1,c[h]=l);a=a.triangles[l].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 t,s;for(t=0;t<b.triangles.length;t++)s=b.triangles[t],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.RayTriangleIntersection=function(a,b,c,d){var e=a.GetOrigin(),f=a.GetDirection();c=JSM.CoordSub(c,b);d=JSM.CoordSub(d,b);var g=JSM.VectorCross(f,d),h=JSM.VectorDot(c,g);if(JSM.IsZero(h)||!JSM.IsPositive(h))return null;var h=1/h,l=JSM.CoordSub(e,b);b=JSM.VectorDot(l,g)*h;if(JSM.IsLower(b,0)||JSM.IsGreater(b,1))return null;c=JSM.VectorCross(l,c);g=JSM.VectorDot(f,c)*h;if(JSM.IsLower(g,0)||JSM.IsGreater(b+g,1))return null;d=JSM.VectorDot(d,c)*h;if(!JSM.IsPositive(d)||a.IsLengthReached(d))return null;
|
||||
a=f.Clone().MultiplyScalar(d);return{position:JSM.CoordAdd(e,a),distance:d}};
|
||||
JSM.RayBoxIntersection=function(a,b,c){var d=a.GetOrigin(),e=a.GetDirection(),f=JSM.CoordToArray(d),e=JSM.CoordToArray(e);b=JSM.CoordToArray(b);c=JSM.CoordToArray(c);var h=[0,0,0],g=[0,0,0],l=!0,k;for(k=0;3>k;k++)JSM.IsLower(f[k],b[k])?(h[k]=-1,g[k]=b[k],l=!1):JSM.IsGreater(f[k],c[k])?(h[k]=1,g[k]=c[k],l=!1):h[k]=0;k=null;if(l)return k={position:d,distance:0};l=[0,0,0];for(k=0;3>k;k++)0!==h[k]&&!JSM.IsZero(e[k])?l[k]=(g[k]-f[k])/e[k]:l[k]=-1;h=0;for(k=1;3>k;k++)JSM.IsLower(l[h],l[k])&&(h=k);if(JSM.IsNegative(l[h]))return null;
|
||||
var m=[0,0,0];for(k=0;3>k;k++)if(h!=k){if(m[k]=f[k]+l[h]*e[k],JSM.IsLower(m[k],b[k])||JSM.IsGreater(m[k],c[k]))return null}else m[k]=g[k];f=JSM.CoordFromArray(m);d=d.DistanceTo(f);return a.IsLengthReached(d)?null:k={position:f,distance:d}};
|
||||
JSM.RayBoxIntersection=function(a,b,c){var d=a.GetOrigin(),e=a.GetDirection(),f=JSM.CoordToArray(d),e=JSM.CoordToArray(e);b=JSM.CoordToArray(b);c=JSM.CoordToArray(c);var g=[0,0,0],h=[0,0,0],l=!0,k;for(k=0;3>k;k++)JSM.IsLower(f[k],b[k])?(g[k]=-1,h[k]=b[k],l=!1):JSM.IsGreater(f[k],c[k])?(g[k]=1,h[k]=c[k],l=!1):g[k]=0;k=null;if(l)return k={position:d,distance:0};l=[0,0,0];for(k=0;3>k;k++)0!==g[k]&&!JSM.IsZero(e[k])?l[k]=(h[k]-f[k])/e[k]:l[k]=-1;g=0;for(k=1;3>k;k++)JSM.IsLower(l[g],l[k])&&(g=k);if(JSM.IsNegative(l[g]))return null;
|
||||
var m=[0,0,0];for(k=0;3>k;k++)if(g!=k){if(m[k]=f[k]+l[g]*e[k],JSM.IsLower(m[k],b[k])||JSM.IsGreater(m[k],c[k]))return null}else m[k]=h[k];f=JSM.CoordFromArray(m);d=d.DistanceTo(f);return a.IsLengthReached(d)?null:k={position:f,distance:d}};
|
||||
JSM.RayOctreeIntersection=function(a,b,c){var d=null,e=!1,f=null!==c&&void 0!==c;JSM.TraverseOctreeNodes(b,function(b){if(!f&&e||!JSM.RayBoxIntersection(a,b.box.min,b.box.max))return!1;var c;for(c=0;c<b.triangles.length;c++){var l=b.triangles[c],k=JSM.RayTriangleIntersection(a,l.v0,l.v1,l.v2);if(null!==k){e=!0;if(!f)return!1;if(null===d||k.distance<d.distance)d=k,d.userData=l.userData}}return!0});f&&null!==d&&(c.position=d.position,c.distance=d.distance,c.userData=d.userData);return e};
|
||||
JSM.RayTriangleBodyIntersection=function(a,b,c){var d=null,e=!1,f=null!==c&&void 0!==c,h,g,l,k;for(h=0;h<b.TriangleCount();h++)if(g=b.GetTriangle(h),l=b.GetVertex(g.v0),k=b.GetVertex(g.v1),g=b.GetVertex(g.v2),l=JSM.RayTriangleIntersection(a,l,k,g),null!==l){e=!0;if(!f)break;if(null===d||l.distance<d.distance)d=l,d.triangleIndex=h}f&&null!==d&&(c.position=d.position,c.distance=d.distance,c.triangleIndex=d.triangleIndex);return e};
|
||||
JSM.RayTriangleModelIntersection=function(a,b,c){var d=null,e=!1,f=null!==c&&void 0!==c,h,g,l;for(h=0;h<b.BodyCount();h++)if(g=b.GetBody(h),l=f?{}:null,JSM.RayTriangleBodyIntersection(a,g,l)){e=!0;if(!f)break;if(null===d||l.distance<d.distance)d=l,d.bodyIndex=h}f&&null!==d&&(c.position=d.position,c.distance=d.distance,c.triangleIndex=d.triangleIndex,c.bodyIndex=d.bodyIndex);return e};
|
||||
JSM.RayTriangleModelIntersectionWithOctree=function(a,b,c){var d=null,e=!1,f=null!==c&&void 0!==c,h,g,l;for(h=0;h<b.BodyCount();h++)if(g=b.GetBody(h),l=f?{}:null,20<g.TriangleCount()?(void 0===g.octree&&(g.octree=JSM.ConvertTriangleBodyToOctree(g)),g=JSM.RayOctreeIntersection(a,g.octree,l)):g=JSM.RayTriangleBodyIntersection(a,g,l),g){e=!0;if(!f)break;if(null===d||l.distance<d.distance)d=l,void 0!==l.userData&&(d.triangleIndex=l.userData.triangleIndex),d.bodyIndex=h}f&&null!==d&&(c.position=d.position,
|
||||
JSM.RayTriangleBodyIntersection=function(a,b,c){var d=null,e=!1,f=null!==c&&void 0!==c,g,h,l,k;for(g=0;g<b.TriangleCount();g++)if(h=b.GetTriangle(g),l=b.GetVertex(h.v0),k=b.GetVertex(h.v1),h=b.GetVertex(h.v2),l=JSM.RayTriangleIntersection(a,l,k,h),null!==l){e=!0;if(!f)break;if(null===d||l.distance<d.distance)d=l,d.triangleIndex=g}f&&null!==d&&(c.position=d.position,c.distance=d.distance,c.triangleIndex=d.triangleIndex);return e};
|
||||
JSM.RayTriangleModelIntersection=function(a,b,c){var d=null,e=!1,f=null!==c&&void 0!==c,g,h,l;for(g=0;g<b.BodyCount();g++)if(h=b.GetBody(g),l=f?{}:null,JSM.RayTriangleBodyIntersection(a,h,l)){e=!0;if(!f)break;if(null===d||l.distance<d.distance)d=l,d.bodyIndex=g}f&&null!==d&&(c.position=d.position,c.distance=d.distance,c.triangleIndex=d.triangleIndex,c.bodyIndex=d.bodyIndex);return e};
|
||||
JSM.RayTriangleModelIntersectionWithOctree=function(a,b,c){var d=null,e=!1,f=null!==c&&void 0!==c,g,h,l;for(g=0;g<b.BodyCount();g++)if(h=b.GetBody(g),l=f?{}:null,20<h.TriangleCount()?(void 0===h.octree&&(h.octree=JSM.ConvertTriangleBodyToOctree(h)),h=JSM.RayOctreeIntersection(a,h.octree,l)):h=JSM.RayTriangleBodyIntersection(a,h,l),h){e=!0;if(!f)break;if(null===d||l.distance<d.distance)d=l,void 0!==l.userData&&(d.triangleIndex=l.userData.triangleIndex),d.bodyIndex=g}f&&null!==d&&(c.position=d.position,
|
||||
c.distance=d.distance,c.triangleIndex=d.triangleIndex,c.bodyIndex=d.bodyIndex);return e};JSM.BinaryReader=function(a,b){this.arrayBuffer=a;this.dataView=new DataView(a);this.isLittleEndian=b;this.position=0};JSM.BinaryReader.prototype.GetPosition=function(){return this.position};JSM.BinaryReader.prototype.GetByteLength=function(){return this.arrayBuffer.byteLength};JSM.BinaryReader.prototype.Skip=function(a){this.position+=a};JSM.BinaryReader.prototype.End=function(){return this.position>=this.arrayBuffer.byteLength};
|
||||
JSM.BinaryReader.prototype.ReadBoolean=function(){var a=this.dataView.getInt8(this.position);this.position+=1;return a?!0:!1};JSM.BinaryReader.prototype.ReadCharacter=function(){var a=this.dataView.getInt8(this.position);this.position+=1;return a};JSM.BinaryReader.prototype.ReadUnsignedCharacter=function(){var a=this.dataView.getUint8(this.position);this.position+=1;return a};
|
||||
JSM.BinaryReader.prototype.ReadInteger16=function(){var a=this.dataView.getInt16(this.position,this.isLittleEndian);this.position+=2;return a};JSM.BinaryReader.prototype.ReadUnsignedInteger16=function(){var a=this.dataView.getUint16(this.position,this.isLittleEndian);this.position+=2;return a};JSM.BinaryReader.prototype.ReadInteger32=function(){var a=this.dataView.getInt32(this.position,this.isLittleEndian);this.position+=4;return a};
|
||||
@ -286,11 +287,11 @@ JSM.BinaryReader.prototype.ReadUnsignedInteger32=function(){var a=this.dataView.
|
||||
JSM.GetArrayBufferFromURL=function(a,b){var c=new XMLHttpRequest;c.open("GET",a,!0);c.responseType="arraybuffer";c.onload=function(){var a=c.response;a&&b(a)};c.send(null)};JSM.GetArrayBufferFromFile=function(a,b){var c=new FileReader;c.onloadend=function(a){a.target.readyState==FileReader.DONE&&b(a.target.result)};c.readAsArrayBuffer(a)};JSM.GetStringBufferFromURL=function(a,b){var c=new XMLHttpRequest;c.open("GET",a,!0);c.responseType="text";c.onload=function(){var a=c.response;a&&b(a)};c.send(null)};
|
||||
JSM.GetStringBufferFromFile=function(a,b){var c=new FileReader;c.onloadend=function(a){a.target.readyState==FileReader.DONE&&b(a.target.result)};c.readAsText(a)};JSM.LoadMultipleBuffersInternal=function(a,b,c,d){if(b>=a.length)d(c);else{var e=a[b],f=null,f=e.isFile?e.isArrayBuffer?JSM.GetArrayBufferFromFile:JSM.GetStringBufferFromFile:e.isArrayBuffer?JSM.GetArrayBufferFromURL:JSM.GetStringBufferFromURL;f(e.originalObject,function(e){c.push(e);JSM.LoadMultipleBuffersInternal(a,b+1,c,d)})}};
|
||||
JSM.LoadMultipleBuffers=function(a,b){JSM.LoadMultipleBuffersInternal(a,0,[],function(a){b(a)})};
|
||||
JSM.Read3dsFile=function(a,b){var c,d,e,f,h,g,l,k,m,n,p,q,t,s,w,u,r,v,C,D,y,x,F,K,L,H,z,B,N,O,J,I,E,Q,G,M,T,S,U,Y;function A(a,c){if(void 0!==b.onLog&&null!==b.onLog)b.onLog(a,c)}function R(a){for(var b="",c=0,d=0;64>d;){c=a.ReadCharacter();if(0===c)break;b+=String.fromCharCode(c);d+=1}return b}function X(a){var b=[],c;for(c=0;3>c;c++)b[c]=a.ReadFloat32();return b}function P(a,b,c){for(;a.GetPosition()<=b-6;){var d=a,e=c,f=d.ReadUnsignedInteger16(),d=d.ReadUnsignedInteger32();e(f,d)}}if(void 0===
|
||||
b||null===b)b={};c=15677;d=45055;e=40960;f=40976;h=40992;g=41008;l=41024;k=41025;m=41040;n=16;p=17;q=18;t=19;s=41472;w=41728;u=41816;r=41818;v=41812;C=41814;D=41820;y=48;x=49;F=16384;K=16640;L=17920;H=18176;z=16656;B=16704;N=16672;O=16736;J=16688;I=16720;E=45056;Q=45058;G=45072;M=45075;T=45088;S=45089;U=45090;Y=45104;(function(a){function V(a,b,c){var d=[0,0,0];b=a.GetPosition()+c-6;var e=!1;P(a,b,function(b,c){b==p?e||(d[0]=a.ReadUnsignedCharacter()/255,d[1]=a.ReadUnsignedCharacter()/255,d[2]=a.ReadUnsignedCharacter()/
|
||||
JSM.Read3dsFile=function(a,b){var c,d,e,f,g,h,l,k,m,n,p,q,t,s,w,u,r,v,C,D,y,x,F,K,L,H,z,B,N,O,J,I,E,Q,G,M,T,S,U,Y;function A(a,c){if(void 0!==b.onLog&&null!==b.onLog)b.onLog(a,c)}function R(a){for(var b="",c=0,d=0;64>d;){c=a.ReadCharacter();if(0===c)break;b+=String.fromCharCode(c);d+=1}return b}function X(a){var b=[],c;for(c=0;3>c;c++)b[c]=a.ReadFloat32();return b}function P(a,b,c){for(;a.GetPosition()<=b-6;){var d=a,e=c,f=d.ReadUnsignedInteger16(),d=d.ReadUnsignedInteger32();e(f,d)}}if(void 0===
|
||||
b||null===b)b={};c=15677;d=45055;e=40960;f=40976;g=40992;h=41008;l=41024;k=41025;m=41040;n=16;p=17;q=18;t=19;s=41472;w=41728;u=41816;r=41818;v=41812;C=41814;D=41820;y=48;x=49;F=16384;K=16640;L=17920;H=18176;z=16656;B=16704;N=16672;O=16736;J=16688;I=16720;E=45056;Q=45058;G=45072;M=45075;T=45088;S=45089;U=45090;Y=45104;(function(a){function V(a,b,c){var d=[0,0,0];b=a.GetPosition()+c-6;var e=!1;P(a,b,function(b,c){b==p?e||(d[0]=a.ReadUnsignedCharacter()/255,d[1]=a.ReadUnsignedCharacter()/255,d[2]=a.ReadUnsignedCharacter()/
|
||||
255):b==q?(d[0]=a.ReadUnsignedCharacter()/255,d[1]=a.ReadUnsignedCharacter()/255,d[2]=a.ReadUnsignedCharacter()/255,e=!0):b==n?e||(d[0]=a.ReadFloat32(),d[1]=a.ReadFloat32(),d[2]=a.ReadFloat32()):b==t?(d[0]=a.ReadFloat32(),d[1]=a.ReadFloat32(),d[2]=a.ReadFloat32(),e=!0):a.Skip(c-6)});return d}function W(a,b,c){var d=0;b=a.GetPosition()+c-6;P(a,b,function(b,c){b==y?d=a.ReadUnsignedInteger16()/100:b==x?d=a.ReadFloat32():a.Skip(c-6)});return d}function Z(a,b,c,d){d.texture=null;d.offset=[0,0];d.scale=
|
||||
[1,1];d.rotation=0;b=a.GetPosition()+c-6;P(a,b,function(b,c){b==w?d.texture=R(a):b==u?d.offset[0]=a.ReadFloat32():b==r?d.offset[1]=a.ReadFloat32():b==v?d.scale[0]=a.ReadFloat32():b==C?d.scale[1]=a.ReadFloat32():b==D?d.rotation=a.ReadFloat32():a.Skip(c-6)})}function $(a,c,d){A("Read material chunk ("+c.toString(16)+", "+d+")",2);var n={},p=a.GetPosition()+d-6;P(a,p,function(b,p){b==e?(A("Read material name chunk ("+c.toString(16)+", "+d+")",3),n.name=R(a)):b==f?(A("Read material ambient chunk ("+c.toString(16)+
|
||||
", "+d+")",3),n.ambient=V(a,b,p)):b==h?(A("Read material diffuse chunk ("+c.toString(16)+", "+d+")",3),n.diffuse=V(a,b,p)):b==g?(A("Read material specular chunk ("+c.toString(16)+", "+d+")",3),n.specular=V(a,b,p)):b==l?(A("Read material shininess chunk ("+c.toString(16)+", "+d+")",3),n.shininess=W(a,b,p)):b==k?(A("Read material shininess strength chunk ("+c.toString(16)+", "+d+")",3),n.shininessStrength=W(a,b,p)):b==m?(A("Read material transparency chunk ("+c.toString(16)+", "+d+")",3),n.transparency=
|
||||
", "+d+")",3),n.ambient=V(a,b,p)):b==g?(A("Read material diffuse chunk ("+c.toString(16)+", "+d+")",3),n.diffuse=V(a,b,p)):b==h?(A("Read material specular chunk ("+c.toString(16)+", "+d+")",3),n.specular=V(a,b,p)):b==l?(A("Read material shininess chunk ("+c.toString(16)+", "+d+")",3),n.shininess=W(a,b,p)):b==k?(A("Read material shininess strength chunk ("+c.toString(16)+", "+d+")",3),n.shininessStrength=W(a,b,p)):b==m?(A("Read material transparency chunk ("+c.toString(16)+", "+d+")",3),n.transparency=
|
||||
W(a,b,p)):b==s?(A("Read material texture map chunk ("+c.toString(16)+", "+d+")",3),Z(a,b,p,n)):(A("Skip chunk ("+b.toString(16)+", "+p+")",3),a.Skip(p-6))});if(void 0!==b.onMaterial&&null!==b.onMaterial)b.onMaterial(n)}function aa(a,c,d){A("Read faces chunk ("+c.toString(16)+", "+d+")",4);c=a.GetPosition()+d-6;var e=a.ReadUnsignedInteger16(),f,g,h,l;for(d=0;d<e;d++)if(f=a.ReadUnsignedInteger16(),g=a.ReadUnsignedInteger16(),h=a.ReadUnsignedInteger16(),l=a.ReadUnsignedInteger16(),void 0!==b.onFace&&
|
||||
null!==b.onFace)b.onFace(f,g,h,l);P(a,c,function(c,d){if(c==J){A("Read face materials chunk ("+c.toString(16)+", "+d+")",5);var f=R(a),g=a.ReadUnsignedInteger16(),h,l;for(h=0;h<g;h++)if(l=a.ReadUnsignedInteger16(),void 0!==b.onFaceMaterial&&null!==b.onFaceMaterial)b.onFaceMaterial(l,f)}else if(c==I){A("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 A("Skip chunk ("+c.toString(16)+", "+d+")",5),a.Skip(d-6)})}function ba(a,c,d,e){A("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;P(a,c,function(c,d){if(c==z){A("Read vertices chunk ("+c.toString(16)+", "+d+")",4);var e=a.ReadUnsignedInteger16(),f,g,h,l;for(f=0;f<e;f++)if(g=a.ReadFloat32(),h=a.ReadFloat32(),l=a.ReadFloat32(),void 0!==b.onVertex&&null!==b.onVertex)b.onVertex(g,h,l)}else if(c==B){A("Read texture vertices chunk ("+
|
||||
@ -299,24 +300,24 @@ a.Skip(d-6)})}function ca(a,b,c){A("Read object chunk ("+b.toString(16)+", "+c+"
|
||||
b.toString(16)+", "+c+")",2),a.Skip(c-6))})}function ea(a,c,d){function e(a,b){var c=[];a.Skip(10);var d,f,g,h=a.ReadInteger32();for(d=0;d<h;d++)a.ReadInteger32(),f=a.ReadUnsignedInteger16(),0!==f&&a.ReadFloat32(),b==S?(g=a.ReadFloat32(),f=X(a),f[3]=g):f=X(a),c.push(f);return c}A("Read object node chunk ("+c.toString(16)+", "+d+")",2);var f={name:"",nodeId:-1,flags:-1,userId:-1,pivot:[0,0,0],positions:[],rotations:[],scales:[]};c=a.GetPosition()+d-6;P(a,c,function(b,c){b==G?(f.name=R(a),f.flags=a.ReadUnsignedInteger32(),
|
||||
f.userId=a.ReadUnsignedInteger16()):b==M?f.pivot=X(a):b==T?f.positions=e(a,T):b==S?f.rotations=e(a,S):b==U?f.scales=e(a,U):b==Y?f.nodeId=a.ReadUnsignedInteger16():(A("Skip chunk ("+b.toString(16)+", "+c+")",3),a.Skip(c-6))});if(void 0!==b.onObjectNode&&null!==b.onObjectNode)b.onObjectNode(f)}function fa(a,b,c){A("Read keyframe chunk ("+b.toString(16)+", "+c+")",1);b=a.GetPosition()+c-6;P(a,b,function(b,c){b==Q?ea(a,b,c):(A("Skip chunk ("+b.toString(16)+", "+c+")",2),a.Skip(c-6))})}function ga(a,b,
|
||||
d){A("Read main chunk ("+b.toString(16)+", "+d+")",0);b=a.GetPosition()+d-6;P(a,b,function(b,d){b==c?da(a,b,d):b==E?fa(a,b,d):(A("Skip chunk ("+b.toString(16)+", "+d+")",1),a.Skip(d-6))})}var ha=a.GetByteLength();P(a,ha,function(b,c){19789==b?ga(a,b,c):(A("Skip chunk ("+b.toString(16)+", "+c+")",0),a.Skip(c-6))})})(new JSM.BinaryReader(a,!0))};
|
||||
JSM.Convert3dsToJsonData=function(a,b){function c(a){return void 0!==b.onFileRequested&&null!==b.onFileRequested?b.onFileRequested(a):null}if(void 0===b||null===b)b={};var d=new JSM.TriangleModel,e=null,f={},h={},g={nodes:[],nodeIdToIndex:{}};JSM.Read3dsFile(a,{onMaterial:function(a){if(void 0===f[a.name]){var b=d.AddMaterial({name:a.name,ambient:a.ambient,diffuse:a.diffuse,specular:a.specular,shininess:void 0===a.shininess||null===a.shininess||void 0===a.shininessStrength||null===a.shininessStrength?
|
||||
0:a.shininess*a.shininessStrength,opacity:void 0===a.transparency||null===a.transparency?1:1-a.transparency}),e=d.GetMaterial(b);if(void 0!==a.texture&&null!==a.texture){var g=c(a.texture);null!==g&&(g=new window.Blob([g]),g=window.URL.createObjectURL(g),e.texture=g,e.offset=a.offset,e.scale=a.scale,e.rotation=-a.rotation)}f[a.name]=b}},onMesh:function(a){if(void 0===h[a]){var b=d.AddBody(new JSM.TriangleBody(a));e=d.GetBody(b);e.meshData={faceToMaterial:{},faceToSmoothingGroup:{},objectNodes:[],
|
||||
transformation:null};h[a]=b}},onTransformation:function(a){null!==e&&(e.meshData.transformation=a)},onObjectNode:function(a){var b=g.nodes.length;g.nodes.push(a);g.nodeIdToIndex[a.nodeId]=b;a=h[a.name];void 0!==a&&d.GetBody(a).meshData.objectNodes.push(b)},onVertex:function(a,b,c){null!==e&&e.AddVertex(a,b,c)},onTextureVertex:function(a,b){null!==e&&e.AddUV(a,b)},onFace:function(a,b,c){null!==e&&e.AddTriangle(a,b,c)},onFaceMaterial:function(a,b){null!==e&&(e.meshData.faceToMaterial[a]=b)},onFaceSmoothingGroup:function(a,
|
||||
JSM.Convert3dsToJsonData=function(a,b){function c(a){return void 0!==b.onFileRequested&&null!==b.onFileRequested?b.onFileRequested(a):null}if(void 0===b||null===b)b={};var d=new JSM.TriangleModel,e=null,f={},g={},h={nodes:[],nodeIdToIndex:{}};JSM.Read3dsFile(a,{onMaterial:function(a){if(void 0===f[a.name]){var b=d.AddMaterial({name:a.name,ambient:a.ambient,diffuse:a.diffuse,specular:a.specular,shininess:void 0===a.shininess||null===a.shininess||void 0===a.shininessStrength||null===a.shininessStrength?
|
||||
0:a.shininess*a.shininessStrength,opacity:void 0===a.transparency||null===a.transparency?1:1-a.transparency}),e=d.GetMaterial(b);if(void 0!==a.texture&&null!==a.texture){var g=c(a.texture);null!==g&&(g=new window.Blob([g]),g=window.URL.createObjectURL(g),e.texture=g,e.offset=a.offset,e.scale=a.scale,e.rotation=-a.rotation)}f[a.name]=b}},onMesh:function(a){if(void 0===g[a]){var b=d.AddBody(new JSM.TriangleBody(a));e=d.GetBody(b);e.meshData={faceToMaterial:{},faceToSmoothingGroup:{},objectNodes:[],
|
||||
transformation:null};g[a]=b}},onTransformation:function(a){null!==e&&(e.meshData.transformation=a)},onObjectNode:function(a){var b=h.nodes.length;h.nodes.push(a);h.nodeIdToIndex[a.nodeId]=b;a=g[a.name];void 0!==a&&d.GetBody(a).meshData.objectNodes.push(b)},onVertex:function(a,b,c){null!==e&&e.AddVertex(a,b,c)},onTextureVertex:function(a,b){null!==e&&e.AddUV(a,b)},onFace:function(a,b,c){null!==e&&e.AddTriangle(a,b,c)},onFaceMaterial:function(a,b){null!==e&&(e.meshData.faceToMaterial[a]=b)},onFaceSmoothingGroup:function(a,
|
||||
b){null!==e&&(e.meshData.faceToSmoothingGroup[a]=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 l(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=l(b.nodes[d],b),c=JSM.MatrixMultiply(c,d)));return a.matrix=c}var k=a.meshData;k=void 0===k||null===k?null:k.transformation;if(null!==k){var n=null,n=null!==b?l(b,c):k;c=JSM.MatrixClone(n);n=JSM.MatrixClone(k);k=JSM.MatrixInvert(n);null!==k&&(h(a,n,k),b=void 0===b||null===b?[0,0,0]:b.pivot,f(c,[-b[0],-b[1],-b[2]]),b=JSM.MatrixMultiply(k,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,l;for(g=0;g<a.TriangleCount();g++)h=a.GetTriangle(g),b&&(h.u0=h.v0,h.u1=h.v1,h.u2=h.v2),l=f.faceToMaterial[g],void 0!==l&&(l=c[l],void 0!==l&&(h.mat=l)),l=f.faceToSmoothingGroup[g],void 0!==l&&0<l&&(h.curve=l)}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,r,v,C;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{v=a.nodes[u.objectNodes[0]];
|
||||
for(h=1;h<u.objectNodes.length;h++)r=a.nodes[u.objectNodes[h]],C=f(b,w,g+1,h+1),C.meshData=w.meshData,e(C,r,c,a),g+=1;e(w,v,c,a)}})(g,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 h(a){return void 0!==b.onFileRequested&&null!==b.onFileRequested?b.onFileRequested(a):null}function g(a){function g(a,
|
||||
for(h=1;h<u.objectNodes.length;h++)r=a.nodes[u.objectNodes[h]],C=f(b,w,g+1,h+1),C.meshData=w.meshData,e(C,r,c,a),g+=1;e(w,v,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=[],t=[],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&&t.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,t)}}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=g(a,"map_Kd"),void 0!==b.onMaterialTexture&&null!==b.onMaterialTexture))b.onMaterialTexture(n)}else"mtllib"==n[0]&&!(2>n.length)&&(n=g(a,"mtllib"),n=h(n.trim()),null!==n&&l(n))}}function l(a){a=a.split("\n");
|
||||
var b,c;for(b=0;b<a.length;b++)c=a[b].trim(),g(c)}if(void 0===b||null===b)b={};l(a)};
|
||||
JSM.ConvertObjToJsonData=function(a,b){function c(a){return void 0!==b.onFileRequested&&null!==b.onFileRequested?b.onFileRequested(a):null}if(void 0===b||null===b)b={};var d=new JSM.TriangleModel,e=d.AddBody(new JSM.TriangleBody("Default")),f=d.GetBody(e),h={},g=null,l=null,k=[],m=[],n=[];JSM.ReadObjFile(a,{onNewMaterial:function(a){var b=d.AddMaterial({name:a});g=d.GetMaterial(b);h[a]=b},onMaterialComponent:function(a,b,c,d){null!==g&&("Ka"==a?g.ambient=[b,c,d]:"Kd"==a?g.diffuse=[b,c,d]:"Ks"==a&&
|
||||
(g.specular=[b,c,d]))},onMaterialParameter:function(a,b){if(null!==g)if("Ns"==a)g.shininess=0,JSM.IsPositive(b)&&(g.shininess=(Math.log2(parseFloat(b))-1)/10);else if("Tr"==a||"d"==a)g.opacity=parseFloat(b)},onMaterialTexture:function(a){null!==g&&(a=c(a),null!==a&&(a=new window.Blob([a]),a=window.URL.createObjectURL(a),g.texture=a))},onUseMaterial:function(a){a=h[a];void 0!==a&&(l=a)},onMesh:function(a){a=d.AddBody(new JSM.TriangleBody(a));f=d.GetBody(a)},onVertex:function(a,b,c){k.push(new JSM.Coord(a,
|
||||
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&&l(n))}}function l(a){a=a.split("\n");
|
||||
var b,c;for(b=0;b<a.length;b++)c=a[b].trim(),h(c)}if(void 0===b||null===b)b={};l(a)};
|
||||
JSM.ConvertObjToJsonData=function(a,b){function c(a){return void 0!==b.onFileRequested&&null!==b.onFileRequested?b.onFileRequested(a):null}if(void 0===b||null===b)b={};var d=new JSM.TriangleModel,e=d.AddBody(new JSM.TriangleBody("Default")),f=d.GetBody(e),g={},h=null,l=null,k=[],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,b){if(null!==h)if("Ns"==a)h.shininess=0,JSM.IsPositive(b)&&(h.shininess=(Math.log2(parseFloat(b))-1)/10);else if("Tr"==a||"d"==a)h.opacity=parseFloat(b)},onMaterialTexture:function(a){null!==h&&(a=c(a),null!==a&&(a=new window.Blob([a]),a=window.URL.createObjectURL(a),h.texture=a))},onUseMaterial:function(a){a=g[a];void 0!==a&&(l=a)},onMesh:function(a){a=d.AddBody(new JSM.TriangleBody(a));f=d.GetBody(a)},onVertex:function(a,b,c){k.push(new JSM.Coord(a,
|
||||
b,c))},onNormal:function(a,b,c){m.push(new JSM.Coord(a,b,c))},onTexCoord:function(a,b){n.push(new JSM.Coord2D(a,b))},onFace:function(a,b,c){var d,e,g=b.length==a.length,h=c.length==a.length,k=a.length;for(d=0;d<k-2;d++)e=f.AddTriangle(a[0],a[(d+1)%k],a[(d+2)%k]),e=f.GetTriangle(e),g&&(e.n0=b[0],e.n1=b[(d+1)%k],e.n2=b[(d+2)%k]),h&&(e.u0=c[0],e.u1=c[(d+1)%k],e.u2=c[(d+2)%k]),null!==l&&(e.mat=l)},onFileRequested:c});(function(a,b,c){function d(a,b,c,e,f){if(void 0!==c){var g=e[c];if(void 0!==g)return g;
|
||||
if(!(0>c||c>=b.length))return b=b[c],0===f?g=a.AddVertex(b.x,b.y,b.z):1===f?g=a.AddNormal(b.x,b.y,b.z):2===f&&(g=a.AddUV(b.x,b.y)),e[c]=g}}var e,f,g,h,l,k,m;for(e=0;e<a.BodyCount();e++){g=a.GetBody(e);l={};k={};m={};for(f=0;f<g.TriangleCount();f++)h=g.GetTriangle(f),h.v0=d(g,b,h.v0,l,0),h.v1=d(g,b,h.v1,l,0),h.v2=d(g,b,h.v2,l,0),h.n0=d(g,c,h.n0,k,1),h.n1=d(g,c,h.n1,k,1),h.n2=d(g,c,h.n2,k,1),h.u0=d(g,n,h.u0,m,2),h.u1=d(g,n,h.u1,m,2),h.u2=d(g,n,h.u2,m,2)}})(d,k,m,n);d.Finalize();return JSM.ConvertTriangleModelToJsonData(d)};
|
||||
JSM.ReadBinaryStlFile=function(a,b){function c(a){var b=[],c;for(c=0;3>c;c++)b[c]=a.ReadFloat32();return b}if(void 0===b||null===b)b={};var d=new JSM.BinaryReader(a,!0);d.Skip(80);var e=d.ReadUnsignedInteger32(),f,h,g,l,k;for(f=0;f<e;f++)if(k=c(d),h=c(d),g=c(d),l=c(d),d.Skip(2),void 0!==b.onFace&&null!==b.onFace)b.onFace(h,g,l,k)};
|
||||
JSM.ReadBinaryStlFile=function(a,b){function c(a){var b=[],c;for(c=0;3>c;c++)b[c]=a.ReadFloat32();return b}if(void 0===b||null===b)b={};var d=new JSM.BinaryReader(a,!0);d.Skip(80);var e=d.ReadUnsignedInteger32(),f,g,h,l,k;for(f=0;f<e;f++)if(k=c(d),g=c(d),h=c(d),l=c(d),d.Skip(2),void 0!==b.onFace&&null!==b.onFace)b.onFace(g,h,l,k)};
|
||||
JSM.ReadAsciiStlFile=function(a,b){function c(a,c){var d=a[c].trim();if(0===d.length)return c+1;d=d.split(/\s+/);if(0===d.length)return c+1;if("solid"!=d[0]&&"facet"==d[0]&&"normal"==d[1]){if(5>d.length)return-1;var d=[parseFloat(d[2]),parseFloat(d[3]),parseFloat(d[4])],e=[],k,m;for(k=c+1;k<a.length&&3>e.length;k++)if(m=a[k].trim(),0!==m.length&&(m=m.split(/\s+/),0!==m.length&&"vertex"==m[0]))if(4>m.length)break;else m=[parseFloat(m[1]),parseFloat(m[2]),parseFloat(m[3])],e.push(m);k+=1;if(3!=e.length)return-1;
|
||||
if(void 0!==b.onFace&&null!==b.onFace)b.onFace(e[0],e[1],e[2],d);return k}return c+1}if(void 0===b||null===b)b={};for(var d=0,e=a.split("\n");d<e.length&&-1!=d;)d=c(e,d)};JSM.IsBinaryStlFile=function(a){var b=a.byteLength;if(84>b)return!1;a=new JSM.BinaryReader(a,!0);a.Skip(80);a=a.ReadUnsignedInteger32();return b!=50*a+84?!1:!0};
|
||||
JSM.ConvertStlToJsonData=function(a,b){var c=new JSM.TriangleModel,d=c.AddBody(new JSM.TriangleBody("Default")),e=c.GetBody(d);null!==a?JSM.ReadBinaryStlFile(a,{onFace:function(a,b,c,d){a=e.AddVertex(a[0],a[1],a[2]);b=e.AddVertex(b[0],b[1],b[2]);c=e.AddVertex(c[0],c[1],c[2]);d=(new JSM.Vector(d[0],d[1],d[2])).Normalize();d=e.AddNormal(d.x,d.y,d.z);e.AddTriangle(a,b,c,d,d,d)}}):null!==b&&JSM.ReadAsciiStlFile(b,{onFace:function(a,b,c,d){a=e.AddVertex(a[0],a[1],a[2]);b=e.AddVertex(b[0],b[1],b[2]);c=
|
||||
@ -326,9 +327,9 @@ JSM.ImportFileList.prototype.InitFromURLs=function(a){this.originalList=a;this.d
|
||||
JSM.ImportFileList.prototype.GetInputList=function(){var a=[],b,c,d;for(b=0;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;-1==d.requested.indexOf(a)&&d.requested.push(a);return b[e]}var f=a.GetMainFileIndex();if(-1===f)c();else{var h=a.GetFileDescriptor(f),g={main:h.originalFileName,requested:[],missing:[]},l=a.GetInputList();try{".3DS"==
|
||||
h.extension?JSM.LoadMultipleBuffers(l,function(b){var c=JSM.Convert3dsToJsonData(b[f],{onFileRequested:function(c){return e(a,b,c,g)}});d(g,c)}):".OBJ"==h.extension?JSM.LoadMultipleBuffers(l,function(b){var c=JSM.ConvertObjToJsonData(b[f],{onFileRequested:function(c){return e(a,b,c,g)}});d(g,c)}):".STL"==h.extension&&JSM.LoadMultipleBuffers(l,function(a){a=a[f];if(JSM.IsBinaryStlFile(a))a=JSM.ConvertStlToJsonData(a,null),d(g,a);else{for(a=0;a<l.length;a++)l[a].isArrayBuffer=!1;JSM.LoadMultipleBuffers(l,
|
||||
function(a){a=JSM.ConvertStlToJsonData(null,a[f]);d(g,a)})}})}catch(k){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:[]},l=a.GetInputList();try{".3DS"==
|
||||
g.extension?JSM.LoadMultipleBuffers(l,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(l,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(l,function(a){a=a[f];if(JSM.IsBinaryStlFile(a))a=JSM.ConvertStlToJsonData(a,null),d(h,a);else{for(a=0;a<l.length;a++)l[a].isArrayBuffer=!1;JSM.LoadMultipleBuffers(l,
|
||||
function(a){a=JSM.ConvertStlToJsonData(null,a[f]);d(h,a)})}})}catch(k){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"===
|
||||
@ -395,11 +396,11 @@ JSM.GenerateRhombicosidodecahedron=function(){var a=new JSM.Body,b=(1+Math.sqrt(
|
||||
[7,59,47,31]);JSM.AddPolygonToBody(a,[8,10,12,9]);JSM.AddPolygonToBody(a,[8,32,24,48]);JSM.AddPolygonToBody(a,[9,49,25,33]);JSM.AddPolygonToBody(a,[10,48,26,34]);JSM.AddPolygonToBody(a,[11,13,15,14]);JSM.AddPolygonToBody(a,[11,50,27,35]);JSM.AddPolygonToBody(a,[12,36,28,49]);JSM.AddPolygonToBody(a,[13,37,29,51]);JSM.AddPolygonToBody(a,[14,38,30,50]);JSM.AddPolygonToBody(a,[15,51,31,39]);JSM.AddPolygonToBody(a,[16,17,21,19]);JSM.AddPolygonToBody(a,[16,40,32,52]);JSM.AddPolygonToBody(a,[17,52,33,41]);
|
||||
JSM.AddPolygonToBody(a,[18,22,23,20]);JSM.AddPolygonToBody(a,[18,54,34,42]);JSM.AddPolygonToBody(a,[19,53,35,43]);JSM.AddPolygonToBody(a,[20,44,36,54]);JSM.AddPolygonToBody(a,[21,45,37,53]);JSM.AddPolygonToBody(a,[22,46,38,55]);JSM.AddPolygonToBody(a,[23,55,39,47]);JSM.AddPolygonToBody(a,[0,2,26,48,24]);JSM.AddPolygonToBody(a,[1,25,49,28,4]);JSM.AddPolygonToBody(a,[3,27,50,30,6]);JSM.AddPolygonToBody(a,[5,7,31,51,29]);JSM.AddPolygonToBody(a,[8,9,33,52,32]);JSM.AddPolygonToBody(a,[10,34,54,36,12]);
|
||||
JSM.AddPolygonToBody(a,[11,35,53,37,13]);JSM.AddPolygonToBody(a,[14,15,39,55,38]);JSM.AddPolygonToBody(a,[16,19,43,56,40]);JSM.AddPolygonToBody(a,[17,41,58,45,21]);JSM.AddPolygonToBody(a,[18,42,57,46,22]);JSM.AddPolygonToBody(a,[20,23,47,59,44]);return a};
|
||||
JSM.GenerateTruncatedIcosidodecahedron=function(){var a=new JSM.Body,b=(1+Math.sqrt(5))/2,c=1/b,d=3+b,e=2/b,f=1+2*b,h=Math.pow(b,2),g=-1+3*b,l=-1+2*b,k=2+b,m=2*b;JSM.AddVertexToBody(a,+c,+c,+d);JSM.AddVertexToBody(a,+c,+c,-d);JSM.AddVertexToBody(a,+c,-c,+d);JSM.AddVertexToBody(a,-c,+c,+d);JSM.AddVertexToBody(a,+c,-c,-d);JSM.AddVertexToBody(a,-c,+c,-d);JSM.AddVertexToBody(a,-c,-c,+d);JSM.AddVertexToBody(a,-c,-c,-d);JSM.AddVertexToBody(a,+c,+d,+c);JSM.AddVertexToBody(a,+c,-d,+c);JSM.AddVertexToBody(a,
|
||||
JSM.GenerateTruncatedIcosidodecahedron=function(){var a=new JSM.Body,b=(1+Math.sqrt(5))/2,c=1/b,d=3+b,e=2/b,f=1+2*b,g=Math.pow(b,2),h=-1+3*b,l=-1+2*b,k=2+b,m=2*b;JSM.AddVertexToBody(a,+c,+c,+d);JSM.AddVertexToBody(a,+c,+c,-d);JSM.AddVertexToBody(a,+c,-c,+d);JSM.AddVertexToBody(a,-c,+c,+d);JSM.AddVertexToBody(a,+c,-c,-d);JSM.AddVertexToBody(a,-c,+c,-d);JSM.AddVertexToBody(a,-c,-c,+d);JSM.AddVertexToBody(a,-c,-c,-d);JSM.AddVertexToBody(a,+c,+d,+c);JSM.AddVertexToBody(a,+c,-d,+c);JSM.AddVertexToBody(a,
|
||||
-c,+d,+c);JSM.AddVertexToBody(a,+c,+d,-c);JSM.AddVertexToBody(a,-c,-d,+c);JSM.AddVertexToBody(a,+c,-d,-c);JSM.AddVertexToBody(a,-c,+d,-c);JSM.AddVertexToBody(a,-c,-d,-c);JSM.AddVertexToBody(a,+d,+c,+c);JSM.AddVertexToBody(a,-d,+c,+c);JSM.AddVertexToBody(a,+d,+c,-c);JSM.AddVertexToBody(a,+d,-c,+c);JSM.AddVertexToBody(a,-d,+c,-c);JSM.AddVertexToBody(a,-d,-c,+c);JSM.AddVertexToBody(a,+d,-c,-c);JSM.AddVertexToBody(a,-d,-c,-c);JSM.AddVertexToBody(a,+e,+b,+f);JSM.AddVertexToBody(a,+e,+b,-f);JSM.AddVertexToBody(a,
|
||||
+e,-b,+f);JSM.AddVertexToBody(a,-e,+b,+f);JSM.AddVertexToBody(a,+e,-b,-f);JSM.AddVertexToBody(a,-e,+b,-f);JSM.AddVertexToBody(a,-e,-b,+f);JSM.AddVertexToBody(a,-e,-b,-f);JSM.AddVertexToBody(a,+b,+f,+e);JSM.AddVertexToBody(a,+b,-f,+e);JSM.AddVertexToBody(a,-b,+f,+e);JSM.AddVertexToBody(a,+b,+f,-e);JSM.AddVertexToBody(a,-b,-f,+e);JSM.AddVertexToBody(a,+b,-f,-e);JSM.AddVertexToBody(a,-b,+f,-e);JSM.AddVertexToBody(a,-b,-f,-e);JSM.AddVertexToBody(a,+f,+e,+b);JSM.AddVertexToBody(a,-f,+e,+b);JSM.AddVertexToBody(a,
|
||||
+f,+e,-b);JSM.AddVertexToBody(a,+f,-e,+b);JSM.AddVertexToBody(a,-f,+e,-b);JSM.AddVertexToBody(a,-f,-e,+b);JSM.AddVertexToBody(a,+f,-e,-b);JSM.AddVertexToBody(a,-f,-e,-b);JSM.AddVertexToBody(a,+c,+h,+g);JSM.AddVertexToBody(a,+c,+h,-g);JSM.AddVertexToBody(a,+c,-h,+g);JSM.AddVertexToBody(a,-c,+h,+g);JSM.AddVertexToBody(a,+c,-h,-g);JSM.AddVertexToBody(a,-c,+h,-g);JSM.AddVertexToBody(a,-c,-h,+g);JSM.AddVertexToBody(a,-c,-h,-g);JSM.AddVertexToBody(a,+h,+g,+c);JSM.AddVertexToBody(a,+h,-g,+c);JSM.AddVertexToBody(a,
|
||||
-h,+g,+c);JSM.AddVertexToBody(a,+h,+g,-c);JSM.AddVertexToBody(a,-h,-g,+c);JSM.AddVertexToBody(a,+h,-g,-c);JSM.AddVertexToBody(a,-h,+g,-c);JSM.AddVertexToBody(a,-h,-g,-c);JSM.AddVertexToBody(a,+g,+c,+h);JSM.AddVertexToBody(a,-g,+c,+h);JSM.AddVertexToBody(a,+g,+c,-h);JSM.AddVertexToBody(a,+g,-c,+h);JSM.AddVertexToBody(a,-g,+c,-h);JSM.AddVertexToBody(a,-g,-c,+h);JSM.AddVertexToBody(a,+g,-c,-h);JSM.AddVertexToBody(a,-g,-c,-h);JSM.AddVertexToBody(a,+l,2,+k);JSM.AddVertexToBody(a,+l,2,-k);JSM.AddVertexToBody(a,
|
||||
+f,+e,-b);JSM.AddVertexToBody(a,+f,-e,+b);JSM.AddVertexToBody(a,-f,+e,-b);JSM.AddVertexToBody(a,-f,-e,+b);JSM.AddVertexToBody(a,+f,-e,-b);JSM.AddVertexToBody(a,-f,-e,-b);JSM.AddVertexToBody(a,+c,+g,+h);JSM.AddVertexToBody(a,+c,+g,-h);JSM.AddVertexToBody(a,+c,-g,+h);JSM.AddVertexToBody(a,-c,+g,+h);JSM.AddVertexToBody(a,+c,-g,-h);JSM.AddVertexToBody(a,-c,+g,-h);JSM.AddVertexToBody(a,-c,-g,+h);JSM.AddVertexToBody(a,-c,-g,-h);JSM.AddVertexToBody(a,+g,+h,+c);JSM.AddVertexToBody(a,+g,-h,+c);JSM.AddVertexToBody(a,
|
||||
-g,+h,+c);JSM.AddVertexToBody(a,+g,+h,-c);JSM.AddVertexToBody(a,-g,-h,+c);JSM.AddVertexToBody(a,+g,-h,-c);JSM.AddVertexToBody(a,-g,+h,-c);JSM.AddVertexToBody(a,-g,-h,-c);JSM.AddVertexToBody(a,+h,+c,+g);JSM.AddVertexToBody(a,-h,+c,+g);JSM.AddVertexToBody(a,+h,+c,-g);JSM.AddVertexToBody(a,+h,-c,+g);JSM.AddVertexToBody(a,-h,+c,-g);JSM.AddVertexToBody(a,-h,-c,+g);JSM.AddVertexToBody(a,+h,-c,-g);JSM.AddVertexToBody(a,-h,-c,-g);JSM.AddVertexToBody(a,+l,2,+k);JSM.AddVertexToBody(a,+l,2,-k);JSM.AddVertexToBody(a,
|
||||
+l,-2,+k);JSM.AddVertexToBody(a,-l,2,+k);JSM.AddVertexToBody(a,+l,-2,-k);JSM.AddVertexToBody(a,-l,2,-k);JSM.AddVertexToBody(a,-l,-2,+k);JSM.AddVertexToBody(a,-l,-2,-k);JSM.AddVertexToBody(a,2,+k,+l);JSM.AddVertexToBody(a,2,-k,+l);JSM.AddVertexToBody(a,-2,+k,+l);JSM.AddVertexToBody(a,2,+k,-l);JSM.AddVertexToBody(a,-2,-k,+l);JSM.AddVertexToBody(a,2,-k,-l);JSM.AddVertexToBody(a,-2,+k,-l);JSM.AddVertexToBody(a,-2,-k,-l);JSM.AddVertexToBody(a,+k,+l,2);JSM.AddVertexToBody(a,-k,+l,2);JSM.AddVertexToBody(a,
|
||||
+k,+l,-2);JSM.AddVertexToBody(a,+k,-l,2);JSM.AddVertexToBody(a,-k,+l,-2);JSM.AddVertexToBody(a,-k,-l,2);JSM.AddVertexToBody(a,+k,-l,-2);JSM.AddVertexToBody(a,-k,-l,-2);JSM.AddVertexToBody(a,+b,3,+m);JSM.AddVertexToBody(a,+b,3,-m);JSM.AddVertexToBody(a,+b,-3,+m);JSM.AddVertexToBody(a,-b,3,+m);JSM.AddVertexToBody(a,+b,-3,-m);JSM.AddVertexToBody(a,-b,3,-m);JSM.AddVertexToBody(a,-b,-3,+m);JSM.AddVertexToBody(a,-b,-3,-m);JSM.AddVertexToBody(a,3,+m,+b);JSM.AddVertexToBody(a,3,-m,+b);JSM.AddVertexToBody(a,
|
||||
-3,+m,+b);JSM.AddVertexToBody(a,3,+m,-b);JSM.AddVertexToBody(a,-3,-m,+b);JSM.AddVertexToBody(a,3,-m,-b);JSM.AddVertexToBody(a,-3,+m,-b);JSM.AddVertexToBody(a,-3,-m,-b);JSM.AddVertexToBody(a,+m,+b,3);JSM.AddVertexToBody(a,-m,+b,3);JSM.AddVertexToBody(a,+m,+b,-3);JSM.AddVertexToBody(a,+m,-b,3);JSM.AddVertexToBody(a,-m,+b,-3);JSM.AddVertexToBody(a,-m,-b,3);JSM.AddVertexToBody(a,+m,-b,-3);JSM.AddVertexToBody(a,-m,-b,-3);JSM.AddPolygonToBody(a,[0,3,6,2]);JSM.AddPolygonToBody(a,[1,4,7,5]);JSM.AddPolygonToBody(a,
|
||||
@ -409,9 +410,9 @@ 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,h=d+e/b+b,g=-(d*b)+e+1/b,l=d/b+e*b-1,k=-(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,t=d*b+e+1/b,s=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,
|
||||
-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,+h,+g,-l);JSM.AddVertexToBody(a,+h,-g,+l);JSM.AddVertexToBody(a,-h,+g,+l);JSM.AddVertexToBody(a,-h,-g,-l);JSM.AddVertexToBody(a,+g,-l,+h);JSM.AddVertexToBody(a,-g,+l,+h);JSM.AddVertexToBody(a,+g,+l,-h);JSM.AddVertexToBody(a,-g,-l,-h);JSM.AddVertexToBody(a,
|
||||
-l,+h,+g);JSM.AddVertexToBody(a,+l,+h,-g);JSM.AddVertexToBody(a,+l,-h,+g);JSM.AddVertexToBody(a,-l,-h,-g);JSM.AddVertexToBody(a,+k,+m,-n);JSM.AddVertexToBody(a,+k,-m,+n);JSM.AddVertexToBody(a,-k,+m,+n);JSM.AddVertexToBody(a,-k,-m,-n);JSM.AddVertexToBody(a,+m,-n,+k);JSM.AddVertexToBody(a,-m,+n,+k);JSM.AddVertexToBody(a,+m,+n,-k);JSM.AddVertexToBody(a,-m,-n,-k);JSM.AddVertexToBody(a,-n,+k,+m);JSM.AddVertexToBody(a,+n,+k,-m);JSM.AddVertexToBody(a,+n,-k,+m);JSM.AddVertexToBody(a,-n,-k,-m);JSM.AddVertexToBody(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,l=d/b+e*b-1,k=-(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,t=d*b+e+1/b,s=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,
|
||||
-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,-l);JSM.AddVertexToBody(a,+g,-h,+l);JSM.AddVertexToBody(a,-g,+h,+l);JSM.AddVertexToBody(a,-g,-h,-l);JSM.AddVertexToBody(a,+h,-l,+g);JSM.AddVertexToBody(a,-h,+l,+g);JSM.AddVertexToBody(a,+h,+l,-g);JSM.AddVertexToBody(a,-h,-l,-g);JSM.AddVertexToBody(a,
|
||||
-l,+g,+h);JSM.AddVertexToBody(a,+l,+g,-h);JSM.AddVertexToBody(a,+l,-g,+h);JSM.AddVertexToBody(a,-l,-g,-h);JSM.AddVertexToBody(a,+k,+m,-n);JSM.AddVertexToBody(a,+k,-m,+n);JSM.AddVertexToBody(a,-k,+m,+n);JSM.AddVertexToBody(a,-k,-m,-n);JSM.AddVertexToBody(a,+m,-n,+k);JSM.AddVertexToBody(a,-m,+n,+k);JSM.AddVertexToBody(a,+m,+n,-k);JSM.AddVertexToBody(a,-m,-n,-k);JSM.AddVertexToBody(a,-n,+k,+m);JSM.AddVertexToBody(a,+n,+k,-m);JSM.AddVertexToBody(a,+n,-k,+m);JSM.AddVertexToBody(a,-n,-k,-m);JSM.AddVertexToBody(a,
|
||||
+p,+q,-t);JSM.AddVertexToBody(a,+p,-q,+t);JSM.AddVertexToBody(a,-p,+q,+t);JSM.AddVertexToBody(a,-p,-q,-t);JSM.AddVertexToBody(a,+q,-t,+p);JSM.AddVertexToBody(a,-q,+t,+p);JSM.AddVertexToBody(a,+q,+t,-p);JSM.AddVertexToBody(a,-q,-t,-p);JSM.AddVertexToBody(a,-t,+p,+q);JSM.AddVertexToBody(a,+t,+p,-q);JSM.AddVertexToBody(a,+t,-p,+q);JSM.AddVertexToBody(a,-t,-p,-q);JSM.AddVertexToBody(a,+s,+w,-b);JSM.AddVertexToBody(a,+s,-w,+b);JSM.AddVertexToBody(a,-s,+w,+b);JSM.AddVertexToBody(a,-s,-w,-b);JSM.AddVertexToBody(a,
|
||||
+w,-b,+s);JSM.AddVertexToBody(a,-w,+b,+s);JSM.AddVertexToBody(a,+w,+b,-s);JSM.AddVertexToBody(a,-w,-b,-s);JSM.AddVertexToBody(a,-b,+s,+w);JSM.AddVertexToBody(a,+b,+s,-w);JSM.AddVertexToBody(a,+b,-s,+w);JSM.AddVertexToBody(a,-b,-s,-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]);
|
||||
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,
|
||||
@ -420,7 +421,7 @@ JSM.AddPolygonToBody(a,[2,29,14]);JSM.AddPolygonToBody(a,[2,49,29]);JSM.AddPolyg
|
||||
JSM.AddPolygonToBody(a,[24,58,36]);JSM.AddPolygonToBody(a,[25,57,37]);JSM.AddPolygonToBody(a,[26,59,38]);JSM.AddPolygonToBody(a,[27,56,39]);JSM.AddPolygonToBody(a,[28,50,40]);JSM.AddPolygonToBody(a,[29,49,41]);JSM.AddPolygonToBody(a,[30,51,42]);JSM.AddPolygonToBody(a,[31,48,43]);JSM.AddPolygonToBody(a,[32,54,44]);JSM.AddPolygonToBody(a,[33,53,45]);JSM.AddPolygonToBody(a,[34,55,46]);JSM.AddPolygonToBody(a,[35,52,47]);JSM.AddPolygonToBody(a,[36,43,48]);JSM.AddPolygonToBody(a,[36,46,43]);JSM.AddPolygonToBody(a,
|
||||
[36,58,46]);JSM.AddPolygonToBody(a,[37,41,49]);JSM.AddPolygonToBody(a,[37,45,41]);JSM.AddPolygonToBody(a,[37,57,45]);JSM.AddPolygonToBody(a,[38,40,50]);JSM.AddPolygonToBody(a,[38,47,40]);JSM.AddPolygonToBody(a,[38,59,47]);JSM.AddPolygonToBody(a,[39,42,51]);JSM.AddPolygonToBody(a,[39,44,42]);JSM.AddPolygonToBody(a,[39,56,44]);JSM.AddPolygonToBody(a,[40,47,52]);JSM.AddPolygonToBody(a,[41,45,53]);JSM.AddPolygonToBody(a,[42,44,54]);JSM.AddPolygonToBody(a,[43,46,55]);JSM.AddPolygonToBody(a,[0,12,24,36,
|
||||
48]);JSM.AddPolygonToBody(a,[1,13,25,37,49]);JSM.AddPolygonToBody(a,[2,14,26,38,50]);JSM.AddPolygonToBody(a,[3,15,27,39,51]);JSM.AddPolygonToBody(a,[4,16,28,40,52]);JSM.AddPolygonToBody(a,[5,17,29,41,53]);JSM.AddPolygonToBody(a,[6,18,30,42,54]);JSM.AddPolygonToBody(a,[7,19,31,43,55]);JSM.AddPolygonToBody(a,[8,20,32,44,56]);JSM.AddPolygonToBody(a,[9,21,33,45,57]);JSM.AddPolygonToBody(a,[10,22,34,46,58]);JSM.AddPolygonToBody(a,[11,23,35,47,59]);return a};
|
||||
JSM.AddCumulatedPolygonToBody=function(a,b,c){var d=new JSM.Coord(0,0,0),e=new JSM.Vector(0,0,0),f=[],h;for(h=0;h<b.length;h++)f.push(a.GetVertexPosition(b[h]));h=JSM.CalculateCentroid(f);f=JSM.CalculateNormal(f);d.Set(h.x,h.y,h.z);e.Set(f.x,f.y,f.z);d.Offset(e,c);c=a.VertexCount();JSM.AddVertexToBody(a,d.x,d.y,d.z);d=b.length;for(e=0;e<d;e++)f=b[e],h=b[e<d-1?e+1:0],JSM.AddPolygonToBody(a,[f,h,c])};
|
||||
JSM.AddCumulatedPolygonToBody=function(a,b,c){var d=new JSM.Coord(0,0,0),e=new JSM.Vector(0,0,0),f=[],g;for(g=0;g<b.length;g++)f.push(a.GetVertexPosition(b[g]));g=JSM.CalculateCentroid(f);f=JSM.CalculateNormal(f);d.Set(g.x,g.y,g.z);e.Set(f.x,f.y,f.z);d.Offset(e,c);c=a.VertexCount();JSM.AddVertexToBody(a,d.x,d.y,d.z);d=b.length;for(e=0;e<d;e++)f=b[e],g=b[e<d-1?e+1:0],JSM.AddPolygonToBody(a,[f,g,c])};
|
||||
JSM.GenerateCumulatedTetrahedron=function(a){var b=new JSM.Body;b.AddVertex(new JSM.BodyVertex(new JSM.Coord(1,1,1)));b.AddVertex(new JSM.BodyVertex(new JSM.Coord(-1,-1,1)));b.AddVertex(new JSM.BodyVertex(new JSM.Coord(-1,1,-1)));b.AddVertex(new JSM.BodyVertex(new JSM.Coord(1,-1,-1)));a*=2*Math.sqrt(2);JSM.AddCumulatedPolygonToBody(b,[0,1,3],a);JSM.AddCumulatedPolygonToBody(b,[0,2,1],a);JSM.AddCumulatedPolygonToBody(b,[0,3,2],a);JSM.AddCumulatedPolygonToBody(b,[1,2,3],a);return b};
|
||||
JSM.GenerateCumulatedHexahedron=function(a){var b=new JSM.Body;JSM.AddVertexToBody(b,1,1,1);JSM.AddVertexToBody(b,1,1,-1);JSM.AddVertexToBody(b,1,-1,1);JSM.AddVertexToBody(b,-1,1,1);JSM.AddVertexToBody(b,1,-1,-1);JSM.AddVertexToBody(b,-1,1,-1);JSM.AddVertexToBody(b,-1,-1,1);JSM.AddVertexToBody(b,-1,-1,-1);a*=2;JSM.AddCumulatedPolygonToBody(b,[0,1,5,3],a);JSM.AddCumulatedPolygonToBody(b,[0,2,4,1],a);JSM.AddCumulatedPolygonToBody(b,[0,3,6,2],a);JSM.AddCumulatedPolygonToBody(b,[1,4,7,5],a);JSM.AddCumulatedPolygonToBody(b,
|
||||
[2,6,7,4],a);JSM.AddCumulatedPolygonToBody(b,[3,5,7,6],a);return b};
|
||||
@ -435,29 +436,29 @@ 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,h){function g(a,b){var c,d;for(c=0;c<a.VertexCount();c++)d=a.GetVertex(c),d.position=JSM.CoordAdd(d.position,b)}var l=new JSM.LegoDimensions,k=new JSM.Vector(0,0,1),m=l.legoWidth,n=l.legoLargeHeight;c||(n=l.legoSmallHeight);c=l.legoWallWidth;var p=l.legoCylinderWidth,q=l.legoCylinderHeight,t=l.legoBottomSmallCylinderWidth,s=l.legoBottomLargeCylinderWidth,w=l.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 l=new JSM.Body,r=JSM.GeneratePrismShell(u,k,n-c,c,!0);l.Merge(r);for(r=0;4>r;r++)u[r].z=n-c;r=JSM.GeneratePrism(u,k,c,!0,null);l.Merge(r);if(d)for(r=0;r<a;r++)for(u=0;u<b;u++)d=new JSM.Coord(m*r+m/2,m*u+m/2,n+q/2),k=JSM.GenerateCylinder(p/2,q,f,!0,h),g(k,d),l.Merge(k);if(e)if(1===a&&1<b||1===b&&1<a){e=b;p=!0;a>b&&(e=a,p=!1);for(r=0;r<e-1;r++)d=p?new JSM.Coord(m/2,m*(r+1),(n-c)/2):new JSM.Coord(m*(r+1),m/2,(n-c)/2),k=JSM.GenerateCylinder(t/
|
||||
2,n-c,f,!0,h),g(k,d),l.Merge(k)}else if(1<a&&1<b)for(r=0;r<a-1;r++)for(u=0;u<b-1;u++)d=new JSM.Coord(m*(r+1),m*(u+1),(n-c)/2),k=JSM.GenerateCylinderShell(s/2,n-c,w,f,!0,h),g(k,d),l.Merge(k);l.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 l};
|
||||
JSM.GenerateConvexHullBody=function(a){var b=new JSM.Body,c=JSM.ConvexHull3D(a),d={},e,f,h,g;for(e=0;e<c.length;e++){h=c[e];for(f=0;f<h.length;f++)g=h[f],g in d||(d[g]=b.VertexCount(),b.AddVertex(new JSM.BodyVertex(a[g])))}for(e=0;e<c.length;e++){h=c[e];a=[];for(f=0;f<h.length;f++)g=h[f],a.push(d[g]);b.AddPolygon(new JSM.BodyPolygon(a))}return b};
|
||||
JSM.GenerateSuperShape=function(a,b,c,d,e,f,h,g,l,k,m,n,p,q){function t(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 w(p,q){var r=new JSM.Coord(0,0,0),u=s(p,h,g,l,k,m,n),w=s(q,a,b,c,d,e,f);r.x=w*Math.cos(q)*u*Math.cos(p);r.y=w*Math.sin(q)*u*Math.cos(p);r.z=u*Math.sin(p);return r}p=JSM.GenerateSphere(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 l=new JSM.LegoDimensions,k=new JSM.Vector(0,0,1),m=l.legoWidth,n=l.legoLargeHeight;c||(n=l.legoSmallHeight);c=l.legoWallWidth;var p=l.legoCylinderWidth,q=l.legoCylinderHeight,t=l.legoBottomSmallCylinderWidth,s=l.legoBottomLargeCylinderWidth,w=l.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 l=new JSM.Body,r=JSM.GeneratePrismShell(u,k,n-c,c,!0);l.Merge(r);for(r=0;4>r;r++)u[r].z=n-c;r=JSM.GeneratePrism(u,k,c,!0,null);l.Merge(r);if(d)for(r=0;r<a;r++)for(u=0;u<b;u++)d=new JSM.Coord(m*r+m/2,m*u+m/2,n+q/2),k=JSM.GenerateCylinder(p/2,q,f,!0,g),h(k,d),l.Merge(k);if(e)if(1===a&&1<b||1===b&&1<a){e=b;p=!0;a>b&&(e=a,p=!1);for(r=0;r<e-1;r++)d=p?new JSM.Coord(m/2,m*(r+1),(n-c)/2):new JSM.Coord(m*(r+1),m/2,(n-c)/2),k=JSM.GenerateCylinder(t/
|
||||
2,n-c,f,!0,g),h(k,d),l.Merge(k)}else if(1<a&&1<b)for(r=0;r<a-1;r++)for(u=0;u<b-1;u++)d=new JSM.Coord(m*(r+1),m*(u+1),(n-c)/2),k=JSM.GenerateCylinderShell(s/2,n-c,w,f,!0,g),h(k,d),l.Merge(k);l.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 l};
|
||||
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,l,k,m,n,p,q){function t(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 w(p,q){var r=new JSM.Coord(0,0,0),u=s(p,g,h,l,k,m,n),w=s(q,a,b,c,d,e,f);r.x=w*Math.cos(q)*u*Math.cos(p);r.y=w*Math.sin(q)*u*Math.cos(p);r.z=u*Math.sin(p);return r}p=JSM.GenerateSphere(1,
|
||||
p,q);var u,r;for(q=0;q<p.VertexCount();q++)u=p.GetVertex(q),r=u.position,r=t(r),r=w(r[1],r[2]),u.SetPosition(r);return p};
|
||||
JSM.OrderPolygons=function(a,b,c){var d=[],e=[],f=[],h=[],g=[],l=[],k=[],m=a.PolygonCount(),n,p;for(n=0;n<m;n++){l.push(n);k.push([]);for(p=0;p<m;p++)k[n].push(null)}(function(){var l=JSM.CoordSub(c,b).Normalize(),l=JSM.GetPlaneFromCoordAndDirection(b,l),k,n,m,p,r,v;for(k=0;k<a.PolygonCount();k++){r=JSM.Inf;v=-JSM.Inf;m=a.GetPolygon(k);for(n=0;n<m.VertexIndexCount();n++)p=a.GetVertexPosition(m.GetVertexIndex(n)),p=l.CoordDistance(p),JSM.IsLower(p,r)&&(r=p),JSM.IsGreater(p,v)&&(v=p);d.push(r);e.push(v);
|
||||
n=a.GetPolygon(k);m=new JSM.Coord(0,0,0);v=r=void 0;for(r=0;r<n.VertexIndexCount();r++)v=a.GetVertexPosition(n.GetVertexIndex(r)),m=JSM.CoordAdd(m,v);m.MultiplyScalar(1/n.VertexIndexCount());n=m;m=l.CoordDistance(n);f.push(n);h.push(m);m=JSM.CalculateBodyPolygonNormal(a,k);r=JSM.CoordSub(n,b).Normalize();r=JSM.VectorDot(m,r);JSM.IsGreaterOrEqual(r,0)&&m.MultiplyScalar(-1);n=JSM.GetPlaneFromCoordAndDirection(n,m);g.push(n)}})();(function(){var a=l.length,b,c;for(b=0;b<a-1;b++)for(c=0;c<a-b-1;c++){var d;
|
||||
d=l[c];var f=l[c+1];d=JSM.IsLower(e[d],e[f])?!0:JSM.IsEqual(e[d],e[f])&&JSM.IsLower(h[d],h[f])?!0:!1;if(d){d=l;var f=c+1,g=d[c];d[c]=d[f];d[f]=g}}})();(function(){var b=l.length,c,f;for(c=0;c<b-1;c++)for(f=0;f<b-c-1;f++){var h;h=l[f];var n=l[f+1];if(null!==k[h][n])h=k[h][n];else{var m;if(m=JSM.IsLowerOrEqual(d[h],e[n])){var p=n;m=g[h];for(var C=g[p],D=void 0,y=void 0,x=!0,F=a.GetPolygon(h),D=0;D<F.VertexIndexCount();D++)if(y=a.GetVertexPosition(F.GetVertexIndex(D)),C.CoordPosition(y)===JSM.CoordPlanePosition.CoordInFrontOfPlane){x=
|
||||
!1;break}if(x)m=!1;else{C=!0;p=a.GetPolygon(p);for(D=0;D<p.VertexIndexCount();D++)if(y=a.GetVertexPosition(p.GetVertexIndex(D)),m.CoordPosition(y)===JSM.CoordPlanePosition.CoordAtBackOfPlane){C=!1;break}m=C?!1:!0}}h=m?k[h][n]=!0:k[h][n]=!1}h&&(h=l,n=f+1,m=h[f],h[f]=h[n],h[n]=m)}})();return l};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.OrderPolygons=function(a,b,c){var d=[],e=[],f=[],g=[],h=[],l=[],k=[],m=a.PolygonCount(),n,p;for(n=0;n<m;n++){l.push(n);k.push([]);for(p=0;p<m;p++)k[n].push(null)}(function(){var l=JSM.CoordSub(c,b).Normalize(),l=JSM.GetPlaneFromCoordAndDirection(b,l),k,n,m,p,r,v;for(k=0;k<a.PolygonCount();k++){r=JSM.Inf;v=-JSM.Inf;m=a.GetPolygon(k);for(n=0;n<m.VertexIndexCount();n++)p=a.GetVertexPosition(m.GetVertexIndex(n)),p=l.CoordDistance(p),JSM.IsLower(p,r)&&(r=p),JSM.IsGreater(p,v)&&(v=p);d.push(r);e.push(v);
|
||||
n=a.GetPolygon(k);m=new JSM.Coord(0,0,0);v=r=void 0;for(r=0;r<n.VertexIndexCount();r++)v=a.GetVertexPosition(n.GetVertexIndex(r)),m=JSM.CoordAdd(m,v);m.MultiplyScalar(1/n.VertexIndexCount());n=m;m=l.CoordDistance(n);f.push(n);g.push(m);m=JSM.CalculateBodyPolygonNormal(a,k);r=JSM.CoordSub(n,b).Normalize();r=JSM.VectorDot(m,r);JSM.IsGreaterOrEqual(r,0)&&m.MultiplyScalar(-1);n=JSM.GetPlaneFromCoordAndDirection(n,m);h.push(n)}})();(function(){var a=l.length,b,c;for(b=0;b<a-1;b++)for(c=0;c<a-b-1;c++){var d;
|
||||
d=l[c];var f=l[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=l;var f=c+1,h=d[c];d[c]=d[f];d[f]=h}}})();(function(){var b=l.length,c,f;for(c=0;c<b-1;c++)for(f=0;f<b-c-1;f++){var g;g=l[f];var n=l[f+1];if(null!==k[g][n])g=k[g][n];else{var m;if(m=JSM.IsLowerOrEqual(d[g],e[n])){var p=n;m=h[g];for(var C=h[p],D=void 0,y=void 0,x=!0,F=a.GetPolygon(g),D=0;D<F.VertexIndexCount();D++)if(y=a.GetVertexPosition(F.GetVertexIndex(D)),C.CoordPosition(y)===JSM.CoordPlanePosition.CoordInFrontOfPlane){x=
|
||||
!1;break}if(x)m=!1;else{C=!0;p=a.GetPolygon(p);for(D=0;D<p.VertexIndexCount();D++)if(y=a.GetVertexPosition(p.GetVertexIndex(D)),m.CoordPosition(y)===JSM.CoordPlanePosition.CoordAtBackOfPlane){C=!1;break}m=C?!1:!0}}g=m?k[g][n]=!0:k[g][n]=!1}g&&(g=l,n=f+1,m=g[f],g[f]=g[n],g[n]=m)}})();return l};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.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.beginPath();this.context.moveTo(a.x,this.canvas.height-a.y);this.context.lineTo(b.x,this.canvas.height-b.y);this.context.stroke()};
|
||||
JSM.CanvasDrawer.prototype.DrawPolygon=function(a,b,c){var d=this.context;b=JSM.HexColorToRGBComponents(b);d.fillStyle="rgb("+b[0]+","+b[1]+","+b[2]+")";this.context.beginPath();for(d=0;d<a.VertexCount();d++)b=a.GetVertex(d),0===d?this.context.moveTo(b.x,this.canvas.height-b.y):this.context.lineTo(b.x,this.canvas.height-b.y);this.context.closePath();this.context.fill();if(c)for(d=0;d<a.VertexCount();d++)b=a.GetVertex(d),c=a.GetVertex(d<a.VertexCount()-1?d+1:0),this.DrawLine(b,c)};
|
||||
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.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 h(a,b){var c=JSM.Project(b,k,m,n,p*JSM.DegRad,q,t,s,w);a.AddVertex(c.x,c.y)}function g(b){var c=new JSM.Polygon2D,d,e;for(d=0;d<b.VertexIndexCount();d++)e=a.GetVertexPosition(b.GetVertexIndex(d)),h(c,e);return c}e&&f.Clear();e=f.GetWidth();var l=f.GetHeight(),k=c.eye,m=c.center,n=c.up,p=c.fieldOfView,q=e/l,t=c.nearClippingPlane,s=c.farClippingPlane,w=[0,0,e,l],u,r,v,C;if("HiddenLinePainter"==d){d=JSM.OrderPolygons(a,k,m);if(void 0===b||null===b)b=
|
||||
new JSM.Materials;for(c=0;c<d.length;c++)u=a.GetPolygon(d[c]),r=g(u),v=u.GetMaterialIndex(),C=b.GetMaterial(v).diffuse,f.DrawPolygon(r,C,!0)}else if("HiddenLineBSPTree"==d){if(void 0===b||null===b)b=new JSM.Materials;d=new JSM.BSPTree;JSM.AddBodyToBSPTree(a,d);JSM.TraverseBSPTreeForEyePosition(d,c.eye,function(c){var d=c.polygon,e=new JSM.Polygon2D,g,l;for(g=0;g<d.VertexCount();g++)l=d.GetVertex(g),h(e,l);r=e;u=a.GetPolygon(c.userData.originalPolygon);v=u.GetMaterialIndex();C=b.GetMaterial(v).diffuse;
|
||||
f.DrawPolygon(r,C,!0)})}else if("HiddenLineFrontFacing"==d){if(void 0===b||null===b)b=new JSM.Materials;for(c=0;c<a.PolygonCount();c++)u=a.GetPolygon(c),r=g(u),r.GetOrientation()==JSM.Orientation.CounterClockwise&&(v=u.GetMaterialIndex(),C=b.GetMaterial(v).diffuse,f.DrawPolygon(r,C,!0))}else if("Wireframe"==d){var D,y,x,F=[];for(c=0;c<a.PolygonCount();c++){y=D=null;u=a.GetPolygon(c);l=u.VertexIndexCount();for(d=0;d<=l;d++)x=u.GetVertexIndex(d%l),e=a.GetVertexPosition(x),r=JSM.Project(e,k,m,n,p*JSM.DegRad,
|
||||
JSM.DrawProjectedBody=function(a,b,c,d,e,f){function g(a,b){var c=JSM.Project(b,k,m,n,p*JSM.DegRad,q,t,s,w);a.AddVertex(c.x,c.y)}function h(b){var c=new JSM.Polygon2D,d,e;for(d=0;d<b.VertexIndexCount();d++)e=a.GetVertexPosition(b.GetVertexIndex(d)),g(c,e);return c}e&&f.Clear();e=f.GetWidth();var l=f.GetHeight(),k=c.eye,m=c.center,n=c.up,p=c.fieldOfView,q=e/l,t=c.nearClippingPlane,s=c.farClippingPlane,w=[0,0,e,l],u,r,v,C;if("HiddenLinePainter"==d){d=JSM.OrderPolygons(a,k,m);if(void 0===b||null===b)b=
|
||||
new JSM.Materials;for(c=0;c<d.length;c++)u=a.GetPolygon(d[c]),r=h(u),v=u.GetMaterialIndex(),C=b.GetMaterial(v).diffuse,f.DrawPolygon(r,C,!0)}else if("HiddenLineBSPTree"==d){if(void 0===b||null===b)b=new JSM.Materials;d=new JSM.BSPTree;JSM.AddBodyToBSPTree(a,d);JSM.TraverseBSPTreeForEyePosition(d,c.eye,function(c){var d=c.polygon,e=new JSM.Polygon2D,h,l;for(h=0;h<d.VertexCount();h++)l=d.GetVertex(h),g(e,l);r=e;u=a.GetPolygon(c.userData.originalPolygon);v=u.GetMaterialIndex();C=b.GetMaterial(v).diffuse;
|
||||
f.DrawPolygon(r,C,!0)})}else if("HiddenLineFrontFacing"==d){if(void 0===b||null===b)b=new JSM.Materials;for(c=0;c<a.PolygonCount();c++)u=a.GetPolygon(c),r=h(u),r.GetOrientation()==JSM.Orientation.CounterClockwise&&(v=u.GetMaterialIndex(),C=b.GetMaterial(v).diffuse,f.DrawPolygon(r,C,!0))}else if("Wireframe"==d){var D,y,x,F=[];for(c=0;c<a.PolygonCount();c++){y=D=null;u=a.GetPolygon(c);l=u.VertexIndexCount();for(d=0;d<=l;d++)x=u.GetVertexIndex(d%l),e=a.GetVertexPosition(x),r=JSM.Project(e,k,m,n,p*JSM.DegRad,
|
||||
q,t,s,w),null!==D&&(null!==y&&void 0===F[[y,x]])&&(f.DrawLine(D,r),F[[y,x]]=!0,F[[x,y]]=!0),y=x,D=r}}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,h,g,l,k;for(e=0;e<c.pgons.length;e++){g=c.pgons[e];k=new JSM.Coord(0,0,0);for(h=0;h<g.verts.length;h++)l=a.GetVertex(g.verts[h]).position,k=JSM.CoordAdd(k,l);k.MultiplyScalar(1/g.verts.length);d.push(b.AddVertex(new JSM.BodyVertex(k)))}})();
|
||||
var e=[];(function(){var f,h,g,l,k;for(f=0;f<c.edges.length;f++){g=c.edges[f];h=a.GetVertex(g.vert1).position.Clone().MultiplyScalar(0.25);l=a.GetVertex(g.vert2).position.Clone().MultiplyScalar(0.25);l=JSM.CoordAdd(h,l);for(h=0;2>h;h++)k=0===h?g.pgon1:g.pgon2,-1===k&&(k=0===h?g.pgon2:g.pgon1),k=b.GetVertex(d[k]).position.Clone(),l=JSM.CoordAdd(l,k.MultiplyScalar(0.25));e.push(b.AddVertex(new JSM.BodyVertex(l)))}})();(function(){var e=[],h,g,l,k;for(l=0;l<c.edges.length;l++)h=c.edges[l],g=JSM.MidCoord(a.GetVertex(h.vert1).position,
|
||||
a.GetVertex(h.vert2).position),e.push(g);var m,n,p;for(l=0;l<c.verts.length;l++){m=c.verts[l];p=new JSM.Coord(0,0,0);h=new JSM.Coord(0,0,0);n=1/m.pgons.length;for(k=0;k<m.pgons.length;k++)g=b.GetVertex(d[m.pgons[k]]).position.Clone(),p=JSM.CoordAdd(p,g.MultiplyScalar(n));n=1/m.edges.length;for(k=0;k<m.edges.length;k++)g=e[m.edges[k]].Clone(),h=JSM.CoordAdd(h,g.MultiplyScalar(n));m=m.edges.length;k=b.GetVertex(l).position;k.x=(p.x+2*h.x+(m-3)*k.x)/m;k.y=(p.y+2*h.y+(m-3)*k.y)/m;k.z=(p.z+2*h.z+(m-3)*
|
||||
k.z)/m}})();(function(){var f,h,g,l,k,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++)h=p.pedges[n],g=p.pedges[(n+1)%f],l=d[m],h=e[h.index],k=JSM.GetPolyEdgeStartVertex(g,c),g=e[g.index],l=new JSM.BodyPolygon([l,h,k,g]),g=a.GetPolygon(m),l.material=g.material,l.curved=g.curved,b.AddPolygon(l)}})();return b};JSM.CatmullClarkSubdivision=function(a,b){var c=a,d;for(d=0;d<b;d++)c=JSM.CatmullClarkSubdivisionOneIteration(c);return c};
|
||||
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,l,k;for(e=0;e<c.pgons.length;e++){h=c.pgons[e];k=new JSM.Coord(0,0,0);for(g=0;g<h.verts.length;g++)l=a.GetVertex(h.verts[g]).position,k=JSM.CoordAdd(k,l);k.MultiplyScalar(1/h.verts.length);d.push(b.AddVertex(new JSM.BodyVertex(k)))}})();
|
||||
var e=[];(function(){var f,g,h,l,k;for(f=0;f<c.edges.length;f++){h=c.edges[f];g=a.GetVertex(h.vert1).position.Clone().MultiplyScalar(0.25);l=a.GetVertex(h.vert2).position.Clone().MultiplyScalar(0.25);l=JSM.CoordAdd(g,l);for(g=0;2>g;g++)k=0===g?h.pgon1:h.pgon2,-1===k&&(k=0===g?h.pgon2:h.pgon1),k=b.GetVertex(d[k]).position.Clone(),l=JSM.CoordAdd(l,k.MultiplyScalar(0.25));e.push(b.AddVertex(new JSM.BodyVertex(l)))}})();(function(){var e=[],g,h,l,k;for(l=0;l<c.edges.length;l++)g=c.edges[l],h=JSM.MidCoord(a.GetVertex(g.vert1).position,
|
||||
a.GetVertex(g.vert2).position),e.push(h);var m,n,p;for(l=0;l<c.verts.length;l++){m=c.verts[l];p=new JSM.Coord(0,0,0);g=new JSM.Coord(0,0,0);n=1/m.pgons.length;for(k=0;k<m.pgons.length;k++)h=b.GetVertex(d[m.pgons[k]]).position.Clone(),p=JSM.CoordAdd(p,h.MultiplyScalar(n));n=1/m.edges.length;for(k=0;k<m.edges.length;k++)h=e[m.edges[k]].Clone(),g=JSM.CoordAdd(g,h.MultiplyScalar(n));m=m.edges.length;k=b.GetVertex(l).position;k.x=(p.x+2*g.x+(m-3)*k.x)/m;k.y=(p.y+2*g.y+(m-3)*k.y)/m;k.z=(p.z+2*g.z+(m-3)*
|
||||
k.z)/m}})();(function(){var f,g,h,l,k,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],l=d[m],g=e[g.index],k=JSM.GetPolyEdgeStartVertex(h,c),h=e[h.index],l=new JSM.BodyPolygon([l,g,k,h]),h=a.GetPolygon(m),l.material=h.material,l.curved=h.curved,b.AddPolygon(l)}})();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,d){function e(a,b){function c(a,b,d,e,f){var g=a.createSVGPoint();g.x=e;g.y=f;a=g;d=d.getCTM();void 0!==d&&null!==d&&(a=g.matrixTransform(d));d=new JSM.Coord2D(a.x,a.y);e=new JSM.Coord2D(e,f);b=b.GetLastContour();f=b.VertexCount();if(0<f&&b.GetVertex(f-1).IsEqualWithEps(d,0.1))return e;b.AddVertex(a.x,a.y);return e}function d(a,b,e,f,g,h){var l=document.createElementNS("http://www.w3.org/2000/svg","path"),k="M "+f.x+" "+f.y+" ",n,m,p,r,s;for(n=0;n<g.length;n++)if(m=g[n],
|
||||
m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS||m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL)p=m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS?"C":"c",k+=p+" "+m.x1+" "+m.y1+" "+m.x2+" "+m.y2+" "+m.x+" "+m.y+" ";else if(m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS||m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL)p=m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS?"Q":"q",k+=p+" "+m.x1+" "+m.y1+" "+m.x+" "+m.y+" ";else if(m.pathSegType==SVGPathSeg.PATHSEG_ARC_ABS||
|
||||
m.pathSegType==SVGPathSeg.PATHSEG_ARC_REL)p=m.pathSegType==SVGPathSeg.PATHSEG_ARC_ABS?"A":"a",r=m.largeArcFlag?1:0,s=m.sweepFlag?1:0,k+=p+" "+m.r1+" "+m.r2+" "+m.angle+" "+r+" "+s+" "+m.x+" "+m.y+" ";else if(m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL)p=m.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS?"S":"s",k+=p+" "+m.x2+" "+m.y2+" "+m.x+" "+m.y+" ";l.setAttributeNS(null,"d",k);k=l.getTotalLength();g=0;0<e&&(g=
|
||||
@ -469,27 +470,24 @@ if(!(x.pathSegType==SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS||x.pathSegType==
|
||||
SVGPolygonElement)for(l=0;l<a.points.numberOfItems;l++)k=a.points.getItem(l),c(h,g,a,k.x,k.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);g.originalElem=
|
||||
a;return g}function f(a,b,c){function d(a,b){var c=[],e,f;if(b==JSM.Orientation.Clockwise)for(e=0;e<a.VertexCount();e++)f=a.GetVertex(e),c.push(new JSM.Coord(f.x,0,-f.y));else for(e=a.VertexCount()-1;0<=e;e--)f=a.GetVertex(e),c.push(new JSM.Coord(f.x,0,-f.y));return c}function e(a,b,c){a.push(null);var d;if(c==JSM.Orientation.CounterClockwise)for(c=0;c<b.VertexCount();c++)d=b.GetVertex(c),a.push(new JSM.Coord(d.x,0,-d.y));else for(c=b.VertexCount()-1;0<=c;c--)d=b.GetVertex(c),a.push(new JSM.Coord(d.x,
|
||||
0,-d.y))}var f=[],g=new JSM.Vector(0,-1,0);void 0!==a.originalElem&&a.originalElem.hasAttribute("modelheight")&&(b=parseFloat(a.originalElem.getAttribute("modelheight")));var h,k;k=a.ContourCount();if(1==k)k=a.GetContour(0).GetOrientation(),h=d(a.GetContour(0),k),h=JSM.GeneratePrism(h,g,b,!0,c),f.push(h);else if(1<k){k=a.GetContour(0).GetOrientation();var l=d(a.GetContour(0),k),m=!1,y;for(y=1;y<a.ContourCount();y++)h=a.GetContour(y).GetOrientation(),h==k?(h=d(a.GetContour(y),k),h=JSM.GeneratePrism(h,
|
||||
g,b,!0,c),f.push(h)):(e(l,a.GetContour(y),h),m=!0);h=m?JSM.GeneratePrismWithHole(l,g,b,!0,c):JSM.GeneratePrism(l,g,b,!0,c);f.push(h)}a=new JSM.Material({ambient:a.color,diffuse:a.color});return[f,a]}var h=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 d=[],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=e(f[h],g),d.push(k);return d}(a,c);a.hasAttribute("modelheight")&&(b=parseFloat(a.getAttribute("modelheight")));var l,k,m;for(a=0;a<c.length;a++){l=f(c[a],b,d);k=l[0];l=l[1];g.AddMaterial(l);for(l=0;l<k.length;l++)m=k[l],m.SetPolygonsMaterialIndex(g.Count()-1),h.AddBody(m)}return[h,g]};
|
||||
g,b,!0,c),f.push(h)):(e(l,a.GetContour(y),h),m=!0);h=m?JSM.GeneratePrismWithHole(l,g,b,!0,c):JSM.GeneratePrism(l,g,b,!0,c);f.push(h)}a=new JSM.Material({ambient:a.color,diffuse:a.color});return[f,a]}var g=new JSM.Model,h=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 d=[],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=e(f[h],g),d.push(k);return d}(a,c);a.hasAttribute("modelheight")&&(b=parseFloat(a.getAttribute("modelheight")));var l,k,m;for(a=0;a<c.length;a++){l=f(c[a],b,d);k=l[0];l=l[1];h.AddMaterial(l);for(l=0;l<k.length;l++)m=k[l],m.SetPolygonsMaterialIndex(h.Count()-1),g.AddBody(m)}return[g,h]};
|
||||
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 h=new JSM.BSPTree,g=new JSM.BSPTree;JSM.AddBodyToBSPTree(b,h,"a");JSM.AddBodyToBSPTree(c,g,"b");var l=[],k=[],m=[],n=[];f(h.GetNodes(),g,l,k,m,n);var p=[],q=[],t=[];f(g.GetNodes(),h,p,q,t,[]);h=new JSM.Body;b=new JSM.Octree(JSM.BoxUnion(b.GetBoundingBox(),c.GetBoundingBox()));"Union"==a?(e(l,h,b,!1),e(m,h,b,!1),e(n,h,b,!1),e(p,h,b,!1),e(t,h,b,
|
||||
!1)):"Difference"==a?(e(l,h,b,!1),e(m,h,b,!1),e(q,h,b,!0)):"Intersection"==a&&(e(k,h,b,!1),e(n,h,b,!1),e(q,h,b,!1));return h};JSM.BernsteinPolynomial=function(a,b,c){var d=1,e=JSM.Minimum(a,b-a),f;for(f=0;f<e;f++)d*=b-f,d/=f+1;return d*Math.pow(c,a)*Math.pow(1-c,b-a)};JSM.GenerateBezierCurve=function(a,b){var c=[],d=a.length-1,e=1/b,f,h,g,l,k,m;for(f=0;f<=b;f++){g=f*e;m=new JSM.Coord2D(0,0);for(h=0;h<=d;h++)l=a[h],k=JSM.BernsteinPolynomial(h,d,g),m.x+=l.x*k,m.y+=l.y*k;c.push(m)}return c};
|
||||
JSM.GenerateSurface=function(a,b,c,d,e,f,h,g){var l=new JSM.Body,k=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=k+b*n,f=m+a*p,e=h(a,b,e,f,g),l.AddVertex(new JSM.BodyVertex(e))})();(function(){var a,b,g,h,k,m;for(b=0;b<d;b++)for(a=0;a<c;a++)g=b*(c+1)+a,h=g+1,k=g+c+1,m=k+1,e?(h=new JSM.BodyPolygon([g,h,m]),f&&h.SetCurveGroup(0),l.AddPolygon(h),h=new JSM.BodyPolygon([g,m,k])):h=new JSM.BodyPolygon([g,h,m,k]),f&&h.SetCurveGroup(0),l.AddPolygon(h)})();
|
||||
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 l=[],k=[],m=[],n=[];f(g.GetNodes(),h,l,k,m,n);var p=[],q=[],t=[];f(h.GetNodes(),g,p,q,t,[]);g=new JSM.Body;b=new JSM.Octree(JSM.BoxUnion(b.GetBoundingBox(),c.GetBoundingBox()));"Union"==a?(e(l,g,b,!1),e(m,g,b,!1),e(n,g,b,!1),e(p,g,b,!1),e(t,g,b,
|
||||
!1)):"Difference"==a?(e(l,g,b,!1),e(m,g,b,!1),e(q,g,b,!0)):"Intersection"==a&&(e(k,g,b,!1),e(n,g,b,!1),e(q,g,b,!1));return g};JSM.BernsteinPolynomial=function(a,b,c){var d=1,e=JSM.Minimum(a,b-a),f;for(f=0;f<e;f++)d*=b-f,d/=f+1;return d*Math.pow(c,a)*Math.pow(1-c,b-a)};JSM.GenerateBezierCurve=function(a,b){var c=[],d=a.length-1,e=1/b,f,g,h,l,k,m;for(f=0;f<=b;f++){h=f*e;m=new JSM.Coord2D(0,0);for(g=0;g<=d;g++)l=a[g],k=JSM.BernsteinPolynomial(g,d,h),m.x+=l.x*k,m.y+=l.y*k;c.push(m)}return c};
|
||||
JSM.GenerateSurface=function(a,b,c,d,e,f,g,h){var l=new JSM.Body,k=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=k+b*n,f=m+a*p,e=g(a,b,e,f,h),l.AddVertex(new JSM.BodyVertex(e))})();(function(){var a,b,g,h,k,m;for(b=0;b<d;b++)for(a=0;a<c;a++)g=b*(c+1)+a,h=g+1,k=g+c+1,m=k+1,e?(h=new JSM.BodyPolygon([g,h,m]),f&&h.SetCurveGroup(0),l.AddPolygon(h),h=new JSM.BodyPolygon([g,m,k])):h=new JSM.BodyPolygon([g,h,m,k]),f&&h.SetCurveGroup(0),l.AddPolygon(h)})();
|
||||
return l};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,h;for(e=0;e<=this.n;e++)for(f=0;f<=this.m;f++)h=this.points[e][f],h.x=e*c,h.y=f*d};
|
||||
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};
|
||||
JSM.GenerateBezierSurface=function(a,b,c,d){return JSM.GenerateSurface([0,1],[0,1],b,c,!1,d,function(a,b,c,d,l){var k,m,n,p=l.GetNValue(),q=l.GetMValue();k=new JSM.Coord(0,0,0);for(a=0;a<=p;a++){m=new JSM.Coord(0,0,0);for(b=0;b<=q;b++)n=JSM.BernsteinPolynomial(a,p,c)*JSM.BernsteinPolynomial(b,q,d),n=l.GetControlPoint(a,b).Clone().MultiplyScalar(n),m=JSM.CoordAdd(m,n);k=JSM.CoordAdd(k,m)}return k},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.WebGLInitContext=function(a){if(null===a||void 0===a.getContext)return null;var b=a.getContext("webgl")||a.getContext("experimental-webgl");if(null===b)return null;b.viewportWidth=a.width;b.viewportHeight=a.height;b.viewport(0,0,b.viewportWidth,b.viewportHeight);b.clearColor(1,1,1,1);return b};
|
||||
JSM.WebGLInitShaderProgram=function(a,b,c,d){function e(a,b,c,d){c=a.createShader(c);a.shaderSource(c,b);a.compileShader(c);return!a.getShaderParameter(c,a.COMPILE_STATUS)?(void 0!==d&&null!==d&&d(a.getShaderInfoLog(c)),null):c}b=function(a,b,c,d){b=e(a,b,a.FRAGMENT_SHADER,d);c=e(a,c,a.VERTEX_SHADER,d);if(null===b||null===c)return null;d=a.createProgram();a.attachShader(d,c);a.attachShader(d,b);a.linkProgram(d);return!a.getProgramParameter(d,a.LINK_STATUS)?null:d}(a,c,b,d);if(null===b)return null;
|
||||
a.useProgram(b);return b};JSM.WebGLGetFloatTextureBufferSize=function(a){return JSM.NextPowerOfTwo(Math.ceil(Math.sqrt(a.length/3)))};
|
||||
JSM.WebGLCreateFloatTextureBuffer=function(a,b,c){var d=null;if(null!==b){for(;b.length<3*c*c;)b.push(0);d=new Float32Array(b)}b=a.createTexture();a.bindTexture(a.TEXTURE_2D,b);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE);a.texImage2D(a.TEXTURE_2D,0,a.RGB,c,c,0,a.RGB,a.FLOAT,d);a.bindTexture(a.TEXTURE_2D,
|
||||
null);return b};JSM.RenderMaterial=function(a,b,c,d,e,f,h){this.ambient=a;this.diffuse=b;this.specular=c;this.shininess=d;this.texture=e;this.textureWidth=f;this.textureHeight=h;this.textureImage=this.textureBuffer=null;this.textureLoaded=!1};JSM.RenderMaterial.prototype.HasTexture=function(){return null!==this.texture&&this.textureLoaded};
|
||||
JSM.RenderMaterial.prototype.Compile=function(a,b){if(null!==this.texture){var c=this;this.textureBuffer=a.createTexture();this.textureImage=new Image;this.textureImage.src=this.texture;this.textureImage.onload=function(){a.bindTexture(a.TEXTURE_2D,c.textureBuffer);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.LINEAR);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.LINEAR_MIPMAP_LINEAR);a.texImage2D(a.TEXTURE_2D,0,a.RGBA,a.RGBA,a.UNSIGNED_BYTE,c.textureImage);a.generateMipmap(a.TEXTURE_2D);
|
||||
a.bindTexture(a.TEXTURE_2D,null);c.textureLoaded=!0;void 0!==b&&null!==b&&b()}}};JSM.RenderGeometry=function(){this.transformation=new JSM.Transformation;this.uvBuffer=this.normalBuffer=this.vertexBuffer=this.uvArray=this.normalArray=this.vertexArray=this.material=null};JSM.RenderGeometry.prototype.SetMaterial=function(a){this.material=a};JSM.RenderGeometry.prototype.GetMaterial=function(){return this.material};JSM.RenderGeometry.prototype.SetVertexArray=function(a){this.vertexArray=new Float32Array(a)};
|
||||
null);return b};JSM.RenderMaterial=function(a,b,c,d,e,f,g){this.ambient=a;this.diffuse=b;this.specular=c;this.shininess=d;this.texture=e;this.textureWidth=f;this.textureHeight=g;this.textureImage=this.textureBuffer=null;this.textureLoaded=!1};JSM.RenderMaterial.prototype.HasTexture=function(){return null!==this.texture&&this.textureLoaded};
|
||||
JSM.RenderGeometry=function(){this.transformation=new JSM.Transformation;this.uvBuffer=this.normalBuffer=this.vertexBuffer=this.uvArray=this.normalArray=this.vertexArray=this.material=null};JSM.RenderGeometry.prototype.SetMaterial=function(a){this.material=a};JSM.RenderGeometry.prototype.GetMaterial=function(){return this.material};JSM.RenderGeometry.prototype.SetVertexArray=function(a){this.vertexArray=new Float32Array(a)};
|
||||
JSM.RenderGeometry.prototype.SetNormalArray=function(a){this.normalArray=new Float32Array(a)};JSM.RenderGeometry.prototype.SetUVArray=function(a){this.uvArray=new Float32Array(a)};JSM.RenderGeometry.prototype.GetTransformation=function(){return this.transformation};JSM.RenderGeometry.prototype.GetTransformationMatrix=function(){return this.transformation.matrix};JSM.RenderGeometry.prototype.SetTransformation=function(a){this.transformation=a};JSM.RenderGeometry.prototype.GetVertexBuffer=function(){return this.vertexBuffer};
|
||||
JSM.RenderGeometry.prototype.GetNormalBuffer=function(){return this.normalBuffer};JSM.RenderGeometry.prototype.GetUVBuffer=function(){return this.uvBuffer};JSM.RenderGeometry.prototype.VertexCount=function(){return parseInt(this.vertexArray.length/3,10)};JSM.RenderGeometry.prototype.GetVertex=function(a){return new JSM.Coord(this.vertexArray[3*a],this.vertexArray[3*a+1],this.vertexArray[3*a+2])};JSM.RenderGeometry.prototype.GetTransformedVertex=function(a){a=this.GetVertex(a);return this.transformation.Apply(a)};
|
||||
JSM.RenderGeometry.prototype.Compile=function(a,b){this.material.Compile(a,b);this.vertexBuffer=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,this.vertexBuffer);a.bufferData(a.ARRAY_BUFFER,this.vertexArray,a.STATIC_DRAW);this.vertexBuffer.itemSize=3;this.vertexBuffer.numItems=parseInt(this.vertexArray.length/3,10);this.normalBuffer=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,this.normalBuffer);a.bufferData(a.ARRAY_BUFFER,this.normalArray,a.STATIC_DRAW);this.normalBuffer.itemSize=3;this.normalBuffer.numItems=
|
||||
parseInt(this.normalArray.length/3,10);null!==this.uvArray&&(this.uvBuffer=a.createBuffer(),a.bindBuffer(a.ARRAY_BUFFER,this.uvBuffer),a.bufferData(a.ARRAY_BUFFER,this.uvArray,a.STATIC_DRAW),this.uvBuffer.itemSize=2,this.uvBuffer.numItems=parseInt(this.uvArray.length/2,10))};JSM.Renderer=function(){this.geometries=this.light=this.camera=this.texShader=this.shader=this.context=this.canvas=null};
|
||||
JSM.Renderer.prototype.Init=function(a,b,c){return!JSM.IsWebGLEnabled()||!this.InitContext(a)||!this.InitView(b,c)||!this.InitShaders()||!this.InitBuffers()?!1:!0};
|
||||
JSM.Renderer=function(){this.geometries=this.light=this.camera=this.texShader=this.shader=this.context=this.canvas=null};JSM.Renderer.prototype.Init=function(a,b,c){return!JSM.IsWebGLEnabled()||!this.InitContext(a)||!this.InitView(b,c)||!this.InitShaders()||!this.InitBuffers()?!1:!0};
|
||||
JSM.Renderer.prototype.InitContext=function(a){this.canvas=a;if(null===this.canvas||void 0===this.canvas.getContext)return!1;this.context=this.canvas.getContext("webgl")||this.canvas.getContext("experimental-webgl");if(null===this.context)return!1;this.context=JSM.WebGLInitContext(a);if(null===this.context)return!1;this.context.enable(this.context.DEPTH_TEST);this.context.depthFunc(this.context.LEQUAL);this.context.enable(this.context.BLEND);this.context.blendEquation(this.context.FUNC_ADD);this.context.blendFunc(this.context.SRC_ALPHA,
|
||||
this.context.ONE_MINUS_SRC_ALPHA);return!0};
|
||||
JSM.Renderer.prototype.InitShaders=function(){function a(a){var b="";a&&(b="#define USETEXTURE");return[b,"uniform highp vec3 uPolygonAmbientColor;\nuniform highp vec3 uPolygonDiffuseColor;\nuniform highp vec3 uPolygonSpecularColor;\nuniform highp float uPolygonShininess;\nuniform highp vec3 uLightAmbientColor;\nuniform highp vec3 uLightDiffuseColor;\nuniform highp vec3 uLightSpecularColor;\nvarying highp vec3 vVertex;\nvarying highp vec3 vNormal;\nvarying highp vec3 vLight;\n#ifdef USETEXTURE\nvarying highp vec2 vUV;\nuniform sampler2D uSampler;\n#endif\nvoid main (void) {\n\thighp vec3 N = normalize (vNormal);\n\tif (!gl_FrontFacing) {\n\t\tN = -N;\n\t}\n\thighp vec3 L = normalize (-vLight);\n\thighp vec3 E = normalize (-vVertex);\n\thighp vec3 R = normalize (-reflect (L, N));\n\thighp vec3 ambientComponent = uPolygonAmbientColor * uLightAmbientColor;\n\thighp vec3 diffuseComponent = uPolygonDiffuseColor * uLightDiffuseColor * max (dot (N, L), 0.0);\n\thighp vec3 specularComponent = uPolygonSpecularColor * uLightSpecularColor * pow (max (dot (R, E), 0.0), uPolygonShininess);\n#ifdef USETEXTURE\n\thighp vec3 textureColor = texture2D (uSampler, vec2 (vUV.s, vUV.t)).xyz;\n\tambientComponent = textureColor * ambientComponent;\n\tdiffuseComponent = textureColor * diffuseComponent;\n\tspecularComponent = textureColor * specularComponent;\n#endif\n\tambientComponent = clamp (ambientComponent, 0.0, 1.0);\n\tdiffuseComponent = clamp (diffuseComponent, 0.0, 1.0);\n\tspecularComponent = clamp (specularComponent, 0.0, 1.0);\n\tgl_FragColor = vec4 (ambientComponent + diffuseComponent + specularComponent, 1.0);\n}"].join("\n")}function b(a){var b=
|
||||
@ -497,11 +495,14 @@ JSM.Renderer.prototype.InitShaders=function(){function a(a){var b="";a&&(b="#def
|
||||
function c(a,b){b.vertexPositionAttribute=a.getAttribLocation(b,"aVertexPosition");b.vertexNormalAttribute=a.getAttribLocation(b,"aVertexNormal");b.lightAmbientColorUniform=a.getUniformLocation(b,"uLightAmbientColor");b.lightDiffuseColorUniform=a.getUniformLocation(b,"uLightDiffuseColor");b.lightSpecularColorUniform=a.getUniformLocation(b,"uLightSpecularColor");b.lightDirectionUniform=a.getUniformLocation(b,"uLightDirection");b.vMatrixUniform=a.getUniformLocation(b,"uViewMatrix");b.mvMatrixUniform=
|
||||
a.getUniformLocation(b,"uModelViewMatrix");b.pMatrixUniform=a.getUniformLocation(b,"uProjectionMatrix");b.polygonAmbientColorUniform=a.getUniformLocation(b,"uPolygonAmbientColor");b.polygonDiffuseColorUniform=a.getUniformLocation(b,"uPolygonDiffuseColor");b.polygonSpecularColorUniform=a.getUniformLocation(b,"uPolygonSpecularColor");b.polygonShininessUniform=a.getUniformLocation(b,"uPolygonShininess")}this.shader=function(d){var e=a(!1),f=b(!1),e=JSM.WebGLInitShaderProgram(d,f,e,null);if(null===e)return null;
|
||||
d.useProgram(e);c(d,e);return e}(this.context);if(null===this.shader)return!1;this.texShader=function(d){var e=a(!0),f=b(!0),e=JSM.WebGLInitShaderProgram(d,f,e,null);if(null===e)return null;d.useProgram(e);c(d,e);e.vertexUVAttribute=d.getAttribLocation(e,"aVertexUV");e.samplerUniform=d.getUniformLocation(e,"uSampler");return e}(this.context);return null===this.texShader?!1:!0};JSM.Renderer.prototype.InitBuffers=function(){this.geometries=[];return!0};
|
||||
JSM.Renderer.prototype.InitView=function(a,b){this.camera=JSM.ValueOrDefault(a,new JSM.Camera);if(!this.camera)return!1;this.light=JSM.ValueOrDefault(b,new JSM.Light);return!this.light?!1:!0};JSM.Renderer.prototype.SetClearColor=function(a,b,c){this.context.clearColor(a,b,c,1)};JSM.Renderer.prototype.AddGeometries=function(a){var b,c;for(b=0;b<a.length;b++)c=a[b],c.Compile(this.context,this.Render.bind(this)),this.geometries.push(c)};
|
||||
JSM.Renderer.prototype.RemoveGeometries=function(){this.geometries=[]};JSM.Renderer.prototype.Resize=function(){this.context.viewportWidth=this.canvas.width;this.context.viewportHeight=this.canvas.height;this.context.viewport(0,0,this.context.viewportWidth,this.context.viewportHeight)};
|
||||
JSM.Renderer.prototype.InitView=function(a,b){this.camera=JSM.ValueOrDefault(a,new JSM.Camera);if(!this.camera)return!1;this.light=JSM.ValueOrDefault(b,new JSM.Light);return!this.light?!1:!0};JSM.Renderer.prototype.SetClearColor=function(a,b,c){this.context.clearColor(a,b,c,1)};
|
||||
JSM.Renderer.prototype.AddGeometries=function(a){function b(a,b,c){null!==a.texture&&(a.textureBuffer=b.createTexture(),a.textureImage=new Image,a.textureImage.src=a.texture,a.textureImage.onload=function(){b.bindTexture(b.TEXTURE_2D,a.textureBuffer);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.LINEAR);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.LINEAR_MIPMAP_LINEAR);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,b.RGBA,b.UNSIGNED_BYTE,a.textureImage);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,
|
||||
null);a.textureLoaded=!0;void 0!==c&&null!==c&&c()})}function c(a,b){a.vertexBuffer=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,a.vertexBuffer);b.bufferData(b.ARRAY_BUFFER,a.vertexArray,b.STATIC_DRAW);a.vertexBuffer.itemSize=3;a.vertexBuffer.numItems=parseInt(a.vertexArray.length/3,10);a.normalBuffer=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,a.normalBuffer);b.bufferData(b.ARRAY_BUFFER,a.normalArray,b.STATIC_DRAW);a.normalBuffer.itemSize=3;a.normalBuffer.numItems=parseInt(a.normalArray.length/
|
||||
3,10);null!==a.uvArray&&(a.uvBuffer=b.createBuffer(),b.bindBuffer(b.ARRAY_BUFFER,a.uvBuffer),b.bufferData(b.ARRAY_BUFFER,a.uvArray,b.STATIC_DRAW),a.uvBuffer.itemSize=2,a.uvBuffer.numItems=parseInt(a.uvArray.length/2,10))}var d,e;for(d=0;d<a.length;d++)e=a[d],b(e.material,this.context,this.Render.bind(this)),c(e,this.context),this.geometries.push(e)};JSM.Renderer.prototype.RemoveGeometries=function(){this.geometries=[]};
|
||||
JSM.Renderer.prototype.Resize=function(){this.context.viewportWidth=this.canvas.width;this.context.viewportHeight=this.canvas.height;this.context.viewport(0,0,this.context.viewportWidth,this.context.viewportHeight)};
|
||||
JSM.Renderer.prototype.Render=function(){this.context.clear(this.context.COLOR_BUFFER_BIT|this.context.DEPTH_BUFFER_BIT);var a=JSM.MatrixPerspective(this.camera.fieldOfView*JSM.DegRad,this.context.viewportWidth/this.context.viewportHeight,this.camera.nearClippingPlane,this.camera.farClippingPlane),b=JSM.MatrixView(this.camera.eye,this.camera.center,this.camera.up),c=JSM.MatrixIdentity(),d=JSM.HexColorToNormalizedRGBComponents(this.light.ambient),e=JSM.HexColorToNormalizedRGBComponents(this.light.diffuse),
|
||||
f=JSM.HexColorToNormalizedRGBComponents(this.light.specular);this.light.direction=JSM.CoordSub(this.camera.center,this.camera.eye).Normalize();var h,g,l,k,m,n;for(h=0;h<this.geometries.length;h++)m=this.geometries[h],c=m.GetMaterial().HasTexture()?this.texShader:this.shader,n!=c&&(n=c,this.context.useProgram(n),this.context.uniformMatrix4fv(n.pMatrixUniform,!1,a),this.context.uniformMatrix4fv(n.vMatrixUniform,!1,b),this.context.uniform3f(n.lightDirectionUniform,this.light.direction.x,this.light.direction.y,
|
||||
this.light.direction.z),this.context.uniform3f(n.lightAmbientColorUniform,d[0],d[1],d[2]),this.context.uniform3f(n.lightDiffuseColorUniform,e[0],e[1],e[2]),this.context.uniform3f(n.lightSpecularColorUniform,f[0],f[1],f[2])),c=m.material.ambient,g=m.material.diffuse,l=m.material.specular,k=m.material.shininess,this.context.uniform3f(n.polygonAmbientColorUniform,c[0],c[1],c[2]),this.context.uniform3f(n.polygonDiffuseColorUniform,g[0],g[1],g[2]),this.context.uniform3f(n.polygonSpecularColorUniform,l[0],
|
||||
f=JSM.HexColorToNormalizedRGBComponents(this.light.specular);this.light.direction=JSM.CoordSub(this.camera.center,this.camera.eye).Normalize();var g,h,l,k,m,n;for(g=0;g<this.geometries.length;g++)m=this.geometries[g],c=m.GetMaterial().HasTexture()?this.texShader:this.shader,n!=c&&(n=c,this.context.useProgram(n),this.context.uniformMatrix4fv(n.pMatrixUniform,!1,a),this.context.uniformMatrix4fv(n.vMatrixUniform,!1,b),this.context.uniform3f(n.lightDirectionUniform,this.light.direction.x,this.light.direction.y,
|
||||
this.light.direction.z),this.context.uniform3f(n.lightAmbientColorUniform,d[0],d[1],d[2]),this.context.uniform3f(n.lightDiffuseColorUniform,e[0],e[1],e[2]),this.context.uniform3f(n.lightSpecularColorUniform,f[0],f[1],f[2])),c=m.material.ambient,h=m.material.diffuse,l=m.material.specular,k=m.material.shininess,this.context.uniform3f(n.polygonAmbientColorUniform,c[0],c[1],c[2]),this.context.uniform3f(n.polygonDiffuseColorUniform,h[0],h[1],h[2]),this.context.uniform3f(n.polygonSpecularColorUniform,l[0],
|
||||
l[1],l[2]),this.context.uniform1f(n.polygonShininessUniform,k),n==this.texShader&&(c=m.GetUVBuffer(),this.context.activeTexture(this.context.TEXTURE0),this.context.bindTexture(this.context.TEXTURE_2D,m.material.textureBuffer),this.context.bindBuffer(this.context.ARRAY_BUFFER,c),this.context.vertexAttribPointer(n.vertexUVAttribute,c.itemSize,this.context.FLOAT,!1,0,0),this.context.enableVertexAttribArray(n.vertexUVAttribute),this.context.uniform1i(n.samplerUniform,0)),c=JSM.MatrixMultiply(m.GetTransformationMatrix(),
|
||||
b),this.context.uniformMatrix4fv(n.mvMatrixUniform,!1,c),c=m.GetVertexBuffer(),this.context.bindBuffer(this.context.ARRAY_BUFFER,c),this.context.enableVertexAttribArray(n.vertexPositionAttribute),this.context.vertexAttribPointer(n.vertexPositionAttribute,c.itemSize,this.context.FLOAT,!1,0,0),m=m.GetNormalBuffer(),this.context.bindBuffer(this.context.ARRAY_BUFFER,m),this.context.enableVertexAttribArray(n.vertexNormalAttribute),this.context.vertexAttribPointer(n.vertexNormalAttribute,m.itemSize,this.context.FLOAT,
|
||||
!1,0,0),this.context.drawArrays(this.context.TRIANGLES,0,c.numItems)};JSM.PointCloudRenderer=function(){this.pointSize=this.points=this.camera=this.shader=this.context=this.canvas=null};JSM.PointCloudRenderer.prototype.Init=function(a,b){return!JSM.IsWebGLEnabled()||!this.InitContext(a)||!this.InitShaders()||!this.InitBuffers()||!this.InitView(b)?!1:!0};
|
||||
@ -515,27 +516,30 @@ parseInt(f.length/3,10);this.points.push({pointArray:d,pointBuffer:c,colorBuffer
|
||||
JSM.PointCloudRenderer.prototype.Render=function(){this.context.viewport(0,0,this.context.viewportWidth,this.context.viewportHeight);this.context.clear(this.context.COLOR_BUFFER_BIT|this.context.DEPTH_BUFFER_BIT);var a=JSM.MatrixPerspective(this.camera.fieldOfView*JSM.DegRad,this.context.viewportWidth/this.context.viewportHeight,this.camera.nearClippingPlane,this.camera.farClippingPlane);this.context.uniformMatrix4fv(this.shader.pMatrixUniform,!1,a);a=JSM.MatrixView(this.camera.eye,this.camera.center,
|
||||
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,h=null;JSM.ExplodeBodyToTriangles(a,b,{hasConvexPolygons:!1,onGeometryStart:function(a){e=[];f=[];h=[];var b=JSM.HexColorToNormalizedRGBComponents(a.ambient),k=JSM.HexColorToNormalizedRGBComponents(a.diffuse),m=JSM.HexColorToNormalizedRGBComponents(a.specular);a=new JSM.RenderMaterial(b,k,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(h)},onTriangle:function(a,b,c,d,n,p,q,t,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!==t&&null!==s)&&(h.push(q.x,q.y),h.push(t.x,t.y),h.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.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),k=JSM.HexColorToNormalizedRGBComponents(a.diffuse),m=JSM.HexColorToNormalizedRGBComponents(a.specular);a=new JSM.RenderMaterial(b,k,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,t,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!==t&&null!==s)&&(g.push(q.x,q.y),g.push(t.x,t.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)};
|
||||
JSM.Mouse.prototype.SetCurrent=function(a,b){this.currX=a.clientX;this.currY=a.clientY;void 0!==b&&(void 0!==b.offsetLeft&&void 0!==b.offsetTop)&&(this.currX-=b.offsetLeft,this.currY-=b.offsetTop)};JSM.Touch=function(){this.down=!1;this.diffY=this.diffX=this.currY=this.currX=this.prevY=this.prevX=0};JSM.Touch.prototype.Start=function(a,b){if(0!==a.touches.length){var c=a.touches[0];this.down=!0;this.SetCurrent(c,b);this.prevX=this.currX;this.prevY=this.currY}};
|
||||
JSM.Touch.prototype.Move=function(a,b){0!==a.touches.length&&(this.SetCurrent(a.touches[0],b),this.diffX=this.currX-this.prevX,this.diffY=this.currY-this.prevY,this.prevX=this.currX,this.prevY=this.currY)};JSM.Touch.prototype.End=function(a,b){if(0!==a.touches.length){var c=a.touches[0];this.down=!1;this.SetCurrent(c,b)}};
|
||||
JSM.Touch.prototype.SetCurrent=function(a,b){this.currX=a.pageX;this.currY=a.pageY;void 0!==b&&(void 0!==b.offsetLeft&&void 0!==b.offsetTop)&&(this.currX=a.pageX-b.offsetLeft,this.currY=a.pageY-b.offsetTop)};JSM.Navigation=function(){this.orbitCenter=this.cameraFarDistanceLimit=this.cameraNearDistanceLimit=this.cameraEnableZoom=this.cameraEnablePan=this.cameraEnableOrbit=this.cameraFixUp=this.touch=this.mouse=this.resizeCallback=this.drawCallback=this.camera=this.canvas=null};
|
||||
JSM.Mouse=function(){this.down=!1;this.button=0;this.alt=this.ctrl=this.shift=!1;this.prev=new JSM.Coord2D(0,0);this.curr=new JSM.Coord2D(0,0);this.diff=new JSM.Coord2D(0,0)};JSM.Mouse.prototype.Down=function(a,b){var c=a||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.prev=this.curr.Clone()};
|
||||
JSM.Mouse.prototype.Move=function(a,b){var c=a||window.event;this.shift=a.shiftKey;this.ctrl=a.ctrlKey;this.alt=a.altKey;this.SetCurrent(c,b);this.diff=JSM.CoordSub2D(this.curr,this.prev);this.prev=this.curr.Clone()};JSM.Mouse.prototype.Up=function(a,b){var c=a||window.event;this.down=!1;this.SetCurrent(c,b)};JSM.Mouse.prototype.Out=function(a,b){var c=a||window.event;this.down=!1;this.SetCurrent(c,b)};
|
||||
JSM.Mouse.prototype.SetCurrent=function(a,b){var c=a.clientX,d=a.clientY;void 0!==b&&(void 0!==b.offsetLeft&&void 0!==b.offsetTop)&&(c-=b.offsetLeft,d-=b.offsetTop);this.curr=new JSM.Coord2D(c,d)};JSM.Touch=function(){this.down=!1;this.fingers=0;this.prev=new JSM.Coord2D;this.curr=new JSM.Coord2D;this.diff=new JSM.Coord2D};JSM.Touch.prototype.Start=function(a,b){0!==a.touches.length&&(this.down=!0,this.fingers=a.touches.length,this.SetCurrent(a,b),this.prev=this.curr.Clone())};
|
||||
JSM.Touch.prototype.Move=function(a,b){0!==a.touches.length&&(this.fingers=a.touches.length,this.SetCurrent(a,b),this.diff=JSM.CoordSub2D(this.curr,this.prev),this.prev=this.curr.Clone())};JSM.Touch.prototype.End=function(a,b){0!==a.touches.length&&(this.down=!1,this.SetCurrent(a,b))};
|
||||
JSM.Touch.prototype.SetCurrent=function(a,b){function c(a){var c=a.pageX;a=a.pageY;void 0!==b&&(void 0!==b.offsetLeft&&void 0!==b.offsetTop)&&(c-=b.offsetLeft,a-=b.offsetTop);return new JSM.Coord2D(c,a)}if(1==a.touches.length||3==a.touches.length)this.curr=c(a.touches[0]);else if(2==a.touches.length){var d=c(a.touches[0]).DistanceTo(c(a.touches[1]));this.curr=new JSM.Coord2D(d,d)}};
|
||||
JSM.Navigation=function(){this.orbitCenter=this.cameraFarDistanceLimit=this.cameraNearDistanceLimit=this.cameraEnableZoom=this.cameraEnablePan=this.cameraEnableOrbit=this.cameraFixUp=this.touch=this.mouse=this.resizeCallback=this.drawCallback=this.camera=this.canvas=null};
|
||||
JSM.Navigation.prototype.Init=function(a,b,c,d){this.canvas=a;this.camera=b;this.drawCallback=c;this.resizeCallback=d;this.mouse=new JSM.Mouse;this.touch=new JSM.Touch;this.cameraEnableZoom=this.cameraEnablePan=this.cameraEnableOrbit=this.cameraFixUp=!0;this.cameraNearDistanceLimit=0.1;this.cameraFarDistanceLimit=1E3;this.orbitCenter=this.camera.center.Clone();var e=this;document.addEventListener&&(document.addEventListener("mousemove",function(a){e.OnMouseMove(a)}),document.addEventListener("mouseup",
|
||||
function(a){e.OnMouseUp(a)}));this.canvas.addEventListener&&(this.canvas.addEventListener("mousedown",function(a){e.OnMouseDown(a)},!1),this.canvas.addEventListener("DOMMouseScroll",function(a){e.OnMouseWheel(a)},!1),this.canvas.addEventListener("mousewheel",function(a){e.OnMouseWheel(a)},!1),this.canvas.addEventListener("touchstart",function(a){e.OnTouchStart(a)},!1),this.canvas.addEventListener("touchmove",function(a){e.OnTouchMove(a)},!1),this.canvas.addEventListener("touchend",function(a){e.OnTouchEnd(a)},
|
||||
!1),this.canvas.addEventListener("contextmenu",function(a){e.OnContextMenu(a)},!1));window.addEventListener&&window.addEventListener("resize",function(a){e.OnResize(a)},!1);return!0};JSM.Navigation.prototype.SetCamera=function(a,b,c){this.camera.Set(a,b,c);this.orbitCenter=this.camera.center.Clone()};JSM.Navigation.prototype.EnableFixUp=function(a){this.cameraFixUp=a};JSM.Navigation.prototype.EnableOrbit=function(a){this.cameraEnableOrbit=a};
|
||||
JSM.Navigation.prototype.EnablePan=function(a){this.cameraEnablePan=a};JSM.Navigation.prototype.EnableZoom=function(a){this.cameraEnableZoom=a};JSM.Navigation.prototype.SetNearDistanceLimit=function(a){this.cameraNearDistanceLimit=a};JSM.Navigation.prototype.SetFarDistanceLimit=function(a){this.cameraFarDistanceLimit=a};JSM.Navigation.prototype.SetOrbitCenter=function(a){this.orbitCenter=a};
|
||||
JSM.Navigation.prototype.FitInWindow=function(a,b){var c=JSM.CoordSub(this.camera.center,a);this.camera.center=a;this.camera.eye=JSM.CoordSub(this.camera.eye,c);var c=JSM.CoordSub(this.camera.eye,this.camera.center).Normalize(),d=this.camera.fieldOfView/2;this.canvas.width<this.canvas.height&&(d=d*this.canvas.width/this.canvas.height);d=b/Math.sin(d*JSM.DegRad);this.camera.eye=this.camera.center.Clone().Offset(c,d);this.orbitCenter=this.camera.center.Clone()};
|
||||
JSM.Navigation.prototype.Orbit=function(a,b){var c=a*JSM.DegRad,d=b*JSM.DegRad,e=JSM.CoordSub(this.camera.center,this.camera.eye).Normalize(),f=JSM.VectorCross(e,this.camera.up).Normalize(),h=!this.orbitCenter.IsEqual(this.camera.center);this.cameraFixUp?(e=e.AngleTo(this.camera.up)+d,JSM.IsGreater(e,0)&&JSM.IsLower(e,Math.PI)&&(this.camera.eye.Rotate(f,-d,this.orbitCenter),h&&this.camera.center.Rotate(f,-d,this.orbitCenter)),this.camera.eye.Rotate(this.camera.up,-c,this.orbitCenter),h&&this.camera.center.Rotate(this.camera.up,
|
||||
-c,this.orbitCenter)):(e=JSM.VectorCross(f,e).Normalize(),this.camera.eye.Rotate(f,-d,this.orbitCenter),this.camera.eye.Rotate(e,-c,this.orbitCenter),h&&(this.camera.center.Rotate(f,-d,this.orbitCenter),this.camera.center.Rotate(e,-c,this.orbitCenter)),this.camera.up=e)};
|
||||
JSM.Navigation.prototype.Orbit=function(a,b){var c=a*JSM.DegRad,d=b*JSM.DegRad,e=JSM.CoordSub(this.camera.center,this.camera.eye).Normalize(),f=JSM.VectorCross(e,this.camera.up).Normalize(),g=!this.orbitCenter.IsEqual(this.camera.center);this.cameraFixUp?(e=e.AngleTo(this.camera.up)+d,JSM.IsGreater(e,0)&&JSM.IsLower(e,Math.PI)&&(this.camera.eye.Rotate(f,-d,this.orbitCenter),g&&this.camera.center.Rotate(f,-d,this.orbitCenter)),this.camera.eye.Rotate(this.camera.up,-c,this.orbitCenter),g&&this.camera.center.Rotate(this.camera.up,
|
||||
-c,this.orbitCenter)):(e=JSM.VectorCross(f,e).Normalize(),this.camera.eye.Rotate(f,-d,this.orbitCenter),this.camera.eye.Rotate(e,-c,this.orbitCenter),g&&(this.camera.center.Rotate(f,-d,this.orbitCenter),this.camera.center.Rotate(e,-c,this.orbitCenter)),this.camera.up=e)};
|
||||
JSM.Navigation.prototype.Pan=function(a,b){var c=JSM.CoordSub(this.camera.center,this.camera.eye).Normalize(),d=JSM.VectorCross(c,this.camera.up).Normalize(),c=JSM.VectorCross(d,c).Normalize();this.camera.eye.Offset(d,-a);this.camera.center.Offset(d,-a);this.camera.eye.Offset(c,b);this.camera.center.Offset(c,b)};
|
||||
JSM.Navigation.prototype.Zoom=function(a){var b=JSM.CoordSub(this.camera.center,this.camera.eye),c=b.Length();if(a&&c<this.cameraNearDistanceLimit||!a&&c>this.cameraFarDistanceLimit)return 0;c*=0.1;a||(c*=-1);this.camera.eye.Offset(b,c)};JSM.Navigation.prototype.DrawCallback=function(){void 0!==this.drawCallback&&null!==this.drawCallback&&this.drawCallback()};JSM.Navigation.prototype.ResizeCallback=function(){void 0!==this.resizeCallback&&null!==this.resizeCallback&&this.resizeCallback()};
|
||||
JSM.Navigation.prototype.OnMouseDown=function(a){a.preventDefault();this.mouse.Down(a,this.canvas)};JSM.Navigation.prototype.OnMouseMove=function(a){a.preventDefault();this.mouse.Move(a,this.canvas);this.mouse.down&&(a=0,1==this.mouse.button?this.cameraEnableOrbit&&(a=0.5,this.Orbit(this.mouse.diffX*a,this.mouse.diffY*a),this.DrawCallback()):3==this.mouse.button&&this.cameraEnablePan&&(a=0.001*this.camera.eye.DistanceTo(this.camera.center),this.Pan(this.mouse.diffX*a,this.mouse.diffY*a),this.DrawCallback()))};
|
||||
JSM.Navigation.prototype.OnMouseUp=function(a){a.preventDefault();this.mouse.Up(a,this.canvas)};JSM.Navigation.prototype.OnMouseOut=function(a){a.preventDefault();this.mouse.Out(a,this.canvas)};JSM.Navigation.prototype.OnMouseWheel=function(a){a.preventDefault();if(this.cameraEnableZoom){null===a&&(a=window.event);var b=0;a.detail?b=-a.detail:a.wheelDelta&&(b=a.wheelDelta/40);this.Zoom(0<b);this.DrawCallback()}};
|
||||
JSM.Navigation.prototype.OnTouchStart=function(a){a.preventDefault();this.touch.Start(a,this.canvas)};JSM.Navigation.prototype.OnTouchMove=function(a){a.preventDefault();this.touch.Move(a,this.canvas);this.touch.down&&this.cameraEnableOrbit&&(this.Orbit(0.5*this.touch.diffX,0.5*this.touch.diffY),this.DrawCallback())};JSM.Navigation.prototype.OnTouchEnd=function(a){a.preventDefault();this.touch.End(a,this.canvas)};JSM.Navigation.prototype.OnContextMenu=function(a){a.preventDefault()};
|
||||
JSM.Navigation.prototype.OnResize=function(a){a.preventDefault();this.ResizeCallback()};JSM.SoftwareViewer=function(){this.navigation=this.drawMode=this.drawer=this.bodies=this.camera=this.canvas=null};JSM.SoftwareViewer.prototype.Start=function(a,b){return!this.InitCanvas(a)||!this.InitCamera(b)?!1:!0};
|
||||
JSM.Navigation.prototype.Zoom=function(a){var b=JSM.CoordSub(this.camera.center,this.camera.eye),c=b.Length(),d=0<a;if(d&&c<this.cameraNearDistanceLimit||!d&&c>this.cameraFarDistanceLimit)return 0;this.camera.eye.Offset(b,c*a)};JSM.Navigation.prototype.DrawCallback=function(){void 0!==this.drawCallback&&null!==this.drawCallback&&this.drawCallback()};JSM.Navigation.prototype.ResizeCallback=function(){void 0!==this.resizeCallback&&null!==this.resizeCallback&&this.resizeCallback()};
|
||||
JSM.Navigation.prototype.OnMouseDown=function(a){a.preventDefault();this.mouse.Down(a,this.canvas)};
|
||||
JSM.Navigation.prototype.OnMouseMove=function(a){a.preventDefault();this.mouse.Move(a,this.canvas);if(this.mouse.down){a=0;if(1==this.mouse.button){if(!this.cameraEnableOrbit)return;a=0.5;this.Orbit(this.mouse.diff.x*a,this.mouse.diff.y*a)}else if(3==this.mouse.button){if(!this.cameraEnablePan)return;a=0.001*this.camera.eye.DistanceTo(this.camera.center);this.Pan(this.mouse.diff.x*a,this.mouse.diff.y*a)}this.DrawCallback()}};
|
||||
JSM.Navigation.prototype.OnMouseUp=function(a){a.preventDefault();this.mouse.Up(a,this.canvas)};JSM.Navigation.prototype.OnMouseOut=function(a){a.preventDefault();this.mouse.Out(a,this.canvas)};JSM.Navigation.prototype.OnMouseWheel=function(a){a.preventDefault();if(this.cameraEnableZoom){var b=a;null===b&&(b=window.event);a=0;b.detail?a=-b.detail:b.wheelDelta&&(a=b.wheelDelta/40);b=0.1;0>a&&(b*=-1);this.Zoom(b);this.DrawCallback()}};
|
||||
JSM.Navigation.prototype.OnTouchStart=function(a){a.preventDefault();this.touch.Start(a,this.canvas)};
|
||||
JSM.Navigation.prototype.OnTouchMove=function(a){a.preventDefault();this.touch.Move(a,this.canvas);if(this.touch.down){a=0;if(1==this.touch.fingers){if(!this.cameraEnableOrbit)return;a=0.5;this.Orbit(this.touch.diff.x*a,this.touch.diff.y*a)}else if(2==this.touch.fingers){if(!this.cameraEnableZoom)return;this.Zoom(0.005*this.touch.diff.x)}else if(3==this.touch.fingers){if(!this.cameraEnablePan)return;a=0.001*this.camera.eye.DistanceTo(this.camera.center);this.Pan(this.touch.diff.x*a,this.touch.diff.y*
|
||||
a)}this.DrawCallback()}};JSM.Navigation.prototype.OnTouchEnd=function(a){a.preventDefault();this.touch.End(a,this.canvas)};JSM.Navigation.prototype.OnContextMenu=function(a){a.preventDefault()};JSM.Navigation.prototype.OnResize=function(a){a.preventDefault();this.ResizeCallback()};JSM.SoftwareViewer=function(){this.navigation=this.drawMode=this.drawer=this.bodies=this.camera=this.canvas=null};JSM.SoftwareViewer.prototype.Start=function(a,b){return!this.InitCanvas(a)||!this.InitCamera(b)?!1:!0};
|
||||
JSM.SoftwareViewer.prototype.InitCanvas=function(a){this.bodies=[];this.canvas=a;if(!this.canvas)return!1;this.canvas instanceof HTMLCanvasElement?this.drawer=new JSM.CanvasDrawer(this.canvas):this.canvas instanceof SVGSVGElement&&(this.drawer=new JSM.SVGDrawer(this.canvas));if(!this.drawer)return!1;this.drawMode="Wireframe";return!0};
|
||||
JSM.SoftwareViewer.prototype.InitCamera=function(a){this.camera=JSM.ValueOrDefault(a,new JSM.Camera);if(!this.camera)return!1;this.navigation=new JSM.Navigation;return!this.navigation.Init(this.canvas,this.camera,this.Draw.bind(this),this.Resize.bind(this))?!1:!0};JSM.SoftwareViewer.prototype.AddBody=function(a,b){this.bodies.push([a,b])};JSM.SoftwareViewer.prototype.RemoveBodies=function(){this.bodies=[]};
|
||||
JSM.SoftwareViewer.prototype.FitInWindow=function(){var a=this.GetBoundingSphere();this.navigation.FitInWindow(a.GetCenter(),a.GetRadius());this.Draw()};JSM.SoftwareViewer.prototype.GetCenter=function(){return this.GetBoundingBox().GetCenter()};
|
||||
@ -544,8 +548,8 @@ JSM.SoftwareViewer.prototype.GetBoundingSphere=function(){var a=this.GetCenter()
|
||||
JSM.SoftwareViewer.prototype.Draw=function(){var a,b;this.drawer.Clear();for(a=0;a<this.bodies.length;a++)b=this.bodies[a],JSM.DrawProjectedBody(b[0],b[1],this.camera,this.drawMode,!1,this.drawer);return!0};JSM.SpriteViewer=function(){this.navigation=this.projected=this.points=this.callbacks=this.camera=this.canvas=null};JSM.SpriteViewer.prototype.Start=function(a,b,c){return!this.InitCanvas(a)||!this.InitCamera(b)||!this.InitCallbacks(c)?!1:!0};
|
||||
JSM.SpriteViewer.prototype.InitCanvas=function(a){this.points=[];this.canvas=a;return!this.canvas?!1:!0};JSM.SpriteViewer.prototype.InitCamera=function(a){this.camera=JSM.ValueOrDefault(a,new JSM.Camera);if(!this.camera)return!1;this.navigation=new JSM.Navigation;return!this.navigation.Init(this.canvas,this.camera,this.Draw.bind(this))?!1:!0};
|
||||
JSM.SpriteViewer.prototype.InitCallbacks=function(a){this.callbacks={onPointDraw:null};void 0!==a&&(void 0!==a.onDrawStart&&(this.callbacks.onDrawStart=a.onDrawStart),void 0!==a.onPointDraw&&(this.callbacks.onPointDraw=a.onPointDraw),void 0!==a.onDrawEnd&&(this.callbacks.onDrawEnd=a.onDrawEnd));return!0};JSM.SpriteViewer.prototype.AddPoint=function(a){this.points.push(a)};JSM.SpriteViewer.prototype.RemovePoints=function(){this.points=[]};JSM.SpriteViewer.prototype.Resize=function(){this.Draw()};
|
||||
JSM.SpriteViewer.prototype.NearestPointUnderPosition=function(a,b,c){b=new JSM.Coord2D(b,c);c=-1;var d=JSM.Inf,e,f,h;for(e=0;e<this.projected.length;e++)f=this.projected[e],h=b.DistanceTo(new JSM.Coord2D(f.position.x,f.position.y)),JSM.IsLower(h,a)&&JSM.IsLower(h,d)&&(c=f.originalIndex,d=h);return c};JSM.SpriteViewer.prototype.NearestPointUnderMouse=function(a){return this.NearestPointUnderPosition(a,this.navigation.mouse.currX,this.navigation.mouse.currY)};
|
||||
JSM.SpriteViewer.prototype.NearestPointUnderTouch=function(a){return this.NearestPointUnderPosition(a,this.navigation.touch.currX,this.navigation.touch.currY)};JSM.SpriteViewer.prototype.FitInWindow=function(){var a=this.GetBoundingSphere();this.navigation.FitInWindow(a.GetCenter(),a.GetRadius());this.Draw()};JSM.SpriteViewer.prototype.GetCenter=function(){return this.GetBoundingBox().GetCenter()};
|
||||
JSM.SpriteViewer.prototype.NearestPointUnderPosition=function(a,b,c){b=new JSM.Coord2D(b,c);c=-1;var d=JSM.Inf,e,f,g;for(e=0;e<this.projected.length;e++)f=this.projected[e],g=b.DistanceTo(new JSM.Coord2D(f.position.x,f.position.y)),JSM.IsLower(g,a)&&JSM.IsLower(g,d)&&(c=f.originalIndex,d=g);return c};JSM.SpriteViewer.prototype.NearestPointUnderMouse=function(a){return this.NearestPointUnderPosition(a,this.navigation.mouse.curr.x,this.navigation.mouse.curr.y)};
|
||||
JSM.SpriteViewer.prototype.NearestPointUnderTouch=function(a){return this.NearestPointUnderPosition(a,this.navigation.touch.curr.x,this.navigation.touch.curr.y)};JSM.SpriteViewer.prototype.FitInWindow=function(){var a=this.GetBoundingSphere();this.navigation.FitInWindow(a.GetCenter(),a.GetRadius());this.Draw()};JSM.SpriteViewer.prototype.GetCenter=function(){return this.GetBoundingBox().GetCenter()};
|
||||
JSM.SpriteViewer.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.points.length;c++)d=this.points[c],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.SpriteViewer.prototype.GetBoundingSphere=function(){var a=this.GetCenter(),b=0,c,d;for(c=0;c<this.points.length;c++)d=this.points[c],d=a.DistanceTo(d),JSM.IsGreater(d,b)&&(b=d);return new JSM.Sphere(a,b)};
|
||||
JSM.SpriteViewer.prototype.Draw=function(){if(null!==this.callbacks.onDrawStart)this.callbacks.onDrawStart(this.canvas);var a=this.canvas.width/this.canvas.height,b=[0,0,this.canvas.width,this.canvas.height];this.projected=[];var c,d;for(c=0;c<this.points.length;c++)d=this.points[c],d=JSM.Project(d,this.camera.eye,this.camera.center,this.camera.up,this.camera.fieldOfView*JSM.DegRad,a,this.camera.nearClippingPlane,this.camera.farClippingPlane,b),d.y=this.canvas.height-d.y,null!==d&&this.projected.push({position:d,
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
/* JSModeler 0.37 - http://www.github.com/kovacsv/JSModeler */ 'use strict';JSM.ResizeImageToPowerOfTwoSides=function(a){if(JSM.IsPowerOfTwo(a.width)&&!JSM.IsPowerOfTwo(a.height))return a;var b=JSM.NextPowerOfTwo(a.width),d=JSM.NextPowerOfTwo(a.height),c=document.createElement("canvas");c.width=b;c.height=d;c=c.getContext("2d");c.drawImage(a,0,0,b,d);return c.getImageData(0,0,b,d)};
|
||||
/* JSModeler 0.38 - http://www.github.com/kovacsv/JSModeler */ 'use strict';JSM.ResizeImageToPowerOfTwoSides=function(a){if(JSM.IsPowerOfTwo(a.width)&&!JSM.IsPowerOfTwo(a.height))return a;var b=JSM.NextPowerOfTwo(a.width),d=JSM.NextPowerOfTwo(a.height),c=document.createElement("canvas");c.width=b;c.height=d;c=c.getContext("2d");c.drawImage(a,0,0,b,d);return c.getImageData(0,0,b,d)};
|
||||
JSM.ConvertBodyToThreeMeshes=function(a,b,d){var c={textureLoadedCallback:null,hasConvexPolygons:!1,doubleSided:!0};void 0!==d&&null!==d&&(c.textureLoadedCallback=JSM.ValueOrDefault(d.textureLoadedCallback,c.textureLoadedCallback),c.hasConvexPolygons=JSM.ValueOrDefault(d.hasConvexPolygons,c.hasConvexPolygons),c.doubleSided=JSM.ValueOrDefault(d.doubleSided,c.doubleSided));var f=[],e=null;JSM.ExplodeBodyToTriangles(a,b,{hasConvexPolygons:c.hasConvexPolygons,onGeometryStart:function(){e=new THREE.Geometry},
|
||||
onGeometryEnd:function(a){var b=null!==a.texture,d=1!==a.opacity,v=a.ambient,G=a.diffuse,k=a.specular,l=a.shininess;0===l&&(k=0,l=1);v=new THREE.MeshPhongMaterial({ambient:v,color:G,specular:k,shininess:l});c.doubleSided&&(v.side=THREE.DoubleSide);d&&(v.opacity=a.opacity,v.transparent=!0);if(b){var m=THREE.ImageUtils.loadTexture(a.texture,new THREE.UVMapping,function(){m.image=JSM.ResizeImageToPowerOfTwoSides(m.image);null!==c.textureLoadedCallback&&c.textureLoadedCallback()});m.wrapS=THREE.RepeatWrapping;
|
||||
m.wrapT=THREE.RepeatWrapping;v.map=m}e.computeFaceNormals();a=new THREE.Mesh(e,v);f.push(a)},onTriangle:function(a,b,c,d,f,k,l,m,z){var n=e.vertices.length;e.vertices.push(new THREE.Vector3(a.x,a.y,a.z));e.vertices.push(new THREE.Vector3(b.x,b.y,b.z));e.vertices.push(new THREE.Vector3(c.x,c.y,c.z));a=new THREE.Face3(n+0,n+1,n+2);e.faces.push(a);null!==d&&(null!==f&&null!==k)&&(a=[],a.push(new THREE.Vector3(d.x,d.y,d.z)),a.push(new THREE.Vector3(f.x,f.y,f.z)),a.push(new THREE.Vector3(k.x,k.y,k.z)),
|
||||
@ -24,7 +24,7 @@ JSM.ThreeViewer.prototype.SetCamera=function(a,b,d){this.navigation.SetCamera(a,
|
||||
JSM.ThreeViewer.prototype.FitInWindow=function(){if(0!==this.MeshCount()){var a=this.GetBoundingSphere();this.navigation.FitInWindow(a.GetCenter(),a.GetRadius());this.DrawIfNeeded()}};JSM.ThreeViewer.prototype.AdjustClippingPlanes=function(a){this.GetBoundingSphere().GetRadius()<a?(this.camera.near=0.1,this.camera.far=1E3):(this.camera.near=10,this.camera.far=1E6);this.camera.updateProjectionMatrix();this.Draw()};JSM.ThreeViewer.prototype.GetCenter=function(){return this.GetBoundingBox().GetCenter()};
|
||||
JSM.ThreeViewer.prototype.GetBoundingBox=function(){var a=new JSM.Coord(JSM.Inf,JSM.Inf,JSM.Inf),b=new JSM.Coord(-JSM.Inf,-JSM.Inf,-JSM.Inf),d,c;this.scene.traverse(function(f){if(f instanceof THREE.Mesh){d=f.geometry;var e;for(e=0;e<d.vertices.length;e++)c=d.vertices[e].clone(),c.add(f.position),a.x=JSM.Minimum(a.x,c.x),a.y=JSM.Minimum(a.y,c.y),a.z=JSM.Minimum(a.z,c.z),b.x=JSM.Maximum(b.x,c.x),b.y=JSM.Maximum(b.y,c.y),b.z=JSM.Maximum(b.z,c.z)}});return new JSM.Box(a,b)};
|
||||
JSM.ThreeViewer.prototype.GetBoundingSphere=function(){var a=this.GetCenter(),b=0,d,c,f;this.scene.traverse(function(e){if(e instanceof THREE.Mesh){d=e.geometry;var h;for(h=0;h<d.vertices.length;h++)c=d.vertices[h].clone(),c.add(e.position),f=a.DistanceTo(new JSM.Coord(c.x,c.y,c.z)),JSM.IsGreater(f,b)&&(b=f)}});return new JSM.Sphere(a,b)};
|
||||
JSM.ThreeViewer.prototype.GetObjectsUnderPosition=function(a,b){var d=2*(a/this.canvas.width)-1,c=2*-(b/this.canvas.height)+1,f=new THREE.Projector,e=this.camera.position,d=new THREE.Vector3(d,c,0.5);f.unprojectVector(d,this.camera);d.sub(e);d.normalize();return(new THREE.Raycaster(e,d)).intersectObjects(this.scene.children)};JSM.ThreeViewer.prototype.GetObjectsUnderMouse=function(){return this.GetObjectsUnderPosition(this.navigation.mouse.currX,this.navigation.mouse.currY)};
|
||||
JSM.ThreeViewer.prototype.GetObjectsUnderTouch=function(){return this.GetObjectsUnderPosition(this.navigation.touch.currX,this.navigation.touch.currY)};JSM.ThreeViewer.prototype.ProjectVector=function(a,b,d){var c=this.canvas.width/2,f=this.canvas.height/2,e=new THREE.Projector;a=new THREE.Vector3(a,b,d);e.projectVector(a,this.camera);a.x=a.x*c+c;a.y=-(a.y*f)+f;return a};JSM.ThreeViewer.prototype.EnableDraw=function(a){this.enableDraw=a};
|
||||
JSM.ThreeViewer.prototype.GetObjectsUnderPosition=function(a,b){var d=2*(a/this.canvas.width)-1,c=2*-(b/this.canvas.height)+1,f=new THREE.Projector,e=this.camera.position,d=new THREE.Vector3(d,c,0.5);f.unprojectVector(d,this.camera);d.sub(e);d.normalize();return(new THREE.Raycaster(e,d)).intersectObjects(this.scene.children)};JSM.ThreeViewer.prototype.GetObjectsUnderMouse=function(){return this.GetObjectsUnderPosition(this.navigation.mouse.curr.x,this.navigation.mouse.curr.y)};
|
||||
JSM.ThreeViewer.prototype.GetObjectsUnderTouch=function(){return this.GetObjectsUnderPosition(this.navigation.touch.curr.x,this.navigation.touch.curr.y)};JSM.ThreeViewer.prototype.ProjectVector=function(a,b,d){var c=this.canvas.width/2,f=this.canvas.height/2,e=new THREE.Projector;a=new THREE.Vector3(a,b,d);e.projectVector(a,this.camera);a.x=a.x*c+c;a.y=-(a.y*f)+f;return a};JSM.ThreeViewer.prototype.EnableDraw=function(a){this.enableDraw=a};
|
||||
JSM.ThreeViewer.prototype.Draw=function(){if(this.enableDraw){null!==this.runBeforeRender&&this.runBeforeRender();this.camera.position.set(this.cameraMove.eye.x,this.cameraMove.eye.y,this.cameraMove.eye.z);this.camera.up.set(this.cameraMove.up.x,this.cameraMove.up.y,this.cameraMove.up.z);this.camera.lookAt(new THREE.Vector3(this.cameraMove.center.x,this.cameraMove.center.y,this.cameraMove.center.z));var a=(new THREE.Vector3).subVectors(this.cameraMove.eye,this.cameraMove.center);this.directionalLight.position.set(a.x,
|
||||
a.y,a.z);this.renderer.render(this.scene,this.camera);null!==this.runAfterRender&&this.runAfterRender();this.drawLoop&&requestAnimationFrame(this.Draw.bind(this))}};JSM.ThreeViewer.prototype.DrawIfNeeded=function(){this.drawLoop||this.Draw()};JSM.ThreeViewer.prototype.StartDrawLoop=function(){this.drawLoop=!0;this.Draw()};
|
||||
|
||||
Loading…
Reference in New Issue
Block a user