{"version":3,"sources":["jsdelivr-header.js","/npm/three-ply-loader@1.0.0/index.js"],"names":[],"mappings":"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","file":"/npm/three-ply-loader@1.0.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/three-ply-loader@1.0.0/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","\"use strict\";\nvar THREE = require('three');\n\nmodule.exports = function(THREE) {\n\tTHREE.PLYLoader = function ( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n\t\tthis.propertyNameMapping = {};\n\n\t};\n\n\tTHREE.PLYLoader.prototype = {\n\n\t\tconstructor: THREE.PLYLoader,\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( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\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\tsetPropertyNameMapping: function ( mapping ) {\n\n\t\t\tthis.propertyNameMapping = mapping;\n\n\t\t},\n\n\t\tparse: function ( data ) {\n\n\t\t\tfunction isASCII( data ) {\n\n\t\t\t\tvar header = parseHeader( bin2str( data ) );\n\t\t\t\treturn header.format === 'ascii';\n\n\t\t\t}\n\n\t\t\tfunction bin2str( buf ) {\n\n\t\t\t\tvar array_buffer = new Uint8Array( buf );\n\t\t\t\tvar str = '';\n\n\t\t\t\tfor ( var i = 0; i < buf.byteLength; i ++ ) {\n\n\t\t\t\t\tstr += String.fromCharCode( array_buffer[ i ] ); // implicitly assumes little-endian\n\n\t\t\t\t}\n\n\t\t\t\treturn str;\n\n\t\t\t}\n\n\t\t\tfunction parseHeader( data ) {\n\n\t\t\t\tvar patternHeader = /ply([\\s\\S]*)end_header\\s/;\n\t\t\t\tvar headerText = '';\n\t\t\t\tvar headerLength = 0;\n\t\t\t\tvar result = patternHeader.exec( data );\n\n\t\t\t\tif ( result !== null ) {\n\n\t\t\t\t\theaderText = result [ 1 ];\n\t\t\t\t\theaderLength = result[ 0 ].length;\n\n\t\t\t\t}\n\n\t\t\t\tvar header = {\n\t\t\t\t\tcomments: [],\n\t\t\t\t\telements: [],\n\t\t\t\t\theaderLength: headerLength\n\t\t\t\t};\n\n\t\t\t\tvar lines = headerText.split( '\\n' );\n\t\t\t\tvar currentElement;\n\t\t\t\tvar lineType, lineValues;\n\n\t\t\t\tfunction make_ply_element_property( propertValues, propertyNameMapping ) {\n\n\t\t\t\t\tvar property = { type: propertValues[ 0 ] };\n\n\t\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\t\tproperty.name = propertValues[ 3 ];\n\t\t\t\t\t\tproperty.countType = propertValues[ 1 ];\n\t\t\t\t\t\tproperty.itemType = propertValues[ 2 ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tproperty.name = propertValues[ 1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( property.name in propertyNameMapping ) {\n\n\t\t\t\t\t\tproperty.name = propertyNameMapping[ property.name ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn property;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\t\t\tvar line = lines[ i ];\n\t\t\t\t\tline = line.trim();\n\n\t\t\t\t\tif ( line === '' ) continue;\n\n\t\t\t\t\tlineValues = line.split( /\\s+/ );\n\t\t\t\t\tlineType = lineValues.shift();\n\t\t\t\t\tline = lineValues.join( ' ' );\n\n\t\t\t\t\tswitch ( lineType ) {\n\n\t\t\t\t\t\tcase 'format':\n\n\t\t\t\t\t\t\theader.format = lineValues[ 0 ];\n\t\t\t\t\t\t\theader.version = lineValues[ 1 ];\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'comment':\n\n\t\t\t\t\t\t\theader.comments.push( line );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'element':\n\n\t\t\t\t\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\t\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcurrentElement = {};\n\t\t\t\t\t\t\tcurrentElement.name = lineValues[ 0 ];\n\t\t\t\t\t\t\tcurrentElement.count = parseInt( lineValues[ 1 ] );\n\t\t\t\t\t\t\tcurrentElement.properties = [];\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'property':\n\n\t\t\t\t\t\t\tcurrentElement.properties.push( make_ply_element_property( lineValues, scope.propertyNameMapping ) );\n\n\t\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.log( 'unhandled', lineType, lineValues );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t}\n\n\t\t\tfunction parseASCIINumber( n, type ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'char': case 'uchar': case 'short': case 'ushort': case 'int': case 'uint':\n\t\t\t\tcase 'int8': case 'uint8': case 'int16': case 'uint16': case 'int32': case 'uint32':\n\n\t\t\t\t\treturn parseInt( n );\n\n\t\t\t\tcase 'float': case 'double': case 'float32': case 'float64':\n\n\t\t\t\t\treturn parseFloat( n );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseASCIIElement( properties, line ) {\n\n\t\t\t\tvar values = line.split( /\\s+/ );\n\n\t\t\t\tvar element = {};\n\n\t\t\t\tfor ( var i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\t\tif ( properties[ i ].type === 'list' ) {\n\n\t\t\t\t\t\tvar list = [];\n\t\t\t\t\t\tvar n = parseASCIINumber( values.shift(), properties[ i ].countType );\n\n\t\t\t\t\t\tfor ( var j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\t\tlist.push( parseASCIINumber( values.shift(), properties[ i ].itemType ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telement[ properties[ i ].name ] = list;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\telement[ properties[ i ].name ] = parseASCIINumber( values.shift(), properties[ i ].type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn element;\n\n\t\t\t}\n\n\t\t\tfunction parseASCII( data ) {\n\n\t\t\t\t// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n\t\t\t\tvar buffer = {\n\t\t\t\t\tindices : [],\n\t\t\t\t\tvertices : [],\n\t\t\t\t\tnormals : [],\n\t\t\t\t\tuvs : [],\n\t\t\t\t\tcolors : []\n\t\t\t\t};\n\n\t\t\t\tvar result;\n\n\t\t\t\tvar header = parseHeader( data );\n\n\t\t\t\tvar patternBody = /end_header\\s([\\s\\S]*)$/;\n\t\t\t\tvar body = '';\n\t\t\t\tif ( ( result = patternBody.exec( data ) ) !== null ) {\n\n\t\t\t\t\tbody = result [ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tvar lines = body.split( '\\n' );\n\t\t\t\tvar currentElement = 0;\n\t\t\t\tvar currentElementCount = 0;\n\n\t\t\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\t\t\tvar line = lines[ i ];\n\t\t\t\t\tline = line.trim();\n\t\t\t\t\tif ( line === '' ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( currentElementCount >= header.elements[ currentElement ].count ) {\n\n\t\t\t\t\t\tcurrentElement ++;\n\t\t\t\t\t\tcurrentElementCount = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar element = parseASCIIElement( header.elements[ currentElement ].properties, line );\n\n\t\t\t\t\thandleElement( buffer, header.elements[ currentElement ].name, element );\n\n\t\t\t\t\tcurrentElementCount ++;\n\n\t\t\t\t}\n\n\t\t\t\treturn postProcess( buffer );\n\n\t\t\t}\n\n\t\t\tfunction postProcess( buffer ) {\n\n\t\t\t\tvar geometry = new THREE.BufferGeometry();\n\n\t\t\t\t// mandatory buffer data\n\n\t\t\t\tif ( buffer.indices.length > 0 ) {\n\n\t\t\t\t\tgeometry.setIndex( buffer.indices );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( buffer.vertices, 3 ) );\n\n\t\t\t\t// optional buffer data\n\n\t\t\t\tif ( buffer.normals.length > 0 ) {\n\n\t\t\t\t\tgeometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( buffer.normals, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( buffer.uvs.length > 0 ) {\n\n\t\t\t\t\tgeometry.addAttribute( 'uv', new THREE.Float32BufferAttribute( buffer.uvs, 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( buffer.colors.length > 0 ) {\n\n\t\t\t\t\tgeometry.addAttribute( 'color', new THREE.Float32BufferAttribute( buffer.colors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\tfunction handleElement( buffer, elementName, element ) {\n\n\t\t\t\tif ( elementName === 'vertex' ) {\n\n\t\t\t\t\tbuffer.vertices.push( element.x, element.y, element.z );\n\n\t\t\t\t\tif ( 'nx' in element && 'ny' in element && 'nz' in element ) {\n\n\t\t\t\t\t\tbuffer.normals.push( element.nx, element.ny, element.nz );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 's' in element && 't' in element ) {\n\n\t\t\t\t\t\tbuffer.uvs.push( element.s, element.t );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'red' in element && 'green' in element && 'blue' in element ) {\n\n\t\t\t\t\t\tbuffer.colors.push( element.red / 255.0, element.green / 255.0, element.blue / 255.0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( elementName === 'face' ) {\n\n\t\t\t\t\tvar vertex_indices = element.vertex_indices || element.vertex_index; // issue #9338\n\n\t\t\t\t\tif ( vertex_indices.length === 3 ) {\n\n\t\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 2 ] );\n\n\t\t\t\t\t} else if ( vertex_indices.length === 4 ) {\n\n\t\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 3 ] );\n\t\t\t\t\t\tbuffer.indices.push( vertex_indices[ 1 ], vertex_indices[ 2 ], vertex_indices[ 3 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction binaryRead( dataview, at, type, little_endian ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t// corespondences for non-specific length types here match rply:\n\t\t\t\t\tcase 'int8':\t\tcase 'char':\t return [ dataview.getInt8( at ), 1 ];\n\t\t\t\t\tcase 'uint8':\t\tcase 'uchar':\t return [ dataview.getUint8( at ), 1 ];\n\t\t\t\t\tcase 'int16':\t\tcase 'short':\t return [ dataview.getInt16( at, little_endian ), 2 ];\n\t\t\t\t\tcase 'uint16':\tcase 'ushort': return [ dataview.getUint16( at, little_endian ), 2 ];\n\t\t\t\t\tcase 'int32':\t\tcase 'int':\t\t return [ dataview.getInt32( at, little_endian ), 4 ];\n\t\t\t\t\tcase 'uint32':\tcase 'uint':\t return [ dataview.getUint32( at, little_endian ), 4 ];\n\t\t\t\t\tcase 'float32': case 'float':\t return [ dataview.getFloat32( at, little_endian ), 4 ];\n\t\t\t\t\tcase 'float64': case 'double': return [ dataview.getFloat64( at, little_endian ), 8 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction binaryReadElement( dataview, at, properties, little_endian ) {\n\n\t\t\t\tvar element = {};\n\t\t\t\tvar result, read = 0;\n\n\t\t\t\tfor ( var i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\t\tif ( properties[ i ].type === 'list' ) {\n\n\t\t\t\t\t\tvar list = [];\n\n\t\t\t\t\t\tresult = binaryRead( dataview, at + read, properties[ i ].countType, little_endian );\n\t\t\t\t\t\tvar n = result[ 0 ];\n\t\t\t\t\t\tread += result[ 1 ];\n\n\t\t\t\t\t\tfor ( var j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\t\tresult = binaryRead( dataview, at + read, properties[ i ].itemType, little_endian );\n\t\t\t\t\t\t\tlist.push( result[ 0 ] );\n\t\t\t\t\t\t\tread += result[ 1 ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telement[ properties[ i ].name ] = list;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tresult = binaryRead( dataview, at + read, properties[ i ].type, little_endian );\n\t\t\t\t\t\telement[ properties[ i ].name ] = result[ 0 ];\n\t\t\t\t\t\tread += result[ 1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn [ element, read ];\n\n\t\t\t}\n\n\t\t\tfunction parseBinary( data ) {\n\n\t\t\t\tvar buffer = {\n\t\t\t\t\tindices : [],\n\t\t\t\t\tvertices : [],\n\t\t\t\t\tnormals : [],\n\t\t\t\t\tuvs : [],\n\t\t\t\t\tcolors : []\n\t\t\t\t};\n\n\t\t\t\tvar header = parseHeader( bin2str( data ) );\n\t\t\t\tvar little_endian = ( header.format === 'binary_little_endian' );\n\t\t\t\tvar body = new DataView( data, header.headerLength );\n\t\t\t\tvar result, loc = 0;\n\n\t\t\t\tfor ( var currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {\n\n\t\t\t\t\tfor ( var currentElementCount = 0; currentElementCount < header.elements[ currentElement ].count; currentElementCount ++ ) {\n\n\t\t\t\t\t\tresult = binaryReadElement( body, loc, header.elements[ currentElement ].properties, little_endian );\n\t\t\t\t\t\tloc += result[ 1 ];\n\t\t\t\t\t\tvar element = result[ 0 ];\n\n\t\t\t\t\t\thandleElement( buffer, header.elements[ currentElement ].name, element );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn postProcess( buffer );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar geometry;\n\t\t\tvar scope = this;\n\n\t\t\tif ( data instanceof ArrayBuffer ) {\n\n\t\t\t\tgeometry = isASCII( data ) ? parseASCII( bin2str( data ) ) : parseBinary( data );\n\n\t\t\t} else {\n\n\t\t\t\tgeometry = parseASCII( data );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t};\n};"]}