babylon.objFileLoader.min.js 6.5 KB

1
  1. var BABYLON;!(function(e){var t=(function(){function t(){this.materials=[]}return t.prototype.parseMTL=function(r,s,n){if(!(s instanceof ArrayBuffer)){for(var a,i=s.split("\n"),o=/\s+/,l=null,u=0;u<i.length;u++){var p=i[u].trim();if(0!==p.length&&"#"!==p.charAt(0)){var h=p.indexOf(" "),m=h>=0?p.substring(0,h):p;m=m.toLowerCase();var f=h>=0?p.substring(h+1).trim():"";"newmtl"===m?(l&&this.materials.push(l),l=new e.StandardMaterial(f,r)):"kd"===m&&l?(a=f.split(o,3).map(parseFloat),l.diffuseColor=e.Color3.FromArray(a)):"ka"===m&&l?(a=f.split(o,3).map(parseFloat),l.ambientColor=e.Color3.FromArray(a)):"ks"===m&&l?(a=f.split(o,3).map(parseFloat),l.specularColor=e.Color3.FromArray(a)):"ke"===m&&l?(a=f.split(o,3).map(parseFloat),l.emissiveColor=e.Color3.FromArray(a)):"ns"===m&&l?l.specularPower=parseFloat(f):"d"===m&&l?l.alpha=parseFloat(f):"map_ka"===m&&l?l.ambientTexture=t._getTexture(n,f,r):"map_kd"===m&&l?l.diffuseTexture=t._getTexture(n,f,r):"map_ks"===m&&l?l.specularTexture=t._getTexture(n,f,r):"map_ns"===m||("map_bump"===m&&l?l.bumpTexture=t._getTexture(n,f,r):"map_d"===m&&l&&(l.opacityTexture=t._getTexture(n,f,r)))}}l&&this.materials.push(l)}},t._getTexture=function(t,r,s){if(!r)return null;var n=t;if("file:"===t){var a=r.lastIndexOf("\\");-1===a&&(a=r.lastIndexOf("/")),n+=a>-1?r.substr(a+1):r}else n+=r;return new e.Texture(n,s)},t})();e.MTLFileLoader=t;var r=(function(){function r(){this.name="obj",this.extensions=".obj",this.obj=/^o/,this.group=/^g/,this.mtllib=/^mtllib /,this.usemtl=/^usemtl /,this.smooth=/^s /,this.vertexPattern=/v( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/,this.normalPattern=/vn( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/,this.uvPattern=/vt( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/,this.facePattern1=/f\s+(([\d]{1,}[\s]?){3,})+/,this.facePattern2=/f\s+((([\d]{1,}\/[\d]{1,}[\s]?){3,})+)/,this.facePattern3=/f\s+((([\d]{1,}\/[\d]{1,}\/[\d]{1,}[\s]?){3,})+)/,this.facePattern4=/f\s+((([\d]{1,}\/\/[\d]{1,}[\s]?){3,})+)/}return r.prototype._loadMTL=function(t,r,s){var n=e.Tools.BaseUrl+r+t;e.Tools.LoadFile(n,s,void 0,void 0,!1,(function(){console.warn("Error - Unable to load "+n)}))},r.prototype.importMeshAsync=function(e,t,r,s,n){return this._parseSolid(e,t,r,s).then((function(e){return{meshes:e,particleSystems:[],skeletons:[],animationGroups:[]}}))},r.prototype.loadAsync=function(e,t,r,s){return this.importMeshAsync(null,e,t,r,s).then((function(){}))},r.prototype.loadAssetContainerAsync=function(t,r,s,n){return this.importMeshAsync(null,t,r,s).then((function(r){var s=new e.AssetContainer(t);return r.meshes.forEach((function(e){return s.meshes.push(e)})),s.removeAllFromScene(),s}))},r.prototype._parseSolid=function(s,n,a,i){for(var o,l=this,u=[],p=[],h=[],m=[],f=[],c=[],d=[],v=[],x=[],g=0,T=!1,y=[],_=[],F=[],I=[],P="",A="",b=new t,w=1,E=!0,L=function(e,t){e[t[0]]||(e[t[0]]={normals:[],idx:[]});var r=e[t[0]].normals.indexOf(t[1]);return-1===r?-1:e[t[0]].idx[r]},M=function(e,t){e[t[0]]||(e[t[0]]={normals:[],idx:[],uv:[]});var r=e[t[0]].normals.indexOf(t[1]);return 1!=r&&t[2]==e[t[0]].uv[r]?e[t[0]].idx[r]:-1},O=function(e,t,s,n,a,i){var o;o=r.OPTIMIZE_WITH_UV?M(x,[e,s,t]):L(x,[e,s]),-1==o?(f.push(c.length),c.push(n),d.push(a),v.push(i),x[e].normals.push(s),x[e].idx.push(g++),r.OPTIMIZE_WITH_UV&&x[e].uv.push(t)):f.push(o)},V=function(){for(var e=0;e<c.length;e++)y.push(c[e].x,c[e].y,c[e].z),_.push(v[e].x,v[e].y,v[e].z),F.push(d[e].x,d[e].y);c=[],v=[],d=[],x=[],g=0},C=function(e,t){t+1<e.length&&(I.push(e[0],e[t],e[t+1]),t+=1,C(e,t))},N=function(){m.length>0&&(o=m[m.length-1],V(),f.reverse(),o.indices=f.slice(),o.positions=y.slice(),o.normals=_.slice(),o.uvs=F.slice(),f=[],y=[],_=[],F=[])},B=a.split("\n"),k=0;k<B.length;k++){var S,U=B[k].trim();if(0!==U.length&&"#"!==U.charAt(0))if(null!==(S=this.vertexPattern.exec(U)))u.push(new e.Vector3(parseFloat(S[1]),parseFloat(S[2]),parseFloat(S[3])));else if(null!==(S=this.normalPattern.exec(U)))p.push(new e.Vector3(parseFloat(S[1]),parseFloat(S[2]),parseFloat(S[3])));else if(null!==(S=this.uvPattern.exec(U)))h.push(new e.Vector2(parseFloat(S[1]),parseFloat(S[2])));else if(null!==(S=this.facePattern3.exec(U)))!(function(e,t){C(e,t);for(var r=0;r<I.length;r++){var s=I[r].split("/"),n=parseInt(s[0])-1,a=parseInt(s[1])-1,i=parseInt(s[2])-1;O(n,a,i,u[n],h[a],p[i])}I=[]})(S[1].trim().split(" "),1);else if(null!==(S=this.facePattern4.exec(U)))!(function(t,r){C(t,r);for(var s=0;s<I.length;s++){var n=I[s].split("//"),a=parseInt(n[0])-1,i=parseInt(n[1])-1;O(a,1,i,u[a],e.Vector2.Zero(),p[i])}I=[]})(S[1].trim().split(" "),1);else if(null!==(S=this.facePattern2.exec(U)))!(function(t,r){C(t,r);for(var s=0;s<I.length;s++){var n=I[s].split("/"),a=parseInt(n[0])-1,i=parseInt(n[1])-1;O(a,i,0,u[a],h[i],e.Vector3.Up())}I=[]})(S[1].trim().split(" "),1);else if(null!==(S=this.facePattern1.exec(U)))!(function(t,r){C(t,r);for(var s=0;s<I.length;s++){var n=parseInt(I[s])-1;O(n,0,0,u[n],e.Vector2.Zero(),e.Vector3.Up())}I=[]})(S[1].trim().split(" "),1);else if(this.group.test(U)||this.obj.test(U)){var Y={name:U.substring(2).trim(),indices:void 0,positions:void 0,normals:void 0,uvs:void 0,materialName:""};N(),m.push(Y),T=!0,E=!0,w=1}else if(this.usemtl.test(U)){if(P=U.substring(7).trim(),!E){N();var Y={name:"_mm"+w.toString(),indices:void 0,positions:void 0,normals:void 0,uvs:void 0,materialName:P};w++,m.push(Y)}T&&E&&(m[m.length-1].materialName=P,E=!1)}else this.mtllib.test(U)?A=U.substring(7).trim():this.smooth.test(U)||console.log("Unhandled expression at line : "+U)}T&&(o=m[m.length-1],f.reverse(),V(),o.indices=f,o.positions=y,o.normals=_,o.uvs=F),T||(f.reverse(),V(),m.push({name:e.Geometry.RandomId(),indices:f,positions:y,normals:_,uvs:F,materialName:P}));for(var Z=[],j=new Array,R=0;R<m.length;R++){if(s&&m[R].name)if(s instanceof Array){if(-1==s.indexOf(m[R].name))continue}else if(m[R].name!==s)continue;o=m[R];var H=new e.Mesh(m[R].name,n);j.push(m[R].materialName);var W=new e.VertexData;W.positions=o.positions,W.normals=o.normals,W.uvs=o.uvs,W.indices=o.indices,W.applyToMesh(H),r.INVERT_Y&&(H.scaling.y*=-1),Z.push(H)}var z=[];return""!==A&&z.push(new Promise(function(e,t){l._loadMTL(A,i,(function(r){try{b.parseMTL(n,r,i);for(var s=0;s<b.materials.length;s++){for(var a,o=0,l=[];(a=j.indexOf(b.materials[s].name,o))>-1;)l.push(a),o=a+1;if(-1==a&&0==l.length)b.materials[s].dispose();else for(var u=0;u<l.length;u++)Z[l[u]].material=b.materials[s]}e()}catch(e){t(e)}}))})),Promise.all(z).then((function(){return Z}))},r.OPTIMIZE_WITH_UV=!1,r.INVERT_Y=!1,r})();e.OBJFileLoader=r,e.SceneLoader&&e.SceneLoader.RegisterPlugin(new r)})(BABYLON||(BABYLON={}));