diff --git a/README.md b/README.md index ef4505a..38202ab 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ Online demo: http://3dviewer.net With this online viewer you can view 3D models in your browser: - Supported file formats: - - 3ds - - obj, mtl + - 3ds, with textures + - obj, mtl, with textures - stl - You can drag&drop files to your browser, or use the open button. - You should open the main file, and all of its requested files. diff --git a/embeddable/include/online3dembedder.js b/embeddable/include/online3dembedder.js index 76cb621..dde402e 100644 --- a/embeddable/include/online3dembedder.js +++ b/embeddable/include/online3dembedder.js @@ -55,7 +55,11 @@ function Online3DViewerLoad () viewer.Draw (); } }); - JSM.ConvertJSONDataToThreeMeshes (jsonData, null, environment); + + var textureLoaded = function () { + viewer.Draw (); + }; + JSM.ConvertJSONDataToThreeMeshes (jsonData, textureLoaded, environment); } }); } diff --git a/embeddable/index.html b/embeddable/index.html index 75e4bae..4389e59 100644 --- a/embeddable/index.html +++ b/embeddable/index.html @@ -19,13 +19,18 @@ - - - - - - - + + + + + + + + + + + + diff --git a/embeddable/testfiles/_1.png b/embeddable/testfiles/_1.png new file mode 100644 index 0000000..29ce540 Binary files /dev/null and b/embeddable/testfiles/_1.png differ diff --git a/embeddable/testfiles/texture.png b/embeddable/testfiles/texture.png new file mode 100644 index 0000000..29ce540 Binary files /dev/null and b/embeddable/testfiles/texture.png differ diff --git a/embeddable/testfiles/texturedcube.3ds b/embeddable/testfiles/texturedcube.3ds new file mode 100644 index 0000000..2bc5c07 Binary files /dev/null and b/embeddable/testfiles/texturedcube.3ds differ diff --git a/embeddable/testfiles/texturedcube.mtl b/embeddable/testfiles/texturedcube.mtl new file mode 100644 index 0000000..d6b1a09 --- /dev/null +++ b/embeddable/testfiles/texturedcube.mtl @@ -0,0 +1,10 @@ +# +## Alias OBJ Material File +# Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited + +newmtl _1 +Ka 0.000000 0.000000 0.000000 +Kd 0.439216 0.533333 0.392157 +Ks 0.330000 0.330000 0.330000 +map_Kd texture.png + diff --git a/embeddable/testfiles/texturedcube.obj b/embeddable/testfiles/texturedcube.obj new file mode 100644 index 0000000..0d8382e --- /dev/null +++ b/embeddable/testfiles/texturedcube.obj @@ -0,0 +1,48 @@ +# Alias OBJ Model File +# Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limited +# File units = meters + +mtllib texturedcube.mtl + +g Mesh1 Model + +usemtl _1 +v 0 0 -0 +vt 0 0 +vn 0 -1 -0 +v 0 0 -1.67 +vt 0 1.67 +v 1.57 0 -1.67 +vt -1.57 1.67 +v 1.57 0 -0 +vt -1.57 0 +f 1/1/1 2/2/1 3/3/1 4/4/1 + +vt -1.67 0 +vn -1 0 -0 +v 0 1.61 -0 +vt 0 1.61 +v 0 1.61 -1.67 +vt -1.67 1.61 +f 2/5/2 1/1/2 5/6/2 6/7/2 + +vn 0 0 1 +vt 1.57 0 +v 1.57 1.61 -0 +vt 1.57 1.61 +f 1/1/3 4/8/3 7/9/3 5/6/3 + +vn 1 0 -0 +vt 1.67 0 +v 1.57 1.61 -1.67 +vt 1.67 1.61 +f 4/1/4 3/10/4 8/11/4 7/6/4 + +vn 0 0 -1 +vt -1.57 1.61 +f 3/4/5 2/1/5 6/6/5 8/12/5 + +vn 0 1 -0 +vt 1.57 1.67 +f 6/2/6 5/1/6 7/8/6 8/13/6 + diff --git a/jsmodeler/jsmodeler.js b/jsmodeler/jsmodeler.js index 950d206..9032752 100644 --- a/jsmodeler/jsmodeler.js +++ b/jsmodeler/jsmodeler.js @@ -1,21 +1,22 @@ -/* JSModeler 0.33.197 - http://www.github.com/kovacsv/JSModeler */ 'use strict';var JSM={mainVersion:0,subVersion:33,Eps:1E-8,Inf:9999999999,RadDeg:57.29577951308232,DegRad:0.017453292519943,IsZero:function(a){return Math.abs(a)JSM.Eps},IsNegative:function(a){return a<-JSM.Eps},IsLower:function(a,b){return b-a>JSM.Eps},IsGreater:function(a,b){return a-b>JSM.Eps},IsEqual:function(a,b){return Math.abs(b-a)JSM.Eps},IsNegative:function(a){return a<-JSM.Eps},IsLower:function(a,b){return b-a>JSM.Eps},IsGreater:function(a,b){return a-b>JSM.Eps},IsEqual:function(a,b){return Math.abs(b-a)=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=d)return!0;var e,f,h,l;for(e=0;2>e;e++){h=f=-1;0===e?(f=b,h=c):1===e&&(f=c,h=b);l=[];for(l.push(a[h]);f!== -h;f=ff)return[];var g=[],h=[],k;for(a=0;a=d)return!0;var e,f,h,k;for(e=0;2>e;e++){h=f=-1;0===e?(f=b,h=c):1===e&&(f=c,h=b);k=[];for(k.push(a[h]);f!== +h;f=ff)return[];var g=[],h=[],k;for(a=0;ab.length)){for(var c=a.GetVertex(b[0]),d=a.GetVertex(b[1]),d=JSM.CoordSub(d,c),f=JSM.GetPlaneFromCoordAndDirection(c,d),g,d=[],c=0;cb.length)){for(var c=a.GetVertex(b[0]),d=a.GetVertex(b[1]),d=JSM.CoordSub(d,c),f=JSM.GetPlaneFromCoordAndDirection(c,d),g,d=[],c=0;cb.VertexCount())return!1;var d;if(null===a.polygon){d=JSM.CalculateNormal(b.vertices);var e=JSM.GetPlaneFromCoordAndDirection(b.GetVertex(0),d);a.polygon=b;void 0!==c&&(a.userData=c);a.plane=e}else{d=[];var f=[],e=[];JSM.CutPolygonWithPlane(b,a.plane,f,d,e)&&(0e;e++)k.AddVertexIndex(2*c[b[h[e]]]+1),x.AddVertexIndex(2*c[b[h[3-e-1]]]);f.AddPolygon(k);f.AddPolygon(x)}}var f=new JSM.Body;(function(){var d; +JSM.GeneratePrismWithHole=function(a,b,c,d){function e(){var b=0,c=[],d;for(d=0;de;e++)k.AddVertexIndex(2*c[b[h[e]]]+1),w.AddVertexIndex(2*c[b[h[3-e-1]]]);f.AddPolygon(k);f.AddPolygon(w)}}var f=new JSM.Body;(function(){var d; for(d=0;dy)){var D=void 0,A=void 0,B=void 0,K=void 0,L=void 0,M=void 0,w=void 0,G=void 0,N=void 0,E=void 0;if(3==y||l)for(E=0;Eu)){var D=void 0,y=void 0,A=void 0,J=void 0,O=void 0,M=void 0,H=void 0,F=void 0,I=void 0,K=void 0;if(3==u||l)for(K=0;Kf)){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=this.arrayBuffer.byteLength};JSM.BinaryReader.prototype.ReadBoolean=function(){var a=this.dataView.getInt8(this.position,this.isLittleEndian);this.position+=1;return a?!0:!1};JSM.BinaryReader.prototype.ReadCharacter=function(){var a=this.dataView.getInt8(this.position,this.isLittleEndian);this.position+=1;return a}; JSM.BinaryReader.prototype.ReadUnsignedCharacter=function(){var a=this.dataView.getUint8(this.position,this.isLittleEndian);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};JSM.BinaryReader.prototype.ReadUnsignedInteger32=function(){var a=this.dataView.getUint32(this.position,this.isLittleEndian);this.position+=4;return a};JSM.BinaryReader.prototype.ReadFloat32=function(){var a=this.dataView.getFloat32(this.position,this.isLittleEndian);this.position+=4;return a}; JSM.BinaryReader.prototype.ReadDouble64=function(){var a=this.dataView.getFloat64(this.position,this.isLittleEndian);this.position+=8;return a};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.LoadMultipleBuffers=function(a,b,c,d,e){c>=a.length?e(b):d(a[c],function(f){b.push(f);JSM.LoadMultipleBuffers(a,b,c+1,d,e)})}; -JSM.GetStringBuffersFromURLList=function(a,b){JSM.LoadMultipleBuffers(a,[],0,JSM.GetStringBufferFromURL,function(a){b(a)})};JSM.GetStringBuffersFromFileList=function(a,b){JSM.LoadMultipleBuffers(a,[],0,JSM.GetStringBufferFromFile,function(a){b(a)})}; -JSM.ConvertTriangleModelToJsonData=function(a){function b(a,b,c){var d=[],e=a.MaterialCount(),f;for(a=0;af.mat||f.mat>=e)||d[f.mat].push(a);var p,q;for(a=0;a=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.ConvertTriangleModelToJsonData=function(a){function b(a,b,c){var d=[],e=a.MaterialCount(),f;for(a=0;af.mat||f.mat>=e)||d[f.mat].push(a);var p,q;for(a=0;ad;){c=a.ReadCharacter();if(0===c)break;b+=String.fromCharCode(c);d+=1}return b}function N(a){var b=[],c;for(c=0;3>c;c++)b[c]=a.ReadFloat32();return b}function E(a,b,c){for(;a.GetPosition()<=b-6;){var d=a,e=c,f=d.ReadUnsignedInteger16(),d=d.ReadUnsignedInteger32();e(f,d)}}if(void 0===b||null===b)b={};c= -15677;d=45055;e=40960;f=40976;g=40992;h=41008;k=41024;l=41040;m=16;n=17;p=18;q=19;r=48;s=49;x=16384;v=16640;t=17920;y=18176;F=16656;C=16672;u=16736;H=16688;z=16720;I=45056;J=45058;D=45072;A=45075;B=45088;K=45089;L=45090;M=45104;(function(a){function P(a,b,c){var d={};b=a.GetPosition()+c-6;var e=!1;E(a,b,function(b,c){b==n?e||(d.r=a.ReadUnsignedCharacter()/255,d.g=a.ReadUnsignedCharacter()/255,d.b=a.ReadUnsignedCharacter()/255):b==p?(d.r=a.ReadUnsignedCharacter()/255,d.g=a.ReadUnsignedCharacter()/ -255,d.b=a.ReadUnsignedCharacter()/255,e=!0):b==m?e||(d.r=a.ReadFloat32(),d.g=a.ReadFloat32(),d.b=a.ReadFloat32()):b==q?(d.r=a.ReadFloat32(),d.g=a.ReadFloat32(),d.b=a.ReadFloat32(),e=!0):a.Skip(c-6)});return d}function Q(a,b,c){var d=0;b=a.GetPosition()+c-6;E(a,b,function(b,c){b==r?d=a.ReadUnsignedInteger16()/100:b==s?d=a.ReadFloat32():a.Skip(c-6)});return d}function R(a,c,d){w("Read material chunk ("+c.toString(16)+", "+d+")",2);var m={},n=a.GetPosition()+d-6;E(a,n,function(b,n){b==e?(w("Read material name chunk ("+ -c.toString(16)+", "+d+")",3),m.name=G(a)):b==f?(w("Read material ambient chunk ("+c.toString(16)+", "+d+")",3),m.ambient=P(a,b,n)):b==g?(w("Read material diffuse chunk ("+c.toString(16)+", "+d+")",3),m.diffuse=P(a,b,n)):b==h?(w("Read material specular chunk ("+c.toString(16)+", "+d+")",3),m.specular=P(a,b,n)):b==k?(w("Read material shininess chunk ("+c.toString(16)+", "+d+")",3),m.shininess=Q(a,b,n)):b==l?(w("Read material transparency chunk ("+c.toString(16)+", "+d+")",3),m.transparency=Q(a,b,n)): -(w("Skip chunk ("+b.toString(16)+", "+n+")",3),a.Skip(n-6))});if(void 0!==b.onMaterial&&null!==b.onMaterial)b.onMaterial(m)}function S(a,c,d){w("Read faces chunk ("+c.toString(16)+", "+d+")",4);c=a.GetPosition()+d-6;var e=a.ReadUnsignedInteger16(),f,g,h,k;for(d=0;df;f++){for(g=0;3>g;g++)e.push(a.ReadFloat32()); -3>f?e.push(0):e.push(1)}if(void 0!==b.onTransformation&&null!==b.onTransformation)b.onTransformation(e)}else w("Skip chunk ("+c.toString(16)+", "+d+")",4),a.Skip(d-6)})}function U(a,b,c){w("Read object chunk ("+b.toString(16)+", "+c+")",2);b=a.GetPosition()+c-6;var d=G(a);E(a,b,function(b,c){b==v?T(a,d,b,c):(b==t?w("Skip light chunk ("+d+", "+b.toString(16)+", "+c+")",3):b==y?w("Skip camera chunk ("+d+", "+b.toString(16)+", "+c+")",3):w("Skip chunk ("+b.toString(16)+", "+c+")",3),a.Skip(c-6))})}function V(a, -b,c){w("Read editor chunk ("+b.toString(16)+", "+c+")",1);b=a.GetPosition()+c-6;E(a,b,function(b,c){b==d?R(a,b,c):b==x?U(a,b,c):(w("Skip chunk ("+b.toString(16)+", "+c+")",2),a.Skip(c-6))})}function W(a,c,d){function e(a,b){var c=[];a.Skip(10);var d,f,g,h=a.ReadInteger32();for(d=0;dg;g++)a[0+g]*=c,a[4+g]*=d,a[8+g]*=f;return a}function f(a,b){var c=b[0],d=b[1],e=b[2],g;for(g=0;3>g;g++)a[12+g]+=a[0+g]*c+a[4+g]*d+a[8+g]*e;return a}function g(a,b){var c,d;for(c=0;cf.length)){g="";for(h=1;hf.length)&&(h=parseFloat(f[1]),g=parseFloat(f[2]),f=parseFloat(f[3]),void 0!==b.onVertex&&null!==b.onVertex))b.onVertex(h, -g,f)}else if("vn"==f[0]){if(!(4>f.length)&&(h=parseFloat(f[1]),g=parseFloat(f[2]),f=parseFloat(f[3]),void 0!==b.onNormal&&null!==b.onNormal))b.onNormal(h,g,f)}else if("f"==f[0]){if(!(4>f.length)){for(var g=[],k=[],l=void 0,h=1;hf.length)&&void 0!==b.onUseMaterial&&null!==b.onUseMaterial)b.onUseMaterial(f[1])}else if("newmtl"== -f[0]){if(!(2>f.length)&&void 0!==b.onNewMaterial&&null!==b.onNewMaterial)b.onNewMaterial(f[1])}else if("Ka"==f[0]||"Kd"==f[0]||"Ks"==f[0]){if(!(4>f.length)&&(h=parseFloat(f[1]),g=parseFloat(f[2]),k=parseFloat(f[3]),void 0!==b.onMaterialComponent&&null!==b.onMaterialComponent))b.onMaterialComponent(f[0],h,g,k)}else if("Ka"==f[0]||"Kd"==f[0]||"Ks"==f[0]){if(!(4>f.length)&&(h=parseFloat(f[1]),g=parseFloat(f[2]),k=parseFloat(f[3]),void 0!==b.onMaterialComponent&&null!==b.onMaterialComponent))b.onMaterialComponent(f[0], -h,g,k)}else"mtllib"==f[0]&&!(2>f.length)&&(f=g.indexOf("mtllib")+6,h=g.substr(f,g.length-f).trim(),f=h.trim(),f=void 0!==b.onFileRequested&&null!==b.onFileRequested?b.onFileRequested(f):null,null!==f&&c(f))}}}c(a)}; -JSM.ConvertObjToJsonData=function(a,b){var c=new JSM.TriangleModel,d=c.AddBody(new JSM.TriangleBody("Default")),e=c.GetBody(d),f={},g=null,h=null,k=[],l=[];JSM.ReadObjFile(a,{onNewMaterial:function(a){var b=c.AddMaterial(a,{r:1,g:0,b:0},{r:1,g:0,b:0},{r:0,g:0,b:0},1);g=c.GetMaterial(b);f[a]=b},onMaterialComponent:function(a,b,c,d){null!==g&&("Ka"==a?(a=g.ambient,a.r=b,a.g=c,a.b=d):"Kd"==a?(a=g.diffuse,a.r=b,a.g=c,a.b=d):"Ks"==a&&(a=g.specular,a.r=b,a.g=c,a.b=d))},onUseMaterial:function(a){a=f[a]; -void 0!==a&&(h=a)},onMesh:function(a){a=c.AddBody(new JSM.TriangleBody(a));e=c.GetBody(a)},onVertex:function(a,b,c){k.push(new JSM.Coord(a,b,c))},onNormal:function(a,b,c){l.push(new JSM.Coord(a,b,c))},onFace:function(a,b){var c,d,f=a.length==b.length,g=a.length;for(c=0;cd;){c=a.ReadCharacter();if(0===c)break;b+=String.fromCharCode(c);d+=1}return b}function V(a){var b=[],c;for(c=0;3>c;c++)b[c]=a.ReadFloat32();return b}function Q(a,b,c){for(;a.GetPosition()<=b-6;){var d=a,e=c,f=d.ReadUnsignedInteger16(),d=d.ReadUnsignedInteger32();e(f,d)}}if(void 0===b|| +null===b)b={};c=15677;d=45055;e=40960;f=40976;g=40992;h=41008;k=41024;l=41040;m=16;n=17;p=18;q=19;r=41472;t=41728;w=41816;u=41818;s=41812;x=41814;B=41820;C=48;v=49;G=16384;z=16640;L=17920;N=18176;D=16656;y=16704;A=16672;J=16736;O=16688;M=16720;H=45056;F=45058;I=45072;K=45075;P=45088;S=45089;T=45090;W=45104;(function(a){function U(a,b,c){var d={r:0,g:0,b:0};b=a.GetPosition()+c-6;var e=!1;Q(a,b,function(b,c){b==n?e||(d.r=a.ReadUnsignedCharacter()/255,d.g=a.ReadUnsignedCharacter()/255,d.b=a.ReadUnsignedCharacter()/ +255):b==p?(d.r=a.ReadUnsignedCharacter()/255,d.g=a.ReadUnsignedCharacter()/255,d.b=a.ReadUnsignedCharacter()/255,e=!0):b==m?e||(d.r=a.ReadFloat32(),d.g=a.ReadFloat32(),d.b=a.ReadFloat32()):b==q?(d.r=a.ReadFloat32(),d.g=a.ReadFloat32(),d.b=a.ReadFloat32(),e=!0):a.Skip(c-6)});return d}function X(a,b,c){var d=0;b=a.GetPosition()+c-6;Q(a,b,function(b,c){b==C?d=a.ReadUnsignedInteger16()/100:b==v?d=a.ReadFloat32():a.Skip(c-6)});return d}function Y(a,b,c){var d={name:null,offset:{x:0,y:0},scale:{x:0,y:0}, +rotation:0};b=a.GetPosition()+c-6;Q(a,b,function(b,c){b==t?d.name=R(a):b==w?d.offset.x=a.ReadFloat32():b==u?d.offset.y=a.ReadFloat32():b==s?d.scale.x=a.ReadFloat32():b==x?d.scale.y=a.ReadFloat32():b==B?d.rotation=a.ReadFloat32():a.Skip(c-6)});return d}function Z(a,c,d){E("Read material chunk ("+c.toString(16)+", "+d+")",2);var m={},n=a.GetPosition()+d-6;Q(a,n,function(b,n){b==e?(E("Read material name chunk ("+c.toString(16)+", "+d+")",3),m.name=R(a)):b==f?(E("Read material ambient chunk ("+c.toString(16)+ +", "+d+")",3),m.ambient=U(a,b,n)):b==g?(E("Read material diffuse chunk ("+c.toString(16)+", "+d+")",3),m.diffuse=U(a,b,n)):b==h?(E("Read material specular chunk ("+c.toString(16)+", "+d+")",3),m.specular=U(a,b,n)):b==k?(E("Read material shininess chunk ("+c.toString(16)+", "+d+")",3),m.shininess=X(a,b,n)):b==l?(E("Read material transparency chunk ("+c.toString(16)+", "+d+")",3),m.transparency=X(a,b,n)):b==r?(E("Read material texture map chunk ("+c.toString(16)+", "+d+")",3),m.textureMap=Y(a,b,n)): +(E("Skip chunk ("+b.toString(16)+", "+n+")",3),a.Skip(n-6))});if(void 0!==b.onMaterial&&null!==b.onMaterial)b.onMaterial(m)}function $(a,c,d){E("Read faces chunk ("+c.toString(16)+", "+d+")",4);c=a.GetPosition()+d-6;var e=a.ReadUnsignedInteger16(),f,g,h,k;for(d=0;df;f++){for(g=0;3>g;g++)e.push(a.ReadFloat32());3>f?e.push(0):e.push(1)}if(void 0!==b.onTransformation&&null!==b.onTransformation)b.onTransformation(e)}else E("Skip chunk ("+c.toString(16)+", "+d+")",4),a.Skip(d-6)})}function ba(a,b,c){E("Read object chunk ("+b.toString(16)+", "+c+")",2);b=a.GetPosition()+ +c-6;var d=R(a);Q(a,b,function(b,c){b==z?aa(a,d,b,c):(b==L?E("Skip light chunk ("+d+", "+b.toString(16)+", "+c+")",3):b==N?E("Skip camera chunk ("+d+", "+b.toString(16)+", "+c+")",3):E("Skip chunk ("+b.toString(16)+", "+c+")",3),a.Skip(c-6))})}function ca(a,b,c){E("Read editor chunk ("+b.toString(16)+", "+c+")",1);b=a.GetPosition()+c-6;Q(a,b,function(b,c){b==d?Z(a,b,c):b==G?ba(a,b,c):(E("Skip chunk ("+b.toString(16)+", "+c+")",2),a.Skip(c-6))})}function da(a,c,d){function e(a,b){var c=[];a.Skip(10); +var d,f,g,h=a.ReadInteger32();for(d=0;dg;g++)a[0+g]*=c,a[4+g]*=d,a[8+g]*=f;return a}function f(a,b){var c=b[0],d=b[1],e=b[2],g;for(g=0;3>g;g++)a[12+g]+=a[0+g]*c+a[4+g]*d+a[8+g]*e;return a}function g(a,b){var c,d;for(c=0;cn.length)){var p="";for(a=1;an.length||d(parseFloat(n[1]),parseFloat(n[2]),parseFloat(n[3]));else if("vn"==n[0])4>n.length||e(parseFloat(n[1]),parseFloat(n[2]),parseFloat(n[3]));else if("vt"==n[0])3>n.length||f(parseFloat(n[1]), +parseFloat(n[2]));else if("f"==n[0]){if(!(4>n.length)){var p=[],q=[],r=[],t;for(a=1;an.length)&&void 0!==b.onUseMaterial&&null!==b.onUseMaterial)b.onUseMaterial(n[1])}else if("newmtl"==n[0]){if(!(2>n.length)&&void 0!==b.onNewMaterial&&null!==b.onNewMaterial)b.onNewMaterial(n[1])}else if("Ka"== +n[0]||"Kd"==n[0]||"Ks"==n[0])4>n.length||c(n[0],parseFloat(n[1]),parseFloat(n[2]),parseFloat(n[3]));else if("Ns"==n[0]||"Tr"==n[0]||"d"==n[0]){if(!(2>n.length)&&void 0!==b.onMaterialParameter&&null!==b.onMaterialParameter)b.onMaterialParameter(n[0],n[1])}else if("map_Kd"==n[0]){if(!(2>n.length)&&(n=h(a,"map_Kd"),void 0!==b.onMaterialTexture&&null!==b.onMaterialTexture))b.onMaterialTexture(n)}else"mtllib"==n[0]&&!(2>n.length)&&(n=h(a,"mtllib"),n=g(n.trim()),null!==n&&k(n))}}function k(a){a=a.split("\n"); +var b,c;for(b=0;bc;c++)b[c]=a.ReadFloat32();return b}var d=new JSM.BinaryReader(a,!0);d.Skip(80);var e=d.ReadUnsignedInteger32(),f,g,h,k,l;for(f=0;fd.length)return-1;var d=[parseFloat(d[2]),parseFloat(d[3]),parseFloat(d[4])],e=[],l,m;for(l=c+1;le.length;l++)if(m=a[l].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);l+=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 l}return c+1}for(var d=0,e=a.split("\n");db)return!1;a=new JSM.BinaryReader(a,!0);a.Skip(80);a=a.ReadUnsignedInteger32();return b!=50*a+84?!1:!0}; JSM.ConvertStlToJsonData=function(a,b){var c=new JSM.TriangleModel,d=c.AddBody(new JSM.TriangleBody("Default")),e=c.GetBody(d);null!==a?JSM.ReadBinaryStlFile(a,{onFace:function(a,b,c,d){a=e.AddVertex(a[0],a[1],a[2]);b=e.AddVertex(b[0],b[1],b[2]);c=e.AddVertex(c[0],c[1],c[2]);d=JSM.VectorNormalize(new JSM.Vector(d[0],d[1],d[2]));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=e.AddVertex(c[0],c[1],c[2]);d=JSM.VectorNormalize(new JSM.Vector(d[0],d[1],d[2]));d=e.AddNormal(d.x,d.y,d.z);e.AddTriangle(a,b,c,d,d,d)}});c.Finalize();return JSM.ConvertTriangleModelToJsonData(c)};JSM.ImportFileList=function(){this.type=this.descriptors=this.originalList=null}; -JSM.ImportFileList.prototype.InitFromFiles=function(a){this.originalList=a;this.descriptors=[];var b,c;for(b=0;bt;t++)v[t].z=n-c;t=JSM.GeneratePrism(v,l,c,!0);k.Merge(t);if(d)for(t=0;tb&&(e=a,p=!1);for(t=0;ts;s++)u[s].z=n-c;s=JSM.GeneratePrism(u,l,c,!0);k.Merge(s);if(d)for(s=0;sb&&(e=a,p=!1);for(s=0;sg;g++)l=0===g?h.pgon1:h.pgon2,-1===l&&(l=0===g?h.pgon2:h.pgon1),l=b.GetVertex(d[l]).position,k=JSM.CoordAdd(k,JSM.VectorMultiply(l,0.25));e.push(b.AddVertex(new JSM.BodyVertex(k)))}})();(function(){var e=[],g,h,k,l;for(k=0;kg&&(g=3);e=m/g;for(m=1;m<=g;m++)f=k.getPointAtLength(m* -e),f=c(a,h,l,b,f.x,f.y);return f}function e(a,b){var c=a.VertexCount(b);if(0!==c){var d=a.GetVertex(b,0),c=a.GetVertex(b,c-1);JSM.CoordIsEqual2DWithEps(d,c,0.1)&&a.GetContour(b).vertices.pop()}}function f(a,b){return 0g&&(g=3);e=m/g;for(m=1;m<=g;m++)f=l.getPointAtLength(m* +e),f=c(a,h,k,b,f.x,f.y);return f}function e(a,b){var c=a.VertexCount(b);if(0!==c){var d=a.GetVertex(b,0),c=a.GetVertex(b,c-1);JSM.CoordIsEqual2DWithEps(d,c,0.1)&&a.GetContour(b).vertices.pop()}}function f(a,b){return 00.1', function () { myThis.WelcomeDialog (); }); + importerButtons.AddLogo ('Online 3D Viewer 0.2', function () { myThis.WelcomeDialog (); }); importerButtons.AddButton ('images/openfile.png', 'Open File', function () { myThis.OpenFile (); }); importerButtons.AddButton ('images/fitinwindow.png', 'Fit In Window', function () { myThis.FitInWindow (); }); importerButtons.AddButton ('images/fixup.png', 'Enable/Disable Fixed Up Vector', function () { myThis.SetFixUp (); }); @@ -154,6 +154,7 @@ ImporterApp.prototype.GenerateMenu = function () table.AddColorRow ('Ambient', material.ambient); table.AddColorRow ('Diffuse', material.diffuse); table.AddColorRow ('Specular', material.specular); + table.AddRow ('Shininess', material.shininess); table.AddRow ('Opacity', material.opacity.toFixed (2)); }, title : 'Show/Hide Information', diff --git a/website/include/importerviewer.js b/website/include/importerviewer.js index abb6bae..e7e8cb9 100644 --- a/website/include/importerviewer.js +++ b/website/include/importerviewer.js @@ -65,7 +65,7 @@ ImporterViewer.prototype.ShowAllMeshes = function (inEnvironment) } }); - JSM.ConvertJSONDataToThreeMeshes (this.jsonData, null, environment); + JSM.ConvertJSONDataToThreeMeshes (this.jsonData, this.Draw.bind (this), environment); }; ImporterViewer.prototype.ShowMesh = function (index) @@ -77,7 +77,7 @@ ImporterViewer.prototype.ShowMesh = function (index) meshes : [this.jsonData.meshes[index]] }; - var meshes = JSM.ConvertJSONDataToThreeMeshes (workJsonData); + var meshes = JSM.ConvertJSONDataToThreeMeshes (workJsonData, this.Draw.bind (this)); for (i = 0; i < meshes.length; i++) { mesh = meshes[i]; mesh.originalJsonIndex = index; @@ -162,3 +162,8 @@ ImporterViewer.prototype.SetNamedView = function (viewName) this.viewer.cameraMove.Set (eye, center, up); this.viewer.FitInWindow (); }; + +ImporterViewer.prototype.Draw = function () +{ + this.viewer.Draw (); +}; diff --git a/website/index.html b/website/index.html index 56fdd0d..d9fd677 100644 --- a/website/index.html +++ b/website/index.html @@ -42,7 +42,7 @@