diff --git a/README.md b/README.md index d24f65f..c09c7c2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ consisting of THREE.BufferGeometry and an associated THREE.Material. Multi-mate ## Usage Include the loader library in your project: ```html - + ``` Then create an instance of BOMLoader and specify the file path to load: diff --git a/examples/js/loaders/BOMLoader.js b/examples/js/loaders/BOMLoader.js index e76cdda..142830a 100644 --- a/examples/js/loaders/BOMLoader.js +++ b/examples/js/loaders/BOMLoader.js @@ -677,7 +677,7 @@ THREE.BOMLoader.prototype = { var materialId = readUint16(); material = materials[ materialId ].clone() || new THREE.MeshPhongMaterial(); - if( material.flatShading ) material.flatShading = ( smoothing <= 0 ); + if( material.flatShading !== undefined ) material.flatShading = ( smoothing <= 0 ); else material.shading = ( smoothing > 0 ) ? THREE.SmoothShading : THREE.FlatShading; if ( this.debug ) console.log( 'Group Material', materialId, material ); diff --git a/examples/js/loaders/BOMLoader.min.js b/examples/js/loaders/BOMLoader.min.js index a908dfe..736ec01 100644 --- a/examples/js/loaders/BOMLoader.min.js +++ b/examples/js/loaders/BOMLoader.min.js @@ -1 +1 @@ -THREE.BOMLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager},THREE.BOMLoader.prototype={constructor:THREE.BOMLoader,load:function(e,t,r,E){var n=this,a=THREE.FileLoader?new THREE.FileLoader(this.manager):new THREE.XHRLoader(this.manager);a.setPath(this.path),a.setResponseType("arraybuffer"),a.load(e,function(e){t(n.parse(e))},r,E)},setPath:function(e){this.path=e},setTexturePath:function(e){this.texturePath=e},setCrossOrigin:function(e){this.crossOrigin=e},setDebug:function(e){this.debug=e},setPerfTimer:function(e){this.performanceTimer=e},setResponseType:function(e){this.responseType=e},parse:function(e){function t(){var e=c.getUint8(N);return N+=Uint8Array.BYTES_PER_ELEMENT,e}function r(){var e=c.getUint16(N,!0);return N+=Uint16Array.BYTES_PER_ELEMENT,e}function E(){var e=c.getUint32(N,!0);return N+=Uint32Array.BYTES_PER_ELEMENT,e}function n(){var e=c.getFloat32(N,!0);return N+=Float32Array.BYTES_PER_ELEMENT,e}function a(e){var t=String.fromCharCode.apply(null,e>0?new Uint8Array(c.buffer,N,e):new Uint8Array);return N+=Uint8Array.BYTES_PER_ELEMENT*e,t}function o(e){if(0===N%Uint16Array.BYTES_PER_ELEMENT){var t=new Uint16Array(c.buffer,N,e);return N+=Uint16Array.BYTES_PER_ELEMENT*e,t}for(var t=new Uint16Array(e),r=0;e>r;++r,N+=Uint16Array.BYTES_PER_ELEMENT)t[r]=c.getUint16(N,!0);return t}function i(e){if(0===N%Float32Array.BYTES_PER_ELEMENT){var t=new Float32Array(c.buffer,N,e);return N+=Float32Array.BYTES_PER_ELEMENT*e,t}for(var t=new Float32Array(e),r=0;e>r;++r,N+=Float32Array.BYTES_PER_ELEMENT)t[r]=c.getFloat32(N,!0);return t}function s(e){if("string"!=typeof e||""===e)return"";if(/^https?:\/\//i.test(e))return e;var t=new URL((I.texturePath||I.path||"")+e,location.href.substring(0,location.href.lastIndexOf("/")+1));return""+t}function T(e){e=s(e);var t;if(altspace&&altspace.inClient)t=new THREE.Texture({src:e});else{var r=THREE.Loader.Handlers.get(e);null===r&&(r=new THREE.TextureLoader(I.manager)),r.setCrossOrigin(I.crossOrigin),t=r.load(e)}return t.side=THREE.FrontSide,t.wrapS=t.wrapT=THREE.RepeatWrapping,t}this.performanceTimer&&console.time("BOMLoader");var A={NONE:0,FRONT:1,BACK:2,ALL:3},l={NONE:1,MATERIAL_LIBRARY:2},u={NONE:1,NAME:2},M={NONE:1,NAME:2,INDEX:4,SMOOTHING:8,MATERIAL:16},L={NONE:1,GEOMETRY:2},S={NONE:1,NORMAL:2,UV1:4,UV2:8},f={NONE:1,ILLUMINATION_MODEL:2,SPECULAR_EXPONENT:4,OPTICAL_DENSITY:8,DISSOLVE:16,TRANSMISSION_FILTER:32,AMBIENT_REFLECTANCE:64,DIFFUSE_REFLECTANCE:128,SPECULAR_REFLECTANCE:256,EMISSIVE_REFLECTANCE:512,AMBIENT_MAP:1024,DIFFUSE_MAP:2048,SPECULAR_MAP:4096,EMISSIVE_MAP:8192,DISSOLVE_MAP:16384,BUMP_MAP:32768,DISPLACEMENT_MAP:65536,FACE_CULLING:1<<17,LIGHT_MAP:1<<18},R={NONE:1,PATH:2,SCALE:4,OFFSET:8,BUMP_SCALE:16,DISPLACEMENT_SCALE:32,LIGHTMAP_INTENSITY:64},c=new DataView(e),N=0,g="array"===this.responseType,p=g?[]:new THREE.Group,I=this,d=a(3);this.debug&&console.log("File Signature",d);var P=t();this.debug&&console.log("Version",P);var _=r();this.debug&&console.log("FileAttributes:","\n","Material Library",V&l.MATERIAL_LIBRARY?!0:!1);var h=[];if(_&l.MATERIAL_LIBRARY){var v=r();this.debug&&console.log("Material Count",v);for(var C=0;v>C;++C){var O=E();this.debug&&console.log("MaterialAttributes:","\n","Illumination Model",O&f.ILLUMINATION_MODEL?!0:!1,"\n","Specular Exponent",O&f.SPECULAR_EXPONENT?!0:!1,"\n","Optical Density",O&f.OPTICAL_DENSITY?!0:!1,"\n","Dissolve",O&f.DISSOLVE?!0:!1,"\n","Transmission Filter",O&f.TRANSMISSION_FILTER?!0:!1,"\n","Ambient Reflectance",O&f.AMBIENT_REFLECTANCE?!0:!1,"\n","Diffuse Reflectance",O&f.DIFFUSE_REFLECTANCE?!0:!1,"\n","Specular Reflectance",O&f.SPECULAR_REFLECTANCE?!0:!1,"\n","Ambient Map",O&f.AMBIENT_MAP?!0:!1,"\n","Diffuse Map",O&f.DIFFUSE_MAP?!0:!1,"\n","Specular Map",O&f.SPECULAR_MAP?!0:!1,"\n","Dissolve Map",O&f.DISSOLVE_MAP?!0:!1,"\n","Bump Map",O&f.BUMP_MAP?!0:!1,"\n","Displacement Map",O&f.DISPLACEMENT_MAP?!0:!1,"\n","Face Culling",O&f.FACE_CULLING?!0:!1,"\n","Light Map",O&f.LIGHT_MAP?!0:!1);var F={};if(F.name=a(r()),this.debug&&console.log("Material Name",F.name),O&f.ILLUMINATION_MODEL&&t(),O&f.SPECULAR_EXPONENT&&(F.shininess=n(),this.debug&&console.log("Specular Exponent",F.shininess)),O&f.OPTICAL_DENSITY&&n(),O&f.DISSOLVE&&(F.opacity=n(),F.transparent=!0,this.debug&&console.log("Dissolve",F.opacity)),O&f.TRANSMISSION_FILTER&&(n(),n(),n()),O&f.AMBIENT_REFLECTANCE&&(n(),n(),n()),O&f.DIFFUSE_REFLECTANCE&&(F.color=new THREE.Color(n(),n(),n()),this.debug&&console.log("Diffuse Reflectance",F.color)),O&f.SPECULAR_REFLECTANCE&&(F.specular=new THREE.Color(n(),n(),n()),this.debug&&console.log("Specular Reflectance",F.specular)),O&f.EMISSIVE_REFLECTANCE&&(F.emissive=new THREE.Color(n(),n(),n()),this.debug&&console.log("Emissive Reflectance",F.emissive)),O&f.AMBIENT_MAP){var b=r();b&R.PATH&&a(r()),b&R.SCALE&&(n(),n()),b&R.OFFSET&&(n(),n())}if(O&f.DIFFUSE_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),F.map=H,this.debug&&b&R.PATH&&console.log("Diffuse Map",H)}if(O&f.SPECULAR_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),F.specularMap=H}if(O&f.EMISSIVE_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),F.emissiveMap=H}if(O&f.DISSOLVE_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),F.alphaMap=H,F.transparent=!0}if(O&f.BUMP_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),b&R.BUMP_SCALE&&(F.bumpScale=n()),F.bumpMap=H}if(O&f.DISPLACEMENT_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),b&R.DISPLACEMENT_SCALE&&(F.displacementScale=n()),F.displacementMap=H}if(O&f.FACE_CULLING){var m=t();m===A.ALL?F.visible=!1:F.side=m===A.FRONT?THREE.BackSide:m===A.BACK?THREE.FrontSide:THREE.DoubleSide}if(O&f.LIGHT_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),b&R.LIGHTMAP_INTENSITY&&(F.lightMapIntensity=n()),F.lightMap=H}var U=new THREE.MeshPhongMaterial(F);h.push(U)}}var B=r();this.debug&&console.log("Asset Count",B);for(var D=0;B>D;++D){var y=r();this.debug&&console.log("AssetAttributes:","\n","Name",y&u.NAME?!0:!1);var w=p;if(g&&(w=new THREE.Group,p.push(w)),y&u.NAME){var G=a(r());this.debug&&console.log("Asset Name",G),g||(w.name=G)}var Y=r();this.debug&&console.log("Object Count",Y);for(var C=0;Y>C;++C){var V=r();this.debug&&console.log("ObjectAttributes:","\n","Geometry",V&L.GEOMETRY?!0:!1);var x={};if(V&L.GEOMETRY){var X=r();this.debug&&console.log("GeometryAttributes:","\n","Normal",X&S.NORMAL?!0:!1,"\n","UV1",X&S.UV1?!0:!1,"\n","UV2",X&S.UV2?!0:!1);var j=E();this.debug&&console.log("Vertex Count",j),x.positions=i(3*j),X&S.NORMAL&&(x.normals=i(3*j)),X&S.UV1&&(x.uvs=i(2*j)),X&S.UV2&&(x.uvs2=i(2*j))}var K=r();this.debug&&console.log("Group Count",K);for(var k=0;K>k;++k){var W=r();this.debug&&console.log("GroupAttributes:","\n","Index",W&M.INDEX?!0:!1,"\n","Smoothing",W&M.SMOOTHING?!0:!1,"\n","Material",W&M.MATERIAL?!0:!1);var q;if(W&M.NAME&&(q=a(r()),this.debug&&console.log("Group Name",q)),V&L.GEOMETRY){var z;if(W&M.INDEX){var J=E();this.debug&&console.log("Index Count",J),z=o(J)}var Q=W&M.SMOOTHING?t():0;this.debug&&W&M.SMOOTHING&&console.log("Smoothing",Q);var Z=new THREE.BufferGeometry;x.positions&&Z.addAttribute("position",new THREE.BufferAttribute(x.positions,3)),x.normals?Z.addAttribute("normal",new THREE.BufferAttribute(x.normals,3)):Z.computeVertexNormals(),x.uvs&&Z.addAttribute("uv",new THREE.BufferAttribute(x.uvs,2)),x.uvs2&&Z.addAttribute("uv2",new THREE.BufferAttribute(x.uvs2,2)),z&&Z.setIndex(new THREE.BufferAttribute(z,1)),Z.addGroup(0,1,0);var U;if(W&M.MATERIAL){var $=r();U=h[$].clone()||new THREE.MeshPhongMaterial,U.flatShading?U.flatShading=0>=Q:U.shading=Q>0?THREE.SmoothShading:THREE.FlatShading,this.debug&&console.log("Group Material",$,U)}var et=new THREE.Mesh(Z,U);q&&(et.name=q),w.add(et)}}}}return this.performanceTimer&&console.timeEnd("BOMLoader"),p}},THREE.BOMLoaderUtil=THREE.BOMLoaderUtil||{},THREE.BOMLoaderUtil.multiload=function(e,t){function r(e,r){var a=new THREE.BOMLoader;a.setTexturePath(r.url.split("/").slice(0,-1).join("/")+"/"),void 0!==r.debug&&a.setDebug(r.debug),void 0!==r.timer&&a.setPerfTimer(r.timer),void 0!==r.crossOrigin&&a.setCrossOrigin(r.crossOrigin),void 0!==r.responseType&&a.setResponseType(r.responseType),a.load(r.url,function(a){r.object=a,n[e]=r,0>=--E&&t(n)})}e=e.constructor===Array?e:[e];for(var E=e.length,n=[],a=0;e.length>a;++a)r(a,e[a])}; \ No newline at end of file +THREE.BOMLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager},THREE.BOMLoader.prototype={constructor:THREE.BOMLoader,load:function(e,t,r,E){var n=this,a=THREE.FileLoader?new THREE.FileLoader(this.manager):new THREE.XHRLoader(this.manager);a.setPath(this.path),a.setResponseType("arraybuffer"),a.load(e,function(e){t(n.parse(e))},r,E)},setPath:function(e){this.path=e},setTexturePath:function(e){this.texturePath=e},setCrossOrigin:function(e){this.crossOrigin=e},setDebug:function(e){this.debug=e},setPerfTimer:function(e){this.performanceTimer=e},setResponseType:function(e){this.responseType=e},parse:function(e){function t(){var e=c.getUint8(N);return N+=Uint8Array.BYTES_PER_ELEMENT,e}function r(){var e=c.getUint16(N,!0);return N+=Uint16Array.BYTES_PER_ELEMENT,e}function E(){var e=c.getUint32(N,!0);return N+=Uint32Array.BYTES_PER_ELEMENT,e}function n(){var e=c.getFloat32(N,!0);return N+=Float32Array.BYTES_PER_ELEMENT,e}function a(e){var t=String.fromCharCode.apply(null,e>0?new Uint8Array(c.buffer,N,e):new Uint8Array);return N+=Uint8Array.BYTES_PER_ELEMENT*e,t}function o(e){if(0===N%Uint16Array.BYTES_PER_ELEMENT){var t=new Uint16Array(c.buffer,N,e);return N+=Uint16Array.BYTES_PER_ELEMENT*e,t}for(var t=new Uint16Array(e),r=0;e>r;++r,N+=Uint16Array.BYTES_PER_ELEMENT)t[r]=c.getUint16(N,!0);return t}function i(e){if(0===N%Float32Array.BYTES_PER_ELEMENT){var t=new Float32Array(c.buffer,N,e);return N+=Float32Array.BYTES_PER_ELEMENT*e,t}for(var t=new Float32Array(e),r=0;e>r;++r,N+=Float32Array.BYTES_PER_ELEMENT)t[r]=c.getFloat32(N,!0);return t}function s(e){if("string"!=typeof e||""===e)return"";if(/^https?:\/\//i.test(e))return e;var t=new URL((I.texturePath||I.path||"")+e,location.href.substring(0,location.href.lastIndexOf("/")+1));return""+t}function T(e){e=s(e);var t;if(altspace&&altspace.inClient)t=new THREE.Texture({src:e});else{var r=THREE.Loader.Handlers.get(e);null===r&&(r=new THREE.TextureLoader(I.manager)),r.setCrossOrigin(I.crossOrigin),t=r.load(e)}return t.side=THREE.FrontSide,t.wrapS=t.wrapT=THREE.RepeatWrapping,t}this.performanceTimer&&console.time("BOMLoader");var A={NONE:0,FRONT:1,BACK:2,ALL:3},l={NONE:1,MATERIAL_LIBRARY:2},u={NONE:1,NAME:2},M={NONE:1,NAME:2,INDEX:4,SMOOTHING:8,MATERIAL:16},L={NONE:1,GEOMETRY:2},S={NONE:1,NORMAL:2,UV1:4,UV2:8},f={NONE:1,ILLUMINATION_MODEL:2,SPECULAR_EXPONENT:4,OPTICAL_DENSITY:8,DISSOLVE:16,TRANSMISSION_FILTER:32,AMBIENT_REFLECTANCE:64,DIFFUSE_REFLECTANCE:128,SPECULAR_REFLECTANCE:256,EMISSIVE_REFLECTANCE:512,AMBIENT_MAP:1024,DIFFUSE_MAP:2048,SPECULAR_MAP:4096,EMISSIVE_MAP:8192,DISSOLVE_MAP:16384,BUMP_MAP:32768,DISPLACEMENT_MAP:65536,FACE_CULLING:1<<17,LIGHT_MAP:1<<18},R={NONE:1,PATH:2,SCALE:4,OFFSET:8,BUMP_SCALE:16,DISPLACEMENT_SCALE:32,LIGHTMAP_INTENSITY:64},c=new DataView(e),N=0,g="array"===this.responseType,p=g?[]:new THREE.Group,I=this,d=a(3);this.debug&&console.log("File Signature",d);var P=t();this.debug&&console.log("Version",P);var _=r();this.debug&&console.log("FileAttributes:","\n","Material Library",V&l.MATERIAL_LIBRARY?!0:!1);var v=[];if(_&l.MATERIAL_LIBRARY){var h=r();this.debug&&console.log("Material Count",h);for(var C=0;h>C;++C){var O=E();this.debug&&console.log("MaterialAttributes:","\n","Illumination Model",O&f.ILLUMINATION_MODEL?!0:!1,"\n","Specular Exponent",O&f.SPECULAR_EXPONENT?!0:!1,"\n","Optical Density",O&f.OPTICAL_DENSITY?!0:!1,"\n","Dissolve",O&f.DISSOLVE?!0:!1,"\n","Transmission Filter",O&f.TRANSMISSION_FILTER?!0:!1,"\n","Ambient Reflectance",O&f.AMBIENT_REFLECTANCE?!0:!1,"\n","Diffuse Reflectance",O&f.DIFFUSE_REFLECTANCE?!0:!1,"\n","Specular Reflectance",O&f.SPECULAR_REFLECTANCE?!0:!1,"\n","Ambient Map",O&f.AMBIENT_MAP?!0:!1,"\n","Diffuse Map",O&f.DIFFUSE_MAP?!0:!1,"\n","Specular Map",O&f.SPECULAR_MAP?!0:!1,"\n","Dissolve Map",O&f.DISSOLVE_MAP?!0:!1,"\n","Bump Map",O&f.BUMP_MAP?!0:!1,"\n","Displacement Map",O&f.DISPLACEMENT_MAP?!0:!1,"\n","Face Culling",O&f.FACE_CULLING?!0:!1,"\n","Light Map",O&f.LIGHT_MAP?!0:!1);var F={};if(F.name=a(r()),this.debug&&console.log("Material Name",F.name),O&f.ILLUMINATION_MODEL&&t(),O&f.SPECULAR_EXPONENT&&(F.shininess=n(),this.debug&&console.log("Specular Exponent",F.shininess)),O&f.OPTICAL_DENSITY&&n(),O&f.DISSOLVE&&(F.opacity=n(),F.transparent=!0,this.debug&&console.log("Dissolve",F.opacity)),O&f.TRANSMISSION_FILTER&&(n(),n(),n()),O&f.AMBIENT_REFLECTANCE&&(n(),n(),n()),O&f.DIFFUSE_REFLECTANCE&&(F.color=new THREE.Color(n(),n(),n()),this.debug&&console.log("Diffuse Reflectance",F.color)),O&f.SPECULAR_REFLECTANCE&&(F.specular=new THREE.Color(n(),n(),n()),this.debug&&console.log("Specular Reflectance",F.specular)),O&f.EMISSIVE_REFLECTANCE&&(F.emissive=new THREE.Color(n(),n(),n()),this.debug&&console.log("Emissive Reflectance",F.emissive)),O&f.AMBIENT_MAP){var b=r();b&R.PATH&&a(r()),b&R.SCALE&&(n(),n()),b&R.OFFSET&&(n(),n())}if(O&f.DIFFUSE_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),F.map=H,this.debug&&b&R.PATH&&console.log("Diffuse Map",H)}if(O&f.SPECULAR_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),F.specularMap=H}if(O&f.EMISSIVE_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),F.emissiveMap=H}if(O&f.DISSOLVE_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),F.alphaMap=H,F.transparent=!0}if(O&f.BUMP_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),b&R.BUMP_SCALE&&(F.bumpScale=n()),F.bumpMap=H}if(O&f.DISPLACEMENT_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),b&R.DISPLACEMENT_SCALE&&(F.displacementScale=n()),F.displacementMap=H}if(O&f.FACE_CULLING){var m=t();m===A.ALL?F.visible=!1:F.side=m===A.FRONT?THREE.BackSide:m===A.BACK?THREE.FrontSide:THREE.DoubleSide}if(O&f.LIGHT_MAP){var b=r(),H=T(b&R.PATH?a(r()):"");b&R.SCALE&&H.repeat.set(n(),n()),b&R.OFFSET&&H.offset.set(n(),n()),b&R.LIGHTMAP_INTENSITY&&(F.lightMapIntensity=n()),F.lightMap=H}var U=new THREE.MeshPhongMaterial(F);v.push(U)}}var B=r();this.debug&&console.log("Asset Count",B);for(var D=0;B>D;++D){var y=r();this.debug&&console.log("AssetAttributes:","\n","Name",y&u.NAME?!0:!1);var w=p;if(g&&(w=new THREE.Group,p.push(w)),y&u.NAME){var G=a(r());this.debug&&console.log("Asset Name",G),g||(w.name=G)}var Y=r();this.debug&&console.log("Object Count",Y);for(var C=0;Y>C;++C){var V=r();this.debug&&console.log("ObjectAttributes:","\n","Geometry",V&L.GEOMETRY?!0:!1);var x={};if(V&L.GEOMETRY){var X=r();this.debug&&console.log("GeometryAttributes:","\n","Normal",X&S.NORMAL?!0:!1,"\n","UV1",X&S.UV1?!0:!1,"\n","UV2",X&S.UV2?!0:!1);var j=E();this.debug&&console.log("Vertex Count",j),x.positions=i(3*j),X&S.NORMAL&&(x.normals=i(3*j)),X&S.UV1&&(x.uvs=i(2*j)),X&S.UV2&&(x.uvs2=i(2*j))}var K=r();this.debug&&console.log("Group Count",K);for(var k=0;K>k;++k){var W=r();this.debug&&console.log("GroupAttributes:","\n","Index",W&M.INDEX?!0:!1,"\n","Smoothing",W&M.SMOOTHING?!0:!1,"\n","Material",W&M.MATERIAL?!0:!1);var q;if(W&M.NAME&&(q=a(r()),this.debug&&console.log("Group Name",q)),V&L.GEOMETRY){var z;if(W&M.INDEX){var J=E();this.debug&&console.log("Index Count",J),z=o(J)}var Q=W&M.SMOOTHING?t():0;this.debug&&W&M.SMOOTHING&&console.log("Smoothing",Q);var Z=new THREE.BufferGeometry;x.positions&&Z.addAttribute("position",new THREE.BufferAttribute(x.positions,3)),x.normals?Z.addAttribute("normal",new THREE.BufferAttribute(x.normals,3)):Z.computeVertexNormals(),x.uvs&&Z.addAttribute("uv",new THREE.BufferAttribute(x.uvs,2)),x.uvs2&&Z.addAttribute("uv2",new THREE.BufferAttribute(x.uvs2,2)),z&&Z.setIndex(new THREE.BufferAttribute(z,1)),Z.addGroup(0,1,0);var U;if(W&M.MATERIAL){var $=r();U=v[$].clone()||new THREE.MeshPhongMaterial,void 0!==U.flatShading?U.flatShading=0>=Q:U.shading=Q>0?THREE.SmoothShading:THREE.FlatShading,this.debug&&console.log("Group Material",$,U)}var et=new THREE.Mesh(Z,U);q&&(et.name=q),w.add(et)}}}}return this.performanceTimer&&console.timeEnd("BOMLoader"),p}},THREE.BOMLoaderUtil=THREE.BOMLoaderUtil||{},THREE.BOMLoaderUtil.multiload=function(e,t){function r(e,r){var a=new THREE.BOMLoader;a.setTexturePath(r.url.split("/").slice(0,-1).join("/")+"/"),void 0!==r.debug&&a.setDebug(r.debug),void 0!==r.timer&&a.setPerfTimer(r.timer),void 0!==r.crossOrigin&&a.setCrossOrigin(r.crossOrigin),void 0!==r.responseType&&a.setResponseType(r.responseType),a.load(r.url,function(a){r.object=a,n[e]=r,0>=--E&&t(n)})}e=e.constructor===Array?e:[e];for(var E=e.length,n=[],a=0;e.length>a;++a)r(a,e[a])}; \ No newline at end of file