UNPKG

@loaders.gl/obj

Version:

Framework-independent loader for the OBJ format

8 lines (7 loc) 45.3 kB
{ "version": 3, "sources": ["../src/index.ts", "../src/obj-format.ts", "../src/lib/parse-obj.ts", "../src/lib/parse-obj-meshes.ts", "../src/lib/get-obj-schema.ts", "../src/obj-loader.ts", "../src/obj-arrow-loader.ts", "../src/mtl-format.ts", "../src/lib/parse-mtl.ts", "../src/mtl-loader.ts"], "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n\n// OBJLoader\n\nexport {OBJFormat} from './obj-format';\nexport type {OBJLoaderOptions} from './obj-loader';\nexport {OBJWorkerLoader, OBJLoader} from './obj-loader';\nexport {OBJArrowLoader} from './obj-arrow-loader';\n\n// MTLLoader\n\nexport {MTLFormat} from './mtl-format';\nexport type {MTLLoaderOptions} from './mtl-loader';\nexport {MTLWorkerLoader, MTLLoader} from './mtl-loader';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Format} from '@loaders.gl/loader-utils';\n\n/**\n * The OBJ geometry format\n */\nexport const OBJFormat = {\n name: 'OBJ',\n id: 'obj',\n module: 'obj',\n extensions: ['obj'],\n mimeTypes: ['text/plain']\n} as const satisfies Format;\n", "import type {Mesh, MeshAttributes} from '@loaders.gl/schema';\nimport {getMeshBoundingBox} from '@loaders.gl/schema-utils';\nimport {parseOBJMeshes} from './parse-obj-meshes';\nimport {getOBJSchema} from './get-obj-schema';\n\nexport function parseOBJ(text: string, options?): Mesh {\n const {meshes} = parseOBJMeshes(text);\n\n // @ts-expect-error\n const vertexCount = meshes.reduce((s, mesh) => s + mesh.header.vertexCount, 0);\n // TODO - render objects separately\n const attributes = mergeAttributes(meshes, vertexCount);\n\n const header = {\n vertexCount,\n // @ts-ignore Need to export Attributes type\n boundingBox: getMeshBoundingBox(attributes)\n };\n\n const schema = getOBJSchema(attributes, {\n mode: 4,\n boundingBox: header.boundingBox\n });\n\n return {\n // Data return by this loader implementation\n loaderData: {\n header: {}\n },\n\n // Normalised data\n schema,\n header,\n mode: 4, // TRIANGLES\n topology: 'point-list',\n\n attributes\n };\n}\n\n// eslint-disable-next-line max-statements\nfunction mergeAttributes(meshes, vertexCount): MeshAttributes {\n const positions = new Float32Array(vertexCount * 3);\n let normals;\n let colors;\n let uvs;\n let i = 0;\n\n for (const mesh of meshes) {\n const {POSITION, NORMAL, COLOR_0, TEXCOORD_0} = mesh.attributes;\n\n positions.set(POSITION.value, i * 3);\n\n if (NORMAL) {\n normals = normals || new Float32Array(vertexCount * 3);\n normals.set(NORMAL.value, i * 3);\n }\n if (COLOR_0) {\n colors = colors || new Float32Array(vertexCount * 3);\n colors.set(COLOR_0.value, i * 3);\n }\n if (TEXCOORD_0) {\n uvs = uvs || new Float32Array(vertexCount * 2);\n uvs.set(TEXCOORD_0.value, i * 2);\n }\n\n i += POSITION.value.length / 3;\n }\n\n const attributes: MeshAttributes = {};\n attributes.POSITION = {value: positions, size: 3};\n\n if (normals) {\n attributes.NORMAL = {value: normals, size: 3};\n }\n if (colors) {\n attributes.COLOR_0 = {value: colors, size: 3};\n }\n if (uvs) {\n attributes.TEXCOORD_0 = {value: uvs, size: 2};\n }\n\n return attributes;\n}\n", "// OBJ Loader, adapted from THREE.js (MIT license)\n//\n// Attributions per original THREE.js source file:\n//\n// @author mrdoob / http://mrdoob.com/\n\n// @ts-nocheck\n\n// o object_name | g group_name\nconst OBJECT_RE = /^[og]\\s*(.+)?/;\n// mtllib file_reference\nconst MATERIAL_RE = /^mtllib /;\n// usemtl material_name\nconst MATERIAL_USE_RE = /^usemtl /;\n\nclass MeshMaterial {\n constructor({index, name = '', mtllib, smooth, groupStart}) {\n this.index = index;\n this.name = name;\n this.mtllib = mtllib;\n this.smooth = smooth;\n this.groupStart = groupStart;\n this.groupEnd = -1;\n this.groupCount = -1;\n this.inherited = false;\n }\n\n clone(index = this.index) {\n return new MeshMaterial({\n index,\n name: this.name,\n mtllib: this.mtllib,\n smooth: this.smooth,\n groupStart: 0\n });\n }\n}\n\nclass MeshObject {\n constructor(name = '') {\n this.name = name;\n\n this.geometry = {\n vertices: [],\n normals: [],\n colors: [],\n uvs: []\n };\n\n this.materials = [];\n this.smooth = true;\n\n this.fromDeclaration = null;\n }\n\n startMaterial(name, libraries) {\n const previous = this._finalize(false);\n\n // New usemtl declaration overwrites an inherited material, except if faces were declared\n // after the material, then it must be preserved for proper MultiMaterial continuation.\n if (previous && (previous.inherited || previous.groupCount <= 0)) {\n this.materials.splice(previous.index, 1);\n }\n\n const material = new MeshMaterial({\n index: this.materials.length,\n name,\n mtllib:\n Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : '',\n smooth: previous !== undefined ? previous.smooth : this.smooth,\n groupStart: previous !== undefined ? previous.groupEnd : 0\n });\n\n this.materials.push(material);\n\n return material;\n }\n\n currentMaterial() {\n if (this.materials.length > 0) {\n return this.materials[this.materials.length - 1];\n }\n\n return undefined;\n }\n\n _finalize(end) {\n const lastMultiMaterial = this.currentMaterial();\n if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) {\n lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n lastMultiMaterial.inherited = false;\n }\n\n // Ignore objects tail materials if no face declarations followed them before a new o/g started.\n if (end && this.materials.length > 1) {\n for (let mi = this.materials.length - 1; mi >= 0; mi--) {\n if (this.materials[mi].groupCount <= 0) {\n this.materials.splice(mi, 1);\n }\n }\n }\n\n // Guarantee at least one empty material, this makes the creation later more straight forward.\n if (end && this.materials.length === 0) {\n this.materials.push({\n name: '',\n smooth: this.smooth\n });\n }\n\n return lastMultiMaterial;\n }\n}\n\nclass ParserState {\n constructor() {\n this.objects = [];\n this.object = null;\n\n this.vertices = [];\n this.normals = [];\n this.colors = [];\n this.uvs = [];\n\n this.materialLibraries = [];\n\n this.startObject('', false);\n }\n\n startObject(name, fromDeclaration = true) {\n // If the current object (initial from reset) is not from a g/o declaration in the parsed\n // file. We need to use it for the first parsed g/o to keep things in sync.\n if (this.object && !this.object.fromDeclaration) {\n this.object.name = name;\n this.object.fromDeclaration = fromDeclaration;\n return;\n }\n\n const previousMaterial =\n this.object && typeof this.object.currentMaterial === 'function'\n ? this.object.currentMaterial()\n : undefined;\n\n if (this.object && typeof this.object._finalize === 'function') {\n this.object._finalize(true);\n }\n\n this.object = new MeshObject(name);\n this.object.fromDeclaration = fromDeclaration;\n\n // Inherit previous objects material.\n // Spec tells us that a declared material must be set to all objects until a new material is declared.\n // If a usemtl declaration is encountered while this new object is being parsed, it will\n // overwrite the inherited material. Exception being that there was already face declarations\n // to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function') {\n const declared = previousMaterial.clone(0);\n declared.inherited = true;\n this.object.materials.push(declared);\n }\n\n this.objects.push(this.object);\n }\n\n finalize() {\n if (this.object && typeof this.object._finalize === 'function') {\n this.object._finalize(true);\n }\n }\n\n parseVertexIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 3) * 3;\n }\n\n parseNormalIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 3) * 3;\n }\n\n parseUVIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 2) * 2;\n }\n\n addVertex(a, b, c) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addVertexPoint(a) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n }\n\n addVertexLine(a) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n }\n\n addNormal(a, b, c) {\n const src = this.normals;\n const dst = this.object.geometry.normals;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addColor(a, b, c) {\n const src = this.colors;\n const dst = this.object.geometry.colors;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addUV(a, b, c) {\n const src = this.uvs;\n const dst = this.object.geometry.uvs;\n\n dst.push(src[a + 0], src[a + 1]);\n dst.push(src[b + 0], src[b + 1]);\n dst.push(src[c + 0], src[c + 1]);\n }\n\n addUVLine(a) {\n const src = this.uvs;\n const dst = this.object.geometry.uvs;\n\n dst.push(src[a + 0], src[a + 1]);\n }\n\n // eslint-disable-next-line max-params\n addFace(a, b, c, ua, ub, uc, na, nb, nc) {\n const vLen = this.vertices.length;\n\n let ia = this.parseVertexIndex(a, vLen);\n let ib = this.parseVertexIndex(b, vLen);\n let ic = this.parseVertexIndex(c, vLen);\n\n this.addVertex(ia, ib, ic);\n\n if (ua !== undefined && ua !== '') {\n const uvLen = this.uvs.length;\n ia = this.parseUVIndex(ua, uvLen);\n ib = this.parseUVIndex(ub, uvLen);\n ic = this.parseUVIndex(uc, uvLen);\n this.addUV(ia, ib, ic);\n }\n\n if (na !== undefined && na !== '') {\n // Normals are many times the same. If so, skip function call and parseInt.\n const nLen = this.normals.length;\n ia = this.parseNormalIndex(na, nLen);\n\n ib = na === nb ? ia : this.parseNormalIndex(nb, nLen);\n ic = na === nc ? ia : this.parseNormalIndex(nc, nLen);\n\n this.addNormal(ia, ib, ic);\n }\n\n if (this.colors.length > 0) {\n this.addColor(ia, ib, ic);\n }\n }\n\n addPointGeometry(vertices) {\n this.object.geometry.type = 'Points';\n\n const vLen = this.vertices.length;\n\n for (const vertex of vertices) {\n this.addVertexPoint(this.parseVertexIndex(vertex, vLen));\n }\n }\n\n addLineGeometry(vertices, uvs) {\n this.object.geometry.type = 'Line';\n\n const vLen = this.vertices.length;\n const uvLen = this.uvs.length;\n\n for (const vertex of vertices) {\n this.addVertexLine(this.parseVertexIndex(vertex, vLen));\n }\n\n for (const uv of uvs) {\n this.addUVLine(this.parseUVIndex(uv, uvLen));\n }\n }\n}\n\n// eslint-disable-next-line max-statements, complexity\nexport function parseOBJMeshes(text) {\n const state = new ParserState();\n\n if (text.indexOf('\\r\\n') !== -1) {\n // This is faster than String.split with regex that splits on both\n text = text.replace(/\\r\\n/g, '\\n');\n }\n\n if (text.indexOf('\\\\\\n') !== -1) {\n // join lines separated by a line continuation character (\\)\n text = text.replace(/\\\\\\n/g, '');\n }\n\n const lines = text.split('\\n');\n let line = '';\n let lineFirstChar = '';\n let lineLength = 0;\n let result = [];\n\n // Faster to just trim left side of the line. Use if available.\n const trimLeft = typeof ''.trimLeft === 'function';\n\n /* eslint-disable no-continue, max-depth */\n for (let i = 0, l = lines.length; i < l; i++) {\n line = lines[i];\n line = trimLeft ? line.trimLeft() : line.trim();\n lineLength = line.length;\n\n if (lineLength === 0) continue;\n\n lineFirstChar = line.charAt(0);\n\n // @todo invoke passed in handler if any\n if (lineFirstChar === '#') continue;\n\n if (lineFirstChar === 'v') {\n const data = line.split(/\\s+/);\n\n switch (data[0]) {\n case 'v':\n state.vertices.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));\n if (data.length >= 7) {\n state.colors.push(parseFloat(data[4]), parseFloat(data[5]), parseFloat(data[6]));\n }\n break;\n case 'vn':\n state.normals.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));\n break;\n case 'vt':\n state.uvs.push(parseFloat(data[1]), parseFloat(data[2]));\n break;\n default:\n }\n } else if (lineFirstChar === 'f') {\n const lineData = line.substr(1).trim();\n const vertexData = lineData.split(/\\s+/);\n const faceVertices = [];\n\n // Parse the face vertex data into an easy to work with format\n\n for (let j = 0, jl = vertexData.length; j < jl; j++) {\n const vertex = vertexData[j];\n\n if (vertex.length > 0) {\n const vertexParts = vertex.split('/');\n faceVertices.push(vertexParts);\n }\n }\n\n // Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n const v1 = faceVertices[0];\n\n for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) {\n const v2 = faceVertices[j];\n const v3 = faceVertices[j + 1];\n\n state.addFace(v1[0], v2[0], v3[0], v1[1], v2[1], v3[1], v1[2], v2[2], v3[2]);\n }\n } else if (lineFirstChar === 'l') {\n const lineParts = line.substring(1).trim().split(' ');\n let lineVertices;\n const lineUVs = [];\n\n if (line.indexOf('/') === -1) {\n lineVertices = lineParts;\n } else {\n lineVertices = [];\n for (let li = 0, llen = lineParts.length; li < llen; li++) {\n const parts = lineParts[li].split('/');\n\n if (parts[0] !== '') lineVertices.push(parts[0]);\n if (parts[1] !== '') lineUVs.push(parts[1]);\n }\n }\n state.addLineGeometry(lineVertices, lineUVs);\n } else if (lineFirstChar === 'p') {\n const lineData = line.substr(1).trim();\n const pointData = lineData.split(' ');\n\n state.addPointGeometry(pointData);\n } else if ((result = OBJECT_RE.exec(line)) !== null) {\n // o object_name\n // or\n // g group_name\n\n // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n // var name = result[ 0 ].substr( 1 ).trim();\n const name = (' ' + result[0].substr(1).trim()).substr(1); // eslint-disable-line\n\n state.startObject(name);\n } else if (MATERIAL_USE_RE.test(line)) {\n // material\n\n state.object.startMaterial(line.substring(7).trim(), state.materialLibraries);\n } else if (MATERIAL_RE.test(line)) {\n // mtl file\n\n state.materialLibraries.push(line.substring(7).trim());\n } else if (lineFirstChar === 's') {\n result = line.split(' ');\n\n // smooth shading\n\n // @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n // but does not define a usemtl for each face set.\n // This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n // This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n // where explicit usemtl defines geometry groups.\n // Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n /*\n * http://paulbourke.net/dataformats/obj/\n * or\n * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf\n *\n * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n * than 0.\"\n */\n if (result.length > 1) {\n const value = result[1].trim().toLowerCase();\n state.object.smooth = value !== '0' && value !== 'off';\n } else {\n // ZBrush can produce \"s\" lines #11707\n state.object.smooth = true;\n }\n const material = state.object.currentMaterial();\n if (material) material.smooth = state.object.smooth;\n } else {\n // Handle null terminated files without exception\n if (line === '\\0') continue;\n\n throw new Error(`Unexpected line: \"${line}\"`);\n }\n }\n\n state.finalize();\n\n const meshes = [];\n const materials = [];\n\n for (const object of state.objects) {\n const {geometry} = object;\n\n // Skip o/g line declarations that did not follow with any faces\n if (geometry.vertices.length === 0) continue;\n\n const mesh = {\n header: {\n vertexCount: geometry.vertices.length / 3\n },\n attributes: {}\n };\n\n switch (geometry.type) {\n case 'Points':\n mesh.mode = 0; // GL.POINTS\n break;\n case 'Line':\n mesh.mode = 1; // GL.LINES\n break;\n default:\n mesh.mode = 4; // GL.TRIANGLES\n break;\n }\n\n mesh.attributes.POSITION = {value: new Float32Array(geometry.vertices), size: 3};\n\n if (geometry.normals.length > 0) {\n mesh.attributes.NORMAL = {value: new Float32Array(geometry.normals), size: 3};\n }\n\n if (geometry.colors.length > 0) {\n mesh.attributes.COLOR_0 = {value: new Float32Array(geometry.colors), size: 3};\n }\n\n if (geometry.uvs.length > 0) {\n mesh.attributes.TEXCOORD_0 = {value: new Float32Array(geometry.uvs), size: 2};\n }\n\n // Create materials\n mesh.materials = [];\n for (const sourceMaterial of object.materials) {\n // TODO - support full spec\n const _material = {\n name: sourceMaterial.name,\n flatShading: !sourceMaterial.smooth\n };\n mesh.materials.push(_material);\n materials.push(_material);\n }\n\n mesh.name = object.name;\n meshes.push(mesh);\n }\n\n return {meshes, materials};\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Schema, SchemaMetadata, Field, MeshAttribute} from '@loaders.gl/schema';\nimport {getDataTypeFromArray} from '@loaders.gl/schema-utils';\n\n/** Get Mesh Schema */\nexport function getOBJSchema(\n attributes: Record<string, MeshAttribute>,\n metadata: Record<string, unknown> = {}\n): Schema {\n const stringMetadata: SchemaMetadata = {};\n for (const key in metadata) {\n if (key !== 'value') {\n stringMetadata[key] = JSON.stringify(metadata[key]);\n }\n }\n\n const fields: Field[] = [];\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const field = getFieldFromAttribute(attributeName, attribute);\n fields.push(field);\n }\n\n return {fields, metadata: stringMetadata};\n}\n\n/** Get a Field describing the column from an OBJ attribute */\nfunction getFieldFromAttribute(name: string, attribute: MeshAttribute): Field {\n const metadata: Record<string, string> = {};\n for (const key in attribute) {\n if (key !== 'value') {\n metadata[key] = JSON.stringify(attribute[key]);\n }\n }\n\n let {type} = getDataTypeFromArray(attribute.value);\n const isSingleValue = attribute.size === 1 || attribute.size === undefined;\n if (!isSingleValue) {\n type = {type: 'fixed-size-list', listSize: attribute.size, children: [{name: 'values', type}]};\n }\n return {name, type, nullable: false, metadata};\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {Mesh} from '@loaders.gl/schema';\nimport {OBJFormat} from './obj-format';\nimport {parseOBJ} from './lib/parse-obj';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type OBJLoaderOptions = LoaderOptions & {\n obj?: {\n /** Override the URL to the worker bundle (by default loads from unpkg.com) */\n workerUrl?: string;\n };\n};\n\n/**\n * Worker loader for the OBJ geometry format\n */\nexport const OBJWorkerLoader = {\n ...OBJFormat,\n\n dataType: null as unknown as Mesh,\n batchType: null as never,\n version: VERSION,\n worker: true,\n testText: testOBJFile,\n options: {\n obj: {}\n }\n} as const satisfies Loader<Mesh, never, OBJLoaderOptions>;\n\nfunction testOBJFile(text: string): boolean {\n // TODO - There could be comment line first\n return text[0] === 'v';\n}\n\n// OBJLoader\n\n/**\n * Loader for the OBJ geometry format\n */\nexport const OBJLoader = {\n ...OBJWorkerLoader,\n parse: async (arrayBuffer: ArrayBuffer, options?: OBJLoaderOptions) =>\n parseOBJ(new TextDecoder().decode(arrayBuffer), options),\n parseTextSync: (text: string, options?: OBJLoaderOptions) => parseOBJ(text, options)\n} as const satisfies LoaderWithParser<Mesh, never, OBJLoaderOptions>;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {ArrowTable} from '@loaders.gl/schema';\n\nimport {OBJLoaderOptions, OBJWorkerLoader} from './obj-loader';\nimport {convertMeshToTable} from '@loaders.gl/schema-utils';\nimport {parseOBJ} from './lib/parse-obj';\n\n/**\n * Worker loader for OBJ - Point Cloud Data\n */\nexport const OBJArrowLoader = {\n ...OBJWorkerLoader,\n dataType: null as unknown as ArrowTable,\n batchType: null as never,\n worker: false,\n parse: async (arrayBuffer: ArrayBuffer) => {\n const text = new TextDecoder().decode(arrayBuffer);\n const mesh = parseOBJ(text);\n const arrowTable = convertMeshToTable(mesh, 'arrow-table');\n return arrowTable;\n }\n} as const satisfies LoaderWithParser<ArrowTable, never, OBJLoaderOptions>;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Format} from '@loaders.gl/loader-utils';\n\n/**\n * The MTL material format\n * A Wavefront .mtl file specifying materials\n */\nexport const MTLFormat = {\n name: 'MTL',\n id: 'mtl',\n module: 'mtl',\n extensions: ['mtl'],\n mimeTypes: ['text/plain']\n} as const satisfies Format;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Forked from THREE.js under MIT license\n// https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/MTLLoader.js\n\n// import type {DiffuseMaterial} from '@loaders.gl/schema';\n\nexport type MTLMaterial = {\n name: string;\n ambientColor?: [number, number, number];\n diffuseColor?: [number, number, number];\n specularColor?: [number, number, number];\n emissiveColor?: [number, number, number];\n // specular?: number;\n shininess?: number;\n refraction?: number;\n illumination?: number;\n diffuseTextureUrl?: string;\n emissiveTextureUrl?: string;\n specularTextureUrl?: string;\n};\n\nconst DELIMITER_PATTERN = /\\s+/;\n\n/**\n * Set of options on how to construct materials\n * @param normalizeRGB: RGBs need to be normalized to 0-1 from 0-255 (Default: false, assumed to be already normalized)\n * @param ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's Default: false\n * @param baseUrl - Url relative to which textures are loaded\n */\nexport type ParseMTLOptions = {\n normalizeRGB?: boolean;\n ignoreZeroRGBs?: boolean;\n baseUrl?: string;\n};\n\n/**\n * Parses a MTL file.\n * Parses a Wavefront .mtl file specifying materials\n * http://paulbourke.net/dataformats/mtl/\n * https://www.loc.gov/preservation/digital/formats/fdd/fdd000508.shtml\n *\n * @param text - Content of MTL file\n */\n// eslint-disable-next-line complexity\nexport function parseMTL(text: string, options?: ParseMTLOptions): MTLMaterial[] {\n // const materialsInfo: Record<string, MTLMaterial> = {};\n const materials: MTLMaterial[] = [];\n\n let currentMaterial: MTLMaterial = {name: 'placeholder'};\n\n const lines = text.split('\\n');\n for (let line of lines) {\n line = line.trim();\n\n if (line.length === 0 || line.charAt(0) === '#') {\n // Blank line or comment ignore\n continue; // eslint-disable-line no-continue\n }\n\n const pos = line.indexOf(' ');\n\n let key = pos >= 0 ? line.substring(0, pos) : line;\n key = key.toLowerCase();\n\n let value = pos >= 0 ? line.substring(pos + 1) : '';\n value = value.trim();\n\n switch (key) {\n case 'newmtl':\n // New material\n currentMaterial = {name: value};\n // insert into map\n materials.push(currentMaterial);\n break;\n\n case 'ka': // Ka\n currentMaterial.ambientColor = parseColor(value);\n break;\n\n case 'kd':\n // Kd: Diffuse color (color under white light) using RGB values\n currentMaterial.diffuseColor = parseColor(value);\n break;\n case 'map_kd':\n // Diffuse texture map\n currentMaterial.diffuseTextureUrl = value;\n // setMapForType('map', value);\n break;\n\n case 'ks':\n // Specular color (color when light is reflected from shiny surface) using RGB values\n currentMaterial.specularColor = parseColor(value);\n break;\n case 'map_ks':\n // Specular map\n currentMaterial.specularTextureUrl = value;\n // setMapForType('specularMap', value);\n break;\n\n case 'ke':\n // Emissive using RGB values\n currentMaterial.emissiveColor = parseColor(value);\n break;\n case 'map_ke':\n // Emissive map\n currentMaterial.emissiveTextureUrl = value;\n // setMapForType('emissiveMap', value);\n break;\n\n case 'ns':\n // Ns is material specular exponent (defines the focus of the specular highlight)\n // A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.\n currentMaterial.shininess = parseFloat(value);\n break;\n case 'map_ns':\n // Ns is material specular exponent\n // TODO?\n // currentMaterial.shininessMap = parseFloat(value);\n break;\n case 'ni':\n currentMaterial.refraction = parseFloat(value);\n break;\n case 'illum':\n currentMaterial.illumination = parseFloat(value);\n break;\n\n default:\n // log unknown message?\n break;\n\n /*\n case 'norm':\n setMapForType('normalMap', value);\n break;\n\n case 'map_bump':\n case 'bump':\n // Bump texture map\n setMapForType('bumpMap', value);\n break;\n\n case 'd':\n n = parseFloat(value);\n if (n < 1) {\n params.opacity = n;\n params.transparent = true;\n }\n break;\n\n case 'map_d':\n // Alpha map\n setMapForType('alphaMap', value);\n params.transparent = true;\n break;\n\n case 'tr':\n n = parseFloat(value);\n if (this.options && this.options.invertTrProperty) n = 1 - n;\n if (n > 0) {\n params.opacity = 1 - n;\n params.transparent = true;\n }\n */\n }\n }\n\n return materials;\n}\n\nfunction parseColor(value: string, options?: ParseMTLOptions): [number, number, number] {\n const rgb = value.split(DELIMITER_PATTERN, 3);\n const color: [number, number, number] = [\n parseFloat(rgb[0]),\n parseFloat(rgb[1]),\n parseFloat(rgb[2])\n ];\n // TODO auto detect big values?\n // if (this.options && this.options.normalizeRGB) {\n // value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];\n // }\n\n // if (this.options && this.options.ignoreZeroRGBs) {\n // if (value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0) {\n // // ignore\n // save = false;\n // }\n // }\n return color;\n}\n\n/* TODO parse url options\nfunction parseTexture(value, matParams) {\n const texParams = {\n scale: new Vector2(1, 1),\n offset: new Vector2(0, 0)\n };\n\n const items = value.split(/\\s+/);\n let pos;\n\n pos = items.indexOf('-bm');\n if (pos >= 0) {\n matParams.bumpScale = parseFloat(items[ pos + 1 ]);\n items.splice(pos, 2);\n }\n\n pos = items.indexOf('-s');\n if (pos >= 0) {\n texParams.scale.set(parseFloat(items[ pos + 1 ]), parseFloat(items[ pos + 2 ]));\n items.splice(pos, 4); // we expect 3 parameters here!\n\n }\n\n pos = items.indexOf('-o');\n\n if (pos >= 0) {\n texParams.offset.set(parseFloat(items[ pos + 1 ]), parseFloat(items[ pos + 2 ]));\n items.splice(pos, 4); // we expect 3 parameters here!\n }\n\n texParams.url = items.join(' ').trim();\n return texParams;\n}\n\n *function resolveURL(baseUrl, url) {\n * baseUrl?: string;\n // Absolute URL\n if (/^https?:\\/\\//i.test(url)) return url;\n return baseUrl + url;\n }\n\n function setMapForType(mapType, value) {\n if (params[ mapType ]) return; // Keep the first encountered texture\n\n const texParams = scope.getTextureParams(value, params);\n const map = scope.loadTexture(resolveURL(scope.baseUrl, texParams.url));\n\n map.repeat.copy(texParams.scale);\n map.offset.copy(texParams.offset);\n\n map.wrapS = scope.wrap;\n map.wrapT = scope.wrap;\n\n params[ mapType ] = map;\n }\n*/\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {MTLMaterial, ParseMTLOptions} from './lib/parse-mtl';\nimport {parseMTL} from './lib/parse-mtl';\nimport {MTLFormat} from './mtl-format';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type MTLLoaderOptions = LoaderOptions & {\n mtl?: ParseMTLOptions;\n};\n\n/**\n * Loader for the MTL material format\n * Parses a Wavefront .mtl file specifying materials\n */\nexport const MTLWorkerLoader = {\n ...MTLFormat,\n\n dataType: null as unknown as MTLMaterial[],\n batchType: null as never,\n\n version: VERSION,\n worker: true,\n testText: (text: string): boolean => text.includes('newmtl'),\n options: {\n mtl: {}\n }\n} as const satisfies Loader<MTLMaterial[], never, LoaderOptions>;\n\n// MTLLoader\n\n/**\n * Loader for the MTL material format\n */\nexport const MTLLoader = {\n ...MTLWorkerLoader,\n parse: async (arrayBuffer: ArrayBuffer, options?: MTLLoaderOptions) =>\n parseMTL(new TextDecoder().decode(arrayBuffer), options?.mtl),\n parseTextSync: (text: string, options?: MTLLoaderOptions) => parseMTL(text, options?.mtl)\n} as const satisfies LoaderWithParser<MTLMaterial[], never, MTLLoaderOptions>;\n"], "mappings": "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", "names": ["import_schema_utils", "import_schema_utils", "VERSION"] }