{"version":3,"file":"trimesh-boolean-three.umd.cjs","sources":["../node_modules/robust-predicates/esm/util.js","../node_modules/robust-predicates/esm/orient2d.js","../node_modules/robust-predicates/esm/orient3d.js","../node_modules/robust-predicates/esm/incircle.js","../src/util/math.js","../src/normals/triNormal.js","../src/intersect/triTriIntersection.js","../src/intersect/spatialGrid.js","../src/intersect/intersectMeshPair.js","../node_modules/delaunator/index.js","../node_modules/@kninnug/constrainautor/lib/Constrainautor.mjs","../src/intersect/chainSegments.js","../src/boolean/sliverGuard.js","../src/boolean/splitTriangles.js","../src/boolean/classifyTriangles.js","../src/repair/deduplicateVertices.js","../src/repair/weldVertices.js","../src/normals/alignNormals.js","../src/repair/resolveTJunctions.js","../src/repair/weldBoundary.js","../src/repair/fillOpenLoops.js","../src/repair/forceClose.js","../src/boolean/booleanOp.js","../src/repair/removeDegenerates.js","../src/repair/stitchEdges.js","../src/repair/cleanCrossing.js","../src/repair/boundaryLoops.js","../src/repair/removeOverlapping.js","../src/repair/closeSolid.js","../src/repair/repairMesh.js","../src/three.js"],"sourcesContent":["export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from original code\nexport function sum(elen, e, flen, f, h) {\n    let Q, Qnew, hh, bvirt;\n    let enow = e[0];\n    let fnow = f[0];\n    let eindex = 0;\n    let findex = 0;\n    if ((fnow > enow) === (fnow > -enow)) {\n        Q = enow;\n        enow = e[++eindex];\n    } else {\n        Q = fnow;\n        fnow = f[++findex];\n    }\n    let hindex = 0;\n    if (eindex < elen && findex < flen) {\n        if ((fnow > enow) === (fnow > -enow)) {\n            Qnew = enow + Q;\n            hh = Q - (Qnew - enow);\n            enow = e[++eindex];\n        } else {\n            Qnew = fnow + Q;\n            hh = Q - (Qnew - fnow);\n            fnow = f[++findex];\n        }\n        Q = Qnew;\n        if (hh !== 0) {\n            h[hindex++] = hh;\n        }\n        while (eindex < elen && findex < flen) {\n            if ((fnow > enow) === (fnow > -enow)) {\n                Qnew = Q + enow;\n                bvirt = Qnew - Q;\n                hh = Q - (Qnew - bvirt) + (enow - bvirt);\n                enow = e[++eindex];\n            } else {\n                Qnew = Q + fnow;\n                bvirt = Qnew - Q;\n                hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n                fnow = f[++findex];\n            }\n            Q = Qnew;\n            if (hh !== 0) {\n                h[hindex++] = hh;\n            }\n        }\n    }\n    while (eindex < elen) {\n        Qnew = Q + enow;\n        bvirt = Qnew - Q;\n        hh = Q - (Qnew - bvirt) + (enow - bvirt);\n        enow = e[++eindex];\n        Q = Qnew;\n        if (hh !== 0) {\n            h[hindex++] = hh;\n        }\n    }\n    while (findex < flen) {\n        Qnew = Q + fnow;\n        bvirt = Qnew - Q;\n        hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n        fnow = f[++findex];\n        Q = Qnew;\n        if (hh !== 0) {\n            h[hindex++] = hh;\n        }\n    }\n    if (Q !== 0 || hindex === 0) {\n        h[hindex++] = Q;\n    }\n    return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n    return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n    let Q, sum, hh, product1, product0;\n    let bvirt, c, ahi, alo, bhi, blo;\n\n    c = splitter * b;\n    bhi = c - (c - b);\n    blo = b - bhi;\n    let enow = e[0];\n    Q = enow * b;\n    c = splitter * enow;\n    ahi = c - (c - enow);\n    alo = enow - ahi;\n    hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n    let hindex = 0;\n    if (hh !== 0) {\n        h[hindex++] = hh;\n    }\n    for (let i = 1; i < elen; i++) {\n        enow = e[i];\n        product1 = enow * b;\n        c = splitter * enow;\n        ahi = c - (c - enow);\n        alo = enow - ahi;\n        product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n        sum = Q + product0;\n        bvirt = sum - Q;\n        hh = Q - (sum - bvirt) + (product0 - bvirt);\n        if (hh !== 0) {\n            h[hindex++] = hh;\n        }\n        Q = product1 + sum;\n        hh = sum - (Q - product1);\n        if (hh !== 0) {\n            h[hindex++] = hh;\n        }\n    }\n    if (Q !== 0 || hindex === 0) {\n        h[hindex++] = Q;\n    }\n    return hindex;\n}\n\nexport function negate(elen, e) {\n    for (let i = 0; i < elen; i++) e[i] = -e[i];\n    return elen;\n}\n\nexport function estimate(elen, e) {\n    let Q = e[0];\n    for (let i = 1; i < elen; i++) Q += e[i];\n    return Q;\n}\n\nexport function vec(n) {\n    return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n    let acxtail, acytail, bcxtail, bcytail;\n    let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n    const acx = ax - cx;\n    const bcx = bx - cx;\n    const acy = ay - cy;\n    const bcy = by - cy;\n\n    s1 = acx * bcy;\n    c = splitter * acx;\n    ahi = c - (c - acx);\n    alo = acx - ahi;\n    c = splitter * bcy;\n    bhi = c - (c - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = acy * bcx;\n    c = splitter * acy;\n    ahi = c - (c - acy);\n    alo = acy - ahi;\n    c = splitter * bcx;\n    bhi = c - (c - bcx);\n    blo = bcx - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    B[3] = u3;\n\n    let det = estimate(4, B);\n    let errbound = ccwerrboundB * detsum;\n    if (det >= errbound || -det >= errbound) {\n        return det;\n    }\n\n    bvirt = ax - acx;\n    acxtail = ax - (acx + bvirt) + (bvirt - cx);\n    bvirt = bx - bcx;\n    bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n    bvirt = ay - acy;\n    acytail = ay - (acy + bvirt) + (bvirt - cy);\n    bvirt = by - bcy;\n    bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n    if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n        return det;\n    }\n\n    errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n    det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n    if (det >= errbound || -det >= errbound) return det;\n\n    s1 = acxtail * bcy;\n    c = splitter * acxtail;\n    ahi = c - (c - acxtail);\n    alo = acxtail - ahi;\n    c = splitter * bcy;\n    bhi = c - (c - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = acytail * bcx;\n    c = splitter * acytail;\n    ahi = c - (c - acytail);\n    alo = acytail - ahi;\n    c = splitter * bcx;\n    bhi = c - (c - bcx);\n    blo = bcx - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C1len = sum(4, B, 4, u, C1);\n\n    s1 = acx * bcytail;\n    c = splitter * acx;\n    ahi = c - (c - acx);\n    alo = acx - ahi;\n    c = splitter * bcytail;\n    bhi = c - (c - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = acy * bcxtail;\n    c = splitter * acy;\n    ahi = c - (c - acy);\n    alo = acy - ahi;\n    c = splitter * bcxtail;\n    bhi = c - (c - bcxtail);\n    blo = bcxtail - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C2len = sum(C1len, C1, 4, u, C2);\n\n    s1 = acxtail * bcytail;\n    c = splitter * acxtail;\n    ahi = c - (c - acxtail);\n    alo = acxtail - ahi;\n    c = splitter * bcytail;\n    bhi = c - (c - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = acytail * bcxtail;\n    c = splitter * acytail;\n    ahi = c - (c - acytail);\n    alo = acytail - ahi;\n    c = splitter * bcxtail;\n    bhi = c - (c - bcxtail);\n    blo = bcxtail - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const Dlen = sum(C2len, C2, 4, u, D);\n\n    return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n    const detleft = (ay - cy) * (bx - cx);\n    const detright = (ax - cx) * (by - cy);\n    const det = detleft - detright;\n\n    const detsum = Math.abs(detleft + detright);\n    if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n    return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n    return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, scale} from './util.js';\n\nconst o3derrboundA = (7 + 56 * epsilon) * epsilon;\nconst o3derrboundB = (3 + 28 * epsilon) * epsilon;\nconst o3derrboundC = (26 + 288 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst at_b = vec(4);\nconst at_c = vec(4);\nconst bt_c = vec(4);\nconst bt_a = vec(4);\nconst ct_a = vec(4);\nconst ct_b = vec(4);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abt = vec(8);\nconst u = vec(4);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _16 = vec(16);\nconst _12 = vec(12);\n\nlet fin = vec(192);\nlet fin2 = vec(192);\n\nfunction finadd(finlen, alen, a) {\n    finlen = sum(finlen, fin, alen, a, fin2);\n    const tmp = fin; fin = fin2; fin2 = tmp;\n    return finlen;\n}\n\nfunction tailinit(xtail, ytail, ax, ay, bx, by, a, b) {\n    let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3, negate;\n    if (xtail === 0) {\n        if (ytail === 0) {\n            a[0] = 0;\n            b[0] = 0;\n            return 1;\n        }\n        negate = -ytail;\n        s1 = negate * ax;\n        c = splitter * negate;\n        ahi = c - (c - negate);\n        alo = negate - ahi;\n        c = splitter * ax;\n        bhi = c - (c - ax);\n        blo = ax - bhi;\n        a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n        a[1] = s1;\n        s1 = ytail * bx;\n        c = splitter * ytail;\n        ahi = c - (c - ytail);\n        alo = ytail - ahi;\n        c = splitter * bx;\n        bhi = c - (c - bx);\n        blo = bx - bhi;\n        b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n        b[1] = s1;\n        return 2;\n    }\n    if (ytail === 0) {\n        s1 = xtail * ay;\n        c = splitter * xtail;\n        ahi = c - (c - xtail);\n        alo = xtail - ahi;\n        c = splitter * ay;\n        bhi = c - (c - ay);\n        blo = ay - bhi;\n        a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n        a[1] = s1;\n        negate = -xtail;\n        s1 = negate * by;\n        c = splitter * negate;\n        ahi = c - (c - negate);\n        alo = negate - ahi;\n        c = splitter * by;\n        bhi = c - (c - by);\n        blo = by - bhi;\n        b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n        b[1] = s1;\n        return 2;\n    }\n    s1 = xtail * ay;\n    c = splitter * xtail;\n    ahi = c - (c - xtail);\n    alo = xtail - ahi;\n    c = splitter * ay;\n    bhi = c - (c - ay);\n    blo = ay - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = ytail * ax;\n    c = splitter * ytail;\n    ahi = c - (c - ytail);\n    alo = ytail - ahi;\n    c = splitter * ax;\n    bhi = c - (c - ax);\n    blo = ax - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    a[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    a[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    a[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    a[3] = u3;\n    s1 = ytail * bx;\n    c = splitter * ytail;\n    ahi = c - (c - ytail);\n    alo = ytail - ahi;\n    c = splitter * bx;\n    bhi = c - (c - bx);\n    blo = bx - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = xtail * by;\n    c = splitter * xtail;\n    ahi = c - (c - xtail);\n    alo = xtail - ahi;\n    c = splitter * by;\n    bhi = c - (c - by);\n    blo = by - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    b[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    b[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    b[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    b[3] = u3;\n    return 4;\n}\n\nfunction tailadd(finlen, a, b, k, z) {\n    let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, u3;\n    s1 = a * b;\n    c = splitter * a;\n    ahi = c - (c - a);\n    alo = a - ahi;\n    c = splitter * b;\n    bhi = c - (c - b);\n    blo = b - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    c = splitter * k;\n    bhi = c - (c - k);\n    blo = k - bhi;\n    _i = s0 * k;\n    c = splitter * s0;\n    ahi = c - (c - s0);\n    alo = s0 - ahi;\n    u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n    _j = s1 * k;\n    c = splitter * s1;\n    ahi = c - (c - s1);\n    alo = s1 - ahi;\n    _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n    _k = _i + _0;\n    bvirt = _k - _i;\n    u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n    u3 = _j + _k;\n    u[2] = _k - (u3 - _j);\n    u[3] = u3;\n    finlen = finadd(finlen, 4, u);\n    if (z !== 0) {\n        c = splitter * z;\n        bhi = c - (c - z);\n        blo = z - bhi;\n        _i = s0 * z;\n        c = splitter * s0;\n        ahi = c - (c - s0);\n        alo = s0 - ahi;\n        u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n        _j = s1 * z;\n        c = splitter * s1;\n        ahi = c - (c - s1);\n        alo = s1 - ahi;\n        _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n        _k = _i + _0;\n        bvirt = _k - _i;\n        u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n        u3 = _j + _k;\n        u[2] = _k - (u3 - _j);\n        u[3] = u3;\n        finlen = finadd(finlen, 4, u);\n    }\n    return finlen;\n}\n\nfunction orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent) {\n    let finlen;\n    let adxtail, bdxtail, cdxtail;\n    let adytail, bdytail, cdytail;\n    let adztail, bdztail, cdztail;\n    let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3;\n\n    const adx = ax - dx;\n    const bdx = bx - dx;\n    const cdx = cx - dx;\n    const ady = ay - dy;\n    const bdy = by - dy;\n    const cdy = cy - dy;\n    const adz = az - dz;\n    const bdz = bz - dz;\n    const cdz = cz - dz;\n\n    s1 = bdx * cdy;\n    c = splitter * bdx;\n    ahi = c - (c - bdx);\n    alo = bdx - ahi;\n    c = splitter * cdy;\n    bhi = c - (c - cdy);\n    blo = cdy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = cdx * bdy;\n    c = splitter * cdx;\n    ahi = c - (c - cdx);\n    alo = cdx - ahi;\n    c = splitter * bdy;\n    bhi = c - (c - bdy);\n    blo = bdy - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    bc[3] = u3;\n    s1 = cdx * ady;\n    c = splitter * cdx;\n    ahi = c - (c - cdx);\n    alo = cdx - ahi;\n    c = splitter * ady;\n    bhi = c - (c - ady);\n    blo = ady - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = adx * cdy;\n    c = splitter * adx;\n    ahi = c - (c - adx);\n    alo = adx - ahi;\n    c = splitter * cdy;\n    bhi = c - (c - cdy);\n    blo = cdy - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    ca[3] = u3;\n    s1 = adx * bdy;\n    c = splitter * adx;\n    ahi = c - (c - adx);\n    alo = adx - ahi;\n    c = splitter * bdy;\n    bhi = c - (c - bdy);\n    blo = bdy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = bdx * ady;\n    c = splitter * bdx;\n    ahi = c - (c - bdx);\n    alo = bdx - ahi;\n    c = splitter * ady;\n    bhi = c - (c - ady);\n    blo = ady - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    ab[3] = u3;\n\n    finlen = sum(\n        sum(\n            scale(4, bc, adz, _8), _8,\n            scale(4, ca, bdz, _8b), _8b, _16), _16,\n        scale(4, ab, cdz, _8), _8, fin);\n\n    let det = estimate(finlen, fin);\n    let errbound = o3derrboundB * permanent;\n    if (det >= errbound || -det >= errbound) {\n        return det;\n    }\n\n    bvirt = ax - adx;\n    adxtail = ax - (adx + bvirt) + (bvirt - dx);\n    bvirt = bx - bdx;\n    bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n    bvirt = cx - cdx;\n    cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n    bvirt = ay - ady;\n    adytail = ay - (ady + bvirt) + (bvirt - dy);\n    bvirt = by - bdy;\n    bdytail = by - (bdy + bvirt) + (bvirt - dy);\n    bvirt = cy - cdy;\n    cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n    bvirt = az - adz;\n    adztail = az - (adz + bvirt) + (bvirt - dz);\n    bvirt = bz - bdz;\n    bdztail = bz - (bdz + bvirt) + (bvirt - dz);\n    bvirt = cz - cdz;\n    cdztail = cz - (cdz + bvirt) + (bvirt - dz);\n\n    if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&\n        adytail === 0 && bdytail === 0 && cdytail === 0 &&\n        adztail === 0 && bdztail === 0 && cdztail === 0) {\n        return det;\n    }\n\n    errbound = o3derrboundC * permanent + resulterrbound * Math.abs(det);\n    det +=\n        adz * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx) +\n        bdz * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx) +\n        cdz * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx);\n    if (det >= errbound || -det >= errbound) {\n        return det;\n    }\n\n    const at_len = tailinit(adxtail, adytail, bdx, bdy, cdx, cdy, at_b, at_c);\n    const bt_len = tailinit(bdxtail, bdytail, cdx, cdy, adx, ady, bt_c, bt_a);\n    const ct_len = tailinit(cdxtail, cdytail, adx, ady, bdx, bdy, ct_a, ct_b);\n\n    const bctlen = sum(bt_len, bt_c, ct_len, ct_b, bct);\n    finlen = finadd(finlen, scale(bctlen, bct, adz, _16), _16);\n\n    const catlen = sum(ct_len, ct_a, at_len, at_c, cat);\n    finlen = finadd(finlen, scale(catlen, cat, bdz, _16), _16);\n\n    const abtlen = sum(at_len, at_b, bt_len, bt_a, abt);\n    finlen = finadd(finlen, scale(abtlen, abt, cdz, _16), _16);\n\n    if (adztail !== 0) {\n        finlen = finadd(finlen, scale(4, bc, adztail, _12), _12);\n        finlen = finadd(finlen, scale(bctlen, bct, adztail, _16), _16);\n    }\n    if (bdztail !== 0) {\n        finlen = finadd(finlen, scale(4, ca, bdztail, _12), _12);\n        finlen = finadd(finlen, scale(catlen, cat, bdztail, _16), _16);\n    }\n    if (cdztail !== 0) {\n        finlen = finadd(finlen, scale(4, ab, cdztail, _12), _12);\n        finlen = finadd(finlen, scale(abtlen, abt, cdztail, _16), _16);\n    }\n\n    if (adxtail !== 0) {\n        if (bdytail !== 0) {\n            finlen = tailadd(finlen, adxtail, bdytail, cdz, cdztail);\n        }\n        if (cdytail !== 0) {\n            finlen = tailadd(finlen, -adxtail, cdytail, bdz, bdztail);\n        }\n    }\n    if (bdxtail !== 0) {\n        if (cdytail !== 0) {\n            finlen = tailadd(finlen, bdxtail, cdytail, adz, adztail);\n        }\n        if (adytail !== 0) {\n            finlen = tailadd(finlen, -bdxtail, adytail, cdz, cdztail);\n        }\n    }\n    if (cdxtail !== 0) {\n        if (adytail !== 0) {\n            finlen = tailadd(finlen, cdxtail, adytail, bdz, bdztail);\n        }\n        if (bdytail !== 0) {\n            finlen = tailadd(finlen, -cdxtail, bdytail, adz, adztail);\n        }\n    }\n\n    return fin[finlen - 1];\n}\n\nexport function orient3d(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n    const adx = ax - dx;\n    const bdx = bx - dx;\n    const cdx = cx - dx;\n    const ady = ay - dy;\n    const bdy = by - dy;\n    const cdy = cy - dy;\n    const adz = az - dz;\n    const bdz = bz - dz;\n    const cdz = cz - dz;\n\n    const bdxcdy = bdx * cdy;\n    const cdxbdy = cdx * bdy;\n\n    const cdxady = cdx * ady;\n    const adxcdy = adx * cdy;\n\n    const adxbdy = adx * bdy;\n    const bdxady = bdx * ady;\n\n    const det =\n        adz * (bdxcdy - cdxbdy) +\n        bdz * (cdxady - adxcdy) +\n        cdz * (adxbdy - bdxady);\n\n    const permanent =\n        (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) +\n        (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) +\n        (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);\n\n    const errbound = o3derrboundA * permanent;\n    if (det > errbound || -det > errbound) {\n        return det;\n    }\n\n    return orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent);\n}\n\nexport function orient3dfast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n    const adx = ax - dx;\n    const bdx = bx - dx;\n    const cdx = cx - dx;\n    const ady = ay - dy;\n    const bdy = by - dy;\n    const cdy = cy - dy;\n    const adz = az - dz;\n    const bdz = bz - dz;\n    const cdz = cz - dz;\n\n    return adx * (bdy * cdz - bdz * cdy) +\n        bdx * (cdy * adz - cdz * ady) +\n        cdx * (ady * bdz - adz * bdy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale} from './util.js';\n\nconst iccerrboundA = (10 + 96 * epsilon) * epsilon;\nconst iccerrboundB = (4 + 48 * epsilon) * epsilon;\nconst iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst aa = vec(4);\nconst bb = vec(4);\nconst cc = vec(4);\nconst u = vec(4);\nconst v = vec(4);\nconst axtbc = vec(8);\nconst aytbc = vec(8);\nconst bxtca = vec(8);\nconst bytca = vec(8);\nconst cxtab = vec(8);\nconst cytab = vec(8);\nconst abt = vec(8);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abtt = vec(4);\nconst bctt = vec(4);\nconst catt = vec(4);\n\nconst _8 = vec(8);\nconst _16 = vec(16);\nconst _16b = vec(16);\nconst _16c = vec(16);\nconst _32 = vec(32);\nconst _32b = vec(32);\nconst _48 = vec(48);\nconst _64 = vec(64);\n\nlet fin = vec(1152);\nlet fin2 = vec(1152);\n\nfunction finadd(finlen, a, alen) {\n    finlen = sum(finlen, fin, a, alen, fin2);\n    const tmp = fin; fin = fin2; fin2 = tmp;\n    return finlen;\n}\n\nfunction incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {\n    let finlen;\n    let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;\n    let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;\n    let abtlen, bctlen, catlen;\n    let abttlen, bcttlen, cattlen;\n    let n1, n0;\n\n    let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n    const adx = ax - dx;\n    const bdx = bx - dx;\n    const cdx = cx - dx;\n    const ady = ay - dy;\n    const bdy = by - dy;\n    const cdy = cy - dy;\n\n    s1 = bdx * cdy;\n    c = splitter * bdx;\n    ahi = c - (c - bdx);\n    alo = bdx - ahi;\n    c = splitter * cdy;\n    bhi = c - (c - cdy);\n    blo = cdy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = cdx * bdy;\n    c = splitter * cdx;\n    ahi = c - (c - cdx);\n    alo = cdx - ahi;\n    c = splitter * bdy;\n    bhi = c - (c - bdy);\n    blo = bdy - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    bc[3] = u3;\n    s1 = cdx * ady;\n    c = splitter * cdx;\n    ahi = c - (c - cdx);\n    alo = cdx - ahi;\n    c = splitter * ady;\n    bhi = c - (c - ady);\n    blo = ady - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = adx * cdy;\n    c = splitter * adx;\n    ahi = c - (c - adx);\n    alo = adx - ahi;\n    c = splitter * cdy;\n    bhi = c - (c - cdy);\n    blo = cdy - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    ca[3] = u3;\n    s1 = adx * bdy;\n    c = splitter * adx;\n    ahi = c - (c - adx);\n    alo = adx - ahi;\n    c = splitter * bdy;\n    bhi = c - (c - bdy);\n    blo = bdy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t1 = bdx * ady;\n    c = splitter * bdx;\n    ahi = c - (c - bdx);\n    alo = bdx - ahi;\n    c = splitter * ady;\n    bhi = c - (c - ady);\n    blo = ady - bhi;\n    t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t0;\n    bvirt = s0 - _i;\n    ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t1;\n    bvirt = _0 - _i;\n    ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    ab[3] = u3;\n\n    finlen = sum(\n        sum(\n            sum(\n                scale(scale(4, bc, adx, _8), _8, adx, _16), _16,\n                scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,\n            sum(\n                scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,\n                scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,\n        sum(\n            scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,\n            scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);\n\n    let det = estimate(finlen, fin);\n    let errbound = iccerrboundB * permanent;\n    if (det >= errbound || -det >= errbound) {\n        return det;\n    }\n\n    bvirt = ax - adx;\n    adxtail = ax - (adx + bvirt) + (bvirt - dx);\n    bvirt = ay - ady;\n    adytail = ay - (ady + bvirt) + (bvirt - dy);\n    bvirt = bx - bdx;\n    bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n    bvirt = by - bdy;\n    bdytail = by - (bdy + bvirt) + (bvirt - dy);\n    bvirt = cx - cdx;\n    cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n    bvirt = cy - cdy;\n    cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n    if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {\n        return det;\n    }\n\n    errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);\n    det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +\n        2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +\n        ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +\n        2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +\n        ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +\n        2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));\n\n    if (det >= errbound || -det >= errbound) {\n        return det;\n    }\n\n    if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n        s1 = adx * adx;\n        c = splitter * adx;\n        ahi = c - (c - adx);\n        alo = adx - ahi;\n        s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n        t1 = ady * ady;\n        c = splitter * ady;\n        ahi = c - (c - ady);\n        alo = ady - ahi;\n        t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n        _i = s0 + t0;\n        bvirt = _i - s0;\n        aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n        _j = s1 + _i;\n        bvirt = _j - s1;\n        _0 = s1 - (_j - bvirt) + (_i - bvirt);\n        _i = _0 + t1;\n        bvirt = _i - _0;\n        aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n        u3 = _j + _i;\n        bvirt = u3 - _j;\n        aa[2] = _j - (u3 - bvirt) + (_i - bvirt);\n        aa[3] = u3;\n    }\n    if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n        s1 = bdx * bdx;\n        c = splitter * bdx;\n        ahi = c - (c - bdx);\n        alo = bdx - ahi;\n        s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n        t1 = bdy * bdy;\n        c = splitter * bdy;\n        ahi = c - (c - bdy);\n        alo = bdy - ahi;\n        t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n        _i = s0 + t0;\n        bvirt = _i - s0;\n        bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n        _j = s1 + _i;\n        bvirt = _j - s1;\n        _0 = s1 - (_j - bvirt) + (_i - bvirt);\n        _i = _0 + t1;\n        bvirt = _i - _0;\n        bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n        u3 = _j + _i;\n        bvirt = u3 - _j;\n        bb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n        bb[3] = u3;\n    }\n    if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n        s1 = cdx * cdx;\n        c = splitter * cdx;\n        ahi = c - (c - cdx);\n        alo = cdx - ahi;\n        s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n        t1 = cdy * cdy;\n        c = splitter * cdy;\n        ahi = c - (c - cdy);\n        alo = cdy - ahi;\n        t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n        _i = s0 + t0;\n        bvirt = _i - s0;\n        cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n        _j = s1 + _i;\n        bvirt = _j - s1;\n        _0 = s1 - (_j - bvirt) + (_i - bvirt);\n        _i = _0 + t1;\n        bvirt = _i - _0;\n        cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n        u3 = _j + _i;\n        bvirt = u3 - _j;\n        cc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n        cc[3] = u3;\n    }\n\n    if (adxtail !== 0) {\n        axtbclen = scale(4, bc, adxtail, axtbc);\n        finlen = finadd(finlen, sum_three(\n            scale(axtbclen, axtbc, 2 * adx, _16), _16,\n            scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,\n            scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);\n    }\n    if (adytail !== 0) {\n        aytbclen = scale(4, bc, adytail, aytbc);\n        finlen = finadd(finlen, sum_three(\n            scale(aytbclen, aytbc, 2 * ady, _16), _16,\n            scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,\n            scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);\n    }\n    if (bdxtail !== 0) {\n        bxtcalen = scale(4, ca, bdxtail, bxtca);\n        finlen = finadd(finlen, sum_three(\n            scale(bxtcalen, bxtca, 2 * bdx, _16), _16,\n            scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,\n            scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);\n    }\n    if (bdytail !== 0) {\n        bytcalen = scale(4, ca, bdytail, bytca);\n        finlen = finadd(finlen, sum_three(\n            scale(bytcalen, bytca, 2 * bdy, _16), _16,\n            scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,\n            scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);\n    }\n    if (cdxtail !== 0) {\n        cxtablen = scale(4, ab, cdxtail, cxtab);\n        finlen = finadd(finlen, sum_three(\n            scale(cxtablen, cxtab, 2 * cdx, _16), _16,\n            scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,\n            scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);\n    }\n    if (cdytail !== 0) {\n        cytablen = scale(4, ab, cdytail, cytab);\n        finlen = finadd(finlen, sum_three(\n            scale(cytablen, cytab, 2 * cdy, _16), _16,\n            scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,\n            scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);\n    }\n\n    if (adxtail !== 0 || adytail !== 0) {\n        if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n            s1 = bdxtail * cdy;\n            c = splitter * bdxtail;\n            ahi = c - (c - bdxtail);\n            alo = bdxtail - ahi;\n            c = splitter * cdy;\n            bhi = c - (c - cdy);\n            blo = cdy - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = bdx * cdytail;\n            c = splitter * bdx;\n            ahi = c - (c - bdx);\n            alo = bdx - ahi;\n            c = splitter * cdytail;\n            bhi = c - (c - cdytail);\n            blo = cdytail - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 + t0;\n            bvirt = _i - s0;\n            u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 + t1;\n            bvirt = _i - _0;\n            u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            u[3] = u3;\n            s1 = cdxtail * -bdy;\n            c = splitter * cdxtail;\n            ahi = c - (c - cdxtail);\n            alo = cdxtail - ahi;\n            c = splitter * -bdy;\n            bhi = c - (c - -bdy);\n            blo = -bdy - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = cdx * -bdytail;\n            c = splitter * cdx;\n            ahi = c - (c - cdx);\n            alo = cdx - ahi;\n            c = splitter * -bdytail;\n            bhi = c - (c - -bdytail);\n            blo = -bdytail - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 + t0;\n            bvirt = _i - s0;\n            v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 + t1;\n            bvirt = _i - _0;\n            v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            v[3] = u3;\n            bctlen = sum(4, u, 4, v, bct);\n            s1 = bdxtail * cdytail;\n            c = splitter * bdxtail;\n            ahi = c - (c - bdxtail);\n            alo = bdxtail - ahi;\n            c = splitter * cdytail;\n            bhi = c - (c - cdytail);\n            blo = cdytail - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = cdxtail * bdytail;\n            c = splitter * cdxtail;\n            ahi = c - (c - cdxtail);\n            alo = cdxtail - ahi;\n            c = splitter * bdytail;\n            bhi = c - (c - bdytail);\n            blo = bdytail - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 - t0;\n            bvirt = s0 - _i;\n            bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 - t1;\n            bvirt = _0 - _i;\n            bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            bctt[3] = u3;\n            bcttlen = 4;\n        } else {\n            bct[0] = 0;\n            bctlen = 1;\n            bctt[0] = 0;\n            bcttlen = 1;\n        }\n        if (adxtail !== 0) {\n            const len = scale(bctlen, bct, adxtail, _16c);\n            finlen = finadd(finlen, sum(\n                scale(axtbclen, axtbc, adxtail, _16), _16,\n                scale(len, _16c, 2 * adx, _32), _32, _48), _48);\n\n            const len2 = scale(bcttlen, bctt, adxtail, _8);\n            finlen = finadd(finlen, sum_three(\n                scale(len2, _8, 2 * adx, _16), _16,\n                scale(len2, _8, adxtail, _16b), _16b,\n                scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);\n\n            if (bdytail !== 0) {\n                finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);\n            }\n            if (cdytail !== 0) {\n                finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);\n            }\n        }\n        if (adytail !== 0) {\n            const len = scale(bctlen, bct, adytail, _16c);\n            finlen = finadd(finlen, sum(\n                scale(aytbclen, aytbc, adytail, _16), _16,\n                scale(len, _16c, 2 * ady, _32), _32, _48), _48);\n\n            const len2 = scale(bcttlen, bctt, adytail, _8);\n            finlen = finadd(finlen, sum_three(\n                scale(len2, _8, 2 * ady, _16), _16,\n                scale(len2, _8, adytail, _16b), _16b,\n                scale(len, _16c, adytail, _32), _32, _32b, _64), _64);\n        }\n    }\n    if (bdxtail !== 0 || bdytail !== 0) {\n        if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n            s1 = cdxtail * ady;\n            c = splitter * cdxtail;\n            ahi = c - (c - cdxtail);\n            alo = cdxtail - ahi;\n            c = splitter * ady;\n            bhi = c - (c - ady);\n            blo = ady - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = cdx * adytail;\n            c = splitter * cdx;\n            ahi = c - (c - cdx);\n            alo = cdx - ahi;\n            c = splitter * adytail;\n            bhi = c - (c - adytail);\n            blo = adytail - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 + t0;\n            bvirt = _i - s0;\n            u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 + t1;\n            bvirt = _i - _0;\n            u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            u[3] = u3;\n            n1 = -cdy;\n            n0 = -cdytail;\n            s1 = adxtail * n1;\n            c = splitter * adxtail;\n            ahi = c - (c - adxtail);\n            alo = adxtail - ahi;\n            c = splitter * n1;\n            bhi = c - (c - n1);\n            blo = n1 - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = adx * n0;\n            c = splitter * adx;\n            ahi = c - (c - adx);\n            alo = adx - ahi;\n            c = splitter * n0;\n            bhi = c - (c - n0);\n            blo = n0 - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 + t0;\n            bvirt = _i - s0;\n            v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 + t1;\n            bvirt = _i - _0;\n            v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            v[3] = u3;\n            catlen = sum(4, u, 4, v, cat);\n            s1 = cdxtail * adytail;\n            c = splitter * cdxtail;\n            ahi = c - (c - cdxtail);\n            alo = cdxtail - ahi;\n            c = splitter * adytail;\n            bhi = c - (c - adytail);\n            blo = adytail - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = adxtail * cdytail;\n            c = splitter * adxtail;\n            ahi = c - (c - adxtail);\n            alo = adxtail - ahi;\n            c = splitter * cdytail;\n            bhi = c - (c - cdytail);\n            blo = cdytail - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 - t0;\n            bvirt = s0 - _i;\n            catt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 - t1;\n            bvirt = _0 - _i;\n            catt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            catt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            catt[3] = u3;\n            cattlen = 4;\n        } else {\n            cat[0] = 0;\n            catlen = 1;\n            catt[0] = 0;\n            cattlen = 1;\n        }\n        if (bdxtail !== 0) {\n            const len = scale(catlen, cat, bdxtail, _16c);\n            finlen = finadd(finlen, sum(\n                scale(bxtcalen, bxtca, bdxtail, _16), _16,\n                scale(len, _16c, 2 * bdx, _32), _32, _48), _48);\n\n            const len2 = scale(cattlen, catt, bdxtail, _8);\n            finlen = finadd(finlen, sum_three(\n                scale(len2, _8, 2 * bdx, _16), _16,\n                scale(len2, _8, bdxtail, _16b), _16b,\n                scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);\n\n            if (cdytail !== 0) {\n                finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);\n            }\n            if (adytail !== 0) {\n                finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);\n            }\n        }\n        if (bdytail !== 0) {\n            const len = scale(catlen, cat, bdytail, _16c);\n            finlen = finadd(finlen, sum(\n                scale(bytcalen, bytca, bdytail, _16), _16,\n                scale(len, _16c, 2 * bdy, _32), _32, _48), _48);\n\n            const len2 = scale(cattlen, catt, bdytail, _8);\n            finlen = finadd(finlen, sum_three(\n                scale(len2, _8, 2 * bdy, _16), _16,\n                scale(len2, _8, bdytail, _16b), _16b,\n                scale(len, _16c, bdytail, _32), _32,  _32b, _64), _64);\n        }\n    }\n    if (cdxtail !== 0 || cdytail !== 0) {\n        if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n            s1 = adxtail * bdy;\n            c = splitter * adxtail;\n            ahi = c - (c - adxtail);\n            alo = adxtail - ahi;\n            c = splitter * bdy;\n            bhi = c - (c - bdy);\n            blo = bdy - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = adx * bdytail;\n            c = splitter * adx;\n            ahi = c - (c - adx);\n            alo = adx - ahi;\n            c = splitter * bdytail;\n            bhi = c - (c - bdytail);\n            blo = bdytail - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 + t0;\n            bvirt = _i - s0;\n            u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 + t1;\n            bvirt = _i - _0;\n            u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            u[3] = u3;\n            n1 = -ady;\n            n0 = -adytail;\n            s1 = bdxtail * n1;\n            c = splitter * bdxtail;\n            ahi = c - (c - bdxtail);\n            alo = bdxtail - ahi;\n            c = splitter * n1;\n            bhi = c - (c - n1);\n            blo = n1 - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = bdx * n0;\n            c = splitter * bdx;\n            ahi = c - (c - bdx);\n            alo = bdx - ahi;\n            c = splitter * n0;\n            bhi = c - (c - n0);\n            blo = n0 - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 + t0;\n            bvirt = _i - s0;\n            v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 + t1;\n            bvirt = _i - _0;\n            v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            v[3] = u3;\n            abtlen = sum(4, u, 4, v, abt);\n            s1 = adxtail * bdytail;\n            c = splitter * adxtail;\n            ahi = c - (c - adxtail);\n            alo = adxtail - ahi;\n            c = splitter * bdytail;\n            bhi = c - (c - bdytail);\n            blo = bdytail - bhi;\n            s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n            t1 = bdxtail * adytail;\n            c = splitter * bdxtail;\n            ahi = c - (c - bdxtail);\n            alo = bdxtail - ahi;\n            c = splitter * adytail;\n            bhi = c - (c - adytail);\n            blo = adytail - bhi;\n            t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n            _i = s0 - t0;\n            bvirt = s0 - _i;\n            abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n            _j = s1 + _i;\n            bvirt = _j - s1;\n            _0 = s1 - (_j - bvirt) + (_i - bvirt);\n            _i = _0 - t1;\n            bvirt = _0 - _i;\n            abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n            u3 = _j + _i;\n            bvirt = u3 - _j;\n            abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n            abtt[3] = u3;\n            abttlen = 4;\n        } else {\n            abt[0] = 0;\n            abtlen = 1;\n            abtt[0] = 0;\n            abttlen = 1;\n        }\n        if (cdxtail !== 0) {\n            const len = scale(abtlen, abt, cdxtail, _16c);\n            finlen = finadd(finlen, sum(\n                scale(cxtablen, cxtab, cdxtail, _16), _16,\n                scale(len, _16c, 2 * cdx, _32), _32, _48), _48);\n\n            const len2 = scale(abttlen, abtt, cdxtail, _8);\n            finlen = finadd(finlen, sum_three(\n                scale(len2, _8, 2 * cdx, _16), _16,\n                scale(len2, _8, cdxtail, _16b), _16b,\n                scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);\n\n            if (adytail !== 0) {\n                finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);\n            }\n            if (bdytail !== 0) {\n                finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);\n            }\n        }\n        if (cdytail !== 0) {\n            const len = scale(abtlen, abt, cdytail, _16c);\n            finlen = finadd(finlen, sum(\n                scale(cytablen, cytab, cdytail, _16), _16,\n                scale(len, _16c, 2 * cdy, _32), _32, _48), _48);\n\n            const len2 = scale(abttlen, abtt, cdytail, _8);\n            finlen = finadd(finlen, sum_three(\n                scale(len2, _8, 2 * cdy, _16), _16,\n                scale(len2, _8, cdytail, _16b), _16b,\n                scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);\n        }\n    }\n\n    return fin[finlen - 1];\n}\n\nexport function incircle(ax, ay, bx, by, cx, cy, dx, dy) {\n    const adx = ax - dx;\n    const bdx = bx - dx;\n    const cdx = cx - dx;\n    const ady = ay - dy;\n    const bdy = by - dy;\n    const cdy = cy - dy;\n\n    const bdxcdy = bdx * cdy;\n    const cdxbdy = cdx * bdy;\n    const alift = adx * adx + ady * ady;\n\n    const cdxady = cdx * ady;\n    const adxcdy = adx * cdy;\n    const blift = bdx * bdx + bdy * bdy;\n\n    const adxbdy = adx * bdy;\n    const bdxady = bdx * ady;\n    const clift = cdx * cdx + cdy * cdy;\n\n    const det =\n        alift * (bdxcdy - cdxbdy) +\n        blift * (cdxady - adxcdy) +\n        clift * (adxbdy - bdxady);\n\n    const permanent =\n        (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +\n        (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +\n        (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;\n\n    const errbound = iccerrboundA * permanent;\n\n    if (det > errbound || -det > errbound) {\n        return det;\n    }\n    return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);\n}\n\nexport function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {\n    const adx = ax - dx;\n    const ady = ay - dy;\n    const bdx = bx - dx;\n    const bdy = by - dy;\n    const cdx = cx - dx;\n    const cdy = cy - dy;\n\n    const abdet = adx * bdy - bdx * ady;\n    const bcdet = bdx * cdy - cdx * bdy;\n    const cadet = cdx * ady - adx * cdy;\n    const alift = adx * adx + ady * ady;\n    const blift = bdx * bdx + bdy * bdy;\n    const clift = cdx * cdx + cdy * cdy;\n\n    return alift * bcdet + blift * cadet + clift * abdet;\n}\n","/**\r\n * @module util/math\r\n *\r\n * Core math utilities for triangle mesh operations.\r\n */\r\n\r\n/**\r\n * 3D Euclidean distance between two points.\r\n * @param {{ x: number, y: number, z: number }} a\r\n * @param {{ x: number, y: number, z: number }} b\r\n * @returns {number}\r\n */\r\nexport function dist3(a, b) {\r\n\tvar dx = a.x - b.x;\r\n\tvar dy = a.y - b.y;\r\n\tvar dz = a.z - b.z;\r\n\treturn Math.sqrt(dx * dx + dy * dy + dz * dz);\r\n}\r\n\r\n/**\r\n * Squared 3D distance (avoids sqrt for comparisons).\r\n * @param {{ x: number, y: number, z: number }} a\r\n * @param {{ x: number, y: number, z: number }} b\r\n * @returns {number}\r\n */\r\nexport function distSq3(a, b) {\r\n\tvar dx = a.x - b.x;\r\n\tvar dy = a.y - b.y;\r\n\tvar dz = a.z - b.z;\r\n\treturn dx * dx + dy * dy + dz * dz;\r\n}\r\n\r\n/**\r\n * Compute the area of a triangle in 3D using the cross-product method.\r\n * @param {{ v0: Object, v1: Object, v2: Object }} tri\r\n * @returns {number} Area in square units\r\n */\r\nexport function triangleArea3D(tri) {\r\n\tvar ux = tri.v1.x - tri.v0.x;\r\n\tvar uy = tri.v1.y - tri.v0.y;\r\n\tvar uz = tri.v1.z - tri.v0.z;\r\n\tvar vx = tri.v2.x - tri.v0.x;\r\n\tvar vy = tri.v2.y - tri.v0.y;\r\n\tvar vz = tri.v2.z - tri.v0.z;\r\n\tvar cx = uy * vz - uz * vy;\r\n\tvar cy = uz * vx - ux * vz;\r\n\tvar cz = ux * vy - uy * vx;\r\n\treturn 0.5 * Math.sqrt(cx * cx + cy * cy + cz * cz);\r\n}\r\n\r\n/**\r\n * Compute axis-aligned bounding box from an array of points.\r\n * @param {Array<{ x: number, y: number, z: number }>} points\r\n * @returns {{ minX: number, maxX: number, minY: number, maxY: number, minZ: number, maxZ: number }}\r\n */\r\nexport function computeBounds(points) {\r\n\tvar minX = Infinity, minY = Infinity, minZ = Infinity;\r\n\tvar maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\r\n\tfor (var i = 0; i < points.length; i++) {\r\n\t\tvar p = points[i];\r\n\t\tif (p.x < minX) minX = p.x;\r\n\t\tif (p.y < minY) minY = p.y;\r\n\t\tif (p.z < minZ) minZ = p.z;\r\n\t\tif (p.x > maxX) maxX = p.x;\r\n\t\tif (p.y > maxY) maxY = p.y;\r\n\t\tif (p.z > maxZ) maxZ = p.z;\r\n\t}\r\n\treturn { minX: minX, maxX: maxX, minY: minY, maxY: maxY, minZ: minZ, maxZ: maxZ };\r\n}\r\n\r\n/**\r\n * Cross product of two 3D vectors.\r\n * @param {{ x: number, y: number, z: number }} a\r\n * @param {{ x: number, y: number, z: number }} b\r\n * @returns {{ x: number, y: number, z: number }}\r\n */\r\nexport function cross(a, b) {\r\n\treturn {\r\n\t\tx: a.y * b.z - a.z * b.y,\r\n\t\ty: a.z * b.x - a.x * b.z,\r\n\t\tz: a.x * b.y - a.y * b.x\r\n\t};\r\n}\r\n\r\n/**\r\n * Linearly interpolate between two vertices.\r\n * @param {{ x: number, y: number, z: number }} a\r\n * @param {{ x: number, y: number, z: number }} b\r\n * @param {number} t - Interpolation factor [0, 1]\r\n * @returns {{ x: number, y: number, z: number }}\r\n */\r\nexport function lerpVert(a, b, t) {\r\n\treturn {\r\n\t\tx: a.x + t * (b.x - a.x),\r\n\t\ty: a.y + t * (b.y - a.y),\r\n\t\tz: a.z + t * (b.z - a.z)\r\n\t};\r\n}\r\n\r\n/**\r\n * Standard vertex key for spatial hashing (6 decimal places).\r\n * @param {{ x: number, y: number, z: number }} v\r\n * @returns {string}\r\n */\r\nexport function vKey(v) {\r\n\treturn v.x.toFixed(6) + \",\" + v.y.toFixed(6) + \",\" + v.z.toFixed(6);\r\n}\r\n\r\n/**\r\n * Canonical edge key (order-independent).\r\n * @param {string} ka - Vertex key A\r\n * @param {string} kb - Vertex key B\r\n * @returns {string}\r\n */\r\nexport function edgeKey(ka, kb) {\r\n\treturn ka < kb ? ka + \"|\" + kb : kb + \"|\" + ka;\r\n}\r\n\r\n/**\r\n * Compute shared centroid of two triangle soups.\r\n */\r\nexport function soupCentroid(soupA, soupB) {\r\n\tvar sx = 0, sy = 0, sz = 0, n = 0;\r\n\tfor (var i = 0; i < soupA.length; i++) {\r\n\t\tvar t = soupA[i];\r\n\t\tsx += t.v0.x + t.v1.x + t.v2.x;\r\n\t\tsy += t.v0.y + t.v1.y + t.v2.y;\r\n\t\tsz += t.v0.z + t.v1.z + t.v2.z;\r\n\t\tn += 3;\r\n\t}\r\n\tfor (var j = 0; j < soupB.length; j++) {\r\n\t\tvar t2 = soupB[j];\r\n\t\tsx += t2.v0.x + t2.v1.x + t2.v2.x;\r\n\t\tsy += t2.v0.y + t2.v1.y + t2.v2.y;\r\n\t\tsz += t2.v0.z + t2.v1.z + t2.v2.z;\r\n\t\tn += 3;\r\n\t}\r\n\treturn { x: sx / n, y: sy / n, z: sz / n };\r\n}\r\n\r\n/**\r\n * Translate a triangle soup by an offset.\r\n */\r\nexport function translateSoup(soup, dx, dy, dz) {\r\n\tvar out = new Array(soup.length);\r\n\tfor (var i = 0; i < soup.length; i++) {\r\n\t\tvar t = soup[i];\r\n\t\tout[i] = {\r\n\t\t\tv0: { x: t.v0.x + dx, y: t.v0.y + dy, z: t.v0.z + dz },\r\n\t\t\tv1: { x: t.v1.x + dx, y: t.v1.y + dy, z: t.v1.z + dz },\r\n\t\t\tv2: { x: t.v2.x + dx, y: t.v2.y + dy, z: t.v2.z + dz }\r\n\t\t};\r\n\t}\r\n\treturn out;\r\n}\r\n\r\n/**\r\n * Count open (boundary) and non-manifold (over-shared) edges in a triangle soup.\r\n * @param {Array} tris - Array of {v0, v1, v2}\r\n * @returns {{ openEdges: number, overShared: number, total: number }}\r\n */\r\nexport function countOpenEdges(tris) {\r\n\tvar edgeMap = {};\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar verts = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar keys = [vKey(verts[0]), vKey(verts[1]), vKey(verts[2])];\r\n\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tvar ne = (e + 1) % 3;\r\n\t\t\tvar ek = edgeKey(keys[e], keys[ne]);\r\n\t\t\tif (!edgeMap[ek]) {\r\n\t\t\t\tedgeMap[ek] = 0;\r\n\t\t\t}\r\n\t\t\tedgeMap[ek]++;\r\n\t\t}\r\n\t}\r\n\r\n\tvar openEdges = 0;\r\n\tvar overShared = 0;\r\n\tvar total = 0;\r\n\r\n\tfor (var ek2 in edgeMap) {\r\n\t\ttotal++;\r\n\t\tif (edgeMap[ek2] === 1) {\r\n\t\t\topenEdges++;\r\n\t\t} else if (edgeMap[ek2] > 2) {\r\n\t\t\toverShared++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn { openEdges: openEdges, overShared: overShared, total: total };\r\n}\r\n","/**\r\n * @module normals/triNormal\r\n *\r\n * Compute the unit normal of a triangle from its three vertices.\r\n */\r\n\r\nimport { cross } from \"../util/math.js\";\r\n\r\n/**\r\n * Compute the unit face normal of a triangle.\r\n *\r\n * Uses the cross product of edges (v0->v1) x (v0->v2) and normalises\r\n * to unit length.  Returns the Z-up fallback {0,0,1} for degenerate\r\n * (zero-area) triangles.\r\n *\r\n * @param {{ v0: {x:number,y:number,z:number}, v1: {x:number,y:number,z:number}, v2: {x:number,y:number,z:number} }} tri\r\n * @returns {{ x: number, y: number, z: number }} Unit normal vector\r\n */\r\nexport function triNormal(tri) {\r\n    var e1 = { x: tri.v1.x - tri.v0.x, y: tri.v1.y - tri.v0.y, z: tri.v1.z - tri.v0.z };\r\n    var e2 = { x: tri.v2.x - tri.v0.x, y: tri.v2.y - tri.v0.y, z: tri.v2.z - tri.v0.z };\r\n    var n = cross(e1, e2);\r\n    var len = Math.sqrt(n.x * n.x + n.y * n.y + n.z * n.z);\r\n    if (len < 1e-15) return { x: 0, y: 0, z: 1 };\r\n    return { x: n.x / len, y: n.y / len, z: n.z / len };\r\n}\r\n","/**\r\n * @module intersect/triTriIntersection\r\n *\r\n * Moller triangle-triangle intersection test.\r\n *\r\n * Determines whether two triangles intersect and, if so, computes the\r\n * line segment that lies on both triangles.  Based on the Moller (1997)\r\n * separating-axis / interval-overlap method.\r\n *\r\n * Exports:\r\n *  - triTriIntersection(triA, triB)          -- segment or null\r\n *  - triTriIntersectionDetailed(triA, triB)  -- signed distances + segLen\r\n *  - computeTriInterval(tri, lineDir, linePoint, d0, d1, d2)\r\n *  - findLinePoint(nA, dA, nB, dB, lineDir)\r\n */\r\n\r\nimport { orient3d } from \"robust-predicates\";\r\nimport { triNormal } from \"../normals/triNormal.js\";\r\nimport { cross } from \"../util/math.js\";\r\n\r\n/**\r\n * Moller triangle-triangle intersection.\r\n *\r\n * Projects each triangle onto the plane of the other, computes the\r\n * parametric overlap of their crossing intervals on the plane-plane\r\n * intersection line, and returns the resulting 3-D segment.\r\n *\r\n * @param {{ v0: Object, v1: Object, v2: Object }} triA\r\n * @param {{ v0: Object, v1: Object, v2: Object }} triB\r\n * @returns {{ p0: {x:number,y:number,z:number}, p1: {x:number,y:number,z:number} } | null}\r\n *          Intersection segment, or null when no intersection exists.\r\n */\r\nexport function triTriIntersection(triA, triB) {\r\n    // Robust orientation: signed distances of triA vertices to plane(triB)\r\n    // orient3d returns a value proportional to 6× signed tetrahedron volume;\r\n    // its sign is guaranteed correct even for near-degenerate configurations.\r\n    var dA0 = orient3d(triB.v0.x, triB.v0.y, triB.v0.z, triB.v1.x, triB.v1.y, triB.v1.z, triB.v2.x, triB.v2.y, triB.v2.z, triA.v0.x, triA.v0.y, triA.v0.z);\r\n    var dA1 = orient3d(triB.v0.x, triB.v0.y, triB.v0.z, triB.v1.x, triB.v1.y, triB.v1.z, triB.v2.x, triB.v2.y, triB.v2.z, triA.v1.x, triA.v1.y, triA.v1.z);\r\n    var dA2 = orient3d(triB.v0.x, triB.v0.y, triB.v0.z, triB.v1.x, triB.v1.y, triB.v1.z, triB.v2.x, triB.v2.y, triB.v2.z, triA.v2.x, triA.v2.y, triA.v2.z);\r\n\r\n    // All on same side -> no intersection\r\n    if (dA0 > 0 && dA1 > 0 && dA2 > 0) return null;\r\n    if (dA0 < 0 && dA1 < 0 && dA2 < 0) return null;\r\n\r\n    // Robust orientation: signed distances of triB vertices to plane(triA)\r\n    var dB0 = orient3d(triA.v0.x, triA.v0.y, triA.v0.z, triA.v1.x, triA.v1.y, triA.v1.z, triA.v2.x, triA.v2.y, triA.v2.z, triB.v0.x, triB.v0.y, triB.v0.z);\r\n    var dB1 = orient3d(triA.v0.x, triA.v0.y, triA.v0.z, triA.v1.x, triA.v1.y, triA.v1.z, triA.v2.x, triA.v2.y, triA.v2.z, triB.v1.x, triB.v1.y, triB.v1.z);\r\n    var dB2 = orient3d(triA.v0.x, triA.v0.y, triA.v0.z, triA.v1.x, triA.v1.y, triA.v1.z, triA.v2.x, triA.v2.y, triA.v2.z, triB.v2.x, triB.v2.y, triB.v2.z);\r\n\r\n    // All on same side -> no intersection\r\n    if (dB0 > 0 && dB1 > 0 && dB2 > 0) return null;\r\n    if (dB0 < 0 && dB1 < 0 && dB2 < 0) return null;\r\n\r\n    // Float normals for geometric computation (line direction, projections)\r\n    var nA = triNormal(triA);\r\n    var nB = triNormal(triB);\r\n\r\n    // Near-parallel planes\r\n    var dotN = nA.x * nB.x + nA.y * nB.y + nA.z * nB.z;\r\n    if (Math.abs(dotN) > 0.9999) return null;\r\n\r\n    // Intersection line direction\r\n    var lineDir = cross(nA, nB);\r\n    var lineDirLen = Math.sqrt(lineDir.x * lineDir.x + lineDir.y * lineDir.y + lineDir.z * lineDir.z);\r\n    if (lineDirLen < 1e-12) return null;\r\n    lineDir.x /= lineDirLen;\r\n    lineDir.y /= lineDirLen;\r\n    lineDir.z /= lineDirLen;\r\n\r\n    // Plane constants for line-point computation\r\n    var planeDA = -(nA.x * triA.v0.x + nA.y * triA.v0.y + nA.z * triA.v0.z);\r\n    var planeDB = -(nB.x * triB.v0.x + nB.y * triB.v0.y + nB.z * triB.v0.z);\r\n\r\n    // A point on the intersection line (needed for relative projection)\r\n    var linePoint = findLinePoint(nA, planeDA, nB, planeDB, lineDir);\r\n    if (!linePoint) return null;\r\n\r\n    // Project each triangle's crossing edges onto the line\r\n    var intervalA = computeTriInterval(triA, lineDir, linePoint, dA0, dA1, dA2);\r\n    if (!intervalA) return null;\r\n\r\n    var intervalB = computeTriInterval(triB, lineDir, linePoint, dB0, dB1, dB2);\r\n    if (!intervalB) return null;\r\n\r\n    // Overlap of intervals\r\n    var overlapMin = Math.max(intervalA.min, intervalB.min);\r\n    var overlapMax = Math.min(intervalA.max, intervalB.max);\r\n\r\n    if (overlapMin >= overlapMax - 1e-10) return null;\r\n\r\n    // Convert parametric overlap back to 3-D\r\n    var p0 = {\r\n        x: linePoint.x + lineDir.x * overlapMin,\r\n        y: linePoint.y + lineDir.y * overlapMin,\r\n        z: linePoint.z + lineDir.z * overlapMin\r\n    };\r\n    var p1 = {\r\n        x: linePoint.x + lineDir.x * overlapMax,\r\n        y: linePoint.y + lineDir.y * overlapMax,\r\n        z: linePoint.z + lineDir.z * overlapMax\r\n    };\r\n\r\n    // Reproject onto both triangle planes to eliminate floating-point drift.\r\n    // Solves for the minimal correction in the span of both normals so the\r\n    // point lies exactly on both planes: P' = P - alpha*nA - beta*nB\r\n    var denom = 1 - dotN * dotN;\r\n    if (Math.abs(denom) > 1e-15) {\r\n        var invD = 1 / denom;\r\n        var rA0 = nA.x * p0.x + nA.y * p0.y + nA.z * p0.z + planeDA;\r\n        var rB0 = nB.x * p0.x + nB.y * p0.y + nB.z * p0.z + planeDB;\r\n        var a0 = (rA0 - dotN * rB0) * invD;\r\n        var b0 = (rB0 - dotN * rA0) * invD;\r\n        p0.x -= a0 * nA.x + b0 * nB.x;\r\n        p0.y -= a0 * nA.y + b0 * nB.y;\r\n        p0.z -= a0 * nA.z + b0 * nB.z;\r\n\r\n        var rA1 = nA.x * p1.x + nA.y * p1.y + nA.z * p1.z + planeDA;\r\n        var rB1 = nB.x * p1.x + nB.y * p1.y + nB.z * p1.z + planeDB;\r\n        var a1 = (rA1 - dotN * rB1) * invD;\r\n        var b1 = (rB1 - dotN * rA1) * invD;\r\n        p1.x -= a1 * nA.x + b1 * nB.x;\r\n        p1.y -= a1 * nA.y + b1 * nB.y;\r\n        p1.z -= a1 * nA.z + b1 * nB.z;\r\n    }\r\n\r\n    // Skip degenerate segments\r\n    var dx = p0.x - p1.x, dy = p0.y - p1.y, dz = p0.z - p1.z;\r\n    if (Math.sqrt(dx * dx + dy * dy + dz * dz) < 1e-8) return null;\r\n\r\n    return { p0: p0, p1: p1 };\r\n}\r\n\r\n/**\r\n * Moller triangle-triangle intersection with signed-distance metadata.\r\n *\r\n * Identical rejection logic to {@link triTriIntersection} but instead of\r\n * returning the 3-D segment it returns the signed-distance arrays and the\r\n * parametric segment length, which callers (e.g. boolean classifiers) need\r\n * for inside/outside determination.\r\n *\r\n * @param {{ v0: Object, v1: Object, v2: Object }} triA\r\n * @param {{ v0: Object, v1: Object, v2: Object }} triB\r\n * @returns {{ dA: [number,number,number], dB: [number,number,number], segLen: number } | null}\r\n *          dA = signed distances of triA vertices to plane(triB),\r\n *          dB = signed distances of triB vertices to plane(triA),\r\n *          segLen = parametric length of the intersection segment.\r\n */\r\nexport function triTriIntersectionDetailed(triA, triB) {\r\n    // Robust orientation: signed distances of triA vertices to plane(triB)\r\n    var dA0 = orient3d(triB.v0.x, triB.v0.y, triB.v0.z, triB.v1.x, triB.v1.y, triB.v1.z, triB.v2.x, triB.v2.y, triB.v2.z, triA.v0.x, triA.v0.y, triA.v0.z);\r\n    var dA1 = orient3d(triB.v0.x, triB.v0.y, triB.v0.z, triB.v1.x, triB.v1.y, triB.v1.z, triB.v2.x, triB.v2.y, triB.v2.z, triA.v1.x, triA.v1.y, triA.v1.z);\r\n    var dA2 = orient3d(triB.v0.x, triB.v0.y, triB.v0.z, triB.v1.x, triB.v1.y, triB.v1.z, triB.v2.x, triB.v2.y, triB.v2.z, triA.v2.x, triA.v2.y, triA.v2.z);\r\n\r\n    if (dA0 > 0 && dA1 > 0 && dA2 > 0) return null;\r\n    if (dA0 < 0 && dA1 < 0 && dA2 < 0) return null;\r\n\r\n    // Robust orientation: signed distances of triB vertices to plane(triA)\r\n    var dB0 = orient3d(triA.v0.x, triA.v0.y, triA.v0.z, triA.v1.x, triA.v1.y, triA.v1.z, triA.v2.x, triA.v2.y, triA.v2.z, triB.v0.x, triB.v0.y, triB.v0.z);\r\n    var dB1 = orient3d(triA.v0.x, triA.v0.y, triA.v0.z, triA.v1.x, triA.v1.y, triA.v1.z, triA.v2.x, triA.v2.y, triA.v2.z, triB.v1.x, triB.v1.y, triB.v1.z);\r\n    var dB2 = orient3d(triA.v0.x, triA.v0.y, triA.v0.z, triA.v1.x, triA.v1.y, triA.v1.z, triA.v2.x, triA.v2.y, triA.v2.z, triB.v2.x, triB.v2.y, triB.v2.z);\r\n\r\n    if (dB0 > 0 && dB1 > 0 && dB2 > 0) return null;\r\n    if (dB0 < 0 && dB1 < 0 && dB2 < 0) return null;\r\n\r\n    var nA = triNormal(triA);\r\n    var nB = triNormal(triB);\r\n\r\n    var dotN = nA.x * nB.x + nA.y * nB.y + nA.z * nB.z;\r\n    if (Math.abs(dotN) > 0.9999) return null;\r\n\r\n    var lineDir = cross(nA, nB);\r\n    var lineDirLen = Math.sqrt(lineDir.x * lineDir.x + lineDir.y * lineDir.y + lineDir.z * lineDir.z);\r\n    if (lineDirLen < 1e-12) return null;\r\n    lineDir.x /= lineDirLen; lineDir.y /= lineDirLen; lineDir.z /= lineDirLen;\r\n\r\n    var planeDA = -(nA.x * triA.v0.x + nA.y * triA.v0.y + nA.z * triA.v0.z);\r\n    var planeDB = -(nB.x * triB.v0.x + nB.y * triB.v0.y + nB.z * triB.v0.z);\r\n\r\n    var linePoint = findLinePoint(nA, planeDA, nB, planeDB, lineDir);\r\n    if (!linePoint) return null;\r\n\r\n    var intervalA = computeTriInterval(triA, lineDir, linePoint, dA0, dA1, dA2);\r\n    if (!intervalA) return null;\r\n\r\n    var intervalB = computeTriInterval(triB, lineDir, linePoint, dB0, dB1, dB2);\r\n    if (!intervalB) return null;\r\n\r\n    var overlapMin = Math.max(intervalA.min, intervalB.min);\r\n    var overlapMax = Math.min(intervalA.max, intervalB.max);\r\n    if (overlapMin >= overlapMax - 1e-10) return null;\r\n\r\n    var segLen = overlapMax - overlapMin;\r\n    if (segLen < 1e-8) return null;\r\n\r\n    return {\r\n        dA: [dA0, dA1, dA2],\r\n        dB: [dB0, dB1, dB2],\r\n        segLen: segLen\r\n    };\r\n}\r\n\r\n/**\r\n * Compute the parametric interval where a triangle crosses the\r\n * plane-plane intersection line.\r\n *\r\n * For each triangle edge that straddles the opposing plane (sign change\r\n * in the signed distances d0, d1, d2) the crossing point is projected\r\n * onto `lineDir` relative to `linePoint`.  Vertices exactly on the plane\r\n * are also projected.\r\n *\r\n * @param {{ v0: Object, v1: Object, v2: Object }} tri\r\n * @param {{ x: number, y: number, z: number }} lineDir  - Unit direction of intersection line\r\n * @param {{ x: number, y: number, z: number }} linePoint - Reference point on the line\r\n * @param {number} d0 - Signed distance of tri.v0 to the opposing plane\r\n * @param {number} d1 - Signed distance of tri.v1 to the opposing plane\r\n * @param {number} d2 - Signed distance of tri.v2 to the opposing plane\r\n * @returns {{ min: number, max: number } | null} Parametric interval, or null if fewer than 2 crossings\r\n */\r\nexport function computeTriInterval(tri, lineDir, linePoint, d0, d1, d2) {\r\n    var verts = [tri.v0, tri.v1, tri.v2];\r\n    var dists = [d0, d1, d2];\r\n    var params = [];\r\n\r\n    // Find edges that cross the plane (sign change in distances)\r\n    for (var i = 0; i < 3; i++) {\r\n        var j = (i + 1) % 3;\r\n        var di = dists[i];\r\n        var dj = dists[j];\r\n\r\n        if ((di > 0 && dj < 0) || (di < 0 && dj > 0)) {\r\n            // Edge crosses the plane\r\n            var t = di / (di - dj);\r\n            var pt = {\r\n                x: verts[i].x + t * (verts[j].x - verts[i].x),\r\n                y: verts[i].y + t * (verts[j].y - verts[i].y),\r\n                z: verts[i].z + t * (verts[j].z - verts[i].z)\r\n            };\r\n            // Relative projection onto line (relative to linePoint for UTM precision)\r\n            var param = (pt.x - linePoint.x) * lineDir.x + (pt.y - linePoint.y) * lineDir.y + (pt.z - linePoint.z) * lineDir.z;\r\n            params.push(param);\r\n        } else if (di === 0) {\r\n            // Vertex on the plane -- relative projection\r\n            var param2 = (verts[i].x - linePoint.x) * lineDir.x + (verts[i].y - linePoint.y) * lineDir.y + (verts[i].z - linePoint.z) * lineDir.z;\r\n            params.push(param2);\r\n        }\r\n    }\r\n\r\n    if (params.length < 2) return null;\r\n\r\n    // Deduplicate very close values\r\n    params.sort(function (a, b) { return a - b; });\r\n\r\n    return { min: params[0], max: params[params.length - 1] };\r\n}\r\n\r\n/**\r\n * Find a point on the intersection line of two planes.\r\n *\r\n * Sets the dominant component of `lineDir` to zero and solves the\r\n * resulting 2x2 system via Cramer's rule.\r\n *\r\n * @param {{ x: number, y: number, z: number }} nA - Normal of plane A\r\n * @param {number} dA - Plane constant for A  (nA . p + dA = 0)\r\n * @param {{ x: number, y: number, z: number }} nB - Normal of plane B\r\n * @param {number} dB - Plane constant for B\r\n * @param {{ x: number, y: number, z: number }} lineDir - Direction of the intersection line\r\n * @returns {{ x: number, y: number, z: number } | null}\r\n */\r\nexport function findLinePoint(nA, dA, nB, dB, lineDir) {\r\n    // Find the dominant axis of lineDir to set it to 0\r\n    var ax = Math.abs(lineDir.x);\r\n    var ay = Math.abs(lineDir.y);\r\n    var az = Math.abs(lineDir.z);\r\n\r\n    var px, py, pz;\r\n\r\n    if (az >= ax && az >= ay) {\r\n        // Set z = 0, solve for x, y via Cramer's rule\r\n        var det = nA.x * nB.y - nA.y * nB.x;\r\n        if (Math.abs(det) < 1e-12) return null;\r\n        px = (-dA * nB.y + dB * nA.y) / det;\r\n        py = (nA.x * (-dB) - nB.x * (-dA)) / det;\r\n        pz = 0;\r\n    } else if (ay >= ax) {\r\n        // Set y = 0, solve for x, z via Cramer's rule\r\n        var det2 = nA.x * nB.z - nA.z * nB.x;\r\n        if (Math.abs(det2) < 1e-12) return null;\r\n        px = (-dA * nB.z + dB * nA.z) / det2;\r\n        py = 0;\r\n        pz = (nA.x * (-dB) - nB.x * (-dA)) / det2;\r\n    } else {\r\n        // Set x = 0, solve for y, z via Cramer's rule\r\n        var det3 = nA.y * nB.z - nA.z * nB.y;\r\n        if (Math.abs(det3) < 1e-12) return null;\r\n        px = 0;\r\n        py = (-dA * nB.z + dB * nA.z) / det3;\r\n        pz = (nA.y * (-dB) - nB.y * (-dA)) / det3;\r\n    }\r\n\r\n    return { x: px, y: py, z: pz };\r\n}\r\n","/**\r\n * @module intersect/spatialGrid\r\n *\r\n * Uniform spatial grid for accelerating triangle-pair intersection tests.\r\n *\r\n * Triangles are binned into 2-D (XY) grid cells based on their axis-aligned\r\n * bounding boxes.  Querying the grid with a bounding box returns candidate\r\n * triangle indices that share at least one cell, dramatically reducing the\r\n * number of exact Moller tests required.\r\n *\r\n * Exports:\r\n *  - buildSpatialGrid(tris, cellSize)\r\n *  - queryGrid(grid, bb, cellSize)\r\n *  - computeBBox(tris)\r\n *  - triBBox(tri)\r\n *  - bboxOverlap(a, b)\r\n *  - estimateAvgEdge(tris)\r\n */\r\n\r\nimport { dist3 } from \"../util/math.js\";\r\n\r\n/**\r\n * Build a 2-D spatial hash grid on arbitrary axes.\r\n *\r\n * Unlike {@link buildSpatialGrid} which always hashes on XY,\r\n * this function accepts accessor functions to extract the two\r\n * bucketing coordinates.  For example, pass `v => v.y, v => v.z`\r\n * to build a YZ grid suitable for X-direction ray casting.\r\n *\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} tris\r\n * @param {number} cellSize - Width/height of each grid cell (world units)\r\n * @param {function(Object): number} getA - Extracts first axis value from vertex\r\n * @param {function(Object): number} getB - Extracts second axis value from vertex\r\n * @returns {Object.<string, number[]>} Grid mapping cell keys to triangle index arrays\r\n */\r\nexport function buildSpatialGridOnAxes(tris, cellSize, getA, getB) {\r\n\tvar grid = {};\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar t = tris[i];\r\n\t\tvar verts = [t.v0, t.v1, t.v2];\r\n\r\n\t\tvar minA = Infinity, maxA = -Infinity;\r\n\t\tvar minB = Infinity, maxB = -Infinity;\r\n\t\tfor (var j = 0; j < 3; j++) {\r\n\t\t\tvar a = getA(verts[j]), b = getB(verts[j]);\r\n\t\t\tif (a < minA) minA = a;\r\n\t\t\tif (a > maxA) maxA = a;\r\n\t\t\tif (b < minB) minB = b;\r\n\t\t\tif (b > maxB) maxB = b;\r\n\t\t}\r\n\r\n\t\tvar a0 = Math.floor(minA / cellSize);\r\n\t\tvar b0 = Math.floor(minB / cellSize);\r\n\t\tvar a1 = Math.floor(maxA / cellSize);\r\n\t\tvar b1 = Math.floor(maxB / cellSize);\r\n\r\n\t\tfor (var ga = a0; ga <= a1; ga++) {\r\n\t\t\tfor (var gb = b0; gb <= b1; gb++) {\r\n\t\t\t\tvar key = ga + \",\" + gb;\r\n\t\t\t\tif (!grid[key]) grid[key] = [];\r\n\t\t\t\tgrid[key].push(i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn grid;\r\n}\r\n\r\n/**\r\n * Query a grid built by {@link buildSpatialGridOnAxes} for a single point.\r\n *\r\n * Returns the triangle indices stored in the cell containing the\r\n * given (a, b) coordinates.  No deduplication is needed because\r\n * point queries always hit exactly one cell.\r\n *\r\n * @param {Object.<string, number[]>} grid - Grid built by buildSpatialGridOnAxes\r\n * @param {number} a - First axis coordinate of the query point\r\n * @param {number} b - Second axis coordinate of the query point\r\n * @param {number} cellSize - Same cell size used when building the grid\r\n * @returns {number[]} Triangle indices (empty array if cell is empty)\r\n */\r\nexport function queryGridOnAxes(grid, a, b, cellSize) {\r\n\tvar ga = Math.floor(a / cellSize);\r\n\tvar gb = Math.floor(b / cellSize);\r\n\tvar key = ga + \",\" + gb;\r\n\tvar cell = grid[key];\r\n\treturn cell ? cell : [];\r\n}\r\n\r\n/**\r\n * Build a 2-D spatial hash grid from an array of triangles.\r\n *\r\n * Each triangle is inserted into every XY cell that its axis-aligned\r\n * bounding box overlaps.  The grid is keyed by \"cellX,cellY\" strings\r\n * and each bucket holds an array of triangle indices.\r\n *\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} tris\r\n * @param {number} cellSize - Width/height of each grid cell (world units)\r\n * @returns {Object.<string, number[]>} Grid mapping cell keys to triangle index arrays\r\n */\r\nexport function buildSpatialGrid(tris, cellSize) {\r\n    var grid = {};\r\n\r\n    for (var i = 0; i < tris.length; i++) {\r\n        var bb = triBBox(tris[i]);\r\n        var x0 = Math.floor(bb.minX / cellSize);\r\n        var y0 = Math.floor(bb.minY / cellSize);\r\n        var x1 = Math.floor(bb.maxX / cellSize);\r\n        var y1 = Math.floor(bb.maxY / cellSize);\r\n\r\n        for (var gx = x0; gx <= x1; gx++) {\r\n            for (var gy = y0; gy <= y1; gy++) {\r\n                var key = gx + \",\" + gy;\r\n                if (!grid[key]) grid[key] = [];\r\n                grid[key].push(i);\r\n            }\r\n        }\r\n    }\r\n\r\n    return grid;\r\n}\r\n\r\n/**\r\n * Query the spatial grid for triangle indices whose cells overlap a\r\n * given bounding box.\r\n *\r\n * Returned indices are de-duplicated (a triangle spanning multiple cells\r\n * appears only once).\r\n *\r\n * @param {Object.<string, number[]>} grid - Grid built by {@link buildSpatialGrid}\r\n * @param {{ minX: number, minY: number, maxX: number, maxY: number }} bb - Query bounding box\r\n * @param {number} cellSize - Same cell size used when building the grid\r\n * @returns {number[]} Unique triangle indices\r\n */\r\nexport function queryGrid(grid, bb, cellSize) {\r\n    var x0 = Math.floor(bb.minX / cellSize);\r\n    var y0 = Math.floor(bb.minY / cellSize);\r\n    var x1 = Math.floor(bb.maxX / cellSize);\r\n    var y1 = Math.floor(bb.maxY / cellSize);\r\n\r\n    var seen = {};\r\n    var result = [];\r\n\r\n    for (var gx = x0; gx <= x1; gx++) {\r\n        for (var gy = y0; gy <= y1; gy++) {\r\n            var key = gx + \",\" + gy;\r\n            var cell = grid[key];\r\n            if (!cell) continue;\r\n            for (var c = 0; c < cell.length; c++) {\r\n                var idx = cell[c];\r\n                if (!seen[idx]) {\r\n                    seen[idx] = true;\r\n                    result.push(idx);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/**\r\n * Compute the axis-aligned bounding box of a triangle array.\r\n *\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} tris\r\n * @returns {{ minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number }}\r\n */\r\nexport function computeBBox(tris) {\r\n    var minX = Infinity, minY = Infinity, minZ = Infinity;\r\n    var maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\r\n\r\n    for (var i = 0; i < tris.length; i++) {\r\n        var t = tris[i];\r\n        var verts = [t.v0, t.v1, t.v2];\r\n        for (var j = 0; j < 3; j++) {\r\n            var v = verts[j];\r\n            if (v.x < minX) minX = v.x;\r\n            if (v.y < minY) minY = v.y;\r\n            if (v.z < minZ) minZ = v.z;\r\n            if (v.x > maxX) maxX = v.x;\r\n            if (v.y > maxY) maxY = v.y;\r\n            if (v.z > maxZ) maxZ = v.z;\r\n        }\r\n    }\r\n\r\n    return { minX: minX, minY: minY, minZ: minZ, maxX: maxX, maxY: maxY, maxZ: maxZ };\r\n}\r\n\r\n/**\r\n * Compute the axis-aligned bounding box of a single triangle.\r\n *\r\n * @param {{ v0: Object, v1: Object, v2: Object }} tri\r\n * @returns {{ minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number }}\r\n */\r\nexport function triBBox(tri) {\r\n    return {\r\n        minX: Math.min(tri.v0.x, tri.v1.x, tri.v2.x),\r\n        minY: Math.min(tri.v0.y, tri.v1.y, tri.v2.y),\r\n        minZ: Math.min(tri.v0.z, tri.v1.z, tri.v2.z),\r\n        maxX: Math.max(tri.v0.x, tri.v1.x, tri.v2.x),\r\n        maxY: Math.max(tri.v0.y, tri.v1.y, tri.v2.y),\r\n        maxZ: Math.max(tri.v0.z, tri.v1.z, tri.v2.z)\r\n    };\r\n}\r\n\r\n/**\r\n * Test whether two axis-aligned bounding boxes overlap in all three axes.\r\n *\r\n * @param {{ minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number }} a\r\n * @param {{ minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number }} b\r\n * @returns {boolean}\r\n */\r\nexport function bboxOverlap(a, b) {\r\n    return a.minX <= b.maxX && a.maxX >= b.minX &&\r\n           a.minY <= b.maxY && a.maxY >= b.minY &&\r\n           a.minZ <= b.maxZ && a.maxZ >= b.minZ;\r\n}\r\n\r\n/**\r\n * Estimate the average edge length of a triangle array by sampling\r\n * up to the first 100 triangles.\r\n *\r\n * Useful for choosing a spatial grid cell size proportional to the\r\n * mesh resolution.\r\n *\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} tris\r\n * @returns {number} Average edge length (defaults to 1.0 for empty input)\r\n */\r\nexport function estimateAvgEdge(tris) {\r\n    if (tris.length === 0) return 1.0;\r\n    var total = 0;\r\n    var count = Math.min(tris.length, 100);\r\n    for (var i = 0; i < count; i++) {\r\n        var t = tris[i];\r\n        total += dist3(t.v0, t.v1);\r\n        total += dist3(t.v1, t.v2);\r\n        total += dist3(t.v2, t.v0);\r\n    }\r\n    return total / (count * 3);\r\n}\r\n","/**\r\n * @module intersect/intersectMeshPair\r\n *\r\n * Compute all triangle-triangle intersection segments between two\r\n * triangle meshes, accelerated by a uniform spatial grid.\r\n *\r\n * Exports:\r\n *  - intersectMeshPair(trisA, trisB)        -- array of {p0, p1} segments\r\n *  - intersectMeshPairTagged(trisA, trisB)  -- segments with source triangle indices\r\n */\r\n\r\nimport { triTriIntersection } from \"./triTriIntersection.js\";\r\nimport { buildSpatialGrid, queryGrid, triBBox, estimateAvgEdge } from \"./spatialGrid.js\";\r\n\r\n/**\r\n * Find all intersection segments between two triangle meshes.\r\n *\r\n * Builds a spatial grid on mesh B and, for each triangle in mesh A,\r\n * queries the grid for candidate triangles in B whose bounding boxes\r\n * overlap, then runs the exact Moller triangle-triangle test on each\r\n * candidate pair.\r\n *\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} trisA - First mesh triangles\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} trisB - Second mesh triangles\r\n * @returns {Array<{ p0: {x:number,y:number,z:number}, p1: {x:number,y:number,z:number} }>}\r\n *          Intersection segments (may be empty)\r\n */\r\nexport function intersectMeshPair(trisA, trisB) {\r\n    var segments = [];\r\n\r\n    // Compute average edge length for grid cell size\r\n    var avgEdge = estimateAvgEdge(trisB);\r\n    var cellSize = Math.max(avgEdge * 2, 0.1);\r\n\r\n    // Build grid on mesh B\r\n    var gridB = buildSpatialGrid(trisB, cellSize);\r\n\r\n    // For each triangle in A, find candidate triangles in B\r\n    for (var i = 0; i < trisA.length; i++) {\r\n        var triA = trisA[i];\r\n        var bbA = triBBox(triA);\r\n\r\n        var candidates = queryGrid(gridB, bbA, cellSize);\r\n\r\n        for (var c = 0; c < candidates.length; c++) {\r\n            var triB = trisB[candidates[c]];\r\n\r\n            var seg = triTriIntersection(triA, triB);\r\n            if (seg) {\r\n                segments.push(seg);\r\n            }\r\n        }\r\n    }\r\n\r\n    return segments;\r\n}\r\n\r\n/**\r\n * Like {@link intersectMeshPair} but each returned segment carries the\r\n * source triangle indices from mesh A and mesh B.\r\n *\r\n * Useful for boolean operations and classification that need to know\r\n * which triangles produced each intersection segment.\r\n *\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} trisA - First mesh triangles\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} trisB - Second mesh triangles\r\n * @returns {Array<{ p0: {x:number,y:number,z:number}, p1: {x:number,y:number,z:number}, idxA: number, idxB: number }>}\r\n *          Tagged intersection segments (may be empty)\r\n */\r\nexport function intersectMeshPairTagged(trisA, trisB) {\r\n    var segments = [];\r\n\r\n    var avgEdge = estimateAvgEdge(trisB);\r\n    var cellSize = Math.max(avgEdge * 2, 0.1);\r\n    var gridB = buildSpatialGrid(trisB, cellSize);\r\n\r\n    for (var i = 0; i < trisA.length; i++) {\r\n        var triA = trisA[i];\r\n        var bbA = triBBox(triA);\r\n        var candidates = queryGrid(gridB, bbA, cellSize);\r\n\r\n        for (var c = 0; c < candidates.length; c++) {\r\n            var j = candidates[c];\r\n            var triB = trisB[j];\r\n            var seg = triTriIntersection(triA, triB);\r\n            if (seg) {\r\n                segments.push({ p0: seg.p0, p1: seg.p1, idxA: i, idxB: j });\r\n            }\r\n        }\r\n    }\r\n\r\n    return segments;\r\n}\r\n","\nconst EPSILON = Math.pow(2, -52);\nconst EDGE_STACK = new Uint32Array(512);\n\nimport {orient2d} from 'robust-predicates';\n\nexport default class Delaunator {\n\n    static from(points, getX = defaultGetX, getY = defaultGetY) {\n        const n = points.length;\n        const coords = new Float64Array(n * 2);\n\n        for (let i = 0; i < n; i++) {\n            const p = points[i];\n            coords[2 * i] = getX(p);\n            coords[2 * i + 1] = getY(p);\n        }\n\n        return new Delaunator(coords);\n    }\n\n    constructor(coords) {\n        const n = coords.length >> 1;\n        if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.');\n\n        this.coords = coords;\n\n        // arrays that will store the triangulation graph\n        const maxTriangles = Math.max(2 * n - 5, 0);\n        this._triangles = new Uint32Array(maxTriangles * 3);\n        this._halfedges = new Int32Array(maxTriangles * 3);\n\n        // temporary arrays for tracking the edges of the advancing convex hull\n        this._hashSize = Math.ceil(Math.sqrt(n));\n        this._hullPrev = new Uint32Array(n); // edge to prev edge\n        this._hullNext = new Uint32Array(n); // edge to next edge\n        this._hullTri = new Uint32Array(n); // edge to adjacent triangle\n        this._hullHash = new Int32Array(this._hashSize); // angular edge hash\n\n        // temporary arrays for sorting points\n        this._ids = new Uint32Array(n);\n        this._dists = new Float64Array(n);\n\n        this.update();\n    }\n\n    update() {\n        const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} =  this;\n        const n = coords.length >> 1;\n\n        // populate an array of point indices; calculate input data bbox\n        let minX = Infinity;\n        let minY = Infinity;\n        let maxX = -Infinity;\n        let maxY = -Infinity;\n\n        for (let i = 0; i < n; i++) {\n            const x = coords[2 * i];\n            const y = coords[2 * i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n            this._ids[i] = i;\n        }\n        const cx = (minX + maxX) / 2;\n        const cy = (minY + maxY) / 2;\n\n        let i0, i1, i2;\n\n        // pick a seed point close to the center\n        for (let i = 0, minDist = Infinity; i < n; i++) {\n            const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);\n            if (d < minDist) {\n                i0 = i;\n                minDist = d;\n            }\n        }\n        const i0x = coords[2 * i0];\n        const i0y = coords[2 * i0 + 1];\n\n        // find the point closest to the seed\n        for (let i = 0, minDist = Infinity; i < n; i++) {\n            if (i === i0) continue;\n            const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);\n            if (d < minDist && d > 0) {\n                i1 = i;\n                minDist = d;\n            }\n        }\n        let i1x = coords[2 * i1];\n        let i1y = coords[2 * i1 + 1];\n\n        let minRadius = Infinity;\n\n        // find the third point which forms the smallest circumcircle with the first two\n        for (let i = 0; i < n; i++) {\n            if (i === i0 || i === i1) continue;\n            const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);\n            if (r < minRadius) {\n                i2 = i;\n                minRadius = r;\n            }\n        }\n        let i2x = coords[2 * i2];\n        let i2y = coords[2 * i2 + 1];\n\n        if (minRadius === Infinity) {\n            // order collinear points by dx (or dy if all x are identical)\n            // and return the list as a hull\n            for (let i = 0; i < n; i++) {\n                this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]);\n            }\n            quicksort(this._ids, this._dists, 0, n - 1);\n            const hull = new Uint32Array(n);\n            let j = 0;\n            for (let i = 0, d0 = -Infinity; i < n; i++) {\n                const id = this._ids[i];\n                const d = this._dists[id];\n                if (d > d0) {\n                    hull[j++] = id;\n                    d0 = d;\n                }\n            }\n            this.hull = hull.subarray(0, j);\n            this.triangles = new Uint32Array(0);\n            this.halfedges = new Uint32Array(0);\n            return;\n        }\n\n        // swap the order of the seed points for counter-clockwise orientation\n        if (orient2d(i0x, i0y, i1x, i1y, i2x, i2y) < 0) {\n            const i = i1;\n            const x = i1x;\n            const y = i1y;\n            i1 = i2;\n            i1x = i2x;\n            i1y = i2y;\n            i2 = i;\n            i2x = x;\n            i2y = y;\n        }\n\n        const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n        this._cx = center.x;\n        this._cy = center.y;\n\n        for (let i = 0; i < n; i++) {\n            this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);\n        }\n\n        // sort the points by distance from the seed triangle circumcenter\n        quicksort(this._ids, this._dists, 0, n - 1);\n\n        // set up the seed triangle as the starting hull\n        this._hullStart = i0;\n        let hullSize = 3;\n\n        hullNext[i0] = hullPrev[i2] = i1;\n        hullNext[i1] = hullPrev[i0] = i2;\n        hullNext[i2] = hullPrev[i1] = i0;\n\n        hullTri[i0] = 0;\n        hullTri[i1] = 1;\n        hullTri[i2] = 2;\n\n        hullHash.fill(-1);\n        hullHash[this._hashKey(i0x, i0y)] = i0;\n        hullHash[this._hashKey(i1x, i1y)] = i1;\n        hullHash[this._hashKey(i2x, i2y)] = i2;\n\n        this.trianglesLen = 0;\n        this._addTriangle(i0, i1, i2, -1, -1, -1);\n\n        for (let k = 0, xp, yp; k < this._ids.length; k++) {\n            const i = this._ids[k];\n            const x = coords[2 * i];\n            const y = coords[2 * i + 1];\n\n            // skip near-duplicate points\n            if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue;\n            xp = x;\n            yp = y;\n\n            // skip seed triangle points\n            if (i === i0 || i === i1 || i === i2) continue;\n\n            // find a visible edge on the convex hull using edge hash\n            let start = 0;\n            for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) {\n                start = hullHash[(key + j) % this._hashSize];\n                if (start !== -1 && start !== hullNext[start]) break;\n            }\n\n            start = hullPrev[start];\n            let e = start, q;\n            while (q = hullNext[e], orient2d(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]) >= 0) {\n                e = q;\n                if (e === start) {\n                    e = -1;\n                    break;\n                }\n            }\n            if (e === -1) continue; // likely a near-duplicate point; skip it\n\n            // add the first triangle from the point\n            let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n\n            // recursively flip triangles from the point until they satisfy the Delaunay condition\n            hullTri[i] = this._legalize(t + 2);\n            hullTri[e] = t; // keep track of boundary triangles on the hull\n            hullSize++;\n\n            // walk forward through the hull, adding more triangles and flipping recursively\n            let n = hullNext[e];\n            while (q = hullNext[n], orient2d(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1]) < 0) {\n                t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]);\n                hullTri[i] = this._legalize(t + 2);\n                hullNext[n] = n; // mark as removed\n                hullSize--;\n                n = q;\n            }\n\n            // walk backward from the other side, adding more triangles and flipping\n            if (e === start) {\n                while (q = hullPrev[e], orient2d(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]) < 0) {\n                    t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n                    this._legalize(t + 2);\n                    hullTri[q] = t;\n                    hullNext[e] = e; // mark as removed\n                    hullSize--;\n                    e = q;\n                }\n            }\n\n            // update the hull indices\n            this._hullStart = hullPrev[i] = e;\n            hullNext[e] = hullPrev[n] = i;\n            hullNext[i] = n;\n\n            // save the two new edges in the hash table\n            hullHash[this._hashKey(x, y)] = i;\n            hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n        }\n\n        this.hull = new Uint32Array(hullSize);\n        for (let i = 0, e = this._hullStart; i < hullSize; i++) {\n            this.hull[i] = e;\n            e = hullNext[e];\n        }\n\n        // trim typed triangle mesh arrays\n        this.triangles = this._triangles.subarray(0, this.trianglesLen);\n        this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n    }\n\n    _hashKey(x, y) {\n        return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize;\n    }\n\n    _legalize(a) {\n        const {_triangles: triangles, _halfedges: halfedges, coords} = this;\n\n        let i = 0;\n        let ar = 0;\n\n        // recursion eliminated with a fixed-size stack\n        while (true) {\n            const b = halfedges[a];\n\n            /* if the pair of triangles doesn't satisfy the Delaunay condition\n             * (p1 is inside the circumcircle of [p0, pl, pr]), flip them,\n             * then do the same check/flip recursively for the new pair of triangles\n             *\n             *           pl                    pl\n             *          /||\\                  /  \\\n             *       al/ || \\bl            al/    \\a\n             *        /  ||  \\              /      \\\n             *       /  a||b  \\    flip    /___ar___\\\n             *     p0\\   ||   /p1   =>   p0\\---bl---/p1\n             *        \\  ||  /              \\      /\n             *       ar\\ || /br             b\\    /br\n             *          \\||/                  \\  /\n             *           pr                    pr\n             */\n            const a0 = a - a % 3;\n            ar = a0 + (a + 2) % 3;\n\n            if (b === -1) { // convex hull edge\n                if (i === 0) break;\n                a = EDGE_STACK[--i];\n                continue;\n            }\n\n            const b0 = b - b % 3;\n            const al = a0 + (a + 1) % 3;\n            const bl = b0 + (b + 2) % 3;\n\n            const p0 = triangles[ar];\n            const pr = triangles[a];\n            const pl = triangles[al];\n            const p1 = triangles[bl];\n\n            const illegal = inCircle(\n                coords[2 * p0], coords[2 * p0 + 1],\n                coords[2 * pr], coords[2 * pr + 1],\n                coords[2 * pl], coords[2 * pl + 1],\n                coords[2 * p1], coords[2 * p1 + 1]);\n\n            if (illegal) {\n                triangles[a] = p1;\n                triangles[b] = p0;\n\n                const hbl = halfedges[bl];\n\n                // edge swapped on the other side of the hull (rare); fix the halfedge reference\n                if (hbl === -1) {\n                    let e = this._hullStart;\n                    do {\n                        if (this._hullTri[e] === bl) {\n                            this._hullTri[e] = a;\n                            break;\n                        }\n                        e = this._hullPrev[e];\n                    } while (e !== this._hullStart);\n                }\n                this._link(a, hbl);\n                this._link(b, halfedges[ar]);\n                this._link(ar, bl);\n\n                const br = b0 + (b + 1) % 3;\n\n                // don't worry about hitting the cap: it can only happen on extremely degenerate input\n                if (i < EDGE_STACK.length) {\n                    EDGE_STACK[i++] = br;\n                }\n            } else {\n                if (i === 0) break;\n                a = EDGE_STACK[--i];\n            }\n        }\n\n        return ar;\n    }\n\n    _link(a, b) {\n        this._halfedges[a] = b;\n        if (b !== -1) this._halfedges[b] = a;\n    }\n\n    // add a new triangle given vertex indices and adjacent half-edge ids\n    _addTriangle(i0, i1, i2, a, b, c) {\n        const t = this.trianglesLen;\n\n        this._triangles[t] = i0;\n        this._triangles[t + 1] = i1;\n        this._triangles[t + 2] = i2;\n\n        this._link(t, a);\n        this._link(t + 1, b);\n        this._link(t + 2, c);\n\n        this.trianglesLen += 3;\n\n        return t;\n    }\n}\n\n// monotonically increases with real angle, but doesn't need expensive trigonometry\nfunction pseudoAngle(dx, dy) {\n    const p = dx / (Math.abs(dx) + Math.abs(dy));\n    return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1]\n}\n\nfunction dist(ax, ay, bx, by) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return dx * dx + dy * dy;\n}\n\nfunction inCircle(ax, ay, bx, by, cx, cy, px, py) {\n    const dx = ax - px;\n    const dy = ay - py;\n    const ex = bx - px;\n    const ey = by - py;\n    const fx = cx - px;\n    const fy = cy - py;\n\n    const ap = dx * dx + dy * dy;\n    const bp = ex * ex + ey * ey;\n    const cp = fx * fx + fy * fy;\n\n    return dx * (ey * cp - bp * fy) -\n           dy * (ex * cp - bp * fx) +\n           ap * (ex * fy - ey * fx) < 0;\n}\n\nfunction circumradius(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n\n    const bl = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n\n    const x = (ey * bl - dy * cl) * d;\n    const y = (dx * cl - ex * bl) * d;\n\n    return x * x + y * y;\n}\n\nfunction circumcenter(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n\n    const bl = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n\n    const x = ax + (ey * bl - dy * cl) * d;\n    const y = ay + (dx * cl - ex * bl) * d;\n\n    return {x, y};\n}\n\nfunction quicksort(ids, dists, left, right) {\n    if (right - left <= 20) {\n        for (let i = left + 1; i <= right; i++) {\n            const temp = ids[i];\n            const tempDist = dists[temp];\n            let j = i - 1;\n            while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--];\n            ids[j + 1] = temp;\n        }\n    } else {\n        const median = (left + right) >> 1;\n        let i = left + 1;\n        let j = right;\n        swap(ids, median, i);\n        if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n        if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n        if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n\n        const temp = ids[i];\n        const tempDist = dists[temp];\n        while (true) {\n            do i++; while (dists[ids[i]] < tempDist);\n            do j--; while (dists[ids[j]] > tempDist);\n            if (j < i) break;\n            swap(ids, i, j);\n        }\n        ids[left + 1] = ids[j];\n        ids[j] = temp;\n\n        if (right - i + 1 >= j - left) {\n            quicksort(ids, dists, i, right);\n            quicksort(ids, dists, left, j - 1);\n        } else {\n            quicksort(ids, dists, left, j - 1);\n            quicksort(ids, dists, i, right);\n        }\n    }\n}\n\nfunction swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\n\nfunction defaultGetX(p) {\n    return p[0];\n}\nfunction defaultGetY(p) {\n    return p[1];\n}\n","import { incircle, orient2d } from 'robust-predicates';\n\n/**\n * A set of numbers, stored as bits in a typed array. The amount of numbers /\n * the maximum number that can be stored is limited by the length, which is\n * fixed at construction time.\n */\nclass BitSet {\n    constructor(W, bs) {\n        this.W = W;\n        this.bs = bs;\n    }\n    /**\n     * Add a number to the set.\n     *\n     * @param idx The number to add. Must be 0 <= idx < len.\n     * @return this.\n     */\n    add(idx) {\n        const W = this.W, byte = (idx / W) | 0, bit = idx % W;\n        this.bs[byte] |= 1 << bit;\n        return this;\n    }\n    /**\n     * Delete a number from the set.\n     *\n     * @param idx The number to delete. Must be 0 <= idx < len.\n     * @return this.\n     */\n    delete(idx) {\n        const W = this.W, byte = (idx / W) | 0, bit = idx % W;\n        this.bs[byte] &= ~(1 << bit);\n        return this;\n    }\n    /**\n     * Add or delete a number in the set, depending on the second argument.\n     *\n     * @param idx The number to add or delete. Must be 0 <= idx < len.\n     * @param val If true, add the number, otherwise delete.\n     * @return val.\n     */\n    set(idx, val) {\n        const W = this.W, byte = (idx / W) | 0, bit = idx % W, m = 1 << bit;\n        //this.bs[byte] = set ? this.bs[byte] | m : this.bs[byte] & ~m;\n        this.bs[byte] ^= (-val ^ this.bs[byte]) & m; // -set == set * 255\n        return val;\n    }\n    /**\n     * Whether the number is in the set.\n     *\n     * @param idx The number to test. Must be 0 <= idx < len.\n     * @return True if the number is in the set.\n     */\n    has(idx) {\n        const W = this.W, byte = (idx / W) | 0, bit = idx % W;\n        return !!(this.bs[byte] & (1 << bit));\n    }\n    /**\n     * Iterate over the numbers that are in the set. The callback is invoked\n     * with each number that is set. It is allowed to change the BitSet during\n     * iteration. If it deletes a number that has not been iterated over, that\n     * number will not show up in a later call. If it adds a number during\n     * iteration, that number may or may not show up in a later call.\n     *\n     * @param fn The function to call for each number.\n     * @return this.\n     */\n    forEach(fn) {\n        const W = this.W, bs = this.bs, len = bs.length;\n        for (let byte = 0; byte < len; byte++) {\n            let bit = 0;\n            // bs[byte] may change during iteration\n            while (bs[byte] && bit < W) {\n                if (bs[byte] & (1 << bit)) {\n                    fn(byte * W + bit);\n                }\n                bit++;\n            }\n        }\n        return this;\n    }\n}\n/**\n * A bit set using 8 bits per cell.\n */\nclass BitSet8 extends BitSet {\n    /**\n     * Create a bit set.\n     *\n     * @param len The length of the bit set, limiting the maximum value that\n     *        can be stored in it to len - 1.\n     */\n    constructor(len) {\n        const W = 8, bs = new Uint8Array(Math.ceil(len / W)).fill(0);\n        super(W, bs);\n    }\n}\n\nfunction nextEdge(e) { return (e % 3 === 2) ? e - 2 : e + 1; }\nfunction prevEdge(e) { return (e % 3 === 0) ? e + 2 : e - 1; }\n/**\n * Constrain a triangulation from Delaunator, using (parts of) the algorithm\n * in \"A fast algorithm for generating constrained Delaunay triangulations\" by\n * S. W. Sloan.\n */\nclass Constrainautor {\n    /**\n     * Make a Constrainautor.\n     *\n     * @param del The triangulation output from Delaunator.\n     * @param edges If provided, constrain these edges as by constrainAll.\n     */\n    constructor(del, edges) {\n        if (!del || typeof del !== 'object' || !del.triangles || !del.halfedges || !del.coords) {\n            throw new Error(\"Expected an object with Delaunator output\");\n        }\n        if (del.triangles.length % 3 || del.halfedges.length !== del.triangles.length || del.coords.length % 2) {\n            throw new Error(\"Delaunator output appears inconsistent\");\n        }\n        if (del.triangles.length < 3) {\n            throw new Error(\"No edges in triangulation\");\n        }\n        this.del = del;\n        const U32NIL = 2 ** 32 - 1, // Max value of a Uint32Array: use as a sentinel for not yet defined \n        numPoints = del.coords.length >> 1, numEdges = del.triangles.length;\n        // Map every vertex id to the right-most edge that points to that vertex.\n        this.vertMap = new Uint32Array(numPoints).fill(U32NIL);\n        // Keep track of edges flipped while constraining\n        this.flips = new BitSet8(numEdges);\n        // Keep track of constrained edges\n        this.consd = new BitSet8(numEdges);\n        for (let e = 0; e < numEdges; e++) {\n            const v = del.triangles[e];\n            if (this.vertMap[v] === U32NIL) {\n                this.updateVert(e);\n            }\n        }\n        if (edges) {\n            this.constrainAll(edges);\n        }\n    }\n    /**\n     * Constrain the triangulation such that there is an edge between p1 and p2.\n     *\n     * @param segP1 The index of one segment end-point in the coords array.\n     * @param segP2 The index of the other segment end-point in the coords array.\n     * @return The id of the edge that points from p1 to p2. If the\n     *         constrained edge lies on the hull and points in the opposite\n     *         direction (p2 to p1), the negative of its id is returned.\n     */\n    constrainOne(segP1, segP2) {\n        const { triangles, halfedges } = this.del, vm = this.vertMap, consd = this.consd, start = vm[segP1];\n        // Loop over the edges touching segP1\n        let edg = start;\n        do {\n            // edg points toward segP1, so its start-point is opposite it\n            const p4 = triangles[edg], nxt = nextEdge(edg);\n            // already constrained, but in reverse order\n            if (p4 === segP2) {\n                return this.protect(edg);\n            }\n            // The edge opposite segP1\n            const opp = prevEdge(edg), p3 = triangles[opp];\n            // already constrained\n            if (p3 === segP2) {\n                this.protect(nxt);\n                return nxt;\n            }\n            // edge opposite segP1 intersects constraint\n            if (this.intersectSegments(segP1, segP2, p3, p4)) {\n                edg = opp;\n                break;\n            }\n            const adj = halfedges[nxt];\n            // The next edge pointing to segP1\n            edg = adj;\n        } while (edg !== -1 && edg !== start);\n        let conEdge = edg;\n        // Walk through the triangulation looking for further intersecting\n        // edges and flip them. If an intersecting edge cannot be flipped,\n        // assign its id to `rescan` and restart from there, until there are\n        // no more intersects.\n        let rescan = -1;\n        while (edg !== -1) {\n            // edg is the intersecting half-edge in the triangle we came from\n            // adj is now the opposite half-edge in the adjacent triangle, which\n            // is away from segP1.\n            const adj = halfedges[edg], \n            // cross diagonal\n            bot = prevEdge(edg), top = prevEdge(adj), rgt = nextEdge(adj);\n            if (adj === -1) {\n                throw new Error(\"Constraining edge exited the hull\");\n            }\n            if (consd.has(edg)) { // || consd.has(adj) // assume consd is consistent\n                throw new Error(\"Edge intersects already constrained edge\");\n            }\n            if (this.isCollinear(segP1, segP2, triangles[edg]) ||\n                this.isCollinear(segP1, segP2, triangles[adj])) {\n                throw new Error(\"Constraining edge intersects point\");\n            }\n            const convex = this.intersectSegments(triangles[edg], triangles[adj], triangles[bot], triangles[top]);\n            // The quadrilateral formed by the two triangles adjoing edg is not\n            // convex, so the edge can't be flipped. Continue looking for the\n            // next intersecting edge and restart at this one later.\n            if (!convex) {\n                if (rescan === -1) {\n                    rescan = edg;\n                }\n                if (triangles[top] === segP2) {\n                    if (edg === rescan) {\n                        throw new Error(\"Infinite loop: non-convex quadrilateral\");\n                    }\n                    edg = rescan;\n                    rescan = -1;\n                    continue;\n                }\n                // Look for the next intersect\n                if (this.intersectSegments(segP1, segP2, triangles[top], triangles[adj])) {\n                    edg = top;\n                }\n                else if (this.intersectSegments(segP1, segP2, triangles[rgt], triangles[top])) {\n                    edg = rgt;\n                }\n                else if (rescan === edg) {\n                    throw new Error(\"Infinite loop: no further intersect after non-convex\");\n                }\n                continue;\n            }\n            this.flipDiagonal(edg);\n            // The new edge might still intersect, which will be fixed in the\n            // next rescan.\n            if (this.intersectSegments(segP1, segP2, triangles[bot], triangles[top])) {\n                if (rescan === -1) {\n                    rescan = bot;\n                }\n                if (rescan === bot) {\n                    throw new Error(\"Infinite loop: flipped diagonal still intersects\");\n                }\n            }\n            // Reached the other segment end-point? Start the rescan.\n            if (triangles[top] === segP2) {\n                conEdge = top;\n                edg = rescan;\n                rescan = -1;\n                // Otherwise, for the next edge that intersects. Because we just\n                // flipped, it's either edg again, or rgt.\n            }\n            else if (this.intersectSegments(segP1, segP2, triangles[rgt], triangles[top])) {\n                edg = rgt;\n            }\n        }\n        const flips = this.flips;\n        this.protect(conEdge);\n        do {\n            // need to use var to scope it outside the loop, but re-initialize\n            // to 0 each iteration\n            var flipped = 0;\n            flips.forEach(edg => {\n                flips.delete(edg);\n                const adj = halfedges[edg];\n                if (adj === -1) {\n                    return;\n                }\n                flips.delete(adj);\n                if (!this.isDelaunay(edg)) {\n                    this.flipDiagonal(edg);\n                    flipped++;\n                }\n            });\n        } while (flipped > 0);\n        return this.findEdge(segP1, segP2);\n    }\n    /**\n     * Fix the Delaunay condition. It is no longer necessary to call this\n     * method after constraining (many) edges, since constrainOne will do it\n     * after each.\n     *\n     * @param deep If true, keep checking & flipping edges until all\n     *        edges are Delaunay, otherwise only check the edges once.\n     * @return The triangulation object.\n     */\n    delaunify(deep = false) {\n        const halfedges = this.del.halfedges, flips = this.flips, consd = this.consd, len = halfedges.length;\n        do {\n            var flipped = 0;\n            for (let edg = 0; edg < len; edg++) {\n                if (consd.has(edg)) {\n                    continue;\n                }\n                flips.delete(edg);\n                const adj = halfedges[edg];\n                if (adj === -1) {\n                    continue;\n                }\n                flips.delete(adj);\n                if (!this.isDelaunay(edg)) {\n                    this.flipDiagonal(edg);\n                    flipped++;\n                }\n            }\n        } while (deep && flipped > 0);\n        return this;\n    }\n    /**\n     * Call constrainOne on each edge, and delaunify afterwards.\n     *\n     * @param edges The edges to constrain: each element is an array with\n     *        [p1, p2] which are indices into the points array originally\n     *        supplied to Delaunator.\n     * @return The triangulation object.\n     */\n    constrainAll(edges) {\n        const len = edges.length;\n        for (let i = 0; i < len; i++) {\n            const e = edges[i];\n            this.constrainOne(e[0], e[1]);\n        }\n        return this;\n    }\n    /**\n     * Whether an edge is a constrained edge.\n     *\n     * @param edg The edge id.\n     * @return True if the edge is constrained.\n     */\n    isConstrained(edg) {\n        return this.consd.has(edg);\n    }\n    /**\n     * Find the edge that points from p1 -> p2. If there is only an edge from\n     * p2 -> p1 (i.e. it is on the hull), returns the negative id of it.\n     *\n     * @param p1 The index of the first point into the points array.\n     * @param p2 The index of the second point into the points array.\n     * @return The id of the edge that points from p1 -> p2, or the negative\n     *         id of the edge that goes from p2 -> p1, or Infinity if there is\n     *         no edge between p1 and p2.\n     */\n    findEdge(p1, p2) {\n        const start1 = this.vertMap[p2], { triangles, halfedges } = this.del;\n        let edg = start1, prv = -1;\n        // Walk around p2, iterating over the edges pointing to it\n        do {\n            if (triangles[edg] === p1) {\n                return edg;\n            }\n            prv = nextEdge(edg);\n            edg = halfedges[prv];\n        } while (edg !== -1 && edg !== start1);\n        // Did not find p1 -> p2, the only option is that it is on the hull on\n        // the 'left-hand' side, pointing p2 -> p1 (or there is no edge)\n        if (triangles[nextEdge(prv)] === p1) {\n            return -prv;\n        }\n        return Infinity;\n    }\n    /**\n     * Mark an edge as constrained, i.e. should not be touched by `delaunify`.\n     *\n     * @private\n     * @param edg The edge id.\n     * @return If edg has an adjacent, returns that, otherwise -edg.\n     */\n    protect(edg) {\n        const adj = this.del.halfedges[edg], flips = this.flips, consd = this.consd;\n        flips.delete(edg);\n        consd.add(edg);\n        if (adj !== -1) {\n            flips.delete(adj);\n            consd.add(adj);\n            return adj;\n        }\n        return -edg;\n    }\n    /**\n     * Mark an edge as flipped, unless it is already marked as constrained.\n     *\n     * @private\n     * @param edg The edge id.\n     * @return True if edg was not constrained.\n     */\n    markFlip(edg) {\n        const halfedges = this.del.halfedges, flips = this.flips, consd = this.consd;\n        if (consd.has(edg)) {\n            return false;\n        }\n        const adj = halfedges[edg];\n        if (adj !== -1) {\n            flips.add(edg);\n            flips.add(adj);\n        }\n        return true;\n    }\n    /**\n     * Flip the edge shared by two triangles.\n     *\n     * @private\n     * @param edg The edge shared by the two triangles, must have an\n     *        adjacent half-edge.\n     * @return The new diagonal.\n     */\n    flipDiagonal(edg) {\n        // Flip a diagonal\n        //                top                     edg\n        //          o  <----- o            o <------  o \n        //         | ^ \\      ^           |       ^ / ^\n        //      lft|  \\ \\     |        lft|      / /  |\n        //         |   \\ \\adj |           |  bot/ /   |\n        //         | edg\\ \\   |           |    / /top |\n        //         |     \\ \\  |rgt        |   / /     |rgt\n        //         v      \\ v |           v  / v      |\n        //         o ----->  o            o   ------> o \n        //           bot                     adj\n        const { triangles, halfedges } = this.del, flips = this.flips, consd = this.consd, adj = halfedges[edg], bot = prevEdge(edg), lft = nextEdge(edg), top = prevEdge(adj), rgt = nextEdge(adj), adjBot = halfedges[bot], adjTop = halfedges[top];\n        if (consd.has(edg)) { // || consd.has(adj) // assume consd is consistent\n            throw new Error(\"Trying to flip a constrained edge\");\n        }\n        // move *edg to *top\n        triangles[edg] = triangles[top];\n        halfedges[edg] = adjTop;\n        if (!flips.set(edg, flips.has(top))) {\n            consd.set(edg, consd.has(top));\n        }\n        if (adjTop !== -1) {\n            halfedges[adjTop] = edg;\n        }\n        halfedges[bot] = top;\n        // move *adj to *bot\n        triangles[adj] = triangles[bot];\n        halfedges[adj] = adjBot;\n        if (!flips.set(adj, flips.has(bot))) {\n            consd.set(adj, consd.has(bot));\n        }\n        if (adjBot !== -1) {\n            halfedges[adjBot] = adj;\n        }\n        halfedges[top] = bot;\n        this.markFlip(edg);\n        this.markFlip(lft);\n        this.markFlip(adj);\n        this.markFlip(rgt);\n        // mark flips unconditionally\n        flips.add(bot);\n        consd.delete(bot);\n        flips.add(top);\n        consd.delete(top);\n        this.updateVert(edg);\n        this.updateVert(lft);\n        this.updateVert(adj);\n        this.updateVert(rgt);\n        return bot;\n    }\n    /**\n     * Whether the two triangles sharing edg conform to the Delaunay condition.\n     * As a shortcut, if the given edge has no adjacent (is on the hull), it is\n     * certainly Delaunay.\n     *\n     * @private\n     * @param edg The edge shared by the triangles to test.\n     * @return True if they are Delaunay.\n     */\n    isDelaunay(edg) {\n        const { triangles, halfedges } = this.del, adj = halfedges[edg];\n        if (adj === -1) {\n            return true;\n        }\n        const p1 = triangles[prevEdge(edg)], p2 = triangles[edg], p3 = triangles[nextEdge(edg)], px = triangles[prevEdge(adj)];\n        return !this.inCircle(p1, p2, p3, px);\n    }\n    /**\n     * Update the vertex -> incoming edge map.\n     *\n     * @private\n     * @param start The id of an *outgoing* edge.\n     * @return The id of the right-most incoming edge.\n     */\n    updateVert(start) {\n        const { triangles, halfedges } = this.del, vm = this.vertMap, v = triangles[start];\n        // When iterating over incoming edges around a vertex, we do so in\n        // clockwise order ('going left'). If the vertex lies on the hull, two\n        // of the edges will have no opposite, leaving a gap. If the starting\n        // incoming edge is not the right-most, we will miss edges between it\n        // and the gap. So walk counter-clockwise until we find an edge on the\n        // hull, or get back to where we started.\n        let inc = prevEdge(start), adj = halfedges[inc];\n        while (adj !== -1 && adj !== start) {\n            inc = prevEdge(adj);\n            adj = halfedges[inc];\n        }\n        vm[v] = inc;\n        return inc;\n    }\n    /**\n     * Whether the segment between [p1, p2] intersects with [p3, p4]. When the\n     * segments share an end-point (e.g. p1 == p3 etc.), they are not considered\n     * intersecting.\n     *\n     * @private\n     * @param p1 The index of point 1 into this.del.coords.\n     * @param p2 The index of point 2 into this.del.coords.\n     * @param p3 The index of point 3 into this.del.coords.\n     * @param p4 The index of point 4 into this.del.coords.\n     * @return True if the segments intersect.\n     */\n    intersectSegments(p1, p2, p3, p4) {\n        const pts = this.del.coords;\n        // If the segments share one of the end-points, they cannot intersect\n        // (provided the input is properly segmented, and the triangulation is\n        // correct), but intersectSegments will say that they do. We can catch\n        // it here already.\n        if (p1 === p3 || p1 === p4 || p2 === p3 || p2 === p4) {\n            return false;\n        }\n        return intersectSegments(pts[p1 * 2], pts[p1 * 2 + 1], pts[p2 * 2], pts[p2 * 2 + 1], pts[p3 * 2], pts[p3 * 2 + 1], pts[p4 * 2], pts[p4 * 2 + 1]);\n    }\n    /**\n     * Whether point px is in the circumcircle of the triangle formed by p1, p2,\n     * and p3 (which are in counter-clockwise order).\n     *\n     * @param p1 The index of point 1 into this.del.coords.\n     * @param p2 The index of point 2 into this.del.coords.\n     * @param p3 The index of point 3 into this.del.coords.\n     * @param px The index of point x into this.del.coords.\n     * @return True if (px, py) is in the circumcircle.\n     */\n    inCircle(p1, p2, p3, px) {\n        const pts = this.del.coords;\n        return incircle(pts[p1 * 2], pts[p1 * 2 + 1], pts[p2 * 2], pts[p2 * 2 + 1], pts[p3 * 2], pts[p3 * 2 + 1], pts[px * 2], pts[px * 2 + 1]) < 0.0;\n    }\n    /**\n     * Whether point p1, p2, and p are collinear.\n     *\n     * @private\n     * @param p1 The index of segment point 1 into this.del.coords.\n     * @param p2 The index of segment point 2 into this.del.coords.\n     * @param p The index of the point p into this.del.coords.\n     * @return True if the points are collinear.\n     */\n    isCollinear(p1, p2, p) {\n        const pts = this.del.coords;\n        return orient2d(pts[p1 * 2], pts[p1 * 2 + 1], pts[p2 * 2], pts[p2 * 2 + 1], pts[p * 2], pts[p * 2 + 1]) === 0.0;\n    }\n}\nConstrainautor.intersectSegments = intersectSegments;\n/**\n * Compute if two line segments [p1, p2] and [p3, p4] intersect.\n *\n * @name Constrainautor.intersectSegments\n * @source https://github.com/mikolalysenko/robust-segment-intersect\n * @param p1x The x coordinate of point 1 of the first segment.\n * @param p1y The y coordinate of point 1 of the first segment.\n * @param p2x The x coordinate of point 2 of the first segment.\n * @param p2y The y coordinate of point 2 of the first segment.\n * @param p3x The x coordinate of point 1 of the second segment.\n * @param p3y The y coordinate of point 1 of the second segment.\n * @param p4x The x coordinate of point 2 of the second segment.\n * @param p4y The y coordinate of point 2 of the second segment.\n * @return True if the line segments intersect.\n */\nfunction intersectSegments(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n    const x0 = orient2d(p1x, p1y, p3x, p3y, p4x, p4y), y0 = orient2d(p2x, p2y, p3x, p3y, p4x, p4y);\n    if ((x0 > 0 && y0 > 0) || (x0 < 0 && y0 < 0)) {\n        return false;\n    }\n    const x1 = orient2d(p3x, p3y, p1x, p1y, p2x, p2y), y1 = orient2d(p4x, p4y, p1x, p1y, p2x, p2y);\n    if ((x1 > 0 && y1 > 0) || (x1 < 0 && y1 < 0)) {\n        return false;\n    }\n    //Check for degenerate collinear case\n    if (x0 === 0 && y0 === 0 && x1 === 0 && y1 === 0) {\n        return !(Math.max(p3x, p4x) < Math.min(p1x, p2x) ||\n            Math.max(p1x, p2x) < Math.min(p3x, p4x) ||\n            Math.max(p3y, p4y) < Math.min(p1y, p2y) ||\n            Math.max(p1y, p2y) < Math.min(p3y, p4y));\n    }\n    return true;\n}\n\nexport { Constrainautor as default };\n","/**\r\n * @module intersect/chainSegments\r\n *\r\n * Chain disjoint line segments into ordered polylines and optionally\r\n * simplify by vertex spacing.\r\n *\r\n * Segments are chained by matching endpoints within a distance threshold\r\n * using a 3-D spatial hash for O(1) neighbour lookup.  The result is an\r\n * array of polylines (each an array of {x,y,z} points).\r\n *\r\n * Exports:\r\n *  - chainSegments(segments, threshold)\r\n *  - simplifyPolyline(points, spacing)\r\n */\r\n\r\nimport { distSq3, dist3 } from \"../util/math.js\";\r\n\r\n/**\r\n * Chain an array of line segments into ordered polylines.\r\n *\r\n * Uses a 3-D spatial hash of segment endpoints so that each neighbour\r\n * lookup is O(1) amortised.  Each seed segment is extended in both\r\n * directions (head and tail) by repeatedly finding the nearest unused\r\n * segment endpoint within `threshold` distance.\r\n *\r\n * @param {Array<{ p0: {x:number,y:number,z:number}, p1: {x:number,y:number,z:number} }>} segments\r\n * @param {number} threshold - Maximum distance between endpoints to consider connected\r\n * @returns {Array<Array<{x:number,y:number,z:number}>>} Array of polylines\r\n */\r\nexport function chainSegments(segments, threshold) {\r\n    if (segments.length === 0) return [];\r\n\r\n    // Build a spatial hash of segment endpoints for O(1) neighbor lookup\r\n    var cellSize = threshold * 2;\r\n\r\n    /** @type {Object.<string, Array<{segIdx:number, endIdx:number}>>} */\r\n    var endpointMap = {};\r\n\r\n    /**\r\n     * Hash a point into a cell key.\r\n     * @param {{ x: number, y: number, z: number }} p\r\n     * @returns {string}\r\n     */\r\n    function pointHash(p) {\r\n        var cx = Math.floor(p.x / cellSize);\r\n        var cy = Math.floor(p.y / cellSize);\r\n        var cz = Math.floor(p.z / cellSize);\r\n        return cx + \",\" + cy + \",\" + cz;\r\n    }\r\n\r\n    /**\r\n     * Return all 27 neighbouring cell keys (3x3x3 cube).\r\n     * @param {{ x: number, y: number, z: number }} p\r\n     * @returns {string[]}\r\n     */\r\n    function nearbyKeys(p) {\r\n        var cx = Math.floor(p.x / cellSize);\r\n        var cy = Math.floor(p.y / cellSize);\r\n        var cz = Math.floor(p.z / cellSize);\r\n        var keys = [];\r\n        for (var dx = -1; dx <= 1; dx++) {\r\n            for (var dy = -1; dy <= 1; dy++) {\r\n                for (var dz = -1; dz <= 1; dz++) {\r\n                    keys.push((cx + dx) + \",\" + (cy + dy) + \",\" + (cz + dz));\r\n                }\r\n            }\r\n        }\r\n        return keys;\r\n    }\r\n\r\n    // Index all endpoints\r\n    for (var i = 0; i < segments.length; i++) {\r\n        var pts = [segments[i].p0, segments[i].p1];\r\n        for (var e = 0; e < 2; e++) {\r\n            var key = pointHash(pts[e]);\r\n            if (!endpointMap[key]) endpointMap[key] = [];\r\n            endpointMap[key].push({ segIdx: i, endIdx: e });\r\n        }\r\n    }\r\n\r\n    var threshSq = threshold * threshold;\r\n    var used = new Array(segments.length);\r\n    for (var u = 0; u < used.length; u++) used[u] = false;\r\n\r\n    /**\r\n     * Find the nearest unused segment endpoint to a query point.\r\n     * @param {{ x: number, y: number, z: number }} queryPt\r\n     * @param {number} excludeSeg - Segment index to skip (-1 for none)\r\n     * @returns {{ segIdx: number, endIdx: number } | null}\r\n     */\r\n    function findNearest(queryPt, excludeSeg) {\r\n        var keys = nearbyKeys(queryPt);\r\n        var bestDist = threshSq;\r\n        var bestSeg = -1;\r\n        var bestEnd = -1;\r\n        for (var k = 0; k < keys.length; k++) {\r\n            var bucket = endpointMap[keys[k]];\r\n            if (!bucket) continue;\r\n            for (var b = 0; b < bucket.length; b++) {\r\n                var entry = bucket[b];\r\n                if (used[entry.segIdx] || entry.segIdx === excludeSeg) continue;\r\n                var pt = entry.endIdx === 0 ? segments[entry.segIdx].p0 : segments[entry.segIdx].p1;\r\n                var d = distSq3(queryPt, pt);\r\n                if (d < bestDist) {\r\n                    bestDist = d;\r\n                    bestSeg = entry.segIdx;\r\n                    bestEnd = entry.endIdx;\r\n                }\r\n            }\r\n        }\r\n        return bestSeg >= 0 ? { segIdx: bestSeg, endIdx: bestEnd } : null;\r\n    }\r\n\r\n    var polylines = [];\r\n\r\n    for (var s = 0; s < segments.length; s++) {\r\n        if (used[s]) continue;\r\n        used[s] = true;\r\n\r\n        // Build chain as a deque (tail array grown forward, head array reversed later)\r\n        var tailChain = [segments[s].p0, segments[s].p1];\r\n        var headChain = [];\r\n\r\n        // Extend tail\r\n        var extending = true;\r\n        while (extending) {\r\n            extending = false;\r\n            var tail = tailChain[tailChain.length - 1];\r\n            var match = findNearest(tail, -1);\r\n            if (match) {\r\n                used[match.segIdx] = true;\r\n                var seg = segments[match.segIdx];\r\n                // match.endIdx is the end that matched our tail; push the OTHER end\r\n                if (match.endIdx === 0) {\r\n                    tailChain.push(seg.p1);\r\n                } else {\r\n                    tailChain.push(seg.p0);\r\n                }\r\n                extending = true;\r\n            }\r\n        }\r\n\r\n        // Extend head (grow headChain forward, reverse later)\r\n        extending = true;\r\n        while (extending) {\r\n            extending = false;\r\n            var head = headChain.length > 0 ? headChain[headChain.length - 1] : tailChain[0];\r\n            var match2 = findNearest(head, -1);\r\n            if (match2) {\r\n                used[match2.segIdx] = true;\r\n                var seg2 = segments[match2.segIdx];\r\n                if (match2.endIdx === 0) {\r\n                    headChain.push(seg2.p1);\r\n                } else {\r\n                    headChain.push(seg2.p0);\r\n                }\r\n                extending = true;\r\n            }\r\n        }\r\n\r\n        // Combine: reverse headChain + tailChain\r\n        if (headChain.length > 0) {\r\n            headChain.reverse();\r\n            var chain = headChain.concat(tailChain);\r\n            polylines.push(chain);\r\n        } else {\r\n            polylines.push(tailChain);\r\n        }\r\n    }\r\n\r\n    return polylines;\r\n}\r\n\r\n/**\r\n * Simplify a polyline by enforcing a minimum vertex spacing.\r\n *\r\n * Walks the polyline from the first point to the last, accumulating\r\n * distance.  Intermediate vertices are only kept when the accumulated\r\n * distance since the last kept vertex reaches or exceeds `spacing`.\r\n * The first and last points are always preserved.\r\n *\r\n * @param {Array<{x:number,y:number,z:number}>} points - Ordered polyline vertices\r\n * @param {number} spacing - Minimum distance between kept vertices (0 = keep all)\r\n * @returns {Array<{x:number,y:number,z:number}>} Simplified polyline\r\n */\r\nexport function simplifyPolyline(points, spacing) {\r\n    if (points.length <= 2 || spacing <= 0) return points;\r\n\r\n    var result = [points[0]];\r\n    var accumulated = 0;\r\n\r\n    for (var i = 1; i < points.length - 1; i++) {\r\n        accumulated += dist3(points[i - 1], points[i]);\r\n        if (accumulated >= spacing) {\r\n            result.push(points[i]);\r\n            accumulated = 0;\r\n        }\r\n    }\r\n\r\n    // Always keep last point\r\n    result.push(points[points.length - 1]);\r\n\r\n    return result;\r\n}\r\n","/**\n * @module boolean/sliverGuard\n *\n * Fan-sliver detection and interior Steiner lattice generation (KNOWN_ISSUES #21).\n *\n * Splitting a giant triangle (e.g. a 50 m extruded-prism wall face) against a\n * dense intersection chain makes fan triangulation emit dozens of needle\n * slivers per face — fans from the face's far corners to every chain point.\n * They tile the face correctly but per-triangle classification of needles is\n * coin-flip and they survive into results as visually obvious \"spurs\".\n *\n * The guard: when the parent triangle's edge length is extreme relative to the\n * chain point spacing, skip the corner fans and re-triangulate with a CDT\n * constrained by the chain, seeded with a hexagonal lattice of INTERIOR\n * Steiner points to bound the aspect ratio of the output.\n *\n * The lattice points are strictly interior — they never touch the parent\n * triangle's edges, so edge conformity with neighbouring (possibly uncrossed)\n * triangles is preserved: no T-junctions are introduced.\n */\n\nimport { dist3 } from \"../util/math.js\";\n\n// A fan triangle's aspect ratio is roughly (corner-to-chain distance) /\n// (chain point spacing). Guard only on genuinely extreme mismatches so\n// ordinary splits keep the cheaper, segment-exact fan path.\nvar SLIVER_MIN_CHAIN_POINTS = 16;\nvar SLIVER_ASPECT_THRESHOLD = 32;\n\n// Bound the lattice so a pathological face cannot generate unbounded points.\nvar MAX_LATTICE_POINTS = 1024;\nvar MIN_LATTICE_DIVISIONS = 24; // spacing never smaller than maxEdge / 24\n\n/**\n * Average spacing between consecutive chain points (3D arc length / count).\n */\nfunction chainSpacing(chain) {\n\tvar len = 0;\n\tfor (var i = 0; i < chain.length - 1; i++) {\n\t\tlen += dist3(chain[i], chain[i + 1]);\n\t}\n\treturn chain.length > 1 ? len / (chain.length - 1) : 0;\n}\n\nfunction maxEdgeLength(tri) {\n\tvar a = dist3(tri.v0, tri.v1);\n\tvar b = dist3(tri.v1, tri.v2);\n\tvar c = dist3(tri.v2, tri.v0);\n\treturn Math.max(a, Math.max(b, c));\n}\n\n/**\n * Decide whether fan triangulation of this triangle against this chain\n * would shatter into needle slivers.\n *\n * @param {{ v0, v1, v2 }} tri - Parent triangle\n * @param {Array<{x,y,z}>} chain - Ordered chain points crossing the triangle\n * @returns {boolean}\n */\nexport function needsSliverGuard(tri, chain) {\n\tif (!chain || chain.length < SLIVER_MIN_CHAIN_POINTS) return false;\n\tvar spacing = chainSpacing(chain);\n\tif (spacing < 1e-12) return false;\n\treturn maxEdgeLength(tri) / spacing >= SLIVER_ASPECT_THRESHOLD;\n}\n\n/**\n * Generate a hexagonal lattice of interior Steiner points for a triangle,\n * sized to the chain spacing, avoiding the chain itself and the triangle\n * edges. Points are plain {x,y,z} objects on the triangle's plane.\n *\n * @param {{ v0, v1, v2 }} tri - Parent triangle\n * @param {Array<{x,y,z}>} chain - Ordered chain points crossing the triangle\n * @returns {Array<{x,y,z}>} Interior lattice points (possibly empty)\n */\nexport function interiorLatticePoints(tri, chain) {\n\t// ── Local 2D frame on the triangle plane ──\n\tvar e1x = tri.v1.x - tri.v0.x, e1y = tri.v1.y - tri.v0.y, e1z = tri.v1.z - tri.v0.z;\n\tvar e2x = tri.v2.x - tri.v0.x, e2y = tri.v2.y - tri.v0.y, e2z = tri.v2.z - tri.v0.z;\n\tvar e1Len = Math.sqrt(e1x * e1x + e1y * e1y + e1z * e1z);\n\tif (e1Len < 1e-12) return [];\n\tvar lux = e1x / e1Len, luy = e1y / e1Len, luz = e1z / e1Len;\n\tvar lnx = e1y * e2z - e1z * e2y;\n\tvar lny = e1z * e2x - e1x * e2z;\n\tvar lnz = e1x * e2y - e1y * e2x;\n\tvar lnLen = Math.sqrt(lnx * lnx + lny * lny + lnz * lnz);\n\tif (lnLen < 1e-12) return [];\n\tvar lvx = lny * luz - lnz * luy;\n\tvar lvy = lnz * lux - lnx * luz;\n\tvar lvz = lnx * luy - lny * lux;\n\tvar lvLen = Math.sqrt(lvx * lvx + lvy * lvy + lvz * lvz);\n\tif (lvLen < 1e-12) return [];\n\tlvx /= lvLen; lvy /= lvLen; lvz /= lvLen;\n\n\tfunction toLocal(p) {\n\t\tvar dx = p.x - tri.v0.x, dy = p.y - tri.v0.y, dz = p.z - tri.v0.z;\n\t\treturn [dx * lux + dy * luy + dz * luz, dx * lvx + dy * lvy + dz * lvz];\n\t}\n\n\tvar a2 = toLocal(tri.v0), b2 = toLocal(tri.v1), c2 = toLocal(tri.v2);\n\n\t// ── Spacing: a few chain spacings, but never finer than maxEdge / 24 ──\n\tvar maxEdge = maxEdgeLength(tri);\n\tvar spacing = chainSpacing(chain);\n\tvar s = Math.max(spacing * 4, maxEdge / MIN_LATTICE_DIVISIONS);\n\n\t// Cap total points: triangle area / hex cell area, scale s up if needed\n\tvar triArea = lnLen * 0.5;\n\tvar expected = triArea / (s * s * 0.866);\n\tif (expected > MAX_LATTICE_POINTS) {\n\t\ts = s * Math.sqrt(expected / MAX_LATTICE_POINTS);\n\t}\n\n\t// ── 2D distance from point to segment ──\n\tfunction segDist2(px, py, ax, ay, bx, by) {\n\t\tvar abx = bx - ax, aby = by - ay;\n\t\tvar lenSq = abx * abx + aby * aby;\n\t\tvar t = lenSq < 1e-20 ? 0 : ((px - ax) * abx + (py - ay) * aby) / lenSq;\n\t\tif (t < 0) t = 0; else if (t > 1) t = 1;\n\t\tvar qx = ax + t * abx - px, qy = ay + t * aby - py;\n\t\treturn Math.sqrt(qx * qx + qy * qy);\n\t}\n\n\t// ── Bucket chain points for fast proximity rejection ──\n\tvar chainLocal = [];\n\tvar buckets = {};\n\tvar cell = s;\n\tfor (var ci = 0; ci < chain.length; ci++) {\n\t\tvar cl = toLocal(chain[ci]);\n\t\tchainLocal.push(cl);\n\t\tvar bk = Math.floor(cl[0] / cell) + \"|\" + Math.floor(cl[1] / cell);\n\t\t(buckets[bk] = buckets[bk] || []).push(ci);\n\t}\n\n\t// Clearance from the chain scales with CHAIN spacing, not lattice spacing:\n\t// a wide corridor would leave the chain's 0.5 m points bridging to far\n\t// lattice points (wedge-apex mini-fans where the chain crosses a parent\n\t// edge). Letting the lattice approach the chain fills the corridor with\n\t// small, well-shaped triangles instead.\n\tvar chainClear = Math.max(spacing * 1.2, s * 0.15);\n\tvar chainClearSq = chainClear * chainClear;\n\tfunction nearChain(px, py) {\n\t\tvar bx = Math.floor(px / cell), by = Math.floor(py / cell);\n\t\tfor (var ox = -1; ox <= 1; ox++) {\n\t\t\tfor (var oy = -1; oy <= 1; oy++) {\n\t\t\t\tvar list = buckets[(bx + ox) + \"|\" + (by + oy)];\n\t\t\t\tif (!list) continue;\n\t\t\t\tfor (var li = 0; li < list.length; li++) {\n\t\t\t\t\tvar cp = chainLocal[list[li]];\n\t\t\t\t\tvar ddx = cp[0] - px, ddy = cp[1] - py;\n\t\t\t\t\tif (ddx * ddx + ddy * ddy < chainClearSq) return true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// ── Barycentric inside test (strict, with edge clearance via segDist2) ──\n\tvar baryD = (b2[1] - c2[1]) * (a2[0] - c2[0]) + (c2[0] - b2[0]) * (a2[1] - c2[1]);\n\tif (Math.abs(baryD) < 1e-12) return [];\n\tfunction isInside(pu, pv) {\n\t\tvar u = ((b2[1] - c2[1]) * (pu - c2[0]) + (c2[0] - b2[0]) * (pv - c2[1])) / baryD;\n\t\tvar v = ((c2[1] - a2[1]) * (pu - c2[0]) + (a2[0] - c2[0]) * (pv - c2[1])) / baryD;\n\t\tvar w = 1 - u - v;\n\t\treturn u > 0 && v > 0 && w > 0;\n\t}\n\n\tvar edgeClear = s * 0.45;\n\n\tvar points = [];\n\tfunction accept(pu, pv) {\n\t\tif (!isInside(pu, pv)) return false;\n\t\tif (segDist2(pu, pv, a2[0], a2[1], b2[0], b2[1]) < edgeClear) return false;\n\t\tif (segDist2(pu, pv, b2[0], b2[1], c2[0], c2[1]) < edgeClear) return false;\n\t\tif (segDist2(pu, pv, c2[0], c2[1], a2[0], a2[1]) < edgeClear) return false;\n\t\tpoints.push({\n\t\t\tx: tri.v0.x + pu * lux + pv * lvx,\n\t\t\ty: tri.v0.y + pu * luy + pv * lvy,\n\t\t\tz: tri.v0.z + pu * luz + pv * lvz\n\t\t});\n\t\treturn true;\n\t}\n\n\t// ── Graded offset rows along the chain ──\n\t// Rows parallel to the chain at doubling distances (1.5h, 3h, 6h, ... up\n\t// to the lattice spacing), subsampled so along-row spacing ≈ row distance.\n\t// These fill the corridor beside the chain AND the thin wedges where the\n\t// chain crosses a parent edge — a fixed lattice can't land points there,\n\t// which would leave chain points fanning to a single far vertex.\n\tfor (var d = spacing * 1.5; d < s; d *= 2) {\n\t\tvar stride = Math.max(1, Math.round(d / spacing));\n\t\tfor (var oi = 0; oi < chainLocal.length - 1; oi += stride) {\n\t\t\tvar c0 = chainLocal[oi];\n\t\t\tvar c1 = chainLocal[Math.min(oi + stride, chainLocal.length - 1)];\n\t\t\tvar tx = c1[0] - c0[0], ty = c1[1] - c0[1];\n\t\t\tvar tl = Math.sqrt(tx * tx + ty * ty);\n\t\t\tif (tl < 1e-12) continue;\n\t\t\tvar onx = -ty / tl, ony = tx / tl;\n\t\t\taccept(c0[0] + onx * d, c0[1] + ony * d);\n\t\t\taccept(c0[0] - onx * d, c0[1] - ony * d);\n\t\t\tif (points.length >= MAX_LATTICE_POINTS) return points;\n\t\t}\n\t}\n\n\t// ── Hexagonal lattice over the triangle's 2D bounding box ──\n\tvar minU = Math.min(a2[0], b2[0], c2[0]);\n\tvar maxU = Math.max(a2[0], b2[0], c2[0]);\n\tvar minV = Math.min(a2[1], b2[1], c2[1]);\n\tvar maxV = Math.max(a2[1], b2[1], c2[1]);\n\n\tvar rowH = s * 0.866;\n\tvar row = 0;\n\tfor (var v = minV + rowH * 0.5; v < maxV; v += rowH, row++) {\n\t\tvar offset = (row % 2) ? s * 0.5 : 0;\n\t\tfor (var u = minU + offset + s * 0.5; u < maxU; u += s) {\n\t\t\tif (nearChain(u, v)) continue;\n\t\t\taccept(u, v);\n\t\t\tif (points.length >= MAX_LATTICE_POINTS) return points;\n\t\t}\n\t}\n\n\treturn points;\n}\n","/**\r\n * @module boolean/splitTriangles\r\n *\r\n * Re-triangulation of crossed triangles. Primary method is fan triangulation:\r\n * chain intersection segments into an ordered polyline, then fan from each\r\n * original vertex to sequential chain points. Falls back to CDT when the\r\n * geometry is too complex (multiple polylines, same-edge entry/exit).\r\n */\r\n\r\nimport Delaunator from \"delaunator\";\r\nimport Constrainautor from \"@kninnug/constrainautor\";\r\nimport { chainSegments } from \"../intersect/chainSegments.js\";\r\nimport { distSq3 } from \"../util/math.js\";\r\nimport { needsSliverGuard, interiorLatticePoints } from \"./sliverGuard.js\";\r\n\r\n/**\r\n * Re-triangulate a crossed triangle by inserting all intersection segment\r\n * endpoints as Steiner points and running Constrained Delaunay Triangulation.\r\n *\r\n * This handles the case where a large triangle is crossed by many small\r\n * triangles on the other surface, producing many short segments whose\r\n * endpoints lie interior to the large triangle.\r\n *\r\n * Steps:\r\n *   1. Build local 2D frame + barycentric validator\r\n *   2. Collect unique segment endpoints, validate inside triangle\r\n *   3. Run Delaunator, constrain segment edges (NOT boundary edges)\r\n *   4. Filter sub-triangles by barycentric centroid test + area check\r\n *\r\n * @param {{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }} tri - Parent triangle\r\n * @param {Array<{ p0: {x,y,z}, p1: {x,y,z} }>} segments - Intersection segments crossing this triangle\r\n * @param {Array<{x,y,z}>} [extraPoints] - Additional interior Steiner points (sliver guard lattice)\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Sub-triangles, or [tri] on failure\r\n */\r\nexport function retriangulateWithSteinerPoints(tri, segments, extraPoints) {\r\n\tif (!segments || segments.length === 0) return [tri];\r\n\r\n\t// -- Step 1: Build local 2D coordinate frame on triangle plane --\r\n\r\n\tvar e1x = tri.v1.x - tri.v0.x;\r\n\tvar e1y = tri.v1.y - tri.v0.y;\r\n\tvar e1z = tri.v1.z - tri.v0.z;\r\n\tvar e2x = tri.v2.x - tri.v0.x;\r\n\tvar e2y = tri.v2.y - tri.v0.y;\r\n\tvar e2z = tri.v2.z - tri.v0.z;\r\n\r\n\tvar e1Len = Math.sqrt(e1x * e1x + e1y * e1y + e1z * e1z);\r\n\tif (e1Len < 1e-12) return [tri];\r\n\tvar lux = e1x / e1Len, luy = e1y / e1Len, luz = e1z / e1Len;\r\n\r\n\tvar lnx = e1y * e2z - e1z * e2y;\r\n\tvar lny = e1z * e2x - e1x * e2z;\r\n\tvar lnz = e1x * e2y - e1y * e2x;\r\n\tvar lnLen = Math.sqrt(lnx * lnx + lny * lny + lnz * lnz);\r\n\tif (lnLen < 1e-12) return [tri];\r\n\r\n\tvar lvx = lny * luz - lnz * luy;\r\n\tvar lvy = lnz * lux - lnx * luz;\r\n\tvar lvz = lnx * luy - lny * lux;\r\n\tvar lvLen = Math.sqrt(lvx * lvx + lvy * lvy + lvz * lvz);\r\n\tif (lvLen < 1e-12) return [tri];\r\n\tlvx /= lvLen; lvy /= lvLen; lvz /= lvLen;\r\n\r\n\tvar lox = tri.v0.x, loy = tri.v0.y, loz = tri.v0.z;\r\n\r\n\t/**\r\n\t * Project a 3D point to local 2D.\r\n\t * @param {{ x: number, y: number, z: number }} p\r\n\t * @returns {number[]} [u, v]\r\n\t */\r\n\tfunction toLocal(p) {\r\n\t\tvar dx = p.x - lox, dy = p.y - loy, dz = p.z - loz;\r\n\t\treturn [dx * lux + dy * luy + dz * luz, dx * lvx + dy * lvy + dz * lvz];\r\n\t}\r\n\r\n\t// Triangle vertices in local 2D\r\n\tvar l0 = toLocal(tri.v0); // (0, 0) by construction\r\n\tvar l1 = toLocal(tri.v1);\r\n\tvar l2 = toLocal(tri.v2);\r\n\r\n\t// Barycentric coordinate calculator in local 2D\r\n\tvar baryD = (l1[1] - l2[1]) * (l0[0] - l2[0]) + (l2[0] - l1[0]) * (l0[1] - l2[1]);\r\n\tif (Math.abs(baryD) < 1e-12) return [tri]; // degenerate\r\n\r\n\t/**\r\n\t * Compute barycentric coordinates [u, v, w]; inside when all >= 0.\r\n\t * @param {number} pu\r\n\t * @param {number} pv\r\n\t * @returns {number[]}\r\n\t */\r\n\tfunction baryCoords(pu, pv) {\r\n\t\tvar u = ((l1[1] - l2[1]) * (pu - l2[0]) + (l2[0] - l1[0]) * (pv - l2[1])) / baryD;\r\n\t\tvar v = ((l2[1] - l0[1]) * (pu - l2[0]) + (l0[0] - l2[0]) * (pv - l2[1])) / baryD;\r\n\t\treturn [u, v, 1 - u - v];\r\n\t}\r\n\r\n\t// Triangle area in local 2D (for sub-triangle area filtering)\r\n\tvar triArea2D = Math.abs(baryD) * 0.5;\r\n\tvar MIN_AREA_RATIO = 1e-8; // discard sub-tris smaller than this fraction of original\r\n\r\n\t// -- Step 2: Collect unique segment endpoints, validate inside triangle --\r\n\r\n\tvar PREC = 6;\r\n\tvar seen = {};\r\n\tvar v0Key = tri.v0.x.toFixed(PREC) + \",\" + tri.v0.y.toFixed(PREC) + \",\" + tri.v0.z.toFixed(PREC);\r\n\tvar v1Key = tri.v1.x.toFixed(PREC) + \",\" + tri.v1.y.toFixed(PREC) + \",\" + tri.v1.z.toFixed(PREC);\r\n\tvar v2Key = tri.v2.x.toFixed(PREC) + \",\" + tri.v2.y.toFixed(PREC) + \",\" + tri.v2.z.toFixed(PREC);\r\n\tseen[v0Key] = true;\r\n\tseen[v1Key] = true;\r\n\tseen[v2Key] = true;\r\n\r\n\tvar BARY_TOL = -1e-4; // allow points slightly outside due to float precision\r\n\tvar validSteiner = [];\r\n\r\n\t// Track segment endpoint keys -> index in pts array for constraining segment edges\r\n\tvar keyToIndex = {};\r\n\tkeyToIndex[v0Key] = 0;\r\n\tkeyToIndex[v1Key] = 1;\r\n\tkeyToIndex[v2Key] = 2;\r\n\r\n\tfor (var s = 0; s < segments.length; s++) {\r\n\t\tvar seg = segments[s];\r\n\t\tvar endpts = [seg.p0, seg.p1];\r\n\t\tfor (var e = 0; e < 2; e++) {\r\n\t\t\tvar p = endpts[e];\r\n\t\t\tvar key = p.x.toFixed(PREC) + \",\" + p.y.toFixed(PREC) + \",\" + p.z.toFixed(PREC);\r\n\t\t\tif (seen[key]) continue;\r\n\t\t\tseen[key] = true;\r\n\r\n\t\t\t// Validate: must be inside the triangle (barycentric check)\r\n\t\t\tvar lp = toLocal(p);\r\n\t\t\tvar bc = baryCoords(lp[0], lp[1]);\r\n\t\t\tif (bc[0] < BARY_TOL || bc[1] < BARY_TOL || bc[2] < BARY_TOL) {\r\n\t\t\t\tcontinue; // outside triangle -- discard\r\n\t\t\t}\r\n\r\n\t\t\tvalidSteiner.push({ x: p.x, y: p.y, z: p.z, key: key });\r\n\t\t}\r\n\t}\r\n\r\n\tif (validSteiner.length === 0 && (!extraPoints || extraPoints.length === 0)) return [tri];\r\n\r\n\t// Build pts array: indices 0,1,2 = original vertices, 3+ = Steiner\r\n\tvar pts = [\r\n\t\t{ x: tri.v0.x, y: tri.v0.y, z: tri.v0.z },\r\n\t\t{ x: tri.v1.x, y: tri.v1.y, z: tri.v1.z },\r\n\t\t{ x: tri.v2.x, y: tri.v2.y, z: tri.v2.z }\r\n\t];\r\n\tfor (var vi = 0; vi < validSteiner.length; vi++) {\r\n\t\tkeyToIndex[validSteiner[vi].key] = pts.length;\r\n\t\tpts.push(validSteiner[vi]);\r\n\t}\r\n\r\n\t// Sliver guard lattice points: strictly interior, never constrained\r\n\tif (extraPoints) {\r\n\t\tfor (var xp = 0; xp < extraPoints.length; xp++) {\r\n\t\t\tpts.push(extraPoints[xp]);\r\n\t\t}\r\n\t}\r\n\r\n\t// -- Step 3: Project all to local 2D, run Delaunator --\r\n\r\n\tvar n = pts.length;\r\n\tvar coords = new Float64Array(n * 2);\r\n\tfor (var j = 0; j < n; j++) {\r\n\t\tvar lj = toLocal(pts[j]);\r\n\t\tcoords[j * 2] = lj[0];\r\n\t\tcoords[j * 2 + 1] = lj[1];\r\n\t}\r\n\r\n\tvar del;\r\n\ttry {\r\n\t\tdel = new Delaunator(coords);\r\n\t} catch (de) {\r\n\t\treturn [tri];\r\n\t}\r\n\r\n\t// Constrain segment edges (NOT boundary edges -- those are the convex hull already).\r\n\t// Boundary constraints are harmful when Steiner points lie on boundary edges,\r\n\t// because constrainOne(0,1) would skip intermediate points on edge 0->1.\r\n\ttry {\r\n\t\tvar con = new Constrainautor(del);\r\n\t\tfor (var cs = 0; cs < segments.length; cs++) {\r\n\t\t\tvar cSeg = segments[cs];\r\n\t\t\tvar k0 = cSeg.p0.x.toFixed(PREC) + \",\" + cSeg.p0.y.toFixed(PREC) + \",\" + cSeg.p0.z.toFixed(PREC);\r\n\t\t\tvar k1 = cSeg.p1.x.toFixed(PREC) + \",\" + cSeg.p1.y.toFixed(PREC) + \",\" + cSeg.p1.z.toFixed(PREC);\r\n\t\t\tvar idx0 = keyToIndex[k0];\r\n\t\t\tvar idx1 = keyToIndex[k1];\r\n\t\t\tif (idx0 !== undefined && idx1 !== undefined && idx0 !== idx1) {\r\n\t\t\t\ttry { con.constrainOne(idx0, idx1); } catch (ce2) { /* skip */ }\r\n\t\t\t}\r\n\t\t}\r\n\t} catch (ce) {\r\n\t\t// Constrainautor init failed -- unconstrained Delaunator is still usable\r\n\t}\r\n\r\n\t// -- Step 4: Filter sub-triangles by barycentric centroid + area check --\r\n\r\n\tvar result = [];\r\n\tvar delTris = del.triangles;\r\n\tfor (var k = 0; k < delTris.length; k += 3) {\r\n\t\tvar a = delTris[k], b = delTris[k + 1], c = delTris[k + 2];\r\n\r\n\t\t// Centroid in local 2D\r\n\t\tvar cx = (coords[a * 2] + coords[b * 2] + coords[c * 2]) / 3;\r\n\t\tvar cy = (coords[a * 2 + 1] + coords[b * 2 + 1] + coords[c * 2 + 1]) / 3;\r\n\r\n\t\t// Barycentric centroid test (more tolerant than ray-cast PIP for boundary)\r\n\t\tvar cBary = baryCoords(cx, cy);\r\n\t\tif (cBary[0] < -1e-6 || cBary[1] < -1e-6 || cBary[2] < -1e-6) continue;\r\n\r\n\t\t// Area check -- discard degenerate sub-triangles\r\n\t\tvar au = coords[a * 2], av = coords[a * 2 + 1];\r\n\t\tvar bu = coords[b * 2], bv = coords[b * 2 + 1];\r\n\t\tvar cu = coords[c * 2], cv = coords[c * 2 + 1];\r\n\t\tvar subArea = Math.abs((bu - au) * (cv - av) - (cu - au) * (bv - av)) * 0.5;\r\n\t\tif (subArea < triArea2D * MIN_AREA_RATIO) continue;\r\n\r\n\t\tresult.push({\r\n\t\t\tv0: pts[a],\r\n\t\t\tv1: pts[b],\r\n\t\t\tv2: pts[c]\r\n\t\t});\r\n\t}\r\n\r\n\tif (result.length === 0) {\r\n\t\treturn [tri];\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Fan-based re-triangulation of a crossed triangle.\r\n *\r\n * Chains the intersection segments into an ordered polyline, identifies\r\n * which original vertices are on which side of the polyline, then creates\r\n * fan triangles from each original vertex to sequential chain points.\r\n * Every sub-triangle has at least 1 original vertex — no all-Steiner\r\n * \"pocket\" triangles.\r\n *\r\n * Two sub-triangle types:\r\n *   - Fan triangle:       1 original vert + 2 sequential chain points\r\n *   - Transition triangle: 2 original verts + 1 chain point (where fans meet)\r\n *\r\n * Falls back to CDT ({@link retriangulateWithSteinerPoints}) for:\r\n *   - Multiple disconnected polylines\r\n *   - Entry/exit on the same edge\r\n *   - Chaining failure\r\n *\r\n * @param {{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }} tri - Parent triangle\r\n * @param {Array<{ p0: {x,y,z}, p1: {x,y,z} }>} segments - Intersection segments\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Sub-triangles\r\n */\r\nexport function fanTriangulate(tri, segments) {\r\n\tif (!segments || segments.length === 0) return [tri];\r\n\r\n\t// Step 1) Estimate avg segment length for chaining threshold\r\n\tvar avgLen = 0;\r\n\tfor (var si = 0; si < segments.length; si++) {\r\n\t\tvar dx = segments[si].p1.x - segments[si].p0.x;\r\n\t\tvar dy = segments[si].p1.y - segments[si].p0.y;\r\n\t\tvar dz = segments[si].p1.z - segments[si].p0.z;\r\n\t\tavgLen += Math.sqrt(dx * dx + dy * dy + dz * dz);\r\n\t}\r\n\tavgLen /= segments.length;\r\n\tvar chains = chainSegments(segments, avgLen * 0.1);\r\n\r\n\t// Step 2) Fallback to CDT for multi-chain or empty-chain cases\r\n\tif (chains.length !== 1 || chains[0].length < 2) {\r\n\t\treturn retriangulateWithSteinerPoints(tri, segments);\r\n\t}\r\n\tvar chain = chains[0];\r\n\r\n\t// Sliver guard (KNOWN_ISSUES #21): a giant triangle against a dense chain\r\n\t// would fan into needle slivers from the far corners to every chain point.\r\n\t// Re-triangulate with chain-constrained CDT + interior Steiner lattice\r\n\t// instead — bounded aspect ratio, no T-junctions (lattice is interior-only).\r\n\tif (needsSliverGuard(tri, chain)) {\r\n\t\tvar latticePts = interiorLatticePoints(tri, chain);\r\n\t\tif (latticePts.length > 0) {\r\n\t\t\treturn retriangulateWithSteinerPoints(tri, segments, latticePts);\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 3) Build local 2D frame for barycentric classification\r\n\tvar verts = [tri.v0, tri.v1, tri.v2];\r\n\tvar e1x = tri.v1.x - tri.v0.x, e1y = tri.v1.y - tri.v0.y, e1z = tri.v1.z - tri.v0.z;\r\n\tvar e2x = tri.v2.x - tri.v0.x, e2y = tri.v2.y - tri.v0.y, e2z = tri.v2.z - tri.v0.z;\r\n\tvar e1Len = Math.sqrt(e1x * e1x + e1y * e1y + e1z * e1z);\r\n\tif (e1Len < 1e-12) return retriangulateWithSteinerPoints(tri, segments);\r\n\tvar lux = e1x / e1Len, luy = e1y / e1Len, luz = e1z / e1Len;\r\n\tvar lnx = e1y * e2z - e1z * e2y, lny = e1z * e2x - e1x * e2z, lnz = e1x * e2y - e1y * e2x;\r\n\tvar lnLen = Math.sqrt(lnx * lnx + lny * lny + lnz * lnz);\r\n\tif (lnLen < 1e-12) return retriangulateWithSteinerPoints(tri, segments);\r\n\tvar lvx = lny * luz - lnz * luy, lvy = lnz * lux - lnx * luz, lvz = lnx * luy - lny * lux;\r\n\tvar lvLen = Math.sqrt(lvx * lvx + lvy * lvy + lvz * lvz);\r\n\tif (lvLen < 1e-12) return retriangulateWithSteinerPoints(tri, segments);\r\n\tlvx /= lvLen; lvy /= lvLen; lvz /= lvLen;\r\n\r\n\tfunction toLocal(p) {\r\n\t\tvar ddx = p.x - tri.v0.x, ddy = p.y - tri.v0.y, ddz = p.z - tri.v0.z;\r\n\t\treturn [ddx * lux + ddy * luy + ddz * luz, ddx * lvx + ddy * lvy + ddz * lvz];\r\n\t}\r\n\tvar l0 = toLocal(tri.v0), l1 = toLocal(tri.v1), l2 = toLocal(tri.v2);\r\n\tvar baryD = (l1[1] - l2[1]) * (l0[0] - l2[0]) + (l2[0] - l1[0]) * (l0[1] - l2[1]);\r\n\tif (Math.abs(baryD) < 1e-12) return retriangulateWithSteinerPoints(tri, segments);\r\n\r\n\tfunction baryCoords(pu, pv) {\r\n\t\tvar u = ((l1[1] - l2[1]) * (pu - l2[0]) + (l2[0] - l1[0]) * (pv - l2[1])) / baryD;\r\n\t\tvar v = ((l2[1] - l0[1]) * (pu - l2[0]) + (l0[0] - l2[0]) * (pv - l2[1])) / baryD;\r\n\t\treturn [u, v, 1 - u - v];\r\n\t}\r\n\r\n\t// Step 4) Identify which edges the entry (chain[0]) and exit (chain[N]) lie on\r\n\t// bc[0] near 0 → on edge v1-v2 (opposite v0)\r\n\t// bc[1] near 0 → on edge v0-v2 (opposite v1)\r\n\t// bc[2] near 0 → on edge v0-v1 (opposite v2)\r\n\tvar EDGE_TOL = 0.02;\r\n\tvar VERTEX_TOL = 0.02;\r\n\tvar entryLocal = toLocal(chain[0]);\r\n\tvar exitLocal = toLocal(chain[chain.length - 1]);\r\n\tvar entryBary = baryCoords(entryLocal[0], entryLocal[1]);\r\n\tvar exitBary = baryCoords(exitLocal[0], exitLocal[1]);\r\n\r\n\t// Step 4a) If a chain endpoint is AT an original vertex (two bary coords near 0),\r\n\t// the intersection passes through a vertex — fall back to CDT for this complex case.\r\n\tfunction isAtVertex(bc) {\r\n\t\tvar nearZero = 0;\r\n\t\tfor (var bci = 0; bci < 3; bci++) { if (bc[bci] < VERTEX_TOL) nearZero++; }\r\n\t\treturn nearZero >= 2;\r\n\t}\r\n\tif (isAtVertex(entryBary) || isAtVertex(exitBary)) {\r\n\t\treturn retriangulateWithSteinerPoints(tri, segments);\r\n\t}\r\n\r\n\t// Determine which edge each boundary point lies on (returns the vertex index opposite that edge)\r\n\tfunction edgeOf(bc) {\r\n\t\tif (bc[0] < EDGE_TOL && bc[0] <= bc[1] && bc[0] <= bc[2]) return 0; // on v1-v2\r\n\t\tif (bc[1] < EDGE_TOL && bc[1] <= bc[0] && bc[1] <= bc[2]) return 1; // on v0-v2\r\n\t\tif (bc[2] < EDGE_TOL && bc[2] <= bc[0] && bc[2] <= bc[1]) return 2; // on v0-v1\r\n\t\treturn -1;\r\n\t}\r\n\tvar entryOpp = edgeOf(entryBary);\r\n\tvar exitOpp = edgeOf(exitBary);\r\n\r\n\t// Fallback if boundary points are interior or on same edge\r\n\tif (entryOpp < 0 || exitOpp < 0 || entryOpp === exitOpp) {\r\n\t\treturn retriangulateWithSteinerPoints(tri, segments);\r\n\t}\r\n\r\n\t// Step 5) Find corner vertex: the vertex NOT opposite either entry or exit edge.\r\n\t// entryOpp is opposite the entry edge, exitOpp is opposite the exit edge.\r\n\t// The corner is the remaining vertex — it's shared by both crossed edges.\r\n\tvar cornerIdx = -1;\r\n\tfor (var ci = 0; ci < 3; ci++) {\r\n\t\tif (ci !== entryOpp && ci !== exitOpp) { cornerIdx = ci; break; }\r\n\t}\r\n\tif (cornerIdx < 0) return retriangulateWithSteinerPoints(tri, segments);\r\n\r\n\tvar corner = verts[cornerIdx];\r\n\t// vA is on the entry edge (the vertex opposite the exit edge, that is not the corner)\r\n\tvar vA = verts[exitOpp];\r\n\t// vB is on the exit edge (the vertex opposite the entry edge, that is not the corner)\r\n\tvar vB = verts[entryOpp];\r\n\r\n\t// Step 6) Compute original triangle normal for winding consistency\r\n\tvar origNx = e1y * e2z - e1z * e2y;\r\n\tvar origNy = e1z * e2x - e1x * e2z;\r\n\tvar origNz = e1x * e2y - e1y * e2x;\r\n\r\n\t// Helper: create a sub-triangle with winding consistent with original\r\n\tfunction makeTri(a, b, c) {\r\n\t\tvar se1x = b.x - a.x, se1y = b.y - a.y, se1z = b.z - a.z;\r\n\t\tvar se2x = c.x - a.x, se2y = c.y - a.y, se2z = c.z - a.z;\r\n\t\tvar snx = se1y * se2z - se1z * se2y;\r\n\t\tvar sny = se1z * se2x - se1x * se2z;\r\n\t\tvar snz = se1x * se2y - se1y * se2x;\r\n\t\tvar dot = snx * origNx + sny * origNy + snz * origNz;\r\n\t\tif (dot < 0) {\r\n\t\t\treturn { v0: a, v1: c, v2: b };\r\n\t\t}\r\n\t\treturn { v0: a, v1: b, v2: c };\r\n\t}\r\n\r\n\t// Step 7) Build fan triangles\r\n\tvar result = [];\r\n\r\n\t// Step 7a) Isolated side: fan from corner to all consecutive chain point pairs\r\n\tfor (var fi = 0; fi < chain.length - 1; fi++) {\r\n\t\tresult.push(makeTri(corner, chain[fi], chain[fi + 1]));\r\n\t}\r\n\r\n\t// Step 7b) Paired side: find split index K by nearest-neighbour.\r\n\t// K is where the chain transitions from closer-to-vA to closer-to-vB.\r\n\tvar splitK = 0;\r\n\tvar bestRatio = Infinity;\r\n\tfor (var ki = 0; ki < chain.length; ki++) {\r\n\t\tvar dA = distSq3(vA, chain[ki]);\r\n\t\tvar dB = distSq3(vB, chain[ki]);\r\n\t\tvar ratio = (dA < 1e-20 || dB < 1e-20) ? Infinity : (dA < dB ? dA / dB : dB / dA);\r\n\t\tvar diff = Math.abs(1.0 - ratio);\r\n\t\tif (diff < bestRatio) {\r\n\t\t\tbestRatio = diff;\r\n\t\t\tsplitK = ki;\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 7c) Clamp splitK so both fans get at least one triangle\r\n\tif (splitK < 1) splitK = 1;\r\n\tif (splitK > chain.length - 2) splitK = chain.length - 2;\r\n\r\n\t// Step 7d) Fan from vA: P0 through PK\r\n\tfor (var ai = 0; ai < splitK; ai++) {\r\n\t\tresult.push(makeTri(vA, chain[ai], chain[ai + 1]));\r\n\t}\r\n\r\n\t// Step 7e) Transition triangle: vA - chain[splitK] - vB\r\n\tresult.push(makeTri(vA, chain[splitK], vB));\r\n\r\n\t// Step 7f) Fan from vB: PK through PN\r\n\tfor (var bi = splitK; bi < chain.length - 1; bi++) {\r\n\t\tresult.push(makeTri(vB, chain[bi], chain[bi + 1]));\r\n\t}\r\n\r\n\t// Step 9) Validate: check no degenerate (near-zero area) sub-triangles\r\n\tvar triArea = lnLen * 0.5;\r\n\tvar MIN_AREA = triArea * 1e-8;\r\n\tvar validated = [];\r\n\tfor (var vli = 0; vli < result.length; vli++) {\r\n\t\tvar t = result[vli];\r\n\t\tvar te1x = t.v1.x - t.v0.x, te1y = t.v1.y - t.v0.y, te1z = t.v1.z - t.v0.z;\r\n\t\tvar te2x = t.v2.x - t.v0.x, te2y = t.v2.y - t.v0.y, te2z = t.v2.z - t.v0.z;\r\n\t\tvar tcx = te1y * te2z - te1z * te2y;\r\n\t\tvar tcy = te1z * te2x - te1x * te2z;\r\n\t\tvar tcz = te1x * te2y - te1y * te2x;\r\n\t\tvar subArea = Math.sqrt(tcx * tcx + tcy * tcy + tcz * tcz) * 0.5;\r\n\t\tif (subArea > MIN_AREA) {\r\n\t\t\tvalidated.push(t);\r\n\t\t}\r\n\t}\r\n\r\n\tif (validated.length === 0) {\r\n\t\treturn retriangulateWithSteinerPoints(tri, segments);\r\n\t}\r\n\r\n\treturn validated;\r\n}\r\n","/**\r\n * @module boolean/classifyTriangles\r\n *\r\n * Triangle classification for boolean operations. Uses multi-axis ray casting\r\n * (majority vote across Z, X, Y) to determine whether triangles lie inside or\r\n * outside the other mesh, with flood-fill propagation for efficient bulk\r\n * classification and CDT-based splitting for straddling (crossed) triangles.\r\n *\r\n * Sub-triangles from CDT splits are classified via vertex adjacency (inheriting\r\n * from non-crossed neighbors) with ray-cast fallback only when no adjacent\r\n * non-crossed triangle exists.\r\n */\r\n\r\nimport { queryGrid } from \"../intersect/spatialGrid.js\";\r\nimport { queryGridOnAxes } from \"../intersect/spatialGrid.js\";\r\nimport { fanTriangulate } from \"./splitTriangles.js\";\r\n\r\n// Deterministic jitter offsets for avoiding edge/coplanar ray hits.\r\n// 3 offsets per axis, each pair (da, db) shifts the ray's 2D position slightly.\r\n// Different offsets per axis to avoid correlated edge hits on axis-aligned geometry.\r\nvar JITTERS = {\r\n\tz: [\r\n\t\t{ da: 0.0000537, db: 0.0000241 },\r\n\t\t{ da: -0.0000319, db: 0.0000673 },\r\n\t\t{ da: 0.0000157, db: -0.0000489 }\r\n\t],\r\n\tx: [\r\n\t\t{ da: 0.0000443, db: -0.0000317 },\r\n\t\t{ da: -0.0000261, db: 0.0000559 },\r\n\t\t{ da: 0.0000189, db: 0.0000371 }\r\n\t],\r\n\ty: [\r\n\t\t{ da: -0.0000397, db: 0.0000283 },\r\n\t\t{ da: 0.0000521, db: -0.0000447 },\r\n\t\t{ da: -0.0000173, db: 0.0000613 }\r\n\t]\r\n};\r\n\r\n/**\r\n * Cast a single ray on one axis and count positive-direction hits.\r\n *\r\n * @param {number} pa - First projection coordinate (possibly jittered)\r\n * @param {number} pb - Second projection coordinate (possibly jittered)\r\n * @param {number} pr - Ray-axis coordinate (not jittered)\r\n * @param {Array} candidates - Triangle indices from spatial grid query\r\n * @param {Array} otherTris - Other surface triangles\r\n * @param {string} axis - 'z', 'x', or 'y'\r\n * @returns {number} Count of positive-direction hits\r\n */\r\nfunction castRayOnAxis(pa, pb, pr, candidates, otherTris, axis) {\r\n\tvar countPos = 0;\r\n\r\n\tfor (var c = 0; c < candidates.length; c++) {\r\n\t\tvar tri = otherTris[candidates[c]];\r\n\r\n\t\t// Extract the 2 projection coords + ray coord for each vertex\r\n\t\tvar a0, b0, r0, a1, b1, r1, a2, b2, r2;\r\n\t\tif (axis === \"z\") {\r\n\t\t\ta0 = tri.v0.x; b0 = tri.v0.y; r0 = tri.v0.z;\r\n\t\t\ta1 = tri.v1.x; b1 = tri.v1.y; r1 = tri.v1.z;\r\n\t\t\ta2 = tri.v2.x; b2 = tri.v2.y; r2 = tri.v2.z;\r\n\t\t} else if (axis === \"x\") {\r\n\t\t\ta0 = tri.v0.y; b0 = tri.v0.z; r0 = tri.v0.x;\r\n\t\t\ta1 = tri.v1.y; b1 = tri.v1.z; r1 = tri.v1.x;\r\n\t\t\ta2 = tri.v2.y; b2 = tri.v2.z; r2 = tri.v2.x;\r\n\t\t} else {\r\n\t\t\ta0 = tri.v0.x; b0 = tri.v0.z; r0 = tri.v0.y;\r\n\t\t\ta1 = tri.v1.x; b1 = tri.v1.z; r1 = tri.v1.y;\r\n\t\t\ta2 = tri.v2.x; b2 = tri.v2.z; r2 = tri.v2.y;\r\n\t\t}\r\n\r\n\t\t// Barycentric test in (a, b) projection\r\n\t\tvar d = (b1 - b2) * (a0 - a2) + (a2 - a1) * (b0 - b2);\r\n\t\tif (Math.abs(d) < 1e-12) continue; // degenerate projection\r\n\r\n\t\tvar u = ((b1 - b2) * (pa - a2) + (a2 - a1) * (pb - b2)) / d;\r\n\t\tvar v = ((b2 - b0) * (pa - a2) + (a0 - a2) * (pb - b2)) / d;\r\n\t\tvar w = 1 - u - v;\r\n\r\n\t\tif (u < -1e-10 || v < -1e-10 || w < -1e-10) continue; // outside triangle\r\n\r\n\t\t// Interpolate ray-axis coord at (pa, pb) on the triangle's plane\r\n\t\tvar rHit = u * r0 + v * r1 + w * r2;\r\n\r\n\t\tif (rHit > pr) countPos++;\r\n\t}\r\n\r\n\treturn countPos;\r\n}\r\n\r\n/**\r\n * Classify a point on a single axis by casting 3 jittered rays and taking\r\n * the majority vote.  Each ray is offset slightly in the 2D projection\r\n * plane to avoid hitting triangle edges/vertices exactly.\r\n *\r\n * Projects point and triangles onto a 2D plane for the given axis:\r\n *   - axis='z': project to XY, ray along +Z\r\n *   - axis='x': project to YZ, ray along +X\r\n *   - axis='y': project to XZ, ray along +Y\r\n *\r\n * @param {{ x: number, y: number, z: number }} point - Point to classify\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} otherTris - Other surface triangles\r\n * @param {Object} grid - Spatial grid for the relevant 2D projection\r\n * @param {number} cellSize - Grid cell size\r\n * @param {string} axis - 'z', 'x', or 'y'\r\n * @returns {number} 0 = no hits (no vote), 1 = inside (odd majority), 2 = outside (even majority)\r\n */\r\nfunction classifyPointOnAxis(point, otherTris, grid, cellSize, axis) {\r\n\t// Base 2D coordinates and ray-axis coordinate\r\n\tvar basePa, basePb, pr;\r\n\tif (axis === \"z\") {\r\n\t\tbasePa = point.x; basePb = point.y; pr = point.z;\r\n\t} else if (axis === \"x\") {\r\n\t\tbasePa = point.y; basePb = point.z; pr = point.x;\r\n\t} else {\r\n\t\tbasePa = point.x; basePb = point.z; pr = point.y;\r\n\t}\r\n\r\n\tvar jitters = JITTERS[axis];\r\n\tvar insideVotes = 0;\r\n\tvar hadHits = 0;\r\n\r\n\tfor (var j = 0; j < 3; j++) {\r\n\t\tvar pa = basePa + jitters[j].da;\r\n\t\tvar pb = basePb + jitters[j].db;\r\n\r\n\t\t// Query spatial grid at jittered position\r\n\t\tvar candidates;\r\n\t\tif (axis === \"z\") {\r\n\t\t\tcandidates = queryGrid(grid, { minX: pa, maxX: pa, minY: pb, maxY: pb }, cellSize);\r\n\t\t} else {\r\n\t\t\tcandidates = queryGridOnAxes(grid, pa, pb, cellSize);\r\n\t\t}\r\n\r\n\t\tvar count = castRayOnAxis(pa, pb, pr, candidates, otherTris, axis);\r\n\r\n\t\tif (count > 0) hadHits++;\r\n\t\tif (count % 2 === 1) insideVotes++;\r\n\t}\r\n\r\n\t// 3-state return: 0 = no hits (no vote), 1 = inside, 2 = outside\r\n\tif (hadHits === 0) return 0;         // no ray hit anything → no vote\r\n\treturn insideVotes >= 2 ? 1 : 2;     // majority inside → 1, majority outside → 2\r\n}\r\n\r\n/**\r\n * Multi-axis point classification using majority vote across all 3 axes.\r\n *\r\n * Casts +Z, +X, and +Y rays (3 jittered rays per axis) and classifies by majority vote:\r\n *   - Each axis returns 0 (no hits/no vote), 1 (inside), or 2 (outside)\r\n *   - If 2+ axes vote \"inside\" -> inside (handles any wall angle)\r\n *   - If only 1 axis votes \"inside\" and 1+ vote \"outside\" -> outside (prevents false positives)\r\n *   - If only 1 axis has hits at all -> trust that single result\r\n *   - If 0 axes have hits -> outside\r\n *\r\n * This handles any geometry angle (0-90 deg walls) without thresholds.\r\n *\r\n * @param {{ x: number, y: number, z: number }} point - Point to classify\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} otherTris - Other surface triangles\r\n * @param {Object} grids - { xy: {grid, cellSize}, yz: {grid, cellSize}, xz: {grid, cellSize} }\r\n * @returns {number} 1 = inside, -1 = outside\r\n */\r\nexport function classifyPointMultiAxis(point, otherTris, grids) {\r\n\tvar zCount = classifyPointOnAxis(point, otherTris, grids.xy.grid, grids.xy.cellSize, \"z\");\r\n\tvar xCount = classifyPointOnAxis(point, otherTris, grids.yz.grid, grids.yz.cellSize, \"x\");\r\n\tvar yCount = classifyPointOnAxis(point, otherTris, grids.xz.grid, grids.xz.cellSize, \"y\");\r\n\r\n\t// 0 = no hits (no vote), 1 = inside, 2 = outside\r\n\tvar insideVotes = 0;\r\n\tvar outsideVotes = 0;\r\n\r\n\tif (zCount === 1) insideVotes++;\r\n\telse if (zCount === 2) outsideVotes++;\r\n\r\n\tif (xCount === 1) insideVotes++;\r\n\telse if (xCount === 2) outsideVotes++;\r\n\r\n\tif (yCount === 1) insideVotes++;\r\n\telse if (yCount === 2) outsideVotes++;\r\n\r\n\t// Majority vote: 2+ inside -> inside; otherwise outside\r\n\tif (insideVotes >= 2) return 1;\r\n\tif (outsideVotes >= 1) return -1;\r\n\r\n\t// Only one axis had hits and it voted inside — trust it\r\n\tif (insideVotes === 1) return 1;\r\n\r\n\t// No axes had any hits -> outside\r\n\treturn -1;\r\n}\r\n\r\n/**\r\n * Classify triangles using flood fill from intersection boundary.\r\n *\r\n * Non-crossed triangles are partitioned into connected components via shared\r\n * edges (excluding edges shared with crossed triangles). Each component is\r\n * classified by a single seed triangle using multi-axis ray casting against\r\n * the other surface, then that classification is propagated to the entire\r\n * component.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup to classify\r\n * @param {Object} crossedMap - Map of triIndex -> [taggedSegments]\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} otherTris - Other surface triangles\r\n * @param {Object} otherGrids - { xy: {grid, cellSize}, yz: {grid, cellSize}, xz: {grid, cellSize} }\r\n * @returns {Int8Array} Classification per triangle: 1=inside, -1=outside\r\n */\r\nexport function classifyByFloodFill(tris, crossedMap, otherTris, otherGrids) {\r\n\tvar n = tris.length;\r\n\tvar result = new Int8Array(n);\r\n\r\n\t// Build edge adjacency for non-crossed triangles only\r\n\tvar PREC = 6;\r\n\tfunction vk(v) {\r\n\t\treturn v.x.toFixed(PREC) + \",\" + v.y.toFixed(PREC) + \",\" + v.z.toFixed(PREC);\r\n\t}\r\n\r\n\tvar edgeToTris = {};\r\n\tfor (var i = 0; i < n; i++) {\r\n\t\tif (crossedMap[i]) continue; // skip crossed triangles\r\n\t\tvar tri = tris[i];\r\n\t\tvar k0 = vk(tri.v0), k1 = vk(tri.v1), k2 = vk(tri.v2);\r\n\t\tvar edges = [\r\n\t\t\tk0 < k1 ? k0 + \"|\" + k1 : k1 + \"|\" + k0,\r\n\t\t\tk1 < k2 ? k1 + \"|\" + k2 : k2 + \"|\" + k1,\r\n\t\t\tk2 < k0 ? k2 + \"|\" + k0 : k0 + \"|\" + k2\r\n\t\t];\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tif (!edgeToTris[edges[e]]) edgeToTris[edges[e]] = [];\r\n\t\t\tedgeToTris[edges[e]].push(i);\r\n\t\t}\r\n\t}\r\n\r\n\t// Build neighbor list from shared edges (non-crossed only)\r\n\tvar neighbors = new Array(n);\r\n\tfor (var ni = 0; ni < n; ni++) neighbors[ni] = [];\r\n\r\n\tfor (var ek in edgeToTris) {\r\n\t\tvar triList = edgeToTris[ek];\r\n\t\tfor (var a = 0; a < triList.length; a++) {\r\n\t\t\tfor (var b = a + 1; b < triList.length; b++) {\r\n\t\t\t\tneighbors[triList[a]].push(triList[b]);\r\n\t\t\t\tneighbors[triList[b]].push(triList[a]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// BFS flood fill -- find connected components, classify each by one seed\r\n\tvar visited = new Uint8Array(n);\r\n\r\n\tfor (var seed = 0; seed < n; seed++) {\r\n\t\tif (visited[seed] || crossedMap[seed]) continue;\r\n\r\n\t\t// Classify seed via multi-axis ray casting against other surface\r\n\t\tvar seedTri = tris[seed];\r\n\t\tvar cx = (seedTri.v0.x + seedTri.v1.x + seedTri.v2.x) / 3;\r\n\t\tvar cy = (seedTri.v0.y + seedTri.v1.y + seedTri.v2.y) / 3;\r\n\t\tvar cz = (seedTri.v0.z + seedTri.v1.z + seedTri.v2.z) / 3;\r\n\t\tvar seedClass = classifyPointMultiAxis(\r\n\t\t\t{ x: cx, y: cy, z: cz },\r\n\t\t\totherTris, otherGrids\r\n\t\t);\r\n\r\n\t\t// BFS: propagate seed classification to entire component\r\n\t\tvar queue = [seed];\r\n\t\tvisited[seed] = 1;\r\n\t\tresult[seed] = seedClass;\r\n\r\n\t\tvar head = 0;\r\n\t\twhile (head < queue.length) {\r\n\t\t\tvar curr = queue[head++];\r\n\t\t\tvar nbrs = neighbors[curr];\r\n\t\t\tfor (var ni2 = 0; ni2 < nbrs.length; ni2++) {\r\n\t\t\t\tvar nb = nbrs[ni2];\r\n\t\t\t\tif (!visited[nb]) {\r\n\t\t\t\t\tvisited[nb] = 1;\r\n\t\t\t\t\tresult[nb] = seedClass;\r\n\t\t\t\t\tqueue.push(nb);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Separate triangles into inside/outside groups.\r\n *\r\n * Non-crossed triangles go directly by their pre-computed classification.\r\n * Crossed (straddling) triangles are re-triangulated with Steiner points\r\n * at intersection segment endpoints, then each sub-triangle is classified\r\n * via vertex adjacency (inheriting classification from adjacent non-crossed\r\n * triangles) with ray-cast fallback.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @param {Int8Array} classifications - Per-triangle classification (1=inside, -1=outside)\r\n * @param {Object} crossedMap - Map of triIndex -> [taggedSegments]\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} otherTris - Other surface triangles\r\n * @param {Object} otherGrids - { xy: {grid, cellSize}, yz: {grid, cellSize}, xz: {grid, cellSize} }\r\n * @param {string} otherIdxKey - Key to get other mesh's triangle index from tagged segments (\"idxA\" or \"idxB\")\r\n * @returns {{ inside: Array, outside: Array }} Classified triangle groups\r\n */\r\nexport function splitStraddlingAndClassify(tris, classifications, crossedMap, otherTris, otherGrids, otherIdxKey) {\r\n\tvar inside = [];\r\n\tvar outside = [];\r\n\r\n\tvar PREC = 6;\r\n\tfunction vk(v) {\r\n\t\treturn v.x.toFixed(PREC) + \",\" + v.y.toFixed(PREC) + \",\" + v.z.toFixed(PREC);\r\n\t}\r\n\r\n\t// Step A: Build vertex-key -> classification map from NON-CROSSED triangles.\r\n\t// Each original mesh vertex that belongs to at least one non-crossed triangle\r\n\t// gets the flood-fill classification of that triangle.\r\n\tvar vertexClassMap = {};\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tif (crossedMap[i]) continue; // skip crossed triangles\r\n\t\tvar cls = classifications[i];\r\n\t\tvar tri = tris[i];\r\n\t\tvar verts = [tri.v0, tri.v1, tri.v2];\r\n\t\tfor (var vi = 0; vi < 3; vi++) {\r\n\t\t\tvar key = vk(verts[vi]);\r\n\t\t\tif (vertexClassMap[key] === undefined) {\r\n\t\t\t\tvertexClassMap[key] = cls;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Step B: Collect all Steiner point keys (intersection segment endpoints).\r\n\t// These vertices lie ON the intersection line — skip them for classification.\r\n\tvar steinerKeys = {};\r\n\tfor (var ci in crossedMap) {\r\n\t\tvar segs = crossedMap[ci];\r\n\t\tfor (var s = 0; s < segs.length; s++) {\r\n\t\t\tsteinerKeys[vk(segs[s].p0)] = true;\r\n\t\t\tsteinerKeys[vk(segs[s].p1)] = true;\r\n\t\t}\r\n\t}\r\n\r\n\t// Step C: Collect ALL intersection segments into a flat list for half-space lookups.\r\n\t// Also build edge-key maps for border-segment classification in Step D0.\r\n\tvar allSegments = [];\r\n\tvar segEdgeSet = {};\r\n\tvar segEdgeToSeg = {};\r\n\tfor (var asi in crossedMap) {\r\n\t\tvar aSegs = crossedMap[asi];\r\n\t\tfor (var asj = 0; asj < aSegs.length; asj++) {\r\n\t\t\tallSegments.push(aSegs[asj]);\r\n\t\t\tvar esk0 = vk(aSegs[asj].p0);\r\n\t\t\tvar esk1 = vk(aSegs[asj].p1);\r\n\t\t\tvar esKey = esk0 < esk1 ? esk0 + \"|\" + esk1 : esk1 + \"|\" + esk0;\r\n\t\t\tsegEdgeSet[esKey] = true;\r\n\t\t\tsegEdgeToSeg[esKey] = aSegs[asj];\r\n\t\t}\r\n\t}\r\n\r\n\t// Step C1) Calibrate the normal sign convention.\r\n\t// The host triangle's face normal determines which side is \"inside\". We sample\r\n\t// a few intersection segments, offset a point along the other mesh's face normal,\r\n\t// and ray-cast to verify the convention. Majority vote sets normalSign.\r\n\tvar normalSign = 1;\r\n\tif (allSegments.length > 0) {\r\n\t\tvar votePlus = 0, voteMinus = 0;\r\n\t\tvar samplesToCheck = Math.min(allSegments.length, 12);\r\n\t\tvar sampleStep = Math.max(1, Math.floor(allSegments.length / samplesToCheck));\r\n\t\tfor (var calIdx = 0; calIdx < allSegments.length && (votePlus + voteMinus) < samplesToCheck; calIdx += sampleStep) {\r\n\t\t\tvar calSeg = allSegments[calIdx];\r\n\t\t\tvar calTri = otherTris[calSeg[otherIdxKey]];\r\n\t\t\tif (!calTri) continue;\r\n\t\t\t// Step C1a) Compute the other mesh's triangle normal\r\n\t\t\tvar ce1x = calTri.v1.x - calTri.v0.x, ce1y = calTri.v1.y - calTri.v0.y, ce1z = calTri.v1.z - calTri.v0.z;\r\n\t\t\tvar ce2x = calTri.v2.x - calTri.v0.x, ce2y = calTri.v2.y - calTri.v0.y, ce2z = calTri.v2.z - calTri.v0.z;\r\n\t\t\tvar cnx = ce1y * ce2z - ce1z * ce2y;\r\n\t\t\tvar cny = ce1z * ce2x - ce1x * ce2z;\r\n\t\t\tvar cnz = ce1x * ce2y - ce1y * ce2x;\r\n\t\t\tvar cnLen = Math.sqrt(cnx * cnx + cny * cny + cnz * cnz);\r\n\t\t\tif (cnLen < 1e-12) continue;\r\n\t\t\tcnx /= cnLen; cny /= cnLen; cnz /= cnLen;\r\n\t\t\t// Step C1b) Pick the dominant normal axis for a reliable single-axis ray-cast.\r\n\t\t\tvar absNx = Math.abs(cnx), absNy = Math.abs(cny), absNz = Math.abs(cnz);\r\n\t\t\tvar calAxis, calGrid, calCellSize;\r\n\t\t\tif (absNz >= absNx && absNz >= absNy) {\r\n\t\t\t\tcalAxis = \"z\";\r\n\t\t\t\tcalGrid = otherGrids.xy.grid;\r\n\t\t\t\tcalCellSize = otherGrids.xy.cellSize;\r\n\t\t\t} else if (absNx >= absNy) {\r\n\t\t\t\tcalAxis = \"x\";\r\n\t\t\t\tcalGrid = otherGrids.yz.grid;\r\n\t\t\t\tcalCellSize = otherGrids.yz.cellSize;\r\n\t\t\t} else {\r\n\t\t\t\tcalAxis = \"y\";\r\n\t\t\t\tcalGrid = otherGrids.xz.grid;\r\n\t\t\t\tcalCellSize = otherGrids.xz.cellSize;\r\n\t\t\t}\r\n\t\t\t// Step C1c) Segment midpoint, offset in the +normal direction\r\n\t\t\tvar calMx = (calSeg.p0.x + calSeg.p1.x) / 2;\r\n\t\t\tvar calMy = (calSeg.p0.y + calSeg.p1.y) / 2;\r\n\t\t\tvar calMz = (calSeg.p0.z + calSeg.p1.z) / 2;\r\n\t\t\tvar offset = 0.05;\r\n\t\t\tvar calPt = { x: calMx + cnx * offset, y: calMy + cny * offset, z: calMz + cnz * offset };\r\n\t\t\t// Step C1d) Single-axis ray-cast: 0 = no hits, 1 = inside, 2 = outside\r\n\t\t\tvar calResult = classifyPointOnAxis(calPt, otherTris, calGrid, calCellSize, calAxis);\r\n\t\t\tif (calResult === 0) continue;\r\n\t\t\tif (calResult === 1) voteMinus++;\r\n\t\t\telse votePlus++;\r\n\t\t}\r\n\t\tif (voteMinus > votePlus) normalSign = -1;\r\n\t}\r\n\tfunction halfSpaceTest(point, tolerance) {\r\n\t\tif (allSegments.length === 0) return 0;\r\n\t\tvar tol = (tolerance !== undefined) ? tolerance : 1e-10;\r\n\t\tvar bestSeg = allSegments[0];\r\n\t\tvar bestDist = Infinity;\r\n\t\tfor (var hi = 0; hi < allSegments.length; hi++) {\r\n\t\t\tvar hmx = (allSegments[hi].p0.x + allSegments[hi].p1.x) / 2;\r\n\t\t\tvar hmy = (allSegments[hi].p0.y + allSegments[hi].p1.y) / 2;\r\n\t\t\tvar hmz = (allSegments[hi].p0.z + allSegments[hi].p1.z) / 2;\r\n\t\t\tvar hdx = point.x - hmx, hdy = point.y - hmy, hdz = point.z - hmz;\r\n\t\t\tvar hd2 = hdx * hdx + hdy * hdy + hdz * hdz;\r\n\t\t\tif (hd2 < bestDist) { bestDist = hd2; bestSeg = allSegments[hi]; }\r\n\t\t}\r\n\t\tvar hOtherTri = otherTris[bestSeg[otherIdxKey]];\r\n\t\tif (!hOtherTri) return 0;\r\n\t\tvar he1x = hOtherTri.v1.x - hOtherTri.v0.x;\r\n\t\tvar he1y = hOtherTri.v1.y - hOtherTri.v0.y;\r\n\t\tvar he1z = hOtherTri.v1.z - hOtherTri.v0.z;\r\n\t\tvar he2x = hOtherTri.v2.x - hOtherTri.v0.x;\r\n\t\tvar he2y = hOtherTri.v2.y - hOtherTri.v0.y;\r\n\t\tvar he2z = hOtherTri.v2.z - hOtherTri.v0.z;\r\n\t\tvar hnx = he1y * he2z - he1z * he2y;\r\n\t\tvar hny = he1z * he2x - he1x * he2z;\r\n\t\tvar hnz = he1x * he2y - he1y * he2x;\r\n\t\tvar hrpx = hOtherTri.v0.x, hrpy = hOtherTri.v0.y, hrpz = hOtherTri.v0.z;\r\n\t\tvar hDotPt = (point.x - hrpx) * hnx + (point.y - hrpy) * hny + (point.z - hrpz) * hnz;\r\n\t\tif (Math.abs(hDotPt) > tol) {\r\n\t\t\treturn (hDotPt * normalSign < 0) ? 1 : -1;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t// Step C2) Helper: classify a point against a SPECIFIC segment's other-mesh plane.\r\n\t// Used by Step D0 (border-segment) and Step E3 (constraint enforcement).\r\n\tfunction segHalfSpace(point, seg) {\r\n\t\tvar sOtherTri = otherTris[seg[otherIdxKey]];\r\n\t\tif (!sOtherTri) return 0;\r\n\t\tvar se1x = sOtherTri.v1.x - sOtherTri.v0.x;\r\n\t\tvar se1y = sOtherTri.v1.y - sOtherTri.v0.y;\r\n\t\tvar se1z = sOtherTri.v1.z - sOtherTri.v0.z;\r\n\t\tvar se2x = sOtherTri.v2.x - sOtherTri.v0.x;\r\n\t\tvar se2y = sOtherTri.v2.y - sOtherTri.v0.y;\r\n\t\tvar se2z = sOtherTri.v2.z - sOtherTri.v0.z;\r\n\t\tvar snx = se1y * se2z - se1z * se2y;\r\n\t\tvar sny = se1z * se2x - se1x * se2z;\r\n\t\tvar snz = se1x * se2y - se1y * se2x;\r\n\t\tvar sdot = (point.x - sOtherTri.v0.x) * snx + (point.y - sOtherTri.v0.y) * sny + (point.z - sOtherTri.v0.z) * snz;\r\n\t\tif (Math.abs(sdot) > 1e-10) {\r\n\t\t\treturn (sdot * normalSign < 0) ? 1 : -1;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t// Step D: Process each triangle.\r\n\t// Each entry tracks: tri, cls, confident (half-space = true, flood-fill = false)\r\n\tvar allSubs = [];\r\n\r\n\tfor (var ti = 0; ti < tris.length; ti++) {\r\n\t\tif (!crossedMap[ti]) {\r\n\t\t\t// Non-crossed: try half-space test first, fall back to flood-fill\r\n\t\t\tvar ncTri = tris[ti];\r\n\t\t\tvar ncCx = (ncTri.v0.x + ncTri.v1.x + ncTri.v2.x) / 3;\r\n\t\t\tvar ncCy = (ncTri.v0.y + ncTri.v1.y + ncTri.v2.y) / 3;\r\n\t\t\tvar ncCz = (ncTri.v0.z + ncTri.v1.z + ncTri.v2.z) / 3;\r\n\t\t\tvar ncHalf = halfSpaceTest({ x: ncCx, y: ncCy, z: ncCz });\r\n\t\t\tif (ncHalf !== 0) {\r\n\t\t\t\tallSubs.push({ tri: ncTri, cls: ncHalf, confident: true });\r\n\t\t\t} else {\r\n\t\t\t\tallSubs.push({ tri: ncTri, cls: classifications[ti], confident: false });\r\n\t\t\t}\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\t// Crossed triangle: re-triangulate with intersection segment endpoints\r\n\t\tvar segments = crossedMap[ti];\r\n\t\tvar current = fanTriangulate(tris[ti], segments);\r\n\r\n\t\tfor (var j = 0; j < current.length; j++) {\r\n\t\t\tvar sub = current[j];\r\n\t\t\tvar subVerts = [sub.v0, sub.v1, sub.v2];\r\n\r\n\t\t\t// Step D0) Border-segment classification: if this sub-tri shares an\r\n\t\t\t// edge with an intersection segment, use THAT segment's plane directly.\r\n\t\t\t// This prevents the \"nearest segment\" from picking a wrong crossing.\r\n\t\t\tvar foundClass = 0;\r\n\t\t\tvar confident = false;\r\n\t\t\tvar subK0 = vk(sub.v0), subK1 = vk(sub.v1), subK2 = vk(sub.v2);\r\n\t\t\tvar subEKeys = [\r\n\t\t\t\tsubK0 < subK1 ? subK0 + \"|\" + subK1 : subK1 + \"|\" + subK0,\r\n\t\t\t\tsubK1 < subK2 ? subK1 + \"|\" + subK2 : subK2 + \"|\" + subK1,\r\n\t\t\t\tsubK2 < subK0 ? subK2 + \"|\" + subK0 : subK0 + \"|\" + subK2\r\n\t\t\t];\r\n\t\t\tvar borderSeg = null;\r\n\t\t\tfor (var bse = 0; bse < 3; bse++) {\r\n\t\t\t\tif (segEdgeToSeg[subEKeys[bse]]) { borderSeg = segEdgeToSeg[subEKeys[bse]]; break; }\r\n\t\t\t}\r\n\t\t\tif (borderSeg) {\r\n\t\t\t\tvar bCx = (sub.v0.x + sub.v1.x + sub.v2.x) / 3;\r\n\t\t\t\tvar bCy = (sub.v0.y + sub.v1.y + sub.v2.y) / 3;\r\n\t\t\t\tvar bCz = (sub.v0.z + sub.v1.z + sub.v2.z) / 3;\r\n\t\t\t\tfoundClass = segHalfSpace({ x: bCx, y: bCy, z: bCz }, borderSeg);\r\n\t\t\t\tif (foundClass !== 0) confident = true;\r\n\t\t\t}\r\n\r\n\t\t\t// Step D1) Find a \"free\" vertex (not a Steiner point on the intersection line)\r\n\t\t\tvar freeVert = null;\r\n\t\t\tif (foundClass === 0) {\r\n\t\t\t\tfor (var sv = 0; sv < 3; sv++) {\r\n\t\t\t\t\tvar svKey = vk(subVerts[sv]);\r\n\t\t\t\t\tif (steinerKeys[svKey]) continue;\r\n\t\t\t\t\tif (!freeVert) freeVert = subVerts[sv];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Step D2) Half-space test from the free vertex (nearest segment fallback)\r\n\t\t\tif (foundClass === 0 && freeVert) {\r\n\t\t\t\tfoundClass = halfSpaceTest(freeVert);\r\n\t\t\t\tif (foundClass !== 0) confident = true;\r\n\t\t\t}\r\n\r\n\t\t\t// Step D2b) All-Steiner pocket triangle: half-space from centroid.\r\n\t\t\tif (foundClass === 0 && !freeVert && !borderSeg) {\r\n\t\t\t\tvar pcx = (sub.v0.x + sub.v1.x + sub.v2.x) / 3;\r\n\t\t\t\tvar pcy = (sub.v0.y + sub.v1.y + sub.v2.y) / 3;\r\n\t\t\t\tvar pcz = (sub.v0.z + sub.v1.z + sub.v2.z) / 3;\r\n\t\t\t\tfoundClass = halfSpaceTest({ x: pcx, y: pcy, z: pcz }, 1e-15);\r\n\t\t\t\tif (foundClass !== 0) confident = true;\r\n\t\t\t}\r\n\r\n\t\t\t// Step D3) Fallback: vertex adjacency\r\n\t\t\tif (foundClass === 0 && freeVert) {\r\n\t\t\t\tvar fvKey = vk(freeVert);\r\n\t\t\t\tvar adjClass = vertexClassMap[fvKey];\r\n\t\t\t\tif (adjClass !== undefined) {\r\n\t\t\t\t\tfoundClass = adjClass;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Step D4) Fallback: ray-cast from the free vertex\r\n\t\t\tif (foundClass === 0 && freeVert) {\r\n\t\t\t\tfoundClass = classifyPointMultiAxis(freeVert, otherTris, otherGrids);\r\n\t\t\t}\r\n\r\n\t\t\tif (foundClass !== 0 && freeVert) {\r\n\t\t\t\tvertexClassMap[vk(freeVert)] = foundClass;\r\n\t\t\t}\r\n\r\n\t\t\tallSubs.push({ tri: sub, cls: foundClass, confident: confident });\r\n\t\t}\r\n\t}\r\n\r\n\t// Step E: Build edge adjacency across ALL entries (non-crossed + sub-triangles).\r\n\t// This lets confident half-space classifications propagate to adjacent entries.\r\n\t// IMPORTANT: exclude intersection segment edges — triangles sharing an\r\n\t// intersection edge are on opposite sides and must NOT propagate across it.\r\n\t// (segEdgeSet and segEdgeToSeg were already built in Step C.)\r\n\tvar subEdgeMap = {};\r\n\tfor (var si = 0; si < allSubs.length; si++) {\r\n\t\tvar st = allSubs[si].tri;\r\n\t\tvar sk0 = vk(st.v0), sk1 = vk(st.v1), sk2 = vk(st.v2);\r\n\t\tvar subEdges = [\r\n\t\t\tsk0 < sk1 ? sk0 + \"|\" + sk1 : sk1 + \"|\" + sk0,\r\n\t\t\tsk1 < sk2 ? sk1 + \"|\" + sk2 : sk2 + \"|\" + sk1,\r\n\t\t\tsk2 < sk0 ? sk2 + \"|\" + sk0 : sk0 + \"|\" + sk2\r\n\t\t];\r\n\t\tfor (var se = 0; se < 3; se++) {\r\n\t\t\tif (!subEdgeMap[subEdges[se]]) subEdgeMap[subEdges[se]] = [];\r\n\t\t\tsubEdgeMap[subEdges[se]].push(si);\r\n\t\t}\r\n\t}\r\n\r\n\tvar subNeighbors = new Array(allSubs.length);\r\n\tfor (var sn = 0; sn < allSubs.length; sn++) subNeighbors[sn] = [];\r\n\tfor (var sek in subEdgeMap) {\r\n\t\t// Step E0) Skip intersection segment edges — they separate inside/outside\r\n\t\tif (segEdgeSet[sek]) continue;\r\n\t\tvar seList = subEdgeMap[sek];\r\n\t\tfor (var sa = 0; sa < seList.length; sa++) {\r\n\t\t\tfor (var sb = sa + 1; sb < seList.length; sb++) {\r\n\t\t\t\tsubNeighbors[seList[sa]].push(seList[sb]);\r\n\t\t\t\tsubNeighbors[seList[sb]].push(seList[sa]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Step E1) Propagate confident (half-space) classifications to adjacent\r\n\t// non-confident entries.\r\n\tvar maxPasses = 10;\r\n\tfor (var pass = 0; pass < maxPasses; pass++) {\r\n\t\tvar changed = false;\r\n\t\tfor (var ui = 0; ui < allSubs.length; ui++) {\r\n\t\t\tif (allSubs[ui].confident) continue;\r\n\t\t\tvar nbrs2 = subNeighbors[ui];\r\n\t\t\tfor (var ni3 = 0; ni3 < nbrs2.length; ni3++) {\r\n\t\t\t\tvar neighbor = allSubs[nbrs2[ni3]];\r\n\t\t\t\tif (neighbor.confident && neighbor.cls !== 0) {\r\n\t\t\t\t\tif (allSubs[ui].cls !== neighbor.cls) {\r\n\t\t\t\t\t\tallSubs[ui].cls = neighbor.cls;\r\n\t\t\t\t\t\tchanged = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tallSubs[ui].confident = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!changed) break;\r\n\t}\r\n\r\n\t// Step E2) Fill any remaining cls===0 entries via adjacency then ray-cast\r\n\tfor (var pass2 = 0; pass2 < 5; pass2++) {\r\n\t\tvar changed2 = false;\r\n\t\tfor (var ui2 = 0; ui2 < allSubs.length; ui2++) {\r\n\t\t\tif (allSubs[ui2].cls !== 0) continue;\r\n\t\t\tvar nbrs3 = subNeighbors[ui2];\r\n\t\t\tfor (var ni4 = 0; ni4 < nbrs3.length; ni4++) {\r\n\t\t\t\tif (allSubs[nbrs3[ni4]].cls !== 0) {\r\n\t\t\t\t\tallSubs[ui2].cls = allSubs[nbrs3[ni4]].cls;\r\n\t\t\t\t\tchanged2 = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!changed2) break;\r\n\t}\r\n\tfor (var li = 0; li < allSubs.length; li++) {\r\n\t\tif (allSubs[li].cls !== 0) continue;\r\n\t\tvar lt = allSubs[li].tri;\r\n\t\tvar lcx = (lt.v0.x + lt.v1.x + lt.v2.x) / 3;\r\n\t\tvar lcy = (lt.v0.y + lt.v1.y + lt.v2.y) / 3;\r\n\t\tvar lcz = (lt.v0.z + lt.v1.z + lt.v2.z) / 3;\r\n\t\tallSubs[li].cls = classifyPointMultiAxis(\r\n\t\t\t{ x: lcx, y: lcy, z: lcz }, otherTris, otherGrids\r\n\t\t);\r\n\t}\r\n\r\n\t// Step E3) Constraint enforcement: sub-triangles sharing a segment edge\r\n\t// MUST have opposite classifications (one inside, one outside).\r\n\t// If both have the same cls, reclassify them using the specific segment's plane.\r\n\tfor (var cek in segEdgeToSeg) {\r\n\t\tvar ceSubs = subEdgeMap[cek];\r\n\t\tif (!ceSubs || ceSubs.length < 2) continue;\r\n\t\tvar ceHasIn = false, ceHasOut = false;\r\n\t\tfor (var cei = 0; cei < ceSubs.length; cei++) {\r\n\t\t\tif (allSubs[ceSubs[cei]].cls === 1) ceHasIn = true;\r\n\t\t\tif (allSubs[ceSubs[cei]].cls === -1) ceHasOut = true;\r\n\t\t}\r\n\t\tif (ceHasIn && ceHasOut) continue;\r\n\t\t// Constraint violated -- reclassify from the segment's plane\r\n\t\tvar ceSeg = segEdgeToSeg[cek];\r\n\t\tfor (var cej = 0; cej < ceSubs.length; cej++) {\r\n\t\t\tvar ceT = allSubs[ceSubs[cej]].tri;\r\n\t\t\tvar ceCx = (ceT.v0.x + ceT.v1.x + ceT.v2.x) / 3;\r\n\t\t\tvar ceCy = (ceT.v0.y + ceT.v1.y + ceT.v2.y) / 3;\r\n\t\t\tvar ceCz = (ceT.v0.z + ceT.v1.z + ceT.v2.z) / 3;\r\n\t\t\tvar ceCls = segHalfSpace({ x: ceCx, y: ceCy, z: ceCz }, ceSeg);\r\n\t\t\tif (ceCls !== 0) {\r\n\t\t\t\tallSubs[ceSubs[cej]].cls = ceCls;\r\n\t\t\t\tallSubs[ceSubs[cej]].confident = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Step F: Bin into inside / outside\r\n\tfor (var fi = 0; fi < allSubs.length; fi++) {\r\n\t\tif (allSubs[fi].cls === 1) {\r\n\t\t\tinside.push(allSubs[fi].tri);\r\n\t\t} else {\r\n\t\t\toutside.push(allSubs[fi].tri);\r\n\t\t}\r\n\t}\r\n\r\n\treturn { inside: inside, outside: outside };\r\n}\r\n","/**\r\n * @module repair/deduplicateVertices\r\n *\r\n * Merge seam vertices at exact (within tolerance) positions.\r\n * CSG / split operations create duplicate vertices along seam edges —\r\n * this merges them so downstream edge-counting sees shared edges correctly.\r\n */\r\n\r\n/**\r\n * Deduplicate triangle-soup vertices that share exact (within tolerance) positions.\r\n *\r\n * @param {Array} tris - Triangle soup [{v0,v1,v2}, ...]\r\n * @param {number} [tolerance=1e-4] - Distance tolerance\r\n * @returns {Array} Triangle soup with deduplicated vertices\r\n */\r\nexport function deduplicateSeamVertices(tris, tolerance) {\r\n\tif (!tris || tris.length === 0) return tris;\r\n\tif (tolerance === undefined) tolerance = 1e-4;\r\n\r\n\tvar cellSize = tolerance * 3;\r\n\tvar invCell = 1.0 / cellSize;\r\n\tvar grid = {};\r\n\tvar canonical = [];\r\n\tvar mergedCount = 0;\r\n\r\n\tfunction getKey(x, y, z) {\r\n\t\tvar cx = Math.floor(x * invCell);\r\n\t\tvar cy = Math.floor(y * invCell);\r\n\t\tvar cz = Math.floor(z * invCell);\r\n\t\treturn cx + \",\" + cy + \",\" + cz;\r\n\t}\r\n\r\n\tfunction findOrRegister(vx, vy, vz) {\r\n\t\tvar cx = Math.floor(vx * invCell);\r\n\t\tvar cy = Math.floor(vy * invCell);\r\n\t\tvar cz = Math.floor(vz * invCell);\r\n\t\tvar tolSq = tolerance * tolerance;\r\n\t\tvar bestDist = tolSq;\r\n\t\tvar bestVert = null;\r\n\r\n\t\tfor (var dx = -1; dx <= 1; dx++) {\r\n\t\t\tfor (var dy = -1; dy <= 1; dy++) {\r\n\t\t\t\tfor (var dz = -1; dz <= 1; dz++) {\r\n\t\t\t\t\tvar key = (cx + dx) + \",\" + (cy + dy) + \",\" + (cz + dz);\r\n\t\t\t\t\tvar bucket = grid[key];\r\n\t\t\t\t\tif (!bucket) continue;\r\n\t\t\t\t\tfor (var b = 0; b < bucket.length; b++) {\r\n\t\t\t\t\t\tvar cv = bucket[b];\r\n\t\t\t\t\t\tvar ddx = cv.x - vx, ddy = cv.y - vy, ddz = cv.z - vz;\r\n\t\t\t\t\t\tvar dSq = ddx * ddx + ddy * ddy + ddz * ddz;\r\n\t\t\t\t\t\tif (dSq < bestDist) {\r\n\t\t\t\t\t\t\tbestDist = dSq;\r\n\t\t\t\t\t\t\tbestVert = cv;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (bestVert) {\r\n\t\t\tmergedCount++;\r\n\t\t\treturn bestVert;\r\n\t\t}\r\n\r\n\t\tvar newVert = { x: vx, y: vy, z: vz };\r\n\t\tvar regKey = getKey(vx, vy, vz);\r\n\t\tif (!grid[regKey]) grid[regKey] = [];\r\n\t\tgrid[regKey].push(newVert);\r\n\t\tcanonical.push(newVert);\r\n\t\treturn newVert;\r\n\t}\r\n\r\n\tvar result = [];\r\n\tvar degenerateRemoved = 0;\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar cv0 = findOrRegister(tri.v0.x, tri.v0.y, tri.v0.z);\r\n\t\tvar cv1 = findOrRegister(tri.v1.x, tri.v1.y, tri.v1.z);\r\n\t\tvar cv2 = findOrRegister(tri.v2.x, tri.v2.y, tri.v2.z);\r\n\r\n\t\tif (cv0 === cv1 || cv1 === cv2 || cv2 === cv0) {\r\n\t\t\tdegenerateRemoved++;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tresult.push({ v0: cv0, v1: cv1, v2: cv2 });\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\r\n * @module repair/weldVertices\r\n *\r\n * Weld triangle soup into indexed mesh, merging vertices within tolerance.\r\n * Uses spatial grid for O(n) welding instead of O(n^2).\r\n */\r\n\r\n/**\r\n * Weld triangle soup into indexed mesh, merging vertices within tolerance.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @param {number} tolerance - Distance tolerance for merging vertices\r\n * @returns {{ points: Array<{x,y,z}>, triangles: Array<{ vertices: [{x,y,z},{x,y,z},{x,y,z}] }> }}\r\n */\r\nexport function weldVertices(tris, tolerance) {\r\n\tvar points = [];\r\n\tvar triangles = [];\r\n\r\n\tif (tolerance <= 0) {\r\n\t\tfor (var i = 0; i < tris.length; i++) {\r\n\t\t\tvar tri = tris[i];\r\n\t\t\tpoints.push(\r\n\t\t\t\t{ x: tri.v0.x, y: tri.v0.y, z: tri.v0.z },\r\n\t\t\t\t{ x: tri.v1.x, y: tri.v1.y, z: tri.v1.z },\r\n\t\t\t\t{ x: tri.v2.x, y: tri.v2.y, z: tri.v2.z }\r\n\t\t\t);\r\n\t\t\ttriangles.push({\r\n\t\t\t\tvertices: [\r\n\t\t\t\t\t{ x: tri.v0.x, y: tri.v0.y, z: tri.v0.z },\r\n\t\t\t\t\t{ x: tri.v1.x, y: tri.v1.y, z: tri.v1.z },\r\n\t\t\t\t\t{ x: tri.v2.x, y: tri.v2.y, z: tri.v2.z }\r\n\t\t\t\t]\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn { points: points, triangles: triangles };\r\n\t}\r\n\r\n\tvar cellSize = Math.max(tolerance * 2, 0.002);\r\n\tvar grid = {};\r\n\tvar tolSq = tolerance * tolerance;\r\n\r\n\tfunction getOrAddPoint(v) {\r\n\t\tvar gx = Math.floor(v.x / cellSize);\r\n\t\tvar gy = Math.floor(v.y / cellSize);\r\n\t\tvar gz = Math.floor(v.z / cellSize);\r\n\r\n\t\tfor (var dx = -1; dx <= 1; dx++) {\r\n\t\t\tfor (var dy = -1; dy <= 1; dy++) {\r\n\t\t\t\tfor (var dz = -1; dz <= 1; dz++) {\r\n\t\t\t\t\tvar key = (gx + dx) + \",\" + (gy + dy) + \",\" + (gz + dz);\r\n\t\t\t\t\tvar cell = grid[key];\r\n\t\t\t\t\tif (!cell) continue;\r\n\t\t\t\t\tfor (var c = 0; c < cell.length; c++) {\r\n\t\t\t\t\t\tvar p = points[cell[c]];\r\n\t\t\t\t\t\tvar ddx = p.x - v.x, ddy = p.y - v.y, ddz = p.z - v.z;\r\n\t\t\t\t\t\tif (ddx * ddx + ddy * ddy + ddz * ddz <= tolSq) {\r\n\t\t\t\t\t\t\treturn cell[c];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar idx = points.length;\r\n\t\tpoints.push({ x: v.x, y: v.y, z: v.z });\r\n\t\tvar homeKey = gx + \",\" + gy + \",\" + gz;\r\n\t\tif (!grid[homeKey]) grid[homeKey] = [];\r\n\t\tgrid[homeKey].push(idx);\r\n\t\treturn idx;\r\n\t}\r\n\r\n\tfor (var i2 = 0; i2 < tris.length; i2++) {\r\n\t\tvar tri2 = tris[i2];\r\n\t\tvar i0 = getOrAddPoint(tri2.v0);\r\n\t\tvar i1 = getOrAddPoint(tri2.v1);\r\n\t\tvar i22 = getOrAddPoint(tri2.v2);\r\n\r\n\t\tif (i0 === i1 || i1 === i22 || i0 === i22) continue;\r\n\r\n\t\ttriangles.push({\r\n\t\t\tvertices: [\r\n\t\t\t\t{ x: points[i0].x, y: points[i0].y, z: points[i0].z },\r\n\t\t\t\t{ x: points[i1].x, y: points[i1].y, z: points[i1].z },\r\n\t\t\t\t{ x: points[i22].x, y: points[i22].y, z: points[i22].z }\r\n\t\t\t]\r\n\t\t});\r\n\t}\r\n\r\n\treturn { points: points, triangles: triangles };\r\n}\r\n\r\n/**\r\n * Convert welded {vertices} format back to {v0, v1, v2} soup.\r\n *\r\n * @param {Array<{ vertices: [{x,y,z},{x,y,z},{x,y,z}] }>} weldedTriangles\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Triangle soup\r\n */\r\nexport function weldedToSoup(weldedTriangles) {\r\n\tvar soup = [];\r\n\tfor (var i = 0; i < weldedTriangles.length; i++) {\r\n\t\tvar verts = weldedTriangles[i].vertices;\r\n\t\tsoup.push({\r\n\t\t\tv0: { x: verts[0].x, y: verts[0].y, z: verts[0].z },\r\n\t\t\tv1: { x: verts[1].x, y: verts[1].y, z: verts[1].z },\r\n\t\t\tv2: { x: verts[2].x, y: verts[2].y, z: verts[2].z }\r\n\t\t});\r\n\t}\r\n\treturn soup;\r\n}\r\n","/**\r\n * @module normals/alignNormals\r\n *\r\n * Ensure triangle normals point in the +Z direction (Z-up convention).\r\n * Used as a fallback when BFS winding propagation cannot be applied\r\n * (non-manifold meshes).\r\n */\r\n\r\nimport { triNormal } from \"./triNormal.js\";\r\n\r\n/**\r\n * Flip any downward-facing triangles so their normals point Z-up.\r\n *\r\n * For each triangle, computes the face normal via cross product.\r\n * If the Z component is negative (below the -0.01 threshold), the\r\n * winding order is reversed (v1 and v2 swapped) to flip the normal\r\n * upward.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Triangle soup with Z-up normals\r\n */\r\nexport function ensureZUpNormals(tris) {\r\n\tvar result = [];\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar v0 = { x: tri.v0.x, y: tri.v0.y, z: tri.v0.z };\r\n\t\tvar v1 = { x: tri.v1.x, y: tri.v1.y, z: tri.v1.z };\r\n\t\tvar v2 = { x: tri.v2.x, y: tri.v2.y, z: tri.v2.z };\r\n\r\n\t\tvar n = triNormal({ v0: v0, v1: v1, v2: v2 });\r\n\r\n\t\tif (n.z < -0.01) {\r\n\t\t\t// Downward-facing -- swap v1 and v2 to flip normal\r\n\t\t\tresult.push({ v0: v0, v1: v2, v2: v1 });\r\n\t\t} else {\r\n\t\t\tresult.push({ v0: v0, v1: v1, v2: v2 });\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Flip all triangle normals unconditionally by swapping v1 and v2.\r\n * Returns a NEW cloned array — never modifies the original.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Cloned array with all normals inverted\r\n */\r\nexport function flipAllNormals(tris) {\r\n\tvar result = [];\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tresult.push({\r\n\t\t\tv0: { x: tri.v0.x, y: tri.v0.y, z: tri.v0.z },\r\n\t\t\tv1: { x: tri.v2.x, y: tri.v2.y, z: tri.v2.z },\r\n\t\t\tv2: { x: tri.v1.x, y: tri.v1.y, z: tri.v1.z }\r\n\t\t});\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\r\n * @module repair/resolveTJunctions\r\n *\r\n * Detect and resolve T-junctions in triangle soup.\r\n * A T-junction occurs when a vertex from one triangle lies on an edge of\r\n * another triangle but that edge hasn't been split.\r\n */\r\n\r\nimport Delaunator from \"delaunator\";\r\nimport { dist3 } from \"../util/math.js\";\r\n\r\n/**\r\n * Split a triangle that has Steiner points inside it, using\r\n * local-frame + Delaunator + barycentric-filter.\r\n *\r\n * @param {Object} tri - {v0, v1, v2}\r\n * @param {Array} steinerPoints - Array of {x, y, z} points on edges of this triangle\r\n * @returns {Array} Sub-triangles [{v0, v1, v2}, ...]\r\n */\r\nfunction splitTriangleWithSteinerPoints(tri, steinerPoints) {\r\n\tif (!steinerPoints || steinerPoints.length === 0) return [tri];\r\n\r\n\tvar e1x = tri.v1.x - tri.v0.x;\r\n\tvar e1y = tri.v1.y - tri.v0.y;\r\n\tvar e1z = tri.v1.z - tri.v0.z;\r\n\tvar e2x = tri.v2.x - tri.v0.x;\r\n\tvar e2y = tri.v2.y - tri.v0.y;\r\n\tvar e2z = tri.v2.z - tri.v0.z;\r\n\r\n\tvar e1Len = Math.sqrt(e1x * e1x + e1y * e1y + e1z * e1z);\r\n\tif (e1Len < 1e-12) return [tri];\r\n\tvar lux = e1x / e1Len, luy = e1y / e1Len, luz = e1z / e1Len;\r\n\r\n\tvar lnx = e1y * e2z - e1z * e2y;\r\n\tvar lny = e1z * e2x - e1x * e2z;\r\n\tvar lnz = e1x * e2y - e1y * e2x;\r\n\tvar lnLen = Math.sqrt(lnx * lnx + lny * lny + lnz * lnz);\r\n\tif (lnLen < 1e-12) return [tri];\r\n\r\n\tvar lvx = lny * luz - lnz * luy;\r\n\tvar lvy = lnz * lux - lnx * luz;\r\n\tvar lvz = lnx * luy - lny * lux;\r\n\tvar lvLen = Math.sqrt(lvx * lvx + lvy * lvy + lvz * lvz);\r\n\tif (lvLen < 1e-12) return [tri];\r\n\tlvx /= lvLen; lvy /= lvLen; lvz /= lvLen;\r\n\r\n\tvar lox = tri.v0.x, loy = tri.v0.y, loz = tri.v0.z;\r\n\r\n\tfunction toLocal(p) {\r\n\t\tvar dx = p.x - lox, dy = p.y - loy, dz = p.z - loz;\r\n\t\treturn [dx * lux + dy * luy + dz * luz, dx * lvx + dy * lvy + dz * lvz];\r\n\t}\r\n\r\n\tvar l0 = toLocal(tri.v0);\r\n\tvar l1 = toLocal(tri.v1);\r\n\tvar l2 = toLocal(tri.v2);\r\n\r\n\tvar baryD = (l1[1] - l2[1]) * (l0[0] - l2[0]) + (l2[0] - l1[0]) * (l0[1] - l2[1]);\r\n\tif (Math.abs(baryD) < 1e-12) return [tri];\r\n\r\n\tfunction baryCoords(pu, pv) {\r\n\t\tvar u = ((l1[1] - l2[1]) * (pu - l2[0]) + (l2[0] - l1[0]) * (pv - l2[1])) / baryD;\r\n\t\tvar v = ((l2[1] - l0[1]) * (pu - l2[0]) + (l0[0] - l2[0]) * (pv - l2[1])) / baryD;\r\n\t\treturn [u, v, 1 - u - v];\r\n\t}\r\n\r\n\tvar triArea2D = Math.abs(baryD) * 0.5;\r\n\tvar MIN_AREA_RATIO = 1e-8;\r\n\r\n\tvar pts = [\r\n\t\t{ x: tri.v0.x, y: tri.v0.y, z: tri.v0.z },\r\n\t\t{ x: tri.v1.x, y: tri.v1.y, z: tri.v1.z },\r\n\t\t{ x: tri.v2.x, y: tri.v2.y, z: tri.v2.z }\r\n\t];\r\n\tfor (var si = 0; si < steinerPoints.length; si++) {\r\n\t\tpts.push(steinerPoints[si]);\r\n\t}\r\n\r\n\tvar n = pts.length;\r\n\tvar coords = new Float64Array(n * 2);\r\n\tfor (var j = 0; j < n; j++) {\r\n\t\tvar lj = toLocal(pts[j]);\r\n\t\tcoords[j * 2] = lj[0];\r\n\t\tcoords[j * 2 + 1] = lj[1];\r\n\t}\r\n\r\n\tvar del;\r\n\ttry {\r\n\t\tdel = new Delaunator(coords);\r\n\t} catch (de) {\r\n\t\treturn [tri];\r\n\t}\r\n\r\n\tvar result = [];\r\n\tvar delTris = del.triangles;\r\n\tfor (var k = 0; k < delTris.length; k += 3) {\r\n\t\tvar a = delTris[k], b = delTris[k + 1], c = delTris[k + 2];\r\n\r\n\t\tvar cx2 = (coords[a * 2] + coords[b * 2] + coords[c * 2]) / 3;\r\n\t\tvar cy2 = (coords[a * 2 + 1] + coords[b * 2 + 1] + coords[c * 2 + 1]) / 3;\r\n\r\n\t\tvar cBary = baryCoords(cx2, cy2);\r\n\t\tif (cBary[0] < -1e-6 || cBary[1] < -1e-6 || cBary[2] < -1e-6) continue;\r\n\r\n\t\tvar au = coords[a * 2], av = coords[a * 2 + 1];\r\n\t\tvar bu = coords[b * 2], bv = coords[b * 2 + 1];\r\n\t\tvar cu = coords[c * 2], cv = coords[c * 2 + 1];\r\n\t\tvar subArea = Math.abs((bu - au) * (cv - av) - (cu - au) * (bv - av)) * 0.5;\r\n\t\tif (subArea < triArea2D * MIN_AREA_RATIO) continue;\r\n\r\n\t\tresult.push({ v0: pts[a], v1: pts[b], v2: pts[c] });\r\n\t}\r\n\r\n\tif (result.length === 0) return [tri];\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Detect and resolve T-junctions in triangle soup.\r\n *\r\n * @param {Array} soup - Triangle soup [{v0, v1, v2}, ...]\r\n * @param {number} [tolerance=1e-4] - Distance tolerance in metres\r\n * @param {number} [maxPasses=3] - Max iteration passes\r\n * @returns {Array} Triangle soup with T-junctions resolved\r\n */\r\nexport function resolveTJunctions(soup, tolerance, maxPasses) {\r\n\tif (!soup || soup.length === 0) return soup;\r\n\tif (!tolerance) tolerance = 1e-4;\r\n\tif (!maxPasses) maxPasses = 3;\r\n\r\n\tvar PREC = 6;\r\n\r\n\tfunction localVKey(v) {\r\n\t\treturn v.x.toFixed(PREC) + \",\" + v.y.toFixed(PREC) + \",\" + v.z.toFixed(PREC);\r\n\t}\r\n\r\n\t// Compute average edge length for grid cell size\r\n\tvar edgeLenSum = 0;\r\n\tvar edgeCount = 0;\r\n\tfor (var ei0 = 0; ei0 < Math.min(soup.length, 200); ei0++) {\r\n\t\tvar st = soup[ei0];\r\n\t\tedgeLenSum += dist3(st.v0, st.v1) + dist3(st.v1, st.v2) + dist3(st.v2, st.v0);\r\n\t\tedgeCount += 3;\r\n\t}\r\n\tvar avgEdge = edgeCount > 0 ? edgeLenSum / edgeCount : 1.0;\r\n\r\n\tfor (var pass = 0; pass < maxPasses; pass++) {\r\n\t\tvar cellSize = Math.max(avgEdge, tolerance * 100, 0.1);\r\n\t\tvar invCell = 1.0 / cellSize;\r\n\t\tvar grid = {};\r\n\r\n\t\tvar vertSeen = {};\r\n\t\tfor (var i = 0; i < soup.length; i++) {\r\n\t\t\tvar tri = soup[i];\r\n\t\t\tvar verts = [tri.v0, tri.v1, tri.v2];\r\n\t\t\tfor (var vi = 0; vi < 3; vi++) {\r\n\t\t\t\tvar v = verts[vi];\r\n\t\t\t\tvar key = localVKey(v);\r\n\t\t\t\tif (!vertSeen[key]) {\r\n\t\t\t\t\tvertSeen[key] = true;\r\n\t\t\t\t\tvar gx = Math.floor(v.x * invCell);\r\n\t\t\t\t\tvar gy = Math.floor(v.y * invCell);\r\n\t\t\t\t\tvar gz = Math.floor(v.z * invCell);\r\n\t\t\t\t\tvar gk = gx + \",\" + gy + \",\" + gz;\r\n\t\t\t\t\tif (!grid[gk]) grid[gk] = [];\r\n\t\t\t\t\tgrid[gk].push(v);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar triSteiner = [];\r\n\t\tvar splitCount = 0;\r\n\t\tvar tolSq = tolerance * tolerance;\r\n\r\n\t\tfor (var ti = 0; ti < soup.length; ti++) {\r\n\t\t\tvar t = soup[ti];\r\n\t\t\tvar tv = [t.v0, t.v1, t.v2];\r\n\t\t\tvar tvKeys = [localVKey(tv[0]), localVKey(tv[1]), localVKey(tv[2])];\r\n\t\t\tvar steiners = null;\r\n\r\n\t\t\tfor (var ei = 0; ei < 3; ei++) {\r\n\t\t\t\tvar eA = tv[ei];\r\n\t\t\t\tvar eB = tv[(ei + 1) % 3];\r\n\r\n\t\t\t\tvar abx = eB.x - eA.x;\r\n\t\t\t\tvar aby = eB.y - eA.y;\r\n\t\t\t\tvar abz = eB.z - eA.z;\r\n\t\t\t\tvar abLenSq = abx * abx + aby * aby + abz * abz;\r\n\t\t\t\tif (abLenSq < 1e-20) continue;\r\n\r\n\t\t\t\tvar abLen = Math.sqrt(abLenSq);\r\n\t\t\t\tvar eps = tolerance / abLen;\r\n\t\t\t\tif (eps >= 0.5) continue;\r\n\r\n\t\t\t\tvar visited = {};\r\n\t\t\t\tvar steps = Math.ceil(abLen / cellSize) + 1;\r\n\t\t\t\tfor (var si = 0; si <= steps; si++) {\r\n\t\t\t\t\tvar frac = si / steps;\r\n\t\t\t\t\tvar sx = eA.x + frac * abx;\r\n\t\t\t\t\tvar sy = eA.y + frac * aby;\r\n\t\t\t\t\tvar sz = eA.z + frac * abz;\r\n\t\t\t\t\tvar sgx = Math.floor(sx * invCell);\r\n\t\t\t\t\tvar sgy = Math.floor(sy * invCell);\r\n\t\t\t\t\tvar sgz = Math.floor(sz * invCell);\r\n\r\n\t\t\t\t\tfor (var dx = -1; dx <= 1; dx++) {\r\n\t\t\t\t\t\tfor (var dy = -1; dy <= 1; dy++) {\r\n\t\t\t\t\t\t\tfor (var dz = -1; dz <= 1; dz++) {\r\n\t\t\t\t\t\t\t\tvar ck = (sgx + dx) + \",\" + (sgy + dy) + \",\" + (sgz + dz);\r\n\t\t\t\t\t\t\t\tif (visited[ck]) continue;\r\n\t\t\t\t\t\t\t\tvisited[ck] = true;\r\n\r\n\t\t\t\t\t\t\t\tvar cell = grid[ck];\r\n\t\t\t\t\t\t\t\tif (!cell) continue;\r\n\r\n\t\t\t\t\t\t\t\tfor (var ci = 0; ci < cell.length; ci++) {\r\n\t\t\t\t\t\t\t\t\tvar V = cell[ci];\r\n\t\t\t\t\t\t\t\t\tvar vk = localVKey(V);\r\n\t\t\t\t\t\t\t\t\tif (vk === tvKeys[0] || vk === tvKeys[1] || vk === tvKeys[2]) continue;\r\n\r\n\t\t\t\t\t\t\t\t\tvar apx = V.x - eA.x;\r\n\t\t\t\t\t\t\t\t\tvar apy = V.y - eA.y;\r\n\t\t\t\t\t\t\t\t\tvar apz = V.z - eA.z;\r\n\t\t\t\t\t\t\t\t\tvar tp = (apx * abx + apy * aby + apz * abz) / abLenSq;\r\n\r\n\t\t\t\t\t\t\t\t\tif (tp <= eps || tp >= 1 - eps) continue;\r\n\r\n\t\t\t\t\t\t\t\t\tvar projX = eA.x + tp * abx;\r\n\t\t\t\t\t\t\t\t\tvar projY = eA.y + tp * aby;\r\n\t\t\t\t\t\t\t\t\tvar projZ = eA.z + tp * abz;\r\n\t\t\t\t\t\t\t\t\tvar ddx = V.x - projX;\r\n\t\t\t\t\t\t\t\t\tvar ddy = V.y - projY;\r\n\t\t\t\t\t\t\t\t\tvar ddz = V.z - projZ;\r\n\t\t\t\t\t\t\t\t\tvar distSq = ddx * ddx + ddy * ddy + ddz * ddz;\r\n\r\n\t\t\t\t\t\t\t\t\tif (distSq < tolSq) {\r\n\t\t\t\t\t\t\t\t\t\tif (!steiners) steiners = [];\r\n\t\t\t\t\t\t\t\t\t\tsteiners.push({ x: V.x, y: V.y, z: V.z });\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (steiners) {\r\n\t\t\t\tvar seen2 = {};\r\n\t\t\t\tvar unique = [];\r\n\t\t\t\tfor (var su = 0; su < steiners.length; su++) {\r\n\t\t\t\t\tvar sk = localVKey(steiners[su]);\r\n\t\t\t\t\tif (!seen2[sk]) {\r\n\t\t\t\t\t\tseen2[sk] = true;\r\n\t\t\t\t\t\tunique.push(steiners[su]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\ttriSteiner[ti] = unique;\r\n\t\t\t\tsplitCount++;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (splitCount === 0) break;\r\n\r\n\t\tvar newSoup = [];\r\n\t\tfor (var ri = 0; ri < soup.length; ri++) {\r\n\t\t\tif (triSteiner[ri]) {\r\n\t\t\t\tvar subTris = splitTriangleWithSteinerPoints(soup[ri], triSteiner[ri]);\r\n\t\t\t\tfor (var st2 = 0; st2 < subTris.length; st2++) {\r\n\t\t\t\t\tnewSoup.push(subTris[st2]);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnewSoup.push(soup[ri]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsoup = newSoup;\r\n\t}\r\n\r\n\treturn soup;\r\n}\r\n","/**\r\n * @module repair/weldBoundary\r\n *\r\n * Weld boundary vertices (open-edge endpoints) to nearby boundary vertices\r\n * using union-find clustering. This closes seam gaps by snapping open-edge\r\n * vertices to their nearest boundary neighbors.\r\n */\r\n\r\nimport { vKey, edgeKey } from \"../util/math.js\";\r\n\r\n/**\r\n * Weld boundary vertices using union-find.\r\n * Only boundary vertices (those on edges with count === 1) are considered\r\n * for merging. Vertices within tolerance are clustered and replaced with\r\n * their centroid.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @param {number} tolerance - Max 3D distance to snap boundary vertices\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Triangle soup with boundary vertices merged\r\n */\r\nexport function weldBoundaryVertices(tris, tolerance) {\r\n\tif (tolerance <= 0) return tris;\r\n\r\n\tvar edgeMap = {};\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar verts = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar keys = [vKey(verts[0]), vKey(verts[1]), vKey(verts[2])];\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tvar ne = (e + 1) % 3;\r\n\t\t\tvar ek = edgeKey(keys[e], keys[ne]);\r\n\t\t\tif (!edgeMap[ek]) edgeMap[ek] = { count: 0, k0: keys[e], k1: keys[ne], v0: verts[e], v1: verts[ne] };\r\n\t\t\tedgeMap[ek].count++;\r\n\t\t}\r\n\t}\r\n\r\n\tvar boundaryVerts = {};\r\n\tfor (var ek2 in edgeMap) {\r\n\t\tif (edgeMap[ek2].count === 1) {\r\n\t\t\tboundaryVerts[edgeMap[ek2].k0] = edgeMap[ek2].v0;\r\n\t\t\tboundaryVerts[edgeMap[ek2].k1] = edgeMap[ek2].v1;\r\n\t\t}\r\n\t}\r\n\r\n\tvar bvKeys = Object.keys(boundaryVerts);\r\n\tif (bvKeys.length === 0) return tris;\r\n\r\n\tvar cellSize = Math.max(tolerance * 2, 0.01);\r\n\tvar grid = {};\r\n\tvar tolSq = tolerance * tolerance;\r\n\r\n\tfor (var bi = 0; bi < bvKeys.length; bi++) {\r\n\t\tvar bv = boundaryVerts[bvKeys[bi]];\r\n\t\tvar gk = Math.floor(bv.x / cellSize) + \",\" + Math.floor(bv.y / cellSize) + \",\" + Math.floor(bv.z / cellSize);\r\n\t\tif (!grid[gk]) grid[gk] = [];\r\n\t\tgrid[gk].push(bvKeys[bi]);\r\n\t}\r\n\r\n\t// Union-find\r\n\tvar parent = {};\r\n\tfor (var pi = 0; pi < bvKeys.length; pi++) {\r\n\t\tparent[bvKeys[pi]] = bvKeys[pi];\r\n\t}\r\n\r\n\tfunction find(k) {\r\n\t\twhile (parent[k] !== k) {\r\n\t\t\tparent[k] = parent[parent[k]];\r\n\t\t\tk = parent[k];\r\n\t\t}\r\n\t\treturn k;\r\n\t}\r\n\r\n\tfunction union(a, b) {\r\n\t\tvar ra = find(a), rb = find(b);\r\n\t\tif (ra !== rb) parent[ra] = rb;\r\n\t}\r\n\r\n\tfor (var si = 0; si < bvKeys.length; si++) {\r\n\t\tvar sv = boundaryVerts[bvKeys[si]];\r\n\t\tvar sgx = Math.floor(sv.x / cellSize);\r\n\t\tvar sgy = Math.floor(sv.y / cellSize);\r\n\t\tvar sgz = Math.floor(sv.z / cellSize);\r\n\r\n\t\tfor (var dx = -1; dx <= 1; dx++) {\r\n\t\t\tfor (var dy = -1; dy <= 1; dy++) {\r\n\t\t\t\tfor (var dz = -1; dz <= 1; dz++) {\r\n\t\t\t\t\tvar cell = grid[(sgx + dx) + \",\" + (sgy + dy) + \",\" + (sgz + dz)];\r\n\t\t\t\t\tif (!cell) continue;\r\n\t\t\t\t\tfor (var ci = 0; ci < cell.length; ci++) {\r\n\t\t\t\t\t\tif (cell[ci] === bvKeys[si]) continue;\r\n\t\t\t\t\t\tvar cv = boundaryVerts[cell[ci]];\r\n\t\t\t\t\t\tvar ddx = sv.x - cv.x, ddy = sv.y - cv.y, ddz = sv.z - cv.z;\r\n\t\t\t\t\t\tif (ddx * ddx + ddy * ddy + ddz * ddz <= tolSq) {\r\n\t\t\t\t\t\t\tunion(bvKeys[si], cell[ci]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Build clusters and compute centroids\r\n\tvar clusters = {};\r\n\tfor (var ki = 0; ki < bvKeys.length; ki++) {\r\n\t\tvar root = find(bvKeys[ki]);\r\n\t\tvar v = boundaryVerts[bvKeys[ki]];\r\n\t\tif (!clusters[root]) {\r\n\t\t\tclusters[root] = { sumX: 0, sumY: 0, sumZ: 0, count: 0 };\r\n\t\t}\r\n\t\tclusters[root].sumX += v.x;\r\n\t\tclusters[root].sumY += v.y;\r\n\t\tclusters[root].sumZ += v.z;\r\n\t\tclusters[root].count++;\r\n\t}\r\n\r\n\tvar mergeMap = {};\r\n\tvar mergedCount = 0;\r\n\tfor (var mi = 0; mi < bvKeys.length; mi++) {\r\n\t\tvar root2 = find(bvKeys[mi]);\r\n\t\tvar cl = clusters[root2];\r\n\t\tif (cl.count > 1) {\r\n\t\t\tmergeMap[bvKeys[mi]] = {\r\n\t\t\t\tx: cl.sumX / cl.count,\r\n\t\t\t\ty: cl.sumY / cl.count,\r\n\t\t\t\tz: cl.sumZ / cl.count\r\n\t\t\t};\r\n\t\t\tmergedCount++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (mergedCount === 0) {\r\n\t\treturn tris;\r\n\t}\r\n\r\n\tfunction remap(v2) {\r\n\t\tvar k = vKey(v2);\r\n\t\tif (mergeMap[k]) return mergeMap[k];\r\n\t\treturn v2;\r\n\t}\r\n\r\n\tvar result = [];\r\n\tfor (var ri = 0; ri < tris.length; ri++) {\r\n\t\tvar rv0 = remap(tris[ri].v0);\r\n\t\tvar rv1 = remap(tris[ri].v1);\r\n\t\tvar rv2 = remap(tris[ri].v2);\r\n\r\n\t\tvar k0 = vKey(rv0), k1 = vKey(rv1), k2 = vKey(rv2);\r\n\t\tif (k0 === k1 || k1 === k2 || k0 === k2) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tresult.push({ v0: rv0, v1: rv1, v2: rv2 });\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\r\n * @module repair/fillOpenLoops\r\n *\r\n * Fill closed boundary loops with fan triangles.\r\n *\r\n * Finds open edges (used by exactly 1 triangle), chains them into\r\n * polylines, and for each closed loop fills the hole with a fan from\r\n * vertex 0.  Winding is matched to the adjacent existing triangle so\r\n * that normals stay consistent.\r\n *\r\n * Exports:\r\n *  - fillOpenEdgeLoops(soup, tolerance)\r\n */\r\n\r\n/**\r\n * Fill closed open-edge loops in a triangle soup with fan triangles.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soup\r\n * @param {number} [tolerance=1e-6] - Vertex snapping tolerance for chaining\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Soup with fill triangles appended\r\n */\r\nexport function fillOpenEdgeLoops(soup, tolerance) {\r\n\tif (!soup || soup.length === 0) return soup;\r\n\tif (tolerance === undefined) tolerance = 1e-6;\r\n\r\n\tvar PREC = 6;\r\n\tfunction vk(v) { return v.x.toFixed(PREC) + \",\" + v.y.toFixed(PREC) + \",\" + v.z.toFixed(PREC); }\r\n\tfunction ek(a, b) { return a < b ? a + \"|\" + b : b + \"|\" + a; }\r\n\r\n\t// Step 1) Find open edges and record half-edge directions for winding\r\n\tvar edgeCount = {};\r\n\tvar edgeVerts = {};\r\n\t// halfEdgeDir[ek] = { from: vk, to: vk } — direction in the existing mesh\r\n\tvar halfEdgeDir = {};\r\n\tfor (var i = 0; i < soup.length; i++) {\r\n\t\tvar tri = soup[i];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar ks = [vk(vs[0]), vk(vs[1]), vk(vs[2])];\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tvar ne = (e + 1) % 3;\r\n\t\t\tvar key = ek(ks[e], ks[ne]);\r\n\t\t\tif (!edgeCount[key]) {\r\n\t\t\t\tedgeCount[key] = 0;\r\n\t\t\t\tedgeVerts[key] = [vs[e], vs[ne]];\r\n\t\t\t}\r\n\t\t\tedgeCount[key]++;\r\n\t\t\t// Record the half-edge direction from this triangle\r\n\t\t\thalfEdgeDir[key] = { from: ks[e], to: ks[ne] };\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 2) Collect open edges as directed segments\r\n\tvar openEdges = [];\r\n\tfor (var k in edgeCount) {\r\n\t\tif (edgeCount[k] === 1) {\r\n\t\t\topenEdges.push({ p0: edgeVerts[k][0], p1: edgeVerts[k][1], key: k });\r\n\t\t}\r\n\t}\r\n\tif (openEdges.length === 0) return soup;\r\n\r\n\t// Step 3) Chain open edges into polylines via vertex-key adjacency\r\n\tvar vertToEdges = {};\r\n\tfor (var oi = 0; oi < openEdges.length; oi++) {\r\n\t\tvar k0 = vk(openEdges[oi].p0);\r\n\t\tvar k1 = vk(openEdges[oi].p1);\r\n\t\tif (!vertToEdges[k0]) vertToEdges[k0] = [];\r\n\t\tvertToEdges[k0].push(oi);\r\n\t\tif (!vertToEdges[k1]) vertToEdges[k1] = [];\r\n\t\tvertToEdges[k1].push(oi);\r\n\t}\r\n\r\n\tvar used = {};\r\n\tvar loops = [];\r\n\r\n\tfor (var seed = 0; seed < openEdges.length; seed++) {\r\n\t\tif (used[seed]) continue;\r\n\t\tused[seed] = true;\r\n\r\n\t\t// Build chain starting from this seed edge\r\n\t\tvar chain = [openEdges[seed].p0, openEdges[seed].p1];\r\n\t\tvar chainKeys = [vk(openEdges[seed].p0), vk(openEdges[seed].p1)];\r\n\t\t// Track which edge keys are in this chain (for winding later)\r\n\t\tvar chainEdgeKeys = [openEdges[seed].key];\r\n\r\n\t\t// Step 3a) Extend from the tail\r\n\t\tvar extending = true;\r\n\t\twhile (extending) {\r\n\t\t\textending = false;\r\n\t\t\tvar tailKey = chainKeys[chainKeys.length - 1];\r\n\t\t\tvar candidates = vertToEdges[tailKey];\r\n\t\t\tif (!candidates) break;\r\n\t\t\tfor (var ci = 0; ci < candidates.length; ci++) {\r\n\t\t\t\tvar cIdx = candidates[ci];\r\n\t\t\t\tif (used[cIdx]) continue;\r\n\t\t\t\tvar ce = openEdges[cIdx];\r\n\t\t\t\tvar ck0 = vk(ce.p0);\r\n\t\t\t\tvar ck1 = vk(ce.p1);\r\n\t\t\t\tif (ck0 === tailKey) {\r\n\t\t\t\t\tused[cIdx] = true;\r\n\t\t\t\t\tchain.push(ce.p1);\r\n\t\t\t\t\tchainKeys.push(ck1);\r\n\t\t\t\t\tchainEdgeKeys.push(ce.key);\r\n\t\t\t\t\textending = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else if (ck1 === tailKey) {\r\n\t\t\t\t\tused[cIdx] = true;\r\n\t\t\t\t\tchain.push(ce.p0);\r\n\t\t\t\t\tchainKeys.push(ck0);\r\n\t\t\t\t\tchainEdgeKeys.push(ce.key);\r\n\t\t\t\t\textending = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Step 3b) Extend from the head\r\n\t\textending = true;\r\n\t\twhile (extending) {\r\n\t\t\textending = false;\r\n\t\t\tvar headKey = chainKeys[0];\r\n\t\t\tvar candidates2 = vertToEdges[headKey];\r\n\t\t\tif (!candidates2) break;\r\n\t\t\tfor (var ci2 = 0; ci2 < candidates2.length; ci2++) {\r\n\t\t\t\tvar cIdx2 = candidates2[ci2];\r\n\t\t\t\tif (used[cIdx2]) continue;\r\n\t\t\t\tvar ce2 = openEdges[cIdx2];\r\n\t\t\t\tvar ck02 = vk(ce2.p0);\r\n\t\t\t\tvar ck12 = vk(ce2.p1);\r\n\t\t\t\tif (ck02 === headKey) {\r\n\t\t\t\t\tused[cIdx2] = true;\r\n\t\t\t\t\tchain.unshift(ce2.p1);\r\n\t\t\t\t\tchainKeys.unshift(ck12);\r\n\t\t\t\t\tchainEdgeKeys.unshift(ce2.key);\r\n\t\t\t\t\textending = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else if (ck12 === headKey) {\r\n\t\t\t\t\tused[cIdx2] = true;\r\n\t\t\t\t\tchain.unshift(ce2.p0);\r\n\t\t\t\t\tchainKeys.unshift(ck02);\r\n\t\t\t\t\tchainEdgeKeys.unshift(ce2.key);\r\n\t\t\t\t\textending = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Step 3c) Check if chain forms a closed loop\r\n\t\tif (chainKeys[0] === chainKeys[chainKeys.length - 1] && chain.length >= 4) {\r\n\t\t\t// Remove duplicate closing vertex\r\n\t\t\tchain.pop();\r\n\t\t\tchainKeys.pop();\r\n\t\t\tloops.push({ verts: chain, keys: chainKeys, edgeKeys: chainEdgeKeys });\r\n\t\t}\r\n\t}\r\n\r\n\tif (loops.length === 0) return soup;\r\n\r\n\t// Step 4) Fan-fill each closed loop\r\n\tvar result = soup.slice();\r\n\tfor (var li = 0; li < loops.length; li++) {\r\n\t\tvar loop = loops[li];\r\n\t\tvar lv = loop.verts;\r\n\t\tif (lv.length < 3) continue;\r\n\r\n\t\t// Step 4a) Determine winding from an adjacent existing triangle.\r\n\t\t// Look at the first edge of the loop and check the half-edge direction\r\n\t\t// in the existing mesh. The fill triangle should traverse that edge in\r\n\t\t// the OPPOSITE direction for consistent normals.\r\n\t\tvar firstEdgeKey = loop.edgeKeys[0];\r\n\t\tvar heDir = halfEdgeDir[firstEdgeKey];\r\n\t\tvar v0Key = loop.keys[0];\r\n\t\tvar v1Key = loop.keys[1];\r\n\r\n\t\t// The existing mesh traverses firstEdge as heDir.from -> heDir.to.\r\n\t\t// For consistent winding, the fill should traverse it as heDir.to -> heDir.from.\r\n\t\t// In the fan from vertex 0: Triangle(V0, V1, V2).\r\n\t\t// The edge V0->V1 corresponds to the first loop edge.\r\n\t\t// If V0->V1 matches heDir.from->heDir.to, we need to REVERSE the loop.\r\n\t\tvar needReverse = (v0Key === heDir.from && v1Key === heDir.to);\r\n\t\tif (needReverse) {\r\n\t\t\tlv = lv.slice().reverse();\r\n\t\t}\r\n\r\n\t\t// Step 4b) Fan from vertex 0 to all consecutive pairs\r\n\t\tvar fanOrigin = lv[0];\r\n\t\tfor (var fi = 1; fi < lv.length - 1; fi++) {\r\n\t\t\tresult.push({\r\n\t\t\t\tv0: { x: fanOrigin.x, y: fanOrigin.y, z: fanOrigin.z },\r\n\t\t\t\tv1: { x: lv[fi].x, y: lv[fi].y, z: lv[fi].z },\r\n\t\t\t\tv2: { x: lv[fi + 1].x, y: lv[fi + 1].y, z: lv[fi + 1].z }\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\r\n * @module repair/forceClose\r\n *\r\n * Force-close an indexed mesh using integer point indices.\r\n * Operates on the indexed mesh (after weld) to find boundary edges\r\n * and close them with zero floating-point precision issues.\r\n */\r\n\r\n/**\r\n * Force-close an indexed mesh by filling boundary edges with fan triangles.\r\n * Uses integer point indices to avoid floating-point precision issues.\r\n *\r\n * @param {Array<{x: number, y: number, z: number}>} points - Vertex array\r\n * @param {Array<{ vertices: [{x,y,z},{x,y,z},{x,y,z}] }>} triangles - Indexed triangles\r\n * @returns {{ points: Array<{x,y,z}>, triangles: Array<{ vertices: [{x,y,z},{x,y,z},{x,y,z}] }> }}\r\n */\r\nexport function forceCloseIndexedMesh(points, triangles) {\r\n\tvar ptIndex = {};\r\n\tfor (var pi = 0; pi < points.length; pi++) {\r\n\t\tvar pk = points[pi].x + \",\" + points[pi].y + \",\" + points[pi].z;\r\n\t\tptIndex[pk] = pi;\r\n\t}\r\n\r\n\tvar idxTris = [];\r\n\tfor (var ti = 0; ti < triangles.length; ti++) {\r\n\t\tvar v = triangles[ti].vertices;\r\n\t\tvar i0 = ptIndex[v[0].x + \",\" + v[0].y + \",\" + v[0].z];\r\n\t\tvar i1 = ptIndex[v[1].x + \",\" + v[1].y + \",\" + v[1].z];\r\n\t\tvar i2 = ptIndex[v[2].x + \",\" + v[2].y + \",\" + v[2].z];\r\n\t\tif (i0 !== undefined && i1 !== undefined && i2 !== undefined) {\r\n\t\t\tidxTris.push([i0, i1, i2]);\r\n\t\t}\r\n\t}\r\n\r\n\tvar cellSize = 2.0;\r\n\tvar grid = {};\r\n\tfor (var gi = 0; gi < points.length; gi++) {\r\n\t\tvar gp = points[gi];\r\n\t\tvar gk = Math.floor(gp.x / cellSize) + \",\" + Math.floor(gp.y / cellSize) + \",\" + Math.floor(gp.z / cellSize);\r\n\t\tif (!grid[gk]) grid[gk] = [];\r\n\t\tgrid[gk].push(gi);\r\n\t}\r\n\r\n\tvar totalAdded = 0;\r\n\tvar maxPasses = 30;\r\n\r\n\tfor (var pass = 0; pass < maxPasses; pass++) {\r\n\t\tvar edgeMap = {};\r\n\t\tfor (var ei = 0; ei < idxTris.length; ei++) {\r\n\t\t\tvar t = idxTris[ei];\r\n\t\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\t\tvar a = t[e], b = t[(e + 1) % 3];\r\n\t\t\t\tvar ek = a < b ? a + \"|\" + b : b + \"|\" + a;\r\n\t\t\t\tedgeMap[ek] = (edgeMap[ek] || 0) + 1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar boundaryEdges = [];\r\n\t\tfor (var bek in edgeMap) {\r\n\t\t\tif (edgeMap[bek] === 1) {\r\n\t\t\t\tvar parts = bek.split(\"|\");\r\n\t\t\t\tboundaryEdges.push([parseInt(parts[0]), parseInt(parts[1])]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (boundaryEdges.length === 0) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tvar newTris = [];\r\n\t\tvar usedEdges = {};\r\n\r\n\t\tfor (var bi = 0; bi < boundaryEdges.length; bi++) {\r\n\t\t\tvar be = boundaryEdges[bi];\r\n\t\t\tvar beKey = be[0] < be[1] ? be[0] + \"|\" + be[1] : be[1] + \"|\" + be[0];\r\n\t\t\tif (usedEdges[beKey]) continue;\r\n\r\n\t\t\tvar p0 = points[be[0]];\r\n\t\t\tvar p1 = points[be[1]];\r\n\t\t\tvar mid = {\r\n\t\t\t\tx: (p0.x + p1.x) / 2,\r\n\t\t\t\ty: (p0.y + p1.y) / 2,\r\n\t\t\t\tz: (p0.z + p1.z) / 2\r\n\t\t\t};\r\n\r\n\t\t\tvar mgx = Math.floor(mid.x / cellSize);\r\n\t\t\tvar mgy = Math.floor(mid.y / cellSize);\r\n\t\t\tvar mgz = Math.floor(mid.z / cellSize);\r\n\r\n\t\t\tvar bestIdx = -1;\r\n\t\t\tvar bestDist = Infinity;\r\n\r\n\t\t\tfor (var dx = -1; dx <= 1; dx++) {\r\n\t\t\t\tfor (var dy = -1; dy <= 1; dy++) {\r\n\t\t\t\t\tfor (var dz = -1; dz <= 1; dz++) {\r\n\t\t\t\t\t\tvar cell = grid[(mgx + dx) + \",\" + (mgy + dy) + \",\" + (mgz + dz)];\r\n\t\t\t\t\t\tif (!cell) continue;\r\n\t\t\t\t\t\tfor (var ci = 0; ci < cell.length; ci++) {\r\n\t\t\t\t\t\t\tvar cIdx = cell[ci];\r\n\t\t\t\t\t\t\tif (cIdx === be[0] || cIdx === be[1]) continue;\r\n\r\n\t\t\t\t\t\t\tvar cp = points[cIdx];\r\n\t\t\t\t\t\t\tvar ddx = mid.x - cp.x, ddy = mid.y - cp.y, ddz = mid.z - cp.z;\r\n\t\t\t\t\t\t\tvar d2 = ddx * ddx + ddy * ddy + ddz * ddz;\r\n\t\t\t\t\t\t\tif (d2 >= bestDist) continue;\r\n\r\n\t\t\t\t\t\t\tvar ek0 = be[0] < cIdx ? be[0] + \"|\" + cIdx : cIdx + \"|\" + be[0];\r\n\t\t\t\t\t\t\tvar ek1 = be[1] < cIdx ? be[1] + \"|\" + cIdx : cIdx + \"|\" + be[1];\r\n\t\t\t\t\t\t\tif ((edgeMap[ek0] || 0) >= 2) continue;\r\n\t\t\t\t\t\t\tif ((edgeMap[ek1] || 0) >= 2) continue;\r\n\r\n\t\t\t\t\t\t\tvar abx = p1.x - p0.x, aby = p1.y - p0.y, abz = p1.z - p0.z;\r\n\t\t\t\t\t\t\tvar acx = cp.x - p0.x, acy = cp.y - p0.y, acz = cp.z - p0.z;\r\n\t\t\t\t\t\t\tvar cx2 = aby * acz - abz * acy;\r\n\t\t\t\t\t\t\tvar cy2 = abz * acx - abx * acz;\r\n\t\t\t\t\t\t\tvar cz2 = abx * acy - aby * acx;\r\n\t\t\t\t\t\t\tvar area = cx2 * cx2 + cy2 * cy2 + cz2 * cz2;\r\n\t\t\t\t\t\t\tif (area < 1e-12) continue;\r\n\r\n\t\t\t\t\t\t\tbestIdx = cIdx;\r\n\t\t\t\t\t\t\tbestDist = d2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (bestIdx >= 0) {\r\n\t\t\t\tidxTris.push([be[0], be[1], bestIdx]);\r\n\t\t\t\tnewTris.push([be[0], be[1], bestIdx]);\r\n\t\t\t\tusedEdges[beKey] = true;\r\n\r\n\t\t\t\tvar nek0 = be[0] < bestIdx ? be[0] + \"|\" + bestIdx : bestIdx + \"|\" + be[0];\r\n\t\t\t\tvar nek1 = be[1] < bestIdx ? be[1] + \"|\" + bestIdx : bestIdx + \"|\" + be[1];\r\n\t\t\t\tedgeMap[nek0] = (edgeMap[nek0] || 0) + 1;\r\n\t\t\t\tedgeMap[nek1] = (edgeMap[nek1] || 0) + 1;\r\n\t\t\t\tedgeMap[beKey] = 2;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (newTris.length === 0) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\ttotalAdded += newTris.length;\r\n\t}\r\n\r\n\tvar outTris = [];\r\n\tfor (var oi = 0; oi < idxTris.length; oi++) {\r\n\t\tvar t2 = idxTris[oi];\r\n\t\toutTris.push({\r\n\t\t\tvertices: [\r\n\t\t\t\t{ x: points[t2[0]].x, y: points[t2[0]].y, z: points[t2[0]].z },\r\n\t\t\t\t{ x: points[t2[1]].x, y: points[t2[1]].y, z: points[t2[1]].z },\r\n\t\t\t\t{ x: points[t2[2]].x, y: points[t2[2]].y, z: points[t2[2]].z }\r\n\t\t\t]\r\n\t\t});\r\n\t}\r\n\r\n\treturn { points: points, triangles: outTris };\r\n}\r\n","/**\r\n * @module boolean/booleanOp\r\n *\r\n * Main boolean operation entry point. Computes the union, intersection,\r\n * or subtraction of two triangle meshes using a classify-then-split\r\n * algorithm:\r\n *\r\n * 1. Find tagged intersection segments between mesh A and mesh B\r\n * 2. Build crossed-triangle sets from segment tags\r\n * 3. Build multi-axis spatial grids for both meshes (XY, YZ, XZ)\r\n * 4. Classify via flood fill (BFS with multi-axis majority-vote seeds)\r\n * 5. Split straddling triangles and classify sub-triangles\r\n * 6. Deduplicate seam vertices\r\n * 7. Propagate normals (BFS winding or Z-up fallback)\r\n * 8. Combine groups based on operation\r\n * 9. Return welded result\r\n */\r\n\r\nimport { intersectMeshPairTagged } from \"../intersect/intersectMeshPair.js\";\r\nimport { buildSpatialGrid, buildSpatialGridOnAxes, estimateAvgEdge } from \"../intersect/spatialGrid.js\";\r\nimport { classifyByFloodFill, splitStraddlingAndClassify } from \"./classifyTriangles.js\";\r\nimport { deduplicateSeamVertices } from \"../repair/deduplicateVertices.js\";\r\nimport { weldVertices, weldedToSoup } from \"../repair/weldVertices.js\";\r\nimport { ensureZUpNormals } from \"../normals/alignNormals.js\";\r\nimport { vKey, soupCentroid, translateSoup } from \"../util/math.js\";\r\nimport { resolveTJunctions } from \"../repair/resolveTJunctions.js\";\r\nimport { weldBoundaryVertices } from \"../repair/weldBoundary.js\";\r\nimport { fillOpenEdgeLoops } from \"../repair/fillOpenLoops.js\";\r\nimport { findConnectedComponents, findConnectedComponentsPooled } from \"../util/connectedComponents.js\";\r\nimport { forceCloseIndexedMesh } from \"../repair/forceClose.js\";\r\n\r\n\r\n/**\r\n * Propagate consistent winding order across a triangle mesh via BFS.\r\n *\r\n * If the mesh is manifold (every edge shared by exactly 2 triangles),\r\n * BFS from a seed triangle enforces consistent winding by checking\r\n * shared-edge direction. If not manifold, falls back to ensureZUpNormals.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Triangle soup with consistent normals\r\n */\r\nfunction propagateNormals(tris) {\r\n\tif (tris.length === 0) return tris;\r\n\r\n\t// Build half-edge-to-triangle adjacency\r\n\tvar PREC = 6;\r\n\tfunction vk(v) {\r\n\t\treturn v.x.toFixed(PREC) + \",\" + v.y.toFixed(PREC) + \",\" + v.z.toFixed(PREC);\r\n\t}\r\n\r\n\t// For each triangle, compute its 3 directed half-edges\r\n\tvar edgeToTris = {}; // \"ka|kb\" (sorted) -> [{triIdx, from, to}]\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar k0 = vk(tri.v0), k1 = vk(tri.v1), k2 = vk(tri.v2);\r\n\t\tvar edges = [\r\n\t\t\t{ from: k0, to: k1 },\r\n\t\t\t{ from: k1, to: k2 },\r\n\t\t\t{ from: k2, to: k0 }\r\n\t\t];\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tvar sortedKey = edges[e].from < edges[e].to\r\n\t\t\t\t? edges[e].from + \"|\" + edges[e].to\r\n\t\t\t\t: edges[e].to + \"|\" + edges[e].from;\r\n\t\t\tif (!edgeToTris[sortedKey]) edgeToTris[sortedKey] = [];\r\n\t\t\tedgeToTris[sortedKey].push({\r\n\t\t\t\ttriIdx: i,\r\n\t\t\t\tfrom: edges[e].from,\r\n\t\t\t\tto: edges[e].to\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Check manifoldness -- every edge should have exactly 2 triangles\r\n\tvar isManifold = true;\r\n\tfor (var ek in edgeToTris) {\r\n\t\tif (edgeToTris[ek].length !== 2) {\r\n\t\t\tisManifold = false;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!isManifold) {\r\n\t\t// Non-manifold: fall back to per-triangle Z-up normals\r\n\t\treturn ensureZUpNormals(tris);\r\n\t}\r\n\r\n\t// Build per-triangle neighbor list via shared edges\r\n\tvar neighbors = new Array(tris.length);\r\n\tfor (var ni = 0; ni < tris.length; ni++) neighbors[ni] = [];\r\n\r\n\tfor (var ek2 in edgeToTris) {\r\n\t\tvar pair = edgeToTris[ek2];\r\n\t\tif (pair.length !== 2) continue;\r\n\t\tvar t0 = pair[0], t1 = pair[1];\r\n\t\tneighbors[t0.triIdx].push({\r\n\t\t\tneighbor: t1.triIdx,\r\n\t\t\t// If both traverse this edge in the SAME direction, they're inconsistent\r\n\t\t\tsameDirection: (t0.from === t1.from)\r\n\t\t});\r\n\t\tneighbors[t1.triIdx].push({\r\n\t\t\tneighbor: t0.triIdx,\r\n\t\t\tsameDirection: (t0.from === t1.from)\r\n\t\t});\r\n\t}\r\n\r\n\t// BFS from seed (triangle 0), enforce consistent winding\r\n\tvar flipped = new Uint8Array(tris.length); // 0=keep, 1=flip\r\n\tvar visited = new Uint8Array(tris.length);\r\n\tvisited[0] = 1; // seed keeps its winding\r\n\r\n\tvar queue = [0];\r\n\tvar head = 0;\r\n\r\n\twhile (head < queue.length) {\r\n\t\tvar cur = queue[head++];\r\n\t\tvar nbrs = neighbors[cur];\r\n\t\tfor (var n = 0; n < nbrs.length; n++) {\r\n\t\t\tvar nb = nbrs[n];\r\n\t\t\tif (visited[nb.neighbor]) continue;\r\n\t\t\tvisited[nb.neighbor] = 1;\r\n\r\n\t\t\t// Two adjacent triangles should traverse their shared edge in OPPOSITE directions.\r\n\t\t\t// If sameDirection is true, one needs flipping.\r\n\t\t\tvar curFlipped = flipped[cur];\r\n\t\t\tif (nb.sameDirection) {\r\n\t\t\t\t// They traverse in the same direction -> neighbor needs opposite flip state\r\n\t\t\t\tflipped[nb.neighbor] = curFlipped ? 0 : 1;\r\n\t\t\t} else {\r\n\t\t\t\t// They traverse in opposite directions -> same flip state\r\n\t\t\t\tflipped[nb.neighbor] = curFlipped;\r\n\t\t\t}\r\n\r\n\t\t\tqueue.push(nb.neighbor);\r\n\t\t}\r\n\t}\r\n\r\n\t// Apply flips\r\n\tvar result = [];\r\n\tfor (var ri = 0; ri < tris.length; ri++) {\r\n\t\tvar t = tris[ri];\r\n\t\tif (flipped[ri]) {\r\n\t\t\tresult.push({\r\n\t\t\t\tv0: { x: t.v0.x, y: t.v0.y, z: t.v0.z },\r\n\t\t\t\tv1: { x: t.v2.x, y: t.v2.y, z: t.v2.z },\r\n\t\t\t\tv2: { x: t.v1.x, y: t.v1.y, z: t.v1.z }\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tresult.push({\r\n\t\t\t\tv0: { x: t.v0.x, y: t.v0.y, z: t.v0.z },\r\n\t\t\t\tv1: { x: t.v1.x, y: t.v1.y, z: t.v1.z },\r\n\t\t\t\tv2: { x: t.v2.x, y: t.v2.y, z: t.v2.z }\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Flip the winding order of all triangles in a soup (reverses normals).\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>}\r\n */\r\nfunction flipSoup(tris) {\r\n\tvar result = [];\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar t = tris[i];\r\n\t\tresult.push({\r\n\t\t\tv0: { x: t.v0.x, y: t.v0.y, z: t.v0.z },\r\n\t\t\tv1: { x: t.v2.x, y: t.v2.y, z: t.v2.z },\r\n\t\t\tv2: { x: t.v1.x, y: t.v1.y, z: t.v1.z }\r\n\t\t});\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Split two meshes into inside/outside groups without combining them.\r\n *\r\n * This is the \"split-and-pick\" workflow: compute 4 groups\r\n * (A-inside-B, A-outside-B, B-inside-A, B-outside-A), then the caller\r\n * decides which groups to keep. Mirrors Kirra's computeSplits pattern.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soupA - First mesh\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soupB - Second mesh\r\n * @returns {{ groups: { aInside: Array, aOutside: Array, bInside: Array, bOutside: Array }, segments: Array }|null}\r\n */\r\nexport function splitMeshPair(soupA, soupB) {\r\n\tif (!soupA || !soupB || soupA.length === 0 || soupB.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// Step 0) Translate to origin for floating-point precision\r\n\tvar centroid = soupCentroid(soupA, soupB);\r\n\tvar cx = centroid.x, cy = centroid.y, cz = centroid.z;\r\n\tsoupA = translateSoup(soupA, -cx, -cy, -cz);\r\n\tsoupB = translateSoup(soupB, -cx, -cy, -cz);\r\n\r\n\t// Step 1) Get tagged intersection segments\r\n\tvar taggedSegments = intersectMeshPairTagged(soupA, soupB);\r\n\r\n\tif (taggedSegments.length === 0) {\r\n\t\treturn {\r\n\t\t\tgroups: {\r\n\t\t\t\taInside: [],\r\n\t\t\t\taOutside: translateSoup(soupA, cx, cy, cz),\r\n\t\t\t\tbInside: [],\r\n\t\t\t\tbOutside: translateSoup(soupB, cx, cy, cz)\r\n\t\t\t},\r\n\t\t\tsegments: []\r\n\t\t};\r\n\t}\r\n\r\n\t// Step 2) Build crossed triangle sets from tagged segments\r\n\tvar crossedSetA = {};\r\n\tvar crossedSetB = {};\r\n\tfor (var s = 0; s < taggedSegments.length; s++) {\r\n\t\tvar seg = taggedSegments[s];\r\n\t\tif (!crossedSetA[seg.idxA]) crossedSetA[seg.idxA] = [];\r\n\t\tcrossedSetA[seg.idxA].push(seg);\r\n\t\tif (!crossedSetB[seg.idxB]) crossedSetB[seg.idxB] = [];\r\n\t\tcrossedSetB[seg.idxB].push(seg);\r\n\t}\r\n\r\n\t// Step 3) Build spatial grids for ray-cast classification\r\n\tvar avgEdgeA = estimateAvgEdge(soupA);\r\n\tvar avgEdgeB = estimateAvgEdge(soupB);\r\n\tvar cellSizeA = Math.max(avgEdgeA * 2, 0.1);\r\n\tvar cellSizeB = Math.max(avgEdgeB * 2, 0.1);\r\n\r\n\tvar gridsA = {\r\n\t\txy: { grid: buildSpatialGrid(soupA, cellSizeA), cellSize: cellSizeA },\r\n\t\tyz: { grid: buildSpatialGridOnAxes(soupA, cellSizeA, function (v) { return v.y; }, function (v) { return v.z; }), cellSize: cellSizeA },\r\n\t\txz: { grid: buildSpatialGridOnAxes(soupA, cellSizeA, function (v) { return v.x; }, function (v) { return v.z; }), cellSize: cellSizeA }\r\n\t};\r\n\tvar gridsB = {\r\n\t\txy: { grid: buildSpatialGrid(soupB, cellSizeB), cellSize: cellSizeB },\r\n\t\tyz: { grid: buildSpatialGridOnAxes(soupB, cellSizeB, function (v) { return v.y; }, function (v) { return v.z; }), cellSize: cellSizeB },\r\n\t\txz: { grid: buildSpatialGridOnAxes(soupB, cellSizeB, function (v) { return v.x; }, function (v) { return v.z; }), cellSize: cellSizeB }\r\n\t};\r\n\r\n\t// Step 4) Flood-fill classify\r\n\tvar classA = classifyByFloodFill(soupA, crossedSetA, soupB, gridsB);\r\n\tvar classB = classifyByFloodFill(soupB, crossedSetB, soupA, gridsA);\r\n\r\n\t// Step 5) Split straddling triangles and classify sub-triangles.\r\n\t// The half-space test inside calibrates its normal convention by sampling\r\n\t// a few points near the intersection and ray-casting them.\r\n\tvar groupsA = splitStraddlingAndClassify(soupA, classA, crossedSetA, soupB, gridsB, \"idxB\");\r\n\tvar groupsB = splitStraddlingAndClassify(soupB, classB, crossedSetB, soupA, gridsA, \"idxA\");\r\n\r\n\t// Step 5b) Fix non-manifold edges within each split group\r\n\tif (groupsA.inside.length > 0) groupsA.inside = fixMergedNonManifold(groupsA.inside);\r\n\tif (groupsA.outside.length > 0) groupsA.outside = fixMergedNonManifold(groupsA.outside);\r\n\tif (groupsB.inside.length > 0) groupsB.inside = fixMergedNonManifold(groupsB.inside);\r\n\tif (groupsB.outside.length > 0) groupsB.outside = fixMergedNonManifold(groupsB.outside);\r\n\r\n\t// Step 6) Deduplicate seam vertices\r\n\tif (groupsA.inside.length > 0) groupsA.inside = deduplicateSeamVertices(groupsA.inside, 1e-4);\r\n\tif (groupsA.outside.length > 0) groupsA.outside = deduplicateSeamVertices(groupsA.outside, 1e-4);\r\n\tif (groupsB.inside.length > 0) groupsB.inside = deduplicateSeamVertices(groupsB.inside, 1e-4);\r\n\tif (groupsB.outside.length > 0) groupsB.outside = deduplicateSeamVertices(groupsB.outside, 1e-4);\r\n\r\n\t// Step 7) Propagate normals for consistent winding\r\n\tif (groupsA.inside.length > 0) groupsA.inside = propagateNormals(groupsA.inside);\r\n\tif (groupsA.outside.length > 0) groupsA.outside = propagateNormals(groupsA.outside);\r\n\tif (groupsB.inside.length > 0) groupsB.inside = propagateNormals(groupsB.inside);\r\n\tif (groupsB.outside.length > 0) groupsB.outside = propagateNormals(groupsB.outside);\r\n\r\n\t// Translate results back to original coordinates\r\n\treturn {\r\n\t\tgroups: {\r\n\t\t\taInside: translateSoup(groupsA.inside, cx, cy, cz),\r\n\t\t\taOutside: translateSoup(groupsA.outside, cx, cy, cz),\r\n\t\t\tbInside: translateSoup(groupsB.inside, cx, cy, cz),\r\n\t\t\tbOutside: translateSoup(groupsB.outside, cx, cy, cz)\r\n\t\t},\r\n\t\tsegments: taggedSegments\r\n\t};\r\n}\r\n\r\n/**\r\n * Merge split groups into a single result soup based on the operation type,\r\n * then weld and return the combined mesh.\r\n *\r\n * @param {{ aInside: Array, aOutside: Array, bInside: Array, bOutside: Array }} groups\r\n * @param {\"subtract\"|\"union\"|\"intersect\"} operation\r\n * @returns {{ soup: Array, points: Array, triangles: Array }|null}\r\n */\r\nexport function mergeSplitGroups(groups, operation) {\r\n\tvar combined = [];\r\n\r\n\tif (operation === \"subtract\") {\r\n\t\tfor (var ai = 0; ai < groups.aOutside.length; ai++) {\r\n\t\t\tcombined.push(groups.aOutside[ai]);\r\n\t\t}\r\n\t\tvar flippedBInside = flipSoup(groups.bInside);\r\n\t\tfor (var bi = 0; bi < flippedBInside.length; bi++) {\r\n\t\t\tcombined.push(flippedBInside[bi]);\r\n\t\t}\r\n\t} else if (operation === \"union\") {\r\n\t\tfor (var ao = 0; ao < groups.aOutside.length; ao++) {\r\n\t\t\tcombined.push(groups.aOutside[ao]);\r\n\t\t}\r\n\t\tfor (var bo = 0; bo < groups.bOutside.length; bo++) {\r\n\t\t\tcombined.push(groups.bOutside[bo]);\r\n\t\t}\r\n\t} else if (operation === \"intersect\") {\r\n\t\tfor (var aii = 0; aii < groups.aInside.length; aii++) {\r\n\t\t\tcombined.push(groups.aInside[aii]);\r\n\t\t}\r\n\t\tfor (var bii = 0; bii < groups.bInside.length; bii++) {\r\n\t\t\tcombined.push(groups.bInside[bii]);\r\n\t\t}\r\n\t} else {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (combined.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// Step: Fix non-manifold edges in the combined mesh by removing the\r\n\t// triangle that causes the least damage (fewest new open edges).\r\n\tcombined = fixMergedNonManifold(combined);\r\n\r\n\tvar finalWelded = weldVertices(combined, 1e-4);\r\n\treturn {\r\n\t\tsoup: combined,\r\n\t\tpoints: finalWelded.points,\r\n\t\ttriangles: finalWelded.triangles\r\n\t};\r\n}\r\n\r\n/**\r\n * Merge user-selected split groups into a single result.\r\n *\r\n * Each group can be independently included or excluded, and optionally\r\n * flipped (normals reversed). This is the \"super flexible\" counterpart\r\n * to mergeSplitGroups which hard-codes the classic boolean recipes.\r\n *\r\n * Selection object keys:\r\n *   aInside   {boolean|\"flip\"}  Include A-inside-B triangles; \"flip\" reverses normals\r\n *   aOutside  {boolean|\"flip\"}  Include A-outside-B triangles\r\n *   bInside   {boolean|\"flip\"}  Include B-inside-A triangles\r\n *   bOutside  {boolean|\"flip\"}  Include B-outside-A triangles\r\n *\r\n * Example — \"chop top off a cylinder\" (keep only A-outside-B):\r\n *   selectSplits(groups, { aOutside: true })\r\n *\r\n * Example — \"knife through paper, keep both sides\":\r\n *   selectSplits(groups, { aInside: true, aOutside: true })\r\n *\r\n * Example — classic subtract (A - B):\r\n *   selectSplits(groups, { aOutside: true, bInside: \"flip\" })\r\n *\r\n * @param {{ aInside: Array, aOutside: Array, bInside: Array, bOutside: Array }} groups\r\n * @param {{ aInside?: boolean|\"flip\", aOutside?: boolean|\"flip\", bInside?: boolean|\"flip\", bOutside?: boolean|\"flip\" }} selection\r\n * @returns {{ soup: Array, points: Array, triangles: Array }|null}\r\n */\r\nexport function selectSplits(groups, selection) {\r\n\tif (!groups || !selection) return null;\r\n\tvar sel = selection;\r\n\tvar combined = [];\r\n\r\n\t// Step 1) Collect selected groups, flipping where requested\r\n\tvar groupNames = [\"aInside\", \"aOutside\", \"bInside\", \"bOutside\"];\r\n\tfor (var g = 0; g < groupNames.length; g++) {\r\n\t\tvar gName = groupNames[g];\r\n\t\tvar flag = sel[gName];\r\n\t\tif (!flag) continue;\r\n\t\tvar src = groups[gName];\r\n\t\tif (!src || src.length === 0) continue;\r\n\r\n\t\tif (flag === \"flip\") {\r\n\t\t\tvar flipped = flipSoup(src);\r\n\t\t\tfor (var fi = 0; fi < flipped.length; fi++) combined.push(flipped[fi]);\r\n\t\t} else {\r\n\t\t\tfor (var si = 0; si < src.length; si++) combined.push(src[si]);\r\n\t\t}\r\n\t}\r\n\r\n\tif (combined.length === 0) return null;\r\n\r\n\t// Step 2) Fix non-manifold edges\r\n\tcombined = fixMergedNonManifold(combined);\r\n\r\n\t// Step 3) Weld and return\r\n\tvar finalWelded = weldVertices(combined, 1e-4);\r\n\treturn {\r\n\t\tsoup: combined,\r\n\t\tpoints: finalWelded.points,\r\n\t\ttriangles: finalWelded.triangles\r\n\t};\r\n}\r\n\r\n/**\r\n * Decompose the 4 binary split groups into individual connected components.\r\n *\r\n * After splitMeshPair returns {aInside, aOutside, bInside, bOutside}, this\r\n * function finds the connected components within each group and returns a\r\n * flat array of component objects. For the \"convoluted block crossing a\r\n * terrain twice\" case this produces 9 components: 4 terrain pieces + 5\r\n * convoluted pieces.\r\n *\r\n * Each component carries metadata:\r\n *   mesh       \"A\" | \"B\"             — which input mesh it came from\r\n *   side       \"inside\" | \"outside\"  — relative to the other mesh\r\n *   index      number                — component index within its group\r\n *   soup       TriangleSoup          — the triangles\r\n *   triCount   number                — soup.length\r\n *\r\n * @param {{ aInside: Array, aOutside: Array, bInside: Array, bOutside: Array }} groups\r\n * @param {{ pooled?: boolean, tolerance?: number }} [options] `pooled: true` routes each\r\n *        group through the integer-id `findConnectedComponentsPooled` fast path (identical\r\n *        result, far less string hashing at scale). Default (omitted) is the classic path.\r\n * @returns {Array<{ mesh: string, side: string, index: number, soup: Array, triCount: number }>}\r\n */\r\nexport function splitToComponents(groups, options) {\r\n\tif (!groups) return [];\r\n\tvar result = [];\r\n\tvar pooled = !!(options && options.pooled);\r\n\r\n\tvar groupDefs = [\r\n\t\t{ key: \"aInside\",  mesh: \"A\", side: \"inside\"  },\r\n\t\t{ key: \"aOutside\", mesh: \"A\", side: \"outside\" },\r\n\t\t{ key: \"bInside\",  mesh: \"B\", side: \"inside\"  },\r\n\t\t{ key: \"bOutside\", mesh: \"B\", side: \"outside\" }\r\n\t];\r\n\r\n\tfor (var g = 0; g < groupDefs.length; g++) {\r\n\t\tvar def = groupDefs[g];\r\n\t\tvar soup = groups[def.key];\r\n\t\tif (!soup || soup.length === 0) continue;\r\n\r\n\t\tvar components = pooled\r\n\t\t\t? findConnectedComponentsPooled(soup, options)\r\n\t\t\t: findConnectedComponents(soup);\r\n\t\tfor (var c = 0; c < components.length; c++) {\r\n\t\t\tresult.push({\r\n\t\t\t\tmesh: def.mesh,\r\n\t\t\t\tside: def.side,\r\n\t\t\t\tindex: c,\r\n\t\t\t\tsoup: components[c],\r\n\t\t\t\ttriCount: components[c].length\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Merge tiny disconnected fragments into their nearest same-group sibling.\r\n *\r\n * After splitToComponents, classification noise can produce small stray\r\n * components within a binary group (e.g. A-inside).  This function absorbs\r\n * any component whose triangle count is below `threshold` into the nearest\r\n * larger component of the same (mesh, side) group, measured by centroid\r\n * Euclidean distance.\r\n *\r\n * @param {Array<{ mesh: string, side: string, index: number, soup: Array, triCount: number }>} comps\r\n * @param {number} [threshold=50] - max tri count to be considered \"small\"\r\n * @returns {Array<{ mesh: string, side: string, index: number, soup: Array, triCount: number }>}\r\n */\r\nexport function mergeSmallComponents(comps, threshold) {\r\n\tif (!comps || comps.length === 0) return comps;\r\n\tif (threshold === undefined || threshold === null) threshold = 50;\r\n\r\n\t// Step 1) Compute centroid for each component\r\n\tfor (var ci = 0; ci < comps.length; ci++) {\r\n\t\tvar cp = comps[ci];\r\n\t\tvar sx = 0, sy = 0, sz = 0, n = 0;\r\n\t\tfor (var ti = 0; ti < cp.soup.length; ti++) {\r\n\t\t\tvar t = cp.soup[ti];\r\n\t\t\tsx += t.v0.x + t.v1.x + t.v2.x;\r\n\t\t\tsy += t.v0.y + t.v1.y + t.v2.y;\r\n\t\t\tsz += t.v0.z + t.v1.z + t.v2.z;\r\n\t\t\tn += 3;\r\n\t\t}\r\n\t\tcp._cx = n > 0 ? sx / n : 0;\r\n\t\tcp._cy = n > 0 ? sy / n : 0;\r\n\t\tcp._cz = n > 0 ? sz / n : 0;\r\n\t}\r\n\r\n\t// Step 2) Group by binary key (mesh + side)\r\n\tvar groups = {};\r\n\tfor (var gi = 0; gi < comps.length; gi++) {\r\n\t\tvar gk = comps[gi].mesh + \"|\" + comps[gi].side;\r\n\t\tif (!groups[gk]) groups[gk] = [];\r\n\t\tgroups[gk].push(gi);\r\n\t}\r\n\r\n\t// Step 3) For each group, absorb small components into nearest large sibling\r\n\tvar absorbed = {};\r\n\tfor (var gkey in groups) {\r\n\t\tvar members = groups[gkey];\r\n\t\tvar largeIdxs = [];\r\n\t\tvar smallIdxs = [];\r\n\t\tfor (var mi = 0; mi < members.length; mi++) {\r\n\t\t\tif (comps[members[mi]].triCount > threshold) {\r\n\t\t\t\tlargeIdxs.push(members[mi]);\r\n\t\t\t} else {\r\n\t\t\t\tsmallIdxs.push(members[mi]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (largeIdxs.length === 0 || smallIdxs.length === 0) continue;\r\n\r\n\t\tfor (var si = 0; si < smallIdxs.length; si++) {\r\n\t\t\tvar sc = comps[smallIdxs[si]];\r\n\t\t\tvar bestDist = Infinity;\r\n\t\t\tvar bestIdx = largeIdxs[0];\r\n\t\t\tfor (var li = 0; li < largeIdxs.length; li++) {\r\n\t\t\t\tvar lc = comps[largeIdxs[li]];\r\n\t\t\t\tvar dx = sc._cx - lc._cx;\r\n\t\t\t\tvar dy = sc._cy - lc._cy;\r\n\t\t\t\tvar dz = sc._cz - lc._cz;\r\n\t\t\t\tvar d2 = dx * dx + dy * dy + dz * dz;\r\n\t\t\t\tif (d2 < bestDist) { bestDist = d2; bestIdx = largeIdxs[li]; }\r\n\t\t\t}\r\n\t\t\t// Absorb: append small soup into the large component\r\n\t\t\tvar target = comps[bestIdx];\r\n\t\t\tfor (var ai = 0; ai < sc.soup.length; ai++) {\r\n\t\t\t\ttarget.soup.push(sc.soup[ai]);\r\n\t\t\t}\r\n\t\t\ttarget.triCount += sc.triCount;\r\n\t\t\tabsorbed[smallIdxs[si]] = true;\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 4) Filter out absorbed components and re-index\r\n\tvar out = [];\r\n\tvar prevKey = \"\";\r\n\tvar prevIdx = 0;\r\n\tfor (var oi = 0; oi < comps.length; oi++) {\r\n\t\tif (absorbed[oi]) continue;\r\n\t\tvar oc = comps[oi];\r\n\t\tvar ok = oc.mesh + \"|\" + oc.side;\r\n\t\tif (ok !== prevKey) { prevIdx = 0; prevKey = ok; }\r\n\t\toc.index = prevIdx++;\r\n\t\tdelete oc._cx;\r\n\t\tdelete oc._cy;\r\n\t\tdelete oc._cz;\r\n\t\tout.push(oc);\r\n\t}\r\n\treturn out;\r\n}\r\n\r\n/**\r\n * Merge an arbitrary list of component soups into a single welded result.\r\n *\r\n * Works with the output of splitToComponents — pass in the components the\r\n * user has selected (with optional flip flags).\r\n *\r\n * @param {Array<{ soup: Array, flip?: boolean }>} picks\r\n * @returns {{ soup: Array, points: Array, triangles: Array }|null}\r\n */\r\nexport function mergeComponents(picks) {\r\n\tif (!picks || picks.length === 0) return null;\r\n\tvar combined = [];\r\n\r\n\tfor (var i = 0; i < picks.length; i++) {\r\n\t\tvar src = picks[i].soup;\r\n\t\tif (!src || src.length === 0) continue;\r\n\r\n\t\tif (picks[i].flip) {\r\n\t\t\tvar flipped = flipSoup(src);\r\n\t\t\tfor (var fi = 0; fi < flipped.length; fi++) combined.push(flipped[fi]);\r\n\t\t} else {\r\n\t\t\tfor (var si = 0; si < src.length; si++) combined.push(src[si]);\r\n\t\t}\r\n\t}\r\n\r\n\tif (combined.length === 0) return null;\r\n\tcombined = fixMergedNonManifold(combined);\r\n\tvar finalWelded = weldVertices(combined, 1e-4);\r\n\treturn {\r\n\t\tsoup: combined,\r\n\t\tpoints: finalWelded.points,\r\n\t\ttriangles: finalWelded.triangles\r\n\t};\r\n}\r\n\r\n/**\r\n * Detect non-manifold edges in a merged triangle soup and remove offending\r\n * triangles. For each non-manifold edge (shared by 3+ tris), pick the\r\n * triangle whose removal results in the best net open-edge change.\r\n *\r\n * @param {Array} soup - combined triangle soup (modified in-place)\r\n * @returns {Array} cleaned soup\r\n */\r\nfunction fixMergedNonManifold(soup) {\r\n\tvar PREC = 6;\r\n\tfunction vk2(v) {\r\n\t\treturn v.x.toFixed(PREC) + \",\" + v.y.toFixed(PREC) + \",\" + v.z.toFixed(PREC);\r\n\t}\r\n\tfunction ek2(a, b) { return a < b ? a + \"|\" + b : b + \"|\" + a; }\r\n\r\n\tvar maxPasses = 5;\r\n\tfor (var pass = 0; pass < maxPasses; pass++) {\r\n\t\t// Step 1) Build edge count map\r\n\t\tvar edgeCnt = {};\r\n\t\tvar triEdges = [];  // triEdges[i] = [ek0, ek1, ek2]\r\n\t\tfor (var i = 0; i < soup.length; i++) {\r\n\t\t\tvar t = soup[i];\r\n\t\t\tvar k0 = vk2(t.v0), k1 = vk2(t.v1), k2 = vk2(t.v2);\r\n\t\t\tvar e0 = ek2(k0, k1), e1 = ek2(k1, k2), e2 = ek2(k2, k0);\r\n\t\t\ttriEdges.push([e0, e1, e2]);\r\n\t\t\tif (!edgeCnt[e0]) edgeCnt[e0] = [];\r\n\t\t\tedgeCnt[e0].push(i);\r\n\t\t\tif (!edgeCnt[e1]) edgeCnt[e1] = [];\r\n\t\t\tedgeCnt[e1].push(i);\r\n\t\t\tif (!edgeCnt[e2]) edgeCnt[e2] = [];\r\n\t\t\tedgeCnt[e2].push(i);\r\n\t\t}\r\n\r\n\t\t// Step 2) Find all non-manifold edges\r\n\t\tvar nmEdges = [];\r\n\t\tfor (var ek3 in edgeCnt) {\r\n\t\t\tif (edgeCnt[ek3].length > 2) nmEdges.push(ek3);\r\n\t\t}\r\n\t\tif (nmEdges.length === 0) break;\r\n\r\n\t\t// Step 3) For each non-manifold edge, evaluate removing each candidate\r\n\t\tvar toRemove = {};\r\n\t\tfor (var ni = 0; ni < nmEdges.length; ni++) {\r\n\t\t\tvar nmTriIdxs = edgeCnt[nmEdges[ni]];\r\n\t\t\tvar bestIdx = -1;\r\n\t\t\tvar bestNet = Infinity;\r\n\r\n\t\t\tfor (var ci = 0; ci < nmTriIdxs.length; ci++) {\r\n\t\t\t\tvar ti = nmTriIdxs[ci];\r\n\t\t\t\tif (toRemove[ti]) continue;\r\n\t\t\t\t// Compute net open-edge change if we remove tri ti:\r\n\t\t\t\t// For each of its 3 edges:\r\n\t\t\t\t//   count==1 (open) -> 0: net -1 (lose an open edge)\r\n\t\t\t\t//   count==2 (manifold) -> 1: net +1 (gain an open edge)\r\n\t\t\t\t//   count>=3 (non-manifold) -> count-1: net 0\r\n\t\t\t\tvar net = 0;\r\n\t\t\t\tvar edges = triEdges[ti];\r\n\t\t\t\tfor (var ei = 0; ei < 3; ei++) {\r\n\t\t\t\t\tvar cnt = edgeCnt[edges[ei]].length;\r\n\t\t\t\t\tif (cnt === 1) net -= 1;\r\n\t\t\t\t\telse if (cnt === 2) net += 1;\r\n\t\t\t\t\t// count >= 3: no change in open edges\r\n\t\t\t\t}\r\n\t\t\t\tif (net < bestNet) {\r\n\t\t\t\t\tbestNet = net;\r\n\t\t\t\t\tbestIdx = ti;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Only remove if net change <= 0 (doesn't worsen open edges)\r\n\t\t\tif (bestIdx >= 0 && bestNet <= 0) {\r\n\t\t\t\ttoRemove[bestIdx] = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Step 4) Remove marked triangles\r\n\t\tvar removeList = [];\r\n\t\tfor (var rk in toRemove) removeList.push(Number(rk));\r\n\t\tif (removeList.length === 0) break;\r\n\t\tremoveList.sort(function(a, b) { return b - a; });\r\n\t\tfor (var ri = 0; ri < removeList.length; ri++) {\r\n\t\t\tsoup.splice(removeList[ri], 1);\r\n\t\t}\r\n\t}\r\n\r\n\treturn soup;\r\n}\r\n\r\n/**\r\n * Perform a boolean operation on two triangle meshes.\r\n *\r\n * Internally calls splitMeshPair() to compute the 4 split groups,\r\n * then mergeSplitGroups() to combine based on the operation.\r\n *\r\n * Options (all optional):\r\n *   preRepair   {boolean}  Resolve T-junctions and weld boundary vertices\r\n *                          on both inputs before splitting. Default: false.\r\n *   fillGaps    {boolean}  After the boolean, fill closed open-edge loops\r\n *                          with fan triangles (fillOpenEdgeLoops). Default: false.\r\n *   forceClose  {boolean}  After the boolean, force-close using spatial-proximity\r\n *                          indexed fill (forceCloseIndexedMesh). Default: false.\r\n *   tolerance   {number}   Vertex snapping tolerance for pre-repair / fill.\r\n *                          Default: estimateAvgEdge * 0.01.\r\n *   tjunctionPasses {number} Max T-junction resolution passes. Default: 3.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soupA\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soupB\r\n * @param {\"subtract\"|\"union\"|\"intersect\"} operation\r\n * @param {Object} [options]\r\n * @returns {{ soup: Array, points: Array, triangles: Array }|null}\r\n */\r\nexport function boolean(soupA, soupB, operation, options) {\r\n\tif (!soupA || !soupB || soupA.length === 0 || soupB.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tvar opts = options || {};\r\n\r\n\t// Step 1) Optional pre-repair: resolve T-junctions + weld boundary\r\n\tif (opts.preRepair) {\r\n\t\tvar tolA = opts.tolerance !== undefined ? opts.tolerance : estimateAvgEdge(soupA) * 0.01;\r\n\t\tvar tolB = opts.tolerance !== undefined ? opts.tolerance : estimateAvgEdge(soupB) * 0.01;\r\n\t\tvar passes = opts.tjunctionPasses !== undefined ? opts.tjunctionPasses : 3;\r\n\t\tsoupA = resolveTJunctions(soupA, tolA, passes);\r\n\t\tsoupA = weldBoundaryVertices(soupA, tolA);\r\n\t\tsoupB = resolveTJunctions(soupB, tolB, passes);\r\n\t\tsoupB = weldBoundaryVertices(soupB, tolB);\r\n\t}\r\n\r\n\t// Step 2) Split meshes into inside/outside groups\r\n\tvar split = splitMeshPair(soupA, soupB);\r\n\tif (!split) return null;\r\n\r\n\t// Step 3) Handle no-intersection case\r\n\tif (split.segments.length === 0) {\r\n\t\tvar resultSoup;\r\n\t\tif (operation === \"union\") {\r\n\t\t\tresultSoup = soupA.concat(soupB);\r\n\t\t} else if (operation === \"intersect\") {\r\n\t\t\treturn null;\r\n\t\t} else {\r\n\t\t\tresultSoup = soupA.slice();\r\n\t\t}\r\n\t\tvar welded = weldVertices(resultSoup, 0);\r\n\t\treturn { soup: resultSoup, points: welded.points, triangles: welded.triangles };\r\n\t}\r\n\r\n\t// Step 4) Merge groups based on operation\r\n\tvar result = mergeSplitGroups(split.groups, operation);\r\n\tif (!result) return null;\r\n\r\n\t// Step 5) Optional post-repair: fill open-edge loops with fan triangles\r\n\tif (opts.fillGaps && result.soup) {\r\n\t\tvar fillTol = opts.tolerance !== undefined ? opts.tolerance : 1e-6;\r\n\t\tresult.soup = fillOpenEdgeLoops(result.soup, fillTol);\r\n\t\tvar rw1 = weldVertices(result.soup, 1e-4);\r\n\t\tresult.points = rw1.points;\r\n\t\tresult.triangles = rw1.triangles;\r\n\t}\r\n\r\n\t// Step 6) Optional post-repair: force-close via indexed spatial fill\r\n\tif (opts.forceClose && result.soup) {\r\n\t\tvar w = weldVertices(result.soup, 0.0001);\r\n\t\tvar closed = forceCloseIndexedMesh(w.points, w.triangles);\r\n\t\tvar newSoup = [];\r\n\t\tfor (var ci = 0; ci < closed.triangles.length; ci++) {\r\n\t\t\tvar cv = closed.triangles[ci].vertices;\r\n\t\t\tnewSoup.push({\r\n\t\t\t\tv0: { x: cv[0].x, y: cv[0].y, z: cv[0].z },\r\n\t\t\t\tv1: { x: cv[1].x, y: cv[1].y, z: cv[1].z },\r\n\t\t\t\tv2: { x: cv[2].x, y: cv[2].y, z: cv[2].z }\r\n\t\t\t});\r\n\t\t}\r\n\t\tresult.soup = newSoup;\r\n\t\tvar rw2 = weldVertices(result.soup, 1e-4);\r\n\t\tresult.points = rw2.points;\r\n\t\tresult.triangles = rw2.triangles;\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\r\n * @module repair/removeDegenerates\r\n *\r\n * Remove degenerate and sliver triangles from triangle soup.\r\n * Degenerate: area below minimum threshold.\r\n * Sliver: minimum altitude / maximum edge length below ratio threshold.\r\n */\r\n\r\nimport { triangleArea3D, dist3 } from \"../util/math.js\";\r\n\r\n/**\r\n * Remove degenerate and sliver triangles from a triangle soup.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @param {number} [minArea=1e-6] - Minimum triangle area in square units\r\n * @param {number} [sliverRatio=0.01] - Min altitude / max edge threshold\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Filtered triangle soup\r\n */\r\nexport function removeDegenerateTriangles(tris, minArea, sliverRatio) {\r\n\tif (typeof minArea === \"undefined\") minArea = 1e-6;\r\n\tif (typeof sliverRatio === \"undefined\") sliverRatio = 0.01;\r\n\r\n\tvar result = [];\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar area = triangleArea3D(tri);\r\n\t\tif (area < minArea) continue;\r\n\t\tvar e0 = dist3(tri.v0, tri.v1);\r\n\t\tvar e1 = dist3(tri.v1, tri.v2);\r\n\t\tvar e2 = dist3(tri.v2, tri.v0);\r\n\t\tvar maxEdge = Math.max(e0, e1, e2);\r\n\t\tif (maxEdge > 0) {\r\n\t\t\tvar minAlt = (2 * area) / maxEdge;\r\n\t\t\tif (minAlt / maxEdge < sliverRatio) continue;\r\n\t\t}\r\n\t\tresult.push(tri);\r\n\t}\r\n\treturn result;\r\n}\r\n","/**\r\n * @module repair/stitchEdges\r\n *\r\n * Stitch open boundary edges that are close in 3D space.\r\n * Finds individual boundary edge endpoints within tolerance and\r\n * connects them with quads (2 triangles each).\r\n */\r\n\r\nimport { dist3, vKey, edgeKey } from \"../util/math.js\";\r\n\r\n/**\r\n * Stitch open boundary edges that are close in 3D space.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @param {number} [stitchTolerance=1.0] - Max 3D distance to connect boundary edges\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Additional stitch triangles\r\n */\r\nexport function stitchByProximity(tris, stitchTolerance) {\r\n\tif (typeof stitchTolerance === \"undefined\") stitchTolerance = 1.0;\r\n\r\n\tvar edgeMap = {};\r\n\tvar halfEdges = {};\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar verts = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar keys = [vKey(verts[0]), vKey(verts[1]), vKey(verts[2])];\r\n\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tvar ne = (e + 1) % 3;\r\n\t\t\tvar ek = edgeKey(keys[e], keys[ne]);\r\n\t\t\tif (!edgeMap[ek]) {\r\n\t\t\t\tedgeMap[ek] = { count: 0, v0: verts[e], v1: verts[ne], k0: keys[e], k1: keys[ne] };\r\n\t\t\t}\r\n\t\t\tedgeMap[ek].count++;\r\n\t\t\thalfEdges[keys[e] + \"|\" + keys[ne]] = true;\r\n\t\t}\r\n\t}\r\n\r\n\tvar boundaryEdges = [];\r\n\tfor (var ek2 in edgeMap) {\r\n\t\tif (edgeMap[ek2].count === 1) {\r\n\t\t\tvar be = edgeMap[ek2];\r\n\t\t\tif (halfEdges[be.k0 + \"|\" + be.k1]) {\r\n\t\t\t\tboundaryEdges.push({ v0: be.v1, v1: be.v0, k0: be.k1, k1: be.k0 });\r\n\t\t\t} else {\r\n\t\t\t\tboundaryEdges.push({ v0: be.v0, v1: be.v1, k0: be.k0, k1: be.k1 });\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (boundaryEdges.length === 0) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tvar cellSize = Math.max(stitchTolerance * 3, 0.1);\r\n\tvar vertGrid = {};\r\n\r\n\tfunction gridKey(v) {\r\n\t\tvar gx = Math.floor(v.x / cellSize);\r\n\t\tvar gy = Math.floor(v.y / cellSize);\r\n\t\tvar gz = Math.floor(v.z / cellSize);\r\n\t\treturn gx + \",\" + gy + \",\" + gz;\r\n\t}\r\n\r\n\tfor (var bi = 0; bi < boundaryEdges.length; bi++) {\r\n\t\tvar bEdge = boundaryEdges[bi];\r\n\t\tfor (var vi = 0; vi < 2; vi++) {\r\n\t\t\tvar vert = vi === 0 ? bEdge.v0 : bEdge.v1;\r\n\t\t\tvar gk = gridKey(vert);\r\n\t\t\tif (!vertGrid[gk]) vertGrid[gk] = [];\r\n\t\t\tvertGrid[gk].push({ edgeIdx: bi, vertIdx: vi, vertex: vert });\r\n\t\t}\r\n\t}\r\n\r\n\tvar usedEdges = {};\r\n\tvar extraTris = [];\r\n\r\n\tfor (var si = 0; si < boundaryEdges.length; si++) {\r\n\t\tif (usedEdges[si]) continue;\r\n\t\tvar srcEdge = boundaryEdges[si];\r\n\r\n\t\tvar bestMatch = -1;\r\n\t\tvar bestTotalDist = Infinity;\r\n\t\tvar bestFlip = false;\r\n\r\n\t\tvar gx0 = Math.floor(srcEdge.v0.x / cellSize);\r\n\t\tvar gy0 = Math.floor(srcEdge.v0.y / cellSize);\r\n\t\tvar gz0 = Math.floor(srcEdge.v0.z / cellSize);\r\n\r\n\t\tvar candidates = {};\r\n\t\tfor (var dx = -1; dx <= 1; dx++) {\r\n\t\t\tfor (var dy = -1; dy <= 1; dy++) {\r\n\t\t\t\tfor (var dz = -1; dz <= 1; dz++) {\r\n\t\t\t\t\tvar checkKey = (gx0 + dx) + \",\" + (gy0 + dy) + \",\" + (gz0 + dz);\r\n\t\t\t\t\tvar cell = vertGrid[checkKey];\r\n\t\t\t\t\tif (!cell) continue;\r\n\t\t\t\t\tfor (var ci = 0; ci < cell.length; ci++) {\r\n\t\t\t\t\t\tvar cand = cell[ci];\r\n\t\t\t\t\t\tif (cand.edgeIdx === si || usedEdges[cand.edgeIdx]) continue;\r\n\t\t\t\t\t\tcandidates[cand.edgeIdx] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (var candIdx in candidates) {\r\n\t\t\tvar candEdge = boundaryEdges[candIdx];\r\n\r\n\t\t\tvar d00 = dist3(srcEdge.v0, candEdge.v0);\r\n\t\t\tvar d11 = dist3(srcEdge.v1, candEdge.v1);\r\n\t\t\tvar d01 = dist3(srcEdge.v0, candEdge.v1);\r\n\t\t\tvar d10 = dist3(srcEdge.v1, candEdge.v0);\r\n\r\n\t\t\tvar totalSame = d00 + d11;\r\n\t\t\tvar totalFlip = d01 + d10;\r\n\r\n\t\t\tif (totalSame <= totalFlip) {\r\n\t\t\t\tif (d00 <= stitchTolerance && d11 <= stitchTolerance && totalSame < bestTotalDist) {\r\n\t\t\t\t\tbestMatch = parseInt(candIdx);\r\n\t\t\t\t\tbestTotalDist = totalSame;\r\n\t\t\t\t\tbestFlip = false;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (d01 <= stitchTolerance && d10 <= stitchTolerance && totalFlip < bestTotalDist) {\r\n\t\t\t\t\tbestMatch = parseInt(candIdx);\r\n\t\t\t\t\tbestTotalDist = totalFlip;\r\n\t\t\t\t\tbestFlip = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (bestMatch >= 0) {\r\n\t\t\tvar matchEdge = boundaryEdges[bestMatch];\r\n\t\t\tusedEdges[si] = true;\r\n\t\t\tusedEdges[bestMatch] = true;\r\n\r\n\t\t\tvar mV0 = bestFlip ? matchEdge.v1 : matchEdge.v0;\r\n\t\t\tvar mV1 = bestFlip ? matchEdge.v0 : matchEdge.v1;\r\n\r\n\t\t\textraTris.push({ v0: srcEdge.v0, v1: srcEdge.v1, v2: mV0 });\r\n\t\t\textraTris.push({ v0: srcEdge.v1, v1: mV1, v2: mV0 });\r\n\t\t}\r\n\t}\r\n\r\n\treturn extraTris;\r\n}\r\n","/**\r\n * @module repair/cleanCrossing\r\n *\r\n * Remove duplicate/conflicting triangles that cause over-shared edges (count > 2).\r\n *\r\n * Two-pass approach:\r\n *   Pass 1: For each over-shared edge, sort triangles by area (largest first),\r\n *           mark the smallest for removal until only 2 remain per edge.\r\n *   Pass 2: Also remove exact fingerprint duplicates among remaining triangles.\r\n */\r\n\r\nimport { triangleArea3D, vKey, edgeKey } from \"../util/math.js\";\r\n\r\n/**\r\n * Remove duplicate/conflicting triangles that cause over-shared edges.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Cleaned triangle soup\r\n */\r\nexport function cleanCrossingTriangles(tris) {\r\n\tvar areas = [];\r\n\tvar edgeToTris = {};\r\n\tvar triKeys = [];\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tareas.push(triangleArea3D(tri));\r\n\t\tvar k0 = vKey(tri.v0);\r\n\t\tvar k1 = vKey(tri.v1);\r\n\t\tvar k2 = vKey(tri.v2);\r\n\t\ttriKeys.push([k0, k1, k2]);\r\n\r\n\t\tvar edges = [edgeKey(k0, k1), edgeKey(k1, k2), edgeKey(k2, k0)];\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tif (!edgeToTris[edges[e]]) edgeToTris[edges[e]] = [];\r\n\t\t\tedgeToTris[edges[e]].push(i);\r\n\t\t}\r\n\t}\r\n\r\n\tvar removeSet = {};\r\n\r\n\tfor (var ek in edgeToTris) {\r\n\t\tvar triList = edgeToTris[ek];\r\n\t\tif (triList.length <= 2) continue;\r\n\r\n\t\tvar sorted = triList.slice().sort(function (a, b) { return areas[b] - areas[a]; });\r\n\t\tfor (var r = 2; r < sorted.length; r++) {\r\n\t\t\tremoveSet[sorted[r]] = true;\r\n\t\t}\r\n\t}\r\n\r\n\tvar seenFingerprints = {};\r\n\r\n\tfor (var j = 0; j < tris.length; j++) {\r\n\t\tif (removeSet[j]) continue;\r\n\r\n\t\tvar keys = triKeys[j].slice().sort();\r\n\t\tvar fingerprint = keys.join(\"||\");\r\n\t\tif (seenFingerprints[fingerprint]) {\r\n\t\t\tremoveSet[j] = true;\r\n\t\t} else {\r\n\t\t\tseenFingerprints[fingerprint] = true;\r\n\t\t}\r\n\t}\r\n\r\n\tvar removedCount = Object.keys(removeSet).length;\r\n\tif (removedCount === 0) {\r\n\t\treturn tris;\r\n\t}\r\n\r\n\tvar result = [];\r\n\tfor (var k = 0; k < tris.length; k++) {\r\n\t\tif (!removeSet[k]) {\r\n\t\t\tresult.push(tris[k]);\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\r\n * @module repair/boundaryLoops\r\n *\r\n * Boundary loop extraction, triangulation, and capping for triangle meshes.\r\n * Handles open surfaces by detecting boundary edges, chaining them into loops,\r\n * and triangulating the loops to produce cap polygons.\r\n */\r\n\r\nimport Delaunator from \"delaunator\";\r\nimport Constrainautor from \"@kninnug/constrainautor\";\r\nimport { dist3, vKey, edgeKey, countOpenEdges } from \"../util/math.js\";\r\nimport { weldVertices, weldedToSoup } from \"./weldVertices.js\";\r\nimport { cleanCrossingTriangles } from \"./cleanCrossing.js\";\r\n\r\n/**\r\n * Extract boundary loops from triangle soup.\r\n * Boundary edges appear exactly once in the edge count map.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @returns {{ loops: Array<Array<{x,y,z}>>, boundaryEdgeCount: number, overSharedEdgeCount: number }}\r\n */\r\nexport function extractBoundaryLoops(tris) {\r\n\tvar edgeMap = {};\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar verts = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar keys = [vKey(verts[0]), vKey(verts[1]), vKey(verts[2])];\r\n\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tvar ne = (e + 1) % 3;\r\n\t\t\tvar ek = edgeKey(keys[e], keys[ne]);\r\n\t\t\tif (!edgeMap[ek]) {\r\n\t\t\t\tedgeMap[ek] = { count: 0, v0: verts[e], v1: verts[ne], k0: keys[e], k1: keys[ne] };\r\n\t\t\t}\r\n\t\t\tedgeMap[ek].count++;\r\n\t\t}\r\n\t}\r\n\r\n\tvar boundaryEdges = [];\r\n\tvar overSharedCount = 0;\r\n\tfor (var ek2 in edgeMap) {\r\n\t\tif (edgeMap[ek2].count === 1) {\r\n\t\t\tboundaryEdges.push(edgeMap[ek2]);\r\n\t\t} else if (edgeMap[ek2].count > 2) {\r\n\t\t\toverSharedCount++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (boundaryEdges.length === 0) {\r\n\t\treturn { loops: [], boundaryEdgeCount: 0, overSharedEdgeCount: overSharedCount };\r\n\t}\r\n\r\n\t// Chain boundary edges into loops by consuming UNDIRECTED edges.\r\n\t//\r\n\t// Two hard-won lessons baked in here (2026-06-11, real mine data):\r\n\t// 1. Don't mark VERTICES used — a pinch vertex where 2+ loops meet\r\n\t//    (degree 4, 6, ...) gets consumed by the first loop and the other\r\n\t//    petals can never close. Consume EDGES; a pinch vertex then resolves\r\n\t//    into separate simple loops naturally.\r\n\t// 2. Don't walk by triangle WINDING — merged boolean results can contain\r\n\t//    regions of opposite winding (user-flipped normals, mixed Z+/Z-\r\n\t//    regions), so directed half-edges dead-end. Chain undirected edges;\r\n\t//    triangulateLoop() corrects cap orientation via the Newell normal.\r\n\tvar edges = [];\r\n\tvar incident = {}; // vertex key -> array of edge indices\r\n\tfor (var b = 0; b < boundaryEdges.length; b++) {\r\n\t\tvar be = boundaryEdges[b];\r\n\t\tedges.push({ k0: be.k0, k1: be.k1, v0: be.v0, v1: be.v1, used: false });\r\n\t\t(incident[be.k0] = incident[be.k0] || []).push(b);\r\n\t\t(incident[be.k1] = incident[be.k1] || []).push(b);\r\n\t}\r\n\r\n\tvar loops = [];\r\n\r\n\tfor (var startEi = 0; startEi < edges.length; startEi++) {\r\n\t\tif (edges[startEi].used) continue;\r\n\r\n\t\tvar first = edges[startEi];\r\n\t\tfirst.used = true;\r\n\t\tvar startKey = first.k0;\r\n\t\tvar loop = [first.v0];\r\n\t\tvar curKey = first.k1;\r\n\t\tvar curVert = first.v1;\r\n\t\tvar safety = edges.length + 1;\r\n\t\tvar closed = false;\r\n\r\n\t\twhile (safety-- > 0) {\r\n\t\t\tif (curKey === startKey) { closed = true; break; }\r\n\t\t\tloop.push(curVert);\r\n\r\n\t\t\tvar inc = incident[curKey];\r\n\t\t\tvar next = null;\r\n\t\t\tfor (var ii = 0; ii < (inc ? inc.length : 0); ii++) {\r\n\t\t\t\tvar cand = edges[inc[ii]];\r\n\t\t\t\tif (cand.used) continue;\r\n\t\t\t\tnext = cand;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (!next) break; // dead end — dangling chain, not closable\r\n\r\n\t\t\tnext.used = true;\r\n\t\t\tif (next.k0 === curKey) { curKey = next.k1; curVert = next.v1; }\r\n\t\t\telse { curKey = next.k0; curVert = next.v0; }\r\n\t\t}\r\n\r\n\t\tif (closed && loop.length >= 3) {\r\n\t\t\t// A walk that routes THROUGH a pinch vertex merges two petals into one\r\n\t\t\t// self-touching loop (repeated vertex). Downstream CDT (Constrainautor)\r\n\t\t\t// infinite-loops on duplicate points, so split into simple loops here.\r\n\t\t\tvar simple = _splitSelfTouching(loop);\r\n\t\t\tfor (var si = 0; si < simple.length; si++) {\r\n\t\t\t\tloops.push(simple[si]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn { loops: loops, boundaryEdgeCount: boundaryEdges.length, overSharedEdgeCount: overSharedCount };\r\n}\r\n\r\n/**\r\n * Split a closed (cyclic) vertex loop containing repeated vertices into\r\n * simple sub-loops. Standard stack-based cycle extraction: when a vertex key\r\n * repeats, the segment between its two occurrences is one simple loop.\r\n * @private\r\n * @param {Array<{x,y,z}>} loop\r\n * @returns {Array<Array<{x,y,z}>>} Simple loops (each >= 3 verts, no repeats)\r\n */\r\nfunction _splitSelfTouching(loop) {\r\n\tvar out = [];\r\n\tvar stack = [];\r\n\tvar indexOf = {};\r\n\r\n\tfor (var i = 0; i < loop.length; i++) {\r\n\t\tvar k = vKey(loop[i]);\r\n\t\tif (indexOf[k] !== undefined) {\r\n\t\t\tvar at = indexOf[k];\r\n\t\t\tvar cycle = stack.splice(at);\r\n\t\t\tfor (var c = 0; c < cycle.length; c++) delete indexOf[cycle[c].k];\r\n\t\t\tif (cycle.length >= 3) {\r\n\t\t\t\tout.push(cycle.map(function (e) { return e.v; }));\r\n\t\t\t}\r\n\t\t}\r\n\t\tindexOf[k] = stack.length;\r\n\t\tstack.push({ k: k, v: loop[i] });\r\n\t}\r\n\r\n\tif (stack.length >= 3) {\r\n\t\tout.push(stack.map(function (e) { return e.v; }));\r\n\t}\r\n\treturn out;\r\n}\r\n\r\n/**\r\n * Ray-casting point-in-polygon test on a 2D loop stored as flat coords.\r\n * @private\r\n * @param {number} px\r\n * @param {number} py\r\n * @param {Float64Array} coords - Flat [u0,v0, u1,v1, ...] array\r\n * @param {number} n - Number of vertices\r\n * @returns {boolean}\r\n */\r\nfunction _pointInLoop2D(px, py, coords, n) {\r\n\tvar inside = false;\r\n\tfor (var i = 0, j = n - 1; i < n; j = i++) {\r\n\t\tvar xi = coords[i * 2], yi = coords[i * 2 + 1];\r\n\t\tvar xj = coords[j * 2], yj = coords[j * 2 + 1];\r\n\t\tif (((yi > py) !== (yj > py)) && (px < (xj - xi) * (py - yi) / (yj - yi) + xi)) {\r\n\t\t\tinside = !inside;\r\n\t\t}\r\n\t}\r\n\treturn inside;\r\n}\r\n\r\n/**\r\n * Triangulate a 3D polygon loop using constrained Delaunay projected onto the\r\n * best-fit 2D plane (the plane with the largest projected area).\r\n *\r\n * @param {Array<{x: number, y: number, z: number}>} loop - Vertices in order\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Triangles\r\n */\r\nexport function triangulateLoop(loop) {\r\n\tif (loop.length < 3) return [];\r\n\tif (loop.length === 3) {\r\n\t\treturn [{ v0: loop[0], v1: loop[1], v2: loop[2] }];\r\n\t}\r\n\tif (loop.length === 4) {\r\n\t\tvar d02 = dist3(loop[0], loop[2]);\r\n\t\tvar d13 = dist3(loop[1], loop[3]);\r\n\t\tif (d02 <= d13) {\r\n\t\t\treturn [\r\n\t\t\t\t{ v0: loop[0], v1: loop[1], v2: loop[2] },\r\n\t\t\t\t{ v0: loop[0], v1: loop[2], v2: loop[3] }\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\treturn [\r\n\t\t\t\t{ v0: loop[0], v1: loop[1], v2: loop[3] },\r\n\t\t\t\t{ v0: loop[1], v1: loop[2], v2: loop[3] }\r\n\t\t\t];\r\n\t\t}\r\n\t}\r\n\r\n\t// Compute loop normal via Newell's method\r\n\tvar nx = 0, ny = 0, nz = 0;\r\n\tfor (var i = 0; i < loop.length; i++) {\r\n\t\tvar curr = loop[i];\r\n\t\tvar next = loop[(i + 1) % loop.length];\r\n\t\tnx += (curr.y - next.y) * (curr.z + next.z);\r\n\t\tny += (curr.z - next.z) * (curr.x + next.x);\r\n\t\tnz += (curr.x - next.x) * (curr.y + next.y);\r\n\t}\r\n\r\n\t// Pick the 2D projection plane using shoelace area on all 3 planes\r\n\tvar areaXY = 0, areaXZ = 0, areaYZ = 0;\r\n\tfor (var sa = 0; sa < loop.length; sa++) {\r\n\t\tvar saCurr = loop[sa];\r\n\t\tvar saNext = loop[(sa + 1) % loop.length];\r\n\t\tareaXY += (saCurr.x * saNext.y - saNext.x * saCurr.y);\r\n\t\tareaXZ += (saCurr.x * saNext.z - saNext.x * saCurr.z);\r\n\t\tareaYZ += (saCurr.y * saNext.z - saNext.y * saCurr.z);\r\n\t}\r\n\tareaXY = Math.abs(areaXY);\r\n\tareaXZ = Math.abs(areaXZ);\r\n\tareaYZ = Math.abs(areaYZ);\r\n\r\n\tvar projU, projV;\r\n\tif (areaXY >= areaXZ && areaXY >= areaYZ) {\r\n\t\tprojU = function (p) { return p.x; };\r\n\t\tprojV = function (p) { return p.y; };\r\n\t} else if (areaXZ >= areaYZ) {\r\n\t\tprojU = function (p) { return p.x; };\r\n\t\tprojV = function (p) { return p.z; };\r\n\t} else {\r\n\t\tprojU = function (p) { return p.y; };\r\n\t\tprojV = function (p) { return p.z; };\r\n\t}\r\n\r\n\tvar n2 = loop.length;\r\n\tvar coords = new Float64Array(n2 * 2);\r\n\tfor (var j = 0; j < n2; j++) {\r\n\t\tcoords[j * 2] = projU(loop[j]);\r\n\t\tcoords[j * 2 + 1] = projV(loop[j]);\r\n\t}\r\n\r\n\t// Guard against the Constrainautor infinite-loop on coincident projected\r\n\t// points: two DISTINCT 3D loop vertices can collapse to the SAME 2D point\r\n\t// after projection (a pinhole on/near a vertical wall). _splitSelfTouching\r\n\t// dedups in 3D (vKey), so it cannot catch this 2D-only collision, and the\r\n\t// try/catch below only guards THROWS, not hangs. Detect coincident projected\r\n\t// points up front (n2 is small, so O(n^2) is trivial); if any exist, skip the\r\n\t// constrain step — the unconstrained Delaunay is robust to duplicates and\r\n\t// completes. (Fixes an order-dependent closeSolid hang on real mine data.)\r\n\tvar bbU0 = Infinity, bbV0 = Infinity, bbU1 = -Infinity, bbV1 = -Infinity;\r\n\tfor (var bi = 0; bi < n2; bi++) {\r\n\t\tvar bu = coords[bi * 2], bv = coords[bi * 2 + 1];\r\n\t\tif (bu < bbU0) bbU0 = bu; if (bu > bbU1) bbU1 = bu;\r\n\t\tif (bv < bbV0) bbV0 = bv; if (bv > bbV1) bbV1 = bv;\r\n\t}\r\n\tvar diag2 = (bbU1 - bbU0) * (bbU1 - bbU0) + (bbV1 - bbV0) * (bbV1 - bbV0);\r\n\tvar coincidentEps2 = Math.max(diag2 * 1e-14, 1e-18); // relative + absolute floor\r\n\tvar hasDup2D = false;\r\n\tfor (var pi = 0; pi < n2 && !hasDup2D; pi++) {\r\n\t\tfor (var pj = pi + 1; pj < n2; pj++) {\r\n\t\t\tvar ddu = coords[pi * 2] - coords[pj * 2];\r\n\t\t\tvar ddv = coords[pi * 2 + 1] - coords[pj * 2 + 1];\r\n\t\t\tif (ddu * ddu + ddv * ddv <= coincidentEps2) { hasDup2D = true; break; }\r\n\t\t}\r\n\t}\r\n\r\n\tvar del, con;\r\n\ttry {\r\n\t\tdel = new Delaunator(coords);\r\n\t\t// Only constrain when the projection is non-degenerate — Constrainautor\r\n\t\t// can HANG (not throw) on coincident points or an empty triangulation.\r\n\t\tif (!hasDup2D && del.triangles.length > 0) {\r\n\t\t\tcon = new Constrainautor(del);\r\n\r\n\t\t\tfor (var ci = 0; ci < n2; ci++) {\r\n\t\t\t\tvar ni = (ci + 1) % n2;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tcon.constrainOne(ci, ni);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\t// Skip problematic constraint edges\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} catch (e) {\r\n\t\ttry {\r\n\t\t\tdel = new Delaunator(coords);\r\n\t\t} catch (e2) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t}\r\n\r\n\tvar result = [];\r\n\tvar tris = del.triangles;\r\n\tfor (var k = 0; k < tris.length; k += 3) {\r\n\t\tvar a = tris[k], b = tris[k + 1], c = tris[k + 2];\r\n\r\n\t\tvar cx2 = (coords[a * 2] + coords[b * 2] + coords[c * 2]) / 3;\r\n\t\tvar cy2 = (coords[a * 2 + 1] + coords[b * 2 + 1] + coords[c * 2 + 1]) / 3;\r\n\r\n\t\tif (_pointInLoop2D(cx2, cy2, coords, n2)) {\r\n\t\t\tresult.push({\r\n\t\t\t\tv0: loop[a],\r\n\t\t\t\tv1: loop[b],\r\n\t\t\t\tv2: loop[c]\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Validate cap triangle winding against the Newell loop normal\r\n\tvar nLen = Math.sqrt(nx * nx + ny * ny + nz * nz);\r\n\tif (nLen > 1e-12) {\r\n\t\tvar nnx = nx / nLen, nny = ny / nLen, nnz = nz / nLen;\r\n\t\tfor (var wi = 0; wi < result.length; wi++) {\r\n\t\t\tvar wt = result[wi];\r\n\t\t\tvar ux = wt.v1.x - wt.v0.x, uy = wt.v1.y - wt.v0.y, uz = wt.v1.z - wt.v0.z;\r\n\t\t\tvar vx = wt.v2.x - wt.v0.x, vy = wt.v2.y - wt.v0.y, vz = wt.v2.z - wt.v0.z;\r\n\t\t\tvar tnx = uy * vz - uz * vy;\r\n\t\t\tvar tny = uz * vx - ux * vz;\r\n\t\t\tvar tnz = ux * vy - uy * vx;\r\n\t\t\tvar dot = tnx * nnx + tny * nny + tnz * nnz;\r\n\t\t\tif (dot < 0) {\r\n\t\t\t\tvar tmp = wt.v1;\r\n\t\t\t\twt.v1 = wt.v2;\r\n\t\t\t\twt.v2 = tmp;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Find boundary edges, chain into loops, triangulate each loop to cap.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Cap triangles\r\n */\r\nexport function capBoundaryLoops(tris) {\r\n\tvar result = extractBoundaryLoops(tris);\r\n\r\n\tif (result.loops.length === 0) return [];\r\n\r\n\tvar capTris = [];\r\n\tfor (var li = 0; li < result.loops.length; li++) {\r\n\t\tvar loopTris = triangulateLoop(result.loops[li]);\r\n\t\tfor (var lt = 0; lt < loopTris.length; lt++) {\r\n\t\t\tcapTris.push(loopTris[lt]);\r\n\t\t}\r\n\t}\r\n\r\n\treturn capTris;\r\n}\r\n\r\n/**\r\n * Sequential boundary capping: cap one loop at a time, re-weld + clean\r\n * non-manifold after each loop.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soup - Triangle soup\r\n * @param {number} snapTol - Weld tolerance\r\n * @param {number} [maxPasses=3] - Max number of cap passes\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Updated triangle soup\r\n */\r\nexport function capBoundaryLoopsSequential(soup, snapTol, maxPasses) {\r\n\tif (!maxPasses) maxPasses = 3;\r\n\tvar MAX_CAP_LOOP_VERTS = 500;\r\n\r\n\tfor (var capPass = 0; capPass < maxPasses; capPass++) {\r\n\t\tvar preStats = countOpenEdges(soup);\r\n\t\tif (preStats.overShared > 0) {\r\n\t\t\tsoup = cleanCrossingTriangles(soup);\r\n\t\t\tvar cleaned = weldVertices(soup, snapTol);\r\n\t\t\tsoup = weldedToSoup(cleaned.triangles);\r\n\t\t}\r\n\r\n\t\tvar loopResult = extractBoundaryLoops(soup);\r\n\t\tif (loopResult.loops.length === 0) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tvar totalCapTris = 0;\r\n\r\n\t\tfor (var li = 0; li < loopResult.loops.length; li++) {\r\n\t\t\tvar loop = loopResult.loops[li];\r\n\t\t\tif (loop.length < 3) continue;\r\n\t\t\tif (loop.length > MAX_CAP_LOOP_VERTS) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar capTris = triangulateLoop(loop);\r\n\t\t\tif (capTris.length === 0) continue;\r\n\r\n\t\t\tfor (var ct = 0; ct < capTris.length; ct++) {\r\n\t\t\t\tsoup.push(capTris[ct]);\r\n\t\t\t}\r\n\t\t\ttotalCapTris += capTris.length;\r\n\r\n\t\t\tvar reWelded = weldVertices(soup, snapTol);\r\n\t\t\tsoup = weldedToSoup(reWelded.triangles);\r\n\r\n\t\t\tvar postStats = countOpenEdges(soup);\r\n\t\t\tif (postStats.overShared > 0) {\r\n\t\t\t\tsoup = cleanCrossingTriangles(soup);\r\n\t\t\t\tvar reCleaned = weldVertices(soup, snapTol);\r\n\t\t\t\tsoup = weldedToSoup(reCleaned.triangles);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (totalCapTris === 0) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn soup;\r\n}\r\n","/**\r\n * @module repair/removeOverlapping\r\n *\r\n * Remove overlapping anti-parallel internal wall triangles.\r\n *\r\n * Detection: Two triangles overlap when:\r\n *   - Their centroids are within tolerance in 3D\r\n *   - Their normals are nearly anti-parallel (dot product < -0.5)\r\n *   - They have similar areas (ratio > 0.3)\r\n */\r\n\r\nimport { dist3 } from \"../util/math.js\";\r\n\r\n/**\r\n * Remove overlapping triangles that form internal walls.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} tris - Triangle soup\r\n * @param {number} [tolerance=0.5] - Max centroid distance to consider overlap\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Cleaned triangle soup\r\n */\r\nexport function removeOverlappingTriangles(tris, tolerance) {\r\n\tif (typeof tolerance === \"undefined\") tolerance = 0.5;\r\n\r\n\tvar centroids = [];\r\n\tvar normals = [];\r\n\tvar areas = [];\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tcentroids.push({\r\n\t\t\tx: (tri.v0.x + tri.v1.x + tri.v2.x) / 3,\r\n\t\t\ty: (tri.v0.y + tri.v1.y + tri.v2.y) / 3,\r\n\t\t\tz: (tri.v0.z + tri.v1.z + tri.v2.z) / 3\r\n\t\t});\r\n\t\tvar ux = tri.v1.x - tri.v0.x, uy = tri.v1.y - tri.v0.y, uz = tri.v1.z - tri.v0.z;\r\n\t\tvar vx = tri.v2.x - tri.v0.x, vy = tri.v2.y - tri.v0.y, vz = tri.v2.z - tri.v0.z;\r\n\t\tvar nx = uy * vz - uz * vy;\r\n\t\tvar ny = uz * vx - ux * vz;\r\n\t\tvar nz = ux * vy - uy * vx;\r\n\t\tvar nLen = Math.sqrt(nx * nx + ny * ny + nz * nz);\r\n\t\tif (nLen > 0) { nx /= nLen; ny /= nLen; nz /= nLen; }\r\n\t\tnormals.push({ x: nx, y: ny, z: nz });\r\n\t\tareas.push(0.5 * nLen);\r\n\t}\r\n\r\n\tvar cellSize = Math.max(tolerance * 2, 0.1);\r\n\tvar grid = {};\r\n\r\n\tfunction gKey(c) {\r\n\t\treturn Math.floor(c.x / cellSize) + \",\" + Math.floor(c.y / cellSize) + \",\" + Math.floor(c.z / cellSize);\r\n\t}\r\n\r\n\tfor (var gi = 0; gi < tris.length; gi++) {\r\n\t\tvar gk = gKey(centroids[gi]);\r\n\t\tif (!grid[gk]) grid[gk] = [];\r\n\t\tgrid[gk].push(gi);\r\n\t}\r\n\r\n\tvar removeSet = {};\r\n\r\n\tfor (var si = 0; si < tris.length; si++) {\r\n\t\tif (removeSet[si]) continue;\r\n\r\n\t\tvar sc = centroids[si];\r\n\t\tvar gx = Math.floor(sc.x / cellSize);\r\n\t\tvar gy = Math.floor(sc.y / cellSize);\r\n\t\tvar gz = Math.floor(sc.z / cellSize);\r\n\r\n\t\tfor (var dx = -1; dx <= 1; dx++) {\r\n\t\t\tfor (var dy = -1; dy <= 1; dy++) {\r\n\t\t\t\tfor (var dz = -1; dz <= 1; dz++) {\r\n\t\t\t\t\tvar cell = grid[(gx + dx) + \",\" + (gy + dy) + \",\" + (gz + dz)];\r\n\t\t\t\t\tif (!cell) continue;\r\n\r\n\t\t\t\t\tfor (var ci = 0; ci < cell.length; ci++) {\r\n\t\t\t\t\t\tvar ti = cell[ci];\r\n\t\t\t\t\t\tif (ti <= si || removeSet[ti]) continue;\r\n\r\n\t\t\t\t\t\tvar cdist = dist3(sc, centroids[ti]);\r\n\t\t\t\t\t\tif (cdist > tolerance) continue;\r\n\r\n\t\t\t\t\t\tvar areaRatio = Math.min(areas[si], areas[ti]) / Math.max(areas[si], areas[ti]);\r\n\t\t\t\t\t\tif (areaRatio < 0.3) continue;\r\n\r\n\t\t\t\t\t\tvar dot = normals[si].x * normals[ti].x +\r\n\t\t\t\t\t\t\tnormals[si].y * normals[ti].y +\r\n\t\t\t\t\t\t\tnormals[si].z * normals[ti].z;\r\n\r\n\t\t\t\t\t\tif (dot < -0.5) {\r\n\t\t\t\t\t\t\tif (areas[si] <= areas[ti]) {\r\n\t\t\t\t\t\t\t\tremoveSet[si] = true;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tremoveSet[ti] = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else if (dot > 0.5) {\r\n\t\t\t\t\t\t\tif (areas[si] <= areas[ti]) {\r\n\t\t\t\t\t\t\t\tremoveSet[si] = true;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tremoveSet[ti] = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar removedCount = Object.keys(removeSet).length;\r\n\tif (removedCount === 0) {\r\n\t\treturn tris;\r\n\t}\r\n\r\n\tvar result = [];\r\n\tfor (var ri = 0; ri < tris.length; ri++) {\r\n\t\tif (!removeSet[ri]) result.push(tris[ri]);\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\n * @module repair/closeSolid\n *\n * Honest, conservative solid closing — the antidote to \"smart\" closing.\n *\n * Philosophy (born from a real failure: KNOWN_ISSUES #14 and the 2026-06-11\n * Kirra session where stitch+cap+forceClose draped ~3,350 invented panels\n * across a terrain floor):\n *\n *   1. A boolean result built on a shared vertex pool (BMS) already has\n *      coincident seam vertices. WELDING ALONE should close it. No bridging,\n *      no proximity stitching, no force-closing.\n *   2. Small boundary loops (pinholes) are capped LOCALLY — triangles whose\n *      vertices all lie ON that loop. Nothing is ever drawn across the mesh.\n *   3. Large boundary loops indicate a REAL upstream problem (classification,\n *      missing region, intentional open boundary). They are NEVER capped —\n *      they are reported in the diagnostics so the caller can see the truth.\n *   4. The result always carries diagnostics: the caller can display\n *      \"Closed: 0 open edges\" or \"NOT closed: N edges in M loops\" instead of\n *      trusting the operation blind.\n *\n * This function never deletes input triangles and never adds a triangle whose\n * vertices are not all on a single small boundary loop.\n */\n\nimport { countOpenEdges } from \"../util/math.js\";\nimport { weldVertices, weldedToSoup } from \"./weldVertices.js\";\nimport { extractBoundaryLoops, triangulateLoop } from \"./boundaryLoops.js\";\n\n/**\n * Close a triangle soup into a solid by welding and capping pinhole loops only.\n *\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soup - Triangle soup\n * @param {Object} [options]\n * @param {number} [options.snapTolerance=0.001] - Weld tolerance in metres\n * @param {number} [options.maxCapLoopVerts=32] - Loops with more vertices than\n *        this are considered structural problems and are reported, not capped\n * @param {number} [options.maxPasses=3] - Re-extract/cap passes (capping one\n *        loop can reveal another after re-welding)\n * @returns {{\n *   points: Array<{x,y,z}>,\n *   triangles: Array,\n *   soup: Array,\n *   diagnostics: {\n *     closed: boolean,\n *     openEdges: number,\n *     openLoops: number,\n *     loopSizes: number[],\n *     skippedLargeLoops: number[],\n *     cappedLoops: number,\n *     capTriangles: number,\n *     nonManifoldEdges: number\n *   }\n * }}\n */\nexport function closeSolid(soup, options) {\n\tvar opts = options || {};\n\tvar snapTol = opts.snapTolerance !== undefined ? opts.snapTolerance : 0.001;\n\tvar maxCapLoopVerts = opts.maxCapLoopVerts !== undefined ? opts.maxCapLoopVerts : 32;\n\tvar maxPasses = opts.maxPasses !== undefined ? opts.maxPasses : 3;\n\n\t// Step 1) Weld. With shared-pool (BMS) seams this alone closes the mesh.\n\tvar welded = weldVertices(soup, snapTol);\n\tsoup = weldedToSoup(welded.triangles);\n\n\tvar cappedLoops = 0;\n\tvar capTriangles = 0;\n\tvar skippedLargeLoops = [];\n\n\t// Step 2) Cap pinhole loops only. Never bridge, never force-close.\n\tfor (var pass = 0; pass < maxPasses; pass++) {\n\t\tvar loopResult = extractBoundaryLoops(soup);\n\t\tif (loopResult.loops.length === 0) break;\n\n\t\tvar addedThisPass = 0;\n\t\tskippedLargeLoops = [];\n\n\t\tfor (var li = 0; li < loopResult.loops.length; li++) {\n\t\t\tvar loop = loopResult.loops[li];\n\t\t\tif (loop.length < 3) continue;\n\t\t\tif (loop.length > maxCapLoopVerts) {\n\t\t\t\t// Structural opening — report, never drape a lid across it.\n\t\t\t\tskippedLargeLoops.push(loop.length);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar caps = triangulateLoop(loop);\n\t\t\tif (caps.length === 0) continue;\n\t\t\tfor (var ct = 0; ct < caps.length; ct++) soup.push(caps[ct]);\n\t\t\tcappedLoops++;\n\t\t\taddedThisPass += caps.length;\n\t\t}\n\n\t\tcapTriangles += addedThisPass;\n\t\tif (addedThisPass === 0) break;\n\n\t\t// Re-weld so cap triangles fuse with the loop edges before re-checking.\n\t\tvar rewelded = weldVertices(soup, snapTol);\n\t\tsoup = weldedToSoup(rewelded.triangles);\n\t}\n\n\t// Step 3) Final state + honest diagnostics.\n\tvar finalWeld = weldVertices(soup, snapTol);\n\tvar finalSoup = weldedToSoup(finalWeld.triangles);\n\tvar stats = countOpenEdges(finalSoup);\n\tvar finalLoops = extractBoundaryLoops(finalSoup);\n\n\treturn {\n\t\tpoints: finalWeld.points,\n\t\ttriangles: finalWeld.triangles,\n\t\tsoup: finalSoup,\n\t\tdiagnostics: {\n\t\t\tclosed: stats.openEdges === 0,\n\t\t\topenEdges: stats.openEdges,\n\t\t\topenLoops: finalLoops.loops.length,\n\t\t\tloopSizes: finalLoops.loops.map(function (l) { return l.length; }),\n\t\t\tskippedLargeLoops: skippedLargeLoops,\n\t\t\tcappedLoops: cappedLoops,\n\t\t\tcapTriangles: capTriangles,\n\t\t\tnonManifoldEdges: stats.overShared\n\t\t}\n\t};\n}\n","/**\r\n * @module repair/repairMesh\r\n *\r\n * High-level async mesh repair pipeline.\r\n * Runs a configurable sequence of:\r\n *   dedup -> T-junction resolution -> weld -> degenerate removal -> stitch -> cap -> force-close\r\n *\r\n * Each major step yields to the event loop via setTimeout(0) so the\r\n * caller's progress callback can update.\r\n */\r\n\r\nimport { countOpenEdges } from \"../util/math.js\";\r\nimport { deduplicateSeamVertices } from \"./deduplicateVertices.js\";\r\nimport { resolveTJunctions } from \"./resolveTJunctions.js\";\r\nimport { weldVertices, weldedToSoup } from \"./weldVertices.js\";\r\nimport { removeDegenerateTriangles } from \"./removeDegenerates.js\";\r\nimport { stitchByProximity } from \"./stitchEdges.js\";\r\nimport { capBoundaryLoopsSequential, extractBoundaryLoops } from \"./boundaryLoops.js\";\r\nimport { cleanCrossingTriangles } from \"./cleanCrossing.js\";\r\nimport { removeOverlappingTriangles } from \"./removeOverlapping.js\";\r\nimport { forceCloseIndexedMesh } from \"./forceClose.js\";\r\nimport { closeSolid } from \"./closeSolid.js\";\r\n\r\n/**\r\n * High-level mesh repair entry point. Runs a configurable pipeline\r\n * of dedup, weld, degenerate removal, stitch, cap, and force-close.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soup - Triangle soup\r\n * @param {Object} [config]\r\n * @param {string}  [config.closeMode=\"none\"] - \"none\" | \"weld\" | \"stitch\" | \"closeSolid\"\r\n *        \"closeSolid\" bypasses the entire pipeline and runs closeSolid():\r\n *        weld + pinhole-loop capping only — no dedup, no T-junction splitting,\r\n *        no proximity stitching, no force-close. Returns honest diagnostics.\r\n * @param {number}  [config.maxCapLoopVerts=32] - closeSolid only: loops larger\r\n *        than this are reported as structural openings, never capped\r\n * @param {number}  [config.snapTolerance=0] - Weld tolerance in metres\r\n * @param {number}  [config.stitchTolerance=1.0] - Stitch tolerance\r\n * @param {boolean} [config.removeDegenerate=true] - Remove degenerate/sliver triangles\r\n * @param {number}  [config.sliverRatio=0.01] - Sliver aspect ratio threshold\r\n * @param {boolean} [config.cleanCrossings=true] - Remove over-shared edge duplicates\r\n * @param {boolean} [config.removeOverlapping=false] - Remove anti-parallel internal wall triangles\r\n * @param {number}  [config.overlapTolerance=1e-4] - Overlap detection tolerance\r\n * @param {Function} [onProgress] - Called with progress string, e.g. onProgress(\"Welding...\")\r\n * @returns {Promise<{ points: Array<{x,y,z}>, triangles: Array<{vertices: Array}>, soup: Array }>}\r\n */\r\nexport async function repairMesh(soup, config, onProgress) {\r\n\tif (!config) config = {};\r\n\tvar closeMode = config.closeMode || \"none\";\r\n\tvar snapTol = config.snapTolerance || 0;\r\n\tvar stitchTol = config.stitchTolerance || 1.0;\r\n\tvar removeDegenerate = config.removeDegenerate !== false;\r\n\tvar sliverRatio = config.sliverRatio !== undefined ? config.sliverRatio : 0.01;\r\n\tvar doCleanCrossings = config.cleanCrossings !== false;\r\n\tvar doRemoveOverlapping = !!config.removeOverlapping;\r\n\tvar overlapTol = config.overlapTolerance !== undefined ? config.overlapTolerance : 1e-4;\r\n\r\n\tfunction progress(msg) {\r\n\t\tif (typeof onProgress === \"function\") onProgress(msg);\r\n\t}\r\n\r\n\t// Yield to event loop so UI can update\r\n\tfunction yieldUI() {\r\n\t\treturn new Promise(function (r) { setTimeout(r, 0); });\r\n\t}\r\n\r\n\t// closeSolid mode: PURE path. The boolean output (especially BMS, whose\r\n\t// shared vertex pool guarantees coincident seams) must not be \"repaired\" —\r\n\t// dedup/T-junction/stitch/force-close can manufacture geometry. Weld, cap\r\n\t// pinholes locally, report the truth.\r\n\tif (closeMode === \"closeSolid\") {\r\n\t\tprogress(\"Closing solid (weld + pinhole caps)...\");\r\n\t\tawait yieldUI();\r\n\t\tvar closed = closeSolid(soup, {\r\n\t\t\tsnapTolerance: snapTol,\r\n\t\t\tmaxCapLoopVerts: config.maxCapLoopVerts\r\n\t\t});\r\n\t\tprogress(closed.diagnostics.closed\r\n\t\t\t? \"Closed: 0 open edges.\"\r\n\t\t\t: \"NOT closed: \" + closed.diagnostics.openEdges + \" open edges in \" +\r\n\t\t\tclosed.diagnostics.openLoops + \" loop(s)\" +\r\n\t\t\t(closed.diagnostics.skippedLargeLoops.length\r\n\t\t\t\t? \" — large structural opening(s): \" + closed.diagnostics.skippedLargeLoops.join(\", \") + \" verts\"\r\n\t\t\t\t: \"\"));\r\n\t\treturn closed;\r\n\t}\r\n\r\n\t// Step 1: Deduplicate seam vertices\r\n\tprogress(\"Deduplicating vertices...\");\r\n\tawait yieldUI();\r\n\tsoup = deduplicateSeamVertices(soup, 1e-4);\r\n\r\n\t// Step 1.5: Resolve T-junctions\r\n\tprogress(\"Resolving T-junctions...\");\r\n\tawait yieldUI();\r\n\tsoup = resolveTJunctions(soup, 1e-4);\r\n\r\n\t// Step 2: Weld vertices\r\n\tprogress(\"Welding vertices...\");\r\n\tawait yieldUI();\r\n\tvar welded = weldVertices(soup, snapTol);\r\n\tsoup = weldedToSoup(welded.triangles);\r\n\r\n\t// Step 3: Remove degenerates\r\n\tif (removeDegenerate) {\r\n\t\tprogress(\"Removing degenerate triangles...\");\r\n\t\tawait yieldUI();\r\n\t\tsoup = removeDegenerateTriangles(soup, 1e-6, sliverRatio);\r\n\t}\r\n\r\n\t// Step 3.5: Clean crossing and overlapping triangles\r\n\tif (doCleanCrossings) {\r\n\t\tvar preCleanStats = countOpenEdges(soup);\r\n\t\tif (preCleanStats.overShared > 0) {\r\n\t\t\tprogress(\"Cleaning crossing triangles...\");\r\n\t\t\tawait yieldUI();\r\n\t\t\tsoup = cleanCrossingTriangles(soup);\r\n\t\t}\r\n\t}\r\n\tif (doRemoveOverlapping) {\r\n\t\tprogress(\"Removing overlapping triangles...\");\r\n\t\tawait yieldUI();\r\n\t\tsoup = removeOverlappingTriangles(soup, overlapTol);\r\n\t}\r\n\r\n\t// Step 4: Stitch + cap (if closeMode === \"stitch\")\r\n\tif (closeMode === \"stitch\") {\r\n\t\tprogress(\"Stitching boundaries...\");\r\n\t\tawait yieldUI();\r\n\t\tvar stitchTris = stitchByProximity(soup, stitchTol);\r\n\t\tif (stitchTris.length > 0) {\r\n\t\t\tfor (var st = 0; st < stitchTris.length; st++) {\r\n\t\t\t\tsoup.push(stitchTris[st]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Final weld after stitch\r\n\t\tvar finalWelded = weldVertices(soup, snapTol);\r\n\t\tvar worldPoints = finalWelded.points;\r\n\t\tvar triangles = finalWelded.triangles;\r\n\r\n\t\t// Sequential capping\r\n\t\tprogress(\"Capping boundary loops...\");\r\n\t\tawait yieldUI();\r\n\t\tvar postSoup = weldedToSoup(triangles);\r\n\t\tpostSoup = capBoundaryLoopsSequential(postSoup, snapTol, 3);\r\n\r\n\t\tvar cappedWeld = weldVertices(postSoup, snapTol);\r\n\t\tworldPoints = cappedWeld.points;\r\n\t\ttriangles = cappedWeld.triangles;\r\n\r\n\t\t// Post-cap cleanup\r\n\t\tprogress(\"Cleaning up post-cap mesh...\");\r\n\t\tawait yieldUI();\r\n\t\tvar postCapSoup = weldedToSoup(triangles);\r\n\t\tvar postCapChanged = false;\r\n\r\n\t\tif (doCleanCrossings) {\r\n\t\t\tvar postCapStats = countOpenEdges(postCapSoup);\r\n\t\t\tif (postCapStats.overShared > 0) {\r\n\t\t\t\tpostCapSoup = cleanCrossingTriangles(postCapSoup);\r\n\t\t\t\tpostCapChanged = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (doRemoveOverlapping) {\r\n\t\t\tvar preOverlapCount = postCapSoup.length;\r\n\t\t\tpostCapSoup = removeOverlappingTriangles(postCapSoup, overlapTol);\r\n\t\t\tif (postCapSoup.length < preOverlapCount) postCapChanged = true;\r\n\t\t}\r\n\r\n\t\tif (removeDegenerate) {\r\n\t\t\tvar preDegenCount = postCapSoup.length;\r\n\t\t\tpostCapSoup = removeDegenerateTriangles(postCapSoup, 1e-6, sliverRatio);\r\n\t\t\tif (postCapSoup.length < preDegenCount) postCapChanged = true;\r\n\t\t}\r\n\r\n\t\tif (postCapChanged) {\r\n\t\t\tvar postCapWeld = weldVertices(postCapSoup, snapTol);\r\n\t\t\tworldPoints = postCapWeld.points;\r\n\t\t\ttriangles = postCapWeld.triangles;\r\n\t\t}\r\n\r\n\t\t// Safety net -- forceCloseIndexedMesh\r\n\t\tprogress(\"Force-closing gaps...\");\r\n\t\tawait yieldUI();\r\n\t\tvar safetyCheckSoup = weldedToSoup(triangles);\r\n\t\tvar safetyStats = countOpenEdges(safetyCheckSoup);\r\n\t\tif (safetyStats.openEdges > 0) {\r\n\t\t\tvar forceClosed = forceCloseIndexedMesh(worldPoints, triangles);\r\n\t\t\tworldPoints = forceClosed.points;\r\n\t\t\ttriangles = forceClosed.triangles;\r\n\t\t}\r\n\r\n\t\t// Final result\r\n\t\tvar finalSoup = weldedToSoup(triangles);\r\n\t\tsoup = finalSoup;\r\n\r\n\t\tprogress(\"Repair complete.\");\r\n\t\treturn { points: worldPoints, triangles: triangles, soup: soup };\r\n\t}\r\n\r\n\t// For non-stitch modes, just do a final weld and return\r\n\tvar finalWeld = weldVertices(soup, snapTol);\r\n\r\n\tprogress(\"Repair complete.\");\r\n\treturn { points: finalWeld.points, triangles: finalWeld.triangles, soup: soup };\r\n}\r\n","/**\r\n * trimesh-boolean/three\r\n *\r\n * Optional Three.js adapter. Converts between THREE.Mesh/Group and\r\n * triangle soup format used by the core library.\r\n *\r\n * @module trimesh-boolean/three\r\n */\r\n\r\nimport * as THREE from \"three\";\r\nimport { boolean as coreBooleanOp } from \"./boolean/booleanOp.js\";\r\nimport { repairMesh as coreRepairMesh } from \"./repair/repairMesh.js\";\r\nimport { intersectMeshPairTagged as coreIntersect } from \"./intersect/intersectMeshPair.js\";\r\n\r\n/**\r\n * Convert a THREE.Mesh or THREE.Group to triangle soup.\r\n *\r\n * Traverses all child meshes, applies their world transforms,\r\n * and extracts position data as {v0, v1, v2} triangles.\r\n *\r\n * @param {THREE.Object3D} object - THREE.Mesh or THREE.Group\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Triangle soup\r\n */\r\nexport function meshToSoup(object) {\r\n\tvar soup = [];\r\n\r\n\tobject.updateMatrixWorld(true);\r\n\r\n\tobject.traverse(function (child) {\r\n\t\tif (!child.isMesh) return;\r\n\r\n\t\tvar geometry = child.geometry;\r\n\t\tif (!geometry) return;\r\n\r\n\t\tvar posAttr = geometry.getAttribute(\"position\");\r\n\t\tif (!posAttr) return;\r\n\r\n\t\tvar matrix = child.matrixWorld;\r\n\t\tvar index = geometry.index;\r\n\r\n\t\tvar v = new THREE.Vector3();\r\n\r\n\t\tfunction getVertex(idx) {\r\n\t\t\tv.set(posAttr.getX(idx), posAttr.getY(idx), posAttr.getZ(idx));\r\n\t\t\tv.applyMatrix4(matrix);\r\n\t\t\treturn { x: v.x, y: v.y, z: v.z };\r\n\t\t}\r\n\r\n\t\tif (index) {\r\n\t\t\tfor (var i = 0; i < index.count; i += 3) {\r\n\t\t\t\tsoup.push({\r\n\t\t\t\t\tv0: getVertex(index.getX(i)),\r\n\t\t\t\t\tv1: getVertex(index.getX(i + 1)),\r\n\t\t\t\t\tv2: getVertex(index.getX(i + 2))\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (var j = 0; j < posAttr.count; j += 3) {\r\n\t\t\t\tsoup.push({\r\n\t\t\t\t\tv0: getVertex(j),\r\n\t\t\t\t\tv1: getVertex(j + 1),\r\n\t\t\t\t\tv2: getVertex(j + 2)\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn soup;\r\n}\r\n\r\n/**\r\n * Convert triangle soup to a THREE.Mesh with BufferGeometry.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soup\r\n * @param {Object} [options]\r\n * @param {number|string} [options.color=0x4488FF] - Mesh color\r\n * @param {boolean} [options.doubleSide=true] - Use DoubleSide material\r\n * @param {boolean} [options.wireframe=false] - Wireframe mode\r\n * @returns {THREE.Mesh}\r\n */\r\nexport function soupToMesh(soup, options) {\r\n\tif (!options) options = {};\r\n\r\n\tvar positions = new Float32Array(soup.length * 9);\r\n\tfor (var i = 0; i < soup.length; i++) {\r\n\t\tvar tri = soup[i];\r\n\t\tvar offset = i * 9;\r\n\t\tpositions[offset] = tri.v0.x;\r\n\t\tpositions[offset + 1] = tri.v0.y;\r\n\t\tpositions[offset + 2] = tri.v0.z;\r\n\t\tpositions[offset + 3] = tri.v1.x;\r\n\t\tpositions[offset + 4] = tri.v1.y;\r\n\t\tpositions[offset + 5] = tri.v1.z;\r\n\t\tpositions[offset + 6] = tri.v2.x;\r\n\t\tpositions[offset + 7] = tri.v2.y;\r\n\t\tpositions[offset + 8] = tri.v2.z;\r\n\t}\r\n\r\n\tvar geometry = new THREE.BufferGeometry();\r\n\tgeometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\r\n\tgeometry.computeVertexNormals();\r\n\r\n\tvar material = new THREE.MeshPhongMaterial({\r\n\t\tcolor: options.color !== undefined ? options.color : 0x4488FF,\r\n\t\tside: options.doubleSide !== false ? THREE.DoubleSide : THREE.FrontSide,\r\n\t\twireframe: !!options.wireframe\r\n\t});\r\n\r\n\treturn new THREE.Mesh(geometry, material);\r\n}\r\n\r\n/**\r\n * Perform a boolean operation on two THREE.Mesh/Group objects.\r\n *\r\n * @param {THREE.Object3D} meshA - First mesh\r\n * @param {THREE.Object3D} meshB - Second mesh\r\n * @param {\"subtract\"|\"union\"|\"intersect\"} operation\r\n * @param {Object} [options] - Options passed to soupToMesh for the result\r\n * @returns {THREE.Mesh|null} Result mesh, or null on failure\r\n */\r\nexport function booleanFromMeshes(meshA, meshB, operation, options) {\r\n\tvar soupA = meshToSoup(meshA);\r\n\tvar soupB = meshToSoup(meshB);\r\n\r\n\tvar result = coreBooleanOp(soupA, soupB, operation);\r\n\tif (!result) return null;\r\n\r\n\treturn soupToMesh(result.soup, options);\r\n}\r\n\r\n/**\r\n * Compute intersection segments between two THREE.Mesh/Group objects.\r\n *\r\n * @param {THREE.Object3D} meshA\r\n * @param {THREE.Object3D} meshB\r\n * @returns {Array<{ p0: {x,y,z}, p1: {x,y,z}, idxA: number, idxB: number }>}\r\n */\r\nexport function intersectFromMeshes(meshA, meshB) {\r\n\tvar soupA = meshToSoup(meshA);\r\n\tvar soupB = meshToSoup(meshB);\r\n\treturn coreIntersect(soupA, soupB);\r\n}\r\n\r\n/**\r\n * Repair a THREE.Mesh/Group and return a new THREE.Mesh.\r\n *\r\n * @param {THREE.Object3D} mesh - Input mesh\r\n * @param {Object} [config] - Repair config (closeMode, snapTolerance, etc.)\r\n * @param {Function} [onProgress] - Progress callback\r\n * @param {Object} [meshOptions] - Options for soupToMesh\r\n * @returns {Promise<THREE.Mesh>} Repaired mesh\r\n */\r\nexport async function repairFromMesh(mesh, config, onProgress, meshOptions) {\r\n\tvar soup = meshToSoup(mesh);\r\n\tvar result = await coreRepairMesh(soup, config, onProgress);\r\n\treturn soupToMesh(result.soup, meshOptions);\r\n}\r\n\r\n// Re-export core API for convenience\r\nexport { coreBooleanOp as boolean, coreRepairMesh as repair, coreIntersect as intersect };\r\n"],"names":["u","bc","ca","ab","bct","cat","abt","_8","_16","fin","fin2","finadd","THREE","coreBooleanOp","coreIntersect","coreRepairMesh"],"mappings":"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","x_google_ignoreList":[0,1,2,3,9,10]}