{"version":3,"sources":["jsdelivr-header.js","/npm/oopanda-three-obj-mtl-loader@1.0.1/index.js"],"names":[],"mappings":"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","file":"/npm/oopanda-three-obj-mtl-loader@1.0.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/oopanda-three-obj-mtl-loader@1.0.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var THREE = require('three')\n\n/**\n * Loads a Wavefront .mtl file specifying materials\n *\n * @author angelxuanchang\n */\n\nTHREE.MTLLoader = function ( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n};\n\nTHREE.MTLLoader.prototype = {\n\n\tconstructor: THREE.MTLLoader,\n\n\t/**\n\t * Loads and parses a MTL asset from a URL.\n\t *\n\t * @param {String} url - URL to the MTL file.\n\t * @param {Function} [onLoad] - Callback invoked with the loaded object.\n\t * @param {Function} [onProgress] - Callback for download progress.\n\t * @param {Function} [onError] - Callback for download errors.\n\t *\n\t * @see setPath setTexturePath\n\t *\n\t * @note In order for relative texture references to resolve correctly\n\t * you must call setPath and/or setTexturePath explicitly prior to load.\n\t */\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( text ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\t/**\n\t * Set base path for resolving references.\n\t * If set this path will be prepended to each loaded and found reference.\n\t *\n\t * @see setTexturePath\n\t * @param {String} path\n\t * @return {THREE.MTLLoader}\n\t *\n\t * @example\n\t *     mtlLoader.setPath( 'assets/obj/' );\n\t *     mtlLoader.load( 'my.mtl', ... );\n\t */\n\tsetPath: function ( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t},\n\n\t/**\n\t * Set base path for resolving texture references.\n\t * If set this path will be prepended found texture reference.\n\t * If not set and setPath is, it will be used as texture base path.\n\t *\n\t * @see setPath\n\t * @param {String} path\n\t * @return {THREE.MTLLoader}\n\t *\n\t * @example\n\t *     mtlLoader.setPath( 'assets/obj/' );\n\t *     mtlLoader.setTexturePath( 'assets/textures/' );\n\t *     mtlLoader.load( 'my.mtl', ... );\n\t */\n\tsetTexturePath: function ( path ) {\n\n\t\tthis.texturePath = path;\n\t\treturn this;\n\n\t},\n\n\tsetBaseUrl: function ( path ) {\n\n\t\tconsole.warn( 'THREE.MTLLoader: .setBaseUrl() is deprecated. Use .setTexturePath( path ) for texture path or .setPath( path ) for general base path instead.' );\n\n\t\treturn this.setTexturePath( path );\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetMaterialOptions: function ( value ) {\n\n\t\tthis.materialOptions = value;\n\t\treturn this;\n\n\t},\n\n\t/**\n\t * Parses a MTL file.\n\t *\n\t * @param {String} text - Content of MTL file\n\t * @return {THREE.MTLLoader.MaterialCreator}\n\t *\n\t * @see setPath setTexturePath\n\t *\n\t * @note In order for relative texture references to resolve correctly\n\t * you must call setPath and/or setTexturePath explicitly prior to parse.\n\t */\n\tparse: function ( text ) {\n\n\t\tvar lines = text.split( '\\n' );\n\t\tvar info = {};\n\t\tvar delimiter_pattern = /\\s+/;\n\t\tvar materialsInfo = {};\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tvar line = lines[ i ];\n\t\t\tline = line.trim();\n\n\t\t\tif ( line.length === 0 || line.charAt( 0 ) === '#' ) {\n\n\t\t\t\t// Blank line or comment ignore\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar pos = line.indexOf( ' ' );\n\n\t\t\tvar key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;\n\t\t\tkey = key.toLowerCase();\n\n\t\t\tvar value = ( pos >= 0 ) ? line.substring( pos + 1 ) : '';\n\t\t\tvalue = value.trim();\n\n\t\t\tif ( key === 'newmtl' ) {\n\n\t\t\t\t// New material\n\n\t\t\t\tinfo = { name: value };\n\t\t\t\tmaterialsInfo[ value ] = info;\n\n\t\t\t} else if ( info ) {\n\n\t\t\t\tif ( key === 'ka' || key === 'kd' || key === 'ks' ) {\n\n\t\t\t\t\tvar ss = value.split( delimiter_pattern, 3 );\n\t\t\t\t\tinfo[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tinfo[ key ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar materialCreator = new THREE.MTLLoader.MaterialCreator( this.texturePath || this.path, this.materialOptions );\n\t\tmaterialCreator.setCrossOrigin( this.crossOrigin );\n\t\tmaterialCreator.setManager( this.manager );\n\t\tmaterialCreator.setMaterials( materialsInfo );\n\t\treturn materialCreator;\n\n\t}\n\n};\n\n/**\n * Create a new THREE-MTLLoader.MaterialCreator\n * @param baseUrl - Url relative to which textures are loaded\n * @param options - Set of options on how to construct the materials\n *                  side: Which side to apply the material\n *                        THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide\n *                  wrap: What type of wrapping to apply for textures\n *                        THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping\n *                  normalizeRGB: RGBs need to be normalized to 0-1 from 0-255\n *                                Default: false, assumed to be already normalized\n *                  ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's\n *                                  Default: false\n * @constructor\n */\n\nTHREE.MTLLoader.MaterialCreator = function ( baseUrl, options ) {\n\n\tthis.baseUrl = baseUrl || '';\n\tthis.options = options;\n\tthis.materialsInfo = {};\n\tthis.materials = {};\n\tthis.materialsArray = [];\n\tthis.nameLookup = {};\n\n\tthis.side = ( this.options && this.options.side ) ? this.options.side : THREE.FrontSide;\n\tthis.wrap = ( this.options && this.options.wrap ) ? this.options.wrap : THREE.RepeatWrapping;\n\n};\n\nTHREE.MTLLoader.MaterialCreator.prototype = {\n\n\tconstructor: THREE.MTLLoader.MaterialCreator,\n\n\tcrossOrigin: 'Anonymous',\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\n\t},\n\n\tsetManager: function ( value ) {\n\n\t\tthis.manager = value;\n\n\t},\n\n\tsetMaterials: function ( materialsInfo ) {\n\n\t\tthis.materialsInfo = this.convert( materialsInfo );\n\t\tthis.materials = {};\n\t\tthis.materialsArray = [];\n\t\tthis.nameLookup = {};\n\n\t},\n\n\tconvert: function ( materialsInfo ) {\n\n\t\tif ( ! this.options ) return materialsInfo;\n\n\t\tvar converted = {};\n\n\t\tfor ( var mn in materialsInfo ) {\n\n\t\t\t// Convert materials info into normalized form based on options\n\n\t\t\tvar mat = materialsInfo[ mn ];\n\n\t\t\tvar covmat = {};\n\n\t\t\tconverted[ mn ] = covmat;\n\n\t\t\tfor ( var prop in mat ) {\n\n\t\t\t\tvar save = true;\n\t\t\t\tvar value = mat[ prop ];\n\t\t\t\tvar lprop = prop.toLowerCase();\n\n\t\t\t\tswitch ( lprop ) {\n\n\t\t\t\t\tcase 'kd':\n\t\t\t\t\tcase 'ka':\n\t\t\t\t\tcase 'ks':\n\n\t\t\t\t\t\t// Diffuse color (color under white light) using RGB values\n\n\t\t\t\t\t\tif ( this.options && this.options.normalizeRGB ) {\n\n\t\t\t\t\t\t\tvalue = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( this.options && this.options.ignoreZeroRGBs ) {\n\n\t\t\t\t\t\t\tif ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0 ) {\n\n\t\t\t\t\t\t\t\t// ignore\n\n\t\t\t\t\t\t\t\tsave = false;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( save ) {\n\n\t\t\t\t\tcovmat[ lprop ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn converted;\n\n\t},\n\n\tpreload: function () {\n\n\t\tfor ( var mn in this.materialsInfo ) {\n\n\t\t\tthis.create( mn );\n\n\t\t}\n\n\t},\n\n\tgetIndex: function ( materialName ) {\n\n\t\treturn this.nameLookup[ materialName ];\n\n\t},\n\n\tgetAsArray: function () {\n\n\t\tvar index = 0;\n\n\t\tfor ( var mn in this.materialsInfo ) {\n\n\t\t\tthis.materialsArray[ index ] = this.create( mn );\n\t\t\tthis.nameLookup[ mn ] = index;\n\t\t\tindex ++;\n\n\t\t}\n\n\t\treturn this.materialsArray;\n\n\t},\n\n\tcreate: function ( materialName ) {\n\n\t\tif ( this.materials[ materialName ] === undefined ) {\n\n\t\t\tthis.createMaterial_( materialName );\n\n\t\t}\n\n\t\treturn this.materials[ materialName ];\n\n\t},\n\n\tcreateMaterial_: function ( materialName ) {\n\n\t\t// Create material\n\n\t\tvar scope = this;\n\t\tvar mat = this.materialsInfo[ materialName ];\n\t\tvar params = {\n\n\t\t\tname: materialName,\n\t\t\tside: this.side\n\n\t\t};\n\n\t\tfunction resolveURL( baseUrl, url ) {\n\n\t\t\tif ( typeof url !== 'string' || url === '' )\n\t\t\t\treturn '';\n\n\t\t\t// Absolute URL\n\t\t\tif ( /^https?:\\/\\//i.test( url ) ) return url;\n\n\t\t\treturn baseUrl + url;\n\n\t\t}\n\n\t\tfunction setMapForType( mapType, value ) {\n\n\t\t\tif ( params[ mapType ] ) return; // Keep the first encountered texture\n\n\t\t\tvar texParams = scope.getTextureParams( value, params );\n\t\t\tvar map = scope.loadTexture( resolveURL( scope.baseUrl, texParams.url ) );\n\n\t\t\tmap.repeat.copy( texParams.scale );\n\t\t\tmap.offset.copy( texParams.offset );\n\n\t\t\tmap.wrapS = scope.wrap;\n\t\t\tmap.wrapT = scope.wrap;\n\n\t\t\tparams[ mapType ] = map;\n\n\t\t}\n\n\t\tfor ( var prop in mat ) {\n\n\t\t\tvar value = mat[ prop ];\n\t\t\tvar n;\n\n\t\t\tif ( value === '' ) continue;\n\n\t\t\tswitch ( prop.toLowerCase() ) {\n\n\t\t\t\t// Ns is material specular exponent\n\n\t\t\t\tcase 'kd':\n\n\t\t\t\t\t// Diffuse color (color under white light) using RGB values\n\n\t\t\t\t\tparams.color = new THREE.Color().fromArray( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ks':\n\n\t\t\t\t\t// Specular color (color when light is reflected from shiny surface) using RGB values\n\t\t\t\t\tparams.specular = new THREE.Color().fromArray( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_kd':\n\n\t\t\t\t\t// Diffuse texture map\n\n\t\t\t\t\tsetMapForType( \"map\", value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_ks':\n\n\t\t\t\t\t// Specular map\n\n\t\t\t\t\tsetMapForType( \"specularMap\", value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'norm':\n\n\t\t\t\t\tsetMapForType( \"normalMap\", value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_bump':\n\t\t\t\tcase 'bump':\n\n\t\t\t\t\t// Bump texture map\n\n\t\t\t\t\tsetMapForType( \"bumpMap\", value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ns':\n\n\t\t\t\t\t// The specular exponent (defines the focus of the specular highlight)\n\t\t\t\t\t// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.\n\n\t\t\t\t\tparams.shininess = parseFloat( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'd':\n\t\t\t\t\tn = parseFloat( value );\n\n\t\t\t\t\tif ( n < 1 ) {\n\n\t\t\t\t\t\tparams.opacity = n;\n\t\t\t\t\t\tparams.transparent = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'tr':\n\t\t\t\t\tn = parseFloat( value );\n\n\t\t\t\t\tif ( this.options && this.options.invertTrProperty ) n = 1 - n;\n\n\t\t\t\t\tif ( n > 0 ) {\n\n\t\t\t\t\t\tparams.opacity = 1 - n;\n\t\t\t\t\t\tparams.transparent = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.materials[ materialName ] = new THREE.MeshPhongMaterial( params );\n\t\treturn this.materials[ materialName ];\n\n\t},\n\n\tgetTextureParams: function ( value, matParams ) {\n\n\t\tvar texParams = {\n\n\t\t\tscale: new THREE.Vector2( 1, 1 ),\n\t\t\toffset: new THREE.Vector2( 0, 0 )\n\n\t\t };\n\n\t\tvar items = value.split( /\\s+/ );\n\t\tvar pos;\n\n\t\tpos = items.indexOf( '-bm' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\tmatParams.bumpScale = parseFloat( items[ pos + 1 ] );\n\t\t\titems.splice( pos, 2 );\n\n\t\t}\n\n\t\tpos = items.indexOf( '-s' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\ttexParams.scale.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) );\n\t\t\titems.splice( pos, 4 ); // we expect 3 parameters here!\n\n\t\t}\n\n\t\tpos = items.indexOf( '-o' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\ttexParams.offset.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) );\n\t\t\titems.splice( pos, 4 ); // we expect 3 parameters here!\n\n\t\t}\n\n\t\ttexParams.url = items.join( ' ' ).trim();\n\t\treturn texParams;\n\n\t},\n\n\tloadTexture: function ( url, mapping, onLoad, onProgress, onError ) {\n\t\tvar texture;\n\t\t// var loader = THREE.Loader.Handlers.get( url );\n    var loader = this.manager.getHandler(url);\n\t\tvar manager = ( this.manager !== undefined ) ? this.manager : THREE.DefaultLoadingManager;\n\n\t\tif ( loader === null ) {\n\n\t\t\tloader = new THREE.TextureLoader( manager );\n\n\t\t}\n\n\t\tif ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin );\n\t\ttexture = loader.load( url, onLoad, onProgress, onError );\n\n\t\tif ( mapping !== undefined ) texture.mapping = mapping;\n\n\t\treturn texture;\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.OBJLoader = ( function () {\n\n\t// o object_name | g group_name\n\tvar object_pattern = /^[og]\\s*(.+)?/;\n\t// mtllib file_reference\n\tvar material_library_pattern = /^mtllib /;\n\t// usemtl material_name\n\tvar material_use_pattern = /^usemtl /;\n\n\tfunction ParserState() {\n\n\t\tvar state = {\n\t\t\tobjects: [],\n\t\t\tobject: {},\n\n\t\t\tvertices: [],\n\t\t\tnormals: [],\n\t\t\tcolors: [],\n\t\t\tuvs: [],\n\n\t\t\tmaterialLibraries: [],\n\n\t\t\tstartObject: function ( name, fromDeclaration ) {\n\n\t\t\t\t// If the current object (initial from reset) is not from a g/o declaration in the parsed\n\t\t\t\t// file. We need to use it for the first parsed g/o to keep things in sync.\n\t\t\t\tif ( this.object && this.object.fromDeclaration === false ) {\n\n\t\t\t\t\tthis.object.name = name;\n\t\t\t\t\tthis.object.fromDeclaration = ( fromDeclaration !== false );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );\n\n\t\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\t\tthis.object._finalize( true );\n\n\t\t\t\t}\n\n\t\t\t\tthis.object = {\n\t\t\t\t\tname: name || '',\n\t\t\t\t\tfromDeclaration: ( fromDeclaration !== false ),\n\n\t\t\t\t\tgeometry: {\n\t\t\t\t\t\tvertices: [],\n\t\t\t\t\t\tnormals: [],\n\t\t\t\t\t\tcolors: [],\n\t\t\t\t\t\tuvs: []\n\t\t\t\t\t},\n\t\t\t\t\tmaterials: [],\n\t\t\t\t\tsmooth: true,\n\n\t\t\t\t\tstartMaterial: function ( name, libraries ) {\n\n\t\t\t\t\t\tvar previous = this._finalize( false );\n\n\t\t\t\t\t\t// New usemtl declaration overwrites an inherited material, except if faces were declared\n\t\t\t\t\t\t// after the material, then it must be preserved for proper MultiMaterial continuation.\n\t\t\t\t\t\tif ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) {\n\n\t\t\t\t\t\t\tthis.materials.splice( previous.index, 1 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar material = {\n\t\t\t\t\t\t\tindex: this.materials.length,\n\t\t\t\t\t\t\tname: name || '',\n\t\t\t\t\t\t\tmtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ),\n\t\t\t\t\t\t\tsmooth: ( previous !== undefined ? previous.smooth : this.smooth ),\n\t\t\t\t\t\t\tgroupStart: ( previous !== undefined ? previous.groupEnd : 0 ),\n\t\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\t\tinherited: false,\n\n\t\t\t\t\t\t\tclone: function ( index ) {\n\n\t\t\t\t\t\t\t\tvar cloned = {\n\t\t\t\t\t\t\t\t\tindex: ( typeof index === 'number' ? index : this.index ),\n\t\t\t\t\t\t\t\t\tname: this.name,\n\t\t\t\t\t\t\t\t\tmtllib: this.mtllib,\n\t\t\t\t\t\t\t\t\tsmooth: this.smooth,\n\t\t\t\t\t\t\t\t\tgroupStart: 0,\n\t\t\t\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\t\t\t\tinherited: false\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tcloned.clone = this.clone.bind( cloned );\n\t\t\t\t\t\t\t\treturn cloned;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.materials.push( material );\n\n\t\t\t\t\t\treturn material;\n\n\t\t\t\t\t},\n\n\t\t\t\t\tcurrentMaterial: function () {\n\n\t\t\t\t\t\tif ( this.materials.length > 0 ) {\n\n\t\t\t\t\t\t\treturn this.materials[ this.materials.length - 1 ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn undefined;\n\n\t\t\t\t\t},\n\n\t\t\t\t\t_finalize: function ( end ) {\n\n\t\t\t\t\t\tvar lastMultiMaterial = this.currentMaterial();\n\t\t\t\t\t\tif ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) {\n\n\t\t\t\t\t\t\tlastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n\t\t\t\t\t\t\tlastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n\t\t\t\t\t\t\tlastMultiMaterial.inherited = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Ignore objects tail materials if no face declarations followed them before a new o/g started.\n\t\t\t\t\t\tif ( end && this.materials.length > 1 ) {\n\n\t\t\t\t\t\t\tfor ( var mi = this.materials.length - 1; mi >= 0; mi -- ) {\n\n\t\t\t\t\t\t\t\tif ( this.materials[ mi ].groupCount <= 0 ) {\n\n\t\t\t\t\t\t\t\t\tthis.materials.splice( mi, 1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Guarantee at least one empty material, this makes the creation later more straight forward.\n\t\t\t\t\t\tif ( end && this.materials.length === 0 ) {\n\n\t\t\t\t\t\t\tthis.materials.push( {\n\t\t\t\t\t\t\t\tname: '',\n\t\t\t\t\t\t\t\tsmooth: this.smooth\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn lastMultiMaterial;\n\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Inherit previous objects material.\n\t\t\t\t// Spec tells us that a declared material must be set to all objects until a new material is declared.\n\t\t\t\t// If a usemtl declaration is encountered while this new object is being parsed, it will\n\t\t\t\t// overwrite the inherited material. Exception being that there was already face declarations\n\t\t\t\t// to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n\n\t\t\t\tif ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) {\n\n\t\t\t\t\tvar declared = previousMaterial.clone( 0 );\n\t\t\t\t\tdeclared.inherited = true;\n\t\t\t\t\tthis.object.materials.push( declared );\n\n\t\t\t\t}\n\n\t\t\t\tthis.objects.push( this.object );\n\n\t\t\t},\n\n\t\t\tfinalize: function () {\n\n\t\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\t\tthis.object._finalize( true );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tparseVertexIndex: function ( value, len ) {\n\n\t\t\t\tvar index = parseInt( value, 10 );\n\t\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t\t},\n\n\t\t\tparseNormalIndex: function ( value, len ) {\n\n\t\t\t\tvar index = parseInt( value, 10 );\n\t\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t\t},\n\n\t\t\tparseUVIndex: function ( value, len ) {\n\n\t\t\t\tvar index = parseInt( value, 10 );\n\t\t\t\treturn ( index >= 0 ? index - 1 : index + len / 2 ) * 2;\n\n\t\t\t},\n\n\t\t\taddVertex: function ( a, b, c ) {\n\n\t\t\t\tvar src = this.vertices;\n\t\t\t\tvar dst = this.object.geometry.vertices;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t\t},\n\n\t\t\taddVertexPoint: function ( a ) {\n\n\t\t\t\tvar src = this.vertices;\n\t\t\t\tvar dst = this.object.geometry.vertices;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t\t},\n\n\t\t\taddVertexLine: function ( a ) {\n\n\t\t\t\tvar src = this.vertices;\n\t\t\t\tvar dst = this.object.geometry.vertices;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t\t},\n\n\t\t\taddNormal: function ( a, b, c ) {\n\n\t\t\t\tvar src = this.normals;\n\t\t\t\tvar dst = this.object.geometry.normals;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t\t},\n\n\t\t\taddColor: function ( a, b, c ) {\n\n\t\t\t\tvar src = this.colors;\n\t\t\t\tvar dst = this.object.geometry.colors;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t\t},\n\n\t\t\taddUV: function ( a, b, c ) {\n\n\t\t\t\tvar src = this.uvs;\n\t\t\t\tvar dst = this.object.geometry.uvs;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\t\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ] );\n\t\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ] );\n\n\t\t\t},\n\n\t\t\taddUVLine: function ( a ) {\n\n\t\t\t\tvar src = this.uvs;\n\t\t\t\tvar dst = this.object.geometry.uvs;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\n\t\t\t},\n\n\t\t\taddFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) {\n\n\t\t\t\tvar vLen = this.vertices.length;\n\n\t\t\t\tvar ia = this.parseVertexIndex( a, vLen );\n\t\t\t\tvar ib = this.parseVertexIndex( b, vLen );\n\t\t\t\tvar ic = this.parseVertexIndex( c, vLen );\n\n\t\t\t\tthis.addVertex( ia, ib, ic );\n\n\t\t\t\tif ( ua !== undefined && ua !== '' ) {\n\n\t\t\t\t\tvar uvLen = this.uvs.length;\n\t\t\t\t\tia = this.parseUVIndex( ua, uvLen );\n\t\t\t\t\tib = this.parseUVIndex( ub, uvLen );\n\t\t\t\t\tic = this.parseUVIndex( uc, uvLen );\n\t\t\t\t\tthis.addUV( ia, ib, ic );\n\n\t\t\t\t}\n\n\t\t\t\tif ( na !== undefined && na !== '' ) {\n\n\t\t\t\t\t// Normals are many times the same. If so, skip function call and parseInt.\n\t\t\t\t\tvar nLen = this.normals.length;\n\t\t\t\t\tia = this.parseNormalIndex( na, nLen );\n\n\t\t\t\t\tib = na === nb ? ia : this.parseNormalIndex( nb, nLen );\n\t\t\t\t\tic = na === nc ? ia : this.parseNormalIndex( nc, nLen );\n\n\t\t\t\t\tthis.addNormal( ia, ib, ic );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.colors.length > 0 ) {\n\n\t\t\t\t\tthis.addColor( ia, ib, ic );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\taddPointGeometry: function ( vertices ) {\n\n\t\t\t\tthis.object.geometry.type = 'Points';\n\n\t\t\t\tvar vLen = this.vertices.length;\n\n\t\t\t\tfor ( var vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\t\tthis.addVertexPoint( this.parseVertexIndex( vertices[ vi ], vLen ) );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\taddLineGeometry: function ( vertices, uvs ) {\n\n\t\t\t\tthis.object.geometry.type = 'Line';\n\n\t\t\t\tvar vLen = this.vertices.length;\n\t\t\t\tvar uvLen = this.uvs.length;\n\n\t\t\t\tfor ( var vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\t\tthis.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var uvi = 0, l = uvs.length; uvi < l; uvi ++ ) {\n\n\t\t\t\t\tthis.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tstate.startObject( '', false );\n\n\t\treturn state;\n\n\t}\n\n\t//\n\n\tfunction OBJLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n\t\tthis.materials = null;\n\n\t}\n\n\tOBJLoader.prototype = {\n\n\t\tconstructor: OBJLoader,\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new THREE.FileLoader( scope.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMaterials: function ( materials ) {\n\n\t\t\tthis.materials = materials;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tparse: function ( text ) {\n\n\t\t\tconsole.time( 'OBJLoader' );\n\n\t\t\tvar state = new ParserState();\n\n\t\t\tif ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n\t\t\t\t// This is faster than String.split with regex that splits on both\n\t\t\t\ttext = text.replace( /\\r\\n/g, '\\n' );\n\n\t\t\t}\n\n\t\t\tif ( text.indexOf( '\\\\\\n' ) !== - 1 ) {\n\n\t\t\t\t// join lines separated by a line continuation character (\\)\n\t\t\t\ttext = text.replace( /\\\\\\n/g, '' );\n\n\t\t\t}\n\n\t\t\tvar lines = text.split( '\\n' );\n\t\t\tvar line = '', lineFirstChar = '';\n\t\t\tvar lineLength = 0;\n\t\t\tvar result = [];\n\n\t\t\t// Faster to just trim left side of the line. Use if available.\n\t\t\tvar trimLeft = ( typeof ''.trimLeft === 'function' );\n\n\t\t\tfor ( var i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\t\tline = lines[ i ];\n\n\t\t\t\tline = trimLeft ? line.trimLeft() : line.trim();\n\n\t\t\t\tlineLength = line.length;\n\n\t\t\t\tif ( lineLength === 0 ) continue;\n\n\t\t\t\tlineFirstChar = line.charAt( 0 );\n\n\t\t\t\t// @todo invoke passed in handler if any\n\t\t\t\tif ( lineFirstChar === '#' ) continue;\n\n\t\t\t\tif ( lineFirstChar === 'v' ) {\n\n\t\t\t\t\tvar data = line.split( /\\s+/ );\n\n\t\t\t\t\tswitch ( data[ 0 ] ) {\n\n\t\t\t\t\t\tcase 'v':\n\t\t\t\t\t\t\tstate.vertices.push(\n\t\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif ( data.length === 8 ) {\n\n\t\t\t\t\t\t\t\tstate.colors.push(\n\t\t\t\t\t\t\t\t\tparseFloat( data[ 4 ] ),\n\t\t\t\t\t\t\t\t\tparseFloat( data[ 5 ] ),\n\t\t\t\t\t\t\t\t\tparseFloat( data[ 6 ] )\n\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vn':\n\t\t\t\t\t\t\tstate.normals.push(\n\t\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vt':\n\t\t\t\t\t\t\tstate.uvs.push(\n\t\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 2 ] )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( lineFirstChar === 'f' ) {\n\n\t\t\t\t\tvar lineData = line.substr( 1 ).trim();\n\t\t\t\t\tvar vertexData = lineData.split( /\\s+/ );\n\t\t\t\t\tvar faceVertices = [];\n\n\t\t\t\t\t// Parse the face vertex data into an easy to work with format\n\n\t\t\t\t\tfor ( var j = 0, jl = vertexData.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertexData[ j ];\n\n\t\t\t\t\t\tif ( vertex.length > 0 ) {\n\n\t\t\t\t\t\t\tvar vertexParts = vertex.split( '/' );\n\t\t\t\t\t\t\tfaceVertices.push( vertexParts );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n\t\t\t\t\tvar v1 = faceVertices[ 0 ];\n\n\t\t\t\t\tfor ( var j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar v2 = faceVertices[ j ];\n\t\t\t\t\t\tvar v3 = faceVertices[ j + 1 ];\n\n\t\t\t\t\t\tstate.addFace(\n\t\t\t\t\t\t\tv1[ 0 ], v2[ 0 ], v3[ 0 ],\n\t\t\t\t\t\t\tv1[ 1 ], v2[ 1 ], v3[ 1 ],\n\t\t\t\t\t\t\tv1[ 2 ], v2[ 2 ], v3[ 2 ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( lineFirstChar === 'l' ) {\n\n\t\t\t\t\tvar lineParts = line.substring( 1 ).trim().split( \" \" );\n\t\t\t\t\tvar lineVertices = [], lineUVs = [];\n\n\t\t\t\t\tif ( line.indexOf( \"/\" ) === - 1 ) {\n\n\t\t\t\t\t\tlineVertices = lineParts;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var li = 0, llen = lineParts.length; li < llen; li ++ ) {\n\n\t\t\t\t\t\t\tvar parts = lineParts[ li ].split( \"/\" );\n\n\t\t\t\t\t\t\tif ( parts[ 0 ] !== \"\" ) lineVertices.push( parts[ 0 ] );\n\t\t\t\t\t\t\tif ( parts[ 1 ] !== \"\" ) lineUVs.push( parts[ 1 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tstate.addLineGeometry( lineVertices, lineUVs );\n\n\t\t\t\t} else if ( lineFirstChar === 'p' ) {\n\n\t\t\t\t\tvar lineData = line.substr( 1 ).trim();\n\t\t\t\t\tvar pointData = lineData.split( \" \" );\n\n\t\t\t\t\tstate.addPointGeometry( pointData );\n\n\t\t\t\t} else if ( ( result = object_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t\t// o object_name\n\t\t\t\t\t// or\n\t\t\t\t\t// g group_name\n\n\t\t\t\t\t// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n\t\t\t\t\t// var name = result[ 0 ].substr( 1 ).trim();\n\t\t\t\t\tvar name = ( \" \" + result[ 0 ].substr( 1 ).trim() ).substr( 1 );\n\n\t\t\t\t\tstate.startObject( name );\n\n\t\t\t\t} else if ( material_use_pattern.test( line ) ) {\n\n\t\t\t\t\t// material\n\n\t\t\t\t\tstate.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries );\n\n\t\t\t\t} else if ( material_library_pattern.test( line ) ) {\n\n\t\t\t\t\t// mtl file\n\n\t\t\t\t\tstate.materialLibraries.push( line.substring( 7 ).trim() );\n\n\t\t\t\t} else if ( lineFirstChar === 's' ) {\n\n\t\t\t\t\tresult = line.split( ' ' );\n\n\t\t\t\t\t// smooth shading\n\n\t\t\t\t\t// @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n\t\t\t\t\t// but does not define a usemtl for each face set.\n\t\t\t\t\t// This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n\t\t\t\t\t// This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n\t\t\t\t\t// where explicit usemtl defines geometry groups.\n\t\t\t\t\t// Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n\t\t\t\t\t/*\n\t\t\t\t\t * http://paulbourke.net/dataformats/obj/\n\t\t\t\t\t * or\n\t\t\t\t\t * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf\n\t\t\t\t\t *\n\t\t\t\t\t * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n\t\t\t\t\t * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n\t\t\t\t\t * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n\t\t\t\t\t * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n\t\t\t\t\t * than 0.\"\n\t\t\t\t\t */\n\t\t\t\t\tif ( result.length > 1 ) {\n\n\t\t\t\t\t\tvar value = result[ 1 ].trim().toLowerCase();\n\t\t\t\t\t\tstate.object.smooth = ( value !== '0' && value !== 'off' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// ZBrush can produce \"s\" lines #11707\n\t\t\t\t\t\tstate.object.smooth = true;\n\n\t\t\t\t\t}\n\t\t\t\t\tvar material = state.object.currentMaterial();\n\t\t\t\t\tif ( material ) material.smooth = state.object.smooth;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Handle null terminated files without exception\n\t\t\t\t\tif ( line === '\\0' ) continue;\n\n\t\t\t\t\tthrow new Error( 'THREE.OBJLoader: Unexpected line: \"' + line + '\"' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.finalize();\n\n\t\t\tvar container = new THREE.Group();\n\t\t\tcontainer.materialLibraries = [].concat( state.materialLibraries );\n\n\t\t\tfor ( var i = 0, l = state.objects.length; i < l; i ++ ) {\n\n\t\t\t\tvar object = state.objects[ i ];\n\t\t\t\tvar geometry = object.geometry;\n\t\t\t\tvar materials = object.materials;\n\t\t\t\tvar isLine = ( geometry.type === 'Line' );\n\t\t\t\tvar isPoints = ( geometry.type === 'Points' );\n\t\t\t\tvar hasVertexColors = false;\n\n\t\t\t\t// Skip o/g line declarations that did not follow with any faces\n\t\t\t\tif ( geometry.vertices.length === 0 ) continue;\n\n\t\t\t\tvar buffergeometry = new THREE.BufferGeometry();\n\n\t\t\t\tbuffergeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( geometry.vertices, 3 ) );\n\n\t\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\t\tbuffergeometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( geometry.normals, 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbuffergeometry.computeVertexNormals();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\t\thasVertexColors = true;\n\t\t\t\t\tbuffergeometry.addAttribute( 'color', new THREE.Float32BufferAttribute( geometry.colors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\t\tbuffergeometry.addAttribute( 'uv', new THREE.Float32BufferAttribute( geometry.uvs, 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Create materials\n\n\t\t\t\tvar createdMaterials = [];\n\n\t\t\t\tfor ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\tvar sourceMaterial = materials[ mi ];\n\t\t\t\t\tvar material = undefined;\n\n\t\t\t\t\tif ( this.materials !== null ) {\n\n\t\t\t\t\t\tmaterial = this.materials.create( sourceMaterial.name );\n\n\t\t\t\t\t\t// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\n\t\t\t\t\t\tif ( isLine && material && ! ( material instanceof THREE.LineBasicMaterial ) ) {\n\n\t\t\t\t\t\t\tvar materialLine = new THREE.LineBasicMaterial();\n\t\t\t\t\t\t\tmaterialLine.copy( material );\n\t\t\t\t\t\t\tmaterialLine.lights = false; // TOFIX\n\t\t\t\t\t\t\tmaterial = materialLine;\n\n\t\t\t\t\t\t} else if ( isPoints && material && ! ( material instanceof THREE.PointsMaterial ) ) {\n\n\t\t\t\t\t\t\tvar materialPoints = new THREE.PointsMaterial( { size: 10, sizeAttenuation: false } );\n\t\t\t\t\t\t\tmaterialLine.copy( material );\n\t\t\t\t\t\t\tmaterial = materialPoints;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! material ) {\n\n\t\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\t\tmaterial = new THREE.LineBasicMaterial();\n\n\t\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\t\tmaterial = new THREE.PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tmaterial = new THREE.MeshPhongMaterial();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaterial.name = sourceMaterial.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterial.flatShading = sourceMaterial.smooth ? false : true;\n\t\t\t\t\tmaterial.vertexColors = hasVertexColors ? THREE.VertexColors : THREE.NoColors;\n\n\t\t\t\t\tcreatedMaterials.push( material );\n\n\t\t\t\t}\n\n\t\t\t\t// Create mesh\n\n\t\t\t\tvar mesh;\n\n\t\t\t\tif ( createdMaterials.length > 1 ) {\n\n\t\t\t\t\tfor ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\t\tvar sourceMaterial = materials[ mi ];\n\t\t\t\t\t\tbuffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineSegments( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new THREE.Points( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new THREE.Mesh( buffergeometry, createdMaterials );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineSegments( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new THREE.Points( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new THREE.Mesh( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = object.name;\n\n\t\t\t\tcontainer.add( mesh );\n\n\t\t\t}\n\n\t\t\tconsole.timeEnd( 'OBJLoader' );\n\n\t\t\treturn container;\n\n\t\t}\n\n\t};\n\n\treturn OBJLoader;\n\n} )();\n\nexports.MTLLoader = THREE.MTLLoader;\nexports.OBJLoader = THREE.OBJLoader;\n"]}