obj.js


import { Triangle, } from "./triangle.js";
import { Vector } from "./vector.js";
import { Mesh } from "./mesh.js";

/**
 * 
 * @param {String} path to obj file "./file.obj"
 * @returns {Mesh}
 */
export async function loadOBJ(path) {
    const response = await fetch(path).then(r=>r.text())

/**
 * Takes A path to an obj
 */
    const vertices = [];
    const faces = [];
    const lines = response.split('\n');
    // const faceIndices = [];
    let tris = []

    for (const line of lines) {
        const parts = line.trim().split(/\s+/);

        if (parts[0] === 'v') {
            // Vertex
            vertices.push(new Vector(
                parseFloat(parts[1]),
                parseFloat(parts[2]),
                parseFloat(parts[3])
            ));
        } else if (parts[0] === 'f') {
            // Face (supports f v1 v2 v3 or f v1/vt1/vn1 v2/vt2/vn2 ...)
            const faceIndices = [];
            for (let i = 1; i < parts.length; i++) {
                const vertexIndex = parseInt(parts[i].split('/')[0])-1 ; // OBJ is 1-indexed
                faceIndices.push(vertexIndex);
            }
            // faces.push(faceIndices);

            for (let i = 1; i < faceIndices.length - 1; i++) {

                let i1 = 0
                let i2 = i
                let i3 = i + 1
                // console.log(vertices[faceIndices[i1]],vertices[faceIndices[i2]],faceIndices[faces[i3]],faces[i1])

                let tri = new Triangle(vertices[faceIndices[i1]], vertices[faceIndices[i2]], vertices[faceIndices[i3]])
                tris.push(tri)
            }
        }

    }


    // console.log(tris)
    return new Mesh(tris);
}