diff --git a/examples/js/loaders/BOMLoader.js b/examples/js/loaders/BOMLoader.js index f556b4d..046fbbc 100644 --- a/examples/js/loaders/BOMLoader.js +++ b/examples/js/loaders/BOMLoader.js @@ -86,6 +86,13 @@ THREE.BOMLoader.prototype = { }, + AssetDataAttribute = { + + NONE: 1 << 0, + NAME: 1 << 1 + + }, + GroupDataAttribute = { NONE: 1 << 0, @@ -99,8 +106,7 @@ THREE.BOMLoader.prototype = { ObjectDataAttribute = { NONE: 1 << 0, - NAME: 1 << 1, - GEOMETRY: 1 << 2 + GEOMETRY: 1 << 1 }, @@ -146,7 +152,7 @@ THREE.BOMLoader.prototype = { }; - var view = new DataView( buffer ), pos = 0, isArrayContainer = ( this.responseType === 'array' ), containers = ( isArrayContainer ? [] : new THREE.Group() ); + var view = new DataView( buffer ), pos = 0, isAssetArray = ( this.responseType === 'array' ), assets = ( isAssetArray ? [] : new THREE.Group() ); function readUint8 () { @@ -499,160 +505,169 @@ THREE.BOMLoader.prototype = { } - // Object Count - var objectCount = readUint16(); - if ( this.debug ) console.log( 'Object Count', objectCount ); + // Asset Count + var assetCount = readUint16(); + if ( this.debug ) console.log( 'Asset Count', assetCount ); - for ( var i = 0; i < objectCount; ++i ) { + for ( var a = 0; a < assetCount; ++a ) { - // Object Data Attributes - var objectAttributes = readUint16(); + // Asset Data Attributes + var assetAttributes = readUint16(); if ( this.debug ) { console.log( - 'ObjectAttributes:', '\n', - 'Name', ( objectAttributes & ObjectDataAttribute.NAME ) ? true : false, '\n', - 'Geometry', ( objectAttributes & ObjectDataAttribute.GEOMETRY ) ? true : false + 'AssetAttributes:', '\n', + 'Name', ( assetAttributes & AssetDataAttribute.NAME ) ? true : false ); } - var object = new THREE.Group(); + var asset = assets; + if ( isAssetArray ) { - // Container ID - var containerId = readUint32(); - if ( isArrayContainer ) { + asset = new THREE.Group(); + assets.push( asset ); - if ( containerId >= containers.length ) containers.push( new THREE.Group() ); - containers[ containerId ].add( object ); + } - } else { + // Asset Name + if ( assetAttributes & AssetDataAttribute.NAME ) { - if ( containerId >= containers.children.length ) containers.add( new THREE.Group() ); - containers.children[ containerId ].add( object ); + var assetName = readString( readUint16() ); + if ( this.debug ) console.log( 'Asset Name', assetName ); + if ( !isAssetArray ) asset.name = assetName; } - // Object Name - if ( objectAttributes & ObjectDataAttribute.NAME ) { + // Object Count + var objectCount = readUint16(); + if ( this.debug ) console.log( 'Object Count', objectCount ); - var objectName = readString( readUint16() ); - if ( this.debug ) console.log( 'Object Name', objectName ); - object.name = objectName; + for ( var i = 0; i < objectCount; ++i ) { - } - - var vertices = {}; - if ( objectAttributes & ObjectDataAttribute.GEOMETRY ) { + // Object Data Attributes + var objectAttributes = readUint16(); - // Geometry Data Attributes - var geometryAttributes = readUint16(); if ( this.debug ) { console.log( - 'GeometryAttributes:', '\n', - 'Normal', ( geometryAttributes & GeometryDataAttribute.NORMAL ) ? true : false, '\n', - 'UV', ( geometryAttributes & GeometryDataAttribute.UV ) ? true : false + 'ObjectAttributes:', '\n', + 'Geometry', ( objectAttributes & ObjectDataAttribute.GEOMETRY ) ? true : false ); } - // Vertex Count - var vertexCount = readUint32(); - if ( this.debug ) console.log( 'Vertex Count', vertexCount ); - - // Vertex Positions - vertices.positions = readFloat32Array( vertexCount * 3 ); + var vertices = {}; + if ( objectAttributes & ObjectDataAttribute.GEOMETRY ) { - // Vertex Normals - if ( geometryAttributes & GeometryDataAttribute.NORMAL ) vertices.normals = readFloat32Array( vertexCount * 3 ); + // Geometry Data Attributes + var geometryAttributes = readUint16(); + if ( this.debug ) { - // Vertex UVs - if ( geometryAttributes & GeometryDataAttribute.UV ) vertices.uvs = readFloat32Array( vertexCount * 2 ); + console.log( - } + 'GeometryAttributes:', '\n', + 'Normal', ( geometryAttributes & GeometryDataAttribute.NORMAL ) ? true : false, '\n', + 'UV', ( geometryAttributes & GeometryDataAttribute.UV ) ? true : false - // Group Count - var groupCount = readUint16(); - if ( this.debug ) console.log( 'Group Count', groupCount ); + ); - for ( var j = 0; j < groupCount; ++j ) { + } - // Group Data Attributes - var groupAttributes = readUint16(); - if ( this.debug ) { + // Vertex Count + var vertexCount = readUint32(); + if ( this.debug ) console.log( 'Vertex Count', vertexCount ); - console.log( + // Vertex Positions + vertices.positions = readFloat32Array( vertexCount * 3 ); - 'GroupAttributes:', '\n', - 'Index', ( groupAttributes & GroupDataAttribute.INDEX ) ? true : false, '\n', - 'Smoothing', ( groupAttributes & GroupDataAttribute.SMOOTHING ) ? true : false, '\n', - 'Material', ( groupAttributes & GroupDataAttribute.MATERIAL ) ? true : false + // Vertex Normals + if ( geometryAttributes & GeometryDataAttribute.NORMAL ) vertices.normals = readFloat32Array( vertexCount * 3 ); - ); + // Vertex UVs + if ( geometryAttributes & GeometryDataAttribute.UV ) vertices.uvs = readFloat32Array( vertexCount * 2 ); } - // Group Name - var groupName; - if ( groupAttributes & GroupDataAttribute.NAME ) { + // Group Count + var groupCount = readUint16(); + if ( this.debug ) console.log( 'Group Count', groupCount ); - groupName = readString( readUint16() ); - if ( this.debug ) console.log( 'Group Name', groupName ); + for ( var j = 0; j < groupCount; ++j ) { - } + // Group Data Attributes + var groupAttributes = readUint16(); + if ( this.debug ) { - var group; + console.log( - if ( objectAttributes & ObjectDataAttribute.GEOMETRY ) { + 'GroupAttributes:', '\n', + 'Index', ( groupAttributes & GroupDataAttribute.INDEX ) ? true : false, '\n', + 'Smoothing', ( groupAttributes & GroupDataAttribute.SMOOTHING ) ? true : false, '\n', + 'Material', ( groupAttributes & GroupDataAttribute.MATERIAL ) ? true : false + + ); - // Indices - var indices; - if ( groupAttributes & GroupDataAttribute.INDEX ) { + } - // Index Count - var indexCount = readUint32(); - if ( this.debug ) console.log( 'Index Count', indexCount ); + // Group Name + var groupName; + if ( groupAttributes & GroupDataAttribute.NAME ) { - // Indices - indices = readUint16Array( indexCount ); + groupName = readString( readUint16() ); + if ( this.debug ) console.log( 'Group Name', groupName ); } - // Smoothing - var smoothing = ( groupAttributes & GroupDataAttribute.SMOOTHING ) ? readUint8() : 0; - if ( this.debug && ( groupAttributes & GroupDataAttribute.SMOOTHING ) ) console.log( 'Smoothing', smoothing ); + if ( objectAttributes & ObjectDataAttribute.GEOMETRY ) { - var geometry = new THREE.BufferGeometry(); - if ( vertices.positions ) geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices.positions, 3 ) ); - vertices.normals ? geometry.addAttribute( 'normal', new THREE.BufferAttribute( vertices.normals, 3 ) ) : geometry.computeVertexNormals(); - if ( vertices.uvs ) geometry.addAttribute( 'uv', new THREE.BufferAttribute( vertices.uvs, 2 ) ); - if ( indices ) geometry.setIndex( new THREE.BufferAttribute( indices, 1 ) ); - geometry.addGroup( 0, 1, 0 ); + // Indices + var indices; + if ( groupAttributes & GroupDataAttribute.INDEX ) { - var material; - if ( groupAttributes & GroupDataAttribute.MATERIAL ) { + // Index Count + var indexCount = readUint32(); + if ( this.debug ) console.log( 'Index Count', indexCount ); - // Material ID - var materialId = readUint16(); - material = materials[ materialId ].clone() || new THREE.MeshPhongMaterial(); - material.shading = ( smoothing > 0 ) ? THREE.SmoothShading : THREE.FlatShading; - if ( this.debug ) console.log( 'Group Material', materialId, material ); + // Indices + indices = readUint16Array( indexCount ); - } + } - group = new THREE.Mesh( geometry, material ); + // Smoothing + var smoothing = ( groupAttributes & GroupDataAttribute.SMOOTHING ) ? readUint8() : 0; + if ( this.debug && ( groupAttributes & GroupDataAttribute.SMOOTHING ) ) console.log( 'Smoothing', smoothing ); - } + var geometry = new THREE.BufferGeometry(); + if ( vertices.positions ) geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices.positions, 3 ) ); + vertices.normals ? geometry.addAttribute( 'normal', new THREE.BufferAttribute( vertices.normals, 3 ) ) : geometry.computeVertexNormals(); + if ( vertices.uvs ) geometry.addAttribute( 'uv', new THREE.BufferAttribute( vertices.uvs, 2 ) ); + if ( indices ) geometry.setIndex( new THREE.BufferAttribute( indices, 1 ) ); + geometry.addGroup( 0, 1, 0 ); + + var material; + if ( groupAttributes & GroupDataAttribute.MATERIAL ) { + + // Material ID + var materialId = readUint16(); + material = materials[ materialId ].clone() || new THREE.MeshPhongMaterial(); + material.shading = ( smoothing > 0 ) ? THREE.SmoothShading : THREE.FlatShading; + if ( this.debug ) console.log( 'Group Material', materialId, material ); + + } - if ( group === undefined ) group = new THREE.Group(); - if ( groupName ) group.name = groupName; - object.add( group ); + var mesh = new THREE.Mesh( geometry, material ); + if ( groupName ) mesh.name = groupName; + asset.add( mesh ); + + } + + } } @@ -660,7 +675,7 @@ THREE.BOMLoader.prototype = { if ( this.performanceTimer ) console.timeEnd( 'BOMLoader' ); - return containers; + return assets; } diff --git a/examples/js/loaders/BOMLoader.min.js b/examples/js/loaders/BOMLoader.min.js index 248bc58..360aa14 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,o=THREE.FileLoader?new THREE.FileLoader(this.manager):new THREE.XHRLoader(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.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(f);return f+=Uint8Array.BYTES_PER_ELEMENT,e}function r(){var e=c.getUint16(f,!0);return f+=Uint16Array.BYTES_PER_ELEMENT,e}function E(){var e=c.getUint32(f,!0);return f+=Uint32Array.BYTES_PER_ELEMENT,e}function n(){var e=c.getFloat32(f,!0);return f+=Float32Array.BYTES_PER_ELEMENT,e}function o(e){var t=String.fromCharCode.apply(null,e>0?new Uint8Array(c.buffer,f,e):new Uint8Array);return f+=Uint8Array.BYTES_PER_ELEMENT*e,t}function a(e){if(0===f%Uint16Array.BYTES_PER_ELEMENT){var t=new Uint16Array(c.buffer,f,e);return f+=Uint16Array.BYTES_PER_ELEMENT*e,t}for(var t=new Uint16Array(e),r=0;e>r;++r,f+=Uint16Array.BYTES_PER_ELEMENT)t[r]=c.getUint16(f,!0);return t}function i(e){if(0===f%Float32Array.BYTES_PER_ELEMENT){var t=new Float32Array(c.buffer,f,e);return f+=Float32Array.BYTES_PER_ELEMENT*e,t}for(var t=new Float32Array(e),r=0;e>r;++r,f+=Float32Array.BYTES_PER_ELEMENT)t[r]=c.getFloat32(f,!0);return t}function s(e){return"string"!=typeof e||""===e?"":/^https?:\/\//i.test(e)?e:(d.texturePath||d.path||"")+e}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(d.manager)),r.setCrossOrigin(d.crossOrigin),t=r.load(e)}return t.side=THREE.FrontSide,t.wrapS=t.wrapT=THREE.RepeatWrapping,t}this.performanceTimer&&console.time("BOMLoader");var l={NONE:0,FRONT:1,BACK:2,ALL:3},A={NONE:1,MATERIAL_LIBRARY:2},u={NONE:1,NAME:2,INDEX:4,SMOOTHING:8,MATERIAL:16},M={NONE:1,NAME:2,GEOMETRY:4},L={NONE:1,NORMAL:2,UV:4},R={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},S={NONE:1,PATH:2,SCALE:4,OFFSET:8,BUMP_SCALE:16,DISPLACEMENT_SCALE:32},c=new DataView(e),f=0,p="array"===this.responseType,N=p?[]:new THREE.Group,d=this,g=o(3);this.debug&&console.log("File Signature",g);var I=t();this.debug&&console.log("Version",I);var P=r();this.debug&&console.log("FileAttributes:","\n","Material Library",B&A.MATERIAL_LIBRARY?!0:!1);var _=[];if(P&A.MATERIAL_LIBRARY){var C=r();this.debug&&console.log("Material Count",C);for(var O=0;C>O;++O){var h=E();this.debug&&console.log("MaterialAttributes:","\n","Illumination Model",h&R.ILLUMINATION_MODEL?!0:!1,"\n","Specular Exponent",h&R.SPECULAR_EXPONENT?!0:!1,"\n","Optical Density",h&R.OPTICAL_DENSITY?!0:!1,"\n","Dissolve",h&R.DISSOLVE?!0:!1,"\n","Transmission Filter",h&R.TRANSMISSION_FILTER?!0:!1,"\n","Ambient Reflectance",h&R.AMBIENT_REFLECTANCE?!0:!1,"\n","Diffuse Reflectance",h&R.DIFFUSE_REFLECTANCE?!0:!1,"\n","Specular Reflectance",h&R.SPECULAR_REFLECTANCE?!0:!1,"\n","Ambient Map",h&R.AMBIENT_MAP?!0:!1,"\n","Diffuse Map",h&R.DIFFUSE_MAP?!0:!1,"\n","Specular Map",h&R.SPECULAR_MAP?!0:!1,"\n","Dissolve Map",h&R.DISSOLVE_MAP?!0:!1,"\n","Bump Map",h&R.BUMP_MAP?!0:!1,"\n","Displacement Map",h&R.DISPLACEMENT_MAP?!0:!1,"\n","Face Culling",h&R.FACE_CULLING?!0:!1);var v={};if(v.name=o(r()),this.debug&&console.log("Material Name",v.name),h&R.ILLUMINATION_MODEL&&t(),h&R.SPECULAR_EXPONENT&&(v.shininess=n(),this.debug&&console.log("Specular Exponent",v.shininess)),h&R.OPTICAL_DENSITY&&n(),h&R.DISSOLVE&&(v.opacity=n(),v.transparent=!0,this.debug&&console.log("Dissolve",v.opacity)),h&R.TRANSMISSION_FILTER&&(n(),n(),n()),h&R.AMBIENT_REFLECTANCE&&(n(),n(),n()),h&R.DIFFUSE_REFLECTANCE&&(v.color=new THREE.Color(n(),n(),n()),this.debug&&console.log("Diffuse Reflectance",v.color)),h&R.SPECULAR_REFLECTANCE&&(v.specular=new THREE.Color(n(),n(),n()),this.debug&&console.log("Specular Reflectance",v.specular)),h&R.EMISSIVE_REFLECTANCE&&(v.emissive=new THREE.Color(n(),n(),n()),this.debug&&console.log("Emissive Reflectance",v.emissive)),h&R.AMBIENT_MAP){var F=r();F&S.PATH&&o(r()),F&S.SCALE&&(n(),n()),F&S.OFFSET&&(n(),n())}if(h&R.DIFFUSE_MAP){var F=r(),b=T(F&S.PATH?o(r()):"");F&S.SCALE&&b.repeat.set(n(),n()),F&S.OFFSET&&b.offset.set(n(),n()),v.map=b,this.debug&&F&S.PATH&&console.log("Diffuse Map",b)}if(h&R.SPECULAR_MAP){var F=r(),b=T(F&S.PATH?o(r()):"");F&S.SCALE&&b.repeat.set(n(),n()),F&S.OFFSET&&b.offset.set(n(),n()),v.specularMap=b}if(h&R.EMISSIVE_MAP){var F=r(),b=T(F&S.PATH?o(r()):"");F&S.SCALE&&b.repeat.set(n(),n()),F&S.OFFSET&&b.offset.set(n(),n()),v.emissiveMap=b}if(h&R.DISSOLVE_MAP){var F=r(),b=T(F&S.PATH?o(r()):"");F&S.SCALE&&b.repeat.set(n(),n()),F&S.OFFSET&&b.offset.set(n(),n()),v.alphaMap=b,v.transparent=!0}if(h&R.BUMP_MAP){var F=r(),b=T(F&S.PATH?o(r()):"");F&S.SCALE&&b.repeat.set(n(),n()),F&S.OFFSET&&b.offset.set(n(),n()),F&S.BUMP_SCALE&&(v.bumpScale=n()),v.bumpMap=b}if(h&R.DISPLACEMENT_MAP){var F=r(),b=T(F&S.PATH?o(r()):"");F&S.SCALE&&b.repeat.set(n(),n()),F&S.OFFSET&&b.offset.set(n(),n()),F&S.DISPLACEMENT_SCALE&&(v.displacementScale=n()),v.displacementMap=b}if(h&R.FACE_CULLING){var m=t();m===l.ALL?v.visible=!1:v.side=m===l.FRONT?THREE.BackSide:m===l.BACK?THREE.FrontSide:THREE.DoubleSide}var H=new THREE.MeshPhongMaterial(v);_.push(H)}}var U=r();this.debug&&console.log("Object Count",U);for(var O=0;U>O;++O){var B=r();this.debug&&console.log("ObjectAttributes:","\n","Name",B&M.NAME?!0:!1,"\n","Geometry",B&M.GEOMETRY?!0:!1);var D=new THREE.Group,y=E();if(p?(y>=N.length&&N.push(new THREE.Group),N[y].add(D)):(y>=N.children.length&&N.add(new THREE.Group),N.children[y].add(D)),B&M.NAME){var w=o(r());this.debug&&console.log("Object Name",w),D.name=w}var G={};if(B&M.GEOMETRY){var Y=r();this.debug&&console.log("GeometryAttributes:","\n","Normal",Y&L.NORMAL?!0:!1,"\n","UV",Y&L.UV?!0:!1);var V=E();this.debug&&console.log("Vertex Count",V),G.positions=i(3*V),Y&L.NORMAL&&(G.normals=i(3*V)),Y&L.UV&&(G.uvs=i(2*V))}var x=r();this.debug&&console.log("Group Count",x);for(var X=0;x>X;++X){var j=r();this.debug&&console.log("GroupAttributes:","\n","Index",j&u.INDEX?!0:!1,"\n","Smoothing",j&u.SMOOTHING?!0:!1,"\n","Material",j&u.MATERIAL?!0:!1);var K;j&u.NAME&&(K=o(r()),this.debug&&console.log("Group Name",K));var k;if(B&M.GEOMETRY){var W;if(j&u.INDEX){var q=E();this.debug&&console.log("Index Count",q),W=a(q)}var z=j&u.SMOOTHING?t():0;this.debug&&j&u.SMOOTHING&&console.log("Smoothing",z);var J=new THREE.BufferGeometry;G.positions&&J.addAttribute("position",new THREE.BufferAttribute(G.positions,3)),G.normals?J.addAttribute("normal",new THREE.BufferAttribute(G.normals,3)):J.computeVertexNormals(),G.uvs&&J.addAttribute("uv",new THREE.BufferAttribute(G.uvs,2)),W&&J.setIndex(new THREE.BufferAttribute(W,1)),J.addGroup(0,1,0);var H;if(j&u.MATERIAL){var Q=r();H=_[Q].clone()||new THREE.MeshPhongMaterial,H.shading=z>0?THREE.SmoothShading:THREE.FlatShading,this.debug&&console.log("Group Material",Q,H)}k=new THREE.Mesh(J,H)}void 0===k&&(k=new THREE.Group),K&&(k.name=K),D.add(k)}}return this.performanceTimer&&console.timeEnd("BOMLoader"),N}},THREE.BOMLoaderUtil=THREE.BOMLoaderUtil||{},THREE.BOMLoaderUtil.multiload=function(e,t){function r(e,r){var o=new THREE.BOMLoader;o.setTexturePath(r.url.split("/").slice(0,-1).join("/")+"/"),void 0!==r.debug&&o.setDebug(r.debug),void 0!==r.timer&&o.setPerfTimer(r.timer),void 0!==r.crossOrigin&&o.setCrossOrigin(r.crossOrigin),void 0!==r.responseType&&o.setResponseType(r.responseType),o.load(r.url,function(o){r.object=o,n[e]=r,0>=--E&&t(n)})}e=e.constructor===Array?e:[e];for(var E=e.length,n=[],o=0;e.length>o;++o)r(o,e[o])}; \ 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,o=THREE.FileLoader?new THREE.FileLoader(this.manager):new THREE.XHRLoader(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.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=f.getUint8(N);return N+=Uint8Array.BYTES_PER_ELEMENT,e}function r(){var e=f.getUint16(N,!0);return N+=Uint16Array.BYTES_PER_ELEMENT,e}function E(){var e=f.getUint32(N,!0);return N+=Uint32Array.BYTES_PER_ELEMENT,e}function n(){var e=f.getFloat32(N,!0);return N+=Float32Array.BYTES_PER_ELEMENT,e}function o(e){var t=String.fromCharCode.apply(null,e>0?new Uint8Array(f.buffer,N,e):new Uint8Array);return N+=Uint8Array.BYTES_PER_ELEMENT*e,t}function a(e){if(0===N%Uint16Array.BYTES_PER_ELEMENT){var t=new Uint16Array(f.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]=f.getUint16(N,!0);return t}function i(e){if(0===N%Float32Array.BYTES_PER_ELEMENT){var t=new Float32Array(f.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]=f.getFloat32(N,!0);return t}function s(e){return"string"!=typeof e||""===e?"":/^https?:\/\//i.test(e)?e:(d.texturePath||d.path||"")+e}function A(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(d.manager)),r.setCrossOrigin(d.crossOrigin),t=r.load(e)}return t.side=THREE.FrontSide,t.wrapS=t.wrapT=THREE.RepeatWrapping,t}this.performanceTimer&&console.time("BOMLoader");var T={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,UV:4},R={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},c={NONE:1,PATH:2,SCALE:4,OFFSET:8,BUMP_SCALE:16,DISPLACEMENT_SCALE:32},f=new DataView(e),N=0,p="array"===this.responseType,g=p?[]:new THREE.Group,d=this,I=o(3);this.debug&&console.log("File Signature",I);var C=t();this.debug&&console.log("Version",C);var P=r();this.debug&&console.log("FileAttributes:","\n","Material Library",V&l.MATERIAL_LIBRARY?!0:!1);var _=[];if(P&l.MATERIAL_LIBRARY){var O=r();this.debug&&console.log("Material Count",O);for(var v=0;O>v;++v){var h=E();this.debug&&console.log("MaterialAttributes:","\n","Illumination Model",h&R.ILLUMINATION_MODEL?!0:!1,"\n","Specular Exponent",h&R.SPECULAR_EXPONENT?!0:!1,"\n","Optical Density",h&R.OPTICAL_DENSITY?!0:!1,"\n","Dissolve",h&R.DISSOLVE?!0:!1,"\n","Transmission Filter",h&R.TRANSMISSION_FILTER?!0:!1,"\n","Ambient Reflectance",h&R.AMBIENT_REFLECTANCE?!0:!1,"\n","Diffuse Reflectance",h&R.DIFFUSE_REFLECTANCE?!0:!1,"\n","Specular Reflectance",h&R.SPECULAR_REFLECTANCE?!0:!1,"\n","Ambient Map",h&R.AMBIENT_MAP?!0:!1,"\n","Diffuse Map",h&R.DIFFUSE_MAP?!0:!1,"\n","Specular Map",h&R.SPECULAR_MAP?!0:!1,"\n","Dissolve Map",h&R.DISSOLVE_MAP?!0:!1,"\n","Bump Map",h&R.BUMP_MAP?!0:!1,"\n","Displacement Map",h&R.DISPLACEMENT_MAP?!0:!1,"\n","Face Culling",h&R.FACE_CULLING?!0:!1);var F={};if(F.name=o(r()),this.debug&&console.log("Material Name",F.name),h&R.ILLUMINATION_MODEL&&t(),h&R.SPECULAR_EXPONENT&&(F.shininess=n(),this.debug&&console.log("Specular Exponent",F.shininess)),h&R.OPTICAL_DENSITY&&n(),h&R.DISSOLVE&&(F.opacity=n(),F.transparent=!0,this.debug&&console.log("Dissolve",F.opacity)),h&R.TRANSMISSION_FILTER&&(n(),n(),n()),h&R.AMBIENT_REFLECTANCE&&(n(),n(),n()),h&R.DIFFUSE_REFLECTANCE&&(F.color=new THREE.Color(n(),n(),n()),this.debug&&console.log("Diffuse Reflectance",F.color)),h&R.SPECULAR_REFLECTANCE&&(F.specular=new THREE.Color(n(),n(),n()),this.debug&&console.log("Specular Reflectance",F.specular)),h&R.EMISSIVE_REFLECTANCE&&(F.emissive=new THREE.Color(n(),n(),n()),this.debug&&console.log("Emissive Reflectance",F.emissive)),h&R.AMBIENT_MAP){var b=r();b&c.PATH&&o(r()),b&c.SCALE&&(n(),n()),b&c.OFFSET&&(n(),n())}if(h&R.DIFFUSE_MAP){var b=r(),m=A(b&c.PATH?o(r()):"");b&c.SCALE&&m.repeat.set(n(),n()),b&c.OFFSET&&m.offset.set(n(),n()),F.map=m,this.debug&&b&c.PATH&&console.log("Diffuse Map",m)}if(h&R.SPECULAR_MAP){var b=r(),m=A(b&c.PATH?o(r()):"");b&c.SCALE&&m.repeat.set(n(),n()),b&c.OFFSET&&m.offset.set(n(),n()),F.specularMap=m}if(h&R.EMISSIVE_MAP){var b=r(),m=A(b&c.PATH?o(r()):"");b&c.SCALE&&m.repeat.set(n(),n()),b&c.OFFSET&&m.offset.set(n(),n()),F.emissiveMap=m}if(h&R.DISSOLVE_MAP){var b=r(),m=A(b&c.PATH?o(r()):"");b&c.SCALE&&m.repeat.set(n(),n()),b&c.OFFSET&&m.offset.set(n(),n()),F.alphaMap=m,F.transparent=!0}if(h&R.BUMP_MAP){var b=r(),m=A(b&c.PATH?o(r()):"");b&c.SCALE&&m.repeat.set(n(),n()),b&c.OFFSET&&m.offset.set(n(),n()),b&c.BUMP_SCALE&&(F.bumpScale=n()),F.bumpMap=m}if(h&R.DISPLACEMENT_MAP){var b=r(),m=A(b&c.PATH?o(r()):"");b&c.SCALE&&m.repeat.set(n(),n()),b&c.OFFSET&&m.offset.set(n(),n()),b&c.DISPLACEMENT_SCALE&&(F.displacementScale=n()),F.displacementMap=m}if(h&R.FACE_CULLING){var H=t();H===T.ALL?F.visible=!1:F.side=H===T.FRONT?THREE.BackSide:H===T.BACK?THREE.FrontSide:THREE.DoubleSide}var U=new THREE.MeshPhongMaterial(F);_.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=g;if(p&&(w=new THREE.Group,g.push(w)),y&u.NAME){var G=o(r());this.debug&&console.log("Asset Name",G),p||(w.name=G)}var Y=r();this.debug&&console.log("Object Count",Y);for(var v=0;Y>v;++v){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","UV",X&S.UV?!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.UV&&(x.uvs=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=o(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=a(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)),z&&Z.setIndex(new THREE.BufferAttribute(z,1)),Z.addGroup(0,1,0);var U;if(W&M.MATERIAL){var $=r();U=_[$].clone()||new THREE.MeshPhongMaterial,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"),g}},THREE.BOMLoaderUtil=THREE.BOMLoaderUtil||{},THREE.BOMLoaderUtil.multiload=function(e,t){function r(e,r){var o=new THREE.BOMLoader;o.setTexturePath(r.url.split("/").slice(0,-1).join("/")+"/"),void 0!==r.debug&&o.setDebug(r.debug),void 0!==r.timer&&o.setPerfTimer(r.timer),void 0!==r.crossOrigin&&o.setCrossOrigin(r.crossOrigin),void 0!==r.responseType&&o.setResponseType(r.responseType),o.load(r.url,function(o){r.object=o,n[e]=r,0>=--E&&t(n)})}e=e.constructor===Array?e:[e];for(var E=e.length,n=[],o=0;e.length>o;++o)r(o,e[o])}; \ No newline at end of file