|
|
|
|
@@ -0,0 +1,111 @@
|
|
|
|
|
/*
|
|
|
|
|
Copyright (c) 2010 Humu humu2009@gmail.com
|
|
|
|
|
jsc3d is freely distributable under the terms of the MIT license.
|
|
|
|
|
*/
|
|
|
|
|
var a;JSC3D={};
|
|
|
|
|
JSC3D.Viewer=function(b){this.params={SceneUrl:"",InitRotationX:0,InitRotationY:0,InitRotationZ:0,ModelColor:"#caa618",BackgroundColor1:"#ffffff",BackgroundColor2:"#383840",RenderMode:"flat",Definition:"standard",MipMapping:"off"};this.canvas=b;this.selectionBuffer=this.zBuffer=this.colorBuffer=this.bkgColorBuffer=this.canvasData=this.ctx=null;this.frameWidth=b.width;this.frameHeight=b.height;this.defaultMaterial=this.scene=null;this.isFailed=this.isLoaded=false;this.errorMsg="";this.initRotZ=this.initRotY=
|
|
|
|
|
this.initRotX=0;this.zoomFactor=1;this.rotMatrix=new JSC3D.Matrix3x4;this.transformMatrix=new JSC3D.Matrix3x4;this.sceneUrl="";this.modelColor=13280792;this.bkgColor1=16777215;this.bkgColor2=3684416;this.renderMode="flat";this.definition="standard";this.isMipMappingOn=false;this.buttonStates={};this.keyStates={};this.mouseY=this.mouseX=0;this.afterupdate=this.beforeupdate=this.onmousemove=this.onmouseup=this.onmousedown=null;this.isDefaultInputHandlerEnabled=true;var c=this;this.canvas.addEventListener("mousedown",
|
|
|
|
|
function(f){c.mouseDownHandler(f)},false);this.canvas.addEventListener("mouseup",function(f){c.mouseUpHandler(f)},false);this.canvas.addEventListener("mousemove",function(f){c.mouseMoveHandler(f)},false);document.addEventListener("keydown",function(f){c.keyDownHandler(f)},false);document.addEventListener("keyup",function(f){c.keyUpHandler(f)},false)};a=JSC3D.Viewer.prototype;a.setParameter=function(b,c){this.params[b]=c};
|
|
|
|
|
a.init=function(){this.sceneUrl=this.params.SceneUrl;this.initRotX=parseFloat(this.params.InitRotationX);this.initRotY=parseFloat(this.params.InitRotationY);this.initRotZ=parseFloat(this.params.InitRotationZ);this.modelColor=parseInt("0x"+this.params.ModelColor.substring(1));this.bkgColor1=parseInt("0x"+this.params.BackgroundColor1.substring(1));this.bkgColor2=parseInt("0x"+this.params.BackgroundColor2.substring(1));this.renderMode=this.params.RenderMode.toLowerCase();this.definition=this.params.Definition.toLowerCase();
|
|
|
|
|
this.isMipMappingOn=this.params.MipMapping.toLowerCase()=="on";try{this.ctx=this.canvas.getContext("2d");this.canvasData=this.ctx.getImageData(0,0,this.canvas.width,this.canvas.height)}catch(b){this.canvasData=this.ctx=null}if(this.canvas.width<=2||this.canvas.height<=2)this.definition="standard";switch(this.definition){case "low":this.frameWidth=~~((this.canvas.width+1)/2);this.frameHeight=~~((this.canvas.height+1)/2);break;case "high":this.frameWidth=this.canvas.width*2;this.frameHeight=this.canvas.height*
|
|
|
|
|
2;break;case "standard":default:this.frameWidth=this.canvas.width;this.frameHeight=this.canvas.height;break}this.zoomFactor=1;this.rotMatrix.identity();this.transformMatrix.identity();this.isFailed=this.isLoaded=false;this.errorMsg="";this.scene=null;this.colorBuffer=new Array(this.frameWidth*this.frameHeight);this.zBuffer=new Array(this.frameWidth*this.frameHeight);this.selectionBuffer=new Array(this.frameWidth*this.frameHeight);this.bkgColorBuffer=new Array(this.frameWidth*this.frameHeight);this.generateBackground();
|
|
|
|
|
this.defaultMaterial=new JSC3D.Material;this.defaultMaterial.ambientColor=0;this.defaultMaterial.diffuseColor=this.modelColor;this.defaultMaterial.transparency=0;this.defaultMaterial.simulateSpecular=true;this.drawBackground();this.loadScene()};
|
|
|
|
|
a.update=function(b){if(this.isFailed)this.reportError(this.errorMsg);else{this.beforeupdate!=null&&typeof this.beforeupdate=="function"&&this.beforeupdate();if(this.scene){if(!b&&this.colorBuffer!=null){this.beginScene();this.render();this.endScene()}this.paint()}else this.drawBackground();this.afterupdate!=null&&typeof this.afterupdate=="function"&&this.afterupdate()}};a.rotate=function(b,c,f){this.rotMatrix.rotateAboutXAxis(b);this.rotMatrix.rotateAboutYAxis(c);this.rotMatrix.rotateAboutZAxis(f)};
|
|
|
|
|
a.setRenderMode=function(b){this.renderMode=this.params.RenderMode=b};
|
|
|
|
|
a.setDefinition=function(b){if(this.canvas.width<=2||this.canvas.height<=2)b="standard";if(b!=this.definition){this.definition=this.params.Definition=b;b=this.frameWidth;switch(this.definition){case "low":this.frameWidth=~~((this.canvas.width+1)/2);this.frameHeight=~~((this.canvas.height+1)/2);break;case "high":this.frameWidth=this.canvas.width*2;this.frameHeight=this.canvas.height*2;break;case "standard":default:this.frameWidth=this.canvas.width;this.frameHeight=this.canvas.height;break}var c=this.frameWidth*
|
|
|
|
|
this.frameHeight;if(this.colorBuffer.length<c)this.colorBuffer=new Array(c);if(this.zBuffer.length<c)this.zBuffer=new Array(c);if(this.selectionBuffer.length<c)this.selectionBuffer=new Array(c);if(this.bkgColorBuffer.length<c)this.bkgColorBuffer=new Array(c);this.generateBackground();this.zoomFactor*=this.frameWidth/b}};a.enableDefaultInputHandler=function(b){this.isDefaultInputHandlerEnabled=b};
|
|
|
|
|
a.replaceSceneFromUrl=function(b){this.sceneUrl=this.params.SceneUrl=b;this.isFailed=this.isLoaded=false;this.loadScene()};a.replaceScene=function(b){this.sceneUrl=this.params.SceneUrl="";this.isFailed=false;this.isLoaded=true;this.errorMsg="";this.setupScene(b)};a.getScene=function(){return this.scene};
|
|
|
|
|
a.pick=function(b,c){var f=new JSC3D.PickInfo,g=this.canvas.getBoundingClientRect();b=b-g.left;c=c-g.top;g=b;var d=c;if(this.selectionBuffer!=null&&b>=0&&b<this.canvas.width&&c>=0&&c<this.canvas.height){switch(this.definition){case "low":g=~~(g/2);d=~~(d/2);break;case "high":g*=2;d*=2;break;case "standard":default:break}var e=this.selectionBuffer[d*this.frameWidth+g];if(e>0)for(var h=this.scene.getChildren(),i=0;i<h.length;i++)if(h[i].internalId==e){f.mesh=h[i];break}}f.canvasX=b;f.canvasY=c;if(f.mesh)f.depth=
|
|
|
|
|
this.zBuffer[d*this.frameWidth+g];return f};a.paint=function(){this.canvasData&&this.ctx.putImageData(this.canvasData,0,0)};a.mouseDownHandler=function(b){if(this.onmousedown){var c=this.pick(b.clientX,b.clientY);this.onmousedown(c.canvasX,c.canvasY,b.button,c.depth,c.mesh)}if(this.isDefaultInputHandlerEnabled){this.buttonStates[b.button]=true;this.mouseX=b.clientX;this.mouseY=b.clientY}};
|
|
|
|
|
a.mouseUpHandler=function(b){if(this.onmouseup){var c=this.pick(b.clientX,b.clientY);this.onmouseup(c.canvasX,c.canvasY,b.button,c.depth,c.mesh)}if(this.isDefaultInputHandlerEnabled)this.buttonStates[b.button]=false};
|
|
|
|
|
a.mouseMoveHandler=function(b){if(this.onmousemove){var c=this.pick(b.clientX,b.clientY);this.onmousemove(c.canvasX,c.canvasY,b.button,c.depth,c.mesh)}if(this.isDefaultInputHandlerEnabled){c=this.keyStates[16]==true;if(this.buttonStates[0]==true){if(c)this.zoomFactor*=this.mouseY<=b.clientY?1.11:0.9;else{c=(b.clientX-this.mouseX)*360/this.canvas.height;this.rotMatrix.rotateAboutXAxis((this.mouseY-b.clientY)*360/this.canvas.width);this.rotMatrix.rotateAboutYAxis(c)}this.mouseX=b.clientX;this.mouseY=
|
|
|
|
|
b.clientY;this.update()}}};a.keyDownHandler=function(b){if(this.isDefaultInputHandlerEnabled)this.keyStates[b.keyCode]=true};a.keyUpHandler=function(b){if(this.isDefaultInputHandlerEnabled)this.keyStates[b.keyCode]=false};
|
|
|
|
|
a.loadScene=function(){this.scene=null;this.isLoaded=false;if(this.sceneUrl=="")return false;var b=this.sceneUrl.lastIndexOf("/");if(b==-1)b=this.sceneUrl.lastIndexOf("\\");b=this.sceneUrl.substring(b+1);var c=b.lastIndexOf(".");if(c==-1)return false;b=b.substring(c+1);b=JSC3D.LoaderSelector.getLoader(b);if(!b)return false;var f=this;b.onload=function(g){f.setupScene(g)};b.onerror=function(g){f.scene=null;f.isLoaded=false;f.isFailed=true;f.errorMsg=g;f.update()};b.onprogress=function(g,d){f.reportProgress(g,
|
|
|
|
|
d)};b.onresource=function(g){g instanceof JSC3D.Texture&&f.isMipMappingOn&&!g.hasMipmap()&&g.generateMipmaps();f.update()};b.loadFromUrl(this.sceneUrl);return true};
|
|
|
|
|
a.setupScene=function(b){b.init();if(!b.isEmpty()){var c=b.aabb.lengthOfDiagonal(),f=this.frameWidth,g=this.frameHeight;this.zoomFactor=c==0?1:(f<g?f:g)/c}this.rotMatrix.identity();this.rotMatrix.rotateAboutXAxis(this.initRotX);this.rotMatrix.rotateAboutYAxis(this.initRotY);this.rotMatrix.rotateAboutZAxis(this.initRotZ);this.scene=b;this.isLoaded=true;this.isFailed=false;this.errorMsg="";this.update()};
|
|
|
|
|
a.reportProgress=function(b,c){if(this.ctx){this.drawBackground();this.ctx.save();var f=255-((this.bkgColor1&65280)>>8),g=255-(this.bkgColor1&255);f="#"+(255-((this.bkgColor1&16711680)>>16)).toString(16)+f.toString(16)+g.toString(16);this.ctx.strokeStyle=f;this.ctx.fillStyle=f;f=this.canvas.height*0.38;g=this.canvas.width-80;this.ctx.strokeRect(40,f,g,20);this.ctx.fillRect(42,f+2,(g-4)*c,16);this.ctx.font="12px Courier New";this.ctx.textAlign="left";this.ctx.fillText(b,40,f-4,g);this.ctx.restore()}};
|
|
|
|
|
a.reportError=function(b){if(this.ctx){this.drawBackground();this.ctx.save();var c=this.canvas.height*0.38-4,f=255-((this.bkgColor1&65280)>>8),g=255-(this.bkgColor1&255);this.ctx.fillStyle="#"+(255-((this.bkgColor1&16711680)>>16)).toString(16)+f.toString(16)+g.toString(16);this.ctx.font="16px Courier New";this.ctx.textAlign="left";this.ctx.fillText(b,40,c);this.ctx.restore()}};
|
|
|
|
|
a.generateBackground=function(){for(var b=this.frameWidth,c=this.frameHeight,f=this.bkgColorBuffer,g=(this.bkgColor1&16711680)>>16,d=(this.bkgColor1&65280)>>8,e=this.bkgColor1&255,h=(this.bkgColor2&16711680)>>16,i=(this.bkgColor2&65280)>>8,m=this.bkgColor2&255,n=0,q=0;q<c;q++)for(var j=g+q*(h-g)/c&255,A=d+q*(i-d)/c&255,k=e+q*(m-e)/c&255,J=0;J<b;J++)f[n++]=j<<16|A<<8|k};a.drawBackground=function(){if(this.canvasData){this.beginScene();this.endScene();this.paint()}};
|
|
|
|
|
a.beginScene=function(){for(var b=this.colorBuffer,c=this.zBuffer,f=this.selectionBuffer,g=this.bkgColorBuffer,d=this.frameWidth*this.frameHeight,e=-Number.MAX_VALUE,h=0;h<d;h++){b[h]=g[h];c[h]=e;f[h]=0}};
|
|
|
|
|
a.endScene=function(){var b=this.canvasData.data,c=this.canvas.width,f=this.canvas.height,g=this.colorBuffer,d=this.frameWidth,e=d*this.frameHeight;switch(this.definition){case "low":var h=c>>1,i=d-h,m=0,n=0;for(e=0;e<f;e++){for(var q=0;q<c;q++){d=g[m];b[n]=(d&16711680)>>16;b[n+1]=(d&65280)>>8;b[n+2]=d&255;b[n+3]=255;m+=q&1;n+=4}m+=e&1?i:-h}break;case "high":for(e=n=m=0;e<f;e++){for(q=0;q<c;q++){h=g[m];i=g[m+1];var j=g[m+d],A=g[m+d+1];b[n]=(h&16711680)+(i&16711680)+(j&16711680)+(A&16711680)>>18;b[n+
|
|
|
|
|
1]=(h&65280)+(i&65280)+(j&65280)+(A&65280)>>10;b[n+2]=(h&255)+(i&255)+(j&255)+(A&255)>>2;b[n+3]=255;m+=2;n+=4}m+=d}break;case "standard":default:for(n=m=0;m<e;m++,n+=4){d=g[m];b[n]=(d&16711680)>>16;b[n+1]=(d&65280)>>8;b[n+2]=d&255;b[n+3]=255}break}};
|
|
|
|
|
a.render=function(){if(!this.scene.isEmpty()){var b=this.scene.aabb;this.transformMatrix.identity();this.transformMatrix.translate(-(b.minX+b.maxX)/2,-(b.minY+b.maxY)/2,-(b.minZ+b.maxZ)/2);this.transformMatrix.multiply(this.rotMatrix);this.transformMatrix.scale(this.zoomFactor,-this.zoomFactor,this.zoomFactor);this.transformMatrix.translate(this.frameWidth/2,this.frameHeight/2,0);b=this.sortScene(this.transformMatrix);for(var c=0;c<b.length;c++){var f=b[c];if(!f.isTrivial()){JSC3D.Math3D.transformVectors(this.transformMatrix,
|
|
|
|
|
f.vertexBuffer,f.transformedVertexBuffer);if(f.visible)switch(this.renderMode){case "point":this.renderPoint(f);break;case "wireframe":this.renderWireframe(f);break;case "flat":this.renderSolidFlat(f);break;case "smooth":this.renderSolidSmooth(f);break;case "texture":f.hasTexture()?this.renderSolidTexture(f):this.renderSolidFlat(f);break;case "textureflat":f.hasTexture()?this.renderTextureFlat(f):this.renderSolidFlat(f);break;case "texturesmooth":f.hasTexture()?this.renderTextureSmooth(f):this.renderSolidSmooth(f);
|
|
|
|
|
break;default:this.renderSolidFlat(f);break}}}}};
|
|
|
|
|
a.sortScene=function(b){for(var c=[],f=this.scene.getChildren(),g=0;g<f.length;g++){var d=f[g];if(!d.isTrivial()){c.push(d);var e=d.aabb.center();JSC3D.Math3D.transformVectors(b,e,e);d.sortKey={depth:e[2],isTransparnt:(d.material?d.material:this.defaultMaterial).transparency>0||(d.hasTexture()?d.texture.hasTransparency:false)}}}c.sort(function(h,i){if(!h.sortKey.isTransparnt&&i.sortKey.isTransparnt)return-1;if(h.sortKey.isTransparnt&&!i.sortKey.isTransparnt)return 1;if(h.sortKey.isTransparnt)return h.sortKey.depth-
|
|
|
|
|
i.sortKey.depth;return i.sortKey.depth-h.sortKey.depth});return c};
|
|
|
|
|
a.renderPoint=function(b){var c=this.frameWidth,f=c-1,g=this.frameHeight-1,d=b.transformedVertexBuffer,e=b.transformedVertexNormalZBuffer,h=this.colorBuffer,i=this.zBuffer,m=this.selectionBuffer,n=d.length/3,q=b.internalId,j=b.material?b.material.diffuseColor:this.defaultMaterial.diffuseColor;if(!e||e.length<n){b.transformedVertexNormalZBuffer=new Array(n);e=b.transformedVertexNormalZBuffer}JSC3D.Math3D.transformVectorZs(this.rotMatrix,b.vertexNormalBuffer,e);for(var A=0,k=0;A<n;A++,k+=3){var J=e[A];
|
|
|
|
|
if(b.isDoubleSided)J=J>0?J:-J;if(J>0){var z=~~(d[k]+0.5),s=~~(d[k+1]+0.5);J=d[k+2];if(z>=0&&z<f&&s>=0&&s<g){z=s*c+z;if(J>i[z]){i[z]=J;h[z]=j;m[z]=q}z++;if(J>i[z]){i[z]=J;h[z]=j;m[z]=q}z+=f;if(J>i[z]){i[z]=J;h[z]=j;m[z]=q}z++;if(J>i[z]){i[z]=J;h[z]=j;m[z]=q}}}}};
|
|
|
|
|
a.renderWireframe=function(b){var c=this.frameWidth,f=c-1,g=this.frameHeight-1,d=b.indexBuffer,e=b.transformedVertexBuffer,h=b.transformedFaceNormalZBuffer,i=this.colorBuffer,m=this.zBuffer,n=this.selectionBuffer,q=b.faceCount,j=b.internalId,A=b.material?b.material.diffuseColor:this.defaultMaterial.diffuseColor;if(!h||h.length<q){b.transformedFaceNormalZBuffer=new Array(q);h=b.transformedFaceNormalZBuffer}JSC3D.Math3D.transformVectorZs(this.rotMatrix,b.faceNormalBuffer,h);for(var k=0,J=0;k<q;){var z=
|
|
|
|
|
h[k++];if(b.isDoubleSided)z=z>0?z:-z;if(z<0){do;while(d[J++]!=-1)}else{var s,F;s=d[J++]*3;F=d[J++]*3;z=s;for(var E=false;!E;){var w=~~(e[s]+0.5),r=~~(e[s+1]+0.5),t=e[s+2],v=~~(e[F]+0.5),p=~~(e[F+1]+0.5),u=e[F+2],x=v-w,o=p-r,H=u-t,l,M,K;if(Math.abs(x)>Math.abs(o)){l=x;M=x>0?1:-1;K=x!=0?M*o/x:0;x=x!=0?M*H/x:0}else{l=o;K=o>0?1:-1;M=o!=0?K*x/o:0;x=o!=0?K*H/o:0}w=w;r=r;t=t;if(l<0){w=v;r=p;t=u;l=-l;M=-M;K=-K;x=-x}for(v=0;v<l;v++){if(w>=0&&w<f&&r>=0&&r<g){p=~~r*c+~~w;if(t>m[p]){m[p]=t;i[p]=A;n[p]=j}}w+=
|
|
|
|
|
M;r+=K;t+=x}if(F==z)E=true;else{s=F;F=d[J]!=-1?d[J++]*3:z}}J++}}};
|
|
|
|
|
a.renderSolidFlat=function(b){var c=this.frameWidth,f=this.frameHeight,g=b.indexBuffer,d=b.transformedVertexBuffer,e=b.transformedFaceNormalZBuffer,h=this.colorBuffer,i=this.zBuffer,m=this.selectionBuffer,n=b.faceCount,q=b.internalId,j=b.material?b.material:this.defaultMaterial,A=j.getPalette(),k=j.transparency==0,J=j.transparency*255,z=255-J;if(j.transparency!=1){if(!e||e.length<n){b.transformedFaceNormalZBuffer=new Array(n);e=b.transformedFaceNormalZBuffer}JSC3D.Math3D.transformVectorZs(this.rotMatrix,b.faceNormalBuffer,
|
|
|
|
|
e);j=new Array(3);for(var s=new Array(3),F=new Array(3),E=0,w=0;E<n;){var r=e[E++];if(b.isDoubleSided)r=r>0?r:-r;if(r<0){do;while(g[w++]!=-1)}else{r=A[~~(r*255)];var t,v,p;t=g[w++]*3;v=g[w++]*3;do{p=g[w++]*3;j[0]=~~(d[t]+0.5);s[0]=~~(d[t+1]+0.5);F[0]=d[t+2];j[1]=~~(d[v]+0.5);s[1]=~~(d[v+1]+0.5);F[1]=d[v+2];j[2]=~~(d[p]+0.5);s[2]=~~(d[p+1]+0.5);F[2]=d[p+2];v=s[0]<s[1]?0:1;v=s[v]<s[2]?v:2;var u=s[0]>s[1]?0:1;u=s[u]>s[2]?u:2;var x=3-u-v;if(v!=u){var o=j[u],H=F[u],l=s[u]-s[v];l=l!=0?l:1;var M=(j[u]-j[v])/
|
|
|
|
|
l;l=(F[u]-F[v])/l;var K=j[u],y=F[u],B=s[u]-s[x];B=B!=0?B:1;var G=(j[u]-j[x])/B;B=(F[u]-F[x])/B;var N=j[x],I=F[x],D=s[x]-s[v];D=D!=0?D:1;var sa=(j[x]-j[v])/D;D=(F[x]-F[v])/D;var P=s[u]*c;for(u=s[u];u>s[v];u--){if(u>=0&&u<f){var T=~~o,C=H,V,ka;if(u>s[x]){V=~~K;ka=y}else{V=~~N;ka=I}if(T>V){var aa;aa=T;T=V;V=aa;aa=C;C=ka;ka=aa}if(T<0)T=0;if(V>=c)V=c-1;ka=T!=V?(ka-C)/(V-T):1;aa=P+T;if(k){T=T;for(C=C;T<=V;T++,C+=ka){if(C>i[aa]){i[aa]=C;h[aa]=r;m[aa]=q}aa++}}else{T=T;for(C=C;T<V;T++,C+=ka){if(C>i[aa]){var ha=
|
|
|
|
|
h[aa];h[aa]=(ha&16711680)*J+(r&16711680)*z>>8&16711680|(ha&65280)*J+(r&65280)*z>>8&65280|(ha&255)*J+(r&255)*z>>8&255;m[aa]=q}aa++}}}o-=M;H-=l;if(u>s[x]){K-=G;y-=B}else{N-=sa;I-=D}P-=c}}v=p}while(g[w]!=-1);w++}}}};
|
|
|
|
|
a.renderSolidSmooth=function(b){var c=this.frameWidth,f=this.frameHeight,g=b.indexBuffer,d=b.transformedVertexBuffer,e=b.transformedVertexNormalZBuffer,h=b.transformedFaceNormalZBuffer,i=this.colorBuffer,m=this.zBuffer,n=this.selectionBuffer,q=b.faceCount,j=d.length/3,A=b.internalId,k=b.material?b.material:this.defaultMaterial,J=k.getPalette(),z=k.transparency==0,s=k.transparency*255,F=255-s;if(k.transparency!=1){if(!e||e.length<j){b.transformedVertexNormalZBuffer=new Array(j);e=b.transformedVertexNormalZBuffer}if(!h||
|
|
|
|
|
h.length<q){b.transformedFaceNormalZBuffer=new Array(q);h=b.transformedFaceNormalZBuffer}JSC3D.Math3D.transformVectorZs(this.rotMatrix,b.vertexNormalBuffer,e);JSC3D.Math3D.transformVectorZs(this.rotMatrix,b.faceNormalBuffer,h);b=b.isDoubleSided;j=new Array(3);k=new Array(3);for(var E=new Array(3),w=new Array(3),r=0,t=0;r<q;){var v=h[r++];if(b)v=v>0?v:-v;if(v<0){do;while(g[t++]!=-1)}else{var p,u,x,o,H;v=g[t++];x=v*3;p=g[t++];o=p*3;do{u=g[t++];H=u*3;j[0]=~~(d[x]+0.5);k[0]=~~(d[x+1]+0.5);E[0]=d[x+2];
|
|
|
|
|
j[1]=~~(d[o]+0.5);k[1]=~~(d[o+1]+0.5);E[1]=d[o+2];j[2]=~~(d[H]+0.5);k[2]=~~(d[H+1]+0.5);E[2]=d[H+2];w[0]=e[v];w[1]=e[p];w[2]=e[u];if(b){if(w[0]<0)w[0]=-w[0];if(w[1]<0)w[1]=-w[1];if(w[2]<0)w[2]=-w[2]}p=k[0]<k[1]?0:1;p=k[p]<k[2]?p:2;var l=k[0]>k[1]?0:1;l=k[l]>k[2]?l:2;o=3-l-p;if(p!=l){var M=j[l],K=E[l],y=w[l]*255,B=k[l]-k[p];B=B!=0?B:1;var G=(j[l]-j[p])/B,N=(E[l]-E[p])/B;B=(w[l]-w[p])*255/B;var I=j[l],D=E[l],sa=w[l]*255,P=k[l]-k[o];P=P!=0?P:1;var T=(j[l]-j[o])/P,C=(E[l]-E[o])/P;P=(w[l]-w[o])*255/P;
|
|
|
|
|
var V=j[o],ka=E[o],aa=w[o]*255,ha=k[o]-k[p];ha=ha!=0?ha:1;var ma=(j[o]-j[p])/ha,ta=(E[o]-E[p])/ha;ha=(w[o]-w[p])*255/ha;var za=k[l]*c;for(l=k[l];l>k[p];l--){if(l>=0&&l<f){var X=~~M,Y=K,da=y,fa,ra,na;if(l>k[o]){fa=~~I;ra=D;na=sa}else{fa=~~V;ra=ka;na=aa}if(X>fa){var Q;Q=X;X=fa;fa=Q;Q=Y;Y=ra;ra=Q;Q=da;da=na;na=Q}ra=X!=fa?(ra-Y)/(fa-X):1;na=X!=fa?(na-da)/(fa-X):1;if(X<0){Y-=X*ra;da-=X*na;X=0}if(fa>=c)fa=c-1;Q=za+X;if(z){X=X;Y=Y;for(da=da;X<=fa;X++,Y+=ra,da+=na){if(Y>m[Q]){m[Q]=Y;i[Q]=J[da>0?~~da:0];n[Q]=
|
|
|
|
|
A}Q++}}else{X=X;Y=Y;for(da=da;X<fa;X++,Y+=ra,da+=na){if(Y>m[Q]){var la=J[da>0?~~da:0],ya=i[Q];i[Q]=(ya&16711680)*s+(la&16711680)*F>>8&16711680|(ya&65280)*s+(la&65280)*F>>8&65280|(ya&255)*s+(la&255)*F>>8&255;n[Q]=A}Q++}}}M-=G;K-=N;y-=B;if(l>k[o]){I-=T;D-=C;sa-=P}else{V-=ma;ka-=ta;aa-=ha}za-=c}}o=H;p=u}while(g[t]!=-1);t++}}}};
|
|
|
|
|
a.renderSolidTexture=function(b){var c=this.frameWidth,f=this.frameHeight,g=b.indexBuffer,d=b.transformedVertexBuffer,e=b.transformedFaceNormalZBuffer,h=this.colorBuffer,i=this.zBuffer,m=this.selectionBuffer,n=b.faceCount,q=b.internalId,j=b.texture,A=!j.hasTransparency,k=b.texCoordBuffer,J=b.texCoordIndexBuffer,z=j.data,s=j.width,F=s-1,E=j.hasMipmap()?j.mipmaps:null,w=E?j.mipentries:null;if(!e||e.length<n){b.transformedFaceNormalZBuffer=new Array(n);e=b.transformedFaceNormalZBuffer}JSC3D.Math3D.transformVectorZs(this.rotMatrix,
|
|
|
|
|
b.faceNormalBuffer,e);for(var r=new Array(3),t=new Array(3),v=new Array(3),p=new Array(3),u=new Array(3),x=0,o=0;x<n;){var H=e[x++];if(b.isDoubleSided)H=H>0?H:-H;if(H<0){do;while(g[o++]!=-1)}else{var l,M,K,y,B;H=g[o]*3;K=J[o]*2;o++;l=g[o]*3;y=J[o]*2;o++;if(E){M=g[o]*3;B=J[o]*2;s=j.width;r[0]=d[H];t[0]=d[H+1];r[1]=d[l];t[1]=d[l+1];r[2]=d[M];t[2]=d[M+1];p[0]=k[K]*s;u[0]=k[K+1]*s;p[1]=k[y]*s;u[1]=k[y+1]*s;p[2]=k[B]*s;u[2]=k[B+1]*s;z=(r[1]-r[0])*(t[2]-t[0])-(t[1]-t[0])*(r[2]-r[0]);if(z<0)z=-z;z+=1;F=
|
|
|
|
|
(p[1]-p[0])*(u[2]-u[0])-(u[1]-u[0])*(p[2]-p[0]);if(F<0)F=-F;z=F/z;F=0;if(z<w[1])F=0;else if(z>=w[w.length-1]){F=w.length-1;s=1}else for(;z>=w[F+1];){F++;s/=2}z=E[F];F=s-1}do{M=g[o]*3;B=J[o]*2;o++;r[0]=~~(d[H]+0.5);t[0]=~~(d[H+1]+0.5);v[0]=d[H+2];r[1]=~~(d[l]+0.5);t[1]=~~(d[l+1]+0.5);v[1]=d[l+2];r[2]=~~(d[M]+0.5);t[2]=~~(d[M+1]+0.5);v[2]=d[M+2];p[0]=k[K]*s;u[0]=k[K+1]*s;p[1]=k[y]*s;u[1]=k[y+1]*s;p[2]=k[B]*s;u[2]=k[B+1]*s;l=t[0]<t[1]?0:1;l=t[l]<t[2]?l:2;var G=t[0]>t[1]?0:1;G=t[G]>t[2]?G:2;y=3-G-l;if(l!=
|
|
|
|
|
G){var N=r[G],I=v[G],D=p[G],sa=u[G],P=t[G]-t[l];P=P!=0?P:1;var T=(r[G]-r[l])/P,C=(v[G]-v[l])/P,V=(p[G]-p[l])/P;P=(u[G]-u[l])/P;var ka=r[G],aa=v[G],ha=p[G],ma=u[G],ta=t[G]-t[y];ta=ta!=0?ta:1;var za=(r[G]-r[y])/ta,X=(v[G]-v[y])/ta,Y=(p[G]-p[y])/ta;ta=(u[G]-u[y])/ta;var da=r[y],fa=v[y],ra=p[y],na=u[y],Q=t[y]-t[l];Q=Q!=0?Q:1;var la=(r[y]-r[l])/Q,ya=(v[y]-v[l])/Q,wa=(p[y]-p[l])/Q;Q=(u[y]-u[l])/Q;var Ga=t[G]*c;for(G=t[G];G>t[l];G--){if(G>=0&&G<f){var Z=~~N,oa=I,pa=D,L=sa,R,ba,S,$;if(G>t[y]){R=~~ka;ba=aa;
|
|
|
|
|
S=ha;$=ma}else{R=~~da;ba=fa;S=ra;$=na}if(Z>R){var U;U=Z;Z=R;R=U;U=oa;oa=ba;ba=U;U=pa;pa=S;S=U;U=L;L=$;$=U}ba=Z!=R?(ba-oa)/(R-Z):1;S=Z!=R?(S-pa)/(R-Z):1;$=Z!=R?($-L)/(R-Z):1;if(Z<0){oa-=Z*ba;pa-=Z*S;L-=Z*$;Z=0}if(R>=c)R=c-1;U=Ga+Z;if(A){Z=Z;oa=oa;pa=pa;for(L=L;Z<=R;Z++,oa+=ba,pa+=S,L+=$){if(oa>i[U]){i[U]=oa;h[U]=z[(L&F)*s+(pa&F)];m[U]=q}U++}}else{Z=Z;oa=oa;pa=pa;for(L=L;Z<R;Z++,oa+=ba,pa+=S,L+=$){if(oa>i[U]){var ua=z[(L&F)*s+(pa&F)],va=h[U],W=ua>>24&255,O=255-W;h[U]=(va&16711680)*O+(ua&16711680)*W>>
|
|
|
|
|
8&16711680|(va&65280)*O+(ua&65280)*W>>8&65280|(va&255)*O+(ua&255)*W>>8&255;m[U]=q}U++}}}N-=T;I-=C;D-=V;sa-=P;if(G>t[y]){ka-=za;aa-=X;ha-=Y;ma-=ta}else{da-=la;fa-=ya;ra-=wa;na-=Q}Ga-=c}}l=M;y=B}while(g[o]!=-1);o++}}};
|
|
|
|
|
a.renderTextureFlat=function(b){var c=this.frameWidth,f=this.frameHeight,g=b.indexBuffer,d=b.transformedVertexBuffer,e=b.transformedFaceNormalZBuffer,h=this.colorBuffer,i=this.zBuffer,m=this.selectionBuffer,n=b.faceCount,q=b.internalId,j=b.material?b.material:this.defaultMaterial,A=j.getPalette(),k=b.texture,J=j.transparency==0&&!k.hasTransparency,z=~~((1-j.transparency)*255),s=b.texCoordBuffer,F=b.texCoordIndexBuffer,E=k.data,w=k.width,r=w-1,t=k.hasMipmap()?k.mipmaps:null,v=t?k.mipentries:null;if(j.transparency!=
|
|
|
|
|
1){if(!e||e.length<n){b.transformedFaceNormalZBuffer=new Array(n);e=b.transformedFaceNormalZBuffer}JSC3D.Math3D.transformVectorZs(this.rotMatrix,b.faceNormalBuffer,e);j=new Array(3);for(var p=new Array(3),u=new Array(3),x=new Array(3),o=new Array(3),H=0,l=0;H<n;){var M=e[H++];if(b.isDoubleSided)M=M>0?M:-M;if(M<0){do;while(g[l++]!=-1)}else{M=A[~~(M*255)];var K,y,B,G,N,I;K=g[l]*3;G=F[l]*2;l++;y=g[l]*3;N=F[l]*2;l++;if(t){B=g[l]*3;I=F[l]*2;w=k.width;j[0]=d[K];p[0]=d[K+1];j[1]=d[y];p[1]=d[y+1];j[2]=d[B];
|
|
|
|
|
p[2]=d[B+1];x[0]=s[G]*w;o[0]=s[G+1]*w;x[1]=s[N]*w;o[1]=s[N+1]*w;x[2]=s[I]*w;o[2]=s[I+1]*w;E=(j[1]-j[0])*(p[2]-p[0])-(p[1]-p[0])*(j[2]-j[0]);if(E<0)E=-E;E+=1;r=(x[1]-x[0])*(o[2]-o[0])-(o[1]-o[0])*(x[2]-x[0]);if(r<0)r=-r;E=r/E;r=0;if(E<v[1])r=0;else if(E>=v[v.length-1]){r=v.length-1;w=1}else for(;E>=v[r+1];){r++;w/=2}E=t[r];r=w-1}do{B=g[l]*3;I=F[l]*2;l++;j[0]=~~(d[K]+0.5);p[0]=~~(d[K+1]+0.5);u[0]=d[K+2];j[1]=~~(d[y]+0.5);p[1]=~~(d[y+1]+0.5);u[1]=d[y+2];j[2]=~~(d[B]+0.5);p[2]=~~(d[B+1]+0.5);u[2]=d[B+
|
|
|
|
|
2];x[0]=s[G]*w;o[0]=s[G+1]*w;x[1]=s[N]*w;o[1]=s[N+1]*w;x[2]=s[I]*w;o[2]=s[I+1]*w;y=p[0]<p[1]?0:1;y=p[y]<p[2]?y:2;var D=p[0]>p[1]?0:1;D=p[D]>p[2]?D:2;N=3-D-y;if(y!=D){var sa=j[D],P=u[D],T=x[D],C=o[D],V=p[D]-p[y];V=V!=0?V:1;var ka=(j[D]-j[y])/V,aa=(u[D]-u[y])/V,ha=(x[D]-x[y])/V;V=(o[D]-o[y])/V;var ma=j[D],ta=u[D],za=x[D],X=o[D],Y=p[D]-p[N];Y=Y!=0?Y:1;var da=(j[D]-j[N])/Y,fa=(u[D]-u[N])/Y,ra=(x[D]-x[N])/Y;Y=(o[D]-o[N])/Y;var na=j[N],Q=u[N],la=x[N],ya=o[N],wa=p[N]-p[y];wa=wa!=0?wa:1;var Ga=(j[N]-j[y])/
|
|
|
|
|
wa,Z=(u[N]-u[y])/wa,oa=(x[N]-x[y])/wa;wa=(o[N]-o[y])/wa;var pa=p[D]*c;for(D=p[D];D>p[y];D--){if(D>=0&&D<f){var L=~~sa,R=P,ba=T,S=C,$,U,ua,va;if(D>p[N]){$=~~ma;U=ta;ua=za;va=X}else{$=~~na;U=Q;ua=la;va=ya}if(L>$){var W;W=L;L=$;$=W;W=R;R=U;U=W;W=ba;ba=ua;ua=W;W=S;S=va;va=W}U=L!=$?(U-R)/($-L):1;ua=L!=$?(ua-ba)/($-L):1;va=L!=$?(va-S)/($-L):1;if(L<0){R-=L*U;ba-=L*ua;S-=L*va;L=0}if($>=c)$=c-1;W=pa+L;if(J){L=L;R=R;ba=ba;for(S=S;L<=$;L++,R+=U,ba+=ua,S+=va){if(R>i[W]){i[W]=R;var O=E[(S&r)*w+(ba&r)],ia=((M&
|
|
|
|
|
16711680)>>16)*((O&16711680)>>8),qa=((M&65280)>>8)*((O&65280)>>8),ca=(M&255)*(O&255)>>8;h[W]=ia&16711680|qa&65280|ca&255;m[W]=q}W++}}else{L=L;R=R;ba=ba;for(S=S;L<$;L++,R+=U,ba+=ua,S+=va){if(R>i[W]){ca=E[(S&r)*w+(ba&r)];O=h[W];var ja=(ca>>24&255)*(z&255)>>8;ia=((M&16711680)>>16)*((ca&16711680)>>8);qa=((M&65280)>>8)*((ca&65280)>>8);ca=(M&255)*(ca&255)>>8;if(ja>250)i[W]=R;else{var ga=255-ja;ia=ia*ja+(O&16711680)*ga>>8;qa=qa*ja+(O&65280)*ga>>8;ca=ca*ja+(O&255)*ga>>8}h[W]=ia&16711680|qa&65280|ca&255;m[W]=
|
|
|
|
|
q}W++}}}sa-=ka;P-=aa;T-=ha;C-=V;if(D>p[N]){ma-=da;ta-=fa;za-=ra;X-=Y}else{na-=Ga;Q-=Z;la-=oa;ya-=wa}pa-=c}}y=B;N=I}while(g[l]!=-1);l++}}}};
|
|
|
|
|
a.renderTextureSmooth=function(b){var c=this.frameWidth,f=this.frameHeight,g=b.indexBuffer,d=b.transformedVertexBuffer,e=b.transformedVertexNormalZBuffer,h=b.transformedFaceNormalZBuffer,i=this.colorBuffer,m=this.zBuffer,n=this.selectionBuffer,q=b.faceCount,j=b.internalId,A=d.length/3,k=b.material?b.material:this.defaultMaterial,J=k.getPalette(),z=b.texture,s=k.transparency==0&&!z.hasTransparency,F=~~((1-k.transparency)*255),E=b.texCoordBuffer,w=b.texCoordIndexBuffer,r=z.data,t=z.width,v=t-1,p=z.hasMipmap()?
|
|
|
|
|
z.mipmaps:null,u=p?z.mipentries:null;if(k.transparency!=1){if(!e||e.length<A){b.transformedVertexNormalZBuffer=new Array(A);e=b.transformedVertexNormalZBuffer}if(!h||h.length<q){b.transformedFaceNormalZBuffer=new Array(q);h=b.transformedFaceNormalZBuffer}JSC3D.Math3D.transformVectorZs(this.rotMatrix,b.vertexNormalBuffer,e);JSC3D.Math3D.transformVectorZs(this.rotMatrix,b.faceNormalBuffer,h);b=b.isDoubleSided;A=new Array(3);k=new Array(3);for(var x=new Array(3),o=new Array(3),H=new Array(3),l=new Array(3),
|
|
|
|
|
M=0,K=0;M<q;){var y=h[M++];if(b)y=y>0?y:-y;if(y<0){do;while(g[K++]!=-1)}else{var B,G,N,I,D,sa,P,T;y=g[K];N=y*3;sa=w[K]*2;K++;B=g[K];I=B*3;P=w[K]*2;K++;if(p){D=g[K]*3;T=w[K]*2;t=z.width;A[0]=d[N];k[0]=d[N+1];A[1]=d[I];k[1]=d[I+1];A[2]=d[D];k[2]=d[D+1];H[0]=E[sa]*t;l[0]=E[sa+1]*t;H[1]=E[P]*t;l[1]=E[P+1]*t;H[2]=E[T]*t;l[2]=E[T+1]*t;r=(A[1]-A[0])*(k[2]-k[0])-(k[1]-k[0])*(A[2]-A[0]);if(r<0)r=-r;r+=1;v=(H[1]-H[0])*(l[2]-l[0])-(l[1]-l[0])*(H[2]-H[0]);if(v<0)v=-v;r=v/r;v=0;if(r<u[1])v=0;else if(r>=u[u.length-
|
|
|
|
|
1]){v=u.length-1;t=1}else for(;r>=u[v+1];){v++;t/=2}r=p[v];v=t-1}do{G=g[K];D=G*3;T=w[K]*2;K++;A[0]=~~(d[N]+0.5);k[0]=~~(d[N+1]+0.5);x[0]=d[N+2];A[1]=~~(d[I]+0.5);k[1]=~~(d[I+1]+0.5);x[1]=d[I+2];A[2]=~~(d[D]+0.5);k[2]=~~(d[D+1]+0.5);x[2]=d[D+2];H[0]=E[sa]*t;l[0]=E[sa+1]*t;H[1]=E[P]*t;l[1]=E[P+1]*t;H[2]=E[T]*t;l[2]=E[T+1]*t;o[0]=e[y];o[1]=e[B];o[2]=e[G];if(b){if(o[0]<0)o[0]=-o[0];if(o[1]<0)o[1]=-o[1];if(o[2]<0)o[2]=-o[2]}B=k[0]<k[1]?0:1;B=k[B]<k[2]?B:2;var C=k[0]>k[1]?0:1;C=k[C]>k[2]?C:2;I=3-C-B;if(B!=
|
|
|
|
|
C){P=A[C];var V=x[C],ka=H[C],aa=l[C],ha=o[C]*255,ma=k[C]-k[B];ma=ma!=0?ma:1;var ta=(A[C]-A[B])/ma,za=(x[C]-x[B])/ma,X=(H[C]-H[B])/ma,Y=(l[C]-l[B])/ma;ma=(o[C]-o[B])*255/ma;var da=A[C],fa=x[C],ra=H[C],na=l[C],Q=o[C]*255,la=k[C]-k[I];la=la!=0?la:1;var ya=(A[C]-A[I])/la,wa=(x[C]-x[I])/la,Ga=(H[C]-H[I])/la,Z=(l[C]-l[I])/la;la=(o[C]-o[I])*255/la;var oa=A[I],pa=x[I],L=H[I],R=l[I],ba=o[I]*255,S=k[I]-k[B];S=S!=0?S:1;var $=(A[I]-A[B])/S,U=(x[I]-x[B])/S,ua=(H[I]-H[B])/S,va=(l[I]-l[B])/S;S=(o[I]-o[B])*255/S;
|
|
|
|
|
var W=k[C]*c;for(C=k[C];C>k[B];C--){if(C>=0&&C<f){var O=~~P,ia=V,qa=ka,ca=aa,ja=ha,ga,Aa,Ba,Ca,Da;if(C>k[I]){ga=~~da;Aa=fa;Ba=ra;Ca=na;Da=Q}else{ga=~~oa;Aa=pa;Ba=L;Ca=R;Da=ba}if(O>ga){var ea;ea=O;O=ga;ga=ea;ea=ia;ia=Aa;Aa=ea;ea=qa;qa=Ba;Ba=ea;ea=ca;ca=Ca;Ca=ea;ea=ja;ja=Da;Da=ea}Aa=O!=ga?(Aa-ia)/(ga-O):1;Ba=O!=ga?(Ba-qa)/(ga-O):1;Ca=O!=ga?(Ca-ca)/(ga-O):1;Da=O!=ga?(Da-ja)/(ga-O):0;if(O<0){ia-=O*Aa;qa-=O*Ba;ca-=O*Ca;ja-=O*Da;O=0}if(ga>=c)ga=c-1;ea=W+O;if(s){O=O;ia=ia;ja=ja;qa=qa;for(ca=ca;O<=ga;O++,
|
|
|
|
|
ia+=Aa,ja+=Da,qa+=Ba,ca+=Ca){if(ia>m[ea]){m[ea]=ia;var xa=J[ja>0?~~ja:0],Fa=r[(ca&v)*t+(qa&v)],Ha=((xa&16711680)>>16)*((Fa&16711680)>>8),Ia=((xa&65280)>>8)*((Fa&65280)>>8);xa=(xa&255)*(Fa&255)>>8;i[ea]=Ha&16711680|Ia&65280|xa&255;n[ea]=j}ea++}}else{O=O;ia=ia;ja=ja;qa=qa;for(ca=ca;O<ga;O++,ia+=Aa,ja+=Da,qa+=Ba,ca+=Ca){if(ia>m[ea]){xa=J[ja>0?~~ja:0];var Ea=r[(ca&v)*t+(qa&v)];Fa=i[ea];var Ja=(Ea>>24&255)*(F&255)>>8;Ha=((xa&16711680)>>16)*((Ea&16711680)>>8);Ia=((xa&65280)>>8)*((Ea&65280)>>8);xa=(xa&255)*
|
|
|
|
|
(Ea&255)>>8;if(Ja>250)m[ea]=ia;else{Ea=255-Ja;Ha=Ha*Ja+(Fa&16711680)*Ea>>8;Ia=Ia*Ja+(Fa&65280)*Ea>>8;xa=xa*Ja+(Fa&255)*Ea>>8}i[ea]=Ha&16711680|Ia&65280|xa&255;n[ea]=j}ea++}}}P-=ta;V-=za;ka-=X;aa-=Y;ha-=ma;if(C>k[I]){da-=ya;fa-=wa;ra-=Ga;na-=Z;Q-=la}else{oa-=$;pa-=U;L-=ua;R-=va;ba-=S}W-=c}}B=G;I=D;P=T}while(g[K]!=-1);K++}}}};a.params=null;a.canvas=null;a.ctx=null;a.canvasData=null;a.bkgColorBuffer=null;a.colorBuffer=null;a.zBuffer=null;a.selectionBuffer=null;a.frameWidth=0;a.frameHeight=0;
|
|
|
|
|
a.scene=null;a.defaultMaterial=null;a.isLoaded=false;a.isFailed=false;a.errorMsg="";a.initRotX=0;a.initRotY=0;a.initRotZ=0;a.zoomFactor=1;a.rotMatrix=null;a.transformMatrix=null;a.sceneUrl="";a.modelColor=13280792;a.bkgColor1=16777215;a.bkgColor2=16777088;a.renderMode="flat";a.definition="standard";a.isMipMappingOn=false;a.buttonStates=null;a.keyStates=null;a.mouseX=0;a.mouseY=0;a.onmousedown=null;a.onmouseup=null;a.onmousemove=null;a.beforeupdate=null;a.afterupdate=null;
|
|
|
|
|
a.isDefaultInputHandlerEnabled=false;JSC3D.PickInfo=function(){this.canvasY=this.canvasX=0;this.depth=-Infinity;this.mesh=null};JSC3D.Scene=function(){this.name="";this.aabb=null;this.children=[];this.maxChildId=1};a=JSC3D.Scene.prototype;a.init=function(){if(!this.isEmpty()){for(var b=0;b<this.children.length;b++)this.children[b].init();if(!this.aabb){this.aabb=new JSC3D.AABB;this.calcAABB()}}};a.isEmpty=function(){return this.children.length==0};
|
|
|
|
|
a.addChild=function(b){b.internalId=this.maxChildId++;this.children.push(b)};a.removeChild=function(b){for(var c=0;c<this.children.length;c++)if(this.children[c]==b){this.children.splice(c,1);break}};a.getChildren=function(){return this.children};
|
|
|
|
|
a.calcAABB=function(){this.aabb.minX=this.aabb.minY=this.aabb.minZ=Number.MAX_VALUE;this.aabb.maxX=this.aabb.maxY=this.aabb.maxZ=-Number.MAX_VALUE;for(var b=0;b<this.children.length;b++){var c=this.children[b];if(!c.isTrivial()){var f=c.aabb.minX,g=c.aabb.minY,d=c.aabb.minZ,e=c.aabb.maxX,h=c.aabb.maxY;c=c.aabb.maxZ;if(this.aabb.minX>f)this.aabb.minX=f;if(this.aabb.minY>g)this.aabb.minY=g;if(this.aabb.minZ>d)this.aabb.minZ=d;if(this.aabb.maxX<e)this.aabb.maxX=e;if(this.aabb.maxY<h)this.aabb.maxY=h;
|
|
|
|
|
if(this.aabb.maxZ<c)this.aabb.maxZ=c}}};a.name="";a.aabb=null;a.children=null;a.maxChildId=1;JSC3D.Mesh=function(){this.metadata=this.name="";this.visible=true;this.texture=this.material=this.faceNormalBuffer=this.vertexNormalBuffer=this.indexBuffer=this.vertexBuffer=this.aabb=null;this.faceCount=0;this.isDoubleSided=false;this.internalId=0;this.transformedFaceNormalZBuffer=this.transformedVertexNormalZBuffer=this.transformedVertexBuffer=this.texCoordIndexBuffer=this.texCoordBuffer=null};a=JSC3D.Mesh.prototype;
|
|
|
|
|
a.init=function(){if(!this.isTrivial()){if(this.faceCount==0){this.calcFaceCount();if(this.faceCount==0)return}if(!this.aabb){this.aabb=new JSC3D.AABB;this.calcAABB()}if(!this.faceNormalBuffer){this.faceNormalBuffer=new Array(this.faceCount*3);this.calcFaceNormals()}if(!this.vertexNormalBuffer){this.vertexNormalBuffer=new Array(this.vertexBuffer.length);this.calcVertexNormals()}this.transformedVertexBuffer=new Array(this.vertexBuffer.length)}};
|
|
|
|
|
a.isTrivial=function(){return!this.vertexBuffer||this.vertexBuffer.length<3||!this.indexBuffer||this.indexBuffer.length<3};a.setMaterial=function(b){this.material=b};a.setTexture=function(b){this.texture=b};a.hasTexture=function(){return this.texCoordBuffer!=null&&this.texCoordBuffer.length>=2&&this.texCoordIndexBuffer!=null&&this.texCoordIndexBuffer.length>=3&&this.texCoordIndexBuffer.length>=this.indexBuffer.length&&this.texture!=null&&this.texture.hasData()};
|
|
|
|
|
a.calcFaceCount=function(){this.faceCount=0;var b=this.indexBuffer;b[b.length-1]!=-1&&b.push(-1);for(var c=0;c<b.length;c++)b[c]==-1&&this.faceCount++};
|
|
|
|
|
a.calcAABB=function(){for(var b=minY=minZ=Number.MAX_VALUE,c=maxY=maxZ=-Number.MAX_VALUE,f=this.vertexBuffer,g=0;g<f.length;g+=3){var d=f[g],e=f[g+1],h=f[g+2];if(d<b)b=d;if(d>c)c=d;if(e<minY)minY=e;if(e>maxY)maxY=e;if(h<minZ)minZ=h;if(h>maxZ)maxZ=h}this.aabb.minX=b;this.aabb.minY=minY;this.aabb.minZ=minZ;this.aabb.maxX=c;this.aabb.maxY=maxY;this.aabb.maxZ=maxZ};
|
|
|
|
|
a.calcFaceNormals=function(){for(var b=this.vertexBuffer,c=this.indexBuffer,f=this.faceNormalBuffer,g=0,d=0;g<c.length;){var e=c[g++]*3,h=b[e],i=b[e+1],m=b[e+2];e=c[g++]*3;var n=b[e],q=b[e+1],j=b[e+2];e=c[g++]*3;n=n-h;q=q-i;j=j-m;h=b[e]-h;i=b[e+1]-i;m=b[e+2]-m;e=q*m-j*i;m=j*h-n*m;n=n*i-q*h;q=Math.sqrt(e*e+m*m+n*n);if(q>0){e/=q;m/=q;n/=q}f[d++]=e;f[d++]=m;f[d++]=n;do;while(c[g++]!=-1)}};
|
|
|
|
|
a.calcVertexNormals=function(){if(!this.faceNormalBuffer){this.faceNormalBuffer=new Array(this.faceCount*3);this.calcFaceNormals()}for(var b=this.vertexBuffer,c=this.indexBuffer,f=this.faceNormalBuffer,g=this.vertexNormalBuffer,d=0;d<g.length;d++)g[d]=0;var e=b.length/3;b=new Array(e);for(d=0;d<e;d++)b[d]=0;for(var h=e=d=0;d<c.length;){h=c[d++];if(h==-1)e+=3;else{var i=h*3;g[i]+=f[e];g[i+1]+=f[e+1];g[i+2]+=f[e+2];b[h]++}}for(e=d=0;d<g.length;d+=3,e++){c=g[d];f=g[d+1];h=g[d+2];i=b[e];if(i>1){c/=i;
|
|
|
|
|
f/=i;h/=i}i=Math.sqrt(c*c+f*f+h*h);if(i>0){c/=i;f/=i;h/=i}g[d]=c;g[d+1]=f;g[d+2]=h}};a.checkValid=function(){};a.name="";a.metadata="";a.visible=false;a.aabb=null;a.vertexBuffer=null;a.indexBuffer=null;a.vertexNormalBuffer=null;a.faceNormalBuffer=null;a.texCoordBuffer=null;a.texCoordIndexBuffer=null;a.material=null;a.texture=null;a.faceCount=0;a.isDoubleSided=false;a.internalId=0;a.transformedVertexBuffer=null;a.transformedVertexNormalZBuffer=null;a.transformedFaceNormalZBuffer=null;
|
|
|
|
|
JSC3D.Material=function(){this.name="";this.ambientColor=0;this.diffuseColor=8355711;this.transparency=0;this.simulateSpecular=false;this.palette=null};a=JSC3D.Material.prototype;a.getPalette=function(){if(!this.palette){this.palette=new Array(256);this.generatePalette()}return this.palette};
|
|
|
|
|
a.generatePalette=function(){var b=(this.ambientColor&16711680)>>16,c=(this.ambientColor&65280)>>8,f=this.ambientColor&255,g=(this.diffuseColor&16711680)>>16,d=(this.diffuseColor&65280)>>8,e=this.diffuseColor&255;if(this.simulateSpecular){for(var h=0;h<204;){var i=b+h*g/204,m=c+h*d/204,n=f+h*e/204;if(i>255)i=255;if(m>255)m=255;if(n>255)n=255;this.palette[h++]=i<<16|m<<8|n}for(;h<256;){i=b+g+(h-204)*(255-g)/82;m=c+d+(h-204)*(255-d)/82;n=f+e+(h-204)*(255-e)/82;if(i>255)i=255;if(m>255)m=255;if(n>255)n=
|
|
|
|
|
255;this.palette[h++]=i<<16|m<<8|n}}else for(h=0;h<256;){i=b+h*g/256;m=c+h*d/256;n=f+h*e/256;if(i>255)i=255;if(m>255)m=255;if(n>255)n=255;this.palette[h++]=i<<16|m<<8|n}};a.name="";a.ambientColor=0;a.diffuseColor=8355711;a.transparency=0;a.simulateSpecular=false;a.palette=null;JSC3D.Texture=function(){this.name="";this.height=this.width=0;this.mipentries=this.mipmaps=this.data=null;this.hasTransparency=false;this.srcUrl="";this.onready=null};a=JSC3D.Texture.prototype;
|
|
|
|
|
a.createFromUrl=function(b,c){var f=this,g=new Image;g.onload=function(){f.data=null;f.mipmaps=null;f.mipentries=null;f.width=0;f.height=0;f.hasTransparency=false;f.srcUrl="";f.createFromImage(this,c)};g.onerror=function(){f.data=null;f.mipmaps=null;f.mipentries=null;f.width=0;f.height=0;f.hasTransparency=false;f.srcUrl=""};g.src=b};
|
|
|
|
|
a.createFromImage=function(b,c){if(!(b.width<=0||b.height<=0)){var f=false,g=JSC3D.Texture.cv;if(!g)try{g=document.createElement("canvas");JSC3D.Texture.cv=g;f=true}catch(d){return}var e=b.width>b.height?b.width:b.height;e=e<=32?32:e<=64?64:e<=128?128:e<=256?256:512;if(g.width!=e||g.height!=e){g.width=g.height=e;f=true}var h;try{var i=g.getContext("2d");f||i.clearRect(0,0,e,e);i.drawImage(b,0,0,e,e);h=i.getImageData(0,0,e,e).data}catch(m){return}f=h.length/4;this.data=new Array(f);for(var n=i=0;i<
|
|
|
|
|
f;i++,n+=4){g=h[n+3];this.data[i]=g<<24|h[n]<<16|h[n+1]<<8|h[n+2];if(g<255)this.hasTransparency=true}this.height=this.width=e;this.mipmaps=null;c&&this.generateMipmaps();this.srcUrl=b.src;this.onready!=null&&typeof this.onready=="function"&&this.onready()}};a.hasData=function(){return this.data!=null};
|
|
|
|
|
a.generateMipmaps=function(){if(!(this.width<=1||this.data==null||this.mipmaps!=null)){this.mipmaps=[this.data];this.mipentries=[1];for(var b=1+~~(0.1+Math.log(this.width)*Math.LOG2E),c=this.width>>1,f=1;f<b;f++){for(var g=new Array(c*c),d=this.mipmaps[f-1],e=c<<1,h=0,i=0,m=0;m<c;m++){for(var n=0;n<c;n++){var q=d[h],j=d[h+1],A=d[h+e],k=d[h+e+1];g[i]=(((q&4278190080)>>>2)+((j&4278190080)>>>2)+((A&4278190080)>>>2)+((k&4278190080)>>>2)&4278190080)+((q&16711680)+(j&16711680)+(A&16711680)+(k&16711680)>>
|
|
|
|
|
2&16711680)+((q&65280)+(j&65280)+(A&65280)+(k&65280)>>2&65280)+((q&255)+(j&255)+(A&255)+(k&255)>>2&255);h+=2;i++}h+=e}this.mipmaps.push(g);this.mipentries.push(Math.pow(4,f));c>>=1}}};a.hasMipmap=function(){return this.mipmaps!=null};a.name="";a.data=null;a.mipmaps=null;a.mipentries=null;a.width=0;a.height=0;a.hasTransparency=false;a.srcUrl="";a.onready=null;JSC3D.Texture.cv=null;JSC3D.AABB=function(){this.minZ=this.maxZ=this.minY=this.maxY=this.minX=this.maxX=0};
|
|
|
|
|
JSC3D.AABB.prototype.center=function(){return[(this.minX+this.maxX)/2,(this.minY+this.maxY)/2,(this.minZ+this.maxZ)/2]};JSC3D.AABB.prototype.lengthOfDiagonal=function(){var b=this.maxX-this.minX,c=this.maxY-this.minY,f=this.maxZ-this.minZ;return Math.sqrt(b*b+c*c+f*f)};JSC3D.Matrix3x4=function(){this.m00=1;this.m10=this.m03=this.m02=this.m01=0;this.m11=1;this.m21=this.m20=this.m13=this.m12=0;this.m22=1;this.m23=0};a=JSC3D.Matrix3x4.prototype;
|
|
|
|
|
a.identity=function(){this.m00=1;this.m10=this.m03=this.m02=this.m01=0;this.m11=1;this.m21=this.m20=this.m13=this.m12=0;this.m22=1;this.m23=0};a.scale=function(b,c,f){this.m00*=b;this.m01*=b;this.m02*=b;this.m03*=b;this.m10*=c;this.m11*=c;this.m12*=c;this.m13*=c;this.m20*=f;this.m21*=f;this.m22*=f;this.m23*=f};a.translate=function(b,c,f){this.m03+=b;this.m13+=c;this.m23+=f};
|
|
|
|
|
a.rotateAboutXAxis=function(b){if(b!=0){b*=Math.PI/180;var c=Math.cos(b);b=Math.sin(b);var f=c*this.m11+b*this.m21,g=c*this.m12+b*this.m22,d=c*this.m13+b*this.m23,e=c*this.m20-b*this.m10,h=c*this.m21-b*this.m11,i=c*this.m22-b*this.m12,m=c*this.m23-b*this.m13;this.m10=c*this.m10+b*this.m20;this.m11=f;this.m12=g;this.m13=d;this.m20=e;this.m21=h;this.m22=i;this.m23=m}};
|
|
|
|
|
a.rotateAboutYAxis=function(b){if(b!=0){b*=Math.PI/180;var c=Math.cos(b);b=Math.sin(b);var f=c*this.m01+b*this.m21,g=c*this.m02+b*this.m22,d=c*this.m03+b*this.m23,e=c*this.m20-b*this.m00,h=c*this.m21-b*this.m01,i=c*this.m22-b*this.m02,m=c*this.m23-b*this.m03;this.m00=c*this.m00+b*this.m20;this.m01=f;this.m02=g;this.m03=d;this.m20=e;this.m21=h;this.m22=i;this.m23=m}};
|
|
|
|
|
a.rotateAboutZAxis=function(b){if(b!=0){b*=Math.PI/180;var c=Math.cos(b);b=Math.sin(b);var f=c*this.m10+b*this.m00,g=c*this.m11+b*this.m01,d=c*this.m12+b*this.m02,e=c*this.m13+b*this.m03,h=c*this.m01-b*this.m11,i=c*this.m02-b*this.m12,m=c*this.m03-b*this.m13;this.m00=c*this.m00-b*this.m10;this.m01=h;this.m02=i;this.m03=m;this.m10=f;this.m11=g;this.m12=d;this.m13=e}};
|
|
|
|
|
a.multiply=function(b){var c=b.m00*this.m01+b.m01*this.m11+b.m02*this.m21,f=b.m00*this.m02+b.m01*this.m12+b.m02*this.m22,g=b.m00*this.m03+b.m01*this.m13+b.m02*this.m23+b.m03,d=b.m10*this.m00+b.m11*this.m10+b.m12*this.m20,e=b.m10*this.m01+b.m11*this.m11+b.m12*this.m21,h=b.m10*this.m02+b.m11*this.m12+b.m12*this.m22,i=b.m10*this.m03+b.m11*this.m13+b.m12*this.m23+b.m13,m=b.m20*this.m00+b.m21*this.m10+b.m22*this.m20,n=b.m20*this.m01+b.m21*this.m11+b.m22*this.m21,q=b.m20*this.m02+b.m21*this.m12+b.m22*this.m22,
|
|
|
|
|
j=b.m20*this.m03+b.m21*this.m13+b.m22*this.m23+b.m23;this.m00=b.m00*this.m00+b.m01*this.m10+b.m02*this.m20;this.m01=c;this.m02=f;this.m03=g;this.m10=d;this.m11=e;this.m12=h;this.m13=i;this.m20=m;this.m21=n;this.m22=q;this.m23=j};
|
|
|
|
|
JSC3D.Math3D={transformVectors:function(b,c,f){for(var g=0;g<c.length;g+=3){var d=c[g],e=c[g+1],h=c[g+2];f[g]=b.m00*d+b.m01*e+b.m02*h+b.m03;f[g+1]=b.m10*d+b.m11*e+b.m12*h+b.m13;f[g+2]=b.m20*d+b.m21*e+b.m22*h+b.m23}},transformVectorZs:function(b,c,f){for(var g=c.length/3,d=0,e=0;d<g;){f[d]=b.m20*c[e]+b.m21*c[e+1]+b.m22*c[e+2]+b.m23;d++;e+=3}}};
|
|
|
|
|
JSC3D.LoaderSelector={registerLoader:function(b,c){if(typeof c=="function")JSC3D.LoaderSelector.loaderTable[b]=c},getLoader:function(b){b=JSC3D.LoaderSelector.loaderTable[b];if(!b)return null;var c;try{c=new b}catch(f){c=null}return c},loaderTable:{}};JSC3D.ObjLoader=function(){this.onresource=this.onprogress=this.onerror=this.onload=null;this.requestCount=0};a=JSC3D.ObjLoader.prototype;
|
|
|
|
|
a.loadFromUrl=function(b){var c="",f=b,g=b.lastIndexOf("/");if(g==-1)g=b.lastIndexOf("\\");if(g!=-1){c=b.substring(0,g+1);f=b.substring(g+1)}this.requestCount=0;this.loadObjFile(c,f)};
|
|
|
|
|
a.loadObjFile=function(b,c){var f=b+c,g=this;c=new XMLHttpRequest;c.open("GET",f,true);c.onreadystatechange=function(){if(this.readyState==4)if(this.status==200||this.status==0){if(g.onload){g.onprogress&&g.onprogress("Loading obj file ...",1);var d=new JSC3D.Scene,e=g.parseObj(d,this.responseText);if(e.length>0)for(var h=0;h<e.length;h++)g.loadMtlFile(d,b,e[h]);--g.requestCount==0&&g.onload(d)}}else if(g.onerror){g.requestCount--;g.onerror("Failed to load obj file '"+f+"'.")}};if(this.onprogress)c.onprogress=
|
|
|
|
|
function(d){g.onprogress("Loading obj file ...",d.position/d.totalSize)};this.requestCount++;c.send()};
|
|
|
|
|
a.loadMtlFile=function(b,c,f){var g=c+f,d=this,e=new XMLHttpRequest;e.open("GET",g,true);e.onreadystatechange=function(){if(this.readyState==4){if(this.status==200||this.status==0){d.onprogress&&d.onprogress("Loading mtl file ...",1);for(var h=d.parseMtl(this.responseText),i={},m=b.getChildren(),n=0;n<m.length;n++){var q=m[n];if(q.mtl!=null&&q.mtllib!=null&&q.mtllib==f){var j=h[q.mtl];if(j!=null){j.material!=null&&q.setMaterial(j.material);if(j.textureFileName!="")if(i[j.textureFileName])i[j.textureFileName].push(q);
|
|
|
|
|
else i[j.textureFileName]=[q]}}}for(textureFileName in i)d.setupTexture(i[textureFileName],c+textureFileName)}--d.requestCount==0&&d.onload(b)}};if(this.onprogress)e.onprogress=function(h){d.onprogress("Loading mtl file ...",h.position/h.totalSize)};this.requestCount++;e.send()};
|
|
|
|
|
a.parseObj=function(b,c){var f={},g=[],d=0,e=null,h="",i="",m=[],n=[];e="obj-"+d++;var q=new JSC3D.Mesh;q.name=e;q.indexBuffer=[];e=f.nomtl=q;var j=c.split("\n");for(c=0;c<j.length;c++){i=j[c].split(" ");if(i.length>0)switch(i[0]){case "v":for(var A=1;A<i.length;A++)m.push(parseFloat(i[A]));break;case "vn":break;case "vt":n.push(parseFloat(i[1]));n.push(1-parseFloat(i[2]));break;case "f":for(A=1;A<i.length;A++){var k=i[A].split("/");e.indexBuffer.push(parseInt(k[0])-1);if(k.length>1&&k[1]!=""){if(!e.texCoordIndexBuffer)e.texCoordIndexBuffer=
|
|
|
|
|
[];e.texCoordIndexBuffer.push(parseInt(k[1])-1)}}e.indexBuffer.push(-1);e.texCoordIndexBuffer&&e.texCoordIndexBuffer.push(-1);break;case "mtllib":if(i.length>1){h=i[1];g.push(h)}else h="";break;case "usemtl":if(i.length>1&&i[1]!=""&&h!=""){i=i[1];A=h+"-"+i;e=f[A];if(!e){e=new JSC3D.Mesh;e.name="obj-"+d++;e.indexBuffer=[];e.mtllib=h;e.mtl=i;f[A]=e}e=e}else e=q;break;case "#":default:break}}d=m.length>=3?new Array(m.length/3):null;h=n.length>=2?new Array(n.length/2):null;for(id in f){e=f[id];if(m.length>=
|
|
|
|
|
3&&e.indexBuffer.length>0){for(c=0;c<d.length;c++)d[c]=-1;e.vertexBuffer=[];for(c=j=q=0;c<e.indexBuffer.length;c++){q=e.indexBuffer[c];if(q!=-1)if(d[q]==-1){i=q*3;e.vertexBuffer.push(m[i]);e.vertexBuffer.push(m[i+1]);e.vertexBuffer.push(m[i+2]);e.indexBuffer[c]=j;d[q]=j;j++}else e.indexBuffer[c]=d[q]}}if(n.length>=2&&e.texCoordIndexBuffer!=null&&e.texCoordIndexBuffer.length>0){for(c=0;c<h.length;c++)h[c]=-1;e.texCoordBuffer=[];for(c=j=q=0;c<e.texCoordIndexBuffer.length;c++){q=e.texCoordIndexBuffer[c];
|
|
|
|
|
if(q!=-1)if(h[q]==-1){i=q*2;e.texCoordBuffer.push(n[i]);e.texCoordBuffer.push(n[i+1]);e.texCoordIndexBuffer[c]=j;h[q]=j;j++}else e.texCoordIndexBuffer[c]=h[q]}}e.isTrivial()||b.addChild(e)}return g};
|
|
|
|
|
a.parseMtl=function(b){var c={},f="";b=b.split("\n");for(var g=0;g<b.length;g++){var d=b[g].split(" ");if(d.length>0)switch(d[0]){case "newmtl":f=d[1];d={};d.material=new JSC3D.Material;d.textureFileName="";c[f]=d;break;case "Ka":break;case "Kd":if(d.length==4&&!isNaN(d[1])){var e=parseFloat(d[1])*255&255,h=parseFloat(d[2])*255&255,i=parseFloat(d[3])*255&255;d=c[f];if(d!=null)d.material.diffuseColor=e<<16|h<<8|i}break;case "Ks":break;case "d":if(d.length==2&&!isNaN(d[1])){e=parseFloat(d[1]);d=c[f];
|
|
|
|
|
if(d!=null)d.material.transparency=1-e}break;case "illum":break;case "map_Kd":if(d.length==2){e=d[1];d=c[f];if(d!=null)d.textureFileName=e}break;case "#":default:break}}return c};a.setupTexture=function(b,c){var f=this,g=new JSC3D.Texture;g.onready=function(){for(var d=0;d<b.length;d++)b[d].setTexture(this);f.onresource&&f.onresource(this)};g.createFromUrl(c)};a.onload=null;a.onerror=null;a.onprogress=null;a.onresource=null;a.requestCount=0;JSC3D.LoaderSelector.registerLoader("obj",JSC3D.ObjLoader);
|