From 85582c6174c70bae04f949654541c7dd91e6597a Mon Sep 17 00:00:00 2001 From: David Cormack Date: Wed, 25 Jan 2017 18:28:40 +0000 Subject: [PATCH] Initial commit. --- examples/js/loaders/BOMLoader.js | 627 +++++++++++++++++++++++++++ examples/js/loaders/BOMLoader.min.js | 1 + minify.bat | 2 + 3 files changed, 630 insertions(+) create mode 100644 examples/js/loaders/BOMLoader.js create mode 100644 examples/js/loaders/BOMLoader.min.js create mode 100644 minify.bat diff --git a/examples/js/loaders/BOMLoader.js b/examples/js/loaders/BOMLoader.js new file mode 100644 index 0000000..f86f0d8 --- /dev/null +++ b/examples/js/loaders/BOMLoader.js @@ -0,0 +1,627 @@ +/** + * BOM (Binary Object/Material) provides a subset of Wavefront OBJ and MTL functionality to + * load indexed triangulated geometry and basic materials from a compact binary representation. + * + * @author Genesis / https://github.com/NGenesis/ + */ + +THREE.BOMLoader = function( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +} + +THREE.BOMLoader.prototype = { + + constructor: THREE.BOMLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = THREE.FileLoader ? new THREE.FileLoader( this.manager ) : new THREE.XHRLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + onLoad( scope.parse( buffer ) ); + + }, onProgress, onError ); + + }, + + setPath: function ( value ) { + + this.path = value; + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setDebug: function ( value ) { + + this.debug = value; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + + }, + + parse: function ( buffer ) { + + console.time( 'BOMLoader' ); + + var FileDataAttribute = { + + NONE: 1 << 0, + MATERIAL_LIBRARY: 1 << 1 + + }, + + GroupDataAttribute = { + + NONE: 1 << 0, + NAME: 1 << 1, + INDEX: 1 << 2, + SMOOTHING: 1 << 3, + MATERIAL: 1 << 4 + + }, + + ObjectDataAttribute = { + + NONE: 1 << 0, + NAME: 1 << 1, + GEOMETRY: 1 << 2 + + }, + + GeometryDataAttribute = { + + NONE: 1 << 0, + NORMAL: 1 << 1, + UV: 1 << 2 + + }, + + MaterialDataAttribute = { + + NONE: 1 << 0, + ILLUMINATION_MODEL: 1 << 1, + SPECULAR_EXPONENT: 1 << 2, + OPTICAL_DENSITY: 1 << 3, + DISSOLVE: 1 << 4, + TRANSMISSION_FILTER: 1 << 5, + AMBIENT_REFLECTANCE: 1 << 6, + DIFFUSE_REFLECTANCE: 1 << 7, + SPECULAR_REFLECTANCE: 1 << 8, + EMISSIVE_REFLECTANCE: 1 << 9, + AMBIENT_MAP: 1 << 10, + DIFFUSE_MAP: 1 << 11, + SPECULAR_MAP: 1 << 12, + EMISSIVE_MAP: 1 << 13, + DISSOLVE_MAP: 1 << 14, + BUMP_MAP: 1 << 15, + DISPLACEMENT_MAP: 1 << 16 + + }; + + MapDataAttribute = { + + NONE: 1 << 0, + PATH: 1 << 1, + SCALE: 1 << 2, + OFFSET: 1 << 3, + BUMP_SCALE: 1 << 4, + DISPLACEMENT_SCALE: 1 << 5 + + }; + + var view = new DataView( buffer ), pos = 0, isArrayContainer = ( this.responseType == 'array' ), containers = ( isArrayContainer ? [] : new THREE.Group() ); + + function readUint8 () { + + var value = view.getUint8( pos ); + pos += Uint8Array.BYTES_PER_ELEMENT; + return value; + + } + + function readUint16 () { + + var value = view.getUint16( pos, true ); + pos += Uint16Array.BYTES_PER_ELEMENT; + return value; + + } + + function readUint32 () { + + var value = view.getUint32( pos, true ); + pos += Uint32Array.BYTES_PER_ELEMENT; + return value; + + } + + function readFloat32 () { + + var value = view.getFloat32( pos, true ); + pos += Float32Array.BYTES_PER_ELEMENT; + return value; + + } + + function readString ( length ) { + + var value = String.fromCharCode.apply( null, ( length > 0 ) ? new Uint8Array( view.buffer, pos, length ) : new Uint8Array() ); + pos += Uint8Array.BYTES_PER_ELEMENT * length; + return value; + + } + + function readUint16Array ( length ) { + + if ( ( pos % Uint16Array.BYTES_PER_ELEMENT ) === 0 ) { + + // Aligned Access + var value = new Uint16Array( view.buffer, pos, length ); + pos += Uint16Array.BYTES_PER_ELEMENT * length; + return value; + + } + + // Unaligned Access + var value = new Uint16Array( length ); + for ( var i = 0; i < length; ++i, pos += Uint16Array.BYTES_PER_ELEMENT ) value[ i ] = view.getUint16( pos, true ); + return value; + + } + + function readFloat32Array ( length ) { + + if ( ( pos % Float32Array.BYTES_PER_ELEMENT ) === 0 ) { + + // Aligned Access + var value = new Float32Array( view.buffer, pos, length ); + pos += Float32Array.BYTES_PER_ELEMENT * length; + return value; + + } + + // Unaligned Access + var value = new Float32Array( length ); + for ( var i = 0; i < length; ++i, pos += Float32Array.BYTES_PER_ELEMENT ) value[ i ] = view.getFloat32( pos, true ); + return value; + + } + + var scope = this; + + function resolveURL ( url ) { + + if ( typeof url !== 'string' || url === '' ) return ''; + + // Absolute URL + if ( /^https?:\/\//i.test( url ) ) return url; + + return ( scope.texturePath || scope.path || '' ) + url; + + } + + function loadTexture ( url ) { + + url = resolveURL( url ); + var loader = THREE.Loader.Handlers.get( url ); + if ( loader === null ) loader = new THREE.TextureLoader( scope.manager ); + if ( loader.setCrossOrigin ) loader.setCrossOrigin( scope.crossOrigin ); + var texture = loader.load( url ); + texture.side = THREE.FrontSide; + texture.wrapS = texture.wrapT = THREE.RepeatWrapping; + + return texture; + + } + + // File Signature + var fileSignature = readString(3); + if ( this.debug ) console.log( 'File Signature', fileSignature ); + + // Version + var version = readUint8(); + if ( this.debug ) console.log( 'Version', version ); + + // File Data Attributes + var fileAttributes = readUint16(); + if ( this.debug ) { + + console.log( + + 'FileAttributes:', '\n', + 'Material Library', ( objectAttributes & FileDataAttribute.MATERIAL_LIBRARY ) ? true : false + + ); + + } + + // Materials + var materials = []; + if ( fileAttributes & FileDataAttribute.MATERIAL_LIBRARY ) { + + // Material Count + var materialCount = readUint16(); + if ( this.debug ) console.log( 'Material Count', materialCount ); + + for ( var i = 0; i < materialCount; ++i ) { + + // Material Data Attributes + var materialAttributes = readUint32(); + if ( this.debug ) { + + console.log( + + 'MaterialAttributes:', '\n', + 'Illumination Model', ( materialAttributes & MaterialDataAttribute.ILLUMINATION_MODEL ) ? true : false, '\n', + 'Specular Exponent', ( materialAttributes & MaterialDataAttribute.SPECULAR_EXPONENT ) ? true : false, '\n', + 'Optical Density', ( materialAttributes & MaterialDataAttribute.OPTICAL_DENSITY ) ? true : false, '\n', + 'Dissolve', ( materialAttributes & MaterialDataAttribute.DISSOLVE ) ? true : false, '\n', + 'Transmission Filter', ( materialAttributes & MaterialDataAttribute.TRANSMISSION_FILTER ) ? true : false, '\n', + 'Ambient Reflectance', ( materialAttributes & MaterialDataAttribute.AMBIENT_REFLECTANCE ) ? true : false, '\n', + 'Diffuse Reflectance', ( materialAttributes & MaterialDataAttribute.DIFFUSE_REFLECTANCE ) ? true : false, '\n', + 'Specular Reflectance', ( materialAttributes & MaterialDataAttribute.SPECULAR_REFLECTANCE ) ? true : false, '\n', + 'Ambient Map', ( materialAttributes & MaterialDataAttribute.AMBIENT_MAP ) ? true : false, '\n', + 'Diffuse Map', ( materialAttributes & MaterialDataAttribute.DIFFUSE_MAP ) ? true : false, '\n', + 'Specular Map', ( materialAttributes & MaterialDataAttribute.SPECULAR_MAP ) ? true : false, '\n', + 'Dissolve Map', ( materialAttributes & MaterialDataAttribute.DISSOLVE_MAP ) ? true : false, '\n', + 'Bump Map', ( materialAttributes & MaterialDataAttribute.BUMP_MAP ) ? true : false, '\n', + 'Displacement Map', ( materialAttributes & MaterialDataAttribute.DISPLACEMENT_MAP ) ? true : false + + ); + + } + + var params = {}; + + // Material Name + params.name = readString( readUint16() ); + if ( this.debug ) console.log( 'Material Name', params.name ); + + // Illumination Model (illum) + if ( materialAttributes & MaterialDataAttribute.ILLUMINATION_MODEL ) { + + readUint8(); + // Not supported + + } + + // Specular Exponent (Ns) + if ( materialAttributes & MaterialDataAttribute.SPECULAR_EXPONENT ) { + + params.shininess = readFloat32(); + if ( this.debug ) console.log( 'Specular Exponent', params.shininess ); + + } + + // Optical Density (Ni) + if ( materialAttributes & MaterialDataAttribute.OPTICAL_DENSITY ) { + + readFloat32(); + // Not supported + + } + + // Dissolve (d / [1 - Tr]) + if ( materialAttributes & MaterialDataAttribute.DISSOLVE ) { + + params.opacity = readFloat32(); + params.transparent = true; + if ( this.debug ) console.log( 'Dissolve', params.opacity ); + + } + + // Transmission Filter (Tf) + if ( materialAttributes & MaterialDataAttribute.TRANSMISSION_FILTER ) { + + readFloat32(), readFloat32(), readFloat32(); + // Not supported + + } + + // Ambient Reflectance (Ka) + if ( materialAttributes & MaterialDataAttribute.AMBIENT_REFLECTANCE ) { + + readFloat32(), readFloat32(), readFloat32(); + // Assumes ambient and diffuse are linked + + } + + // Diffuse Reflectance (Kd) + if ( materialAttributes & MaterialDataAttribute.DIFFUSE_REFLECTANCE ) { + + params.color = new THREE.Color( readFloat32(), readFloat32(), readFloat32() ); + if ( this.debug ) console.log( 'Diffuse Reflectance', params.color ); + + } + + // Specular Reflectance (Ks) + if ( materialAttributes & MaterialDataAttribute.SPECULAR_REFLECTANCE ) { + + params.specular = new THREE.Color( readFloat32(), readFloat32(), readFloat32() ); + if ( this.debug ) console.log( 'Specular Reflectance', params.specular ); + + } + + // Emissive Reflectance (Ke) + if ( materialAttributes & MaterialDataAttribute.EMISSIVE_REFLECTANCE ) { + + params.emissive = new THREE.Color( readFloat32(), readFloat32(), readFloat32() ); + if ( this.debug ) console.log( 'Emissive Reflectance', params.emissive ); + + } + + // Ambient Map (map_Ka) + if ( materialAttributes & MaterialDataAttribute.AMBIENT_MAP ) { + + var mapDataAttributes = readUint16(); + if ( mapDataAttributes & MapDataAttribute.PATH ) readString( readUint16() ); + if ( mapDataAttributes & MapDataAttribute.SCALE ) readFloat32(), readFloat32(); + if ( mapDataAttributes & MapDataAttribute.OFFSET ) readFloat32(), readFloat32(); + // Assumes ambient and diffuse are linked + + } + + // Diffuse Map (map_Kd) + if ( materialAttributes & MaterialDataAttribute.DIFFUSE_MAP ) { + + var mapDataAttributes = readUint16(); + var map = loadTexture( ( mapDataAttributes & MapDataAttribute.PATH ) ? readString( readUint16() ) : '' ); + if ( mapDataAttributes & MapDataAttribute.SCALE ) map.repeat.set( readFloat32(), readFloat32() ); + if ( mapDataAttributes & MapDataAttribute.OFFSET ) map.offset.set( readFloat32(), readFloat32() ); + params.map = map; + if ( this.debug && ( mapDataAttributes & MapDataAttribute.PATH ) ) console.log( 'Diffuse Map', map ); + + } + + // Specular Map (map_Ks) + if ( materialAttributes & MaterialDataAttribute.SPECULAR_MAP ) { + + var mapDataAttributes = readUint16(); + var map = loadTexture( ( mapDataAttributes & MapDataAttribute.PATH ) ? readString( readUint16() ) : '' ); + if ( mapDataAttributes & MapDataAttribute.SCALE ) map.repeat.set( readFloat32(), readFloat32() ); + if ( mapDataAttributes & MapDataAttribute.OFFSET ) map.offset.set( readFloat32(), readFloat32() ); + params.specularMap = map; + + } + + // Emissive Map (map_Ke) + if ( materialAttributes & MaterialDataAttribute.EMISSIVE_MAP ) { + + var mapDataAttributes = readUint16(); + var map = loadTexture( ( mapDataAttributes & MapDataAttribute.PATH ) ? readString( readUint16() ) : '' ); + if ( mapDataAttributes & MapDataAttribute.SCALE ) map.repeat.set( readFloat32(), readFloat32() ); + if ( mapDataAttributes & MapDataAttribute.OFFSET ) map.offset.set( readFloat32(), readFloat32() ); + params.emissiveMap = map; + + } + + // Dissolve Map (map_d) + if ( materialAttributes & MaterialDataAttribute.DISSOLVE_MAP ) { + + var mapDataAttributes = readUint16(); + var map = loadTexture( ( mapDataAttributes & MapDataAttribute.PATH ) ? readString( readUint16() ) : '' ); + if ( mapDataAttributes & MapDataAttribute.SCALE ) map.repeat.set( readFloat32(), readFloat32() ); + if ( mapDataAttributes & MapDataAttribute.OFFSET ) map.offset.set( readFloat32(), readFloat32() ); + params.alphaMap = map; + params.transparent = true; + + } + + // Bump Map (map_bump / bump) + if ( materialAttributes & MaterialDataAttribute.BUMP_MAP ) { + + var mapDataAttributes = readUint16(); + var map = loadTexture( ( mapDataAttributes & MapDataAttribute.PATH ) ? readString( readUint16() ) : '' ); + if ( mapDataAttributes & MapDataAttribute.SCALE ) map.repeat.set( readFloat32(), readFloat32() ); + if ( mapDataAttributes & MapDataAttribute.OFFSET ) map.offset.set( readFloat32(), readFloat32() ); + if ( mapDataAttributes & MapDataAttribute.BUMP_SCALE ) params.bumpScale = readFloat32(); + params.bumpMap = map; + + } + + // Displacement Map (map_disp / disp) + if ( materialAttributes & MaterialDataAttribute.DISPLACEMENT_MAP ) { + + var mapDataAttributes = readUint16(); + var map = loadTexture( ( mapDataAttributes & MapDataAttribute.PATH ) ? readString( readUint16() ) : '' ); + if ( mapDataAttributes & MapDataAttribute.SCALE ) map.repeat.set( readFloat32(), readFloat32() ); + if ( mapDataAttributes & MapDataAttribute.OFFSET ) map.offset.set( readFloat32(), readFloat32() ); + if ( mapDataAttributes & MapDataAttribute.DISPLACEMENT_SCALE ) params.displacementScale = readFloat32(); + params.displacementMap = map; + + } + + var material = new THREE.MeshPhongMaterial( params ); + materials.push( material ); + + } + + } + + // Object Count + var objectCount = readUint16(); + if ( this.debug ) console.log( 'Object Count', objectCount ); + + for ( var i = 0; i < objectCount; ++i ) { + + // Object Data Attributes + var objectAttributes = readUint16(); + + if ( this.debug ) { + + console.log( + + 'ObjectAttributes:', '\n', + 'Name', ( objectAttributes & ObjectDataAttribute.NAME ) ? true : false, '\n', + 'Geometry', ( objectAttributes & ObjectDataAttribute.GEOMETRY ) ? true : false + + ); + + } + + var object = new THREE.Group(); + + // Container ID + var containerId = readUint32(); + if ( isArrayContainer ) { + + if ( containerId >= containers.length ) containers.push( new THREE.Group() ); + containers[ containerId ].add( object ); + + } + else { + if ( containerId >= containers.children.length ) containers.add( new THREE.Group() ); + containers.children[ containerId ].add( object ); + + } + + // Object Name + if ( objectAttributes & ObjectDataAttribute.NAME ) { + + var objectName = readString( readUint16() ); + if ( this.debug ) console.log( 'Object Name', objectName ); + object.name = objectName; + + } + + var vertices = {}; + if ( objectAttributes & ObjectDataAttribute.GEOMETRY ) { + + // 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 + + ); + + } + + // Vertex Count + var vertexCount = readUint32(); + if ( this.debug ) console.log( 'Vertex Count', vertexCount ); + + // Vertex Positions + vertices.positions = readFloat32Array( vertexCount * 3 ); + + // Vertex Normals + if ( geometryAttributes & GeometryDataAttribute.NORMAL ) vertices.normals = readFloat32Array( vertexCount * 3 ); + + // Vertex UVs + if ( geometryAttributes & GeometryDataAttribute.UV ) vertices.uvs = readFloat32Array( vertexCount * 2 ); + + } + + // 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 ) { + + console.log( + + 'GroupAttributes:', '\n', + 'Index', ( groupAttributes & GroupDataAttribute.INDEX ) ? true : false, '\n', + 'Smoothing', ( groupAttributes & GroupDataAttribute.SMOOTHING ) ? true : false, '\n', + 'Material', ( groupAttributes & GroupDataAttribute.MATERIAL ) ? true : false + + ); + + } + + // Group Name + var groupName; + if ( groupAttributes & GroupDataAttribute.NAME ) { + + groupName = readString( readUint16() ); + if ( this.debug ) console.log( 'Group Name', groupName ); + + } + + var group; + + if ( objectAttributes & ObjectDataAttribute.GEOMETRY ) { + + // Indices + var indices; + if ( groupAttributes & GroupDataAttribute.INDEX ) { + + // Index Count + var indexCount = readUint32(); + if ( this.debug ) console.log( 'Index Count', indexCount ); + + // Indices + indices = readUint16Array( indexCount ); + + } + + // 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 ); + + } + + group = new THREE.Mesh( geometry, material ); + + } + + if ( group === undefined ) group = new THREE.Group(); + if ( groupName ) group.name = groupName; + object.add( group ); + + } + + } + + console.timeEnd( 'BOMLoader' ); + + return containers; + + } + +}; \ No newline at end of file diff --git a/examples/js/loaders/BOMLoader.min.js b/examples/js/loaders/BOMLoader.min.js new file mode 100644 index 0000000..9f203ec --- /dev/null +++ b/examples/js/loaders/BOMLoader.min.js @@ -0,0 +1 @@ +THREE.BOMLoader=function(t){this.manager=void 0!==t?t:THREE.DefaultLoadingManager},THREE.BOMLoader.prototype={constructor:THREE.BOMLoader,load:function(t,e,a,r){var E=this,n=THREE.FileLoader?new THREE.FileLoader(this.manager):new THREE.XHRLoader(this.manager);n.setPath(this.path),n.setResponseType("arraybuffer"),n.load(t,function(t){e(E.parse(t))},a,r)},setPath:function(t){this.path=t},setTexturePath:function(t){this.texturePath=t},setCrossOrigin:function(t){this.crossOrigin=t},setDebug:function(t){this.debug=t},setResponseType:function(t){this.responseType=t},parse:function(t){function e(){var t=S.getUint8(R);return R+=Uint8Array.BYTES_PER_ELEMENT,t}function a(){var t=S.getUint16(R,!0);return R+=Uint16Array.BYTES_PER_ELEMENT,t}function r(){var t=S.getUint32(R,!0);return R+=Uint32Array.BYTES_PER_ELEMENT,t}function E(){var t=S.getFloat32(R,!0);return R+=Float32Array.BYTES_PER_ELEMENT,t}function n(t){var e=String.fromCharCode.apply(null,t>0?new Uint8Array(S.buffer,R,t):new Uint8Array);return R+=Uint8Array.BYTES_PER_ELEMENT*t,e}function o(t){if(0===R%Uint16Array.BYTES_PER_ELEMENT){var e=new Uint16Array(S.buffer,R,t);return R+=Uint16Array.BYTES_PER_ELEMENT*t,e}for(var e=new Uint16Array(t),a=0;t>a;++a,R+=Uint16Array.BYTES_PER_ELEMENT)e[a]=S.getUint16(R,!0);return e}function i(t){if(0===R%Float32Array.BYTES_PER_ELEMENT){var e=new Float32Array(S.buffer,R,t);return R+=Float32Array.BYTES_PER_ELEMENT*t,e}for(var e=new Float32Array(t),a=0;t>a;++a,R+=Float32Array.BYTES_PER_ELEMENT)e[a]=S.getFloat32(R,!0);return e}function s(t){return"string"!=typeof t||""===t?"":/^https?:\/\//i.test(t)?t:(f.texturePath||f.path||"")+t}function A(t){t=s(t);var e=THREE.Loader.Handlers.get(t);null===e&&(e=new THREE.TextureLoader(f.manager)),e.setCrossOrigin&&e.setCrossOrigin(f.crossOrigin);var a=e.load(t);return a.side=THREE.FrontSide,a.wrapS=a.wrapT=THREE.RepeatWrapping,a}console.time("BOMLoader");var u={NONE:1,MATERIAL_LIBRARY:2},M={NONE:1,NAME:2,INDEX:4,SMOOTHING:8,MATERIAL:16},T={NONE:1,NAME:2,GEOMETRY:4},l={NONE:1,NORMAL:2,UV:4},p={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};MapDataAttribute={NONE:1,PATH:2,SCALE:4,OFFSET:8,BUMP_SCALE:16,DISPLACEMENT_SCALE:32};var S=new DataView(t),R=0,L="array"==this.responseType,N=L?[]:new THREE.Group,f=this,c=n(3);this.debug&&console.log("File Signature",c);var g=e();this.debug&&console.log("Version",g);var I=a();this.debug&&console.log("FileAttributes:","\n","Material Library",F&u.MATERIAL_LIBRARY?!0:!1);var b=[];if(I&u.MATERIAL_LIBRARY){var d=a();this.debug&&console.log("Material Count",d);for(var P=0;d>P;++P){var _=r();this.debug&&console.log("MaterialAttributes:","\n","Illumination Model",_&p.ILLUMINATION_MODEL?!0:!1,"\n","Specular Exponent",_&p.SPECULAR_EXPONENT?!0:!1,"\n","Optical Density",_&p.OPTICAL_DENSITY?!0:!1,"\n","Dissolve",_&p.DISSOLVE?!0:!1,"\n","Transmission Filter",_&p.TRANSMISSION_FILTER?!0:!1,"\n","Ambient Reflectance",_&p.AMBIENT_REFLECTANCE?!0:!1,"\n","Diffuse Reflectance",_&p.DIFFUSE_REFLECTANCE?!0:!1,"\n","Specular Reflectance",_&p.SPECULAR_REFLECTANCE?!0:!1,"\n","Ambient Map",_&p.AMBIENT_MAP?!0:!1,"\n","Diffuse Map",_&p.DIFFUSE_MAP?!0:!1,"\n","Specular Map",_&p.SPECULAR_MAP?!0:!1,"\n","Dissolve Map",_&p.DISSOLVE_MAP?!0:!1,"\n","Bump Map",_&p.BUMP_MAP?!0:!1,"\n","Displacement Map",_&p.DISPLACEMENT_MAP?!0:!1);var h={};if(h.name=n(a()),this.debug&&console.log("Material Name",h.name),_&p.ILLUMINATION_MODEL&&e(),_&p.SPECULAR_EXPONENT&&(h.shininess=E(),this.debug&&console.log("Specular Exponent",h.shininess)),_&p.OPTICAL_DENSITY&&E(),_&p.DISSOLVE&&(h.opacity=E(),h.transparent=!0,this.debug&&console.log("Dissolve",h.opacity)),_&p.TRANSMISSION_FILTER&&(E(),E(),E()),_&p.AMBIENT_REFLECTANCE&&(E(),E(),E()),_&p.DIFFUSE_REFLECTANCE&&(h.color=new THREE.Color(E(),E(),E()),this.debug&&console.log("Diffuse Reflectance",h.color)),_&p.SPECULAR_REFLECTANCE&&(h.specular=new THREE.Color(E(),E(),E()),this.debug&&console.log("Specular Reflectance",h.specular)),_&p.EMISSIVE_REFLECTANCE&&(h.emissive=new THREE.Color(E(),E(),E()),this.debug&&console.log("Emissive Reflectance",h.emissive)),_&p.AMBIENT_MAP){var C=a();C&MapDataAttribute.PATH&&n(a()),C&MapDataAttribute.SCALE&&(E(),E()),C&MapDataAttribute.OFFSET&&(E(),E())}if(_&p.DIFFUSE_MAP){var C=a(),O=A(C&MapDataAttribute.PATH?n(a()):"");C&MapDataAttribute.SCALE&&O.repeat.set(E(),E()),C&MapDataAttribute.OFFSET&&O.offset.set(E(),E()),h.map=O,this.debug&&C&MapDataAttribute.PATH&&console.log("Diffuse Map",O)}if(_&p.SPECULAR_MAP){var C=a(),O=A(C&MapDataAttribute.PATH?n(a()):"");C&MapDataAttribute.SCALE&&O.repeat.set(E(),E()),C&MapDataAttribute.OFFSET&&O.offset.set(E(),E()),h.specularMap=O}if(_&p.EMISSIVE_MAP){var C=a(),O=A(C&MapDataAttribute.PATH?n(a()):"");C&MapDataAttribute.SCALE&&O.repeat.set(E(),E()),C&MapDataAttribute.OFFSET&&O.offset.set(E(),E()),h.emissiveMap=O}if(_&p.DISSOLVE_MAP){var C=a(),O=A(C&MapDataAttribute.PATH?n(a()):"");C&MapDataAttribute.SCALE&&O.repeat.set(E(),E()),C&MapDataAttribute.OFFSET&&O.offset.set(E(),E()),h.alphaMap=O,h.transparent=!0}if(_&p.BUMP_MAP){var C=a(),O=A(C&MapDataAttribute.PATH?n(a()):"");C&MapDataAttribute.SCALE&&O.repeat.set(E(),E()),C&MapDataAttribute.OFFSET&&O.offset.set(E(),E()),C&MapDataAttribute.BUMP_SCALE&&(h.bumpScale=E()),h.bumpMap=O}if(_&p.DISPLACEMENT_MAP){var C=a(),O=A(C&MapDataAttribute.PATH?n(a()):"");C&MapDataAttribute.SCALE&&O.repeat.set(E(),E()),C&MapDataAttribute.OFFSET&&O.offset.set(E(),E()),C&MapDataAttribute.DISPLACEMENT_SCALE&&(h.displacementScale=E()),h.displacementMap=O}var D=new THREE.MeshPhongMaterial(h);b.push(D)}}var v=a();this.debug&&console.log("Object Count",v);for(var P=0;v>P;++P){var F=a();this.debug&&console.log("ObjectAttributes:","\n","Name",F&T.NAME?!0:!1,"\n","Geometry",F&T.GEOMETRY?!0:!1);var H=new THREE.Group,m=r();if(L?(m>=N.length&&N.push(new THREE.Group),N[m].add(H)):(m>=N.children.length&&N.add(new THREE.Group),N.children[m].add(H)),F&T.NAME){var U=n(a());this.debug&&console.log("Object Name",U),H.name=U}var B={};if(F&T.GEOMETRY){var y=a();this.debug&&console.log("GeometryAttributes:","\n","Normal",y&l.NORMAL?!0:!1,"\n","UV",y&l.UV?!0:!1);var w=r();this.debug&&console.log("Vertex Count",w),B.positions=i(3*w),y&l.NORMAL&&(B.normals=i(3*w)),y&l.UV&&(B.uvs=i(2*w))}var G=a();this.debug&&console.log("Group Count",G);for(var Y=0;G>Y;++Y){var V=a();this.debug&&console.log("GroupAttributes:","\n","Index",V&M.INDEX?!0:!1,"\n","Smoothing",V&M.SMOOTHING?!0:!1,"\n","Material",V&M.MATERIAL?!0:!1);var x;V&M.NAME&&(x=n(a()),this.debug&&console.log("Group Name",x));var X;if(F&T.GEOMETRY){var j;if(V&M.INDEX){var W=r();this.debug&&console.log("Index Count",W),j=o(W)}var k=V&M.SMOOTHING?e():0;this.debug&&V&M.SMOOTHING&&console.log("Smoothing",k);var q=new THREE.BufferGeometry;B.positions&&q.addAttribute("position",new THREE.BufferAttribute(B.positions,3)),B.normals?q.addAttribute("normal",new THREE.BufferAttribute(B.normals,3)):q.computeVertexNormals(),B.uvs&&q.addAttribute("uv",new THREE.BufferAttribute(B.uvs,2)),j&&q.setIndex(new THREE.BufferAttribute(j,1)),q.addGroup(0,1,0);var D;if(V&M.MATERIAL){var z=a();D=b[z].clone()||new THREE.MeshPhongMaterial,D.shading=k>0?THREE.SmoothShading:THREE.FlatShading,this.debug&&console.log("Group Material",z,D)}X=new THREE.Mesh(q,D)}void 0===X&&(X=new THREE.Group),x&&(X.name=x),H.add(X)}}return console.timeEnd("BOMLoader"),N}}; \ No newline at end of file diff --git a/minify.bat b/minify.bat new file mode 100644 index 0000000..43109c3 --- /dev/null +++ b/minify.bat @@ -0,0 +1,2 @@ +@echo off +uglifyjs2 examples/js/loaders/BOMLoader.js -m -o examples/js/loaders/BOMLoader.min.js -c \ No newline at end of file