{"mappings":"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","names":["BufferAttribute","BufferGeometry","Color","FileLoader","Float32BufferAttribute","Loader","Vector3","STLLoader","manager","url","onLoad","onProgress","onError","scope","loader","text","e","data","isBinary","reader","face_size","n_faces","solid","off","matchDataViewAt","query","offset","i","il","parseBinary","faces","r","g","b","hasColors","colors","defaultR","defaultG","defaultB","alpha","index","dataOffset","faceLength","geometry","vertices","normals","color","face","start","normalX","normalY","normalZ","packedColor","vertexstart","componentIdx","parseASCII","patternSolid","patternFace","patternName","faceCounter","patternFloat","patternVertex","patternNormal","groupNames","normal","result","groupCount","startVertex","endVertex","name","vertexCountPerFace","normalCountPerFace","count","ensureString","buffer","ensureBinary","array_buffer","binData"],"sources":["../esm/npm/three@0.160.0/node_modules/three/examples/jsm/loaders/STLLoader.js"],"sourcesContent":["import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tVector3\n} from 'three';\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n *  Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n *  There is perhaps some question as to how valid it is to always assume little-endian-ness.\n *  ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *  const loader = new STLLoader();\n *  loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n *    scene.add( new THREE.Mesh( geometry ) );\n *  });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n *  // use the same code to load STL as above\n *  if (geometry.hasColors) {\n *    material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n *  } else { .... }\n *  const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n *  const materials = [];\n *  const nGeometryGroups = geometry.groups.length;\n *\n *  const colorMap = ...; // Some logic to index colors.\n *\n *  for (let i = 0; i \u003c nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n *  }\n *\n *  materials.push(material);\n *  const mesh = new THREE.Mesh(geometry, materials);\n */\n\n\nclass STLLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( data ) {\n\n\t\tfunction isBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst face_size = ( 32 / 8 * 3 ) + ( ( 32 / 8 * 3 ) * 3 ) + ( 16 / 8 );\n\t\t\tconst n_faces = reader.getUint32( 80, true );\n\t\t\tconst expect = 80 + ( 32 / 8 ) + ( n_faces * face_size );\n\n\t\t\tif ( expect === reader.byteLength ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// An ASCII STL data must begin with 'solid ' as the first six bytes.\n\t\t\t// However, ASCII STLs lacking the SPACE after the 'd' are known to be\n\t\t\t// plentiful.  So, check the first 5 bytes for 'solid'.\n\n\t\t\t// Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n\t\t\t// https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n\t\t\t// Search for \"solid\" to start anywhere after those prefixes.\n\n\t\t\t// US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n\t\t\tconst solid = [ 115, 111, 108, 105, 100 ];\n\n\t\t\tfor ( let off = 0; off \u003c 5; off ++ ) {\n\n\t\t\t\t// If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n\t\t\t\tif ( matchDataViewAt( solid, reader, off ) ) return false;\n\n\t\t\t}\n\n\t\t\t// Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction matchDataViewAt( query, reader, offset ) {\n\n\t\t\t// Check if each byte in query matches the corresponding byte from the current offset\n\n\t\t\tfor ( let i = 0, il = query.length; i \u003c il; i ++ ) {\n\n\t\t\t\tif ( query[ i ] !== reader.getUint8( offset + i ) ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction parseBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst faces = reader.getUint32( 80, true );\n\n\t\t\tlet r, g, b, hasColors = false, colors;\n\t\t\tlet defaultR, defaultG, defaultB, alpha;\n\n\t\t\t// process STL header\n\t\t\t// check for default color in header (\"COLOR=rgba\" sequence).\n\n\t\t\tfor ( let index = 0; index \u003c 80 - 10; index ++ ) {\n\n\t\t\t\tif ( ( reader.getUint32( index, false ) == 0x434F4C4F /*COLO*/ ) \u0026\u0026\n\t\t\t\t\t( reader.getUint8( index + 4 ) == 0x52 /*'R'*/ ) \u0026\u0026\n\t\t\t\t\t( reader.getUint8( index + 5 ) == 0x3D /*'='*/ ) ) {\n\n\t\t\t\t\thasColors = true;\n\t\t\t\t\tcolors = new Float32Array( faces * 3 * 3 );\n\n\t\t\t\t\tdefaultR = reader.getUint8( index + 6 ) / 255;\n\t\t\t\t\tdefaultG = reader.getUint8( index + 7 ) / 255;\n\t\t\t\t\tdefaultB = reader.getUint8( index + 8 ) / 255;\n\t\t\t\t\talpha = reader.getUint8( index + 9 ) / 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst dataOffset = 84;\n\t\t\tconst faceLength = 12 * 4 + 2;\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst vertices = new Float32Array( faces * 3 * 3 );\n\t\t\tconst normals = new Float32Array( faces * 3 * 3 );\n\n\t\t\tconst color = new Color();\n\n\t\t\tfor ( let face = 0; face \u003c faces; face ++ ) {\n\n\t\t\t\tconst start = dataOffset + face * faceLength;\n\t\t\t\tconst normalX = reader.getFloat32( start, true );\n\t\t\t\tconst normalY = reader.getFloat32( start + 4, true );\n\t\t\t\tconst normalZ = reader.getFloat32( start + 8, true );\n\n\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\tconst packedColor = reader.getUint16( start + 48, true );\n\n\t\t\t\t\tif ( ( packedColor \u0026 0x8000 ) === 0 ) {\n\n\t\t\t\t\t\t// facet has its own unique color\n\n\t\t\t\t\t\tr = ( packedColor \u0026 0x1F ) / 31;\n\t\t\t\t\t\tg = ( ( packedColor \u003e\u003e 5 ) \u0026 0x1F ) / 31;\n\t\t\t\t\t\tb = ( ( packedColor \u003e\u003e 10 ) \u0026 0x1F ) / 31;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tr = defaultR;\n\t\t\t\t\t\tg = defaultG;\n\t\t\t\t\t\tb = defaultB;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 1; i \u003c= 3; i ++ ) {\n\n\t\t\t\t\tconst vertexstart = start + i * 12;\n\t\t\t\t\tconst componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );\n\n\t\t\t\t\tvertices[ componentIdx ] = reader.getFloat32( vertexstart, true );\n\t\t\t\t\tvertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );\n\t\t\t\t\tvertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );\n\n\t\t\t\t\tnormals[ componentIdx ] = normalX;\n\t\t\t\t\tnormals[ componentIdx + 1 ] = normalY;\n\t\t\t\t\tnormals[ componentIdx + 2 ] = normalZ;\n\n\t\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\t\tcolor.set( r, g, b ).convertSRGBToLinear();\n\n\t\t\t\t\t\tcolors[ componentIdx ] = color.r;\n\t\t\t\t\t\tcolors[ componentIdx + 1 ] = color.g;\n\t\t\t\t\t\tcolors[ componentIdx + 2 ] = color.b;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\tif ( hasColors ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\t\t\t\tgeometry.hasColors = true;\n\t\t\t\tgeometry.alpha = alpha;\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction parseASCII( data ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tconst patternSolid = /solid([\\s\\S]*?)endsolid/g;\n\t\t\tconst patternFace = /facet([\\s\\S]*?)endfacet/g;\n\t\t\tconst patternName = /solid\\s(.+)/;\n\t\t\tlet faceCounter = 0;\n\n\t\t\tconst patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source;\n\t\t\tconst patternVertex = new RegExp( 'vertex' + patternFloat + patternFloat + patternFloat, 'g' );\n\t\t\tconst patternNormal = new RegExp( 'normal' + patternFloat + patternFloat + patternFloat, 'g' );\n\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst groupNames = [];\n\n\t\t\tconst normal = new Vector3();\n\n\t\t\tlet result;\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet startVertex = 0;\n\t\t\tlet endVertex = 0;\n\n\t\t\twhile ( ( result = patternSolid.exec( data ) ) !== null ) {\n\n\t\t\t\tstartVertex = endVertex;\n\n\t\t\t\tconst solid = result[ 0 ];\n\n\t\t\t\tconst name = ( result = patternName.exec( solid ) ) !== null ? result[ 1 ] : '';\n\t\t\t\tgroupNames.push( name );\n\n\t\t\t\twhile ( ( result = patternFace.exec( solid ) ) !== null ) {\n\n\t\t\t\t\tlet vertexCountPerFace = 0;\n\t\t\t\t\tlet normalCountPerFace = 0;\n\n\t\t\t\t\tconst text = result[ 0 ];\n\n\t\t\t\t\twhile ( ( result = patternNormal.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tnormal.x = parseFloat( result[ 1 ] );\n\t\t\t\t\t\tnormal.y = parseFloat( result[ 2 ] );\n\t\t\t\t\t\tnormal.z = parseFloat( result[ 3 ] );\n\t\t\t\t\t\tnormalCountPerFace ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( ( result = patternVertex.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tvertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );\n\t\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\t\t\t\t\t\tvertexCountPerFace ++;\n\t\t\t\t\t\tendVertex ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// every face have to own ONE valid normal\n\n\t\t\t\t\tif ( normalCountPerFace !== 1 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the normal of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// each face have to own THREE valid vertices\n\n\t\t\t\t\tif ( vertexCountPerFace !== 3 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the vertices of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCounter ++;\n\n\t\t\t\t}\n\n\t\t\t\tconst start = startVertex;\n\t\t\t\tconst count = endVertex - startVertex;\n\n\t\t\t\tgeometry.userData.groupNames = groupNames;\n\n\t\t\t\tgeometry.addGroup( start, count, groupCount );\n\t\t\t\tgroupCount ++;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction ensureString( buffer ) {\n\n\t\t\tif ( typeof buffer !== 'string' ) {\n\n\t\t\t\treturn new TextDecoder().decode( buffer );\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction ensureBinary( buffer ) {\n\n\t\t\tif ( typeof buffer === 'string' ) {\n\n\t\t\t\tconst array_buffer = new Uint8Array( buffer.length );\n\t\t\t\tfor ( let i = 0; i \u003c buffer.length; i ++ ) {\n\n\t\t\t\t\tarray_buffer[ i ] = buffer.charCodeAt( i ) \u0026 0xff; // implicitly assumes little-endian\n\n\t\t\t\t}\n\n\t\t\t\treturn array_buffer.buffer || array_buffer;\n\n\t\t\t} else {\n\n\t\t\t\treturn buffer;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// start\n\n\t\tconst binData = ensureBinary( data );\n\n\t\treturn isBinary( binData ) ? parseBinary( binData ) : parseASCII( ensureString( data ) );\n\n\t}\n\n}\n\nexport { STLLoader };\n"],"version":3}
