{"version":3,"file":"trimesh-boolean.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/util/connectedComponents.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/repair/neighbourhoodPool.js","../src/repair/resolveTJunctionsHoleFree.js","../src/repair/cancelCoincidentFaces.js","../src/util/indexGroups.js","../src/normals/orientSolid.js","../src/normals/classifyDirection.js","../src/boolean/closeBoundary.js","../src/bms/bmsVertexPool.js","../src/bms/bmsIntersect.js","../src/bms/bmsChain.js","../node_modules/tiny-exact-math/Rational.js","../src/bms/bmsSplit.js","../src/bms/bmsClose.js","../src/bms/bmsClassify.js","../src/bms/bmsVerify.js","../src/bms/heffalumpClassify.js","../src/bms/bmsBooleanOp.js","../src/intersect/coplanarOverlap.js","../src/classify/windingNumber.js","../src/classify/cellComplex.js","../src/classify/coincidentDedup.js","../src/bms/bmsSelfArrange.js","../src/bms/bmsSelfResolveIndexed.js","../src/util/indexedComponents.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 util/connectedComponents\r\n *\r\n * Find connected components in a triangle soup via shared-edge adjacency.\r\n */\r\n\r\n/**\r\n * Split a triangle soup into its connected components.\r\n *\r\n * Two triangles are connected if they share an edge (two vertices with\r\n * matching coordinates). Returns an array of soups, one per component,\r\n * ordered largest-first.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soup\r\n * @returns {Array<Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>>}\r\n */\r\nexport function findConnectedComponents(soup) {\r\n\tif (!soup || soup.length === 0) return [];\r\n\tif (soup.length === 1) return [soup.slice()];\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) Build edge -> triangle index map\r\n\tvar edgeToTris = {};\r\n\tfor (var i = 0; i < soup.length; i++) {\r\n\t\tvar tri = soup[i];\r\n\t\tvar ks = [vk(tri.v0), vk(tri.v1), vk(tri.v2)];\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 (!edgeToTris[key]) edgeToTris[key] = [];\r\n\t\t\tedgeToTris[key].push(i);\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 2) Build per-triangle neighbor list\r\n\tvar neighbors = new Array(soup.length);\r\n\tfor (var ni = 0; ni < soup.length; ni++) neighbors[ni] = [];\r\n\r\n\tfor (var ek2 in edgeToTris) {\r\n\t\tvar tris = edgeToTris[ek2];\r\n\t\tfor (var a = 0; a < tris.length; a++) {\r\n\t\t\tfor (var b = a + 1; b < tris.length; b++) {\r\n\t\t\t\tneighbors[tris[a]].push(tris[b]);\r\n\t\t\t\tneighbors[tris[b]].push(tris[a]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 3) BFS to find connected components\r\n\tvar visited = new Uint8Array(soup.length);\r\n\tvar components = [];\r\n\r\n\tfor (var seed = 0; seed < soup.length; seed++) {\r\n\t\tif (visited[seed]) continue;\r\n\t\tvar component = [];\r\n\t\tvar queue = [seed];\r\n\t\tvisited[seed] = 1;\r\n\t\tvar head = 0;\r\n\r\n\t\twhile (head < queue.length) {\r\n\t\t\tvar cur = queue[head++];\r\n\t\t\tcomponent.push(soup[cur]);\r\n\t\t\tvar nbrs = neighbors[cur];\r\n\t\t\tfor (var n = 0; n < nbrs.length; n++) {\r\n\t\t\t\tif (!visited[nbrs[n]]) {\r\n\t\t\t\t\tvisited[nbrs[n]] = 1;\r\n\t\t\t\t\tqueue.push(nbrs[n]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tcomponents.push(component);\r\n\t}\r\n\r\n\t// Step 4) Sort largest-first\r\n\tcomponents.sort(function(a, b) { return b.length - a.length; });\r\n\treturn components;\r\n}\r\n\r\n/**\r\n * Integer-id (\"pooled\") twin of {@link findConnectedComponents} — an opt-in fast\r\n * path for large soups. Identical shared-EDGE adjacency and largest-first ordering\r\n * as the default, but each distinct vertex is assigned an integer id via a quantized\r\n * hash, so the edge map is keyed by pure integers (`lo * P + hi`) instead of\r\n * `toFixed(6)` string concatenations. At millions of triangles this removes the\r\n * string hashing that dominates the default's time + heap.\r\n *\r\n * Results are identical to `findConnectedComponents` on clean input (the two share\r\n * the same 6-dp quantization by default), so this is a drop-in accelerator — the\r\n * default function is left untouched.\r\n *\r\n * @param {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} soup\r\n * @param {{ tolerance?: number }} [options] `tolerance` = vertex-weld quantization in\r\n *        world units (default `1e-6`, mirroring the default's 6-decimal rounding).\r\n * @returns {Array<Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>>} components, largest-first\r\n */\r\nexport function findConnectedComponentsPooled(soup, options) {\r\n\tif (!soup || soup.length === 0) return [];\r\n\tif (soup.length === 1) return [soup.slice()];\r\n\r\n\tvar tolerance = (options && options.tolerance != null) ? options.tolerance : 1e-6;\r\n\tvar inv = 1 / tolerance;\r\n\r\n\t// Step 1) Assign each distinct vertex a small integer id via a quantized hash.\r\n\t// One (short) key per vertex — 3 per triangle — replaces the default's long\r\n\t// toFixed keys; the edge map below is then pure-integer keyed.\r\n\tvar vertId = new Map();\r\n\tfunction id(v) {\r\n\t\tvar key = Math.round(v.x * inv) + \",\" + Math.round(v.y * inv) + \",\" + Math.round(v.z * inv);\r\n\t\tvar i = vertId.get(key);\r\n\t\tif (i === undefined) { i = vertId.size; vertId.set(key, i); }\r\n\t\treturn i;\r\n\t}\r\n\tvar triIds = new Array(soup.length);\r\n\tfor (var t = 0; t < soup.length; t++) {\r\n\t\tvar tri = soup[t];\r\n\t\ttriIds[t] = [id(tri.v0), id(tri.v1), id(tri.v2)];\r\n\t}\r\n\t// Edge-key stride. Both endpoint ids are < P, so lo*P+hi is a unique integer key\r\n\t// while P*P stays within 2^53 (safe up to ~94M distinct vertices — far past scale).\r\n\tvar P = vertId.size;\r\n\r\n\t// Step 2) Build edge -> triangle index map (integer keys, no strings).\r\n\tvar edgeToTris = new Map();\r\n\tfunction addEdge(a, b, ti) {\r\n\t\tvar lo = a < b ? a : b;\r\n\t\tvar hi = a < b ? b : a;\r\n\t\tvar key = lo * P + hi;\r\n\t\tvar arr = edgeToTris.get(key);\r\n\t\tif (!arr) { arr = []; edgeToTris.set(key, arr); }\r\n\t\tarr.push(ti);\r\n\t}\r\n\tfor (var i2 = 0; i2 < soup.length; i2++) {\r\n\t\tvar ids = triIds[i2];\r\n\t\taddEdge(ids[0], ids[1], i2);\r\n\t\taddEdge(ids[1], ids[2], i2);\r\n\t\taddEdge(ids[2], ids[0], i2);\r\n\t}\r\n\r\n\t// Step 3) Per-triangle neighbor list.\r\n\tvar neighbors = new Array(soup.length);\r\n\tfor (var ni = 0; ni < soup.length; ni++) neighbors[ni] = [];\r\n\tedgeToTris.forEach(function(tris) {\r\n\t\tfor (var a = 0; a < tris.length; a++) {\r\n\t\t\tfor (var b = a + 1; b < tris.length; b++) {\r\n\t\t\t\tneighbors[tris[a]].push(tris[b]);\r\n\t\t\t\tneighbors[tris[b]].push(tris[a]);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\t// Step 4) BFS to find connected components.\r\n\tvar visited = new Uint8Array(soup.length);\r\n\tvar components = [];\r\n\tfor (var seed = 0; seed < soup.length; seed++) {\r\n\t\tif (visited[seed]) continue;\r\n\t\tvar component = [];\r\n\t\tvar queue = [seed];\r\n\t\tvisited[seed] = 1;\r\n\t\tvar head = 0;\r\n\t\twhile (head < queue.length) {\r\n\t\t\tvar cur = queue[head++];\r\n\t\t\tcomponent.push(soup[cur]);\r\n\t\t\tvar nbrs = neighbors[cur];\r\n\t\t\tfor (var n = 0; n < nbrs.length; n++) {\r\n\t\t\t\tif (!visited[nbrs[n]]) { visited[nbrs[n]] = 1; queue.push(nbrs[n]); }\r\n\t\t\t}\r\n\t\t}\r\n\t\tcomponents.push(component);\r\n\t}\r\n\r\n\t// Step 5) Sort largest-first.\r\n\tcomponents.sort(function(a, b) { return b.length - a.length; });\r\n\treturn components;\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","/**\n * @module repair/neighbourhoodPool\n *\n * Neighbourhood-weld vertex identity pool.\n *\n * A robust replacement for toFixed()-string vertex keys when you need \"are these\n * two vertices the same point (within eps)?\" identity. Plain grid quantisation\n * (round(x/eps)) MISSES welds when two near-coincident points straddle a cell\n * boundary; toFixed() has the same boundary bug (1.0000004 -> \"1.000000\" but\n * 1.0000006 -> \"1.000001\"). This pool buckets by cell but, before minting a new\n * id, searches the 27 neighbouring cells for an existing vertex within eps — so\n * boundary-straddling points still resolve to one id.\n *\n * Identity only. The pool stores the first coordinate seen for each id and never\n * moves geometry; callers decide whether to emit original or representative coords.\n *\n * NOTE: this is a tolerance-weld, deliberately NOT exact-rational identity — two\n * floats that should be one vertex are almost never bit-identical, so exact\n * equality would split them. Use exact predicates (orient3d/determinant3) for\n * orientation SIGNS, not for fuzzy identity.\n */\n\n/**\n * @param {number} eps - Weld radius in metres. Two vertices within eps collapse to one id.\n * @returns {{ id: (x:number,y:number,z:number)=>number, points: Array<{x,y,z}>, size: ()=>number }}\n */\nexport function makeWeldPool(eps) {\n\tvar cell = eps > 0 ? eps : 1e-6; // bucket size == weld radius; ±1 cell search covers the eps ball\n\tvar inv = 1 / cell;\n\tvar grid = new Map(); // \"gx,gy,gz\" -> array of vertex ids\n\tvar pts = [];\n\tvar eps2 = cell * cell;\n\n\tfunction id(x, y, z) {\n\t\tvar gx = Math.floor(x * inv), gy = Math.floor(y * inv), gz = Math.floor(z * inv);\n\t\tfor (var dx = -1; dx <= 1; dx++) {\n\t\t\tfor (var dy = -1; dy <= 1; dy++) {\n\t\t\t\tfor (var dz = -1; dz <= 1; dz++) {\n\t\t\t\t\tvar arr = grid.get((gx + dx) + \",\" + (gy + dy) + \",\" + (gz + dz));\n\t\t\t\t\tif (!arr) continue;\n\t\t\t\t\tfor (var i = 0; i < arr.length; i++) {\n\t\t\t\t\t\tvar p = pts[arr[i]];\n\t\t\t\t\t\tvar ddx = p.x - x, ddy = p.y - y, ddz = p.z - z;\n\t\t\t\t\t\tif (ddx * ddx + ddy * ddy + ddz * ddz <= eps2) return arr[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar nid = pts.length;\n\t\tpts.push({ x: x, y: y, z: z });\n\t\tvar hk = gx + \",\" + gy + \",\" + gz;\n\t\tvar b = grid.get(hk);\n\t\tif (!b) { b = []; grid.set(hk, b); }\n\t\tb.push(nid);\n\t\treturn nid;\n\t}\n\n\treturn { id: id, points: pts, size: function () { return pts.length; } };\n}\n\n/**\n * Estimate a sensible weld epsilon from a soup's mean edge length (~1e-6 of it),\n * for callers that don't supply their own tolerance. Sampled over the first N tris.\n *\n * @param {Array<{ v0, v1, v2 }>} soup\n * @returns {number} A small positive epsilon in metres.\n */\nexport function estimateWeldEps(soup) {\n\tif (!soup || soup.length === 0) return 1e-6;\n\tvar n = Math.min(soup.length, 200);\n\tvar sum = 0, cnt = 0;\n\tfor (var i = 0; i < n; i++) {\n\t\tvar t = soup[i];\n\t\tsum += edgeLen(t.v0, t.v1) + edgeLen(t.v1, t.v2) + edgeLen(t.v2, t.v0);\n\t\tcnt += 3;\n\t}\n\tvar avg = cnt > 0 ? sum / cnt : 1;\n\tvar eps = avg * 1e-6;\n\treturn eps > 0 ? eps : 1e-6;\n}\n\nfunction edgeLen(a, b) {\n\tvar dx = a.x - b.x, dy = a.y - b.y, dz = a.z - b.z;\n\treturn Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n","/**\n * @module repair/resolveTJunctionsHoleFree\n *\n * Hole-free T-junction resolution.\n *\n * A T-junction is a vertex that lies on the interior of another triangle's edge\n * without splitting it — a crack that breaks watertightness and z-fights on render.\n *\n * The existing resolveTJunctions() keys vertices with toFixed(6) STRINGS and samples\n * each edge independently, so two triangles sharing an edge can disagree about that\n * edge's split points and the mesh tears open. This variant is HOLE-FREE by\n * construction:\n *\n *   1. Weld the soup to a shared neighbourhood-pool integer identity. Now an edge\n *      (a,b) is the SAME pair of ids for both triangles that share it.\n *   2. For every triangle, collect the interior vertices that lie on its three edges\n *      (from the single shared vertex set). Both triangles across a shared edge find\n *      the IDENTICAL set on that edge -> they split it the same way -> no crack.\n *   3. Re-triangulate each affected triangle with those on-edge vertices via a\n *      local-frame Delaunay triangulation (never a corner fan, which would emit\n *      collinear zero-area slivers), keeping only sub-triangles inside the parent\n *      and re-orienting each to the source normal.\n *\n * Only EXISTING vertices are inserted (no new points are minted), so the pass\n * converges in a couple of iterations; a small bounded loop mops up the rare case\n * where a fresh interior diagonal itself grazes a vertex.\n *\n * Identity is a neighbourhood weld, not toFixed and not exact rationals — welding is\n * a tolerance operation. The on-edge test is a distance-to-segment tolerance test;\n * exact rationals do not apply to \"close enough to be a T-junction\".\n */\n\nimport Delaunator from \"delaunator\";\nimport { makeWeldPool } from \"./neighbourhoodPool.js\";\n\n/**\n * @param {Array<{ v0:{x,y,z}, v1:{x,y,z}, v2:{x,y,z} }>} soup - Triangle soup\n * @param {number} [tolerance=1e-4] - Weld + on-edge tolerance in metres. Pass the\n *                                    caller's own weld epsilon for predictable results.\n * @param {number} [maxPasses=4] - Safety bound on the convergence loop.\n * @returns {Array<{ v0:{x,y,z}, v1:{x,y,z}, v2:{x,y,z} }>} New soup, T-junctions resolved.\n */\nexport function resolveTJunctionsHoleFree(soup, tolerance, maxPasses) {\n\tif (!soup || soup.length === 0) return soup;\n\tvar tol = tolerance > 0 ? tolerance : 1e-4;\n\tvar passes = maxPasses > 0 ? maxPasses : 4;\n\tvar tol2 = tol * tol;\n\n\tvar work = soup;\n\tfor (var pass = 0; pass < passes; pass++) {\n\t\t// (1) shared identity\n\t\tvar pool = makeWeldPool(tol);\n\t\tvar F = new Array(work.length);\n\t\tfor (var i = 0; i < work.length; i++) {\n\t\t\tvar t = work[i];\n\t\t\tF[i] = [\n\t\t\t\tpool.id(t.v0.x, t.v0.y, t.v0.z),\n\t\t\t\tpool.id(t.v1.x, t.v1.y, t.v1.z),\n\t\t\t\tpool.id(t.v2.x, t.v2.y, t.v2.z)\n\t\t\t];\n\t\t}\n\t\tvar V = pool.points;\n\n\t\t// Vertex grid for on-edge queries. The cell MUST be sized to the mean edge\n\t\t// length, NOT the tolerance: interiorOnEdge walks along each edge in steps of\n\t\t// one cell, so a tol-sized cell (e.g. 0.016 m) makes a 50 m edge take ~3000\n\t\t// steps (measured 25 s on an 876-tri piece). A mean-edge cell keeps it to a\n\t\t// handful of steps per edge while still bucketing ~1 vertex per cell.\n\t\tvar eSum = 0, eCnt = 0, nSamp = Math.min(work.length, 300);\n\t\tfor (var es = 0; es < nSamp; es++) {\n\t\t\tvar et = work[es];\n\t\t\teSum += edist(et.v0, et.v1) + edist(et.v1, et.v2) + edist(et.v2, et.v0);\n\t\t\teCnt += 3;\n\t\t}\n\t\tvar avgEdge = eCnt > 0 ? eSum / eCnt : 1;\n\t\tvar gcell = Math.max(avgEdge, tol * 4, 1e-6);\n\t\tvar ginv = 1 / gcell;\n\t\tvar vgrid = new Map();\n\t\tfor (var vi = 0; vi < V.length; vi++) {\n\t\t\tvar gk = Math.floor(V[vi].x * ginv) + \",\" + Math.floor(V[vi].y * ginv) + \",\" + Math.floor(V[vi].z * ginv);\n\t\t\tvar gb = vgrid.get(gk);\n\t\t\tif (!gb) { gb = []; vgrid.set(gk, gb); }\n\t\t\tgb.push(vi);\n\t\t}\n\n\t\tfunction interiorOnEdge(a, b) {\n\t\t\tvar A = V[a], B = V[b];\n\t\t\tvar dx = B.x - A.x, dy = B.y - A.y, dz = B.z - A.z;\n\t\t\tvar L2 = dx * dx + dy * dy + dz * dz;\n\t\t\tif (L2 < 1e-20) return null;\n\t\t\tvar hits = null;\n\t\t\t// Walk ALONG the segment (spacing <= one grid cell) and test the 27-cell\n\t\t\t// neighbourhood of each sample. This is O(length/cell), not O(bbox area) —\n\t\t\t// a long diagonal edge would otherwise sweep hundreds of thousands of cells.\n\t\t\tvar L = Math.sqrt(L2);\n\t\t\tvar steps = Math.ceil(L * ginv) + 1;\n\t\t\tvar seen = null; // lazily allocated Set of vertex ids already tested\n\t\t\tfor (var st = 0; st <= steps; st++) {\n\t\t\t\tvar f = st / steps;\n\t\t\t\tvar sx = A.x + f * dx, sy = A.y + f * dy, sz = A.z + f * dz;\n\t\t\t\tvar bx = Math.floor(sx * ginv), by = Math.floor(sy * ginv), bz = Math.floor(sz * ginv);\n\t\t\t\tfor (var ox = -1; ox <= 1; ox++) {\n\t\t\t\t\tfor (var oy = -1; oy <= 1; oy++) {\n\t\t\t\t\t\tfor (var oz = -1; oz <= 1; oz++) {\n\t\t\t\t\t\t\tvar arr = vgrid.get((bx + ox) + \",\" + (by + oy) + \",\" + (bz + oz));\n\t\t\t\t\t\t\tif (!arr) continue;\n\t\t\t\t\t\t\tfor (var k = 0; k < arr.length; k++) {\n\t\t\t\t\t\t\t\tvar v = arr[k];\n\t\t\t\t\t\t\t\tif (v === a || v === b) continue;\n\t\t\t\t\t\t\t\tif (seen && seen.has(v)) continue;\n\t\t\t\t\t\t\t\tif (!seen) seen = new Set();\n\t\t\t\t\t\t\t\tseen.add(v);\n\t\t\t\t\t\t\t\tvar P = V[v];\n\t\t\t\t\t\t\t\tvar s = ((P.x - A.x) * dx + (P.y - A.y) * dy + (P.z - A.z) * dz) / L2;\n\t\t\t\t\t\t\t\tif (s <= 1e-9 || s >= 1 - 1e-9) continue; // strictly interior\n\t\t\t\t\t\t\t\tvar px = A.x + s * dx, py = A.y + s * dy, pz = A.z + s * dz;\n\t\t\t\t\t\t\t\tvar ex = P.x - px, ey = P.y - py, ez = P.z - pz;\n\t\t\t\t\t\t\t\tif (ex * ex + ey * ey + ez * ez > tol2) continue;\n\t\t\t\t\t\t\t\tif (!hits) hits = [];\n\t\t\t\t\t\t\t\t// Keep the perpendicular projection (px,py,pz) — the point EXACTLY on\n\t\t\t\t\t\t\t\t// this edge. collect() inserts that, not the neighbour's raw vertex.\n\t\t\t\t\t\t\t\thits.push({ v: v, s: s, sx: px, sy: py, sz: pz });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hits) hits.sort(function (p, q) { return p.s - q.s; });\n\t\t\treturn hits;\n\t\t}\n\n\t\t// (2)+(3)\n\t\tvar out = [];\n\t\tvar splits = 0;\n\t\tfor (var fi = 0; fi < F.length; fi++) {\n\t\t\tvar f = F[fi];\n\t\t\tif (f[0] === f[1] || f[1] === f[2] || f[2] === f[0]) continue; // drop welded-degenerate\n\t\t\tvar e01 = interiorOnEdge(f[0], f[1]);\n\t\t\tvar e12 = interiorOnEdge(f[1], f[2]);\n\t\t\tvar e20 = interiorOnEdge(f[2], f[0]);\n\t\t\tif (!e01 && !e12 && !e20) {\n\t\t\t\tout.push({ v0: V[f[0]], v1: V[f[1]], v2: V[f[2]] });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar steiner = [];\n\t\t\tcollect(e01, V, steiner);\n\t\t\tcollect(e12, V, steiner);\n\t\t\tcollect(e20, V, steiner);\n\t\t\tvar sub = retriangulate(V[f[0]], V[f[1]], V[f[2]], steiner);\n\t\t\tfor (var si = 0; si < sub.length; si++) out.push(sub[si]);\n\t\t\tsplits++;\n\t\t}\n\n\t\twork = out;\n\t\tif (splits === 0) break;\n\t}\n\treturn work;\n}\n\nfunction edist(a, b) {\n\tvar dx = a.x - b.x, dy = a.y - b.y, dz = a.z - b.z;\n\treturn Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\nfunction collect(hits, V, into) {\n\tif (!hits) return;\n\t// Insert each on-edge hit SNAPPED exactly onto the host edge (its perpendicular\n\t// projection sx,sy,sz), NOT the neighbour's raw vertex. A hanging vertex a fraction\n\t// off the edge — the norm for boolean/clip seams, where the neighbour's vertex lands\n\t// within tolerance of but not ON the edge — would otherwise leave the re-triangulated\n\t// fan non-conforming: near-collinear points make Delaunay emit slivers, some fall just\n\t// outside the parent and get dropped (holes), and the point stays a T-junction on the\n\t// new sub-edges. Snapping puts it dead on the edge so the fan tiles the parent exactly.\n\t// The snap moves the point by ≤ tol, so the next pass's weld pool re-merges it with the\n\t// neighbour's vertex → hole-free. Shared-edge case stays consistent: both incident\n\t// triangles project the same neighbour vertex to the same segment point.\n\tfor (var i = 0; i < hits.length; i++) into.push({ x: hits[i].sx, y: hits[i].sy, z: hits[i].sz });\n}\n\n/**\n * Re-triangulate one triangle with points that lie on its edges, via a local-frame\n * Delaunay triangulation. Keeps sub-triangles whose centroid is inside the parent,\n * drops sub-tolerance slivers, and orients each sub-triangle to the source normal.\n */\nfunction retriangulate(v0, v1, v2, steiner) {\n\tif (!steiner || steiner.length === 0) return [{ v0: v0, v1: v1, v2: v2 }];\n\n\tvar e1x = v1.x - v0.x, e1y = v1.y - v0.y, e1z = v1.z - v0.z;\n\tvar e2x = v2.x - v0.x, e2y = v2.y - v0.y, e2z = v2.z - v0.z;\n\tvar e1L = Math.sqrt(e1x * e1x + e1y * e1y + e1z * e1z);\n\tif (e1L < 1e-12) return [{ v0: v0, v1: v1, v2: v2 }];\n\tvar ux = e1x / e1L, uy = e1y / e1L, uz = e1z / e1L;\n\n\t// source normal (unnormalised) for orientation\n\tvar snx = e1y * e2z - e1z * e2y;\n\tvar sny = e1z * e2x - e1x * e2z;\n\tvar snz = e1x * e2y - e1y * e2x;\n\tvar nL = Math.sqrt(snx * snx + sny * sny + snz * snz);\n\tif (nL < 1e-12) return [{ v0: v0, v1: v1, v2: v2 }];\n\n\tvar vx = sny * uz - snz * uy, vy = snz * ux - snx * uz, vz = snx * uy - sny * ux;\n\tvar vL = Math.sqrt(vx * vx + vy * vy + vz * vz);\n\tif (vL < 1e-12) return [{ v0: v0, v1: v1, v2: v2 }];\n\tvx /= vL; vy /= vL; vz /= vL;\n\n\tfunction toLocal(p) {\n\t\tvar dx = p.x - v0.x, dy = p.y - v0.y, dz = p.z - v0.z;\n\t\treturn [dx * ux + dy * uy + dz * uz, dx * vx + dy * vy + dz * vz];\n\t}\n\tvar l0 = toLocal(v0), l1 = toLocal(v1), l2 = toLocal(v2);\n\tvar baryD = (l1[1] - l2[1]) * (l0[0] - l2[0]) + (l2[0] - l1[0]) * (l0[1] - l2[1]);\n\tif (Math.abs(baryD) < 1e-12) return [{ v0: v0, v1: v1, v2: v2 }];\n\tfunction bary(pu, pv) {\n\t\tvar a = ((l1[1] - l2[1]) * (pu - l2[0]) + (l2[0] - l1[0]) * (pv - l2[1])) / baryD;\n\t\tvar b = ((l2[1] - l0[1]) * (pu - l2[0]) + (l0[0] - l2[0]) * (pv - l2[1])) / baryD;\n\t\treturn [a, b, 1 - a - b];\n\t}\n\tvar triArea = Math.abs(baryD) * 0.5;\n\n\tvar pts = [v0, v1, v2];\n\tfor (var s = 0; s < steiner.length; s++) pts.push(steiner[s]);\n\tvar n = pts.length;\n\tvar coords = new Float64Array(n * 2);\n\tfor (var j = 0; j < n; j++) {\n\t\tvar lj = toLocal(pts[j]);\n\t\tcoords[j * 2] = lj[0];\n\t\tcoords[j * 2 + 1] = lj[1];\n\t}\n\n\tvar del;\n\ttry { del = new Delaunator(coords); }\n\tcatch (e) { return [{ v0: v0, v1: v1, v2: v2 }]; }\n\n\tvar res = [];\n\tvar dt = del.triangles;\n\tfor (var k = 0; k < dt.length; k += 3) {\n\t\tvar a = dt[k], b = dt[k + 1], c = dt[k + 2];\n\t\tvar cu = (coords[a * 2] + coords[b * 2] + coords[c * 2]) / 3;\n\t\tvar cv = (coords[a * 2 + 1] + coords[b * 2 + 1] + coords[c * 2 + 1]) / 3;\n\t\tvar cb = bary(cu, cv);\n\t\tif (cb[0] < -1e-6 || cb[1] < -1e-6 || cb[2] < -1e-6) continue; // outside parent\n\t\tvar au = coords[a * 2], av = coords[a * 2 + 1];\n\t\tvar bu = coords[b * 2], bv = coords[b * 2 + 1];\n\t\tvar cuu = coords[c * 2], cvv = coords[c * 2 + 1];\n\t\tvar subArea = Math.abs((bu - au) * (cvv - av) - (cuu - au) * (bv - av)) * 0.5;\n\t\tif (subArea < triArea * 1e-8) continue; // sliver\n\t\tres.push(orientToNormal(pts[a], pts[b], pts[c], snx, sny, snz));\n\t}\n\treturn res.length ? res : [{ v0: v0, v1: v1, v2: v2 }];\n}\n\n// Coplanar fragment -> match the source outward normal (a sign flip is a v1<->v2 swap).\nfunction orientToNormal(a, b, c, snx, sny, snz) {\n\tvar fx = (b.y - a.y) * (c.z - a.z) - (b.z - a.z) * (c.y - a.y);\n\tvar fy = (b.z - a.z) * (c.x - a.x) - (b.x - a.x) * (c.z - a.z);\n\tvar fz = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n\tif (fx * snx + fy * sny + fz * snz < 0) return { v0: a, v1: c, v2: b };\n\treturn { v0: a, v1: b, v2: c };\n}\n","/**\n * @module repair/cancelCoincidentFaces\n *\n * Cancel EXACT opposite-winding coincident triangle pairs — the zero-thickness\n * internal \"membranes\" that a polygon/prism cut can leave behind when a grazing\n * cut welds a sub-tolerance sliver back onto the surface with the reverse winding.\n *\n * Two faces cancel iff, after a neighbourhood weld (shared integer identity), they\n * reference the SAME three vertices with OPPOSITE winding. Both faces are removed\n * (a zero-thickness lamina bounds no volume, so removing the pair preserves the\n * signed volume and — because the pair's edges were shared only by the two lamina\n * faces or by the lamina plus its host loop — does NOT open the mesh).\n *\n * This is deliberately STRICTER than removeOverlappingTriangles(), which matches by\n * centroid distance + anti-parallel normals + area ratio and can therefore delete\n * near-coincident but genuinely-distinct wall triangles (tearing holes). Same-winding\n * duplicates and degenerate faces are left untouched here — those belong to\n * deduplicateSeamVertices() / removeDegenerateTriangles().\n *\n * Identity uses a neighbourhood-weld integer pool (round(x/eps) checking the 27\n * neighbouring cells) rather than toFixed() string keys, so vertices that fall\n * either side of a quantisation boundary still weld to one id. Exact rationals are\n * deliberately NOT used for identity: welding is a tolerance operation, and two\n * floats that should be one vertex are almost never bit-identical.\n */\n\nimport { makeWeldPool, estimateWeldEps } from \"./neighbourhoodPool.js\";\n\n/**\n * Remove zero-thickness opposite-winding coincident face pairs.\n *\n * @param {Array<{ v0:{x,y,z}, v1:{x,y,z}, v2:{x,y,z} }>} soup - Triangle soup\n * @param {number} [tolerance] - Weld tolerance in metres. Defaults to an estimate\n *                               from the mean edge length (~1e-6 of it) when omitted;\n *                               pass the caller's own weld epsilon for predictable results.\n * @returns {Array<{ v0:{x,y,z}, v1:{x,y,z}, v2:{x,y,z} }>} New soup with lamina pairs removed.\n */\nexport function cancelCoincidentFaces(soup, tolerance) {\n\tif (!soup || soup.length < 2) return soup ? soup.slice() : soup;\n\n\tvar eps = tolerance > 0 ? tolerance : estimateWeldEps(soup);\n\tvar pool = makeWeldPool(eps);\n\n\t// Face vertex-id triples (original coords are kept for output; the pool is\n\t// identity only — it never moves the emitted geometry).\n\tvar F = new Array(soup.length);\n\tfor (var i = 0; i < soup.length; i++) {\n\t\tvar t = soup[i];\n\t\tF[i] = [\n\t\t\tpool.id(t.v0.x, t.v0.y, t.v0.z),\n\t\t\tpool.id(t.v1.x, t.v1.y, t.v1.z),\n\t\t\tpool.id(t.v2.x, t.v2.y, t.v2.z)\n\t\t];\n\t}\n\n\t// Winding-preserving canonical rotation key (smallest id first, order kept).\n\tfunction rot(a, b, c) {\n\t\tif (a <= b && a <= c) return a + \",\" + b + \",\" + c;\n\t\tif (b <= a && b <= c) return b + \",\" + c + \",\" + a;\n\t\treturn c + \",\" + a + \",\" + b;\n\t}\n\n\t// Bucket non-degenerate faces by their own winding key.\n\tvar byWinding = new Map();\n\tfor (var j = 0; j < F.length; j++) {\n\t\tvar f = F[j];\n\t\tif (f[0] === f[1] || f[1] === f[2] || f[2] === f[0]) continue; // degenerate: leave it\n\t\tvar k = rot(f[0], f[1], f[2]);\n\t\tvar b = byWinding.get(k);\n\t\tif (!b) { b = []; byWinding.set(k, b); }\n\t\tb.push(j);\n\t}\n\n\t// Mark each face dead once paired with an unused opposite-winding twin.\n\tvar dead = new Uint8Array(F.length);\n\tfor (var m = 0; m < F.length; m++) {\n\t\tif (dead[m]) continue;\n\t\tvar fm = F[m];\n\t\tif (fm[0] === fm[1] || fm[1] === fm[2] || fm[2] === fm[0]) continue;\n\t\tvar revKey = rot(fm[0], fm[2], fm[1]); // same 3 ids, reversed winding\n\t\tvar cand = byWinding.get(revKey);\n\t\tif (!cand) continue;\n\t\tfor (var q = 0; q < cand.length; q++) {\n\t\t\tvar jj = cand[q];\n\t\t\tif (jj !== m && !dead[jj]) { dead[m] = 1; dead[jj] = 1; break; }\n\t\t}\n\t}\n\n\tvar out = [];\n\tfor (var r = 0; r < soup.length; r++) if (!dead[r]) out.push(soup[r]);\n\treturn out;\n}\n","/**\n * @module util/indexGroups\n *\n * Convert the boolean split GROUPS ({v0,v1,v2} object soup) into a compact INDEXED\n * representation: one shared vertex pool + per-group triangles as [i,j,k] index\n * triples into that pool.\n *\n * Why: the soup form stores every triangle's three vertices as separate objects\n * (~5-10x heavier than indexed), so consumers that need to render/persist a\n * multi-million-triangle result are forced to re-dedupe it themselves — or run out\n * of memory. This returns the indexed twin ONCE, cheaply, sharing the pool ACROSS\n * all four groups so the seam between aInside/aOutside welds automatically.\n *\n * Back-compatible: this is additive. The soup `groups` are unchanged; callers opt\n * in (bmsBooleanOp `{ indexed: true }`) or call this directly on any soup groups.\n */\n\n/**\n * @param {{ aInside?: Array, aOutside?: Array, bInside?: Array, bOutside?: Array }} groups\n *        soup groups ({ v0, v1, v2 } triangles)\n * @param {number} [tolerance=1e-4] - vertex-weld quantization (world units)\n * @returns {{\n *   points: Array<{x:number,y:number,z:number}>,\n *   groups: { aInside: number[][], aOutside: number[][], bInside: number[][], bOutside: number[][] }\n * }}\n */\nexport function indexGroups(groups, tolerance) {\n\ttolerance = tolerance || 1e-4;\n\tvar inv = 1 / tolerance;\n\tvar points = [];\n\tvar map = new Map();\n\n\tfunction id(v) {\n\t\t// Quantized coordinate key. The groups are already seam-deduplicated upstream,\n\t\t// so value-identical vertices map to one index; genuinely distinct stay apart.\n\t\tvar key = Math.round(v.x * inv) + \",\" + Math.round(v.y * inv) + \",\" + Math.round(v.z * inv);\n\t\tvar i = map.get(key);\n\t\tif (i === undefined) { i = points.length; points.push({ x: v.x, y: v.y, z: v.z }); map.set(key, i); }\n\t\treturn i;\n\t}\n\n\tvar names = [\"aInside\", \"aOutside\", \"bInside\", \"bOutside\"];\n\tvar out = { points: points, groups: { aInside: [], aOutside: [], bInside: [], bOutside: [] } };\n\tfor (var g = 0; g < names.length; g++) {\n\t\tvar arr = groups[names[g]] || [];\n\t\tvar tris = out.groups[names[g]];\n\t\tfor (var i = 0; i < arr.length; i++) {\n\t\t\tvar t = arr[i];\n\t\t\ttris.push([id(t.v0), id(t.v1), id(t.v2)]);\n\t\t}\n\t}\n\treturn out;\n}\n\n/**\n * Flatten indexed groups into typed arrays: one shared Float64Array of positions\n * and a Uint32Array of triangle indices per group. Convenient for transfer/GPU\n * upload. Positions are the SAME pool across all groups (indices are global).\n *\n * @param {ReturnType<typeof indexGroups>} indexed\n * @returns {{\n *   positions: Float64Array,\n *   index: { aInside: Uint32Array, aOutside: Uint32Array, bInside: Uint32Array, bOutside: Uint32Array }\n * }}\n */\nexport function indexGroupsToTypedArrays(indexed) {\n\tvar pts = indexed.points;\n\tvar positions = new Float64Array(pts.length * 3);\n\tfor (var i = 0; i < pts.length; i++) {\n\t\tpositions[i * 3] = pts[i].x;\n\t\tpositions[i * 3 + 1] = pts[i].y;\n\t\tpositions[i * 3 + 2] = pts[i].z;\n\t}\n\tvar names = [\"aInside\", \"aOutside\", \"bInside\", \"bOutside\"];\n\tvar index = {};\n\tfor (var g = 0; g < names.length; g++) {\n\t\tvar tris = indexed.groups[names[g]] || [];\n\t\tvar arr = new Uint32Array(tris.length * 3);\n\t\tfor (var t = 0; t < tris.length; t++) {\n\t\t\tarr[t * 3] = tris[t][0];\n\t\t\tarr[t * 3 + 1] = tris[t][1];\n\t\t\tarr[t * 3 + 2] = tris[t][2];\n\t\t}\n\t\tindex[names[g]] = arr;\n\t}\n\treturn { positions: positions, index: index };\n}\n","/**\n * @module normals/orientSolid\n *\n * Topological solid orientation — the two-step fix for \"mixed normals\":\n *\n *   Step 1 (COHERENCE): flood-fill across shared manifold edges, flipping each\n *   neighbour so that adjacent triangles traverse their shared edge in opposite\n *   directions. Pure topology — no centroid rays, no Z-up guessing. After this\n *   every triangle in a connected component agrees: all-out or all-in.\n *\n *   Step 2 (DIRECTION): one global decision per component via signed volume —\n *   negative volume means the coherent family points inward, so flip the whole\n *   component. Exact for closed components; open sheets are left as-coherent\n *   (their signed volume is reported but not acted on).\n *\n * Born 2026-06-11: a boolean result built from a survey DXF (3DFACE entities\n * carry no winding convention) was watertight but had 16k+ winding violations —\n * a checkerboard of flipped patches. Every volume tool reported a different\n * wrong number, and per-triangle In/Out heuristics could not fix it.\n *\n * Propagation deliberately does NOT cross non-manifold edges (3+ triangles):\n * orientation is ambiguous there; each fan side is handled by whichever\n * manifold path reaches it first.\n */\n\nimport { vKey } from \"../util/math.js\";\n\n/**\n * Orient a triangle soup so each connected component is winding-coherent and\n * (for closed components) outward-facing.\n *\n * Does not mutate the input soup; flipped triangles are new objects, untouched\n * triangles are passed through by reference.\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 {boolean} [options.outward=true] - Closed components face outward\n *        (positive signed volume). Set false for inward.\n * @returns {{\n *   soup: Array,\n *   diagnostics: {\n *     components: number,\n *     flippedForCoherence: number,\n *     componentsFlippedForDirection: number,\n *     windingViolationsBefore: number,\n *     windingViolationsAfter: number,\n *     signedVolume: number,\n *     closedComponents: number,\n *     openComponents: number\n *   }\n * }}\n */\nexport function orientSolid(soup, options) {\n\tvar opts = options || {};\n\tvar outward = opts.outward !== false;\n\tvar n = soup.length;\n\n\t// ── Build adjacency over undirected edges ──\n\t// edgeKey -> [{ tri: index, dir: \"ab\"|\"ba\" }] where dir records whether the\n\t// triangle traverses the edge from the lexically smaller key to the larger.\n\tvar edgeMap = {};\n\tvar triKeys = new Array(n);\n\n\tfunction edgeId(a, b) { return a < b ? a + \"|\" + b : b + \"|\" + a; }\n\n\tfor (var i = 0; i < n; i++) {\n\t\tvar t = soup[i];\n\t\tvar ks = [vKey(t.v0), vKey(t.v1), vKey(t.v2)];\n\t\ttriKeys[i] = ks;\n\t\tfor (var e = 0; e < 3; e++) {\n\t\t\tvar a = ks[e], b = ks[(e + 1) % 3];\n\t\t\tvar id = edgeId(a, b);\n\t\t\t(edgeMap[id] = edgeMap[id] || []).push({ tri: i, dir: a < b ? \"ab\" : \"ba\" });\n\t\t}\n\t}\n\n\tfunction countViolations(flippedArr) {\n\t\t// Two manifold neighbours are coherent when they traverse the shared\n\t\t// edge in OPPOSITE directions (after accounting for flips).\n\t\tvar v = 0;\n\t\tfor (var id in edgeMap) {\n\t\t\tvar users = edgeMap[id];\n\t\t\tif (users.length !== 2) continue;\n\t\t\tvar d0 = users[0].dir === \"ab\" ? 1 : -1;\n\t\t\tvar d1 = users[1].dir === \"ab\" ? 1 : -1;\n\t\t\tif (flippedArr) {\n\t\t\t\tif (flippedArr[users[0].tri]) d0 = -d0;\n\t\t\t\tif (flippedArr[users[1].tri]) d1 = -d1;\n\t\t\t}\n\t\t\tif (d0 === d1) v++;\n\t\t}\n\t\treturn v;\n\t}\n\n\tvar violationsBefore = countViolations(null);\n\n\t// ── Step 1: coherence flood fill (manifold edges only) ──\n\tvar flipped = new Uint8Array(n);\n\tvar visited = new Uint8Array(n);\n\tvar componentOf = new Int32Array(n);\n\tvar componentCount = 0;\n\tvar flippedForCoherence = 0;\n\n\tfor (var seed = 0; seed < n; seed++) {\n\t\tif (visited[seed]) continue;\n\t\tvar queue = [seed];\n\t\tvisited[seed] = 1;\n\t\tcomponentOf[seed] = componentCount;\n\n\t\tvar head = 0;\n\t\twhile (head < queue.length) {\n\t\t\tvar cur = queue[head++];\n\t\t\tvar ks2 = triKeys[cur];\n\t\t\tfor (var e2 = 0; e2 < 3; e2++) {\n\t\t\t\tvar a2 = ks2[e2], b2 = ks2[(e2 + 1) % 3];\n\t\t\t\tvar users2 = edgeMap[edgeId(a2, b2)];\n\t\t\t\tif (!users2 || users2.length !== 2) continue; // boundary or non-manifold: don't propagate\n\t\t\t\tvar other = users2[0].tri === cur ? users2[1] : users2[0];\n\t\t\t\tif (visited[other.tri]) continue;\n\t\t\t\tvar self = users2[0].tri === cur ? users2[0] : users2[1];\n\n\t\t\t\t// Effective directions after current flip states\n\t\t\t\tvar dSelf = (self.dir === \"ab\" ? 1 : -1) * (flipped[cur] ? -1 : 1);\n\t\t\t\tvar dOther = (other.dir === \"ab\" ? 1 : -1);\n\t\t\t\t// Coherent neighbours traverse opposite: if same, the neighbour\n\t\t\t\t// must be flipped.\n\t\t\t\tif (dSelf === dOther) {\n\t\t\t\t\tflipped[other.tri] = 1;\n\t\t\t\t\tflippedForCoherence++;\n\t\t\t\t}\n\t\t\t\tvisited[other.tri] = 1;\n\t\t\t\tcomponentOf[other.tri] = componentCount;\n\t\t\t\tqueue.push(other.tri);\n\t\t\t}\n\t\t}\n\t\tcomponentCount++;\n\t}\n\n\t// ── Coherence-only early exit (preOrient for the winding-number field) ──\n\t// Materialise the soup with ONLY the coherence flips (no per-component\n\t// direction decision). Used to make a self-intersecting, non-orientable\n\t// mesh's per-patch winding CONSISTENT before generalized-winding-number\n\t// queries — the direction step is meaningless (and volume undefined) for\n\t// such input, so it is skipped. windingViolationsAfter here reports the\n\t// residual non-orientable seam (0 for orientable input).\n\tif (opts.coherenceOnly) {\n\t\tvar cohSoup = new Array(n);\n\t\tfor (var chi = 0; chi < n; chi++) {\n\t\t\tif (flipped[chi]) {\n\t\t\t\tvar cs = soup[chi];\n\t\t\t\tcohSoup[chi] = { v0: cs.v0, v1: cs.v2, v2: cs.v1 };\n\t\t\t} else {\n\t\t\t\tcohSoup[chi] = soup[chi];\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tsoup: cohSoup,\n\t\t\tdiagnostics: {\n\t\t\t\tcomponents: componentCount,\n\t\t\t\tflippedForCoherence: flippedForCoherence,\n\t\t\t\tcomponentsFlippedForDirection: 0,\n\t\t\t\twindingViolationsBefore: violationsBefore,\n\t\t\t\twindingViolationsAfter: countViolations(flipped),\n\t\t\t\tsignedVolume: null,\n\t\t\t\tclosedComponents: 0,\n\t\t\t\topenComponents: 0,\n\t\t\t\tcoherenceOnly: true\n\t\t\t}\n\t\t};\n\t}\n\n\t// ── Step 2: per-component signed volume → global direction ──\n\t// Local origin (first vertex of first triangle of each component) keeps the\n\t// determinant well-conditioned at UTM scale.\n\tvar compVol = new Float64Array(componentCount);\n\tvar compOrigin = new Array(componentCount);\n\tvar compOpenEdges = new Uint32Array(componentCount);\n\n\tfor (var id2 in edgeMap) {\n\t\tvar users3 = edgeMap[id2];\n\t\tif (users3.length === 1) compOpenEdges[componentOf[users3[0].tri]]++;\n\t}\n\n\tfor (var ti = 0; ti < n; ti++) {\n\t\tvar comp = componentOf[ti];\n\t\tvar tt = soup[ti];\n\t\tif (!compOrigin[comp]) compOrigin[comp] = { x: tt.v0.x, y: tt.v0.y, z: tt.v0.z };\n\t\tvar o = compOrigin[comp];\n\t\tvar p0 = tt.v0, p1 = flipped[ti] ? tt.v2 : tt.v1, p2 = flipped[ti] ? tt.v1 : tt.v2;\n\t\tvar ax = p0.x - o.x, ay = p0.y - o.y, az = p0.z - o.z;\n\t\tvar bx = p1.x - o.x, by = p1.y - o.y, bz = p1.z - o.z;\n\t\tvar cx = p2.x - o.x, cy = p2.y - o.y, cz = p2.z - o.z;\n\t\tcompVol[comp] += ax * (by * cz - bz * cy) - ay * (bx * cz - bz * cx) + az * (bx * cy - by * cx);\n\t}\n\n\tvar componentsFlippedForDirection = 0;\n\tvar closedComponents = 0;\n\tvar openComponents = 0;\n\tvar totalSignedVolume = 0;\n\n\tvar flipComponent = new Uint8Array(componentCount);\n\tfor (var c = 0; c < componentCount; c++) {\n\t\tvar vol = compVol[c] / 6;\n\t\tvar isClosed = compOpenEdges[c] === 0;\n\t\tif (isClosed) closedComponents++; else openComponents++;\n\t\tif (isClosed && ((outward && vol < 0) || (!outward && vol > 0))) {\n\t\t\tflipComponent[c] = 1;\n\t\t\tcomponentsFlippedForDirection++;\n\t\t\tvol = -vol;\n\t\t}\n\t\ttotalSignedVolume += vol;\n\t}\n\n\t// ── Materialise the result soup ──\n\tvar outSoup = new Array(n);\n\tfor (var oi = 0; oi < n; oi++) {\n\t\tvar doFlip = (flipped[oi] === 1) !== (flipComponent[componentOf[oi]] === 1);\n\t\tif (doFlip) {\n\t\t\tvar st = soup[oi];\n\t\t\toutSoup[oi] = { v0: st.v0, v1: st.v2, v2: st.v1 };\n\t\t} else {\n\t\t\toutSoup[oi] = soup[oi];\n\t\t}\n\t}\n\n\t// Recount violations on the final orientation\n\tvar finalFlip = new Uint8Array(n);\n\tfor (var fi = 0; fi < n; fi++) {\n\t\tfinalFlip[fi] = (flipped[fi] === 1) !== (flipComponent[componentOf[fi]] === 1) ? 1 : 0;\n\t}\n\tvar violationsAfter = countViolations(finalFlip);\n\n\treturn {\n\t\tsoup: outSoup,\n\t\tdiagnostics: {\n\t\t\tcomponents: componentCount,\n\t\t\tflippedForCoherence: flippedForCoherence,\n\t\t\tcomponentsFlippedForDirection: componentsFlippedForDirection,\n\t\t\twindingViolationsBefore: violationsBefore,\n\t\t\twindingViolationsAfter: violationsAfter,\n\t\t\tsignedVolume: totalSignedVolume,\n\t\t\tclosedComponents: closedComponents,\n\t\t\topenComponents: openComponents\n\t\t}\n\t};\n}\n","/**\r\n * @module normals/classifyDirection\r\n *\r\n * Classify the normal direction of a triangle mesh.\r\n * Includes volume computation, projected area, and surface area.\r\n */\r\n\r\nimport { triNormal } from \"./triNormal.js\";\r\n\r\n/**\r\n * Classify normal direction of a triangle mesh.\r\n *\r\n * For closed solids: uses signed volume to determine \"Out\" (outward-facing)\r\n * or \"In\" (inward-facing).\r\n *\r\n * For open surfaces: computes area-weighted average normal to determine\r\n * dominant axis (Z+, Z-, Y+, Y-, X+, X-), or \"Aligned\" if consistent\r\n * but not axis-dominant, or \"Chaos\" if normals are inconsistent.\r\n *\r\n * @param {Array} tris - Triangle soup\r\n * @param {boolean} isClosed - Whether the mesh is closed\r\n * @param {number} signedVolume - Signed volume from divergence theorem\r\n * @returns {string} Classification label\r\n */\r\nexport function classifyNormalDirection(tris, isClosed, signedVolume) {\r\n\tif (tris.length === 0) return \"N/A\";\r\n\r\n\tvar sumNx = 0, sumNy = 0, sumNz = 0;\r\n\tvar totalArea = 0;\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar v0 = tris[i].v0, v1 = tris[i].v1, v2 = tris[i].v2;\r\n\t\tvar ux = v1.x - v0.x, uy = v1.y - v0.y, uz = v1.z - v0.z;\r\n\t\tvar vx = v2.x - v0.x, vy = v2.y - v0.y, vz = v2.z - v0.z;\r\n\t\tvar cx = uy * vz - uz * vy;\r\n\t\tvar cy = uz * vx - ux * vz;\r\n\t\tvar cz = ux * vy - uy * vx;\r\n\t\tvar area = 0.5 * Math.sqrt(cx * cx + cy * cy + cz * cz);\r\n\t\tif (area < 1e-12) continue;\r\n\r\n\t\tsumNx += cx * 0.5;\r\n\t\tsumNy += cy * 0.5;\r\n\t\tsumNz += cz * 0.5;\r\n\t\ttotalArea += area;\r\n\t}\r\n\r\n\tif (totalArea < 1e-12) return \"N/A\";\r\n\r\n\tif (isClosed) {\r\n\t\tif (signedVolume > 1e-6) return \"Out\";\r\n\t\tif (signedVolume < -1e-6) return \"In\";\r\n\t}\r\n\r\n\tvar avgLen = Math.sqrt(sumNx * sumNx + sumNy * sumNy + sumNz * sumNz);\r\n\tvar consistency = avgLen / totalArea;\r\n\r\n\tif (consistency < 0.15) {\r\n\t\tif (signedVolume > 1e-6) return isClosed ? \"Out\" : \"~Out\";\r\n\t\tif (signedVolume < -1e-6) return isClosed ? \"In\" : \"~In\";\r\n\t\treturn \"Chaos\";\r\n\t}\r\n\r\n\tvar nx = sumNx / avgLen;\r\n\tvar ny = sumNy / avgLen;\r\n\tvar nz = sumNz / avgLen;\r\n\r\n\tvar ax = Math.abs(nx), ay = Math.abs(ny), az = Math.abs(nz);\r\n\r\n\tif (az > 0.7 && az >= ax && az >= ay) {\r\n\t\treturn nz > 0 ? \"Z+\" : \"Z-\";\r\n\t}\r\n\tif (ax > 0.7 && ax >= ay && ax >= az) {\r\n\t\treturn nx > 0 ? \"X+\" : \"X-\";\r\n\t}\r\n\tif (ay > 0.7 && ay >= ax && ay >= az) {\r\n\t\treturn ny > 0 ? \"Y+\" : \"Y-\";\r\n\t}\r\n\r\n\tif (consistency > 0.5) return \"Aligned\";\r\n\r\n\treturn \"Chaos\";\r\n}\r\n\r\n/**\r\n * Compute signed mesh volume from triangle soup using divergence theorem.\r\n * Translates to local centroid to avoid floating-point issues with large coordinates.\r\n *\r\n * @param {Array} tris - Triangle soup [{v0, v1, v2}, ...]\r\n * @returns {number} Signed volume (positive = outward normals)\r\n */\r\nexport function computeSignedVolume(tris) {\r\n\tif (tris.length === 0) return 0;\r\n\r\n\tvar cx = 0, cy = 0, cz = 0;\r\n\tvar n = tris.length;\r\n\tfor (var c = 0; c < n; c++) {\r\n\t\tcx += tris[c].v0.x + tris[c].v1.x + tris[c].v2.x;\r\n\t\tcy += tris[c].v0.y + tris[c].v1.y + tris[c].v2.y;\r\n\t\tcz += tris[c].v0.z + tris[c].v1.z + tris[c].v2.z;\r\n\t}\r\n\tvar inv = 1.0 / (n * 3);\r\n\tcx *= inv; cy *= inv; cz *= inv;\r\n\r\n\tvar vol = 0;\r\n\tfor (var i = 0; i < n; i++) {\r\n\t\tvar x0 = tris[i].v0.x - cx, y0 = tris[i].v0.y - cy, z0 = tris[i].v0.z - cz;\r\n\t\tvar x1 = tris[i].v1.x - cx, y1 = tris[i].v1.y - cy, z1 = tris[i].v1.z - cz;\r\n\t\tvar x2 = tris[i].v2.x - cx, y2 = tris[i].v2.y - cy, z2 = tris[i].v2.z - cz;\r\n\r\n\t\tvol += (x0 * (y1 * z2 - y2 * z1)\r\n\t\t\t- x1 * (y0 * z2 - y2 * z0)\r\n\t\t\t+ x2 * (y0 * z1 - y1 * z0)) / 6.0;\r\n\t}\r\n\r\n\treturn vol;\r\n}\r\n\r\n/**\r\n * Compute projected footprint area onto a plane.\r\n * Only includes front-facing triangles to avoid double-counting.\r\n *\r\n * @param {Array} tris - Triangle soup\r\n * @param {\"xy\"|\"yz\"|\"xz\"} plane\r\n * @returns {number} Projected footprint area\r\n */\r\nexport function computeProjectedArea(tris, plane) {\r\n\tvar area = 0;\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar v0 = tris[i].v0;\r\n\t\tvar v1 = tris[i].v1;\r\n\t\tvar v2 = tris[i].v2;\r\n\t\tvar n = triNormal(tris[i]);\r\n\r\n\t\tif (plane === \"xy\") {\r\n\t\t\tif (n.z <= 0) continue;\r\n\t\t\tvar cross2d = (v1.x - v0.x) * (v2.y - v0.y) - (v2.x - v0.x) * (v1.y - v0.y);\r\n\t\t\tarea += Math.abs(cross2d) / 2.0;\r\n\t\t} else if (plane === \"yz\") {\r\n\t\t\tif (n.x <= 0) continue;\r\n\t\t\tvar cross2d2 = (v1.y - v0.y) * (v2.z - v0.z) - (v2.y - v0.y) * (v1.z - v0.z);\r\n\t\t\tarea += Math.abs(cross2d2) / 2.0;\r\n\t\t} else if (plane === \"xz\") {\r\n\t\t\tif (n.y <= 0) continue;\r\n\t\t\tvar cross2d3 = (v1.x - v0.x) * (v2.z - v0.z) - (v2.x - v0.x) * (v1.z - v0.z);\r\n\t\t\tarea += Math.abs(cross2d3) / 2.0;\r\n\t\t}\r\n\t}\r\n\r\n\treturn area;\r\n}\r\n\r\n/**\r\n * Compute true 3D surface area (sum of actual triangle areas).\r\n *\r\n * @param {Array} tris - Triangle soup\r\n * @returns {number} Total surface area\r\n */\r\nexport function compute3DSurfaceArea(tris) {\r\n\tvar area = 0;\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar v0 = tris[i].v0;\r\n\t\tvar v1 = tris[i].v1;\r\n\t\tvar v2 = tris[i].v2;\r\n\r\n\t\tvar ux = v1.x - v0.x, uy = v1.y - v0.y, uz = v1.z - v0.z;\r\n\t\tvar vx = v2.x - v0.x, vy = v2.y - v0.y, vz = v2.z - v0.z;\r\n\r\n\t\tvar cx = uy * vz - uz * vy;\r\n\t\tvar cy = uz * vx - ux * vz;\r\n\t\tvar cz = ux * vy - uy * vx;\r\n\r\n\t\tarea += 0.5 * Math.sqrt(cx * cx + cy * cy + cz * cz);\r\n\t}\r\n\r\n\treturn area;\r\n}\r\n","/**\r\n * @module boolean/closeBoundary\r\n *\r\n * Boundary closing operations for boolean result meshes. Provides two\r\n * strategies:\r\n *\r\n * 1. **buildCurtainAndCap** -- Extrude boundary edges vertically down to a\r\n *    floor plane, then triangulate the bottom cap. Useful for creating\r\n *    watertight solids from open surfaces.\r\n *\r\n * 2. **generateClosingTriangles** -- Iteratively fill boundary gaps by\r\n *    finding the nearest vertex to each boundary edge and forming a closing\r\n *    triangle. Works well for small gaps along seams.\r\n */\r\n\r\nimport { extractBoundaryLoops, triangulateLoop } from \"../repair/boundaryLoops.js\";\r\nimport { vKey, edgeKey } from \"../util/math.js\";\r\n\r\n/**\r\n * Extrude remaining open boundary edges vertically down to a floor plane,\r\n * then triangulate the bottom cap with constrained Delaunay.\r\n *\r\n * For each boundary loop:\r\n * - Creates curtain wall quads (2 triangles per boundary edge)\r\n * - Triangulates the floor polygon with reversed winding (normals face down)\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} floorOffset - Metres below the minimum Z of the mesh (default 10)\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Additional triangles (curtain walls + bottom cap)\r\n */\r\nexport function buildCurtainAndCap(tris, floorOffset) {\r\n\tvar result = extractBoundaryLoops(tris);\r\n\tif (result.loops.length === 0) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\t// Compute floorZ from all triangle vertices\r\n\tvar minZ = Infinity;\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tif (tri.v0.z < minZ) minZ = tri.v0.z;\r\n\t\tif (tri.v1.z < minZ) minZ = tri.v1.z;\r\n\t\tif (tri.v2.z < minZ) minZ = tri.v2.z;\r\n\t}\r\n\tvar floorZ = minZ - (floorOffset || 10);\r\n\r\n\tvar extraTris = [];\r\n\r\n\tfor (var li = 0; li < result.loops.length; li++) {\r\n\t\tvar loop = result.loops[li];\r\n\r\n\t\t// Build curtain walls: for each boundary edge A->B, create 2 triangles (vertical quad)\r\n\t\tvar floorVerts = []; // floor-level vertices for bottom cap\r\n\t\tfor (var j = 0; j < loop.length; j++) {\r\n\t\t\tvar a = loop[j];\r\n\t\t\tvar b = loop[(j + 1) % loop.length];\r\n\r\n\t\t\t// Top vertices are the boundary vertices\r\n\t\t\t// Bottom vertices are at floorZ with same XY\r\n\t\t\tvar aBot = { x: a.x, y: a.y, z: floorZ };\r\n\t\t\tvar bBot = { x: b.x, y: b.y, z: floorZ };\r\n\r\n\t\t\t// Quad: A-top -> B-top -> B-bot -> A-bot\r\n\t\t\t// Triangle 1: A-top, B-top, B-bot  (winding: outward)\r\n\t\t\textraTris.push({ v0: a, v1: b, v2: bBot });\r\n\t\t\t// Triangle 2: A-top, B-bot, A-bot\r\n\t\t\textraTris.push({ v0: a, v1: bBot, v2: aBot });\r\n\r\n\t\t\tfloorVerts.push(aBot);\r\n\t\t}\r\n\r\n\t\t// Bottom cap: triangulate the floor polygon using Constrained Delaunay\r\n\t\t// Floor is flat at floorZ, so use triangulateLoop which projects to best-fit plane\r\n\t\tvar capTris = triangulateLoop(floorVerts);\r\n\t\tfor (var ci = 0; ci < capTris.length; ci++) {\r\n\t\t\t// Reverse winding so normals face downward\r\n\t\t\textraTris.push({\r\n\t\t\t\tv0: capTris[ci].v2,\r\n\t\t\t\tv1: capTris[ci].v1,\r\n\t\t\t\tv2: capTris[ci].v0\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\treturn extraTris;\r\n}\r\n\r\n/**\r\n * For each boundary edge, find the nearest vertex (not already connected)\r\n * that can form a valid closing triangle. Iterates until no more gaps can\r\n * be filled or a pass adds no new triangles.\r\n *\r\n * Uses a 3D spatial grid for fast nearest-neighbor lookup and validates\r\n * that new edges do not exceed manifold edge sharing limits (max 2 triangles\r\n * per edge).\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} maxDist - Maximum search distance for closing vertex\r\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z}, v2: {x,y,z} }>} Updated triangle soup with closing triangles added\r\n */\r\nexport function generateClosingTriangles(tris, maxDist) {\r\n\t/**\r\n\t * Squared 3D distance between two points.\r\n\t * @param {{ x: number, y: number, z: number }} a\r\n\t * @param {{ x: number, y: number, z: number }} b\r\n\t * @returns {number}\r\n\t */\r\n\tfunction dist3sq(a, b) {\r\n\t\tvar dx = a.x - b.x, dy = a.y - b.y, dz = a.z - b.z;\r\n\t\treturn dx * dx + dy * dy + dz * dz;\r\n\t}\r\n\r\n\t/**\r\n\t * Area of a triangle in 3D via cross product.\r\n\t * @param {{ x: number, y: number, z: number }} a\r\n\t * @param {{ x: number, y: number, z: number }} b\r\n\t * @param {{ x: number, y: number, z: number }} c\r\n\t * @returns {number}\r\n\t */\r\n\tfunction triArea(a, b, c) {\r\n\t\tvar abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z;\r\n\t\tvar acx = c.x - a.x, acy = c.y - a.y, acz = c.z - a.z;\r\n\t\tvar cx = aby * acz - abz * acy;\r\n\t\tvar cy = abz * acx - abx * acz;\r\n\t\tvar cz = abx * acy - aby * acx;\r\n\t\treturn 0.5 * Math.sqrt(cx * cx + cy * cy + cz * cz);\r\n\t}\r\n\r\n\tvar maxDistSq = maxDist * maxDist;\r\n\tvar totalAdded = 0;\r\n\tvar maxPasses = 20;\r\n\r\n\tfor (var pass = 0; pass < maxPasses; pass++) {\r\n\t\t// Build edge count map and vertex position map\r\n\t\tvar edgeMap = {};  // edgeKey -> count\r\n\t\tvar vertPos = {};  // vKey -> {x,y,z}\r\n\r\n\t\tfor (var i = 0; i < tris.length; i++) {\r\n\t\t\tvar tri = tris[i];\r\n\t\t\tvar verts = [tri.v0, tri.v1, tri.v2];\r\n\t\t\tvar keys = [vKey(verts[0]), vKey(verts[1]), vKey(verts[2])];\r\n\r\n\t\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\t\tvertPos[keys[e]] = verts[e];\r\n\t\t\t\tvar ne = (e + 1) % 3;\r\n\t\t\t\tvar ek = edgeKey(keys[e], keys[ne]);\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\t// Collect boundary edges (count === 1)\r\n\t\tvar boundaryEdges = [];\r\n\r\n\t\tfor (var ek2 in edgeMap) {\r\n\t\t\tif (edgeMap[ek2] === 1) {\r\n\t\t\t\tvar parts = ek2.split(\"|\");\r\n\t\t\t\tboundaryEdges.push({ k0: parts[0], k1: parts[1] });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (boundaryEdges.length === 0) {\r\n\t\t\treturn tris;\r\n\t\t}\r\n\r\n\t\t// Build spatial grid of ALL vertices for fast nearest-neighbor lookup\r\n\t\tvar cellSize = Math.max(maxDist, 1.0);\r\n\t\tvar grid = {};\r\n\t\tvar allKeys = Object.keys(vertPos);\r\n\t\tfor (var vi = 0; vi < allKeys.length; vi++) {\r\n\t\t\tvar vp = vertPos[allKeys[vi]];\r\n\t\t\tvar gk = Math.floor(vp.x / cellSize) + \",\" + Math.floor(vp.y / cellSize) + \",\" + Math.floor(vp.z / cellSize);\r\n\t\t\tif (!grid[gk]) grid[gk] = [];\r\n\t\t\tgrid[gk].push(allKeys[vi]);\r\n\t\t}\r\n\r\n\t\t// For each boundary edge, find the best closing vertex\r\n\t\tvar newTris = [];\r\n\t\tvar usedEdges = {}; // prevent double-closing an edge in one pass\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 bek = edgeKey(be.k0, be.k1);\r\n\t\t\tif (usedEdges[bek]) continue;\r\n\r\n\t\t\tvar v0 = vertPos[be.k0];\r\n\t\t\tvar v1 = vertPos[be.k1];\r\n\r\n\t\t\t// Midpoint of boundary edge\r\n\t\t\tvar mid = {\r\n\t\t\t\tx: (v0.x + v1.x) / 2,\r\n\t\t\t\ty: (v0.y + v1.y) / 2,\r\n\t\t\t\tz: (v0.z + v1.z) / 2\r\n\t\t\t};\r\n\r\n\t\t\t// Search nearby cells for candidate vertex\r\n\t\t\tvar bestKey = null;\r\n\t\t\tvar bestDistSq = Infinity;\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\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 ck = cell[ci];\r\n\t\t\t\t\t\t\t// Skip the edge's own vertices\r\n\t\t\t\t\t\t\tif (ck === be.k0 || ck === be.k1) continue;\r\n\r\n\t\t\t\t\t\t\tvar cv = vertPos[ck];\r\n\t\t\t\t\t\t\tvar d2 = dist3sq(mid, cv);\r\n\t\t\t\t\t\t\tif (d2 > maxDistSq) continue;\r\n\t\t\t\t\t\t\tif (d2 >= bestDistSq) continue;\r\n\r\n\t\t\t\t\t\t\t// Check the two new edges wouldn't be over-shared (>2 uses)\r\n\t\t\t\t\t\t\tvar ek0c = edgeKey(be.k0, ck);\r\n\t\t\t\t\t\t\tvar ek1c = edgeKey(be.k1, ck);\r\n\t\t\t\t\t\t\tvar c0 = edgeMap[ek0c] || 0;\r\n\t\t\t\t\t\t\tvar c1 = edgeMap[ek1c] || 0;\r\n\t\t\t\t\t\t\tif (c0 >= 2 || c1 >= 2) continue;\r\n\r\n\t\t\t\t\t\t\t// Check triangle has reasonable area (not degenerate)\r\n\t\t\t\t\t\t\tvar area = triArea(v0, v1, cv);\r\n\t\t\t\t\t\t\tif (area < 1e-6) continue;\r\n\r\n\t\t\t\t\t\t\tbestKey = ck;\r\n\t\t\t\t\t\t\tbestDistSq = 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 (bestKey !== null) {\r\n\t\t\t\tvar cv2 = vertPos[bestKey];\r\n\t\t\t\tnewTris.push({ v0: v0, v1: v1, v2: cv2 });\r\n\r\n\t\t\t\t// Update edge counts so we don't double-close in this pass\r\n\t\t\t\tusedEdges[bek] = true;\r\n\t\t\t\tvar ek0c2 = edgeKey(be.k0, bestKey);\r\n\t\t\t\tvar ek1c2 = edgeKey(be.k1, bestKey);\r\n\t\t\t\tedgeMap[ek0c2] = (edgeMap[ek0c2] || 0) + 1;\r\n\t\t\t\tedgeMap[ek1c2] = (edgeMap[ek1c2] || 0) + 1;\r\n\t\t\t\tedgeMap[bek] = 2; // boundary edge now shared by 2 tris\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (newTris.length === 0) {\r\n\t\t\treturn tris;\r\n\t\t}\r\n\r\n\t\t// Append new triangles\r\n\t\tfor (var ni = 0; ni < newTris.length; ni++) {\r\n\t\t\ttris.push(newTris[ni]);\r\n\t\t}\r\n\t\ttotalAdded += newTris.length;\r\n\t}\r\n\r\n\treturn tris;\r\n}\r\n","/**\r\n * @module bms/bmsVertexPool\r\n *\r\n * Shared vertex pool with spatial hash deduplication.\r\n * Points within tolerance get merged to the same object reference.\r\n * Each pool vertex tracks which triangles from which mesh reference it.\r\n *\r\n * This is the foundation of the BMS pipeline — shared Steiner points\r\n * between both meshes are guaranteed by identity (===), not by\r\n * toFixed string matching.\r\n */\r\n\r\n/**\r\n * @typedef {Object} PoolVertex\r\n * @property {number} x\r\n * @property {number} y\r\n * @property {number} z\r\n * @property {number} id - Unique integer ID for adjacency maps\r\n * @property {Array<{mesh: string, triIdx: number}>} triRefs - Which triangles reference this point\r\n */\r\n\r\n/**\r\n * Create a shared vertex pool with spatial hash deduplication.\r\n *\r\n * @param {number} tolerance - Points within this distance get merged\r\n * @returns {{\r\n *   getOrCreate: function(number, number, number, {mesh: string, triIdx: number}=): PoolVertex,\r\n *   getAll: function(): PoolVertex[],\r\n *   size: function(): number\r\n * }}\r\n */\r\nexport function createVertexPool(tolerance) {\r\n\tvar cellSize = tolerance * 2;\r\n\tif (cellSize < 1e-12) cellSize = 1e-6;\r\n\r\n\t/** @type {Object.<string, PoolVertex[]>} */\r\n\tvar grid = {};\r\n\tvar allVertices = [];\r\n\tvar nextId = 0;\r\n\tvar tolSq = tolerance * tolerance;\r\n\r\n\t/**\r\n\t * Hash a point into a cell key.\r\n\t * @param {number} x\r\n\t * @param {number} y\r\n\t * @param {number} z\r\n\t * @returns {string}\r\n\t */\r\n\tfunction cellKey(x, y, z) {\r\n\t\tvar cx = Math.floor(x / cellSize);\r\n\t\tvar cy = Math.floor(y / cellSize);\r\n\t\tvar cz = Math.floor(z / cellSize);\r\n\t\treturn cx + \",\" + cy + \",\" + cz;\r\n\t}\r\n\r\n\t/**\r\n\t * Search the 27 neighboring cells for the nearest existing vertex\r\n\t * within tolerance.\r\n\t * @param {number} x\r\n\t * @param {number} y\r\n\t * @param {number} z\r\n\t * @returns {PoolVertex|null}\r\n\t */\r\n\tfunction findNearest(x, y, z) {\r\n\t\tvar cx = Math.floor(x / cellSize);\r\n\t\tvar cy = Math.floor(y / cellSize);\r\n\t\tvar cz = Math.floor(z / cellSize);\r\n\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 i = 0; i < bucket.length; i++) {\r\n\t\t\t\t\t\tvar v = bucket[i];\r\n\t\t\t\t\t\tvar ex = v.x - x, ey = v.y - y, ez = v.z - z;\r\n\t\t\t\t\t\tvar d2 = ex * ex + ey * ey + ez * ez;\r\n\t\t\t\t\t\tif (d2 < bestDist) {\r\n\t\t\t\t\t\t\tbestDist = d2;\r\n\t\t\t\t\t\t\tbestVert = v;\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\treturn bestVert;\r\n\t}\r\n\r\n\t/**\r\n\t * Look up or insert a point. If a point within tolerance exists,\r\n\t * return it (and optionally append the triRef). Otherwise create\r\n\t * a new pool vertex.\r\n\t *\r\n\t * @param {number} x\r\n\t * @param {number} y\r\n\t * @param {number} z\r\n\t * @param {{mesh: string, triIdx: number}} [triRef] - Optional triangle reference\r\n\t * @returns {PoolVertex}\r\n\t */\r\n\tfunction getOrCreate(x, y, z, triRef) {\r\n\t\tvar existing = findNearest(x, y, z);\r\n\t\tif (existing) {\r\n\t\t\tif (triRef) {\r\n\t\t\t\t// Don't add duplicate triRefs\r\n\t\t\t\tvar dominated = false;\r\n\t\t\t\tfor (var i = 0; i < existing.triRefs.length; i++) {\r\n\t\t\t\t\tvar r = existing.triRefs[i];\r\n\t\t\t\t\tif (r.mesh === triRef.mesh && r.triIdx === triRef.triIdx) {\r\n\t\t\t\t\t\tdominated = true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!dominated) {\r\n\t\t\t\t\texisting.triRefs.push(triRef);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn existing;\r\n\t\t}\r\n\r\n\t\t// Create new pool vertex\r\n\t\tvar vertex = {\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z,\r\n\t\t\tid: nextId++,\r\n\t\t\ttriRefs: triRef ? [triRef] : []\r\n\t\t};\r\n\r\n\t\t// Insert into spatial hash\r\n\t\tvar key = cellKey(x, y, z);\r\n\t\tif (!grid[key]) grid[key] = [];\r\n\t\tgrid[key].push(vertex);\r\n\r\n\t\tallVertices.push(vertex);\r\n\t\treturn vertex;\r\n\t}\r\n\r\n\t/**\r\n\t * Return all pool vertices.\r\n\t * @returns {PoolVertex[]}\r\n\t */\r\n\tfunction getAll() {\r\n\t\treturn allVertices;\r\n\t}\r\n\r\n\t/**\r\n\t * Return the number of unique vertices in the pool.\r\n\t * @returns {number}\r\n\t */\r\n\tfunction size() {\r\n\t\treturn allVertices.length;\r\n\t}\r\n\r\n\treturn {\r\n\t\tgetOrCreate: getOrCreate,\r\n\t\tgetAll: getAll,\r\n\t\tsize: size\r\n\t};\r\n}\r\n","/**\r\n * @module bms/bmsIntersect\r\n *\r\n * Compute triangle-triangle intersections between two meshes with a\r\n * shared vertex pool. Every intersection segment endpoint goes through\r\n * the pool, so both meshes get the exact same PoolVertex object at\r\n * each intersection location.\r\n */\r\n\r\nimport { triTriIntersection } from \"../intersect/triTriIntersection.js\";\r\nimport { buildSpatialGrid, queryGrid, triBBox, estimateAvgEdge } from \"../intersect/spatialGrid.js\";\r\nimport { createVertexPool } from \"./bmsVertexPool.js\";\r\n\r\n/**\r\n * Compute all intersection segments between two triangle meshes,\r\n * registering every endpoint in a shared vertex pool.\r\n *\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} trisA\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} trisB\r\n * @param {Object} [options]\r\n * @param {number} [options.tolerance] - Pool vertex merge tolerance\r\n * @returns {{\r\n *   segments: Array<{ p0: PoolVertex, p1: PoolVertex, idxA: number, idxB: number }>,\r\n *   crossedSetA: Object.<number, Array>,\r\n *   crossedSetB: Object.<number, Array>,\r\n *   pool: Object\r\n * }}\r\n */\r\nexport function bmsIntersect(trisA, trisB, options) {\r\n\tvar opts = options || {};\r\n\r\n\t// Compute tolerance from average edge length if not provided\r\n\tvar avgEdgeA = estimateAvgEdge(trisA);\r\n\tvar avgEdgeB = estimateAvgEdge(trisB);\r\n\tvar avgEdge = (avgEdgeA + avgEdgeB) / 2;\r\n\tvar tolerance = opts.tolerance !== undefined ? opts.tolerance : avgEdge * 0.001;\r\n\r\n\t// Create shared vertex pool\r\n\tvar pool = createVertexPool(tolerance);\r\n\r\n\t// Build spatial grid on mesh B for acceleration\r\n\tvar cellSize = Math.max(avgEdgeB * 2, 0.1);\r\n\tvar gridB = buildSpatialGrid(trisB, cellSize);\r\n\r\n\tvar segments = [];\r\n\tvar crossedSetA = {};\r\n\tvar crossedSetB = {};\r\n\r\n\tfor (var i = 0; i < trisA.length; i++) {\r\n\t\tvar triA = trisA[i];\r\n\t\tvar bbA = triBBox(triA);\r\n\t\tvar candidates = queryGrid(gridB, bbA, cellSize);\r\n\r\n\t\tfor (var c = 0; c < candidates.length; c++) {\r\n\t\t\tvar j = candidates[c];\r\n\t\t\tvar triB = trisB[j];\r\n\r\n\t\t\tvar seg = triTriIntersection(triA, triB);\r\n\t\t\tif (!seg) continue;\r\n\r\n\t\t\t// Register both endpoints in the shared pool.\r\n\t\t\t// Each endpoint gets triRefs for BOTH the A triangle and B triangle\r\n\t\t\t// that produced it.\r\n\t\t\tvar pv0 = pool.getOrCreate(seg.p0.x, seg.p0.y, seg.p0.z, { mesh: \"A\", triIdx: i });\r\n\t\t\tpool.getOrCreate(seg.p0.x, seg.p0.y, seg.p0.z, { mesh: \"B\", triIdx: j });\r\n\r\n\t\t\tvar pv1 = pool.getOrCreate(seg.p1.x, seg.p1.y, seg.p1.z, { mesh: \"A\", triIdx: i });\r\n\t\t\tpool.getOrCreate(seg.p1.x, seg.p1.y, seg.p1.z, { mesh: \"B\", triIdx: j });\r\n\r\n\t\t\t// Skip zero-length segments (pool dedup merged both endpoints)\r\n\t\t\tif (pv0 === pv1) continue;\r\n\r\n\t\t\tvar taggedSeg = { p0: pv0, p1: pv1, idxA: i, idxB: j };\r\n\t\t\tsegments.push(taggedSeg);\r\n\r\n\t\t\t// Build crossed sets\r\n\t\t\tif (!crossedSetA[i]) crossedSetA[i] = [];\r\n\t\t\tcrossedSetA[i].push(taggedSeg);\r\n\r\n\t\t\tif (!crossedSetB[j]) crossedSetB[j] = [];\r\n\t\t\tcrossedSetB[j].push(taggedSeg);\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tsegments: segments,\r\n\t\tcrossedSetA: crossedSetA,\r\n\t\tcrossedSetB: crossedSetB,\r\n\t\tpool: pool\r\n\t};\r\n}\r\n","/**\r\n * @module bms/bmsChain\r\n *\r\n * Chain intersection segments into ordered polylines using pool vertex\r\n * identity (integer ID lookup). No distance threshold — two segments\r\n * that share a pool vertex are connected by definition.\r\n *\r\n * At junction vertices (degree 3+), picks the smoothest continuation\r\n * by comparing outgoing directions against the incoming direction.\r\n */\r\n\r\n/**\r\n * Chain intersection segments into ordered polylines.\r\n *\r\n * Uses pool vertex IDs for O(1) adjacency lookup. Two segments sharing\r\n * the same PoolVertex are guaranteed to connect (same object reference).\r\n *\r\n * At junction vertices where multiple unused segments meet, the algorithm\r\n * picks the segment whose direction is most aligned with the incoming\r\n * direction (largest dot product), preventing U-turns and backtracks.\r\n *\r\n * @param {Array<{ p0: PoolVertex, p1: PoolVertex, idxA: number, idxB: number }>} segments\r\n * @returns {Array<Array<PoolVertex>>} Array of polylines (each an array of pool vertices)\r\n */\r\nexport function bmsChain(segments) {\r\n\tif (segments.length === 0) return [];\r\n\r\n\t// Build adjacency: poolVertex.id -> [{segIdx, otherEnd: PoolVertex}]\r\n\tvar adj = {};\r\n\r\n\tfor (var i = 0; i < segments.length; i++) {\r\n\t\tvar seg = segments[i];\r\n\t\tvar id0 = seg.p0.id;\r\n\t\tvar id1 = seg.p1.id;\r\n\r\n\t\tif (!adj[id0]) adj[id0] = [];\r\n\t\tadj[id0].push({ segIdx: i, otherEnd: seg.p1 });\r\n\r\n\t\tif (!adj[id1]) adj[id1] = [];\r\n\t\tadj[id1].push({ segIdx: i, otherEnd: seg.p0 });\r\n\t}\r\n\r\n\tvar used = new Uint8Array(segments.length);\r\n\r\n\t/**\r\n\t * Compute unit direction from prev to curr.\r\n\t * Returns null if the points are coincident.\r\n\t */\r\n\tfunction direction(prev, curr) {\r\n\t\tvar dx = curr.x - prev.x;\r\n\t\tvar dy = curr.y - prev.y;\r\n\t\tvar dz = curr.z - prev.z;\r\n\t\tvar len = Math.sqrt(dx * dx + dy * dy + dz * dz);\r\n\t\tif (len < 1e-15) return null;\r\n\t\treturn { x: dx / len, y: dy / len, z: dz / len };\r\n\t}\r\n\r\n\t/**\r\n\t * Pick the best unused neighbor at `vert`. When `inDir` is provided\r\n\t * (junction resolution), pick the neighbor whose outgoing direction\r\n\t * has the largest dot product with inDir (smoothest continuation).\r\n\t * When inDir is null (first step), pick any unused neighbor.\r\n\t */\r\n\tfunction pickBest(vert, inDir) {\r\n\t\tvar neighbors = adj[vert.id];\r\n\t\tif (!neighbors) return null;\r\n\r\n\t\tvar best = null;\r\n\t\tvar bestDot = -Infinity;\r\n\r\n\t\tfor (var ni = 0; ni < neighbors.length; ni++) {\r\n\t\t\tvar nb = neighbors[ni];\r\n\t\t\tif (used[nb.segIdx]) continue;\r\n\r\n\t\t\tif (!inDir) {\r\n\t\t\t\t// No incoming direction — return first available\r\n\t\t\t\treturn nb;\r\n\t\t\t}\r\n\r\n\t\t\t// Compute outgoing direction and score by alignment\r\n\t\t\tvar dx = nb.otherEnd.x - vert.x;\r\n\t\t\tvar dy = nb.otherEnd.y - vert.y;\r\n\t\t\tvar dz = nb.otherEnd.z - vert.z;\r\n\t\t\tvar len = Math.sqrt(dx * dx + dy * dy + dz * dz);\r\n\t\t\tif (len < 1e-15) {\r\n\t\t\t\t// Degenerate segment — lowest priority\r\n\t\t\t\tif (!best) { best = nb; bestDot = -Infinity; }\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar dot = (dx * inDir.x + dy * inDir.y + dz * inDir.z) / len;\r\n\t\t\tif (dot > bestDot) {\r\n\t\t\t\tbestDot = dot;\r\n\t\t\t\tbest = nb;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn best;\r\n\t}\r\n\r\n\tvar polylines = [];\r\n\r\n\tfor (var s = 0; s < segments.length; s++) {\r\n\t\tif (used[s]) continue;\r\n\t\tused[s] = 1;\r\n\r\n\t\t// Seed: start with this segment\r\n\t\tvar tailChain = [segments[s].p0, segments[s].p1];\r\n\t\tvar headChain = [];\r\n\r\n\t\t// Extend tail with angle-based junction resolution\r\n\t\twhile (true) {\r\n\t\t\tvar tailVert = tailChain[tailChain.length - 1];\r\n\t\t\tvar tailPrev = tailChain[tailChain.length - 2];\r\n\t\t\tvar inDir = direction(tailPrev, tailVert);\r\n\t\t\tvar nb = pickBest(tailVert, inDir);\r\n\t\t\tif (!nb) break;\r\n\r\n\t\t\t// Check if this would close the loop\r\n\t\t\tvar chainStart = headChain.length > 0 ? headChain[headChain.length - 1] : tailChain[0];\r\n\t\t\tif (nb.otherEnd === chainStart) {\r\n\t\t\t\tused[nb.segIdx] = 1;\r\n\t\t\t\ttailChain.push(nb.otherEnd);\r\n\t\t\t\tbreak; // Loop closed\r\n\t\t\t}\r\n\r\n\t\t\tused[nb.segIdx] = 1;\r\n\t\t\ttailChain.push(nb.otherEnd);\r\n\t\t}\r\n\r\n\t\t// Extend head with angle-based junction resolution\r\n\t\twhile (true) {\r\n\t\t\tvar headVert, headPrev;\r\n\t\t\tif (headChain.length >= 2) {\r\n\t\t\t\theadVert = headChain[headChain.length - 1];\r\n\t\t\t\theadPrev = headChain[headChain.length - 2];\r\n\t\t\t} else if (headChain.length === 1) {\r\n\t\t\t\theadVert = headChain[0];\r\n\t\t\t\theadPrev = tailChain[0];\r\n\t\t\t} else {\r\n\t\t\t\theadVert = tailChain[0];\r\n\t\t\t\theadPrev = tailChain[1];\r\n\t\t\t}\r\n\t\t\tvar hDir = direction(headPrev, headVert);\r\n\t\t\tvar hNb = pickBest(headVert, hDir);\r\n\t\t\tif (!hNb) break;\r\n\r\n\t\t\tused[hNb.segIdx] = 1;\r\n\t\t\theadChain.push(hNb.otherEnd);\r\n\t\t}\r\n\r\n\t\t// Combine: reverse headChain + tailChain\r\n\t\tvar chain;\r\n\t\tif (headChain.length > 0) {\r\n\t\t\theadChain.reverse();\r\n\t\t\tchain = headChain.concat(tailChain);\r\n\t\t} else {\r\n\t\t\tchain = tailChain;\r\n\t\t}\r\n\r\n\t\tpolylines.push(chain);\r\n\t}\r\n\r\n\treturn polylines;\r\n}\r\n","/**\r\n * tiny-exact-math\r\n * Minimal rational arithmetic library for exact geometric predicates.\r\n */\r\n\r\n/**\r\n * Compute the greatest common divisor of two BigInts using the Euclidean\r\n * algorithm. The result is always non-negative.\r\n *\r\n * @param {bigint} a\r\n * @param {bigint} b\r\n * @returns {bigint}\r\n */\r\nexport function gcd(a, b) {\r\n  a = a < 0n ? -a : a;\r\n  b = b < 0n ? -b : b;\r\n  while (b !== 0n) {\r\n    const t = b;\r\n    b = a % b;\r\n    a = t;\r\n  }\r\n  return a;\r\n}\r\n\r\n/**\r\n * Convert a JavaScript number (integer or floating-point) to a Rational.\r\n *\r\n * Strategy: use `String(n)`, which produces the *shortest* decimal\r\n * representation that round-trips back to the same IEEE 754 double (Grisu /\r\n * Ryu algorithm in V8).  Parse the resulting decimal string into a\r\n * numerator/denominator pair, handling the sign, fractional part, and\r\n * optional scientific-notation exponent separately to avoid BigInt parsing\r\n * errors (e.g. BigInt(\"-05\") would throw).\r\n *\r\n * @param {number} n\r\n * @returns {Rational}\r\n */\r\nexport function fromNumber(n) {\r\n  if (!isFinite(n)) {\r\n    throw new RangeError(\"Cannot convert non-finite number to Rational\");\r\n  }\r\n  if (n === 0) return new Rational(0n, 1n);\r\n\r\n  const str = String(n);\r\n  const negative = str.charCodeAt(0) === 45; // '-'\r\n  const abs = negative ? str.slice(1) : str;\r\n\r\n  // Handle scientific notation produced for very large / very small values\r\n  // e.g. \"1.5e-7\" or \"1e+21\"\r\n  const eIdx = abs.indexOf(\"e\");\r\n  if (eIdx !== -1) {\r\n    const base = abs.slice(0, eIdx);\r\n    const exp = parseInt(abs.slice(eIdx + 1), 10);\r\n    const r = _parseDecimalString(base, negative);\r\n    const pow = 10n ** BigInt(Math.abs(exp));\r\n    return exp >= 0\r\n      ? new Rational(r.numerator * pow, r.denominator)\r\n      : new Rational(r.numerator, r.denominator * pow);\r\n  }\r\n\r\n  return _parseDecimalString(abs, negative);\r\n}\r\n\r\n/**\r\n * Parse a plain decimal string (no sign, no exponent) into a Rational.\r\n * @param {string} abs  – digits with optional \".\"\r\n * @param {boolean} negative\r\n * @returns {Rational}\r\n */\r\nfunction _parseDecimalString(abs, negative) {\r\n  const dotIndex = abs.indexOf(\".\");\r\n  if (dotIndex === -1) {\r\n    const num = negative ? -BigInt(abs) : BigInt(abs);\r\n    return new Rational(num, 1n);\r\n  }\r\n\r\n  const intDigits = abs.slice(0, dotIndex) || \"0\";\r\n  const fracDigits = abs.slice(dotIndex + 1);\r\n  const combined = intDigits + fracDigits; // sign removed, safe for BigInt\r\n  const num = negative ? -BigInt(combined) : BigInt(combined);\r\n  const den = 10n ** BigInt(fracDigits.length);\r\n  return new Rational(num, den);\r\n}\r\n\r\n/**\r\n * A rational number stored as two BigInts (numerator and denominator).\r\n * The value is always kept in lowest terms with a non-negative denominator.\r\n */\r\nexport class Rational {\r\n  /**\r\n   * @param {bigint|number} numerator\r\n   * @param {bigint|number} denominator\r\n   */\r\n  constructor(numerator, denominator = 1n) {\r\n    let num = BigInt(numerator);\r\n    let den = BigInt(denominator);\r\n\r\n    if (den === 0n) {\r\n      throw new RangeError(\"Denominator must not be zero\");\r\n    }\r\n\r\n    // Normalise: keep denominator positive\r\n    if (den < 0n) {\r\n      num = -num;\r\n      den = -den;\r\n    }\r\n\r\n    const g = gcd(num < 0n ? -num : num, den);\r\n    this.numerator = num / g;\r\n    this.denominator = den / g;\r\n  }\r\n\r\n  // ── Arithmetic ────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Return a new Rational equal to this + other.\r\n   * @param {Rational} other\r\n   * @returns {Rational}\r\n   */\r\n  add(other) {\r\n    return new Rational(\r\n      this.numerator * other.denominator + other.numerator * this.denominator,\r\n      this.denominator * other.denominator\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Return a new Rational equal to this - other.\r\n   * @param {Rational} other\r\n   * @returns {Rational}\r\n   */\r\n  subtract(other) {\r\n    return new Rational(\r\n      this.numerator * other.denominator - other.numerator * this.denominator,\r\n      this.denominator * other.denominator\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Return a new Rational equal to this * other.\r\n   * @param {Rational} other\r\n   * @returns {Rational}\r\n   */\r\n  multiply(other) {\r\n    return new Rational(\r\n      this.numerator * other.numerator,\r\n      this.denominator * other.denominator\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Return a new Rational equal to this / other.\r\n   * @param {Rational} other\r\n   * @returns {Rational}\r\n   */\r\n  divide(other) {\r\n    if (other.numerator === 0n) {\r\n      throw new RangeError(\"Division by zero\");\r\n    }\r\n    return new Rational(\r\n      this.numerator * other.denominator,\r\n      this.denominator * other.numerator\r\n    );\r\n  }\r\n\r\n  // ── Comparison ────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Return the sign of this rational: -1, 0, or 1.\r\n   * @returns {number}\r\n   */\r\n  sign() {\r\n    if (this.numerator === 0n) return 0;\r\n    return this.numerator > 0n ? 1 : -1;\r\n  }\r\n\r\n  /**\r\n   * Return true if this rational equals zero.\r\n   * @returns {boolean}\r\n   */\r\n  isZero() {\r\n    return this.numerator === 0n;\r\n  }\r\n\r\n  /**\r\n   * Convert to a JavaScript number (may lose precision).\r\n   * @returns {number}\r\n   */\r\n  toNumber() {\r\n    return Number(this.numerator) / Number(this.denominator);\r\n  }\r\n\r\n  /**\r\n   * Human-readable string representation.\r\n   * @returns {string}\r\n   */\r\n  toString() {\r\n    if (this.denominator === 1n) return String(this.numerator);\r\n    return `${this.numerator}/${this.denominator}`;\r\n  }\r\n}\r\n\r\n// ── Geometric predicate ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * Compute the orientation (sign of the 2×2 determinant) of three 2-D points.\r\n *\r\n * Given points p1, p2, p3 each with numeric `x` and `y` properties, the\r\n * determinant is:\r\n *\r\n *   | p2.x - p1.x   p3.x - p1.x |\r\n *   | p2.y - p1.y   p3.y - p1.y |\r\n *\r\n * = (p2.x - p1.x)(p3.y - p1.y) - (p3.x - p1.x)(p2.y - p1.y)\r\n *\r\n * All coordinates are converted to exact Rationals before the computation so\r\n * the result is free of floating-point rounding error.\r\n *\r\n * @param {{ x: number, y: number }} p1\r\n * @param {{ x: number, y: number }} p2\r\n * @param {{ x: number, y: number }} p3\r\n * @returns {-1 | 0 | 1}  sign of the determinant\r\n */\r\nexport function determinant(p1, p2, p3) {\r\n  const x1 = fromNumber(p1.x);\r\n  const y1 = fromNumber(p1.y);\r\n  const x2 = fromNumber(p2.x);\r\n  const y2 = fromNumber(p2.y);\r\n  const x3 = fromNumber(p3.x);\r\n  const y3 = fromNumber(p3.y);\r\n\r\n  const dx2 = x2.subtract(x1);\r\n  const dy2 = y2.subtract(y1);\r\n  const dx3 = x3.subtract(x1);\r\n  const dy3 = y3.subtract(y1);\r\n\r\n  // det = dx2*dy3 - dx3*dy2\r\n  const det = dx2.multiply(dy3).subtract(dx3.multiply(dy2));\r\n\r\n  return det.sign();\r\n}\r\n\r\n/**\r\n * Compute the orientation (sign of the 3×3 determinant) of four 3-D points.\r\n *\r\n * Given points p1, p2, p3, p4 each with numeric `x`, `y`, and `z`\r\n * properties, the determinant is:\r\n *\r\n *   | p2.x-p1.x  p3.x-p1.x  p4.x-p1.x |\r\n *   | p2.y-p1.y  p3.y-p1.y  p4.y-p1.y |\r\n *   | p2.z-p1.z  p3.z-p1.z  p4.z-p1.z |\r\n *\r\n * Returns +1 if p4 is above the plane defined by p1→p2→p3 (right-hand rule),\r\n * -1 if below, and 0 if coplanar.\r\n *\r\n * All coordinates are converted to exact Rationals before the computation so\r\n * the result is free of floating-point rounding error.\r\n *\r\n * @param {{ x: number, y: number, z: number }} p1\r\n * @param {{ x: number, y: number, z: number }} p2\r\n * @param {{ x: number, y: number, z: number }} p3\r\n * @param {{ x: number, y: number, z: number }} p4\r\n * @returns {-1 | 0 | 1}  sign of the determinant\r\n */\r\nexport function determinant3(p1, p2, p3, p4) {\r\n  const x1 = fromNumber(p1.x);\r\n  const y1 = fromNumber(p1.y);\r\n  const z1 = fromNumber(p1.z);\r\n  const x2 = fromNumber(p2.x);\r\n  const y2 = fromNumber(p2.y);\r\n  const z2 = fromNumber(p2.z);\r\n  const x3 = fromNumber(p3.x);\r\n  const y3 = fromNumber(p3.y);\r\n  const z3 = fromNumber(p3.z);\r\n  const x4 = fromNumber(p4.x);\r\n  const y4 = fromNumber(p4.y);\r\n  const z4 = fromNumber(p4.z);\r\n\r\n  // Column vectors relative to p1\r\n  const a = x2.subtract(x1);\r\n  const b = x3.subtract(x1);\r\n  const c = x4.subtract(x1);\r\n  const d = y2.subtract(y1);\r\n  const e = y3.subtract(y1);\r\n  const f = y4.subtract(y1);\r\n  const g = z2.subtract(z1);\r\n  const h = z3.subtract(z1);\r\n  const i = z4.subtract(z1);\r\n\r\n  // det = a(ei - fh) - b(di - fg) + c(dh - eg)\r\n  const det = a.multiply(e.multiply(i).subtract(f.multiply(h)))\r\n    .subtract(b.multiply(d.multiply(i).subtract(f.multiply(g))))\r\n    .add(c.multiply(d.multiply(h).subtract(e.multiply(g))));\r\n\r\n  return det.sign();\r\n}\r\n","/**\r\n * @module bms/bmsSplit\r\n *\r\n * Re-triangulate crossed triangles using shared pool vertices and produce\r\n * a unified mega soup. Sub-triangle vertices that are Steiner points ARE\r\n * the pool vertex objects (same reference), not copies.\r\n */\r\n\r\nimport Delaunator from \"delaunator\";\r\nimport Constrainautor from \"@kninnug/constrainautor\";\r\nimport { vKey, distSq3 } from \"../util/math.js\";\r\nimport { bmsChain } from \"./bmsChain.js\";\r\nimport { determinant } from \"tiny-exact-math\";\r\nimport { needsSliverGuard, interiorLatticePoints } from \"../boolean/sliverGuard.js\";\r\n\r\n/**\r\n * Re-triangulate a crossed triangle using pool vertices as Steiner points.\r\n * The output sub-triangles reference pool vertex objects directly.\r\n *\r\n * @param {{ v0: Object, v1: Object, v2: Object }} tri - Parent triangle\r\n * @param {Array<{ p0: PoolVertex, p1: PoolVertex }>} segments - Intersection segments with pool vertices\r\n * @param {Array<{x,y,z}>} [extraPoints] - Additional interior Steiner points\r\n *        (sliver guard lattice) — plain vertices, not pool vertices\r\n * @param {Array<PoolVertex>} [edgePoolPoints] - Pool vertices that lie on THIS\r\n *        triangle's EDGES, contributed by a NEIGHBOURING triangle's intersection\r\n *        segments (conforming edge splits). Inserted as vertices with shared pool\r\n *        identity, NOT as constraints — being present on the shared edge is enough\r\n *        for the triangulation to split that edge at the SAME point on both sides,\r\n *        eliminating the T-junction. (Self-intersection segments routinely END on\r\n *        the mesh's own manifold edges; A-vs-B booleans never hit this.)\r\n * @returns {Array<{ v0: Object, v1: Object, v2: Object }>} Sub-triangles\r\n */\r\nfunction bmsRetriangulate(tri, segments, extraPoints, edgePoolPoints) {\r\n\tvar hasEdgePts = edgePoolPoints && edgePoolPoints.length > 0;\r\n\tif ((!segments || segments.length === 0) && !hasEdgePts) return [tri];\r\n\tsegments = segments || [];\r\n\r\n\t// -- Step 1: Build local 2D coordinate frame on triangle plane --\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\t// -- Step 2: Collect unique Steiner points from pool vertices --\r\n\t// Use pool vertex id for deduplication (exact, no toFixed)\r\n\tvar seenIds = {};\r\n\tvar v0Key = vKey(tri.v0), v1Key = vKey(tri.v1), v2Key = vKey(tri.v2);\r\n\r\n\tvar validSteiner = []; // pool vertex objects\r\n\r\n\t// pts array: indices 0,1,2 = original vertices, 3+ = pool vertices\r\n\tvar pts = [tri.v0, tri.v1, tri.v2];\r\n\r\n\t// Map pool vertex id -> index in pts array (for constraint edges)\r\n\tvar idToIndex = {};\r\n\r\n\t// Also map vertex keys for original verts\r\n\tvar keyToIndex = {};\r\n\tkeyToIndex[v0Key] = 0;\r\n\tkeyToIndex[v1Key] = 1;\r\n\tkeyToIndex[v2Key] = 2;\r\n\r\n\t// Exact point-in-triangle test using rational arithmetic.\r\n\t// Projects ORIGINAL 3D coordinates to the best-fit 2D plane (XY, XZ, or YZ)\r\n\t// to avoid float errors from the toLocal projection.\r\n\tvar anx = Math.abs(lnx), any = Math.abs(lny), anz = Math.abs(lnz);\r\n\tvar projA, projB; // which axes to use for 2D projection\r\n\tif (anx >= any && anx >= anz) {\r\n\t\t// Normal dominated by X → project to YZ plane\r\n\t\tprojA = function(v) { return v.y; };\r\n\t\tprojB = function(v) { return v.z; };\r\n\t} else if (any >= anz) {\r\n\t\t// Normal dominated by Y → project to XZ plane\r\n\t\tprojA = function(v) { return v.x; };\r\n\t\tprojB = function(v) { return v.z; };\r\n\t} else {\r\n\t\t// Normal dominated by Z → project to XY plane\r\n\t\tprojA = function(v) { return v.x; };\r\n\t\tprojB = function(v) { return v.y; };\r\n\t}\r\n\tvar tv0 = { x: projA(tri.v0), y: projB(tri.v0) };\r\n\tvar tv1 = { x: projA(tri.v1), y: projB(tri.v1) };\r\n\tvar tv2 = { x: projA(tri.v2), y: projB(tri.v2) };\r\n\r\n\tfunction exactPointInTri3D(p) {\r\n\t\tvar pp = { x: projA(p), y: projB(p) };\r\n\t\tvar d0 = determinant(tv0, tv1, pp);\r\n\t\tvar d1 = determinant(tv1, tv2, pp);\r\n\t\tvar d2 = determinant(tv2, tv0, pp);\r\n\t\tvar hasNeg = (d0 < 0) || (d1 < 0) || (d2 < 0);\r\n\t\tvar hasPos = (d0 > 0) || (d1 > 0) || (d2 > 0);\r\n\t\treturn !(hasNeg && hasPos);\r\n\t}\r\n\tvar BARY_TOL = -1e-4; // float fallback tolerance\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\r\n\t\t\t// Check if this pool vertex is an original vertex (by vKey match)\r\n\t\t\tvar pk = vKey(p);\r\n\t\t\tif (pk === v0Key || pk === v1Key || pk === v2Key) {\r\n\t\t\t\t// Map the pool vertex id to the original vertex index\r\n\t\t\t\tif (p.id !== undefined) idToIndex[p.id] = keyToIndex[pk];\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Skip if already added (by pool id)\r\n\t\t\tif (p.id !== undefined && seenIds[p.id]) continue;\r\n\t\t\tif (p.id !== undefined) seenIds[p.id] = true;\r\n\r\n\t\t\t// Validate: must be inside the triangle.\r\n\t\t\t// Primary: exact rational test on original 3D coords (projected to best plane)\r\n\t\t\t// Fallback: float barycentric with tolerance (handles near-edge Steiner points\r\n\t\t\t// whose computed position drifted slightly outside due to float intersection math)\r\n\t\t\tif (!exactPointInTri3D(p)) {\r\n\t\t\t\tvar lp = toLocal(p);\r\n\t\t\t\tvar bc = baryCoords(lp[0], lp[1]);\r\n\t\t\t\tif (bc[0] < BARY_TOL || bc[1] < BARY_TOL || bc[2] < BARY_TOL) {\r\n\t\t\t\t\t// Last chance: accept if the point is very close to an edge\r\n\t\t\t\t\t// (within 1% of triangle size) — intersection drift\r\n\t\t\t\t\tvar minBC = Math.min(bc[0], bc[1], bc[2]);\r\n\t\t\t\t\tif (minBC < -0.01) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Add pool vertex object directly (same reference!)\r\n\t\t\tvar idx = pts.length;\r\n\t\t\tpts.push(p);\r\n\t\t\tif (p.id !== undefined) idToIndex[p.id] = idx;\r\n\t\t\tkeyToIndex[pk] = idx;\r\n\t\t\tvalidSteiner.push(p);\r\n\t\t}\r\n\t}\r\n\r\n\t// -- Step 2b: Edge Steiner points from neighbouring triangles --\r\n\t// Same identity handling as the segment Steiner points, but these come from\r\n\t// a neighbour's segment endpoint that lands on one of THIS triangle's edges.\r\n\t// Inserted as vertices only (no constraint) — the shared PoolVertex makes the\r\n\t// edge split match the neighbour's exactly → conforming, no T-junction.\r\n\tif (hasEdgePts) {\r\n\t\tfor (var ei = 0; ei < edgePoolPoints.length; ei++) {\r\n\t\t\tvar ep = edgePoolPoints[ei];\r\n\t\t\tvar epk = vKey(ep);\r\n\t\t\tif (epk === v0Key || epk === v1Key || epk === v2Key) {\r\n\t\t\t\tif (ep.id !== undefined) idToIndex[ep.id] = keyToIndex[epk];\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (ep.id !== undefined && seenIds[ep.id]) continue;\r\n\t\t\tif (ep.id !== undefined) seenIds[ep.id] = true;\r\n\r\n\t\t\t// Accept on-edge / inside points (on-edge passes exactPointInTri3D since\r\n\t\t\t// one determinant is exactly 0 → not both-signs). Reject far-outside drift.\r\n\t\t\tif (!exactPointInTri3D(ep)) {\r\n\t\t\t\tvar elp = toLocal(ep);\r\n\t\t\t\tvar ebc = baryCoords(elp[0], elp[1]);\r\n\t\t\t\tif (Math.min(ebc[0], ebc[1], ebc[2]) < -0.01) continue;\r\n\t\t\t}\r\n\r\n\t\t\tvar eidx = pts.length;\r\n\t\t\tpts.push(ep);\r\n\t\t\tif (ep.id !== undefined) idToIndex[ep.id] = eidx;\r\n\t\t\tkeyToIndex[epk] = eidx;\r\n\t\t\tvalidSteiner.push(ep);\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// Sliver guard lattice points: strictly interior, no pool identity needed\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\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\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 idx0, idx1;\r\n\r\n\t\t\t// Look up by pool id first, then by vKey\r\n\t\t\tif (cSeg.p0.id !== undefined && idToIndex[cSeg.p0.id] !== undefined) {\r\n\t\t\t\tidx0 = idToIndex[cSeg.p0.id];\r\n\t\t\t} else {\r\n\t\t\t\tidx0 = keyToIndex[vKey(cSeg.p0)];\r\n\t\t\t}\r\n\r\n\t\t\tif (cSeg.p1.id !== undefined && idToIndex[cSeg.p1.id] !== undefined) {\r\n\t\t\t\tidx1 = idToIndex[cSeg.p1.id];\r\n\t\t\t} else {\r\n\t\t\t\tidx1 = keyToIndex[vKey(cSeg.p1)];\r\n\t\t\t}\r\n\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 still usable\r\n\t}\r\n\r\n\t// -- Step 4: Filter sub-triangles by barycentric centroid + area check --\r\n\t// Output uses pts[] references directly — pool vertices stay as pool vertices\r\n\tvar origNx = lnx, origNy = lny, origNz = lnz;\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\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\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 cu2 = coords[c * 2], cv = coords[c * 2 + 1];\r\n\t\tvar subArea = Math.abs((bu - au) * (cv - av) - (cu2 - au) * (bv - av)) * 0.5;\r\n\t\tif (subArea < triArea2D * MIN_AREA_RATIO) continue;\r\n\r\n\t\t// Check winding consistency with original triangle\r\n\t\tvar pa = pts[a], pb = pts[b], pc = pts[c];\r\n\t\tvar se1x = pb.x - pa.x, se1y = pb.y - pa.y, se1z = pb.z - pa.z;\r\n\t\tvar se2x = pc.x - pa.x, se2y = pc.y - pa.y, se2z = pc.z - pa.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\r\n\t\tif (dot < 0) {\r\n\t\t\tresult.push({ v0: pa, v1: pc, v2: pb });\r\n\t\t} else {\r\n\t\t\tresult.push({ v0: pa, v1: pb, v2: pc });\r\n\t\t}\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 * Fan-based re-triangulation using pool vertices.\r\n * Chains segments using bmsChain (identity-based), then fans from original\r\n * vertices to consecutive chain points. GUARANTEES intersection segments\r\n * appear as edges in the output — no CDT constraint needed.\r\n *\r\n * Falls back to bmsRetriangulate for multi-chain, same-edge entry/exit,\r\n * or vertex-hit cases.\r\n *\r\n * @param {Array<PoolVertex>} [edgePoolPoints] - Edge Steiner points (see\r\n *        bmsRetriangulate). When present, fan cannot place arbitrary edge points,\r\n *        so re-triangulation goes straight to CDT (bmsRetriangulate).\r\n */\r\nfunction bmsFanTriangulate(tri, segments, edgePoolPoints) {\r\n\t// Fan can't honour arbitrary edge points — CDT them in with the segments.\r\n\tif (edgePoolPoints && edgePoolPoints.length > 0) {\r\n\t\treturn bmsRetriangulate(tri, segments, undefined, edgePoolPoints);\r\n\t}\r\n\tif (!segments || segments.length === 0) return [tri];\r\n\r\n\t// Step 1: Chain segments using identity-based chaining\r\n\tvar chains = bmsChain(segments);\r\n\r\n\tif (chains.length !== 1 || chains[0].length < 2) {\r\n\t\treturn bmsRetriangulate(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 lattice = interiorLatticePoints(tri, chain);\r\n\t\tif (lattice.length > 0) {\r\n\t\t\treturn bmsRetriangulate(tri, segments, lattice);\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 2: 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 bmsRetriangulate(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 bmsRetriangulate(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 bmsRetriangulate(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 bmsRetriangulate(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 3: Identify entry/exit edges\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\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 bmsRetriangulate(tri, segments);\r\n\t}\r\n\r\n\tfunction edgeOf(bc) {\r\n\t\tif (bc[0] < EDGE_TOL && bc[0] <= bc[1] && bc[0] <= bc[2]) return 0;\r\n\t\tif (bc[1] < EDGE_TOL && bc[1] <= bc[0] && bc[1] <= bc[2]) return 1;\r\n\t\tif (bc[2] < EDGE_TOL && bc[2] <= bc[0] && bc[2] <= bc[1]) return 2;\r\n\t\treturn -1;\r\n\t}\r\n\tvar entryOpp = edgeOf(entryBary);\r\n\tvar exitOpp = edgeOf(exitBary);\r\n\r\n\tif (entryOpp < 0 || exitOpp < 0 || entryOpp === exitOpp) {\r\n\t\treturn bmsRetriangulate(tri, segments);\r\n\t}\r\n\r\n\t// Step 4: Corner, vA, vB\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 bmsRetriangulate(tri, segments);\r\n\r\n\tvar corner = verts[cornerIdx];\r\n\tvar vA = verts[exitOpp];\r\n\tvar vB = verts[entryOpp];\r\n\r\n\t// Step 5: 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\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\treturn dot < 0 ? { v0: a, v1: c, v2: b } : { v0: a, v1: b, v2: c };\r\n\t}\r\n\r\n\t// Step 6: Build fan triangles — chain points ARE pool vertices (shared references)\r\n\tvar result = [];\r\n\r\n\t// Corner fan: 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// Split index K\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) { bestRatio = diff; splitK = ki; }\r\n\t}\r\n\tif (splitK < 1) splitK = 1;\r\n\tif (splitK > chain.length - 2) splitK = chain.length - 2;\r\n\r\n\t// Fan from vA\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// Transition triangle\r\n\tresult.push(makeTri(vA, chain[splitK], vB));\r\n\r\n\t// Fan from vB\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 7: Validate — remove degenerates\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) validated.push(t);\r\n\t}\r\n\r\n\treturn validated.length > 0 ? validated : bmsRetriangulate(tri, segments);\r\n}\r\n\r\n/**\r\n * Split both meshes and produce a unified mega soup where Steiner point\r\n * vertices are shared pool vertex objects.\r\n *\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} trisA\r\n * @param {Array<{ v0: Object, v1: Object, v2: Object }>} trisB\r\n * @param {{ segments: Array, crossedSetA: Object, crossedSetB: Object, pool: Object }} intersectResult\r\n * @returns {Array<{ v0: Object, v1: Object, v2: Object, mesh: string, origIdx: number }>}\r\n */\r\nexport function bmsSplit(trisA, trisB, intersectResult) {\r\n\tvar crossedSetA = intersectResult.crossedSetA;\r\n\tvar crossedSetB = intersectResult.crossedSetB;\r\n\t// Optional edge-Steiner maps (conforming edge splits for self-intersection).\r\n\tvar edgePointsA = intersectResult.edgePointsA || {};\r\n\tvar edgePointsB = intersectResult.edgePointsB || {};\r\n\tvar megaSoup = [];\r\n\r\n\t// Process mesh A\r\n\tfor (var i = 0; i < trisA.length; i++) {\r\n\t\tvar segsA = crossedSetA[i];\r\n\t\tvar epsA = edgePointsA[i];\r\n\t\tif (!segsA && (!epsA || epsA.length === 0)) {\r\n\t\t\t// Neither crossed nor carrying edge points: pass through directly\r\n\t\t\tmegaSoup.push({\r\n\t\t\t\tv0: trisA[i].v0,\r\n\t\t\t\tv1: trisA[i].v1,\r\n\t\t\t\tv2: trisA[i].v2,\r\n\t\t\t\tmesh: \"A\",\r\n\t\t\t\torigIdx: i\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t// Crossed and/or edge-point-bearing: re-triangulate with pool vertices\r\n\t\t\tvar subTris = bmsFanTriangulate(trisA[i], segsA || [], epsA);\r\n\t\t\tfor (var si = 0; si < subTris.length; si++) {\r\n\t\t\t\tmegaSoup.push({\r\n\t\t\t\t\tv0: subTris[si].v0,\r\n\t\t\t\t\tv1: subTris[si].v1,\r\n\t\t\t\t\tv2: subTris[si].v2,\r\n\t\t\t\t\tmesh: \"A\",\r\n\t\t\t\t\torigIdx: i\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Process mesh B\r\n\tfor (var j = 0; j < trisB.length; j++) {\r\n\t\tvar segsB = crossedSetB[j];\r\n\t\tvar epsB = edgePointsB[j];\r\n\t\tif (!segsB && (!epsB || epsB.length === 0)) {\r\n\t\t\tmegaSoup.push({\r\n\t\t\t\tv0: trisB[j].v0,\r\n\t\t\t\tv1: trisB[j].v1,\r\n\t\t\t\tv2: trisB[j].v2,\r\n\t\t\t\tmesh: \"B\",\r\n\t\t\t\torigIdx: j\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tvar subTrisB = bmsFanTriangulate(trisB[j], segsB || [], epsB);\r\n\t\t\tfor (var sj = 0; sj < subTrisB.length; sj++) {\r\n\t\t\t\tmegaSoup.push({\r\n\t\t\t\t\tv0: subTrisB[sj].v0,\r\n\t\t\t\t\tv1: subTrisB[sj].v1,\r\n\t\t\t\t\tv2: subTrisB[sj].v2,\r\n\t\t\t\t\tmesh: \"B\",\r\n\t\t\t\t\torigIdx: j\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn megaSoup;\r\n}\r\n","/**\r\n * @module bms/bmsClose\r\n *\r\n * Build a single mesh edge polygon per mesh that connects ALL intersection\r\n * polylines together via graph-walks and traces the mesh's open boundary.\r\n *\r\n * The mesh edge poly is ONE continuous closed polygon:\r\n *   boundary(magenta) → graphWalk(magenta) → IL1(yellow) → graphWalk(magenta) →\r\n *   IL2(yellow) → graphWalk(magenta) → boundary(magenta) → back to start\r\n *\r\n * This polygon divides the mesh into inside (enclosed by intersection lines)\r\n * and outside (connected to the boundary).\r\n */\r\n\r\nimport { vKey, edgeKey, distSq3 } from \"../util/math.js\";\r\n\r\n// ── Boundary extraction ──\r\n\r\n/**\r\n * chainedOpenEdge — Walk the complete open boundary of a mesh as a CLOSED polygon.\r\n *\r\n * Uses a half-edge structure to correctly navigate bowtie (non-manifold)\r\n * vertices. At each boundary vertex, the next boundary half-edge is found\r\n * by walking the triangle fan around the vertex until the next boundary\r\n * edge is reached.\r\n *\r\n * Returns the largest loop as an ordered array of {key, vertex},\r\n * with the first vertex repeated at the end to close the polygon.\r\n * Returns [] if the mesh has no open edges.\r\n */\r\nfunction chainedOpenEdge(tris) {\r\n\t// Step 1: Build half-edge structure\r\n\t// Each directed half-edge is keyed as \"fromKey|toKey\"\r\n\tvar vertMap = {};     // vertKey → vertex object\r\n\tvar halfEdges = {};   // \"from|to\" → true (exists)\r\n\tvar heNextInTri = {}; // \"from|to\" → \"to|next\" (next half-edge in same triangle)\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar ks = [vKey(vs[0]), vKey(vs[1]), vKey(vs[2])];\r\n\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tvertMap[ks[e]] = vs[e];\r\n\t\t\tvar ne = (e + 1) % 3;\r\n\t\t\tvar nne = (e + 2) % 3;\r\n\t\t\tvar heKey = ks[e] + \"|\" + ks[ne];\r\n\t\t\thalfEdges[heKey] = true;\r\n\t\t\t// Keep first occurrence — prevents non-manifold edges from\r\n\t\t\t// overwriting with a different triangle's fan data\r\n\t\t\tif (heNextInTri[heKey] === undefined) {\r\n\t\t\t\theNextInTri[heKey] = ks[ne] + \"|\" + ks[nne];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 2: Find boundary half-edges (no twin exists)\r\n\tvar boundary = {};  // \"from|to\" → true\r\n\tvar bdryFromVert = {}; // vertKey → [\"from|to\", ...] (boundary half-edges starting from this vert)\r\n\r\n\tfor (var hk in halfEdges) {\r\n\t\tvar sep = hk.indexOf(\"|\");\r\n\t\tvar fromK = hk.substring(0, sep);\r\n\t\tvar toK = hk.substring(sep + 1);\r\n\t\tvar twin = toK + \"|\" + fromK;\r\n\t\tif (!halfEdges[twin]) {\r\n\t\t\tboundary[hk] = true;\r\n\t\t\tif (!bdryFromVert[fromK]) bdryFromVert[fromK] = [];\r\n\t\t\tbdryFromVert[fromK].push(hk);\r\n\t\t}\r\n\t}\r\n\r\n\tif (Object.keys(boundary).length === 0) return [];\r\n\r\n\t// Step 3: Build \"next boundary\" map\r\n\t// For boundary half-edge A→V, find the next boundary half-edge V→B\r\n\t// by walking the triangle fan around V:\r\n\t//   A→V is in some triangle → next in that triangle is V→C\r\n\t//   if V→C is boundary → done (next = V→C)\r\n\t//   if V→C is interior → find twin C→V → next in twin's triangle is V→D\r\n\t//   repeat until we find a boundary half-edge\r\n\tvar nextBoundary = {}; // \"A|V\" → \"V|B\"\r\n\r\n\tfor (var bhk in boundary) {\r\n\t\tvar sep2 = bhk.indexOf(\"|\");\r\n\t\tvar toV = bhk.substring(sep2 + 1);\r\n\r\n\t\t// Walk the fan around V starting from the next half-edge in A→V's triangle\r\n\t\tvar cursor = heNextInTri[bhk]; // V→C in the same triangle as A→V\r\n\t\tvar visited = {};  // cycle detection\r\n\t\tvisited[bhk] = true;\r\n\t\tvar safety = 1000;\r\n\r\n\t\twhile (safety-- > 0) {\r\n\t\t\tif (!cursor || visited[cursor]) break;\r\n\t\t\tvisited[cursor] = true;\r\n\t\t\tif (boundary[cursor]) {\r\n\t\t\t\tnextBoundary[bhk] = cursor;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t// cursor is interior V→D — find twin D→V, then get next in that triangle\r\n\t\t\tvar csep = cursor.indexOf(\"|\");\r\n\t\t\tvar cFrom = cursor.substring(0, csep);\r\n\t\t\tvar cTo = cursor.substring(csep + 1);\r\n\t\t\tvar cTwin = cTo + \"|\" + cFrom;\r\n\t\t\tif (!halfEdges[cTwin]) break; // broken mesh\r\n\t\t\tcursor = heNextInTri[cTwin]; // next in twin's triangle = V→E\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 4: Walk boundary loops using nextBoundary\r\n\tvar used = {};\r\n\tvar bestLoop = null;\r\n\r\n\tfor (var startHE in boundary) {\r\n\t\tif (used[startHE]) continue;\r\n\r\n\t\tvar loop = [];\r\n\t\tvar cur = startHE;\r\n\t\tvar safety2 = Object.keys(boundary).length + 2;\r\n\r\n\t\twhile (safety2-- > 0) {\r\n\t\t\tif (used[cur]) {\r\n\t\t\t\t// If we closed back to start, add closing vertex\r\n\t\t\t\tif (cur === startHE && loop.length > 0) {\r\n\t\t\t\t\tvar csep2 = cur.indexOf(\"|\");\r\n\t\t\t\t\tvar closingKey = cur.substring(0, csep2);\r\n\t\t\t\t\tloop.push({ key: closingKey, vertex: vertMap[closingKey] });\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tused[cur] = true;\r\n\t\t\tvar csep3 = cur.indexOf(\"|\");\r\n\t\t\tvar curFrom = cur.substring(0, csep3);\r\n\t\t\tloop.push({ key: curFrom, vertex: vertMap[curFrom] });\r\n\r\n\t\t\tcur = nextBoundary[cur];\r\n\t\t\tif (!cur) break;\r\n\t\t}\r\n\r\n\t\tif (!bestLoop || loop.length > bestLoop.length) bestLoop = loop;\r\n\t}\r\n\r\n\treturn bestLoop || [];\r\n}\r\n\r\n// ── Graph walk (BFS with parent tracking) ──\r\n\r\n/**\r\n * Build full mesh vertex adjacency for graph-walking.\r\n * Optionally excludes barrier edges (intersection segments) so walks\r\n * go AROUND intersections, not through them.\r\n *\r\n * @param {Array} tris - Triangle soup\r\n * @param {Object} [barrierEdgeSet] - Set of edge keys to exclude\r\n * @returns {{ adj, vertMap }}\r\n */\r\nfunction buildMeshVertexAdj(tris, barrierEdgeSet) {\r\n\tvar adj = {};\r\n\tvar vertMap = {};\r\n\tvar seen = {};\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar ks = [vKey(vs[0]), vKey(vs[1]), vKey(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 ek = edgeKey(ks[e], ks[ne]);\r\n\t\t\tif (!seen[ek]) {\r\n\t\t\t\tseen[ek] = true;\r\n\t\t\t\t// Skip barrier edges — walks must go around intersections\r\n\t\t\t\tif (barrierEdgeSet && barrierEdgeSet[ek]) {\r\n\t\t\t\t\t// Still register the vertices in vertMap, just don't connect them\r\n\t\t\t\t\tif (!vertMap[ks[e]]) vertMap[ks[e]] = vs[e];\r\n\t\t\t\t\tif (!vertMap[ks[ne]]) vertMap[ks[ne]] = vs[ne];\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (!adj[ks[e]]) adj[ks[e]] = [];\r\n\t\t\t\tif (!adj[ks[ne]]) adj[ks[ne]] = [];\r\n\t\t\t\tadj[ks[e]].push(ks[ne]);\r\n\t\t\t\tadj[ks[ne]].push(ks[e]);\r\n\t\t\t}\r\n\t\t\tif (!vertMap[ks[e]]) vertMap[ks[e]] = vs[e];\r\n\t\t\tif (!vertMap[ks[ne]]) vertMap[ks[ne]] = vs[ne];\r\n\t\t}\r\n\t}\r\n\treturn { adj: adj, vertMap: vertMap };\r\n}\r\n\r\n/**\r\n * BFS shortest path from startKey to targetKey through mesh vertex adjacency.\r\n * Returns array of vertex objects (inclusive of start and end), or null.\r\n */\r\nfunction graphWalk(startKey, targetKey, meshAdj, meshVertMap, maxSteps) {\r\n\tif (startKey === targetKey) return meshVertMap[startKey] ? [meshVertMap[startKey]] : null;\r\n\tif (!meshAdj[startKey]) return null;\r\n\r\n\tvar parent = {};\r\n\tparent[startKey] = null;\r\n\tvar queue = [startKey];\r\n\tvar head = 0;\r\n\tvar found = null;\r\n\r\n\twhile (head < queue.length && head < maxSteps) {\r\n\t\tvar cur = queue[head++];\r\n\t\tvar nbrs = meshAdj[cur];\r\n\t\tif (!nbrs) continue;\r\n\t\tfor (var ni = 0; ni < nbrs.length; ni++) {\r\n\t\t\tvar nk = nbrs[ni];\r\n\t\t\tif (parent[nk] !== undefined) continue;\r\n\t\t\tparent[nk] = cur;\r\n\t\t\tif (nk === targetKey) { found = nk; break; }\r\n\t\t\tqueue.push(nk);\r\n\t\t}\r\n\t\tif (found) break;\r\n\t}\r\n\r\n\tif (!found) return null;\r\n\r\n\tvar pathKeys = [];\r\n\tvar k = found;\r\n\twhile (k !== null) { pathKeys.push(k); k = parent[k]; }\r\n\tpathKeys.reverse();\r\n\r\n\tvar path = [];\r\n\tfor (var pi = 0; pi < pathKeys.length; pi++) {\r\n\t\tvar v = meshVertMap[pathKeys[pi]];\r\n\t\tif (v) path.push(v);\r\n\t}\r\n\treturn path.length > 0 ? path : null;\r\n}\r\n\r\n/**\r\n * BFS from startKey to the nearest key in targetSet.\r\n * Returns {path: [...vertices], targetKey: key} or null.\r\n */\r\nfunction graphWalkToSet(startKey, targetSet, meshAdj, meshVertMap, maxSteps) {\r\n\tif (targetSet[startKey]) return { path: meshVertMap[startKey] ? [meshVertMap[startKey]] : [], targetKey: startKey };\r\n\r\n\tvar parent = {};\r\n\tparent[startKey] = null;\r\n\tvar queue = [startKey];\r\n\tvar head = 0;\r\n\tvar found = null;\r\n\r\n\twhile (head < queue.length && head < maxSteps) {\r\n\t\tvar cur = queue[head++];\r\n\t\tvar nbrs = meshAdj[cur];\r\n\t\tif (!nbrs) continue;\r\n\t\tfor (var ni = 0; ni < nbrs.length; ni++) {\r\n\t\t\tvar nk = nbrs[ni];\r\n\t\t\tif (parent[nk] !== undefined) continue;\r\n\t\t\tparent[nk] = cur;\r\n\t\t\tif (targetSet[nk]) { found = nk; break; }\r\n\t\t\tqueue.push(nk);\r\n\t\t}\r\n\t\tif (found) break;\r\n\t}\r\n\r\n\tif (!found) return null;\r\n\r\n\tvar pathKeys = [];\r\n\tvar k = found;\r\n\twhile (k !== null) { pathKeys.push(k); k = parent[k]; }\r\n\tpathKeys.reverse();\r\n\r\n\tvar path = [];\r\n\tfor (var pi = 0; pi < pathKeys.length; pi++) {\r\n\t\tvar v = meshVertMap[pathKeys[pi]];\r\n\t\tif (v) path.push(v);\r\n\t}\r\n\treturn { path: path, targetKey: found };\r\n}\r\n\r\n// ── Main entry point ──\r\n\r\n/**\r\n * Build mesh edge polygons and closed polylines.\r\n *\r\n * For each mesh, builds ONE closed polygon connecting all intersection\r\n * chains via graph-walks and the mesh's open boundary.\r\n *\r\n * @param {Array<Array<PoolVertex>>} polylines - From bmsChain\r\n * @param {Array} trisA - Original mesh A triangles\r\n * @param {Array} trisB - Original mesh B triangles\r\n * @returns {{\r\n *   closedPolylines: Array<Array<Object>>,\r\n *   meshEdgePolys: {\r\n *     A: { segments: Array<{verts: Array, type: string}>, closed: boolean },\r\n *     B: { segments: Array<{verts: Array, type: string}>, closed: boolean }\r\n *   }\r\n * }}\r\n */\r\nexport { chainedOpenEdge };\r\n\r\nexport function bmsClosePolylines(polylines, trisA, trisB, megaSoup, segments) {\r\n\tif (polylines.length === 0) {\r\n\t\treturn {\r\n\t\t\tclosedPolylines: [],\r\n\t\t\tmeshEdgePolys: {\r\n\t\t\t\tA: { segments: [], closed: false },\r\n\t\t\t\tB: { segments: [], closed: false }\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\t// Build barrier edge set from intersection segments\r\n\tvar barrierEdgeSet = {};\r\n\tif (segments) {\r\n\t\tfor (var si = 0; si < segments.length; si++) {\r\n\t\t\tvar seg = segments[si];\r\n\t\t\tvar sk0 = vKey(seg.p0);\r\n\t\t\tvar sk1 = vKey(seg.p1);\r\n\t\t\tbarrierEdgeSet[edgeKey(sk0, sk1)] = true;\r\n\t\t}\r\n\t}\r\n\r\n\t// Extract mega soup triangles per mesh (includes pool vertices from splits)\r\n\tvar megaSoupA = [];\r\n\tvar megaSoupB = [];\r\n\tif (megaSoup) {\r\n\t\tfor (var mi = 0; mi < megaSoup.length; mi++) {\r\n\t\t\tif (megaSoup[mi].mesh === \"A\") megaSoupA.push(megaSoup[mi]);\r\n\t\t\telse megaSoupB.push(megaSoup[mi]);\r\n\t\t}\r\n\t}\r\n\r\n\t// Build mesh edge poly for each mesh\r\n\t// Use mega soup (with pool vertices) for graph-walking, original tris for boundary\r\n\t// Pass barrier edges so walks go AROUND intersections\r\n\tvar meshEpA = buildMeshEdgePoly(polylines, trisA, megaSoupA.length > 0 ? megaSoupA : trisA, barrierEdgeSet);\r\n\tvar meshEpB = buildMeshEdgePoly(polylines, trisB, megaSoupB.length > 0 ? megaSoupB : trisB, barrierEdgeSet);\r\n\r\n\t// Build combined closed polylines from the mesh edge polys\r\n\tvar closedPolylines = [];\r\n\t// The intersection chains themselves (for barrier purposes)\r\n\tfor (var pi = 0; pi < polylines.length; pi++) {\r\n\t\tclosedPolylines.push(polylines[pi]);\r\n\t}\r\n\r\n\treturn {\r\n\t\tclosedPolylines: closedPolylines,\r\n\t\tmeshEdgePolys: {\r\n\t\t\tA: meshEpA,\r\n\t\t\tB: meshEpB\r\n\t\t}\r\n\t};\r\n}\r\n\r\n/**\r\n * Build ONE mesh edge polygon for a single mesh.\r\n *\r\n * Connects all intersection chains via graph-walks and traces the\r\n * mesh's open boundary. Returns an ordered list of segments, each\r\n * tagged as \"intersection\" (yellow) or \"walk\" (magenta).\r\n *\r\n * @param {Array<Array<PoolVertex>>} chains - All intersection polylines\r\n * @param {Array} meshTris - This mesh's triangles\r\n * @returns {{ segments: Array<{verts: Array<Object>, type: string}>, closed: boolean }}\r\n */\r\nfunction buildMeshEdgePoly(chains, meshTris, graphTris, barrierEdgeSet) {\r\n\tif (chains.length === 0) return { segments: [], closed: false };\r\n\r\n\t// Step 1: Trace open edges — complete closed boundary polygon\r\n\tvar boundaryLoop = chainedOpenEdge(meshTris);\r\n\tvar hasBoundary = boundaryLoop.length > 0;\r\n\r\n\tif (!hasBoundary) {\r\n\t\t// Closed mesh — just trace intersection(s)\r\n\t\tvar segs = [];\r\n\t\tfor (var ci = 0; ci < chains.length; ci++) {\r\n\t\t\tsegs.push({ verts: chains[ci].slice(), type: \"intersection\" });\r\n\t\t}\r\n\t\tvar isClosed = chains.length > 0 && chains[0].length > 2 &&\r\n\t\t\tchains[0][0] === chains[0][chains[0].length - 1];\r\n\t\treturn { segments: segs, closed: isClosed };\r\n\t}\r\n\r\n\t// Step 2: Build mesh vertex adjacency (barriers excluded — walks can't cross intersection)\r\n\tvar meshGraph = buildMeshVertexAdj(graphTris, barrierEdgeSet);\r\n\r\n\t// Build boundary vertex set and index map\r\n\tvar bdryVertSet = {};\r\n\tvar bdryKeyToIdx = {};\r\n\tfor (var bi = 0; bi < boundaryLoop.length; bi++) {\r\n\t\tbdryVertSet[boundaryLoop[bi].key] = true;\r\n\t\tbdryKeyToIdx[boundaryLoop[bi].key] = bi;\r\n\t}\r\n\tvar bdryLen = boundaryLoop.length - 1; // edges (loop is closed, first=last)\r\n\r\n\t// Step 3: For EACH chain, find graph walks to boundary.\r\n\t//\r\n\t// Closed chains (loops): ONE graph walk — enter and exit at the same vertex.\r\n\t// Open chains: TWO graph walks — enter at one endpoint, exit at the other.\r\n\t//   gwIn:  boundary → chain entry point\r\n\t//   gwOut: chain exit point → boundary\r\n\t//\r\n\t// connections[] stores: { chainIdx, gwIn, gwOut, bdryIdxIn, bdryIdxOut }\r\n\tvar connections = [];\r\n\tvar MAX_BFS = 50000;\r\n\r\n\tfor (var ci2 = 0; ci2 < chains.length; ci2++) {\r\n\t\tvar chain = chains[ci2];\r\n\t\tvar chainIsClosed = chain.length > 2 && chain[0] === chain[chain.length - 1];\r\n\r\n\t\tif (chainIsClosed) {\r\n\t\t\t// Closed loop: find shortest walk from ANY loop vertex to boundary\r\n\t\t\tvar bestGW = null;\r\n\t\t\tvar bestLen = MAX_BFS;\r\n\t\t\tvar bestVertIdx = -1;\r\n\t\t\tfor (var cvi = 0; cvi < chain.length; cvi++) {\r\n\t\t\t\tvar cvKey = vKey(chain[cvi]);\r\n\t\t\t\tvar gw = graphWalkToSet(cvKey, bdryVertSet, meshGraph.adj, meshGraph.vertMap, bestLen);\r\n\t\t\t\tif (gw && gw.path.length < bestLen) {\r\n\t\t\t\t\tbestLen = gw.path.length;\r\n\t\t\t\t\tbestGW = gw;\r\n\t\t\t\t\tbestVertIdx = cvi;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (bestGW) {\r\n\t\t\t\tvar bIdx = bdryKeyToIdx[bestGW.targetKey];\r\n\t\t\t\tconnections.push({\r\n\t\t\t\t\tchainIdx: ci2,\r\n\t\t\t\t\tentryVertIdx: bestVertIdx,\r\n\t\t\t\t\tgwIn: bestGW.path.slice().reverse(),   // boundary → intersection\r\n\t\t\t\t\tgwOut: bestGW.path.slice(),             // intersection → boundary (same path)\r\n\t\t\t\t\tbdryIdxIn: bIdx !== undefined ? bIdx : 0,\r\n\t\t\t\t\tbdryIdxOut: bIdx !== undefined ? bIdx : 0\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Open chain: find walks from BOTH endpoints\r\n\t\t\tvar startKey = vKey(chain[0]);\r\n\t\t\tvar endKey = vKey(chain[chain.length - 1]);\r\n\t\t\tvar gwStart = graphWalkToSet(startKey, bdryVertSet, meshGraph.adj, meshGraph.vertMap, MAX_BFS);\r\n\t\t\tvar gwEnd = graphWalkToSet(endKey, bdryVertSet, meshGraph.adj, meshGraph.vertMap, MAX_BFS);\r\n\r\n\t\t\tif (gwStart && gwEnd) {\r\n\t\t\t\t// Enter at start, exit at end\r\n\t\t\t\tvar bIdxIn = bdryKeyToIdx[gwStart.targetKey];\r\n\t\t\t\tvar bIdxOut = bdryKeyToIdx[gwEnd.targetKey];\r\n\t\t\t\tconnections.push({\r\n\t\t\t\t\tchainIdx: ci2,\r\n\t\t\t\t\tentryVertIdx: 0,\r\n\t\t\t\t\tgwIn: gwStart.path.slice().reverse(),  // boundary → chain[0]\r\n\t\t\t\t\tgwOut: gwEnd.path.slice(),              // chain[last] → boundary\r\n\t\t\t\t\tbdryIdxIn: bIdxIn !== undefined ? bIdxIn : 0,\r\n\t\t\t\t\tbdryIdxOut: bIdxOut !== undefined ? bIdxOut : 0\r\n\t\t\t\t});\r\n\t\t\t} else if (gwStart) {\r\n\t\t\t\t// Only start reached boundary — use same walk in/out\r\n\t\t\t\tvar bIdx2 = bdryKeyToIdx[gwStart.targetKey];\r\n\t\t\t\tconnections.push({\r\n\t\t\t\t\tchainIdx: ci2,\r\n\t\t\t\t\tentryVertIdx: 0,\r\n\t\t\t\t\tgwIn: gwStart.path.slice().reverse(),\r\n\t\t\t\t\tgwOut: gwStart.path.slice(),\r\n\t\t\t\t\tbdryIdxIn: bIdx2 !== undefined ? bIdx2 : 0,\r\n\t\t\t\t\tbdryIdxOut: bIdx2 !== undefined ? bIdx2 : 0\r\n\t\t\t\t});\r\n\t\t\t} else if (gwEnd) {\r\n\t\t\t\t// Only end reached boundary — reverse chain direction\r\n\t\t\t\tvar bIdx3 = bdryKeyToIdx[gwEnd.targetKey];\r\n\t\t\t\tconnections.push({\r\n\t\t\t\t\tchainIdx: ci2,\r\n\t\t\t\t\tentryVertIdx: chain.length - 1,\r\n\t\t\t\t\tgwIn: gwEnd.path.slice().reverse(),\r\n\t\t\t\t\tgwOut: gwEnd.path.slice(),\r\n\t\t\t\t\tbdryIdxIn: bIdx3 !== undefined ? bIdx3 : 0,\r\n\t\t\t\t\tbdryIdxOut: bIdx3 !== undefined ? bIdx3 : 0\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t// If neither endpoint reached boundary, skip this chain\r\n\t\t}\r\n\t}\r\n\r\n\tif (connections.length === 0) {\r\n\t\t// No chain could reach the boundary — fallback\r\n\t\tvar fallbackSegs = [];\r\n\t\tfor (var fi = 0; fi < chains.length; fi++) {\r\n\t\t\tfallbackSegs.push({ verts: chains[fi].slice(), type: \"intersection\" });\r\n\t\t}\r\n\t\treturn { segments: fallbackSegs, closed: false };\r\n\t}\r\n\r\n\t// Step 4: Sort connections by boundary entry index (position around the loop).\r\n\t// This ensures we visit intersections in order as we walk the boundary.\r\n\tconnections.sort(function (a, b) { return a.bdryIdxIn - b.bdryIdxIn; });\r\n\r\n\t// Step 5: Build ONE continuous closed polygon.\r\n\t//\r\n\t// Algorithm (unidirectional, visits each intersection in boundary order):\r\n\t//   START at first connection's entry boundary point\r\n\t//   for each connection i:\r\n\t//     walk boundary → to connection[i].bdryIdxIn\r\n\t//     graph walk IN → from boundary to chain entry point\r\n\t//     traverse chain (entry → exit)\r\n\t//     graph walk OUT → from chain exit to boundary\r\n\t//   walk remaining boundary → back to start\r\n\t//   = CLOSED\r\n\tvar resultSegments = [];\r\n\tvar startBdryIdx = connections[0].bdryIdxIn;\r\n\t// Track current position on boundary (index into boundaryLoop)\r\n\tvar curBdryIdx = startBdryIdx;\r\n\r\n\tfor (var ci3 = 0; ci3 < connections.length; ci3++) {\r\n\t\tvar conn = connections[ci3];\r\n\r\n\t\t// 5a) Boundary segment: from current position to this connection's entry\r\n\t\tif (ci3 > 0) {\r\n\t\t\tvar fromIdx = curBdryIdx;\r\n\t\t\tvar toIdx = conn.bdryIdxIn;\r\n\t\t\tif (fromIdx !== toIdx) {\r\n\t\t\t\tvar bdrySegVerts = [];\r\n\t\t\t\tif (toIdx > fromIdx) {\r\n\t\t\t\t\tfor (var bsi = fromIdx; bsi <= toIdx; bsi++) {\r\n\t\t\t\t\t\tbdrySegVerts.push(boundaryLoop[bsi].vertex);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Wrap around boundary\r\n\t\t\t\t\tfor (var bsi2 = fromIdx; bsi2 < bdryLen; bsi2++) {\r\n\t\t\t\t\t\tbdrySegVerts.push(boundaryLoop[bsi2].vertex);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (var bsi3 = 0; bsi3 <= toIdx; bsi3++) {\r\n\t\t\t\t\t\tbdrySegVerts.push(boundaryLoop[bsi3].vertex);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (bdrySegVerts.length >= 2) {\r\n\t\t\t\t\tresultSegments.push({ verts: bdrySegVerts, type: \"walk\" });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 5b) Graph walk IN: boundary → chain entry vertex\r\n\t\tif (conn.gwIn.length >= 2) {\r\n\t\t\tresultSegments.push({ verts: conn.gwIn, type: \"walk\" });\r\n\t\t}\r\n\r\n\t\t// 5c) Orient chain so entry vertex is at [0].\r\n\t\tvar chain = chains[conn.chainIdx].slice();\r\n\t\tvar chainIsClosed = chain.length > 2 && chain[0] === chain[chain.length - 1];\r\n\t\tif (conn.entryVertIdx > 0) {\r\n\t\t\tif (chainIsClosed) {\r\n\t\t\t\t// Rotate closed loop: walk vertex at [0] and repeated at [end]\r\n\t\t\t\tvar rotChain = [];\r\n\t\t\t\tfor (var rci = conn.entryVertIdx; rci < chain.length - 1; rci++) {\r\n\t\t\t\t\trotChain.push(chain[rci]);\r\n\t\t\t\t}\r\n\t\t\t\tfor (var rci2 = 0; rci2 <= conn.entryVertIdx; rci2++) {\r\n\t\t\t\t\trotChain.push(chain[rci2]);\r\n\t\t\t\t}\r\n\t\t\t\tchain = rotChain;\r\n\t\t\t} else if (conn.entryVertIdx === chain.length - 1) {\r\n\t\t\t\t// Open chain entered at last vertex — reverse to enter at [0]\r\n\t\t\t\tchain.reverse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tresultSegments.push({ verts: chain, type: \"intersection\" });\r\n\r\n\t\t// 5d) Graph walk OUT: chain exit vertex → boundary\r\n\t\tif (conn.gwOut.length >= 2) {\r\n\t\t\tresultSegments.push({ verts: conn.gwOut, type: \"walk\" });\r\n\t\t}\r\n\r\n\t\t// Update current boundary position to exit point\r\n\t\tcurBdryIdx = conn.bdryIdxOut;\r\n\t}\r\n\r\n\t// 5e) Final boundary segment: from last exit back to first entry (closing).\r\n\tvar closingVerts = [];\r\n\tif (curBdryIdx !== startBdryIdx) {\r\n\t\t// Walk forward from last exit to first entry (wrapping around)\r\n\t\tfor (var cbi = curBdryIdx; cbi < bdryLen; cbi++) {\r\n\t\t\tclosingVerts.push(boundaryLoop[cbi].vertex);\r\n\t\t}\r\n\t\tfor (var cbi2 = 0; cbi2 <= startBdryIdx; cbi2++) {\r\n\t\t\tclosingVerts.push(boundaryLoop[cbi2].vertex);\r\n\t\t}\r\n\t} else {\r\n\t\t// Same position — full boundary loop\r\n\t\tfor (var cbi3 = startBdryIdx; cbi3 < bdryLen; cbi3++) {\r\n\t\t\tclosingVerts.push(boundaryLoop[cbi3].vertex);\r\n\t\t}\r\n\t\tfor (var cbi4 = 0; cbi4 <= startBdryIdx; cbi4++) {\r\n\t\t\tclosingVerts.push(boundaryLoop[cbi4].vertex);\r\n\t\t}\r\n\t}\r\n\tif (closingVerts.length >= 2) {\r\n\t\tresultSegments.push({ verts: closingVerts, type: \"walk\" });\r\n\t}\r\n\r\n\treturn { segments: resultSegments, closed: true };\r\n}\r\n","/**\r\n * @module bms/bmsClassify\r\n *\r\n * Hybrid classification (v0.5.0):\r\n * - Open meshes: boundary topology (touches mesh boundary = outside)\r\n * - Closed meshes: barrier-normal dot product (other mesh's normal at barrier)\r\n * Also extracts per-component boundary walks for visualization.\r\n */\r\n\r\nimport { vKey, edgeKey } from \"../util/math.js\";\r\n\r\n// ── Mesh boundary detection ──\r\n\r\n/**\r\n * Build a set of vertex keys that lie on the mesh's open boundary.\r\n */\r\nfunction buildBoundaryVertexSet(tris) {\r\n\tvar edgeCount = {};\r\n\tvar edgeVerts = {};\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar ks = [vKey(vs[0]), vKey(vs[1]), vKey(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 ek = ks[e] < ks[ne] ? ks[e] + \"|\" + ks[ne] : ks[ne] + \"|\" + ks[e];\r\n\t\t\tif (!edgeCount[ek]) { edgeCount[ek] = 0; edgeVerts[ek] = [ks[e], ks[ne]]; }\r\n\t\t\tedgeCount[ek]++;\r\n\t\t}\r\n\t}\r\n\tvar boundaryVerts = {};\r\n\tfor (var ek2 in edgeCount) {\r\n\t\tif (edgeCount[ek2] === 1) {\r\n\t\t\tvar verts = edgeVerts[ek2];\r\n\t\t\tboundaryVerts[verts[0]] = true;\r\n\t\t\tboundaryVerts[verts[1]] = true;\r\n\t\t}\r\n\t}\r\n\treturn boundaryVerts;\r\n}\r\n\r\n// ── Boundary topology classification (open meshes) ──\r\n\r\nfunction classifyByBoundaryTopology(comp, megaSoup, boundaryVerts) {\r\n\tfor (var ti = 0; ti < comp.triIndices.length; ti++) {\r\n\t\tvar tri = megaSoup[comp.triIndices[ti]];\r\n\t\tvar ks = [vKey(tri.v0), vKey(tri.v1), vKey(tri.v2)];\r\n\t\tfor (var vi = 0; vi < 3; vi++) {\r\n\t\t\tif (boundaryVerts[ks[vi]]) return false;\r\n\t\t}\r\n\t}\r\n\treturn true;\r\n}\r\n\r\n// ── Walk-direction classification (open meshes, interior components) ──\r\n\r\n/**\r\n * Build a map of walk edge directions from meshEdgePolys segments.\r\n * Returns { edgeKey → { dx, dy, dz, mx, my, mz } }\r\n */\r\nfunction buildWalkEdgeDirMap(meshEp) {\r\n\tif (!meshEp || !meshEp.segments) return {};\r\n\tvar dirMap = {};\r\n\tvar prevVert = null;\r\n\tfor (var si = 0; si < meshEp.segments.length; si++) {\r\n\t\tvar seg = meshEp.segments[si];\r\n\t\tfor (var vi = 0; vi < seg.verts.length; vi++) {\r\n\t\t\tvar v = seg.verts[vi];\r\n\t\t\tif (prevVert) {\r\n\t\t\t\tvar k0 = vKey(prevVert), k1 = vKey(v);\r\n\t\t\t\tif (k0 !== k1) {\r\n\t\t\t\t\tvar ek = edgeKey(k0, k1);\r\n\t\t\t\t\tdirMap[ek] = {\r\n\t\t\t\t\t\tdx: v.x - prevVert.x, dy: v.y - prevVert.y, dz: v.z - prevVert.z,\r\n\t\t\t\t\t\tmx: (prevVert.x + v.x) * 0.5, my: (prevVert.y + v.y) * 0.5, mz: (prevVert.z + v.z) * 0.5\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tprevVert = v;\r\n\t\t}\r\n\t}\r\n\treturn dirMap;\r\n}\r\n\r\n/**\r\n * Classify an interior component (no boundary vertices) by checking which\r\n * side of the barrier edges its triangles fall on, using the walk direction.\r\n *\r\n * Cross product of (walk direction) × (edge midpoint → centroid) dotted\r\n * with the triangle surface normal: positive = LEFT = inside.\r\n *\r\n * @returns {boolean} true if inside\r\n */\r\nfunction classifyByWalkDirection(comp, megaSoup, barrierEdges, edgeToTris, walkDirMap) {\r\n\tvar leftVotes = 0, rightVotes = 0;\r\n\r\n\tfor (var ti = 0; ti < comp.triIndices.length; ti++) {\r\n\t\tvar triIdx = comp.triIndices[ti];\r\n\t\tvar tri = megaSoup[triIdx];\r\n\t\tvar ks = [vKey(tri.v0), vKey(tri.v1), vKey(tri.v2)];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\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(ks[e], ks[ne]);\r\n\t\t\tif (!barrierEdges[ek]) continue;\r\n\r\n\t\t\tvar dir = walkDirMap[ek];\r\n\t\t\tif (!dir) continue;\r\n\r\n\t\t\t// Triangle centroid\r\n\t\t\tvar cx = (vs[0].x + vs[1].x + vs[2].x) / 3 - dir.mx;\r\n\t\t\tvar cy = (vs[0].y + vs[1].y + vs[2].y) / 3 - dir.my;\r\n\t\t\tvar cz = (vs[0].z + vs[1].z + vs[2].z) / 3 - dir.mz;\r\n\r\n\t\t\t// Triangle normal\r\n\t\t\tvar e1x = vs[1].x - vs[0].x, e1y = vs[1].y - vs[0].y, e1z = vs[1].z - vs[0].z;\r\n\t\t\tvar e2x = vs[2].x - vs[0].x, e2y = vs[2].y - vs[0].y, e2z = vs[2].z - vs[0].z;\r\n\t\t\tvar nx = e1y * e2z - e1z * e2y;\r\n\t\t\tvar ny = e1z * e2x - e1x * e2z;\r\n\t\t\tvar nz = e1x * e2y - e1y * e2x;\r\n\r\n\t\t\t// Cross: walkDir × toCentroid, dot with normal\r\n\t\t\tvar cross_dot = (dir.dy * cz - dir.dz * cy) * nx +\r\n\t\t\t\t(dir.dz * cx - dir.dx * cz) * ny +\r\n\t\t\t\t(dir.dx * cy - dir.dy * cx) * nz;\r\n\r\n\t\t\tif (cross_dot > 0) leftVotes++;\r\n\t\t\telse if (cross_dot < 0) rightVotes++;\r\n\t\t}\r\n\t}\r\n\r\n\t// LEFT = inside (positive cross product)\r\n\treturn leftVotes > rightVotes;\r\n}\r\n\r\n// ── Barrier-normal classification (closed meshes) ──\r\n\r\nfunction classifyByBarrierNormal(comp, megaSoup, barrierEdges, edgeToTris) {\r\n\tvar compMesh = comp.mesh;\r\n\tvar dotSum = 0;\r\n\tvar sampleCount = 0;\r\n\tvar seenEdges = {};\r\n\r\n\tfor (var ti = 0; ti < comp.triIndices.length; ti++) {\r\n\t\tvar triIdx = comp.triIndices[ti];\r\n\t\tvar tri = megaSoup[triIdx];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar ks = [vKey(vs[0]), vKey(vs[1]), vKey(vs[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(ks[e], ks[ne]);\r\n\r\n\t\t\tif (!barrierEdges[ek]) continue;\r\n\t\t\tif (seenEdges[ek]) continue;\r\n\t\t\tseenEdges[ek] = true;\r\n\r\n\t\t\tvar otherIdx = 3 - e - ne;\r\n\t\t\tvar thirdVert = vs[otherIdx];\r\n\t\t\tvar edgeV0 = vs[e];\r\n\t\t\tvar edgeV1 = vs[ne];\r\n\r\n\t\t\tvar midX = (edgeV0.x + edgeV1.x) * 0.5;\r\n\t\t\tvar midY = (edgeV0.y + edgeV1.y) * 0.5;\r\n\t\t\tvar midZ = (edgeV0.z + edgeV1.z) * 0.5;\r\n\t\t\tvar intoX = thirdVert.x - midX;\r\n\t\t\tvar intoY = thirdVert.y - midY;\r\n\t\t\tvar intoZ = thirdVert.z - midZ;\r\n\r\n\t\t\tvar intoLen = Math.sqrt(intoX * intoX + intoY * intoY + intoZ * intoZ);\r\n\t\t\tif (intoLen < 1e-12) continue;\r\n\t\t\tintoX /= intoLen; intoY /= intoLen; intoZ /= intoLen;\r\n\r\n\t\t\tvar sharedTris = edgeToTris[ek];\r\n\t\t\tif (!sharedTris) continue;\r\n\r\n\t\t\tvar otherNx = 0, otherNy = 0, otherNz = 0;\r\n\t\t\tvar foundOther = false;\r\n\r\n\t\t\tfor (var si = 0; si < sharedTris.length; si++) {\r\n\t\t\t\tvar sTri = megaSoup[sharedTris[si]];\r\n\t\t\t\tif (sTri.mesh === compMesh) continue;\r\n\t\t\t\tvar e1x = sTri.v1.x - sTri.v0.x, e1y = sTri.v1.y - sTri.v0.y, e1z = sTri.v1.z - sTri.v0.z;\r\n\t\t\t\tvar e2x = sTri.v2.x - sTri.v0.x, e2y = sTri.v2.y - sTri.v0.y, e2z = sTri.v2.z - sTri.v0.z;\r\n\t\t\t\totherNx = e1y * e2z - e1z * e2y;\r\n\t\t\t\totherNy = e1z * e2x - e1x * e2z;\r\n\t\t\t\totherNz = e1x * e2y - e1y * e2x;\r\n\t\t\t\tfoundOther = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (!foundOther) continue;\r\n\r\n\t\t\tvar otherLen = Math.sqrt(otherNx * otherNx + otherNy * otherNy + otherNz * otherNz);\r\n\t\t\tif (otherLen < 1e-12) continue;\r\n\t\t\totherNx /= otherLen; otherNy /= otherLen; otherNz /= otherLen;\r\n\r\n\t\t\tdotSum += intoX * otherNx + intoY * otherNy + intoZ * otherNz;\r\n\t\t\tsampleCount++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (sampleCount === 0) return false;\r\n\treturn (dotSum / sampleCount) < 0;\r\n}\r\n\r\n// ── Per-component boundary walk extraction ──\r\n\r\n/**\r\n * Extract boundary walk segments for a component.\r\n * Returns segments grouped by type: \"intersection\" (barrier) or \"walk\" (mesh boundary).\r\n *\r\n * @returns {Array<{ verts: Array<{x,y,z}>, type: string }>}\r\n */\r\nfunction extractBoundaryWalk(comp, megaSoup, barrierEdges) {\r\n\t// Collect directed boundary half-edges\r\n\tvar directedCount = {};\r\n\tvar directedVerts = {};\r\n\r\n\tfor (var i = 0; i < comp.triIndices.length; i++) {\r\n\t\tvar tri = megaSoup[comp.triIndices[i]];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar ks = [vKey(vs[0]), vKey(vs[1]), vKey(vs[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 dk = ks[e] + \"|\" + ks[ne];\r\n\t\t\tif (!directedCount[dk]) {\r\n\t\t\t\tdirectedCount[dk] = 0;\r\n\t\t\t\tdirectedVerts[dk] = { fromVert: vs[e], toVert: vs[ne] };\r\n\t\t\t}\r\n\t\t\tdirectedCount[dk]++;\r\n\t\t}\r\n\t}\r\n\r\n\t// Collect boundary half-edges with type\r\n\tvar halfEdges = [];\r\n\tfor (var dk2 in directedCount) {\r\n\t\tvar parts = dk2.split(\"|\");\r\n\t\tvar fromK = parts[0];\r\n\t\tvar toK = parts[1];\r\n\t\tvar reverseK = toK + \"|\" + fromK;\r\n\t\tvar ek = edgeKey(fromK, toK);\r\n\r\n\t\tvar isBarrier = !!barrierEdges[ek];\r\n\t\tvar reverseExists = !!directedCount[reverseK];\r\n\r\n\t\tif (!reverseExists || isBarrier) {\r\n\t\t\tvar verts = directedVerts[dk2];\r\n\t\t\thalfEdges.push({\r\n\t\t\t\tfrom: fromK, to: toK,\r\n\t\t\t\tfromVert: verts.fromVert, toVert: verts.toVert,\r\n\t\t\t\ttype: isBarrier ? \"intersection\" : \"walk\"\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tif (halfEdges.length === 0) return [];\r\n\r\n\t// Build adjacency: fromVertex -> [halfEdge indices]\r\n\tvar outgoing = {};\r\n\tfor (var hi = 0; hi < halfEdges.length; hi++) {\r\n\t\tvar fk = halfEdges[hi].from;\r\n\t\tif (!outgoing[fk]) outgoing[fk] = [];\r\n\t\toutgoing[fk].push(hi);\r\n\t}\r\n\r\n\t// Chain into loops, grouping consecutive same-type edges into segments\r\n\tvar used = new Array(halfEdges.length);\r\n\tfor (var u = 0; u < used.length; u++) used[u] = false;\r\n\r\n\tvar allSegments = [];\r\n\r\n\tfor (var start = 0; start < halfEdges.length; start++) {\r\n\t\tif (used[start]) continue;\r\n\r\n\t\t// Walk this loop\r\n\t\tvar loopEdges = [];\r\n\t\tvar currIdx = start;\r\n\t\tused[currIdx] = true;\r\n\t\tloopEdges.push(currIdx);\r\n\r\n\t\tvar currVert = halfEdges[currIdx].to;\r\n\t\tvar maxIter = halfEdges.length + 1;\r\n\t\tvar iter = 0;\r\n\r\n\t\twhile (currVert !== halfEdges[start].from && iter < maxIter) {\r\n\t\t\titer++;\r\n\t\t\tvar candidates = outgoing[currVert];\r\n\t\t\tif (!candidates || candidates.length === 0) break;\r\n\r\n\t\t\tvar bestIdx = -1;\r\n\t\t\tfor (var ci = 0; ci < candidates.length; ci++) {\r\n\t\t\t\tif (!used[candidates[ci]]) { bestIdx = candidates[ci]; break; }\r\n\t\t\t}\r\n\t\t\tif (bestIdx === -1) break;\r\n\r\n\t\t\tused[bestIdx] = true;\r\n\t\t\tloopEdges.push(bestIdx);\r\n\t\t\tcurrVert = halfEdges[bestIdx].to;\r\n\t\t}\r\n\r\n\t\tif (loopEdges.length < 2) continue;\r\n\r\n\t\t// Group consecutive same-type edges into segments\r\n\t\tvar segType = halfEdges[loopEdges[0]].type;\r\n\t\tvar segVerts = [halfEdges[loopEdges[0]].fromVert, halfEdges[loopEdges[0]].toVert];\r\n\r\n\t\tfor (var li = 1; li < loopEdges.length; li++) {\r\n\t\t\tvar he = halfEdges[loopEdges[li]];\r\n\t\t\tif (he.type === segType) {\r\n\t\t\t\tsegVerts.push(he.toVert);\r\n\t\t\t} else {\r\n\t\t\t\tallSegments.push({ verts: segVerts, type: segType });\r\n\t\t\t\tsegType = he.type;\r\n\t\t\t\tsegVerts = [he.fromVert, he.toVert];\r\n\t\t\t}\r\n\t\t}\r\n\t\tallSegments.push({ verts: segVerts, type: segType });\r\n\t}\r\n\r\n\treturn allSegments;\r\n}\r\n\r\n// ── Main classify ──\r\n\r\n/**\r\n * Hybrid classification with per-component boundary walk extraction.\r\n *\r\n * @returns {{\r\n *   aInside: Array, aOutside: Array, bInside: Array, bOutside: Array,\r\n *   componentWalks: Array<{ mesh: string, side: string, triCount: number,\r\n *     segments: Array<{ verts: Array, type: string }> }>\r\n * }}\r\n */\r\nexport function bmsClassify(megaSoup, closedPolylines, segments, trisA, trisB, meshEdgePolys) {\r\n\tvar n = megaSoup.length;\r\n\r\n\t// ── Build barriers ──\r\n\tvar barrierEdges = {};\r\n\tfor (var si = 0; si < segments.length; si++) {\r\n\t\tvar seg = segments[si];\r\n\t\tif (seg.p0 === seg.p1) continue;\r\n\t\tvar k0 = vKey(seg.p0), k1 = vKey(seg.p1);\r\n\t\tif (k0 === k1) continue;\r\n\t\tbarrierEdges[edgeKey(k0, k1)] = true;\r\n\t}\r\n\r\n\t// ── Build edge adjacency ──\r\n\tvar edgeToTris = {};\r\n\tfor (var ei = 0; ei < n; ei++) {\r\n\t\tvar eTri = megaSoup[ei];\r\n\t\tvar eKs = [vKey(eTri.v0), vKey(eTri.v1), vKey(eTri.v2)];\r\n\t\tfor (var ee = 0; ee < 3; ee++) {\r\n\t\t\tvar ene = (ee + 1) % 3;\r\n\t\t\tvar eek = edgeKey(eKs[ee], eKs[ene]);\r\n\t\t\tif (!edgeToTris[eek]) edgeToTris[eek] = [];\r\n\t\t\tedgeToTris[eek].push(ei);\r\n\t\t}\r\n\t}\r\n\r\n\t// ── Build neighbors excluding barriers ──\r\n\tvar neighbors = new Array(n);\r\n\tfor (var ni = 0; ni < n; ni++) neighbors[ni] = [];\r\n\tfor (var ek3 in edgeToTris) {\r\n\t\tif (barrierEdges[ek3]) continue;\r\n\t\tvar triList = edgeToTris[ek3];\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// ── Barrier flood fill ──\r\n\tvar componentId = new Int32Array(n);\r\n\tfor (var ci = 0; ci < n; ci++) componentId[ci] = -1;\r\n\r\n\tvar components = [];\r\n\tvar nextCompId = 0;\r\n\r\n\tfor (var seed = 0; seed < n; seed++) {\r\n\t\tif (componentId[seed] >= 0) continue;\r\n\t\tvar meshTag = megaSoup[seed].mesh;\r\n\r\n\t\tvar compId = nextCompId++;\r\n\t\tvar triIndices = [];\r\n\t\tvar queue = [seed];\r\n\t\tcomponentId[seed] = compId;\r\n\t\tvar head = 0;\r\n\r\n\t\twhile (head < queue.length) {\r\n\t\t\tvar curr = queue[head++];\r\n\t\t\ttriIndices.push(curr);\r\n\t\t\tvar nbrs = neighbors[curr];\r\n\t\t\tfor (var nbi = 0; nbi < nbrs.length; nbi++) {\r\n\t\t\t\tvar nb = nbrs[nbi];\r\n\t\t\t\tif (componentId[nb] >= 0) continue;\r\n\t\t\t\tif (megaSoup[nb].mesh !== meshTag) continue;\r\n\t\t\t\tcomponentId[nb] = compId;\r\n\t\t\t\tqueue.push(nb);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcomponents.push({ id: compId, mesh: meshTag, triIndices: triIndices, triCount: triIndices.length });\r\n\t}\r\n\r\n\t// ── Detect open/closed per mesh ──\r\n\tvar boundaryVertsA = buildBoundaryVertexSet(trisA);\r\n\tvar boundaryVertsB = buildBoundaryVertexSet(trisB);\r\n\tvar isOpenA = Object.keys(boundaryVertsA).length > 0;\r\n\tvar isOpenB = Object.keys(boundaryVertsB).length > 0;\r\n\r\n\t// ── Build walk edge direction maps for open meshes ──\r\n\tvar walkDirA = null, walkDirB = null;\r\n\tif (meshEdgePolys) {\r\n\t\tif (isOpenA && meshEdgePolys.A) walkDirA = buildWalkEdgeDirMap(meshEdgePolys.A);\r\n\t\tif (isOpenB && meshEdgePolys.B) walkDirB = buildWalkEdgeDirMap(meshEdgePolys.B);\r\n\t}\r\n\r\n\t// ── Classify each component + extract boundary walks ──\r\n\tvar aInside = [], aOutside = [];\r\n\tvar bInside = [], bOutside = [];\r\n\tvar componentWalks = [];\r\n\tvar triSides = new Int8Array(n); // 1 = inside, -1 = outside (per megaSoup index)\r\n\r\n\tfor (var gi = 0; gi < components.length; gi++) {\r\n\t\tvar comp = components[gi];\r\n\t\tvar isInside;\r\n\r\n\t\tif (comp.triCount === 0) continue;\r\n\r\n\t\tvar meshComps = 0;\r\n\t\tfor (var mc = 0; mc < components.length; mc++) {\r\n\t\t\tif (components[mc].mesh === comp.mesh) meshComps++;\r\n\t\t}\r\n\r\n\t\tif (meshComps === 1) {\r\n\t\t\tisInside = false;\r\n\t\t} else {\r\n\t\t\tvar isOpen = comp.mesh === \"A\" ? isOpenA : isOpenB;\r\n\t\t\tvar bverts = comp.mesh === \"A\" ? boundaryVertsA : boundaryVertsB;\r\n\r\n\t\t\tif (isOpen) {\r\n\t\t\t\t// Open mesh: boundary touch = outside\r\n\t\t\t\t// Interior components: barrier-normal (other mesh's normal at barrier)\r\n\t\t\t\tvar touchesBoundary = !classifyByBoundaryTopology(comp, megaSoup, bverts);\r\n\t\t\t\tif (touchesBoundary) {\r\n\t\t\t\t\tisInside = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Interior component — use barrier-normal (works for both meshes\r\n\t\t\t\t\t// because it checks the OTHER mesh's normal direction)\r\n\t\t\t\t\tisInside = classifyByBarrierNormal(comp, megaSoup, barrierEdges, edgeToTris);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tisInside = classifyByBarrierNormal(comp, megaSoup, barrierEdges, edgeToTris);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar side = isInside ? \"inside\" : \"outside\";\r\n\r\n\t\tvar insideArr = comp.mesh === \"A\" ? aInside : bInside;\r\n\t\tvar outsideArr = comp.mesh === \"A\" ? aOutside : bOutside;\r\n\t\tvar target = isInside ? insideArr : outsideArr;\r\n\r\n\t\tfor (var oi = 0; oi < comp.triIndices.length; oi++) {\r\n\t\t\tvar ot = megaSoup[comp.triIndices[oi]];\r\n\t\t\ttriSides[comp.triIndices[oi]] = isInside ? 1 : -1;\r\n\t\t\ttarget.push({ v0: ot.v0, v1: ot.v1, v2: ot.v2 });\r\n\t\t}\r\n\r\n\t\t// Extract boundary walk for this component\r\n\t\tvar walkSegments = extractBoundaryWalk(comp, megaSoup, barrierEdges);\r\n\t\tcomponentWalks.push({\r\n\t\t\tmesh: comp.mesh,\r\n\t\t\tside: side,\r\n\t\t\ttriCount: comp.triCount,\r\n\t\t\tsegments: walkSegments\r\n\t\t});\r\n\t}\r\n\r\n\tconsole.log(\"[BMS] Classification (walk): A: \" + aInside.length + \" inside, \" +\r\n\t\taOutside.length + \" outside\" + (isOpenA ? \" (walk)\" : \" (dot)\") +\r\n\t\t\". B: \" + bInside.length + \" inside, \" +\r\n\t\tbOutside.length + \" outside\" + (isOpenB ? \" (walk)\" : \" (dot)\") +\r\n\t\t\". Components: \" + components.length + \".\");\r\n\r\n\treturn {\r\n\t\taInside: aInside, aOutside: aOutside, bInside: bInside, bOutside: bOutside,\r\n\t\tcomponentWalks: componentWalks,\r\n\t\ttriSides: triSides\r\n\t};\r\n}\r\n","/**\n * @module bms/bmsVerify\n *\n * Post-condition verification for the hybrid BMS classification\n * (KNOWN_ISSUES #20 — the v0.5.8 auto-classifier).\n *\n * The hybrid classifier's flood fill can leak through a gap in the\n * intersection barrier and silently fail to partition a mesh (the\n * 2026-06-11 failure: 3 components instead of 4, no error). These three\n * cheap checks catch that class of failure so the caller can fall back\n * to the heffalump classifier on the existing mega soup:\n *\n *   1. PARTITION — if intersection segments exist, BOTH meshes must have\n *      non-empty inside AND outside groups. One line of counting catches\n *      the exact silent failure above.\n *   2. CHAIN CLOSURE — every intersection polyline must close on itself\n *      or end on a mesh open boundary. A chain dying mid-mesh is a\n *      guaranteed flood leak (or a missed near-coplanar intersection —\n *      either way the hybrid's preconditions don't hold).\n *   3. BARRIER CONSTRAINT — same-mesh triangles sharing a barrier edge\n *      must classify to opposite sides. A leaked component violates this\n *      along its entire barrier, so a small tolerance for numerical noise\n *      still catches real leaks.\n */\n\nimport { vKey, edgeKey, dist3 } from \"../util/math.js\";\nimport { estimateAvgEdge } from \"../intersect/spatialGrid.js\";\n\n/**\n * Collect a mesh's open boundary edges (edges used by exactly one triangle).\n * @returns {Array<{ v0: {x,y,z}, v1: {x,y,z} }>}\n */\nfunction collectBoundaryEdges(tris) {\n\tvar edgeMap = {};\n\tfor (var i = 0; i < tris.length; i++) {\n\t\tvar tri = tris[i];\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\n\t\tvar ks = [vKey(vs[0]), vKey(vs[1]), vKey(vs[2])];\n\t\tfor (var e = 0; e < 3; e++) {\n\t\t\tvar ne = (e + 1) % 3;\n\t\t\tvar ek = edgeKey(ks[e], ks[ne]);\n\t\t\tif (!edgeMap[ek]) edgeMap[ek] = { count: 0, v0: vs[e], v1: vs[ne] };\n\t\t\tedgeMap[ek].count++;\n\t\t}\n\t}\n\tvar edges = [];\n\tfor (var ek2 in edgeMap) {\n\t\tif (edgeMap[ek2].count === 1) edges.push({ v0: edgeMap[ek2].v0, v1: edgeMap[ek2].v1 });\n\t}\n\treturn edges;\n}\n\n/**\n * 3D distance from a point to a segment.\n */\nfunction pointSegDist(p, a, b) {\n\tvar abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z;\n\tvar lenSq = abx * abx + aby * aby + abz * abz;\n\tvar t = lenSq < 1e-20 ? 0 : ((p.x - a.x) * abx + (p.y - a.y) * aby + (p.z - a.z) * abz) / lenSq;\n\tif (t < 0) t = 0; else if (t > 1) t = 1;\n\tvar qx = a.x + t * abx - p.x;\n\tvar qy = a.y + t * aby - p.y;\n\tvar qz = a.z + t * abz - p.z;\n\treturn Math.sqrt(qx * qx + qy * qy + qz * qz);\n}\n\nfunction nearAnyBoundaryEdge(p, edges, tol) {\n\tfor (var i = 0; i < edges.length; i++) {\n\t\tif (pointSegDist(p, edges[i].v0, edges[i].v1) <= tol) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Verify the hybrid classification's post-conditions.\n *\n * @param {Array} megaSoup - Split triangles with mesh tags\n * @param {Int8Array|Array<number>} triSides - Per-megaSoup-triangle side from\n *        bmsClassify: 1 = inside, -1 = outside\n * @param {Array} segments - Intersection segments (pool vertex endpoints)\n * @param {Array<Array>} polylines - Raw chained polylines from bmsChain\n * @param {Array} trisA - Original mesh A triangles\n * @param {Array} trisB - Original mesh B triangles\n * @returns {{\n *   ok: boolean,\n *   failures: Array<{ check: string, mesh: \"A\"|\"B\"|\"both\", detail: string }>,\n *   counts: { A: { inside: number, outside: number }, B: { inside: number, outside: number } }\n * }}\n */\nexport function verifyBmsClassification(megaSoup, triSides, segments, polylines, trisA, trisB) {\n\tvar failures = [];\n\n\t// ── Check 1: partition ──\n\tvar counts = { A: { inside: 0, outside: 0 }, B: { inside: 0, outside: 0 } };\n\tfor (var i = 0; i < megaSoup.length; i++) {\n\t\tvar bucket = counts[megaSoup[i].mesh];\n\t\tif (!bucket) continue;\n\t\tif (triSides[i] > 0) bucket.inside++;\n\t\telse bucket.outside++;\n\t}\n\n\tif (segments && segments.length > 0) {\n\t\tvar meshKeys = [\"A\", \"B\"];\n\t\tfor (var mk = 0; mk < 2; mk++) {\n\t\t\tvar key = meshKeys[mk];\n\t\t\tif (counts[key].inside === 0 || counts[key].outside === 0) {\n\t\t\t\tfailures.push({\n\t\t\t\t\tcheck: \"partition\",\n\t\t\t\t\tmesh: key,\n\t\t\t\t\tdetail: \"mesh \" + key + \" did not partition: \" + counts[key].inside +\n\t\t\t\t\t\t\" inside / \" + counts[key].outside + \" outside with \" +\n\t\t\t\t\t\tsegments.length + \" intersection segments\"\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// ── Check 2: chain closure ──\n\t// An endpoint is fine if its chain closes on itself, it sits on a mesh\n\t// open boundary, or ANOTHER chain's endpoint shares the same pool vertex\n\t// (bmsChain splits sharp bends and junctions into separate polylines —\n\t// the chain network continues there). Only a truly DANGLING endpoint\n\t// (none of the above) indicates a barrier gap / missed intersection.\n\tif (polylines && polylines.length > 0) {\n\t\tvar boundaryEdges = collectBoundaryEdges(trisA).concat(collectBoundaryEdges(trisB));\n\t\tvar avgEdge = Math.max(estimateAvgEdge(trisA), estimateAvgEdge(trisB));\n\t\tvar tol = Math.max(avgEdge * 0.01, 1e-9);\n\n\t\tfunction endpointKey(p) {\n\t\t\treturn p.id !== undefined ? \"id:\" + p.id : vKey(p);\n\t\t}\n\n\t\t// Count how many chain endpoints land on each pool vertex\n\t\tvar endpointCount = {};\n\t\tfor (var ci2 = 0; ci2 < polylines.length; ci2++) {\n\t\t\tvar cpl = polylines[ci2];\n\t\t\tif (!cpl || cpl.length < 2) continue;\n\t\t\tvar ka = endpointKey(cpl[0]);\n\t\t\tvar kb = endpointKey(cpl[cpl.length - 1]);\n\t\t\tendpointCount[ka] = (endpointCount[ka] || 0) + 1;\n\t\t\tendpointCount[kb] = (endpointCount[kb] || 0) + 1;\n\t\t}\n\n\t\tvar dangling = 0;\n\n\t\tfor (var pi = 0; pi < polylines.length; pi++) {\n\t\t\tvar pl = polylines[pi];\n\t\t\tif (!pl || pl.length < 2) continue;\n\t\t\tvar first = pl[0];\n\t\t\tvar last = pl[pl.length - 1];\n\n\t\t\tvar closed = first === last ||\n\t\t\t\t(first.id !== undefined && first.id === last.id) ||\n\t\t\t\tdist3(first, last) <= tol * 0.1;\n\t\t\tif (closed) continue;\n\n\t\t\tvar ends = [first, last];\n\t\t\tfor (var ei2 = 0; ei2 < 2; ei2++) {\n\t\t\t\tvar ep = ends[ei2];\n\t\t\t\tif (endpointCount[endpointKey(ep)] >= 2) continue; // joins another chain\n\t\t\t\tif (nearAnyBoundaryEdge(ep, boundaryEdges, tol)) continue;\n\t\t\t\tdangling++;\n\t\t\t}\n\t\t}\n\n\t\tif (dangling > 0) {\n\t\t\tfailures.push({\n\t\t\t\tcheck: \"chainClosure\",\n\t\t\t\tmesh: \"both\",\n\t\t\t\tdetail: dangling + \" dangling intersection chain endpoint(s) mid-mesh \" +\n\t\t\t\t\t\"(not closed, not on a mesh boundary, not joining another chain)\"\n\t\t\t});\n\t\t}\n\t}\n\n\t// ── Check 3: barrier constraint ──\n\tif (segments && segments.length > 0) {\n\t\tvar barrierEdges = {};\n\t\tfor (var si = 0; si < segments.length; si++) {\n\t\t\tvar seg = segments[si];\n\t\t\tif (seg.p0 === seg.p1) continue;\n\t\t\tvar k0 = vKey(seg.p0), k1 = vKey(seg.p1);\n\t\t\tif (k0 === k1) continue;\n\t\t\tbarrierEdges[edgeKey(k0, k1)] = true;\n\t\t}\n\n\t\t// barrier edgeKey → per-mesh list of sides\n\t\tvar barrierSides = {};\n\t\tfor (var ti = 0; ti < megaSoup.length; ti++) {\n\t\t\tvar tri = megaSoup[ti];\n\t\t\tvar ks = [vKey(tri.v0), vKey(tri.v1), vKey(tri.v2)];\n\t\t\tfor (var e = 0; e < 3; e++) {\n\t\t\t\tvar ne = (e + 1) % 3;\n\t\t\t\tvar ek = edgeKey(ks[e], ks[ne]);\n\t\t\t\tif (!barrierEdges[ek]) continue;\n\t\t\t\tvar entry = barrierSides[ek];\n\t\t\t\tif (!entry) entry = barrierSides[ek] = { A: [], B: [] };\n\t\t\t\tentry[tri.mesh].push(triSides[ti]);\n\t\t\t}\n\t\t}\n\n\t\tvar violations = { A: 0, B: 0 };\n\t\tvar checked = { A: 0, B: 0 };\n\t\tfor (var bek in barrierSides) {\n\t\t\tvar perMesh = barrierSides[bek];\n\t\t\tfor (var mi = 0; mi < 2; mi++) {\n\t\t\t\tvar mKey = mi === 0 ? \"A\" : \"B\";\n\t\t\t\tvar sides = perMesh[mKey];\n\t\t\t\tif (sides.length < 2) continue;\n\t\t\t\tchecked[mKey]++;\n\t\t\t\tvar allSame = true;\n\t\t\t\tfor (var s2 = 1; s2 < sides.length; s2++) {\n\t\t\t\t\tif (sides[s2] !== sides[0]) { allSame = false; break; }\n\t\t\t\t}\n\t\t\t\tif (allSame) violations[mKey]++;\n\t\t\t}\n\t\t}\n\n\t\tfor (var vm = 0; vm < 2; vm++) {\n\t\t\tvar vKey2 = vm === 0 ? \"A\" : \"B\";\n\t\t\tif (checked[vKey2] === 0) continue;\n\t\t\t// Tolerate numerical noise; a real flood leak violates the\n\t\t\t// constraint along the leaked component's entire barrier.\n\t\t\tvar allowance = Math.max(2, checked[vKey2] * 0.01);\n\t\t\tif (violations[vKey2] > allowance) {\n\t\t\t\tfailures.push({\n\t\t\t\t\tcheck: \"barrierConstraint\",\n\t\t\t\t\tmesh: vKey2,\n\t\t\t\t\tdetail: violations[vKey2] + \" of \" + checked[vKey2] +\n\t\t\t\t\t\t\" barrier edges on mesh \" + vKey2 + \" have same-side neighbours\"\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { ok: failures.length === 0, failures: failures, counts: counts };\n}\n","/**\r\n * @module bms/heffalumpClassify\r\n *\r\n * \"The Heffalump is elusive and hard to pin down, but once caught,\r\n *  it turns out to be exactly what you needed.\"\r\n *\r\n * Barrier-only classification for meshes with defective topology\r\n * (non-manifold edges, fragmented boundaries, cracks, holes).\r\n *\r\n * Instead of asking \"does this component touch the boundary?\" (which\r\n * breaks when the boundary is fragmented into 411 pieces), the\r\n * heffalump asks a simpler question:\r\n *\r\n *   \"Does this component touch the intersection?\"\r\n *\r\n *   YES → classify by barrier-normal (which side of the cut?)\r\n *   NO  → outside (disconnected from the intersection = untouched)\r\n *\r\n * That's it. No boundary walk. No mesh edge polygon. No fan walk\r\n * through non-manifold edges. Just barriers and normals.\r\n * One bite at a time.\r\n */\r\n\r\nimport { vKey, edgeKey, countOpenEdges } from \"../util/math.js\";\r\n\r\n// ── The Heffalump's nose: barrier-normal classification ──\r\n//\r\n// For each barrier edge in a component, check which direction the\r\n// component's triangles point relative to the OTHER mesh's surface\r\n// normal at the cut. Positive dot = facing same way = outside.\r\n// Negative dot = facing opposite = inside the other mesh.\r\n\r\nfunction classifyByBarrierNormal(comp, megaSoup, barrierEdges, edgeToTris) {\r\n\tvar compMesh = comp.mesh;\r\n\tvar dotSum = 0;\r\n\tvar sampleCount = 0;\r\n\tvar seenEdges = {};\r\n\r\n\tfor (var ti = 0; ti < comp.triIndices.length; ti++) {\r\n\t\tvar triIdx = comp.triIndices[ti];\r\n\t\tvar tri = megaSoup[triIdx];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar ks = [vKey(vs[0]), vKey(vs[1]), vKey(vs[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(ks[e], ks[ne]);\r\n\r\n\t\t\tif (!barrierEdges[ek]) continue;\r\n\t\t\tif (seenEdges[ek]) continue;\r\n\t\t\tseenEdges[ek] = true;\r\n\r\n\t\t\t// Vector from edge midpoint INTO the component (toward third vertex)\r\n\t\t\tvar otherIdx = 3 - e - ne;\r\n\t\t\tvar thirdVert = vs[otherIdx];\r\n\t\t\tvar edgeV0 = vs[e];\r\n\t\t\tvar edgeV1 = vs[ne];\r\n\r\n\t\t\tvar midX = (edgeV0.x + edgeV1.x) * 0.5;\r\n\t\t\tvar midY = (edgeV0.y + edgeV1.y) * 0.5;\r\n\t\t\tvar midZ = (edgeV0.z + edgeV1.z) * 0.5;\r\n\t\t\tvar intoX = thirdVert.x - midX;\r\n\t\t\tvar intoY = thirdVert.y - midY;\r\n\t\t\tvar intoZ = thirdVert.z - midZ;\r\n\r\n\t\t\tvar intoLen = Math.sqrt(intoX * intoX + intoY * intoY + intoZ * intoZ);\r\n\t\t\tif (intoLen < 1e-12) continue;\r\n\t\t\tintoX /= intoLen; intoY /= intoLen; intoZ /= intoLen;\r\n\r\n\t\t\t// Find the OTHER mesh's triangle sharing this barrier edge\r\n\t\t\tvar sharedTris = edgeToTris[ek];\r\n\t\t\tif (!sharedTris) continue;\r\n\r\n\t\t\tvar otherNx = 0, otherNy = 0, otherNz = 0;\r\n\t\t\tvar foundOther = false;\r\n\r\n\t\t\tfor (var si = 0; si < sharedTris.length; si++) {\r\n\t\t\t\tvar sTri = megaSoup[sharedTris[si]];\r\n\t\t\t\tif (sTri.mesh === compMesh) continue;\r\n\t\t\t\tvar e1x = sTri.v1.x - sTri.v0.x, e1y = sTri.v1.y - sTri.v0.y, e1z = sTri.v1.z - sTri.v0.z;\r\n\t\t\t\tvar e2x = sTri.v2.x - sTri.v0.x, e2y = sTri.v2.y - sTri.v0.y, e2z = sTri.v2.z - sTri.v0.z;\r\n\t\t\t\totherNx = e1y * e2z - e1z * e2y;\r\n\t\t\t\totherNy = e1z * e2x - e1x * e2z;\r\n\t\t\t\totherNz = e1x * e2y - e1y * e2x;\r\n\t\t\t\tfoundOther = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (!foundOther) continue;\r\n\r\n\t\t\tvar otherLen = Math.sqrt(otherNx * otherNx + otherNy * otherNy + otherNz * otherNz);\r\n\t\t\tif (otherLen < 1e-12) continue;\r\n\t\t\totherNx /= otherLen; otherNy /= otherLen; otherNz /= otherLen;\r\n\r\n\t\t\tdotSum += intoX * otherNx + intoY * otherNy + intoZ * otherNz;\r\n\t\t\tsampleCount++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (sampleCount === 0) return false;\r\n\treturn (dotSum / sampleCount) < 0;\r\n}\r\n\r\n// ── The Heffalump's trunk: ray casting for closed mesh classification ──\r\n//\r\n// When one mesh is a closed solid, we can definitively test if a point\r\n// is inside it by casting a ray and counting crossings. Odd = inside.\r\n// This works even when barriers don't form closed loops.\r\n\r\nfunction isPointInsideClosedMesh(px, py, pz, tris) {\r\n\t// Cast ray along +Z from point, count crossings with triangles\r\n\tvar crossings = 0;\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\tvar ax = tri.v0.x, ay = tri.v0.y, az = tri.v0.z;\r\n\t\tvar bx = tri.v1.x, by = tri.v1.y, bz = tri.v1.z;\r\n\t\tvar cx = tri.v2.x, cy = tri.v2.y, cz = tri.v2.z;\r\n\r\n\t\t// Check if (px, py) is inside the triangle's 2D projection (XY plane)\r\n\t\tvar d1 = (px - bx) * (ay - by) - (ax - bx) * (py - by);\r\n\t\tvar d2 = (px - cx) * (by - cy) - (bx - cx) * (py - cy);\r\n\t\tvar d3 = (px - ax) * (cy - ay) - (cx - ax) * (py - ay);\r\n\r\n\t\tvar hasNeg = (d1 < 0) || (d2 < 0) || (d3 < 0);\r\n\t\tvar hasPos = (d1 > 0) || (d2 > 0) || (d3 > 0);\r\n\t\tif (hasNeg && hasPos) continue; // point outside triangle in XY\r\n\r\n\t\t// Compute Z at intersection using barycentric coords\r\n\t\tvar det = (by - cy) * (ax - cx) + (cx - bx) * (ay - cy);\r\n\t\tif (Math.abs(det) < 1e-20) continue;\r\n\t\tvar invDet = 1.0 / det;\r\n\t\tvar u = ((by - cy) * (px - cx) + (cx - bx) * (py - cy)) * invDet;\r\n\t\tvar v = ((cy - ay) * (px - cx) + (ax - cx) * (py - cy)) * invDet;\r\n\t\tvar w = 1.0 - u - v;\r\n\t\tvar zHit = u * az + v * bz + w * cz;\r\n\r\n\t\tif (zHit > pz) crossings++;\r\n\t}\r\n\treturn (crossings % 2) === 1;\r\n}\r\n\r\n/**\r\n * Classify a component by ray casting its centroid through the other mesh.\r\n * Only works when the other mesh is a closed solid.\r\n */\r\nfunction classifyByRayCast(comp, megaSoup, otherMeshTris) {\r\n\t// Compute centroid of a representative triangle (use the first one)\r\n\tvar tri = megaSoup[comp.triIndices[0]];\r\n\tvar px = (tri.v0.x + tri.v1.x + tri.v2.x) / 3;\r\n\tvar py = (tri.v0.y + tri.v1.y + tri.v2.y) / 3;\r\n\tvar pz = (tri.v0.z + tri.v1.z + tri.v2.z) / 3;\r\n\treturn isPointInsideClosedMesh(px, py, pz, otherMeshTris);\r\n}\r\n\r\n// ── The Heffalump's tail: nearest-surface classification for open meshes ──\r\n//\r\n// When the other mesh is OPEN, we can't ray cast (no closed volume).\r\n// Instead, find the nearest triangle on the open surface and check\r\n// which side the point is on. Normal direction = outside.\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// ⚠️  AI-AGENT NOTE — UNVERIFIED CHANGE  (2026-06-19, Claude, Kirra dev session)\r\n//\r\n// AUDIENCE: a future AI coding agent (or human) debugging open-mesh classification.\r\n//\r\n// WHAT CHANGED: `isPointInsideOpenSurface()` (defined just below) — the test for\r\n// \"which side of an OPEN surface is this point on?\", used by the heffalump\r\n// classifier when the OTHER mesh is open (classification Method 11). The\r\n// nearest-triangle search was changed from CENTROID distance to TRUE\r\n// CLOSEST-POINT-ON-TRIANGLE distance (Ericson §5.1.5 — see `closestPointOnTriangle`\r\n// added directly below this note). `closestPointOnTriangle` is NEW code.\r\n//\r\n// BEFORE (original — centroid-nearest; restore this to revert):\r\n//     for each tri:\r\n//         c = centroid(tri)\r\n//         d = |point - c|^2\r\n//         if d < bestDist: bestDist = d; bestDot = (point - c) · triNormal\r\n//     return bestDot < 0\r\n//\r\n// NOW (closest-point-nearest):\r\n//     for each tri:\r\n//         q = closestPointOnTriangle(point, tri)\r\n//         d = |point - q|^2\r\n//         if d < bestDist: bestDist = d; bestDot = (point - q) · triNormal\r\n//     return bestDot < 0\r\n//\r\n// WHY: on an undulating open surface (terrain) the nearest CENTROID is often a\r\n// distant, differently-tilted triangle, which flips the side sign. Closest-point\r\n// finds the triangle the point is actually under/over.\r\n//\r\n// VERIFICATION STATUS:  ⚠ UNTESTED ON REAL GEOMETRY. Only synthetic unit tests\r\n// were run (closestPointOnTriangle math verified; side test correct on a few\r\n// synthetic open surfaces). It was NOT the fix for the symptom that prompted it\r\n// (a terrain mesh under-splitting against a below-surface extrusion — that turned\r\n// out to be the CLOSED-mesh ray-cast path `isPointInsideClosedMesh`, NOT this\r\n// function). This change was kept as a likely-correct improvement, not a proven one.\r\n//\r\n// IF YOU HIT AN OPEN-MESH CLASSIFICATION REGRESSION:  this is the most recent\r\n// UNPROVEN edit on that path — REASSESS / REVERT THIS FIRST. To revert: restore\r\n// the centroid loop shown in BEFORE, and delete `closestPointOnTriangle` if it is\r\n// unused elsewhere.\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n// Closest point on triangle (a,b,c) to point p — Ericson, \"Real-Time Collision\r\n// Detection\" §5.1.5. Returns {x,y,z}. Used by the open-surface side test so the\r\n// \"nearest triangle\" is the one ACTUALLY under/over the point, not the one with\r\n// the nearest centroid (which an undulating surface throws off badly).\r\nfunction closestPointOnTriangle(px, py, pz, a, b, c) {\r\n\tvar abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z;\r\n\tvar acx = c.x - a.x, acy = c.y - a.y, acz = c.z - a.z;\r\n\tvar apx = px - a.x, apy = py - a.y, apz = pz - a.z;\r\n\tvar d1 = abx * apx + aby * apy + abz * apz;\r\n\tvar d2 = acx * apx + acy * apy + acz * apz;\r\n\tif (d1 <= 0 && d2 <= 0) return { x: a.x, y: a.y, z: a.z };\r\n\r\n\tvar bpx = px - b.x, bpy = py - b.y, bpz = pz - b.z;\r\n\tvar d3 = abx * bpx + aby * bpy + abz * bpz;\r\n\tvar d4 = acx * bpx + acy * bpy + acz * bpz;\r\n\tif (d3 >= 0 && d4 <= d3) return { x: b.x, y: b.y, z: b.z };\r\n\r\n\tvar vc = d1 * d4 - d3 * d2;\r\n\tif (vc <= 0 && d1 >= 0 && d3 <= 0) {\r\n\t\tvar v = d1 / (d1 - d3);\r\n\t\treturn { x: a.x + v * abx, y: a.y + v * aby, z: a.z + v * abz };\r\n\t}\r\n\r\n\tvar cpx = px - c.x, cpy = py - c.y, cpz = pz - c.z;\r\n\tvar d5 = abx * cpx + aby * cpy + abz * cpz;\r\n\tvar d6 = acx * cpx + acy * cpy + acz * cpz;\r\n\tif (d6 >= 0 && d5 <= d6) return { x: c.x, y: c.y, z: c.z };\r\n\r\n\tvar vb = d5 * d2 - d1 * d6;\r\n\tif (vb <= 0 && d2 >= 0 && d6 <= 0) {\r\n\t\tvar w = d2 / (d2 - d6);\r\n\t\treturn { x: a.x + w * acx, y: a.y + w * acy, z: a.z + w * acz };\r\n\t}\r\n\r\n\tvar va = d3 * d6 - d5 * d4;\r\n\tif (va <= 0 && (d4 - d3) >= 0 && (d5 - d6) >= 0) {\r\n\t\tvar w2 = (d4 - d3) / ((d4 - d3) + (d5 - d6));\r\n\t\treturn { x: b.x + w2 * (c.x - b.x), y: b.y + w2 * (c.y - b.y), z: b.z + w2 * (c.z - b.z) };\r\n\t}\r\n\r\n\t// Inside the face region — barycentric combination.\r\n\tvar denom = 1 / (va + vb + vc);\r\n\tvar vv = vb * denom, ww = vc * denom;\r\n\treturn { x: a.x + abx * vv + acx * ww, y: a.y + aby * vv + acy * ww, z: a.z + abz * vv + acz * ww };\r\n}\r\n\r\nfunction isPointInsideOpenSurface(px, py, pz, tris) {\r\n\tvar bestDist = Infinity;\r\n\tvar bestDot = 0;\r\n\r\n\tfor (var i = 0; i < tris.length; i++) {\r\n\t\tvar tri = tris[i];\r\n\t\t// Use the TRUE closest point on the triangle, not the centroid. On an\r\n\t\t// undulating open surface (terrain) the nearest centroid is frequently a\r\n\t\t// distant, differently-tilted triangle, which flips the side test and\r\n\t\t// misclassifies an extrusion sitting below/grazing the surface.\r\n\t\tvar cp = closestPointOnTriangle(px, py, pz, tri.v0, tri.v1, tri.v2);\r\n\t\tvar dx = px - cp.x, dy = py - cp.y, dz = pz - cp.z;\r\n\t\tvar d = dx * dx + dy * dy + dz * dz;\r\n\r\n\t\tif (d < bestDist) {\r\n\t\t\tbestDist = d;\r\n\t\t\t// Triangle normal (unnormalized is fine — we only care about sign)\r\n\t\t\tvar e1x = tri.v1.x - tri.v0.x, e1y = tri.v1.y - tri.v0.y, e1z = tri.v1.z - tri.v0.z;\r\n\t\t\tvar e2x = tri.v2.x - tri.v0.x, e2y = tri.v2.y - tri.v0.y, e2z = tri.v2.z - tri.v0.z;\r\n\t\t\tvar nx = e1y * e2z - e1z * e2y;\r\n\t\t\tvar ny = e1z * e2x - e1x * e2z;\r\n\t\t\tvar nz = e1x * e2y - e1y * e2x;\r\n\t\t\t// Side from the closest point: in the face interior this is the true\r\n\t\t\t// perpendicular side; on an edge/vertex it is the nearest-feature side.\r\n\t\t\tbestDot = dx * nx + dy * ny + dz * nz;\r\n\t\t}\r\n\t}\r\n\t// Opposite to normal direction = inside (below the surface)\r\n\treturn bestDot < 0;\r\n}\r\n\r\n// ── The Heffalump's ears: does a component hear the intersection? ──\r\n\r\nfunction componentHasBarriers(comp, megaSoup, barrierEdges) {\r\n\tfor (var ti = 0; ti < comp.triIndices.length; ti++) {\r\n\t\tvar tri = megaSoup[comp.triIndices[ti]];\r\n\t\tvar ks = [vKey(tri.v0), vKey(tri.v1), vKey(tri.v2)];\r\n\t\tfor (var e = 0; e < 3; e++) {\r\n\t\t\tvar ne = (e + 1) % 3;\r\n\t\t\tif (barrierEdges[edgeKey(ks[e], ks[ne])]) return true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n// ── The Heffalump's feet: per-component boundary walk extraction ──\r\n\r\nfunction extractBoundaryWalk(comp, megaSoup, barrierEdges) {\r\n\tvar directedCount = {};\r\n\tvar directedVerts = {};\r\n\r\n\tfor (var i = 0; i < comp.triIndices.length; i++) {\r\n\t\tvar tri = megaSoup[comp.triIndices[i]];\r\n\t\tvar vs = [tri.v0, tri.v1, tri.v2];\r\n\t\tvar ks = [vKey(vs[0]), vKey(vs[1]), vKey(vs[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 dk = ks[e] + \"|\" + ks[ne];\r\n\t\t\tif (!directedCount[dk]) {\r\n\t\t\t\tdirectedCount[dk] = 0;\r\n\t\t\t\tdirectedVerts[dk] = { fromVert: vs[e], toVert: vs[ne] };\r\n\t\t\t}\r\n\t\t\tdirectedCount[dk]++;\r\n\t\t}\r\n\t}\r\n\r\n\tvar halfEdges = [];\r\n\tfor (var dk2 in directedCount) {\r\n\t\tvar parts = dk2.split(\"|\");\r\n\t\tvar fromK = parts[0];\r\n\t\tvar toK = parts[1];\r\n\t\tvar reverseK = toK + \"|\" + fromK;\r\n\t\tvar ek = edgeKey(fromK, toK);\r\n\r\n\t\tvar isBarrier = !!barrierEdges[ek];\r\n\t\tvar reverseExists = !!directedCount[reverseK];\r\n\r\n\t\tif (!reverseExists || isBarrier) {\r\n\t\t\tvar verts = directedVerts[dk2];\r\n\t\t\thalfEdges.push({\r\n\t\t\t\tfrom: fromK, to: toK,\r\n\t\t\t\tfromVert: verts.fromVert, toVert: verts.toVert,\r\n\t\t\t\ttype: isBarrier ? \"intersection\" : \"walk\"\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tif (halfEdges.length === 0) return [];\r\n\r\n\tvar outgoing = {};\r\n\tfor (var hi = 0; hi < halfEdges.length; hi++) {\r\n\t\tvar fk = halfEdges[hi].from;\r\n\t\tif (!outgoing[fk]) outgoing[fk] = [];\r\n\t\toutgoing[fk].push(hi);\r\n\t}\r\n\r\n\tvar used = new Array(halfEdges.length);\r\n\tfor (var u = 0; u < used.length; u++) used[u] = false;\r\n\r\n\tvar allSegments = [];\r\n\r\n\tfor (var start = 0; start < halfEdges.length; start++) {\r\n\t\tif (used[start]) continue;\r\n\r\n\t\tvar loopEdges = [];\r\n\t\tvar currIdx = start;\r\n\t\tused[currIdx] = true;\r\n\t\tloopEdges.push(currIdx);\r\n\r\n\t\tvar currVert = halfEdges[currIdx].to;\r\n\t\tvar maxIter = halfEdges.length + 1;\r\n\t\tvar iter = 0;\r\n\r\n\t\twhile (currVert !== halfEdges[start].from && iter < maxIter) {\r\n\t\t\titer++;\r\n\t\t\tvar candidates = outgoing[currVert];\r\n\t\t\tif (!candidates || candidates.length === 0) break;\r\n\r\n\t\t\tvar bestIdx = -1;\r\n\t\t\tfor (var ci = 0; ci < candidates.length; ci++) {\r\n\t\t\t\tif (!used[candidates[ci]]) { bestIdx = candidates[ci]; break; }\r\n\t\t\t}\r\n\t\t\tif (bestIdx === -1) break;\r\n\r\n\t\t\tused[bestIdx] = true;\r\n\t\t\tloopEdges.push(bestIdx);\r\n\t\t\tcurrVert = halfEdges[bestIdx].to;\r\n\t\t}\r\n\r\n\t\tif (loopEdges.length < 2) continue;\r\n\r\n\t\tvar segType = halfEdges[loopEdges[0]].type;\r\n\t\tvar segVerts = [halfEdges[loopEdges[0]].fromVert, halfEdges[loopEdges[0]].toVert];\r\n\r\n\t\tfor (var li = 1; li < loopEdges.length; li++) {\r\n\t\t\tvar he = halfEdges[loopEdges[li]];\r\n\t\t\tif (he.type === segType) {\r\n\t\t\t\tsegVerts.push(he.toVert);\r\n\t\t\t} else {\r\n\t\t\t\tallSegments.push({ verts: segVerts, type: segType });\r\n\t\t\t\tsegType = he.type;\r\n\t\t\t\tsegVerts = [he.fromVert, he.toVert];\r\n\t\t\t}\r\n\t\t}\r\n\t\tallSegments.push({ verts: segVerts, type: segType });\r\n\t}\r\n\r\n\treturn allSegments;\r\n}\r\n\r\n// ── The Heffalump itself ──\r\n\r\n/**\r\n * Barrier-only classification for meshes with defective topology.\r\n *\r\n * @param {Array} megaSoup - Split triangles with mesh tags\r\n * @param {Array} segments - Intersection segments with pool vertex endpoints\r\n * @param {Array} trisA - Original mesh A triangles (unused — heffalump doesn't need boundaries)\r\n * @param {Array} trisB - Original mesh B triangles (unused — heffalump doesn't need boundaries)\r\n * @returns {{\r\n *   aInside: Array, aOutside: Array, bInside: Array, bOutside: Array,\r\n *   componentWalks: Array\r\n * }}\r\n */\r\nexport function heffalumpClassify(megaSoup, segments, trisA, trisB, opts) {\r\n\tvar n = megaSoup.length;\r\n\r\n\t// ── Step 1: Build barrier edges from intersection segments ──\r\n\tvar barrierEdges = {};\r\n\tfor (var si = 0; si < segments.length; si++) {\r\n\t\tvar seg = segments[si];\r\n\t\tif (seg.p0 === seg.p1) continue;\r\n\t\tvar k0 = vKey(seg.p0), k1 = vKey(seg.p1);\r\n\t\tif (k0 === k1) continue;\r\n\t\tbarrierEdges[edgeKey(k0, k1)] = true;\r\n\t}\r\n\r\n\t// ── Step 2: Build edge adjacency ──\r\n\tvar edgeToTris = {};\r\n\tfor (var ei = 0; ei < n; ei++) {\r\n\t\tvar eTri = megaSoup[ei];\r\n\t\tvar eKs = [vKey(eTri.v0), vKey(eTri.v1), vKey(eTri.v2)];\r\n\t\tfor (var ee = 0; ee < 3; ee++) {\r\n\t\t\tvar ene = (ee + 1) % 3;\r\n\t\t\tvar eek = edgeKey(eKs[ee], eKs[ene]);\r\n\t\t\tif (!edgeToTris[eek]) edgeToTris[eek] = [];\r\n\t\t\tedgeToTris[eek].push(ei);\r\n\t\t}\r\n\t}\r\n\r\n\t// ── Step 3: Build neighbors excluding barriers ──\r\n\tvar neighbors = new Array(n);\r\n\tfor (var ni = 0; ni < n; ni++) neighbors[ni] = [];\r\n\tfor (var ek3 in edgeToTris) {\r\n\t\tif (barrierEdges[ek3]) continue;\r\n\t\tvar triList = edgeToTris[ek3];\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// ── Step 4: Flood fill components ──\r\n\tvar componentId = new Int32Array(n);\r\n\tfor (var ci = 0; ci < n; ci++) componentId[ci] = -1;\r\n\r\n\tvar components = [];\r\n\tvar nextCompId = 0;\r\n\r\n\tfor (var seed = 0; seed < n; seed++) {\r\n\t\tif (componentId[seed] >= 0) continue;\r\n\t\tvar meshTag = megaSoup[seed].mesh;\r\n\r\n\t\tvar compId = nextCompId++;\r\n\t\tvar triIndices = [];\r\n\t\tvar queue = [seed];\r\n\t\tcomponentId[seed] = compId;\r\n\t\tvar head = 0;\r\n\r\n\t\twhile (head < queue.length) {\r\n\t\t\tvar curr = queue[head++];\r\n\t\t\ttriIndices.push(curr);\r\n\t\t\tvar nbrs = neighbors[curr];\r\n\t\t\tfor (var nbi = 0; nbi < nbrs.length; nbi++) {\r\n\t\t\t\tvar nb = nbrs[nbi];\r\n\t\t\t\tif (componentId[nb] >= 0) continue;\r\n\t\t\t\tif (megaSoup[nb].mesh !== meshTag) continue;\r\n\t\t\t\tcomponentId[nb] = compId;\r\n\t\t\t\tqueue.push(nb);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcomponents.push({ id: compId, mesh: meshTag, triIndices: triIndices, triCount: triIndices.length });\r\n\t}\r\n\r\n\t// ── Step 5: Detect open/closed per mesh ──\r\n\t// Use a practical \"closed enough\" threshold — meshes with a few\r\n\t// defect edges are still functionally closed for ray casting.\r\n\tvar statsA = countOpenEdges(trisA);\r\n\tvar statsB = countOpenEdges(trisB);\r\n\tvar isClosedA = statsA.openEdges < Math.max(10, statsA.total * 0.02);\r\n\tvar isClosedB = statsB.openEdges < Math.max(10, statsB.total * 0.02);\r\n\r\n\t// ── Step 6: The Heffalump's question — one bite at a time ──\r\n\t//\r\n\t// When the other mesh is CLOSED, classify each triangle individually\r\n\t// by ray casting. When the other mesh is OPEN, use the per-triangle\r\n\t// nearest-surface test.\r\n\t//\r\n\t// COMPONENT-MAJORITY SNAP (v0.5.8): per-triangle tests are coin-flip\r\n\t// for needle/tall sub-triangles whose centroids hug the other surface —\r\n\t// lone flipped triangles survive as visible \"spurs\" (KNOWN_ISSUES #21).\r\n\t// After voting, if ≥ snapThreshold of a component agrees, the stragglers\r\n\t// snap to the majority. Genuinely mixed components (e.g. a flood-fill\r\n\t// component spanning a barrier gap — the very case the heffalump exists\r\n\t// for) stay per-triangle, because their vote is nowhere near unanimous.\r\n\r\n\tvar snapThreshold = opts && opts.snapThreshold !== undefined ? opts.snapThreshold : 0.9;\r\n\t// Max absolute minority the majority-snap is allowed to collapse. The snap\r\n\t// exists to erase a FEW spur stragglers; it must never bulldoze a real region.\r\n\tvar maxSnapStragglers = opts && opts.maxSnapStragglers !== undefined ? opts.maxSnapStragglers : 8;\r\n\r\n\tvar aInside = [], aOutside = [];\r\n\tvar bInside = [], bOutside = [];\r\n\tvar componentWalks = [];\r\n\r\n\tfor (var gi = 0; gi < components.length; gi++) {\r\n\t\tvar comp = components[gi];\r\n\t\tif (comp.triCount === 0) continue;\r\n\r\n\t\tvar otherIsClosed = comp.mesh === \"A\" ? isClosedB : isClosedA;\r\n\t\tvar otherTris = comp.mesh === \"A\" ? trisB : trisA;\r\n\t\tvar insideArr = comp.mesh === \"A\" ? aInside : bInside;\r\n\t\tvar outsideArr = comp.mesh === \"A\" ? aOutside : bOutside;\r\n\r\n\t\t// Per-triangle vote — trunk (ray cast) or tail (nearest surface)\r\n\t\tvar flags = new Uint8Array(comp.triIndices.length);\r\n\t\tvar insideVotes = 0;\r\n\t\tfor (var ri = 0; ri < comp.triIndices.length; ri++) {\r\n\t\t\tvar rt = megaSoup[comp.triIndices[ri]];\r\n\t\t\tvar px = (rt.v0.x + rt.v1.x + rt.v2.x) / 3;\r\n\t\t\tvar py = (rt.v0.y + rt.v1.y + rt.v2.y) / 3;\r\n\t\t\tvar pz = (rt.v0.z + rt.v1.z + rt.v2.z) / 3;\r\n\t\t\tvar isIn = otherIsClosed\r\n\t\t\t\t? isPointInsideClosedMesh(px, py, pz, otherTris)\r\n\t\t\t\t: isPointInsideOpenSurface(px, py, pz, otherTris);\r\n\t\t\tif (isIn) { flags[ri] = 1; insideVotes++; }\r\n\t\t}\r\n\r\n\t\t// Majority snap — only collapse a TINY absolute minority (genuine spur\r\n\t\t// stragglers, the case this was added for in v0.5.8). NEVER snap away a\r\n\t\t// LARGE minority: a legitimate region (e.g. 1200+ terrain tris inside a\r\n\t\t// prism) that is flood-fill-connected to the outside reads as a low ratio,\r\n\t\t// and an ungated snap bulldozes the whole region to one side. Gate on the\r\n\t\t// absolute count, not the ratio alone. (Confirmed on real data 2026-06-19:\r\n\t\t// ungated → 0 terrain tris inside; gated → 1204, matching manual classify.)\r\n\t\tvar minority = Math.min(insideVotes, comp.triIndices.length - insideVotes);\r\n\t\tvar ratio = insideVotes / comp.triIndices.length;\r\n\t\tvar snapTo = -1; // -1 = keep per-triangle results\r\n\t\tif (minority <= maxSnapStragglers) {\r\n\t\t\tif (ratio >= snapThreshold) snapTo = 1;\r\n\t\t\telse if (ratio <= 1 - snapThreshold) snapTo = 0;\r\n\t\t}\r\n\r\n\t\tfor (var pi = 0; pi < comp.triIndices.length; pi++) {\r\n\t\t\tvar pt = megaSoup[comp.triIndices[pi]];\r\n\t\t\tvar finalIn = snapTo === -1 ? flags[pi] === 1 : snapTo === 1;\r\n\t\t\tif (finalIn) {\r\n\t\t\t\tinsideArr.push({ v0: pt.v0, v1: pt.v1, v2: pt.v2 });\r\n\t\t\t} else {\r\n\t\t\t\toutsideArr.push({ v0: pt.v0, v1: pt.v1, v2: pt.v2 });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Component walk — still useful for visualization\r\n\t\tvar walkSegs1 = extractBoundaryWalk(comp, megaSoup, barrierEdges);\r\n\t\tcomponentWalks.push({\r\n\t\t\tmesh: comp.mesh, side: \"mixed\", triCount: comp.triCount,\r\n\t\t\tsegments: walkSegs1\r\n\t\t});\r\n\t}\r\n\r\n\tconsole.log(\"[heffalump] Classification: A: \" + aInside.length + \" inside, \" +\r\n\t\taOutside.length + \" outside. B: \" + bInside.length + \" inside, \" +\r\n\t\tbOutside.length + \" outside. Components: \" + components.length + \".\");\r\n\r\n\treturn {\r\n\t\taInside: aInside, aOutside: aOutside, bInside: bInside, bOutside: bOutside,\r\n\t\tcomponentWalks: componentWalks\r\n\t};\r\n}\r\n\r\n// ── The Heffalump's eraser: reclassify misplaced triangles ──\r\n\r\n/**\r\n * Move triangles between inside/outside groups by index.\r\n * Sometimes the heffalump gets a few wrong — this lets you fix them.\r\n *\r\n * @param {Object} groups - { aInside, aOutside, bInside, bOutside }\r\n * @param {string} mesh - \"A\" or \"B\"\r\n * @param {string} fromSide - \"inside\" or \"outside\"\r\n * @param {Array<number>} triIndices - Indices within the source array to move\r\n * @returns {Object} Updated groups (mutated in place)\r\n */\r\nexport function reclassifyTriangles(groups, mesh, fromSide, triIndices) {\r\n\tvar srcKey = mesh.toLowerCase() + (fromSide === \"inside\" ? \"Inside\" : \"Outside\");\r\n\tvar dstKey = mesh.toLowerCase() + (fromSide === \"inside\" ? \"Outside\" : \"Inside\");\r\n\tvar src = groups[srcKey];\r\n\tvar dst = groups[dstKey];\r\n\tif (!src || !dst) return groups;\r\n\r\n\t// Sort descending so splicing doesn't shift later indices\r\n\tvar sorted = triIndices.slice().sort(function(a, b) { return b - a; });\r\n\tfor (var i = 0; i < sorted.length; i++) {\r\n\t\tvar idx = sorted[i];\r\n\t\tif (idx >= 0 && idx < src.length) {\r\n\t\t\tdst.push(src[idx]);\r\n\t\t\tsrc.splice(idx, 1);\r\n\t\t}\r\n\t}\r\n\treturn groups;\r\n}\r\n\r\n/**\r\n * Reclassify a single triangle identified by its centroid coordinates.\r\n * Useful for click-to-toggle in a 3D viewer.\r\n *\r\n * @param {Object} groups - { aInside, aOutside, bInside, bOutside }\r\n * @param {number} cx - Centroid X\r\n * @param {number} cy - Centroid Y\r\n * @param {number} cz - Centroid Z\r\n * @param {number} [tolerance=0.01] - Match tolerance\r\n * @returns {{ moved: boolean, mesh: string, from: string, to: string }}\r\n */\r\nexport function reclassifyAtPoint(groups, cx, cy, cz, tolerance) {\r\n\tvar tol2 = (tolerance || 0.01) * (tolerance || 0.01);\r\n\tvar keys = [\r\n\t\t{ src: \"aInside\", dst: \"aOutside\", mesh: \"A\", from: \"inside\", to: \"outside\" },\r\n\t\t{ src: \"aOutside\", dst: \"aInside\", mesh: \"A\", from: \"outside\", to: \"inside\" },\r\n\t\t{ src: \"bInside\", dst: \"bOutside\", mesh: \"B\", from: \"inside\", to: \"outside\" },\r\n\t\t{ src: \"bOutside\", dst: \"bInside\", mesh: \"B\", from: \"outside\", to: \"inside\" }\r\n\t];\r\n\tfor (var ki = 0; ki < keys.length; ki++) {\r\n\t\tvar k = keys[ki];\r\n\t\tvar arr = groups[k.src];\r\n\t\tif (!arr) continue;\r\n\t\tfor (var ti = 0; ti < arr.length; ti++) {\r\n\t\t\tvar tri = arr[ti];\r\n\t\t\tvar tx = (tri.v0.x + tri.v1.x + tri.v2.x) / 3;\r\n\t\t\tvar ty = (tri.v0.y + tri.v1.y + tri.v2.y) / 3;\r\n\t\t\tvar tz = (tri.v0.z + tri.v1.z + tri.v2.z) / 3;\r\n\t\t\tvar dx = tx - cx, dy = ty - cy, dz = tz - cz;\r\n\t\t\tif (dx * dx + dy * dy + dz * dz < tol2) {\r\n\t\t\t\tgroups[k.dst].push(arr.splice(ti, 1)[0]);\r\n\t\t\t\treturn { moved: true, mesh: k.mesh, from: k.from, to: k.to };\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn { moved: false };\r\n}\r\n\r\n/**\r\n * Reclassify a connected region — flood fill from a seed triangle\r\n * to move all connected same-side triangles together.\r\n *\r\n * @param {Object} groups - { aInside, aOutside, bInside, bOutside }\r\n * @param {string} mesh - \"A\" or \"B\"\r\n * @param {string} fromSide - \"inside\" or \"outside\"\r\n * @param {number} seedIdx - Index of the seed triangle in the source array\r\n * @returns {number} Count of triangles moved\r\n */\r\nexport function reclassifyRegion(groups, mesh, fromSide, seedIdx) {\r\n\tvar srcKey = mesh.toLowerCase() + (fromSide === \"inside\" ? \"Inside\" : \"Outside\");\r\n\tvar dstKey = mesh.toLowerCase() + (fromSide === \"inside\" ? \"Outside\" : \"Inside\");\r\n\tvar src = groups[srcKey];\r\n\tvar dst = groups[dstKey];\r\n\tif (!src || !dst || seedIdx < 0 || seedIdx >= src.length) return 0;\r\n\r\n\t// Build edge adjacency within the source array\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\tvar edgeToIdx = {};\r\n\tfor (var i = 0; i < src.length; i++) {\r\n\t\tvar tri = src[i];\r\n\t\tvar ks = [vk(tri.v0), vk(tri.v1), vk(tri.v2)];\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 (!edgeToIdx[key]) edgeToIdx[key] = [];\r\n\t\t\tedgeToIdx[key].push(i);\r\n\t\t}\r\n\t}\r\n\r\n\t// Flood fill from seed\r\n\tvar visited = {};\r\n\tvisited[seedIdx] = true;\r\n\tvar queue = [seedIdx];\r\n\tvar head = 0;\r\n\twhile (head < queue.length) {\r\n\t\tvar curr = queue[head++];\r\n\t\tvar ct = src[curr];\r\n\t\tvar cks = [vk(ct.v0), vk(ct.v1), vk(ct.v2)];\r\n\t\tfor (var ce = 0; ce < 3; ce++) {\r\n\t\t\tvar cne = (ce + 1) % 3;\r\n\t\t\tvar cek = ek(cks[ce], cks[cne]);\r\n\t\t\tvar nbrs = edgeToIdx[cek];\r\n\t\t\tif (!nbrs) continue;\r\n\t\t\tfor (var ni = 0; ni < nbrs.length; ni++) {\r\n\t\t\t\tif (!visited[nbrs[ni]]) {\r\n\t\t\t\t\tvisited[nbrs[ni]] = true;\r\n\t\t\t\t\tqueue.push(nbrs[ni]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Move all visited triangles (descending order for safe splicing)\r\n\tvar toMove = Object.keys(visited).map(Number).sort(function(a, b) { return b - a; });\r\n\tfor (var mi = 0; mi < toMove.length; mi++) {\r\n\t\tdst.push(src.splice(toMove[mi], 1)[0]);\r\n\t}\r\n\treturn toMove.length;\r\n}\r\n\r\n// ── Decision tree: should we send the heffalump? ──\r\n\r\n/**\r\n * Detect whether a mesh pair needs the heffalump classifier.\r\n * Non-manifold edges = defective boundary = heffalump territory.\r\n *\r\n * @param {Array} trisA\r\n * @param {Array} trisB\r\n * @returns {boolean}\r\n */\r\nexport function shouldUseHeffalump(trisA, trisB) {\r\n\tvar statsA = countOpenEdges(trisA);\r\n\tvar statsB = countOpenEdges(trisB);\r\n\treturn statsA.overShared > 0 || statsB.overShared > 0;\r\n}\r\n","/**\r\n * @module bms/bmsBooleanOp\r\n *\r\n * Main entry point for the BMS (Brent's Mega Soup) boolean pipeline.\r\n *\r\n * Pipeline:\r\n *   1. bmsIntersect  — shared vertex pool + spatial grid\r\n *   2. bmsSplit      — CDT with pool vertices → mega soup\r\n *   3. bmsChain      — identity-based segment chaining\r\n *   4. bmsClose      — close polylines along boundary edges\r\n *   5. bmsClassify   — per-region boundary walk, winding = inside/outside\r\n */\r\n\r\nimport { bmsIntersect } from \"./bmsIntersect.js\";\r\nimport { bmsSplit } from \"./bmsSplit.js\";\r\nimport { bmsChain } from \"./bmsChain.js\";\r\nimport { bmsClosePolylines } from \"./bmsClose.js\";\r\nimport { bmsClassify } from \"./bmsClassify.js\";\r\nimport { verifyBmsClassification } from \"./bmsVerify.js\";\r\nimport { heffalumpClassify, shouldUseHeffalump } from \"./heffalumpClassify.js\";\r\nimport { estimateAvgEdge } from \"../intersect/spatialGrid.js\";\r\nimport { soupCentroid, translateSoup } from \"../util/math.js\";\r\nimport { resolveTJunctions } from \"../repair/resolveTJunctions.js\";\r\nimport { weldBoundaryVertices } from \"../repair/weldBoundary.js\";\r\nimport { weldVertices } from \"../repair/weldVertices.js\";\r\nimport { deduplicateSeamVertices } from \"../repair/deduplicateVertices.js\";\r\nimport { indexGroups } from \"../util/indexGroups.js\";\r\n\r\n/**\r\n * Flip the winding order of all triangles in a soup.\r\n * @param {Array} tris\r\n * @returns {Array}\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 * Run the full BMS boolean pipeline.\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] - If omitted, returns split groups only\r\n * @param {Object} [options]\r\n * @param {\"auto\"|\"hybrid\"|\"heffalump\"} [options.classifier=\"auto\"] - Classification strategy.\r\n *        \"auto\" (default): census the inputs (messy → heffalump + auto pre-repair),\r\n *        run the hybrid classifier, verify partition / chain-closure / barrier\r\n *        post-conditions, and on any failure re-run ONLY the classification stage\r\n *        with the heffalump on the existing mega soup (milliseconds, no re-split).\r\n *        \"hybrid\": always hybrid, no verification (legacy behaviour).\r\n *        \"heffalump\": always heffalump.\r\n * @param {boolean} [options.forceHeffalump] - Deprecated alias for classifier: \"heffalump\"\r\n * @param {boolean} [options.preRepair] - Resolve T-junctions + weld boundary before\r\n *        splitting. Default: auto-enabled when classifier is \"auto\" and the census\r\n *        finds non-manifold edges.\r\n * @param {number} [options.tolerance] - Vertex pool tolerance\r\n * @param {boolean} [options.indexed] - Also attach `result.indexed` — a compact\r\n *        indexed twin of the groups (shared points pool + per-group [i,j,k] triples).\r\n *        Back-compatible: the soup `groups` are unchanged; this is additive + opt-in.\r\n * @returns {{\r\n *   groups: { aInside: Array, aOutside: Array, bInside: Array, bOutside: Array },\r\n *   segments: Array,\r\n *   polylines: Array,\r\n *   megaSoup: Array,\r\n *   pool: Object,\r\n *   classifier: { A: string, B: string },\r\n *   verification: { ok: boolean, failures: Array }|null\r\n * }|null}\r\n */\r\nexport function bmsBooleanOp(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\tvar classifierMode = opts.classifier || (opts.forceHeffalump ? \"heffalump\" : \"auto\");\r\n\r\n\t// Step 0) Translate to origin for floating-point precision (UTM, mine coords)\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// Census: messy inputs (non-manifold edges) go straight to the heffalump,\r\n\t// and in auto mode they also get pre-repair unless the caller said otherwise.\r\n\tvar censusMessy = classifierMode !== \"hybrid\" && shouldUseHeffalump(soupA, soupB);\r\n\tvar doPreRepair = opts.preRepair !== undefined\r\n\t\t? !!opts.preRepair\r\n\t\t: (classifierMode === \"auto\" && censusMessy);\r\n\r\n\t// Step 1) Pre-repair (explicit, or auto-enabled by the census)\r\n\tif (doPreRepair) {\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\tsoupA = resolveTJunctions(soupA, tolA, 3);\r\n\t\tsoupA = weldBoundaryVertices(soupA, tolA);\r\n\t\tsoupB = resolveTJunctions(soupB, tolB, 3);\r\n\t\tsoupB = weldBoundaryVertices(soupB, tolB);\r\n\t}\r\n\r\n\t// Step 2) Intersect with shared vertex pool\r\n\tvar isect = bmsIntersect(soupA, soupB, { tolerance: opts.tolerance });\r\n\r\n\tif (isect.segments.length === 0) {\r\n\t\t// No intersection — everything is outside, translate back\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\tpolylines: [],\r\n\t\t\tmegaSoup: null,\r\n\t\t\tpool: isect.pool,\r\n\t\t\tclassifier: { A: \"none (no intersection)\", B: \"none (no intersection)\" },\r\n\t\t\tverification: null\r\n\t\t};\r\n\t}\r\n\r\n\t// Step 3) Split both meshes into mega soup\r\n\tvar megaSoup = bmsSplit(soupA, soupB, isect);\r\n\r\n\t// Step 4) Chain intersection segments\r\n\tvar polylines = bmsChain(isect.segments);\r\n\r\n\t// Step 5) Choose classification path.\r\n\t// Clean meshes → ige walk (boundary topology + barrier-normal hybrid)\r\n\t// Defective meshes → heffalump (barrier-only, no boundary needed)\r\n\t// Auto mode runs hybrid, verifies post-conditions, and falls back to the\r\n\t// heffalump on the EXISTING mega soup if any check fails — intersection,\r\n\t// pool, and split are classifier-independent, so this is cheap.\r\n\tvar useHeffalump = classifierMode === \"heffalump\" ||\r\n\t\t(classifierMode === \"auto\" && censusMessy);\r\n\r\n\tvar classifierReport = { A: \"hybrid\", B: \"hybrid\" };\r\n\tvar verification = null;\r\n\tvar closedPolylines, meshEdgePolys, classifyResult;\r\n\r\n\t// meshEdgePolys built from raw chains — used by the heffalump path (it\r\n\t// doesn't need boundary walks, but visualization toggles still work).\r\n\tfunction buildHeffalumpEdgePolys() {\r\n\t\tvar hefEpA = { segments: [], closed: false };\r\n\t\tvar hefEpB = { segments: [], closed: false };\r\n\t\tfor (var hpi = 0; hpi < polylines.length; hpi++) {\r\n\t\t\thefEpA.segments.push({ verts: polylines[hpi].slice(), type: \"intersection\" });\r\n\t\t\thefEpB.segments.push({ verts: polylines[hpi].slice(), type: \"intersection\" });\r\n\t\t}\r\n\t\treturn { A: hefEpA, B: hefEpB };\r\n\t}\r\n\r\n\tif (useHeffalump) {\r\n\t\tvar hefReason = classifierMode === \"heffalump\"\r\n\t\t\t? \"heffalump (forced)\"\r\n\t\t\t: \"heffalump (census: non-manifold edges)\";\r\n\t\tclassifierReport.A = hefReason;\r\n\t\tclassifierReport.B = hefReason;\r\n\t\tclosedPolylines = polylines;\r\n\t\tmeshEdgePolys = buildHeffalumpEdgePolys();\r\n\t\tclassifyResult = heffalumpClassify(megaSoup, isect.segments, soupA, soupB);\r\n\t} else {\r\n\t\t// Clean mesh path — close polylines along boundary + ige walk classification\r\n\t\tvar closeResult = bmsClosePolylines(polylines, soupA, soupB, megaSoup, isect.segments);\r\n\t\tclosedPolylines = closeResult.closedPolylines;\r\n\t\tmeshEdgePolys = closeResult.meshEdgePolys;\r\n\t\tclassifyResult = bmsClassify(megaSoup, closedPolylines, isect.segments, soupA, soupB, meshEdgePolys);\r\n\r\n\t\t// Auto mode: verify the hybrid's post-conditions\r\n\t\tif (classifierMode === \"auto\") {\r\n\t\t\tverification = verifyBmsClassification(\r\n\t\t\t\tmegaSoup, classifyResult.triSides, isect.segments, polylines, soupA, soupB);\r\n\r\n\t\t\tif (!verification.ok) {\r\n\t\t\t\t// Decide which meshes need the fallback\r\n\t\t\t\tvar fallbackA = false, fallbackB = false;\r\n\t\t\t\tvar reasonsA = [], reasonsB = [];\r\n\t\t\t\tfor (var fi = 0; fi < verification.failures.length; fi++) {\r\n\t\t\t\t\tvar f = verification.failures[fi];\r\n\t\t\t\t\tif (f.mesh === \"A\" || f.mesh === \"both\") { fallbackA = true; reasonsA.push(f.check); }\r\n\t\t\t\t\tif (f.mesh === \"B\" || f.mesh === \"both\") { fallbackB = true; reasonsB.push(f.check); }\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Re-run ONLY the classification stage on the existing mega soup\r\n\t\t\t\tvar hefResult = heffalumpClassify(megaSoup, isect.segments, soupA, soupB);\r\n\r\n\t\t\t\tvar mergedWalks = [];\r\n\t\t\t\tvar cwi2;\r\n\t\t\t\tif (fallbackA) {\r\n\t\t\t\t\tclassifyResult.aInside = hefResult.aInside;\r\n\t\t\t\t\tclassifyResult.aOutside = hefResult.aOutside;\r\n\t\t\t\t\tclassifierReport.A = \"heffalump (\" + reasonsA.join(\", \") + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tif (fallbackB) {\r\n\t\t\t\t\tclassifyResult.bInside = hefResult.bInside;\r\n\t\t\t\t\tclassifyResult.bOutside = hefResult.bOutside;\r\n\t\t\t\t\tclassifierReport.B = \"heffalump (\" + reasonsB.join(\", \") + \")\";\r\n\t\t\t\t}\r\n\t\t\t\t// Component walks: take each mesh's walks from the classifier that won\r\n\t\t\t\tfor (cwi2 = 0; cwi2 < classifyResult.componentWalks.length; cwi2++) {\r\n\t\t\t\t\tvar hw = classifyResult.componentWalks[cwi2];\r\n\t\t\t\t\tif ((hw.mesh === \"A\" && !fallbackA) || (hw.mesh === \"B\" && !fallbackB)) mergedWalks.push(hw);\r\n\t\t\t\t}\r\n\t\t\t\tfor (cwi2 = 0; cwi2 < hefResult.componentWalks.length; cwi2++) {\r\n\t\t\t\t\tvar fw = hefResult.componentWalks[cwi2];\r\n\t\t\t\t\tif ((fw.mesh === \"A\" && fallbackA) || (fw.mesh === \"B\" && fallbackB)) mergedWalks.push(fw);\r\n\t\t\t\t}\r\n\t\t\t\tclassifyResult.componentWalks = mergedWalks;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar groups = {\r\n\t\taInside: classifyResult.aInside,\r\n\t\taOutside: classifyResult.aOutside,\r\n\t\tbInside: classifyResult.bInside,\r\n\t\tbOutside: classifyResult.bOutside\r\n\t};\r\n\r\n\t// Step 7) Deduplicate seam vertices, then translate back to original coordinates\r\n\tif (groups.aInside.length > 0) groups.aInside = translateSoup(deduplicateSeamVertices(groups.aInside, 1e-4), cx, cy, cz);\r\n\tif (groups.aOutside.length > 0) groups.aOutside = translateSoup(deduplicateSeamVertices(groups.aOutside, 1e-4), cx, cy, cz);\r\n\tif (groups.bInside.length > 0) groups.bInside = translateSoup(deduplicateSeamVertices(groups.bInside, 1e-4), cx, cy, cz);\r\n\tif (groups.bOutside.length > 0) groups.bOutside = translateSoup(deduplicateSeamVertices(groups.bOutside, 1e-4), cx, cy, cz);\r\n\r\n\t// Translate meshEdgePolys and componentWalks verts back to original coordinates\r\n\tfunction translatePolyVerts(meshEps) {\r\n\t\tif (!meshEps) return;\r\n\t\tvar keys = [\"A\", \"B\"];\r\n\t\tfor (var ki = 0; ki < keys.length; ki++) {\r\n\t\t\tvar ep = meshEps[keys[ki]];\r\n\t\t\tif (!ep || !ep.segments) continue;\r\n\t\t\tfor (var si2 = 0; si2 < ep.segments.length; si2++) {\r\n\t\t\t\tvar vs = ep.segments[si2].verts;\r\n\t\t\t\tif (!vs) continue;\r\n\t\t\t\tfor (var vi = 0; vi < vs.length; vi++) {\r\n\t\t\t\t\tvs[vi] = { x: vs[vi].x + cx, y: vs[vi].y + cy, z: vs[vi].z + cz };\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\ttranslatePolyVerts(meshEdgePolys);\r\n\r\n\t// Translate componentWalk verts back\r\n\tif (classifyResult.componentWalks) {\r\n\t\tfor (var cwi = 0; cwi < classifyResult.componentWalks.length; cwi++) {\r\n\t\t\tvar segs = classifyResult.componentWalks[cwi].segments;\r\n\t\t\tfor (var csi = 0; csi < segs.length; csi++) {\r\n\t\t\t\tvar cvs = segs[csi].verts;\r\n\t\t\t\tif (!cvs) continue;\r\n\t\t\t\tfor (var cvi = 0; cvi < cvs.length; cvi++) {\r\n\t\t\t\t\tcvs[cvi] = { x: cvs[cvi].x + cx, y: cvs[cvi].y + cy, z: cvs[cvi].z + cz };\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Translate intersection segments and polylines back to original coordinates\r\n\tfor (var tsi = 0; tsi < isect.segments.length; tsi++) {\r\n\t\tvar tseg = isect.segments[tsi];\r\n\t\ttseg.p0 = { x: tseg.p0.x + cx, y: tseg.p0.y + cy, z: tseg.p0.z + cz, id: tseg.p0.id };\r\n\t\ttseg.p1 = { x: tseg.p1.x + cx, y: tseg.p1.y + cy, z: tseg.p1.z + cz, id: tseg.p1.id };\r\n\t}\r\n\tif (polylines) {\r\n\t\tfor (var tpi = 0; tpi < polylines.length; tpi++) {\r\n\t\t\tvar tpl = polylines[tpi];\r\n\t\t\tfor (var tpj = 0; tpj < tpl.length; tpj++) {\r\n\t\t\t\ttpl[tpj] = { x: tpl[tpj].x + cx, y: tpl[tpj].y + cy, z: tpl[tpj].z + cz, id: tpl[tpj].id };\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar result = {\r\n\t\tgroups: groups,\r\n\t\tsegments: isect.segments,\r\n\t\tpolylines: closedPolylines,\r\n\t\trawPolylines: polylines,\r\n\t\tmeshEdgePolys: meshEdgePolys,\r\n\t\tcomponentWalks: classifyResult.componentWalks,\r\n\t\tmegaSoup: megaSoup,\r\n\t\tpool: isect.pool,\r\n\t\tclassifier: classifierReport,\r\n\t\tverification: verification\r\n\t};\r\n\r\n\t// Opt-in INDEXED twin of the groups (back-compatible; soup `groups` unchanged).\r\n\t// One shared vertex pool + per-group [i,j,k] triples — ~5-10x lighter than soup,\r\n\t// so consumers can render/persist a multi-million-triangle result without\r\n\t// re-deduping it themselves (which is where large booleans OOM).\r\n\tif (opts.indexed) {\r\n\t\tresult.indexed = indexGroups(groups, opts.tolerance !== undefined ? opts.tolerance : 1e-4);\r\n\t}\r\n\r\n\t// Step 8) If operation specified, combine groups\r\n\tif (operation) {\r\n\t\tvar combined = [];\r\n\r\n\t\tif (operation === \"subtract\") {\r\n\t\t\tcombined = groups.aOutside.concat(flipSoup(groups.bInside));\r\n\t\t} else if (operation === \"union\") {\r\n\t\t\tcombined = groups.aOutside.concat(groups.bOutside);\r\n\t\t} else if (operation === \"intersect\") {\r\n\t\t\tcombined = groups.aInside.concat(groups.bInside);\r\n\t\t}\r\n\r\n\t\tif (combined.length > 0) {\r\n\t\t\tvar welded = weldVertices(combined, 1e-4);\r\n\t\t\tresult.result = {\r\n\t\t\t\tsoup: combined,\r\n\t\t\t\tpoints: welded.points,\r\n\t\t\t\ttriangles: welded.triangles\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tresult.result = null;\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n","/**\n * @module intersect/coplanarOverlap\n *\n * Coplanar triangle-triangle overlap — the case the Moller path\n * ({@link module:intersect/triTriIntersection}) deliberately rejects with\n * its near-parallel gate (|dotN| > 0.9999). Two coplanar triangles that\n * overlap in AREA are a coincident fold: the intersection is not a segment\n * but a convex polygon (A ∩ B).\n *\n * This module computes that overlap polygon and (optionally) emits its\n * boundary edges as intersection segments through the shared BMS vertex\n * pool, so both triangles get the SAME PoolVertex objects and the\n * subsequent split is conforming (no T-junctions across the fold).\n *\n * Coplanarity is decided with robust orient3d (Shewchuk adaptive\n * predicates) — the sign/zero of the 6x-tet-volume determinant — never\n * with an n·v + d epsilon test.\n *\n * Exports:\n *  - coplanarOverlap(triA, triB, options)          — overlap polygon or null\n *  - emitCoplanarSegments(polygon, pool, refA, refB) — polygon edges → pool segments\n */\n\nimport { orient2d, orient3d } from \"robust-predicates\";\nimport { triNormal } from \"../normals/triNormal.js\";\n\n/** Same near-parallel threshold as triTriIntersection's reject gate. */\nvar NEAR_PARALLEL = 0.9999;\n\n/**\n * Compute the convex overlap polygon of two coplanar triangles.\n *\n * Steps:\n *  1. Near-parallel gate: |nA · nB| must exceed `nearParallel` (default\n *     0.9999 — the exact complement of the Moller reject).\n *  2. Coplanarity: each vertex of B must lie on plane(A). The signed\n *     distance is derived from robust orient3d (6x signed tet volume)\n *     divided by |2A| of triangle A — exact sign, float magnitude.\n *  3. Project both triangles to the dominant-axis 2D plane of A's normal.\n *  4. Sutherland-Hodgman clip B against A (both convex) — intersection\n *     points are lerped in full 3D so the polygon stays on the plane.\n *  5. Area gate: the overlap must have real area (relative to the smaller\n *     triangle) — this naturally excludes legitimate coplanar neighbours\n *     that merely touch along a shared edge or vertex.\n *\n * @param {{ v0: Object, v1: Object, v2: Object }} triA\n * @param {{ v0: Object, v1: Object, v2: Object }} triB\n * @param {Object} [options]\n * @param {number} [options.nearParallel=0.9999] - |dotN| gate\n * @param {number} [options.distTolerance] - Max |distance| of B's vertices\n *        from plane(A). Default: 1e-7 x longest edge of A/B.\n * @param {number} [options.minAreaRatio=1e-6] - Overlap area must exceed\n *        this fraction of the smaller projected triangle area.\n * @returns {{ polygon: Array<{x,y,z}>, area: number, areaRatio: number } | null}\n *          Overlap polygon (3+ vertices, on the shared plane), projected\n *          2D area, and area / min(areaA, areaB). Null when not coplanar\n *          or no positive-area overlap.\n */\nexport function coplanarOverlap(triA, triB, options) {\n\tvar opts = options || {};\n\tvar nearParallel = opts.nearParallel !== undefined ? opts.nearParallel : NEAR_PARALLEL;\n\n\t// ── 1. Near-parallel gate ──\n\tvar nA = triNormal(triA);\n\tvar nB = triNormal(triB);\n\tvar dotN = nA.x * nB.x + nA.y * nB.y + nA.z * nB.z;\n\tif (Math.abs(dotN) < nearParallel) return null;\n\n\t// ── 2. Coplanarity via robust orient3d ──\n\t// |2A| of triangle A (cross product magnitude) converts the orient3d\n\t// determinant (6x tet volume) into a true point-plane distance.\n\tvar e1x = triA.v1.x - triA.v0.x, e1y = triA.v1.y - triA.v0.y, e1z = triA.v1.z - triA.v0.z;\n\tvar e2x = triA.v2.x - triA.v0.x, e2y = triA.v2.y - triA.v0.y, e2z = triA.v2.z - triA.v0.z;\n\tvar cxA = e1y * e2z - e1z * e2y;\n\tvar cyA = e1z * e2x - e1x * e2z;\n\tvar czA = e1x * e2y - e1y * e2x;\n\tvar lenCrossA = Math.sqrt(cxA * cxA + cyA * cyA + czA * czA);\n\tif (lenCrossA < 1e-30) return null; // degenerate A\n\n\tvar distTol = opts.distTolerance;\n\tif (distTol === undefined) {\n\t\tvar maxEdge = 0;\n\t\tvar pairs = [\n\t\t\t[triA.v0, triA.v1], [triA.v1, triA.v2], [triA.v2, triA.v0],\n\t\t\t[triB.v0, triB.v1], [triB.v1, triB.v2], [triB.v2, triB.v0]\n\t\t];\n\t\tfor (var pe = 0; pe < pairs.length; pe++) {\n\t\t\tvar dx = pairs[pe][0].x - pairs[pe][1].x;\n\t\t\tvar dy = pairs[pe][0].y - pairs[pe][1].y;\n\t\t\tvar dz = pairs[pe][0].z - pairs[pe][1].z;\n\t\t\tvar el = Math.sqrt(dx * dx + dy * dy + dz * dz);\n\t\t\tif (el > maxEdge) maxEdge = el;\n\t\t}\n\t\tdistTol = maxEdge * 1e-7;\n\t}\n\n\tvar bVerts = [triB.v0, triB.v1, triB.v2];\n\tfor (var bi = 0; bi < 3; bi++) {\n\t\tvar bv = bVerts[bi];\n\t\tvar det = orient3d(\n\t\t\ttriA.v0.x, triA.v0.y, triA.v0.z,\n\t\t\ttriA.v1.x, triA.v1.y, triA.v1.z,\n\t\t\ttriA.v2.x, triA.v2.y, triA.v2.z,\n\t\t\tbv.x, bv.y, bv.z\n\t\t);\n\t\tif (det !== 0) {\n\t\t\t// Exact sign says off-plane; magnitude / |2A| is the distance.\n\t\t\tvar dist = det / lenCrossA;\n\t\t\tif (Math.abs(dist) > distTol) return null;\n\t\t}\n\t}\n\n\t// ── 3. Dominant-axis 2D projection (of A's normal) ──\n\tvar anx = Math.abs(nA.x), any = Math.abs(nA.y), anz = Math.abs(nA.z);\n\tvar getU, getV;\n\tif (anz >= anx && anz >= any) {\n\t\tgetU = function (p) { return p.x; };\n\t\tgetV = function (p) { return p.y; };\n\t} else if (any >= anx) {\n\t\tgetU = function (p) { return p.x; };\n\t\tgetV = function (p) { return p.z; };\n\t} else {\n\t\tgetU = function (p) { return p.y; };\n\t\tgetV = function (p) { return p.z; };\n\t}\n\n\tfunction proj(p) {\n\t\treturn { x: p.x, y: p.y, z: p.z, u: getU(p), v: getV(p) };\n\t}\n\n\tvar clipPoly = [proj(triA.v0), proj(triA.v1), proj(triA.v2)];\n\tvar subject = [proj(triB.v0), proj(triB.v1), proj(triB.v2)];\n\n\tfunction shoelace(poly) {\n\t\tvar s = 0;\n\t\tfor (var i = 0; i < poly.length; i++) {\n\t\t\tvar j = (i + 1) % poly.length;\n\t\t\ts += poly[i].u * poly[j].v - poly[j].u * poly[i].v;\n\t\t}\n\t\treturn s * 0.5;\n\t}\n\n\tvar areaA2 = shoelace(clipPoly);\n\tvar areaB2 = shoelace(subject);\n\tif (Math.abs(areaA2) < 1e-30 || Math.abs(areaB2) < 1e-30) return null;\n\n\t// Sutherland-Hodgman needs a CCW clip polygon in the projection.\n\tif (areaA2 < 0) clipPoly.reverse();\n\n\t// ── 4. Sutherland-Hodgman clip: subject (B) against convex clip (A) ──\n\t// Inside test uses robust orient2d; intersection points are lerped in\n\t// full 3D so they remain on the shared plane.\n\tfunction intersectEdge(p, q, dp, dq) {\n\t\tvar t = dp / (dp - dq);\n\t\treturn {\n\t\t\tx: p.x + t * (q.x - p.x),\n\t\t\ty: p.y + t * (q.y - p.y),\n\t\t\tz: p.z + t * (q.z - p.z),\n\t\t\tu: p.u + t * (q.u - p.u),\n\t\t\tv: p.v + t * (q.v - p.v)\n\t\t};\n\t}\n\n\tvar output = subject;\n\tfor (var ce = 0; ce < 3 && output.length > 0; ce++) {\n\t\tvar c1 = clipPoly[ce];\n\t\tvar c2 = clipPoly[(ce + 1) % 3];\n\t\tvar input = output;\n\t\toutput = [];\n\n\t\tfor (var ii = 0; ii < input.length; ii++) {\n\t\t\tvar cur = input[ii];\n\t\t\tvar prev = input[(ii + input.length - 1) % input.length];\n\t\t\t// robust-predicates orient2d is POSITIVE for CLOCKWISE order, so\n\t\t\t// negate: d > 0 → left of c1→c2 (inside for a CCW clip polygon).\n\t\t\tvar dCur = -orient2d(c1.u, c1.v, c2.u, c2.v, cur.u, cur.v);\n\t\t\tvar dPrev = -orient2d(c1.u, c1.v, c2.u, c2.v, prev.u, prev.v);\n\t\t\tvar curIn = dCur >= 0;\n\t\t\tvar prevIn = dPrev >= 0;\n\n\t\t\tif (curIn) {\n\t\t\t\tif (!prevIn) output.push(intersectEdge(prev, cur, dPrev, dCur));\n\t\t\t\toutput.push(cur);\n\t\t\t} else if (prevIn) {\n\t\t\t\toutput.push(intersectEdge(prev, cur, dPrev, dCur));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (output.length < 3) return null;\n\n\t// ── Deduplicate near-coincident consecutive vertices ──\n\tvar weldTol = opts.weldTolerance !== undefined ? opts.weldTolerance : distTol;\n\tvar weldTolSq = weldTol * weldTol;\n\tvar polygon = [];\n\tfor (var oi = 0; oi < output.length; oi++) {\n\t\tvar op = output[oi];\n\t\tvar last = polygon.length > 0 ? polygon[polygon.length - 1] : null;\n\t\tif (last) {\n\t\t\tvar ddx = op.x - last.x, ddy = op.y - last.y, ddz = op.z - last.z;\n\t\t\tif (ddx * ddx + ddy * ddy + ddz * ddz <= weldTolSq) continue;\n\t\t}\n\t\tpolygon.push(op);\n\t}\n\t// Closing duplicate\n\tif (polygon.length >= 2) {\n\t\tvar first = polygon[0], lastP = polygon[polygon.length - 1];\n\t\tvar cdx = first.x - lastP.x, cdy = first.y - lastP.y, cdz = first.z - lastP.z;\n\t\tif (cdx * cdx + cdy * cdy + cdz * cdz <= weldTolSq) polygon.pop();\n\t}\n\tif (polygon.length < 3) return null;\n\n\t// ── 5. Area gate ──\n\tvar overlapArea = Math.abs(shoelace(polygon));\n\tvar minParent = Math.min(Math.abs(areaA2), Math.abs(areaB2));\n\tvar minAreaRatio = opts.minAreaRatio !== undefined ? opts.minAreaRatio : 1e-6;\n\tif (overlapArea < minParent * minAreaRatio) return null;\n\n\t// Strip the projection scratch fields from the result\n\tvar out = new Array(polygon.length);\n\tfor (var ri = 0; ri < polygon.length; ri++) {\n\t\tout[ri] = { x: polygon[ri].x, y: polygon[ri].y, z: polygon[ri].z };\n\t}\n\n\treturn { polygon: out, area: overlapArea, areaRatio: overlapArea / minParent };\n}\n\n/**\n * Emit the edges of a coplanar overlap polygon as intersection segments\n * through the shared vertex pool — the exact call pattern of\n * bmsIntersect: both endpoints are registered for BOTH triangles, so the\n * two folds share the SAME PoolVertex objects and the split conforms.\n *\n * The caller pushes the returned segments into its crossed sets.\n *\n * @param {Array<{x,y,z}>} polygon - Overlap polygon from {@link coplanarOverlap}\n * @param {Object} pool - Shared vertex pool (createVertexPool)\n * @param {{mesh: string, triIdx: number}} refA - Triangle ref for side A\n * @param {{mesh: string, triIdx: number}} refB - Triangle ref for side B\n * @returns {Array<{ p0: Object, p1: Object, idxA: number, idxB: number }>}\n */\nexport function emitCoplanarSegments(polygon, pool, refA, refB) {\n\tvar segs = [];\n\tvar n = polygon.length;\n\tfor (var k = 0; k < n; k++) {\n\t\tvar a = polygon[k];\n\t\tvar b = polygon[(k + 1) % n];\n\n\t\tvar pv0 = pool.getOrCreate(a.x, a.y, a.z, refA);\n\t\tpool.getOrCreate(a.x, a.y, a.z, refB);\n\n\t\tvar pv1 = pool.getOrCreate(b.x, b.y, b.z, refA);\n\t\tpool.getOrCreate(b.x, b.y, b.z, refB);\n\n\t\t// Pool dedup merged both endpoints — degenerate edge\n\t\tif (pv0 === pv1) continue;\n\n\t\tsegs.push({ p0: pv0, p1: pv1, idxA: refA.triIdx, idxB: refB.triIdx });\n\t}\n\treturn segs;\n}\n","/**\n * @module classify/windingNumber\n *\n * Generalized winding number (Jacobson, Kavan & Sorkine-Hornung 2013):\n * the sum of signed solid angles of every triangle w.r.t. a query point,\n * divided by 4π. Real-valued, robust to open arcs, flipped patches and\n * coincident double sheets — the classifier that discrete even-odd\n * parity cannot match on self-intersecting mining meshes.\n *\n * Used by the self-intersection fold resolver: after the self-arrangement\n * re-cuts every fold, sub-triangles are KEPT only where the winding\n * number STEPS across 0.5 between their two sides (the outer boundary of\n * the solid region); interior double sheets (w >= 1 on both sides) and\n * free flaps (w < 0.5 on both sides) are dropped.\n *\n * This is the DIRECT O(M) sum per query — correctness first. A Barnes-Hut\n * fast-winding-number tree (Barill et al. 2018) can replace the inner\n * loop later without changing any caller.\n */\n\nimport { vKey, edgeKey } from \"../util/math.js\";\n\nvar FOUR_PI = 4 * Math.PI;\n\n/**\n * Signed solid angle of triangle (a, b, c) as seen from point p.\n * Van Oosterom & Strackee (1983) — numerically stable atan2 form.\n *\n * Positive when the triangle's CCW winding faces the point (the point is\n * on the side its geometric normal points toward).\n *\n * @returns {number} Solid angle in steradians (0 when p lies on a vertex)\n */\nexport function solidAngleAt(px, py, pz, ax, ay, az, bx, by, bz, cx, cy, cz) {\n\tvar Ax = ax - px, Ay = ay - py, Az = az - pz;\n\tvar Bx = bx - px, By = by - py, Bz = bz - pz;\n\tvar Cx = cx - px, Cy = cy - py, Cz = cz - pz;\n\n\tvar la = Math.sqrt(Ax * Ax + Ay * Ay + Az * Az);\n\tvar lb = Math.sqrt(Bx * Bx + By * By + Bz * Bz);\n\tvar lc = Math.sqrt(Cx * Cx + Cy * Cy + Cz * Cz);\n\tif (la < 1e-30 || lb < 1e-30 || lc < 1e-30) return 0;\n\n\t// det [A B C] — triple product\n\tvar det = Ax * (By * Cz - Bz * Cy) - Ay * (Bx * Cz - Bz * Cx) + Az * (Bx * Cy - By * Cx);\n\n\tvar ab = Ax * Bx + Ay * By + Az * Bz;\n\tvar bc = Bx * Cx + By * Cy + Bz * Cz;\n\tvar ca = Cx * Ax + Cy * Ay + Cz * Az;\n\n\tvar den = la * lb * lc + ab * lc + bc * la + ca * lb;\n\n\treturn 2 * Math.atan2(det, den);\n}\n\n/**\n * Signed solid angle of a soup triangle as seen from point p.\n *\n * @param {{x,y,z}} p\n * @param {{ v0: Object, v1: Object, v2: Object }} tri\n * @returns {number}\n */\nexport function solidAngle(p, tri) {\n\treturn solidAngleAt(\n\t\tp.x, p.y, p.z,\n\t\ttri.v0.x, tri.v0.y, tri.v0.z,\n\t\ttri.v1.x, tri.v1.y, tri.v1.z,\n\t\ttri.v2.x, tri.v2.y, tri.v2.z\n\t);\n}\n\n/**\n * Generalized winding number of a point w.r.t. a triangle soup.\n * +1 inside a closed outward-oriented surface, 0 outside; real-valued\n * (fractional) for open or defective surfaces; 2 inside a double sheet.\n *\n * @param {{x,y,z}} p\n * @param {Array<{ v0, v1, v2 }>} soup\n * @returns {number}\n */\nexport function windingNumber(p, soup) {\n\tvar sum = 0;\n\tfor (var i = 0; i < soup.length; i++) {\n\t\tsum += solidAngle(p, soup[i]);\n\t}\n\treturn sum / FOUR_PI;\n}\n\n/**\n * Generalized winding number over an INDEXED mesh — iterates raw typed\n * arrays, no triangle objects (the multi-million-triangle path).\n *\n * @param {number} px @param {number} py @param {number} pz\n * @param {Float64Array|number[]} positions - [x0,y0,z0, x1,y1,z1, ...]\n * @param {Uint32Array|number[]} index - triangle vertex indices, 3 per tri\n * @returns {number}\n */\nexport function windingNumberIndexed(px, py, pz, positions, index) {\n\tvar sum = 0;\n\tfor (var i = 0; i < index.length; i += 3) {\n\t\tvar a = index[i] * 3, b = index[i + 1] * 3, c = index[i + 2] * 3;\n\t\tsum += solidAngleAt(\n\t\t\tpx, py, pz,\n\t\t\tpositions[a], positions[a + 1], positions[a + 2],\n\t\t\tpositions[b], positions[b + 1], positions[b + 2],\n\t\t\tpositions[c], positions[c + 1], positions[c + 2]\n\t\t);\n\t}\n\treturn sum / FOUR_PI;\n}\n\n/**\n * Winding-number STEP extraction — stage 4 of the self-intersection\n * resolver. For each candidate sub-triangle, evaluate the winding number\n * a small distance off each side of its centroid (w.r.t. the ORIGINAL\n * un-arranged mesh, supplied as `windingFn`):\n *\n *   - both sides outside (w < threshold)  → free flap        → DROP\n *   - both sides inside  (w >= threshold) → interior sheet   → DROP\n *   - winding steps across the threshold  → solid boundary   → KEEP,\n *     oriented so the face normal points at the OUTSIDE (w < threshold).\n *\n * @param {Array<{ v0, v1, v2 }>} subTris - Arranged sub-triangles to classify\n * @param {function(number, number, number): number} windingFn - w(px,py,pz)\n *        w.r.t. the original mesh (windingNumber / windingNumberIndexed\n *        closure, or a fast-winding-number tree later)\n * @param {Object} [options]\n * @param {number} [options.threshold=0.5] - Inside/outside winding cut\n * @param {number} [options.offsetFactor=1e-3] - Query offset = factor x sqrt(triArea)\n * @returns {{\n *   kept: Array, dropped: number, flipped: number,\n *   keptFlags: Uint8Array, flipFlags: Uint8Array\n * }} kept triangles preserve vertex object references (flips swap v1/v2\n *    but keep the same objects); mesh/origIdx tags are carried over.\n */\nexport function extractByWinding(subTris, windingFn, options) {\n\tvar opts = options || {};\n\tvar threshold = opts.threshold !== undefined ? opts.threshold : 0.5;\n\tvar offsetFactor = opts.offsetFactor !== undefined ? opts.offsetFactor : 1e-3;\n\n\tvar kept = [];\n\tvar dropped = 0;\n\tvar flipped = 0;\n\tvar keptFlags = new Uint8Array(subTris.length);\n\tvar flipFlags = new Uint8Array(subTris.length);\n\n\tfor (var i = 0; i < subTris.length; i++) {\n\t\tvar t = subTris[i];\n\n\t\tvar e1x = t.v1.x - t.v0.x, e1y = t.v1.y - t.v0.y, e1z = t.v1.z - t.v0.z;\n\t\tvar e2x = t.v2.x - t.v0.x, e2y = t.v2.y - t.v0.y, e2z = t.v2.z - t.v0.z;\n\t\tvar nx = e1y * e2z - e1z * e2y;\n\t\tvar ny = e1z * e2x - e1x * e2z;\n\t\tvar nz = e1x * e2y - e1y * e2x;\n\t\tvar nLen = Math.sqrt(nx * nx + ny * ny + nz * nz);\n\t\tif (nLen < 1e-30) { dropped++; continue; } // degenerate\n\n\t\tnx /= nLen; ny /= nLen; nz /= nLen;\n\t\tvar area = nLen * 0.5;\n\t\tvar delta = Math.sqrt(area) * offsetFactor;\n\t\tif (delta < 1e-12) delta = 1e-12;\n\n\t\tvar cx = (t.v0.x + t.v1.x + t.v2.x) / 3;\n\t\tvar cy = (t.v0.y + t.v1.y + t.v2.y) / 3;\n\t\tvar cz = (t.v0.z + t.v1.z + t.v2.z) / 3;\n\n\t\tvar wFront = windingFn(cx + nx * delta, cy + ny * delta, cz + nz * delta);\n\t\tvar wBack = windingFn(cx - nx * delta, cy - ny * delta, cz - nz * delta);\n\n\t\tvar outFront = wFront < threshold;\n\t\tvar outBack = wBack < threshold;\n\n\t\tif (outFront === outBack) { dropped++; continue; }\n\n\t\tkeptFlags[i] = 1;\n\t\tif (outFront) {\n\t\t\tkept.push(t);\n\t\t} else {\n\t\t\t// Flip so the normal points at the outside — reuse vertex objects.\n\t\t\tvar f = { v0: t.v0, v1: t.v2, v2: t.v1 };\n\t\t\tif (t.mesh !== undefined) f.mesh = t.mesh;\n\t\t\tif (t.origIdx !== undefined) f.origIdx = t.origIdx;\n\t\t\tkept.push(f);\n\t\t\tflipFlags[i] = 1;\n\t\t\tflipped++;\n\t\t}\n\t}\n\n\treturn { kept: kept, dropped: dropped, flipped: flipped, keptFlags: keptFlags, flipFlags: flipFlags };\n}\n\n/**\n * REGION-CONSISTENT winding extraction — one decision per PATCH, not per\n * triangle. Per-triangle extraction (extractByWinding) makes independent\n * keep/drop calls that disagree across shared edges → tears. This flood-fills\n * the arrangement into patches bounded by the intersection BARRIER edges (and\n * non-manifold edges), coherently orients each patch, samples the generalized\n * winding number ONCE per patch on each side, and keeps the whole patch iff it\n * separates inside (winding ≥ threshold) from outside — edge-consistent by\n * construction, so tears can only occur at barriers (where the arrangement is\n * already conforming). Naturally drops interior double sheets (both sides\n * inside) and free flaps (both sides outside), and is robust to the −1/+2\n * winding regions of a non-orientable reference because it tests a threshold on\n * whole patches, not a per-triangle 0.5 step.\n *\n * @param {Array<{v0,v1,v2,mesh?,origIdx?}>} subTris - conforming arrangement\n * @param {Object.<string, boolean>} barrierKeys - edgeKey → true for intersection edges\n * @param {function(number,number,number): number} windingFn - w.r.t. ORIGINAL soup\n * @param {Object} [options]\n * @param {number} [options.threshold=0.5] - inside iff winding ≥ threshold\n * @param {number} [options.offsetFactor=1e-3] - query offset = factor·√area\n * @param {number} [options.samplesPerPatch=5] - winding samples per patch (majority)\n * @returns {{ kept: Array, patches: number, keptPatches: number, droppedPatches: number }}\n */\nexport function extractByWindingPatches(subTris, barrierKeys, windingFn, options) {\n\tvar opts = options || {};\n\tvar threshold = opts.threshold !== undefined ? opts.threshold : 0.5;\n\tvar offsetFactor = opts.offsetFactor !== undefined ? opts.offsetFactor : 1e-3;\n\tvar samplesPerPatch = opts.samplesPerPatch !== undefined ? opts.samplesPerPatch : 5;\n\tvar n = subTris.length;\n\n\t// Edge → users (by vKey). dir records low→high traversal for coherence.\n\tvar edgeMap = {};\n\tvar triKeys = new Array(n);\n\tfor (var i = 0; i < n; i++) {\n\t\tvar t = subTris[i];\n\t\tvar ks = [vKey(t.v0), vKey(t.v1), vKey(t.v2)];\n\t\ttriKeys[i] = ks;\n\t\tfor (var e = 0; e < 3; e++) {\n\t\t\tvar a = ks[e], b = ks[(e + 1) % 3];\n\t\t\tvar ek = edgeKey(a, b);\n\t\t\t(edgeMap[ek] = edgeMap[ek] || []).push({ tri: i, dir: a < b ? 1 : -1 });\n\t\t}\n\t}\n\n\t// Flood-fill patches across NON-barrier, MANIFOLD edges; propagate coherent\n\t// orientation (flip flags).\n\tvar patchOf = new Int32Array(n);\n\tfor (var z = 0; z < n; z++) patchOf[z] = -1;\n\tvar flip = new Uint8Array(n);\n\tvar patches = [];\n\tfor (var seed = 0; seed < n; seed++) {\n\t\tif (patchOf[seed] >= 0) continue;\n\t\tvar pid = patches.length;\n\t\tvar members = [seed];\n\t\tpatchOf[seed] = pid;\n\t\tvar queue = [seed];\n\t\tvar head = 0;\n\t\twhile (head < queue.length) {\n\t\t\tvar cur = queue[head++];\n\t\t\tvar ks2 = triKeys[cur];\n\t\t\tfor (var e2 = 0; e2 < 3; e2++) {\n\t\t\t\tvar a2 = ks2[e2], b2 = ks2[(e2 + 1) % 3];\n\t\t\t\tvar ek2 = edgeKey(a2, b2);\n\t\t\t\tif (barrierKeys[ek2]) continue;          // barrier: patch boundary\n\t\t\t\tvar users = edgeMap[ek2];\n\t\t\t\tif (users.length !== 2) continue;        // boundary/non-manifold: stop\n\t\t\t\tvar other = users[0].tri === cur ? users[1] : users[0];\n\t\t\t\tif (patchOf[other.tri] >= 0) continue;\n\t\t\t\tvar self = users[0].tri === cur ? users[0] : users[1];\n\t\t\t\tvar dSelf = self.dir * (flip[cur] ? -1 : 1);\n\t\t\t\tif (dSelf === other.dir) flip[other.tri] = 1; // coherent = opposite traversal\n\t\t\t\tpatchOf[other.tri] = pid;\n\t\t\t\tmembers.push(other.tri);\n\t\t\t\tqueue.push(other.tri);\n\t\t\t}\n\t\t}\n\t\tpatches.push(members);\n\t}\n\n\tfunction normArea(t, fl) {\n\t\tvar e1x = t.v1.x - t.v0.x, e1y = t.v1.y - t.v0.y, e1z = t.v1.z - t.v0.z;\n\t\tvar e2x = t.v2.x - t.v0.x, e2y = t.v2.y - t.v0.y, e2z = t.v2.z - t.v0.z;\n\t\tvar nx = e1y * e2z - e1z * e2y, ny = e1z * e2x - e1x * e2z, nz = e1x * e2y - e1y * e2x;\n\t\tif (fl) { nx = -nx; ny = -ny; nz = -nz; }\n\t\tvar l = Math.sqrt(nx * nx + ny * ny + nz * nz);\n\t\tif (l < 1e-30) return null;\n\t\treturn { x: nx / l, y: ny / l, z: nz / l, area: l * 0.5 };\n\t}\n\n\tvar kept = [];\n\tvar keptPatches = 0, droppedPatches = 0;\n\tfor (var p = 0; p < patches.length; p++) {\n\t\tvar mem = patches[p];\n\t\t// Sample the largest few triangles for a stable per-patch decision.\n\t\tvar order = mem.slice().sort(function (x, y) {\n\t\t\treturn normAreaVal(subTris[y]) - normAreaVal(subTris[x]);\n\t\t});\n\t\tvar K = Math.min(samplesPerPatch, order.length);\n\t\tvar frontInVotes = 0, backInVotes = 0, samples = 0;\n\t\tfor (var si = 0; si < K; si++) {\n\t\t\tvar idx = order[si];\n\t\t\tvar tt = subTris[idx];\n\t\t\tvar nrm = normArea(tt, flip[idx]);\n\t\t\tif (!nrm) continue;\n\t\t\tvar delta = Math.sqrt(nrm.area) * offsetFactor;\n\t\t\tif (delta < 1e-9) delta = 1e-9;\n\t\t\tvar cx = (tt.v0.x + tt.v1.x + tt.v2.x) / 3;\n\t\t\tvar cy = (tt.v0.y + tt.v1.y + tt.v2.y) / 3;\n\t\t\tvar cz = (tt.v0.z + tt.v1.z + tt.v2.z) / 3;\n\t\t\tvar wF = windingFn(cx + nrm.x * delta, cy + nrm.y * delta, cz + nrm.z * delta);\n\t\t\tvar wB = windingFn(cx - nrm.x * delta, cy - nrm.y * delta, cz - nrm.z * delta);\n\t\t\tif (wF >= threshold) frontInVotes++;\n\t\t\tif (wB >= threshold) backInVotes++;\n\t\t\tsamples++;\n\t\t}\n\t\tif (samples === 0) { droppedPatches++; continue; }\n\t\tvar frontIn = frontInVotes * 2 > samples;\n\t\tvar backIn = backInVotes * 2 > samples;\n\t\tif (frontIn === backIn) { droppedPatches++; continue; } // double sheet or flap\n\t\tkeptPatches++;\n\t\t// Orient normal toward OUTSIDE (the < threshold side). front = +coherent\n\t\t// normal; if front is inside, outside is back → flip.\n\t\tfor (var m = 0; m < mem.length; m++) {\n\t\t\tvar mi = mem[m];\n\t\t\tvar mt = subTris[mi];\n\t\t\tvar doFlip = (flip[mi] === 1) !== frontIn;\n\t\t\tif (doFlip) kept.push({ v0: mt.v0, v1: mt.v2, v2: mt.v1 });\n\t\t\telse kept.push({ v0: mt.v0, v1: mt.v1, v2: mt.v2 });\n\t\t}\n\t}\n\n\treturn { kept: kept, patches: patches.length, keptPatches: keptPatches, droppedPatches: droppedPatches };\n}\n\nfunction normAreaVal(t) {\n\tvar e1x = t.v1.x - t.v0.x, e1y = t.v1.y - t.v0.y, e1z = t.v1.z - t.v0.z;\n\tvar e2x = t.v2.x - t.v0.x, e2y = t.v2.y - t.v0.y, e2z = t.v2.z - t.v0.z;\n\tvar nx = e1y * e2z - e1z * e2y, ny = e1z * e2x - e1x * e2z, nz = e1x * e2y - e1y * e2x;\n\treturn nx * nx + ny * ny + nz * nz;\n}\n","/**\n * @module classify/cellComplex\n *\n * Volumetric winding-number extraction via a 3D CELL COMPLEX (Zhou, Grinspun,\n * Zorin & Jacobson, \"Mesh Arrangements for Solid Geometry\", SIGGRAPH 2016).\n *\n * The surface-side patch classifier (extractByWindingPatches) samples the\n * generalized winding number on each patch's two sides. That fails at\n * non-orientable seams, where a consistent surface orientation does not exist —\n * so a small residual of open edges survives around those seams.\n *\n * This module removes that assumption. From the CONFORMING arrangement it:\n *\n *   0. FACET MERGE — coincident coplanar sub-faces (the fold sheets) are merged\n *      into ONE oriented facet carrying a signed multiplicity (net orientation\n *      count). Opposite pairs cancel to 0 and vanish (a zero-thickness flap is\n *      invisible to winding); k stacked same-orientation sheets become one facet\n *      with jump k. This is what makes the radial fan well-defined on folds.\n *   1. RADIAL EDGE STRUCTURE — around every edge, sort the incident facets by\n *      dihedral angle (the \"radial fan\"). This order exists even where no\n *      consistent surface orientation does — the crux that dissolves the seams.\n *   2. CELL COMPLEX — the fans glue the two sides of each facet (its half-faces)\n *      into connected 3-D CELLS via union-find over half-faces.\n *   3. WINDING PROPAGATION — crossing a facet against its normal raises winding\n *      by its jump, so w(cell on −normal side) = w(cell on +normal side) + jump.\n *      BFS the integer winding across each cell-graph component; the per-\n *      component global offset is fixed by a robust majority of direct\n *      generalized-winding samples (propagation is truth, GWN only anchors it;\n *      per-component fixes NESTING of disjoint shells).\n *   4. EXTRACT — keep exactly the facets separating a cell with winding ≥ thr\n *      from one with winding < thr, oriented inside→outside. Manifold BY\n *      CONSTRUCTION — no orientability assumption anywhere.\n *\n * Robust predicates (orient3d) resolve radial ties; float atan2 gives the order.\n */\n\nimport { orient3d } from \"robust-predicates\";\nimport { vKey } from \"../util/math.js\";\n\n/**\n * Extract the solid boundary from a conforming arrangement by 3-D cell-complex\n * winding propagation.\n *\n * @param {Array<{v0,v1,v2}>} soup - conforming arrangement (welded; shared verts)\n * @param {function(number,number,number): number} windingFn - generalized winding\n *        number w.r.t. the ORIGINAL soup (anchors the per-component offset only)\n * @param {Object} [options]\n * @param {number} [options.threshold=1] - inside iff cell winding ≥ threshold\n * @param {number} [options.offsetFactor=1e-4] - GWN sample offset = factor·√area\n * @param {number} [options.offsetSamples=64] - GWN samples per cell-graph component\n * @returns {{\n *   kept: Array,\n *   diagnostics: Object\n * }}\n */\nexport function extractByCellComplex(soup, windingFn, options) {\n\tvar opts = options || {};\n\tvar threshold = opts.threshold !== undefined ? opts.threshold : 1;\n\tvar offsetFactor = opts.offsetFactor !== undefined ? opts.offsetFactor : 1e-4;\n\tvar offsetSamples = opts.offsetSamples !== undefined ? opts.offsetSamples : 64;\n\n\t// ── Vertex ids (dedup by vKey; the welded soup already shares reps) ──\n\tvar vidOf = {};\n\tvar vpos = [];\n\tfunction vid(v) {\n\t\tvar k = vKey(v);\n\t\tvar id = vidOf[k];\n\t\tif (id === undefined) { id = vpos.length; vidOf[k] = id; vpos.push({ x: v.x, y: v.y, z: v.z }); }\n\t\treturn id;\n\t}\n\n\t// ── Step 0: merge coincident facets → { ids(sorted), jump } ──\n\t// Sign of a face relative to the sorted-id canonical orientation = permutation\n\t// parity (an odd permutation flips the triangle normal).\n\tfunction permSign(i0, i1, i2) {\n\t\t// number of inversions in [i0,i1,i2] parity\n\t\tvar inv = 0;\n\t\tif (i0 > i1) inv++;\n\t\tif (i0 > i2) inv++;\n\t\tif (i1 > i2) inv++;\n\t\treturn (inv % 2 === 0) ? 1 : -1;\n\t}\n\tvar facetMap = {};\n\tvar degenerateFaces = 0;\n\tfor (var fi = 0; fi < soup.length; fi++) {\n\t\tvar t = soup[fi];\n\t\tvar a = vid(t.v0), b = vid(t.v1), c = vid(t.v2);\n\t\tif (a === b || b === c || c === a) { degenerateFaces++; continue; }\n\t\tvar s0 = a, s1 = b, s2 = c;\n\t\t// sort (s0,s1,s2)\n\t\tif (s0 > s1) { var tmp = s0; s0 = s1; s1 = tmp; }\n\t\tif (s1 > s2) { var tmp2 = s1; s1 = s2; s2 = tmp2; }\n\t\tif (s0 > s1) { var tmp3 = s0; s0 = s1; s1 = tmp3; }\n\t\tvar key = s0 + \"|\" + s1 + \"|\" + s2;\n\t\tvar sign = permSign(a, b, c);\n\t\tvar fm = facetMap[key];\n\t\tif (!fm) { fm = facetMap[key] = { a: s0, b: s1, c: s2, jump: 0 }; }\n\t\tfm.jump += sign;\n\t}\n\n\t// Materialise facets with non-zero net multiplicity.\n\tvar facets = [];\n\tfor (var fk in facetMap) {\n\t\tvar fm2 = facetMap[fk];\n\t\tif (fm2.jump === 0) continue; // zero-thickness flap — invisible to winding\n\t\tfacets.push(fm2);\n\t}\n\tvar F = facets.length;\n\n\t// Canonical geometry per facet (normal from sorted a,b,c).\n\tvar faceNormal = new Array(F);\n\tfor (var f2 = 0; f2 < F; f2++) {\n\t\tvar fa = vpos[facets[f2].a], fb = vpos[facets[f2].b], fc = vpos[facets[f2].c];\n\t\tvar e1x = fb.x - fa.x, e1y = fb.y - fa.y, e1z = fb.z - fa.z;\n\t\tvar e2x = fc.x - fa.x, e2y = fc.y - fa.y, e2z = fc.z - fa.z;\n\t\tfaceNormal[f2] = { x: e1y * e2z - e1z * e2y, y: e1z * e2x - e1x * e2z, z: e1x * e2y - e1y * e2x };\n\t}\n\n\t// ── Step 1: edge → incidences (canonical directed edge a→b, a = min id) ──\n\tvar edges = {};\n\tfunction edgeId(p, q) { return p < q ? p + \"|\" + q : q + \"|\" + p; }\n\tfor (var f3 = 0; f3 < F; f3++) {\n\t\tvar ids = [facets[f3].a, facets[f3].b, facets[f3].c];\n\t\tfor (var e = 0; e < 3; e++) {\n\t\t\tvar p = ids[e], q = ids[(e + 1) % 3], apex = ids[(e + 2) % 3];\n\t\t\tvar lo = p < q ? p : q;\n\t\t\t(edges[edgeId(p, q)] = edges[edgeId(p, q)] || []).push({ face: f3, s: (p === lo) ? 1 : -1, apex: apex });\n\t\t}\n\t}\n\n\t// ── Step 2: radial sort + half-face union-find ──\n\tvar parent = new Int32Array(2 * F);\n\tfor (var h = 0; h < 2 * F; h++) parent[h] = h;\n\tfunction find(x) { while (parent[x] !== x) { parent[x] = parent[parent[x]]; x = parent[x]; } return x; }\n\tfunction union(x, y) { var rx = find(x), ry = find(y); if (rx !== ry) parent[rx] = ry; }\n\n\tvar openEdges = 0, nonManifoldEdges = 0, edgeCount = 0;\n\tfor (var ek in edges) {\n\t\tedgeCount++;\n\t\tvar inc = edges[ek];\n\t\tif (inc.length === 1) { openEdges++; continue; }\n\t\tif (inc.length > 2) nonManifoldEdges++;\n\n\t\tvar parts = ek.split(\"|\");\n\t\tvar aId = parseInt(parts[0], 10), bId = parseInt(parts[1], 10);\n\t\tvar Pa = vpos[aId], Pb = vpos[bId];\n\t\tvar ex = Pb.x - Pa.x, ey = Pb.y - Pa.y, ez = Pb.z - Pa.z;\n\t\tvar elen = Math.sqrt(ex * ex + ey * ey + ez * ez);\n\t\tif (elen < 1e-30) continue;\n\t\tex /= elen; ey /= elen; ez /= elen;\n\n\t\tvar ux, uy, uz;\n\t\tif (Math.abs(ex) <= Math.abs(ey) && Math.abs(ex) <= Math.abs(ez)) { ux = 0; uy = -ez; uz = ey; }\n\t\telse if (Math.abs(ey) <= Math.abs(ez)) { ux = -ez; uy = 0; uz = ex; }\n\t\telse { ux = -ey; uy = ex; uz = 0; }\n\t\tvar ul = Math.sqrt(ux * ux + uy * uy + uz * uz);\n\t\tif (ul < 1e-30) continue;\n\t\tux /= ul; uy /= ul; uz /= ul;\n\t\tvar vx = ey * uz - ez * uy, vy = ez * ux - ex * uz, vz = ex * uy - ey * ux;\n\n\t\tfor (var ii = 0; ii < inc.length; ii++) {\n\t\t\tvar apxP = vpos[inc[ii].apex];\n\t\t\tvar dx = apxP.x - Pa.x, dy = apxP.y - Pa.y, dz = apxP.z - Pa.z;\n\t\t\tvar dot = dx * ex + dy * ey + dz * ez;\n\t\t\tdx -= dot * ex; dy -= dot * ey; dz -= dot * ez;\n\t\t\tinc[ii].theta = Math.atan2(dx * vx + dy * vy + dz * vz, dx * ux + dy * uy + dz * uz);\n\t\t\tinc[ii].apexP = apxP;\n\t\t}\n\t\tinc.sort(function (A, B) {\n\t\t\tvar dth = A.theta - B.theta;\n\t\t\tif (Math.abs(dth) > 1e-9) return dth < 0 ? -1 : 1;\n\t\t\tvar o = orient3d(Pa.x, Pa.y, Pa.z, Pb.x, Pb.y, Pb.z,\n\t\t\t\tA.apexP.x, A.apexP.y, A.apexP.z, B.apexP.x, B.apexP.y, B.apexP.z);\n\t\t\tif (o !== 0) return o < 0 ? -1 : 1;\n\t\t\treturn A.s - B.s;\n\t\t});\n\n\t\tvar k = inc.length;\n\t\tfor (var w = 0; w < k; w++) {\n\t\t\tvar cur = inc[w], nxt = inc[(w + 1) % k];\n\t\t\tvar hfCur = cur.s === 1 ? 2 * cur.face : 2 * cur.face + 1;\n\t\t\tvar hfNxt = nxt.s === 1 ? 2 * nxt.face + 1 : 2 * nxt.face;\n\t\t\tunion(hfCur, hfNxt);\n\t\t}\n\t}\n\n\t// ── Cells = half-face components ──\n\tvar cellId = {};\n\tvar numCells = 0;\n\tvar plusCell = new Int32Array(F);\n\tvar minusCell = new Int32Array(F);\n\tfor (var f4 = 0; f4 < F; f4++) {\n\t\tvar rp = find(2 * f4), rm = find(2 * f4 + 1);\n\t\tif (cellId[rp] === undefined) cellId[rp] = numCells++;\n\t\tif (cellId[rm] === undefined) cellId[rm] = numCells++;\n\t\tplusCell[f4] = cellId[rp];\n\t\tminusCell[f4] = cellId[rm];\n\t}\n\n\t// ── Cell adjacency + winding propagation (per component) ──\n\t// w(minusCell) = w(plusCell) + facet.jump.\n\tvar cellAdj = new Array(numCells);\n\tfor (var ci = 0; ci < numCells; ci++) cellAdj[ci] = [];\n\tfor (var f5 = 0; f5 < F; f5++) {\n\t\tif (plusCell[f5] === minusCell[f5]) continue;\n\t\tvar jmp = facets[f5].jump;\n\t\tcellAdj[plusCell[f5]].push({ cell: minusCell[f5], jump: jmp });\n\t\tcellAdj[minusCell[f5]].push({ cell: plusCell[f5], jump: -jmp });\n\t}\n\n\t// Connected components of the cell graph (for diagnostics + propagation check).\n\tvar compOf = new Int32Array(numCells);\n\tfor (var ic = 0; ic < numCells; ic++) compOf[ic] = -1;\n\tvar relW = new Float64Array(numCells);\n\tvar numComps = 0, propagationViolations = 0;\n\tfor (var seed = 0; seed < numCells; seed++) {\n\t\tif (compOf[seed] !== -1) continue;\n\t\tvar comp = numComps++;\n\t\tcompOf[seed] = comp; relW[seed] = 0;\n\t\tvar queue = [seed], head = 0;\n\t\twhile (head < queue.length) {\n\t\t\tvar cc = queue[head++];\n\t\t\tvar nbrs = cellAdj[cc];\n\t\t\tfor (var ni = 0; ni < nbrs.length; ni++) {\n\t\t\t\tvar nb = nbrs[ni];\n\t\t\t\tif (compOf[nb.cell] === -1) {\n\t\t\t\t\tcompOf[nb.cell] = comp; relW[nb.cell] = relW[cc] + nb.jump; queue.push(nb.cell);\n\t\t\t\t} else if (relW[nb.cell] !== relW[cc] + nb.jump) {\n\t\t\t\t\tpropagationViolations++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// ── Winding per cell: PROPAGATION is the source of truth ──\n\t// Relative winding (relW) already came from BFS across the cell graph (exact\n\t// integer ±jump per face). The per-component global offset is anchored by the\n\t// LARGEST cell of each component (most GWN samples ⇒ most reliable), not a\n\t// vote across all cells (small seam cells give noisy GWN). GWN only fixes the\n\t// offset; the propagation supplies every relative value.\n\tvar maxSamplesPerCell = Math.max(8, offsetSamples);\n\tvar cellSamples = new Array(numCells);\n\tvar cellFaceCount = new Int32Array(numCells);\n\tfor (var cs = 0; cs < numCells; cs++) cellSamples[cs] = [];\n\tfor (var f6 = 0; f6 < F; f6++) {\n\t\tcellFaceCount[plusCell[f6]]++; cellFaceCount[minusCell[f6]]++;\n\t\tvar nrm = faceNormal[f6];\n\t\tvar nl = Math.sqrt(nrm.x * nrm.x + nrm.y * nrm.y + nrm.z * nrm.z);\n\t\tif (nl < 1e-24) continue;\n\t\tvar ga = vpos[facets[f6].a], gb = vpos[facets[f6].b], gc = vpos[facets[f6].c];\n\t\tvar cx = (ga.x + gb.x + gc.x) / 3, cy = (ga.y + gb.y + gc.y) / 3, cz = (ga.z + gb.z + gc.z) / 3;\n\t\tvar delta = Math.sqrt(nl * 0.5) * offsetFactor;\n\t\tif (delta < 1e-9) delta = 1e-9;\n\t\tvar unx = nrm.x / nl, uny = nrm.y / nl, unz = nrm.z / nl;\n\t\tvar pc = plusCell[f6], mc = minusCell[f6];\n\t\tif (cellSamples[pc].length < maxSamplesPerCell) cellSamples[pc].push([cx + unx * delta, cy + uny * delta, cz + unz * delta]);\n\t\tif (cellSamples[mc].length < maxSamplesPerCell) cellSamples[mc].push([cx - unx * delta, cy - uny * delta, cz - unz * delta]);\n\t}\n\n\t// Per-cell GWN median (offset anchoring) + inside-fraction (leak detection).\n\tvar cellGwn = new Float64Array(numCells);\n\tvar cellInsideFrac = new Float64Array(numCells);\n\tfor (var cg = 0; cg < numCells; cg++) {\n\t\tvar samp = cellSamples[cg];\n\t\tif (samp.length === 0) { cellGwn[cg] = 0; cellInsideFrac[cg] = 0; continue; }\n\t\tvar vals = [], insideN = 0;\n\t\tfor (var svi = 0; svi < samp.length; svi++) {\n\t\t\tvar wv = windingFn(samp[svi][0], samp[svi][1], samp[svi][2]);\n\t\t\tvals.push(wv);\n\t\t\tif (wv >= threshold - 0.5) insideN++;\n\t\t}\n\t\tvals.sort(function (a, b) { return a - b; });\n\t\tcellGwn[cg] = vals[vals.length >> 1];\n\t\tcellInsideFrac[cg] = insideN / samp.length;\n\t}\n\n\t// The cell complex supplies the MANIFOLD structure (radial fans → cells); the\n\t// per-cell winding VALUE is the robust per-cell GWN median. This is region-\n\t// consistent (one value per CELL — it cannot tear like per-FACE GWN, which is\n\t// the failure the propagation was meant to avoid), and unlike pure integer\n\t// propagation it survives the fixture's dangling non-solid flaps and the\n\t// residual seam leaks. `propagationViolations` (from the BFS above) is kept as\n\t// a consistency diagnostic; on watertight input the two agree exactly.\n\tvar winding = new Float64Array(numCells);\n\tvar wMin = Infinity, wMax = -Infinity;\n\tfor (var c2 = 0; c2 < numCells; c2++) {\n\t\twinding[c2] = Math.round(cellGwn[c2]);\n\t\tif (winding[c2] < wMin) wMin = winding[c2];\n\t\tif (winding[c2] > wMax) wMax = winding[c2];\n\t}\n\n\t// Leak detection: a cell whose GWN samples are MIXED (inside and outside) has\n\t// merged inside↔outside through a residual hole — its solid is lost. Report\n\t// the leaked face-weight so the caller can fall back per Zhou's robustness.\n\tvar leakedCells = 0, leakedFaceWeight = 0, totalFaceWeight = 2 * F;\n\tfor (var lc = 0; lc < numCells; lc++) {\n\t\tif (cellInsideFrac[lc] > 0.15 && cellInsideFrac[lc] < 0.85) {\n\t\t\tleakedCells++;\n\t\t\tleakedFaceWeight += cellFaceCount[lc];\n\t\t}\n\t}\n\n\t// ── Extract facets separating inside (≥thr) from outside (<thr) ──\n\tvar kept = [];\n\tfor (var f7 = 0; f7 < F; f7++) {\n\t\tvar wp2 = winding[plusCell[f7]], wm2 = winding[minusCell[f7]];\n\t\tvar inPlus = wp2 >= threshold, inMinus = wm2 >= threshold;\n\t\tif (inPlus === inMinus) continue;\n\t\tvar fv = facets[f7];\n\t\tvar va = vpos[fv.a], vb = vpos[fv.b], vc = vpos[fv.c];\n\t\t// Orient normal toward the OUTSIDE (lower-winding) side. Canonical normal\n\t\t// points to plusCell. If plus is outside, keep canonical; else flip.\n\t\tif (!inPlus) kept.push({ v0: va, v1: vb, v2: vc });\n\t\telse kept.push({ v0: va, v1: vc, v2: vb });\n\t}\n\n\tvar result = {\n\t\tkept: kept,\n\t\tdiagnostics: {\n\t\t\tfaces: F, edges: edgeCount, cells: numCells, components: numComps,\n\t\t\twindingMin: wMin === Infinity ? 0 : wMin,\n\t\t\twindingMax: wMax === -Infinity ? 0 : wMax,\n\t\t\tpropagationViolations: propagationViolations,\n\t\t\topenEdges: openEdges, nonManifoldEdges: nonManifoldEdges,\n\t\t\tdegenerateFaces: degenerateFaces,\n\t\t\tleakedCells: leakedCells,\n\t\t\tleakedFaceFraction: totalFaceWeight > 0 ? leakedFaceWeight / totalFaceWeight : 0\n\t\t}\n\t};\n\n\tif (opts.debug) {\n\t\tvar cellFaces = new Int32Array(numCells);\n\t\tvar cellSampleFace = new Int32Array(numCells);\n\t\tfor (var df = 0; df < F; df++) { cellFaces[plusCell[df]]++; cellFaces[minusCell[df]]++; cellSampleFace[plusCell[df]] = df; cellSampleFace[minusCell[df]] = -df - 1; }\n\t\tvar info = [];\n\t\tfor (var dc = 0; dc < numCells; dc++) {\n\t\t\t// GWN sample for this cell\n\t\t\tvar sf = cellSampleFace[dc]; var isPlus = sf >= 0; var fidx = isPlus ? sf : (-sf - 1);\n\t\t\tvar nn = faceNormal[fidx]; var nnl = Math.sqrt(nn.x * nn.x + nn.y * nn.y + nn.z * nn.z) || 1;\n\t\t\tvar gv = vpos[facets[fidx].a], gv2 = vpos[facets[fidx].b], gv3 = vpos[facets[fidx].c];\n\t\t\tvar ccx = (gv.x + gv2.x + gv3.x) / 3, ccy = (gv.y + gv2.y + gv3.y) / 3, ccz = (gv.z + gv2.z + gv3.z) / 3;\n\t\t\tvar dl = Math.sqrt(nnl * 0.5) * offsetFactor; if (dl < 1e-9) dl = 1e-9;\n\t\t\tvar sgn = isPlus ? 1 : -1;\n\t\t\tvar gwn = windingFn(ccx + sgn * nn.x / nnl * dl, ccy + sgn * nn.y / nnl * dl, ccz + sgn * nn.z / nnl * dl);\n\t\t\tinfo.push({ cell: dc, comp: compOf[dc], winding: winding[dc], faces: cellFaces[dc], gwn: Math.round(gwn * 100) / 100 });\n\t\t}\n\t\tinfo.sort(function (a, b) { return b.faces - a.faces; });\n\t\tresult.diagnostics.cellInfo = info.slice(0, 20);\n\t}\n\n\treturn result;\n}\n","/**\n * @module classify/coincidentDedup\n *\n * Coincident-sheet deduplication — the last stage of the self-intersection\n * fold resolver.\n *\n * When a fold's sheets are EXACTLY coincident (the target pathology:\n * coplanar coincident overlaps), the winding number steps across the\n * WHOLE coincident stack at once, so every sheet of the stack passes the\n * keep test — the result would carry the boundary 2x or 3x. Zhou et al.\n * (Mesh Arrangements, 2016) merge coincident facets into a single\n * arrangement cell; this module is the practical equivalent:\n *\n *  1. Exact duplicates (same three vertex keys) → keep ONE per group.\n *  2. Residual coplanar-overlapping pairs (different tessellations of the\n *     same region — Delaunay tie-breaks can differ between sheets) →\n *     union-find them into clusters and re-CDT each cluster ONCE with the\n *     union of all member edges as constraints; emit each region once.\n *\n * All kept triangles arrive ALREADY oriented outward by the winding\n * extraction, so a cluster's members agree in orientation; the re-CDT\n * output copies the orientation of the first member.\n */\n\nimport Delaunator from \"delaunator\";\nimport Constrainautor from \"@kninnug/constrainautor\";\nimport { vKey, edgeKey } from \"../util/math.js\";\nimport { buildSpatialGrid, queryGrid, triBBox, bboxOverlap } from \"../intersect/spatialGrid.js\";\nimport { estimateAvgEdge } from \"../intersect/spatialGrid.js\";\nimport { coplanarOverlap } from \"../intersect/coplanarOverlap.js\";\nimport { triNormal } from \"../normals/triNormal.js\";\n\n/**\n * Remove coincident duplicate sheets from a triangle soup.\n *\n * @param {Array<{ v0, v1, v2 }>} tris - Kept, outward-oriented soup\n * @param {Object} [options]\n * @param {number} [options.minAreaRatio=1e-4] - Overlap gate for residual\n *        pair detection (fraction of the smaller triangle's area)\n * @returns {{\n *   soup: Array,\n *   duplicateGroups: number,\n *   duplicatesRemoved: number,\n *   clusters: number,\n *   clusterTrisIn: number,\n *   clusterTrisOut: number\n * }}\n */\nexport function dedupCoincidentTriangles(tris, options) {\n\tvar opts = options || {};\n\n\t// ── Pass 1: exact duplicates by sorted vertex-key triple ──\n\tvar groupsByKey = {};\n\tvar order = [];\n\tfor (var i = 0; i < tris.length; i++) {\n\t\tvar t = tris[i];\n\t\tvar ks = [vKey(t.v0), vKey(t.v1), vKey(t.v2)].sort();\n\t\tvar gk = ks[0] + \"#\" + ks[1] + \"#\" + ks[2];\n\t\tif (!groupsByKey[gk]) { groupsByKey[gk] = []; order.push(gk); }\n\t\tgroupsByKey[gk].push(i);\n\t}\n\n\tvar afterExact = [];\n\tvar duplicateGroups = 0;\n\tvar duplicatesRemoved = 0;\n\tfor (var g = 0; g < order.length; g++) {\n\t\tvar members = groupsByKey[order[g]];\n\t\tafterExact.push(tris[members[0]]); // keep first (all outward already)\n\t\tif (members.length > 1) {\n\t\t\tduplicateGroups++;\n\t\t\tduplicatesRemoved += members.length - 1;\n\t\t}\n\t}\n\n\t// ── Pass 2: residual coplanar-overlapping pairs → clusters ──\n\tvar n = afterExact.length;\n\tif (n === 0) {\n\t\treturn { soup: afterExact, duplicateGroups: duplicateGroups, duplicatesRemoved: duplicatesRemoved, clusters: 0, clusterTrisIn: 0, clusterTrisOut: 0 };\n\t}\n\n\tvar avgEdge = estimateAvgEdge(afterExact);\n\tvar cellSize = Math.max(avgEdge * 2, 0.1);\n\tvar grid = buildSpatialGrid(afterExact, cellSize);\n\n\tvar minAreaRatio = opts.minAreaRatio !== undefined ? opts.minAreaRatio : 1e-4;\n\n\t// Union-find\n\tvar parent = new Int32Array(n);\n\tfor (var pi = 0; pi < n; pi++) parent[pi] = pi;\n\tfunction find(x) { while (parent[x] !== x) { parent[x] = parent[parent[x]]; x = parent[x]; } return x; }\n\tfunction union(a, b) { var ra = find(a), rb = find(b); if (ra !== rb) parent[rb] = ra; }\n\n\tvar anyOverlap = false;\n\tfor (var ia = 0; ia < n; ia++) {\n\t\tvar bbA = triBBox(afterExact[ia]);\n\t\tvar cands = queryGrid(grid, bbA, cellSize);\n\t\tfor (var ci = 0; ci < cands.length; ci++) {\n\t\t\tvar ib = cands[ci];\n\t\t\tif (ib <= ia) continue;\n\t\t\tif (!bboxOverlap(bbA, triBBox(afterExact[ib]))) continue;\n\t\t\tvar cop = coplanarOverlap(afterExact[ia], afterExact[ib], { minAreaRatio: minAreaRatio });\n\t\t\tif (cop) { union(ia, ib); anyOverlap = true; }\n\t\t}\n\t}\n\n\tif (!anyOverlap) {\n\t\treturn { soup: afterExact, duplicateGroups: duplicateGroups, duplicatesRemoved: duplicatesRemoved, clusters: 0, clusterTrisIn: 0, clusterTrisOut: 0 };\n\t}\n\n\t// Gather clusters (size >= 2)\n\tvar clusterMap = {};\n\tfor (var mi = 0; mi < n; mi++) {\n\t\tvar root = find(mi);\n\t\tif (!clusterMap[root]) clusterMap[root] = [];\n\t\tclusterMap[root].push(mi);\n\t}\n\n\tvar inCluster = new Uint8Array(n);\n\tvar clusterList = [];\n\tfor (var rk in clusterMap) {\n\t\tif (clusterMap[rk].length >= 2) {\n\t\t\tclusterList.push(clusterMap[rk]);\n\t\t\tfor (var cm = 0; cm < clusterMap[rk].length; cm++) inCluster[clusterMap[rk][cm]] = 1;\n\t\t}\n\t}\n\n\tvar out = [];\n\tfor (var oi = 0; oi < n; oi++) {\n\t\tif (!inCluster[oi]) out.push(afterExact[oi]);\n\t}\n\n\tvar clusterTrisIn = 0, clusterTrisOut = 0;\n\tfor (var cl = 0; cl < clusterList.length; cl++) {\n\t\tvar memberIdx = clusterList[cl];\n\t\tvar memberTris = [];\n\t\tfor (var mt = 0; mt < memberIdx.length; mt++) memberTris.push(afterExact[memberIdx[mt]]);\n\t\tclusterTrisIn += memberTris.length;\n\n\t\tvar replaced = retessellateCluster(memberTris);\n\t\tclusterTrisOut += replaced.length;\n\t\tfor (var rt = 0; rt < replaced.length; rt++) out.push(replaced[rt]);\n\t}\n\n\treturn {\n\t\tsoup: out,\n\t\tduplicateGroups: duplicateGroups,\n\t\tduplicatesRemoved: duplicatesRemoved,\n\t\tclusters: clusterList.length,\n\t\tclusterTrisIn: clusterTrisIn,\n\t\tclusterTrisOut: clusterTrisOut\n\t};\n}\n\n/**\n * Re-tessellate one coincident cluster: CDT of the union of all member\n * vertices with the union of all member edges as constraints, keeping\n * each output region ONCE (centroid covered by >= 1 member).\n *\n * @param {Array<{ v0, v1, v2 }>} memberTris - Coplanar, mutually overlapping\n * @returns {Array<{ v0, v1, v2 }>}\n */\nfunction retessellateCluster(memberTris) {\n\tvar refTri = memberTris[0];\n\tvar nRef = triNormal(refTri);\n\n\t// Local 2D frame on the cluster plane\n\tvar e1x = refTri.v1.x - refTri.v0.x, e1y = refTri.v1.y - refTri.v0.y, e1z = refTri.v1.z - refTri.v0.z;\n\tvar e1Len = Math.sqrt(e1x * e1x + e1y * e1y + e1z * e1z);\n\tif (e1Len < 1e-12) return memberTris;\n\tvar ux = e1x / e1Len, uy = e1y / e1Len, uz = e1z / e1Len;\n\tvar vx = nRef.y * uz - nRef.z * uy;\n\tvar vy = nRef.z * ux - nRef.x * uz;\n\tvar vz = nRef.x * uy - nRef.y * ux;\n\tvar ox = refTri.v0.x, oy = refTri.v0.y, oz = refTri.v0.z;\n\n\tfunction toLocal(p) {\n\t\tvar dx = p.x - ox, dy = p.y - oy, dz = p.z - oz;\n\t\treturn [dx * ux + dy * uy + dz * uz, dx * vx + dy * vy + dz * vz];\n\t}\n\n\t// Unique vertices by vKey — keep FIRST object reference\n\tvar keyToIdx = {};\n\tvar pts = [];\n\tvar constraints = {};\n\n\tfunction addVert(p) {\n\t\tvar k = vKey(p);\n\t\tvar idx = keyToIdx[k];\n\t\tif (idx === undefined) {\n\t\t\tidx = pts.length;\n\t\t\tkeyToIdx[k] = idx;\n\t\t\tpts.push(p);\n\t\t}\n\t\treturn idx;\n\t}\n\n\tvar memberIdxTriples = [];\n\tfor (var m = 0; m < memberTris.length; m++) {\n\t\tvar mt = memberTris[m];\n\t\tvar i0 = addVert(mt.v0), i1 = addVert(mt.v1), i2 = addVert(mt.v2);\n\t\tmemberIdxTriples.push([i0, i1, i2]);\n\t\tvar edges = [[i0, i1], [i1, i2], [i2, i0]];\n\t\tfor (var e = 0; e < 3; e++) {\n\t\t\tvar a = edges[e][0], b = edges[e][1];\n\t\t\tif (a === b) continue;\n\t\t\tvar ek = a < b ? a + \"|\" + b : b + \"|\" + a;\n\t\t\tconstraints[ek] = [a, b];\n\t\t}\n\t}\n\n\tvar np = pts.length;\n\tvar coords = new Float64Array(np * 2);\n\tvar local = new Array(np);\n\tfor (var p = 0; p < np; p++) {\n\t\tvar lp = toLocal(pts[p]);\n\t\tlocal[p] = lp;\n\t\tcoords[p * 2] = lp[0];\n\t\tcoords[p * 2 + 1] = lp[1];\n\t}\n\n\tvar del;\n\ttry {\n\t\tdel = new Delaunator(coords);\n\t} catch (de) {\n\t\treturn [memberTris[0]]; // degenerate — best effort: keep one sheet\n\t}\n\n\ttry {\n\t\tvar con = new Constrainautor(del);\n\t\tfor (var ck in constraints) {\n\t\t\ttry { con.constrainOne(constraints[ck][0], constraints[ck][1]); } catch (ce) { /* skip */ }\n\t\t}\n\t} catch (ce2) { /* unconstrained still usable */ }\n\n\t// Coverage test: keep an output triangle once if its centroid lies\n\t// inside at least one member (2D barycentric, small tolerance).\n\tfunction insideMember(cx, cy, triple) {\n\t\tvar a = local[triple[0]], b = local[triple[1]], c = local[triple[2]];\n\t\tvar d = (b[1] - c[1]) * (a[0] - c[0]) + (c[0] - b[0]) * (a[1] - c[1]);\n\t\tif (Math.abs(d) < 1e-30) return false;\n\t\tvar w0 = ((b[1] - c[1]) * (cx - c[0]) + (c[0] - b[0]) * (cy - c[1])) / d;\n\t\tvar w1 = ((c[1] - a[1]) * (cx - c[0]) + (a[0] - c[0]) * (cy - c[1])) / d;\n\t\tvar w2 = 1 - w0 - w1;\n\t\tvar tol = -1e-9;\n\t\treturn w0 >= tol && w1 >= tol && w2 >= tol;\n\t}\n\n\tvar result = [];\n\tvar delTris = del.triangles;\n\tfor (var k = 0; k < delTris.length; k += 3) {\n\t\tvar ta = delTris[k], tb = delTris[k + 1], tc = delTris[k + 2];\n\t\tvar ccx = (coords[ta * 2] + coords[tb * 2] + coords[tc * 2]) / 3;\n\t\tvar ccy = (coords[ta * 2 + 1] + coords[tb * 2 + 1] + coords[tc * 2 + 1]) / 3;\n\n\t\tvar covered = false;\n\t\tfor (var mi = 0; mi < memberIdxTriples.length; mi++) {\n\t\t\tif (insideMember(ccx, ccy, memberIdxTriples[mi])) { covered = true; break; }\n\t\t}\n\t\tif (!covered) continue;\n\n\t\t// Orient to the cluster normal (members are all outward already)\n\t\tvar pa = pts[ta], pb = pts[tb], pc = pts[tc];\n\t\tvar s1x = pb.x - pa.x, s1y = pb.y - pa.y, s1z = pb.z - pa.z;\n\t\tvar s2x = pc.x - pa.x, s2y = pc.y - pa.y, s2z = pc.z - pa.z;\n\t\tvar snx = s1y * s2z - s1z * s2y;\n\t\tvar sny = s1z * s2x - s1x * s2z;\n\t\tvar snz = s1x * s2y - s1y * s2x;\n\t\tvar dot = snx * nRef.x + sny * nRef.y + snz * nRef.z;\n\n\t\tif (dot < 0) {\n\t\t\tresult.push({ v0: pa, v1: pc, v2: pb });\n\t\t} else {\n\t\t\tresult.push({ v0: pa, v1: pb, v2: pc });\n\t\t}\n\t}\n\n\treturn result.length > 0 ? result : [memberTris[0]];\n}\n","/**\n * @module bms/bmsSelfArrange\n *\n * SELF-arrangement — the exact fold resolver entry (Zhou et al. \"Mesh\n * Arrangements for Solid Geometry\", 2016, adapted to the BMS pipeline).\n *\n * A closed mesh with coincident COPLANAR overlaps (folds) is\n * non-orientable: no consistent winding exists, so orientSolid can never\n * fix it. The exact fix is to re-cut ALL self-intersections — including\n * the coplanar overlaps that the Moller near-parallel gate rejects —\n * into a conforming arrangement, then classify sub-triangles by the\n * generalized winding number and keep only the solid boundary.\n *\n * Stages (all through the SHARED vertex pool — the anti-T-junction\n * guarantee):\n *   1. bmsSelfIntersect — every non-adjacent triangle pair of ONE mesh\n *      against itself: Moller crossings PLUS coplanar-overlap polygons.\n *   2. refineSelfSegments — per-triangle constraint arrangement: split\n *      segments at T-points and at proper crossings so no triangle ends\n *      up with crossing CDT constraints (3+ overlapping sheets).\n *   3. bmsSplit (unchanged) — conforming re-triangulation.\n *   4. extractByWinding + dedupCoincidentTriangles + orientSolid —\n *      keep the solid boundary once, outward.\n *\n * The A-vs-B boolean path (bmsBooleanOp) is untouched.\n */\n\nimport { orient3d } from \"robust-predicates\";\nimport { triTriIntersection } from \"../intersect/triTriIntersection.js\";\nimport { coplanarOverlap, emitCoplanarSegments } from \"../intersect/coplanarOverlap.js\";\nimport { buildSpatialGrid, queryGrid, triBBox, bboxOverlap, estimateAvgEdge } from \"../intersect/spatialGrid.js\";\nimport { createVertexPool } from \"./bmsVertexPool.js\";\nimport { bmsSplit } from \"./bmsSplit.js\";\nimport { soupCentroid, translateSoup, vKey, edgeKey, countOpenEdges } from \"../util/math.js\";\nimport { extractByWinding, extractByWindingPatches, windingNumber } from \"../classify/windingNumber.js\";\nimport { extractByCellComplex } from \"../classify/cellComplex.js\";\nimport { dedupCoincidentTriangles } from \"../classify/coincidentDedup.js\";\nimport { orientSolid } from \"../normals/orientSolid.js\";\nimport { extractBoundaryLoops, triangulateLoop } from \"../repair/boundaryLoops.js\";\n\n/**\n * Self-intersect one triangle soup: every non-adjacent pair is tested\n * with Moller (crossings) AND the coplanar-overlap path (folds). All\n * segment endpoints go through ONE shared vertex pool; both triangles of\n * a pair register the same PoolVertex objects.\n *\n * Adjacency exclusion: pairs sharing a vertex (by exact coordinate key)\n * are legitimate mesh neighbours, NOT self-intersections — they are\n * excluded from the crossing path. The coplanar path is gated by overlap\n * AREA instead, because a fold ACROSS a shared crease edge is a genuine\n * self-overlap while side-by-side coplanar neighbours clip to zero area.\n *\n * @param {Array<{ v0, v1, v2 }>} soup\n * @param {Object} [options]\n * @param {number} [options.tolerance] - Pool merge tolerance (default: avgEdge x 0.001)\n * @param {number} [options.minAreaRatio=1e-6] - Coplanar overlap area gate\n * @returns {{\n *   segments: Array, crossedSet: Object.<number, Array>, pool: Object,\n *   stats: { candidatePairs: number, coplanarPairs: number, crossingPairs: number,\n *            refinementSplits: number }\n * }}\n */\nexport function bmsSelfIntersect(soup, options) {\n\tvar opts = options || {};\n\n\tvar avgEdge = estimateAvgEdge(soup);\n\tvar tolerance = opts.tolerance !== undefined ? opts.tolerance : avgEdge * 0.001;\n\tvar pool = createVertexPool(tolerance);\n\n\tvar cellSize = Math.max(avgEdge * 2, 0.1);\n\tvar grid = buildSpatialGrid(soup, cellSize);\n\n\t// Vertex-share adjacency by exact coordinate key\n\tvar vertIds = new Array(soup.length);\n\tvar keyMap = {};\n\tvar nextVid = 0;\n\tfor (var vi = 0; vi < soup.length; vi++) {\n\t\tvar tv = soup[vi];\n\t\tvar ids = new Array(3);\n\t\tvar vs = [tv.v0, tv.v1, tv.v2];\n\t\tfor (var k = 0; k < 3; k++) {\n\t\t\tvar vk = vKey(vs[k]);\n\t\t\tif (keyMap[vk] === undefined) keyMap[vk] = nextVid++;\n\t\t\tids[k] = keyMap[vk];\n\t\t}\n\t\tvertIds[vi] = ids;\n\t}\n\n\t// EDGE adjacency (2 shared vertices), NOT vertex adjacency. Edge-sharing\n\t// triangles are genuine manifold neighbours and would report their shared\n\t// edge as a false crossing segment, so they are excluded from the crossing\n\t// path. Triangles sharing only ONE vertex can still transversally cross\n\t// (e.g. two hemi faces of a tetrahemihexahedron meeting at a corner but\n\t// overlapping along an axis) — they MUST be tested; a legitimate\n\t// vertex-touch yields a degenerate segment that triTriIntersection rejects.\n\tfunction sharesEdge(i, j) {\n\t\tvar a = vertIds[i], b = vertIds[j];\n\t\tvar shared = 0;\n\t\tfor (var s = 0; s < 3; s++) {\n\t\t\tif (a[s] === b[0] || a[s] === b[1] || a[s] === b[2]) shared++;\n\t\t}\n\t\treturn shared >= 2;\n\t}\n\n\t// Snap tolerance for near-vertex rounding (kills ~pool-tolerance T-junctions\n\t// where an intersection endpoint lands just off an ORIGINAL vertex).\n\tvar snapTol = opts.snapTolerance !== undefined ? opts.snapTolerance : avgEdge * 0.003;\n\n\tvar segments = [];\n\tvar crossedSet = {};\n\tvar stats = { candidatePairs: 0, coplanarPairs: 0, crossingPairs: 0, refinementSplits: 0 };\n\n\tvar copOpts = {\n\t\tminAreaRatio: opts.minAreaRatio !== undefined ? opts.minAreaRatio : 1e-6,\n\t\tdistTolerance: opts.coplanarDistTolerance\n\t};\n\n\tfunction pushSeg(seg) {\n\t\tsegments.push(seg);\n\t\tif (!crossedSet[seg.idxA]) crossedSet[seg.idxA] = [];\n\t\tcrossedSet[seg.idxA].push(seg);\n\t\tif (!crossedSet[seg.idxB]) crossedSet[seg.idxB] = [];\n\t\tcrossedSet[seg.idxB].push(seg);\n\t}\n\n\tfor (var i = 0; i < soup.length; i++) {\n\t\tvar triI = soup[i];\n\t\tvar bbI = triBBox(triI);\n\t\tvar candidates = queryGrid(grid, bbI, cellSize);\n\n\t\tfor (var c = 0; c < candidates.length; c++) {\n\t\t\tvar j = candidates[c];\n\t\t\tif (j <= i) continue; // each unordered pair once\n\t\t\tvar triJ = soup[j];\n\t\t\tif (!bboxOverlap(bbI, triBBox(triJ))) continue;\n\t\t\tstats.candidatePairs++;\n\n\t\t\tvar adjacent = sharesEdge(i, j);\n\n\t\t\t// ── Coplanar fold path (area-gated, adjacency-agnostic) ──\n\t\t\tvar cop = coplanarOverlap(triI, triJ, copOpts);\n\t\t\tif (cop) {\n\t\t\t\tvar copSegs = emitCoplanarSegments(cop.polygon, pool,\n\t\t\t\t\t{ mesh: \"A\", triIdx: i }, { mesh: \"A\", triIdx: j });\n\t\t\t\tif (copSegs.length > 0) {\n\t\t\t\t\tstats.coplanarPairs++;\n\t\t\t\t\tfor (var cs = 0; cs < copSegs.length; cs++) pushSeg(copSegs[cs]);\n\t\t\t\t}\n\t\t\t\tcontinue; // coplanar pair — Moller would near-parallel reject anyway\n\t\t\t}\n\n\t\t\t// ── Transversal crossing path (neighbours excluded) ──\n\t\t\tif (adjacent) continue;\n\n\t\t\tvar seg = triTriIntersection(triI, triJ);\n\t\t\tif (!seg) continue;\n\n\t\t\tvar pv0 = pool.getOrCreate(seg.p0.x, seg.p0.y, seg.p0.z, { mesh: \"A\", triIdx: i });\n\t\t\tpool.getOrCreate(seg.p0.x, seg.p0.y, seg.p0.z, { mesh: \"A\", triIdx: j });\n\t\t\tvar pv1 = pool.getOrCreate(seg.p1.x, seg.p1.y, seg.p1.z, { mesh: \"A\", triIdx: i });\n\t\t\tpool.getOrCreate(seg.p1.x, seg.p1.y, seg.p1.z, { mesh: \"A\", triIdx: j });\n\t\t\tif (pv0 === pv1) continue;\n\n\t\t\tstats.crossingPairs++;\n\t\t\tpushSeg({ p0: pv0, p1: pv1, idxA: i, idxB: j });\n\t\t}\n\t}\n\n\t// Near-vertex T-junctions (intersection endpoint ~snapTol off an original\n\t// vertex) are closed AFTER the split by weldTaggedSoup, seeded with the\n\t// original vertices so they win as representatives (snap-to-vertex). Snapping\n\t// BEFORE the split destabilises the per-triangle CDT (degenerate/duplicate\n\t// points), so we do not mutate endpoints here.\n\tstats.vertexSnaps = 0;\n\n\t// ── Per-triangle constraint arrangement ──\n\tvar refined = refineSelfSegments(segments, soup, pool, tolerance, stats);\n\n\t// Rebuild crossed sets from the refined segment list\n\tvar crossedSet2 = {};\n\tfor (var rs = 0; rs < refined.length; rs++) {\n\t\tvar rseg = refined[rs];\n\t\tif (!crossedSet2[rseg.idxA]) crossedSet2[rseg.idxA] = [];\n\t\tcrossedSet2[rseg.idxA].push(rseg);\n\t\tif (rseg.idxB !== rseg.idxA) {\n\t\t\tif (!crossedSet2[rseg.idxB]) crossedSet2[rseg.idxB] = [];\n\t\t\tcrossedSet2[rseg.idxB].push(rseg);\n\t\t}\n\t}\n\n\t// ── Conforming edge splits (T-junction elimination) ──\n\t// A self-intersection segment endpoint frequently lands ON a manifold edge\n\t// of its host, shared with a NON-crossed neighbour. bmsSplit re-triangulates\n\t// the host (splitting that edge) but not the neighbour → T-junction. Register\n\t// each such endpoint as an edge Steiner point on EVERY triangle owning that\n\t// edge; bmsSplit then splits both sides at the SAME PoolVertex → conforming.\n\tvar edgePoints = buildEdgeSteinerMap(\n\t\tsoup.length,\n\t\tfunction (t) { return soup[t]; },\n\t\tfunction (t, c) { return vKey(soup[t][c === 0 ? \"v0\" : c === 1 ? \"v1\" : \"v2\"]); },\n\t\trefined, tolerance\n\t);\n\tstats.edgeSteinerPoints = 0;\n\tstats.edgeSteinerTris = 0;\n\tfor (var ek in edgePoints) { stats.edgeSteinerTris++; stats.edgeSteinerPoints += edgePoints[ek].length; }\n\n\treturn { segments: refined, crossedSet: crossedSet2, edgePoints: edgePoints, pool: pool, stats: stats };\n}\n\n/**\n * Near-vertex snap-rounding: snap each intersection-segment endpoint that lies\n * within `snapTol` of an ORIGINAL triangle vertex exactly onto that vertex.\n *\n * The endpoint is a shared PoolVertex, so moving its coordinates snaps every\n * segment that references it at once. After the snap its vKey matches the\n * triangle corner, so bmsRetriangulate treats it as the existing corner on\n * BOTH the host and its neighbour — the ~pool-tolerance T-junction disappears.\n *\n * @param {Array<{v0,v1,v2}>} soup\n * @param {Array<{p0,p1}>} segments\n * @param {number} snapTol\n * @returns {number} count of endpoints snapped\n */\nexport function snapEndpointsToVertices(soup, segments, snapTol) {\n\tif (!(snapTol > 0) || segments.length === 0) return 0;\n\n\tvar cell = snapTol * 2;\n\tif (cell < 1e-9) cell = 1e-6;\n\tvar grid = {};\n\tfunction key(x, y, z) { return Math.floor(x / cell) + \",\" + Math.floor(y / cell) + \",\" + Math.floor(z / cell); }\n\n\tvar seenV = {};\n\tfunction addV(v) {\n\t\tvar vk = vKey(v);\n\t\tif (seenV[vk]) return;\n\t\tseenV[vk] = 1;\n\t\tvar k = key(v.x, v.y, v.z);\n\t\t(grid[k] = grid[k] || []).push(v);\n\t}\n\tfor (var i = 0; i < soup.length; i++) { addV(soup[i].v0); addV(soup[i].v1); addV(soup[i].v2); }\n\n\tvar snapTolSq = snapTol * snapTol;\n\tfunction nearest(p) {\n\t\tvar cx = Math.floor(p.x / cell), cy = Math.floor(p.y / cell), cz = Math.floor(p.z / cell);\n\t\tvar best = snapTolSq, bv = null;\n\t\tfor (var dx = -1; dx <= 1; dx++) for (var dy = -1; dy <= 1; dy++) for (var dz = -1; dz <= 1; dz++) {\n\t\t\tvar b = grid[(cx + dx) + \",\" + (cy + dy) + \",\" + (cz + dz)];\n\t\t\tif (!b) continue;\n\t\t\tfor (var q = 0; q < b.length; q++) {\n\t\t\t\tvar v = b[q], ex = v.x - p.x, ey = v.y - p.y, ez = v.z - p.z, d2 = ex * ex + ey * ey + ez * ez;\n\t\t\t\tif (d2 < best) { best = d2; bv = v; }\n\t\t\t}\n\t\t}\n\t\treturn bv;\n\t}\n\n\tvar snapped = {}, count = 0;\n\tfor (var s = 0; s < segments.length; s++) {\n\t\tvar ends = [segments[s].p0, segments[s].p1];\n\t\tfor (var e = 0; e < 2; e++) {\n\t\t\tvar V = ends[e];\n\t\t\tif (V.id !== undefined && snapped[V.id]) continue;\n\t\t\tif (V.id !== undefined) snapped[V.id] = 1;\n\t\t\tvar A = nearest(V);\n\t\t\tif (A) { V.x = A.x; V.y = A.y; V.z = A.z; count++; }\n\t\t}\n\t}\n\treturn count;\n}\n\n/**\n * Weld a TAGGED soup (mesh/origIdx carried) to shared representative vertex\n * objects within `tol`, dropping triangles that collapse. Unlike weldVertices\n * this preserves the mesh/origIdx tags AND returns a `repOf(x,y,z)` lookup so\n * callers can map segment endpoints to the same representatives (for barrier\n * detection). Reps are shared objects, so identity-based adjacency also holds.\n *\n * @param {Array<{v0,v1,v2,mesh?,origIdx?}>} soup\n * @param {number} tol\n * @param {Array<{x,y,z}>} [seedVertices] - canonical vertices pre-seeded so they\n *        WIN as representatives (snap-to-vertex: intersection points near an\n *        original vertex round onto it instead of an arbitrary neighbour).\n * @returns {{ soup: Array, repOf: function(number,number,number): (Object|null) }}\n */\nexport function weldTaggedSoup(soup, tol, seedVertices) {\n\tvar cell = tol * 2;\n\tif (cell < 1e-9) cell = 1e-6;\n\tvar grid = {};\n\tfunction key(x, y, z) { return Math.floor(x / cell) + \",\" + Math.floor(y / cell) + \",\" + Math.floor(z / cell); }\n\tvar tolSq = tol * tol;\n\n\tfunction query(x, y, z) {\n\t\tvar cx = Math.floor(x / cell), cy = Math.floor(y / cell), cz = Math.floor(z / cell);\n\t\tvar best = tolSq, bv = null;\n\t\tfor (var dx = -1; dx <= 1; dx++) for (var dy = -1; dy <= 1; dy++) for (var dz = -1; dz <= 1; dz++) {\n\t\t\tvar b = grid[(cx + dx) + \",\" + (cy + dy) + \",\" + (cz + dz)];\n\t\t\tif (!b) continue;\n\t\t\tfor (var q = 0; q < b.length; q++) {\n\t\t\t\tvar w = b[q], ex = w.x - x, ey = w.y - y, ez = w.z - z, d2 = ex * ex + ey * ey + ez * ez;\n\t\t\t\tif (d2 < best) { best = d2; bv = w; }\n\t\t\t}\n\t\t}\n\t\treturn bv;\n\t}\n\n\tfunction insert(x, y, z) {\n\t\tvar nv = { x: x, y: y, z: z };\n\t\t(grid[key(x, y, z)] = grid[key(x, y, z)] || []).push(nv);\n\t\treturn nv;\n\t}\n\n\t// Pre-seed canonical original vertices so they always win as the rep.\n\tif (seedVertices) {\n\t\tvar seen = {};\n\t\tfor (var sv = 0; sv < seedVertices.length; sv++) {\n\t\t\tvar s = seedVertices[sv];\n\t\t\tvar sk = vKey(s);\n\t\t\tif (seen[sk]) continue;\n\t\t\tseen[sk] = 1;\n\t\t\tif (!query(s.x, s.y, s.z)) insert(s.x, s.y, s.z);\n\t\t}\n\t}\n\n\tfunction rep(v) {\n\t\tvar found = query(v.x, v.y, v.z);\n\t\tif (found) return found;\n\t\treturn insert(v.x, v.y, v.z);\n\t}\n\n\tvar out = [];\n\tfor (var i = 0; i < soup.length; i++) {\n\t\tvar t = soup[i];\n\t\tvar a = rep(t.v0), b = rep(t.v1), c = rep(t.v2);\n\t\tif (a === b || b === c || c === a) continue; // collapsed\n\t\tvar nt = { v0: a, v1: b, v2: c };\n\t\tif (t.mesh !== undefined) nt.mesh = t.mesh;\n\t\tif (t.origIdx !== undefined) nt.origIdx = t.origIdx;\n\t\tout.push(nt);\n\t}\n\n\treturn { soup: out, repOf: query };\n}\n\n/**\n * EXACT coincident-sheet snapping (opt-in seam repair for the cell complex).\n *\n * At a fold seam two coplanar sub-faces are often NEAR-coincident — a hair apart,\n * within weld tolerance but not exactly equal — so they sit at nearly-equal\n * dihedral angle and the cell-complex radial fan can glue an inside half-face to\n * an outside half-face (one cell then spans inside+outside → leak). The fix is\n * upstream: snap those near-coincident face pairs to TRUE coincidence so the\n * facet-merge cancels the opposite coplanar sub-faces and the fan is unambiguous.\n *\n * Coincidence is decided with the robust orient3d predicate (coplanarity) plus a\n * vertex-match within `tol`; matched vertices are unioned and collapsed onto one\n * shared representative position, making coincident faces BIT-IDENTICAL. Only\n * vertices that participate in a coincident pair move (≤ tol), so volume is\n * essentially preserved — a zero-thickness coincident pair encloses no volume.\n *\n * @param {Array<{v0,v1,v2}>} soup\n * @param {number} tol - max gap for a coincident vertex/face match\n * @returns {{ soup: Array, snappedVertices: number, coincidentPairs: number }}\n */\nexport function snapCoincidentSheets(soup, tol) {\n\tif (soup.length === 0) return { soup: soup, snappedVertices: 0, coincidentPairs: 0 };\n\tvar avg = estimateAvgEdge(soup);\n\tvar cell = Math.max(avg * 0.5, tol * 2);\n\tif (cell < 1e-9) cell = 1e-6;\n\tvar grid = buildSpatialGrid(soup, cell);\n\n\t// Vertex ids by vKey.\n\tvar vidMap = {}, vlist = [];\n\tfunction vidOf(v) { var k = vKey(v); var i = vidMap[k]; if (i === undefined) { i = vlist.length; vidMap[k] = i; vlist.push(v); } return i; }\n\tvar faceIds = new Array(soup.length);\n\tfor (var fi = 0; fi < soup.length; fi++) faceIds[fi] = [vidOf(soup[fi].v0), vidOf(soup[fi].v1), vidOf(soup[fi].v2)];\n\n\tvar parent = new Int32Array(vlist.length);\n\tfor (var p = 0; p < vlist.length; p++) parent[p] = p;\n\tfunction find(x) { while (parent[x] !== x) { parent[x] = parent[parent[x]]; x = parent[x]; } return x; }\n\tfunction uni(a, b) { var ra = find(a), rb = find(b); if (ra !== rb) parent[ra > rb ? ra : rb] = ra > rb ? rb : ra; }\n\n\tvar tolSq = tol * tol;\n\tfunction near(a, b) { var dx = a.x - b.x, dy = a.y - b.y, dz = a.z - b.z; return dx * dx + dy * dy + dz * dz <= tolSq; }\n\n\tvar coincidentPairs = 0;\n\tfor (var i = 0; i < soup.length; i++) {\n\t\tvar A = soup[i];\n\t\tvar bbA = triBBox(A);\n\t\tvar cand = queryGrid(grid, bbA, cell);\n\t\tvar av = [A.v0, A.v1, A.v2];\n\t\t// A's twice-area (scale for the coplanarity gate)\n\t\tvar ae1x = A.v1.x - A.v0.x, ae1y = A.v1.y - A.v0.y, ae1z = A.v1.z - A.v0.z;\n\t\tvar ae2x = A.v2.x - A.v0.x, ae2y = A.v2.y - A.v0.y, ae2z = A.v2.z - A.v0.z;\n\t\tvar anx = ae1y * ae2z - ae1z * ae2y, any = ae1z * ae2x - ae1x * ae2z, anz = ae1x * ae2y - ae1y * ae2x;\n\t\tvar area2 = Math.sqrt(anx * anx + any * any + anz * anz);\n\t\tif (area2 < 1e-24) continue;\n\t\tvar planeTol = area2 * tol;\n\n\t\tfor (var c = 0; c < cand.length; c++) {\n\t\t\tvar j = cand[c];\n\t\t\tif (j <= i) continue;\n\t\t\tvar B = soup[j];\n\t\t\tvar bv = [B.v0, B.v1, B.v2];\n\t\t\t// Coplanar: each B vertex within planeTol of A's plane (robust orient3d).\n\t\t\tvar o0 = orient3d(A.v0.x, A.v0.y, A.v0.z, A.v1.x, A.v1.y, A.v1.z, A.v2.x, A.v2.y, A.v2.z, B.v0.x, B.v0.y, B.v0.z);\n\t\t\tif (Math.abs(o0) > planeTol) continue;\n\t\t\tvar o1 = orient3d(A.v0.x, A.v0.y, A.v0.z, A.v1.x, A.v1.y, A.v1.z, A.v2.x, A.v2.y, A.v2.z, B.v1.x, B.v1.y, B.v1.z);\n\t\t\tif (Math.abs(o1) > planeTol) continue;\n\t\t\tvar o2 = orient3d(A.v0.x, A.v0.y, A.v0.z, A.v1.x, A.v1.y, A.v1.z, A.v2.x, A.v2.y, A.v2.z, B.v2.x, B.v2.y, B.v2.z);\n\t\t\tif (Math.abs(o2) > planeTol) continue;\n\n\t\t\t// Vertex match (each B vertex to a distinct A vertex within tol).\n\t\t\tvar used = [false, false, false];\n\t\t\tvar pairs = [];\n\t\t\tvar ok = true;\n\t\t\tfor (var bi = 0; bi < 3; bi++) {\n\t\t\t\tvar m = -1;\n\t\t\t\tfor (var ai = 0; ai < 3; ai++) { if (!used[ai] && near(bv[bi], av[ai])) { m = ai; break; } }\n\t\t\t\tif (m < 0) { ok = false; break; }\n\t\t\t\tused[m] = true;\n\t\t\t\tpairs.push([bi, m]);\n\t\t\t}\n\t\t\tif (!ok) continue;\n\n\t\t\tcoincidentPairs++;\n\t\t\tfor (var pp = 0; pp < 3; pp++) uni(faceIds[j][pairs[pp][0]], faceIds[i][pairs[pp][1]]);\n\t\t}\n\t}\n\n\tif (coincidentPairs === 0) return { soup: soup, snappedVertices: 0, coincidentPairs: 0 };\n\n\t// Canonical position per cluster = the representative (min-id) vertex's coords.\n\tvar repPos = {};\n\tfor (var v = 0; v < vlist.length; v++) { var r = find(v); if (!repPos[r]) repPos[r] = vlist[r]; }\n\tvar snappedVertices = 0;\n\tfor (var v2 = 0; v2 < vlist.length; v2++) if (find(v2) !== v2) snappedVertices++;\n\n\tvar out = [];\n\tfor (var fj = 0; fj < soup.length; fj++) {\n\t\tvar f = faceIds[fj];\n\t\tvar a = repPos[find(f[0])], b = repPos[find(f[1])], c = repPos[find(f[2])];\n\t\tif (a === b || b === c || c === a) continue; // collapsed\n\t\tout.push({ v0: a, v1: b, v2: c });\n\t}\n\treturn { soup: out, snappedVertices: snappedVertices, coincidentPairs: coincidentPairs };\n}\n\n/**\n * Condition a nearly-conforming arrangement toward WATERTIGHT, targeting ONLY\n * the seam region so clean geometry (and volume) is untouched:\n *\n *   1. TARGETED seam snap-round — merge the genuinely-coincident duplicate\n *      vertices that sit on OPEN edges (the near-coincident fold seams that\n *      welded a hair apart), onto a shared representative. Only open-edge\n *      vertices move; interior/manifold geometry is left exactly as-is, so\n *      volume is preserved far better than a global weld.\n *   2. SEAM-LOOP HOLE-FILL — chain the residual open edges into loops and\n *      triangulate them (Newell-normal cap orientation), iterating snap↔fill to\n *      a fixpoint so scattered edges that only chain after a snap still close.\n *\n * Runs to a fixpoint or until no further progress. Additive and idempotent on a\n * watertight input (no open edges → immediate no-op).\n *\n * @param {Array<{v0,v1,v2}>} soup - welded arrangement (may have a few open edges)\n * @param {number} seamTol - max gap to merge on open-edge vertices\n * @param {number} [maxPasses=4]\n * @returns {{ soup: Array, openBefore: number, openAfter: number, capsAdded: number, snaps: number }}\n */\nexport function conditionArrangement(soup, seamTol, maxPasses) {\n\tmaxPasses = maxPasses || 4;\n\tvar openBefore = countOpenEdges(soup).openEdges;\n\tif (openBefore === 0) return { soup: soup, openBefore: 0, openAfter: 0, capsAdded: 0, snaps: 0 };\n\n\tvar cur = soup;\n\tvar totalCaps = 0, totalSnaps = 0;\n\n\tfor (var pass = 0; pass < maxPasses; pass++) {\n\t\tvar open0 = countOpenEdges(cur).openEdges;\n\t\tif (open0 === 0) break;\n\n\t\t// ── (1) Targeted seam snap — only open-edge vertices ──\n\t\tvar edgeUse = {}, vmap = {};\n\t\tfor (var i = 0; i < cur.length; i++) {\n\t\t\tvar t = cur[i];\n\t\t\tvar vs = [t.v0, t.v1, t.v2];\n\t\t\tvar ks = [vKey(t.v0), vKey(t.v1), vKey(t.v2)];\n\t\t\tfor (var e = 0; e < 3; e++) {\n\t\t\t\tvmap[ks[e]] = vs[e];\n\t\t\t\tvar ek = edgeKey(ks[e], ks[(e + 1) % 3]);\n\t\t\t\tedgeUse[ek] = (edgeUse[ek] || 0) + 1;\n\t\t\t}\n\t\t}\n\t\tvar openVertKeys = {};\n\t\tfor (var ekk in edgeUse) {\n\t\t\tif (edgeUse[ekk] === 1) { var pp = ekk.split(\"|\"); openVertKeys[pp[0]] = 1; openVertKeys[pp[1]] = 1; }\n\t\t}\n\n\t\tvar cell = seamTol * 2; if (cell < 1e-9) cell = 1e-6;\n\t\tvar grid = {};\n\t\tvar tolSq = seamTol * seamTol;\n\t\tfunction gkey(x, y, z) { return Math.floor(x / cell) + \",\" + Math.floor(y / cell) + \",\" + Math.floor(z / cell); }\n\t\tfunction repFor(v) {\n\t\t\tvar cx = Math.floor(v.x / cell), cy = Math.floor(v.y / cell), cz = Math.floor(v.z / cell);\n\t\t\tvar best = tolSq, bv = null;\n\t\t\tfor (var dx = -1; dx <= 1; dx++) for (var dy = -1; dy <= 1; dy++) for (var dz = -1; dz <= 1; dz++) {\n\t\t\t\tvar b = grid[(cx + dx) + \",\" + (cy + dy) + \",\" + (cz + dz)];\n\t\t\t\tif (!b) continue;\n\t\t\t\tfor (var q = 0; q < b.length; q++) {\n\t\t\t\t\tvar w = b[q], ex = w.x - v.x, ey = w.y - v.y, ez = w.z - v.z, dd = ex * ex + ey * ey + ez * ez;\n\t\t\t\t\tif (dd < best) { best = dd; bv = w; }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bv) return bv;\n\t\t\tvar nv = { x: v.x, y: v.y, z: v.z };\n\t\t\t(grid[gkey(v.x, v.y, v.z)] = grid[gkey(v.x, v.y, v.z)] || []).push(nv);\n\t\t\treturn nv;\n\t\t}\n\t\tvar repMap = {};\n\t\tfor (var ovk in openVertKeys) repMap[ovk] = repFor(vmap[ovk]);\n\t\tvar snapCount = 0;\n\t\tvar snapped = [];\n\t\tfor (var s = 0; s < cur.length; s++) {\n\t\t\tvar st = cur[s];\n\t\t\tvar a = repMap[vKey(st.v0)] || st.v0;\n\t\t\tvar b2 = repMap[vKey(st.v1)] || st.v1;\n\t\t\tvar c = repMap[vKey(st.v2)] || st.v2;\n\t\t\tif (a !== st.v0 || b2 !== st.v1 || c !== st.v2) snapCount++;\n\t\t\tvar ka = vKey(a), kb = vKey(b2), kc = vKey(c);\n\t\t\tif (ka === kb || kb === kc || kc === ka) continue; // collapsed\n\t\t\tsnapped.push({ v0: a, v1: b2, v2: c });\n\t\t}\n\t\ttotalSnaps += snapCount;\n\t\tcur = snapped;\n\n\t\t// ── (2) Fill whatever chains into loops now ──\n\t\tvar lr = extractBoundaryLoops(cur);\n\t\tvar caps = [];\n\t\tfor (var li = 0; li < lr.loops.length; li++) {\n\t\t\tvar lt = triangulateLoop(lr.loops[li]);\n\t\t\tfor (var lj = 0; lj < lt.length; lj++) caps.push(lt[lj]);\n\t\t}\n\t\ttotalCaps += caps.length;\n\t\tif (caps.length > 0) cur = cur.concat(caps);\n\n\t\tvar open1 = countOpenEdges(cur).openEdges;\n\t\tif (open1 >= open0 && caps.length === 0 && snapCount === 0) break; // no progress\n\t}\n\n\treturn { soup: cur, openBefore: openBefore, openAfter: countOpenEdges(cur).openEdges, capsAdded: totalCaps, snaps: totalSnaps };\n}\n\n/**\n * Build the edge-Steiner map: for each intersection-segment endpoint that lies\n * on a triangle EDGE, record it against EVERY triangle owning that edge, so all\n * sides split the edge at the same shared PoolVertex (conforming, no T-junction).\n *\n * Generic over representation: `triOf(t)` yields the host geometry (only the\n * segment hosts are dereferenced), `keyOf(t, cornerIdx)` yields the vertex\n * identity used for edge adjacency (vKey for soup, original index for indexed).\n *\n * @param {number} triCount\n * @param {function(number): {v0,v1,v2}} triOf\n * @param {function(number, number): (string|number)} keyOf\n * @param {Array<{ p0, p1, idxA, idxB }>} segments\n * @param {number} tol\n * @returns {Object.<number, Array<PoolVertex>>} triIdx -> edge pool vertices\n */\nexport function buildEdgeSteinerMap(triCount, triOf, keyOf, segments, tol) {\n\tvar tolSq = tol * tol;\n\n\t// Edge -> owning triangles (over the whole mesh)\n\tvar owners = {};\n\tfunction ekey(a, b) { return a < b ? a + \"|\" + b : b + \"|\" + a; }\n\tfor (var t = 0; t < triCount; t++) {\n\t\tvar k0 = keyOf(t, 0), k1 = keyOf(t, 1), k2 = keyOf(t, 2);\n\t\tvar es = [ekey(k0, k1), ekey(k1, k2), ekey(k2, k0)];\n\t\tfor (var e = 0; e < 3; e++) (owners[es[e]] = owners[es[e]] || []).push(t);\n\t}\n\n\tfunction onEdge(p, a, b) {\n\t\tvar abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z;\n\t\tvar l2 = abx * abx + aby * aby + abz * abz;\n\t\tif (l2 < 1e-30) return false;\n\t\tvar tt = ((p.x - a.x) * abx + (p.y - a.y) * aby + (p.z - a.z) * abz) / l2;\n\t\tif (tt <= 1e-7 || tt >= 1 - 1e-7) return false; // at/near a corner, not on-edge\n\t\tvar qx = a.x + tt * abx - p.x, qy = a.y + tt * aby - p.y, qz = a.z + tt * abz - p.z;\n\t\treturn qx * qx + qy * qy + qz * qz <= tolSq;\n\t}\n\n\tvar edgePoints = {};\n\tfunction add(k, V) {\n\t\tvar lst = edgePoints[k] || (edgePoints[k] = []);\n\t\tfor (var i = 0; i < lst.length; i++) if (lst[i] === V) return;\n\t\tlst.push(V);\n\t}\n\n\tfor (var s = 0; s < segments.length; s++) {\n\t\tvar seg = segments[s];\n\t\tvar hosts = [seg.idxA, seg.idxB];\n\t\tvar ends = [seg.p0, seg.p1];\n\t\tfor (var h = 0; h < 2; h++) {\n\t\t\tvar ht = hosts[h];\n\t\t\tvar tri = triOf(ht);\n\t\t\tvar corners = [tri.v0, tri.v1, tri.v2];\n\t\t\tvar ckeys = [keyOf(ht, 0), keyOf(ht, 1), keyOf(ht, 2)];\n\t\t\tfor (var en = 0; en < 2; en++) {\n\t\t\t\tvar V = ends[en];\n\t\t\t\tfor (var c = 0; c < 3; c++) {\n\t\t\t\t\tif (onEdge(V, corners[c], corners[(c + 1) % 3])) {\n\t\t\t\t\t\tvar own = owners[ekey(ckeys[c], ckeys[(c + 1) % 3])];\n\t\t\t\t\t\tif (own) for (var o = 0; o < own.length; o++) add(own[o], V);\n\t\t\t\t\t\tbreak; // an endpoint lies on at most one edge of a given host\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn edgePoints;\n}\n\n/**\n * Per-triangle segment arrangement: when 3+ sheets pass through one\n * triangle, constraint segments from DIFFERENT pairs can cross or\n * T-touch inside it — Constrainautor cannot constrain crossing edges,\n * which would break conformance. Split every segment at\n *   (a) other segments' endpoints lying in its interior, and\n *   (b) proper pairwise crossings (new shared pool vertex),\n * iterating to a fixpoint. Segments are shared objects between their two\n * host triangles, so a split made for one triangle conforms in both.\n *\n * @returns {Array} Refined segment list\n */\nfunction refineSelfSegments(segments, soup, pool, tolerance, stats) {\n\tif (segments.length < 2) return segments;\n\n\tvar tol = tolerance;\n\tvar tolSq = tol * tol;\n\tvar current = segments;\n\n\tfor (var pass = 0; pass < 8; pass++) {\n\t\t// Group segment indices per host triangle\n\t\tvar triSegs = {};\n\t\tfor (var s = 0; s < current.length; s++) {\n\t\t\tvar seg = current[s];\n\t\t\tif (!triSegs[seg.idxA]) triSegs[seg.idxA] = [];\n\t\t\ttriSegs[seg.idxA].push(s);\n\t\t\tif (seg.idxB !== seg.idxA) {\n\t\t\t\tif (!triSegs[seg.idxB]) triSegs[seg.idxB] = [];\n\t\t\t\ttriSegs[seg.idxB].push(s);\n\t\t\t}\n\t\t}\n\n\t\t// splitPoints[segIdx] = [PoolVertex, ...]\n\t\tvar splitPoints = {};\n\t\tvar anySplit = false;\n\n\t\tfunction paramOnSeg(seg, q) {\n\t\t\tvar dx = seg.p1.x - seg.p0.x, dy = seg.p1.y - seg.p0.y, dz = seg.p1.z - seg.p0.z;\n\t\t\tvar len2 = dx * dx + dy * dy + dz * dz;\n\t\t\tif (len2 < 1e-30) return null;\n\t\t\tvar t = ((q.x - seg.p0.x) * dx + (q.y - seg.p0.y) * dy + (q.z - seg.p0.z) * dz) / len2;\n\t\t\tif (t <= 1e-9 || t >= 1 - 1e-9) return null;\n\t\t\t// perpendicular distance\n\t\t\tvar px = seg.p0.x + t * dx - q.x;\n\t\t\tvar py = seg.p0.y + t * dy - q.y;\n\t\t\tvar pz = seg.p0.z + t * dz - q.z;\n\t\t\tif (px * px + py * py + pz * pz > tolSq) return null;\n\t\t\treturn t;\n\t\t}\n\n\t\tfunction addSplit(si, pv) {\n\t\t\tif (!splitPoints[si]) splitPoints[si] = [];\n\t\t\tvar list = splitPoints[si];\n\t\t\tfor (var li = 0; li < list.length; li++) {\n\t\t\t\tif (list[li] === pv) return;\n\t\t\t}\n\t\t\tlist.push(pv);\n\t\t\tanySplit = true;\n\t\t}\n\n\t\tfor (var tk in triSegs) {\n\t\t\tvar list = triSegs[tk];\n\t\t\tif (list.length < 2) continue;\n\n\t\t\t// Local 2D frame on the host triangle for crossing tests\n\t\t\tvar hostTri = soup[tk];\n\t\t\tvar e1x = hostTri.v1.x - hostTri.v0.x, e1y = hostTri.v1.y - hostTri.v0.y, e1z = hostTri.v1.z - hostTri.v0.z;\n\t\t\tvar e2x = hostTri.v2.x - hostTri.v0.x, e2y = hostTri.v2.y - hostTri.v0.y, e2z = hostTri.v2.z - hostTri.v0.z;\n\t\t\tvar nx = e1y * e2z - e1z * e2y, ny = e1z * e2x - e1x * e2z, nz = e1x * e2y - e1y * e2x;\n\t\t\tvar nLen = Math.sqrt(nx * nx + ny * ny + nz * nz);\n\t\t\tif (nLen < 1e-30) continue;\n\t\t\tvar anx = Math.abs(nx), any = Math.abs(ny), anz = Math.abs(nz);\n\t\t\tvar getU, getV;\n\t\t\tif (anz >= anx && anz >= any) { getU = function (p) { return p.x; }; getV = function (p) { return p.y; }; }\n\t\t\telse if (any >= anx) { getU = function (p) { return p.x; }; getV = function (p) { return p.z; }; }\n\t\t\telse { getU = function (p) { return p.y; }; getV = function (p) { return p.z; }; }\n\n\t\t\tfor (var a = 0; a < list.length; a++) {\n\t\t\t\tvar sa = current[list[a]];\n\t\t\t\tfor (var b = a + 1; b < list.length; b++) {\n\t\t\t\t\tvar sb = current[list[b]];\n\t\t\t\t\tif (sa === sb) continue;\n\n\t\t\t\t\t// (a) T-points: endpoint of one interior to the other\n\t\t\t\t\tvar t0 = (sb.p0 !== sa.p0 && sb.p0 !== sa.p1) ? paramOnSeg(sa, sb.p0) : null;\n\t\t\t\t\tif (t0 !== null) addSplit(list[a], sb.p0);\n\t\t\t\t\tvar t1 = (sb.p1 !== sa.p0 && sb.p1 !== sa.p1) ? paramOnSeg(sa, sb.p1) : null;\n\t\t\t\t\tif (t1 !== null) addSplit(list[a], sb.p1);\n\t\t\t\t\tvar t2 = (sa.p0 !== sb.p0 && sa.p0 !== sb.p1) ? paramOnSeg(sb, sa.p0) : null;\n\t\t\t\t\tif (t2 !== null) addSplit(list[b], sa.p0);\n\t\t\t\t\tvar t3 = (sa.p1 !== sb.p0 && sa.p1 !== sb.p1) ? paramOnSeg(sb, sa.p1) : null;\n\t\t\t\t\tif (t3 !== null) addSplit(list[b], sa.p1);\n\n\t\t\t\t\t// (b) proper crossing (no shared endpoints)\n\t\t\t\t\tif (sa.p0 === sb.p0 || sa.p0 === sb.p1 || sa.p1 === sb.p0 || sa.p1 === sb.p1) continue;\n\n\t\t\t\t\tvar a0u = getU(sa.p0), a0v = getV(sa.p0);\n\t\t\t\t\tvar a1u = getU(sa.p1), a1v = getV(sa.p1);\n\t\t\t\t\tvar b0u = getU(sb.p0), b0v = getV(sb.p0);\n\t\t\t\t\tvar b1u = getU(sb.p1), b1v = getV(sb.p1);\n\n\t\t\t\t\tvar d1 = (a1u - a0u) * (b0v - a0v) - (a1v - a0v) * (b0u - a0u);\n\t\t\t\t\tvar d2 = (a1u - a0u) * (b1v - a0v) - (a1v - a0v) * (b1u - a0u);\n\t\t\t\t\tvar d3 = (b1u - b0u) * (a0v - b0v) - (b1v - b0v) * (a0u - b0u);\n\t\t\t\t\tvar d4 = (b1u - b0u) * (a1v - b0v) - (b1v - b0v) * (a1u - b0u);\n\n\t\t\t\t\tif (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) &&\n\t\t\t\t\t\t((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))) {\n\t\t\t\t\t\tvar tc = d1 / (d1 - d2); // param along sb? No — along sb from b0: d1,d2 are b endpoints vs line a\n\t\t\t\t\t\t// d1/(d1-d2) is the crossing parameter along segment B\n\t\t\t\t\t\tvar qx = sb.p0.x + tc * (sb.p1.x - sb.p0.x);\n\t\t\t\t\t\tvar qy = sb.p0.y + tc * (sb.p1.y - sb.p0.y);\n\t\t\t\t\t\tvar qz = sb.p0.z + tc * (sb.p1.z - sb.p0.z);\n\t\t\t\t\t\tvar pvc = pool.getOrCreate(qx, qy, qz,\n\t\t\t\t\t\t\t{ mesh: \"A\", triIdx: sa.idxA });\n\t\t\t\t\t\tpool.getOrCreate(qx, qy, qz, { mesh: \"A\", triIdx: sa.idxB });\n\t\t\t\t\t\tpool.getOrCreate(qx, qy, qz, { mesh: \"A\", triIdx: sb.idxA });\n\t\t\t\t\t\tpool.getOrCreate(qx, qy, qz, { mesh: \"A\", triIdx: sb.idxB });\n\t\t\t\t\t\t// Guard: pool may snap to an existing endpoint\n\t\t\t\t\t\tif (pvc !== sa.p0 && pvc !== sa.p1) addSplit(list[a], pvc);\n\t\t\t\t\t\tif (pvc !== sb.p0 && pvc !== sb.p1) addSplit(list[b], pvc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!anySplit) break;\n\n\t\t// Apply the splits: replace each split segment by its param-ordered chain\n\t\tvar next = [];\n\t\tfor (var s2 = 0; s2 < current.length; s2++) {\n\t\t\tvar seg2 = current[s2];\n\t\t\tvar pts = splitPoints[s2];\n\t\t\tif (!pts || pts.length === 0) { next.push(seg2); continue; }\n\n\t\t\tstats.refinementSplits += pts.length;\n\n\t\t\tvar dx2 = seg2.p1.x - seg2.p0.x, dy2 = seg2.p1.y - seg2.p0.y, dz2 = seg2.p1.z - seg2.p0.z;\n\t\t\tvar len22 = dx2 * dx2 + dy2 * dy2 + dz2 * dz2;\n\t\t\tvar withT = [];\n\t\t\tfor (var pp = 0; pp < pts.length; pp++) {\n\t\t\t\tvar q2 = pts[pp];\n\t\t\t\tvar tq = ((q2.x - seg2.p0.x) * dx2 + (q2.y - seg2.p0.y) * dy2 + (q2.z - seg2.p0.z) * dz2) / len22;\n\t\t\t\twithT.push({ t: tq, pv: q2 });\n\t\t\t}\n\t\t\twithT.sort(function (u, w) { return u.t - w.t; });\n\n\t\t\tvar chainPrev = seg2.p0;\n\t\t\tfor (var w2 = 0; w2 < withT.length; w2++) {\n\t\t\t\tvar pvW = withT[w2].pv;\n\t\t\t\tif (pvW === chainPrev) continue;\n\t\t\t\tnext.push({ p0: chainPrev, p1: pvW, idxA: seg2.idxA, idxB: seg2.idxB });\n\t\t\t\tchainPrev = pvW;\n\t\t\t}\n\t\t\tif (chainPrev !== seg2.p1) {\n\t\t\t\tnext.push({ p0: chainPrev, p1: seg2.p1, idxA: seg2.idxA, idxB: seg2.idxB });\n\t\t\t}\n\t\t}\n\n\t\tcurrent = next;\n\t}\n\n\treturn current;\n}\n\n/**\n * Full self-arrangement: intersect + split into a conforming mega soup.\n *\n * Translates to a local origin internally (UTM/mine coordinates destroy\n * float precision) and translates the result back, unless\n * options.noTranslate is set (used by bmsSelfResolve, which keeps\n * everything local until the very end).\n *\n * @param {Array<{ v0, v1, v2 }>} soup\n * @param {Object} [options] - See bmsSelfIntersect, plus:\n * @param {boolean} [options.noTranslate] - Input is already near origin;\n *        skip the translate/untranslate and keep pool identity intact.\n * @returns {{\n *   megaSoup: Array<{ v0, v1, v2, mesh: \"A\", origIdx: number }>,\n *   segments: Array, crossedSet: Object, pool: Object, stats: Object\n * }}\n */\nexport function bmsSelfArrange(soup, options) {\n\tvar opts = options || {};\n\n\tvar cx = 0, cy = 0, cz = 0;\n\tvar local = soup;\n\tif (!opts.noTranslate) {\n\t\tvar centroid = soupCentroid(soup, []);\n\t\tcx = centroid.x; cy = centroid.y; cz = centroid.z;\n\t\tlocal = translateSoup(soup, -cx, -cy, -cz);\n\t}\n\n\tvar isect = bmsSelfIntersect(local, opts);\n\n\tvar megaSoup = bmsSplit(local, [], {\n\t\tsegments: isect.segments,\n\t\tcrossedSetA: isect.crossedSet,\n\t\tcrossedSetB: {},\n\t\tedgePointsA: isect.edgePoints,\n\t\tpool: isect.pool\n\t});\n\n\tif (!opts.noTranslate && (cx !== 0 || cy !== 0 || cz !== 0)) {\n\t\t// NOTE: translating back copies vertices — pool identity survives\n\t\t// only in the local frame. Callers needing identity (bmsSelfResolve)\n\t\t// pass noTranslate and handle the offset themselves.\n\t\tvar translated = new Array(megaSoup.length);\n\t\tfor (var i = 0; i < megaSoup.length; i++) {\n\t\t\tvar t = megaSoup[i];\n\t\t\ttranslated[i] = {\n\t\t\t\tv0: { x: t.v0.x + cx, y: t.v0.y + cy, z: t.v0.z + cz },\n\t\t\t\tv1: { x: t.v1.x + cx, y: t.v1.y + cy, z: t.v1.z + cz },\n\t\t\t\tv2: { x: t.v2.x + cx, y: t.v2.y + cy, z: t.v2.z + cz },\n\t\t\t\tmesh: t.mesh,\n\t\t\t\torigIdx: t.origIdx\n\t\t\t};\n\t\t}\n\t\tmegaSoup = translated;\n\t}\n\n\treturn {\n\t\tmegaSoup: megaSoup,\n\t\tsegments: isect.segments,\n\t\tcrossedSet: isect.crossedSet,\n\t\tedgePoints: isect.edgePoints,\n\t\tpool: isect.pool,\n\t\tstats: isect.stats\n\t};\n}\n\n/**\n * One-call exact fold resolver (soup in, soup out):\n * self-arrange → winding-number extraction → coincident dedup → orient.\n *\n * @param {Array<{ v0, v1, v2 }>} soup - Closed (or nearly closed) triangle soup\n * @param {Object} [options] - bmsSelfIntersect options, plus:\n * @param {\"keep\"|\"classify\"} [options.farField=\"keep\"] - Triangles not\n *        touched by any self-intersection: \"keep\" passes them through\n *        with their input orientation (folds are local — the 47k-tri\n *        target case); \"classify\" runs the winding test on every\n *        sub-triangle (exact, O(N x M)).\n * @param {number} [options.threshold=0.5] - Winding inside/outside cut\n * @param {boolean} [options.orient=true] - Run orientSolid on the result\n * @param {boolean} [options.preOrient=true] - Coherence-orient the winding\n *        REFERENCE soup (orientSolid step 1) before the generalized-winding\n *        queries. Self-intersection input is non-orientable by definition,\n *        so its raw per-triangle winding is inconsistent near the folds and\n *        the winding-number STEP mis-classifies there (tears holes). The\n *        coherence flood-fill makes the winding field consistent per manifold\n *        patch. Default ON; set false to reproduce the raw failure.\n * @returns {{\n *   soup: Array, changed: boolean,\n *   diagnostics: {\n *     inputTris, segments, coplanarPairs, crossingPairs, refinementSplits,\n *     crossedTris, subTris, classified, kept, dropped, flipped,\n *     duplicateGroups, duplicatesRemoved, dedupClusters,\n *     preOrient, preOrientFlips, preOrientSeamViolations,\n *     orient: Object|null\n *   }\n * }}\n */\nexport function bmsSelfResolve(soup, options) {\n\tvar opts = options || {};\n\tvar farField = opts.farField || \"keep\";\n\tvar preOrient = opts.preOrient !== false; // default ON\n\n\t// Local origin for the whole pipeline (UTM precision)\n\tvar centroid = soupCentroid(soup, []);\n\tvar cx = centroid.x, cy = centroid.y, cz = centroid.z;\n\tvar local = translateSoup(soup, -cx, -cy, -cz);\n\n\tvar arr = bmsSelfArrange(local, Object.assign({}, opts, { noTranslate: true }));\n\n\tvar diagnostics = {\n\t\tinputTris: soup.length,\n\t\tsegments: arr.segments.length,\n\t\tcoplanarPairs: arr.stats.coplanarPairs,\n\t\tcrossingPairs: arr.stats.crossingPairs,\n\t\trefinementSplits: arr.stats.refinementSplits,\n\t\tcrossedTris: Object.keys(arr.crossedSet).length,\n\t\tsubTris: arr.megaSoup.length,\n\t\tclassified: 0, kept: 0, dropped: 0, flipped: 0,\n\t\tduplicateGroups: 0, duplicatesRemoved: 0, dedupClusters: 0,\n\t\tpreOrient: preOrient, preOrientFlips: 0, preOrientSeamViolations: 0,\n\t\torient: null\n\t};\n\n\tif (arr.segments.length === 0) {\n\t\t// Nothing to resolve\n\t\treturn { soup: soup, changed: false, diagnostics: diagnostics };\n\t}\n\n\t// Orient the winding REFERENCE (not the geometry being cut) so the\n\t// generalized-winding field is consistent AND correctly signed across the\n\t// non-orientable fold region — the fix for the \"tears holes on\n\t// non-orientable input\" case. Full orientSolid (coherence flood-fill +\n\t// per-component outward signed-volume direction) is required: coherence\n\t// alone leaves the global sign arbitrary (a BFS seed that happens to face\n\t// inward would negate the whole winding field and invert the classify).\n\tvar refSoup = local;\n\tif (preOrient) {\n\t\tvar co = orientSolid(local);\n\t\trefSoup = co.soup;\n\t\tdiagnostics.preOrientFlips = co.diagnostics.flippedForCoherence;\n\t\tdiagnostics.preOrientSeamViolations = co.diagnostics.windingViolationsAfter;\n\t}\n\tvar windingFn = function (px, py, pz) { return windingNumber({ x: px, y: py, z: pz }, refSoup); };\n\n\t// ── Conform the arrangement: near-vertex snap-round + seam weld ──\n\t// Seed the ORIGINAL vertices so intersection points round onto them\n\t// (snap-to-vertex), closing the ~pool-tolerance T-junctions the edge-Steiner\n\t// pass can't reach.\n\tvar weldTol = opts.weldTolerance !== undefined ? opts.weldTolerance : estimateAvgEdge(local) * 0.012;\n\tvar seedVerts = [];\n\tfor (var sv = 0; sv < local.length; sv++) { seedVerts.push(local[sv].v0, local[sv].v1, local[sv].v2); }\n\tvar welded = weldTaggedSoup(arr.megaSoup, weldTol, seedVerts);\n\tdiagnostics.arrangementOpenEdges = countOpenEdges(welded.soup).openEdges;\n\n\t// Barrier edges = intersection segments (mapped through the weld reps).\n\tvar barrierKeys = {};\n\tfor (var bs = 0; bs < arr.segments.length; bs++) {\n\t\tvar seg = arr.segments[bs];\n\t\tvar r0 = welded.repOf(seg.p0.x, seg.p0.y, seg.p0.z);\n\t\tvar r1 = welded.repOf(seg.p1.x, seg.p1.y, seg.p1.z);\n\t\tif (r0 && r1 && r0 !== r1) barrierKeys[edgeKey(vKey(r0), vKey(r1))] = true;\n\t}\n\n\t// ── Classification ──\n\t// PRIMARY: 3-D cell-complex winding propagation (Zhou 2016) — manifold by\n\t// construction, dissolves non-orientable seams. It needs a WATERTIGHT\n\t// arrangement; where a residual hole leaks inside↔outside (a cell spanning\n\t// both), it is detected and we FALL BACK to the region-consistent patch\n\t// classifier, which preserves volume through such holes. `classifier`\n\t// reports which path produced the result.\n\tdiagnostics.classified = welded.soup.length;\n\tvar ext = null;\n\tvar usedCellComplex = false;\n\tvar leakLimit = opts.leakTolerance !== undefined ? opts.leakTolerance : 0.02;\n\tvar threshold = opts.threshold !== undefined ? opts.threshold : 1;\n\tif (opts.classifier !== \"patch\") {\n\t\t// Attempt 1: cell complex on the welded arrangement as-is.\n\t\tvar cellRes = extractByCellComplex(welded.soup, windingFn, { threshold: threshold, offsetSamples: opts.samplesPerPatch });\n\t\tdiagnostics.cellComplex = cellRes.diagnostics;\n\n\t\t// Attempt 2: if it leaks (residual seam hole), CONDITION the arrangement\n\t\t// toward watertight (targeted seam snap-round + seam-loop hole-fill) and\n\t\t// retry. This is the added arrangement-fill stage; it only touches the\n\t\t// seam region, so the 15 already-watertight meshes are untouched (no open\n\t\t// edges → no-op) and volume is preserved.\n\t\tif (opts.classifier !== \"cell\" && cellRes.diagnostics.leakedFaceFraction > leakLimit && diagnostics.arrangementOpenEdges > 0) {\n\t\t\tvar seamTol = opts.seamTolerance !== undefined ? opts.seamTolerance : estimateAvgEdge(local) * 0.1;\n\t\t\tvar condInput = welded.soup;\n\n\t\t\t// Opt-in: EXACT coincident-sheet snap first (near-coincident coplanar\n\t\t\t// seam faces → true coincidence so facet-merge cancels them). Default\n\t\t\t// off ⇒ 0.6.0 path is byte-unchanged; enable for the degenerate meshes.\n\t\t\tif (opts.exactSeamSnap) {\n\t\t\t\tvar snapTolE = opts.exactSeamTolerance !== undefined ? opts.exactSeamTolerance : seamTol;\n\t\t\t\tvar snapRes = snapCoincidentSheets(welded.soup, snapTolE);\n\t\t\t\tdiagnostics.exactSeamSnap = { coincidentPairs: snapRes.coincidentPairs, snappedVertices: snapRes.snappedVertices };\n\t\t\t\tcondInput = snapRes.soup;\n\t\t\t}\n\n\t\t\tvar cond = conditionArrangement(condInput, seamTol);\n\t\t\tdiagnostics.seamOpenBefore = cond.openBefore;\n\t\t\tdiagnostics.seamOpenAfter = cond.openAfter;\n\t\t\tdiagnostics.seamCapsAdded = cond.capsAdded;\n\t\t\tvar cellRes2 = extractByCellComplex(cond.soup, windingFn, { threshold: threshold, offsetSamples: opts.samplesPerPatch });\n\t\t\tdiagnostics.cellComplexConditioned = cellRes2.diagnostics;\n\t\t\tif (cellRes2.diagnostics.leakedFaceFraction < cellRes.diagnostics.leakedFaceFraction) {\n\t\t\t\tcellRes = cellRes2; // conditioning / exact-snap helped\n\t\t\t\tdiagnostics.cellComplex = cellRes2.diagnostics;\n\t\t\t}\n\t\t\t// NOTE: the patch fallback deliberately stays on the ORIGINAL welded\n\t\t\t// arrangement + barrierKeys (proven volume-safe), so a leak that the\n\t\t\t// exact-snap could not close never regresses the shipped patch result.\n\t\t}\n\n\t\tif (opts.classifier === \"cell\" || cellRes.diagnostics.leakedFaceFraction <= leakLimit) {\n\t\t\text = { kept: cellRes.kept };\n\t\t\tusedCellComplex = true;\n\t\t}\n\t}\n\tif (!usedCellComplex) {\n\t\t// Volume-safe fallback: patch classifier on the ORIGINAL welded arrangement\n\t\t// (unconditioned), so a genuinely-degenerate seam that could not close never\n\t\t// regresses the shipped patch result.\n\t\tvar patchOpts = { threshold: opts.threshold, offsetFactor: opts.offsetFactor, samplesPerPatch: opts.samplesPerPatch };\n\t\tvar pext = extractByWindingPatches(welded.soup, barrierKeys, windingFn, patchOpts);\n\t\text = { kept: pext.kept };\n\t\tdiagnostics.patches = pext.patches;\n\t\tdiagnostics.keptPatches = pext.keptPatches;\n\t\tdiagnostics.droppedPatches = pext.droppedPatches;\n\t}\n\tdiagnostics.classifier = usedCellComplex ? \"cell-complex\" : \"patch\";\n\tdiagnostics.dropped = welded.soup.length - ext.kept.length;\n\n\t// Drop exact coincident duplicates (both sheets of a boundary double get kept\n\t// and oriented outward → identical → keep one). Non-destructive (no re-CDT).\n\tvar combined = exactCoincidentDedup(ext.kept);\n\tdiagnostics.duplicatesRemoved = ext.kept.length - combined.length;\n\tdiagnostics.kept = combined.length;\n\n\t// Coherent outward orientation — possible now that the folds are resolved.\n\tvar finalLocal = combined;\n\tif (opts.orient !== false) {\n\t\tvar orientRes = orientSolid(combined);\n\t\tfinalLocal = orientRes.soup;\n\t\tdiagnostics.orient = orientRes.diagnostics;\n\t}\n\t// Final seam weld (snap-to-vertex) to settle the kept boundary.\n\tfinalLocal = weldTaggedSoup(finalLocal, weldTol, seedVerts).soup;\n\n\tvar out = translateSoup(finalLocal, cx, cy, cz);\n\treturn { soup: out, changed: true, diagnostics: diagnostics };\n}\n\n/**\n * Remove EXACT coincident duplicate triangles (same three vertices by vKey,\n * any winding) — keeps one. Non-destructive: no re-triangulation, so it never\n * opens the mesh (unlike the cluster re-CDT dedup).\n * @param {Array} soup\n * @returns {Array}\n */\nfunction exactCoincidentDedup(soup) {\n\tvar seen = {};\n\tvar out = [];\n\tfor (var i = 0; i < soup.length; i++) {\n\t\tvar t = soup[i];\n\t\tvar ks = [vKey(t.v0), vKey(t.v1), vKey(t.v2)].sort();\n\t\tvar k = ks[0] + \"#\" + ks[1] + \"#\" + ks[2];\n\t\tif (seen[k]) continue;\n\t\tseen[k] = 1;\n\t\tout.push(t);\n\t}\n\treturn out;\n}\n","/**\n * @module bms/bmsSelfResolveIndexed\n *\n * INDEXED entry point for the exact fold resolver.\n *\n * In/out format mirrors indexGroupsToTypedArrays (v0.5.12):\n * `{ positions: Float64Array (world coords, xyz triplets), index: Uint32Array }`.\n *\n * It hydrates the indexed mesh to a soup and delegates to {@link bmsSelfResolve},\n * which runs the full pipeline: conforming self-arrangement (edge-Steiner\n * splits + near-vertex snap-round + seam weld) → region-consistent PATCH winding\n * classification → coincident dedup → outward orientation. The result is\n * re-indexed through a quantised vertex pool.\n *\n * NOTE: the earlier narrow-band variant (band-only split, far pass-through by\n * index) is superseded — the region-consistent patch classifier needs the whole\n * arrangement's barrier graph to avoid tearing, so it runs over the full soup.\n * For multi-million-triangle inputs, restoring a band-scoped patch classifier\n * (barrier graph confined to the dilated band, far field force-kept) is the\n * follow-up; correctness on the real 47k slice-solid comes first.\n */\n\nimport { bmsSelfResolve } from \"./bmsSelfArrange.js\";\n\n/**\n * Resolve self-intersections (folds) of an indexed triangle mesh.\n *\n * @param {{ positions: Float64Array|number[], index: Uint32Array|number[] }} mesh\n *        World-coordinate positions (xyz triplets) + triangle index triples.\n * @param {Object} [options] - Forwarded to bmsSelfResolve (tolerance,\n *        minAreaRatio, threshold, weldTolerance, preOrient, orient, ...).\n * @returns {{\n *   positions: Float64Array, index: Uint32Array, changed: boolean,\n *   diagnostics: Object\n * }}\n */\nexport function bmsSelfResolveIndexed(mesh, options) {\n\tvar opts = options || {};\n\tvar positions = mesh.positions;\n\tvar index = mesh.index;\n\tvar triCount = (index.length / 3) | 0;\n\n\tif (triCount === 0) {\n\t\treturn { positions: positions, index: index, changed: false, diagnostics: { inputTris: 0, outputTris: 0 } };\n\t}\n\n\t// Hydrate indexed → soup (bmsSelfResolve translates to a local origin itself).\n\tvar soup = new Array(triCount);\n\tfor (var t = 0; t < triCount; t++) {\n\t\tvar a = index[t * 3] * 3, b = index[t * 3 + 1] * 3, c = index[t * 3 + 2] * 3;\n\t\tsoup[t] = {\n\t\t\tv0: { x: positions[a], y: positions[a + 1], z: positions[a + 2] },\n\t\t\tv1: { x: positions[b], y: positions[b + 1], z: positions[b + 2] },\n\t\t\tv2: { x: positions[c], y: positions[c + 1], z: positions[c + 2] }\n\t\t};\n\t}\n\n\tvar res = bmsSelfResolve(soup, opts);\n\tvar diag = res.diagnostics || {};\n\tdiag.inputTris = triCount;\n\n\tif (!res.changed) {\n\t\tdiag.outputTris = triCount;\n\t\treturn { positions: positions, index: index, changed: false, diagnostics: diag };\n\t}\n\n\tvar reidx = indexResultSoup(res.soup, opts.tolerance !== undefined ? opts.tolerance : 1e-4);\n\tdiag.outputTris = (reidx.index.length / 3) | 0;\n\tdiag.newVertices = (reidx.positions.length / 3) | 0;\n\n\treturn { positions: reidx.positions, index: reidx.index, changed: true, diagnostics: diag };\n}\n\n/**\n * Re-index a soup through a quantised (weld) vertex pool. Vertices within the\n * quantisation cell collapse to one index; degenerate triangles are dropped.\n * @param {Array<{v0,v1,v2}>} soup\n * @param {number} tol\n * @returns {{ positions: Float64Array, index: Uint32Array }}\n */\nfunction indexResultSoup(soup, tol) {\n\tvar inv = 1 / (tol > 0 ? tol : 1e-4);\n\tvar map = new Map();\n\tvar pts = [];\n\tvar tris = [];\n\tfunction id(v) {\n\t\tvar k = Math.round(v.x * inv) + \",\" + Math.round(v.y * inv) + \",\" + Math.round(v.z * inv);\n\t\tvar i = map.get(k);\n\t\tif (i === undefined) { i = pts.length; pts.push(v); map.set(k, i); }\n\t\treturn i;\n\t}\n\tfor (var t = 0; t < soup.length; t++) {\n\t\tvar a = id(soup[t].v0), b = id(soup[t].v1), c = id(soup[t].v2);\n\t\tif (a === b || b === c || c === a) continue;\n\t\ttris.push(a, b, c);\n\t}\n\tvar positions = new Float64Array(pts.length * 3);\n\tfor (var p = 0; p < pts.length; p++) {\n\t\tpositions[p * 3] = pts[p].x;\n\t\tpositions[p * 3 + 1] = pts[p].y;\n\t\tpositions[p * 3 + 2] = pts[p].z;\n\t}\n\treturn { positions: positions, index: new Uint32Array(tris) };\n}\n","/**\n * @module util/indexedComponents\n *\n * Connected-component decomposition of ALREADY-INDEXED triangle groups — the indexed\n * twin of {@link module:boolean/booleanOp.splitToComponents}, without soup or toFixed\n * string keys.\n *\n * A boolean split's four groups (aInside/aOutside/bInside/bOutside) each break into one\n * or more connected pieces. The soup version flood-fills a mega-soup keyed by vertex\n * coordinate strings — heavy allocations that OOM at millions of triangles. Here the\n * triangles already reference a shared vertex pool by INTEGER index (as produced by\n * {@link module:util/indexGroups.indexGroups} or `bmsBooleanOp({ indexed: true })`), so\n * components are a plain union-find over those indices: O(N·α(N)), no soup, no strings.\n *\n * NOTE: connectivity here is shared-VERTEX (two triangles sharing any pool vertex are in\n * the same component), which is the natural relation on an indexed mesh. On a clean,\n * seam-welded boolean result this agrees with the soup path's shared-EDGE relation; on\n * meshes with genuine vertex-only touches it is (deliberately) coarser. For an exact\n * edge-based equivalent on soup, use `findConnectedComponentsPooled`.\n *\n * Pure — no globals, no THREE, no deps.\n */\n\n/**\n * Union-find (disjoint set) over vertex indices, grouping triangles that share any\n * vertex into connected components.\n *\n * @param {Array<Array<number>>} tris - triangles as [i,j,k] index triples into a shared pool\n * @returns {Array<Array<Array<number>>>} array of components, each an array of its triangles\n */\nexport function connectedComponentsIndexed(tris) {\n\tvar parent = new Map();\n\n\tfunction find(x) {\n\t\tif (!parent.has(x)) { parent.set(x, x); return x; }\n\t\tvar root = x;\n\t\twhile (parent.get(root) !== root) root = parent.get(root);\n\t\t// path compression\n\t\twhile (parent.get(x) !== root) { var next = parent.get(x); parent.set(x, root); x = next; }\n\t\treturn root;\n\t}\n\tfunction union(a, b) {\n\t\tvar ra = find(a), rb = find(b);\n\t\tif (ra !== rb) parent.set(ra, rb);\n\t}\n\n\tfor (var t = 0; t < tris.length; t++) {\n\t\tvar tr = tris[t];\n\t\tfind(tr[0]); // ensure present\n\t\tunion(tr[0], tr[1]);\n\t\tunion(tr[1], tr[2]);\n\t}\n\n\t// Bucket triangles by their component root, preserving first-seen order.\n\tvar byRoot = new Map();\n\tvar order = [];\n\tfor (var t2 = 0; t2 < tris.length; t2++) {\n\t\tvar root = find(tris[t2][0]);\n\t\tvar arr = byRoot.get(root);\n\t\tif (!arr) { arr = []; byRoot.set(root, arr); order.push(root); }\n\t\tarr.push(tris[t2]);\n\t}\n\tvar out = [];\n\tfor (var i = 0; i < order.length; i++) out.push(byRoot.get(order[i]));\n\treturn out;\n}\n\nvar GROUP_META = [\n\t{ key: \"aInside\", mesh: \"A\", side: \"inside\" },\n\t{ key: \"aOutside\", mesh: \"A\", side: \"outside\" },\n\t{ key: \"bInside\", mesh: \"B\", side: \"inside\" },\n\t{ key: \"bOutside\", mesh: \"B\", side: \"outside\" }\n];\n\n/**\n * Decompose the four indexed groups into connected components, mirroring the shape of\n * `splitToComponents` so the same consumer code works unchanged — but each component\n * carries INDEXED triangles ([i,j,k] into the shared `points`), not soup.\n *\n * @param {{ points: Array, groups: { aInside, aOutside, bInside, bOutside } }} indexed\n *        as returned by `indexGroups` or `bmsBooleanOp(..., { indexed: true }).indexed`\n * @param {number} [smallThreshold=0] - components with fewer triangles than this are\n *        merged into the largest component of their group (matches mergeSmallComponents)\n * @returns {Array<{ mesh, side, group, index, points, triangles, triCount }>}\n */\nexport function decomposeIndexedGroups(indexed, smallThreshold) {\n\tvar points = indexed.points;\n\tvar out = [];\n\tfor (var g = 0; g < GROUP_META.length; g++) {\n\t\tvar meta = GROUP_META[g];\n\t\tvar tris = indexed.groups[meta.key] || [];\n\t\tif (tris.length === 0) continue;\n\t\tvar comps = connectedComponentsIndexed(tris);\n\t\tif (smallThreshold && smallThreshold > 0 && comps.length > 1) {\n\t\t\tcomps = mergeSmallIndexedComponents(comps, smallThreshold);\n\t\t}\n\t\tfor (var c = 0; c < comps.length; c++) {\n\t\t\tout.push({\n\t\t\t\tmesh: meta.mesh, side: meta.side, group: meta.key, index: c,\n\t\t\t\tpoints: points, triangles: comps[c], triCount: comps[c].length\n\t\t\t});\n\t\t}\n\t}\n\treturn out;\n}\n\n/**\n * Fold components below `threshold` triangles into the largest component (so a boolean\n * seam doesn't leave dozens of stray slivers as their own regions). Mirrors\n * `mergeSmallComponents` for the indexed representation.\n *\n * @param {Array<Array<Array<number>>>} comps\n * @param {number} threshold\n * @returns {Array<Array<Array<number>>>}\n */\nexport function mergeSmallIndexedComponents(comps, threshold) {\n\tif (comps.length <= 1) return comps;\n\tvar largest = 0;\n\tfor (var i = 1; i < comps.length; i++) if (comps[i].length > comps[largest].length) largest = i;\n\tvar keep = [], strays = [];\n\tfor (var j = 0; j < comps.length; j++) {\n\t\tif (j === largest || comps[j].length >= threshold) keep.push(comps[j]);\n\t\telse strays.push(comps[j]);\n\t}\n\tif (strays.length) {\n\t\tvar big = comps[largest];\n\t\tfor (var s = 0; s < strays.length; s++) for (var k = 0; k < strays[s].length; k++) big.push(strays[s][k]);\n\t}\n\treturn keep;\n}\n"],"names":["u","bc","ca","ab","bct","cat","abt","_8","_16","fin","fin2","finadd","flipSoup","extractBoundaryWalk"],"mappings":"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,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3J,IAAI,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3J,IAAI,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3J;I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AAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpH,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE;IAChC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpH,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE;IAChC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpH,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,E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","x_google_ignoreList":[0,1,2,3,9,10,41]}