@nakednous/host 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../tree/dist/index.js","../src/view.js","../src/canvas.js","../src/pointer.js","../src/loop.js","../src/handle.js","../src/router.js","../src/helm.js","../src/track.js","../src/index.js"],"sourcesContent":["/**\n * @file Core constants — zero dependencies.\n * @module tree/constants\n * @license AGPL-3.0-only\n */\n\n// Coordinate spaces\nconst WORLD = 'WORLD';\nconst EYE = 'EYE';\nconst NDC = 'NDC';\nconst SCREEN = 'SCREEN';\nconst MODEL = 'MODEL';\nconst MATRIX = 'MATRIX';\n\n// Integrator frame source (helm `from` only): the construct's own current pose\n// — body-relative; not a general mapDirection space.\nconst SELF = 'SELF';\n\n// NDC Z convention (only difference between backends)\nconst WEBGL = -1; // z ∈ [−1, 1]\nconst WEBGPU = 0; // z ∈ [0, 1]\n\n// Visibility results\nconst INVISIBLE = 0;\nconst VISIBLE = 1;\nconst SEMIVISIBLE = 2;\n\n// Basis vectors (frozen plain arrays — duck-typed Vec3)\nconst ORIGIN = Object.freeze([0, 0, 0]);\nconst i = Object.freeze([1, 0, 0]);\nconst j = Object.freeze([0, 1, 0]);\nconst k = Object.freeze([0, 0, 1]);\nconst _i = Object.freeze([-1, 0, 0]);\nconst _j = Object.freeze([0, -1, 0]);\nconst _k = Object.freeze([0, 0, -1]);\n\n// Handle constraint kinds\nconst SPHERE = 0;\nconst PLANE = 1;\nconst AXIS = 2;\nconst DIAL = 3;\n\n// Handle report modes\nconst POINT = 0;\nconst DIRECTION = 1;\n\n// Pointer-hit shapes (pointerHit); bullsEyeLines' shape\nconst CIRCLE = 0;\nconst SQUARE = 1;\n\n// Gizmo bits — one namespace per generator. The same value means different\n// things to different generators, and no generator reads another's bits.\nconst NONE = 0;\n\n// axesLines\nconst X = 1 << 0;\nconst _X = 1 << 1;\nconst Y = 1 << 2;\nconst _Y = 1 << 3;\nconst Z = 1 << 4;\nconst _Z = 1 << 5;\nconst LABELS = 1 << 6;\n\n// frustumLines (LEFT … TOP also key a bounds object's planes)\nconst NEAR = 1 << 0;\nconst FAR = 1 << 1;\nconst LEFT = 1 << 2;\nconst RIGHT = 1 << 3;\nconst BOTTOM = 1 << 4;\nconst TOP = 1 << 5;\nconst BODY = 1 << 6;\nconst APEX = 1 << 7;\n\n// pathLines\nconst PATH = 1 << 0;\nconst CENTER = 1 << 1;\nconst CONTROLS = 1 << 2;\nconst TANGENTS_IN = 1 << 3;\nconst TANGENTS_OUT = 1 << 4;\nconst TANGENTS = TANGENTS_IN | TANGENTS_OUT;\nconst HANDLES = 1 << 5;\n\n// helmRigLines\nconst TRANSLATE = 1 << 0;\nconst ROTATE = 1 << 1;\n\n// locusLines (HANDLE is the bridge's dot, not a line)\nconst HANDLE = 1 << 0;\nconst AIM = 1 << 1;\nconst LOCUS = 1 << 2;\nconst RING = 1 << 3;\n\n// Semantic palette — normalised RGBA: red, lime, dodger blue; COLOR_DIM is\n// the alpha of a dimmed stroke (the helm rig's baseline).\nconst COLOR_X = Object.freeze([1, 0, 0, 1]);\nconst COLOR_Y = Object.freeze([0, 1, 0, 1]);\nconst COLOR_Z = Object.freeze([30 / 255, 144 / 255, 1, 1]);\nconst COLOR_DIM = 110 / 255;\n\n/**\n * @file Quaternion algebra and mat4/mat3 conversions.\n * @module tree/quat\n * @license AGPL-3.0-only\n *\n * Quaternions are stored as flat [x, y, z, w] arrays (w-last, glTF layout).\n *\n * All functions follow the out-first, zero-allocation contract.\n * Conversion functions bridge between quaternion and matrix representations\n * but do not perform any higher-level graphics operations — those belong\n * in form.js (matrix construction from specs) or track.js (animation).\n */\n\n\n// =========================================================================\n// Basic ops\n// =========================================================================\n\n/** Set all four components. @returns {number[]} out */\nconst qSet = (out, x, y, z, w) => {\n out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out;\n};\n\n/** Copy quaternion a into out. @returns {number[]} out */\nconst qCopy = (out, a) => {\n out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out;\n};\n\n/** Dot product of two quaternions. */\nconst qDot = (a, b) => a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];\n\n/** Normalise quaternion in-place. @returns {number[]} out */\nconst qNormalize = (out) => {\n const l = Math.sqrt(out[0]*out[0]+out[1]*out[1]+out[2]*out[2]+out[3]*out[3]) || 1;\n out[0]/=l; out[1]/=l; out[2]/=l; out[3]/=l; return out;\n};\n\n/** Negate quaternion (same rotation, different hemisphere). @returns {number[]} out */\nconst qNegate = (out, a) => {\n out[0]=-a[0]; out[1]=-a[1]; out[2]=-a[2]; out[3]=-a[3]; return out;\n};\n\n/** Hamilton product out = a * b. Alias-safe: out may be a or b. @returns {number[]} out */\nconst qMul = (out, a, b) => {\n const ax=a[0],ay=a[1],az=a[2],aw=a[3], bx=b[0],by=b[1],bz=b[2],bw=b[3];\n out[0]=aw*bx+ax*bw+ay*bz-az*by;\n out[1]=aw*by-ax*bz+ay*bw+az*bx;\n out[2]=aw*bz+ax*by-ay*bx+az*bw;\n out[3]=aw*bw-ax*bx-ay*by-az*bz;\n return out;\n};\n\n/**\n * Conjugate out = [−x, −y, −z, w] — the inverse of a UNIT quaternion.\n * (Not qNegate: −q is the SAME rotation on the other hypersphere hemisphere;\n * the conjugate is the opposite rotation.)\n * @returns {number[]} out\n */\nconst qConjugate = (out, a) => {\n out[0]=-a[0]; out[1]=-a[1]; out[2]=-a[2]; out[3]=a[3]; return out;\n};\n\n/**\n * Rotate a vec3 by a unit quaternion: out = q · v · q⁻¹, expanded to the\n * allocation-free t = 2(qv × v); out = v + w·t + qv × t form.\n * Alias-safe: out may be v.\n * @param {number[]} out 3-element destination.\n * @param {number[]} q Unit quaternion [x,y,z,w].\n * @param {number[]} v Vector [x,y,z].\n * @returns {number[]} out\n */\nconst qRotateVec3 = (out, q, v) => {\n const qx=q[0],qy=q[1],qz=q[2],qw=q[3], vx=v[0],vy=v[1],vz=v[2];\n const tx=2*(qy*vz-qz*vy), ty=2*(qz*vx-qx*vz), tz=2*(qx*vy-qy*vx);\n out[0]=vx+qw*tx+qy*tz-qz*ty;\n out[1]=vy+qw*ty+qz*tx-qx*tz;\n out[2]=vz+qw*tz+qx*ty-qy*tx;\n return out;\n};\n\n// =========================================================================\n// Interpolation\n// =========================================================================\n\n/** Spherical linear interpolation. @returns {number[]} out */\nconst qSlerp = (out, a, b, t) => {\n let bx=b[0],by=b[1],bz=b[2],bw=b[3];\n let d = a[0]*bx+a[1]*by+a[2]*bz+a[3]*bw;\n if (d < 0) { bx=-bx; by=-by; bz=-bz; bw=-bw; d=-d; }\n let f0, f1;\n if (1-d > 1e-10) {\n const th=Math.acos(d), st=Math.sin(th);\n f0=Math.sin((1-t)*th)/st; f1=Math.sin(t*th)/st;\n } else {\n f0=1-t; f1=t;\n }\n out[0]=a[0]*f0+bx*f1; out[1]=a[1]*f0+by*f1;\n out[2]=a[2]*f0+bz*f1; out[3]=a[3]*f0+bw*f1;\n return qNormalize(out);\n};\n\n/**\n * Normalised linear interpolation (nlerp).\n * Cheaper than slerp; slightly non-constant angular velocity.\n * Handles antipodal quats by flipping b when dot < 0.\n * @returns {number[]} out\n */\nconst qNlerp = (out, a, b, t) => {\n let bx=b[0],by=b[1],bz=b[2],bw=b[3];\n if (a[0]*bx+a[1]*by+a[2]*bz+a[3]*bw < 0) { bx=-bx; by=-by; bz=-bz; bw=-bw; }\n out[0]=a[0]+t*(bx-a[0]); out[1]=a[1]+t*(by-a[1]);\n out[2]=a[2]+t*(bz-a[2]); out[3]=a[3]+t*(bw-a[3]);\n return qNormalize(out);\n};\n\n// =========================================================================\n// Construction\n// =========================================================================\n\n/**\n * Shortest-arc rotation taking unit vector a to unit vector b (three.js's\n * setFromUnitVectors; the arcball delta). Antiparallel inputs rotate 180°\n * about an axis ⊥ a, seeded from the world axis least aligned with a.\n * @param {number[]} out\n * @param {number[]} a Unit vector [x,y,z].\n * @param {number[]} b Unit vector [x,y,z].\n * @returns {number[]} out (normalised)\n */\nconst qFromUnitVectors = (out, a, b) => {\n const d = a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n if (d < -0.999999) {\n const ax = Math.abs(a[0]), ay = Math.abs(a[1]), az = Math.abs(a[2]);\n let rx = 0, ry = 0, rz = 0;\n if (ax <= ay && ax <= az) rx = 1; else if (ay <= az) ry = 1; else rz = 1;\n out[0]=ry*a[2]-rz*a[1]; out[1]=rz*a[0]-rx*a[2]; out[2]=rx*a[1]-ry*a[0];\n out[3]=0; // 180°: w = cos(π/2) = 0\n } else {\n out[0]=a[1]*b[2]-a[2]*b[1];\n out[1]=a[2]*b[0]-a[0]*b[2];\n out[2]=a[0]*b[1]-a[1]*b[0];\n out[3]=1+d;\n }\n return qNormalize(out);\n};\n\n/**\n * Build a quaternion from axis-angle.\n * @param {number[]} out\n * @param {number} ax @param {number} ay @param {number} az Axis (need not be unit).\n * @param {number} angle Radians.\n * @returns {number[]} out\n */\nconst qFromAxisAngle = (out, ax, ay, az, angle) => {\n const half = angle * 0.5;\n const s = Math.sin(half);\n const len = Math.sqrt(ax*ax + ay*ay + az*az) || 1;\n out[0] = s * ax / len; out[1] = s * ay / len; out[2] = s * az / len;\n out[3] = Math.cos(half);\n return out;\n};\n\n/**\n * Build a quaternion from a look direction (−Z forward) and optional up (default +Y).\n * `dir` need not be unit. Right = dir × up, up re-orthogonalised as right × dir;\n * when `dir` is parallel to `up` the up hint is re-seeded from the world axis\n * least aligned with `dir` (the same seed qFromUnitVectors uses), so every\n * direction yields a proper rotation.\n * @param {number[]} out\n * @param {number[]} dir Forward direction [x,y,z].\n * @param {number[]} [up] Up vector [x,y,z].\n * @returns {number[]} out\n */\nconst qFromLookDir = (out, dir, up) => {\n let fx=dir[0],fy=dir[1],fz=dir[2];\n const fl=Math.sqrt(fx*fx+fy*fy+fz*fz)||1;\n fx/=fl; fy/=fl; fz/=fl;\n let ux=up?up[0]:0, uy=up?up[1]:1, uz=up?up[2]:0;\n let rx=fy*uz-fz*uy, ry=fz*ux-fx*uz, rz=fx*uy-fy*ux; // right = dir × up\n let rl=Math.sqrt(rx*rx+ry*ry+rz*rz);\n if (rl < 1e-8) { // dir ∥ up: re-seed up\n const ax=Math.abs(fx), ay=Math.abs(fy), az=Math.abs(fz);\n ux=0; uy=0; uz=0;\n if (ax <= ay && ax <= az) ux=1; else if (ay <= az) uy=1; else uz=1;\n rx=fy*uz-fz*uy; ry=fz*ux-fx*uz; rz=fx*uy-fy*ux;\n rl=Math.sqrt(rx*rx+ry*ry+rz*rz)||1;\n }\n rx/=rl; ry/=rl; rz/=rl;\n ux=ry*fz-rz*fy; uy=rz*fx-rx*fz; uz=rx*fy-ry*fx; // up = right × dir\n return qFromRotMat3x3(out, rx,ux,-fx, ry,uy,-fy, rz,uz,-fz); // columns: right, up, back\n};\n\n/**\n * Build a quaternion from a 3×3 rotation matrix (9 row-major scalars).\n * @returns {number[]} out (normalised)\n */\nconst qFromRotMat3x3 = (out, m00,m01,m02, m10,m11,m12, m20,m21,m22) => {\n const tr = m00+m11+m22;\n if (tr > 0) {\n const s=0.5/Math.sqrt(tr+1);\n out[3]=0.25/s; out[0]=(m21-m12)*s; out[1]=(m02-m20)*s; out[2]=(m10-m01)*s;\n } else if (m00>m11 && m00>m22) {\n const s=2*Math.sqrt(1+m00-m11-m22);\n out[3]=(m21-m12)/s; out[0]=0.25*s; out[1]=(m01+m10)/s; out[2]=(m02+m20)/s;\n } else if (m11>m22) {\n const s=2*Math.sqrt(1+m11-m00-m22);\n out[3]=(m02-m20)/s; out[0]=(m01+m10)/s; out[1]=0.25*s; out[2]=(m12+m21)/s;\n } else {\n const s=2*Math.sqrt(1+m22-m00-m11);\n out[3]=(m10-m01)/s; out[0]=(m02+m20)/s; out[1]=(m12+m21)/s; out[2]=0.25*s;\n }\n return qNormalize(out);\n};\n\n/**\n * Extract a unit quaternion from the upper-left 3×3 of a column-major mat4.\n * @param {number[]} out\n * @param {Float32Array|number[]} m Column-major mat4.\n * @returns {number[]} out\n */\nconst qFromMat4 = (out, m) =>\n qFromRotMat3x3(out, m[0],m[4],m[8], m[1],m[5],m[9], m[2],m[6],m[10]);\n\n/**\n * Write a quaternion into the rotation block of a column-major mat4.\n * Translation and perspective rows/cols are set to identity values.\n * @param {Float32Array|number[]} out 16-element array.\n * @param {number[]} q [x,y,z,w].\n * @returns {Float32Array|number[]} out\n */\nconst qToMat4 = (out, q) => {\n const x=q[0],y=q[1],z=q[2],w=q[3];\n const x2=x+x,y2=y+y,z2=z+z;\n const xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;\n out[0]=1-(yy+zz); out[1]=xy+wz; out[2]=xz-wy; out[3]=0;\n out[4]=xy-wz; out[5]=1-(xx+zz); out[6]=yz+wx; out[7]=0;\n out[8]=xz+wy; out[9]=yz-wx; out[10]=1-(xx+yy); out[11]=0;\n out[12]=0; out[13]=0; out[14]=0; out[15]=1;\n return out;\n};\n\n// =========================================================================\n// Decomposition\n// =========================================================================\n\n/**\n * Decompose a unit quaternion into { axis:[x,y,z], angle } (radians).\n * @param {number[]} q [x,y,z,w].\n * @param {Object} [out]\n * @returns {{ axis: number[], angle: number }}\n */\nconst qToAxisAngle = (q, out) => {\n out = out || {};\n const x=q[0],y=q[1],z=q[2],w=q[3];\n const sinHalf = Math.sqrt(x*x+y*y+z*z);\n if (sinHalf < 1e-8) { out.axis=[0,1,0]; out.angle=0; return out; }\n out.angle = 2*Math.atan2(sinHalf, w);\n out.axis = [x/sinHalf, y/sinHalf, z/sinHalf];\n return out;\n};\n\n/**\n * @file 1€ input filter — speed-adaptive first-order low-pass for noisy input.\n * @module tree/filter\n * @license AGPL-3.0-only\n *\n * A jitter conditioner for noisy / absolute input streams (the helm's optional\n * `filter` slot; sketch-side handle conditioning). It is NOT a deadzone\n * replacement: a low-pass passes DC, so a constant rest bias survives it and\n * still integrates to creep — only the deadzone's exact-zero clamp removes that.\n * The 1€ removes zero-mean jitter; the two are orthogonal and coexist, applied\n * filter → deadzone (condition the continuous signal first, then gate to zero).\n *\n * First-order low-pass whose cutoff rises with the signal's speed: slow (rest)\n * → low cutoff → heavy smoothing; fast (motion) → high cutoff → low lag. Tuned\n * by `minCutoff` (Hz, the rest cutoff) and `beta` (how fast the cutoff opens\n * with speed). Reimplemented from the paper's equations — `tree` is zero-dep, so\n * the ~one-page primitive is vendored, not depended on (the same call made for\n * quaternions over gl-matrix).\n *\n * Reference: Casiez, G., Roussel, N., & Vogel, D. (2012). 1€ Filter: A Simple\n * Speed-based Low-pass Filter for Noisy Input in Interactive Systems. CHI '12,\n * 2527–2530. DOI 10.1145/2207676.2208639 · https://gery.casiez.net/1euro/\n */\n\n\n/**\n * Build a stateful 1€ filter as an out-first carrying function.\n *\n * The returned `f` carries the previous filtered value and derivative across\n * calls (one state slot per vector component), and is used in one of two forms:\n *\n * - vec form `f(out, raw, dt)` — `out`/`raw` are equal-length ArrayLikes;\n * writes the filtered vector into `out` and returns it.\n * Zero-allocation after the first call (state sized to `raw`).\n * - scalar form `f(raw, dt)` — `raw` is a number; returns the filtered number.\n *\n * The form is chosen by the first argument's type (number ⇒ scalar). `minCutoff`,\n * `beta`, and `dCutoff` are live-mutable on the returned function (`f.minCutoff`,\n * `f.beta`, `f.dCutoff`) and read every call, so a panel can tune them against\n * live noise. `f.reset()` drops the carried state at a discontinuity (a\n * re-acquired source, a helm `home()`); smear across one and the output lurches.\n *\n * @param {Object} [opts]\n * @param {number} [opts.minCutoff=1] Minimum (rest) cutoff frequency, in Hz.\n * @param {number} [opts.beta=0] Speed coefficient (cutoff = minCutoff +\n * beta·|filtered derivative|); unitless.\n * @param {number} [opts.dCutoff=1] Derivative cutoff frequency, in Hz.\n * @returns {Function} A carrying filter `f(out, raw, dt)` / `f(raw, dt)` with a\n * `reset()` method and live `minCutoff` / `beta` / `dCutoff`.\n */\nfunction oneEuro(opts) {\n opts = opts || {};\n\n // Carried state: previous filtered value + previous filtered derivative.\n // number (scalar form) | number[] (vec form). primed = state is seeded.\n let xPrev = null;\n let dxPrev = null;\n let primed = false;\n\n // Low-pass smoothing factor for a sample period `dt` and a cutoff frequency\n // (the paper's α = 1 / (1 + τ/Te), τ = 1 / (2π·cutoff)).\n const alpha = (dt, cutoff) => {\n const tau = 1 / (2 * Math.PI * cutoff);\n return 1 / (1 + tau / dt);\n };\n const smooth = (a, x, xp) => a * x + (1 - a) * xp;\n\n const scalar = (x, dt) => {\n if (!primed) { xPrev = x; dxPrev = 0; primed = true; return x; }\n const dx = (x - xPrev) / dt;\n const edx = smooth(alpha(dt, f.dCutoff), dx, dxPrev);\n const a = alpha(dt, f.minCutoff + f.beta * Math.abs(edx));\n const xh = smooth(a, x, xPrev);\n xPrev = xh; dxPrev = edx;\n return xh;\n };\n\n const vec = (out, raw, dt) => {\n const n = raw.length;\n if (!primed) {\n if (!Array.isArray(xPrev) || xPrev.length !== n) {\n xPrev = new Array(n); dxPrev = new Array(n);\n }\n for (let i = 0; i < n; i++) { xPrev[i] = raw[i]; dxPrev[i] = 0; out[i] = raw[i]; }\n primed = true;\n return out;\n }\n for (let i = 0; i < n; i++) {\n const dx = (raw[i] - xPrev[i]) / dt;\n const edx = smooth(alpha(dt, f.dCutoff), dx, dxPrev[i]);\n const a = alpha(dt, f.minCutoff + f.beta * Math.abs(edx));\n const xh = smooth(a, raw[i], xPrev[i]);\n xPrev[i] = xh; dxPrev[i] = edx;\n out[i] = xh;\n }\n return out;\n };\n\n const f = (out, raw, dt) =>\n (typeof out === 'number') ? scalar(out, raw) : vec(out, raw, dt);\n\n f.minCutoff = (opts.minCutoff != null) ? opts.minCutoff : 1;\n f.beta = (opts.beta != null) ? opts.beta : 0;\n f.dCutoff = (opts.dCutoff != null) ? opts.dCutoff : 1;\n\n /** Drop the carried state — call at a discontinuity (re-acquire / home). */\n f.reset = () => { primed = false; return f; };\n\n return f;\n}\n\n/**\n * @file Matrix construction from geometric specs and partial decomposition.\n * @module tree/form\n * @license AGPL-3.0-only\n *\n * Constructs mat4s from higher-level specs: TRS transforms, orthonormal\n * bases, lookat parameters, projection parameters, and special-purpose\n * matrices (bias, reflection).\n *\n * Design invariant: form.js has no dependency on query.js. Construction\n * from specs requires only scalar arithmetic and quaternion conversions.\n * Callers compose the resulting matrices using query.js (mat4Mul etc.).\n *\n * ── NDC Z convention ──────────────────────────────────────────────────────\n * Controlled by `ndcZMin` in every projection constructor:\n * WEBGL = −1 near → NDC z = −1, far → NDC z = +1\n * WEBGPU = 0 near → NDC z = 0, far → NDC z = +1\n *\n * ── NDC Y convention ──────────────────────────────────────────────────────\n * Controlled by `ndcYSign` in every projection constructor (default +1):\n * +1 NDC y-up — standard: OpenGL / WebGL / WebGPU browser / Three.js / p5v2\n * −1 NDC y-down — native Vulkan clip space\n *\n * Negating ndcYSign flips row 1 of the projection matrix (elements\n * out[1], out[5], out[9], out[13]), reversing the y-axis in clip space.\n * mat4View, mat4Eye, and all non-projection constructors are convention-\n * agnostic — they produce the same matrix regardless of the NDC y direction.\n *\n * ── Screen Y convention ───────────────────────────────────────────────────\n * Screen-y direction (DOM y-down vs OpenGL y-up) is a separate concern from\n * NDC-y direction and is handled in query.js via the signed viewport height.\n * See the query.js module header for details.\n *\n * All functions follow the out-first, zero-allocation contract.\n */\n\n\n// =========================================================================\n// Frame construction\n// =========================================================================\n\n/**\n * Rigid frame from orthonormal basis + translation.\n * Column-major layout: col0=right, col1=up, col2=forward, col3=translation.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} rx,ry,rz Right vector (col 0).\n * @param {number} ux,uy,uz Up vector (col 1).\n * @param {number} fx,fy,fz Forward vec (col 2).\n * @param {number} tx,ty,tz Translation (col 3).\n */\nfunction mat4FromBasis(out, rx,ry,rz, ux,uy,uz, fx,fy,fz, tx,ty,tz) {\n out[0]=rx; out[1]=ry; out[2]=rz; out[3]=0;\n out[4]=ux; out[5]=uy; out[6]=uz; out[7]=0;\n out[8]=fx; out[9]=fy; out[10]=fz; out[11]=0;\n out[12]=tx; out[13]=ty; out[14]=tz; out[15]=1;\n return out;\n}\n\n// Lookat basis scratch — right (0–2), up (3–5), back (6–8): unit, world space.\nconst _lb = new Float64Array(9);\n\n/**\n * Orthonormal lookat basis into `_lb`: back = eye − center, right = up × back,\n * up = back × right. When the view direction is parallel to the up hint the\n * hint is re-seeded from the world axis least aligned with it — the seed\n * qFromUnitVectors and qFromLookDir use — so the basis is always a rotation.\n */\nfunction _lookBasis(ex,ey,ez, cx,cy,cz, ux,uy,uz) {\n let zx=ex-cx, zy=ey-cy, zz=ez-cz;\n const zl=Math.sqrt(zx*zx+zy*zy+zz*zz)||1;\n zx/=zl; zy/=zl; zz/=zl;\n let xx=uy*zz-uz*zy, xy=uz*zx-ux*zz, xz=ux*zy-uy*zx;\n let xl=Math.sqrt(xx*xx+xy*xy+xz*xz);\n if (xl < 1e-8) { // view ∥ up: re-seed up\n const ax=Math.abs(zx), ay=Math.abs(zy), az=Math.abs(zz);\n ux=0; uy=0; uz=0;\n if (ax <= ay && ax <= az) ux=1; else if (ay <= az) uy=1; else uz=1;\n xx=uy*zz-uz*zy; xy=uz*zx-ux*zz; xz=ux*zy-uy*zx;\n xl=Math.sqrt(xx*xx+xy*xy+xz*xz)||1;\n }\n xx/=xl; xy/=xl; xz/=xl;\n _lb[0]=xx; _lb[1]=xy; _lb[2]=xz;\n _lb[3]=zy*xz-zz*xy; _lb[4]=zz*xx-zx*xz; _lb[5]=zx*xy-zy*xx;\n _lb[6]=zx; _lb[7]=zy; _lb[8]=zz;\n}\n\n/**\n * View matrix (world→eye) from lookat parameters.\n * Camera looks along −Z in eye space; right = normalize(up × (−Z)).\n * Cheaper than building the eye matrix and inverting.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} ex,ey,ez Eye (camera) position.\n * @param {number} cx,cy,cz Look-at target.\n * @param {number} ux,uy,uz World up hint (need not be unit; re-seeded when\n * parallel to the view direction).\n */\nfunction mat4View(out, ex,ey,ez, cx,cy,cz, ux,uy,uz) {\n _lookBasis(ex,ey,ez, cx,cy,cz, ux,uy,uz);\n const xx=_lb[0],xy=_lb[1],xz=_lb[2], yx=_lb[3],yy=_lb[4],yz=_lb[5], zx=_lb[6],zy=_lb[7],zz=_lb[8];\n out[0]=xx; out[1]=yx; out[2]=zx; out[3]=0;\n out[4]=xy; out[5]=yy; out[6]=zy; out[7]=0;\n out[8]=xz; out[9]=yz; out[10]=zz; out[11]=0;\n out[12]=-(xx*ex+xy*ey+xz*ez);\n out[13]=-(yx*ex+yy*ey+yz*ez);\n out[14]=-(zx*ex+zy*ey+zz*ez);\n out[15]=1;\n return out;\n}\n\n/**\n * Eye matrix (eye→world) from lookat parameters.\n * Transpose of the rotation block + direct translation column.\n * Same parameters as mat4View.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} ex,ey,ez Eye position.\n * @param {number} cx,cy,cz Look-at target.\n * @param {number} ux,uy,uz World up hint (need not be unit; re-seeded when\n * parallel to the view direction).\n */\nfunction mat4Eye(out, ex,ey,ez, cx,cy,cz, ux,uy,uz) {\n _lookBasis(ex,ey,ez, cx,cy,cz, ux,uy,uz);\n const xx=_lb[0],xy=_lb[1],xz=_lb[2], yx=_lb[3],yy=_lb[4],yz=_lb[5], zx=_lb[6],zy=_lb[7],zz=_lb[8];\n out[0]=xx; out[1]=xy; out[2]=xz; out[3]=0;\n out[4]=yx; out[5]=yy; out[6]=yz; out[7]=0;\n out[8]=zx; out[9]=zy; out[10]=zz; out[11]=0;\n out[12]=ex; out[13]=ey; out[14]=ez; out[15]=1;\n return out;\n}\n\n// =========================================================================\n// TRS construction\n// =========================================================================\n\n/**\n * Column-major mat4 from flat TRS scalars. No struct allocation.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} tx,ty,tz Translation.\n * @param {number} qx,qy,qz,qw Rotation quaternion [x,y,z,w].\n * @param {number} sx,sy,sz Scale.\n */\nfunction mat4FromTRS(out, tx,ty,tz, qx,qy,qz,qw, sx,sy,sz) {\n const x2=qx+qx,y2=qy+qy,z2=qz+qz;\n const xx=qx*x2,xy=qx*y2,xz=qx*z2,yy=qy*y2,yz=qy*z2,zz=qz*z2;\n const wx=qw*x2,wy=qw*y2,wz=qw*z2;\n out[0]=(1-(yy+zz))*sx; out[1]=(xy+wz)*sx; out[2]=(xz-wy)*sx; out[3]=0;\n out[4]=(xy-wz)*sy; out[5]=(1-(xx+zz))*sy; out[6]=(yz+wx)*sy; out[7]=0;\n out[8]=(xz+wy)*sz; out[9]=(yz-wx)*sz; out[10]=(1-(xx+yy))*sz; out[11]=0;\n out[12]=tx; out[13]=ty; out[14]=tz; out[15]=1;\n return out;\n}\n\n/**\n * Translation-only mat4.\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} tx,ty,tz\n */\nfunction mat4FromTranslation(out, tx,ty,tz) {\n out[0]=1; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=1; out[6]=0; out[7]=0;\n out[8]=0; out[9]=0; out[10]=1; out[11]=0;\n out[12]=tx; out[13]=ty; out[14]=tz; out[15]=1;\n return out;\n}\n\n/**\n * Scale-only mat4.\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} sx,sy,sz\n */\nfunction mat4FromScale(out, sx,sy,sz) {\n out[0]=sx; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=sy; out[6]=0; out[7]=0;\n out[8]=0; out[9]=0; out[10]=sz; out[11]=0;\n out[12]=0; out[13]=0; out[14]=0; out[15]=1;\n return out;\n}\n\n// =========================================================================\n// Projection construction\n// =========================================================================\n\n/**\n * Orthographic projection matrix.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} left,right,bottom,top Frustum extents.\n * @param {number} near,far Clip plane distances (positive).\n * @param {number} ndcZMin −1 (WEBGL) or 0 (WEBGPU).\n * @param {number} [ndcYSign=1] +1 = NDC y-up (default); −1 = NDC y-down (native Vulkan).\n */\nfunction mat4Ortho(out, left, right, bottom, top, near, far, ndcZMin, ndcYSign=1) {\n const rl=1/(right-left), tb=1/(top-bottom), fn=1/(far-near);\n out[0]=2*rl; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=ndcYSign*2*tb; out[6]=0; out[7]=0;\n out[8]=0; out[9]=0; out[10]=(ndcZMin-1)*fn; out[11]=0;\n out[12]=-(right+left)*rl; out[13]=ndcYSign*(-(top+bottom)*tb);\n out[14]=(ndcZMin*far-near)*fn;\n out[15]=1;\n return out;\n}\n\n/**\n * Perspective projection matrix (general / off-centre frustum).\n * Symmetric case: left=-right, bottom=-top — derive from fov+aspect in user space:\n * top = near * Math.tan(fov / 2); right = top * aspect\n * mat4Persp(out, -right, right, -top, top, near, far, ndcZMin)\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} left,right,bottom,top Near-plane extents (signed, y-up: top>0, bottom<0).\n * @param {number} near,far Clip plane distances (positive).\n * @param {number} ndcZMin −1 (WEBGL) or 0 (WEBGPU).\n * @param {number} [ndcYSign=1] +1 = NDC y-up (default); −1 = NDC y-down (native Vulkan).\n */\nfunction mat4Persp(out, left, right, bottom, top, near, far, ndcZMin, ndcYSign=1) {\n const rl=1/(right-left), tb=1/(top-bottom);\n out[0]=2*near*rl; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=ndcYSign*2*near*tb; out[6]=0; out[7]=0;\n out[8]=(right+left)*rl; out[9]=ndcYSign*(top+bottom)*tb;\n out[10]=(ndcZMin*near-far)/(far-near);\n out[11]=-1;\n out[12]=0; out[13]=0;\n out[14]=(ndcZMin-1)*far*near/(far-near);\n out[15]=0;\n return out;\n}\n\n// =========================================================================\n// Special-purpose construction\n// =========================================================================\n\n/**\n * Bias matrix: remaps xyz from NDC to texture/UV space [0, 1].\n * xy remap from [−1, 1]; z remaps from [ndcZMin, 1].\n * Used to convert light-space NDC coordinates to shadow map UV.\n *\n * Convention note: the standard bias maps NDC y = −1 → texture v = 0 and\n * NDC y = +1 → texture v = 1. This is correct for both NDC y-up and y-down\n * conventions because the shadow map was rendered with the same projection.\n *\n * Column-major (WEBGL, ndcZMin=−1): Column-major (WEBGPU, ndcZMin=0):\n * [ 0.5 0 0 0.5 ] [ 0.5 0 0 0.5 ]\n * [ 0 0.5 0 0.5 ] [ 0 0.5 0 0.5 ]\n * [ 0 0 0.5 0.5 ] [ 0 0 1 0 ]\n * [ 0 0 0 1 ] [ 0 0 0 1 ]\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n */\nfunction mat4Bias(out, ndcZMin) {\n const sz=1/(1-ndcZMin), tz=-ndcZMin/(1-ndcZMin);\n out[0]=0.5; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=0.5; out[6]=0; out[7]=0;\n out[8]=0; out[9]=0; out[10]=sz; out[11]=0;\n out[12]=0.5; out[13]=0.5; out[14]=tz; out[15]=1;\n return out;\n}\n\n/**\n * Reflection matrix across a plane ax + by + cz = d.\n * [nx, ny, nz] must be a unit normal.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} nx,ny,nz Unit plane normal.\n * @param {number} d Plane offset (dot(point_on_plane, normal)).\n */\nfunction mat4Reflect(out, nx,ny,nz,d) {\n out[0]=1-2*nx*nx; out[1]=-2*ny*nx; out[2]=-2*nz*nx; out[3]=0;\n out[4]=-2*nx*ny; out[5]=1-2*ny*ny; out[6]=-2*nz*ny; out[7]=0;\n out[8]=-2*nx*nz; out[9]=-2*ny*nz; out[10]=1-2*nz*nz; out[11]=0;\n out[12]=2*d*nx; out[13]=2*d*ny; out[14]=2*d*nz; out[15]=1;\n return out;\n}\n\n/**\n * @file Matrix arithmetic, space-transform dispatch, and projection queries.\n * @module tree/query\n * @license AGPL-3.0-only\n *\n * The operative layer — receives matrices and extracts information.\n * Contrast with form.js which constructs matrices from specs.\n *\n * form.js — specs → matrix\n * query.js — matrix → information\n *\n * Storage: column-major Float32Array / ArrayLike<number>.\n * Multiply: mat4Mul(out, A, B) = A · B (standard math order).\n * Pipeline: clip = P · V · M · v\n *\n * ── NDC Z convention ──────────────────────────────────────────────────────\n * Passed as `ndcZMin` to every space-transform function:\n * WEBGL = −1 z ∈ [−1, 1]\n * WEBGPU = 0 z ∈ [ 0, 1]\n *\n * ── NDC Y convention ──────────────────────────────────────────────────────\n * Standard (OpenGL / WebGL / WebGPU browser / Three.js / p5v2):\n * NDC y-up — y = +1 at top, y = −1 at bottom.\n * Native Vulkan: NDC y-down — projections constructed with ndcYSign = −1\n * (see form.js). Query functions are convention-agnostic: they work on\n * whatever matrices are passed in.\n *\n * ── Viewport convention ───────────────────────────────────────────────────\n * vp = [x, y, w, h] — w and h are SIGNED.\n *\n * The sign of h encodes the relationship between NDC y and screen y:\n * h < 0 (e.g. −canvasH): screen y-DOWN (DOM / p5 mouseX·mouseY / Vulkan surface)\n * NDC y=+1 → screen y=0 (top)\n * NDC y=−1 → screen y=H (bottom)\n * h > 0 (e.g. +canvasH): screen y-UP (OpenGL desktop / WebGL gl_FragCoord)\n * NDC y=−1 → screen y=0 (bottom)\n * NDC y=+1 → screen y=H (top)\n *\n * Pass [0, canvasH, canvasW, −canvasH] for p5/DOM coordinates.\n * Pass [0, 0, canvasW, canvasH] for WebGL gl_FragCoord / OpenGL bottom-left.\n * All helpers use vp[2]/vp[3] signed — no Math.abs — so both conventions\n * work automatically without any branching.\n *\n * All functions follow the out-first, zero-allocation contract.\n * Returns null on degeneracy (singular matrix, etc.).\n */\n\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Mat4 arithmetic\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** out = A · B (column-major) */\nfunction mat4Mul(out, A, B) {\n const a0=A[0],a1=A[1],a2=A[2],a3=A[3],\n a4=A[4],a5=A[5],a6=A[6],a7=A[7],\n a8=A[8],a9=A[9],a10=A[10],a11=A[11],\n a12=A[12],a13=A[13],a14=A[14],a15=A[15];\n let b0=B[0],b1=B[1],b2=B[2],b3=B[3];\n out[0]=a0*b0+a4*b1+a8*b2+a12*b3;\n out[1]=a1*b0+a5*b1+a9*b2+a13*b3;\n out[2]=a2*b0+a6*b1+a10*b2+a14*b3;\n out[3]=a3*b0+a7*b1+a11*b2+a15*b3;\n b0=B[4];b1=B[5];b2=B[6];b3=B[7];\n out[4]=a0*b0+a4*b1+a8*b2+a12*b3;\n out[5]=a1*b0+a5*b1+a9*b2+a13*b3;\n out[6]=a2*b0+a6*b1+a10*b2+a14*b3;\n out[7]=a3*b0+a7*b1+a11*b2+a15*b3;\n b0=B[8];b1=B[9];b2=B[10];b3=B[11];\n out[8]=a0*b0+a4*b1+a8*b2+a12*b3;\n out[9]=a1*b0+a5*b1+a9*b2+a13*b3;\n out[10]=a2*b0+a6*b1+a10*b2+a14*b3;\n out[11]=a3*b0+a7*b1+a11*b2+a15*b3;\n b0=B[12];b1=B[13];b2=B[14];b3=B[15];\n out[12]=a0*b0+a4*b1+a8*b2+a12*b3;\n out[13]=a1*b0+a5*b1+a9*b2+a13*b3;\n out[14]=a2*b0+a6*b1+a10*b2+a14*b3;\n out[15]=a3*b0+a7*b1+a11*b2+a15*b3;\n return out;\n}\n\n/** out = inverse(src). Returns null if singular (|det| < 1e-12). */\nfunction mat4Invert(out, src) {\n const s0=src[0],s1=src[1],s2=src[2],s3=src[3],\n s4=src[4],s5=src[5],s6=src[6],s7=src[7],\n s8=src[8],s9=src[9],s10=src[10],s11=src[11],\n s12=src[12],s13=src[13],s14=src[14],s15=src[15];\n const b0=s0*s5-s1*s4, b1=s0*s6-s2*s4, b2=s0*s7-s3*s4,\n b3=s1*s6-s2*s5, b4=s1*s7-s3*s5, b5=s2*s7-s3*s6,\n b6=s8*s13-s9*s12, b7=s8*s14-s10*s12, b8=s8*s15-s11*s12,\n b9=s9*s14-s10*s13, b10=s9*s15-s11*s13, b11=s10*s15-s11*s14;\n let det=b0*b11-b1*b10+b2*b9+b3*b8-b4*b7+b5*b6;\n if (Math.abs(det) < 1e-12) return null;\n det = 1/det;\n out[0]=(s5*b11-s6*b10+s7*b9)*det;\n out[1]=(s2*b10-s1*b11-s3*b9)*det;\n out[2]=(s13*b5-s14*b4+s15*b3)*det;\n out[3]=(s10*b4-s9*b5-s11*b3)*det;\n out[4]=(s6*b8-s4*b11-s7*b7)*det;\n out[5]=(s0*b11-s2*b8+s3*b7)*det;\n out[6]=(s14*b2-s12*b5-s15*b1)*det;\n out[7]=(s8*b5-s10*b2+s11*b1)*det;\n out[8]=(s4*b10-s5*b8+s7*b6)*det;\n out[9]=(s1*b8-s0*b10-s3*b6)*det;\n out[10]=(s12*b4-s13*b2+s15*b0)*det;\n out[11]=(s9*b2-s8*b4-s11*b0)*det;\n out[12]=(s5*b7-s4*b9-s6*b6)*det;\n out[13]=(s0*b9-s1*b7+s2*b6)*det;\n out[14]=(s13*b1-s12*b3-s14*b0)*det;\n out[15]=(s8*b3-s9*b1+s10*b0)*det;\n return out;\n}\n\n/**\n * Normal matrix: inverseTranspose(upper-left 3×3 of src).\n * On degeneracy writes zeros and returns out.\n * @param {Float32Array|number[]} out 9-element destination.\n * @param {Float32Array|number[]} src 16-element mat4.\n */\nfunction mat3NormalFromMat4(out, src) {\n const a00=src[0],a01=src[1],a02=src[2],\n a10=src[4],a11=src[5],a12=src[6],\n a20=src[8],a21=src[9],a22=src[10];\n const b01=a22*a11-a12*a21, b11=-a22*a01+a02*a21, b21=a12*a01-a02*a11;\n let det=a00*b01+a10*b11+a20*b21;\n if (Math.abs(det) < 1e-12) { for(let i=0;i<9;i++)out[i]=0; return out; }\n det=1/det;\n out[0]=b01*det; out[1]=(-a22*a10+a12*a20)*det; out[2]=(a21*a10-a11*a20)*det;\n out[3]=b11*det; out[4]=(a22*a00-a02*a20)*det; out[5]=(-a21*a00+a01*a20)*det;\n out[6]=b21*det; out[7]=(-a12*a00+a02*a10)*det; out[8]=(a11*a00-a01*a10)*det;\n return out;\n}\n\n/** out = mat4 * [x,y,z,1], perspective-divides, writes xyz. */\nfunction mat4MulPoint(out, m, x, y, z) {\n const rx=m[0]*x+m[4]*y+m[8]*z+m[12], ry=m[1]*x+m[5]*y+m[9]*z+m[13],\n rz=m[2]*x+m[6]*y+m[10]*z+m[14], rw=m[3]*x+m[7]*y+m[11]*z+m[15];\n if (rw!==0&&rw!==1) { out[0]=rx/rw; out[1]=ry/rw; out[2]=rz/rw; }\n else { out[0]=rx; out[1]=ry; out[2]=rz; }\n return out;\n}\n\n/**\n * Apply only the 3×3 linear block of a mat4 to a direction (no translation,\n * no perspective divide). Use mat3NormalFromMat4 for normals under non-uniform scale.\n */\nfunction mat4MulDir(out, m, dx, dy, dz) {\n out[0]=m[0]*dx+m[4]*dy+m[8]*dz;\n out[1]=m[1]*dx+m[5]*dy+m[9]*dz;\n out[2]=m[2]*dx+m[6]*dy+m[10]*dz;\n return out;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Projection queries\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** @returns {boolean} true if orthographic. */\nfunction projIsOrtho(p) { return p[15] !== 0; }\n\n/**\n * Near plane distance.\n * @param {ArrayLike<number>} p Projection mat4.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n */\nfunction projNear(p, ndcZMin) {\n return p[15]===0 ? p[14]/(p[10]+ndcZMin) : (p[14]-ndcZMin)/p[10];\n}\n\n/** Far plane distance (far always maps to NDC z = 1, convention-independent). */\nfunction projFar(p) {\n return p[15]===0 ? p[14]/(1+p[10]) : (p[14]-1)/p[10];\n}\n\nfunction projLeft (p, ndcZMin) { return p[15]===1 ? -(1+p[12])/p[0] : projNear(p,ndcZMin)*(p[8]-1)/p[0]; }\nfunction projRight (p, ndcZMin) { return p[15]===1 ? (1-p[12])/p[0] : projNear(p,ndcZMin)*(1+p[8])/p[0]; }\n\n/**\n * Top extent of the near plane in camera space (y_max, positive for standard y-up camera).\n * Sign-normalized: returns the larger of the two y boundaries regardless of whether\n * the projection was built with ndcYSign = +1 or −1.\n */\nfunction projTop(p, ndcZMin) {\n return p[15]===1\n ? ( Math.sign(p[5]) - p[13]) / p[5] // ortho\n : projNear(p,ndcZMin)*(Math.sign(p[5])+p[9])/p[5]; // perspective\n}\n\n/**\n * Bottom extent of the near plane in camera space (y_min, negative for standard y-up camera).\n */\nfunction projBottom(p, ndcZMin) {\n return p[15]===1\n ? (-Math.sign(p[5]) - p[13]) / p[5] // ortho\n : projNear(p,ndcZMin)*(p[9]-Math.sign(p[5]))/p[5]; // perspective\n}\n\n/** Vertical field of view in radians (perspective only). */\nfunction projFov (p) { return Math.abs(2*Math.atan(1/p[5])); }\n/** Horizontal field of view in radians (perspective only). */\nfunction projHfov(p) { return Math.abs(2*Math.atan(1/p[0])); }\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Derived matrices\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** out = P · V */\nfunction mat4PV(out, proj, view) { return mat4Mul(out, proj, view); }\n/** out = V · M */\nfunction mat4MV(out, model, view) { return mat4Mul(out, view, model); }\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Frame-relative transforms\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Location transform between frames: out = inv(to) · from.\n * Assumes both matrices are affine (bottom row [0,0,0,1]).\n * @returns {ArrayLike<number>|null} out, or null if `to` is singular.\n */\nfunction mat4Location(out, from, to) {\n // Same as: return mat4Invert(out, to) && mat4Mul(out, out, from);\n // a_rc reads column-major: element (row r, column c) is to[c*4 + r].\n const a00=to[0],a01=to[4],a02=to[8],\n a10=to[1],a11=to[5],a12=to[9],\n a20=to[2],a21=to[6],a22=to[10];\n const b01=a22*a11-a12*a21, b11=a12*a20-a22*a10, b21=a21*a10-a11*a20;\n let det=a00*b01+a01*b11+a02*b21;\n if (Math.abs(det) < 1e-12) return null;\n det=1/det;\n const i00=b01*det, i01=(a02*a21-a22*a01)*det, i02=(a12*a01-a02*a11)*det;\n const i10=b11*det, i11=(a22*a00-a02*a20)*det, i12=(a02*a10-a12*a00)*det;\n const i20=b21*det, i21=(a01*a20-a21*a00)*det, i22=(a11*a00-a01*a10)*det;\n const f00=from[0],f01=from[1],f02=from[2],\n f10=from[4],f11=from[5],f12=from[6],\n f20=from[8],f21=from[9],f22=from[10];\n out[0]=i00*f00+i01*f01+i02*f02; out[1]=i10*f00+i11*f01+i12*f02; out[2]=i20*f00+i21*f01+i22*f02; out[3]=0;\n out[4]=i00*f10+i01*f11+i02*f12; out[5]=i10*f10+i11*f11+i12*f12; out[6]=i20*f10+i21*f11+i22*f12; out[7]=0;\n out[8]=i00*f20+i01*f21+i02*f22; out[9]=i10*f20+i11*f21+i12*f22; out[10]=i20*f20+i21*f21+i22*f22; out[11]=0;\n const dx=from[12]-to[12], dy=from[13]-to[13], dz=from[14]-to[14];\n out[12]=i00*dx+i01*dy+i02*dz; out[13]=i10*dx+i11*dy+i12*dz; out[14]=i20*dx+i21*dy+i22*dz; out[15]=1;\n return out;\n}\n\n/**\n * Direction transform between frames: out = inv(to₃) · from₃ — a direction's\n * coordinates in `from` become its coordinates in `to`, the same conversion\n * mat4Location and mapDirection perform, on the upper-left 3×3 blocks only\n * (rotation / scale, no translation).\n * @returns {ArrayLike<number>|null} out, or null if `to` is singular.\n */\nfunction mat3Direction(out, from, to) {\n // a_rc reads column-major: element (row r, column c) is to[c*4 + r].\n const a00=to[0],a01=to[4],a02=to[8],\n a10=to[1],a11=to[5],a12=to[9],\n a20=to[2],a21=to[6],a22=to[10];\n const b01=a22*a11-a12*a21, b11=a12*a20-a22*a10, b21=a21*a10-a11*a20;\n let det=a00*b01+a01*b11+a02*b21;\n if (Math.abs(det) < 1e-12) return null;\n det=1/det;\n const i00=b01*det, i01=(a02*a21-a22*a01)*det, i02=(a12*a01-a02*a11)*det;\n const i10=b11*det, i11=(a22*a00-a02*a20)*det, i12=(a02*a10-a12*a00)*det;\n const i20=b21*det, i21=(a01*a20-a21*a00)*det, i22=(a11*a00-a01*a10)*det;\n // out = inv(to₃) · from₃, column by column of from.\n for (let c = 0; c < 3; c++) {\n const f0=from[c*4], f1=from[c*4+1], f2=from[c*4+2];\n out[c*3] = i00*f0 + i01*f1 + i02*f2;\n out[c*3+1] = i10*f0 + i11*f1 + i12*f2;\n out[c*3+2] = i20*f0 + i21*f1 + i22*f2;\n }\n return out;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Space transforms — mapLocation / mapDirection\n// ═══════════════════════════════════════════════════════════════════════════\n//\n// Flat dispatch: every from→to pair is a self-contained leaf with only stack\n// locals — no reentrancy, no shared state between calls.\n//\n// Matrices bag `m`:\n// mat4Proj Float32Array(16) projection (eye → clip)\n// mat4View Float32Array(16) view (world → eye)\n// mat4Eye? Float32Array(16) eye (eye → world); caller fills before passing\n// mat4PV? Float32Array(16) P · V; caller fills or _ensurePV allocates once\n// mat4PVInv? Float32Array(16) inv(P · V); caller fills\n// fromFrame? Float32Array(16) MATRIX source frame\n// toFrameInv? Float32Array(16) inv(MATRIX dest frame)\n//\n// Viewport `vp` = [x, y, w, h]:\n// Use SIGNED h to encode screen-y direction (see module header).\n// Core formula: screen = (ndc*0.5+0.5)*vp[k] + vp[k-2] (k=2 for x, k=3 for y)\n// Inverse: ndc = ((screen-vp[k-2])/vp[k])*2 - 1\n// Negative vp[3] flips NDC y-up to screen y-down automatically.\n//\n\n// ── Location helpers ─────────────────────────────────────────────────────\n\nfunction _worldToScreen(out, px, py, pz, pv, vp, ndcZMin) {\n const x=pv[0]*px+pv[4]*py+pv[8]*pz+pv[12], y=pv[1]*px+pv[5]*py+pv[9]*pz+pv[13],\n z=pv[2]*px+pv[6]*py+pv[10]*pz+pv[14], w=pv[3]*px+pv[7]*py+pv[11]*pz+pv[15];\n const xi=(w!==0&&w!==1)?1/w:1;\n out[0]=(x*xi*0.5+0.5)*vp[2]+vp[0];\n out[1]=(y*xi*0.5+0.5)*vp[3]+vp[1];\n out[2]=(z*xi-ndcZMin)/(1-ndcZMin);\n return out;\n}\n\nfunction _screenToWorld(out, sx, sy, sz, ipv, vp, ndcZMin) {\n return mat4MulPoint(out, ipv,\n ((sx-vp[0])/vp[2])*2-1,\n ((sy-vp[1])/vp[3])*2-1,\n sz*(1-ndcZMin)+ndcZMin);\n}\n\nfunction _worldToNDC(out, px, py, pz, pv) {\n const x=pv[0]*px+pv[4]*py+pv[8]*pz+pv[12], y=pv[1]*px+pv[5]*py+pv[9]*pz+pv[13],\n z=pv[2]*px+pv[6]*py+pv[10]*pz+pv[14], w=pv[3]*px+pv[7]*py+pv[11]*pz+pv[15];\n const xi=(w!==0&&w!==1)?1/w:1;\n out[0]=x*xi; out[1]=y*xi; out[2]=z*xi;\n return out;\n}\n\nfunction _ndcToWorld(out, nx, ny, nz, ipv) { return mat4MulPoint(out,ipv,nx,ny,nz); }\n\nfunction _screenToNDC(out, sx, sy, sz, vp, ndcZMin) {\n out[0]=((sx-vp[0])/vp[2])*2-1;\n out[1]=((sy-vp[1])/vp[3])*2-1;\n out[2]=sz*(1-ndcZMin)+ndcZMin;\n return out;\n}\n\nfunction _ndcToScreen(out, nx, ny, nz, vp, ndcZMin) {\n out[0]=(nx*0.5+0.5)*vp[2]+vp[0];\n out[1]=(ny*0.5+0.5)*vp[3]+vp[1];\n out[2]=(nz-ndcZMin)/(1-ndcZMin);\n return out;\n}\n\nfunction _ensurePV(m) {\n if (m.mat4PV) return m.mat4PV;\n m.mat4PV = new Float32Array(16);\n mat4Mul(m.mat4PV, m.mat4Proj, m.mat4View);\n return m.mat4PV;\n}\n\n/**\n * Map a point between named coordinate spaces.\n *\n * @param {number[]} out 3-element destination — written and returned.\n * @param {number} px,py,pz Input point.\n * @param {string} from Source space (WORLD, EYE, SCREEN, NDC, MATRIX).\n * @param {string} to Destination space.\n * @param {object} m Matrices bag — see module header.\n * @param {number[]} vp Viewport [x, y, w, h]; sign of h encodes screen-y direction.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @returns {number[]} out\n */\nfunction mapLocation(out, px, py, pz, from, to, m, vp, ndcZMin) {\n if (from===WORLD && to===SCREEN) return _worldToScreen(out,px,py,pz,_ensurePV(m),vp,ndcZMin);\n if (from===SCREEN && to===WORLD) return _screenToWorld(out,px,py,pz,m.mat4PVInv,vp,ndcZMin);\n\n if (from===WORLD && to===NDC) return _worldToNDC(out,px,py,pz,_ensurePV(m));\n if (from===NDC && to===WORLD) return _ndcToWorld(out,px,py,pz,m.mat4PVInv);\n\n if (from===SCREEN && to===NDC) return _screenToNDC(out,px,py,pz,vp,ndcZMin);\n if (from===NDC && to===SCREEN) return _ndcToScreen(out,px,py,pz,vp,ndcZMin);\n\n if (from===WORLD && to===EYE) return mat4MulPoint(out,m.mat4View,px,py,pz);\n if (from===EYE && to===WORLD) return mat4MulPoint(out,m.mat4Eye,px,py,pz);\n\n if (from===EYE && to===SCREEN) {\n const e=m.mat4Eye;\n return _worldToScreen(out,e[0]*px+e[4]*py+e[8]*pz+e[12],\n e[1]*px+e[5]*py+e[9]*pz+e[13],\n e[2]*px+e[6]*py+e[10]*pz+e[14],_ensurePV(m),vp,ndcZMin);\n }\n if (from===SCREEN && to===EYE) {\n _screenToWorld(out,px,py,pz,m.mat4PVInv,vp,ndcZMin);\n return mat4MulPoint(out,m.mat4View,out[0],out[1],out[2]);\n }\n\n if (from===EYE && to===NDC) {\n const e=m.mat4Eye;\n return _worldToNDC(out,e[0]*px+e[4]*py+e[8]*pz+e[12],\n e[1]*px+e[5]*py+e[9]*pz+e[13],\n e[2]*px+e[6]*py+e[10]*pz+e[14],_ensurePV(m));\n }\n if (from===NDC && to===EYE) {\n _ndcToWorld(out,px,py,pz,m.mat4PVInv);\n return mat4MulPoint(out,m.mat4View,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===WORLD) return mat4MulPoint(out,m.fromFrame,px,py,pz);\n if (from===WORLD && to===MATRIX) return mat4MulPoint(out,m.toFrameInv,px,py,pz);\n\n if (from===MATRIX && to===EYE) {\n const f=m.fromFrame;\n return mat4MulPoint(out,m.mat4View,f[0]*px+f[4]*py+f[8]*pz+f[12],\n f[1]*px+f[5]*py+f[9]*pz+f[13],\n f[2]*px+f[6]*py+f[10]*pz+f[14]);\n }\n if (from===EYE && to===MATRIX) {\n const e=m.mat4Eye;\n return mat4MulPoint(out,m.toFrameInv,e[0]*px+e[4]*py+e[8]*pz+e[12],\n e[1]*px+e[5]*py+e[9]*pz+e[13],\n e[2]*px+e[6]*py+e[10]*pz+e[14]);\n }\n\n if (from===MATRIX && to===SCREEN) {\n const f=m.fromFrame;\n return _worldToScreen(out,f[0]*px+f[4]*py+f[8]*pz+f[12],\n f[1]*px+f[5]*py+f[9]*pz+f[13],\n f[2]*px+f[6]*py+f[10]*pz+f[14],_ensurePV(m),vp,ndcZMin);\n }\n if (from===SCREEN && to===MATRIX) {\n _screenToWorld(out,px,py,pz,m.mat4PVInv,vp,ndcZMin);\n return mat4MulPoint(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===NDC) {\n const f=m.fromFrame;\n return _worldToNDC(out,f[0]*px+f[4]*py+f[8]*pz+f[12],\n f[1]*px+f[5]*py+f[9]*pz+f[13],\n f[2]*px+f[6]*py+f[10]*pz+f[14],_ensurePV(m));\n }\n if (from===NDC && to===MATRIX) {\n _ndcToWorld(out,px,py,pz,m.mat4PVInv);\n return mat4MulPoint(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===MATRIX) {\n const f=m.fromFrame;\n return mat4MulPoint(out,m.toFrameInv,f[0]*px+f[4]*py+f[8]*pz+f[12],\n f[1]*px+f[5]*py+f[9]*pz+f[13],\n f[2]*px+f[6]*py+f[10]*pz+f[14]);\n }\n\n out[0]=px; out[1]=py; out[2]=pz;\n return out;\n}\n\n// ── Direction helpers ────────────────────────────────────────────────────\n//\n// Directions use only the linear 3×3 block — no translation, no w-divide.\n// The signed vp[2]/vp[3] carries the y-convention automatically.\n//\n\nfunction _applyDir(out, m, dx, dy, dz) {\n out[0]=m[0]*dx+m[4]*dy+m[8]*dz;\n out[1]=m[1]*dx+m[5]*dy+m[9]*dz;\n out[2]=m[2]*dx+m[6]*dy+m[10]*dz;\n return out;\n}\n\nfunction _worldToScreenDir(out, dx, dy, dz, proj, view, vpW, vpH, ndcZMin) {\n const vx=view[0]*dx+view[4]*dy+view[8]*dz,\n vy=view[1]*dx+view[5]*dy+view[9]*dz,\n vz=view[2]*dx+view[6]*dy+view[10]*dz;\n // vpH is signed — negative flips y component automatically.\n out[0]=(proj[0]*vx+proj[4]*vy+proj[8]*vz)*vpW*0.5;\n out[1]=(proj[1]*vx+proj[5]*vy+proj[9]*vz)*vpH*0.5;\n out[2]=(proj[2]*vx+proj[6]*vy+proj[10]*vz)*(1-ndcZMin)*0.5;\n return out;\n}\n\nfunction _screenToWorldDir(out, dx, dy, dz, proj, eye, vpW, vpH, ndcZMin) {\n // Inverse of _worldToScreenDir: undo the viewport scale, then the projection's\n // upper-triangular 3×3 block (p[8], p[9] carry an off-centre frustum), then\n // rotate eye→world. Signed vpW/vpH cancel the y-flip.\n const cz = dz/((1-ndcZMin)*0.5)/proj[10];\n const cy = (dy/(vpH*0.5) - proj[9]*cz)/proj[5];\n const cx = (dx/(vpW*0.5) - proj[8]*cz)/proj[0];\n return _applyDir(out, eye, cx, cy, cz);\n}\n\nfunction _screenToNDCDir(out, dx, dy, dz, vpW, vpH, ndcZMin) {\n out[0]=dx/(vpW*0.5); out[1]=dy/(vpH*0.5); out[2]=dz/((1-ndcZMin)*0.5);\n return out;\n}\n\nfunction _ndcToScreenDir(out, dx, dy, dz, vpW, vpH, ndcZMin) {\n out[0]=dx*vpW*0.5; out[1]=dy*vpH*0.5; out[2]=dz*(1-ndcZMin)*0.5;\n return out;\n}\n\n/**\n * Map a direction between named coordinate spaces.\n * Same bag and viewport contract as mapLocation.\n *\n * @param {number[]} out 3-element destination.\n * @param {number} dx,dy,dz Input direction.\n * @param {string} from Source space.\n * @param {string} to Destination space.\n * @param {object} m Matrices bag — see module header.\n * @param {number[]} vp Viewport [x, y, w, h]; sign of h encodes screen-y direction.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @returns {number[]} out\n */\nfunction mapDirection(out, dx, dy, dz, from, to, m, vp, ndcZMin) {\n const vpW=vp[2], vpH=vp[3]; // signed — carry y-convention through all helpers\n\n if (from===EYE && to===WORLD) return _applyDir(out,m.mat4Eye, dx,dy,dz);\n if (from===WORLD && to===EYE) return _applyDir(out,m.mat4View,dx,dy,dz);\n\n if (from===WORLD && to===SCREEN) return _worldToScreenDir(out,dx,dy,dz,m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n if (from===SCREEN && to===WORLD) return _screenToWorldDir(out,dx,dy,dz,m.mat4Proj,m.mat4Eye, vpW,vpH,ndcZMin);\n\n if (from===SCREEN && to===NDC) return _screenToNDCDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n if (from===NDC && to===SCREEN) return _ndcToScreenDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n\n if (from===WORLD && to===NDC) {\n _worldToScreenDir(out,dx,dy,dz,m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n return _screenToNDCDir(out,out[0],out[1],out[2],vpW,vpH,ndcZMin);\n }\n if (from===NDC && to===WORLD) {\n _ndcToScreenDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n return _screenToWorldDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n }\n\n if (from===EYE && to===SCREEN) {\n _applyDir(out,m.mat4Eye,dx,dy,dz);\n return _worldToScreenDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n }\n if (from===SCREEN && to===EYE) {\n _screenToWorldDir(out,dx,dy,dz,m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n return _applyDir(out,m.mat4View,out[0],out[1],out[2]);\n }\n\n if (from===EYE && to===NDC) {\n _applyDir(out,m.mat4Eye,dx,dy,dz);\n _worldToScreenDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n return _screenToNDCDir(out,out[0],out[1],out[2],vpW,vpH,ndcZMin);\n }\n if (from===NDC && to===EYE) {\n _ndcToScreenDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n _screenToWorldDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n return _applyDir(out,m.mat4View,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===WORLD) return _applyDir(out,m.fromFrame, dx,dy,dz);\n if (from===WORLD && to===MATRIX) return _applyDir(out,m.toFrameInv,dx,dy,dz);\n\n if (from===MATRIX && to===EYE) {\n _applyDir(out,m.fromFrame,dx,dy,dz);\n return _applyDir(out,m.mat4View,out[0],out[1],out[2]);\n }\n if (from===EYE && to===MATRIX) {\n _applyDir(out,m.mat4Eye,dx,dy,dz);\n return _applyDir(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===SCREEN) {\n _applyDir(out,m.fromFrame,dx,dy,dz);\n return _worldToScreenDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n }\n if (from===SCREEN && to===MATRIX) {\n _screenToWorldDir(out,dx,dy,dz,m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n return _applyDir(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===NDC) {\n _applyDir(out,m.fromFrame,dx,dy,dz);\n _worldToScreenDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n return _screenToNDCDir(out,out[0],out[1],out[2],vpW,vpH,ndcZMin);\n }\n if (from===NDC && to===MATRIX) {\n _ndcToScreenDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n _screenToWorldDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n return _applyDir(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===MATRIX) {\n _applyDir(out,m.fromFrame,dx,dy,dz);\n return _applyDir(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n out[0]=dx; out[1]=dy; out[2]=dz;\n return out;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Rays and pointer hits\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Screen point → world ray: origin on the near plane (screen depth 0), unit\n * direction toward the far plane (depth 1). Same bag and viewport contract as\n * mapLocation; `m.mat4PVInv` must be filled by the caller.\n *\n * @param {number[]} outO 3-element origin.\n * @param {number[]} outD 3-element unit direction.\n * @param {number} sx,sy Screen point.\n * @param {object} m Matrices bag — see module header.\n * @param {number[]} vp Viewport [x, y, w, h]; sign of h encodes screen-y direction.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @returns {number[]|null} outD, or null when the bag carries no mat4PVInv\n * (singular P·V) or the ray has no length.\n */\nfunction unproject(outO, outD, sx, sy, m, vp, ndcZMin) {\n const ipv = m.mat4PVInv;\n if (!ipv) return null;\n _screenToWorld(outO, sx, sy, 0, ipv, vp, ndcZMin);\n _screenToWorld(outD, sx, sy, 1, ipv, vp, ndcZMin);\n const dx=outD[0]-outO[0], dy=outD[1]-outO[1], dz=outD[2]-outO[2];\n const l=Math.sqrt(dx*dx+dy*dy+dz*dz);\n if (!(l > 0)) return null;\n outD[0]=dx/l; outD[1]=dy/l; outD[2]=dz/l;\n return outD;\n}\n\nconst _hit = [0, 0, 0]; // pointerHit screen scratch\n\n/**\n * Is the pointer within `radius` px of the projected world point (x, y, z)?\n * `shape` is CIRCLE (Euclidean, default) or SQUARE (Chebyshev); the boundary\n * hits. A point whose screen depth falls outside [0, 1] — behind the camera,\n * before the near plane or beyond the far plane — never hits.\n *\n * @param {number} px,py Pointer, screen px.\n * @param {number} x,y,z World point.\n * @param {number} radius Hit radius, px.\n * @param {object} m Matrices bag — see module header.\n * @param {number[]} vp Viewport [x, y, w, h]; sign of h encodes screen-y direction.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @param {number} [shape=CIRCLE] CIRCLE or SQUARE.\n * @returns {boolean}\n */\nfunction pointerHit(px, py, x, y, z, radius, m, vp, ndcZMin, shape = CIRCLE) {\n _worldToScreen(_hit, x, y, z, _ensurePV(m), vp, ndcZMin);\n const d = _hit[2];\n if (!(d >= 0 && d <= 1)) return false;\n const dx = px - _hit[0], dy = py - _hit[1];\n return shape === SQUARE\n ? Math.abs(dx) <= radius && Math.abs(dy) <= radius\n : dx*dx + dy*dy <= radius*radius;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// pixelRatio\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * World-units-per-pixel at a given eye-space Z depth.\n * @param {ArrayLike<number>} proj Projection mat4.\n * @param {number} vpH Viewport height in pixels (positive).\n * @param {number} eyeZ Eye-space Z — negative means in front of camera.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n */\nfunction pixelRatio(proj, vpH, eyeZ, ndcZMin) {\n return projIsOrtho(proj)\n ? Math.abs(projTop(proj,ndcZMin)-projBottom(proj,ndcZMin)) / vpH\n : 2*Math.abs(eyeZ)*Math.tan(projFov(proj)/2) / vpH;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Pick-matrix\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Mutate a projection matrix in-place so that the pixel at (px, py) maps to\n * the full NDC square — making a 1×1 FBO render contain exactly that pixel.\n *\n * Premultiplies by M_pick (column-major, rows 2 and 3 unchanged):\n *\n * ┌ sx 0 0 tx ┐ sx = |vp[2]|, sy = |vp[3]|\n * │ 0 sy 0 ty │ cx = ((px−vp[0])/vp[2])·2 − 1 (NDC x of pixel centre)\n * │ 0 0 1 0 │ cy = ((py−vp[1])/vp[3])·2 − 1 (NDC y, sign-aware)\n * └ 0 0 0 1 ┘ tx = −cx·sx, ty = −cy·sy\n *\n * Result: P_pick = M_pick · P_original.\n * The viewport sign convention (vp[3] < 0 for screen y-down) is preserved\n * automatically through cx/cy — no separate flip needed.\n *\n * @param {Float32Array} proj Projection mat4 — mutated in place.\n * @param {number} px Query pixel X in screen coordinates.\n * @param {number} py Query pixel Y in screen coordinates.\n * @param {number[]} vp Viewport [x, y, w, h]; same signed convention as mapLocation.\n */\nfunction mat4Pick(proj, px, py, vp) {\n const cx=((px-vp[0])/vp[2])*2-1;\n const cy=((py-vp[1])/vp[3])*2-1;\n const sx=Math.abs(vp[2]), sy=Math.abs(vp[3]);\n const tx=-cx*sx, ty=-cy*sy;\n for (let j=0; j<4; j++) {\n const a=proj[j*4], b=proj[j*4+1], d=proj[j*4+3];\n proj[j*4] = sx*a + tx*d;\n proj[j*4+1] = sy*b + ty*d;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Pick-id codec\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Pick id → colour: the 24-bit id packed into r, g, b as normalised floats,\n * R the low byte, alpha 1. Id 0 is the background; ids run 1 … 2²⁴ − 1.\n * @param {number[]} out 4-element destination.\n * @param {number} id Integer id.\n * @returns {number[]} out\n */\nfunction idToRgba(out, id) {\n out[0] = (id & 255) / 255;\n out[1] = ((id >> 8) & 255) / 255;\n out[2] = ((id >> 16) & 255) / 255;\n out[3] = 1;\n return out;\n}\n\n/**\n * Colour bytes → pick id, the inverse of idToRgba on a readback.\n * @param {number} r,g,b Bytes 0 … 255 (fractions truncated).\n * @returns {number} id\n */\nfunction rgbaToId(r, g, b) {\n return (r & 255) | ((g & 255) << 8) | ((b & 255) << 16);\n}\n\n// =========================================================================\n// Decomposition\n// =========================================================================\n\n/**\n * Extract translation from a column-major mat4 (column 3).\n * @param {Float32Array|number[]} out3 3-element destination.\n * @param {Float32Array|number[]} m 16-element source.\n */\nfunction mat4ToTranslation(out3, m) {\n out3[0]=m[12]; out3[1]=m[13]; out3[2]=m[14];\n return out3;\n}\n\n/**\n * Extract scale from a column-major mat4 (column lengths of the rotation block).\n * Assumes no shear.\n * @param {Float32Array|number[]} out3 3-element destination.\n * @param {Float32Array|number[]} m 16-element source.\n */\nfunction mat4ToScale(out3, m) {\n out3[0]=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);\n out3[1]=Math.sqrt(m[4]*m[4]+m[5]*m[5]+m[6]*m[6]);\n out3[2]=Math.sqrt(m[8]*m[8]+m[9]*m[9]+m[10]*m[10]);\n return out3;\n}\n\n/**\n * Extract rotation as a unit quaternion from a column-major mat4.\n * Scale is factored out from each column. Assumes no shear.\n * @param {number[]} out4 4-element [x,y,z,w] destination.\n * @param {Float32Array|number[]} m 16-element source.\n */\nfunction mat4ToRotation(out4, m) {\n const sx=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2])||1;\n const sy=Math.sqrt(m[4]*m[4]+m[5]*m[5]+m[6]*m[6])||1;\n const sz=Math.sqrt(m[8]*m[8]+m[9]*m[9]+m[10]*m[10])||1;\n return qFromRotMat3x3(out4,\n m[0]/sx, m[4]/sy, m[8]/sz,\n m[1]/sx, m[5]/sy, m[9]/sz,\n m[2]/sx, m[6]/sy, m[10]/sz);\n}\n\n/**\n * @file Spline math and keyframe animation state machines.\n * @module tree/track\n * @license AGPL-3.0-only\n *\n * Quaternion algebra is provided by quat.js; projection matrix construction\n * by form.js. Spline helpers (hermiteVec3, lerpVec3) and TRS↔mat4 conversions\n * (transformToMat4, mat4ToTransform) live here because they are tightly\n * coupled to the PoseTrack keyframe shape.\n *\n * Zero dependencies on p5, DOM, WebGL, or WebGPU.\n *\n * ── Exports ──────────────────────────────────────────────────────────────\n * Quaternion helpers (re-exported from quat.js)\n * qSet qCopy qDot qNormalize qNegate qMul qConjugate qRotateVec3\n * qSlerp qNlerp qFromUnitVectors qFromAxisAngle qFromLookDir\n * qFromRotMat3x3 qFromMat4 qToMat4 qToAxisAngle\n * Spline / vector helpers\n * hermiteVec3 lerpVec3\n * Transform / mat4 helpers\n * transformToMat4 mat4ToTransform\n * Tracks\n * PoseTrack — { pos, rot, scl } TRS keyframes\n * CameraTrack — { eye, center, up, fov?, halfHeight?, near, far }\n * lookat keyframes\n *\n * ── Public path access (all zero-alloc, no cursor side effects) ──────────\n * PoseTrack\n * samplePos (out) | (out, seg, t) vec3\n * mat4Model (out) | (out, seg, t) mat4 — TRS model\n * tangents (outIn, outOut, index) vec3 × 2 at keyframe\n * eval (out?) TRS object at cursor\n *\n * CameraTrack\n * sampleEye (out) | (out, seg, t) vec3\n * sampleCenter (out) | (out, seg, t) vec3\n * mat4Eye (out) | (out, seg, t) mat4 — lookat frame\n * eyeTangents (outIn, outOut, index) vec3 × 2 at keyframe\n * centerTangents (outIn, outOut, index) vec3 × 2 at keyframe\n * eval (out?) { eye, center, up,\n * fov, halfHeight,\n * near, far }\n *\n * Two arities for the continuous family:\n * (out) cursor form — reads track.seg / track.f. Useful when the\n * track's own transport is driving the animation.\n * (out, seg, t) explicit form — continuous (seg, t) coordinate, no cursor\n * side effects. seg ∈ [0, segments−1] integer, t ∈ [0, 1]\n * local to that segment. As a convenience, seg === segments\n * is accepted and rewritten to (segments−1, 1) — so the\n * idiom sampleX(out, i, 0) uniformly addresses keyframe i\n * for every i ∈ [0, keyframes.length−1].\n *\n * All honour the track's interpolation mode (hermite / linear / step) and\n * the same stored-tangent → centripetal-CR fallback chain that eval() uses.\n *\n * `tangents` / `eyeTangents` / `centerTangents` are keyframe-indexed — a\n * keyframe's incoming tangent belongs to the previous segment, outgoing to\n * the next. At boundary keyframes the missing side mirrors the present one\n * so drawing arrows at endpoints always yields a visible vector.\n *\n * Projection matrices are deliberately not exposed as a track method. Each\n * CameraTrack keyframe stores `fov` (perspective) or `halfHeight` (ortho)\n * directly on track.keyframes[i] — callers wanting a projection build one\n * with the free mat4Persp / mat4Ortho constructors. Animated fov in\n * sketches flows through the bridge's camera-binding via eval().fov and\n * eval().halfHeight (the bridge calls cam.perspective() / cam.ortho() each\n * frame).\n *\n * ── Class hierarchy ──────────────────────────────────────────────────────\n * Track (unexported, never instantiated directly)\n * └── PoseTrack (exported)\n * └── CameraTrack (exported)\n *\n * ── Hook architecture ────────────────────────────────────────────────────\n * Lib-space hooks (underscore prefix — host layer / UI layer):\n * _onActivate / _onDeactivate — fire on playing false→true / true→false.\n * _onPlay / _onEnd / _onStop — mirror the user-space hooks.\n *\n * User-space hooks:\n * onPlay : fires in play() on false→true transition.\n * onEnd : fires in tick() at natural boundary (once mode only).\n * onStop : fires in stop() / reset().\n *\n * Firing order:\n * play() → onPlay → _onPlay → _onActivate\n * tick() → onEnd → _onEnd → _onDeactivate\n * stop() → onStop → _onStop → _onDeactivate\n * reset() → onStop → _onStop → _onDeactivate\n *\n * ── Loop modes ───────────────────────────────────────────────────────────\n * loop:false, bounce:false — play once, stop at end (fires onEnd)\n * loop:true, bounce:false — repeat, wrap back to start\n * loop:true, bounce:true — bounce forever at boundaries\n * loop:false, bounce:true — bounce once: flip at far boundary, stop at origin\n *\n * ── Playback semantics (rate + _dir) ─────────────────────────────────────\n * rate > 0 forward rate < 0 backward rate === 0 frozen\n *\n * play() is the sole setter of playing = true.\n * stop() is the sole setter of playing = false.\n * Assigning rate never starts or stops playback.\n *\n * _dir (internal, ±1) tracks the current bounce travel direction.\n * tick() advances by rate * _dir and flips _dir at boundaries.\n * _dir is reset to 1 only in reset().\n *\n * ── One-keyframe behaviour ───────────────────────────────────────────────\n * play() with exactly one keyframe snaps eval() to that keyframe without\n * setting playing = true and without firing hooks.\n */\n\n\n// =========================================================================\n// S2 Spline / vector helpers\n// =========================================================================\n\nfunction _dist3(a, b) {\n const dx=a[0]-b[0], dy=a[1]-b[1], dz=a[2]-b[2];\n return Math.sqrt(dx*dx+dy*dy+dz*dz);\n}\n\n/**\n * Cubic Hermite interpolation between p0 and p1 with explicit tangents.\n * @param {number[]} out 3-element result.\n * @param {number[]} p0 Segment start.\n * @param {number[]} m0 Outgoing tangent at p0.\n * @param {number[]} p1 Segment end.\n * @param {number[]} m1 Incoming tangent at p1.\n * @param {number} t Blend [0, 1].\n * @returns {number[]} out\n */\nconst hermiteVec3 = (out, p0, m0, p1, m1, t) => {\n const t2=t*t, t3=t2*t;\n const h00=2*t3-3*t2+1, h10=t3-2*t2+t, h01=-2*t3+3*t2, h11=t3-t2;\n out[0]=h00*p0[0]+h10*m0[0]+h01*p1[0]+h11*m1[0];\n out[1]=h00*p0[1]+h10*m0[1]+h01*p1[1]+h11*m1[1];\n out[2]=h00*p0[2]+h10*m0[2]+h01*p1[2]+h11*m1[2];\n return out;\n};\n\n// Centripetal CR outgoing tangent at p1 for segment p1→p2.\n// Signature: (out, p0, p1, p2). Returns tangent AT p1 (the middle point).\nconst _crTanOut = (out, p0, p1, p2) => {\n const dt0=Math.pow(_dist3(p0,p1),0.5)||1, dt1=Math.pow(_dist3(p1,p2),0.5)||1;\n for (let i=0;i<3;i++) out[i]=((p1[i]-p0[i])/dt0-(p2[i]-p0[i])/(dt0+dt1)+(p2[i]-p1[i])/dt1)*dt1;\n return out;\n};\n\n// Centripetal CR incoming tangent at p2 for segment p1→p2.\n// Signature: (out, p1, p2, p3). Returns tangent AT p2 (the middle point).\nconst _crTanIn = (out, p1, p2, p3) => {\n const dt1=Math.pow(_dist3(p1,p2),0.5)||1, dt2=Math.pow(_dist3(p2,p3),0.5)||1;\n for (let i=0;i<3;i++) out[i]=((p2[i]-p1[i])/dt1-(p3[i]-p1[i])/(dt1+dt2)+(p3[i]-p2[i])/dt2)*dt1;\n return out;\n};\n\n// Module-level scratch — shared across track instances (non-reentrant hot path).\nconst _m0=[0,0,0], _m1=[0,0,0];\nconst _trsScratch = { pos:[0,0,0], rot:[0,0,0,1], scl:[1,1,1] };\nconst _eyeScratch = { eye:[0,0,0], center:[0,0,0], up:[0,1,0] };\n\n/**\n * Linear interpolation between two vec3s.\n */\nconst lerpVec3 = (out, a, b, t) => {\n out[0]=a[0]+t*(b[0]-a[0]);\n out[1]=a[1]+t*(b[1]-a[1]);\n out[2]=a[2]+t*(b[2]-a[2]);\n return out;\n};\n\n// =========================================================================\n// S2b Path samplers — shared core\n// =========================================================================\n\n/** @private — sample interpolated vec3 path at (seg, t) into out. */\nfunction _samplePathCore(out, kfs, interp, field, tanInName, tanOutName, seg, t) {\n const n = kfs.length;\n if (n === 0) { out[0]=0; out[1]=0; out[2]=0; return out; }\n if (n === 1) {\n const p = kfs[0][field];\n out[0]=p[0]; out[1]=p[1]; out[2]=p[2];\n return out;\n }\n const nSeg = n - 1;\n seg = seg | 0;\n if (seg >= nSeg) { seg = nSeg - 1; t = 1; }\n else if (seg < 0) { seg = 0; t = 0; }\n t = _clamp01(t);\n const k0 = kfs[seg];\n const k1 = kfs[seg + 1];\n\n if (interp === 'step') {\n const p = k0[field];\n out[0]=p[0]; out[1]=p[1]; out[2]=p[2];\n return out;\n }\n if (interp === 'linear') {\n return lerpVec3(out, k0[field], k1[field], t);\n }\n\n const p0 = seg > 0 ? kfs[seg - 1][field] : k0[field];\n const p3 = seg + 2 < n ? kfs[seg + 2][field] : k1[field];\n const m0 = k0[tanOutName] != null ? k0[tanOutName]\n : k0[tanInName] != null ? k0[tanInName]\n : _crTanOut(_m0, p0, k0[field], k1[field]);\n const m1 = k1[tanInName] != null ? k1[tanInName]\n : k1[tanOutName] != null ? k1[tanOutName]\n : _crTanIn(_m1, k0[field], k1[field], p3);\n return hermiteVec3(out, k0[field], m0, k1[field], m1, t);\n}\n\n/** @private — write effective in/out tangents at keyframe i. */\nfunction _sampleTangentsCore(outIn, outOut, kfs, field, tanInName, tanOutName, i) {\n const n = kfs.length;\n if (n === 0) {\n outIn[0]=outIn[1]=outIn[2]=0; outOut[0]=outOut[1]=outOut[2]=0;\n return;\n }\n i = _clampS(i | 0, 0, n - 1);\n const ki = kfs[i];\n const hasTI = ki[tanInName] != null;\n const hasTO = ki[tanOutName] != null;\n\n if (hasTO) {\n outOut[0]=ki[tanOutName][0]; outOut[1]=ki[tanOutName][1]; outOut[2]=ki[tanOutName][2];\n } else if (hasTI) {\n outOut[0]=ki[tanInName][0]; outOut[1]=ki[tanInName][1]; outOut[2]=ki[tanInName][2];\n } else if (i < n - 1) {\n const k1 = kfs[i + 1];\n const p0 = i > 0 ? kfs[i - 1][field] : ki[field];\n _crTanOut(outOut, p0, ki[field], k1[field]);\n } else {\n outOut[0]=0; outOut[1]=0; outOut[2]=0;\n }\n\n if (hasTI) {\n outIn[0]=ki[tanInName][0]; outIn[1]=ki[tanInName][1]; outIn[2]=ki[tanInName][2];\n } else if (hasTO) {\n outIn[0]=ki[tanOutName][0]; outIn[1]=ki[tanOutName][1]; outIn[2]=ki[tanOutName][2];\n } else if (i > 0) {\n const k0 = kfs[i - 1];\n const p3 = i + 1 < n ? kfs[i + 1][field] : ki[field];\n _crTanIn(outIn, k0[field], ki[field], p3);\n } else {\n outIn[0]=outOut[0]; outIn[1]=outOut[1]; outIn[2]=outOut[2];\n }\n\n if (i === n - 1 && !hasTO && !hasTI) {\n outOut[0]=outIn[0]; outOut[1]=outIn[1]; outOut[2]=outIn[2];\n }\n}\n\n// =========================================================================\n// S3 Transform <-> Mat4\n// =========================================================================\n\n/**\n * Write a TRS transform into a column-major mat4.\n */\nconst transformToMat4 = (out, xform) => {\n qToMat4(out, xform.rot);\n const sx=xform.scl[0], sy=xform.scl[1], sz=xform.scl[2];\n out[0]*=sx; out[1]*=sx; out[2]*=sx;\n out[4]*=sy; out[5]*=sy; out[6]*=sy;\n out[8]*=sz; out[9]*=sz; out[10]*=sz;\n out[12]=xform.pos[0]; out[13]=xform.pos[1]; out[14]=xform.pos[2];\n return out;\n};\n\n/**\n * Decompose a column-major mat4 into a TRS transform.\n */\nconst mat4ToTransform = (out, m) => {\n out.pos[0]=m[12]; out.pos[1]=m[13]; out.pos[2]=m[14];\n const sx=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);\n const sy=Math.sqrt(m[4]*m[4]+m[5]*m[5]+m[6]*m[6]);\n const sz=Math.sqrt(m[8]*m[8]+m[9]*m[9]+m[10]*m[10]);\n out.scl[0]=sx; out.scl[1]=sy; out.scl[2]=sz;\n qFromRotMat3x3(out.rot,\n m[0]/sx,m[4]/sy,m[8]/sz,\n m[1]/sx,m[5]/sy,m[9]/sz,\n m[2]/sx,m[6]/sy,m[10]/sz);\n return out;\n};\n\n// =========================================================================\n// S4a Spec parser — PoseTrack\n// =========================================================================\n\nconst _isNum$1 = (x) => typeof x === 'number' && Number.isFinite(x);\nconst _clamp01 = (x) => x < 0 ? 0 : (x > 1 ? 1 : x);\nconst _clampS = (x, lo, hi) => x < lo ? lo : (x > hi ? hi : x);\n\nfunction _parseVec3(v) {\n if (!v) return null;\n if (ArrayBuffer.isView(v) && v.length >= 3) return [v[0], v[1], v[2]];\n if (Array.isArray(v) && v.length >= 3 && v.every(n => typeof n === 'number')) return [v[0], v[1], v[2]];\n if (typeof v === 'object' && 'x' in v) return [v.x || 0, v.y || 0, v.z || 0];\n return null;\n}\n\nconst _EULER_AXES = { X:[1,0,0], Y:[0,1,0], Z:[0,0,1] };\nconst _EULER_ORDERS = new Set(['XYZ','XZY','YXZ','YZX','ZXY','ZYX']);\n\n/**\n * Parse any rotation representation into a unit quaternion [x,y,z,w].\n *\n * Accepted forms:\n * [x,y,z,w] — raw quaternion array\n * { axis:[x,y,z], angle } — axis-angle (angle in radians)\n * { dir:[x,y,z], up?:[x,y,z] } — forward direction (−Z) with optional up\n * { mat4Eye: mat4 } — rotation block of an eye matrix\n * { mat3: mat3 } — column-major 3×3 rotation matrix\n * { euler:[rx,ry,rz], order? } — intrinsic Euler (default order: YXZ)\n * { from:[x,y,z], to:[x,y,z] } — shortest-arc rotation between two vectors\n *\n * @param {*} v\n * @returns {number[]|null} [x,y,z,w] or null if unparseable.\n */\nfunction _parseQuat(v) {\n if (!v) return null;\n\n // [x,y,z,w] — normalised like every other form\n if (Array.isArray(v) && v.length === 4) return qNormalize([v[0],v[1],v[2],v[3]]);\n if (ArrayBuffer.isView(v) && v.length >= 4) return qNormalize([v[0],v[1],v[2],v[3]]);\n\n if (typeof v !== 'object') return null;\n\n // { axis, angle }\n if (v.axis != null && v.angle != null) {\n const ax = Array.isArray(v.axis) ? v.axis : [v.axis.x||0, v.axis.y||0, v.axis.z||0];\n return qFromAxisAngle([0,0,0,1], ax[0],ax[1],ax[2], v.angle);\n }\n\n // { dir, up? }\n if (v.dir != null) {\n const d = Array.isArray(v.dir) ? v.dir : [v.dir.x||0, v.dir.y||0, v.dir.z||0];\n const u = v.up ? (Array.isArray(v.up) ? v.up : [v.up.x||0, v.up.y||0, v.up.z||0]) : null;\n return qFromLookDir([0,0,0,1], d, u);\n }\n\n // { mat4Eye }\n if (v.mat4Eye != null) {\n const m = (ArrayBuffer.isView(v.mat4Eye) || Array.isArray(v.mat4Eye))\n ? v.mat4Eye : (v.mat4Eye.mat4 ?? null);\n if (!m || m.length < 16) return null;\n return qFromRotMat3x3([0,0,0,1], m[0],m[4],m[8], m[1],m[5],m[9], m[2],m[6],m[10]);\n }\n\n // { mat3 }\n if (v.mat3 != null) {\n const m = (ArrayBuffer.isView(v.mat3) || Array.isArray(v.mat3)) ? v.mat3 : null;\n if (!m || m.length < 9) return null;\n return qFromRotMat3x3([0,0,0,1], m[0],m[3],m[6], m[1],m[4],m[7], m[2],m[5],m[8]);\n }\n\n // { euler, order? }\n if (v.euler != null) {\n const e = v.euler;\n if (!Array.isArray(e) || e.length < 3) return null;\n const order = (v.order && _EULER_ORDERS.has(v.order)) ? v.order : 'YXZ';\n const q = [0,0,0,1], s = [0,0,0,1];\n for (let i = 0; i < 3; i++) {\n const ax = _EULER_AXES[order[i]];\n qMul(q, q, qFromAxisAngle(s, ax[0],ax[1],ax[2], e[i]));\n }\n return q;\n }\n\n // { from, to }\n if (v.from != null && v.to != null) {\n const f = Array.isArray(v.from) ? v.from : [v.from.x||0, v.from.y||0, v.from.z||0];\n const t = Array.isArray(v.to) ? v.to : [v.to.x||0, v.to.y||0, v.to.z||0];\n const fl = Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]) || 1;\n const tl = Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]) || 1;\n const fx=f[0]/fl, fy=f[1]/fl, fz=f[2]/fl;\n const tx=t[0]/tl, ty=t[1]/tl, tz=t[2]/tl;\n const dot = fx*tx + fy*ty + fz*tz;\n if (dot >= 1 - 1e-8) return [0,0,0,1];\n if (dot <= -1 + 1e-8) {\n let px=0, py=fz, pz=-fy;\n let pl = Math.sqrt(px*px+py*py+pz*pz);\n if (pl < 1e-8) { px=fy; py=-fx; pz=0; pl = Math.sqrt(px*px+py*py+pz*pz); }\n if (pl < 1e-8) return [0,0,0,1];\n return qFromAxisAngle([0,0,0,1], px/pl,py/pl,pz/pl, Math.PI);\n }\n let ax=fy*tz-fz*ty, ay=fz*tx-fx*tz, az=fx*ty-fy*tx;\n const al = Math.sqrt(ax*ax+ay*ay+az*az) || 1;\n return qFromAxisAngle([0,0,0,1], ax/al,ay/al,az/al,\n Math.acos(Math.max(-1, Math.min(1, dot))));\n }\n\n return null;\n}\n\n/**\n * Parse a PoseTrack keyframe spec into internal form.\n *\n * Accepted forms:\n * { mat4Model }\n * Decompose a column-major mat4 into TRS via mat4ToTransform.\n * Float32Array(16), plain Array, or { mat4 } wrapper.\n *\n * { pos?, rot?, scl?, tanIn?, tanOut? }\n * Explicit TRS. pos and scl are vec3; rot accepts any form from _parseQuat.\n * All fields are optional — missing pos/scl default to [0,0,0] / [1,1,1],\n * missing rot defaults to identity.\n * tanIn/tanOut are optional vec3 tangents for Hermite interpolation.\n *\n * @param {Object} spec\n * @returns {{ pos:number[], rot:number[], scl:number[],\n * tanIn:number[]|null, tanOut:number[]|null } | null}\n */\nfunction _parseSpec(spec) {\n if (!spec || typeof spec !== 'object') return null;\n\n // { mat4Model } — full TRS decomposition from model matrix\n if (spec.mat4Model != null) {\n const m = (ArrayBuffer.isView(spec.mat4Model) || Array.isArray(spec.mat4Model))\n ? spec.mat4Model : (spec.mat4Model.mat4 ?? null);\n if (!m || m.length < 16) return null;\n const kf = mat4ToTransform({ pos:[0,0,0], rot:[0,0,0,1], scl:[1,1,1] }, m);\n kf.tanIn = null; kf.tanOut = null;\n return kf;\n }\n\n // { pos?, rot?, scl?, tanIn?, tanOut? } — explicit TRS\n const pos = _parseVec3(spec.pos) || [0,0,0];\n const rot = _parseQuat(spec.rot) || [0,0,0,1];\n const scl = _parseVec3(spec.scl) || [1,1,1];\n const tanIn = _parseVec3(spec.tanIn) || null;\n const tanOut = _parseVec3(spec.tanOut) || null;\n return { pos, rot, scl, tanIn, tanOut };\n}\n\nfunction _sameTransform(a, b) {\n for (let i=0;i<3;i++) if (a.pos[i]!==b.pos[i]||a.scl[i]!==b.scl[i]) return false;\n for (let i=0;i<4;i++) if (a.rot[i]!==b.rot[i]) return false;\n return true;\n}\n\n// =========================================================================\n// S4b Spec parser — CameraTrack\n// =========================================================================\n\n// Lens defaults used when a spec omits near/far. Match the three.js /\n// Bevy conventions and are safe for typical p5 v2 scene scales.\nconst _DEFAULT_NEAR = 0.1;\nconst _DEFAULT_FAR = 1000;\n\n/**\n * Parse a CameraTrack keyframe spec into internal form.\n *\n * Required: eye (vec3). Everything else is optional.\n * center defaults to [0, 0, 0]\n * up defaults to [0, 1, 0] and is normalised\n * fov vertical fov (radians), perspective only — null if absent\n * halfHeight world-unit half-height of ortho frustum — null if absent\n * near near clip distance (positive) — defaults to 0.1\n * far far clip distance (positive) — defaults to 1000\n * eyeTanIn/Out optional Hermite tangents for the eye path\n * centerTanIn/Out optional Hermite tangents for the center path\n *\n * fov and halfHeight are mutually exclusive (perspective xor ortho) and\n * therefore left nullable; eval() lerps each only when both adjacent\n * keyframes carry a non-null value, passing null through otherwise.\n *\n * near and far are always meaningful regardless of projection type, so\n * they receive real defaults and are linearly interpolated unconditionally.\n *\n * @param {Object} spec\n * @returns {Object|null} Parsed keyframe or null if eye is missing/malformed.\n */\nfunction _parseCameraSpec(spec) {\n if (!spec || typeof spec !== 'object') return null;\n const eye = _parseVec3(spec.eye);\n if (!eye) return null;\n const center = _parseVec3(spec.center) || [0,0,0];\n const upRaw = spec.up ? _parseVec3(spec.up) : null;\n const up = upRaw || [0,1,0];\n const ul = Math.sqrt(up[0]*up[0]+up[1]*up[1]+up[2]*up[2]) || 1;\n return {\n eye, center,\n up: [up[0]/ul, up[1]/ul, up[2]/ul],\n fov: typeof spec.fov === 'number' ? spec.fov : null,\n halfHeight: typeof spec.halfHeight === 'number' ? spec.halfHeight : null,\n near: typeof spec.near === 'number' ? spec.near : _DEFAULT_NEAR,\n far: typeof spec.far === 'number' ? spec.far : _DEFAULT_FAR,\n eyeTanIn: _parseVec3(spec.eyeTanIn) || null,\n eyeTanOut: _parseVec3(spec.eyeTanOut) || null,\n centerTanIn: _parseVec3(spec.centerTanIn) || null,\n centerTanOut: _parseVec3(spec.centerTanOut)|| null,\n };\n}\n\nfunction _sameCameraKeyframe(a, b) {\n for (let i=0;i<3;i++) {\n if (a.eye[i]!==b.eye[i]) return false;\n if (a.center[i]!==b.center[i]) return false;\n if (a.up[i]!==b.up[i]) return false;\n }\n if (a.fov !== b.fov) return false;\n if (a.halfHeight !== b.halfHeight) return false;\n if (a.near !== b.near) return false;\n if (a.far !== b.far) return false;\n return true;\n}\n\n// =========================================================================\n// S5 Track — unexported base class (transport machinery only)\n// =========================================================================\n\nclass Track {\n constructor() {\n /** @type {Array} Keyframe array — shape depends on subclass. */\n this.keyframes = [];\n /** Whether playback is currently active. @type {boolean} */\n this.playing = false;\n /** Loop at boundaries. @type {boolean} */\n this.loop = false;\n /** Ping-pong bounce at boundaries (independent of loop). @type {boolean} */\n this.bounce = false;\n /** Frames per segment (≥1). @type {number} */\n this.duration = 30;\n /** Current segment index. @type {number} */\n this.seg = 0;\n /** Frame offset within current segment (can be fractional). @type {number} */\n this.f = 0;\n\n // Playback rate (signed: negative = reverse; 0 = frozen).\n this._rate = 1;\n // Current bounce travel direction (±1). Reset to 1 only on reset().\n this._dir = 1;\n // Whether a bounce-once has already flipped direction.\n this._bounced = false;\n\n /** User hook: fires on play() false→true transition. @type {Function|null} */\n this.onPlay = null;\n /** User hook: fires on natural boundary in once mode. @type {Function|null} */\n this.onEnd = null;\n /** User hook: fires on stop() / reset() / end-of-bounce-once. @type {Function|null} */\n this.onStop = null;\n\n // Lib-space hooks (underscore prefix — host layer / UI layer only).\n this._onActivate = null; this._onDeactivate = null;\n this._onPlay = null; this._onEnd = null; this._onStop = null;\n }\n\n /** Playback rate. Signed: negative reverses, 0 freezes. Assigning never starts or stops playback. @type {number} */\n get rate() { return this._rate; }\n set rate(v) { this._rate = (_isNum$1(v)) ? v : 1; }\n\n /** Number of interpolatable segments (keyframes.length − 1, min 0). @type {number} */\n get segments() { return Math.max(0, this.keyframes.length - 1); }\n\n /**\n * @private — resolve cursor (seg, f) into continuous (seg, t).\n * Shared backing of every cursor-form sampler / matrix method.\n */\n _cursorSegT() {\n const nSeg = this.segments;\n const dur = Math.max(1, this.duration | 0);\n const seg = nSeg > 0 ? _clampS(this.seg, 0, nSeg - 1) : 0;\n const t = _clamp01(this.f / dur);\n return [seg, t];\n }\n\n /**\n * Start or update playback. Sole setter of `playing = true`.\n *\n * Fires `onPlay → _onPlay → _onActivate` only on a false→true transition.\n * Zero keyframes: no-op. Exactly one keyframe: snaps eval() to it but does\n * not set `playing` and fires no hooks.\n *\n * @param {number|{duration?:number,loop?:boolean,bounce?:boolean,\n * rate?:number,onPlay?:Function,onEnd?:Function,\n * onStop?:Function}} [rateOrOpts]\n * A bare number is taken as `rate`; an object configures multiple\n * fields in one call.\n * @returns {Track} this\n */\n play(rateOrOpts) {\n if (this.keyframes.length === 0) return this;\n if (this.keyframes.length === 1) { this.seg = 0; this.f = 0; return this; }\n\n if (typeof rateOrOpts === 'number' && Number.isFinite(rateOrOpts)) {\n this._rate = rateOrOpts;\n } else if (rateOrOpts && typeof rateOrOpts === 'object') {\n const o = rateOrOpts;\n if (_isNum$1(o.duration)) this.duration = Math.max(1, o.duration | 0);\n if ('loop' in o) this.loop = !!o.loop;\n if ('bounce' in o) this.bounce = !!o.bounce;\n if (typeof o.onPlay === 'function') this.onPlay = o.onPlay;\n if (typeof o.onEnd === 'function') this.onEnd = o.onEnd;\n if (typeof o.onStop === 'function') this.onStop = o.onStop;\n if (_isNum$1(o.rate)) this._rate = o.rate;\n }\n\n const nSeg = this.segments, dur = Math.max(1, this.duration | 0);\n if (this.seg < 0) this.seg = 0;\n if (this.seg >= nSeg) this.seg = nSeg - 1;\n if (this.f < 0) this.f = 0;\n if (this.f > dur) this.f = dur;\n\n const wasPlaying = this.playing;\n this.playing = true;\n if (!wasPlaying) {\n this._bounced = false;\n if (typeof this.onPlay === 'function') { try { this.onPlay(this); } catch (_) {} }\n this._onPlay?.();\n this._onActivate?.();\n }\n return this;\n }\n\n /**\n * Stop playback. Sole setter of `playing = false`. Fires\n * `onStop → _onStop → _onDeactivate` on a true→false transition.\n *\n * @param {boolean} [rewind] If true, seek to the origin end after stopping\n * (0 when playing forward, 1 when playing backward).\n * @returns {Track} this\n */\n stop(rewind) {\n const wasPlaying = this.playing;\n this.playing = false;\n if (wasPlaying) {\n this._bounced = false;\n if (typeof this.onStop === 'function') { try { this.onStop(this); } catch (_) {} }\n this._onStop?.();\n this._onDeactivate?.();\n if (rewind && this.keyframes.length > 1) this.seek(this._rate * this._dir < 0 ? 1 : 0);\n }\n return this;\n }\n\n /**\n * Clear all keyframes and stop. Fires stop-side hooks if it was playing.\n * Unlike stop(), this also resets `_dir` to +1.\n * @returns {Track} this\n */\n reset() {\n const wasPlaying = this.playing;\n this.playing = false;\n if (wasPlaying) {\n if (typeof this.onStop === 'function') { try { this.onStop(this); } catch (_) {} }\n this._onStop?.();\n this._onDeactivate?.();\n }\n this.keyframes.length = 0;\n this.seg = 0; this.f = 0; this._dir = 1; this._bounced = false;\n return this;\n }\n\n /**\n * Remove the keyframe at `index`. Adjusts the cursor if the removal shrinks\n * the track below the current segment.\n * @param {number} index\n * @returns {boolean} true if removed; false if index was invalid.\n */\n remove(index) {\n if (!_isNum$1(index)) return false;\n const i = index | 0;\n if (i < 0 || i >= this.keyframes.length) return false;\n this.keyframes.splice(i, 1);\n const nSeg = this.segments;\n if (nSeg === 0) { this.seg = 0; this.f = 0; }\n else if (this.seg >= nSeg) { this.seg = nSeg - 1; }\n return true;\n }\n\n /**\n * Move the cursor.\n * seek(t) Scrub to normalised position t ∈ [0, 1] across the\n * whole track.\n * seek(t, segIndex) Position within a specific segment — t is local to\n * that segment.\n * Does not affect `playing`.\n *\n * @param {number} t\n * @param {number} [segIndex]\n * @returns {Track} this\n */\n seek(t, segIndex) {\n const nSeg = this.segments;\n if (nSeg === 0) { this.seg = 0; this.f = 0; return this; }\n const dur = Math.max(1, this.duration | 0);\n if (_isNum$1(segIndex)) {\n this.seg = _clampS(segIndex | 0, 0, nSeg - 1);\n this.f = _clamp01(t) * dur;\n } else {\n this._setCursorFromScalar(_clamp01(t) * nSeg * dur);\n }\n return this;\n }\n\n /**\n * Normalised cursor position across the whole track.\n * @returns {number} ∈ [0, 1]; 0 when there are no segments.\n */\n time() {\n const nSeg = this.segments;\n if (nSeg === 0) return 0;\n const dur = Math.max(1, this.duration | 0);\n return _clamp01((this.seg * dur + this.f) / (nSeg * dur));\n }\n\n /**\n * Snapshot of transport state. Allocates a new object per call — intended\n * for UI / debugging, not hot loops.\n * @returns {{keyframes:number, segments:number, seg:number, f:number,\n * playing:boolean, loop:boolean, bounce:boolean, rate:number,\n * duration:number, time:number}}\n */\n info() {\n return {\n keyframes: this.keyframes.length,\n segments: this.segments,\n seg: this.seg,\n f: this.f,\n playing: this.playing,\n loop: this.loop,\n bounce: this.bounce,\n rate: this._rate,\n duration: this.duration,\n time: this.segments > 0 ? this.time() : 0\n };\n }\n\n /**\n * Advance the cursor by `rate * _dir` in frames. Handles loop / bounce /\n * once modes per the table in the module header. Fires `onEnd → _onEnd →\n * _onDeactivate` at a natural boundary in once mode.\n *\n * Intended to be called once per animation frame by the bridge / UI layer.\n * rate === 0 freezes the cursor but keeps `playing` unchanged.\n *\n * @returns {boolean} Current `playing` state after advancing.\n */\n tick() {\n if (!this.playing) return false;\n const nSeg = this.segments;\n if (nSeg === 0) { this.playing = false; this._onDeactivate?.(); return false; }\n if (this._rate === 0) return true;\n\n const dur = Math.max(1, this.duration | 0);\n const total = nSeg * dur;\n const s = _clampS(this.seg * dur + this.f, 0, total);\n const next = s + this._rate * this._dir;\n\n if (this.loop && this.bounce) {\n let pos = next, flips = 0;\n while (pos < 0 || pos > total) {\n if (pos < 0) { pos = -pos; flips++; }\n else { pos = 2 * total - pos; flips++; }\n }\n if (flips & 1) this._dir = -this._dir;\n this._setCursorFromScalar(pos);\n return true;\n }\n\n if (!this.loop && this.bounce) {\n if (next >= total) {\n this._setCursorFromScalar(Math.min(total, 2 * total - next));\n this._dir = -this._dir;\n this._bounced = true;\n return true;\n }\n if (next <= 0) {\n this._setCursorFromScalar(0);\n this.playing = false;\n this._dir = 1; this._bounced = false;\n if (typeof this.onEnd === 'function') { try { this.onEnd(this); } catch (_) {} }\n this._onEnd?.();\n this._onDeactivate?.();\n return false;\n }\n this._setCursorFromScalar(next);\n return true;\n }\n\n if (this.loop) {\n this._setCursorFromScalar(((next % total) + total) % total);\n return true;\n }\n\n if (next <= 0) {\n this._setCursorFromScalar(0);\n this.playing = false;\n if (typeof this.onEnd === 'function') { try { this.onEnd(this); } catch (_) {} }\n this._onEnd?.();\n this._onDeactivate?.();\n return false;\n }\n if (next >= total) {\n this._setCursorFromScalar(total);\n this.playing = false;\n if (typeof this.onEnd === 'function') { try { this.onEnd(this); } catch (_) {} }\n this._onEnd?.();\n this._onDeactivate?.();\n return false;\n }\n\n this._setCursorFromScalar(next);\n return true;\n }\n\n /** @private */\n _setCursorFromScalar(s) {\n const dur = Math.max(1, this.duration | 0);\n const nSeg = this.segments;\n this.seg = Math.floor(s / dur);\n this.f = s - this.seg * dur;\n if (this.seg >= nSeg) { this.seg = nSeg - 1; this.f = dur; }\n if (this.seg < 0) { this.seg = 0; this.f = 0; }\n }\n}\n\n// =========================================================================\n// S6 PoseTrack\n// =========================================================================\n\n/**\n * Renderer-agnostic TRS keyframe track.\n *\n * Keyframe shape: { pos:[x,y,z], rot:[x,y,z,w], scl:[x,y,z],\n * tanIn?:[x,y,z], tanOut?:[x,y,z] }\n *\n * tanIn — incoming position tangent at this keyframe (Hermite mode).\n * tanOut — outgoing position tangent at this keyframe (Hermite mode).\n * When only one is supplied, the other mirrors it at sample time.\n * When neither is supplied, centripetal Catmull-Rom tangents are auto-computed.\n */\nclass PoseTrack extends Track {\n constructor() {\n super();\n /**\n * Position interpolation mode.\n * - 'hermite' — cubic Hermite; auto-computes centripetal Catmull-Rom\n * tangents when none are stored (default)\n * - 'linear' — lerp\n * - 'step' — snap to k0; useful for discrete state changes\n * @type {'hermite'|'linear'|'step'}\n */\n this.posInterp = 'hermite';\n /**\n * Rotation interpolation mode.\n * - 'slerp' — constant angular velocity (default)\n * - 'nlerp' — normalised lerp; cheaper, slightly non-constant speed\n * - 'step' — snap to k0 quaternion\n * @type {'slerp'|'nlerp'|'step'}\n */\n this.rotInterp = 'slerp';\n }\n\n /**\n * Append one or more keyframes. Adjacent duplicates are skipped by default.\n * Accepts any spec form understood by _parseSpec, or an array of them.\n * @param {Object|Object[]} spec\n * @param {{ deduplicate?: boolean }} [opts]\n */\n add(spec, opts) {\n if (Array.isArray(spec)) { for (const s of spec) this.add(s, opts); return; }\n const kf = _parseSpec(spec);\n if (!kf) return;\n const dedup = !opts || opts.deduplicate !== false;\n if (dedup && this.keyframes.length > 0) {\n if (_sameTransform(this.keyframes[this.keyframes.length - 1], kf)) return;\n }\n this.keyframes.push(kf);\n }\n\n /**\n * Replace the keyframe at `index`, or append at the end if `index` equals\n * the current keyframe count.\n * @param {number} index\n * @param {Object} spec Any spec form understood by _parseSpec.\n * @returns {boolean} true on success; false for invalid index or spec.\n */\n set(index, spec) {\n if (!_isNum$1(index)) return false;\n const i = index | 0, kf = _parseSpec(spec);\n if (!kf || i < 0 || i > this.keyframes.length) return false;\n if (i === this.keyframes.length) this.keyframes.push(kf);\n else this.keyframes[i] = kf;\n return true;\n }\n\n /**\n * Sample the position path. Zero-alloc, no cursor side effects. Honours\n * posInterp and the stored-tangent → auto-CR fallback chain.\n *\n * Two signatures:\n * samplePos(out) cursor form — reads current seg/f\n * samplePos(out, seg, t) explicit (seg, t), continuous on the path\n *\n * @param {number[]} out 3-element result buffer.\n * @param {number} [seg] Segment index in [0, segments−1]. Omit for cursor.\n * @param {number} [t] Local parameter in [0, 1]. Omit for cursor.\n * @returns {number[]} out\n */\n samplePos(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n return _samplePathCore(out, this.keyframes, this.posInterp, 'pos', 'tanIn', 'tanOut', seg, t);\n }\n\n /**\n * Write the TRS pose as a column-major model mat4. Zero-alloc, no cursor\n * side effects.\n *\n * Two signatures:\n * mat4Model(out) cursor form — reads current seg/f\n * mat4Model(out, seg, t) explicit (seg, t), continuous on the path\n *\n * Replaces the previous toMatrix() method.\n *\n * @param {Float32Array|number[]} out 16-element result buffer.\n * @param {number} [seg] Segment index in [0, segments−1]. Omit for cursor.\n * @param {number} [t] Local parameter in [0, 1]. Omit for cursor.\n * @returns {Float32Array|number[]} out\n */\n mat4Model(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n this._sampleTRS(_trsScratch, seg, t);\n return transformToMat4(out, _trsScratch);\n }\n\n /**\n * Effective incoming / outgoing position tangents at keyframe `index`.\n * Stored tanIn/tanOut take precedence; each mirrors the other when only\n * one is stored; else centripetal Catmull-Rom tangents are auto-computed\n * from neighbours. Boundary keyframes mirror across the missing side.\n *\n * @param {number[]} outIn 3-element result — incoming tangent.\n * @param {number[]} outOut 3-element result — outgoing tangent.\n * @param {number} index Keyframe index.\n * @returns {PoseTrack} this\n */\n tangents(outIn, outOut, index) {\n _sampleTangentsCore(outIn, outOut, this.keyframes, 'pos', 'tanIn', 'tanOut', index);\n return this;\n }\n\n /** @private — write interpolated TRS at (seg, t). */\n _sampleTRS(out, seg, t) {\n const n = this.keyframes.length;\n if (n === 0) return out;\n if (n === 1) {\n const k = this.keyframes[0];\n out.pos[0]=k.pos[0]; out.pos[1]=k.pos[1]; out.pos[2]=k.pos[2];\n out.rot[0]=k.rot[0]; out.rot[1]=k.rot[1]; out.rot[2]=k.rot[2]; out.rot[3]=k.rot[3];\n out.scl[0]=k.scl[0]; out.scl[1]=k.scl[1]; out.scl[2]=k.scl[2];\n return out;\n }\n const nSeg = n - 1;\n seg = seg | 0;\n if (seg >= nSeg) { seg = nSeg - 1; t = 1; }\n else if (seg < 0) { seg = 0; t = 0; }\n t = _clamp01(t);\n const k0 = this.keyframes[seg];\n const k1 = this.keyframes[seg + 1];\n\n _samplePathCore(out.pos, this.keyframes, this.posInterp, 'pos', 'tanIn', 'tanOut', seg, t);\n\n if (this.rotInterp === 'step') {\n out.rot[0]=k0.rot[0]; out.rot[1]=k0.rot[1]; out.rot[2]=k0.rot[2]; out.rot[3]=k0.rot[3];\n } else if (this.rotInterp === 'nlerp') {\n qNlerp(out.rot, k0.rot, k1.rot, t);\n } else {\n qSlerp(out.rot, k0.rot, k1.rot, t);\n }\n\n lerpVec3(out.scl, k0.scl, k1.scl, t);\n return out;\n }\n\n /**\n * Evaluate interpolated TRS pose at current cursor.\n * @param {{ pos:number[], rot:number[], scl:number[] }} [out]\n * @returns {{ pos:number[], rot:number[], scl:number[] }} out\n */\n eval(out) {\n out = out || { pos:[0,0,0], rot:[0,0,0,1], scl:[1,1,1] };\n const n = this.keyframes.length;\n if (n === 0) return out;\n if (n === 1) return this._sampleTRS(out, 0, 0);\n const [seg, t] = this._cursorSegT();\n return this._sampleTRS(out, seg, t);\n }\n}\n\n// =========================================================================\n// S7 CameraTrack\n// =========================================================================\n\n/**\n * Lookat camera keyframe track.\n *\n * Keyframe shape: { eye:[x,y,z], center:[x,y,z], up:[x,y,z],\n * fov?:number, halfHeight?:number,\n * near:number, far:number,\n * eyeTanIn?:[x,y,z], eyeTanOut?:[x,y,z],\n * centerTanIn?:[x,y,z], centerTanOut?:[x,y,z] }\n *\n * fov — vertical fov (radians) for perspective cameras; null for ortho.\n * halfHeight — world-unit half-height of ortho frustum; null for perspective.\n * Both are optional and nullable because exactly one is meaningful per\n * keyframe (perspective xor ortho). eval() lerps each only when both\n * adjacent keyframes carry a non-null value for that field; mixed or\n * missing entries pass `null` through.\n *\n * near, far — clip plane distances (positive, world units). Always real\n * numbers. Defaults: near = 0.1, far = 1000 (three.js / Bevy convention).\n * Linearly interpolated between keyframes without null-passthrough.\n *\n * eyeTanIn/Out and centerTanIn/Out are optional vec3 tangents for Hermite\n * interpolation of the eye and center paths respectively. When absent,\n * centripetal Catmull-Rom tangents are auto-computed at sample time.\n *\n * Missing fields default to: center → [0,0,0], up → [0,1,0],\n * near → 0.1, far → 1000.\n *\n * For matrix-based capture of a camera-like pose use\n * PoseTrack.add({ mat4Model: mat4Eye }) for full TRS fidelity including roll,\n * or a lookat spec here for camera-style interpolation.\n */\nclass CameraTrack extends Track {\n constructor() {\n super();\n /**\n * Eye-path interpolation mode.\n * @type {'hermite'|'linear'|'step'}\n */\n this.eyeInterp = 'hermite';\n /**\n * Center-path interpolation mode.\n * @type {'hermite'|'linear'|'step'}\n */\n this.centerInterp = 'linear';\n }\n\n /**\n * Append one or more camera keyframes. Adjacent duplicates are skipped by\n * default.\n * @param {Object|Object[]} spec\n * @param {{ deduplicate?: boolean }} [opts]\n */\n add(spec, opts) {\n if (Array.isArray(spec)) { for (const s of spec) this.add(s, opts); return; }\n const kf = _parseCameraSpec(spec);\n if (!kf) return;\n const dedup = !opts || opts.deduplicate !== false;\n if (dedup && this.keyframes.length > 0) {\n if (_sameCameraKeyframe(this.keyframes[this.keyframes.length - 1], kf)) return;\n }\n this.keyframes.push(kf);\n }\n\n /**\n * Replace the camera keyframe at `index`, or append at the end if `index`\n * equals the current keyframe count.\n * @param {number} index\n * @param {Object} spec\n * @returns {boolean}\n */\n set(index, spec) {\n if (!_isNum$1(index)) return false;\n const i = index | 0, kf = _parseCameraSpec(spec);\n if (!kf || i < 0 || i > this.keyframes.length) return false;\n if (i === this.keyframes.length) this.keyframes.push(kf);\n else this.keyframes[i] = kf;\n return true;\n }\n\n /**\n * Sample the eye path. Zero-alloc, no cursor side effects.\n *\n * Two signatures:\n * sampleEye(out) cursor form — reads current seg/f\n * sampleEye(out, seg, t) explicit (seg, t), continuous on the path\n *\n * @param {number[]} out\n * @param {number} [seg]\n * @param {number} [t]\n * @returns {number[]} out\n */\n sampleEye(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n return _samplePathCore(out, this.keyframes, this.eyeInterp, 'eye', 'eyeTanIn', 'eyeTanOut', seg, t);\n }\n\n /**\n * Sample the center path. Zero-alloc, no cursor side effects.\n *\n * Two signatures:\n * sampleCenter(out) cursor form — reads current seg/f\n * sampleCenter(out, seg, t) explicit (seg, t)\n *\n * @param {number[]} out\n * @param {number} [seg]\n * @param {number} [t]\n * @returns {number[]} out\n */\n sampleCenter(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n return _samplePathCore(out, this.keyframes, this.centerInterp, 'center', 'centerTanIn', 'centerTanOut', seg, t);\n }\n\n /**\n * Write the interpolated lookat eye matrix as a column-major mat4\n * (eye→world rigid frame). Zero-alloc, no cursor side effects.\n *\n * Two signatures:\n * mat4Eye(out) cursor form — reads current seg/f\n * mat4Eye(out, seg, t) explicit (seg, t), continuous on the path\n *\n * @param {Float32Array|number[]} out 16-element result buffer.\n * @param {number} [seg]\n * @param {number} [t]\n * @returns {Float32Array|number[]} out\n */\n mat4Eye(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n this._sampleEyePose(_eyeScratch, seg, t);\n const e = _eyeScratch;\n return mat4Eye(out,\n e.eye[0], e.eye[1], e.eye[2],\n e.center[0], e.center[1], e.center[2],\n e.up[0], e.up[1], e.up[2]);\n }\n\n /**\n * Effective in/out eye tangents at keyframe `index`.\n */\n eyeTangents(outIn, outOut, index) {\n _sampleTangentsCore(outIn, outOut, this.keyframes, 'eye', 'eyeTanIn', 'eyeTanOut', index);\n return this;\n }\n\n /**\n * Effective in/out center tangents at keyframe `index`.\n */\n centerTangents(outIn, outOut, index) {\n _sampleTangentsCore(outIn, outOut, this.keyframes, 'center', 'centerTanIn', 'centerTanOut', index);\n return this;\n }\n\n /** @private — write interpolated { eye, center, up } at (seg, t). */\n _sampleEyePose(out, seg, t) {\n const n = this.keyframes.length;\n if (n === 0) return out;\n if (n === 1) {\n const k = this.keyframes[0];\n out.eye[0]=k.eye[0]; out.eye[1]=k.eye[1]; out.eye[2]=k.eye[2];\n out.center[0]=k.center[0]; out.center[1]=k.center[1]; out.center[2]=k.center[2];\n out.up[0]=k.up[0]; out.up[1]=k.up[1]; out.up[2]=k.up[2];\n return out;\n }\n const nSeg = n - 1;\n seg = seg | 0;\n if (seg >= nSeg) { seg = nSeg - 1; t = 1; }\n else if (seg < 0) { seg = 0; t = 0; }\n t = _clamp01(t);\n const k0 = this.keyframes[seg];\n const k1 = this.keyframes[seg + 1];\n\n _samplePathCore(out.eye, this.keyframes, this.eyeInterp, 'eye', 'eyeTanIn', 'eyeTanOut', seg, t);\n _samplePathCore(out.center, this.keyframes, this.centerInterp, 'center', 'centerTanIn', 'centerTanOut', seg, t);\n\n lerpVec3(out.up, k0.up, k1.up, t);\n const ul = Math.sqrt(out.up[0]*out.up[0]+out.up[1]*out.up[1]+out.up[2]*out.up[2]) || 1;\n out.up[0]/=ul; out.up[1]/=ul; out.up[2]/=ul;\n return out;\n }\n\n /**\n * Evaluate interpolated camera pose at current cursor.\n *\n * `fov` / `halfHeight` are lerped only when both adjacent keyframes carry\n * a non-null value; mixed entries pass `null` through so the bridge can\n * leave the projection unchanged.\n *\n * `near` / `far` are always real numbers and are linearly interpolated\n * unconditionally.\n *\n * @param {{ eye:number[], center:number[], up:number[],\n * fov:number|null, halfHeight:number|null,\n * near:number, far:number }} [out]\n * @returns {{ eye:number[], center:number[], up:number[],\n * fov:number|null, halfHeight:number|null,\n * near:number, far:number }} out\n */\n eval(out) {\n out = out || { eye:[0,0,0], center:[0,0,0], up:[0,1,0],\n fov:null, halfHeight:null,\n near:_DEFAULT_NEAR, far:_DEFAULT_FAR };\n const n = this.keyframes.length;\n if (n === 0) return out;\n if (n === 1) {\n const k = this.keyframes[0];\n this._sampleEyePose(out, 0, 0);\n out.fov = k.fov; out.halfHeight = k.halfHeight;\n out.near = k.near; out.far = k.far;\n return out;\n }\n const [seg, t] = this._cursorSegT();\n const k0 = this.keyframes[seg];\n const k1 = this.keyframes[seg + 1];\n\n this._sampleEyePose(out, seg, t);\n\n out.fov = (k0.fov != null && k1.fov != null)\n ? k0.fov + t * (k1.fov - k0.fov) : (k0.fov ?? k1.fov ?? null);\n out.halfHeight = (k0.halfHeight != null && k1.halfHeight != null)\n ? k0.halfHeight + t * (k1.halfHeight - k0.halfHeight)\n : (k0.halfHeight ?? k1.halfHeight ?? null);\n\n // near / far carry real defaults on every keyframe — always lerp.\n out.near = k0.near + t * (k1.near - k0.near);\n out.far = k0.far + t * (k1.far - k0.far);\n\n return out;\n }\n}\n\n/**\n * @file Constraint solver, canonical handle state, and ray-primitive\n * intersections for interactive manipulators.\n * @module tree/handle\n * @license AGPL-3.0-only\n *\n * The numeric brain of the manipulator handle. Renderer- and frame-agnostic:\n * inputs are plain numbers in ONE working space chosen by the caller (the\n * bridge), and the solver never learns world vs eye — it solves in whatever\n * space the ray and geometry are expressed in. The bridge converts the pointer\n * ray into the working frame before calling solve(), and converts the value\n * back out via mapLocation / mapDirection.\n *\n * Zero dependencies on p5, DOM, WebGL, or WebGPU. Out-first throughout; no\n * allocation in solve() / value(). Vectors are passed as flat scalars (matching\n * form.js), state is held as plain number[] (matching track.js keyframes).\n *\n * ── Storage convention ─────────────────────────────────────────────────────\n * The core distinguishes two value shapes deliberately:\n * mat4 — 16-element ArrayLike, typically Float32Array, because matrices\n * cross the GL boundary (contiguous f32 is what the renderer wants).\n * vec3 / quat — plain number[] (f64), because they are authoring/state values\n * and because the frozen basis-vector constants (i, j, k, ORIGIN)\n * cannot be expressed as frozen typed arrays. Handle state follows\n * the vec3 rule.\n *\n * ── Constraint kinds ───────────────────────────────────────────────────────\n * SPHERE 2-DOF heading on a sphere of radius r about an anchor.\n * Canonical state is a UNIT DIRECTION (renormalised every solve) —\n * no stored Euler angles, so no gimbal degeneracy at the poles.\n * az/el are derived on request via azEl().\n * PLANE 2-DOF point on a fixed plane (anchor + unit normal).\n * AXIS 1-DOF point on a line (anchor + unit dir), scalar t clamped to extent.\n * DIAL 1-DOF angle on a circle of radius r in the plane (anchor, axis).\n * Canonical state is an ACCUMULATED angle θ (multi-turn winding is\n * preserved: each solve applies the smaller signed arc, so θ counts\n * full turns — essential for bind targets like \"rotate this 720°\").\n * θ=0 sits at the reference direction `zero` (derived from the axis\n * when not supplied); θ grows right-handed about the axis. Near\n * edge-on view (the ray almost parallel to the dial plane, where a\n * plane hit races to infinity — the classic rotate-gizmo failure)\n * the solve falls back to the TANGENT LINE of the circle at the\n * current angle, converting linear drag to dθ: bounded, monotone,\n * and still pure ray geometry.\n *\n * VIEW (the camera-facing free-translate constraint) is NOT a core kind: the\n * bridge implements it with PLANE, feeding a fresh camera-derived normal and\n * anchor each frame. The core stays oblivious to the camera.\n *\n * ── Report modes ───────────────────────────────────────────────────────────\n * DIRECTION value() writes the unit direction: SPHERE → the heading;\n * DIAL → the radial unit at θ.\n * POINT value() writes a position: SPHERE → anchor + dir·radius;\n * DIAL → the point on the circle; PLANE / AXIS → the constrained\n * point.\n *\n * ── State ownership & portability ──────────────────────────────────────────\n * Each Constraint owns its own state; there is no module-level scratch. solve()\n * writes into instance fields, never shared globals. This keeps the type a\n * plain-data state machine: it ports 1:1 to a Rust enum + impl that is\n * `Send + Sync` for free, with `&mut self` on solve() making concurrent\n * mutation a compile error. The binding closure deliberately lives in the\n * bridge, not here — a stored callback would forfeit that guarantee.\n *\n * ── Extension contract ─────────────────────────────────────────────────────\n * A constraint is any object exposing: `kind` (integer discriminant),\n * `solve(ox,oy,oz, dx,dy,dz)`, `value(out, report)`, `seed(x,y,z)`, and\n * optionally `scalar()` / `azEl(out2)` / `aim(ax,ay,az[, zx,zy,zz])` — the\n * basis re-aim seam the bridge's deferred `from` frame drives — and\n * `proxy(ox,oy,oz, dx,dy,dz, radius)`, the analytic pick: the ray parameter\n * at which a ray in the working space meets the grab proxy of `radius`\n * working units, or Infinity (a kind without one gets a sphere at its\n * POINT). The handle controller drives any conforming constraint\n * (lifecycle, frame conversion, bind, hooks, pick); a new kind — 6-DOF, or\n * app-specific — implements this contract here (portable, draw-free) plus a\n * bridge-side locus draw, rather than forking the controller. The classes\n * below are the reference implementation. See handle-design.md §9–§10.\n *\n * ── Conventions ────────────────────────────────────────────────────────────\n * Ray direction `d` is assumed unit (the bridge normalises). Plane / axis\n * normals and directions are normalised at construction. The angular utilities\n * use a right-handed convention: az about +Y, el measured from the XZ plane.\n * solve() does NOT depend on this convention — it stores the hit direction\n * directly; az/el are a readout/authoring convenience only. DIAL's θ is\n * right-handed about its own axis, measured from `zero`.\n */\n\n\nconst EPS = 1e-6;\nconst TWO_PI$1 = Math.PI * 2;\n\n// Edge-on threshold for DIAL: below this |d·n| the plane hit is ill-conditioned\n// (dθ per pixel diverges) and the solve switches to the tangent-line fallback.\n// ≈ 4.6° of incidence. Tune empirically (handle-experiments/e2).\nconst DIAL_EDGE = 0.08;\n\n// =========================================================================\n// H1 Small private helpers\n// =========================================================================\n\nconst _isNum = (x) => typeof x === 'number' && Number.isFinite(x);\nconst _clamp = (x, lo, hi) => x < lo ? lo : (x > hi ? hi : x);\nconst _num = (x, d) => _isNum(x) ? x : d;\n\n/** Wrap an angle to (−π, π]. */\nconst _wrapPi = (a) => a - TWO_PI$1 * Math.round(a / TWO_PI$1);\n\n/** Parse a vec3 from array / typed array / {x,y,z}. Returns a fresh [x,y,z] or null. */\nfunction _vec3$1(v) {\n if (!v) return null;\n if (ArrayBuffer.isView(v) && v.length >= 3) return [v[0], v[1], v[2]];\n if (Array.isArray(v) && v.length >= 3) return [v[0], v[1], v[2]];\n if (typeof v === 'object' && 'x' in v) return [v.x || 0, v.y || 0, v.z || 0];\n return null;\n}\n\n/** Normalise a vec3 in place; zero-length falls back to the given default axis. */\nfunction _unit$1(v, dx, dy, dz) {\n const l = Math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);\n if (l < EPS) { v[0]=dx; v[1]=dy; v[2]=dz; return v; }\n v[0]/=l; v[1]/=l; v[2]/=l;\n return v;\n}\n\n/**\n * Orthonormal in-plane basis for a unit normal n, written into ub, vb. Seeds\n * from the world axis least aligned with n so the first cross can't degenerate.\n * (Same derivation the p5 bridge uses for its plane quad — duplicated here\n * because the core cannot depend on the bridge.)\n */\nfunction _basis$1(n, ub, vb) {\n const ax = Math.abs(n[0]), ay = Math.abs(n[1]), az = Math.abs(n[2]);\n let rx = 0, ry = 0, rz = 0;\n if (ax <= ay && ax <= az) rx = 1; else if (ay <= az) ry = 1; else rz = 1;\n ub[0] = ry*n[2] - rz*n[1]; ub[1] = rz*n[0] - rx*n[2]; ub[2] = rx*n[1] - ry*n[0];\n _unit$1(ub, 1, 0, 0);\n vb[0] = n[1]*ub[2] - n[2]*ub[1]; vb[1] = n[2]*ub[0] - n[0]*ub[2]; vb[2] = n[0]*ub[1] - n[1]*ub[0];\n}\n\n// =========================================================================\n// H2 Ray-primitive intersections (pure, out-first, scalar params)\n// =========================================================================\n\n/**\n * Nearest ray–sphere intersection. The ray direction is assumed unit, so the\n * quadratic's leading coefficient is 1. On a miss, writes the closest-approach\n * point projected onto the sphere (so the handle tracks the limb gracefully\n * rather than snapping away).\n *\n * @param {number[]} out 3-element destination (hit point).\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} cx,cy,cz Sphere centre.\n * @param {number} r Sphere radius.\n * @returns {number} Ray parameter t at the written hit.\n */\nfunction raySphere(out, ox,oy,oz, dx,dy,dz, cx,cy,cz, r) {\n const lx=ox-cx, ly=oy-cy, lz=oz-cz;\n const b = lx*dx + ly*dy + lz*dz;\n const cc = lx*lx + ly*ly + lz*lz - r*r;\n const disc = b*b - cc;\n let t;\n if (disc >= 0) {\n const s = Math.sqrt(disc);\n t = -b - s;\n if (t < 0) t = -b + s; // origin inside the sphere: take far root\n out[0]=ox+t*dx; out[1]=oy+t*dy; out[2]=oz+t*dz;\n } else {\n t = -b; // closest approach along the ray\n let hx=ox+t*dx-cx, hy=oy+t*dy-cy, hz=oz+t*dz-cz;\n const hl = Math.sqrt(hx*hx + hy*hy + hz*hz) || 1;\n const k = r/hl;\n out[0]=cx+hx*k; out[1]=cy+hy*k; out[2]=cz+hz*k;\n }\n return t;\n}\n\n/**\n * Ray–plane intersection. A near-parallel ray (|d·n| < EPS) returns Infinity\n * and leaves `out` untouched — the caller keeps the previous value.\n *\n * @param {number[]} out 3-element destination (hit point).\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} px,py,pz A point on the plane.\n * @param {number} nx,ny,nz Plane normal (unit).\n * @returns {number} Ray parameter t, or Infinity if parallel.\n */\nfunction rayPlane(out, ox,oy,oz, dx,dy,dz, px,py,pz, nx,ny,nz) {\n const den = dx*nx + dy*ny + dz*nz;\n if (den < EPS && den > -EPS) return Infinity;\n const t = ((px-ox)*nx + (py-oy)*ny + (pz-oz)*nz) / den;\n out[0]=ox+t*dx; out[1]=oy+t*dy; out[2]=oz+t*dz;\n return t;\n}\n\n/**\n * Closest point on the infinite line (p, u) to the ray (o, d). Both `d` and\n * `u` are assumed unit. For a ray parallel to the line, projects the ray\n * origin onto the line.\n *\n * @param {number[]} out 3-element destination (closest point on the line).\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} px,py,pz A point on the line.\n * @param {number} ux,uy,uz Line direction (unit).\n * @returns {number} Signed parameter s along u at the written point (unclamped).\n */\nfunction rayClosestPointOnAxis(out, ox,oy,oz, dx,dy,dz, px,py,pz, ux,uy,uz) {\n const wx=ox-px, wy=oy-py, wz=oz-pz;\n const b = dx*ux + dy*uy + dz*uz; // d·u\n const dd = dx*wx + dy*wy + dz*wz; // d·w\n const e = ux*wx + uy*wy + uz*wz; // u·w\n const den = 1 - b*b; // (d·d)(u·u) − (d·u)² with d,u unit\n const s = (den > EPS) ? (e - b*dd) / den : e;\n out[0]=px+s*ux; out[1]=py+s*uy; out[2]=pz+s*uz;\n return s;\n}\n\n// =========================================================================\n// H2b Ray-primitive hit tests (pure, no out: the nearest t, or Infinity)\n// =========================================================================\n//\n// Beside the solve primitives above, which always write a point, these are\n// TESTS: they write nothing and return the ray parameter of the nearest hit\n// with t ≥ 0, or Infinity on a miss. A ray whose origin lies inside the\n// primitive hits at its exit, so a press from inside a proxy still grabs.\n// The ray direction is assumed unit.\n\n/**\n * Ray–sphere hit test.\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} cx,cy,cz Sphere centre.\n * @param {number} r Sphere radius.\n * @returns {number} The nearest t ≥ 0, or Infinity.\n */\nfunction rayHitSphere(ox,oy,oz, dx,dy,dz, cx,cy,cz, r) {\n const lx=ox-cx, ly=oy-cy, lz=oz-cz;\n const b = lx*dx + ly*dy + lz*dz;\n const cc = lx*lx + ly*ly + lz*lz - r*r;\n const disc = b*b - cc;\n if (disc < 0) return Infinity;\n const s = Math.sqrt(disc);\n let t = -b - s;\n if (t < 0) t = -b + s; // origin inside: the exit\n return t < 0 ? Infinity : t; // both roots behind the origin\n}\n\n// One end cap of a capsule: the sphere at (cx,cy,cz), a root accepted only\n// where the hit's axial coordinate h = wu + t·du lies beyond the segment on\n// that cap's side (h ≤ 0 at A, h ≥ L at B), so the point is on the capsule's\n// surface and not inside its cylinder.\nfunction _capHit(ox,oy,oz, dx,dy,dz, cx,cy,cz, r, wu, du, lim, endB) {\n const lx=ox-cx, ly=oy-cy, lz=oz-cz;\n const b = lx*dx + ly*dy + lz*dz;\n const cc = lx*lx + ly*ly + lz*lz - r*r;\n const disc = b*b - cc;\n if (disc < 0) return Infinity;\n const s = Math.sqrt(disc);\n let t = -b - s, h = wu + t*du;\n if (t < 0 || (endB ? h < lim : h > lim)) { t = -b + s; h = wu + t*du; }\n return (t >= 0 && (endB ? h >= lim : h <= lim)) ? t : Infinity;\n}\n\n/**\n * Ray–capsule hit test: the segment A→B swept by radius r. The cylinder wall\n * counts within the segment's extent, each end sphere beyond it; the nearest\n * of the three wins. A zero-length segment is the sphere at A.\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} ax,ay,az Segment start.\n * @param {number} bx,by,bz Segment end.\n * @param {number} r Capsule radius.\n * @returns {number} The nearest t ≥ 0, or Infinity.\n */\nfunction rayHitCapsule(ox,oy,oz, dx,dy,dz, ax,ay,az, bx,by,bz, r) {\n let ux=bx-ax, uy=by-ay, uz=bz-az;\n const L = Math.sqrt(ux*ux + uy*uy + uz*uz);\n if (L < EPS) return rayHitSphere(ox,oy,oz, dx,dy,dz, ax,ay,az, r);\n ux/=L; uy/=L; uz/=L;\n const wx=ox-ax, wy=oy-ay, wz=oz-az;\n const du = dx*ux + dy*uy + dz*uz; // d·u\n const wu = wx*ux + wy*uy + wz*uz; // w·u\n let best = Infinity;\n // Cylinder wall: the quadratic in the components perpendicular to u.\n const a = 1 - du*du;\n if (a > EPS) {\n const b = (dx*wx + dy*wy + dz*wz) - du*wu;\n const c = (wx*wx + wy*wy + wz*wz) - wu*wu - r*r;\n const disc = b*b - a*c;\n if (disc >= 0) {\n const s = Math.sqrt(disc);\n let t = (-b - s)/a, h = wu + t*du;\n if (t < 0 || h < 0 || h > L) { t = (-b + s)/a; h = wu + t*du; }\n if (t >= 0 && h >= 0 && h <= L) best = t;\n }\n }\n const ta = _capHit(ox,oy,oz, dx,dy,dz, ax,ay,az, r, wu, du, 0, false);\n if (ta < best) best = ta;\n const tb = _capHit(ox,oy,oz, dx,dy,dz, bx,by,bz, r, wu, du, L, true);\n if (tb < best) best = tb;\n return best;\n}\n\n// Ring scratch — the plane normal and its in-plane basis. Function-local\n// working values, never state: rayHitRing runs to completion.\nconst _rn = [0, 0, 1], _r0 = [1, 0, 0], _r1 = [0, 1, 0];\n\n/**\n * Ray–ring hit test: the circle of radius R about c in the plane\n * perpendicular to u, swept by tube radius r — the analytic torus proxy as a\n * capsule chain, the circle polygonised into `detail` segments and each\n * tested with rayHitCapsule. The chain has volume in every direction, so it\n * never degenerates edge-on; the chordal error is R · (1 − cos(π / detail)).\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} cx,cy,cz Ring centre.\n * @param {number} ux,uy,uz Ring plane normal (normalised here).\n * @param {number} R Ring radius.\n * @param {number} r Tube radius.\n * @param {number} [detail=32] Chain segments (at least 3).\n * @returns {number} The nearest t ≥ 0, or Infinity.\n */\nfunction rayHitRing(ox,oy,oz, dx,dy,dz, cx,cy,cz, ux,uy,uz, R, r, detail = 32) {\n const n = _isNum(detail) && detail >= 3 ? Math.floor(detail) : 32;\n _rn[0]=ux; _rn[1]=uy; _rn[2]=uz;\n _unit$1(_rn, 0, 0, 1);\n _basis$1(_rn, _r0, _r1);\n const step = TWO_PI$1 / n;\n let best = Infinity;\n let ax = cx + R*_r0[0], ay = cy + R*_r0[1], az = cz + R*_r0[2]; // vertex at angle 0\n for (let i = 1; i <= n; i++) {\n const th = i === n ? 0 : i*step; // close the chain exactly\n const cs = Math.cos(th)*R, sn = Math.sin(th)*R;\n const bx = cx + cs*_r0[0] + sn*_r1[0];\n const by = cy + cs*_r0[1] + sn*_r1[1];\n const bz = cz + cs*_r0[2] + sn*_r1[2];\n const t = rayHitCapsule(ox,oy,oz, dx,dy,dz, ax,ay,az, bx,by,bz, r);\n if (t < best) best = t;\n ax = bx; ay = by; az = bz;\n }\n return best;\n}\n\n// =========================================================================\n// H3 Angular utilities (readout / authoring convenience)\n// =========================================================================\n\n/**\n * Unit direction from azimuth/elevation (right-handed: az about +Y, el from XZ).\n * @param {number[]} out 3-element destination.\n * @param {number} az Azimuth (radians).\n * @param {number} el Elevation (radians).\n * @returns {number[]} out\n */\nfunction dirFromAzEl(out, az, el) {\n const ce = Math.cos(el);\n out[0]=ce*Math.cos(az); out[1]=Math.sin(el); out[2]=ce*Math.sin(az);\n return out;\n}\n\n/**\n * Azimuth/elevation from a unit direction. Inverse of dirFromAzEl.\n * @param {number[]} out2 2-element destination [az, el] (radians).\n * @param {number} dx,dy,dz Unit direction.\n * @returns {number[]} out2\n */\nfunction azElFromDir(out2, dx, dy, dz) {\n out2[0] = Math.atan2(dz, dx); // az\n out2[1] = Math.asin(_clamp(dy, -1, 1)); // el\n return out2;\n}\n\n// =========================================================================\n// H4 Constraint — tagged state machine (one class, kind discriminant)\n// =========================================================================\n\n/**\n * A draggable constraint: maps a ray to a constrained value and holds the\n * canonical state between drags. One class with a `kind` discriminant (never\n * per-constraint subclasses) so it maps cleanly to a Rust enum.\n *\n * Construction options (all optional unless noted):\n * SPHERE — { radius = 1, report = DIRECTION, anchor = [0,0,0] }\n * PLANE — { anchor = [0,0,0], normal = [0,1,0] }\n * AXIS — { anchor = [0,0,0], axis = [1,0,0], extent = [-1, 1] }\n * DIAL — { anchor = [0,0,0], axis = [0,1,0], radius = 1, zero?,\n * extent = [-∞, ∞] }\n * `axis` is the dial-plane normal (θ is right-handed about it);\n * `zero` is the in-plane reference direction for θ=0 (projected\n * onto the plane and normalised; derived from the axis when\n * absent); `extent` clamps θ in radians — unbounded by default,\n * so the dial winds multiple turns.\n *\n * @param {number} kind SPHERE | PLANE | AXIS | DIAL.\n * @param {Object} [opts]\n */\nclass Constraint {\n constructor(kind, opts = {}) {\n /** Constraint kind discriminant. @type {number} */\n this.kind = kind;\n\n /** Constraint origin (sphere centre / plane point / axis anchor / dial centre). @type {number[]} */\n this.anchor = _vec3$1(opts.anchor) || [0, 0, 0];\n /** Canonical unit direction — SPHERE. @type {number[]} */\n this.dir = [0, 0, 1];\n /** Constrained point — PLANE / AXIS / DIAL (and SPHERE scratch). @type {number[]} */\n this.pt = [this.anchor[0], this.anchor[1], this.anchor[2]];\n /** Plane normal (unit) — PLANE. @type {number[]} */\n this.n = _unit$1(_vec3$1(opts.normal) || [0, 1, 0], 0, 1, 0);\n /** Axis / dial-plane normal (unit) — AXIS / DIAL. @type {number[]} */\n this.u = kind === DIAL\n ? _unit$1(_vec3$1(opts.axis) || [0, 1, 0], 0, 1, 0)\n : _unit$1(_vec3$1(opts.axis) || [1, 0, 0], 1, 0, 0);\n /** Current scalar parameter — AXIS: t along the line; DIAL: accumulated θ. @type {number} */\n this.s = 0;\n\n // DIAL in-plane basis: r0 (the θ=0 reference) and r1 = u × r0, so the\n // point at θ is anchor + radius·(cosθ·r0 + sinθ·r1) — right-handed about u.\n /** θ=0 reference direction (unit, in-plane) — DIAL. @type {number[]} */\n this.r0 = [1, 0, 0];\n /** In-plane binormal u × r0 (unit) — DIAL. @type {number[]} */\n this.r1 = [0, 0, 1];\n if (kind === DIAL) {\n const z = _vec3$1(opts.zero);\n this._dialBasis(z ? z[0] : NaN, z ? z[1] : NaN, z ? z[2] : NaN);\n }\n\n // Extent: AXIS clamps t (default [-1, 1]); DIAL clamps θ in radians\n // (default unbounded, so the dial winds freely).\n const ext = Array.isArray(opts.extent) ? opts.extent : null;\n const dial = kind === DIAL;\n /** Minimum scalar parameter. @type {number} */\n this.min = ext && _isNum(ext[0]) ? ext[0] : (dial ? -Infinity : -1);\n /** Maximum scalar parameter. @type {number} */\n this.max = ext && _isNum(ext[1]) ? ext[1] : (dial ? Infinity : 1);\n\n // Sphere / dial radius (private backing — see radius getter/setter).\n this._radius = _num(opts.radius, 1);\n\n /**\n * Default report mode. SPHERE defaults to DIRECTION; PLANE / AXIS / DIAL\n * report a POINT.\n * @type {number}\n */\n this.report = (opts.report === POINT || opts.report === DIRECTION)\n ? opts.report\n : (kind === SPHERE ? DIRECTION : POINT);\n\n if (kind === DIAL) this._dialPoint();\n }\n\n /** Sphere / dial radius. @type {number} */\n get radius() { return this._radius; }\n set radius(r) { this._radius = _isNum(r) ? r : this._radius; if (this.kind === DIAL) this._dialPoint(); }\n\n // Recompute the DIAL point from θ (anchor + ρ(cosθ·r0 + sinθ·r1)).\n _dialPoint() {\n const c = Math.cos(this.s) * this._radius, sn = Math.sin(this.s) * this._radius;\n this.pt[0] = this.anchor[0] + c*this.r0[0] + sn*this.r1[0];\n this.pt[1] = this.anchor[1] + c*this.r0[1] + sn*this.r1[1];\n this.pt[2] = this.anchor[2] + c*this.r0[2] + sn*this.r1[2];\n }\n\n // Build the DIAL in-plane basis (r0, r1) from the current axis u and an\n // optional θ=0 reference (zx,zy,zz): the reference is projected onto the\n // dial plane and normalised; absent (NaN) or degenerate, r0 derives from u\n // via the least-aligned-axis seed. r1 = u × r0, right-handed about u.\n _dialBasis(zx, zy, zz) {\n if (_isNum(zx) && _isNum(zy) && _isNum(zz)) {\n const d = zx*this.u[0] + zy*this.u[1] + zz*this.u[2];\n this.r0[0] = zx - d*this.u[0];\n this.r0[1] = zy - d*this.u[1];\n this.r0[2] = zz - d*this.u[2];\n const l = Math.sqrt(this.r0[0]**2 + this.r0[1]**2 + this.r0[2]**2);\n if (l < EPS) _basis$1(this.u, this.r0, this.r1);\n else { this.r0[0]/=l; this.r0[1]/=l; this.r0[2]/=l; }\n } else {\n _basis$1(this.u, this.r0, this.r1);\n }\n // r1 = u × r0 (recomputed even when _basis ran — same result, one rule).\n this.r1[0] = this.u[1]*this.r0[2] - this.u[2]*this.r0[1];\n this.r1[1] = this.u[2]*this.r0[0] - this.u[0]*this.r0[2];\n this.r1[2] = this.u[0]*this.r0[1] - this.u[1]*this.r0[0];\n }\n\n /**\n * Update the canonical state from a ray in the working space. The ray\n * direction is assumed unit. Chainable.\n *\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @returns {Constraint} this\n */\n solve(ox, oy, oz, dx, dy, dz) {\n if (this.kind === SPHERE) {\n // Hit the sphere into pt, then derive the unit heading from the anchor.\n raySphere(this.pt, ox,oy,oz, dx,dy,dz,\n this.anchor[0], this.anchor[1], this.anchor[2], this._radius);\n this.dir[0] = this.pt[0] - this.anchor[0];\n this.dir[1] = this.pt[1] - this.anchor[1];\n this.dir[2] = this.pt[2] - this.anchor[2];\n _unit$1(this.dir, this.dir[0], this.dir[1], this.dir[2]);\n } else if (this.kind === PLANE) {\n // Parallel ray returns Infinity and leaves pt unchanged (keep last).\n rayPlane(this.pt, ox,oy,oz, dx,dy,dz,\n this.anchor[0], this.anchor[1], this.anchor[2],\n this.n[0], this.n[1], this.n[2]);\n } else if (this.kind === AXIS) {\n let s = rayClosestPointOnAxis(this.pt, ox,oy,oz, dx,dy,dz,\n this.anchor[0], this.anchor[1], this.anchor[2],\n this.u[0], this.u[1], this.u[2]);\n s = _clamp(s, this.min, this.max);\n this.s = s;\n this.pt[0] = this.anchor[0] + s*this.u[0]; // clamped point\n this.pt[1] = this.anchor[1] + s*this.u[1];\n this.pt[2] = this.anchor[2] + s*this.u[2];\n } else if (this.kind === DIAL) {\n this._solveDial(ox, oy, oz, dx, dy, dz);\n }\n return this;\n }\n\n // DIAL solve. Face-on: hit the dial plane, derive the raw angle of the hit\n // about the anchor, and accumulate the smaller signed arc into θ (winding\n // preserved). Edge-on (|d·u| < DIAL_EDGE): the plane hit diverges, so solve\n // the ray against the TANGENT LINE of the circle at the current θ instead —\n // the signed tangent parameter over the radius is dθ, bounded and monotone.\n _solveDial(ox, oy, oz, dx, dy, dz) {\n const u = this.u, r0 = this.r0, r1 = this.r1, a = this.anchor;\n const den = dx*u[0] + dy*u[1] + dz*u[2];\n let dth;\n if (den >= DIAL_EDGE || den <= -DIAL_EDGE) {\n // Well-conditioned: plane hit → raw angle → smaller signed arc.\n const t = rayPlane(this.pt, ox,oy,oz, dx,dy,dz,\n a[0], a[1], a[2], u[0], u[1], u[2]);\n if (t === Infinity) return; // keep last (paranoia; den guards)\n const vx = this.pt[0]-a[0], vy = this.pt[1]-a[1], vz = this.pt[2]-a[2];\n const raw = Math.atan2(vx*r1[0] + vy*r1[1] + vz*r1[2],\n vx*r0[0] + vy*r0[1] + vz*r0[2]);\n dth = _wrapPi(raw - _wrapPi(this.s));\n } else {\n // Edge-on fallback: tangent at the current point, w = −sinθ·r0 + cosθ·r1.\n const cs = Math.cos(this.s), sn = Math.sin(this.s);\n const wx = -sn*r0[0] + cs*r1[0];\n const wy = -sn*r0[1] + cs*r1[1];\n const wz = -sn*r0[2] + cs*r1[2];\n this._dialPoint(); // tangent anchored at the current point\n const sl = rayClosestPointOnAxis(this.pt, ox,oy,oz, dx,dy,dz,\n this.pt[0], this.pt[1], this.pt[2],\n wx, wy, wz);\n dth = sl / (this._radius || 1);\n }\n this.s = _clamp(this.s + dth, this.min, this.max);\n this._dialPoint();\n }\n\n /**\n * Write the current value into `out`. `report` overrides the default for\n * this call (e.g. read a SPHERE's point even when its default is DIRECTION).\n * SPHERE+POINT and DIAL+POINT are derived from the angle/heading and the\n * live radius, so they stay correct after a radius change without\n * re-solving. DIAL+DIRECTION writes the radial unit at θ.\n *\n * @param {number[]} out 3-element destination.\n * @param {number} [report] POINT | DIRECTION override.\n * @returns {number[]} out\n */\n value(out, report) {\n const r = (report === POINT || report === DIRECTION) ? report : this.report;\n if (this.kind === SPHERE) {\n if (r === DIRECTION) {\n out[0]=this.dir[0]; out[1]=this.dir[1]; out[2]=this.dir[2];\n } else {\n out[0]=this.anchor[0]+this.dir[0]*this._radius;\n out[1]=this.anchor[1]+this.dir[1]*this._radius;\n out[2]=this.anchor[2]+this.dir[2]*this._radius;\n }\n } else if (this.kind === DIAL) {\n const cs = Math.cos(this.s), sn = Math.sin(this.s);\n if (r === DIRECTION) {\n out[0]=cs*this.r0[0]+sn*this.r1[0];\n out[1]=cs*this.r0[1]+sn*this.r1[1];\n out[2]=cs*this.r0[2]+sn*this.r1[2];\n } else {\n out[0]=this.anchor[0]+(cs*this.r0[0]+sn*this.r1[0])*this._radius;\n out[1]=this.anchor[1]+(cs*this.r0[1]+sn*this.r1[1])*this._radius;\n out[2]=this.anchor[2]+(cs*this.r0[2]+sn*this.r1[2])*this._radius;\n }\n } else {\n out[0]=this.pt[0]; out[1]=this.pt[1]; out[2]=this.pt[2];\n }\n return out;\n }\n\n /**\n * Current scalar parameter: AXIS → signed t along the line; DIAL →\n * accumulated angle θ in radians (multi-turn).\n * @returns {number} The parameter, or NaN for non-scalar constraints.\n */\n scalar() {\n return (this.kind === AXIS || this.kind === DIAL) ? this.s : NaN;\n }\n\n /**\n * Derive [az, el] from the current SPHERE direction (SPHERE only).\n * @param {number[]} out2 2-element destination [az, el].\n * @returns {number[]} out2\n */\n azEl(out2) {\n return azElFromDir(out2, this.dir[0], this.dir[1], this.dir[2]);\n }\n\n /**\n * Seed the canonical state from a value (used by the bridge on bind() so the\n * handle starts at the bound target's value). Chainable.\n * SPHERE — sets the unit direction (a point value recovers its heading).\n * PLANE — projects the value onto the plane.\n * AXIS — projects the value onto the line, clamped to extent.\n * DIAL — projects the value onto the dial plane, derives the wrapped\n * angle, and picks the WINDING NEAREST the current θ (so an\n * external sync doesn't unwind accumulated turns), clamped.\n *\n * @param {number} x,y,z Seed value.\n * @returns {Constraint} this\n */\n seed(x, y, z) {\n if (this.kind === SPHERE) {\n const vx=x-this.anchor[0], vy=y-this.anchor[1], vz=z-this.anchor[2];\n const l = Math.sqrt(vx*vx + vy*vy + vz*vz);\n if (l >= EPS) { this.dir[0]=vx/l; this.dir[1]=vy/l; this.dir[2]=vz/l; }\n } else if (this.kind === PLANE) {\n const wx=x-this.anchor[0], wy=y-this.anchor[1], wz=z-this.anchor[2];\n const d = wx*this.n[0] + wy*this.n[1] + wz*this.n[2];\n this.pt[0]=x-d*this.n[0]; this.pt[1]=y-d*this.n[1]; this.pt[2]=z-d*this.n[2];\n } else if (this.kind === AXIS) {\n const wx=x-this.anchor[0], wy=y-this.anchor[1], wz=z-this.anchor[2];\n const s = _clamp(wx*this.u[0] + wy*this.u[1] + wz*this.u[2], this.min, this.max);\n this.s = s;\n this.pt[0]=this.anchor[0]+s*this.u[0];\n this.pt[1]=this.anchor[1]+s*this.u[1];\n this.pt[2]=this.anchor[2]+s*this.u[2];\n } else if (this.kind === DIAL) {\n const wx=x-this.anchor[0], wy=y-this.anchor[1], wz=z-this.anchor[2];\n const px = wx*this.r0[0] + wy*this.r0[1] + wz*this.r0[2];\n const py = wx*this.r1[0] + wy*this.r1[1] + wz*this.r1[2];\n if (px*px + py*py >= EPS*EPS) {\n const a = Math.atan2(py, px);\n // Nearest winding to the current θ preserves accumulated turns.\n this.s = _clamp(a + TWO_PI$1 * Math.round((this.s - a) / TWO_PI$1),\n this.min, this.max);\n }\n this._dialPoint();\n }\n return this;\n }\n\n /**\n * Re-aim the constraint basis in the working space — the deferred-frame\n * seam (the p5.tree bridge's `from` opt resolves its symbolic basis through\n * mapDirection and calls this). Per kind:\n * PLANE — new normal; the point is re-projected onto the new plane.\n * AXIS — new direction; the scalar t is preserved, the point recomputed.\n * DIAL — new plane normal + optional θ=0 reference; θ is preserved, the\n * in-plane basis rebuilt (reference re-derived when omitted),\n * the point recomputed.\n * SPHERE — no basis; no-op.\n * Inputs are normalised; a zero-length axis keeps the previous one.\n * Chainable.\n *\n * @param {number} ax,ay,az New normal (PLANE) / direction (AXIS) / dial-plane normal (DIAL).\n * @param {number} [zx,zy,zz] DIAL only — θ=0 reference (re-derived when omitted).\n * @returns {Constraint} this\n */\n aim(ax, ay, az, zx, zy, zz) {\n if (this.kind === PLANE) {\n const px = this.n[0], py = this.n[1], pz = this.n[2];\n this.n[0] = ax; this.n[1] = ay; this.n[2] = az;\n _unit$1(this.n, px, py, pz);\n this.seed(this.pt[0], this.pt[1], this.pt[2]);\n } else if (this.kind === AXIS) {\n const px = this.u[0], py = this.u[1], pz = this.u[2];\n this.u[0] = ax; this.u[1] = ay; this.u[2] = az;\n _unit$1(this.u, px, py, pz);\n this.pt[0] = this.anchor[0] + this.s*this.u[0];\n this.pt[1] = this.anchor[1] + this.s*this.u[1];\n this.pt[2] = this.anchor[2] + this.s*this.u[2];\n } else if (this.kind === DIAL) {\n const px = this.u[0], py = this.u[1], pz = this.u[2];\n this.u[0] = ax; this.u[1] = ay; this.u[2] = az;\n _unit$1(this.u, px, py, pz);\n this._dialBasis(zx, zy, zz);\n this._dialPoint();\n }\n return this;\n }\n\n /**\n * The analytic pick proxy: the ray parameter t at which a ray in the\n * working space meets the grab proxy, or Infinity. `radius` is the grab\n * size in working-space units — a constant pixel size the caller converted\n * through pixelRatio at the proxy's depth. SPHERE / PLANE / AXIS: a sphere\n * of `radius` at the reported POINT. DIAL: the ring at the anchor with\n * tube radius `radius` (rayHitRing), so a grab lands anywhere on the ring.\n *\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} radius Grab radius, working units.\n * @returns {number} The nearest t ≥ 0, or Infinity.\n */\n proxy(ox, oy, oz, dx, dy, dz, radius) {\n const a = this.anchor;\n if (this.kind === DIAL) {\n return rayHitRing(ox,oy,oz, dx,dy,dz, a[0], a[1], a[2],\n this.u[0], this.u[1], this.u[2], this._radius, radius);\n }\n let px, py, pz;\n if (this.kind === SPHERE) {\n px = a[0] + this.dir[0]*this._radius;\n py = a[1] + this.dir[1]*this._radius;\n pz = a[2] + this.dir[2]*this._radius;\n } else {\n px = this.pt[0]; py = this.pt[1]; pz = this.pt[2];\n }\n return rayHitSphere(ox,oy,oz, dx,dy,dz, px,py,pz, radius);\n }\n}\n\n/**\n * Convenience factory mirroring the constructor. Handy for headless tests and\n * for the bridge, which otherwise calls `new Constraint(...)` directly.\n * @param {number} kind SPHERE | PLANE | AXIS | DIAL.\n * @param {Object} [opts]\n * @returns {Constraint}\n */\nfunction createConstraint(kind, opts) {\n return new Constraint(kind, opts);\n}\n\n/**\n * @file Source-agnostic 6-DOF pose helm — integrates a live rate stream into a\n * { pos, rot } pose. Renderer- and transport-agnostic. Zero dependencies.\n * @module tree/helm\n * @license AGPL-3.0-only\n *\n * A helm is the rate-stream sibling of the Track family: where a Track produces\n * a pose from keyframes over time, a helm produces a pose from a live 6-DOF\n * delta stream (a SpaceNavigator, a tracked hand, an agent policy). It is NOT a\n * handle — a handle reports a `vec3` solved from a pointer ray; a helm reports a\n * pose (position + orientation).\n *\n * Family placement (peer of PoseTrack, NOT a Track subclass — no timeline):\n * feed(translation, rotation) push the latest raw device rate (input, as Track.add)\n * step(out, dt, basis) integrate the rate by dt into the pose (BRIDGE-DRIVEN,\n * as Track.tick) — writes the new pose into out\n * eval(out) read the current { pos, rot } (zero-alloc, as Track.eval)\n * home(pose?) re-home the integrated pose (NOT reset — no keyframes to clear)\n *\n * Value layer (opt-in, §10): a per-helm `fullScale` keeps the read-outs honest\n * across input scales; an opt-in `filter` (oneEuro) conditions the fed rates\n * before the deadzone inside step; `poseDelta` differences two absolute poses\n * into a feedable rate. With `filter` null and the default `fullScale`, the\n * clean rate-native path is unchanged.\n *\n * Quaternion algebra is provided by quat.js. Out-first throughout; no allocation\n * in feed/step/eval. Storage convention (matches the rest of the core): vec3 and\n * quat state are plain number[] (f64) — the same shape as track.js keyframes and\n * the frozen basis-vector constants.\n *\n * ── Frame discipline (`from` / `basis`) ──────────────────────────────────────\n * The space the rates are interpreted in is named by `from` (WORLD | EYE | mat4),\n * a declaration the BRIDGE reads — the core never learns about a camera. The\n * resolved orientation arrives per-step as `basis`: an eye→world mat4 (or null\n * for WORLD ≡ the identity basis). Both the linear and angular rates are rotated\n * through that basis, then the quaternion is composed world-frame. This is the\n * single code path that covers both manipulation conventions:\n *\n * - camera body-fly — basis is the driven camera's own eye matrix (which this\n * helm produced last frame ⇒ equals the integrated `q`,\n * zero staleness); rotating a body delta through `q` then\n * world-composing is algebraically a body-frame compose.\n * - screen-relative — basis is the *viewing* camera's eye matrix (an external\n * frame); a push moves the target relative to the screen.\n *\n * Per-channel `from` ({ translation, rotation }) is a deferred, non-breaking\n * extension (one basis suffices today — pose-helm-design.md §8.3).\n */\n\n\n// =========================================================================\n// Module-level scratch — shared across helm instances (non-reentrant; step\n// is synchronous and called at most once per helm per frame).\n// =========================================================================\n\nconst _dq = [0, 0, 0, 1];\n\n// Scratch for the optional input filter (helm.filter). The fed rates are packed\n// into one 6-vector, conditioned, and unpacked to lin/ang triples before the\n// deadzone — so a single filter carries one state per helm. Shared across\n// instances (step is synchronous, at most once per helm per frame).\nconst _f6raw = [0, 0, 0, 0, 0, 0];\nconst _f6out = [0, 0, 0, 0, 0, 0];\nconst _fLin = [0, 0, 0];\nconst _fAng = [0, 0, 0];\n\n/**\n * Default full-deflection input magnitude — the fed rate a read-out shows as\n * full (the SpaceNavigator's saturated lane). Private to core: a transport on a\n * different raw scale sets helm.fullScale and never reads this, so there is no\n * public HELM_FULL export. Display-only; integration uses profile.sens directly.\n */\nconst HELM_FULL_SCALE = 500;\n\n// Deadzone gate — |v| > dz keeps v, else 0. Module-level so step allocates no\n// closure. Strictly-greater matches the e7 reference (rest reads exact 0).\nconst _dz = (v, dz) => (v > dz || v < -dz) ? v : 0;\n\n/**\n * Build the canonical default profile. SpaceNavigator-tuned lane permutation\n * and the eye-frame manipulation feel found in the e7 experiments; it is the\n * per-app / per-device mapping layer and is meant to be overwritten wholesale\n * (`helm.profile = { … }`) for a different transport.\n *\n * sign — per-app direction (camera-fly vs object-grab invert; flip live).\n * sens — per-axis sensitivity (tame roll without touching the rest).\n * lane — input-channel permutation: which fed channel drives this DOF.\n * T* lanes index the translation triple; R* lanes the rotation triple.\n */\nfunction _defaultProfile() {\n return {\n Tx: { sign: 1, sens: 0.30, lane: 0 },\n Ty: { sign: 1, sens: 0.30, lane: 2 },\n Tz: { sign: -1, sens: 0.30, lane: 1 },\n Rp: { sign: -1, sens: 0.0025, lane: 0 },\n Ry: { sign: -1, sens: 0.0025, lane: 2 },\n Rr: { sign: 1, sens: 0.0018, lane: 1 },\n };\n}\n\n/** Channel order — readout / iteration convenience (Tx Ty Tz Rp Ry Rr). */\nconst HELM_CHANNELS = Object.freeze(['Tx', 'Ty', 'Tz', 'Rp', 'Ry', 'Rr']);\n\n// =========================================================================\n// PoseHelm\n// =========================================================================\n\n/**\n * Source-agnostic 6-DOF pose producer. Holds a profile + the integrated pose;\n * no timeline (no keyframes, no play/seek/loop).\n */\nclass PoseHelm {\n constructor() {\n /**\n * DOF mapping table. Six channels, each `{ sign, sens, lane }`.\n * Public and mutable — set wholesale to re-map a device or app.\n * @type {{ Tx:Object, Ty:Object, Tz:Object, Rp:Object, Ry:Object, Rr:Object }}\n */\n this.profile = _defaultProfile();\n\n /**\n * Rest-drift floor. A fed rate with |value| ≤ deadzone reads as 0. Devices\n * that rest at exact 0 need only a small floor. @type {number}\n */\n this.deadzone = 8;\n\n /**\n * Full-deflection input magnitude for the read-outs (gizmo overlay + panel\n * meters): a fed rate of |fullScale| reads as a full bar / arrow. Set by a\n * transport whose saturated rate differs from the default (a gamepad stick\n * that saturates at 1 sets fullScale = 1). Display-only — integration uses\n * profile.sens directly, so this never affects flight. @type {number}\n */\n this.fullScale = HELM_FULL_SCALE;\n\n /**\n * Optional input conditioner applied to the fed rates BEFORE the deadzone,\n * inside step — a oneEuro filter, or any f(out, raw, dt) carrying function\n * with a reset(). null (the default) is the clean rate-native path: the\n * filter branch is skipped, so a clean device pays nothing. Set for noisy /\n * absolute sources; home() resets it. @type {?Function}\n */\n this.filter = null;\n\n /**\n * The space fed rates are interpreted in: a space constant (WORLD | EYE) or\n * a mat4 frame. Declarative only — the bridge reads this to resolve the\n * per-step `basis`; the core stays camera-agnostic. @type {string|ArrayLike<number>}\n */\n this.from = 'EYE';\n\n // Latest fed raw rates (refreshed by feed; persist until the next feed —\n // the transport is responsible for feeding 0 when motion should stop).\n this._lin = [0, 0, 0];\n this._ang = [0, 0, 0];\n\n // Integrated pose — the source of truth.\n this._pos = [0, 0, 0];\n this._q = [0, 0, 0, 1];\n }\n\n /**\n * Push the latest raw 6-DOF device rate. Either argument may be omitted to\n * leave that half unchanged (devices report the two halves on separate\n * frames). The value persists until the next feed. Raw device units — the\n * profile's `sens` does the scaling, so the same feed() suits any transport.\n *\n * @param {ArrayLike<number>} [translation] [tx, ty, tz] raw lane rates.\n * @param {ArrayLike<number>} [rotation] [rx, ry, rz] raw lane rates.\n * @returns {PoseHelm} this\n */\n feed(translation, rotation) {\n if (translation) {\n this._lin[0] = translation[0] || 0;\n this._lin[1] = translation[1] || 0;\n this._lin[2] = translation[2] || 0;\n }\n if (rotation) {\n this._ang[0] = rotation[0] || 0;\n this._ang[1] = rotation[1] || 0;\n this._ang[2] = rotation[2] || 0;\n }\n return this;\n }\n\n /**\n * Integrate the latest fed rate by `dt` seconds into the pose, then write the\n * pose into `out`. Bridge-driven (the player calls it each frame; a sketch\n * never does, as it never calls track.tick()).\n *\n * `basis` is the resolved `from` frame: an eye→world column-major mat4\n * (16-element ArrayLike), or null/omitted for WORLD (the identity basis). Its\n * columns supply the right/up/back axes; forward is −col2. Both the linear and\n * angular rates are rotated through it, then `q` is composed world-frame.\n *\n * Zero-allocation. `out` is `{ pos:number[3], rot:number[4] }`; omit it for a\n * fresh object.\n *\n * @param {{ pos:number[], rot:number[] }} [out]\n * @param {number} dt Elapsed time in seconds.\n * @param {ArrayLike<number>} [basis] Eye→world mat4, or null for WORLD.\n * @returns {{ pos:number[], rot:number[] }} out\n */\n step(out, dt, basis) {\n const p = this.profile, dz = this.deadzone;\n let lin = this._lin, ang = this._ang;\n\n // Value layer — condition the fed rates BEFORE the deadzone (the filter\n // narrows the jitter band; the deadzone then gates the residual to exact\n // zero). The filter carries state, so it is ticked exactly once per step;\n // activity() reads the raw fed rate and is left unfiltered (the read-out\n // shows device input, normalized by fullScale). Skipped when filter is null.\n const filter = this.filter;\n if (filter) {\n _f6raw[0] = lin[0]; _f6raw[1] = lin[1]; _f6raw[2] = lin[2];\n _f6raw[3] = ang[0]; _f6raw[4] = ang[1]; _f6raw[5] = ang[2];\n filter(_f6out, _f6raw, dt);\n _fLin[0] = _f6out[0]; _fLin[1] = _f6out[1]; _fLin[2] = _f6out[2];\n _fAng[0] = _f6out[3]; _fAng[1] = _f6out[4]; _fAng[2] = _f6out[5];\n lin = _fLin; ang = _fAng;\n }\n\n // Basis axes (right / up / forward). No basis ⇒ the identity eye matrix:\n // right +X, up +Y, forward −Z. Forward is −col2 (an eye→world matrix stores\n // the camera's BACK in col2), and the identity's col2 is +Z, so forward is\n // −Z — making step(out, dt, null) identical to step(out, dt, IDENTITY_MAT4),\n // as the `from` contract (\"null ≡ the identity basis\") promises.\n let rX = 1, rY = 0, rZ = 0;\n let uX = 0, uY = 1, uZ = 0;\n let fX = 0, fY = 0, fZ = -1;\n if (basis) {\n rX = basis[0]; rY = basis[1]; rZ = basis[2];\n uX = basis[4]; uY = basis[5]; uZ = basis[6];\n fX = -basis[8]; fY = -basis[9]; fZ = -basis[10];\n }\n\n // Angular: three rates → one delta quat, rotated into world, world-composed.\n const wx = _dz(ang[p.Rp.lane], dz) * p.Rp.sign * p.Rp.sens;\n const wy = _dz(ang[p.Ry.lane], dz) * p.Ry.sign * p.Ry.sens;\n const wz = _dz(ang[p.Rr.lane], dz) * p.Rr.sign * p.Rr.sens;\n const w = Math.sqrt(wx * wx + wy * wy + wz * wz);\n if (w > 0) {\n // Axis in world = basis · (wx,wy,wz); its length is w (basis orthonormal),\n // so the rotation angle is w·dt. qFromAxisAngle renormalizes the axis.\n const ax = wx * rX + wy * uX + wz * fX;\n const ay = wx * rY + wy * uY + wz * fY;\n const az = wx * rZ + wy * uZ + wz * fZ;\n qFromAxisAngle(_dq, ax, ay, az, w * dt);\n qMul(this._q, _dq, this._q); // delta already in world → world-frame compose\n qNormalize(this._q);\n }\n\n // Linear: three rates rotated into world, integrated by dt.\n const tx = _dz(lin[p.Tx.lane], dz) * p.Tx.sign * p.Tx.sens;\n const ty = _dz(lin[p.Ty.lane], dz) * p.Ty.sign * p.Ty.sens;\n const tz = _dz(lin[p.Tz.lane], dz) * p.Tz.sign * p.Tz.sens;\n this._pos[0] += (tx * rX + ty * uX + tz * fX) * dt;\n this._pos[1] += (tx * rY + ty * uY + tz * fY) * dt;\n this._pos[2] += (tx * rZ + ty * uZ + tz * fZ) * dt;\n\n return this.eval(out);\n }\n\n /**\n * Read the current pose into `out` (zero-alloc). The shared output contract\n * that feeds applyPose — mirrors Track.eval.\n *\n * @param {{ pos:number[], rot:number[] }} [out]\n * @returns {{ pos:number[], rot:number[] }} out\n */\n eval(out) {\n out = out || { pos: [0, 0, 0], rot: [0, 0, 0, 1] };\n out.pos[0] = this._pos[0]; out.pos[1] = this._pos[1]; out.pos[2] = this._pos[2];\n out.rot[0] = this._q[0]; out.rot[1] = this._q[1];\n out.rot[2] = this._q[2]; out.rot[3] = this._q[3];\n return out;\n }\n\n /**\n * Write the six effective channel rates (post deadzone·sign·sens) into `out6`,\n * in channel order [Tx, Ty, Tz, Rp, Ry, Rr]. The gizmo reads this to light the\n * DOFs being driven; readouts can show signed magnitudes. Zero-alloc.\n *\n * @param {number[]} out6 6-element destination.\n * @returns {number[]} out6\n */\n activity(out6) {\n const p = this.profile, dz = this.deadzone, lin = this._lin, ang = this._ang;\n out6[0] = _dz(lin[p.Tx.lane], dz) * p.Tx.sign * p.Tx.sens;\n out6[1] = _dz(lin[p.Ty.lane], dz) * p.Ty.sign * p.Ty.sens;\n out6[2] = _dz(lin[p.Tz.lane], dz) * p.Tz.sign * p.Tz.sens;\n out6[3] = _dz(ang[p.Rp.lane], dz) * p.Rp.sign * p.Rp.sens;\n out6[4] = _dz(ang[p.Ry.lane], dz) * p.Ry.sign * p.Ry.sens;\n out6[5] = _dz(ang[p.Rr.lane], dz) * p.Rr.sign * p.Rr.sens;\n return out6;\n }\n\n /**\n * Re-home the integrated pose. Sets position + orientation to `pose` (or the\n * identity pose when omitted) and clears any pending rate so the helm rests at\n * a clean, known state. NOT a reset — there are no keyframes to clear.\n *\n * @param {{ pos?:ArrayLike<number>, rot?:ArrayLike<number> }} [pose]\n * @returns {PoseHelm} this\n */\n home(pose) {\n if (pose && pose.pos) {\n this._pos[0] = pose.pos[0]; this._pos[1] = pose.pos[1]; this._pos[2] = pose.pos[2];\n } else {\n this._pos[0] = 0; this._pos[1] = 0; this._pos[2] = 0;\n }\n if (pose && pose.rot) {\n this._q[0] = pose.rot[0]; this._q[1] = pose.rot[1];\n this._q[2] = pose.rot[2]; this._q[3] = pose.rot[3];\n } else {\n this._q[0] = 0; this._q[1] = 0; this._q[2] = 0; this._q[3] = 1;\n }\n this._lin[0] = this._lin[1] = this._lin[2] = 0;\n this._ang[0] = this._ang[1] = this._ang[2] = 0;\n if (this.filter) this.filter.reset(); // drop filter state at the discontinuity\n return this;\n }\n}\n\n// =========================================================================\n// poseDelta — absolute pose → 6-DOF rate\n// =========================================================================\n\n/**\n * Difference two consecutive absolute poses into a 6-DOF rate the helm can be\n * fed — the bridge for absolute-pose transports (gesture / landmark / marker /\n * IMU) into feed(lin, ang). Out-first, zero-allocation.\n *\n * Linear rate is (cur.pos − prev.pos) / dt. Angular rate is the world-frame\n * angular velocity ω carrying prev.rot onto cur.rot over dt: the relative\n * rotation r = cur · conj(prev) (so cur = r · prev, the world-frame compose the\n * step integrates), read as axis · angle / dt.\n *\n * The double-cover guard is the whole reason to ship this rather than inline it:\n * a quaternion and its negation are the same orientation, so when\n * dot(prev.rot, cur.rot) < 0 the two samples sit on opposite hemispheres and a\n * naive difference takes the long way round — the angular rate spikes at the\n * crossing. Flipping cur into prev's hemisphere first keeps r the shortest arc.\n *\n * Fed through a helm in WORLD whose profile has unit `sens`, in-order lanes and\n * `Tz` / `Rr` signs of −1 — the helm's lanes are eye-frame and the null basis\n * is the identity eye matrix (forward −Z), so the two Z channels flip against\n * world axes — the integrated pose retraces the source (the round-trip e9\n * asserts). A 1:1, non-integrated consumer skips the helm and applyPoses the\n * absolute pose directly.\n *\n * @param {{ lin:number[], ang:number[] }} [out] Destination; omit for a fresh one.\n * @param {{ pos:ArrayLike<number>, rot:ArrayLike<number> }} prev Previous pose.\n * @param {{ pos:ArrayLike<number>, rot:ArrayLike<number> }} cur Current pose.\n * @param {number} dt Elapsed seconds between the two samples.\n * @returns {{ lin:number[], ang:number[] }} out\n */\nfunction poseDelta(out, prev, cur, dt) {\n out = out || { lin: [0, 0, 0], ang: [0, 0, 0] };\n const inv = 1 / dt;\n\n out.lin[0] = (cur.pos[0] - prev.pos[0]) * inv;\n out.lin[1] = (cur.pos[1] - prev.pos[1]) * inv;\n out.lin[2] = (cur.pos[2] - prev.pos[2]) * inv;\n\n const px = prev.rot[0], py = prev.rot[1], pz = prev.rot[2], pw = prev.rot[3];\n let cx = cur.rot[0], cy = cur.rot[1], cz = cur.rot[2], cw = cur.rot[3];\n\n // Double-cover guard: bring cur into prev's hemisphere so r is the short arc.\n if (px * cx + py * cy + pz * cz + pw * cw < 0) { cx = -cx; cy = -cy; cz = -cz; cw = -cw; }\n\n // Relative rotation r = cur · conj(prev), conj(prev) = (−px, −py, −pz, pw).\n const rx = -cw * px + cx * pw - cy * pz + cz * py;\n const ry = -cw * py + cx * pz + cy * pw - cz * px;\n const rz = -cw * pz - cx * py + cy * px + cz * pw;\n const rw = cw * pw + cx * px + cy * py + cz * pz; // = dot(prev, cur) ≥ 0 → angle ≤ π\n\n // Axis · angle of r → ω = axis · angle / dt. Below the threshold the rotation\n // is negligible (no well-defined axis) and the angular rate is exact zero.\n const sinHalf = Math.sqrt(rx * rx + ry * ry + rz * rz);\n if (sinHalf < 1e-8) {\n out.ang[0] = 0; out.ang[1] = 0; out.ang[2] = 0;\n } else {\n const k = (2 * Math.atan2(sinHalf, rw)) * inv / sinHalf;\n out.ang[0] = rx * k; out.ang[1] = ry * k; out.ang[2] = rz * k;\n }\n return out;\n}\n\n/**\n * @file Frustum planes and visibility tests — zero allocations.\n * @module tree/visibility\n * @license AGPL-3.0-only\n *\n * Planes are a flat Float64Array(24): 6 planes × 4 floats [a, b, c, d].\n * All inputs are scalars. All outputs are INVISIBLE | VISIBLE | SEMIVISIBLE.\n */\n\n\n// Plane indices\nconst PLANE_LEFT = 0, PLANE_RIGHT = 1, PLANE_NEAR = 2,\n PLANE_FAR = 3, PLANE_TOP = 4, PLANE_BOTTOM = 5;\n\n/**\n * Compute 6 frustum planes from camera basis (world space) + projection params.\n * All inputs are scalars — the addon extracts them from the inverse view matrix\n * and projection queries before calling.\n *\n * @param {Float64Array} out 24-float output.\n * @param {number} posX,posY,posZ Camera world position.\n * @param {number} vdX,vdY,vdZ View direction (−Z in eye space, world).\n * @param {number} upX,upY,upZ Camera up.\n * @param {number} rtX,rtY,rtZ Camera right.\n * @param {boolean} ortho true if orthographic.\n * @param {number} near,far,left,right,top,bottom\n * Projection extents in camera space.\n * Sign contract: top > 0, bottom < 0, right > 0, left < 0 for standard y-up camera.\n */\nfunction frustumPlanes(\n out,\n posX, posY, posZ,\n vdX, vdY, vdZ,\n upX, upY, upZ,\n rtX, rtY, rtZ,\n ortho,\n near, far, left, right, top, bottom\n) {\n const posViewDir = posX*vdX + posY*vdY + posZ*vdZ;\n const posRight = posX*rtX + posY*rtY + posZ*rtZ;\n const posUp = posX*upX + posY*upY + posZ*upZ;\n\n if (ortho) {\n // Left: normal = −right\n out[0] = -rtX; out[1] = -rtY; out[2] = -rtZ;\n out[3] = -(posRight - left) * -1; // dot(pos - right*left, -right) ... simplified:\n // Actually: d = dot(pointOnPlane, normal)\n // pointOnPlane = pos + right*left (left is negative for standard ortho)\n // normal = -right\n // d = dot(pos + right*left, -right) = -posRight - left\n out[3] = -posRight - left;\n\n // Right: normal = right\n out[4] = rtX; out[5] = rtY; out[6] = rtZ;\n out[7] = posRight + right;\n\n // Top: normal = up\n out[16] = upX; out[17] = upY; out[18] = upZ;\n out[19] = posUp + top;\n\n // Bottom: normal = -up\n out[20] = -upX; out[21] = -upY; out[22] = -upZ;\n out[23] = -posUp - bottom;\n } else {\n // Left\n const hfovl = Math.atan2(left, near);\n const shfovl = Math.sin(hfovl), chfovl = Math.cos(hfovl);\n out[0] = vdX*shfovl - rtX*chfovl;\n out[1] = vdY*shfovl - rtY*chfovl;\n out[2] = vdZ*shfovl - rtZ*chfovl;\n out[3] = shfovl*posViewDir - chfovl*posRight;\n\n // Right\n const hfovr = Math.atan2(right, near);\n const shfovr = Math.sin(hfovr), chfovr = Math.cos(hfovr);\n out[4] = -vdX*shfovr + rtX*chfovr;\n out[5] = -vdY*shfovr + rtY*chfovr;\n out[6] = -vdZ*shfovr + rtZ*chfovr;\n out[7] = -shfovr*posViewDir + chfovr*posRight;\n\n // Top\n const fovt = Math.atan2(top, near);\n const sfovt = Math.sin(fovt), cfovt = Math.cos(fovt);\n out[16] = -vdX*sfovt + upX*cfovt;\n out[17] = -vdY*sfovt + upY*cfovt;\n out[18] = -vdZ*sfovt + upZ*cfovt;\n out[19] = -sfovt*posViewDir + cfovt*posUp;\n\n // Bottom\n const fovb = Math.atan2(bottom, near);\n const sfovb = Math.sin(fovb), cfovb = Math.cos(fovb);\n out[20] = vdX*sfovb - upX*cfovb;\n out[21] = vdY*sfovb - upY*cfovb;\n out[22] = vdZ*sfovb - upZ*cfovb;\n out[23] = sfovb*posViewDir - cfovb*posUp;\n }\n\n // Near plane: normal = −viewDir\n out[8] = -vdX; out[9] = -vdY; out[10] = -vdZ;\n out[11] = -posViewDir - near;\n\n // Far plane: normal = viewDir\n out[12] = vdX; out[13] = vdY; out[14] = vdZ;\n out[15] = posViewDir + far;\n\n return out;\n}\n\n/**\n * Signed distance from point to one frustum plane.\n * @param {Float64Array} planes 24-float planes buffer.\n * @param {number} planeIdx 0–5 (LEFT, RIGHT, NEAR, FAR, TOP, BOTTOM).\n * @param {number} px,py,pz Point coordinates.\n * @returns {number}\n */\nfunction distanceToPlane(planes, planeIdx, px, py, pz) {\n const b = planeIdx * 4;\n return planes[b]*px + planes[b+1]*py + planes[b+2]*pz - planes[b+3];\n}\n\n/** @returns {number} INVISIBLE | VISIBLE | SEMIVISIBLE */\nfunction pointVisibility(planes, px, py, pz) {\n for (let i = 0; i < 6; i++) {\n if (distanceToPlane(planes, i, px, py, pz) > 0) return INVISIBLE;\n }\n return VISIBLE;\n}\n\n/** @returns {number} INVISIBLE | VISIBLE | SEMIVISIBLE */\nfunction sphereVisibility(planes, cx, cy, cz, radius) {\n let allIn = true;\n for (let i = 0; i < 6; i++) {\n const d = distanceToPlane(planes, i, cx, cy, cz);\n if (d > radius) return INVISIBLE;\n if (d > 0 || -d < radius) allIn = false;\n }\n return allIn ? VISIBLE : SEMIVISIBLE;\n}\n\n/** @returns {number} INVISIBLE | VISIBLE | SEMIVISIBLE */\nfunction boxVisibility(planes, x0, y0, z0, x1, y1, z1) {\n let allIn = true;\n for (let i = 0; i < 6; i++) {\n const b = i * 4;\n const a = planes[b], bv = planes[b+1], c = planes[b+2], d = planes[b+3];\n let allOut = true;\n for (let corner = 0; corner < 8; corner++) {\n const cx = (corner & 4) ? x0 : x1;\n const cy = (corner & 2) ? y0 : y1;\n const cz = (corner & 1) ? z0 : z1;\n const dist = a*cx + bv*cy + c*cz - d;\n if (dist > 0) { allIn = false; }\n else { allOut = false; }\n }\n if (allOut) return INVISIBLE;\n }\n return allIn ? VISIBLE : SEMIVISIBLE;\n}\n\n/**\n * @file Camera state ↔ matrices: builders, decomposers, and in-place edits.\n * @module tree/camera\n * @license AGPL-3.0-only\n *\n * The camera is plain data — the CameraTrack keyframe shape:\n *\n * cam = {\n * eye: [x, y, z], // position\n * center: [x, y, z], // lookat target; |center − eye| is the gaze distance\n * up: [x, y, z], // up hint, need not be unit\n * fov: number | null, // vertical field of view, radians — perspective\n * halfHeight: number | null, // world-unit half-height at the near plane — orthographic\n * near: number, // > 0\n * far: number, // > near\n * }\n *\n * Exactly one of fov / halfHeight is meaningful; fov wins when both are set.\n * With both null the lens is \"unchanged\": cameraProj and cameraPlanes return\n * null and leave their output untouched, so a track that evaluates null into\n * the state keeps the last projection installed. A track writes the state\n * directly — `track.eval(cam)` — and a pose drives it through cameraFromPose.\n *\n * The state carries no aspect ratio — the viewport owns it — so one state is\n * portable between targets of different sizes; every builder that needs it\n * takes it as an argument.\n *\n * Vectors are plain number[] (f64, authoring state); matrices are written into\n * whatever 16-element buffer the caller passes. createCamera is the one\n * allocating call; everything else is out-first (or in-place) and zero-alloc.\n *\n * Every function that needs the camera frame derives it through mat4Eye, so\n * planes and edits agree with cameraEye / cameraView exactly — including the\n * up re-seed when the view direction is parallel to the up hint.\n */\n\n\nconst _E$1 = new Float64Array(16); // eye→world frame scratch: right 0–2, up 4–6, back 8–10\nconst _d = [0, 0, 0]; // view-direction scratch\n\n/** Eye→world frame of `cam` into `_E`. */\nfunction _frame(cam) {\n const e = cam.eye, c = cam.center, u = cam.up;\n mat4Eye(_E$1, e[0],e[1],e[2], c[0],c[1],c[2], u[0],u[1],u[2]);\n}\n\n/** Gaze distance |center − eye|, or 1 when the state is degenerate. */\nfunction _gaze(cam) {\n const dx = cam.center[0]-cam.eye[0], dy = cam.center[1]-cam.eye[1], dz = cam.center[2]-cam.eye[2];\n const d = Math.sqrt(dx*dx+dy*dy+dz*dz);\n return d > 0 ? d : 1;\n}\n\nfunction _vec3(v, x, y, z) { return v != null ? [v[0], v[1], v[2]] : [x, y, z]; }\n\n// =========================================================================\n// State\n// =========================================================================\n\n/**\n * Allocate a camera state — the one allocating call, setup-time.\n * Defaults: eye [0, 0, 500], center [0, 0, 0], up [0, 1, 0], fov π/3,\n * halfHeight null, near 0.1, far 1000. Passing halfHeight without fov yields\n * an orthographic state (fov null).\n *\n * @param {{ eye?:number[], center?:number[], up?:number[], fov?:number|null,\n * halfHeight?:number|null, near?:number, far?:number }} [opts]\n * @returns {{ eye:number[], center:number[], up:number[], fov:number|null,\n * halfHeight:number|null, near:number, far:number }}\n */\nfunction createCamera(opts) {\n const o = opts || {};\n const ortho = o.halfHeight != null && o.fov === undefined;\n return {\n eye: _vec3(o.eye, 0, 0, 500),\n center: _vec3(o.center, 0, 0, 0),\n up: _vec3(o.up, 0, 1, 0),\n fov: o.fov !== undefined ? o.fov : (ortho ? null : Math.PI / 3),\n halfHeight: o.halfHeight !== undefined ? o.halfHeight : null,\n near: typeof o.near === 'number' ? o.near : 0.1,\n far: typeof o.far === 'number' ? o.far : 1000,\n };\n}\n\n/**\n * Copy one camera state into another (an orbit's home, a track's capture).\n * @param {object} out Destination state.\n * @param {object} cam Source state.\n * @returns {object} out\n */\nfunction cameraCopy(out, cam) {\n out.eye[0]=cam.eye[0]; out.eye[1]=cam.eye[1]; out.eye[2]=cam.eye[2];\n out.center[0]=cam.center[0]; out.center[1]=cam.center[1]; out.center[2]=cam.center[2];\n out.up[0]=cam.up[0]; out.up[1]=cam.up[1]; out.up[2]=cam.up[2];\n out.fov = cam.fov; out.halfHeight = cam.halfHeight;\n out.near = cam.near; out.far = cam.far;\n return out;\n}\n\n// =========================================================================\n// Builders — state → matrices\n// =========================================================================\n\n/**\n * View matrix (world→eye) from the state's lookat.\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {object} cam\n * @returns {Float32Array|number[]} out\n */\nfunction cameraView(out, cam) {\n const e = cam.eye, c = cam.center, u = cam.up;\n return mat4View(out, e[0],e[1],e[2], c[0],c[1],c[2], u[0],u[1],u[2]);\n}\n\n/**\n * Eye matrix (eye→world) from the state's lookat.\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {object} cam\n * @returns {Float32Array|number[]} out\n */\nfunction cameraEye(out, cam) {\n const e = cam.eye, c = cam.center, u = cam.up;\n return mat4Eye(out, e[0],e[1],e[2], c[0],c[1],c[2], u[0],u[1],u[2]);\n}\n\n/**\n * Projection matrix from the state's lens: mat4Persp from fov, or mat4Ortho\n * from halfHeight, with symmetric extents (top = near · tan(fov / 2) or\n * halfHeight; right = top · aspect).\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {object} cam\n * @param {number} aspect Viewport width / height.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @param {number} [ndcYSign=1] +1 NDC y-up; −1 NDC y-down.\n * @returns {Float32Array|number[]|null} out, or null (out untouched) when\n * both fov and halfHeight are null.\n */\nfunction cameraProj(out, cam, aspect, ndcZMin, ndcYSign = 1) {\n const near = cam.near, far = cam.far;\n if (cam.fov != null) {\n const top = near * Math.tan(cam.fov / 2), right = top * aspect;\n return mat4Persp(out, -right, right, -top, top, near, far, ndcZMin, ndcYSign);\n }\n if (cam.halfHeight != null) {\n const top = cam.halfHeight, right = top * aspect;\n return mat4Ortho(out, -right, right, -top, top, near, far, ndcZMin, ndcYSign);\n }\n return null;\n}\n\n/**\n * The six frustum planes of the state, world space — frustumPlanes over the\n * lookat basis and the symmetric extents cameraProj uses, so visibility tests\n * run against a camera state without any matrix.\n *\n * @param {Float64Array} planes 24-element destination.\n * @param {object} cam\n * @param {number} aspect Viewport width / height.\n * @returns {Float64Array|null} planes, or null (planes untouched) when both\n * fov and halfHeight are null.\n */\nfunction cameraPlanes(planes, cam, aspect) {\n const ortho = cam.fov == null;\n if (ortho && cam.halfHeight == null) return null;\n const top = ortho ? cam.halfHeight : cam.near * Math.tan(cam.fov / 2), right = top * aspect;\n _frame(cam);\n const e = cam.eye;\n return frustumPlanes(planes,\n e[0], e[1], e[2],\n -_E$1[8], -_E$1[9], -_E$1[10],\n _E$1[4], _E$1[5], _E$1[6],\n _E$1[0], _E$1[1], _E$1[2],\n ortho, cam.near, cam.far, -right, right, top, -top);\n}\n\n// =========================================================================\n// Decomposers — matrices and poses → state\n// =========================================================================\n\n/**\n * Read a state back from an eye matrix and a projection: eye ← column 3,\n * up ← column 1, forward ← −column 2 of E; center ← eye + forward · d with d\n * the state's current gaze distance (1 when degenerate), so the distance\n * survives a round trip. The lens comes from the projection queries: fov or\n * halfHeight by projIsOrtho, near and far under `ndcZMin`.\n *\n * @param {object} cam State written in place.\n * @param {ArrayLike<number>} E Eye matrix (eye→world), 16 elements.\n * @param {ArrayLike<number>} P Projection matrix, 16 elements.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @returns {object} cam\n */\nfunction cameraFromMat4(cam, E, P, ndcZMin) {\n const d = _gaze(cam);\n let fx = -E[8], fy = -E[9], fz = -E[10];\n const fl = Math.sqrt(fx*fx+fy*fy+fz*fz) || 1;\n fx /= fl; fy /= fl; fz /= fl;\n cam.eye[0]=E[12]; cam.eye[1]=E[13]; cam.eye[2]=E[14];\n cam.up[0]=E[4]; cam.up[1]=E[5]; cam.up[2]=E[6];\n cam.center[0]=cam.eye[0]+fx*d; cam.center[1]=cam.eye[1]+fy*d; cam.center[2]=cam.eye[2]+fz*d;\n if (projIsOrtho(P)) { cam.fov = null; cam.halfHeight = projTop(P, ndcZMin); }\n else { cam.fov = projFov(P); cam.halfHeight = null; }\n cam.near = projNear(P, ndcZMin);\n cam.far = projFar(P);\n return cam;\n}\n\n/**\n * Drive the lookat from a TRS pose: eye ← pos, up and forward from the\n * rotation's columns 1 and −2, center ← eye + forward · d with d the current\n * gaze distance (1 when degenerate). The lens is untouched; `scl` is ignored.\n *\n * @param {object} cam State written in place.\n * @param {{ pos:number[], rot:number[] }} pose rot is a unit quaternion [x,y,z,w].\n * @returns {object} cam\n */\nfunction cameraFromPose(cam, pose) {\n const d = _gaze(cam);\n const q = pose.rot, x=q[0], y=q[1], z=q[2], w=q[3];\n const x2=x+x, y2=y+y, z2=z+z;\n const xx=x*x2, xy=x*y2, xz=x*z2, yy=y*y2, yz=y*z2, zz=z*z2, wx=w*x2, wy=w*y2, wz=w*z2;\n const ux=xy-wz, uy=1-(xx+zz), uz=yz+wx; // column 1 of qToMat4(rot): up\n const bx=xz+wy, by=yz-wx, bz=1-(xx+yy); // column 2: back\n cam.eye[0]=pose.pos[0]; cam.eye[1]=pose.pos[1]; cam.eye[2]=pose.pos[2];\n cam.up[0]=ux; cam.up[1]=uy; cam.up[2]=uz;\n cam.center[0]=cam.eye[0]-bx*d; cam.center[1]=cam.eye[1]-by*d; cam.center[2]=cam.eye[2]-bz*d;\n return cam;\n}\n\n/**\n * The lookat as a TRS pose: pos ← eye, rot ← qFromLookDir(center − eye, up) —\n * the rotation of cameraEye, so a helm seeded from it continues the frame.\n *\n * @param {{ pos:number[], rot:number[] }} pose Written in place.\n * @param {object} cam\n * @returns {{ pos:number[], rot:number[] }} pose\n */\nfunction cameraToPose(pose, cam) {\n pose.pos[0]=cam.eye[0]; pose.pos[1]=cam.eye[1]; pose.pos[2]=cam.eye[2];\n _d[0]=cam.center[0]-cam.eye[0]; _d[1]=cam.center[1]-cam.eye[1]; _d[2]=cam.center[2]-cam.eye[2];\n qFromLookDir(pose.rot, _d, cam.up);\n return pose;\n}\n\n// =========================================================================\n// Edits — in place, chainable, zero-alloc\n// =========================================================================\n\n/**\n * Orbit the eye about the center: `dAz` rotates it about the up hint\n * (right-handed); `dEl` raises its elevation above the plane through the\n * center perpendicular to the hint, clamped to ±opts.maxEl so the view\n * direction never reaches the hint (the pole guard). `up` is left as the hint\n * it was, so an orbit never rolls. A state already at the pole is pulled\n * inside the guard by its first non-zero edit; (0, 0) is a no-op.\n *\n * @param {object} cam\n * @param {number} dAz Azimuth delta, radians.\n * @param {number} dEl Elevation delta, radians.\n * @param {{ maxEl?:number }} [opts] Elevation limit; default π/2 − 1e-3.\n * @returns {object} cam\n */\nfunction cameraOrbit(cam, dAz, dEl, opts) {\n if (dAz === 0 && dEl === 0) return cam;\n const maxEl = opts && typeof opts.maxEl === 'number' ? opts.maxEl : Math.PI / 2 - 1e-3;\n const e = cam.eye, c = cam.center;\n let ux=cam.up[0], uy=cam.up[1], uz=cam.up[2];\n const ul = Math.sqrt(ux*ux+uy*uy+uz*uz) || 1;\n ux/=ul; uy/=ul; uz/=ul;\n const dx=e[0]-c[0], dy=e[1]-c[1], dz=e[2]-c[2];\n const r = Math.sqrt(dx*dx+dy*dy+dz*dz);\n _frame(cam);\n const px=_E$1[4], py=_E$1[5], pz=_E$1[6]; // the eye's up\n const bx=_E$1[8], by=_E$1[9], bz=_E$1[10]; // back: center → eye, unit\n // elevation: raise by θ within the (back, up) plane, clamped\n const el = Math.asin(Math.max(-1, Math.min(1, bx*ux+by*uy+bz*uz)));\n const th = Math.max(-maxEl, Math.min(maxEl, el + dEl)) - el;\n const ct = Math.cos(th), st = Math.sin(th);\n const ox = r*(bx*ct+px*st), oy = r*(by*ct+py*st), oz = r*(bz*ct+pz*st);\n // azimuth: rotate about the hint (Rodrigues)\n const ca = Math.cos(dAz), sa = Math.sin(dAz), k = (ux*ox+uy*oy+uz*oz)*(1-ca);\n e[0] = c[0] + ox*ca + (uy*oz-uz*oy)*sa + ux*k;\n e[1] = c[1] + oy*ca + (uz*ox-ux*oz)*sa + uy*k;\n e[2] = c[2] + oz*ca + (ux*oy-uy*ox)*sa + uz*k;\n return cam;\n}\n\n/**\n * Dolly: scale the gaze distance by `factor` — the eye moves along the view\n * direction under perspective; under orthographic (fov null, halfHeight set)\n * halfHeight is scaled instead, since moving the eye changes nothing on\n * screen. opts.min / opts.max clamp the scaled quantity. An edit that would\n * make it non-positive is a no-op.\n *\n * @param {object} cam\n * @param {number} factor\n * @param {{ min?:number, max?:number }} [opts]\n * @returns {object} cam\n */\nfunction cameraDolly(cam, factor, opts) {\n const min = opts && typeof opts.min === 'number' ? opts.min : 0;\n const max = opts && typeof opts.max === 'number' ? opts.max : Infinity;\n if (cam.fov == null && cam.halfHeight != null) {\n const h = Math.max(min, Math.min(max, cam.halfHeight * factor));\n if (h > 0) cam.halfHeight = h;\n return cam;\n }\n const e = cam.eye, c = cam.center;\n const dx=e[0]-c[0], dy=e[1]-c[1], dz=e[2]-c[2];\n const r = Math.sqrt(dx*dx+dy*dy+dz*dz);\n if (r === 0) return cam;\n const r1 = Math.max(min, Math.min(max, r * factor));\n if (!(r1 > 0)) return cam;\n const s = r1 / r;\n e[0]=c[0]+dx*s; e[1]=c[1]+dy*s; e[2]=c[2]+dz*s;\n return cam;\n}\n\n/**\n * Pan: translate eye and center by `dx` along the eye's right and `dy` along\n * its up, world units. The caller converts pixels through pixelRatio at the\n * center's depth so a pan tracks the pointer.\n *\n * @param {object} cam\n * @param {number} dx\n * @param {number} dy\n * @returns {object} cam\n */\nfunction cameraPan(cam, dx, dy) {\n _frame(cam);\n const tx=_E$1[0]*dx+_E$1[4]*dy, ty=_E$1[1]*dx+_E$1[5]*dy, tz=_E$1[2]*dx+_E$1[6]*dy;\n const e = cam.eye, c = cam.center;\n e[0]+=tx; e[1]+=ty; e[2]+=tz;\n c[0]+=tx; c[1]+=ty; c[2]+=tz;\n return cam;\n}\n\n/**\n * @file Gizmo line generators in the arrays shape.\n * @module tree/gizmo\n * @license AGPL-3.0-only\n *\n * A gizmo is geometry that explains: axes, a grid, a frustum, a path, a rig,\n * a handle's locus. This module generates its vertices — renderer-free, into\n * caller-owned arrays shaped the way twgl's createBufferInfoFromArrays\n * consumes them and a WebGPU vertex buffer is filled from — and nothing\n * else. Drawing, colour state, HUD mode, textures, the dot at a handle's\n * point, text: all the bridge's or the host's.\n *\n * ── The arrays shape ───────────────────────────────────────────────────────\n *\n * out = {\n * position: { numComponents: 3, data: Float32Array(3 · capacity) },\n * color: { numComponents: 4, data: Float32Array(4 · capacity) }, // optional\n * texcoord: { numComponents: 2, data: Float32Array(2 · capacity) }, // optional — panes\n * count: 0, // vertices written\n * labels: [], // optional — { x, y, z, text }\n * }\n *\n * Line generators write line lists — vertex pairs, no indices; paneTris\n * writes two triangles. capacity is position.data.length / 3.\n *\n * ── The contract — snprintf-style ──────────────────────────────────────────\n * Every generator gen(out, …) → n returns the vertex count it needs, writes\n * min(n, capacity) vertices, and sets out.count to what it wrote. A caller\n * sizes once and grows never in steady state:\n *\n * let n = axesLines(out, opts)\n * if (n > capacityOf(out)) { growArrays(out, n); axesLines(out, opts) }\n *\n * Each generator states its count formula so a caller can pre-size exactly.\n *\n * ── Colour ─────────────────────────────────────────────────────────────────\n * If out.color exists, every vertex written gets a colour: a generator with\n * semantic colouring (axes, the helm rig) writes its palette, every other\n * generator writes opts.color (default white). If out.color is absent\n * nothing is written and the bridge draws with a uniform colour.\n *\n * ── Frames ─────────────────────────────────────────────────────────────────\n * A generator writes in the frame the caller means — model space for scene\n * gizmos (the bridge's M places them), screen pixels for HUD gizmos.\n * Nothing here consults a camera except locusLines and frustumLines, which\n * take what they need explicitly. Signatures: out first, the subject second\n * where there is one, options last.\n */\n\n\nconst TWO_PI = Math.PI * 2;\nconst _AXIS_COLORS = [COLOR_X, COLOR_Y, COLOR_Z];\nconst _U = [1, 0, 0], _V = [0, 1, 0]; // the HUD plane's basis\nconst _E = new Float64Array(16); // a camera state's eye matrix\nconst _p3 = [0, 0, 0]; // a transformed corner / a sampled point\nconst _q3 = [0, 0, 0]; // the previous sampled point\nconst _c24 = new Float64Array(24); // frustum corners scratch\nconst _tIn = [0, 0, 0], _tOut = [0, 0, 0]; // a keyframe's tangents\nconst _act = [0, 0, 0, 0, 0, 0]; // a helm's activity\nconst _tip = [0, 0, 0], _ha = [0, 0, 0]; // an arrow's tip and head base\nconst _AXES = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\nconst _b0 = [0, 0, 0], _b1 = [0, 0, 0], _b2 = [0, 0, 0]; // a locus basis\nconst _UV_DEFAULT = [0, 1, 1, 1, 1, 0, 0, 0]; // paneTris: p0 top-left → (0, 1), clockwise\n\n// =========================================================================\n// G1 Arrays — the one allocating call, growth, capacity\n// =========================================================================\n\n/**\n * Allocate an arrays object of `capacity` vertices — the one allocating\n * call, setup-time. Flags add the optional attributes and the label list.\n *\n * @param {number} capacity Vertices.\n * @param {{ color?:boolean, texcoord?:boolean, labels?:boolean }} [opts]\n * @returns {{ position:{numComponents:number,data:Float32Array},\n * color?:{numComponents:number,data:Float32Array},\n * texcoord?:{numComponents:number,data:Float32Array},\n * count:number, labels?:object[] }}\n */\nfunction createArrays(capacity, opts) {\n const o = opts || {};\n const n = Math.max(0, capacity | 0);\n const out = { position: { numComponents: 3, data: new Float32Array(3 * n) } };\n if (o.color) out.color = { numComponents: 4, data: new Float32Array(4 * n) };\n if (o.texcoord) out.texcoord = { numComponents: 2, data: new Float32Array(2 * n) };\n out.count = 0;\n if (o.labels) out.labels = [];\n return out;\n}\n\n/**\n * Reallocate an arrays object to a new capacity, keeping its attribute set;\n * the data is fresh (a generator refills it) and count is 0.\n *\n * @param {object} out An arrays object from createArrays.\n * @param {number} capacity Vertices.\n * @returns {object} out\n */\nfunction growArrays(out, capacity) {\n const n = Math.max(0, capacity | 0);\n out.position.data = new Float32Array(3 * n);\n if (out.color) out.color.data = new Float32Array(4 * n);\n if (out.texcoord) out.texcoord.data = new Float32Array(2 * n);\n out.count = 0;\n if (out.labels) out.labels.length = 0;\n return out;\n}\n\n/**\n * The vertex capacity of an arrays object: position.data.length / 3.\n * @param {object} out\n * @returns {number}\n */\nfunction capacityOf(out) {\n return (out.position.data.length / 3) | 0;\n}\n\n// =========================================================================\n// G2 The writer — a cursor over out; counts every vertex, writes those\n// within capacity. Module-level scratch: a generator runs to completion.\n// =========================================================================\n\nconst _w = { pos: null, col: null, tex: null, cap: 0, n: 0, r: 1, g: 1, b: 1, a: 1 };\nconst _WHITE = [1, 1, 1, 1];\n\nfunction _begin(out) {\n _w.pos = out.position.data;\n _w.col = out.color ? out.color.data : null;\n _w.tex = out.texcoord ? out.texcoord.data : null;\n _w.cap = (_w.pos.length / 3) | 0;\n _w.n = 0;\n if (out.labels) out.labels.length = 0;\n}\n\n/** Set the current colour from an RGB(A) array, with an alpha override. */\nfunction _color(c, alpha) {\n const v = c || _WHITE;\n _w.r = v[0]; _w.g = v[1]; _w.b = v[2];\n _w.a = alpha != null ? alpha : (v.length > 3 ? v[3] : 1);\n}\n\nfunction _vertex(x, y, z) {\n const n = _w.n++;\n if (n >= _w.cap) return;\n const p = _w.pos, i = 3 * n;\n p[i] = x; p[i + 1] = y; p[i + 2] = z;\n const c = _w.col;\n if (c) { const j = 4 * n; c[j] = _w.r; c[j + 1] = _w.g; c[j + 2] = _w.b; c[j + 3] = _w.a; }\n}\n\nfunction _line(x0, y0, z0, x1, y1, z1) {\n _vertex(x0, y0, z0);\n _vertex(x1, y1, z1);\n}\n\n/** A vertex with a texture coordinate (written when out.texcoord exists). */\nfunction _vertexUV(x, y, z, u, v) {\n const n = _w.n;\n _vertex(x, y, z);\n if (_w.tex && n < _w.cap) { _w.tex[2*n] = u; _w.tex[2*n + 1] = v; }\n}\n\n/** Normalise v in place; a zero vector becomes (dx, dy, dz). */\nfunction _unit(v, dx, dy, dz) {\n const l = Math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);\n if (l < 1e-9) { v[0] = dx; v[1] = dy; v[2] = dz; return v; }\n v[0] /= l; v[1] /= l; v[2] /= l;\n return v;\n}\n\n/** Orthonormal in-plane basis (ub, vb) for a unit normal n, seeded from the least-aligned axis. */\nfunction _basis(n, ub, vb) {\n const ax = Math.abs(n[0]), ay = Math.abs(n[1]), az = Math.abs(n[2]);\n let rx = 0, ry = 0, rz = 0;\n if (ax <= ay && ax <= az) rx = 1; else if (ay <= az) ry = 1; else rz = 1;\n ub[0] = ry*n[2] - rz*n[1]; ub[1] = rz*n[0] - rx*n[2]; ub[2] = rx*n[1] - ry*n[0];\n _unit(ub, 1, 0, 0);\n vb[0] = n[1]*ub[2] - n[2]*ub[1]; vb[1] = n[2]*ub[0] - n[0]*ub[2]; vb[2] = n[0]*ub[1] - n[1]*ub[0];\n}\n\n/** The four edges of a square of half-extent h at c, spanned by u, v. */\nfunction _square(c, u, v, h) {\n const x0 = c[0] - h*u[0] - h*v[0], y0 = c[1] - h*u[1] - h*v[1], z0 = c[2] - h*u[2] - h*v[2];\n const x1 = c[0] + h*u[0] - h*v[0], y1 = c[1] + h*u[1] - h*v[1], z1 = c[2] + h*u[2] - h*v[2];\n const x2 = c[0] + h*u[0] + h*v[0], y2 = c[1] + h*u[1] + h*v[1], z2 = c[2] + h*u[2] + h*v[2];\n const x3 = c[0] - h*u[0] + h*v[0], y3 = c[1] - h*u[1] + h*v[1], z3 = c[2] - h*u[2] + h*v[2];\n _line(x0, y0, z0, x1, y1, z1);\n _line(x1, y1, z1, x2, y2, z2);\n _line(x2, y2, z2, x3, y3, z3);\n _line(x3, y3, z3, x0, y0, z0);\n}\n\n/** Close the write: count ← what fits; return what was needed. */\nfunction _end(out) {\n out.count = _w.n < _w.cap ? _w.n : _w.cap;\n return _w.n;\n}\n\n/** A sampled circle (or arc of `sweep`) of radius r at c, spanned by u, v: n segments. */\nfunction _ring(cx, cy, cz, r, u, v, n, sweep) {\n let px = 0, py = 0, pz = 0;\n for (let i = 0; i <= n; i++) {\n const t = (i / n) * sweep;\n const ct = Math.cos(t) * r, st = Math.sin(t) * r;\n const x = cx + ct*u[0] + st*v[0];\n const y = cy + ct*u[1] + st*v[1];\n const z = cz + ct*u[2] + st*v[2];\n if (i > 0) _line(px, py, pz, x, y, z);\n px = x; py = y; pz = z;\n }\n}\n\n// =========================================================================\n// G3 Axes, grid, cross, bulls-eye, ring\n// =========================================================================\n\n/**\n * A coordinate frame at the origin: six half-axes by bit and, with LABELS,\n * the X (2 lines) · Y (4) · Z (3) glyphs at 1.04 · size, sized size / 40 ×\n * size / 30. Semantic colour per axis and its glyph (COLOR_X / Y / Z), or\n * opts.color when `semantic` is false.\n *\n * Count: 2 · axes + 18 · (LABELS ? 1 : 0), at most 30.\n *\n * @param {object} out Arrays object.\n * @param {{ size?:number, bits?:number, semantic?:boolean, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction axesLines(out, opts) {\n const o = opts || {};\n const size = o.size ?? 100;\n const bits = o.bits ?? (LABELS | X | Y | Z);\n const semantic = o.semantic !== false;\n const axis = (i) => _color(semantic ? _AXIS_COLORS[i] : o.color);\n _begin(out);\n if (bits & LABELS) {\n const cw = size/40, ch = size/30, cs = 1.04*size;\n axis(0);\n _line(cs, cw, -ch, cs, -cw, ch);\n _line(cs, -cw, -ch, cs, cw, ch);\n axis(1);\n _line( cw, cs, ch, 0, cs, 0);\n _line( 0, cs, 0, -cw, cs, ch);\n _line(-cw, cs, ch, 0, cs, 0);\n _line( 0, cs, 0, 0, cs, -ch);\n axis(2);\n _line(-cw, -ch, cs, cw, -ch, cs);\n _line( cw, -ch, cs, -cw, ch, cs);\n _line(-cw, ch, cs, cw, ch, cs);\n }\n axis(0);\n if (bits & X) _line(0, 0, 0, size, 0, 0);\n if (bits & _X) _line(0, 0, 0, -size, 0, 0);\n axis(1);\n if (bits & Y) _line(0, 0, 0, 0, size, 0);\n if (bits & _Y) _line(0, 0, 0, 0, -size, 0);\n axis(2);\n if (bits & Z) _line(0, 0, 0, 0, 0, size);\n if (bits & _Z) _line(0, 0, 0, 0, 0, -size);\n return _end(out);\n}\n\n/**\n * A grid in the XY plane: subdivisions + 1 lines each way spanning ±size.\n * Orientation is the caller's M (a ground plane is a rotation about X).\n *\n * Count: 4 · (subdivisions + 1).\n *\n * @param {object} out Arrays object.\n * @param {{ size?:number, subdivisions?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction gridLines(out, opts) {\n const o = opts || {};\n const size = o.size ?? 100;\n const sub = Math.max(1, (o.subdivisions ?? 10) | 0);\n _begin(out);\n _color(o.color);\n for (let i = 0; i <= sub; i++) {\n const pos = size * (2*i/sub - 1);\n _line(pos, -size, 0, pos, size, 0);\n _line(-size, pos, 0, size, pos, 0);\n }\n return _end(out);\n}\n\n/**\n * A crosshair in HUD space (z = 0, target pixels): two lines of `size`\n * through (x, y). The bridge projects a model origin and converts a world\n * size to pixels before this call.\n *\n * Count: 4.\n *\n * @param {object} out Arrays object.\n * @param {{ x?:number, y?:number, size?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction crossLines(out, opts) {\n const o = opts || {};\n const x = o.x ?? 0, y = o.y ?? 0, half = (o.size ?? 50) / 2;\n _begin(out);\n _color(o.color);\n _line(x - half, y, 0, x + half, y, 0);\n _line(x, y - half, 0, x, y + half, 0);\n return _end(out);\n}\n\n/**\n * A bulls-eye in HUD space (z = 0, target pixels): a sampled circle of\n * radius size / 2 (`detail` segments) or the cornered square (8 lines),\n * plus the central cross at 0.6 · half.\n *\n * Count: 2 · detail + 4 (CIRCLE) or 20 (SQUARE).\n *\n * @param {object} out Arrays object.\n * @param {{ x?:number, y?:number, size?:number, shape?:number, detail?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction bullsEyeLines(out, opts) {\n const o = opts || {};\n const x = o.x ?? 0, y = o.y ?? 0, half = (o.size ?? 50) / 2;\n const shape = o.shape ?? CIRCLE;\n const detail = Math.max(3, (o.detail ?? 50) | 0);\n _begin(out);\n _color(o.color);\n if (shape === CIRCLE) {\n _ring(x, y, 0, half, _U, _V, detail, TWO_PI);\n } else {\n const c = 0.6 * half;\n _line(x-half, y-half+c, 0, x-half, y-half, 0);\n _line(x-half, y-half, 0, x-half+c, y-half, 0);\n _line(x+half-c, y-half, 0, x+half, y-half, 0);\n _line(x+half, y-half, 0, x+half, y-half+c, 0);\n _line(x+half, y+half-c, 0, x+half, y+half, 0);\n _line(x+half, y+half, 0, x+half-c, y+half, 0);\n _line(x-half+c, y+half, 0, x-half, y+half, 0);\n _line(x-half, y+half, 0, x-half, y+half-c, 0);\n }\n const ch = 0.6 * half;\n _line(x - ch, y, 0, x + ch, y, 0);\n _line(x, y - ch, 0, x, y + ch, 0);\n return _end(out);\n}\n\n/**\n * A sampled circle of radius r at (cx, cy, cz) spanned by the orthonormal\n * u, v — the shared primitive; a partial `sweep` gives an arc from u.\n *\n * Count: 2 · detail.\n *\n * @param {object} out Arrays object.\n * @param {number} cx,cy,cz Centre.\n * @param {number} r Radius.\n * @param {number[]} u,v Orthonormal in-plane basis.\n * @param {{ detail?:number, sweep?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction ringLines(out, cx, cy, cz, r, u, v, opts) {\n const o = opts || {};\n const detail = Math.max(1, (o.detail ?? 48) | 0);\n const sweep = o.sweep ?? TWO_PI;\n _begin(out);\n _color(o.color);\n _ring(cx, cy, cz, r, u, v, detail, sweep);\n return _end(out);\n}\n\n// =========================================================================\n// G4 Frustum and Hermite\n// =========================================================================\n\nconst _isMat = (cam) => cam != null && cam.mat4Eye != null && cam.mat4Proj != null;\n\n/** Corner i of out24 ← E · (x, y, z). */\nfunction _corner(out24, i, E, x, y, z) {\n mat4MulPoint(_p3, E, x, y, z);\n out24[3*i] = _p3[0]; out24[3*i + 1] = _p3[1]; out24[3*i + 2] = _p3[2];\n}\n\n/**\n * The eight world-space corners of a camera's frustum: the near face 0–3\n * counter-clockwise from bottom-left (BL, BR, TR, TL), then the far face\n * 4–7 in the same order — so corners 3, 2, 1, 0 are a pane's TL, TR, BR,\n * BL. `cam` is a camera state (its symmetric extents from fov or\n * halfHeight and `aspect`), or { mat4Eye, mat4Proj, ndcZMin? } for a\n * matrix-captured camera (the extents read off the projection). The far\n * extents follow by similar triangles, or equal the near ones under\n * orthographic.\n *\n * @param {Float64Array|number[]} out24 24-element destination.\n * @param {object} cam Camera state, or { mat4Eye, mat4Proj, ndcZMin? }.\n * @param {number} [aspect=1] Viewport width / height (state form).\n * @param {number} [ndcZMin=WEBGL] NDC-z convention when the matrix form carries none.\n * @returns {Float64Array|number[]|null} out24, or null when the state's lens is unset.\n */\nfunction frustumCorners(out24, cam, aspect, ndcZMin) {\n let E, n, f, l, r, t, b, ortho;\n if (_isMat(cam)) {\n E = cam.mat4Eye;\n const P = cam.mat4Proj, z = cam.ndcZMin ?? ndcZMin ?? WEBGL;\n ortho = projIsOrtho(P);\n n = projNear(P, z); f = projFar(P);\n l = projLeft(P, z); r = projRight(P, z); t = projTop(P, z); b = projBottom(P, z);\n } else {\n ortho = cam.fov == null;\n if (ortho && cam.halfHeight == null) return null;\n n = cam.near; f = cam.far;\n t = ortho ? cam.halfHeight : n * Math.tan(cam.fov / 2);\n r = t * (aspect ?? 1);\n b = -t; l = -r;\n E = cameraEye(_E, cam);\n }\n const k = ortho ? 1 : f / n;\n _corner(out24, 0, E, l, b, -n);\n _corner(out24, 1, E, r, b, -n);\n _corner(out24, 2, E, r, t, -n);\n _corner(out24, 3, E, l, t, -n);\n _corner(out24, 4, E, k*l, k*b, -f);\n _corner(out24, 5, E, k*r, k*b, -f);\n _corner(out24, 6, E, k*r, k*t, -f);\n _corner(out24, 7, E, k*l, k*t, -f);\n return out24;\n}\n\n/** Line between corners i and j of the scratch corners. */\nfunction _edge(i, j) {\n _line(_c24[3*i], _c24[3*i + 1], _c24[3*i + 2], _c24[3*j], _c24[3*j + 1], _c24[3*j + 2]);\n}\n\n/**\n * A camera's frustum as edges by bit: NEAR and FAR the two rectangles,\n * BODY the four edges joining them, APEX (perspective only) the eye to\n * the near corners. `cam` as frustumCorners takes it.\n *\n * Count: 8 · (NEAR + FAR + BODY + APEX), at most 32.\n *\n * @param {object} out Arrays object.\n * @param {object} cam Camera state, or { mat4Eye, mat4Proj, ndcZMin? }.\n * @param {{ aspect?:number, ndcZMin?:number, bits?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed (0 when the state's lens is unset).\n */\nfunction frustumLines(out, cam, opts) {\n const o = opts || {};\n const bits = o.bits ?? (NEAR | FAR | BODY | APEX);\n _begin(out);\n _color(o.color);\n if (frustumCorners(_c24, cam, o.aspect ?? 1, o.ndcZMin ?? WEBGL) === null) return _end(out);\n if (bits & NEAR) { _edge(0, 1); _edge(1, 2); _edge(2, 3); _edge(3, 0); }\n if (bits & FAR) { _edge(4, 5); _edge(5, 6); _edge(6, 7); _edge(7, 4); }\n if (bits & BODY) { _edge(0, 4); _edge(1, 5); _edge(2, 6); _edge(3, 7); }\n const persp = _isMat(cam) ? !projIsOrtho(cam.mat4Proj) : cam.fov != null;\n if ((bits & APEX) && persp) {\n const E = _isMat(cam) ? cam.mat4Eye : null;\n const ex = E ? E[12] : cam.eye[0], ey = E ? E[13] : cam.eye[1], ez = E ? E[14] : cam.eye[2];\n for (let i = 0; i < 4; i++) _line(ex, ey, ez, _c24[3*i], _c24[3*i + 1], _c24[3*i + 2]);\n }\n return _end(out);\n}\n\n/**\n * One cubic Hermite segment through hermiteVec3, as a polyline of\n * `samples` steps.\n *\n * Count: 2 · samples.\n *\n * @param {object} out Arrays object.\n * @param {number[]} p0,t0 Start point and its outgoing tangent.\n * @param {number[]} p1,t1 End point and its incoming tangent.\n * @param {{ samples?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction hermiteLines(out, p0, t0, p1, t1, opts) {\n const o = opts || {};\n const N = Math.max(1, (o.samples ?? 32) | 0);\n _begin(out);\n _color(o.color);\n for (let i = 0; i <= N; i++) {\n hermiteVec3(_p3, p0, t0, p1, t1, i / N);\n if (i > 0) _line(_q3[0], _q3[1], _q3[2], _p3[0], _p3[1], _p3[2]);\n _q3[0] = _p3[0]; _q3[1] = _p3[1]; _q3[2] = _p3[2];\n }\n return _end(out);\n}\n\n// =========================================================================\n// G5 Path, helm rig, locus, pane\n// =========================================================================\n\n/**\n * A PoseTrack or CameraTrack's path by bit, over the track's own samplers\n * (samplePos / sampleEye / sampleCenter and the tangent readers), so the\n * interpolation modes are honoured: PATH the sampled polyline, `samples`\n * per segment; CONTROLS the straight control polygon; TANGENTS_IN /\n * TANGENTS_OUT the tangent at each keyframe scaled by `tangentScale`;\n * CENTER (camera tracks) the gaze line eye → center per keyframe and a\n * three-axis star of half-size `centerSize` at the center. `target`\n * ('eye' or 'center') picks a camera track's path for the first three\n * bits. Markers and handles are the bridge's composition.\n *\n * Count: 2 · samples · segments (PATH) + 2 · segments (CONTROLS) +\n * 2 · keyframes per tangent bit + 8 · keyframes (CENTER).\n *\n * @param {object} out Arrays object.\n * @param {object} track PoseTrack or CameraTrack.\n * @param {{ bits?:number, samples?:number, tangentScale?:number, target?:string,\n * centerSize?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction pathLines(out, track, opts) {\n const o = opts || {};\n const bits = o.bits ?? (PATH | CONTROLS | TANGENTS_IN | TANGENTS_OUT);\n const N = Math.max(1, (o.samples ?? 32) | 0);\n const ts = o.tangentScale ?? 0.25;\n const cs = o.centerSize ?? 4;\n const kfs = track.keyframes, n = kfs.length;\n const isCamera = typeof track.sampleEye === 'function';\n const useCenter = isCamera && o.target === 'center';\n const field = isCamera ? (useCenter ? 'center' : 'eye') : 'pos';\n const sampler = isCamera ? (useCenter ? 'sampleCenter' : 'sampleEye') : 'samplePos';\n const tangents = isCamera ? (useCenter ? 'centerTangents' : 'eyeTangents') : 'tangents';\n _begin(out);\n _color(o.color);\n if ((bits & PATH) && n > 1) {\n for (let seg = 0; seg < n - 1; seg++) {\n for (let i = 0; i <= N; i++) {\n track[sampler](_p3, seg, i / N);\n if (i > 0) _line(_q3[0], _q3[1], _q3[2], _p3[0], _p3[1], _p3[2]);\n _q3[0] = _p3[0]; _q3[1] = _p3[1]; _q3[2] = _p3[2];\n }\n }\n }\n if (bits & CONTROLS) {\n for (let i = 0; i < n - 1; i++) {\n const a = kfs[i][field], b = kfs[i + 1][field];\n _line(a[0], a[1], a[2], b[0], b[1], b[2]);\n }\n }\n if (bits & (TANGENTS_IN | TANGENTS_OUT)) {\n for (let i = 0; i < n; i++) {\n track[tangents](_tIn, _tOut, i);\n const k = kfs[i][field];\n if (bits & TANGENTS_IN) _line(k[0] - ts*_tIn[0], k[1] - ts*_tIn[1], k[2] - ts*_tIn[2], k[0], k[1], k[2]);\n if (bits & TANGENTS_OUT) _line(k[0], k[1], k[2], k[0] + ts*_tOut[0], k[1] + ts*_tOut[1], k[2] + ts*_tOut[2]);\n }\n }\n if ((bits & CENTER) && isCamera) {\n for (let i = 0; i < n; i++) {\n const e = kfs[i].eye, c = kfs[i].center;\n _line(e[0], e[1], e[2], c[0], c[1], c[2]);\n _line(c[0] - cs, c[1], c[2], c[0] + cs, c[1], c[2]);\n _line(c[0], c[1] - cs, c[2], c[0], c[1] + cs, c[2]);\n _line(c[0], c[1], c[2] - cs, c[0], c[1], c[2] + cs);\n }\n }\n return _end(out);\n}\n\n/** An arrow along principal axis `axis` (0 X, 1 Y, 2 Z): signed length L, head size h — 5 lines. */\nfunction _arrow(axis, L, h) {\n const a = (axis + 1) % 3, b = (axis + 2) % 3;\n _tip[0] = _tip[1] = _tip[2] = 0; _tip[axis] = L;\n _line(0, 0, 0, _tip[0], _tip[1], _tip[2]);\n const s = Math.sign(L) || 1;\n _ha[0] = _ha[1] = _ha[2] = 0; _ha[axis] = L - s*h;\n _ha[a] = h*0.5; _line(_tip[0], _tip[1], _tip[2], _ha[0], _ha[1], _ha[2]);\n _ha[a] = -h*0.5; _line(_tip[0], _tip[1], _tip[2], _ha[0], _ha[1], _ha[2]);\n _ha[a] = 0;\n _ha[b] = h*0.5; _line(_tip[0], _tip[1], _tip[2], _ha[0], _ha[1], _ha[2]);\n _ha[b] = -h*0.5; _line(_tip[0], _tip[1], _tip[2], _ha[0], _ha[1], _ha[2]);\n}\n\n/**\n * A helm's rig, colour always semantic: per translation channel a dim\n * baseline arrow of signed length sign · size · sens / 0.30 and, while the\n * channel's activity is non-zero, a bright arrow of length ∝ |activity| /\n * (sens · fullScale); per rotation channel a dim ring of radius size / 2 ·\n * sens / 0.0025 and a bright arc sweeping π · f in the live direction.\n * Dim and bright are the alpha of the written colour (COLOR_DIM, 1). With\n * `identify`, one anchor per channel goes to out.labels as { x, y, z,\n * text: 'L' + lane }. Orientation is the caller's M.\n *\n * Count: 10 · 3 · 2 (arrows) + 96 · 3 (rings) + 48 · 3 (arcs), at most 492;\n * the bright half only while a channel is active.\n *\n * @param {object} out Arrays object.\n * @param {object} helm A PoseHelm (profile, fullScale, activity).\n * @param {{ size?:number, bits?:number, identify?:boolean }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction helmRigLines(out, helm, opts) {\n const o = opts || {};\n const size = o.size ?? 100;\n const bits = o.bits ?? (TRANSLATE | ROTATE);\n const identify = o.identify === true;\n const prof = helm.profile;\n const head = size * 0.08, ringR0 = size * 0.5;\n const TREF = 0.30, RREF = 0.0025, FULL = helm.fullScale, ARC_FULL = Math.PI;\n helm.activity(_act);\n _begin(out);\n const labels = identify && out.labels ? out.labels : null;\n if (bits & TRANSLATE) {\n const T = [prof.Tx, prof.Ty, prof.Tz];\n for (let ax = 0; ax < 3; ax++) {\n const ch = T[ax];\n const L = ch.sign * size * (ch.sens / TREF);\n _color(_AXIS_COLORS[ax], COLOR_DIM);\n _arrow(ax, L, head);\n const a = _act[ax];\n if (a !== 0) {\n const f = Math.min(Math.abs(a) / (ch.sens * FULL), 1);\n _color(_AXIS_COLORS[ax], 1);\n _arrow(ax, Math.sign(a) * f * Math.abs(L), head);\n }\n if (labels) {\n const lp = [0, 0, 0]; lp[ax] = L + ch.sign * head * 1.5;\n labels.push({ x: lp[0], y: lp[1], z: lp[2], text: 'L' + ch.lane });\n }\n }\n }\n if (bits & ROTATE) {\n const R = [prof.Rp, prof.Ry, prof.Rr]; // pitch ⊥ X, yaw ⊥ Y, roll ⊥ Z\n for (let ax = 0; ax < 3; ax++) {\n const ch = R[ax];\n const r = ringR0 * (ch.sens / RREF);\n const u = _AXES[(ax + 1) % 3], v = _AXES[(ax + 2) % 3];\n _color(_AXIS_COLORS[ax], COLOR_DIM);\n _ring(0, 0, 0, r, u, v, 48, TWO_PI);\n const a = _act[3 + ax];\n if (a !== 0) {\n const f = Math.min(Math.abs(a) / (ch.sens * FULL), 1);\n _color(_AXIS_COLORS[ax], 1);\n _ring(0, 0, 0, r, u, v, 24, Math.sign(a) * f * ARC_FULL);\n }\n if (labels) {\n const lp = [0, 0, 0]; lp[(ax + 1) % 3] = r;\n labels.push({ x: lp[0], y: lp[1], z: lp[2], text: 'L' + ch.lane });\n }\n }\n }\n return _end(out);\n}\n\n/**\n * A handle's stroked parts by bit. AIM: anchor → `point` (the handle's\n * current point, read by the caller with value). LOCUS by constraint.kind:\n * SPHERE three great circles about the anchor; PLANE a square of\n * half-extent 100 in the plane's basis; AXIS the segment anchor + [min,\n * max] · u; DIAL the ring in the dial plane; a constraint flagged `view`\n * (the host's VIEW) a screen-aligned square of half-extent 100 at `point`,\n * its basis the camera's right and up read off `mat4View`. RING: SPHERE\n * the view-facing limb, a ring perpendicular to anchor − eye (the eye from\n * `mat4View`); PLANE the border of the locus square (written once when\n * both bits ask for it). A constraint supplying locus(out, opts) is\n * dispatched to it. The HANDLE dot is not a line and not generated here.\n *\n * Count: AIM 2; LOCUS SPHERE 288 · PLANE 8 · AXIS 2 · DIAL 96 · view 8;\n * RING SPHERE 96 · PLANE 8 (shared with LOCUS); at most 386.\n *\n * @param {object} out Arrays object.\n * @param {object} constraint A contract-conforming constraint.\n * @param {{ bits?:number, mat4View?:ArrayLike<number>, point?:number[], color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction locusLines(out, constraint, opts) {\n const o = opts || {};\n if (typeof constraint.locus === 'function') return constraint.locus(out, o);\n const bits = o.bits ?? (AIM | LOCUS);\n const c = constraint, a = c.anchor, pt = o.point, V = o.mat4View;\n _begin(out);\n _color(o.color);\n if ((bits & AIM) && a && pt) _line(a[0], a[1], a[2], pt[0], pt[1], pt[2]);\n if (c.view === true) {\n if ((bits & LOCUS) && pt && V) {\n _b0[0] = V[0]; _b0[1] = V[4]; _b0[2] = V[8]; // the camera's right\n _b1[0] = V[1]; _b1[1] = V[5]; _b1[2] = V[9]; // the camera's up\n _square(pt, _b0, _b1, 100);\n }\n } else if (c.kind === SPHERE && a) {\n if (bits & LOCUS) {\n _ring(a[0], a[1], a[2], c.radius, _AXES[0], _AXES[1], 48, TWO_PI);\n _ring(a[0], a[1], a[2], c.radius, _AXES[1], _AXES[2], 48, TWO_PI);\n _ring(a[0], a[1], a[2], c.radius, _AXES[2], _AXES[0], 48, TWO_PI);\n }\n if ((bits & RING) && V) {\n // eye = −Rᵀ t of the view matrix; the limb is ⊥ anchor − eye\n const tx = V[12], ty = V[13], tz = V[14];\n _b2[0] = a[0] + (V[0]*tx + V[1]*ty + V[2]*tz);\n _b2[1] = a[1] + (V[4]*tx + V[5]*ty + V[6]*tz);\n _b2[2] = a[2] + (V[8]*tx + V[9]*ty + V[10]*tz);\n _unit(_b2, 0, 0, 1);\n _basis(_b2, _b0, _b1);\n _ring(a[0], a[1], a[2], c.radius, _b0, _b1, 48, TWO_PI);\n }\n } else if (c.kind === PLANE && a) {\n if (bits & (LOCUS | RING)) {\n _basis(c.n, _b0, _b1);\n _square(a, _b0, _b1, 100);\n }\n } else if (c.kind === AXIS && a) {\n if (bits & LOCUS) {\n const u = c.u;\n _line(a[0] + c.min*u[0], a[1] + c.min*u[1], a[2] + c.min*u[2],\n a[0] + c.max*u[0], a[1] + c.max*u[1], a[2] + c.max*u[2]);\n }\n } else if (c.kind === DIAL && a) {\n if (bits & LOCUS) _ring(a[0], a[1], a[2], c.radius, c.r0, c.r1, 48, TWO_PI);\n }\n return _end(out);\n}\n\n/**\n * A textured quad as two triangles (p0, p1, p2) (p0, p2, p3) — the winding\n * of the corner order — with texcoord written when the array exists.\n * Default uvs: p0 (top-left) → (0, 1), p1 → (1, 1), p2 → (1, 0), p3 →\n * (0, 0), so a texture in GL's bottom-up space reads upright with no\n * flip; `opts.uvs` overrides, four pairs flat in corner order.\n *\n * Count: 6.\n *\n * @param {object} out Arrays object.\n * @param {number[]} p0,p1,p2,p3 Corners, top-left clockwise.\n * @param {{ uvs?:number[], color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction paneTris(out, p0, p1, p2, p3, opts) {\n const o = opts || {};\n const uv = o.uvs || _UV_DEFAULT;\n _begin(out);\n _color(o.color);\n _vertexUV(p0[0], p0[1], p0[2], uv[0], uv[1]);\n _vertexUV(p1[0], p1[1], p1[2], uv[2], uv[3]);\n _vertexUV(p2[0], p2[1], p2[2], uv[4], uv[5]);\n _vertexUV(p0[0], p0[1], p0[2], uv[0], uv[1]);\n _vertexUV(p2[0], p2[1], p2[2], uv[4], uv[5]);\n _vertexUV(p3[0], p3[1], p3[2], uv[6], uv[7]);\n return _end(out);\n}\n\nexport { AIM, APEX, AXIS, BODY, BOTTOM, CENTER, CIRCLE, COLOR_DIM, COLOR_X, COLOR_Y, COLOR_Z, CONTROLS, CameraTrack, Constraint, DIAL, DIRECTION, EYE, FAR, HANDLE, HANDLES, HELM_CHANNELS, INVISIBLE, LABELS, LEFT, LOCUS, MATRIX, MODEL, NDC, NEAR, NONE, ORIGIN, PATH, PLANE, PLANE_BOTTOM, PLANE_FAR, PLANE_LEFT, PLANE_NEAR, PLANE_RIGHT, PLANE_TOP, POINT, PoseHelm, PoseTrack, RIGHT, RING, ROTATE, SCREEN, SELF, SEMIVISIBLE, SPHERE, SQUARE, TANGENTS, TANGENTS_IN, TANGENTS_OUT, TOP, TRANSLATE, VISIBLE, WEBGL, WEBGPU, WORLD, X, Y, Z, _X, _Y, _Z, _i, _j, _k, axesLines, azElFromDir, boxVisibility, bullsEyeLines, cameraCopy, cameraDolly, cameraEye, cameraFromMat4, cameraFromPose, cameraOrbit, cameraPan, cameraPlanes, cameraProj, cameraToPose, cameraView, capacityOf, createArrays, createCamera, createConstraint, crossLines, dirFromAzEl, distanceToPlane, frustumCorners, frustumLines, frustumPlanes, gridLines, growArrays, helmRigLines, hermiteLines, hermiteVec3, i, idToRgba, j, k, lerpVec3, locusLines, mapDirection, mapLocation, mat3Direction, mat3NormalFromMat4, mat4Bias, mat4Eye, mat4FromBasis, mat4FromScale, mat4FromTRS, mat4FromTranslation, mat4Invert, mat4Location, mat4MV, mat4Mul, mat4MulDir, mat4MulPoint, mat4Ortho, mat4PV, mat4Persp, mat4Pick, mat4Reflect, mat4ToRotation, mat4ToScale, mat4ToTransform, mat4ToTranslation, mat4View, oneEuro, paneTris, pathLines, pixelRatio, pointVisibility, pointerHit, poseDelta, projBottom, projFar, projFov, projHfov, projIsOrtho, projLeft, projNear, projRight, projTop, qConjugate, qCopy, qDot, qFromAxisAngle, qFromLookDir, qFromMat4, qFromRotMat3x3, qFromUnitVectors, qMul, qNegate, qNlerp, qNormalize, qRotateVec3, qSet, qSlerp, qToAxisAngle, qToMat4, rayClosestPointOnAxis, rayHitCapsule, rayHitRing, rayHitSphere, rayPlane, raySphere, rgbaToId, ringLines, sphereVisibility, transformToMat4, unproject };\n//# sourceMappingURL=index.js.map\n","/**\n * @file The view bag — the matrices every pick, solve, label and orbit reads.\n * @module host/view\n * @license AGPL-3.0-only\n *\n * The matrices bag mapLocation takes, plus the signed viewport and the NDC\n * convention:\n *\n * view = {\n * mat4Proj, mat4View, mat4PV, mat4PVInv, // Float32Array(16) each, host-owned\n * mat4Eye, // inverse of mat4View — EYE → WORLD\n * vp, // [0, h, w, −h] — y-down, logical canvas px\n * ndcZMin, // WEBGL | WEBGPU, set once at creation\n * stale, // true until a set() with an invertible P · V\n * set(P, V) // copy P and V, recompute PV and PVInv\n * setCamera(cam) // build V and P from a camera state, then set\n * resize(width, height) // the canvas observer's write into vp\n * }\n *\n * mat4PVInv and mat4Eye are recomputed on set, once per frame, so unproject\n * and every mapping from SCREEN or EYE share them. A degenerate P · V or V\n * leaves the previous inverses and marks the bag stale; consumers treat a\n * stale bag as \"no pick this frame\".\n */\n\n'use strict';\n\nimport { WEBGL, mat4Mul, mat4Invert, cameraView, cameraProj } from '@nakednous/tree';\n\nconst _inv = new Float32Array(16); // inverse scratch: the bag keeps its previous inverse on failure\nconst _P = new Float32Array(16); // setCamera's projection\nconst _V = new Float32Array(16); // setCamera's view\n\nfunction _identity(m) {\n m.fill(0);\n m[0] = m[5] = m[10] = m[15] = 1;\n return m;\n}\n\n/**\n * Create a view bag. The matrices start at identity and the bag stale, so a\n * consumer reading it before the first set() picks nothing.\n *\n * @param {{ ndcZMin?:number, width?:number, height?:number }} [opts]\n * ndcZMin: WEBGL (−1, default) or WEBGPU (0) — written once here, never\n * detected. width / height: the initial logical canvas size.\n * @returns {object} The view bag.\n */\nexport function createView(opts) {\n const o = opts || {};\n const w = o.width || 0, h = o.height || 0;\n const view = {\n mat4Proj: _identity(new Float32Array(16)),\n mat4View: _identity(new Float32Array(16)),\n mat4PV: _identity(new Float32Array(16)),\n mat4PVInv: _identity(new Float32Array(16)),\n mat4Eye: _identity(new Float32Array(16)),\n vp: [0, h, w, -h],\n ndcZMin: o.ndcZMin === 0 ? 0 : WEBGL,\n stale: true,\n\n /**\n * Install a projection and a view: both copied, P · V with its inverse\n * and the eye matrix (V's inverse) recomputed. A singular product or\n * view keeps the previous inverses and marks the bag stale.\n * @param {ArrayLike<number>} P Projection mat4.\n * @param {ArrayLike<number>} V View mat4 (world → eye).\n * @returns {object} this\n */\n set(P, V) {\n for (let i = 0; i < 16; i++) { view.mat4Proj[i] = P[i]; view.mat4View[i] = V[i]; }\n mat4Mul(view.mat4PV, view.mat4Proj, view.mat4View);\n if (mat4Invert(_inv, view.mat4PV) === null) { view.stale = true; return view; }\n view.mat4PVInv.set(_inv);\n if (mat4Invert(_inv, view.mat4View) === null) { view.stale = true; return view; }\n view.mat4Eye.set(_inv);\n view.stale = false;\n return view;\n },\n\n /**\n * Install a camera state: cameraView and cameraProj at the viewport's\n * aspect under the bag's ndcZMin, then set(). A state with both fov and\n * halfHeight null keeps the projection already installed.\n * @param {object} cam Camera state.\n * @returns {object} this\n */\n setCamera(cam) {\n const aspect = view.vp[3] !== 0 ? view.vp[2] / -view.vp[3] : 1;\n cameraView(_V, cam);\n const P = cameraProj(_P, cam, aspect, view.ndcZMin) || view.mat4Proj;\n return view.set(P, _V);\n },\n\n /**\n * Write a new logical canvas size into vp: [0, height, width, −height].\n * @param {number} width\n * @param {number} height\n * @returns {object} this\n */\n resize(width, height) {\n view.vp[1] = height; view.vp[2] = width; view.vp[3] = -height;\n return view;\n },\n };\n return view;\n}\n","/**\n * @file The canvas observer — logical size and device pixel ratio.\n * @module host/canvas\n * @license AGPL-3.0-only\n *\n * A ResizeObserver on the canvas element plus devicePixelRatio tracking:\n * on change the observer reports the logical size in CSS px and the dpr to\n * its callback, which the context uses to update host.width / host.height /\n * host.dpr, the view bag's vp, the label layer and the bridge's onSize. The\n * observer never touches canvas.width / canvas.height — that is the\n * renderer's decision.\n *\n * Without a ResizeObserver (a headless run) the size is measured once from\n * the element's bounding rectangle, falling back to its width / height\n * attributes.\n */\n\n'use strict';\n\n/**\n * Measure a canvas: logical CSS size from its bounding rectangle when laid\n * out, else its width / height attributes; dpr from the window.\n * @param {HTMLCanvasElement} canvas\n * @param {number[]} out3 [width, height, dpr] destination.\n * @returns {number[]} out3\n */\nexport function measureCanvas(canvas, out3) {\n const r = typeof canvas.getBoundingClientRect === 'function' ? canvas.getBoundingClientRect() : null;\n const laidOut = r && r.width > 0 && r.height > 0;\n out3[0] = laidOut ? r.width : (canvas.width || 0);\n out3[1] = laidOut ? r.height : (canvas.height || 0);\n out3[2] = (typeof window !== 'undefined' && window.devicePixelRatio) || 1;\n return out3;\n}\n\n/**\n * Observe a canvas's logical size and dpr. `onChange(width, height, dpr)`\n * fires once immediately with the current measure and again on every\n * change; a change is reported only when a value differs.\n *\n * @param {HTMLCanvasElement} canvas\n * @param {function(number, number, number):void} onChange\n * @returns {{ width:number, height:number, dpr:number, measure():void, dispose():void }}\n */\nexport function observeCanvas(canvas, onChange) {\n const m = [0, 0, 1];\n const obs = { width: -1, height: 0, dpr: 1, measure, dispose };\n let ro = null;\n const onWindow = () => measure();\n\n function measure() {\n measureCanvas(canvas, m);\n if (m[0] === obs.width && m[1] === obs.height && m[2] === obs.dpr) return;\n obs.width = m[0]; obs.height = m[1]; obs.dpr = m[2];\n onChange(obs.width, obs.height, obs.dpr);\n }\n\n function dispose() {\n if (ro) { ro.disconnect(); ro = null; }\n if (typeof window !== 'undefined' && window.removeEventListener) window.removeEventListener('resize', onWindow);\n }\n\n measure(); // width −1 makes the first measure report\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(() => measure());\n ro.observe(canvas);\n }\n // A zoom changes devicePixelRatio and fires resize; the observer alone would miss it.\n if (typeof window !== 'undefined' && window.addEventListener) window.addEventListener('resize', onWindow);\n return obs;\n}\n","/**\n * @file The pointer source — a typed event buffer with claims, one per canvas.\n * @module host/pointer\n * @license AGPL-3.0-only\n *\n * Shared by every handle, router and orbit on a canvas. Listeners only\n * record; nothing solves in a listener:\n *\n * - pointerdown · pointermove · pointerup · pointercancel on the canvas,\n * keydown (Esc) on the window.\n * - Coordinates in logical canvas px through the element's bounding\n * rectangle — (clientX − rect.left) · (width / rect.width), the logical\n * size read off the view bag's vp — the numbers mapLocation(SCREEN) and vp\n * expect, so a CSS-scaled canvas maps correctly.\n * - Per pointer: an entry { id, x, y, seq, down, up, cancel, owner }, kept\n * from its press until the frame after its release; `seq` counts moves,\n * so a consumer remembers the last seq it consumed and reads only new\n * motion. Multitouch is per-pointer by construction; the mouse is one\n * more pointer.\n * - Presses queue in order for the frame (`presses`); consumers read the\n * queue inside the frame and claim what they take. Several same-frame\n * presses on different members all land.\n * - Claims: claim(id, owner) captures the pointer on the canvas so a drag\n * that leaves it keeps flowing; release(id), up and cancel release the\n * capture. An unclaimed pointer is what the orbit sees.\n * - Esc sets the cancel flag on every claimed pointer.\n * - flush() ends the frame: the press queue empties and released pointers\n * leave the map. The loop calls it after onFrame; an external loop calls\n * it after its consumers ran (the p5 adapter from postdraw).\n */\n\n'use strict';\n\n/**\n * Create the pointer source of a canvas.\n *\n * @param {HTMLCanvasElement} canvas\n * @param {object} view The view bag; vp[2] and −vp[3] are the logical size.\n * @returns {object} The source: { presses, pointers, get, claim, release,\n * ownerOf, flush, dispose }.\n */\nexport function createPointer(canvas, view) {\n const pointers = new Map(); // id → entry\n const presses = []; // this frame's presses, in order: { id, x, y }\n const xy = [0, 0];\n\n const toCanvas = (e, out) => {\n const r = canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : null;\n const w = view.vp[2], h = -view.vp[3];\n if (r && r.width > 0 && r.height > 0 && w > 0 && h > 0) {\n out[0] = (e.clientX - r.left) * (w / r.width);\n out[1] = (e.clientY - r.top) * (h / r.height);\n } else {\n out[0] = e.clientX; out[1] = e.clientY;\n }\n return out;\n };\n\n const entry = (id) => {\n let p = pointers.get(id);\n if (!p) { p = { id, x: 0, y: 0, seq: 0, down: false, up: false, cancel: false, owner: null }; pointers.set(id, p); }\n return p;\n };\n\n const capture = (id, on) => {\n const f = on ? canvas.setPointerCapture : canvas.releasePointerCapture;\n if (typeof f !== 'function') return;\n try { f.call(canvas, id); } catch (_) { /* best effort: a synthetic or already-released id */ }\n };\n\n const onDown = (e) => {\n const p = entry(e.pointerId);\n toCanvas(e, xy);\n p.x = xy[0]; p.y = xy[1]; p.seq++;\n p.down = true; p.up = false; p.cancel = false;\n presses.push({ id: p.id, x: p.x, y: p.y });\n };\n const onMove = (e) => {\n const p = entry(e.pointerId);\n toCanvas(e, xy);\n p.x = xy[0]; p.y = xy[1]; p.seq++;\n };\n const onUp = (e) => {\n const p = pointers.get(e.pointerId);\n if (!p) return;\n toCanvas(e, xy);\n p.x = xy[0]; p.y = xy[1]; p.seq++;\n p.up = true;\n capture(p.id, false);\n };\n const onCancel = (e) => {\n const p = pointers.get(e.pointerId);\n if (!p) return;\n p.cancel = true;\n capture(p.id, false);\n };\n const onKey = (e) => {\n if (e.key !== 'Escape') return;\n for (const p of pointers.values()) if (p.owner !== null) p.cancel = true;\n };\n\n canvas.addEventListener('pointerdown', onDown);\n canvas.addEventListener('pointermove', onMove);\n canvas.addEventListener('pointerup', onUp);\n canvas.addEventListener('pointercancel', onCancel);\n if (typeof window !== 'undefined' && window.addEventListener) window.addEventListener('keydown', onKey);\n\n const source = {\n /** This frame's presses in order, each { id, x, y }; emptied by flush(). */\n presses,\n /** The live pointer entries by id. */\n pointers,\n\n /**\n * The entry of a pointer, or null when it is not on the canvas.\n * @param {number} id\n * @returns {object|null}\n */\n get(id) { return pointers.get(id) || null; },\n\n /**\n * Claim a pointer for an owner and capture it on the canvas. Fails when\n * another owner holds it or the pointer is unknown.\n * @param {number} id\n * @param {object} owner\n * @returns {boolean} claimed\n */\n claim(id, owner) {\n const p = pointers.get(id);\n if (!p || (p.owner !== null && p.owner !== owner)) return false;\n p.owner = owner;\n capture(id, true);\n return true;\n },\n\n /**\n * Release a claim and the capture with it. No-op for an unclaimed id.\n * @param {number} id\n */\n release(id) {\n const p = pointers.get(id);\n if (!p || p.owner === null) return;\n p.owner = null;\n capture(id, false);\n },\n\n /**\n * The owner holding a pointer, or null.\n * @param {number} id\n * @returns {object|null}\n */\n ownerOf(id) { const p = pointers.get(id); return p ? p.owner : null; },\n\n /**\n * End the frame: the press queue empties; pointers that released or\n * cancelled leave the map (their claims dropped), the rest keep their\n * position and seq.\n */\n flush() {\n presses.length = 0;\n for (const [id, p] of pointers) {\n if (p.up || p.cancel) { p.owner = null; pointers.delete(id); }\n }\n },\n\n /** Remove every listener and release every capture. */\n dispose() {\n canvas.removeEventListener('pointerdown', onDown);\n canvas.removeEventListener('pointermove', onMove);\n canvas.removeEventListener('pointerup', onUp);\n canvas.removeEventListener('pointercancel', onCancel);\n if (typeof window !== 'undefined' && window.removeEventListener) window.removeEventListener('keydown', onKey);\n for (const p of pointers.values()) if (p.owner !== null) capture(p.id, false);\n pointers.clear();\n presses.length = 0;\n },\n };\n return source;\n}\n","/**\n * @file The players registry and the frame loop.\n * @module host/loop\n * @license AGPL-3.0-only\n *\n * A player is { tick(dt) → boolean }, removed from the registry when it\n * returns false. Iteration snapshots the set, so a player may remove itself\n * or add another during a tick. Tracks register through their activation\n * hooks, helms until disposed.\n *\n * The loop is optional: with it, requestAnimationFrame (overridable — the\n * seam a WebXR session fills) drives onFrame(dt) with dt in seconds clamped\n * to 50 ms, the stalled-tab guard; without it the application ticks the\n * players from its own loop.\n */\n\n'use strict';\n\n/**\n * Create a players registry.\n * @returns {{ add(player):object, remove(player):object, has(player):boolean,\n * tick(dt:number):void, size:number, clear():void }}\n */\nexport function createPlayers() {\n const set = new Set();\n const players = {\n /** Register a player; adding one already present is a no-op. */\n add(player) { if (player) set.add(player); return players; },\n /** Unregister a player. */\n remove(player) { set.delete(player); return players; },\n /** Whether a player is registered. */\n has(player) { return set.has(player); },\n /** Tick every player with dt (seconds); one returning false is removed. */\n tick(dt) {\n for (const p of [...set]) {\n if (!set.has(p)) continue; // removed by an earlier player this tick\n if (p.tick(dt) === false) set.delete(p);\n }\n },\n /** Registered count. */\n get size() { return set.size; },\n /** Unregister every player. */\n clear() { set.clear(); },\n };\n return players;\n}\n\nconst _now = () => (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n\n/**\n * Create a frame loop. `onFrame(dt)` runs once per animation frame with the\n * clamped period in seconds; start() schedules, stop() cancels.\n *\n * @param {{ onFrame:function(number):void, raf?:function, caf?:function,\n * clampMs?:number, now?:function():number }} opts\n * raf / caf default to the window's requestAnimationFrame /\n * cancelAnimationFrame; clampMs defaults to 50.\n * @returns {{ start():object, stop():object, running:boolean, dt:number }}\n */\nexport function createLoop(opts) {\n const o = opts || {};\n const raf = o.raf || ((cb) => requestAnimationFrame(cb));\n const caf = o.caf || ((id) => cancelAnimationFrame(id));\n const now = o.now || _now;\n const clamp = (o.clampMs ?? 50) / 1000;\n let handle = null, last = 0;\n const loop = {\n running: false,\n dt: 0,\n start() {\n if (loop.running) return loop;\n loop.running = true;\n last = now();\n const frame = () => {\n if (!loop.running) return;\n const t = now();\n loop.dt = Math.min((t - last) / 1000, clamp);\n last = t;\n o.onFrame(loop.dt);\n if (loop.running) handle = raf(frame);\n };\n handle = raf(frame);\n return loop;\n },\n stop() {\n loop.running = false;\n if (handle !== null) { caf(handle); handle = null; }\n return loop;\n },\n };\n return loop;\n}\n","/**\n * @file The handle controller — a draggable constraint driven from the pointer source.\n * @module host/handle\n * @license AGPL-3.0-only\n *\n * Wraps a core Constraint (@nakednous/tree) with the transport a draggable\n * 3D control needs: presses, moves and releases from the host's pointer\n * source, a pixel → ray unprojection through the host's view bag, an\n * analytic pick against the constraint's proxy, and a host-driven update()\n * lifecycle. No drawing: a bridge draws the locus (locusLines) and the dot.\n *\n * ── update() ordering contract ─────────────────────────────────────────────\n * update() is host-driven, before the orbit, because the orbit gate depends\n * on the grab resolving first:\n *\n * onFrame() { setCamera(cam); if (!h.update()) orbit.update(); scene() }\n *\n * ── Pick ───────────────────────────────────────────────────────────────────\n * The pointer's ray is unproject(x, y, view) in WORLD; the grab size is\n * grabPx converted to world units through pixelRatio at the proxy's depth;\n * the constraint's proxy(ray, radius) answers t or Infinity. Built-in kinds\n * carry their proxy (a sphere at the point, the DIAL's ring); a custom kind\n * supplies one or gets the sphere. solve() runs in WORLD; value() converts.\n *\n * ── Pointer source ─────────────────────────────────────────────────────────\n * update() reads the frame's press queue and the tracked pointer's entry\n * (seq counts moves; up / cancel end the gesture; Esc cancels every claimed\n * pointer). A grab claims the pointer, which captures it on the canvas; a\n * miss leaves it unclaimed for the orbit. The whole gesture keys to one\n * pointerId, so on a shared surface each handle tracks its own finger.\n *\n * ── Constraint kinds ───────────────────────────────────────────────────────\n * Core SPHERE / PLANE / AXIS / DIAL pass straight through. VIEW is a core\n * PLANE re-aimed at the camera each solve — a screen-parallel drag plane\n * through the current point — reported as a world position; its constraint\n * carries `view: true`, the flag locusLines reads. A custom kind is a\n * contract-conforming object (kind / solve / value / seed, optional scalar /\n * azEl / aim / proxy / locus) passed as `constraint`.\n *\n * ── Snap / hover / cancel / from ───────────────────────────────────────────\n * snap quantises at the solve seam: an angular step for SPHERE (az/el) and\n * DIAL (θ), a world grid for PLANE / AXIS / VIEW (PLANE re-projecting).\n * hover is a lone-handle opt-in (a router provides it shared). Cancel — Esc,\n * pointercancel, cancel() — reverts to the value captured at grab, restores\n * the binding and fires onCancel instead of onRelease. `from` names the space\n * the symbolic basis (axis / normal / zero) resolves FROM into WORLD each idle\n * frame through mapDirection on the view bag — WORLD, EYE, or a mat4 —\n * frozen at grab.\n */\n\n'use strict';\n\nimport {\n createConstraint, dirFromAzEl, unproject, rayHitSphere,\n mapLocation, mapDirection, pixelRatio, mat4Invert,\n SPHERE, PLANE, AXIS, DIAL, POINT, DIRECTION, WORLD, MATRIX,\n} from '@nakednous/tree';\n\n/** The screen-parallel free-translate constraint (a core PLANE re-aimed each solve). */\nexport const VIEW = 4;\n\n// Module-level scratch — update() and value() run to completion within one\n// frame with no reentrancy across handles.\nconst _rayO = [0, 0, 0]; // pick ray origin, WORLD\nconst _rayD = [0, 0, 0]; // pick ray unit direction, WORLD\n/** The ray scratch a handle's _ray(x, y) fills — the router's shared pick reads it. */\nexport const rayScratch = { o: _rayO, d: _rayD };\nconst _v3 = [0, 0, 0]; // value() extraction scratch\nconst _q2 = [0, 0]; // az/el snap scratch\nconst _b0 = [0, 0, 0]; // resolved θ = 0 reference\nconst _b2 = [0, 0, 0]; // resolved axis / normal\nconst _frameInv = new Float32Array(16);\n\n// The mapping bag mapLocation / mapDirection take: the view's matrices plus\n// the frames a call names (a mat4 `from` or `to` is the MATRIX space).\nconst _bag = { mat4Proj: null, mat4View: null, mat4PV: null, mat4PVInv: null, mat4Eye: null,\n fromFrame: null, toFrame: null, toFrameInv: null };\nconst _isMat = (s) => s != null && typeof s !== 'string';\nconst _space = (s) => (_isMat(s) ? MATRIX : s);\n\nfunction _bagOf(view, from, to) {\n _bag.mat4Proj = view.mat4Proj; _bag.mat4View = view.mat4View;\n _bag.mat4PV = view.mat4PV; _bag.mat4PVInv = view.mat4PVInv; _bag.mat4Eye = view.mat4Eye;\n _bag.fromFrame = _isMat(from) ? from : null;\n if (_isMat(to)) { _bag.toFrame = to; _bag.toFrameInv = mat4Invert(_frameInv, to) ? _frameInv : null; }\n else { _bag.toFrame = null; _bag.toFrameInv = null; }\n return _bag;\n}\n\nconst _norm3 = (o) => {\n const l = Math.hypot(o[0], o[1], o[2]) || 1;\n o[0] /= l; o[1] /= l; o[2] /= l;\n return o;\n};\n\n// Orthonormal in-plane basis for a unit normal n, seeded from the world axis\n// least aligned with it (a DIAL's θ = 0 reference when `from` gives none).\nconst _basisFromNormal = (n, ub, vb) => {\n const ax = Math.abs(n[0]), ay = Math.abs(n[1]), az = Math.abs(n[2]);\n let rx = 0, ry = 0, rz = 0;\n if (ax <= ay && ax <= az) rx = 1; else if (ay <= az) ry = 1; else rz = 1;\n ub[0] = ry*n[2] - rz*n[1]; ub[1] = rz*n[0] - rx*n[2]; ub[2] = rx*n[1] - ry*n[0];\n _norm3(ub);\n vb[0] = n[1]*ub[2] - n[2]*ub[1]; vb[1] = n[2]*ub[0] - n[0]*ub[2]; vb[2] = n[0]*ub[1] - n[1]*ub[0];\n};\n\n// Read component i of an array or {x, y, z}, falling back to d.\nconst _vx = (v, i, d) => {\n if (v == null) return d;\n const c = i === 0 ? v.x : i === 1 ? v.y : v.z;\n return c ?? v[i] ?? d;\n};\n\n/** Contract check for a custom constraint object. */\nexport const isConstraint = (c) =>\n c && typeof c === 'object' &&\n typeof c.solve === 'function' &&\n typeof c.value === 'function' &&\n typeof c.seed === 'function';\n\n/**\n * The handle controller. Stateful and long-lived, like a track; driven from\n * the frame through update(), read with value(out, opts).\n */\nexport class Handle {\n /**\n * @param {object} host The host context (its pointer source and view bag).\n * @param {object} opts See host.handle().\n */\n constructor(host, opts) {\n this._host = host;\n this._pointer = host.pointer;\n this._view = host.view;\n\n const kind = opts.constraint;\n this._isView = (kind === VIEW);\n if (isConstraint(kind)) {\n this._constraint = kind;\n } else {\n const coreKind = this._isView ? PLANE : kind;\n // Vector opts pass straight through — the core duck-types arrays and {x, y, z}.\n this._constraint = createConstraint(coreKind, {\n radius: opts.radius, report: opts.report, anchor: opts.anchor,\n normal: opts.normal, axis: opts.axis, zero: opts.zero, extent: opts.extent,\n });\n if (this._isView) this._constraint.view = true; // the flag locusLines reads\n }\n\n // Deferred constraint frame: the symbolic basis and the space it resolves from.\n this._from = null; this._fromDir = null; this._fromZero = null;\n if (opts.from != null && opts.from !== WORLD) {\n const custom = isConstraint(kind);\n const dirOpt = (kind === PLANE) ? opts.normal : (opts.axis ?? opts.normal);\n const ok = !this._isView &&\n (kind === PLANE || kind === AXIS || kind === DIAL ||\n (custom && typeof this._constraint.aim === 'function'));\n if (!ok) {\n console.error('[host] handle: `from` needs an aimable constraint — PLANE, AXIS, DIAL, or a custom kind exposing aim(); ignoring.');\n } else if (custom && dirOpt == null) {\n console.error('[host] handle: `from` on a custom kind needs a symbolic `axis` (or `normal`) to resolve; ignoring.');\n } else {\n this._from = opts.from;\n this._fromDir = [_vx(dirOpt, 0, kind === AXIS ? 1 : 0), _vx(dirOpt, 1, kind === AXIS ? 0 : 1), _vx(dirOpt, 2, 0)];\n if (opts.zero != null) {\n this._fromZero = [_vx(opts.zero, 0, 1), _vx(opts.zero, 1, 0), _vx(opts.zero, 2, 0)];\n } else if (kind === DIAL) {\n // Derive the θ = 0 reference once, in the FROM space, so axis and zero co-rotate.\n _b2[0] = this._fromDir[0]; _b2[1] = this._fromDir[1]; _b2[2] = this._fromDir[2];\n _norm3(_b2);\n const r0 = [0, 0, 0], r1 = [0, 0, 0];\n _basisFromNormal(_b2, r0, r1);\n this._fromZero = r0;\n }\n }\n }\n\n this._enabled = opts.enabled !== false;\n this._grabPx = Number.isFinite(opts.grabPx) ? opts.grabPx : 12;\n this._snap = opts.snap ?? null;\n this._hover = opts.hover === true;\n this._hovered = false;\n this._hid = null; this._hseq = -1; // the pointer last hover-tested, and its seq then\n\n // Transport state: one pointerId per gesture, its last consumed move seq\n // and its position in logical canvas px; _routed hands the down step to a router.\n this._grabbed = false;\n this._pid = null;\n this._seq = -1;\n this._ptr = [0, 0];\n this._routed = false;\n\n // The proxy: its world position and the grab radius in world units.\n this._proxyPos = [0, 0, 0];\n this._proxyRad = 0;\n\n // Cancel state — the value (and scalar, for winding) captured at grab.\n this._saved = [0, 0, 0];\n this._savedS = 0;\n\n // Hooks — user-facing, then the lib-space seams a router or a track owns.\n this.onGrab = typeof opts.onGrab === 'function' ? opts.onGrab : null;\n this.onRelease = typeof opts.onRelease === 'function' ? opts.onRelease : null;\n this.onChange = typeof opts.onChange === 'function' ? opts.onChange : null;\n this.onCancel = typeof opts.onCancel === 'function' ? opts.onCancel : null;\n this._onGrab = null; this._onRelease = null; this._onChange = null; this._onCancel = null;\n\n // Binding — a normalised { get, set } accessor; _bindVal the reused value array.\n this._binder = null;\n this._bindVal = [0, 0, 0];\n\n if (opts.bind != null) this.bind(opts.bind);\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n /**\n * Resolve the grab and re-solve from the pointer. Call first in the frame,\n * before the orbit; a routed handle is updated by its router. Returns the\n * grabbed state so the orbit gate can short-circuit; a disabled handle\n * returns false.\n * @returns {boolean} grabbed\n */\n update() {\n if (!this._enabled) {\n if (this._pid !== null && this._pointer) this._pointer.release(this._pid);\n this._grabbed = false; this._hovered = false; this._pid = null;\n return false;\n }\n const src = this._pointer;\n if (!src) return false;\n if (this._from && !this._grabbed) this._resolveFrame();\n\n // Fresh press (unrouted): the first unclaimed press this frame is\n // hit-tested at its pixel; a hit claims the pointer, a miss leaves it.\n if (!this._routed && this._pid === null) {\n for (const pr of src.presses) {\n if (src.ownerOf(pr.id) !== null) continue;\n this._ptr[0] = pr.x; this._ptr[1] = pr.y;\n if (this._pickAt(pr.x, pr.y)) { this._adopt(pr.id, pr.x, pr.y); break; }\n }\n }\n\n if (this._pid !== null) {\n const e = src.get(this._pid);\n if (!e) {\n this._cancelNow(); // the entry left before this handle saw its end\n } else {\n if (this._grabbed && e.seq !== this._seq && !e.cancel) {\n this._seq = e.seq;\n this._ptr[0] = e.x; this._ptr[1] = e.y;\n this._solveFromPointer(e.x, e.y);\n this._applySnap();\n this._afterSolve();\n }\n if (e.cancel) {\n this._cancelNow();\n } else if (e.up) {\n src.release(this._pid);\n this._grabbed = false;\n this._pid = null;\n this.onRelease && this.onRelease(this);\n this._onRelease && this._onRelease(this);\n }\n }\n }\n\n // Hover: a lone handle tests the latest unclaimed pointer motion.\n if (this._grabbed) {\n this._hovered = true;\n } else if (this._hover && !this._routed) {\n for (const e of src.pointers.values()) {\n if (e.owner !== null) continue;\n if (e.id === this._hid && e.seq === this._hseq) continue;\n this._hid = e.id; this._hseq = e.seq;\n this._hovered = this._pickAt(e.x, e.y);\n break;\n }\n }\n return this._grabbed;\n }\n\n _beginGrab() {\n const c = this._constraint;\n c.value(this._saved, POINT);\n this._savedS = typeof c.scalar === 'function' ? c.scalar() : 0;\n this._grabbed = true;\n this.onGrab && this.onGrab(this);\n this._onGrab && this._onGrab(this);\n }\n\n /** Router seam: adopt a pointer a shared pick decided; claims it through the source. */\n _adopt(pointerId, x, y) {\n const e = this._pointer.get(pointerId);\n this._pid = pointerId;\n this._seq = e ? e.seq : -1;\n this._ptr[0] = x; this._ptr[1] = y;\n this._pointer.claim(pointerId, this);\n this._beginGrab();\n }\n\n /**\n * Revert the drag in flight to the value captured at grab (exact θ winding\n * included), restore the binding, fire onCancel. No-op when not grabbed.\n * Chainable.\n * @returns {Handle} this\n */\n cancel() {\n if (this._grabbed) this._cancelNow();\n return this;\n }\n\n _cancelNow() {\n const c = this._constraint;\n if (this._isView) {\n c.pt[0] = this._saved[0]; c.pt[1] = this._saved[1]; c.pt[2] = this._saved[2];\n } else if (c.kind === DIAL) {\n c.s = this._savedS;\n c._dialPoint();\n } else {\n c.seed(this._saved[0], this._saved[1], this._saved[2]);\n }\n if (this._binder) this._binder.set(this.value(this._bindVal));\n this._grabbed = false;\n if (this._pid !== null && this._pointer) this._pointer.release(this._pid);\n this._pid = null;\n this.onCancel && this.onCancel(this);\n this._onCancel && this._onCancel(this);\n }\n\n // ── Frame, pick, solve ──────────────────────────────────────────────────\n\n // Resolve the symbolic basis from its space into WORLD through the view\n // bag and re-aim the constraint; idle frames only.\n _resolveFrame() {\n const v = this._view, bag = _bagOf(v, this._from, null), from = _space(this._from);\n const d = this._fromDir;\n mapDirection(_b2, d[0], d[1], d[2], from, WORLD, bag, v.vp, v.ndcZMin);\n if (this._fromZero) {\n const z = this._fromZero;\n mapDirection(_b0, z[0], z[1], z[2], from, WORLD, bag, v.vp, v.ndcZMin);\n this._constraint.aim(_b2[0], _b2[1], _b2[2], _b0[0], _b0[1], _b0[2]);\n } else {\n this._constraint.aim(_b2[0], _b2[1], _b2[2]);\n }\n }\n\n // The proxy's world position and its grab radius in world units — a\n // constant grabPx screen size at the proxy's depth.\n _proxyPrep() {\n const c = this._constraint, v = this._view, p = this._proxyPos;\n if (this._from && !this._grabbed) this._resolveFrame();\n if (c.kind === DIAL && !this._isView) {\n p[0] = c.anchor[0]; p[1] = c.anchor[1]; p[2] = c.anchor[2];\n } else {\n c.value(p, POINT);\n }\n const V = v.mat4View;\n const eyeZ = V[2]*p[0] + V[6]*p[1] + V[10]*p[2] + V[14];\n this._proxyRad = this._grabPx * pixelRatio(v.mat4Proj, -v.vp[3], eyeZ, v.ndcZMin);\n }\n\n // The analytic pick: t along the ray, or Infinity.\n _proxyT(o, d) {\n this._proxyPrep();\n const c = this._constraint;\n if (typeof c.proxy === 'function') return c.proxy(o[0], o[1], o[2], d[0], d[1], d[2], this._proxyRad);\n const p = this._proxyPos;\n return rayHitSphere(o[0], o[1], o[2], d[0], d[1], d[2], p[0], p[1], p[2], this._proxyRad);\n }\n\n /** Unproject a canvas pixel into the ray scratch; false on a stale view. */\n _ray(x, y) {\n const v = this._view;\n if (v.stale) return false;\n return unproject(_rayO, _rayD, x, y, v, v.vp, v.ndcZMin) !== null;\n }\n\n /** Hit-test the proxy at a canvas pixel. */\n _pickAt(x, y) {\n return this._ray(x, y) && this._proxyT(_rayO, _rayD) < Infinity;\n }\n\n _solveFromPointer(x, y) {\n if (!this._ray(x, y)) return;\n if (this._isView) this._viewUpdatePlane();\n this._constraint.solve(_rayO[0], _rayO[1], _rayO[2], _rayD[0], _rayD[1], _rayD[2]);\n }\n\n // VIEW: re-aim the plane at the camera through the current point — its\n // normal the look direction (−Z of the eye matrix), its anchor the point.\n _viewUpdatePlane() {\n const c = this._constraint, E = this._view.mat4Eye;\n c.n[0] = -E[8]; c.n[1] = -E[9]; c.n[2] = -E[10];\n _norm3(c.n);\n c.anchor[0] = c.pt[0]; c.anchor[1] = c.pt[1]; c.anchor[2] = c.pt[2];\n }\n\n // ── Snap ────────────────────────────────────────────────────────────────\n\n /** Snap step — angular (rad) for SPHERE / DIAL, a world grid for PLANE / AXIS / VIEW; null off. */\n get snap() { return this._snap; }\n set snap(v) { this._snap = v ?? null; }\n\n _applySnap() {\n const sn = this._snap;\n if (sn == null) return;\n const c = this._constraint;\n if (this._isView || c.kind === PLANE) {\n const gx = Array.isArray(sn) ? sn[0] : sn, gy = Array.isArray(sn) ? sn[1] : sn, gz = Array.isArray(sn) ? sn[2] : sn;\n _v3[0] = gx > 0 ? Math.round(c.pt[0] / gx) * gx : c.pt[0];\n _v3[1] = gy > 0 ? Math.round(c.pt[1] / gy) * gy : c.pt[1];\n _v3[2] = gz > 0 ? Math.round(c.pt[2] / gz) * gz : c.pt[2];\n if (this._isView) { c.pt[0] = _v3[0]; c.pt[1] = _v3[1]; c.pt[2] = _v3[2]; }\n else c.seed(_v3[0], _v3[1], _v3[2]);\n } else if (c.kind === AXIS || c.kind === DIAL) {\n const step = Array.isArray(sn) ? sn[0] : sn;\n if (!(step > 0)) return;\n const q = Math.round(c.s / step) * step;\n c.s = q < c.min ? c.min : (q > c.max ? c.max : q);\n if (c.kind === DIAL) c._dialPoint();\n else {\n c.pt[0] = c.anchor[0] + c.s * c.u[0];\n c.pt[1] = c.anchor[1] + c.s * c.u[1];\n c.pt[2] = c.anchor[2] + c.s * c.u[2];\n }\n } else if (c.kind === SPHERE) {\n const step = Array.isArray(sn) ? sn[0] : sn;\n if (!(step > 0)) return;\n c.azEl(_q2);\n dirFromAzEl(c.dir, Math.round(_q2[0] / step) * step, Math.round(_q2[1] / step) * step);\n }\n }\n\n // ── Value and binding ───────────────────────────────────────────────────\n\n /**\n * Write the current value into `out`. `report` overrides the constraint's\n * (POINT | DIRECTION); `to` converts from WORLD to EYE, SCREEN, NDC, or a\n * mat4 frame through the view bag. Out-first, out required.\n * @param {number[]} out 3-element destination.\n * @param {{ to?:string|ArrayLike<number>, report?:number }} [opts]\n * @returns {number[]} out\n */\n value(out, opts) {\n const o = opts || {}, c = this._constraint;\n const report = (o.report === POINT || o.report === DIRECTION) ? o.report : c.report;\n const to = o.to ?? WORLD;\n c.value(_v3, report);\n if (to === WORLD) { out[0] = _v3[0]; out[1] = _v3[1]; out[2] = _v3[2]; return out; }\n const v = this._view, bag = _bagOf(v, null, to), space = _space(to);\n return report === DIRECTION\n ? mapDirection(out, _v3[0], _v3[1], _v3[2], WORLD, space, bag, v.vp, v.ndcZMin)\n : mapLocation(out, _v3[0], _v3[1], _v3[2], WORLD, space, bag, v.vp, v.ndcZMin);\n }\n\n /**\n * Bind the handle to a target it drives while dragging: a `{ get, set }`\n * accessor, or a vec3 array mutated in place (a camera state's eye or\n * center is one). get() seeds the constraint now; each solve calls\n * set(value) with the reused value array, then fires onChange. Chainable.\n * @param {number[]|{ get:Function, set:Function }} target\n * @returns {Handle} this\n */\n bind(target) {\n let binder = null;\n if (target && typeof target.get === 'function' && typeof target.set === 'function') {\n binder = target;\n } else if (target && typeof target === 'object' && typeof target.length === 'number' && target.length >= 3) {\n binder = { get: () => target, set: (v) => { target[0] = v[0]; target[1] = v[1]; target[2] = v[2]; } };\n } else {\n console.error('[host] handle.bind: unrecognised target — pass a vec3 array or an { get, set } accessor. Leaving unbound.');\n return this;\n }\n this._binder = binder;\n if (this._from && !this._grabbed) this._resolveFrame();\n this._seedFromBinding();\n return this;\n }\n\n /** Re-seed the constraint from the bound target after it changed externally. Chainable. */\n sync() {\n if (this._binder) this._seedFromBinding();\n return this;\n }\n\n _seedFromBinding() {\n const g = this._binder.get();\n if (g == null) return;\n const x = _vx(g, 0, 0), y = _vx(g, 1, 0), z = _vx(g, 2, 0);\n if (this._isView) { const pt = this._constraint.pt; pt[0] = x; pt[1] = y; pt[2] = z; }\n else this._constraint.seed(x, y, z);\n }\n\n // Push the freshly solved value to the binding and fire onChange, once per solve.\n _afterSolve() {\n const bound = this._binder !== null;\n const notify = !!(this.onChange || this._onChange);\n if (!bound && !notify) return;\n const v = this.value(this._bindVal);\n if (bound) this._binder.set(v);\n if (notify) {\n this.onChange && this.onChange(v, this);\n this._onChange && this._onChange(v, this);\n }\n }\n\n // ── Readouts and edits ──────────────────────────────────────────────────\n\n /** AXIS: the signed distance along the rail; DIAL: the accumulated angle; NaN otherwise. */\n scalar() { return typeof this._constraint.scalar === 'function' ? this._constraint.scalar() : NaN; }\n\n /** SPHERE: [az, el] of the current direction, into out2. */\n azEl(out2) {\n const o = out2 || [0, 0];\n return typeof this._constraint.azEl === 'function' ? this._constraint.azEl(o) : o;\n }\n\n /** True between grab and release. */\n grabbed() { return this._grabbed; }\n\n /** True while the pointer rests on the proxy, and while grabbed. */\n hovered() { return this._hovered; }\n\n /**\n * Move the reference point — sphere centre, plane point, axis anchor,\n * dial centre, or a VIEW handle's point; the stored point rides along.\n * Chainable.\n * @param {number[]|{x:number,y:number,z:number}} v\n * @returns {Handle} this\n */\n anchor(v) {\n const c = this._constraint;\n const t = this._isView ? c.pt : c.anchor;\n if (!t) return this;\n t[0] = _vx(v, 0, t[0]); t[1] = _vx(v, 1, t[1]); t[2] = _vx(v, 2, t[2]);\n if (!this._isView) {\n if (c.kind === DIAL) c._dialPoint();\n else if (c.kind === AXIS) {\n c.pt[0] = c.anchor[0] + c.s * c.u[0];\n c.pt[1] = c.anchor[1] + c.s * c.u[1];\n c.pt[2] = c.anchor[2] + c.s * c.u[2];\n } else if (c.kind === PLANE) c.seed(c.pt[0], c.pt[1], c.pt[2]);\n }\n return this;\n }\n\n /** Runtime gate — false suspends grab / solve without disposing. */\n get enabled() { return this._enabled; }\n set enabled(v) {\n this._enabled = !!v;\n if (!this._enabled) {\n if (this._pid !== null && this._pointer) this._pointer.release(this._pid);\n this._grabbed = false; this._hovered = false; this._pid = null;\n }\n }\n\n /** Release the pointer claim and leave the host. */\n dispose() {\n if (this._pid !== null && this._pointer) this._pointer.release(this._pid);\n this._pid = null;\n this._grabbed = false;\n this._pointer = null;\n this._host.unregister(this);\n }\n}\n\n/**\n * Validate the constraint option: a built-in kind, VIEW, or a contract object.\n * @param {*} kind\n * @returns {boolean}\n */\nexport function validConstraint(kind) {\n return kind === SPHERE || kind === PLANE || kind === AXIS || kind === DIAL || kind === VIEW || !!isConstraint(kind);\n}\n","/**\n * @file The pointer router — shared arbitration for overlapping handles.\n * @module host/router\n * @license AGPL-3.0-only\n *\n * Per-handle self-picking double-grabs on overlap: two proxies under one\n * finger each test only themselves and both hit. The router replaces the\n * members' down step with one shared pick: the pointer's ray once, every\n * enabled member's proxy tested, the nearest t wins (a tie keeps the\n * earlier member, as draw order would). Members keep their own move /\n * solve / release machinery, grabbed through their injected _adopt; every\n * unclaimed press of the frame resolves, so several same-frame presses on\n * different members all land. Hover is the same test on unclaimed pointer\n * motion, shared, setting at most one hovered member.\n */\n\n'use strict';\n\nimport { rayScratch } from './handle.js';\n\n/** Shared pick over a set of handles on one host. */\nexport class PointerRouter {\n /**\n * @param {object} host The host context.\n * @param {object[]} handles Members.\n * @param {{ hover?:boolean }} [opts] hover defaults to true.\n */\n constructor(host, handles, opts) {\n const o = opts || {};\n this._host = host;\n this._pointer = host.pointer;\n this._handles = [];\n this._hover = o.hover !== false;\n this._hoveredH = null;\n this._hid = null; this._hseq = -1;\n for (const h of handles || []) this.add(h);\n }\n\n /**\n * Route a handle: its own pointerdown adoption is disabled and the shared\n * pick grabs it through _adopt. Chainable.\n * @param {object} h\n * @returns {PointerRouter} this\n */\n add(h) {\n if (!h || typeof h._proxyT !== 'function') {\n console.error('[host] router.add: not a handle — ignoring.');\n return this;\n }\n if (this._handles.includes(h)) return this;\n h._routed = true;\n h._onRelease = h._onCancel = () => this._unclaim(h);\n this._handles.push(h);\n return this;\n }\n\n /**\n * Un-route a handle; it self-picks again. Chainable.\n * @param {object} h\n * @returns {PointerRouter} this\n */\n remove(h) {\n const i = this._handles.indexOf(h);\n if (i < 0) return this;\n this._handles.splice(i, 1);\n this._unclaim(h);\n h._routed = false;\n h._onRelease = h._onCancel = null;\n if (this._hoveredH === h) { this._hoveredH = null; h._hovered = false; }\n return this;\n }\n\n /**\n * Resolve the frame's presses with one shared pick each, refresh hover on\n * pointer motion, then update every member. Call first in the frame, in\n * place of the members' own updates.\n * @returns {boolean} true if any member is grabbed.\n */\n update() {\n const hs = this._handles, src = this._pointer;\n if (!src) return false;\n for (const pr of src.presses) {\n if (src.ownerOf(pr.id) !== null) continue;\n const win = this._sharedPick(pr.x, pr.y);\n if (win && win._pid === null && win.enabled) win._adopt(pr.id, pr.x, pr.y);\n }\n if (this._hover) {\n for (const e of src.pointers.values()) {\n if (e.owner !== null) continue;\n if (e.id === this._hid && e.seq === this._hseq) continue;\n this._hid = e.id; this._hseq = e.seq;\n const win = this._sharedPick(e.x, e.y);\n this._hoveredH = win;\n for (const h of hs) h._hovered = (h === win) || h._grabbed;\n break;\n }\n }\n let g = false;\n for (const h of hs) g = h.update() || g;\n return g;\n }\n\n // One ray, every enabled member's proxy, the nearest t.\n _sharedPick(x, y) {\n const hs = this._handles;\n const first = hs.find((h) => h.enabled);\n if (!first || !first._ray(x, y)) return null;\n let win = null, best = Infinity;\n for (const h of hs) {\n if (!h.enabled) continue;\n const t = h._proxyT(rayScratch.o, rayScratch.d);\n if (t < best) { best = t; win = h; }\n }\n return win;\n }\n\n _unclaim(h) {\n const src = this._pointer;\n if (!src) return;\n for (const e of src.pointers.values()) if (e.owner === h) src.release(e.id);\n }\n\n /** The member under the pointer, or null. */\n hovered() { return this._hoveredH; }\n\n /** Un-route every member and leave the host. */\n dispose() {\n for (const h of [...this._handles]) this.remove(h);\n this._pointer = null;\n this._host.unregister(this);\n }\n}\n","/**\n * @file Helm factories — a core PoseHelm driven from the host's players.\n * @module host/helm\n * @license AGPL-3.0-only\n *\n * cameraHelm(host, cam, opts) flies a camera state body-relative: the helm is\n * seeded from the state through cameraToPose, integrates each tick in the\n * state's own eye matrix (which equals the pose written last tick, so a\n * forward push flies forward) and writes back through cameraFromPose at the\n * state's gaze distance. poseHelm(host, opts) produces a pose in a declared\n * frame — WORLD, EYE (the host's view bag), SELF (its own pose) or a mat4 —\n * and drives whatever bind() names: a camera state, an { applyPose } sink, a\n * { get, set } accessor or a { pos, rot } object. Both register a player\n * with the host until disposed.\n */\n\n'use strict';\n\nimport {\n PoseHelm, cameraEye, cameraFromPose, cameraToPose, qToMat4, WORLD, EYE, SELF,\n} from '@nakednous/tree';\n\nconst _pose = { pos: [0, 0, 0], rot: [0, 0, 0, 1] }; // step() output\nconst _self = { pos: [0, 0, 0], rot: [0, 0, 0, 1] }; // eval() readout for SELF\nconst _em = new Float32Array(16); // the resolved basis\n\nconst _rawMat4 = (m) => (m != null && m.mat4 != null) ? m.mat4 : m;\nconst _isCameraState = (c) => !!(c && c.eye && c.center && c.up);\n\nfunction _applyOpts(helm, opts) {\n if (!opts) return;\n if (opts.profile) helm.profile = opts.profile;\n if (opts.deadzone != null) helm.deadzone = opts.deadzone;\n if (opts.filter != null) helm.filter = opts.filter;\n if (opts.fullScale != null) helm.fullScale = opts.fullScale;\n}\n\n/**\n * The basis a pose helm's `from` resolves to: null for WORLD, the view bag's\n * eye matrix for EYE, the helm's own rotation for SELF, a mat4 as given.\n * Exported for a bridge's rig gizmo.\n * @param {PoseHelm} helm\n * @param {object} view The host's view bag.\n * @param {Float32Array} em 16-element scratch.\n * @returns {ArrayLike<number>|null}\n */\nexport function helmBasis(helm, view, em) {\n const from = helm.from;\n if (from != null && typeof from !== 'string') return _rawMat4(from);\n if (from === EYE) return view ? view.mat4Eye : null;\n if (from === SELF) return qToMat4(em, helm.eval(_self).rot);\n if (from === WORLD || from == null) return null;\n console.error('[host] poseHelm: `from` must be EYE, WORLD, SELF, or a mat4 frame. Falling back to WORLD.');\n return null;\n}\n\n/**\n * Fly a camera state from a live 6-DOF rate stream, body-relative.\n * @param {object} host\n * @param {object} cam A camera state ({ eye, center, up, … }).\n * @param {{ profile?:object, deadzone?:number, filter?:object, fullScale?:number }} [opts]\n * @returns {PoseHelm} The helm, with dispose().\n */\nexport function cameraHelm(host, cam, opts) {\n const helm = new PoseHelm();\n _applyOpts(helm, opts);\n if (opts && opts.from != null) {\n console.error('[host] cameraHelm: a camera helm is always body-fly and has no `from`. Ignoring it; bind the camera to a poseHelm for screen- or world-relative motion.');\n }\n if (_isCameraState(cam)) helm.home(cameraToPose(_pose, cam));\n const player = {\n tick(dt) {\n helm.step(_pose, dt, _isCameraState(cam) ? cameraEye(_em, cam) : null);\n if (_isCameraState(cam)) {\n cameraFromPose(cam, _pose);\n if (helm._onApply) helm._onApply(cam);\n }\n return true;\n },\n };\n helm._onApply = null; // lib-space seam: a bridge pushes the written state to its camera\n host.players.add(player);\n helm.dispose = () => { host.players.remove(player); host.unregister(helm); return helm; };\n return host.register(helm);\n}\n\n/**\n * Integrate a live 6-DOF rate stream into a pose in a declared frame and\n * drive a bound target with it.\n * @param {object} host\n * @param {{ profile?:object, deadzone?:number, filter?:object, fullScale?:number,\n * from?:string|ArrayLike<number>, bind?:object }} [opts]\n * @returns {PoseHelm} The helm, with bind() and dispose().\n */\nexport function poseHelm(host, opts) {\n const o = opts || {};\n const helm = new PoseHelm();\n _applyOpts(helm, o);\n if (o.from != null) helm.from = o.from;\n let sink = null;\n\n const player = {\n tick(dt) {\n if (sink) {\n helm.step(_pose, dt, helmBasis(helm, host.view, _em));\n sink(_pose);\n }\n return true;\n },\n };\n host.players.add(player);\n\n /**\n * Bind the target the helm drives: a camera state (seeded from it, written\n * through cameraFromPose), an { applyPose } sink, a { get, set } accessor\n * (get() seeds, set(pose) writes) or a { pos, rot } object mutated in\n * place. Chainable.\n * @param {object} target\n * @returns {PoseHelm} this\n */\n helm.bind = (target) => {\n if (_isCameraState(target)) {\n helm.home(cameraToPose(_pose, target));\n sink = (pose) => cameraFromPose(target, pose);\n } else if (target && typeof target.get === 'function' && typeof target.set === 'function') {\n helm.home(target.get());\n sink = (pose) => target.set(pose);\n } else if (target && typeof target.applyPose === 'function') {\n sink = (pose) => target.applyPose(pose);\n } else if (target && target.pos && target.rot) {\n helm.home(target);\n sink = (pose) => {\n target.pos[0] = pose.pos[0]; target.pos[1] = pose.pos[1]; target.pos[2] = pose.pos[2];\n target.rot[0] = pose.rot[0]; target.rot[1] = pose.rot[1];\n target.rot[2] = pose.rot[2]; target.rot[3] = pose.rot[3];\n };\n } else {\n console.error('[host] poseHelm: bind() target must be a camera state, an { applyPose } sink, a { get, set } accessor, or a { pos, rot } object. Leaving unbound.');\n }\n return helm;\n };\n helm.dispose = () => { host.players.remove(player); host.unregister(helm); return helm; };\n if (o.bind != null) helm.bind(o.bind);\n return host.register(helm);\n}\n","/**\n * @file Track factories and TrackHandles — core tracks wired to the host's players.\n * @module host/track\n * @license AGPL-3.0-only\n *\n * poseTrack(host, opts) is a core PoseTrack whose activation hooks add and\n * remove its player. cameraTrack(host, cam, opts) is a core CameraTrack whose\n * player evaluates straight into the camera state `cam` — the state is the\n * keyframe shape, so track.eval(cam) is the write — and once more on\n * deactivate so the camera rests on the path; add() with no argument\n * captures `cam`, add({ camera }) any camera-state object. { handles } on\n * either decorates the track with TrackHandles: one VIEW handle per\n * draggable keyframe field (pos / eye / center), an optional rot DIAL per\n * keyframe about a declared axis, all on one router.\n */\n\n'use strict';\n\nimport { PoseTrack, CameraTrack, qFromAxisAngle, DIAL } from '@nakednous/tree';\nimport { VIEW } from './handle.js';\n\n// ── Players ────────────────────────────────────────────────────────────────\n\nfunction _wirePoseTrack(host, track) {\n let player = null;\n track._onActivate = () => {\n player = player || { tick() { track.tick(); return track.playing; } };\n host.players.add(player);\n };\n track._onDeactivate = () => { if (player) host.players.remove(player); };\n}\n\n/**\n * A core PoseTrack ticked by the host while it plays.\n * @param {object} host\n * @param {{ handles?:boolean|object }} [opts]\n * @returns {PoseTrack}\n */\nexport function poseTrack(host, opts) {\n const o = opts || {};\n const track = new PoseTrack();\n _wirePoseTrack(host, track);\n if (o.handles) track.handles = new TrackHandles(host, track, o.handles, false);\n return track;\n}\n\n/**\n * A core CameraTrack evaluating into the camera state `cam` while it plays.\n * @param {object} host\n * @param {object} cam A camera state ({ eye, center, up, fov, halfHeight, near, far }).\n * @param {{ handles?:boolean|object }} [opts]\n * @returns {CameraTrack}\n */\nexport function cameraTrack(host, cam, opts) {\n const o = opts || {};\n const track = new CameraTrack();\n const state = cam || null; // the evaluation target; track.camera is informational\n track.camera = state;\n track._onApply = null; // lib-space seam: a bridge pushes the evaluated state to its camera\n\n const coreAdd = track.add.bind(track);\n track.add = function (spec, addOpts) {\n if (spec == null) {\n if (!state) return;\n spec = state;\n } else if (Array.isArray(spec)) {\n for (const s of spec) track.add(s, addOpts);\n return;\n } else if (spec.camera != null) {\n spec = spec.camera;\n }\n coreAdd(spec, addOpts);\n };\n\n const apply = () => {\n if (!state || track.keyframes.length === 0) return;\n track.eval(state);\n if (track._onApply) track._onApply(state);\n };\n const player = {\n tick() {\n if (!track.playing) return false;\n track.tick();\n apply();\n return track.playing;\n },\n };\n track._onActivate = () => host.players.add(player);\n track._onDeactivate = () => { host.players.remove(player); apply(); };\n\n if (o.handles) track.handles = new TrackHandles(host, track, o.handles, true);\n return track;\n}\n\n// ── TrackHandles ───────────────────────────────────────────────────────────\n\nconst _vx = (v, i) => (v[i] !== undefined ? v[i] : (i === 0 ? v.x : i === 1 ? v.y : v.z));\n\n/**\n * Per-keyframe manipulators of a track — the factories' `handles` opt,\n * stored at track.handles. Members are internal handles on one router;\n * their hooks are re-exposed with keyframe coordinates: onGrab(index, field,\n * h) / onChange(value, index, field, h) / onRelease / onCancel, field one of\n * 'pos' | 'eye' | 'center' | 'rot'. update() rebuilds the members when the\n * keyframe count changes and re-seeds every idle member from its keyframe.\n * A bridge draws the members itself (`members`).\n */\nexport class TrackHandles {\n /**\n * @param {object} host\n * @param {object} track PoseTrack | CameraTrack.\n * @param {true|object} opts `true` for the defaults, or\n * { center?, rot?, rotRadius?, rotSnap?, grabPx?, snap?, hover? }.\n * @param {boolean} isCamera CameraTrack (eye / center) vs PoseTrack (pos / rot).\n */\n constructor(host, track, opts, isCamera) {\n const o = opts === true ? {} : (opts || {});\n this._host = host;\n this._track = track;\n this._isCamera = !!isCamera;\n this._members = [];\n this._rotByIndex = new Map();\n this._n = -1;\n this._enabled = true;\n /** Last-grabbed keyframe index, null until a grab. @type {number|null} */\n this.selected = null;\n\n this._grabPx = Number.isFinite(o.grabPx) ? o.grabPx : 12;\n this._snap = o.snap ?? null;\n this._rotSnap = o.rotSnap ?? null;\n this._center = this._isCamera ? (o.center !== false) : false;\n if (!this._isCamera && o.center !== undefined) console.error('[host] track handles: `center` is CameraTrack-only — ignoring.');\n this._rotAxis = null;\n this._rotRadius = Number.isFinite(o.rotRadius) ? o.rotRadius : 40;\n if (o.rot != null) {\n if (this._isCamera) {\n console.error('[host] track handles: `rot` is PoseTrack-only — a camera keyframe\\'s orientation is its center; drag that instead. Ignoring.');\n } else {\n const ax = _vx(o.rot, 0) ?? 0, ay = _vx(o.rot, 1) ?? 1, az = _vx(o.rot, 2) ?? 0;\n const l = Math.hypot(ax, ay, az) || 1;\n this._rotAxis = [ax / l, ay / l, az / l];\n }\n }\n\n this.onGrab = null; this.onChange = null; this.onRelease = null; this.onCancel = null;\n this._hover = o.hover !== false;\n this._router = null; // made on the first rebuild, once a subclass is constructed\n }\n\n // The construction seams a bridge subclass overrides so the members are\n // handles it can draw.\n _makeHandle(opts) { return this._host.handle(opts); }\n _makeRouter(opts) { return this._host.router([], opts); }\n\n /** The members, { h, index, field } each, for a bridge's draw. */\n get members() { return this._members; }\n /** Dot radius in pixels, the members' grabPx. */\n get grabPx() { return this._grabPx; }\n\n /**\n * Rebuild if the keyframe count changed, re-seed idle members, then route.\n * Call first in the frame, before the orbit.\n * @returns {boolean} true while any member is grabbed.\n */\n update() {\n if (this._track.keyframes.length !== this._n) this._rebuild();\n if (this._enabled) this._syncIdle();\n return this._router.update();\n }\n\n /** The members' router, made on the first update(). */\n get router() { return this._router; }\n\n /** Runtime gate — false suspends grab / solve and empties the pick. */\n get enabled() { return this._enabled; }\n set enabled(v) {\n this._enabled = !!v;\n for (const m of this._members) m.h.enabled = this._enabled;\n }\n\n /** True while any member is grabbed. */\n grabbed() {\n for (const m of this._members) if (m.h.grabbed()) return true;\n return false;\n }\n\n /** The keyframe index under the pointer (or grabbed), else null. */\n hovered() {\n for (const m of this._members) if (m.h.hovered()) return m.index;\n return null;\n }\n\n /** Re-seed every idle member from its keyframe. Chainable. */\n sync() { this._syncIdle(); return this; }\n\n /** Dispose the members and the router, detach from the track. */\n dispose() {\n this._teardown();\n if (this._router) this._router.dispose();\n if (this._track.handles === this) this._track.handles = null;\n }\n\n _rebuild() {\n if (!this._router) this._router = this._makeRouter({ hover: this._hover });\n this._teardown();\n const n = this._track.keyframes.length;\n this._n = n;\n for (let i = 0; i < n; i++) {\n this._addViewMember(i, this._isCamera ? 'eye' : 'pos');\n if (this._center) this._addViewMember(i, 'center');\n if (this._rotAxis) this._addRotMember(i);\n }\n if (this.selected != null && this.selected >= n) this.selected = null;\n }\n\n _teardown() {\n for (const m of this._members) { this._router.remove(m.h); m.h.dispose(); }\n this._members.length = 0;\n this._rotByIndex.clear();\n }\n\n // A VIEW member bound to kf[field] by index, so set(i, spec) replacing the\n // keyframe never strands it.\n _addViewMember(index, field) {\n const track = this._track;\n const h = this._makeHandle({\n constraint: VIEW, grabPx: this._grabPx, snap: this._snap,\n bind: {\n get: () => track.keyframes[index] ? track.keyframes[index][field] : null,\n set: (v) => {\n const k = track.keyframes[index];\n if (!k) return;\n const a = k[field];\n a[0] = _vx(v, 0); a[1] = _vx(v, 1); a[2] = _vx(v, 2);\n },\n },\n });\n if (!h) return;\n this._wire(h, index, field);\n this._members.push({ h, index, field });\n this._router.add(h);\n }\n\n // A rot member: one DIAL about the declared axis at the keyframe's\n // position, unbound — θ lands in kf.rot through the hooks.\n _addRotMember(index) {\n const kf = this._track.keyframes[index];\n const h = this._makeHandle({\n constraint: DIAL, anchor: [kf.pos[0], kf.pos[1], kf.pos[2]],\n axis: this._rotAxis, radius: this._rotRadius, grabPx: this._grabPx, snap: this._rotSnap,\n });\n if (!h) return;\n this._wire(h, index, 'rot');\n const m = { h, index, field: 'rot' };\n this._members.push(m);\n this._rotByIndex.set(index, m);\n this._router.add(h);\n this._syncRot(m);\n }\n\n _wire(h, index, field) {\n const rotWrite = () => {\n const k = this._track.keyframes[index];\n if (k) { const u = this._rotAxis; qFromAxisAngle(k.rot, u[0], u[1], u[2], h.scalar()); }\n };\n h.onGrab = () => {\n this.selected = index;\n if (this.onGrab) this.onGrab(index, field, h);\n };\n h.onChange = (v) => {\n if (field === 'rot') rotWrite();\n else if (field === 'pos') {\n // Forward the dragged position into the keyframe's rot ring now, so\n // the ring never trails the dot by a frame.\n const rm = this._rotByIndex.get(index);\n const k = this._track.keyframes[index];\n if (rm && k) rm.h.anchor(k.pos);\n }\n if (this.onChange) this.onChange(v, index, field, h);\n };\n h.onRelease = () => { if (this.onRelease) this.onRelease(index, field, h); };\n h.onCancel = () => {\n if (field === 'rot') rotWrite(); // a DIAL is unbound: re-derive from the reverted θ\n if (this.onCancel) this.onCancel(index, field, h);\n };\n }\n\n _syncIdle() {\n for (const m of this._members) {\n if (m.h.grabbed()) continue;\n if (m.field === 'rot') this._syncRot(m);\n else m.h.sync();\n }\n }\n\n // Anchor the ring at the live keyframe position and set θ to the twist of\n // kf.rot about the axis: θ = 2·atan2(q.xyz · u, q.w).\n _syncRot(m) {\n const k = this._track.keyframes[m.index];\n if (!k) return;\n m.h.anchor(k.pos);\n const u = this._rotAxis;\n const th = 2 * Math.atan2(k.rot[0] * u[0] + k.rot[1] * u[1] + k.rot[2] * u[2], k.rot[3]);\n const c = m.h._constraint;\n if (c.s !== th) { c.s = th; c._dialPoint(); }\n }\n}\n","/**\n * @file The host context — one per canvas: pointer, view bag, players, loop, observer.\n * @module host\n * @license AGPL-3.0-only\n *\n * The signal host of a program: what it needs from the browser that is\n * neither math nor GPU — a canvas element's pointer input, the frame clock,\n * its size — and the registry its constructs tick from. Pure vanilla DOM;\n * everything it computes goes through @nakednous/tree, nothing it draws.\n *\n * const host = createHost(canvas, { onFrame })\n * host.pointer · host.view · host.players\n * host.width · host.height · host.dpr · host.dt · host.clock()\n * host.handle(opts) · host.router(handles, opts)\n * host.cameraHelm(cam, opts) · host.poseHelm(opts)\n * host.poseTrack(opts) · host.cameraTrack(cam, opts)\n * host.tick(dt) // external-loop mode\n * host.dispose()\n *\n * Two loop modes. With { onFrame } the host runs requestAnimationFrame\n * (overridable through { raf, caf }): each frame computes dt (clamped to\n * 50 ms), ticks the players, calls onFrame(dt, host), then flushes the\n * pointer source. Without it the application, or the p5 adapter from\n * predraw, calls host.tick(dt) = players.tick(dt) and host.pointer.flush()\n * once its consumers ran. Nothing else in the host cares who owns the loop.\n *\n * The frame order inside onFrame: install the camera (which fills\n * host.view), update handles or routers, fall through to the orbit when\n * nothing grabbed, draw.\n */\n\n'use strict';\n\nimport { createView } from './view.js';\nimport { observeCanvas } from './canvas.js';\nimport { createPointer } from './pointer.js';\nimport { createPlayers, createLoop } from './loop.js';\nimport { Handle, validConstraint } from './handle.js';\nimport { PointerRouter } from './router.js';\nimport { cameraHelm, poseHelm } from './helm.js';\nimport { poseTrack, cameraTrack } from './track.js';\n\nexport { createView } from './view.js';\nexport { observeCanvas, measureCanvas } from './canvas.js';\nexport { createPointer } from './pointer.js';\nexport { createPlayers, createLoop } from './loop.js';\nexport { Handle, VIEW, isConstraint, validConstraint } from './handle.js';\nexport { PointerRouter } from './router.js';\nexport { cameraHelm, poseHelm, helmBasis } from './helm.js';\nexport { poseTrack, cameraTrack, TrackHandles } from './track.js';\n\nconst _now = () => (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n\n/**\n * Create the host context of a canvas.\n *\n * @param {HTMLCanvasElement} canvas\n * @param {{ ndcZMin?:number, onFrame?:function(number, object):void, raf?:function,\n * caf?:function, onSize?:function(number, number, number):void }} [opts]\n * ndcZMin: the GPU API's NDC-z convention, WEBGL (default) or WEBGPU —\n * written once, never detected. onFrame: the host's own loop; absent,\n * external-tick mode. onSize(width, height, dpr): the bridge's chance\n * to resize its drawing buffer.\n * @returns {object} The host.\n */\nexport function createHost(canvas, opts) {\n const o = opts || {};\n const t0 = _now();\n const constructs = new Set();\n let loop = null, observer = null;\n const host = {\n canvas,\n width: 0, height: 0, dpr: 1,\n dt: 0,\n view: null, pointer: null, players: null,\n\n /** Seconds since the host was created. */\n clock() { return (_now() - t0) / 1000; },\n\n /**\n * External-loop mode: tick the players with dt (seconds). The caller\n * flushes the pointer source once its consumers ran.\n * @param {number} dt\n */\n tick(dt) { host.dt = dt; host.players.tick(dt); },\n\n /**\n * A draggable handle on this canvas — see host/handle. Returns null on\n * an invalid `constraint`.\n * @param {object} opts\n * @returns {Handle|null}\n */\n handle(opts) {\n const o = opts || {};\n if (!validConstraint(o.constraint)) {\n console.error('[host] handle: `constraint` must be SPHERE, PLANE, AXIS, DIAL, VIEW, or a contract-conforming constraint object; got ' + String(o.constraint) + '.');\n return null;\n }\n return host.register(new Handle(host, o));\n },\n\n /**\n * A shared pick over overlapping handles — see host/router.\n * @param {Handle[]} handles\n * @param {{ hover?:boolean }} [opts]\n * @returns {PointerRouter}\n */\n router(handles, opts) { return host.register(new PointerRouter(host, handles, opts)); },\n\n /** Fly a camera state body-relative from a 6-DOF rate stream — see host/helm. */\n cameraHelm(cam, opts) { return cameraHelm(host, cam, opts); },\n /** Integrate a 6-DOF rate stream into a pose in a declared frame — see host/helm. */\n poseHelm(opts) { return poseHelm(host, opts); },\n /** A core PoseTrack ticked while it plays — see host/track. */\n poseTrack(opts) { return poseTrack(host, opts); },\n /** A core CameraTrack evaluating into a camera state while it plays — see host/track. */\n cameraTrack(cam, opts) { return cameraTrack(host, cam, opts); },\n\n /** Register a construct with dispose() so host.dispose() releases it. */\n register(c) { if (c) constructs.add(c); return c; },\n /** Unregister a construct. */\n unregister(c) { constructs.delete(c); },\n\n /** Stop the loop, disconnect the observer, remove every listener, dispose every construct. */\n dispose() {\n if (loop) loop.stop();\n for (const c of [...constructs]) { if (typeof c.dispose === 'function') c.dispose(); }\n constructs.clear();\n observer.dispose();\n host.pointer.dispose();\n host.players.clear();\n },\n };\n\n host.view = createView({ ndcZMin: o.ndcZMin });\n host.players = createPlayers();\n host.pointer = createPointer(canvas, host.view);\n observer = observeCanvas(canvas, (w, h, dpr) => {\n host.width = w; host.height = h; host.dpr = dpr;\n host.view.resize(w, h);\n if (typeof o.onSize === 'function') o.onSize(w, h, dpr);\n });\n\n if (typeof o.onFrame === 'function') {\n loop = createLoop({\n raf: o.raf, caf: o.caf,\n onFrame: (dt) => {\n host.dt = dt;\n host.players.tick(dt);\n o.onFrame(dt, host);\n host.pointer.flush();\n },\n });\n loop.start();\n }\n return host;\n}\n"],"names":["_now","_vx"],"mappings":"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AAC,CAAC,CAAC;AACrC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,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C,OAAO,CAAC,CAAC,GAAG;AACjE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;AACtD;;AA6GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE;AACtB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK;AAChD,E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"}
1
+ {"version":3,"file":"index.js","sources":["../../tree/dist/index.js","../src/view.js","../src/canvas.js","../src/pointer.js","../src/loop.js","../src/handle.js","../src/router.js","../src/helm.js","../src/track.js","../src/stream.js","../src/media.js","../src/labels.js","../src/orbit.js","../src/index.js"],"sourcesContent":["/**\n * @file Core constants — zero dependencies.\n * @module tree/constants\n * @license AGPL-3.0-only\n */\n\n// Coordinate spaces\nconst WORLD = 'WORLD';\nconst EYE = 'EYE';\nconst NDC = 'NDC';\nconst SCREEN = 'SCREEN';\nconst MODEL = 'MODEL';\nconst MATRIX = 'MATRIX';\n\n// Integrator frame source (helm `from` only): the construct's own current pose\n// — body-relative; not a general mapDirection space.\nconst SELF = 'SELF';\n\n// NDC Z convention (only difference between backends)\nconst WEBGL = -1; // z ∈ [−1, 1]\nconst WEBGPU = 0; // z ∈ [0, 1]\n\n// Visibility results\nconst INVISIBLE = 0;\nconst VISIBLE = 1;\nconst SEMIVISIBLE = 2;\n\n// Basis vectors (frozen plain arrays — duck-typed Vec3)\nconst ORIGIN = Object.freeze([0, 0, 0]);\nconst i = Object.freeze([1, 0, 0]);\nconst j = Object.freeze([0, 1, 0]);\nconst k = Object.freeze([0, 0, 1]);\nconst _i = Object.freeze([-1, 0, 0]);\nconst _j = Object.freeze([0, -1, 0]);\nconst _k = Object.freeze([0, 0, -1]);\n\n// Handle constraint kinds\nconst SPHERE = 0;\nconst PLANE = 1;\nconst AXIS = 2;\nconst DIAL = 3;\n\n// Handle report modes\nconst POINT = 0;\nconst DIRECTION = 1;\n\n// Pointer-hit shapes (pointerHit); bullsEyeLines' shape\nconst CIRCLE = 0;\nconst SQUARE = 1;\n\n// Gizmo bits — one namespace per generator. The same value means different\n// things to different generators, and no generator reads another's bits.\nconst NONE = 0;\n\n// axesLines\nconst X = 1 << 0;\nconst _X = 1 << 1;\nconst Y = 1 << 2;\nconst _Y = 1 << 3;\nconst Z = 1 << 4;\nconst _Z = 1 << 5;\nconst LABELS = 1 << 6;\n\n// frustumLines (LEFT … TOP also key a bounds object's planes)\nconst NEAR = 1 << 0;\nconst FAR = 1 << 1;\nconst LEFT = 1 << 2;\nconst RIGHT = 1 << 3;\nconst BOTTOM = 1 << 4;\nconst TOP = 1 << 5;\nconst BODY = 1 << 6;\nconst APEX = 1 << 7;\n\n// pathLines\nconst PATH = 1 << 0;\nconst CENTER = 1 << 1;\nconst CONTROLS = 1 << 2;\nconst TANGENTS_IN = 1 << 3;\nconst TANGENTS_OUT = 1 << 4;\nconst TANGENTS = TANGENTS_IN | TANGENTS_OUT;\nconst HANDLES = 1 << 5;\n\n// helmRigLines\nconst TRANSLATE = 1 << 0;\nconst ROTATE = 1 << 1;\n\n// locusLines (HANDLE is the bridge's dot, not a line)\nconst HANDLE = 1 << 0;\nconst AIM = 1 << 1;\nconst LOCUS = 1 << 2;\nconst RING = 1 << 3;\n\n// Semantic palette — normalised RGBA: red, lime, dodger blue; COLOR_DIM is\n// the alpha of a dimmed stroke (the helm rig's baseline).\nconst COLOR_X = Object.freeze([1, 0, 0, 1]);\nconst COLOR_Y = Object.freeze([0, 1, 0, 1]);\nconst COLOR_Z = Object.freeze([30 / 255, 144 / 255, 1, 1]);\nconst COLOR_DIM = 110 / 255;\n\n/**\n * @file Quaternion algebra and mat4/mat3 conversions.\n * @module tree/quat\n * @license AGPL-3.0-only\n *\n * Quaternions are stored as flat [x, y, z, w] arrays (w-last, glTF layout).\n *\n * All functions follow the out-first, zero-allocation contract.\n * Conversion functions bridge between quaternion and matrix representations\n * but do not perform any higher-level graphics operations — those belong\n * in form.js (matrix construction from specs) or track.js (animation).\n */\n\n\n// =========================================================================\n// Basic ops\n// =========================================================================\n\n/** Set all four components. @returns {number[]} out */\nconst qSet = (out, x, y, z, w) => {\n out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out;\n};\n\n/** Copy quaternion a into out. @returns {number[]} out */\nconst qCopy = (out, a) => {\n out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out;\n};\n\n/** Dot product of two quaternions. */\nconst qDot = (a, b) => a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];\n\n/** Normalise quaternion in-place. @returns {number[]} out */\nconst qNormalize = (out) => {\n const l = Math.sqrt(out[0]*out[0]+out[1]*out[1]+out[2]*out[2]+out[3]*out[3]) || 1;\n out[0]/=l; out[1]/=l; out[2]/=l; out[3]/=l; return out;\n};\n\n/** Negate quaternion (same rotation, different hemisphere). @returns {number[]} out */\nconst qNegate = (out, a) => {\n out[0]=-a[0]; out[1]=-a[1]; out[2]=-a[2]; out[3]=-a[3]; return out;\n};\n\n/** Hamilton product out = a * b. Alias-safe: out may be a or b. @returns {number[]} out */\nconst qMul = (out, a, b) => {\n const ax=a[0],ay=a[1],az=a[2],aw=a[3], bx=b[0],by=b[1],bz=b[2],bw=b[3];\n out[0]=aw*bx+ax*bw+ay*bz-az*by;\n out[1]=aw*by-ax*bz+ay*bw+az*bx;\n out[2]=aw*bz+ax*by-ay*bx+az*bw;\n out[3]=aw*bw-ax*bx-ay*by-az*bz;\n return out;\n};\n\n/**\n * Conjugate out = [−x, −y, −z, w] — the inverse of a UNIT quaternion.\n * (Not qNegate: −q is the SAME rotation on the other hypersphere hemisphere;\n * the conjugate is the opposite rotation.)\n * @returns {number[]} out\n */\nconst qConjugate = (out, a) => {\n out[0]=-a[0]; out[1]=-a[1]; out[2]=-a[2]; out[3]=a[3]; return out;\n};\n\n/**\n * Rotate a vec3 by a unit quaternion: out = q · v · q⁻¹, expanded to the\n * allocation-free t = 2(qv × v); out = v + w·t + qv × t form.\n * Alias-safe: out may be v.\n * @param {number[]} out 3-element destination.\n * @param {number[]} q Unit quaternion [x,y,z,w].\n * @param {number[]} v Vector [x,y,z].\n * @returns {number[]} out\n */\nconst qRotateVec3 = (out, q, v) => {\n const qx=q[0],qy=q[1],qz=q[2],qw=q[3], vx=v[0],vy=v[1],vz=v[2];\n const tx=2*(qy*vz-qz*vy), ty=2*(qz*vx-qx*vz), tz=2*(qx*vy-qy*vx);\n out[0]=vx+qw*tx+qy*tz-qz*ty;\n out[1]=vy+qw*ty+qz*tx-qx*tz;\n out[2]=vz+qw*tz+qx*ty-qy*tx;\n return out;\n};\n\n// =========================================================================\n// Interpolation\n// =========================================================================\n\n/** Spherical linear interpolation. @returns {number[]} out */\nconst qSlerp = (out, a, b, t) => {\n let bx=b[0],by=b[1],bz=b[2],bw=b[3];\n let d = a[0]*bx+a[1]*by+a[2]*bz+a[3]*bw;\n if (d < 0) { bx=-bx; by=-by; bz=-bz; bw=-bw; d=-d; }\n let f0, f1;\n if (1-d > 1e-10) {\n const th=Math.acos(d), st=Math.sin(th);\n f0=Math.sin((1-t)*th)/st; f1=Math.sin(t*th)/st;\n } else {\n f0=1-t; f1=t;\n }\n out[0]=a[0]*f0+bx*f1; out[1]=a[1]*f0+by*f1;\n out[2]=a[2]*f0+bz*f1; out[3]=a[3]*f0+bw*f1;\n return qNormalize(out);\n};\n\n/**\n * Normalised linear interpolation (nlerp).\n * Cheaper than slerp; slightly non-constant angular velocity.\n * Handles antipodal quats by flipping b when dot < 0.\n * @returns {number[]} out\n */\nconst qNlerp = (out, a, b, t) => {\n let bx=b[0],by=b[1],bz=b[2],bw=b[3];\n if (a[0]*bx+a[1]*by+a[2]*bz+a[3]*bw < 0) { bx=-bx; by=-by; bz=-bz; bw=-bw; }\n out[0]=a[0]+t*(bx-a[0]); out[1]=a[1]+t*(by-a[1]);\n out[2]=a[2]+t*(bz-a[2]); out[3]=a[3]+t*(bw-a[3]);\n return qNormalize(out);\n};\n\n// =========================================================================\n// Construction\n// =========================================================================\n\n/**\n * Shortest-arc rotation taking unit vector a to unit vector b (three.js's\n * setFromUnitVectors; the arcball delta). Antiparallel inputs rotate 180°\n * about an axis ⊥ a, seeded from the world axis least aligned with a.\n * @param {number[]} out\n * @param {number[]} a Unit vector [x,y,z].\n * @param {number[]} b Unit vector [x,y,z].\n * @returns {number[]} out (normalised)\n */\nconst qFromUnitVectors = (out, a, b) => {\n const d = a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n if (d < -0.999999) {\n const ax = Math.abs(a[0]), ay = Math.abs(a[1]), az = Math.abs(a[2]);\n let rx = 0, ry = 0, rz = 0;\n if (ax <= ay && ax <= az) rx = 1; else if (ay <= az) ry = 1; else rz = 1;\n out[0]=ry*a[2]-rz*a[1]; out[1]=rz*a[0]-rx*a[2]; out[2]=rx*a[1]-ry*a[0];\n out[3]=0; // 180°: w = cos(π/2) = 0\n } else {\n out[0]=a[1]*b[2]-a[2]*b[1];\n out[1]=a[2]*b[0]-a[0]*b[2];\n out[2]=a[0]*b[1]-a[1]*b[0];\n out[3]=1+d;\n }\n return qNormalize(out);\n};\n\n/**\n * Build a quaternion from axis-angle.\n * @param {number[]} out\n * @param {number} ax @param {number} ay @param {number} az Axis (need not be unit).\n * @param {number} angle Radians.\n * @returns {number[]} out\n */\nconst qFromAxisAngle = (out, ax, ay, az, angle) => {\n const half = angle * 0.5;\n const s = Math.sin(half);\n const len = Math.sqrt(ax*ax + ay*ay + az*az) || 1;\n out[0] = s * ax / len; out[1] = s * ay / len; out[2] = s * az / len;\n out[3] = Math.cos(half);\n return out;\n};\n\n/**\n * Build a quaternion from a look direction (−Z forward) and optional up (default +Y).\n * `dir` need not be unit. Right = dir × up, up re-orthogonalised as right × dir;\n * when `dir` is parallel to `up` the up hint is re-seeded from the world axis\n * least aligned with `dir` (the same seed qFromUnitVectors uses), so every\n * direction yields a proper rotation.\n * @param {number[]} out\n * @param {number[]} dir Forward direction [x,y,z].\n * @param {number[]} [up] Up vector [x,y,z].\n * @returns {number[]} out\n */\nconst qFromLookDir = (out, dir, up) => {\n let fx=dir[0],fy=dir[1],fz=dir[2];\n const fl=Math.sqrt(fx*fx+fy*fy+fz*fz)||1;\n fx/=fl; fy/=fl; fz/=fl;\n let ux=up?up[0]:0, uy=up?up[1]:1, uz=up?up[2]:0;\n let rx=fy*uz-fz*uy, ry=fz*ux-fx*uz, rz=fx*uy-fy*ux; // right = dir × up\n let rl=Math.sqrt(rx*rx+ry*ry+rz*rz);\n if (rl < 1e-8) { // dir ∥ up: re-seed up\n const ax=Math.abs(fx), ay=Math.abs(fy), az=Math.abs(fz);\n ux=0; uy=0; uz=0;\n if (ax <= ay && ax <= az) ux=1; else if (ay <= az) uy=1; else uz=1;\n rx=fy*uz-fz*uy; ry=fz*ux-fx*uz; rz=fx*uy-fy*ux;\n rl=Math.sqrt(rx*rx+ry*ry+rz*rz)||1;\n }\n rx/=rl; ry/=rl; rz/=rl;\n ux=ry*fz-rz*fy; uy=rz*fx-rx*fz; uz=rx*fy-ry*fx; // up = right × dir\n return qFromRotMat3x3(out, rx,ux,-fx, ry,uy,-fy, rz,uz,-fz); // columns: right, up, back\n};\n\n/**\n * Build a quaternion from a 3×3 rotation matrix (9 row-major scalars).\n * @returns {number[]} out (normalised)\n */\nconst qFromRotMat3x3 = (out, m00,m01,m02, m10,m11,m12, m20,m21,m22) => {\n const tr = m00+m11+m22;\n if (tr > 0) {\n const s=0.5/Math.sqrt(tr+1);\n out[3]=0.25/s; out[0]=(m21-m12)*s; out[1]=(m02-m20)*s; out[2]=(m10-m01)*s;\n } else if (m00>m11 && m00>m22) {\n const s=2*Math.sqrt(1+m00-m11-m22);\n out[3]=(m21-m12)/s; out[0]=0.25*s; out[1]=(m01+m10)/s; out[2]=(m02+m20)/s;\n } else if (m11>m22) {\n const s=2*Math.sqrt(1+m11-m00-m22);\n out[3]=(m02-m20)/s; out[0]=(m01+m10)/s; out[1]=0.25*s; out[2]=(m12+m21)/s;\n } else {\n const s=2*Math.sqrt(1+m22-m00-m11);\n out[3]=(m10-m01)/s; out[0]=(m02+m20)/s; out[1]=(m12+m21)/s; out[2]=0.25*s;\n }\n return qNormalize(out);\n};\n\n/**\n * Extract a unit quaternion from the upper-left 3×3 of a column-major mat4.\n * @param {number[]} out\n * @param {Float32Array|number[]} m Column-major mat4.\n * @returns {number[]} out\n */\nconst qFromMat4 = (out, m) =>\n qFromRotMat3x3(out, m[0],m[4],m[8], m[1],m[5],m[9], m[2],m[6],m[10]);\n\n/**\n * Write a quaternion into the rotation block of a column-major mat4.\n * Translation and perspective rows/cols are set to identity values.\n * @param {Float32Array|number[]} out 16-element array.\n * @param {number[]} q [x,y,z,w].\n * @returns {Float32Array|number[]} out\n */\nconst qToMat4 = (out, q) => {\n const x=q[0],y=q[1],z=q[2],w=q[3];\n const x2=x+x,y2=y+y,z2=z+z;\n const xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;\n out[0]=1-(yy+zz); out[1]=xy+wz; out[2]=xz-wy; out[3]=0;\n out[4]=xy-wz; out[5]=1-(xx+zz); out[6]=yz+wx; out[7]=0;\n out[8]=xz+wy; out[9]=yz-wx; out[10]=1-(xx+yy); out[11]=0;\n out[12]=0; out[13]=0; out[14]=0; out[15]=1;\n return out;\n};\n\n// =========================================================================\n// Decomposition\n// =========================================================================\n\n/**\n * Decompose a unit quaternion into { axis:[x,y,z], angle } (radians).\n * @param {number[]} q [x,y,z,w].\n * @param {Object} [out]\n * @returns {{ axis: number[], angle: number }}\n */\nconst qToAxisAngle = (q, out) => {\n out = out || {};\n const x=q[0],y=q[1],z=q[2],w=q[3];\n const sinHalf = Math.sqrt(x*x+y*y+z*z);\n if (sinHalf < 1e-8) { out.axis=[0,1,0]; out.angle=0; return out; }\n out.angle = 2*Math.atan2(sinHalf, w);\n out.axis = [x/sinHalf, y/sinHalf, z/sinHalf];\n return out;\n};\n\n/**\n * @file 1€ input filter — speed-adaptive first-order low-pass for noisy input.\n * @module tree/filter\n * @license AGPL-3.0-only\n *\n * A jitter conditioner for noisy / absolute input streams (the helm's optional\n * `filter` slot; sketch-side handle conditioning). It is NOT a deadzone\n * replacement: a low-pass passes DC, so a constant rest bias survives it and\n * still integrates to creep — only the deadzone's exact-zero clamp removes that.\n * The 1€ removes zero-mean jitter; the two are orthogonal and coexist, applied\n * filter → deadzone (condition the continuous signal first, then gate to zero).\n *\n * First-order low-pass whose cutoff rises with the signal's speed: slow (rest)\n * → low cutoff → heavy smoothing; fast (motion) → high cutoff → low lag. Tuned\n * by `minCutoff` (Hz, the rest cutoff) and `beta` (how fast the cutoff opens\n * with speed). Reimplemented from the paper's equations — `tree` is zero-dep, so\n * the ~one-page primitive is vendored, not depended on (the same call made for\n * quaternions over gl-matrix).\n *\n * Reference: Casiez, G., Roussel, N., & Vogel, D. (2012). 1€ Filter: A Simple\n * Speed-based Low-pass Filter for Noisy Input in Interactive Systems. CHI '12,\n * 2527–2530. DOI 10.1145/2207676.2208639 · https://gery.casiez.net/1euro/\n */\n\n\n/**\n * Build a stateful 1€ filter as an out-first carrying function.\n *\n * The returned `f` carries the previous filtered value and derivative across\n * calls (one state slot per vector component), and is used in one of two forms:\n *\n * - vec form `f(out, raw, dt)` — `out`/`raw` are equal-length ArrayLikes;\n * writes the filtered vector into `out` and returns it.\n * Zero-allocation after the first call (state sized to `raw`).\n * - scalar form `f(raw, dt)` — `raw` is a number; returns the filtered number.\n *\n * The form is chosen by the first argument's type (number ⇒ scalar). `minCutoff`,\n * `beta`, and `dCutoff` are live-mutable on the returned function (`f.minCutoff`,\n * `f.beta`, `f.dCutoff`) and read every call, so a panel can tune them against\n * live noise. `f.reset()` drops the carried state at a discontinuity (a\n * re-acquired source, a helm `home()`); smear across one and the output lurches.\n *\n * @param {Object} [opts]\n * @param {number} [opts.minCutoff=1] Minimum (rest) cutoff frequency, in Hz.\n * @param {number} [opts.beta=0] Speed coefficient (cutoff = minCutoff +\n * beta·|filtered derivative|); unitless.\n * @param {number} [opts.dCutoff=1] Derivative cutoff frequency, in Hz.\n * @returns {Function} A carrying filter `f(out, raw, dt)` / `f(raw, dt)` with a\n * `reset()` method and live `minCutoff` / `beta` / `dCutoff`.\n */\nfunction oneEuro(opts) {\n opts = opts || {};\n\n // Carried state: previous filtered value + previous filtered derivative.\n // number (scalar form) | number[] (vec form). primed = state is seeded.\n let xPrev = null;\n let dxPrev = null;\n let primed = false;\n\n // Low-pass smoothing factor for a sample period `dt` and a cutoff frequency\n // (the paper's α = 1 / (1 + τ/Te), τ = 1 / (2π·cutoff)).\n const alpha = (dt, cutoff) => {\n const tau = 1 / (2 * Math.PI * cutoff);\n return 1 / (1 + tau / dt);\n };\n const smooth = (a, x, xp) => a * x + (1 - a) * xp;\n\n const scalar = (x, dt) => {\n if (!primed) { xPrev = x; dxPrev = 0; primed = true; return x; }\n const dx = (x - xPrev) / dt;\n const edx = smooth(alpha(dt, f.dCutoff), dx, dxPrev);\n const a = alpha(dt, f.minCutoff + f.beta * Math.abs(edx));\n const xh = smooth(a, x, xPrev);\n xPrev = xh; dxPrev = edx;\n return xh;\n };\n\n const vec = (out, raw, dt) => {\n const n = raw.length;\n if (!primed) {\n if (!Array.isArray(xPrev) || xPrev.length !== n) {\n xPrev = new Array(n); dxPrev = new Array(n);\n }\n for (let i = 0; i < n; i++) { xPrev[i] = raw[i]; dxPrev[i] = 0; out[i] = raw[i]; }\n primed = true;\n return out;\n }\n for (let i = 0; i < n; i++) {\n const dx = (raw[i] - xPrev[i]) / dt;\n const edx = smooth(alpha(dt, f.dCutoff), dx, dxPrev[i]);\n const a = alpha(dt, f.minCutoff + f.beta * Math.abs(edx));\n const xh = smooth(a, raw[i], xPrev[i]);\n xPrev[i] = xh; dxPrev[i] = edx;\n out[i] = xh;\n }\n return out;\n };\n\n const f = (out, raw, dt) =>\n (typeof out === 'number') ? scalar(out, raw) : vec(out, raw, dt);\n\n f.minCutoff = (opts.minCutoff != null) ? opts.minCutoff : 1;\n f.beta = (opts.beta != null) ? opts.beta : 0;\n f.dCutoff = (opts.dCutoff != null) ? opts.dCutoff : 1;\n\n /** Drop the carried state — call at a discontinuity (re-acquire / home). */\n f.reset = () => { primed = false; return f; };\n\n return f;\n}\n\n/**\n * @file Matrix construction from geometric specs and partial decomposition.\n * @module tree/form\n * @license AGPL-3.0-only\n *\n * Constructs mat4s from higher-level specs: TRS transforms, orthonormal\n * bases, lookat parameters, projection parameters, and special-purpose\n * matrices (bias, reflection).\n *\n * Design invariant: form.js has no dependency on query.js. Construction\n * from specs requires only scalar arithmetic and quaternion conversions.\n * Callers compose the resulting matrices using query.js (mat4Mul etc.).\n *\n * ── NDC Z convention ──────────────────────────────────────────────────────\n * Controlled by `ndcZMin` in every projection constructor:\n * WEBGL = −1 near → NDC z = −1, far → NDC z = +1\n * WEBGPU = 0 near → NDC z = 0, far → NDC z = +1\n *\n * ── NDC Y convention ──────────────────────────────────────────────────────\n * Controlled by `ndcYSign` in every projection constructor (default +1):\n * +1 NDC y-up — standard: OpenGL / WebGL / WebGPU browser / Three.js / p5v2\n * −1 NDC y-down — native Vulkan clip space\n *\n * Negating ndcYSign flips row 1 of the projection matrix (elements\n * out[1], out[5], out[9], out[13]), reversing the y-axis in clip space.\n * mat4View, mat4Eye, and all non-projection constructors are convention-\n * agnostic — they produce the same matrix regardless of the NDC y direction.\n *\n * ── Screen Y convention ───────────────────────────────────────────────────\n * Screen-y direction (DOM y-down vs OpenGL y-up) is a separate concern from\n * NDC-y direction and is handled in query.js via the signed viewport height.\n * See the query.js module header for details.\n *\n * All functions follow the out-first, zero-allocation contract.\n */\n\n\n// =========================================================================\n// Frame construction\n// =========================================================================\n\n/**\n * Rigid frame from orthonormal basis + translation.\n * Column-major layout: col0=right, col1=up, col2=forward, col3=translation.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} rx,ry,rz Right vector (col 0).\n * @param {number} ux,uy,uz Up vector (col 1).\n * @param {number} fx,fy,fz Forward vec (col 2).\n * @param {number} tx,ty,tz Translation (col 3).\n */\nfunction mat4FromBasis(out, rx,ry,rz, ux,uy,uz, fx,fy,fz, tx,ty,tz) {\n out[0]=rx; out[1]=ry; out[2]=rz; out[3]=0;\n out[4]=ux; out[5]=uy; out[6]=uz; out[7]=0;\n out[8]=fx; out[9]=fy; out[10]=fz; out[11]=0;\n out[12]=tx; out[13]=ty; out[14]=tz; out[15]=1;\n return out;\n}\n\n// Lookat basis scratch — right (0–2), up (3–5), back (6–8): unit, world space.\nconst _lb = new Float64Array(9);\n\n/**\n * Orthonormal lookat basis into `_lb`: back = eye − center, right = up × back,\n * up = back × right. When the view direction is parallel to the up hint the\n * hint is re-seeded from the world axis least aligned with it — the seed\n * qFromUnitVectors and qFromLookDir use — so the basis is always a rotation.\n */\nfunction _lookBasis(ex,ey,ez, cx,cy,cz, ux,uy,uz) {\n let zx=ex-cx, zy=ey-cy, zz=ez-cz;\n const zl=Math.sqrt(zx*zx+zy*zy+zz*zz)||1;\n zx/=zl; zy/=zl; zz/=zl;\n let xx=uy*zz-uz*zy, xy=uz*zx-ux*zz, xz=ux*zy-uy*zx;\n let xl=Math.sqrt(xx*xx+xy*xy+xz*xz);\n if (xl < 1e-8) { // view ∥ up: re-seed up\n const ax=Math.abs(zx), ay=Math.abs(zy), az=Math.abs(zz);\n ux=0; uy=0; uz=0;\n if (ax <= ay && ax <= az) ux=1; else if (ay <= az) uy=1; else uz=1;\n xx=uy*zz-uz*zy; xy=uz*zx-ux*zz; xz=ux*zy-uy*zx;\n xl=Math.sqrt(xx*xx+xy*xy+xz*xz)||1;\n }\n xx/=xl; xy/=xl; xz/=xl;\n _lb[0]=xx; _lb[1]=xy; _lb[2]=xz;\n _lb[3]=zy*xz-zz*xy; _lb[4]=zz*xx-zx*xz; _lb[5]=zx*xy-zy*xx;\n _lb[6]=zx; _lb[7]=zy; _lb[8]=zz;\n}\n\n/**\n * View matrix (world→eye) from lookat parameters.\n * Camera looks along −Z in eye space; right = normalize(up × (−Z)).\n * Cheaper than building the eye matrix and inverting.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} ex,ey,ez Eye (camera) position.\n * @param {number} cx,cy,cz Look-at target.\n * @param {number} ux,uy,uz World up hint (need not be unit; re-seeded when\n * parallel to the view direction).\n */\nfunction mat4View(out, ex,ey,ez, cx,cy,cz, ux,uy,uz) {\n _lookBasis(ex,ey,ez, cx,cy,cz, ux,uy,uz);\n const xx=_lb[0],xy=_lb[1],xz=_lb[2], yx=_lb[3],yy=_lb[4],yz=_lb[5], zx=_lb[6],zy=_lb[7],zz=_lb[8];\n out[0]=xx; out[1]=yx; out[2]=zx; out[3]=0;\n out[4]=xy; out[5]=yy; out[6]=zy; out[7]=0;\n out[8]=xz; out[9]=yz; out[10]=zz; out[11]=0;\n out[12]=-(xx*ex+xy*ey+xz*ez);\n out[13]=-(yx*ex+yy*ey+yz*ez);\n out[14]=-(zx*ex+zy*ey+zz*ez);\n out[15]=1;\n return out;\n}\n\n/**\n * Eye matrix (eye→world) from lookat parameters.\n * Transpose of the rotation block + direct translation column.\n * Same parameters as mat4View.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} ex,ey,ez Eye position.\n * @param {number} cx,cy,cz Look-at target.\n * @param {number} ux,uy,uz World up hint (need not be unit; re-seeded when\n * parallel to the view direction).\n */\nfunction mat4Eye(out, ex,ey,ez, cx,cy,cz, ux,uy,uz) {\n _lookBasis(ex,ey,ez, cx,cy,cz, ux,uy,uz);\n const xx=_lb[0],xy=_lb[1],xz=_lb[2], yx=_lb[3],yy=_lb[4],yz=_lb[5], zx=_lb[6],zy=_lb[7],zz=_lb[8];\n out[0]=xx; out[1]=xy; out[2]=xz; out[3]=0;\n out[4]=yx; out[5]=yy; out[6]=yz; out[7]=0;\n out[8]=zx; out[9]=zy; out[10]=zz; out[11]=0;\n out[12]=ex; out[13]=ey; out[14]=ez; out[15]=1;\n return out;\n}\n\n// =========================================================================\n// TRS construction\n// =========================================================================\n\n/**\n * Column-major mat4 from flat TRS scalars. No struct allocation.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} tx,ty,tz Translation.\n * @param {number} qx,qy,qz,qw Rotation quaternion [x,y,z,w].\n * @param {number} sx,sy,sz Scale.\n */\nfunction mat4FromTRS(out, tx,ty,tz, qx,qy,qz,qw, sx,sy,sz) {\n const x2=qx+qx,y2=qy+qy,z2=qz+qz;\n const xx=qx*x2,xy=qx*y2,xz=qx*z2,yy=qy*y2,yz=qy*z2,zz=qz*z2;\n const wx=qw*x2,wy=qw*y2,wz=qw*z2;\n out[0]=(1-(yy+zz))*sx; out[1]=(xy+wz)*sx; out[2]=(xz-wy)*sx; out[3]=0;\n out[4]=(xy-wz)*sy; out[5]=(1-(xx+zz))*sy; out[6]=(yz+wx)*sy; out[7]=0;\n out[8]=(xz+wy)*sz; out[9]=(yz-wx)*sz; out[10]=(1-(xx+yy))*sz; out[11]=0;\n out[12]=tx; out[13]=ty; out[14]=tz; out[15]=1;\n return out;\n}\n\n/**\n * Translation-only mat4.\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} tx,ty,tz\n */\nfunction mat4FromTranslation(out, tx,ty,tz) {\n out[0]=1; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=1; out[6]=0; out[7]=0;\n out[8]=0; out[9]=0; out[10]=1; out[11]=0;\n out[12]=tx; out[13]=ty; out[14]=tz; out[15]=1;\n return out;\n}\n\n/**\n * Scale-only mat4.\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} sx,sy,sz\n */\nfunction mat4FromScale(out, sx,sy,sz) {\n out[0]=sx; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=sy; out[6]=0; out[7]=0;\n out[8]=0; out[9]=0; out[10]=sz; out[11]=0;\n out[12]=0; out[13]=0; out[14]=0; out[15]=1;\n return out;\n}\n\n// =========================================================================\n// Projection construction\n// =========================================================================\n\n/**\n * Orthographic projection matrix.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} left,right,bottom,top Frustum extents.\n * @param {number} near,far Clip plane distances (positive).\n * @param {number} ndcZMin −1 (WEBGL) or 0 (WEBGPU).\n * @param {number} [ndcYSign=1] +1 = NDC y-up (default); −1 = NDC y-down (native Vulkan).\n */\nfunction mat4Ortho(out, left, right, bottom, top, near, far, ndcZMin, ndcYSign=1) {\n const rl=1/(right-left), tb=1/(top-bottom), fn=1/(far-near);\n out[0]=2*rl; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=ndcYSign*2*tb; out[6]=0; out[7]=0;\n out[8]=0; out[9]=0; out[10]=(ndcZMin-1)*fn; out[11]=0;\n out[12]=-(right+left)*rl; out[13]=ndcYSign*(-(top+bottom)*tb);\n out[14]=(ndcZMin*far-near)*fn;\n out[15]=1;\n return out;\n}\n\n/**\n * Perspective projection matrix (general / off-centre frustum).\n * Symmetric case: left=-right, bottom=-top — derive from fov+aspect in user space:\n * top = near * Math.tan(fov / 2); right = top * aspect\n * mat4Persp(out, -right, right, -top, top, near, far, ndcZMin)\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} left,right,bottom,top Near-plane extents (signed, y-up: top>0, bottom<0).\n * @param {number} near,far Clip plane distances (positive).\n * @param {number} ndcZMin −1 (WEBGL) or 0 (WEBGPU).\n * @param {number} [ndcYSign=1] +1 = NDC y-up (default); −1 = NDC y-down (native Vulkan).\n */\nfunction mat4Persp(out, left, right, bottom, top, near, far, ndcZMin, ndcYSign=1) {\n const rl=1/(right-left), tb=1/(top-bottom);\n out[0]=2*near*rl; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=ndcYSign*2*near*tb; out[6]=0; out[7]=0;\n out[8]=(right+left)*rl; out[9]=ndcYSign*(top+bottom)*tb;\n out[10]=(ndcZMin*near-far)/(far-near);\n out[11]=-1;\n out[12]=0; out[13]=0;\n out[14]=(ndcZMin-1)*far*near/(far-near);\n out[15]=0;\n return out;\n}\n\n// =========================================================================\n// Special-purpose construction\n// =========================================================================\n\n/**\n * Bias matrix: remaps xyz from NDC to texture/UV space [0, 1].\n * xy remap from [−1, 1]; z remaps from [ndcZMin, 1].\n * Used to convert light-space NDC coordinates to shadow map UV.\n *\n * Convention note: the standard bias maps NDC y = −1 → texture v = 0 and\n * NDC y = +1 → texture v = 1. This is correct for both NDC y-up and y-down\n * conventions because the shadow map was rendered with the same projection.\n *\n * Column-major (WEBGL, ndcZMin=−1): Column-major (WEBGPU, ndcZMin=0):\n * [ 0.5 0 0 0.5 ] [ 0.5 0 0 0.5 ]\n * [ 0 0.5 0 0.5 ] [ 0 0.5 0 0.5 ]\n * [ 0 0 0.5 0.5 ] [ 0 0 1 0 ]\n * [ 0 0 0 1 ] [ 0 0 0 1 ]\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n */\nfunction mat4Bias(out, ndcZMin) {\n const sz=1/(1-ndcZMin), tz=-ndcZMin/(1-ndcZMin);\n out[0]=0.5; out[1]=0; out[2]=0; out[3]=0;\n out[4]=0; out[5]=0.5; out[6]=0; out[7]=0;\n out[8]=0; out[9]=0; out[10]=sz; out[11]=0;\n out[12]=0.5; out[13]=0.5; out[14]=tz; out[15]=1;\n return out;\n}\n\n/**\n * Reflection matrix across a plane ax + by + cz = d.\n * [nx, ny, nz] must be a unit normal.\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {number} nx,ny,nz Unit plane normal.\n * @param {number} d Plane offset (dot(point_on_plane, normal)).\n */\nfunction mat4Reflect(out, nx,ny,nz,d) {\n out[0]=1-2*nx*nx; out[1]=-2*ny*nx; out[2]=-2*nz*nx; out[3]=0;\n out[4]=-2*nx*ny; out[5]=1-2*ny*ny; out[6]=-2*nz*ny; out[7]=0;\n out[8]=-2*nx*nz; out[9]=-2*ny*nz; out[10]=1-2*nz*nz; out[11]=0;\n out[12]=2*d*nx; out[13]=2*d*ny; out[14]=2*d*nz; out[15]=1;\n return out;\n}\n\n/**\n * @file Matrix arithmetic, space-transform dispatch, and projection queries.\n * @module tree/query\n * @license AGPL-3.0-only\n *\n * The operative layer — receives matrices and extracts information.\n * Contrast with form.js which constructs matrices from specs.\n *\n * form.js — specs → matrix\n * query.js — matrix → information\n *\n * Storage: column-major Float32Array / ArrayLike<number>.\n * Multiply: mat4Mul(out, A, B) = A · B (standard math order).\n * Pipeline: clip = P · V · M · v\n *\n * ── NDC Z convention ──────────────────────────────────────────────────────\n * Passed as `ndcZMin` to every space-transform function:\n * WEBGL = −1 z ∈ [−1, 1]\n * WEBGPU = 0 z ∈ [ 0, 1]\n *\n * ── NDC Y convention ──────────────────────────────────────────────────────\n * Standard (OpenGL / WebGL / WebGPU browser / Three.js / p5v2):\n * NDC y-up — y = +1 at top, y = −1 at bottom.\n * Native Vulkan: NDC y-down — projections constructed with ndcYSign = −1\n * (see form.js). Query functions are convention-agnostic: they work on\n * whatever matrices are passed in.\n *\n * ── Viewport convention ───────────────────────────────────────────────────\n * vp = [x, y, w, h] — w and h are SIGNED.\n *\n * The sign of h encodes the relationship between NDC y and screen y:\n * h < 0 (e.g. −canvasH): screen y-DOWN (DOM / p5 mouseX·mouseY / Vulkan surface)\n * NDC y=+1 → screen y=0 (top)\n * NDC y=−1 → screen y=H (bottom)\n * h > 0 (e.g. +canvasH): screen y-UP (OpenGL desktop / WebGL gl_FragCoord)\n * NDC y=−1 → screen y=0 (bottom)\n * NDC y=+1 → screen y=H (top)\n *\n * Pass [0, canvasH, canvasW, −canvasH] for p5/DOM coordinates.\n * Pass [0, 0, canvasW, canvasH] for WebGL gl_FragCoord / OpenGL bottom-left.\n * All helpers use vp[2]/vp[3] signed — no Math.abs — so both conventions\n * work automatically without any branching.\n *\n * All functions follow the out-first, zero-allocation contract.\n * Returns null on degeneracy (singular matrix, etc.).\n */\n\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Mat4 arithmetic\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** out = A · B (column-major) */\nfunction mat4Mul(out, A, B) {\n const a0=A[0],a1=A[1],a2=A[2],a3=A[3],\n a4=A[4],a5=A[5],a6=A[6],a7=A[7],\n a8=A[8],a9=A[9],a10=A[10],a11=A[11],\n a12=A[12],a13=A[13],a14=A[14],a15=A[15];\n let b0=B[0],b1=B[1],b2=B[2],b3=B[3];\n out[0]=a0*b0+a4*b1+a8*b2+a12*b3;\n out[1]=a1*b0+a5*b1+a9*b2+a13*b3;\n out[2]=a2*b0+a6*b1+a10*b2+a14*b3;\n out[3]=a3*b0+a7*b1+a11*b2+a15*b3;\n b0=B[4];b1=B[5];b2=B[6];b3=B[7];\n out[4]=a0*b0+a4*b1+a8*b2+a12*b3;\n out[5]=a1*b0+a5*b1+a9*b2+a13*b3;\n out[6]=a2*b0+a6*b1+a10*b2+a14*b3;\n out[7]=a3*b0+a7*b1+a11*b2+a15*b3;\n b0=B[8];b1=B[9];b2=B[10];b3=B[11];\n out[8]=a0*b0+a4*b1+a8*b2+a12*b3;\n out[9]=a1*b0+a5*b1+a9*b2+a13*b3;\n out[10]=a2*b0+a6*b1+a10*b2+a14*b3;\n out[11]=a3*b0+a7*b1+a11*b2+a15*b3;\n b0=B[12];b1=B[13];b2=B[14];b3=B[15];\n out[12]=a0*b0+a4*b1+a8*b2+a12*b3;\n out[13]=a1*b0+a5*b1+a9*b2+a13*b3;\n out[14]=a2*b0+a6*b1+a10*b2+a14*b3;\n out[15]=a3*b0+a7*b1+a11*b2+a15*b3;\n return out;\n}\n\n/** out = inverse(src). Returns null if singular (|det| < 1e-12). */\nfunction mat4Invert(out, src) {\n const s0=src[0],s1=src[1],s2=src[2],s3=src[3],\n s4=src[4],s5=src[5],s6=src[6],s7=src[7],\n s8=src[8],s9=src[9],s10=src[10],s11=src[11],\n s12=src[12],s13=src[13],s14=src[14],s15=src[15];\n const b0=s0*s5-s1*s4, b1=s0*s6-s2*s4, b2=s0*s7-s3*s4,\n b3=s1*s6-s2*s5, b4=s1*s7-s3*s5, b5=s2*s7-s3*s6,\n b6=s8*s13-s9*s12, b7=s8*s14-s10*s12, b8=s8*s15-s11*s12,\n b9=s9*s14-s10*s13, b10=s9*s15-s11*s13, b11=s10*s15-s11*s14;\n let det=b0*b11-b1*b10+b2*b9+b3*b8-b4*b7+b5*b6;\n if (Math.abs(det) < 1e-12) return null;\n det = 1/det;\n out[0]=(s5*b11-s6*b10+s7*b9)*det;\n out[1]=(s2*b10-s1*b11-s3*b9)*det;\n out[2]=(s13*b5-s14*b4+s15*b3)*det;\n out[3]=(s10*b4-s9*b5-s11*b3)*det;\n out[4]=(s6*b8-s4*b11-s7*b7)*det;\n out[5]=(s0*b11-s2*b8+s3*b7)*det;\n out[6]=(s14*b2-s12*b5-s15*b1)*det;\n out[7]=(s8*b5-s10*b2+s11*b1)*det;\n out[8]=(s4*b10-s5*b8+s7*b6)*det;\n out[9]=(s1*b8-s0*b10-s3*b6)*det;\n out[10]=(s12*b4-s13*b2+s15*b0)*det;\n out[11]=(s9*b2-s8*b4-s11*b0)*det;\n out[12]=(s5*b7-s4*b9-s6*b6)*det;\n out[13]=(s0*b9-s1*b7+s2*b6)*det;\n out[14]=(s13*b1-s12*b3-s14*b0)*det;\n out[15]=(s8*b3-s9*b1+s10*b0)*det;\n return out;\n}\n\n/**\n * Normal matrix: inverseTranspose(upper-left 3×3 of src).\n * On degeneracy writes zeros and returns out.\n * @param {Float32Array|number[]} out 9-element destination.\n * @param {Float32Array|number[]} src 16-element mat4.\n */\nfunction mat3NormalFromMat4(out, src) {\n const a00=src[0],a01=src[1],a02=src[2],\n a10=src[4],a11=src[5],a12=src[6],\n a20=src[8],a21=src[9],a22=src[10];\n const b01=a22*a11-a12*a21, b11=-a22*a01+a02*a21, b21=a12*a01-a02*a11;\n let det=a00*b01+a10*b11+a20*b21;\n if (Math.abs(det) < 1e-12) { for(let i=0;i<9;i++)out[i]=0; return out; }\n det=1/det;\n out[0]=b01*det; out[1]=(-a22*a10+a12*a20)*det; out[2]=(a21*a10-a11*a20)*det;\n out[3]=b11*det; out[4]=(a22*a00-a02*a20)*det; out[5]=(-a21*a00+a01*a20)*det;\n out[6]=b21*det; out[7]=(-a12*a00+a02*a10)*det; out[8]=(a11*a00-a01*a10)*det;\n return out;\n}\n\n/** out = mat4 * [x,y,z,1], perspective-divides, writes xyz. */\nfunction mat4MulPoint(out, m, x, y, z) {\n const rx=m[0]*x+m[4]*y+m[8]*z+m[12], ry=m[1]*x+m[5]*y+m[9]*z+m[13],\n rz=m[2]*x+m[6]*y+m[10]*z+m[14], rw=m[3]*x+m[7]*y+m[11]*z+m[15];\n if (rw!==0&&rw!==1) { out[0]=rx/rw; out[1]=ry/rw; out[2]=rz/rw; }\n else { out[0]=rx; out[1]=ry; out[2]=rz; }\n return out;\n}\n\n/**\n * Apply only the 3×3 linear block of a mat4 to a direction (no translation,\n * no perspective divide). Use mat3NormalFromMat4 for normals under non-uniform scale.\n */\nfunction mat4MulDir(out, m, dx, dy, dz) {\n out[0]=m[0]*dx+m[4]*dy+m[8]*dz;\n out[1]=m[1]*dx+m[5]*dy+m[9]*dz;\n out[2]=m[2]*dx+m[6]*dy+m[10]*dz;\n return out;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Projection queries\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** @returns {boolean} true if orthographic. */\nfunction projIsOrtho(p) { return p[15] !== 0; }\n\n/**\n * Near plane distance.\n * @param {ArrayLike<number>} p Projection mat4.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n */\nfunction projNear(p, ndcZMin) {\n return p[15]===0 ? p[14]/(p[10]+ndcZMin) : (p[14]-ndcZMin)/p[10];\n}\n\n/** Far plane distance (far always maps to NDC z = 1, convention-independent). */\nfunction projFar(p) {\n return p[15]===0 ? p[14]/(1+p[10]) : (p[14]-1)/p[10];\n}\n\nfunction projLeft (p, ndcZMin) { return p[15]===1 ? -(1+p[12])/p[0] : projNear(p,ndcZMin)*(p[8]-1)/p[0]; }\nfunction projRight (p, ndcZMin) { return p[15]===1 ? (1-p[12])/p[0] : projNear(p,ndcZMin)*(1+p[8])/p[0]; }\n\n/**\n * Top extent of the near plane in camera space (y_max, positive for standard y-up camera).\n * Sign-normalized: returns the larger of the two y boundaries regardless of whether\n * the projection was built with ndcYSign = +1 or −1.\n */\nfunction projTop(p, ndcZMin) {\n return p[15]===1\n ? ( Math.sign(p[5]) - p[13]) / p[5] // ortho\n : projNear(p,ndcZMin)*(Math.sign(p[5])+p[9])/p[5]; // perspective\n}\n\n/**\n * Bottom extent of the near plane in camera space (y_min, negative for standard y-up camera).\n */\nfunction projBottom(p, ndcZMin) {\n return p[15]===1\n ? (-Math.sign(p[5]) - p[13]) / p[5] // ortho\n : projNear(p,ndcZMin)*(p[9]-Math.sign(p[5]))/p[5]; // perspective\n}\n\n/** Vertical field of view in radians (perspective only). */\nfunction projFov (p) { return Math.abs(2*Math.atan(1/p[5])); }\n/** Horizontal field of view in radians (perspective only). */\nfunction projHfov(p) { return Math.abs(2*Math.atan(1/p[0])); }\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Derived matrices\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** out = P · V */\nfunction mat4PV(out, proj, view) { return mat4Mul(out, proj, view); }\n/** out = V · M */\nfunction mat4MV(out, model, view) { return mat4Mul(out, view, model); }\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Frame-relative transforms\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Location transform between frames: out = inv(to) · from.\n * Assumes both matrices are affine (bottom row [0,0,0,1]).\n * @returns {ArrayLike<number>|null} out, or null if `to` is singular.\n */\nfunction mat4Location(out, from, to) {\n // Same as: return mat4Invert(out, to) && mat4Mul(out, out, from);\n // a_rc reads column-major: element (row r, column c) is to[c*4 + r].\n const a00=to[0],a01=to[4],a02=to[8],\n a10=to[1],a11=to[5],a12=to[9],\n a20=to[2],a21=to[6],a22=to[10];\n const b01=a22*a11-a12*a21, b11=a12*a20-a22*a10, b21=a21*a10-a11*a20;\n let det=a00*b01+a01*b11+a02*b21;\n if (Math.abs(det) < 1e-12) return null;\n det=1/det;\n const i00=b01*det, i01=(a02*a21-a22*a01)*det, i02=(a12*a01-a02*a11)*det;\n const i10=b11*det, i11=(a22*a00-a02*a20)*det, i12=(a02*a10-a12*a00)*det;\n const i20=b21*det, i21=(a01*a20-a21*a00)*det, i22=(a11*a00-a01*a10)*det;\n const f00=from[0],f01=from[1],f02=from[2],\n f10=from[4],f11=from[5],f12=from[6],\n f20=from[8],f21=from[9],f22=from[10];\n out[0]=i00*f00+i01*f01+i02*f02; out[1]=i10*f00+i11*f01+i12*f02; out[2]=i20*f00+i21*f01+i22*f02; out[3]=0;\n out[4]=i00*f10+i01*f11+i02*f12; out[5]=i10*f10+i11*f11+i12*f12; out[6]=i20*f10+i21*f11+i22*f12; out[7]=0;\n out[8]=i00*f20+i01*f21+i02*f22; out[9]=i10*f20+i11*f21+i12*f22; out[10]=i20*f20+i21*f21+i22*f22; out[11]=0;\n const dx=from[12]-to[12], dy=from[13]-to[13], dz=from[14]-to[14];\n out[12]=i00*dx+i01*dy+i02*dz; out[13]=i10*dx+i11*dy+i12*dz; out[14]=i20*dx+i21*dy+i22*dz; out[15]=1;\n return out;\n}\n\n/**\n * Direction transform between frames: out = inv(to₃) · from₃ — a direction's\n * coordinates in `from` become its coordinates in `to`, the same conversion\n * mat4Location and mapDirection perform, on the upper-left 3×3 blocks only\n * (rotation / scale, no translation).\n * @returns {ArrayLike<number>|null} out, or null if `to` is singular.\n */\nfunction mat3Direction(out, from, to) {\n // a_rc reads column-major: element (row r, column c) is to[c*4 + r].\n const a00=to[0],a01=to[4],a02=to[8],\n a10=to[1],a11=to[5],a12=to[9],\n a20=to[2],a21=to[6],a22=to[10];\n const b01=a22*a11-a12*a21, b11=a12*a20-a22*a10, b21=a21*a10-a11*a20;\n let det=a00*b01+a01*b11+a02*b21;\n if (Math.abs(det) < 1e-12) return null;\n det=1/det;\n const i00=b01*det, i01=(a02*a21-a22*a01)*det, i02=(a12*a01-a02*a11)*det;\n const i10=b11*det, i11=(a22*a00-a02*a20)*det, i12=(a02*a10-a12*a00)*det;\n const i20=b21*det, i21=(a01*a20-a21*a00)*det, i22=(a11*a00-a01*a10)*det;\n // out = inv(to₃) · from₃, column by column of from.\n for (let c = 0; c < 3; c++) {\n const f0=from[c*4], f1=from[c*4+1], f2=from[c*4+2];\n out[c*3] = i00*f0 + i01*f1 + i02*f2;\n out[c*3+1] = i10*f0 + i11*f1 + i12*f2;\n out[c*3+2] = i20*f0 + i21*f1 + i22*f2;\n }\n return out;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Space transforms — mapLocation / mapDirection\n// ═══════════════════════════════════════════════════════════════════════════\n//\n// Flat dispatch: every from→to pair is a self-contained leaf with only stack\n// locals — no reentrancy, no shared state between calls.\n//\n// Matrices bag `m`:\n// mat4Proj Float32Array(16) projection (eye → clip)\n// mat4View Float32Array(16) view (world → eye)\n// mat4Eye? Float32Array(16) eye (eye → world); caller fills before passing\n// mat4PV? Float32Array(16) P · V; caller fills or _ensurePV allocates once\n// mat4PVInv? Float32Array(16) inv(P · V); caller fills\n// fromFrame? Float32Array(16) MATRIX source frame\n// toFrameInv? Float32Array(16) inv(MATRIX dest frame)\n//\n// Viewport `vp` = [x, y, w, h]:\n// Use SIGNED h to encode screen-y direction (see module header).\n// Core formula: screen = (ndc*0.5+0.5)*vp[k] + vp[k-2] (k=2 for x, k=3 for y)\n// Inverse: ndc = ((screen-vp[k-2])/vp[k])*2 - 1\n// Negative vp[3] flips NDC y-up to screen y-down automatically.\n//\n\n// ── Location helpers ─────────────────────────────────────────────────────\n\nfunction _worldToScreen(out, px, py, pz, pv, vp, ndcZMin) {\n const x=pv[0]*px+pv[4]*py+pv[8]*pz+pv[12], y=pv[1]*px+pv[5]*py+pv[9]*pz+pv[13],\n z=pv[2]*px+pv[6]*py+pv[10]*pz+pv[14], w=pv[3]*px+pv[7]*py+pv[11]*pz+pv[15];\n const xi=(w!==0&&w!==1)?1/w:1;\n out[0]=(x*xi*0.5+0.5)*vp[2]+vp[0];\n out[1]=(y*xi*0.5+0.5)*vp[3]+vp[1];\n out[2]=(z*xi-ndcZMin)/(1-ndcZMin);\n return out;\n}\n\nfunction _screenToWorld(out, sx, sy, sz, ipv, vp, ndcZMin) {\n return mat4MulPoint(out, ipv,\n ((sx-vp[0])/vp[2])*2-1,\n ((sy-vp[1])/vp[3])*2-1,\n sz*(1-ndcZMin)+ndcZMin);\n}\n\nfunction _worldToNDC(out, px, py, pz, pv) {\n const x=pv[0]*px+pv[4]*py+pv[8]*pz+pv[12], y=pv[1]*px+pv[5]*py+pv[9]*pz+pv[13],\n z=pv[2]*px+pv[6]*py+pv[10]*pz+pv[14], w=pv[3]*px+pv[7]*py+pv[11]*pz+pv[15];\n const xi=(w!==0&&w!==1)?1/w:1;\n out[0]=x*xi; out[1]=y*xi; out[2]=z*xi;\n return out;\n}\n\nfunction _ndcToWorld(out, nx, ny, nz, ipv) { return mat4MulPoint(out,ipv,nx,ny,nz); }\n\nfunction _screenToNDC(out, sx, sy, sz, vp, ndcZMin) {\n out[0]=((sx-vp[0])/vp[2])*2-1;\n out[1]=((sy-vp[1])/vp[3])*2-1;\n out[2]=sz*(1-ndcZMin)+ndcZMin;\n return out;\n}\n\nfunction _ndcToScreen(out, nx, ny, nz, vp, ndcZMin) {\n out[0]=(nx*0.5+0.5)*vp[2]+vp[0];\n out[1]=(ny*0.5+0.5)*vp[3]+vp[1];\n out[2]=(nz-ndcZMin)/(1-ndcZMin);\n return out;\n}\n\nfunction _ensurePV(m) {\n if (m.mat4PV) return m.mat4PV;\n m.mat4PV = new Float32Array(16);\n mat4Mul(m.mat4PV, m.mat4Proj, m.mat4View);\n return m.mat4PV;\n}\n\n/**\n * Map a point between named coordinate spaces.\n *\n * @param {number[]} out 3-element destination — written and returned.\n * @param {number} px,py,pz Input point.\n * @param {string} from Source space (WORLD, EYE, SCREEN, NDC, MATRIX).\n * @param {string} to Destination space.\n * @param {object} m Matrices bag — see module header.\n * @param {number[]} vp Viewport [x, y, w, h]; sign of h encodes screen-y direction.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @returns {number[]} out\n */\nfunction mapLocation(out, px, py, pz, from, to, m, vp, ndcZMin) {\n if (from===WORLD && to===SCREEN) return _worldToScreen(out,px,py,pz,_ensurePV(m),vp,ndcZMin);\n if (from===SCREEN && to===WORLD) return _screenToWorld(out,px,py,pz,m.mat4PVInv,vp,ndcZMin);\n\n if (from===WORLD && to===NDC) return _worldToNDC(out,px,py,pz,_ensurePV(m));\n if (from===NDC && to===WORLD) return _ndcToWorld(out,px,py,pz,m.mat4PVInv);\n\n if (from===SCREEN && to===NDC) return _screenToNDC(out,px,py,pz,vp,ndcZMin);\n if (from===NDC && to===SCREEN) return _ndcToScreen(out,px,py,pz,vp,ndcZMin);\n\n if (from===WORLD && to===EYE) return mat4MulPoint(out,m.mat4View,px,py,pz);\n if (from===EYE && to===WORLD) return mat4MulPoint(out,m.mat4Eye,px,py,pz);\n\n if (from===EYE && to===SCREEN) {\n const e=m.mat4Eye;\n return _worldToScreen(out,e[0]*px+e[4]*py+e[8]*pz+e[12],\n e[1]*px+e[5]*py+e[9]*pz+e[13],\n e[2]*px+e[6]*py+e[10]*pz+e[14],_ensurePV(m),vp,ndcZMin);\n }\n if (from===SCREEN && to===EYE) {\n _screenToWorld(out,px,py,pz,m.mat4PVInv,vp,ndcZMin);\n return mat4MulPoint(out,m.mat4View,out[0],out[1],out[2]);\n }\n\n if (from===EYE && to===NDC) {\n const e=m.mat4Eye;\n return _worldToNDC(out,e[0]*px+e[4]*py+e[8]*pz+e[12],\n e[1]*px+e[5]*py+e[9]*pz+e[13],\n e[2]*px+e[6]*py+e[10]*pz+e[14],_ensurePV(m));\n }\n if (from===NDC && to===EYE) {\n _ndcToWorld(out,px,py,pz,m.mat4PVInv);\n return mat4MulPoint(out,m.mat4View,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===WORLD) return mat4MulPoint(out,m.fromFrame,px,py,pz);\n if (from===WORLD && to===MATRIX) return mat4MulPoint(out,m.toFrameInv,px,py,pz);\n\n if (from===MATRIX && to===EYE) {\n const f=m.fromFrame;\n return mat4MulPoint(out,m.mat4View,f[0]*px+f[4]*py+f[8]*pz+f[12],\n f[1]*px+f[5]*py+f[9]*pz+f[13],\n f[2]*px+f[6]*py+f[10]*pz+f[14]);\n }\n if (from===EYE && to===MATRIX) {\n const e=m.mat4Eye;\n return mat4MulPoint(out,m.toFrameInv,e[0]*px+e[4]*py+e[8]*pz+e[12],\n e[1]*px+e[5]*py+e[9]*pz+e[13],\n e[2]*px+e[6]*py+e[10]*pz+e[14]);\n }\n\n if (from===MATRIX && to===SCREEN) {\n const f=m.fromFrame;\n return _worldToScreen(out,f[0]*px+f[4]*py+f[8]*pz+f[12],\n f[1]*px+f[5]*py+f[9]*pz+f[13],\n f[2]*px+f[6]*py+f[10]*pz+f[14],_ensurePV(m),vp,ndcZMin);\n }\n if (from===SCREEN && to===MATRIX) {\n _screenToWorld(out,px,py,pz,m.mat4PVInv,vp,ndcZMin);\n return mat4MulPoint(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===NDC) {\n const f=m.fromFrame;\n return _worldToNDC(out,f[0]*px+f[4]*py+f[8]*pz+f[12],\n f[1]*px+f[5]*py+f[9]*pz+f[13],\n f[2]*px+f[6]*py+f[10]*pz+f[14],_ensurePV(m));\n }\n if (from===NDC && to===MATRIX) {\n _ndcToWorld(out,px,py,pz,m.mat4PVInv);\n return mat4MulPoint(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===MATRIX) {\n const f=m.fromFrame;\n return mat4MulPoint(out,m.toFrameInv,f[0]*px+f[4]*py+f[8]*pz+f[12],\n f[1]*px+f[5]*py+f[9]*pz+f[13],\n f[2]*px+f[6]*py+f[10]*pz+f[14]);\n }\n\n out[0]=px; out[1]=py; out[2]=pz;\n return out;\n}\n\n// ── Direction helpers ────────────────────────────────────────────────────\n//\n// Directions use only the linear 3×3 block — no translation, no w-divide.\n// The signed vp[2]/vp[3] carries the y-convention automatically.\n//\n\nfunction _applyDir(out, m, dx, dy, dz) {\n out[0]=m[0]*dx+m[4]*dy+m[8]*dz;\n out[1]=m[1]*dx+m[5]*dy+m[9]*dz;\n out[2]=m[2]*dx+m[6]*dy+m[10]*dz;\n return out;\n}\n\nfunction _worldToScreenDir(out, dx, dy, dz, proj, view, vpW, vpH, ndcZMin) {\n const vx=view[0]*dx+view[4]*dy+view[8]*dz,\n vy=view[1]*dx+view[5]*dy+view[9]*dz,\n vz=view[2]*dx+view[6]*dy+view[10]*dz;\n // vpH is signed — negative flips y component automatically.\n out[0]=(proj[0]*vx+proj[4]*vy+proj[8]*vz)*vpW*0.5;\n out[1]=(proj[1]*vx+proj[5]*vy+proj[9]*vz)*vpH*0.5;\n out[2]=(proj[2]*vx+proj[6]*vy+proj[10]*vz)*(1-ndcZMin)*0.5;\n return out;\n}\n\nfunction _screenToWorldDir(out, dx, dy, dz, proj, eye, vpW, vpH, ndcZMin) {\n // Inverse of _worldToScreenDir: undo the viewport scale, then the projection's\n // upper-triangular 3×3 block (p[8], p[9] carry an off-centre frustum), then\n // rotate eye→world. Signed vpW/vpH cancel the y-flip.\n const cz = dz/((1-ndcZMin)*0.5)/proj[10];\n const cy = (dy/(vpH*0.5) - proj[9]*cz)/proj[5];\n const cx = (dx/(vpW*0.5) - proj[8]*cz)/proj[0];\n return _applyDir(out, eye, cx, cy, cz);\n}\n\nfunction _screenToNDCDir(out, dx, dy, dz, vpW, vpH, ndcZMin) {\n out[0]=dx/(vpW*0.5); out[1]=dy/(vpH*0.5); out[2]=dz/((1-ndcZMin)*0.5);\n return out;\n}\n\nfunction _ndcToScreenDir(out, dx, dy, dz, vpW, vpH, ndcZMin) {\n out[0]=dx*vpW*0.5; out[1]=dy*vpH*0.5; out[2]=dz*(1-ndcZMin)*0.5;\n return out;\n}\n\n/**\n * Map a direction between named coordinate spaces.\n * Same bag and viewport contract as mapLocation.\n *\n * @param {number[]} out 3-element destination.\n * @param {number} dx,dy,dz Input direction.\n * @param {string} from Source space.\n * @param {string} to Destination space.\n * @param {object} m Matrices bag — see module header.\n * @param {number[]} vp Viewport [x, y, w, h]; sign of h encodes screen-y direction.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @returns {number[]} out\n */\nfunction mapDirection(out, dx, dy, dz, from, to, m, vp, ndcZMin) {\n const vpW=vp[2], vpH=vp[3]; // signed — carry y-convention through all helpers\n\n if (from===EYE && to===WORLD) return _applyDir(out,m.mat4Eye, dx,dy,dz);\n if (from===WORLD && to===EYE) return _applyDir(out,m.mat4View,dx,dy,dz);\n\n if (from===WORLD && to===SCREEN) return _worldToScreenDir(out,dx,dy,dz,m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n if (from===SCREEN && to===WORLD) return _screenToWorldDir(out,dx,dy,dz,m.mat4Proj,m.mat4Eye, vpW,vpH,ndcZMin);\n\n if (from===SCREEN && to===NDC) return _screenToNDCDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n if (from===NDC && to===SCREEN) return _ndcToScreenDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n\n if (from===WORLD && to===NDC) {\n _worldToScreenDir(out,dx,dy,dz,m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n return _screenToNDCDir(out,out[0],out[1],out[2],vpW,vpH,ndcZMin);\n }\n if (from===NDC && to===WORLD) {\n _ndcToScreenDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n return _screenToWorldDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n }\n\n if (from===EYE && to===SCREEN) {\n _applyDir(out,m.mat4Eye,dx,dy,dz);\n return _worldToScreenDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n }\n if (from===SCREEN && to===EYE) {\n _screenToWorldDir(out,dx,dy,dz,m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n return _applyDir(out,m.mat4View,out[0],out[1],out[2]);\n }\n\n if (from===EYE && to===NDC) {\n _applyDir(out,m.mat4Eye,dx,dy,dz);\n _worldToScreenDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n return _screenToNDCDir(out,out[0],out[1],out[2],vpW,vpH,ndcZMin);\n }\n if (from===NDC && to===EYE) {\n _ndcToScreenDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n _screenToWorldDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n return _applyDir(out,m.mat4View,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===WORLD) return _applyDir(out,m.fromFrame, dx,dy,dz);\n if (from===WORLD && to===MATRIX) return _applyDir(out,m.toFrameInv,dx,dy,dz);\n\n if (from===MATRIX && to===EYE) {\n _applyDir(out,m.fromFrame,dx,dy,dz);\n return _applyDir(out,m.mat4View,out[0],out[1],out[2]);\n }\n if (from===EYE && to===MATRIX) {\n _applyDir(out,m.mat4Eye,dx,dy,dz);\n return _applyDir(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===SCREEN) {\n _applyDir(out,m.fromFrame,dx,dy,dz);\n return _worldToScreenDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n }\n if (from===SCREEN && to===MATRIX) {\n _screenToWorldDir(out,dx,dy,dz,m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n return _applyDir(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===NDC) {\n _applyDir(out,m.fromFrame,dx,dy,dz);\n _worldToScreenDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4View,vpW,vpH,ndcZMin);\n return _screenToNDCDir(out,out[0],out[1],out[2],vpW,vpH,ndcZMin);\n }\n if (from===NDC && to===MATRIX) {\n _ndcToScreenDir(out,dx,dy,dz,vpW,vpH,ndcZMin);\n _screenToWorldDir(out,out[0],out[1],out[2],m.mat4Proj,m.mat4Eye,vpW,vpH,ndcZMin);\n return _applyDir(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n if (from===MATRIX && to===MATRIX) {\n _applyDir(out,m.fromFrame,dx,dy,dz);\n return _applyDir(out,m.toFrameInv,out[0],out[1],out[2]);\n }\n\n out[0]=dx; out[1]=dy; out[2]=dz;\n return out;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Rays and pointer hits\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Screen point → world ray: origin on the near plane (screen depth 0), unit\n * direction toward the far plane (depth 1). Same bag and viewport contract as\n * mapLocation; `m.mat4PVInv` must be filled by the caller.\n *\n * @param {number[]} outO 3-element origin.\n * @param {number[]} outD 3-element unit direction.\n * @param {number} sx,sy Screen point.\n * @param {object} m Matrices bag — see module header.\n * @param {number[]} vp Viewport [x, y, w, h]; sign of h encodes screen-y direction.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @returns {number[]|null} outD, or null when the bag carries no mat4PVInv\n * (singular P·V) or the ray has no length.\n */\nfunction unproject(outO, outD, sx, sy, m, vp, ndcZMin) {\n const ipv = m.mat4PVInv;\n if (!ipv) return null;\n _screenToWorld(outO, sx, sy, 0, ipv, vp, ndcZMin);\n _screenToWorld(outD, sx, sy, 1, ipv, vp, ndcZMin);\n const dx=outD[0]-outO[0], dy=outD[1]-outO[1], dz=outD[2]-outO[2];\n const l=Math.sqrt(dx*dx+dy*dy+dz*dz);\n if (!(l > 0)) return null;\n outD[0]=dx/l; outD[1]=dy/l; outD[2]=dz/l;\n return outD;\n}\n\nconst _hit = [0, 0, 0]; // pointerHit screen scratch\n\n/**\n * Is the pointer within `radius` px of the projected world point (x, y, z)?\n * `shape` is CIRCLE (Euclidean, default) or SQUARE (Chebyshev); the boundary\n * hits. A point whose screen depth falls outside [0, 1] — behind the camera,\n * before the near plane or beyond the far plane — never hits.\n *\n * @param {number} px,py Pointer, screen px.\n * @param {number} x,y,z World point.\n * @param {number} radius Hit radius, px.\n * @param {object} m Matrices bag — see module header.\n * @param {number[]} vp Viewport [x, y, w, h]; sign of h encodes screen-y direction.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @param {number} [shape=CIRCLE] CIRCLE or SQUARE.\n * @returns {boolean}\n */\nfunction pointerHit(px, py, x, y, z, radius, m, vp, ndcZMin, shape = CIRCLE) {\n _worldToScreen(_hit, x, y, z, _ensurePV(m), vp, ndcZMin);\n const d = _hit[2];\n if (!(d >= 0 && d <= 1)) return false;\n const dx = px - _hit[0], dy = py - _hit[1];\n return shape === SQUARE\n ? Math.abs(dx) <= radius && Math.abs(dy) <= radius\n : dx*dx + dy*dy <= radius*radius;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// pixelRatio\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * World-units-per-pixel at a given eye-space Z depth.\n * @param {ArrayLike<number>} proj Projection mat4.\n * @param {number} vpH Viewport height in pixels (positive).\n * @param {number} eyeZ Eye-space Z — negative means in front of camera.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n */\nfunction pixelRatio(proj, vpH, eyeZ, ndcZMin) {\n return projIsOrtho(proj)\n ? Math.abs(projTop(proj,ndcZMin)-projBottom(proj,ndcZMin)) / vpH\n : 2*Math.abs(eyeZ)*Math.tan(projFov(proj)/2) / vpH;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Pick-matrix\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Mutate a projection matrix in-place so that the pixel at (px, py) maps to\n * the full NDC square — making a 1×1 FBO render contain exactly that pixel.\n *\n * Premultiplies by M_pick (column-major, rows 2 and 3 unchanged):\n *\n * ┌ sx 0 0 tx ┐ sx = |vp[2]|, sy = |vp[3]|\n * │ 0 sy 0 ty │ cx = ((px−vp[0])/vp[2])·2 − 1 (NDC x of pixel centre)\n * │ 0 0 1 0 │ cy = ((py−vp[1])/vp[3])·2 − 1 (NDC y, sign-aware)\n * └ 0 0 0 1 ┘ tx = −cx·sx, ty = −cy·sy\n *\n * Result: P_pick = M_pick · P_original.\n * The viewport sign convention (vp[3] < 0 for screen y-down) is preserved\n * automatically through cx/cy — no separate flip needed.\n *\n * @param {Float32Array} proj Projection mat4 — mutated in place.\n * @param {number} px Query pixel X in screen coordinates.\n * @param {number} py Query pixel Y in screen coordinates.\n * @param {number[]} vp Viewport [x, y, w, h]; same signed convention as mapLocation.\n */\nfunction mat4Pick(proj, px, py, vp) {\n const cx=((px-vp[0])/vp[2])*2-1;\n const cy=((py-vp[1])/vp[3])*2-1;\n const sx=Math.abs(vp[2]), sy=Math.abs(vp[3]);\n const tx=-cx*sx, ty=-cy*sy;\n for (let j=0; j<4; j++) {\n const a=proj[j*4], b=proj[j*4+1], d=proj[j*4+3];\n proj[j*4] = sx*a + tx*d;\n proj[j*4+1] = sy*b + ty*d;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Pick-id codec\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Pick id → colour: the 24-bit id packed into r, g, b as normalised floats,\n * R the low byte, alpha 1. Id 0 is the background; ids run 1 … 2²⁴ − 1.\n * @param {number[]} out 4-element destination.\n * @param {number} id Integer id.\n * @returns {number[]} out\n */\nfunction idToRgba(out, id) {\n out[0] = (id & 255) / 255;\n out[1] = ((id >> 8) & 255) / 255;\n out[2] = ((id >> 16) & 255) / 255;\n out[3] = 1;\n return out;\n}\n\n/**\n * Colour bytes → pick id, the inverse of idToRgba on a readback.\n * @param {number} r,g,b Bytes 0 … 255 (fractions truncated).\n * @returns {number} id\n */\nfunction rgbaToId(r, g, b) {\n return (r & 255) | ((g & 255) << 8) | ((b & 255) << 16);\n}\n\n// =========================================================================\n// Decomposition\n// =========================================================================\n\n/**\n * Extract translation from a column-major mat4 (column 3).\n * @param {Float32Array|number[]} out3 3-element destination.\n * @param {Float32Array|number[]} m 16-element source.\n */\nfunction mat4ToTranslation(out3, m) {\n out3[0]=m[12]; out3[1]=m[13]; out3[2]=m[14];\n return out3;\n}\n\n/**\n * Extract scale from a column-major mat4 (column lengths of the rotation block).\n * Assumes no shear.\n * @param {Float32Array|number[]} out3 3-element destination.\n * @param {Float32Array|number[]} m 16-element source.\n */\nfunction mat4ToScale(out3, m) {\n out3[0]=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);\n out3[1]=Math.sqrt(m[4]*m[4]+m[5]*m[5]+m[6]*m[6]);\n out3[2]=Math.sqrt(m[8]*m[8]+m[9]*m[9]+m[10]*m[10]);\n return out3;\n}\n\n/**\n * Extract rotation as a unit quaternion from a column-major mat4.\n * Scale is factored out from each column. Assumes no shear.\n * @param {number[]} out4 4-element [x,y,z,w] destination.\n * @param {Float32Array|number[]} m 16-element source.\n */\nfunction mat4ToRotation(out4, m) {\n const sx=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2])||1;\n const sy=Math.sqrt(m[4]*m[4]+m[5]*m[5]+m[6]*m[6])||1;\n const sz=Math.sqrt(m[8]*m[8]+m[9]*m[9]+m[10]*m[10])||1;\n return qFromRotMat3x3(out4,\n m[0]/sx, m[4]/sy, m[8]/sz,\n m[1]/sx, m[5]/sy, m[9]/sz,\n m[2]/sx, m[6]/sy, m[10]/sz);\n}\n\n/**\n * @file Spline math and keyframe animation state machines.\n * @module tree/track\n * @license AGPL-3.0-only\n *\n * Quaternion algebra is provided by quat.js; projection matrix construction\n * by form.js. Spline helpers (hermiteVec3, lerpVec3) and TRS↔mat4 conversions\n * (transformToMat4, mat4ToTransform) live here because they are tightly\n * coupled to the PoseTrack keyframe shape.\n *\n * Zero dependencies on p5, DOM, WebGL, or WebGPU.\n *\n * ── Exports ──────────────────────────────────────────────────────────────\n * Quaternion helpers (re-exported from quat.js)\n * qSet qCopy qDot qNormalize qNegate qMul qConjugate qRotateVec3\n * qSlerp qNlerp qFromUnitVectors qFromAxisAngle qFromLookDir\n * qFromRotMat3x3 qFromMat4 qToMat4 qToAxisAngle\n * Spline / vector helpers\n * hermiteVec3 lerpVec3\n * Transform / mat4 helpers\n * transformToMat4 mat4ToTransform\n * Tracks\n * PoseTrack — { pos, rot, scl } TRS keyframes\n * CameraTrack — { eye, center, up, fov?, halfHeight?, near, far }\n * lookat keyframes\n *\n * ── Public path access (all zero-alloc, no cursor side effects) ──────────\n * PoseTrack\n * samplePos (out) | (out, seg, t) vec3\n * mat4Model (out) | (out, seg, t) mat4 — TRS model\n * tangents (outIn, outOut, index) vec3 × 2 at keyframe\n * eval (out?) TRS object at cursor\n *\n * CameraTrack\n * sampleEye (out) | (out, seg, t) vec3\n * sampleCenter (out) | (out, seg, t) vec3\n * mat4Eye (out) | (out, seg, t) mat4 — lookat frame\n * eyeTangents (outIn, outOut, index) vec3 × 2 at keyframe\n * centerTangents (outIn, outOut, index) vec3 × 2 at keyframe\n * eval (out?) { eye, center, up,\n * fov, halfHeight,\n * near, far }\n *\n * Two arities for the continuous family:\n * (out) cursor form — reads track.seg / track.f. Useful when the\n * track's own transport is driving the animation.\n * (out, seg, t) explicit form — continuous (seg, t) coordinate, no cursor\n * side effects. seg ∈ [0, segments−1] integer, t ∈ [0, 1]\n * local to that segment. As a convenience, seg === segments\n * is accepted and rewritten to (segments−1, 1) — so the\n * idiom sampleX(out, i, 0) uniformly addresses keyframe i\n * for every i ∈ [0, keyframes.length−1].\n *\n * All honour the track's interpolation mode (hermite / linear / step) and\n * the same stored-tangent → centripetal-CR fallback chain that eval() uses.\n *\n * `tangents` / `eyeTangents` / `centerTangents` are keyframe-indexed — a\n * keyframe's incoming tangent belongs to the previous segment, outgoing to\n * the next. At boundary keyframes the missing side mirrors the present one\n * so drawing arrows at endpoints always yields a visible vector.\n *\n * Projection matrices are deliberately not exposed as a track method. Each\n * CameraTrack keyframe stores `fov` (perspective) or `halfHeight` (ortho)\n * directly on track.keyframes[i] — callers wanting a projection build one\n * with the free mat4Persp / mat4Ortho constructors. Animated fov in\n * sketches flows through the bridge's camera-binding via eval().fov and\n * eval().halfHeight (the bridge calls cam.perspective() / cam.ortho() each\n * frame).\n *\n * ── Class hierarchy ──────────────────────────────────────────────────────\n * Track (unexported, never instantiated directly)\n * └── PoseTrack (exported)\n * └── CameraTrack (exported)\n *\n * ── Hook architecture ────────────────────────────────────────────────────\n * Lib-space hooks (underscore prefix — host layer / UI layer):\n * _onActivate / _onDeactivate — fire on playing false→true / true→false.\n * _onPlay / _onEnd / _onStop — mirror the user-space hooks.\n *\n * User-space hooks:\n * onPlay : fires in play() on false→true transition.\n * onEnd : fires in tick() at natural boundary (once mode only).\n * onStop : fires in stop() / reset().\n *\n * Firing order:\n * play() → onPlay → _onPlay → _onActivate\n * tick() → onEnd → _onEnd → _onDeactivate\n * stop() → onStop → _onStop → _onDeactivate\n * reset() → onStop → _onStop → _onDeactivate\n *\n * ── Loop modes ───────────────────────────────────────────────────────────\n * loop:false, bounce:false — play once, stop at end (fires onEnd)\n * loop:true, bounce:false — repeat, wrap back to start\n * loop:true, bounce:true — bounce forever at boundaries\n * loop:false, bounce:true — bounce once: flip at far boundary, stop at origin\n *\n * ── Playback semantics (rate + _dir) ─────────────────────────────────────\n * rate > 0 forward rate < 0 backward rate === 0 frozen\n *\n * play() is the sole setter of playing = true.\n * stop() is the sole setter of playing = false.\n * Assigning rate never starts or stops playback.\n *\n * _dir (internal, ±1) tracks the current bounce travel direction.\n * tick() advances by rate * _dir and flips _dir at boundaries.\n * _dir is reset to 1 only in reset().\n *\n * ── One-keyframe behaviour ───────────────────────────────────────────────\n * play() with exactly one keyframe snaps eval() to that keyframe without\n * setting playing = true and without firing hooks.\n */\n\n\n// =========================================================================\n// S2 Spline / vector helpers\n// =========================================================================\n\nfunction _dist3(a, b) {\n const dx=a[0]-b[0], dy=a[1]-b[1], dz=a[2]-b[2];\n return Math.sqrt(dx*dx+dy*dy+dz*dz);\n}\n\n/**\n * Cubic Hermite interpolation between p0 and p1 with explicit tangents.\n * @param {number[]} out 3-element result.\n * @param {number[]} p0 Segment start.\n * @param {number[]} m0 Outgoing tangent at p0.\n * @param {number[]} p1 Segment end.\n * @param {number[]} m1 Incoming tangent at p1.\n * @param {number} t Blend [0, 1].\n * @returns {number[]} out\n */\nconst hermiteVec3 = (out, p0, m0, p1, m1, t) => {\n const t2=t*t, t3=t2*t;\n const h00=2*t3-3*t2+1, h10=t3-2*t2+t, h01=-2*t3+3*t2, h11=t3-t2;\n out[0]=h00*p0[0]+h10*m0[0]+h01*p1[0]+h11*m1[0];\n out[1]=h00*p0[1]+h10*m0[1]+h01*p1[1]+h11*m1[1];\n out[2]=h00*p0[2]+h10*m0[2]+h01*p1[2]+h11*m1[2];\n return out;\n};\n\n// Centripetal CR outgoing tangent at p1 for segment p1→p2.\n// Signature: (out, p0, p1, p2). Returns tangent AT p1 (the middle point).\nconst _crTanOut = (out, p0, p1, p2) => {\n const dt0=Math.pow(_dist3(p0,p1),0.5)||1, dt1=Math.pow(_dist3(p1,p2),0.5)||1;\n for (let i=0;i<3;i++) out[i]=((p1[i]-p0[i])/dt0-(p2[i]-p0[i])/(dt0+dt1)+(p2[i]-p1[i])/dt1)*dt1;\n return out;\n};\n\n// Centripetal CR incoming tangent at p2 for segment p1→p2.\n// Signature: (out, p1, p2, p3). Returns tangent AT p2 (the middle point).\nconst _crTanIn = (out, p1, p2, p3) => {\n const dt1=Math.pow(_dist3(p1,p2),0.5)||1, dt2=Math.pow(_dist3(p2,p3),0.5)||1;\n for (let i=0;i<3;i++) out[i]=((p2[i]-p1[i])/dt1-(p3[i]-p1[i])/(dt1+dt2)+(p3[i]-p2[i])/dt2)*dt1;\n return out;\n};\n\n// Module-level scratch — shared across track instances (non-reentrant hot path).\nconst _m0=[0,0,0], _m1=[0,0,0];\nconst _trsScratch = { pos:[0,0,0], rot:[0,0,0,1], scl:[1,1,1] };\nconst _eyeScratch = { eye:[0,0,0], center:[0,0,0], up:[0,1,0] };\n\n/**\n * Linear interpolation between two vec3s.\n */\nconst lerpVec3 = (out, a, b, t) => {\n out[0]=a[0]+t*(b[0]-a[0]);\n out[1]=a[1]+t*(b[1]-a[1]);\n out[2]=a[2]+t*(b[2]-a[2]);\n return out;\n};\n\n// =========================================================================\n// S2b Path samplers — shared core\n// =========================================================================\n\n/** @private — sample interpolated vec3 path at (seg, t) into out. */\nfunction _samplePathCore(out, kfs, interp, field, tanInName, tanOutName, seg, t) {\n const n = kfs.length;\n if (n === 0) { out[0]=0; out[1]=0; out[2]=0; return out; }\n if (n === 1) {\n const p = kfs[0][field];\n out[0]=p[0]; out[1]=p[1]; out[2]=p[2];\n return out;\n }\n const nSeg = n - 1;\n seg = seg | 0;\n if (seg >= nSeg) { seg = nSeg - 1; t = 1; }\n else if (seg < 0) { seg = 0; t = 0; }\n t = _clamp01(t);\n const k0 = kfs[seg];\n const k1 = kfs[seg + 1];\n\n if (interp === 'step') {\n const p = k0[field];\n out[0]=p[0]; out[1]=p[1]; out[2]=p[2];\n return out;\n }\n if (interp === 'linear') {\n return lerpVec3(out, k0[field], k1[field], t);\n }\n\n const p0 = seg > 0 ? kfs[seg - 1][field] : k0[field];\n const p3 = seg + 2 < n ? kfs[seg + 2][field] : k1[field];\n const m0 = k0[tanOutName] != null ? k0[tanOutName]\n : k0[tanInName] != null ? k0[tanInName]\n : _crTanOut(_m0, p0, k0[field], k1[field]);\n const m1 = k1[tanInName] != null ? k1[tanInName]\n : k1[tanOutName] != null ? k1[tanOutName]\n : _crTanIn(_m1, k0[field], k1[field], p3);\n return hermiteVec3(out, k0[field], m0, k1[field], m1, t);\n}\n\n/** @private — write effective in/out tangents at keyframe i. */\nfunction _sampleTangentsCore(outIn, outOut, kfs, field, tanInName, tanOutName, i) {\n const n = kfs.length;\n if (n === 0) {\n outIn[0]=outIn[1]=outIn[2]=0; outOut[0]=outOut[1]=outOut[2]=0;\n return;\n }\n i = _clampS(i | 0, 0, n - 1);\n const ki = kfs[i];\n const hasTI = ki[tanInName] != null;\n const hasTO = ki[tanOutName] != null;\n\n if (hasTO) {\n outOut[0]=ki[tanOutName][0]; outOut[1]=ki[tanOutName][1]; outOut[2]=ki[tanOutName][2];\n } else if (hasTI) {\n outOut[0]=ki[tanInName][0]; outOut[1]=ki[tanInName][1]; outOut[2]=ki[tanInName][2];\n } else if (i < n - 1) {\n const k1 = kfs[i + 1];\n const p0 = i > 0 ? kfs[i - 1][field] : ki[field];\n _crTanOut(outOut, p0, ki[field], k1[field]);\n } else {\n outOut[0]=0; outOut[1]=0; outOut[2]=0;\n }\n\n if (hasTI) {\n outIn[0]=ki[tanInName][0]; outIn[1]=ki[tanInName][1]; outIn[2]=ki[tanInName][2];\n } else if (hasTO) {\n outIn[0]=ki[tanOutName][0]; outIn[1]=ki[tanOutName][1]; outIn[2]=ki[tanOutName][2];\n } else if (i > 0) {\n const k0 = kfs[i - 1];\n const p3 = i + 1 < n ? kfs[i + 1][field] : ki[field];\n _crTanIn(outIn, k0[field], ki[field], p3);\n } else {\n outIn[0]=outOut[0]; outIn[1]=outOut[1]; outIn[2]=outOut[2];\n }\n\n if (i === n - 1 && !hasTO && !hasTI) {\n outOut[0]=outIn[0]; outOut[1]=outIn[1]; outOut[2]=outIn[2];\n }\n}\n\n// =========================================================================\n// S3 Transform <-> Mat4\n// =========================================================================\n\n/**\n * Write a TRS transform into a column-major mat4.\n */\nconst transformToMat4 = (out, xform) => {\n qToMat4(out, xform.rot);\n const sx=xform.scl[0], sy=xform.scl[1], sz=xform.scl[2];\n out[0]*=sx; out[1]*=sx; out[2]*=sx;\n out[4]*=sy; out[5]*=sy; out[6]*=sy;\n out[8]*=sz; out[9]*=sz; out[10]*=sz;\n out[12]=xform.pos[0]; out[13]=xform.pos[1]; out[14]=xform.pos[2];\n return out;\n};\n\n/**\n * Decompose a column-major mat4 into a TRS transform.\n */\nconst mat4ToTransform = (out, m) => {\n out.pos[0]=m[12]; out.pos[1]=m[13]; out.pos[2]=m[14];\n const sx=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);\n const sy=Math.sqrt(m[4]*m[4]+m[5]*m[5]+m[6]*m[6]);\n const sz=Math.sqrt(m[8]*m[8]+m[9]*m[9]+m[10]*m[10]);\n out.scl[0]=sx; out.scl[1]=sy; out.scl[2]=sz;\n qFromRotMat3x3(out.rot,\n m[0]/sx,m[4]/sy,m[8]/sz,\n m[1]/sx,m[5]/sy,m[9]/sz,\n m[2]/sx,m[6]/sy,m[10]/sz);\n return out;\n};\n\n// =========================================================================\n// S4a Spec parser — PoseTrack\n// =========================================================================\n\nconst _isNum$1 = (x) => typeof x === 'number' && Number.isFinite(x);\nconst _clamp01 = (x) => x < 0 ? 0 : (x > 1 ? 1 : x);\nconst _clampS = (x, lo, hi) => x < lo ? lo : (x > hi ? hi : x);\n\nfunction _parseVec3(v) {\n if (!v) return null;\n if (ArrayBuffer.isView(v) && v.length >= 3) return [v[0], v[1], v[2]];\n if (Array.isArray(v) && v.length >= 3 && v.every(n => typeof n === 'number')) return [v[0], v[1], v[2]];\n if (typeof v === 'object' && 'x' in v) return [v.x || 0, v.y || 0, v.z || 0];\n return null;\n}\n\nconst _EULER_AXES = { X:[1,0,0], Y:[0,1,0], Z:[0,0,1] };\nconst _EULER_ORDERS = new Set(['XYZ','XZY','YXZ','YZX','ZXY','ZYX']);\n\n/**\n * Parse any rotation representation into a unit quaternion [x,y,z,w].\n *\n * Accepted forms:\n * [x,y,z,w] — raw quaternion array\n * { axis:[x,y,z], angle } — axis-angle (angle in radians)\n * { dir:[x,y,z], up?:[x,y,z] } — forward direction (−Z) with optional up\n * { mat4Eye: mat4 } — rotation block of an eye matrix\n * { mat3: mat3 } — column-major 3×3 rotation matrix\n * { euler:[rx,ry,rz], order? } — intrinsic Euler (default order: YXZ)\n * { from:[x,y,z], to:[x,y,z] } — shortest-arc rotation between two vectors\n *\n * @param {*} v\n * @returns {number[]|null} [x,y,z,w] or null if unparseable.\n */\nfunction _parseQuat(v) {\n if (!v) return null;\n\n // [x,y,z,w] — normalised like every other form\n if (Array.isArray(v) && v.length === 4) return qNormalize([v[0],v[1],v[2],v[3]]);\n if (ArrayBuffer.isView(v) && v.length >= 4) return qNormalize([v[0],v[1],v[2],v[3]]);\n\n if (typeof v !== 'object') return null;\n\n // { axis, angle }\n if (v.axis != null && v.angle != null) {\n const ax = Array.isArray(v.axis) ? v.axis : [v.axis.x||0, v.axis.y||0, v.axis.z||0];\n return qFromAxisAngle([0,0,0,1], ax[0],ax[1],ax[2], v.angle);\n }\n\n // { dir, up? }\n if (v.dir != null) {\n const d = Array.isArray(v.dir) ? v.dir : [v.dir.x||0, v.dir.y||0, v.dir.z||0];\n const u = v.up ? (Array.isArray(v.up) ? v.up : [v.up.x||0, v.up.y||0, v.up.z||0]) : null;\n return qFromLookDir([0,0,0,1], d, u);\n }\n\n // { mat4Eye }\n if (v.mat4Eye != null) {\n const m = (ArrayBuffer.isView(v.mat4Eye) || Array.isArray(v.mat4Eye))\n ? v.mat4Eye : (v.mat4Eye.mat4 ?? null);\n if (!m || m.length < 16) return null;\n return qFromRotMat3x3([0,0,0,1], m[0],m[4],m[8], m[1],m[5],m[9], m[2],m[6],m[10]);\n }\n\n // { mat3 }\n if (v.mat3 != null) {\n const m = (ArrayBuffer.isView(v.mat3) || Array.isArray(v.mat3)) ? v.mat3 : null;\n if (!m || m.length < 9) return null;\n return qFromRotMat3x3([0,0,0,1], m[0],m[3],m[6], m[1],m[4],m[7], m[2],m[5],m[8]);\n }\n\n // { euler, order? }\n if (v.euler != null) {\n const e = v.euler;\n if (!Array.isArray(e) || e.length < 3) return null;\n const order = (v.order && _EULER_ORDERS.has(v.order)) ? v.order : 'YXZ';\n const q = [0,0,0,1], s = [0,0,0,1];\n for (let i = 0; i < 3; i++) {\n const ax = _EULER_AXES[order[i]];\n qMul(q, q, qFromAxisAngle(s, ax[0],ax[1],ax[2], e[i]));\n }\n return q;\n }\n\n // { from, to }\n if (v.from != null && v.to != null) {\n const f = Array.isArray(v.from) ? v.from : [v.from.x||0, v.from.y||0, v.from.z||0];\n const t = Array.isArray(v.to) ? v.to : [v.to.x||0, v.to.y||0, v.to.z||0];\n const fl = Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]) || 1;\n const tl = Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]) || 1;\n const fx=f[0]/fl, fy=f[1]/fl, fz=f[2]/fl;\n const tx=t[0]/tl, ty=t[1]/tl, tz=t[2]/tl;\n const dot = fx*tx + fy*ty + fz*tz;\n if (dot >= 1 - 1e-8) return [0,0,0,1];\n if (dot <= -1 + 1e-8) {\n let px=0, py=fz, pz=-fy;\n let pl = Math.sqrt(px*px+py*py+pz*pz);\n if (pl < 1e-8) { px=fy; py=-fx; pz=0; pl = Math.sqrt(px*px+py*py+pz*pz); }\n if (pl < 1e-8) return [0,0,0,1];\n return qFromAxisAngle([0,0,0,1], px/pl,py/pl,pz/pl, Math.PI);\n }\n let ax=fy*tz-fz*ty, ay=fz*tx-fx*tz, az=fx*ty-fy*tx;\n const al = Math.sqrt(ax*ax+ay*ay+az*az) || 1;\n return qFromAxisAngle([0,0,0,1], ax/al,ay/al,az/al,\n Math.acos(Math.max(-1, Math.min(1, dot))));\n }\n\n return null;\n}\n\n/**\n * Parse a PoseTrack keyframe spec into internal form.\n *\n * Accepted forms:\n * { mat4Model }\n * Decompose a column-major mat4 into TRS via mat4ToTransform.\n * Float32Array(16), plain Array, or { mat4 } wrapper.\n *\n * { pos?, rot?, scl?, tanIn?, tanOut? }\n * Explicit TRS. pos and scl are vec3; rot accepts any form from _parseQuat.\n * All fields are optional — missing pos/scl default to [0,0,0] / [1,1,1],\n * missing rot defaults to identity.\n * tanIn/tanOut are optional vec3 tangents for Hermite interpolation.\n *\n * @param {Object} spec\n * @returns {{ pos:number[], rot:number[], scl:number[],\n * tanIn:number[]|null, tanOut:number[]|null } | null}\n */\nfunction _parseSpec(spec) {\n if (!spec || typeof spec !== 'object') return null;\n\n // { mat4Model } — full TRS decomposition from model matrix\n if (spec.mat4Model != null) {\n const m = (ArrayBuffer.isView(spec.mat4Model) || Array.isArray(spec.mat4Model))\n ? spec.mat4Model : (spec.mat4Model.mat4 ?? null);\n if (!m || m.length < 16) return null;\n const kf = mat4ToTransform({ pos:[0,0,0], rot:[0,0,0,1], scl:[1,1,1] }, m);\n kf.tanIn = null; kf.tanOut = null;\n return kf;\n }\n\n // { pos?, rot?, scl?, tanIn?, tanOut? } — explicit TRS\n const pos = _parseVec3(spec.pos) || [0,0,0];\n const rot = _parseQuat(spec.rot) || [0,0,0,1];\n const scl = _parseVec3(spec.scl) || [1,1,1];\n const tanIn = _parseVec3(spec.tanIn) || null;\n const tanOut = _parseVec3(spec.tanOut) || null;\n return { pos, rot, scl, tanIn, tanOut };\n}\n\nfunction _sameTransform(a, b) {\n for (let i=0;i<3;i++) if (a.pos[i]!==b.pos[i]||a.scl[i]!==b.scl[i]) return false;\n for (let i=0;i<4;i++) if (a.rot[i]!==b.rot[i]) return false;\n return true;\n}\n\n// =========================================================================\n// S4b Spec parser — CameraTrack\n// =========================================================================\n\n// Lens defaults used when a spec omits near/far. Match the three.js /\n// Bevy conventions and are safe for typical p5 v2 scene scales.\nconst _DEFAULT_NEAR = 0.1;\nconst _DEFAULT_FAR = 1000;\n\n/**\n * Parse a CameraTrack keyframe spec into internal form.\n *\n * Required: eye (vec3). Everything else is optional.\n * center defaults to [0, 0, 0]\n * up defaults to [0, 1, 0] and is normalised\n * fov vertical fov (radians), perspective only — null if absent\n * halfHeight world-unit half-height of ortho frustum — null if absent\n * near near clip distance (positive) — defaults to 0.1\n * far far clip distance (positive) — defaults to 1000\n * eyeTanIn/Out optional Hermite tangents for the eye path\n * centerTanIn/Out optional Hermite tangents for the center path\n *\n * fov and halfHeight are mutually exclusive (perspective xor ortho) and\n * therefore left nullable; eval() lerps each only when both adjacent\n * keyframes carry a non-null value, passing null through otherwise.\n *\n * near and far are always meaningful regardless of projection type, so\n * they receive real defaults and are linearly interpolated unconditionally.\n *\n * @param {Object} spec\n * @returns {Object|null} Parsed keyframe or null if eye is missing/malformed.\n */\nfunction _parseCameraSpec(spec) {\n if (!spec || typeof spec !== 'object') return null;\n const eye = _parseVec3(spec.eye);\n if (!eye) return null;\n const center = _parseVec3(spec.center) || [0,0,0];\n const upRaw = spec.up ? _parseVec3(spec.up) : null;\n const up = upRaw || [0,1,0];\n const ul = Math.sqrt(up[0]*up[0]+up[1]*up[1]+up[2]*up[2]) || 1;\n return {\n eye, center,\n up: [up[0]/ul, up[1]/ul, up[2]/ul],\n fov: typeof spec.fov === 'number' ? spec.fov : null,\n halfHeight: typeof spec.halfHeight === 'number' ? spec.halfHeight : null,\n near: typeof spec.near === 'number' ? spec.near : _DEFAULT_NEAR,\n far: typeof spec.far === 'number' ? spec.far : _DEFAULT_FAR,\n eyeTanIn: _parseVec3(spec.eyeTanIn) || null,\n eyeTanOut: _parseVec3(spec.eyeTanOut) || null,\n centerTanIn: _parseVec3(spec.centerTanIn) || null,\n centerTanOut: _parseVec3(spec.centerTanOut)|| null,\n };\n}\n\nfunction _sameCameraKeyframe(a, b) {\n for (let i=0;i<3;i++) {\n if (a.eye[i]!==b.eye[i]) return false;\n if (a.center[i]!==b.center[i]) return false;\n if (a.up[i]!==b.up[i]) return false;\n }\n if (a.fov !== b.fov) return false;\n if (a.halfHeight !== b.halfHeight) return false;\n if (a.near !== b.near) return false;\n if (a.far !== b.far) return false;\n return true;\n}\n\n// =========================================================================\n// S5 Track — unexported base class (transport machinery only)\n// =========================================================================\n\nclass Track {\n constructor() {\n /** @type {Array} Keyframe array — shape depends on subclass. */\n this.keyframes = [];\n /** Whether playback is currently active. @type {boolean} */\n this.playing = false;\n /** Loop at boundaries. @type {boolean} */\n this.loop = false;\n /** Ping-pong bounce at boundaries (independent of loop). @type {boolean} */\n this.bounce = false;\n /** Frames per segment (≥1). @type {number} */\n this.duration = 30;\n /** Current segment index. @type {number} */\n this.seg = 0;\n /** Frame offset within current segment (can be fractional). @type {number} */\n this.f = 0;\n\n // Playback rate (signed: negative = reverse; 0 = frozen).\n this._rate = 1;\n // Current bounce travel direction (±1). Reset to 1 only on reset().\n this._dir = 1;\n // Whether a bounce-once has already flipped direction.\n this._bounced = false;\n\n /** User hook: fires on play() false→true transition. @type {Function|null} */\n this.onPlay = null;\n /** User hook: fires on natural boundary in once mode. @type {Function|null} */\n this.onEnd = null;\n /** User hook: fires on stop() / reset() / end-of-bounce-once. @type {Function|null} */\n this.onStop = null;\n\n // Lib-space hooks (underscore prefix — host layer / UI layer only).\n this._onActivate = null; this._onDeactivate = null;\n this._onPlay = null; this._onEnd = null; this._onStop = null;\n }\n\n /** Playback rate. Signed: negative reverses, 0 freezes. Assigning never starts or stops playback. @type {number} */\n get rate() { return this._rate; }\n set rate(v) { this._rate = (_isNum$1(v)) ? v : 1; }\n\n /** Number of interpolatable segments (keyframes.length − 1, min 0). @type {number} */\n get segments() { return Math.max(0, this.keyframes.length - 1); }\n\n /**\n * @private — resolve cursor (seg, f) into continuous (seg, t).\n * Shared backing of every cursor-form sampler / matrix method.\n */\n _cursorSegT() {\n const nSeg = this.segments;\n const dur = Math.max(1, this.duration | 0);\n const seg = nSeg > 0 ? _clampS(this.seg, 0, nSeg - 1) : 0;\n const t = _clamp01(this.f / dur);\n return [seg, t];\n }\n\n /**\n * Start or update playback. Sole setter of `playing = true`.\n *\n * Fires `onPlay → _onPlay → _onActivate` only on a false→true transition.\n * Zero keyframes: no-op. Exactly one keyframe: snaps eval() to it but does\n * not set `playing` and fires no hooks.\n *\n * @param {number|{duration?:number,loop?:boolean,bounce?:boolean,\n * rate?:number,onPlay?:Function,onEnd?:Function,\n * onStop?:Function}} [rateOrOpts]\n * A bare number is taken as `rate`; an object configures multiple\n * fields in one call.\n * @returns {Track} this\n */\n play(rateOrOpts) {\n if (this.keyframes.length === 0) return this;\n if (this.keyframes.length === 1) { this.seg = 0; this.f = 0; return this; }\n\n if (typeof rateOrOpts === 'number' && Number.isFinite(rateOrOpts)) {\n this._rate = rateOrOpts;\n } else if (rateOrOpts && typeof rateOrOpts === 'object') {\n const o = rateOrOpts;\n if (_isNum$1(o.duration)) this.duration = Math.max(1, o.duration | 0);\n if ('loop' in o) this.loop = !!o.loop;\n if ('bounce' in o) this.bounce = !!o.bounce;\n if (typeof o.onPlay === 'function') this.onPlay = o.onPlay;\n if (typeof o.onEnd === 'function') this.onEnd = o.onEnd;\n if (typeof o.onStop === 'function') this.onStop = o.onStop;\n if (_isNum$1(o.rate)) this._rate = o.rate;\n }\n\n const nSeg = this.segments, dur = Math.max(1, this.duration | 0);\n if (this.seg < 0) this.seg = 0;\n if (this.seg >= nSeg) this.seg = nSeg - 1;\n if (this.f < 0) this.f = 0;\n if (this.f > dur) this.f = dur;\n\n const wasPlaying = this.playing;\n this.playing = true;\n if (!wasPlaying) {\n this._bounced = false;\n if (typeof this.onPlay === 'function') { try { this.onPlay(this); } catch (_) {} }\n this._onPlay?.();\n this._onActivate?.();\n }\n return this;\n }\n\n /**\n * Stop playback. Sole setter of `playing = false`. Fires\n * `onStop → _onStop → _onDeactivate` on a true→false transition.\n *\n * @param {boolean} [rewind] If true, seek to the origin end after stopping\n * (0 when playing forward, 1 when playing backward).\n * @returns {Track} this\n */\n stop(rewind) {\n const wasPlaying = this.playing;\n this.playing = false;\n if (wasPlaying) {\n this._bounced = false;\n if (typeof this.onStop === 'function') { try { this.onStop(this); } catch (_) {} }\n this._onStop?.();\n this._onDeactivate?.();\n if (rewind && this.keyframes.length > 1) this.seek(this._rate * this._dir < 0 ? 1 : 0);\n }\n return this;\n }\n\n /**\n * Clear all keyframes and stop. Fires stop-side hooks if it was playing.\n * Unlike stop(), this also resets `_dir` to +1.\n * @returns {Track} this\n */\n reset() {\n const wasPlaying = this.playing;\n this.playing = false;\n if (wasPlaying) {\n if (typeof this.onStop === 'function') { try { this.onStop(this); } catch (_) {} }\n this._onStop?.();\n this._onDeactivate?.();\n }\n this.keyframes.length = 0;\n this.seg = 0; this.f = 0; this._dir = 1; this._bounced = false;\n return this;\n }\n\n /**\n * Remove the keyframe at `index`. Adjusts the cursor if the removal shrinks\n * the track below the current segment.\n * @param {number} index\n * @returns {boolean} true if removed; false if index was invalid.\n */\n remove(index) {\n if (!_isNum$1(index)) return false;\n const i = index | 0;\n if (i < 0 || i >= this.keyframes.length) return false;\n this.keyframes.splice(i, 1);\n const nSeg = this.segments;\n if (nSeg === 0) { this.seg = 0; this.f = 0; }\n else if (this.seg >= nSeg) { this.seg = nSeg - 1; }\n return true;\n }\n\n /**\n * Move the cursor.\n * seek(t) Scrub to normalised position t ∈ [0, 1] across the\n * whole track.\n * seek(t, segIndex) Position within a specific segment — t is local to\n * that segment.\n * Does not affect `playing`.\n *\n * @param {number} t\n * @param {number} [segIndex]\n * @returns {Track} this\n */\n seek(t, segIndex) {\n const nSeg = this.segments;\n if (nSeg === 0) { this.seg = 0; this.f = 0; return this; }\n const dur = Math.max(1, this.duration | 0);\n if (_isNum$1(segIndex)) {\n this.seg = _clampS(segIndex | 0, 0, nSeg - 1);\n this.f = _clamp01(t) * dur;\n } else {\n this._setCursorFromScalar(_clamp01(t) * nSeg * dur);\n }\n return this;\n }\n\n /**\n * Normalised cursor position across the whole track.\n * @returns {number} ∈ [0, 1]; 0 when there are no segments.\n */\n time() {\n const nSeg = this.segments;\n if (nSeg === 0) return 0;\n const dur = Math.max(1, this.duration | 0);\n return _clamp01((this.seg * dur + this.f) / (nSeg * dur));\n }\n\n /**\n * Snapshot of transport state. Allocates a new object per call — intended\n * for UI / debugging, not hot loops.\n * @returns {{keyframes:number, segments:number, seg:number, f:number,\n * playing:boolean, loop:boolean, bounce:boolean, rate:number,\n * duration:number, time:number}}\n */\n info() {\n return {\n keyframes: this.keyframes.length,\n segments: this.segments,\n seg: this.seg,\n f: this.f,\n playing: this.playing,\n loop: this.loop,\n bounce: this.bounce,\n rate: this._rate,\n duration: this.duration,\n time: this.segments > 0 ? this.time() : 0\n };\n }\n\n /**\n * Advance the cursor by `rate * _dir` in frames. Handles loop / bounce /\n * once modes per the table in the module header. Fires `onEnd → _onEnd →\n * _onDeactivate` at a natural boundary in once mode.\n *\n * Intended to be called once per animation frame by the bridge / UI layer.\n * rate === 0 freezes the cursor but keeps `playing` unchanged.\n *\n * @returns {boolean} Current `playing` state after advancing.\n */\n tick() {\n if (!this.playing) return false;\n const nSeg = this.segments;\n if (nSeg === 0) { this.playing = false; this._onDeactivate?.(); return false; }\n if (this._rate === 0) return true;\n\n const dur = Math.max(1, this.duration | 0);\n const total = nSeg * dur;\n const s = _clampS(this.seg * dur + this.f, 0, total);\n const next = s + this._rate * this._dir;\n\n if (this.loop && this.bounce) {\n let pos = next, flips = 0;\n while (pos < 0 || pos > total) {\n if (pos < 0) { pos = -pos; flips++; }\n else { pos = 2 * total - pos; flips++; }\n }\n if (flips & 1) this._dir = -this._dir;\n this._setCursorFromScalar(pos);\n return true;\n }\n\n if (!this.loop && this.bounce) {\n if (next >= total) {\n this._setCursorFromScalar(Math.min(total, 2 * total - next));\n this._dir = -this._dir;\n this._bounced = true;\n return true;\n }\n if (next <= 0) {\n this._setCursorFromScalar(0);\n this.playing = false;\n this._dir = 1; this._bounced = false;\n if (typeof this.onEnd === 'function') { try { this.onEnd(this); } catch (_) {} }\n this._onEnd?.();\n this._onDeactivate?.();\n return false;\n }\n this._setCursorFromScalar(next);\n return true;\n }\n\n if (this.loop) {\n this._setCursorFromScalar(((next % total) + total) % total);\n return true;\n }\n\n if (next <= 0) {\n this._setCursorFromScalar(0);\n this.playing = false;\n if (typeof this.onEnd === 'function') { try { this.onEnd(this); } catch (_) {} }\n this._onEnd?.();\n this._onDeactivate?.();\n return false;\n }\n if (next >= total) {\n this._setCursorFromScalar(total);\n this.playing = false;\n if (typeof this.onEnd === 'function') { try { this.onEnd(this); } catch (_) {} }\n this._onEnd?.();\n this._onDeactivate?.();\n return false;\n }\n\n this._setCursorFromScalar(next);\n return true;\n }\n\n /** @private */\n _setCursorFromScalar(s) {\n const dur = Math.max(1, this.duration | 0);\n const nSeg = this.segments;\n this.seg = Math.floor(s / dur);\n this.f = s - this.seg * dur;\n if (this.seg >= nSeg) { this.seg = nSeg - 1; this.f = dur; }\n if (this.seg < 0) { this.seg = 0; this.f = 0; }\n }\n}\n\n// =========================================================================\n// S6 PoseTrack\n// =========================================================================\n\n/**\n * Renderer-agnostic TRS keyframe track.\n *\n * Keyframe shape: { pos:[x,y,z], rot:[x,y,z,w], scl:[x,y,z],\n * tanIn?:[x,y,z], tanOut?:[x,y,z] }\n *\n * tanIn — incoming position tangent at this keyframe (Hermite mode).\n * tanOut — outgoing position tangent at this keyframe (Hermite mode).\n * When only one is supplied, the other mirrors it at sample time.\n * When neither is supplied, centripetal Catmull-Rom tangents are auto-computed.\n */\nclass PoseTrack extends Track {\n constructor() {\n super();\n /**\n * Position interpolation mode.\n * - 'hermite' — cubic Hermite; auto-computes centripetal Catmull-Rom\n * tangents when none are stored (default)\n * - 'linear' — lerp\n * - 'step' — snap to k0; useful for discrete state changes\n * @type {'hermite'|'linear'|'step'}\n */\n this.posInterp = 'hermite';\n /**\n * Rotation interpolation mode.\n * - 'slerp' — constant angular velocity (default)\n * - 'nlerp' — normalised lerp; cheaper, slightly non-constant speed\n * - 'step' — snap to k0 quaternion\n * @type {'slerp'|'nlerp'|'step'}\n */\n this.rotInterp = 'slerp';\n }\n\n /**\n * Append one or more keyframes. Adjacent duplicates are skipped by default.\n * Accepts any spec form understood by _parseSpec, or an array of them.\n * @param {Object|Object[]} spec\n * @param {{ deduplicate?: boolean }} [opts]\n */\n add(spec, opts) {\n if (Array.isArray(spec)) { for (const s of spec) this.add(s, opts); return; }\n const kf = _parseSpec(spec);\n if (!kf) return;\n const dedup = !opts || opts.deduplicate !== false;\n if (dedup && this.keyframes.length > 0) {\n if (_sameTransform(this.keyframes[this.keyframes.length - 1], kf)) return;\n }\n this.keyframes.push(kf);\n }\n\n /**\n * Replace the keyframe at `index`, or append at the end if `index` equals\n * the current keyframe count.\n * @param {number} index\n * @param {Object} spec Any spec form understood by _parseSpec.\n * @returns {boolean} true on success; false for invalid index or spec.\n */\n set(index, spec) {\n if (!_isNum$1(index)) return false;\n const i = index | 0, kf = _parseSpec(spec);\n if (!kf || i < 0 || i > this.keyframes.length) return false;\n if (i === this.keyframes.length) this.keyframes.push(kf);\n else this.keyframes[i] = kf;\n return true;\n }\n\n /**\n * Sample the position path. Zero-alloc, no cursor side effects. Honours\n * posInterp and the stored-tangent → auto-CR fallback chain.\n *\n * Two signatures:\n * samplePos(out) cursor form — reads current seg/f\n * samplePos(out, seg, t) explicit (seg, t), continuous on the path\n *\n * @param {number[]} out 3-element result buffer.\n * @param {number} [seg] Segment index in [0, segments−1]. Omit for cursor.\n * @param {number} [t] Local parameter in [0, 1]. Omit for cursor.\n * @returns {number[]} out\n */\n samplePos(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n return _samplePathCore(out, this.keyframes, this.posInterp, 'pos', 'tanIn', 'tanOut', seg, t);\n }\n\n /**\n * Write the TRS pose as a column-major model mat4. Zero-alloc, no cursor\n * side effects.\n *\n * Two signatures:\n * mat4Model(out) cursor form — reads current seg/f\n * mat4Model(out, seg, t) explicit (seg, t), continuous on the path\n *\n * Replaces the previous toMatrix() method.\n *\n * @param {Float32Array|number[]} out 16-element result buffer.\n * @param {number} [seg] Segment index in [0, segments−1]. Omit for cursor.\n * @param {number} [t] Local parameter in [0, 1]. Omit for cursor.\n * @returns {Float32Array|number[]} out\n */\n mat4Model(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n this._sampleTRS(_trsScratch, seg, t);\n return transformToMat4(out, _trsScratch);\n }\n\n /**\n * Effective incoming / outgoing position tangents at keyframe `index`.\n * Stored tanIn/tanOut take precedence; each mirrors the other when only\n * one is stored; else centripetal Catmull-Rom tangents are auto-computed\n * from neighbours. Boundary keyframes mirror across the missing side.\n *\n * @param {number[]} outIn 3-element result — incoming tangent.\n * @param {number[]} outOut 3-element result — outgoing tangent.\n * @param {number} index Keyframe index.\n * @returns {PoseTrack} this\n */\n tangents(outIn, outOut, index) {\n _sampleTangentsCore(outIn, outOut, this.keyframes, 'pos', 'tanIn', 'tanOut', index);\n return this;\n }\n\n /** @private — write interpolated TRS at (seg, t). */\n _sampleTRS(out, seg, t) {\n const n = this.keyframes.length;\n if (n === 0) return out;\n if (n === 1) {\n const k = this.keyframes[0];\n out.pos[0]=k.pos[0]; out.pos[1]=k.pos[1]; out.pos[2]=k.pos[2];\n out.rot[0]=k.rot[0]; out.rot[1]=k.rot[1]; out.rot[2]=k.rot[2]; out.rot[3]=k.rot[3];\n out.scl[0]=k.scl[0]; out.scl[1]=k.scl[1]; out.scl[2]=k.scl[2];\n return out;\n }\n const nSeg = n - 1;\n seg = seg | 0;\n if (seg >= nSeg) { seg = nSeg - 1; t = 1; }\n else if (seg < 0) { seg = 0; t = 0; }\n t = _clamp01(t);\n const k0 = this.keyframes[seg];\n const k1 = this.keyframes[seg + 1];\n\n _samplePathCore(out.pos, this.keyframes, this.posInterp, 'pos', 'tanIn', 'tanOut', seg, t);\n\n if (this.rotInterp === 'step') {\n out.rot[0]=k0.rot[0]; out.rot[1]=k0.rot[1]; out.rot[2]=k0.rot[2]; out.rot[3]=k0.rot[3];\n } else if (this.rotInterp === 'nlerp') {\n qNlerp(out.rot, k0.rot, k1.rot, t);\n } else {\n qSlerp(out.rot, k0.rot, k1.rot, t);\n }\n\n lerpVec3(out.scl, k0.scl, k1.scl, t);\n return out;\n }\n\n /**\n * Evaluate interpolated TRS pose at current cursor.\n * @param {{ pos:number[], rot:number[], scl:number[] }} [out]\n * @returns {{ pos:number[], rot:number[], scl:number[] }} out\n */\n eval(out) {\n out = out || { pos:[0,0,0], rot:[0,0,0,1], scl:[1,1,1] };\n const n = this.keyframes.length;\n if (n === 0) return out;\n if (n === 1) return this._sampleTRS(out, 0, 0);\n const [seg, t] = this._cursorSegT();\n return this._sampleTRS(out, seg, t);\n }\n}\n\n// =========================================================================\n// S7 CameraTrack\n// =========================================================================\n\n/**\n * Lookat camera keyframe track.\n *\n * Keyframe shape: { eye:[x,y,z], center:[x,y,z], up:[x,y,z],\n * fov?:number, halfHeight?:number,\n * near:number, far:number,\n * eyeTanIn?:[x,y,z], eyeTanOut?:[x,y,z],\n * centerTanIn?:[x,y,z], centerTanOut?:[x,y,z] }\n *\n * fov — vertical fov (radians) for perspective cameras; null for ortho.\n * halfHeight — world-unit half-height of ortho frustum; null for perspective.\n * Both are optional and nullable because exactly one is meaningful per\n * keyframe (perspective xor ortho). eval() lerps each only when both\n * adjacent keyframes carry a non-null value for that field; mixed or\n * missing entries pass `null` through.\n *\n * near, far — clip plane distances (positive, world units). Always real\n * numbers. Defaults: near = 0.1, far = 1000 (three.js / Bevy convention).\n * Linearly interpolated between keyframes without null-passthrough.\n *\n * eyeTanIn/Out and centerTanIn/Out are optional vec3 tangents for Hermite\n * interpolation of the eye and center paths respectively. When absent,\n * centripetal Catmull-Rom tangents are auto-computed at sample time.\n *\n * Missing fields default to: center → [0,0,0], up → [0,1,0],\n * near → 0.1, far → 1000.\n *\n * For matrix-based capture of a camera-like pose use\n * PoseTrack.add({ mat4Model: mat4Eye }) for full TRS fidelity including roll,\n * or a lookat spec here for camera-style interpolation.\n */\nclass CameraTrack extends Track {\n constructor() {\n super();\n /**\n * Eye-path interpolation mode.\n * @type {'hermite'|'linear'|'step'}\n */\n this.eyeInterp = 'hermite';\n /**\n * Center-path interpolation mode.\n * @type {'hermite'|'linear'|'step'}\n */\n this.centerInterp = 'linear';\n }\n\n /**\n * Append one or more camera keyframes. Adjacent duplicates are skipped by\n * default.\n * @param {Object|Object[]} spec\n * @param {{ deduplicate?: boolean }} [opts]\n */\n add(spec, opts) {\n if (Array.isArray(spec)) { for (const s of spec) this.add(s, opts); return; }\n const kf = _parseCameraSpec(spec);\n if (!kf) return;\n const dedup = !opts || opts.deduplicate !== false;\n if (dedup && this.keyframes.length > 0) {\n if (_sameCameraKeyframe(this.keyframes[this.keyframes.length - 1], kf)) return;\n }\n this.keyframes.push(kf);\n }\n\n /**\n * Replace the camera keyframe at `index`, or append at the end if `index`\n * equals the current keyframe count.\n * @param {number} index\n * @param {Object} spec\n * @returns {boolean}\n */\n set(index, spec) {\n if (!_isNum$1(index)) return false;\n const i = index | 0, kf = _parseCameraSpec(spec);\n if (!kf || i < 0 || i > this.keyframes.length) return false;\n if (i === this.keyframes.length) this.keyframes.push(kf);\n else this.keyframes[i] = kf;\n return true;\n }\n\n /**\n * Sample the eye path. Zero-alloc, no cursor side effects.\n *\n * Two signatures:\n * sampleEye(out) cursor form — reads current seg/f\n * sampleEye(out, seg, t) explicit (seg, t), continuous on the path\n *\n * @param {number[]} out\n * @param {number} [seg]\n * @param {number} [t]\n * @returns {number[]} out\n */\n sampleEye(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n return _samplePathCore(out, this.keyframes, this.eyeInterp, 'eye', 'eyeTanIn', 'eyeTanOut', seg, t);\n }\n\n /**\n * Sample the center path. Zero-alloc, no cursor side effects.\n *\n * Two signatures:\n * sampleCenter(out) cursor form — reads current seg/f\n * sampleCenter(out, seg, t) explicit (seg, t)\n *\n * @param {number[]} out\n * @param {number} [seg]\n * @param {number} [t]\n * @returns {number[]} out\n */\n sampleCenter(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n return _samplePathCore(out, this.keyframes, this.centerInterp, 'center', 'centerTanIn', 'centerTanOut', seg, t);\n }\n\n /**\n * Write the interpolated lookat eye matrix as a column-major mat4\n * (eye→world rigid frame). Zero-alloc, no cursor side effects.\n *\n * Two signatures:\n * mat4Eye(out) cursor form — reads current seg/f\n * mat4Eye(out, seg, t) explicit (seg, t), continuous on the path\n *\n * @param {Float32Array|number[]} out 16-element result buffer.\n * @param {number} [seg]\n * @param {number} [t]\n * @returns {Float32Array|number[]} out\n */\n mat4Eye(out, seg, t) {\n if (arguments.length < 3) [seg, t] = this._cursorSegT();\n this._sampleEyePose(_eyeScratch, seg, t);\n const e = _eyeScratch;\n return mat4Eye(out,\n e.eye[0], e.eye[1], e.eye[2],\n e.center[0], e.center[1], e.center[2],\n e.up[0], e.up[1], e.up[2]);\n }\n\n /**\n * Effective in/out eye tangents at keyframe `index`.\n */\n eyeTangents(outIn, outOut, index) {\n _sampleTangentsCore(outIn, outOut, this.keyframes, 'eye', 'eyeTanIn', 'eyeTanOut', index);\n return this;\n }\n\n /**\n * Effective in/out center tangents at keyframe `index`.\n */\n centerTangents(outIn, outOut, index) {\n _sampleTangentsCore(outIn, outOut, this.keyframes, 'center', 'centerTanIn', 'centerTanOut', index);\n return this;\n }\n\n /** @private — write interpolated { eye, center, up } at (seg, t). */\n _sampleEyePose(out, seg, t) {\n const n = this.keyframes.length;\n if (n === 0) return out;\n if (n === 1) {\n const k = this.keyframes[0];\n out.eye[0]=k.eye[0]; out.eye[1]=k.eye[1]; out.eye[2]=k.eye[2];\n out.center[0]=k.center[0]; out.center[1]=k.center[1]; out.center[2]=k.center[2];\n out.up[0]=k.up[0]; out.up[1]=k.up[1]; out.up[2]=k.up[2];\n return out;\n }\n const nSeg = n - 1;\n seg = seg | 0;\n if (seg >= nSeg) { seg = nSeg - 1; t = 1; }\n else if (seg < 0) { seg = 0; t = 0; }\n t = _clamp01(t);\n const k0 = this.keyframes[seg];\n const k1 = this.keyframes[seg + 1];\n\n _samplePathCore(out.eye, this.keyframes, this.eyeInterp, 'eye', 'eyeTanIn', 'eyeTanOut', seg, t);\n _samplePathCore(out.center, this.keyframes, this.centerInterp, 'center', 'centerTanIn', 'centerTanOut', seg, t);\n\n lerpVec3(out.up, k0.up, k1.up, t);\n const ul = Math.sqrt(out.up[0]*out.up[0]+out.up[1]*out.up[1]+out.up[2]*out.up[2]) || 1;\n out.up[0]/=ul; out.up[1]/=ul; out.up[2]/=ul;\n return out;\n }\n\n /**\n * Evaluate interpolated camera pose at current cursor.\n *\n * `fov` / `halfHeight` are lerped only when both adjacent keyframes carry\n * a non-null value; mixed entries pass `null` through so the bridge can\n * leave the projection unchanged.\n *\n * `near` / `far` are always real numbers and are linearly interpolated\n * unconditionally.\n *\n * @param {{ eye:number[], center:number[], up:number[],\n * fov:number|null, halfHeight:number|null,\n * near:number, far:number }} [out]\n * @returns {{ eye:number[], center:number[], up:number[],\n * fov:number|null, halfHeight:number|null,\n * near:number, far:number }} out\n */\n eval(out) {\n out = out || { eye:[0,0,0], center:[0,0,0], up:[0,1,0],\n fov:null, halfHeight:null,\n near:_DEFAULT_NEAR, far:_DEFAULT_FAR };\n const n = this.keyframes.length;\n if (n === 0) return out;\n if (n === 1) {\n const k = this.keyframes[0];\n this._sampleEyePose(out, 0, 0);\n out.fov = k.fov; out.halfHeight = k.halfHeight;\n out.near = k.near; out.far = k.far;\n return out;\n }\n const [seg, t] = this._cursorSegT();\n const k0 = this.keyframes[seg];\n const k1 = this.keyframes[seg + 1];\n\n this._sampleEyePose(out, seg, t);\n\n out.fov = (k0.fov != null && k1.fov != null)\n ? k0.fov + t * (k1.fov - k0.fov) : (k0.fov ?? k1.fov ?? null);\n out.halfHeight = (k0.halfHeight != null && k1.halfHeight != null)\n ? k0.halfHeight + t * (k1.halfHeight - k0.halfHeight)\n : (k0.halfHeight ?? k1.halfHeight ?? null);\n\n // near / far carry real defaults on every keyframe — always lerp.\n out.near = k0.near + t * (k1.near - k0.near);\n out.far = k0.far + t * (k1.far - k0.far);\n\n return out;\n }\n}\n\n/**\n * @file Constraint solver, canonical handle state, and ray-primitive\n * intersections for interactive manipulators.\n * @module tree/handle\n * @license AGPL-3.0-only\n *\n * The numeric brain of the manipulator handle. Renderer- and frame-agnostic:\n * inputs are plain numbers in ONE working space chosen by the caller (the\n * bridge), and the solver never learns world vs eye — it solves in whatever\n * space the ray and geometry are expressed in. The bridge converts the pointer\n * ray into the working frame before calling solve(), and converts the value\n * back out via mapLocation / mapDirection.\n *\n * Zero dependencies on p5, DOM, WebGL, or WebGPU. Out-first throughout; no\n * allocation in solve() / value(). Vectors are passed as flat scalars (matching\n * form.js), state is held as plain number[] (matching track.js keyframes).\n *\n * ── Storage convention ─────────────────────────────────────────────────────\n * The core distinguishes two value shapes deliberately:\n * mat4 — 16-element ArrayLike, typically Float32Array, because matrices\n * cross the GL boundary (contiguous f32 is what the renderer wants).\n * vec3 / quat — plain number[] (f64), because they are authoring/state values\n * and because the frozen basis-vector constants (i, j, k, ORIGIN)\n * cannot be expressed as frozen typed arrays. Handle state follows\n * the vec3 rule.\n *\n * ── Constraint kinds ───────────────────────────────────────────────────────\n * SPHERE 2-DOF heading on a sphere of radius r about an anchor.\n * Canonical state is a UNIT DIRECTION (renormalised every solve) —\n * no stored Euler angles, so no gimbal degeneracy at the poles.\n * az/el are derived on request via azEl().\n * PLANE 2-DOF point on a fixed plane (anchor + unit normal).\n * AXIS 1-DOF point on a line (anchor + unit dir), scalar t clamped to extent.\n * DIAL 1-DOF angle on a circle of radius r in the plane (anchor, axis).\n * Canonical state is an ACCUMULATED angle θ (multi-turn winding is\n * preserved: each solve applies the smaller signed arc, so θ counts\n * full turns — essential for bind targets like \"rotate this 720°\").\n * θ=0 sits at the reference direction `zero` (derived from the axis\n * when not supplied); θ grows right-handed about the axis. Near\n * edge-on view (the ray almost parallel to the dial plane, where a\n * plane hit races to infinity — the classic rotate-gizmo failure)\n * the solve falls back to the TANGENT LINE of the circle at the\n * current angle, converting linear drag to dθ: bounded, monotone,\n * and still pure ray geometry.\n *\n * VIEW (the camera-facing free-translate constraint) is NOT a core kind: the\n * bridge implements it with PLANE, feeding a fresh camera-derived normal and\n * anchor each frame. The core stays oblivious to the camera.\n *\n * ── Report modes ───────────────────────────────────────────────────────────\n * DIRECTION value() writes the unit direction: SPHERE → the heading;\n * DIAL → the radial unit at θ.\n * POINT value() writes a position: SPHERE → anchor + dir·radius;\n * DIAL → the point on the circle; PLANE / AXIS → the constrained\n * point.\n *\n * ── State ownership & portability ──────────────────────────────────────────\n * Each Constraint owns its own state; there is no module-level scratch. solve()\n * writes into instance fields, never shared globals. This keeps the type a\n * plain-data state machine: it ports 1:1 to a Rust enum + impl that is\n * `Send + Sync` for free, with `&mut self` on solve() making concurrent\n * mutation a compile error. The binding closure deliberately lives in the\n * bridge, not here — a stored callback would forfeit that guarantee.\n *\n * ── Extension contract ─────────────────────────────────────────────────────\n * A constraint is any object exposing: `kind` (integer discriminant),\n * `solve(ox,oy,oz, dx,dy,dz)`, `value(out, report)`, `seed(x,y,z)`, and\n * optionally `scalar()` / `azEl(out2)` / `aim(ax,ay,az[, zx,zy,zz])` — the\n * basis re-aim seam the bridge's deferred `from` frame drives — and\n * `proxy(ox,oy,oz, dx,dy,dz, radius)`, the analytic pick: the ray parameter\n * at which a ray in the working space meets the grab proxy of `radius`\n * working units, or Infinity (a kind without one gets a sphere at its\n * POINT). The handle controller drives any conforming constraint\n * (lifecycle, frame conversion, bind, hooks, pick); a new kind — 6-DOF, or\n * app-specific — implements this contract here (portable, draw-free) plus a\n * bridge-side locus draw, rather than forking the controller. The classes\n * below are the reference implementation. See handle-design.md §9–§10.\n *\n * ── Conventions ────────────────────────────────────────────────────────────\n * Ray direction `d` is assumed unit (the bridge normalises). Plane / axis\n * normals and directions are normalised at construction. The angular utilities\n * use a right-handed convention: az about +Y, el measured from the XZ plane.\n * solve() does NOT depend on this convention — it stores the hit direction\n * directly; az/el are a readout/authoring convenience only. DIAL's θ is\n * right-handed about its own axis, measured from `zero`.\n */\n\n\nconst EPS = 1e-6;\nconst TWO_PI$1 = Math.PI * 2;\n\n// Edge-on threshold for DIAL: below this |d·n| the plane hit is ill-conditioned\n// (dθ per pixel diverges) and the solve switches to the tangent-line fallback.\n// ≈ 4.6° of incidence. Tune empirically (handle-experiments/e2).\nconst DIAL_EDGE = 0.08;\n\n// =========================================================================\n// H1 Small private helpers\n// =========================================================================\n\nconst _isNum = (x) => typeof x === 'number' && Number.isFinite(x);\nconst _clamp = (x, lo, hi) => x < lo ? lo : (x > hi ? hi : x);\nconst _num = (x, d) => _isNum(x) ? x : d;\n\n/** Wrap an angle to (−π, π]. */\nconst _wrapPi = (a) => a - TWO_PI$1 * Math.round(a / TWO_PI$1);\n\n/** Parse a vec3 from array / typed array / {x,y,z}. Returns a fresh [x,y,z] or null. */\nfunction _vec3$1(v) {\n if (!v) return null;\n if (ArrayBuffer.isView(v) && v.length >= 3) return [v[0], v[1], v[2]];\n if (Array.isArray(v) && v.length >= 3) return [v[0], v[1], v[2]];\n if (typeof v === 'object' && 'x' in v) return [v.x || 0, v.y || 0, v.z || 0];\n return null;\n}\n\n/** Normalise a vec3 in place; zero-length falls back to the given default axis. */\nfunction _unit$1(v, dx, dy, dz) {\n const l = Math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);\n if (l < EPS) { v[0]=dx; v[1]=dy; v[2]=dz; return v; }\n v[0]/=l; v[1]/=l; v[2]/=l;\n return v;\n}\n\n/**\n * Orthonormal in-plane basis for a unit normal n, written into ub, vb. Seeds\n * from the world axis least aligned with n so the first cross can't degenerate.\n * (Same derivation the p5 bridge uses for its plane quad — duplicated here\n * because the core cannot depend on the bridge.)\n */\nfunction _basis$1(n, ub, vb) {\n const ax = Math.abs(n[0]), ay = Math.abs(n[1]), az = Math.abs(n[2]);\n let rx = 0, ry = 0, rz = 0;\n if (ax <= ay && ax <= az) rx = 1; else if (ay <= az) ry = 1; else rz = 1;\n ub[0] = ry*n[2] - rz*n[1]; ub[1] = rz*n[0] - rx*n[2]; ub[2] = rx*n[1] - ry*n[0];\n _unit$1(ub, 1, 0, 0);\n vb[0] = n[1]*ub[2] - n[2]*ub[1]; vb[1] = n[2]*ub[0] - n[0]*ub[2]; vb[2] = n[0]*ub[1] - n[1]*ub[0];\n}\n\n// =========================================================================\n// H2 Ray-primitive intersections (pure, out-first, scalar params)\n// =========================================================================\n\n/**\n * Nearest ray–sphere intersection. The ray direction is assumed unit, so the\n * quadratic's leading coefficient is 1. On a miss, writes the closest-approach\n * point projected onto the sphere (so the handle tracks the limb gracefully\n * rather than snapping away).\n *\n * @param {number[]} out 3-element destination (hit point).\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} cx,cy,cz Sphere centre.\n * @param {number} r Sphere radius.\n * @returns {number} Ray parameter t at the written hit.\n */\nfunction raySphere(out, ox,oy,oz, dx,dy,dz, cx,cy,cz, r) {\n const lx=ox-cx, ly=oy-cy, lz=oz-cz;\n const b = lx*dx + ly*dy + lz*dz;\n const cc = lx*lx + ly*ly + lz*lz - r*r;\n const disc = b*b - cc;\n let t;\n if (disc >= 0) {\n const s = Math.sqrt(disc);\n t = -b - s;\n if (t < 0) t = -b + s; // origin inside the sphere: take far root\n out[0]=ox+t*dx; out[1]=oy+t*dy; out[2]=oz+t*dz;\n } else {\n t = -b; // closest approach along the ray\n let hx=ox+t*dx-cx, hy=oy+t*dy-cy, hz=oz+t*dz-cz;\n const hl = Math.sqrt(hx*hx + hy*hy + hz*hz) || 1;\n const k = r/hl;\n out[0]=cx+hx*k; out[1]=cy+hy*k; out[2]=cz+hz*k;\n }\n return t;\n}\n\n/**\n * Ray–plane intersection. A near-parallel ray (|d·n| < EPS) returns Infinity\n * and leaves `out` untouched — the caller keeps the previous value.\n *\n * @param {number[]} out 3-element destination (hit point).\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} px,py,pz A point on the plane.\n * @param {number} nx,ny,nz Plane normal (unit).\n * @returns {number} Ray parameter t, or Infinity if parallel.\n */\nfunction rayPlane(out, ox,oy,oz, dx,dy,dz, px,py,pz, nx,ny,nz) {\n const den = dx*nx + dy*ny + dz*nz;\n if (den < EPS && den > -EPS) return Infinity;\n const t = ((px-ox)*nx + (py-oy)*ny + (pz-oz)*nz) / den;\n out[0]=ox+t*dx; out[1]=oy+t*dy; out[2]=oz+t*dz;\n return t;\n}\n\n/**\n * Closest point on the infinite line (p, u) to the ray (o, d). Both `d` and\n * `u` are assumed unit. For a ray parallel to the line, projects the ray\n * origin onto the line.\n *\n * @param {number[]} out 3-element destination (closest point on the line).\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} px,py,pz A point on the line.\n * @param {number} ux,uy,uz Line direction (unit).\n * @returns {number} Signed parameter s along u at the written point (unclamped).\n */\nfunction rayClosestPointOnAxis(out, ox,oy,oz, dx,dy,dz, px,py,pz, ux,uy,uz) {\n const wx=ox-px, wy=oy-py, wz=oz-pz;\n const b = dx*ux + dy*uy + dz*uz; // d·u\n const dd = dx*wx + dy*wy + dz*wz; // d·w\n const e = ux*wx + uy*wy + uz*wz; // u·w\n const den = 1 - b*b; // (d·d)(u·u) − (d·u)² with d,u unit\n const s = (den > EPS) ? (e - b*dd) / den : e;\n out[0]=px+s*ux; out[1]=py+s*uy; out[2]=pz+s*uz;\n return s;\n}\n\n// =========================================================================\n// H2b Ray-primitive hit tests (pure, no out: the nearest t, or Infinity)\n// =========================================================================\n//\n// Beside the solve primitives above, which always write a point, these are\n// TESTS: they write nothing and return the ray parameter of the nearest hit\n// with t ≥ 0, or Infinity on a miss. A ray whose origin lies inside the\n// primitive hits at its exit, so a press from inside a proxy still grabs.\n// The ray direction is assumed unit.\n\n/**\n * Ray–sphere hit test.\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} cx,cy,cz Sphere centre.\n * @param {number} r Sphere radius.\n * @returns {number} The nearest t ≥ 0, or Infinity.\n */\nfunction rayHitSphere(ox,oy,oz, dx,dy,dz, cx,cy,cz, r) {\n const lx=ox-cx, ly=oy-cy, lz=oz-cz;\n const b = lx*dx + ly*dy + lz*dz;\n const cc = lx*lx + ly*ly + lz*lz - r*r;\n const disc = b*b - cc;\n if (disc < 0) return Infinity;\n const s = Math.sqrt(disc);\n let t = -b - s;\n if (t < 0) t = -b + s; // origin inside: the exit\n return t < 0 ? Infinity : t; // both roots behind the origin\n}\n\n// One end cap of a capsule: the sphere at (cx,cy,cz), a root accepted only\n// where the hit's axial coordinate h = wu + t·du lies beyond the segment on\n// that cap's side (h ≤ 0 at A, h ≥ L at B), so the point is on the capsule's\n// surface and not inside its cylinder.\nfunction _capHit(ox,oy,oz, dx,dy,dz, cx,cy,cz, r, wu, du, lim, endB) {\n const lx=ox-cx, ly=oy-cy, lz=oz-cz;\n const b = lx*dx + ly*dy + lz*dz;\n const cc = lx*lx + ly*ly + lz*lz - r*r;\n const disc = b*b - cc;\n if (disc < 0) return Infinity;\n const s = Math.sqrt(disc);\n let t = -b - s, h = wu + t*du;\n if (t < 0 || (endB ? h < lim : h > lim)) { t = -b + s; h = wu + t*du; }\n return (t >= 0 && (endB ? h >= lim : h <= lim)) ? t : Infinity;\n}\n\n/**\n * Ray–capsule hit test: the segment A→B swept by radius r. The cylinder wall\n * counts within the segment's extent, each end sphere beyond it; the nearest\n * of the three wins. A zero-length segment is the sphere at A.\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} ax,ay,az Segment start.\n * @param {number} bx,by,bz Segment end.\n * @param {number} r Capsule radius.\n * @returns {number} The nearest t ≥ 0, or Infinity.\n */\nfunction rayHitCapsule(ox,oy,oz, dx,dy,dz, ax,ay,az, bx,by,bz, r) {\n let ux=bx-ax, uy=by-ay, uz=bz-az;\n const L = Math.sqrt(ux*ux + uy*uy + uz*uz);\n if (L < EPS) return rayHitSphere(ox,oy,oz, dx,dy,dz, ax,ay,az, r);\n ux/=L; uy/=L; uz/=L;\n const wx=ox-ax, wy=oy-ay, wz=oz-az;\n const du = dx*ux + dy*uy + dz*uz; // d·u\n const wu = wx*ux + wy*uy + wz*uz; // w·u\n let best = Infinity;\n // Cylinder wall: the quadratic in the components perpendicular to u.\n const a = 1 - du*du;\n if (a > EPS) {\n const b = (dx*wx + dy*wy + dz*wz) - du*wu;\n const c = (wx*wx + wy*wy + wz*wz) - wu*wu - r*r;\n const disc = b*b - a*c;\n if (disc >= 0) {\n const s = Math.sqrt(disc);\n let t = (-b - s)/a, h = wu + t*du;\n if (t < 0 || h < 0 || h > L) { t = (-b + s)/a; h = wu + t*du; }\n if (t >= 0 && h >= 0 && h <= L) best = t;\n }\n }\n const ta = _capHit(ox,oy,oz, dx,dy,dz, ax,ay,az, r, wu, du, 0, false);\n if (ta < best) best = ta;\n const tb = _capHit(ox,oy,oz, dx,dy,dz, bx,by,bz, r, wu, du, L, true);\n if (tb < best) best = tb;\n return best;\n}\n\n// Ring scratch — the plane normal and its in-plane basis. Function-local\n// working values, never state: rayHitRing runs to completion.\nconst _rn = [0, 0, 1], _r0 = [1, 0, 0], _r1 = [0, 1, 0];\n\n/**\n * Ray–ring hit test: the circle of radius R about c in the plane\n * perpendicular to u, swept by tube radius r — the analytic torus proxy as a\n * capsule chain, the circle polygonised into `detail` segments and each\n * tested with rayHitCapsule. The chain has volume in every direction, so it\n * never degenerates edge-on; the chordal error is R · (1 − cos(π / detail)).\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} cx,cy,cz Ring centre.\n * @param {number} ux,uy,uz Ring plane normal (normalised here).\n * @param {number} R Ring radius.\n * @param {number} r Tube radius.\n * @param {number} [detail=32] Chain segments (at least 3).\n * @returns {number} The nearest t ≥ 0, or Infinity.\n */\nfunction rayHitRing(ox,oy,oz, dx,dy,dz, cx,cy,cz, ux,uy,uz, R, r, detail = 32) {\n const n = _isNum(detail) && detail >= 3 ? Math.floor(detail) : 32;\n _rn[0]=ux; _rn[1]=uy; _rn[2]=uz;\n _unit$1(_rn, 0, 0, 1);\n _basis$1(_rn, _r0, _r1);\n const step = TWO_PI$1 / n;\n let best = Infinity;\n let ax = cx + R*_r0[0], ay = cy + R*_r0[1], az = cz + R*_r0[2]; // vertex at angle 0\n for (let i = 1; i <= n; i++) {\n const th = i === n ? 0 : i*step; // close the chain exactly\n const cs = Math.cos(th)*R, sn = Math.sin(th)*R;\n const bx = cx + cs*_r0[0] + sn*_r1[0];\n const by = cy + cs*_r0[1] + sn*_r1[1];\n const bz = cz + cs*_r0[2] + sn*_r1[2];\n const t = rayHitCapsule(ox,oy,oz, dx,dy,dz, ax,ay,az, bx,by,bz, r);\n if (t < best) best = t;\n ax = bx; ay = by; az = bz;\n }\n return best;\n}\n\n// =========================================================================\n// H3 Angular utilities (readout / authoring convenience)\n// =========================================================================\n\n/**\n * Unit direction from azimuth/elevation (right-handed: az about +Y, el from XZ).\n * @param {number[]} out 3-element destination.\n * @param {number} az Azimuth (radians).\n * @param {number} el Elevation (radians).\n * @returns {number[]} out\n */\nfunction dirFromAzEl(out, az, el) {\n const ce = Math.cos(el);\n out[0]=ce*Math.cos(az); out[1]=Math.sin(el); out[2]=ce*Math.sin(az);\n return out;\n}\n\n/**\n * Azimuth/elevation from a unit direction. Inverse of dirFromAzEl.\n * @param {number[]} out2 2-element destination [az, el] (radians).\n * @param {number} dx,dy,dz Unit direction.\n * @returns {number[]} out2\n */\nfunction azElFromDir(out2, dx, dy, dz) {\n out2[0] = Math.atan2(dz, dx); // az\n out2[1] = Math.asin(_clamp(dy, -1, 1)); // el\n return out2;\n}\n\n// =========================================================================\n// H4 Constraint — tagged state machine (one class, kind discriminant)\n// =========================================================================\n\n/**\n * A draggable constraint: maps a ray to a constrained value and holds the\n * canonical state between drags. One class with a `kind` discriminant (never\n * per-constraint subclasses) so it maps cleanly to a Rust enum.\n *\n * Construction options (all optional unless noted):\n * SPHERE — { radius = 1, report = DIRECTION, anchor = [0,0,0] }\n * PLANE — { anchor = [0,0,0], normal = [0,1,0] }\n * AXIS — { anchor = [0,0,0], axis = [1,0,0], extent = [-1, 1] }\n * DIAL — { anchor = [0,0,0], axis = [0,1,0], radius = 1, zero?,\n * extent = [-∞, ∞] }\n * `axis` is the dial-plane normal (θ is right-handed about it);\n * `zero` is the in-plane reference direction for θ=0 (projected\n * onto the plane and normalised; derived from the axis when\n * absent); `extent` clamps θ in radians — unbounded by default,\n * so the dial winds multiple turns.\n *\n * @param {number} kind SPHERE | PLANE | AXIS | DIAL.\n * @param {Object} [opts]\n */\nclass Constraint {\n constructor(kind, opts = {}) {\n /** Constraint kind discriminant. @type {number} */\n this.kind = kind;\n\n /** Constraint origin (sphere centre / plane point / axis anchor / dial centre). @type {number[]} */\n this.anchor = _vec3$1(opts.anchor) || [0, 0, 0];\n /** Canonical unit direction — SPHERE. @type {number[]} */\n this.dir = [0, 0, 1];\n /** Constrained point — PLANE / AXIS / DIAL (and SPHERE scratch). @type {number[]} */\n this.pt = [this.anchor[0], this.anchor[1], this.anchor[2]];\n /** Plane normal (unit) — PLANE. @type {number[]} */\n this.n = _unit$1(_vec3$1(opts.normal) || [0, 1, 0], 0, 1, 0);\n /** Axis / dial-plane normal (unit) — AXIS / DIAL. @type {number[]} */\n this.u = kind === DIAL\n ? _unit$1(_vec3$1(opts.axis) || [0, 1, 0], 0, 1, 0)\n : _unit$1(_vec3$1(opts.axis) || [1, 0, 0], 1, 0, 0);\n /** Current scalar parameter — AXIS: t along the line; DIAL: accumulated θ. @type {number} */\n this.s = 0;\n\n // DIAL in-plane basis: r0 (the θ=0 reference) and r1 = u × r0, so the\n // point at θ is anchor + radius·(cosθ·r0 + sinθ·r1) — right-handed about u.\n /** θ=0 reference direction (unit, in-plane) — DIAL. @type {number[]} */\n this.r0 = [1, 0, 0];\n /** In-plane binormal u × r0 (unit) — DIAL. @type {number[]} */\n this.r1 = [0, 0, 1];\n if (kind === DIAL) {\n const z = _vec3$1(opts.zero);\n this._dialBasis(z ? z[0] : NaN, z ? z[1] : NaN, z ? z[2] : NaN);\n }\n\n // Extent: AXIS clamps t (default [-1, 1]); DIAL clamps θ in radians\n // (default unbounded, so the dial winds freely).\n const ext = Array.isArray(opts.extent) ? opts.extent : null;\n const dial = kind === DIAL;\n /** Minimum scalar parameter. @type {number} */\n this.min = ext && _isNum(ext[0]) ? ext[0] : (dial ? -Infinity : -1);\n /** Maximum scalar parameter. @type {number} */\n this.max = ext && _isNum(ext[1]) ? ext[1] : (dial ? Infinity : 1);\n\n // Sphere / dial radius (private backing — see radius getter/setter).\n this._radius = _num(opts.radius, 1);\n\n /**\n * Default report mode. SPHERE defaults to DIRECTION; PLANE / AXIS / DIAL\n * report a POINT.\n * @type {number}\n */\n this.report = (opts.report === POINT || opts.report === DIRECTION)\n ? opts.report\n : (kind === SPHERE ? DIRECTION : POINT);\n\n if (kind === DIAL) this._dialPoint();\n }\n\n /** Sphere / dial radius. @type {number} */\n get radius() { return this._radius; }\n set radius(r) { this._radius = _isNum(r) ? r : this._radius; if (this.kind === DIAL) this._dialPoint(); }\n\n // Recompute the DIAL point from θ (anchor + ρ(cosθ·r0 + sinθ·r1)).\n _dialPoint() {\n const c = Math.cos(this.s) * this._radius, sn = Math.sin(this.s) * this._radius;\n this.pt[0] = this.anchor[0] + c*this.r0[0] + sn*this.r1[0];\n this.pt[1] = this.anchor[1] + c*this.r0[1] + sn*this.r1[1];\n this.pt[2] = this.anchor[2] + c*this.r0[2] + sn*this.r1[2];\n }\n\n // Build the DIAL in-plane basis (r0, r1) from the current axis u and an\n // optional θ=0 reference (zx,zy,zz): the reference is projected onto the\n // dial plane and normalised; absent (NaN) or degenerate, r0 derives from u\n // via the least-aligned-axis seed. r1 = u × r0, right-handed about u.\n _dialBasis(zx, zy, zz) {\n if (_isNum(zx) && _isNum(zy) && _isNum(zz)) {\n const d = zx*this.u[0] + zy*this.u[1] + zz*this.u[2];\n this.r0[0] = zx - d*this.u[0];\n this.r0[1] = zy - d*this.u[1];\n this.r0[2] = zz - d*this.u[2];\n const l = Math.sqrt(this.r0[0]**2 + this.r0[1]**2 + this.r0[2]**2);\n if (l < EPS) _basis$1(this.u, this.r0, this.r1);\n else { this.r0[0]/=l; this.r0[1]/=l; this.r0[2]/=l; }\n } else {\n _basis$1(this.u, this.r0, this.r1);\n }\n // r1 = u × r0 (recomputed even when _basis ran — same result, one rule).\n this.r1[0] = this.u[1]*this.r0[2] - this.u[2]*this.r0[1];\n this.r1[1] = this.u[2]*this.r0[0] - this.u[0]*this.r0[2];\n this.r1[2] = this.u[0]*this.r0[1] - this.u[1]*this.r0[0];\n }\n\n /**\n * Update the canonical state from a ray in the working space. The ray\n * direction is assumed unit. Chainable.\n *\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @returns {Constraint} this\n */\n solve(ox, oy, oz, dx, dy, dz) {\n if (this.kind === SPHERE) {\n // Hit the sphere into pt, then derive the unit heading from the anchor.\n raySphere(this.pt, ox,oy,oz, dx,dy,dz,\n this.anchor[0], this.anchor[1], this.anchor[2], this._radius);\n this.dir[0] = this.pt[0] - this.anchor[0];\n this.dir[1] = this.pt[1] - this.anchor[1];\n this.dir[2] = this.pt[2] - this.anchor[2];\n _unit$1(this.dir, this.dir[0], this.dir[1], this.dir[2]);\n } else if (this.kind === PLANE) {\n // Parallel ray returns Infinity and leaves pt unchanged (keep last).\n rayPlane(this.pt, ox,oy,oz, dx,dy,dz,\n this.anchor[0], this.anchor[1], this.anchor[2],\n this.n[0], this.n[1], this.n[2]);\n } else if (this.kind === AXIS) {\n let s = rayClosestPointOnAxis(this.pt, ox,oy,oz, dx,dy,dz,\n this.anchor[0], this.anchor[1], this.anchor[2],\n this.u[0], this.u[1], this.u[2]);\n s = _clamp(s, this.min, this.max);\n this.s = s;\n this.pt[0] = this.anchor[0] + s*this.u[0]; // clamped point\n this.pt[1] = this.anchor[1] + s*this.u[1];\n this.pt[2] = this.anchor[2] + s*this.u[2];\n } else if (this.kind === DIAL) {\n this._solveDial(ox, oy, oz, dx, dy, dz);\n }\n return this;\n }\n\n // DIAL solve. Face-on: hit the dial plane, derive the raw angle of the hit\n // about the anchor, and accumulate the smaller signed arc into θ (winding\n // preserved). Edge-on (|d·u| < DIAL_EDGE): the plane hit diverges, so solve\n // the ray against the TANGENT LINE of the circle at the current θ instead —\n // the signed tangent parameter over the radius is dθ, bounded and monotone.\n _solveDial(ox, oy, oz, dx, dy, dz) {\n const u = this.u, r0 = this.r0, r1 = this.r1, a = this.anchor;\n const den = dx*u[0] + dy*u[1] + dz*u[2];\n let dth;\n if (den >= DIAL_EDGE || den <= -DIAL_EDGE) {\n // Well-conditioned: plane hit → raw angle → smaller signed arc.\n const t = rayPlane(this.pt, ox,oy,oz, dx,dy,dz,\n a[0], a[1], a[2], u[0], u[1], u[2]);\n if (t === Infinity) return; // keep last (paranoia; den guards)\n const vx = this.pt[0]-a[0], vy = this.pt[1]-a[1], vz = this.pt[2]-a[2];\n const raw = Math.atan2(vx*r1[0] + vy*r1[1] + vz*r1[2],\n vx*r0[0] + vy*r0[1] + vz*r0[2]);\n dth = _wrapPi(raw - _wrapPi(this.s));\n } else {\n // Edge-on fallback: tangent at the current point, w = −sinθ·r0 + cosθ·r1.\n const cs = Math.cos(this.s), sn = Math.sin(this.s);\n const wx = -sn*r0[0] + cs*r1[0];\n const wy = -sn*r0[1] + cs*r1[1];\n const wz = -sn*r0[2] + cs*r1[2];\n this._dialPoint(); // tangent anchored at the current point\n const sl = rayClosestPointOnAxis(this.pt, ox,oy,oz, dx,dy,dz,\n this.pt[0], this.pt[1], this.pt[2],\n wx, wy, wz);\n dth = sl / (this._radius || 1);\n }\n this.s = _clamp(this.s + dth, this.min, this.max);\n this._dialPoint();\n }\n\n /**\n * Write the current value into `out`. `report` overrides the default for\n * this call (e.g. read a SPHERE's point even when its default is DIRECTION).\n * SPHERE+POINT and DIAL+POINT are derived from the angle/heading and the\n * live radius, so they stay correct after a radius change without\n * re-solving. DIAL+DIRECTION writes the radial unit at θ.\n *\n * @param {number[]} out 3-element destination.\n * @param {number} [report] POINT | DIRECTION override.\n * @returns {number[]} out\n */\n value(out, report) {\n const r = (report === POINT || report === DIRECTION) ? report : this.report;\n if (this.kind === SPHERE) {\n if (r === DIRECTION) {\n out[0]=this.dir[0]; out[1]=this.dir[1]; out[2]=this.dir[2];\n } else {\n out[0]=this.anchor[0]+this.dir[0]*this._radius;\n out[1]=this.anchor[1]+this.dir[1]*this._radius;\n out[2]=this.anchor[2]+this.dir[2]*this._radius;\n }\n } else if (this.kind === DIAL) {\n const cs = Math.cos(this.s), sn = Math.sin(this.s);\n if (r === DIRECTION) {\n out[0]=cs*this.r0[0]+sn*this.r1[0];\n out[1]=cs*this.r0[1]+sn*this.r1[1];\n out[2]=cs*this.r0[2]+sn*this.r1[2];\n } else {\n out[0]=this.anchor[0]+(cs*this.r0[0]+sn*this.r1[0])*this._radius;\n out[1]=this.anchor[1]+(cs*this.r0[1]+sn*this.r1[1])*this._radius;\n out[2]=this.anchor[2]+(cs*this.r0[2]+sn*this.r1[2])*this._radius;\n }\n } else {\n out[0]=this.pt[0]; out[1]=this.pt[1]; out[2]=this.pt[2];\n }\n return out;\n }\n\n /**\n * Current scalar parameter: AXIS → signed t along the line; DIAL →\n * accumulated angle θ in radians (multi-turn).\n * @returns {number} The parameter, or NaN for non-scalar constraints.\n */\n scalar() {\n return (this.kind === AXIS || this.kind === DIAL) ? this.s : NaN;\n }\n\n /**\n * Derive [az, el] from the current SPHERE direction (SPHERE only).\n * @param {number[]} out2 2-element destination [az, el].\n * @returns {number[]} out2\n */\n azEl(out2) {\n return azElFromDir(out2, this.dir[0], this.dir[1], this.dir[2]);\n }\n\n /**\n * Seed the canonical state from a value (used by the bridge on bind() so the\n * handle starts at the bound target's value). Chainable.\n * SPHERE — sets the unit direction (a point value recovers its heading).\n * PLANE — projects the value onto the plane.\n * AXIS — projects the value onto the line, clamped to extent.\n * DIAL — projects the value onto the dial plane, derives the wrapped\n * angle, and picks the WINDING NEAREST the current θ (so an\n * external sync doesn't unwind accumulated turns), clamped.\n *\n * @param {number} x,y,z Seed value.\n * @returns {Constraint} this\n */\n seed(x, y, z) {\n if (this.kind === SPHERE) {\n const vx=x-this.anchor[0], vy=y-this.anchor[1], vz=z-this.anchor[2];\n const l = Math.sqrt(vx*vx + vy*vy + vz*vz);\n if (l >= EPS) { this.dir[0]=vx/l; this.dir[1]=vy/l; this.dir[2]=vz/l; }\n } else if (this.kind === PLANE) {\n const wx=x-this.anchor[0], wy=y-this.anchor[1], wz=z-this.anchor[2];\n const d = wx*this.n[0] + wy*this.n[1] + wz*this.n[2];\n this.pt[0]=x-d*this.n[0]; this.pt[1]=y-d*this.n[1]; this.pt[2]=z-d*this.n[2];\n } else if (this.kind === AXIS) {\n const wx=x-this.anchor[0], wy=y-this.anchor[1], wz=z-this.anchor[2];\n const s = _clamp(wx*this.u[0] + wy*this.u[1] + wz*this.u[2], this.min, this.max);\n this.s = s;\n this.pt[0]=this.anchor[0]+s*this.u[0];\n this.pt[1]=this.anchor[1]+s*this.u[1];\n this.pt[2]=this.anchor[2]+s*this.u[2];\n } else if (this.kind === DIAL) {\n const wx=x-this.anchor[0], wy=y-this.anchor[1], wz=z-this.anchor[2];\n const px = wx*this.r0[0] + wy*this.r0[1] + wz*this.r0[2];\n const py = wx*this.r1[0] + wy*this.r1[1] + wz*this.r1[2];\n if (px*px + py*py >= EPS*EPS) {\n const a = Math.atan2(py, px);\n // Nearest winding to the current θ preserves accumulated turns.\n this.s = _clamp(a + TWO_PI$1 * Math.round((this.s - a) / TWO_PI$1),\n this.min, this.max);\n }\n this._dialPoint();\n }\n return this;\n }\n\n /**\n * Re-aim the constraint basis in the working space — the deferred-frame\n * seam (the p5.tree bridge's `from` opt resolves its symbolic basis through\n * mapDirection and calls this). Per kind:\n * PLANE — new normal; the point is re-projected onto the new plane.\n * AXIS — new direction; the scalar t is preserved, the point recomputed.\n * DIAL — new plane normal + optional θ=0 reference; θ is preserved, the\n * in-plane basis rebuilt (reference re-derived when omitted),\n * the point recomputed.\n * SPHERE — no basis; no-op.\n * Inputs are normalised; a zero-length axis keeps the previous one.\n * Chainable.\n *\n * @param {number} ax,ay,az New normal (PLANE) / direction (AXIS) / dial-plane normal (DIAL).\n * @param {number} [zx,zy,zz] DIAL only — θ=0 reference (re-derived when omitted).\n * @returns {Constraint} this\n */\n aim(ax, ay, az, zx, zy, zz) {\n if (this.kind === PLANE) {\n const px = this.n[0], py = this.n[1], pz = this.n[2];\n this.n[0] = ax; this.n[1] = ay; this.n[2] = az;\n _unit$1(this.n, px, py, pz);\n this.seed(this.pt[0], this.pt[1], this.pt[2]);\n } else if (this.kind === AXIS) {\n const px = this.u[0], py = this.u[1], pz = this.u[2];\n this.u[0] = ax; this.u[1] = ay; this.u[2] = az;\n _unit$1(this.u, px, py, pz);\n this.pt[0] = this.anchor[0] + this.s*this.u[0];\n this.pt[1] = this.anchor[1] + this.s*this.u[1];\n this.pt[2] = this.anchor[2] + this.s*this.u[2];\n } else if (this.kind === DIAL) {\n const px = this.u[0], py = this.u[1], pz = this.u[2];\n this.u[0] = ax; this.u[1] = ay; this.u[2] = az;\n _unit$1(this.u, px, py, pz);\n this._dialBasis(zx, zy, zz);\n this._dialPoint();\n }\n return this;\n }\n\n /**\n * The analytic pick proxy: the ray parameter t at which a ray in the\n * working space meets the grab proxy, or Infinity. `radius` is the grab\n * size in working-space units — a constant pixel size the caller converted\n * through pixelRatio at the proxy's depth. SPHERE / PLANE / AXIS: a sphere\n * of `radius` at the reported POINT. DIAL: the ring at the anchor with\n * tube radius `radius` (rayHitRing), so a grab lands anywhere on the ring.\n *\n * @param {number} ox,oy,oz Ray origin.\n * @param {number} dx,dy,dz Ray direction (unit).\n * @param {number} radius Grab radius, working units.\n * @returns {number} The nearest t ≥ 0, or Infinity.\n */\n proxy(ox, oy, oz, dx, dy, dz, radius) {\n const a = this.anchor;\n if (this.kind === DIAL) {\n return rayHitRing(ox,oy,oz, dx,dy,dz, a[0], a[1], a[2],\n this.u[0], this.u[1], this.u[2], this._radius, radius);\n }\n let px, py, pz;\n if (this.kind === SPHERE) {\n px = a[0] + this.dir[0]*this._radius;\n py = a[1] + this.dir[1]*this._radius;\n pz = a[2] + this.dir[2]*this._radius;\n } else {\n px = this.pt[0]; py = this.pt[1]; pz = this.pt[2];\n }\n return rayHitSphere(ox,oy,oz, dx,dy,dz, px,py,pz, radius);\n }\n}\n\n/**\n * Convenience factory mirroring the constructor. Handy for headless tests and\n * for the bridge, which otherwise calls `new Constraint(...)` directly.\n * @param {number} kind SPHERE | PLANE | AXIS | DIAL.\n * @param {Object} [opts]\n * @returns {Constraint}\n */\nfunction createConstraint(kind, opts) {\n return new Constraint(kind, opts);\n}\n\n/**\n * @file Source-agnostic 6-DOF pose helm — integrates a live rate stream into a\n * { pos, rot } pose. Renderer- and transport-agnostic. Zero dependencies.\n * @module tree/helm\n * @license AGPL-3.0-only\n *\n * A helm is the rate-stream sibling of the Track family: where a Track produces\n * a pose from keyframes over time, a helm produces a pose from a live 6-DOF\n * delta stream (a SpaceNavigator, a tracked hand, an agent policy). It is NOT a\n * handle — a handle reports a `vec3` solved from a pointer ray; a helm reports a\n * pose (position + orientation).\n *\n * Family placement (peer of PoseTrack, NOT a Track subclass — no timeline):\n * feed(translation, rotation) push the latest raw device rate (input, as Track.add)\n * step(out, dt, basis) integrate the rate by dt into the pose (BRIDGE-DRIVEN,\n * as Track.tick) — writes the new pose into out\n * eval(out) read the current { pos, rot } (zero-alloc, as Track.eval)\n * home(pose?) re-home the integrated pose (NOT reset — no keyframes to clear)\n *\n * Value layer (opt-in, §10): a per-helm `fullScale` keeps the read-outs honest\n * across input scales; an opt-in `filter` (oneEuro) conditions the fed rates\n * before the deadzone inside step; `poseDelta` differences two absolute poses\n * into a feedable rate. With `filter` null and the default `fullScale`, the\n * clean rate-native path is unchanged.\n *\n * Quaternion algebra is provided by quat.js. Out-first throughout; no allocation\n * in feed/step/eval. Storage convention (matches the rest of the core): vec3 and\n * quat state are plain number[] (f64) — the same shape as track.js keyframes and\n * the frozen basis-vector constants.\n *\n * ── Frame discipline (`from` / `basis`) ──────────────────────────────────────\n * The space the rates are interpreted in is named by `from` (WORLD | EYE | mat4),\n * a declaration the BRIDGE reads — the core never learns about a camera. The\n * resolved orientation arrives per-step as `basis`: an eye→world mat4 (or null\n * for WORLD ≡ the identity basis). Both the linear and angular rates are rotated\n * through that basis, then the quaternion is composed world-frame. This is the\n * single code path that covers both manipulation conventions:\n *\n * - camera body-fly — basis is the driven camera's own eye matrix (which this\n * helm produced last frame ⇒ equals the integrated `q`,\n * zero staleness); rotating a body delta through `q` then\n * world-composing is algebraically a body-frame compose.\n * - screen-relative — basis is the *viewing* camera's eye matrix (an external\n * frame); a push moves the target relative to the screen.\n *\n * Per-channel `from` ({ translation, rotation }) is a deferred, non-breaking\n * extension (one basis suffices today — pose-helm-design.md §8.3).\n */\n\n\n// =========================================================================\n// Module-level scratch — shared across helm instances (non-reentrant; step\n// is synchronous and called at most once per helm per frame).\n// =========================================================================\n\nconst _dq = [0, 0, 0, 1];\n\n// Scratch for the optional input filter (helm.filter). The fed rates are packed\n// into one 6-vector, conditioned, and unpacked to lin/ang triples before the\n// deadzone — so a single filter carries one state per helm. Shared across\n// instances (step is synchronous, at most once per helm per frame).\nconst _f6raw = [0, 0, 0, 0, 0, 0];\nconst _f6out = [0, 0, 0, 0, 0, 0];\nconst _fLin = [0, 0, 0];\nconst _fAng = [0, 0, 0];\n\n/**\n * Default full-deflection input magnitude — the fed rate a read-out shows as\n * full (the SpaceNavigator's saturated lane). Private to core: a transport on a\n * different raw scale sets helm.fullScale and never reads this, so there is no\n * public HELM_FULL export. Display-only; integration uses profile.sens directly.\n */\nconst HELM_FULL_SCALE = 500;\n\n// Deadzone gate — |v| > dz keeps v, else 0. Module-level so step allocates no\n// closure. Strictly-greater matches the e7 reference (rest reads exact 0).\nconst _dz = (v, dz) => (v > dz || v < -dz) ? v : 0;\n\n/**\n * Build the canonical default profile. SpaceNavigator-tuned lane permutation\n * and the eye-frame manipulation feel found in the e7 experiments; it is the\n * per-app / per-device mapping layer and is meant to be overwritten wholesale\n * (`helm.profile = { … }`) for a different transport.\n *\n * sign — per-app direction (camera-fly vs object-grab invert; flip live).\n * sens — per-axis sensitivity (tame roll without touching the rest).\n * lane — input-channel permutation: which fed channel drives this DOF.\n * T* lanes index the translation triple; R* lanes the rotation triple.\n */\nfunction _defaultProfile() {\n return {\n Tx: { sign: 1, sens: 0.30, lane: 0 },\n Ty: { sign: 1, sens: 0.30, lane: 2 },\n Tz: { sign: -1, sens: 0.30, lane: 1 },\n Rp: { sign: -1, sens: 0.0025, lane: 0 },\n Ry: { sign: -1, sens: 0.0025, lane: 2 },\n Rr: { sign: 1, sens: 0.0018, lane: 1 },\n };\n}\n\n/** Channel order — readout / iteration convenience (Tx Ty Tz Rp Ry Rr). */\nconst HELM_CHANNELS = Object.freeze(['Tx', 'Ty', 'Tz', 'Rp', 'Ry', 'Rr']);\n\n// =========================================================================\n// PoseHelm\n// =========================================================================\n\n/**\n * Source-agnostic 6-DOF pose producer. Holds a profile + the integrated pose;\n * no timeline (no keyframes, no play/seek/loop).\n */\nclass PoseHelm {\n constructor() {\n /**\n * DOF mapping table. Six channels, each `{ sign, sens, lane }`.\n * Public and mutable — set wholesale to re-map a device or app.\n * @type {{ Tx:Object, Ty:Object, Tz:Object, Rp:Object, Ry:Object, Rr:Object }}\n */\n this.profile = _defaultProfile();\n\n /**\n * Rest-drift floor. A fed rate with |value| ≤ deadzone reads as 0. Devices\n * that rest at exact 0 need only a small floor. @type {number}\n */\n this.deadzone = 8;\n\n /**\n * Full-deflection input magnitude for the read-outs (gizmo overlay + panel\n * meters): a fed rate of |fullScale| reads as a full bar / arrow. Set by a\n * transport whose saturated rate differs from the default (a gamepad stick\n * that saturates at 1 sets fullScale = 1). Display-only — integration uses\n * profile.sens directly, so this never affects flight. @type {number}\n */\n this.fullScale = HELM_FULL_SCALE;\n\n /**\n * Optional input conditioner applied to the fed rates BEFORE the deadzone,\n * inside step — a oneEuro filter, or any f(out, raw, dt) carrying function\n * with a reset(). null (the default) is the clean rate-native path: the\n * filter branch is skipped, so a clean device pays nothing. Set for noisy /\n * absolute sources; home() resets it. @type {?Function}\n */\n this.filter = null;\n\n /**\n * The space fed rates are interpreted in: a space constant (WORLD | EYE) or\n * a mat4 frame. Declarative only — the bridge reads this to resolve the\n * per-step `basis`; the core stays camera-agnostic. @type {string|ArrayLike<number>}\n */\n this.from = 'EYE';\n\n // Latest fed raw rates (refreshed by feed; persist until the next feed —\n // the transport is responsible for feeding 0 when motion should stop).\n this._lin = [0, 0, 0];\n this._ang = [0, 0, 0];\n\n // Integrated pose — the source of truth.\n this._pos = [0, 0, 0];\n this._q = [0, 0, 0, 1];\n }\n\n /**\n * Push the latest raw 6-DOF device rate. Either argument may be omitted to\n * leave that half unchanged (devices report the two halves on separate\n * frames). The value persists until the next feed. Raw device units — the\n * profile's `sens` does the scaling, so the same feed() suits any transport.\n *\n * @param {ArrayLike<number>} [translation] [tx, ty, tz] raw lane rates.\n * @param {ArrayLike<number>} [rotation] [rx, ry, rz] raw lane rates.\n * @returns {PoseHelm} this\n */\n feed(translation, rotation) {\n if (translation) {\n this._lin[0] = translation[0] || 0;\n this._lin[1] = translation[1] || 0;\n this._lin[2] = translation[2] || 0;\n }\n if (rotation) {\n this._ang[0] = rotation[0] || 0;\n this._ang[1] = rotation[1] || 0;\n this._ang[2] = rotation[2] || 0;\n }\n return this;\n }\n\n /**\n * Integrate the latest fed rate by `dt` seconds into the pose, then write the\n * pose into `out`. Bridge-driven (the player calls it each frame; a sketch\n * never does, as it never calls track.tick()).\n *\n * `basis` is the resolved `from` frame: an eye→world column-major mat4\n * (16-element ArrayLike), or null/omitted for WORLD (the identity basis). Its\n * columns supply the right/up/back axes; forward is −col2. Both the linear and\n * angular rates are rotated through it, then `q` is composed world-frame.\n *\n * Zero-allocation. `out` is `{ pos:number[3], rot:number[4] }`; omit it for a\n * fresh object.\n *\n * @param {{ pos:number[], rot:number[] }} [out]\n * @param {number} dt Elapsed time in seconds.\n * @param {ArrayLike<number>} [basis] Eye→world mat4, or null for WORLD.\n * @returns {{ pos:number[], rot:number[] }} out\n */\n step(out, dt, basis) {\n const p = this.profile, dz = this.deadzone;\n let lin = this._lin, ang = this._ang;\n\n // Value layer — condition the fed rates BEFORE the deadzone (the filter\n // narrows the jitter band; the deadzone then gates the residual to exact\n // zero). The filter carries state, so it is ticked exactly once per step;\n // activity() reads the raw fed rate and is left unfiltered (the read-out\n // shows device input, normalized by fullScale). Skipped when filter is null.\n const filter = this.filter;\n if (filter) {\n _f6raw[0] = lin[0]; _f6raw[1] = lin[1]; _f6raw[2] = lin[2];\n _f6raw[3] = ang[0]; _f6raw[4] = ang[1]; _f6raw[5] = ang[2];\n filter(_f6out, _f6raw, dt);\n _fLin[0] = _f6out[0]; _fLin[1] = _f6out[1]; _fLin[2] = _f6out[2];\n _fAng[0] = _f6out[3]; _fAng[1] = _f6out[4]; _fAng[2] = _f6out[5];\n lin = _fLin; ang = _fAng;\n }\n\n // Basis axes (right / up / forward). No basis ⇒ the identity eye matrix:\n // right +X, up +Y, forward −Z. Forward is −col2 (an eye→world matrix stores\n // the camera's BACK in col2), and the identity's col2 is +Z, so forward is\n // −Z — making step(out, dt, null) identical to step(out, dt, IDENTITY_MAT4),\n // as the `from` contract (\"null ≡ the identity basis\") promises.\n let rX = 1, rY = 0, rZ = 0;\n let uX = 0, uY = 1, uZ = 0;\n let fX = 0, fY = 0, fZ = -1;\n if (basis) {\n rX = basis[0]; rY = basis[1]; rZ = basis[2];\n uX = basis[4]; uY = basis[5]; uZ = basis[6];\n fX = -basis[8]; fY = -basis[9]; fZ = -basis[10];\n }\n\n // Angular: three rates → one delta quat, rotated into world, world-composed.\n const wx = _dz(ang[p.Rp.lane], dz) * p.Rp.sign * p.Rp.sens;\n const wy = _dz(ang[p.Ry.lane], dz) * p.Ry.sign * p.Ry.sens;\n const wz = _dz(ang[p.Rr.lane], dz) * p.Rr.sign * p.Rr.sens;\n const w = Math.sqrt(wx * wx + wy * wy + wz * wz);\n if (w > 0) {\n // Axis in world = basis · (wx,wy,wz); its length is w (basis orthonormal),\n // so the rotation angle is w·dt. qFromAxisAngle renormalizes the axis.\n const ax = wx * rX + wy * uX + wz * fX;\n const ay = wx * rY + wy * uY + wz * fY;\n const az = wx * rZ + wy * uZ + wz * fZ;\n qFromAxisAngle(_dq, ax, ay, az, w * dt);\n qMul(this._q, _dq, this._q); // delta already in world → world-frame compose\n qNormalize(this._q);\n }\n\n // Linear: three rates rotated into world, integrated by dt.\n const tx = _dz(lin[p.Tx.lane], dz) * p.Tx.sign * p.Tx.sens;\n const ty = _dz(lin[p.Ty.lane], dz) * p.Ty.sign * p.Ty.sens;\n const tz = _dz(lin[p.Tz.lane], dz) * p.Tz.sign * p.Tz.sens;\n this._pos[0] += (tx * rX + ty * uX + tz * fX) * dt;\n this._pos[1] += (tx * rY + ty * uY + tz * fY) * dt;\n this._pos[2] += (tx * rZ + ty * uZ + tz * fZ) * dt;\n\n return this.eval(out);\n }\n\n /**\n * Read the current pose into `out` (zero-alloc). The shared output contract\n * that feeds applyPose — mirrors Track.eval.\n *\n * @param {{ pos:number[], rot:number[] }} [out]\n * @returns {{ pos:number[], rot:number[] }} out\n */\n eval(out) {\n out = out || { pos: [0, 0, 0], rot: [0, 0, 0, 1] };\n out.pos[0] = this._pos[0]; out.pos[1] = this._pos[1]; out.pos[2] = this._pos[2];\n out.rot[0] = this._q[0]; out.rot[1] = this._q[1];\n out.rot[2] = this._q[2]; out.rot[3] = this._q[3];\n return out;\n }\n\n /**\n * Write the six effective channel rates (post deadzone·sign·sens) into `out6`,\n * in channel order [Tx, Ty, Tz, Rp, Ry, Rr]. The gizmo reads this to light the\n * DOFs being driven; readouts can show signed magnitudes. Zero-alloc.\n *\n * @param {number[]} out6 6-element destination.\n * @returns {number[]} out6\n */\n activity(out6) {\n const p = this.profile, dz = this.deadzone, lin = this._lin, ang = this._ang;\n out6[0] = _dz(lin[p.Tx.lane], dz) * p.Tx.sign * p.Tx.sens;\n out6[1] = _dz(lin[p.Ty.lane], dz) * p.Ty.sign * p.Ty.sens;\n out6[2] = _dz(lin[p.Tz.lane], dz) * p.Tz.sign * p.Tz.sens;\n out6[3] = _dz(ang[p.Rp.lane], dz) * p.Rp.sign * p.Rp.sens;\n out6[4] = _dz(ang[p.Ry.lane], dz) * p.Ry.sign * p.Ry.sens;\n out6[5] = _dz(ang[p.Rr.lane], dz) * p.Rr.sign * p.Rr.sens;\n return out6;\n }\n\n /**\n * Re-home the integrated pose. Sets position + orientation to `pose` (or the\n * identity pose when omitted) and clears any pending rate so the helm rests at\n * a clean, known state. NOT a reset — there are no keyframes to clear.\n *\n * @param {{ pos?:ArrayLike<number>, rot?:ArrayLike<number> }} [pose]\n * @returns {PoseHelm} this\n */\n home(pose) {\n if (pose && pose.pos) {\n this._pos[0] = pose.pos[0]; this._pos[1] = pose.pos[1]; this._pos[2] = pose.pos[2];\n } else {\n this._pos[0] = 0; this._pos[1] = 0; this._pos[2] = 0;\n }\n if (pose && pose.rot) {\n this._q[0] = pose.rot[0]; this._q[1] = pose.rot[1];\n this._q[2] = pose.rot[2]; this._q[3] = pose.rot[3];\n } else {\n this._q[0] = 0; this._q[1] = 0; this._q[2] = 0; this._q[3] = 1;\n }\n this._lin[0] = this._lin[1] = this._lin[2] = 0;\n this._ang[0] = this._ang[1] = this._ang[2] = 0;\n if (this.filter) this.filter.reset(); // drop filter state at the discontinuity\n return this;\n }\n}\n\n// =========================================================================\n// poseDelta — absolute pose → 6-DOF rate\n// =========================================================================\n\n/**\n * Difference two consecutive absolute poses into a 6-DOF rate the helm can be\n * fed — the bridge for absolute-pose transports (gesture / landmark / marker /\n * IMU) into feed(lin, ang). Out-first, zero-allocation.\n *\n * Linear rate is (cur.pos − prev.pos) / dt. Angular rate is the world-frame\n * angular velocity ω carrying prev.rot onto cur.rot over dt: the relative\n * rotation r = cur · conj(prev) (so cur = r · prev, the world-frame compose the\n * step integrates), read as axis · angle / dt.\n *\n * The double-cover guard is the whole reason to ship this rather than inline it:\n * a quaternion and its negation are the same orientation, so when\n * dot(prev.rot, cur.rot) < 0 the two samples sit on opposite hemispheres and a\n * naive difference takes the long way round — the angular rate spikes at the\n * crossing. Flipping cur into prev's hemisphere first keeps r the shortest arc.\n *\n * Fed through a helm in WORLD whose profile has unit `sens`, in-order lanes and\n * `Tz` / `Rr` signs of −1 — the helm's lanes are eye-frame and the null basis\n * is the identity eye matrix (forward −Z), so the two Z channels flip against\n * world axes — the integrated pose retraces the source (the round-trip e9\n * asserts). A 1:1, non-integrated consumer skips the helm and applyPoses the\n * absolute pose directly.\n *\n * @param {{ lin:number[], ang:number[] }} [out] Destination; omit for a fresh one.\n * @param {{ pos:ArrayLike<number>, rot:ArrayLike<number> }} prev Previous pose.\n * @param {{ pos:ArrayLike<number>, rot:ArrayLike<number> }} cur Current pose.\n * @param {number} dt Elapsed seconds between the two samples.\n * @returns {{ lin:number[], ang:number[] }} out\n */\nfunction poseDelta(out, prev, cur, dt) {\n out = out || { lin: [0, 0, 0], ang: [0, 0, 0] };\n const inv = 1 / dt;\n\n out.lin[0] = (cur.pos[0] - prev.pos[0]) * inv;\n out.lin[1] = (cur.pos[1] - prev.pos[1]) * inv;\n out.lin[2] = (cur.pos[2] - prev.pos[2]) * inv;\n\n const px = prev.rot[0], py = prev.rot[1], pz = prev.rot[2], pw = prev.rot[3];\n let cx = cur.rot[0], cy = cur.rot[1], cz = cur.rot[2], cw = cur.rot[3];\n\n // Double-cover guard: bring cur into prev's hemisphere so r is the short arc.\n if (px * cx + py * cy + pz * cz + pw * cw < 0) { cx = -cx; cy = -cy; cz = -cz; cw = -cw; }\n\n // Relative rotation r = cur · conj(prev), conj(prev) = (−px, −py, −pz, pw).\n const rx = -cw * px + cx * pw - cy * pz + cz * py;\n const ry = -cw * py + cx * pz + cy * pw - cz * px;\n const rz = -cw * pz - cx * py + cy * px + cz * pw;\n const rw = cw * pw + cx * px + cy * py + cz * pz; // = dot(prev, cur) ≥ 0 → angle ≤ π\n\n // Axis · angle of r → ω = axis · angle / dt. Below the threshold the rotation\n // is negligible (no well-defined axis) and the angular rate is exact zero.\n const sinHalf = Math.sqrt(rx * rx + ry * ry + rz * rz);\n if (sinHalf < 1e-8) {\n out.ang[0] = 0; out.ang[1] = 0; out.ang[2] = 0;\n } else {\n const k = (2 * Math.atan2(sinHalf, rw)) * inv / sinHalf;\n out.ang[0] = rx * k; out.ang[1] = ry * k; out.ang[2] = rz * k;\n }\n return out;\n}\n\n/**\n * @file Frustum planes and visibility tests — zero allocations.\n * @module tree/visibility\n * @license AGPL-3.0-only\n *\n * Planes are a flat Float64Array(24): 6 planes × 4 floats [a, b, c, d].\n * All inputs are scalars. All outputs are INVISIBLE | VISIBLE | SEMIVISIBLE.\n */\n\n\n// Plane indices\nconst PLANE_LEFT = 0, PLANE_RIGHT = 1, PLANE_NEAR = 2,\n PLANE_FAR = 3, PLANE_TOP = 4, PLANE_BOTTOM = 5;\n\n/**\n * Compute 6 frustum planes from camera basis (world space) + projection params.\n * All inputs are scalars — the addon extracts them from the inverse view matrix\n * and projection queries before calling.\n *\n * @param {Float64Array} out 24-float output.\n * @param {number} posX,posY,posZ Camera world position.\n * @param {number} vdX,vdY,vdZ View direction (−Z in eye space, world).\n * @param {number} upX,upY,upZ Camera up.\n * @param {number} rtX,rtY,rtZ Camera right.\n * @param {boolean} ortho true if orthographic.\n * @param {number} near,far,left,right,top,bottom\n * Projection extents in camera space.\n * Sign contract: top > 0, bottom < 0, right > 0, left < 0 for standard y-up camera.\n */\nfunction frustumPlanes(\n out,\n posX, posY, posZ,\n vdX, vdY, vdZ,\n upX, upY, upZ,\n rtX, rtY, rtZ,\n ortho,\n near, far, left, right, top, bottom\n) {\n const posViewDir = posX*vdX + posY*vdY + posZ*vdZ;\n const posRight = posX*rtX + posY*rtY + posZ*rtZ;\n const posUp = posX*upX + posY*upY + posZ*upZ;\n\n if (ortho) {\n // Left: normal = −right\n out[0] = -rtX; out[1] = -rtY; out[2] = -rtZ;\n out[3] = -(posRight - left) * -1; // dot(pos - right*left, -right) ... simplified:\n // Actually: d = dot(pointOnPlane, normal)\n // pointOnPlane = pos + right*left (left is negative for standard ortho)\n // normal = -right\n // d = dot(pos + right*left, -right) = -posRight - left\n out[3] = -posRight - left;\n\n // Right: normal = right\n out[4] = rtX; out[5] = rtY; out[6] = rtZ;\n out[7] = posRight + right;\n\n // Top: normal = up\n out[16] = upX; out[17] = upY; out[18] = upZ;\n out[19] = posUp + top;\n\n // Bottom: normal = -up\n out[20] = -upX; out[21] = -upY; out[22] = -upZ;\n out[23] = -posUp - bottom;\n } else {\n // Left\n const hfovl = Math.atan2(left, near);\n const shfovl = Math.sin(hfovl), chfovl = Math.cos(hfovl);\n out[0] = vdX*shfovl - rtX*chfovl;\n out[1] = vdY*shfovl - rtY*chfovl;\n out[2] = vdZ*shfovl - rtZ*chfovl;\n out[3] = shfovl*posViewDir - chfovl*posRight;\n\n // Right\n const hfovr = Math.atan2(right, near);\n const shfovr = Math.sin(hfovr), chfovr = Math.cos(hfovr);\n out[4] = -vdX*shfovr + rtX*chfovr;\n out[5] = -vdY*shfovr + rtY*chfovr;\n out[6] = -vdZ*shfovr + rtZ*chfovr;\n out[7] = -shfovr*posViewDir + chfovr*posRight;\n\n // Top\n const fovt = Math.atan2(top, near);\n const sfovt = Math.sin(fovt), cfovt = Math.cos(fovt);\n out[16] = -vdX*sfovt + upX*cfovt;\n out[17] = -vdY*sfovt + upY*cfovt;\n out[18] = -vdZ*sfovt + upZ*cfovt;\n out[19] = -sfovt*posViewDir + cfovt*posUp;\n\n // Bottom\n const fovb = Math.atan2(bottom, near);\n const sfovb = Math.sin(fovb), cfovb = Math.cos(fovb);\n out[20] = vdX*sfovb - upX*cfovb;\n out[21] = vdY*sfovb - upY*cfovb;\n out[22] = vdZ*sfovb - upZ*cfovb;\n out[23] = sfovb*posViewDir - cfovb*posUp;\n }\n\n // Near plane: normal = −viewDir\n out[8] = -vdX; out[9] = -vdY; out[10] = -vdZ;\n out[11] = -posViewDir - near;\n\n // Far plane: normal = viewDir\n out[12] = vdX; out[13] = vdY; out[14] = vdZ;\n out[15] = posViewDir + far;\n\n return out;\n}\n\n/**\n * Signed distance from point to one frustum plane.\n * @param {Float64Array} planes 24-float planes buffer.\n * @param {number} planeIdx 0–5 (LEFT, RIGHT, NEAR, FAR, TOP, BOTTOM).\n * @param {number} px,py,pz Point coordinates.\n * @returns {number}\n */\nfunction distanceToPlane(planes, planeIdx, px, py, pz) {\n const b = planeIdx * 4;\n return planes[b]*px + planes[b+1]*py + planes[b+2]*pz - planes[b+3];\n}\n\n/** @returns {number} INVISIBLE | VISIBLE | SEMIVISIBLE */\nfunction pointVisibility(planes, px, py, pz) {\n for (let i = 0; i < 6; i++) {\n if (distanceToPlane(planes, i, px, py, pz) > 0) return INVISIBLE;\n }\n return VISIBLE;\n}\n\n/** @returns {number} INVISIBLE | VISIBLE | SEMIVISIBLE */\nfunction sphereVisibility(planes, cx, cy, cz, radius) {\n let allIn = true;\n for (let i = 0; i < 6; i++) {\n const d = distanceToPlane(planes, i, cx, cy, cz);\n if (d > radius) return INVISIBLE;\n if (d > 0 || -d < radius) allIn = false;\n }\n return allIn ? VISIBLE : SEMIVISIBLE;\n}\n\n/** @returns {number} INVISIBLE | VISIBLE | SEMIVISIBLE */\nfunction boxVisibility(planes, x0, y0, z0, x1, y1, z1) {\n let allIn = true;\n for (let i = 0; i < 6; i++) {\n const b = i * 4;\n const a = planes[b], bv = planes[b+1], c = planes[b+2], d = planes[b+3];\n let allOut = true;\n for (let corner = 0; corner < 8; corner++) {\n const cx = (corner & 4) ? x0 : x1;\n const cy = (corner & 2) ? y0 : y1;\n const cz = (corner & 1) ? z0 : z1;\n const dist = a*cx + bv*cy + c*cz - d;\n if (dist > 0) { allIn = false; }\n else { allOut = false; }\n }\n if (allOut) return INVISIBLE;\n }\n return allIn ? VISIBLE : SEMIVISIBLE;\n}\n\n/**\n * @file Camera state ↔ matrices: builders, decomposers, and in-place edits.\n * @module tree/camera\n * @license AGPL-3.0-only\n *\n * The camera is plain data — the CameraTrack keyframe shape:\n *\n * cam = {\n * eye: [x, y, z], // position\n * center: [x, y, z], // lookat target; |center − eye| is the gaze distance\n * up: [x, y, z], // up hint, need not be unit\n * fov: number | null, // vertical field of view, radians — perspective\n * halfHeight: number | null, // world-unit half-height at the near plane — orthographic\n * near: number, // > 0\n * far: number, // > near\n * }\n *\n * Exactly one of fov / halfHeight is meaningful; fov wins when both are set.\n * With both null the lens is \"unchanged\": cameraProj and cameraPlanes return\n * null and leave their output untouched, so a track that evaluates null into\n * the state keeps the last projection installed. A track writes the state\n * directly — `track.eval(cam)` — and a pose drives it through cameraFromPose.\n *\n * The state carries no aspect ratio — the viewport owns it — so one state is\n * portable between targets of different sizes; every builder that needs it\n * takes it as an argument.\n *\n * Vectors are plain number[] (f64, authoring state); matrices are written into\n * whatever 16-element buffer the caller passes. createCamera is the one\n * allocating call; everything else is out-first (or in-place) and zero-alloc.\n *\n * Every function that needs the camera frame derives it through mat4Eye, so\n * planes and edits agree with cameraEye / cameraView exactly — including the\n * up re-seed when the view direction is parallel to the up hint.\n */\n\n\nconst _E$1 = new Float64Array(16); // eye→world frame scratch: right 0–2, up 4–6, back 8–10\nconst _d = [0, 0, 0]; // view-direction scratch\n\n/** Eye→world frame of `cam` into `_E`. */\nfunction _frame(cam) {\n const e = cam.eye, c = cam.center, u = cam.up;\n mat4Eye(_E$1, e[0],e[1],e[2], c[0],c[1],c[2], u[0],u[1],u[2]);\n}\n\n/** Gaze distance |center − eye|, or 1 when the state is degenerate. */\nfunction _gaze(cam) {\n const dx = cam.center[0]-cam.eye[0], dy = cam.center[1]-cam.eye[1], dz = cam.center[2]-cam.eye[2];\n const d = Math.sqrt(dx*dx+dy*dy+dz*dz);\n return d > 0 ? d : 1;\n}\n\nfunction _vec3(v, x, y, z) { return v != null ? [v[0], v[1], v[2]] : [x, y, z]; }\n\n// =========================================================================\n// State\n// =========================================================================\n\n/**\n * Allocate a camera state — the one allocating call, setup-time.\n * Defaults: eye [0, 0, 500], center [0, 0, 0], up [0, 1, 0], fov π/3,\n * halfHeight null, near 0.1, far 1000. Passing halfHeight without fov yields\n * an orthographic state (fov null).\n *\n * @param {{ eye?:number[], center?:number[], up?:number[], fov?:number|null,\n * halfHeight?:number|null, near?:number, far?:number }} [opts]\n * @returns {{ eye:number[], center:number[], up:number[], fov:number|null,\n * halfHeight:number|null, near:number, far:number }}\n */\nfunction createCamera(opts) {\n const o = opts || {};\n const ortho = o.halfHeight != null && o.fov === undefined;\n return {\n eye: _vec3(o.eye, 0, 0, 500),\n center: _vec3(o.center, 0, 0, 0),\n up: _vec3(o.up, 0, 1, 0),\n fov: o.fov !== undefined ? o.fov : (ortho ? null : Math.PI / 3),\n halfHeight: o.halfHeight !== undefined ? o.halfHeight : null,\n near: typeof o.near === 'number' ? o.near : 0.1,\n far: typeof o.far === 'number' ? o.far : 1000,\n };\n}\n\n/**\n * Copy one camera state into another (an orbit's home, a track's capture).\n * @param {object} out Destination state.\n * @param {object} cam Source state.\n * @returns {object} out\n */\nfunction cameraCopy(out, cam) {\n out.eye[0]=cam.eye[0]; out.eye[1]=cam.eye[1]; out.eye[2]=cam.eye[2];\n out.center[0]=cam.center[0]; out.center[1]=cam.center[1]; out.center[2]=cam.center[2];\n out.up[0]=cam.up[0]; out.up[1]=cam.up[1]; out.up[2]=cam.up[2];\n out.fov = cam.fov; out.halfHeight = cam.halfHeight;\n out.near = cam.near; out.far = cam.far;\n return out;\n}\n\n// =========================================================================\n// Builders — state → matrices\n// =========================================================================\n\n/**\n * View matrix (world→eye) from the state's lookat.\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {object} cam\n * @returns {Float32Array|number[]} out\n */\nfunction cameraView(out, cam) {\n const e = cam.eye, c = cam.center, u = cam.up;\n return mat4View(out, e[0],e[1],e[2], c[0],c[1],c[2], u[0],u[1],u[2]);\n}\n\n/**\n * Eye matrix (eye→world) from the state's lookat.\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {object} cam\n * @returns {Float32Array|number[]} out\n */\nfunction cameraEye(out, cam) {\n const e = cam.eye, c = cam.center, u = cam.up;\n return mat4Eye(out, e[0],e[1],e[2], c[0],c[1],c[2], u[0],u[1],u[2]);\n}\n\n/**\n * Projection matrix from the state's lens: mat4Persp from fov, or mat4Ortho\n * from halfHeight, with symmetric extents (top = near · tan(fov / 2) or\n * halfHeight; right = top · aspect).\n *\n * @param {Float32Array|number[]} out 16-element destination.\n * @param {object} cam\n * @param {number} aspect Viewport width / height.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @param {number} [ndcYSign=1] +1 NDC y-up; −1 NDC y-down.\n * @returns {Float32Array|number[]|null} out, or null (out untouched) when\n * both fov and halfHeight are null.\n */\nfunction cameraProj(out, cam, aspect, ndcZMin, ndcYSign = 1) {\n const near = cam.near, far = cam.far;\n if (cam.fov != null) {\n const top = near * Math.tan(cam.fov / 2), right = top * aspect;\n return mat4Persp(out, -right, right, -top, top, near, far, ndcZMin, ndcYSign);\n }\n if (cam.halfHeight != null) {\n const top = cam.halfHeight, right = top * aspect;\n return mat4Ortho(out, -right, right, -top, top, near, far, ndcZMin, ndcYSign);\n }\n return null;\n}\n\n/**\n * The six frustum planes of the state, world space — frustumPlanes over the\n * lookat basis and the symmetric extents cameraProj uses, so visibility tests\n * run against a camera state without any matrix.\n *\n * @param {Float64Array} planes 24-element destination.\n * @param {object} cam\n * @param {number} aspect Viewport width / height.\n * @returns {Float64Array|null} planes, or null (planes untouched) when both\n * fov and halfHeight are null.\n */\nfunction cameraPlanes(planes, cam, aspect) {\n const ortho = cam.fov == null;\n if (ortho && cam.halfHeight == null) return null;\n const top = ortho ? cam.halfHeight : cam.near * Math.tan(cam.fov / 2), right = top * aspect;\n _frame(cam);\n const e = cam.eye;\n return frustumPlanes(planes,\n e[0], e[1], e[2],\n -_E$1[8], -_E$1[9], -_E$1[10],\n _E$1[4], _E$1[5], _E$1[6],\n _E$1[0], _E$1[1], _E$1[2],\n ortho, cam.near, cam.far, -right, right, top, -top);\n}\n\n// =========================================================================\n// Decomposers — matrices and poses → state\n// =========================================================================\n\n/**\n * Read a state back from an eye matrix and a projection: eye ← column 3,\n * up ← column 1, forward ← −column 2 of E; center ← eye + forward · d with d\n * the state's current gaze distance (1 when degenerate), so the distance\n * survives a round trip. The lens comes from the projection queries: fov or\n * halfHeight by projIsOrtho, near and far under `ndcZMin`.\n *\n * @param {object} cam State written in place.\n * @param {ArrayLike<number>} E Eye matrix (eye→world), 16 elements.\n * @param {ArrayLike<number>} P Projection matrix, 16 elements.\n * @param {number} ndcZMin WEBGL (−1) or WEBGPU (0).\n * @returns {object} cam\n */\nfunction cameraFromMat4(cam, E, P, ndcZMin) {\n const d = _gaze(cam);\n let fx = -E[8], fy = -E[9], fz = -E[10];\n const fl = Math.sqrt(fx*fx+fy*fy+fz*fz) || 1;\n fx /= fl; fy /= fl; fz /= fl;\n cam.eye[0]=E[12]; cam.eye[1]=E[13]; cam.eye[2]=E[14];\n cam.up[0]=E[4]; cam.up[1]=E[5]; cam.up[2]=E[6];\n cam.center[0]=cam.eye[0]+fx*d; cam.center[1]=cam.eye[1]+fy*d; cam.center[2]=cam.eye[2]+fz*d;\n if (projIsOrtho(P)) { cam.fov = null; cam.halfHeight = projTop(P, ndcZMin); }\n else { cam.fov = projFov(P); cam.halfHeight = null; }\n cam.near = projNear(P, ndcZMin);\n cam.far = projFar(P);\n return cam;\n}\n\n/**\n * Drive the lookat from a TRS pose: eye ← pos, up and forward from the\n * rotation's columns 1 and −2, center ← eye + forward · d with d the current\n * gaze distance (1 when degenerate). The lens is untouched; `scl` is ignored.\n *\n * @param {object} cam State written in place.\n * @param {{ pos:number[], rot:number[] }} pose rot is a unit quaternion [x,y,z,w].\n * @returns {object} cam\n */\nfunction cameraFromPose(cam, pose) {\n const d = _gaze(cam);\n const q = pose.rot, x=q[0], y=q[1], z=q[2], w=q[3];\n const x2=x+x, y2=y+y, z2=z+z;\n const xx=x*x2, xy=x*y2, xz=x*z2, yy=y*y2, yz=y*z2, zz=z*z2, wx=w*x2, wy=w*y2, wz=w*z2;\n const ux=xy-wz, uy=1-(xx+zz), uz=yz+wx; // column 1 of qToMat4(rot): up\n const bx=xz+wy, by=yz-wx, bz=1-(xx+yy); // column 2: back\n cam.eye[0]=pose.pos[0]; cam.eye[1]=pose.pos[1]; cam.eye[2]=pose.pos[2];\n cam.up[0]=ux; cam.up[1]=uy; cam.up[2]=uz;\n cam.center[0]=cam.eye[0]-bx*d; cam.center[1]=cam.eye[1]-by*d; cam.center[2]=cam.eye[2]-bz*d;\n return cam;\n}\n\n/**\n * The lookat as a TRS pose: pos ← eye, rot ← qFromLookDir(center − eye, up) —\n * the rotation of cameraEye, so a helm seeded from it continues the frame.\n *\n * @param {{ pos:number[], rot:number[] }} pose Written in place.\n * @param {object} cam\n * @returns {{ pos:number[], rot:number[] }} pose\n */\nfunction cameraToPose(pose, cam) {\n pose.pos[0]=cam.eye[0]; pose.pos[1]=cam.eye[1]; pose.pos[2]=cam.eye[2];\n _d[0]=cam.center[0]-cam.eye[0]; _d[1]=cam.center[1]-cam.eye[1]; _d[2]=cam.center[2]-cam.eye[2];\n qFromLookDir(pose.rot, _d, cam.up);\n return pose;\n}\n\n// =========================================================================\n// Edits — in place, chainable, zero-alloc\n// =========================================================================\n\n/**\n * Orbit the eye about the center: `dAz` rotates it about the up hint\n * (right-handed); `dEl` raises its elevation above the plane through the\n * center perpendicular to the hint, clamped to ±opts.maxEl so the view\n * direction never reaches the hint (the pole guard). `up` is left as the hint\n * it was, so an orbit never rolls. A state already at the pole is pulled\n * inside the guard by its first non-zero edit; (0, 0) is a no-op.\n *\n * @param {object} cam\n * @param {number} dAz Azimuth delta, radians.\n * @param {number} dEl Elevation delta, radians.\n * @param {{ maxEl?:number }} [opts] Elevation limit; default π/2 − 1e-3.\n * @returns {object} cam\n */\nfunction cameraOrbit(cam, dAz, dEl, opts) {\n if (dAz === 0 && dEl === 0) return cam;\n const maxEl = opts && typeof opts.maxEl === 'number' ? opts.maxEl : Math.PI / 2 - 1e-3;\n const e = cam.eye, c = cam.center;\n let ux=cam.up[0], uy=cam.up[1], uz=cam.up[2];\n const ul = Math.sqrt(ux*ux+uy*uy+uz*uz) || 1;\n ux/=ul; uy/=ul; uz/=ul;\n const dx=e[0]-c[0], dy=e[1]-c[1], dz=e[2]-c[2];\n const r = Math.sqrt(dx*dx+dy*dy+dz*dz);\n _frame(cam);\n const px=_E$1[4], py=_E$1[5], pz=_E$1[6]; // the eye's up\n const bx=_E$1[8], by=_E$1[9], bz=_E$1[10]; // back: center → eye, unit\n // elevation: raise by θ within the (back, up) plane, clamped\n const el = Math.asin(Math.max(-1, Math.min(1, bx*ux+by*uy+bz*uz)));\n const th = Math.max(-maxEl, Math.min(maxEl, el + dEl)) - el;\n const ct = Math.cos(th), st = Math.sin(th);\n const ox = r*(bx*ct+px*st), oy = r*(by*ct+py*st), oz = r*(bz*ct+pz*st);\n // azimuth: rotate about the hint (Rodrigues)\n const ca = Math.cos(dAz), sa = Math.sin(dAz), k = (ux*ox+uy*oy+uz*oz)*(1-ca);\n e[0] = c[0] + ox*ca + (uy*oz-uz*oy)*sa + ux*k;\n e[1] = c[1] + oy*ca + (uz*ox-ux*oz)*sa + uy*k;\n e[2] = c[2] + oz*ca + (ux*oy-uy*ox)*sa + uz*k;\n return cam;\n}\n\n/**\n * Dolly: scale the gaze distance by `factor` — the eye moves along the view\n * direction under perspective; under orthographic (fov null, halfHeight set)\n * halfHeight is scaled instead, since moving the eye changes nothing on\n * screen. opts.min / opts.max clamp the scaled quantity. An edit that would\n * make it non-positive is a no-op.\n *\n * @param {object} cam\n * @param {number} factor\n * @param {{ min?:number, max?:number }} [opts]\n * @returns {object} cam\n */\nfunction cameraDolly(cam, factor, opts) {\n const min = opts && typeof opts.min === 'number' ? opts.min : 0;\n const max = opts && typeof opts.max === 'number' ? opts.max : Infinity;\n if (cam.fov == null && cam.halfHeight != null) {\n const h = Math.max(min, Math.min(max, cam.halfHeight * factor));\n if (h > 0) cam.halfHeight = h;\n return cam;\n }\n const e = cam.eye, c = cam.center;\n const dx=e[0]-c[0], dy=e[1]-c[1], dz=e[2]-c[2];\n const r = Math.sqrt(dx*dx+dy*dy+dz*dz);\n if (r === 0) return cam;\n const r1 = Math.max(min, Math.min(max, r * factor));\n if (!(r1 > 0)) return cam;\n const s = r1 / r;\n e[0]=c[0]+dx*s; e[1]=c[1]+dy*s; e[2]=c[2]+dz*s;\n return cam;\n}\n\n/**\n * Pan: translate eye and center by `dx` along the eye's right and `dy` along\n * its up, world units. The caller converts pixels through pixelRatio at the\n * center's depth so a pan tracks the pointer.\n *\n * @param {object} cam\n * @param {number} dx\n * @param {number} dy\n * @returns {object} cam\n */\nfunction cameraPan(cam, dx, dy) {\n _frame(cam);\n const tx=_E$1[0]*dx+_E$1[4]*dy, ty=_E$1[1]*dx+_E$1[5]*dy, tz=_E$1[2]*dx+_E$1[6]*dy;\n const e = cam.eye, c = cam.center;\n e[0]+=tx; e[1]+=ty; e[2]+=tz;\n c[0]+=tx; c[1]+=ty; c[2]+=tz;\n return cam;\n}\n\n/**\n * @file Gizmo line generators in the arrays shape.\n * @module tree/gizmo\n * @license AGPL-3.0-only\n *\n * A gizmo is geometry that explains: axes, a grid, a frustum, a path, a rig,\n * a handle's locus. This module generates its vertices — renderer-free, into\n * caller-owned arrays shaped the way twgl's createBufferInfoFromArrays\n * consumes them and a WebGPU vertex buffer is filled from — and nothing\n * else. Drawing, colour state, HUD mode, textures, the dot at a handle's\n * point, text: all the bridge's or the host's.\n *\n * ── The arrays shape ───────────────────────────────────────────────────────\n *\n * out = {\n * position: { numComponents: 3, data: Float32Array(3 · capacity) },\n * color: { numComponents: 4, data: Float32Array(4 · capacity) }, // optional\n * texcoord: { numComponents: 2, data: Float32Array(2 · capacity) }, // optional — panes\n * count: 0, // vertices written\n * labels: [], // optional — { x, y, z, text }\n * }\n *\n * Line generators write line lists — vertex pairs, no indices; paneTris\n * writes two triangles. capacity is position.data.length / 3.\n *\n * ── The contract — snprintf-style ──────────────────────────────────────────\n * Every generator gen(out, …) → n returns the vertex count it needs, writes\n * min(n, capacity) vertices, and sets out.count to what it wrote. A caller\n * sizes once and grows never in steady state:\n *\n * let n = axesLines(out, opts)\n * if (n > capacityOf(out)) { growArrays(out, n); axesLines(out, opts) }\n *\n * Each generator states its count formula so a caller can pre-size exactly.\n *\n * ── Colour ─────────────────────────────────────────────────────────────────\n * If out.color exists, every vertex written gets a colour: a generator with\n * semantic colouring (axes, the helm rig) writes its palette, every other\n * generator writes opts.color (default white). If out.color is absent\n * nothing is written and the bridge draws with a uniform colour.\n *\n * ── Frames ─────────────────────────────────────────────────────────────────\n * A generator writes in the frame the caller means — model space for scene\n * gizmos (the bridge's M places them), screen pixels for HUD gizmos.\n * Nothing here consults a camera except locusLines and frustumLines, which\n * take what they need explicitly. Signatures: out first, the subject second\n * where there is one, options last.\n */\n\n\nconst TWO_PI = Math.PI * 2;\nconst _AXIS_COLORS = [COLOR_X, COLOR_Y, COLOR_Z];\nconst _U = [1, 0, 0], _V = [0, 1, 0]; // the HUD plane's basis\nconst _E = new Float64Array(16); // a camera state's eye matrix\nconst _p3 = [0, 0, 0]; // a transformed corner / a sampled point\nconst _q3 = [0, 0, 0]; // the previous sampled point\nconst _c24 = new Float64Array(24); // frustum corners scratch\nconst _tIn = [0, 0, 0], _tOut = [0, 0, 0]; // a keyframe's tangents\nconst _act = [0, 0, 0, 0, 0, 0]; // a helm's activity\nconst _tip = [0, 0, 0], _ha = [0, 0, 0]; // an arrow's tip and head base\nconst _AXES = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\nconst _b0 = [0, 0, 0], _b1 = [0, 0, 0], _b2 = [0, 0, 0]; // a locus basis\nconst _UV_DEFAULT = [0, 1, 1, 1, 1, 0, 0, 0]; // paneTris: p0 top-left → (0, 1), clockwise\n\n// =========================================================================\n// G1 Arrays — the one allocating call, growth, capacity\n// =========================================================================\n\n/**\n * Allocate an arrays object of `capacity` vertices — the one allocating\n * call, setup-time. Flags add the optional attributes and the label list.\n *\n * @param {number} capacity Vertices.\n * @param {{ color?:boolean, texcoord?:boolean, labels?:boolean }} [opts]\n * @returns {{ position:{numComponents:number,data:Float32Array},\n * color?:{numComponents:number,data:Float32Array},\n * texcoord?:{numComponents:number,data:Float32Array},\n * count:number, labels?:object[] }}\n */\nfunction createArrays(capacity, opts) {\n const o = opts || {};\n const n = Math.max(0, capacity | 0);\n const out = { position: { numComponents: 3, data: new Float32Array(3 * n) } };\n if (o.color) out.color = { numComponents: 4, data: new Float32Array(4 * n) };\n if (o.texcoord) out.texcoord = { numComponents: 2, data: new Float32Array(2 * n) };\n out.count = 0;\n if (o.labels) out.labels = [];\n return out;\n}\n\n/**\n * Reallocate an arrays object to a new capacity, keeping its attribute set;\n * the data is fresh (a generator refills it) and count is 0.\n *\n * @param {object} out An arrays object from createArrays.\n * @param {number} capacity Vertices.\n * @returns {object} out\n */\nfunction growArrays(out, capacity) {\n const n = Math.max(0, capacity | 0);\n out.position.data = new Float32Array(3 * n);\n if (out.color) out.color.data = new Float32Array(4 * n);\n if (out.texcoord) out.texcoord.data = new Float32Array(2 * n);\n out.count = 0;\n if (out.labels) out.labels.length = 0;\n return out;\n}\n\n/**\n * The vertex capacity of an arrays object: position.data.length / 3.\n * @param {object} out\n * @returns {number}\n */\nfunction capacityOf(out) {\n return (out.position.data.length / 3) | 0;\n}\n\n// =========================================================================\n// G2 The writer — a cursor over out; counts every vertex, writes those\n// within capacity. Module-level scratch: a generator runs to completion.\n// =========================================================================\n\nconst _w = { pos: null, col: null, tex: null, cap: 0, n: 0, r: 1, g: 1, b: 1, a: 1 };\nconst _WHITE = [1, 1, 1, 1];\n\nfunction _begin(out) {\n _w.pos = out.position.data;\n _w.col = out.color ? out.color.data : null;\n _w.tex = out.texcoord ? out.texcoord.data : null;\n _w.cap = (_w.pos.length / 3) | 0;\n _w.n = 0;\n if (out.labels) out.labels.length = 0;\n}\n\n/** Set the current colour from an RGB(A) array, with an alpha override. */\nfunction _color(c, alpha) {\n const v = c || _WHITE;\n _w.r = v[0]; _w.g = v[1]; _w.b = v[2];\n _w.a = alpha != null ? alpha : (v.length > 3 ? v[3] : 1);\n}\n\nfunction _vertex(x, y, z) {\n const n = _w.n++;\n if (n >= _w.cap) return;\n const p = _w.pos, i = 3 * n;\n p[i] = x; p[i + 1] = y; p[i + 2] = z;\n const c = _w.col;\n if (c) { const j = 4 * n; c[j] = _w.r; c[j + 1] = _w.g; c[j + 2] = _w.b; c[j + 3] = _w.a; }\n}\n\nfunction _line(x0, y0, z0, x1, y1, z1) {\n _vertex(x0, y0, z0);\n _vertex(x1, y1, z1);\n}\n\n/** A vertex with a texture coordinate (written when out.texcoord exists). */\nfunction _vertexUV(x, y, z, u, v) {\n const n = _w.n;\n _vertex(x, y, z);\n if (_w.tex && n < _w.cap) { _w.tex[2*n] = u; _w.tex[2*n + 1] = v; }\n}\n\n/** Normalise v in place; a zero vector becomes (dx, dy, dz). */\nfunction _unit(v, dx, dy, dz) {\n const l = Math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);\n if (l < 1e-9) { v[0] = dx; v[1] = dy; v[2] = dz; return v; }\n v[0] /= l; v[1] /= l; v[2] /= l;\n return v;\n}\n\n/** Orthonormal in-plane basis (ub, vb) for a unit normal n, seeded from the least-aligned axis. */\nfunction _basis(n, ub, vb) {\n const ax = Math.abs(n[0]), ay = Math.abs(n[1]), az = Math.abs(n[2]);\n let rx = 0, ry = 0, rz = 0;\n if (ax <= ay && ax <= az) rx = 1; else if (ay <= az) ry = 1; else rz = 1;\n ub[0] = ry*n[2] - rz*n[1]; ub[1] = rz*n[0] - rx*n[2]; ub[2] = rx*n[1] - ry*n[0];\n _unit(ub, 1, 0, 0);\n vb[0] = n[1]*ub[2] - n[2]*ub[1]; vb[1] = n[2]*ub[0] - n[0]*ub[2]; vb[2] = n[0]*ub[1] - n[1]*ub[0];\n}\n\n/** The four edges of a square of half-extent h at c, spanned by u, v. */\nfunction _square(c, u, v, h) {\n const x0 = c[0] - h*u[0] - h*v[0], y0 = c[1] - h*u[1] - h*v[1], z0 = c[2] - h*u[2] - h*v[2];\n const x1 = c[0] + h*u[0] - h*v[0], y1 = c[1] + h*u[1] - h*v[1], z1 = c[2] + h*u[2] - h*v[2];\n const x2 = c[0] + h*u[0] + h*v[0], y2 = c[1] + h*u[1] + h*v[1], z2 = c[2] + h*u[2] + h*v[2];\n const x3 = c[0] - h*u[0] + h*v[0], y3 = c[1] - h*u[1] + h*v[1], z3 = c[2] - h*u[2] + h*v[2];\n _line(x0, y0, z0, x1, y1, z1);\n _line(x1, y1, z1, x2, y2, z2);\n _line(x2, y2, z2, x3, y3, z3);\n _line(x3, y3, z3, x0, y0, z0);\n}\n\n/** Close the write: count ← what fits; return what was needed. */\nfunction _end(out) {\n out.count = _w.n < _w.cap ? _w.n : _w.cap;\n return _w.n;\n}\n\n/** A sampled circle (or arc of `sweep`) of radius r at c, spanned by u, v: n segments. */\nfunction _ring(cx, cy, cz, r, u, v, n, sweep) {\n let px = 0, py = 0, pz = 0;\n for (let i = 0; i <= n; i++) {\n const t = (i / n) * sweep;\n const ct = Math.cos(t) * r, st = Math.sin(t) * r;\n const x = cx + ct*u[0] + st*v[0];\n const y = cy + ct*u[1] + st*v[1];\n const z = cz + ct*u[2] + st*v[2];\n if (i > 0) _line(px, py, pz, x, y, z);\n px = x; py = y; pz = z;\n }\n}\n\n// =========================================================================\n// G3 Axes, grid, cross, bulls-eye, ring\n// =========================================================================\n\n/**\n * A coordinate frame at the origin: six half-axes by bit and, with LABELS,\n * the X (2 lines) · Y (4) · Z (3) glyphs at 1.04 · size, sized size / 40 ×\n * size / 30. Semantic colour per axis and its glyph (COLOR_X / Y / Z), or\n * opts.color when `semantic` is false.\n *\n * Count: 2 · axes + 18 · (LABELS ? 1 : 0), at most 30.\n *\n * @param {object} out Arrays object.\n * @param {{ size?:number, bits?:number, semantic?:boolean, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction axesLines(out, opts) {\n const o = opts || {};\n const size = o.size ?? 100;\n const bits = o.bits ?? (LABELS | X | Y | Z);\n const semantic = o.semantic !== false;\n const axis = (i) => _color(semantic ? _AXIS_COLORS[i] : o.color);\n _begin(out);\n if (bits & LABELS) {\n const cw = size/40, ch = size/30, cs = 1.04*size;\n axis(0);\n _line(cs, cw, -ch, cs, -cw, ch);\n _line(cs, -cw, -ch, cs, cw, ch);\n axis(1);\n _line( cw, cs, ch, 0, cs, 0);\n _line( 0, cs, 0, -cw, cs, ch);\n _line(-cw, cs, ch, 0, cs, 0);\n _line( 0, cs, 0, 0, cs, -ch);\n axis(2);\n _line(-cw, -ch, cs, cw, -ch, cs);\n _line( cw, -ch, cs, -cw, ch, cs);\n _line(-cw, ch, cs, cw, ch, cs);\n }\n axis(0);\n if (bits & X) _line(0, 0, 0, size, 0, 0);\n if (bits & _X) _line(0, 0, 0, -size, 0, 0);\n axis(1);\n if (bits & Y) _line(0, 0, 0, 0, size, 0);\n if (bits & _Y) _line(0, 0, 0, 0, -size, 0);\n axis(2);\n if (bits & Z) _line(0, 0, 0, 0, 0, size);\n if (bits & _Z) _line(0, 0, 0, 0, 0, -size);\n return _end(out);\n}\n\n/**\n * A grid in the XY plane: subdivisions + 1 lines each way spanning ±size.\n * Orientation is the caller's M (a ground plane is a rotation about X).\n *\n * Count: 4 · (subdivisions + 1).\n *\n * @param {object} out Arrays object.\n * @param {{ size?:number, subdivisions?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction gridLines(out, opts) {\n const o = opts || {};\n const size = o.size ?? 100;\n const sub = Math.max(1, (o.subdivisions ?? 10) | 0);\n _begin(out);\n _color(o.color);\n for (let i = 0; i <= sub; i++) {\n const pos = size * (2*i/sub - 1);\n _line(pos, -size, 0, pos, size, 0);\n _line(-size, pos, 0, size, pos, 0);\n }\n return _end(out);\n}\n\n/**\n * A crosshair in HUD space (z = 0, target pixels): two lines of `size`\n * through (x, y). The bridge projects a model origin and converts a world\n * size to pixels before this call.\n *\n * Count: 4.\n *\n * @param {object} out Arrays object.\n * @param {{ x?:number, y?:number, size?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction crossLines(out, opts) {\n const o = opts || {};\n const x = o.x ?? 0, y = o.y ?? 0, half = (o.size ?? 50) / 2;\n _begin(out);\n _color(o.color);\n _line(x - half, y, 0, x + half, y, 0);\n _line(x, y - half, 0, x, y + half, 0);\n return _end(out);\n}\n\n/**\n * A bulls-eye in HUD space (z = 0, target pixels): a sampled circle of\n * radius size / 2 (`detail` segments) or the cornered square (8 lines),\n * plus the central cross at 0.6 · half.\n *\n * Count: 2 · detail + 4 (CIRCLE) or 20 (SQUARE).\n *\n * @param {object} out Arrays object.\n * @param {{ x?:number, y?:number, size?:number, shape?:number, detail?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction bullsEyeLines(out, opts) {\n const o = opts || {};\n const x = o.x ?? 0, y = o.y ?? 0, half = (o.size ?? 50) / 2;\n const shape = o.shape ?? CIRCLE;\n const detail = Math.max(3, (o.detail ?? 50) | 0);\n _begin(out);\n _color(o.color);\n if (shape === CIRCLE) {\n _ring(x, y, 0, half, _U, _V, detail, TWO_PI);\n } else {\n const c = 0.6 * half;\n _line(x-half, y-half+c, 0, x-half, y-half, 0);\n _line(x-half, y-half, 0, x-half+c, y-half, 0);\n _line(x+half-c, y-half, 0, x+half, y-half, 0);\n _line(x+half, y-half, 0, x+half, y-half+c, 0);\n _line(x+half, y+half-c, 0, x+half, y+half, 0);\n _line(x+half, y+half, 0, x+half-c, y+half, 0);\n _line(x-half+c, y+half, 0, x-half, y+half, 0);\n _line(x-half, y+half, 0, x-half, y+half-c, 0);\n }\n const ch = 0.6 * half;\n _line(x - ch, y, 0, x + ch, y, 0);\n _line(x, y - ch, 0, x, y + ch, 0);\n return _end(out);\n}\n\n/**\n * A sampled circle of radius r at (cx, cy, cz) spanned by the orthonormal\n * u, v — the shared primitive; a partial `sweep` gives an arc from u.\n *\n * Count: 2 · detail.\n *\n * @param {object} out Arrays object.\n * @param {number} cx,cy,cz Centre.\n * @param {number} r Radius.\n * @param {number[]} u,v Orthonormal in-plane basis.\n * @param {{ detail?:number, sweep?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction ringLines(out, cx, cy, cz, r, u, v, opts) {\n const o = opts || {};\n const detail = Math.max(1, (o.detail ?? 48) | 0);\n const sweep = o.sweep ?? TWO_PI;\n _begin(out);\n _color(o.color);\n _ring(cx, cy, cz, r, u, v, detail, sweep);\n return _end(out);\n}\n\n// =========================================================================\n// G4 Frustum and Hermite\n// =========================================================================\n\nconst _isMat = (cam) => cam != null && cam.mat4Eye != null && cam.mat4Proj != null;\n\n/** Corner i of out24 ← E · (x, y, z). */\nfunction _corner(out24, i, E, x, y, z) {\n mat4MulPoint(_p3, E, x, y, z);\n out24[3*i] = _p3[0]; out24[3*i + 1] = _p3[1]; out24[3*i + 2] = _p3[2];\n}\n\n/**\n * The eight world-space corners of a camera's frustum: the near face 0–3\n * counter-clockwise from bottom-left (BL, BR, TR, TL), then the far face\n * 4–7 in the same order — so corners 3, 2, 1, 0 are a pane's TL, TR, BR,\n * BL. `cam` is a camera state (its symmetric extents from fov or\n * halfHeight and `aspect`), or { mat4Eye, mat4Proj, ndcZMin? } for a\n * matrix-captured camera (the extents read off the projection). The far\n * extents follow by similar triangles, or equal the near ones under\n * orthographic.\n *\n * @param {Float64Array|number[]} out24 24-element destination.\n * @param {object} cam Camera state, or { mat4Eye, mat4Proj, ndcZMin? }.\n * @param {number} [aspect=1] Viewport width / height (state form).\n * @param {number} [ndcZMin=WEBGL] NDC-z convention when the matrix form carries none.\n * @returns {Float64Array|number[]|null} out24, or null when the state's lens is unset.\n */\nfunction frustumCorners(out24, cam, aspect, ndcZMin) {\n let E, n, f, l, r, t, b, ortho;\n if (_isMat(cam)) {\n E = cam.mat4Eye;\n const P = cam.mat4Proj, z = cam.ndcZMin ?? ndcZMin ?? WEBGL;\n ortho = projIsOrtho(P);\n n = projNear(P, z); f = projFar(P);\n l = projLeft(P, z); r = projRight(P, z); t = projTop(P, z); b = projBottom(P, z);\n } else {\n ortho = cam.fov == null;\n if (ortho && cam.halfHeight == null) return null;\n n = cam.near; f = cam.far;\n t = ortho ? cam.halfHeight : n * Math.tan(cam.fov / 2);\n r = t * (aspect ?? 1);\n b = -t; l = -r;\n E = cameraEye(_E, cam);\n }\n const k = ortho ? 1 : f / n;\n _corner(out24, 0, E, l, b, -n);\n _corner(out24, 1, E, r, b, -n);\n _corner(out24, 2, E, r, t, -n);\n _corner(out24, 3, E, l, t, -n);\n _corner(out24, 4, E, k*l, k*b, -f);\n _corner(out24, 5, E, k*r, k*b, -f);\n _corner(out24, 6, E, k*r, k*t, -f);\n _corner(out24, 7, E, k*l, k*t, -f);\n return out24;\n}\n\n/** Line between corners i and j of the scratch corners. */\nfunction _edge(i, j) {\n _line(_c24[3*i], _c24[3*i + 1], _c24[3*i + 2], _c24[3*j], _c24[3*j + 1], _c24[3*j + 2]);\n}\n\n/**\n * A camera's frustum as edges by bit: NEAR and FAR the two rectangles,\n * BODY the four edges joining them, APEX (perspective only) the eye to\n * the near corners. `cam` as frustumCorners takes it.\n *\n * Count: 8 · (NEAR + FAR + BODY + APEX), at most 32.\n *\n * @param {object} out Arrays object.\n * @param {object} cam Camera state, or { mat4Eye, mat4Proj, ndcZMin? }.\n * @param {{ aspect?:number, ndcZMin?:number, bits?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed (0 when the state's lens is unset).\n */\nfunction frustumLines(out, cam, opts) {\n const o = opts || {};\n const bits = o.bits ?? (NEAR | FAR | BODY | APEX);\n _begin(out);\n _color(o.color);\n if (frustumCorners(_c24, cam, o.aspect ?? 1, o.ndcZMin ?? WEBGL) === null) return _end(out);\n if (bits & NEAR) { _edge(0, 1); _edge(1, 2); _edge(2, 3); _edge(3, 0); }\n if (bits & FAR) { _edge(4, 5); _edge(5, 6); _edge(6, 7); _edge(7, 4); }\n if (bits & BODY) { _edge(0, 4); _edge(1, 5); _edge(2, 6); _edge(3, 7); }\n const persp = _isMat(cam) ? !projIsOrtho(cam.mat4Proj) : cam.fov != null;\n if ((bits & APEX) && persp) {\n const E = _isMat(cam) ? cam.mat4Eye : null;\n const ex = E ? E[12] : cam.eye[0], ey = E ? E[13] : cam.eye[1], ez = E ? E[14] : cam.eye[2];\n for (let i = 0; i < 4; i++) _line(ex, ey, ez, _c24[3*i], _c24[3*i + 1], _c24[3*i + 2]);\n }\n return _end(out);\n}\n\n/**\n * One cubic Hermite segment through hermiteVec3, as a polyline of\n * `samples` steps.\n *\n * Count: 2 · samples.\n *\n * @param {object} out Arrays object.\n * @param {number[]} p0,t0 Start point and its outgoing tangent.\n * @param {number[]} p1,t1 End point and its incoming tangent.\n * @param {{ samples?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction hermiteLines(out, p0, t0, p1, t1, opts) {\n const o = opts || {};\n const N = Math.max(1, (o.samples ?? 32) | 0);\n _begin(out);\n _color(o.color);\n for (let i = 0; i <= N; i++) {\n hermiteVec3(_p3, p0, t0, p1, t1, i / N);\n if (i > 0) _line(_q3[0], _q3[1], _q3[2], _p3[0], _p3[1], _p3[2]);\n _q3[0] = _p3[0]; _q3[1] = _p3[1]; _q3[2] = _p3[2];\n }\n return _end(out);\n}\n\n// =========================================================================\n// G5 Path, helm rig, locus, pane\n// =========================================================================\n\n/**\n * A PoseTrack or CameraTrack's path by bit, over the track's own samplers\n * (samplePos / sampleEye / sampleCenter and the tangent readers), so the\n * interpolation modes are honoured: PATH the sampled polyline, `samples`\n * per segment; CONTROLS the straight control polygon; TANGENTS_IN /\n * TANGENTS_OUT the tangent at each keyframe scaled by `tangentScale`;\n * CENTER (camera tracks) the gaze line eye → center per keyframe and a\n * three-axis star of half-size `centerSize` at the center. `target`\n * ('eye' or 'center') picks a camera track's path for the first three\n * bits. Markers and handles are the bridge's composition.\n *\n * Count: 2 · samples · segments (PATH) + 2 · segments (CONTROLS) +\n * 2 · keyframes per tangent bit + 8 · keyframes (CENTER).\n *\n * @param {object} out Arrays object.\n * @param {object} track PoseTrack or CameraTrack.\n * @param {{ bits?:number, samples?:number, tangentScale?:number, target?:string,\n * centerSize?:number, color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction pathLines(out, track, opts) {\n const o = opts || {};\n const bits = o.bits ?? (PATH | CONTROLS | TANGENTS_IN | TANGENTS_OUT);\n const N = Math.max(1, (o.samples ?? 32) | 0);\n const ts = o.tangentScale ?? 0.25;\n const cs = o.centerSize ?? 4;\n const kfs = track.keyframes, n = kfs.length;\n const isCamera = typeof track.sampleEye === 'function';\n const useCenter = isCamera && o.target === 'center';\n const field = isCamera ? (useCenter ? 'center' : 'eye') : 'pos';\n const sampler = isCamera ? (useCenter ? 'sampleCenter' : 'sampleEye') : 'samplePos';\n const tangents = isCamera ? (useCenter ? 'centerTangents' : 'eyeTangents') : 'tangents';\n _begin(out);\n _color(o.color);\n if ((bits & PATH) && n > 1) {\n for (let seg = 0; seg < n - 1; seg++) {\n for (let i = 0; i <= N; i++) {\n track[sampler](_p3, seg, i / N);\n if (i > 0) _line(_q3[0], _q3[1], _q3[2], _p3[0], _p3[1], _p3[2]);\n _q3[0] = _p3[0]; _q3[1] = _p3[1]; _q3[2] = _p3[2];\n }\n }\n }\n if (bits & CONTROLS) {\n for (let i = 0; i < n - 1; i++) {\n const a = kfs[i][field], b = kfs[i + 1][field];\n _line(a[0], a[1], a[2], b[0], b[1], b[2]);\n }\n }\n if (bits & (TANGENTS_IN | TANGENTS_OUT)) {\n for (let i = 0; i < n; i++) {\n track[tangents](_tIn, _tOut, i);\n const k = kfs[i][field];\n if (bits & TANGENTS_IN) _line(k[0] - ts*_tIn[0], k[1] - ts*_tIn[1], k[2] - ts*_tIn[2], k[0], k[1], k[2]);\n if (bits & TANGENTS_OUT) _line(k[0], k[1], k[2], k[0] + ts*_tOut[0], k[1] + ts*_tOut[1], k[2] + ts*_tOut[2]);\n }\n }\n if ((bits & CENTER) && isCamera) {\n for (let i = 0; i < n; i++) {\n const e = kfs[i].eye, c = kfs[i].center;\n _line(e[0], e[1], e[2], c[0], c[1], c[2]);\n _line(c[0] - cs, c[1], c[2], c[0] + cs, c[1], c[2]);\n _line(c[0], c[1] - cs, c[2], c[0], c[1] + cs, c[2]);\n _line(c[0], c[1], c[2] - cs, c[0], c[1], c[2] + cs);\n }\n }\n return _end(out);\n}\n\n/** An arrow along principal axis `axis` (0 X, 1 Y, 2 Z): signed length L, head size h — 5 lines. */\nfunction _arrow(axis, L, h) {\n const a = (axis + 1) % 3, b = (axis + 2) % 3;\n _tip[0] = _tip[1] = _tip[2] = 0; _tip[axis] = L;\n _line(0, 0, 0, _tip[0], _tip[1], _tip[2]);\n const s = Math.sign(L) || 1;\n _ha[0] = _ha[1] = _ha[2] = 0; _ha[axis] = L - s*h;\n _ha[a] = h*0.5; _line(_tip[0], _tip[1], _tip[2], _ha[0], _ha[1], _ha[2]);\n _ha[a] = -h*0.5; _line(_tip[0], _tip[1], _tip[2], _ha[0], _ha[1], _ha[2]);\n _ha[a] = 0;\n _ha[b] = h*0.5; _line(_tip[0], _tip[1], _tip[2], _ha[0], _ha[1], _ha[2]);\n _ha[b] = -h*0.5; _line(_tip[0], _tip[1], _tip[2], _ha[0], _ha[1], _ha[2]);\n}\n\n/**\n * A helm's rig, colour always semantic: per translation channel a dim\n * baseline arrow of signed length sign · size · sens / 0.30 and, while the\n * channel's activity is non-zero, a bright arrow of length ∝ |activity| /\n * (sens · fullScale); per rotation channel a dim ring of radius size / 2 ·\n * sens / 0.0025 and a bright arc sweeping π · f in the live direction.\n * Dim and bright are the alpha of the written colour (COLOR_DIM, 1). With\n * `identify`, one anchor per channel goes to out.labels as { x, y, z,\n * text: 'L' + lane }. Orientation is the caller's M.\n *\n * Count: 10 · 3 · 2 (arrows) + 96 · 3 (rings) + 48 · 3 (arcs), at most 492;\n * the bright half only while a channel is active.\n *\n * @param {object} out Arrays object.\n * @param {object} helm A PoseHelm (profile, fullScale, activity).\n * @param {{ size?:number, bits?:number, identify?:boolean }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction helmRigLines(out, helm, opts) {\n const o = opts || {};\n const size = o.size ?? 100;\n const bits = o.bits ?? (TRANSLATE | ROTATE);\n const identify = o.identify === true;\n const prof = helm.profile;\n const head = size * 0.08, ringR0 = size * 0.5;\n const TREF = 0.30, RREF = 0.0025, FULL = helm.fullScale, ARC_FULL = Math.PI;\n helm.activity(_act);\n _begin(out);\n const labels = identify && out.labels ? out.labels : null;\n if (bits & TRANSLATE) {\n const T = [prof.Tx, prof.Ty, prof.Tz];\n for (let ax = 0; ax < 3; ax++) {\n const ch = T[ax];\n const L = ch.sign * size * (ch.sens / TREF);\n _color(_AXIS_COLORS[ax], COLOR_DIM);\n _arrow(ax, L, head);\n const a = _act[ax];\n if (a !== 0) {\n const f = Math.min(Math.abs(a) / (ch.sens * FULL), 1);\n _color(_AXIS_COLORS[ax], 1);\n _arrow(ax, Math.sign(a) * f * Math.abs(L), head);\n }\n if (labels) {\n const lp = [0, 0, 0]; lp[ax] = L + ch.sign * head * 1.5;\n labels.push({ x: lp[0], y: lp[1], z: lp[2], text: 'L' + ch.lane });\n }\n }\n }\n if (bits & ROTATE) {\n const R = [prof.Rp, prof.Ry, prof.Rr]; // pitch ⊥ X, yaw ⊥ Y, roll ⊥ Z\n for (let ax = 0; ax < 3; ax++) {\n const ch = R[ax];\n const r = ringR0 * (ch.sens / RREF);\n const u = _AXES[(ax + 1) % 3], v = _AXES[(ax + 2) % 3];\n _color(_AXIS_COLORS[ax], COLOR_DIM);\n _ring(0, 0, 0, r, u, v, 48, TWO_PI);\n const a = _act[3 + ax];\n if (a !== 0) {\n const f = Math.min(Math.abs(a) / (ch.sens * FULL), 1);\n _color(_AXIS_COLORS[ax], 1);\n _ring(0, 0, 0, r, u, v, 24, Math.sign(a) * f * ARC_FULL);\n }\n if (labels) {\n const lp = [0, 0, 0]; lp[(ax + 1) % 3] = r;\n labels.push({ x: lp[0], y: lp[1], z: lp[2], text: 'L' + ch.lane });\n }\n }\n }\n return _end(out);\n}\n\n/**\n * A handle's stroked parts by bit. AIM: anchor → `point` (the handle's\n * current point, read by the caller with value). LOCUS by constraint.kind:\n * SPHERE three great circles about the anchor; PLANE a square of\n * half-extent 100 in the plane's basis; AXIS the segment anchor + [min,\n * max] · u; DIAL the ring in the dial plane; a constraint flagged `view`\n * (the host's VIEW) a screen-aligned square of half-extent 100 at `point`,\n * its basis the camera's right and up read off `mat4View`. RING: SPHERE\n * the view-facing limb, a ring perpendicular to anchor − eye (the eye from\n * `mat4View`); PLANE the border of the locus square (written once when\n * both bits ask for it). A constraint supplying locus(out, opts) is\n * dispatched to it. The HANDLE dot is not a line and not generated here.\n *\n * Count: AIM 2; LOCUS SPHERE 288 · PLANE 8 · AXIS 2 · DIAL 96 · view 8;\n * RING SPHERE 96 · PLANE 8 (shared with LOCUS); at most 386.\n *\n * @param {object} out Arrays object.\n * @param {object} constraint A contract-conforming constraint.\n * @param {{ bits?:number, mat4View?:ArrayLike<number>, point?:number[], color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction locusLines(out, constraint, opts) {\n const o = opts || {};\n if (typeof constraint.locus === 'function') return constraint.locus(out, o);\n const bits = o.bits ?? (AIM | LOCUS);\n const c = constraint, a = c.anchor, pt = o.point, V = o.mat4View;\n _begin(out);\n _color(o.color);\n if ((bits & AIM) && a && pt) _line(a[0], a[1], a[2], pt[0], pt[1], pt[2]);\n if (c.view === true) {\n if ((bits & LOCUS) && pt && V) {\n _b0[0] = V[0]; _b0[1] = V[4]; _b0[2] = V[8]; // the camera's right\n _b1[0] = V[1]; _b1[1] = V[5]; _b1[2] = V[9]; // the camera's up\n _square(pt, _b0, _b1, 100);\n }\n } else if (c.kind === SPHERE && a) {\n if (bits & LOCUS) {\n _ring(a[0], a[1], a[2], c.radius, _AXES[0], _AXES[1], 48, TWO_PI);\n _ring(a[0], a[1], a[2], c.radius, _AXES[1], _AXES[2], 48, TWO_PI);\n _ring(a[0], a[1], a[2], c.radius, _AXES[2], _AXES[0], 48, TWO_PI);\n }\n if ((bits & RING) && V) {\n // eye = −Rᵀ t of the view matrix; the limb is ⊥ anchor − eye\n const tx = V[12], ty = V[13], tz = V[14];\n _b2[0] = a[0] + (V[0]*tx + V[1]*ty + V[2]*tz);\n _b2[1] = a[1] + (V[4]*tx + V[5]*ty + V[6]*tz);\n _b2[2] = a[2] + (V[8]*tx + V[9]*ty + V[10]*tz);\n _unit(_b2, 0, 0, 1);\n _basis(_b2, _b0, _b1);\n _ring(a[0], a[1], a[2], c.radius, _b0, _b1, 48, TWO_PI);\n }\n } else if (c.kind === PLANE && a) {\n if (bits & (LOCUS | RING)) {\n _basis(c.n, _b0, _b1);\n _square(a, _b0, _b1, 100);\n }\n } else if (c.kind === AXIS && a) {\n if (bits & LOCUS) {\n const u = c.u;\n _line(a[0] + c.min*u[0], a[1] + c.min*u[1], a[2] + c.min*u[2],\n a[0] + c.max*u[0], a[1] + c.max*u[1], a[2] + c.max*u[2]);\n }\n } else if (c.kind === DIAL && a) {\n if (bits & LOCUS) _ring(a[0], a[1], a[2], c.radius, c.r0, c.r1, 48, TWO_PI);\n }\n return _end(out);\n}\n\n/**\n * A textured quad as two triangles (p0, p1, p2) (p0, p2, p3) — the winding\n * of the corner order — with texcoord written when the array exists.\n * Default uvs: p0 (top-left) → (0, 1), p1 → (1, 1), p2 → (1, 0), p3 →\n * (0, 0), so a texture in GL's bottom-up space reads upright with no\n * flip; `opts.uvs` overrides, four pairs flat in corner order.\n *\n * Count: 6.\n *\n * @param {object} out Arrays object.\n * @param {number[]} p0,p1,p2,p3 Corners, top-left clockwise.\n * @param {{ uvs?:number[], color?:number[] }} [opts]\n * @returns {number} Vertices needed.\n */\nfunction paneTris(out, p0, p1, p2, p3, opts) {\n const o = opts || {};\n const uv = o.uvs || _UV_DEFAULT;\n _begin(out);\n _color(o.color);\n _vertexUV(p0[0], p0[1], p0[2], uv[0], uv[1]);\n _vertexUV(p1[0], p1[1], p1[2], uv[2], uv[3]);\n _vertexUV(p2[0], p2[1], p2[2], uv[4], uv[5]);\n _vertexUV(p0[0], p0[1], p0[2], uv[0], uv[1]);\n _vertexUV(p2[0], p2[1], p2[2], uv[4], uv[5]);\n _vertexUV(p3[0], p3[1], p3[2], uv[6], uv[7]);\n return _end(out);\n}\n\nexport { AIM, APEX, AXIS, BODY, BOTTOM, CENTER, CIRCLE, COLOR_DIM, COLOR_X, COLOR_Y, COLOR_Z, CONTROLS, CameraTrack, Constraint, DIAL, DIRECTION, EYE, FAR, HANDLE, HANDLES, HELM_CHANNELS, INVISIBLE, LABELS, LEFT, LOCUS, MATRIX, MODEL, NDC, NEAR, NONE, ORIGIN, PATH, PLANE, PLANE_BOTTOM, PLANE_FAR, PLANE_LEFT, PLANE_NEAR, PLANE_RIGHT, PLANE_TOP, POINT, PoseHelm, PoseTrack, RIGHT, RING, ROTATE, SCREEN, SELF, SEMIVISIBLE, SPHERE, SQUARE, TANGENTS, TANGENTS_IN, TANGENTS_OUT, TOP, TRANSLATE, VISIBLE, WEBGL, WEBGPU, WORLD, X, Y, Z, _X, _Y, _Z, _i, _j, _k, axesLines, azElFromDir, boxVisibility, bullsEyeLines, cameraCopy, cameraDolly, cameraEye, cameraFromMat4, cameraFromPose, cameraOrbit, cameraPan, cameraPlanes, cameraProj, cameraToPose, cameraView, capacityOf, createArrays, createCamera, createConstraint, crossLines, dirFromAzEl, distanceToPlane, frustumCorners, frustumLines, frustumPlanes, gridLines, growArrays, helmRigLines, hermiteLines, hermiteVec3, i, idToRgba, j, k, lerpVec3, locusLines, mapDirection, mapLocation, mat3Direction, mat3NormalFromMat4, mat4Bias, mat4Eye, mat4FromBasis, mat4FromScale, mat4FromTRS, mat4FromTranslation, mat4Invert, mat4Location, mat4MV, mat4Mul, mat4MulDir, mat4MulPoint, mat4Ortho, mat4PV, mat4Persp, mat4Pick, mat4Reflect, mat4ToRotation, mat4ToScale, mat4ToTransform, mat4ToTranslation, mat4View, oneEuro, paneTris, pathLines, pixelRatio, pointVisibility, pointerHit, poseDelta, projBottom, projFar, projFov, projHfov, projIsOrtho, projLeft, projNear, projRight, projTop, qConjugate, qCopy, qDot, qFromAxisAngle, qFromLookDir, qFromMat4, qFromRotMat3x3, qFromUnitVectors, qMul, qNegate, qNlerp, qNormalize, qRotateVec3, qSet, qSlerp, qToAxisAngle, qToMat4, rayClosestPointOnAxis, rayHitCapsule, rayHitRing, rayHitSphere, rayPlane, raySphere, rgbaToId, ringLines, sphereVisibility, transformToMat4, unproject };\n//# sourceMappingURL=index.js.map\n","/**\n * @file The view bag — the matrices every pick, solve, label and orbit reads.\n * @module host/view\n * @license AGPL-3.0-only\n *\n * The matrices bag mapLocation takes, plus the signed viewport and the NDC\n * convention:\n *\n * view = {\n * mat4Proj, mat4View, mat4PV, mat4PVInv, // Float32Array(16) each, host-owned\n * mat4Eye, // inverse of mat4View — EYE → WORLD\n * vp, // [0, h, w, −h] — y-down, logical canvas px\n * ndcZMin, // WEBGL | WEBGPU, set once at creation\n * stale, // true until a set() with an invertible P · V\n * set(P, V) // copy P and V, recompute PV and PVInv\n * setCamera(cam) // build V and P from a camera state, then set\n * resize(width, height) // the canvas observer's write into vp\n * }\n *\n * mat4PVInv and mat4Eye are recomputed on set, once per frame, so unproject\n * and every mapping from SCREEN or EYE share them. A degenerate P · V or V\n * leaves the previous inverses and marks the bag stale; consumers treat a\n * stale bag as \"no pick this frame\".\n */\n\n'use strict';\n\nimport { WEBGL, mat4Mul, mat4Invert, cameraView, cameraProj } from '@nakednous/tree';\n\nconst _inv = new Float32Array(16); // inverse scratch: the bag keeps its previous inverse on failure\nconst _P = new Float32Array(16); // setCamera's projection\nconst _V = new Float32Array(16); // setCamera's view\n\nfunction _identity(m) {\n m.fill(0);\n m[0] = m[5] = m[10] = m[15] = 1;\n return m;\n}\n\n/**\n * Create a view bag. The matrices start at identity and the bag stale, so a\n * consumer reading it before the first set() picks nothing.\n *\n * @param {{ ndcZMin?:number, width?:number, height?:number }} [opts]\n * ndcZMin: WEBGL (−1, default) or WEBGPU (0) — written once here, never\n * detected. width / height: the initial logical canvas size.\n * @returns {object} The view bag.\n */\nexport function createView(opts) {\n const o = opts || {};\n const w = o.width || 0, h = o.height || 0;\n const view = {\n mat4Proj: _identity(new Float32Array(16)),\n mat4View: _identity(new Float32Array(16)),\n mat4PV: _identity(new Float32Array(16)),\n mat4PVInv: _identity(new Float32Array(16)),\n mat4Eye: _identity(new Float32Array(16)),\n vp: [0, h, w, -h],\n ndcZMin: o.ndcZMin === 0 ? 0 : WEBGL,\n stale: true,\n\n /**\n * Install a projection and a view: both copied, P · V with its inverse\n * and the eye matrix (V's inverse) recomputed. A singular product or\n * view keeps the previous inverses and marks the bag stale.\n * @param {ArrayLike<number>} P Projection mat4.\n * @param {ArrayLike<number>} V View mat4 (world → eye).\n * @returns {object} this\n */\n set(P, V) {\n for (let i = 0; i < 16; i++) { view.mat4Proj[i] = P[i]; view.mat4View[i] = V[i]; }\n mat4Mul(view.mat4PV, view.mat4Proj, view.mat4View);\n if (mat4Invert(_inv, view.mat4PV) === null) { view.stale = true; return view; }\n view.mat4PVInv.set(_inv);\n if (mat4Invert(_inv, view.mat4View) === null) { view.stale = true; return view; }\n view.mat4Eye.set(_inv);\n view.stale = false;\n return view;\n },\n\n /**\n * Install a camera state: cameraView and cameraProj at the viewport's\n * aspect under the bag's ndcZMin, then set(). A state with both fov and\n * halfHeight null keeps the projection already installed.\n * @param {object} cam Camera state.\n * @returns {object} this\n */\n setCamera(cam) {\n const aspect = view.vp[3] !== 0 ? view.vp[2] / -view.vp[3] : 1;\n cameraView(_V, cam);\n const P = cameraProj(_P, cam, aspect, view.ndcZMin) || view.mat4Proj;\n return view.set(P, _V);\n },\n\n /**\n * Write a new logical canvas size into vp: [0, height, width, −height].\n * @param {number} width\n * @param {number} height\n * @returns {object} this\n */\n resize(width, height) {\n view.vp[1] = height; view.vp[2] = width; view.vp[3] = -height;\n return view;\n },\n };\n return view;\n}\n","/**\n * @file The canvas observer — logical size and device pixel ratio.\n * @module host/canvas\n * @license AGPL-3.0-only\n *\n * A ResizeObserver on the canvas element plus devicePixelRatio tracking:\n * on change the observer reports the logical size in CSS px and the dpr to\n * its callback, which the context uses to update host.width / host.height /\n * host.dpr, the view bag's vp, the label layer and the bridge's onSize. The\n * observer never touches canvas.width / canvas.height — that is the\n * renderer's decision.\n *\n * Without a ResizeObserver (a headless run) the size is measured once from\n * the element's bounding rectangle, falling back to its width / height\n * attributes.\n */\n\n'use strict';\n\n/**\n * Measure a canvas: logical CSS size from its bounding rectangle when laid\n * out, else its width / height attributes; dpr from the window.\n * @param {HTMLCanvasElement} canvas\n * @param {number[]} out3 [width, height, dpr] destination.\n * @returns {number[]} out3\n */\nexport function measureCanvas(canvas, out3) {\n const r = typeof canvas.getBoundingClientRect === 'function' ? canvas.getBoundingClientRect() : null;\n const laidOut = r && r.width > 0 && r.height > 0;\n out3[0] = laidOut ? r.width : (canvas.width || 0);\n out3[1] = laidOut ? r.height : (canvas.height || 0);\n out3[2] = (typeof window !== 'undefined' && window.devicePixelRatio) || 1;\n return out3;\n}\n\n/**\n * Observe a canvas's logical size and dpr. `onChange(width, height, dpr)`\n * fires once immediately with the current measure and again on every\n * change; a change is reported only when a value differs.\n *\n * @param {HTMLCanvasElement} canvas\n * @param {function(number, number, number):void} onChange\n * @returns {{ width:number, height:number, dpr:number, measure():void, dispose():void }}\n */\nexport function observeCanvas(canvas, onChange) {\n const m = [0, 0, 1];\n const obs = { width: -1, height: 0, dpr: 1, measure, dispose };\n let ro = null;\n const onWindow = () => measure();\n\n function measure() {\n measureCanvas(canvas, m);\n if (m[0] === obs.width && m[1] === obs.height && m[2] === obs.dpr) return;\n obs.width = m[0]; obs.height = m[1]; obs.dpr = m[2];\n onChange(obs.width, obs.height, obs.dpr);\n }\n\n function dispose() {\n if (ro) { ro.disconnect(); ro = null; }\n if (typeof window !== 'undefined' && window.removeEventListener) window.removeEventListener('resize', onWindow);\n }\n\n measure(); // width −1 makes the first measure report\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(() => measure());\n ro.observe(canvas);\n }\n // A zoom changes devicePixelRatio and fires resize; the observer alone would miss it.\n if (typeof window !== 'undefined' && window.addEventListener) window.addEventListener('resize', onWindow);\n return obs;\n}\n","/**\n * @file The pointer source — a typed event buffer with claims, one per canvas.\n * @module host/pointer\n * @license AGPL-3.0-only\n *\n * Shared by every handle, router and orbit on a canvas. Listeners only\n * record; nothing solves in a listener:\n *\n * - pointerdown · pointermove · pointerup · pointercancel on the canvas,\n * keydown (Esc) on the window.\n * - Coordinates in logical canvas px through the element's bounding\n * rectangle — (clientX − rect.left) · (width / rect.width), the logical\n * size read off the view bag's vp — the numbers mapLocation(SCREEN) and vp\n * expect, so a CSS-scaled canvas maps correctly.\n * - Per pointer: an entry { id, x, y, seq, down, up, cancel, owner }, kept\n * from its press until the frame after its release; `seq` counts moves,\n * so a consumer remembers the last seq it consumed and reads only new\n * motion. Multitouch is per-pointer by construction; the mouse is one\n * more pointer.\n * - Presses queue in order for the frame (`presses`); consumers read the\n * queue inside the frame and claim what they take. Several same-frame\n * presses on different members all land.\n * - Claims: claim(id, owner) captures the pointer on the canvas so a drag\n * that leaves it keeps flowing; release(id), up and cancel release the\n * capture. An unclaimed pointer is what the orbit sees.\n * - Esc sets the cancel flag on every claimed pointer.\n * - flush() ends the frame: the press queue empties and released pointers\n * leave the map. The loop calls it after onFrame; an external loop calls\n * it after its consumers ran (the p5 adapter from postdraw).\n */\n\n'use strict';\n\n/**\n * Create the pointer source of a canvas.\n *\n * @param {HTMLCanvasElement} canvas\n * @param {object} view The view bag; vp[2] and −vp[3] are the logical size.\n * @returns {object} The source: { presses, pointers, get, claim, release,\n * ownerOf, flush, dispose }.\n */\nexport function createPointer(canvas, view) {\n const pointers = new Map(); // id → entry\n const presses = []; // this frame's presses, in order: { id, x, y }\n const xy = [0, 0];\n\n const toCanvas = (e, out) => {\n const r = canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : null;\n const w = view.vp[2], h = -view.vp[3];\n if (r && r.width > 0 && r.height > 0 && w > 0 && h > 0) {\n out[0] = (e.clientX - r.left) * (w / r.width);\n out[1] = (e.clientY - r.top) * (h / r.height);\n } else {\n out[0] = e.clientX; out[1] = e.clientY;\n }\n return out;\n };\n\n const entry = (id) => {\n let p = pointers.get(id);\n if (!p) { p = { id, x: 0, y: 0, seq: 0, down: false, up: false, cancel: false, owner: null }; pointers.set(id, p); }\n return p;\n };\n\n const capture = (id, on) => {\n const f = on ? canvas.setPointerCapture : canvas.releasePointerCapture;\n if (typeof f !== 'function') return;\n try { f.call(canvas, id); } catch (_) { /* best effort: a synthetic or already-released id */ }\n };\n\n const onDown = (e) => {\n const p = entry(e.pointerId);\n toCanvas(e, xy);\n p.x = xy[0]; p.y = xy[1]; p.seq++;\n p.down = true; p.up = false; p.cancel = false;\n presses.push({ id: p.id, x: p.x, y: p.y });\n };\n const onMove = (e) => {\n const p = entry(e.pointerId);\n toCanvas(e, xy);\n p.x = xy[0]; p.y = xy[1]; p.seq++;\n };\n const onUp = (e) => {\n const p = pointers.get(e.pointerId);\n if (!p) return;\n toCanvas(e, xy);\n p.x = xy[0]; p.y = xy[1]; p.seq++;\n p.up = true;\n capture(p.id, false);\n };\n const onCancel = (e) => {\n const p = pointers.get(e.pointerId);\n if (!p) return;\n p.cancel = true;\n capture(p.id, false);\n };\n const onKey = (e) => {\n if (e.key !== 'Escape') return;\n for (const p of pointers.values()) if (p.owner !== null) p.cancel = true;\n };\n\n canvas.addEventListener('pointerdown', onDown);\n canvas.addEventListener('pointermove', onMove);\n canvas.addEventListener('pointerup', onUp);\n canvas.addEventListener('pointercancel', onCancel);\n if (typeof window !== 'undefined' && window.addEventListener) window.addEventListener('keydown', onKey);\n\n const source = {\n /** This frame's presses in order, each { id, x, y }; emptied by flush(). */\n presses,\n /** The live pointer entries by id. */\n pointers,\n\n /**\n * The entry of a pointer, or null when it is not on the canvas.\n * @param {number} id\n * @returns {object|null}\n */\n get(id) { return pointers.get(id) || null; },\n\n /**\n * Claim a pointer for an owner and capture it on the canvas. Fails when\n * another owner holds it or the pointer is unknown.\n * @param {number} id\n * @param {object} owner\n * @returns {boolean} claimed\n */\n claim(id, owner) {\n const p = pointers.get(id);\n if (!p || (p.owner !== null && p.owner !== owner)) return false;\n p.owner = owner;\n capture(id, true);\n return true;\n },\n\n /**\n * Release a claim and the capture with it. No-op for an unclaimed id.\n * @param {number} id\n */\n release(id) {\n const p = pointers.get(id);\n if (!p || p.owner === null) return;\n p.owner = null;\n capture(id, false);\n },\n\n /**\n * The owner holding a pointer, or null.\n * @param {number} id\n * @returns {object|null}\n */\n ownerOf(id) { const p = pointers.get(id); return p ? p.owner : null; },\n\n /**\n * End the frame: the press queue empties; pointers that released or\n * cancelled leave the map (their claims dropped), the rest keep their\n * position and seq.\n */\n flush() {\n presses.length = 0;\n for (const [id, p] of pointers) {\n if (p.up || p.cancel) { p.owner = null; pointers.delete(id); }\n }\n },\n\n /** Remove every listener and release every capture. */\n dispose() {\n canvas.removeEventListener('pointerdown', onDown);\n canvas.removeEventListener('pointermove', onMove);\n canvas.removeEventListener('pointerup', onUp);\n canvas.removeEventListener('pointercancel', onCancel);\n if (typeof window !== 'undefined' && window.removeEventListener) window.removeEventListener('keydown', onKey);\n for (const p of pointers.values()) if (p.owner !== null) capture(p.id, false);\n pointers.clear();\n presses.length = 0;\n },\n };\n return source;\n}\n","/**\n * @file The players registry and the frame loop.\n * @module host/loop\n * @license AGPL-3.0-only\n *\n * A player is { tick(dt) → boolean }, removed from the registry when it\n * returns false. Iteration snapshots the set, so a player may remove itself\n * or add another during a tick. Tracks register through their activation\n * hooks, helms until disposed.\n *\n * The loop is optional: with it, requestAnimationFrame (overridable — the\n * seam a WebXR session fills) drives onFrame(dt) with dt in seconds clamped\n * to 50 ms, the stalled-tab guard; without it the application ticks the\n * players from its own loop.\n */\n\n'use strict';\n\n/**\n * Create a players registry.\n * @returns {{ add(player):object, remove(player):object, has(player):boolean,\n * tick(dt:number):void, size:number, clear():void }}\n */\nexport function createPlayers() {\n const set = new Set();\n const players = {\n /** Register a player; adding one already present is a no-op. */\n add(player) { if (player) set.add(player); return players; },\n /** Unregister a player. */\n remove(player) { set.delete(player); return players; },\n /** Whether a player is registered. */\n has(player) { return set.has(player); },\n /** Tick every player with dt (seconds); one returning false is removed. */\n tick(dt) {\n for (const p of [...set]) {\n if (!set.has(p)) continue; // removed by an earlier player this tick\n if (p.tick(dt) === false) set.delete(p);\n }\n },\n /** Registered count. */\n get size() { return set.size; },\n /** Unregister every player. */\n clear() { set.clear(); },\n };\n return players;\n}\n\nconst _now = () => (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n\n/**\n * Create a frame loop. `onFrame(dt)` runs once per animation frame with the\n * clamped period in seconds; start() schedules, stop() cancels.\n *\n * @param {{ onFrame:function(number):void, raf?:function, caf?:function,\n * clampMs?:number, now?:function():number }} opts\n * raf / caf default to the window's requestAnimationFrame /\n * cancelAnimationFrame; clampMs defaults to 50.\n * @returns {{ start():object, stop():object, running:boolean, dt:number }}\n */\nexport function createLoop(opts) {\n const o = opts || {};\n const raf = o.raf || ((cb) => requestAnimationFrame(cb));\n const caf = o.caf || ((id) => cancelAnimationFrame(id));\n const now = o.now || _now;\n const clamp = (o.clampMs ?? 50) / 1000;\n let handle = null, last = 0;\n const loop = {\n running: false,\n dt: 0,\n start() {\n if (loop.running) return loop;\n loop.running = true;\n last = now();\n const frame = () => {\n if (!loop.running) return;\n const t = now();\n loop.dt = Math.min((t - last) / 1000, clamp);\n last = t;\n o.onFrame(loop.dt);\n if (loop.running) handle = raf(frame);\n };\n handle = raf(frame);\n return loop;\n },\n stop() {\n loop.running = false;\n if (handle !== null) { caf(handle); handle = null; }\n return loop;\n },\n };\n return loop;\n}\n","/**\n * @file The handle controller — a draggable constraint driven from the pointer source.\n * @module host/handle\n * @license AGPL-3.0-only\n *\n * Wraps a core Constraint (@nakednous/tree) with the transport a draggable\n * 3D control needs: presses, moves and releases from the host's pointer\n * source, a pixel → ray unprojection through the host's view bag, an\n * analytic pick against the constraint's proxy, and a host-driven update()\n * lifecycle. No drawing: a bridge draws the locus (locusLines) and the dot.\n *\n * ── update() ordering contract ─────────────────────────────────────────────\n * update() is host-driven, before the orbit, because the orbit gate depends\n * on the grab resolving first:\n *\n * onFrame() { setCamera(cam); if (!h.update()) orbit.update(); scene() }\n *\n * ── Pick ───────────────────────────────────────────────────────────────────\n * The pointer's ray is unproject(x, y, view) in WORLD; the grab size is\n * grabPx converted to world units through pixelRatio at the proxy's depth;\n * the constraint's proxy(ray, radius) answers t or Infinity. Built-in kinds\n * carry their proxy (a sphere at the point, the DIAL's ring); a custom kind\n * supplies one or gets the sphere. solve() runs in WORLD; value() converts.\n *\n * ── Pointer source ─────────────────────────────────────────────────────────\n * update() reads the frame's press queue and the tracked pointer's entry\n * (seq counts moves; up / cancel end the gesture; Esc cancels every claimed\n * pointer). A grab claims the pointer, which captures it on the canvas; a\n * miss leaves it unclaimed for the orbit. The whole gesture keys to one\n * pointerId, so on a shared surface each handle tracks its own finger.\n *\n * ── Constraint kinds ───────────────────────────────────────────────────────\n * Core SPHERE / PLANE / AXIS / DIAL pass straight through. VIEW is a core\n * PLANE re-aimed at the camera each solve — a screen-parallel drag plane\n * through the current point — reported as a world position; its constraint\n * carries `view: true`, the flag locusLines reads. A custom kind is a\n * contract-conforming object (kind / solve / value / seed, optional scalar /\n * azEl / aim / proxy / locus) passed as `constraint`.\n *\n * ── Snap / hover / cancel / from ───────────────────────────────────────────\n * snap quantises at the solve seam: an angular step for SPHERE (az/el) and\n * DIAL (θ), a world grid for PLANE / AXIS / VIEW (PLANE re-projecting).\n * hover is a lone-handle opt-in (a router provides it shared). Cancel — Esc,\n * pointercancel, cancel() — reverts to the value captured at grab, restores\n * the binding and fires onCancel instead of onRelease. `from` names the space\n * the symbolic basis (axis / normal / zero) resolves FROM into WORLD each idle\n * frame through mapDirection on the view bag — WORLD, EYE, or a mat4 —\n * frozen at grab.\n */\n\n'use strict';\n\nimport {\n createConstraint, dirFromAzEl, unproject, rayHitSphere,\n mapLocation, mapDirection, pixelRatio, mat4Invert,\n SPHERE, PLANE, AXIS, DIAL, POINT, DIRECTION, WORLD, MATRIX,\n} from '@nakednous/tree';\n\n/** The screen-parallel free-translate constraint (a core PLANE re-aimed each solve). */\nexport const VIEW = 4;\n\n// Module-level scratch — update() and value() run to completion within one\n// frame with no reentrancy across handles.\nconst _rayO = [0, 0, 0]; // pick ray origin, WORLD\nconst _rayD = [0, 0, 0]; // pick ray unit direction, WORLD\n/** The ray scratch a handle's _ray(x, y) fills — the router's shared pick reads it. */\nexport const rayScratch = { o: _rayO, d: _rayD };\nconst _v3 = [0, 0, 0]; // value() extraction scratch\nconst _q2 = [0, 0]; // az/el snap scratch\nconst _b0 = [0, 0, 0]; // resolved θ = 0 reference\nconst _b2 = [0, 0, 0]; // resolved axis / normal\nconst _frameInv = new Float32Array(16);\n\n// The mapping bag mapLocation / mapDirection take: the view's matrices plus\n// the frames a call names (a mat4 `from` or `to` is the MATRIX space).\nconst _bag = { mat4Proj: null, mat4View: null, mat4PV: null, mat4PVInv: null, mat4Eye: null,\n fromFrame: null, toFrame: null, toFrameInv: null };\nconst _isMat = (s) => s != null && typeof s !== 'string';\nconst _space = (s) => (_isMat(s) ? MATRIX : s);\n\nfunction _bagOf(view, from, to) {\n _bag.mat4Proj = view.mat4Proj; _bag.mat4View = view.mat4View;\n _bag.mat4PV = view.mat4PV; _bag.mat4PVInv = view.mat4PVInv; _bag.mat4Eye = view.mat4Eye;\n _bag.fromFrame = _isMat(from) ? from : null;\n if (_isMat(to)) { _bag.toFrame = to; _bag.toFrameInv = mat4Invert(_frameInv, to) ? _frameInv : null; }\n else { _bag.toFrame = null; _bag.toFrameInv = null; }\n return _bag;\n}\n\nconst _norm3 = (o) => {\n const l = Math.hypot(o[0], o[1], o[2]) || 1;\n o[0] /= l; o[1] /= l; o[2] /= l;\n return o;\n};\n\n// Orthonormal in-plane basis for a unit normal n, seeded from the world axis\n// least aligned with it (a DIAL's θ = 0 reference when `from` gives none).\nconst _basisFromNormal = (n, ub, vb) => {\n const ax = Math.abs(n[0]), ay = Math.abs(n[1]), az = Math.abs(n[2]);\n let rx = 0, ry = 0, rz = 0;\n if (ax <= ay && ax <= az) rx = 1; else if (ay <= az) ry = 1; else rz = 1;\n ub[0] = ry*n[2] - rz*n[1]; ub[1] = rz*n[0] - rx*n[2]; ub[2] = rx*n[1] - ry*n[0];\n _norm3(ub);\n vb[0] = n[1]*ub[2] - n[2]*ub[1]; vb[1] = n[2]*ub[0] - n[0]*ub[2]; vb[2] = n[0]*ub[1] - n[1]*ub[0];\n};\n\n// Read component i of an array or {x, y, z}, falling back to d.\nconst _vx = (v, i, d) => {\n if (v == null) return d;\n const c = i === 0 ? v.x : i === 1 ? v.y : v.z;\n return c ?? v[i] ?? d;\n};\n\n/** Contract check for a custom constraint object. */\nexport const isConstraint = (c) =>\n c && typeof c === 'object' &&\n typeof c.solve === 'function' &&\n typeof c.value === 'function' &&\n typeof c.seed === 'function';\n\n/**\n * The handle controller. Stateful and long-lived, like a track; driven from\n * the frame through update(), read with value(out, opts).\n */\nexport class Handle {\n /**\n * @param {object} host The host context (its pointer source and view bag).\n * @param {object} opts See host.handle().\n */\n constructor(host, opts) {\n this._host = host;\n this._pointer = host.pointer;\n this._view = host.view;\n\n const kind = opts.constraint;\n this._isView = (kind === VIEW);\n if (isConstraint(kind)) {\n this._constraint = kind;\n } else {\n const coreKind = this._isView ? PLANE : kind;\n // Vector opts pass straight through — the core duck-types arrays and {x, y, z}.\n this._constraint = createConstraint(coreKind, {\n radius: opts.radius, report: opts.report, anchor: opts.anchor,\n normal: opts.normal, axis: opts.axis, zero: opts.zero, extent: opts.extent,\n });\n if (this._isView) this._constraint.view = true; // the flag locusLines reads\n }\n\n // Deferred constraint frame: the symbolic basis and the space it resolves from.\n this._from = null; this._fromDir = null; this._fromZero = null;\n if (opts.from != null && opts.from !== WORLD) {\n const custom = isConstraint(kind);\n const dirOpt = (kind === PLANE) ? opts.normal : (opts.axis ?? opts.normal);\n const ok = !this._isView &&\n (kind === PLANE || kind === AXIS || kind === DIAL ||\n (custom && typeof this._constraint.aim === 'function'));\n if (!ok) {\n console.error('[host] handle: `from` needs an aimable constraint — PLANE, AXIS, DIAL, or a custom kind exposing aim(); ignoring.');\n } else if (custom && dirOpt == null) {\n console.error('[host] handle: `from` on a custom kind needs a symbolic `axis` (or `normal`) to resolve; ignoring.');\n } else {\n this._from = opts.from;\n this._fromDir = [_vx(dirOpt, 0, kind === AXIS ? 1 : 0), _vx(dirOpt, 1, kind === AXIS ? 0 : 1), _vx(dirOpt, 2, 0)];\n if (opts.zero != null) {\n this._fromZero = [_vx(opts.zero, 0, 1), _vx(opts.zero, 1, 0), _vx(opts.zero, 2, 0)];\n } else if (kind === DIAL) {\n // Derive the θ = 0 reference once, in the FROM space, so axis and zero co-rotate.\n _b2[0] = this._fromDir[0]; _b2[1] = this._fromDir[1]; _b2[2] = this._fromDir[2];\n _norm3(_b2);\n const r0 = [0, 0, 0], r1 = [0, 0, 0];\n _basisFromNormal(_b2, r0, r1);\n this._fromZero = r0;\n }\n }\n }\n\n this._enabled = opts.enabled !== false;\n this._grabPx = Number.isFinite(opts.grabPx) ? opts.grabPx : 12;\n this._snap = opts.snap ?? null;\n this._hover = opts.hover === true;\n this._hovered = false;\n this._hid = null; this._hseq = -1; // the pointer last hover-tested, and its seq then\n\n // Transport state: one pointerId per gesture, its last consumed move seq\n // and its position in logical canvas px; _routed hands the down step to a router.\n this._grabbed = false;\n this._pid = null;\n this._seq = -1;\n this._ptr = [0, 0];\n this._routed = false;\n\n // The proxy: its world position and the grab radius in world units.\n this._proxyPos = [0, 0, 0];\n this._proxyRad = 0;\n\n // Cancel state — the value (and scalar, for winding) captured at grab.\n this._saved = [0, 0, 0];\n this._savedS = 0;\n\n // Hooks — user-facing, then the lib-space seams a router or a track owns.\n this.onGrab = typeof opts.onGrab === 'function' ? opts.onGrab : null;\n this.onRelease = typeof opts.onRelease === 'function' ? opts.onRelease : null;\n this.onChange = typeof opts.onChange === 'function' ? opts.onChange : null;\n this.onCancel = typeof opts.onCancel === 'function' ? opts.onCancel : null;\n this._onGrab = null; this._onRelease = null; this._onChange = null; this._onCancel = null;\n\n // Binding — a normalised { get, set } accessor; _bindVal the reused value array.\n this._binder = null;\n this._bindVal = [0, 0, 0];\n\n if (opts.bind != null) this.bind(opts.bind);\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n /**\n * Resolve the grab and re-solve from the pointer. Call first in the frame,\n * before the orbit; a routed handle is updated by its router. Returns the\n * grabbed state so the orbit gate can short-circuit; a disabled handle\n * returns false.\n * @returns {boolean} grabbed\n */\n update() {\n if (!this._enabled) {\n if (this._pid !== null && this._pointer) this._pointer.release(this._pid);\n this._grabbed = false; this._hovered = false; this._pid = null;\n return false;\n }\n const src = this._pointer;\n if (!src) return false;\n if (this._from && !this._grabbed) this._resolveFrame();\n\n // Fresh press (unrouted): the first unclaimed press this frame is\n // hit-tested at its pixel; a hit claims the pointer, a miss leaves it.\n if (!this._routed && this._pid === null) {\n for (const pr of src.presses) {\n if (src.ownerOf(pr.id) !== null) continue;\n this._ptr[0] = pr.x; this._ptr[1] = pr.y;\n if (this._pickAt(pr.x, pr.y)) { this._adopt(pr.id, pr.x, pr.y); break; }\n }\n }\n\n if (this._pid !== null) {\n const e = src.get(this._pid);\n if (!e) {\n this._cancelNow(); // the entry left before this handle saw its end\n } else {\n if (this._grabbed && e.seq !== this._seq && !e.cancel) {\n this._seq = e.seq;\n this._ptr[0] = e.x; this._ptr[1] = e.y;\n this._solveFromPointer(e.x, e.y);\n this._applySnap();\n this._afterSolve();\n }\n if (e.cancel) {\n this._cancelNow();\n } else if (e.up) {\n src.release(this._pid);\n this._grabbed = false;\n this._pid = null;\n this.onRelease && this.onRelease(this);\n this._onRelease && this._onRelease(this);\n }\n }\n }\n\n // Hover: a lone handle tests the latest unclaimed pointer motion.\n if (this._grabbed) {\n this._hovered = true;\n } else if (this._hover && !this._routed) {\n for (const e of src.pointers.values()) {\n if (e.owner !== null) continue;\n if (e.id === this._hid && e.seq === this._hseq) continue;\n this._hid = e.id; this._hseq = e.seq;\n this._hovered = this._pickAt(e.x, e.y);\n break;\n }\n }\n return this._grabbed;\n }\n\n _beginGrab() {\n const c = this._constraint;\n c.value(this._saved, POINT);\n this._savedS = typeof c.scalar === 'function' ? c.scalar() : 0;\n this._grabbed = true;\n this.onGrab && this.onGrab(this);\n this._onGrab && this._onGrab(this);\n }\n\n /** Router seam: adopt a pointer a shared pick decided; claims it through the source. */\n _adopt(pointerId, x, y) {\n const e = this._pointer.get(pointerId);\n this._pid = pointerId;\n this._seq = e ? e.seq : -1;\n this._ptr[0] = x; this._ptr[1] = y;\n this._pointer.claim(pointerId, this);\n this._beginGrab();\n }\n\n /**\n * Revert the drag in flight to the value captured at grab (exact θ winding\n * included), restore the binding, fire onCancel. No-op when not grabbed.\n * Chainable.\n * @returns {Handle} this\n */\n cancel() {\n if (this._grabbed) this._cancelNow();\n return this;\n }\n\n _cancelNow() {\n const c = this._constraint;\n if (this._isView) {\n c.pt[0] = this._saved[0]; c.pt[1] = this._saved[1]; c.pt[2] = this._saved[2];\n } else if (c.kind === DIAL) {\n c.s = this._savedS;\n c._dialPoint();\n } else {\n c.seed(this._saved[0], this._saved[1], this._saved[2]);\n }\n if (this._binder) this._binder.set(this.value(this._bindVal));\n this._grabbed = false;\n if (this._pid !== null && this._pointer) this._pointer.release(this._pid);\n this._pid = null;\n this.onCancel && this.onCancel(this);\n this._onCancel && this._onCancel(this);\n }\n\n // ── Frame, pick, solve ──────────────────────────────────────────────────\n\n // Resolve the symbolic basis from its space into WORLD through the view\n // bag and re-aim the constraint; idle frames only.\n _resolveFrame() {\n const v = this._view, bag = _bagOf(v, this._from, null), from = _space(this._from);\n const d = this._fromDir;\n mapDirection(_b2, d[0], d[1], d[2], from, WORLD, bag, v.vp, v.ndcZMin);\n if (this._fromZero) {\n const z = this._fromZero;\n mapDirection(_b0, z[0], z[1], z[2], from, WORLD, bag, v.vp, v.ndcZMin);\n this._constraint.aim(_b2[0], _b2[1], _b2[2], _b0[0], _b0[1], _b0[2]);\n } else {\n this._constraint.aim(_b2[0], _b2[1], _b2[2]);\n }\n }\n\n // The proxy's world position and its grab radius in world units — a\n // constant grabPx screen size at the proxy's depth.\n _proxyPrep() {\n const c = this._constraint, v = this._view, p = this._proxyPos;\n if (this._from && !this._grabbed) this._resolveFrame();\n if (c.kind === DIAL && !this._isView) {\n p[0] = c.anchor[0]; p[1] = c.anchor[1]; p[2] = c.anchor[2];\n } else {\n c.value(p, POINT);\n }\n const V = v.mat4View;\n const eyeZ = V[2]*p[0] + V[6]*p[1] + V[10]*p[2] + V[14];\n this._proxyRad = this._grabPx * pixelRatio(v.mat4Proj, -v.vp[3], eyeZ, v.ndcZMin);\n }\n\n // The analytic pick: t along the ray, or Infinity.\n _proxyT(o, d) {\n this._proxyPrep();\n const c = this._constraint;\n if (typeof c.proxy === 'function') return c.proxy(o[0], o[1], o[2], d[0], d[1], d[2], this._proxyRad);\n const p = this._proxyPos;\n return rayHitSphere(o[0], o[1], o[2], d[0], d[1], d[2], p[0], p[1], p[2], this._proxyRad);\n }\n\n /** Unproject a canvas pixel into the ray scratch; false on a stale view. */\n _ray(x, y) {\n const v = this._view;\n if (v.stale) return false;\n return unproject(_rayO, _rayD, x, y, v, v.vp, v.ndcZMin) !== null;\n }\n\n /** Hit-test the proxy at a canvas pixel. */\n _pickAt(x, y) {\n return this._ray(x, y) && this._proxyT(_rayO, _rayD) < Infinity;\n }\n\n _solveFromPointer(x, y) {\n if (!this._ray(x, y)) return;\n if (this._isView) this._viewUpdatePlane();\n this._constraint.solve(_rayO[0], _rayO[1], _rayO[2], _rayD[0], _rayD[1], _rayD[2]);\n }\n\n // VIEW: re-aim the plane at the camera through the current point — its\n // normal the look direction (−Z of the eye matrix), its anchor the point.\n _viewUpdatePlane() {\n const c = this._constraint, E = this._view.mat4Eye;\n c.n[0] = -E[8]; c.n[1] = -E[9]; c.n[2] = -E[10];\n _norm3(c.n);\n c.anchor[0] = c.pt[0]; c.anchor[1] = c.pt[1]; c.anchor[2] = c.pt[2];\n }\n\n // ── Snap ────────────────────────────────────────────────────────────────\n\n /** Snap step — angular (rad) for SPHERE / DIAL, a world grid for PLANE / AXIS / VIEW; null off. */\n get snap() { return this._snap; }\n set snap(v) { this._snap = v ?? null; }\n\n _applySnap() {\n const sn = this._snap;\n if (sn == null) return;\n const c = this._constraint;\n if (this._isView || c.kind === PLANE) {\n const gx = Array.isArray(sn) ? sn[0] : sn, gy = Array.isArray(sn) ? sn[1] : sn, gz = Array.isArray(sn) ? sn[2] : sn;\n _v3[0] = gx > 0 ? Math.round(c.pt[0] / gx) * gx : c.pt[0];\n _v3[1] = gy > 0 ? Math.round(c.pt[1] / gy) * gy : c.pt[1];\n _v3[2] = gz > 0 ? Math.round(c.pt[2] / gz) * gz : c.pt[2];\n if (this._isView) { c.pt[0] = _v3[0]; c.pt[1] = _v3[1]; c.pt[2] = _v3[2]; }\n else c.seed(_v3[0], _v3[1], _v3[2]);\n } else if (c.kind === AXIS || c.kind === DIAL) {\n const step = Array.isArray(sn) ? sn[0] : sn;\n if (!(step > 0)) return;\n const q = Math.round(c.s / step) * step;\n c.s = q < c.min ? c.min : (q > c.max ? c.max : q);\n if (c.kind === DIAL) c._dialPoint();\n else {\n c.pt[0] = c.anchor[0] + c.s * c.u[0];\n c.pt[1] = c.anchor[1] + c.s * c.u[1];\n c.pt[2] = c.anchor[2] + c.s * c.u[2];\n }\n } else if (c.kind === SPHERE) {\n const step = Array.isArray(sn) ? sn[0] : sn;\n if (!(step > 0)) return;\n c.azEl(_q2);\n dirFromAzEl(c.dir, Math.round(_q2[0] / step) * step, Math.round(_q2[1] / step) * step);\n }\n }\n\n // ── Value and binding ───────────────────────────────────────────────────\n\n /**\n * Write the current value into `out`. `report` overrides the constraint's\n * (POINT | DIRECTION); `to` converts from WORLD to EYE, SCREEN, NDC, or a\n * mat4 frame through the view bag. Out-first, out required.\n * @param {number[]} out 3-element destination.\n * @param {{ to?:string|ArrayLike<number>, report?:number }} [opts]\n * @returns {number[]} out\n */\n value(out, opts) {\n const o = opts || {}, c = this._constraint;\n const report = (o.report === POINT || o.report === DIRECTION) ? o.report : c.report;\n const to = o.to ?? WORLD;\n c.value(_v3, report);\n if (to === WORLD) { out[0] = _v3[0]; out[1] = _v3[1]; out[2] = _v3[2]; return out; }\n const v = this._view, bag = _bagOf(v, null, to), space = _space(to);\n return report === DIRECTION\n ? mapDirection(out, _v3[0], _v3[1], _v3[2], WORLD, space, bag, v.vp, v.ndcZMin)\n : mapLocation(out, _v3[0], _v3[1], _v3[2], WORLD, space, bag, v.vp, v.ndcZMin);\n }\n\n /**\n * Bind the handle to a target it drives while dragging: a `{ get, set }`\n * accessor, or a vec3 array mutated in place (a camera state's eye or\n * center is one). get() seeds the constraint now; each solve calls\n * set(value) with the reused value array, then fires onChange. Chainable.\n * @param {number[]|{ get:Function, set:Function }} target\n * @returns {Handle} this\n */\n bind(target) {\n let binder = null;\n if (target && typeof target.get === 'function' && typeof target.set === 'function') {\n binder = target;\n } else if (target && typeof target === 'object' && typeof target.length === 'number' && target.length >= 3) {\n binder = { get: () => target, set: (v) => { target[0] = v[0]; target[1] = v[1]; target[2] = v[2]; } };\n } else {\n console.error('[host] handle.bind: unrecognised target — pass a vec3 array or an { get, set } accessor. Leaving unbound.');\n return this;\n }\n this._binder = binder;\n if (this._from && !this._grabbed) this._resolveFrame();\n this._seedFromBinding();\n return this;\n }\n\n /** Re-seed the constraint from the bound target after it changed externally. Chainable. */\n sync() {\n if (this._binder) this._seedFromBinding();\n return this;\n }\n\n _seedFromBinding() {\n const g = this._binder.get();\n if (g == null) return;\n const x = _vx(g, 0, 0), y = _vx(g, 1, 0), z = _vx(g, 2, 0);\n if (this._isView) { const pt = this._constraint.pt; pt[0] = x; pt[1] = y; pt[2] = z; }\n else this._constraint.seed(x, y, z);\n }\n\n // Push the freshly solved value to the binding and fire onChange, once per solve.\n _afterSolve() {\n const bound = this._binder !== null;\n const notify = !!(this.onChange || this._onChange);\n if (!bound && !notify) return;\n const v = this.value(this._bindVal);\n if (bound) this._binder.set(v);\n if (notify) {\n this.onChange && this.onChange(v, this);\n this._onChange && this._onChange(v, this);\n }\n }\n\n // ── Readouts and edits ──────────────────────────────────────────────────\n\n /** AXIS: the signed distance along the rail; DIAL: the accumulated angle; NaN otherwise. */\n scalar() { return typeof this._constraint.scalar === 'function' ? this._constraint.scalar() : NaN; }\n\n /** SPHERE: [az, el] of the current direction, into out2. */\n azEl(out2) {\n const o = out2 || [0, 0];\n return typeof this._constraint.azEl === 'function' ? this._constraint.azEl(o) : o;\n }\n\n /** True between grab and release. */\n grabbed() { return this._grabbed; }\n\n /** True while the pointer rests on the proxy, and while grabbed. */\n hovered() { return this._hovered; }\n\n /**\n * Move the reference point — sphere centre, plane point, axis anchor,\n * dial centre, or a VIEW handle's point; the stored point rides along.\n * Chainable.\n * @param {number[]|{x:number,y:number,z:number}} v\n * @returns {Handle} this\n */\n anchor(v) {\n const c = this._constraint;\n const t = this._isView ? c.pt : c.anchor;\n if (!t) return this;\n t[0] = _vx(v, 0, t[0]); t[1] = _vx(v, 1, t[1]); t[2] = _vx(v, 2, t[2]);\n if (!this._isView) {\n if (c.kind === DIAL) c._dialPoint();\n else if (c.kind === AXIS) {\n c.pt[0] = c.anchor[0] + c.s * c.u[0];\n c.pt[1] = c.anchor[1] + c.s * c.u[1];\n c.pt[2] = c.anchor[2] + c.s * c.u[2];\n } else if (c.kind === PLANE) c.seed(c.pt[0], c.pt[1], c.pt[2]);\n }\n return this;\n }\n\n /** Runtime gate — false suspends grab / solve without disposing. */\n get enabled() { return this._enabled; }\n set enabled(v) {\n this._enabled = !!v;\n if (!this._enabled) {\n if (this._pid !== null && this._pointer) this._pointer.release(this._pid);\n this._grabbed = false; this._hovered = false; this._pid = null;\n }\n }\n\n /** Release the pointer claim and leave the host. */\n dispose() {\n if (this._pid !== null && this._pointer) this._pointer.release(this._pid);\n this._pid = null;\n this._grabbed = false;\n this._pointer = null;\n this._host.unregister(this);\n }\n}\n\n/**\n * Validate the constraint option: a built-in kind, VIEW, or a contract object.\n * @param {*} kind\n * @returns {boolean}\n */\nexport function validConstraint(kind) {\n return kind === SPHERE || kind === PLANE || kind === AXIS || kind === DIAL || kind === VIEW || !!isConstraint(kind);\n}\n","/**\n * @file The pointer router — shared arbitration for overlapping handles.\n * @module host/router\n * @license AGPL-3.0-only\n *\n * Per-handle self-picking double-grabs on overlap: two proxies under one\n * finger each test only themselves and both hit. The router replaces the\n * members' down step with one shared pick: the pointer's ray once, every\n * enabled member's proxy tested, the nearest t wins (a tie keeps the\n * earlier member, as draw order would). Members keep their own move /\n * solve / release machinery, grabbed through their injected _adopt; every\n * unclaimed press of the frame resolves, so several same-frame presses on\n * different members all land. Hover is the same test on unclaimed pointer\n * motion, shared, setting at most one hovered member.\n */\n\n'use strict';\n\nimport { rayScratch } from './handle.js';\n\n/** Shared pick over a set of handles on one host. */\nexport class PointerRouter {\n /**\n * @param {object} host The host context.\n * @param {object[]} handles Members.\n * @param {{ hover?:boolean }} [opts] hover defaults to true.\n */\n constructor(host, handles, opts) {\n const o = opts || {};\n this._host = host;\n this._pointer = host.pointer;\n this._handles = [];\n this._hover = o.hover !== false;\n this._hoveredH = null;\n this._hid = null; this._hseq = -1;\n for (const h of handles || []) this.add(h);\n }\n\n /**\n * Route a handle: its own pointerdown adoption is disabled and the shared\n * pick grabs it through _adopt. Chainable.\n * @param {object} h\n * @returns {PointerRouter} this\n */\n add(h) {\n if (!h || typeof h._proxyT !== 'function') {\n console.error('[host] router.add: not a handle — ignoring.');\n return this;\n }\n if (this._handles.includes(h)) return this;\n h._routed = true;\n h._onRelease = h._onCancel = () => this._unclaim(h);\n this._handles.push(h);\n return this;\n }\n\n /**\n * Un-route a handle; it self-picks again. Chainable.\n * @param {object} h\n * @returns {PointerRouter} this\n */\n remove(h) {\n const i = this._handles.indexOf(h);\n if (i < 0) return this;\n this._handles.splice(i, 1);\n this._unclaim(h);\n h._routed = false;\n h._onRelease = h._onCancel = null;\n if (this._hoveredH === h) { this._hoveredH = null; h._hovered = false; }\n return this;\n }\n\n /**\n * Resolve the frame's presses with one shared pick each, refresh hover on\n * pointer motion, then update every member. Call first in the frame, in\n * place of the members' own updates.\n * @returns {boolean} true if any member is grabbed.\n */\n update() {\n const hs = this._handles, src = this._pointer;\n if (!src) return false;\n for (const pr of src.presses) {\n if (src.ownerOf(pr.id) !== null) continue;\n const win = this._sharedPick(pr.x, pr.y);\n if (win && win._pid === null && win.enabled) win._adopt(pr.id, pr.x, pr.y);\n }\n if (this._hover) {\n for (const e of src.pointers.values()) {\n if (e.owner !== null) continue;\n if (e.id === this._hid && e.seq === this._hseq) continue;\n this._hid = e.id; this._hseq = e.seq;\n const win = this._sharedPick(e.x, e.y);\n this._hoveredH = win;\n for (const h of hs) h._hovered = (h === win) || h._grabbed;\n break;\n }\n }\n let g = false;\n for (const h of hs) g = h.update() || g;\n return g;\n }\n\n // One ray, every enabled member's proxy, the nearest t.\n _sharedPick(x, y) {\n const hs = this._handles;\n const first = hs.find((h) => h.enabled);\n if (!first || !first._ray(x, y)) return null;\n let win = null, best = Infinity;\n for (const h of hs) {\n if (!h.enabled) continue;\n const t = h._proxyT(rayScratch.o, rayScratch.d);\n if (t < best) { best = t; win = h; }\n }\n return win;\n }\n\n _unclaim(h) {\n const src = this._pointer;\n if (!src) return;\n for (const e of src.pointers.values()) if (e.owner === h) src.release(e.id);\n }\n\n /** The member under the pointer, or null. */\n hovered() { return this._hoveredH; }\n\n /** Un-route every member and leave the host. */\n dispose() {\n for (const h of [...this._handles]) this.remove(h);\n this._pointer = null;\n this._host.unregister(this);\n }\n}\n","/**\n * @file Helm factories — a core PoseHelm driven from the host's players.\n * @module host/helm\n * @license AGPL-3.0-only\n *\n * cameraHelm(host, cam, opts) flies a camera state body-relative: the helm is\n * seeded from the state through cameraToPose, integrates each tick in the\n * state's own eye matrix (which equals the pose written last tick, so a\n * forward push flies forward) and writes back through cameraFromPose at the\n * state's gaze distance. poseHelm(host, opts) produces a pose in a declared\n * frame — WORLD, EYE (the host's view bag), SELF (its own pose) or a mat4 —\n * and drives whatever bind() names: a camera state, an { applyPose } sink, a\n * { get, set } accessor or a { pos, rot } object. Both register a player\n * with the host until disposed.\n */\n\n'use strict';\n\nimport {\n PoseHelm, cameraEye, cameraFromPose, cameraToPose, qToMat4, WORLD, EYE, SELF,\n} from '@nakednous/tree';\n\nconst _pose = { pos: [0, 0, 0], rot: [0, 0, 0, 1] }; // step() output\nconst _self = { pos: [0, 0, 0], rot: [0, 0, 0, 1] }; // eval() readout for SELF\nconst _em = new Float32Array(16); // the resolved basis\n\nconst _rawMat4 = (m) => (m != null && m.mat4 != null) ? m.mat4 : m;\nconst _isCameraState = (c) => !!(c && c.eye && c.center && c.up);\n\nfunction _applyOpts(helm, opts) {\n if (!opts) return;\n if (opts.profile) helm.profile = opts.profile;\n if (opts.deadzone != null) helm.deadzone = opts.deadzone;\n if (opts.filter != null) helm.filter = opts.filter;\n if (opts.fullScale != null) helm.fullScale = opts.fullScale;\n}\n\n/**\n * The basis a pose helm's `from` resolves to: null for WORLD, the view bag's\n * eye matrix for EYE, the helm's own rotation for SELF, a mat4 as given.\n * Exported for a bridge's rig gizmo.\n * @param {PoseHelm} helm\n * @param {object} view The host's view bag.\n * @param {Float32Array} em 16-element scratch.\n * @returns {ArrayLike<number>|null}\n */\nexport function helmBasis(helm, view, em) {\n const from = helm.from;\n if (from != null && typeof from !== 'string') return _rawMat4(from);\n if (from === EYE) return view ? view.mat4Eye : null;\n if (from === SELF) return qToMat4(em, helm.eval(_self).rot);\n if (from === WORLD || from == null) return null;\n console.error('[host] poseHelm: `from` must be EYE, WORLD, SELF, or a mat4 frame. Falling back to WORLD.');\n return null;\n}\n\n/**\n * Fly a camera state from a live 6-DOF rate stream, body-relative.\n * @param {object} host\n * @param {object} cam A camera state ({ eye, center, up, … }).\n * @param {{ profile?:object, deadzone?:number, filter?:object, fullScale?:number }} [opts]\n * @returns {PoseHelm} The helm, with dispose().\n */\nexport function cameraHelm(host, cam, opts) {\n const helm = new PoseHelm();\n _applyOpts(helm, opts);\n if (opts && opts.from != null) {\n console.error('[host] cameraHelm: a camera helm is always body-fly and has no `from`. Ignoring it; bind the camera to a poseHelm for screen- or world-relative motion.');\n }\n if (_isCameraState(cam)) helm.home(cameraToPose(_pose, cam));\n const player = {\n tick(dt) {\n helm.step(_pose, dt, _isCameraState(cam) ? cameraEye(_em, cam) : null);\n if (_isCameraState(cam)) {\n cameraFromPose(cam, _pose);\n if (helm._onApply) helm._onApply(cam);\n }\n return true;\n },\n };\n helm._onApply = null; // lib-space seam: a bridge pushes the written state to its camera\n host.players.add(player);\n helm.dispose = () => { host.players.remove(player); host.unregister(helm); return helm; };\n return host.register(helm);\n}\n\n/**\n * Integrate a live 6-DOF rate stream into a pose in a declared frame and\n * drive a bound target with it.\n * @param {object} host\n * @param {{ profile?:object, deadzone?:number, filter?:object, fullScale?:number,\n * from?:string|ArrayLike<number>, bind?:object }} [opts]\n * @returns {PoseHelm} The helm, with bind() and dispose().\n */\nexport function poseHelm(host, opts) {\n const o = opts || {};\n const helm = new PoseHelm();\n _applyOpts(helm, o);\n if (o.from != null) helm.from = o.from;\n let sink = null;\n\n const player = {\n tick(dt) {\n if (sink) {\n helm.step(_pose, dt, helmBasis(helm, host.view, _em));\n sink(_pose);\n }\n return true;\n },\n };\n host.players.add(player);\n\n /**\n * Bind the target the helm drives: a camera state (seeded from it, written\n * through cameraFromPose), an { applyPose } sink, a { get, set } accessor\n * (get() seeds, set(pose) writes) or a { pos, rot } object mutated in\n * place. Chainable.\n * @param {object} target\n * @returns {PoseHelm} this\n */\n helm.bind = (target) => {\n if (_isCameraState(target)) {\n helm.home(cameraToPose(_pose, target));\n sink = (pose) => cameraFromPose(target, pose);\n } else if (target && typeof target.get === 'function' && typeof target.set === 'function') {\n helm.home(target.get());\n sink = (pose) => target.set(pose);\n } else if (target && typeof target.applyPose === 'function') {\n sink = (pose) => target.applyPose(pose);\n } else if (target && target.pos && target.rot) {\n helm.home(target);\n sink = (pose) => {\n target.pos[0] = pose.pos[0]; target.pos[1] = pose.pos[1]; target.pos[2] = pose.pos[2];\n target.rot[0] = pose.rot[0]; target.rot[1] = pose.rot[1];\n target.rot[2] = pose.rot[2]; target.rot[3] = pose.rot[3];\n };\n } else {\n console.error('[host] poseHelm: bind() target must be a camera state, an { applyPose } sink, a { get, set } accessor, or a { pos, rot } object. Leaving unbound.');\n }\n return helm;\n };\n helm.dispose = () => { host.players.remove(player); host.unregister(helm); return helm; };\n if (o.bind != null) helm.bind(o.bind);\n return host.register(helm);\n}\n","/**\n * @file Track factories and TrackHandles — core tracks wired to the host's players.\n * @module host/track\n * @license AGPL-3.0-only\n *\n * poseTrack(host, opts) is a core PoseTrack whose activation hooks add and\n * remove its player. cameraTrack(host, cam, opts) is a core CameraTrack whose\n * player evaluates straight into the camera state `cam` — the state is the\n * keyframe shape, so track.eval(cam) is the write — and once more on\n * deactivate so the camera rests on the path; add() with no argument\n * captures `cam`, add({ camera }) any camera-state object. { handles } on\n * either decorates the track with TrackHandles: one VIEW handle per\n * draggable keyframe field (pos / eye / center), an optional rot DIAL per\n * keyframe about a declared axis, all on one router.\n */\n\n'use strict';\n\nimport { PoseTrack, CameraTrack, qFromAxisAngle, DIAL } from '@nakednous/tree';\nimport { VIEW } from './handle.js';\n\n// ── Players ────────────────────────────────────────────────────────────────\n\nfunction _wirePoseTrack(host, track) {\n let player = null;\n track._onActivate = () => {\n player = player || { tick() { track.tick(); return track.playing; } };\n host.players.add(player);\n };\n track._onDeactivate = () => { if (player) host.players.remove(player); };\n}\n\n/**\n * A core PoseTrack ticked by the host while it plays.\n * @param {object} host\n * @param {{ handles?:boolean|object }} [opts]\n * @returns {PoseTrack}\n */\nexport function poseTrack(host, opts) {\n const o = opts || {};\n const track = new PoseTrack();\n _wirePoseTrack(host, track);\n if (o.handles) track.handles = new TrackHandles(host, track, o.handles, false);\n return track;\n}\n\n/**\n * A core CameraTrack evaluating into the camera state `cam` while it plays.\n * @param {object} host\n * @param {object} cam A camera state ({ eye, center, up, fov, halfHeight, near, far }).\n * @param {{ handles?:boolean|object }} [opts]\n * @returns {CameraTrack}\n */\nexport function cameraTrack(host, cam, opts) {\n const o = opts || {};\n const track = new CameraTrack();\n const state = cam || null; // the evaluation target; track.camera is informational\n track.camera = state;\n track._onApply = null; // lib-space seam: a bridge pushes the evaluated state to its camera\n\n const coreAdd = track.add.bind(track);\n track.add = function (spec, addOpts) {\n if (spec == null) {\n if (!state) return;\n spec = state;\n } else if (Array.isArray(spec)) {\n for (const s of spec) track.add(s, addOpts);\n return;\n } else if (spec.camera != null) {\n spec = spec.camera;\n }\n coreAdd(spec, addOpts);\n };\n\n const apply = () => {\n if (!state || track.keyframes.length === 0) return;\n track.eval(state);\n if (track._onApply) track._onApply(state);\n };\n const player = {\n tick() {\n if (!track.playing) return false;\n track.tick();\n apply();\n return track.playing;\n },\n };\n track._onActivate = () => host.players.add(player);\n track._onDeactivate = () => { host.players.remove(player); apply(); };\n\n if (o.handles) track.handles = new TrackHandles(host, track, o.handles, true);\n return track;\n}\n\n// ── TrackHandles ───────────────────────────────────────────────────────────\n\nconst _vx = (v, i) => (v[i] !== undefined ? v[i] : (i === 0 ? v.x : i === 1 ? v.y : v.z));\n\n/**\n * Per-keyframe manipulators of a track — the factories' `handles` opt,\n * stored at track.handles. Members are internal handles on one router;\n * their hooks are re-exposed with keyframe coordinates: onGrab(index, field,\n * h) / onChange(value, index, field, h) / onRelease / onCancel, field one of\n * 'pos' | 'eye' | 'center' | 'rot'. update() rebuilds the members when the\n * keyframe count changes and re-seeds every idle member from its keyframe.\n * A bridge draws the members itself (`members`).\n */\nexport class TrackHandles {\n /**\n * @param {object} host\n * @param {object} track PoseTrack | CameraTrack.\n * @param {true|object} opts `true` for the defaults, or\n * { center?, rot?, rotRadius?, rotSnap?, grabPx?, snap?, hover? }.\n * @param {boolean} isCamera CameraTrack (eye / center) vs PoseTrack (pos / rot).\n */\n constructor(host, track, opts, isCamera) {\n const o = opts === true ? {} : (opts || {});\n this._host = host;\n this._track = track;\n this._isCamera = !!isCamera;\n this._members = [];\n this._rotByIndex = new Map();\n this._n = -1;\n this._enabled = true;\n /** Last-grabbed keyframe index, null until a grab. @type {number|null} */\n this.selected = null;\n\n this._grabPx = Number.isFinite(o.grabPx) ? o.grabPx : 12;\n this._snap = o.snap ?? null;\n this._rotSnap = o.rotSnap ?? null;\n this._center = this._isCamera ? (o.center !== false) : false;\n if (!this._isCamera && o.center !== undefined) console.error('[host] track handles: `center` is CameraTrack-only — ignoring.');\n this._rotAxis = null;\n this._rotRadius = Number.isFinite(o.rotRadius) ? o.rotRadius : 40;\n if (o.rot != null) {\n if (this._isCamera) {\n console.error('[host] track handles: `rot` is PoseTrack-only — a camera keyframe\\'s orientation is its center; drag that instead. Ignoring.');\n } else {\n const ax = _vx(o.rot, 0) ?? 0, ay = _vx(o.rot, 1) ?? 1, az = _vx(o.rot, 2) ?? 0;\n const l = Math.hypot(ax, ay, az) || 1;\n this._rotAxis = [ax / l, ay / l, az / l];\n }\n }\n\n this.onGrab = null; this.onChange = null; this.onRelease = null; this.onCancel = null;\n this._hover = o.hover !== false;\n this._router = null; // made on the first rebuild, once a subclass is constructed\n }\n\n // The construction seams a bridge subclass overrides so the members are\n // handles it can draw.\n _makeHandle(opts) { return this._host.handle(opts); }\n _makeRouter(opts) { return this._host.router([], opts); }\n\n /** The members, { h, index, field } each, for a bridge's draw. */\n get members() { return this._members; }\n /** Dot radius in pixels, the members' grabPx. */\n get grabPx() { return this._grabPx; }\n\n /**\n * Rebuild if the keyframe count changed, re-seed idle members, then route.\n * Call first in the frame, before the orbit.\n * @returns {boolean} true while any member is grabbed.\n */\n update() {\n if (this._track.keyframes.length !== this._n) this._rebuild();\n if (this._enabled) this._syncIdle();\n return this._router.update();\n }\n\n /** The members' router, made on the first update(). */\n get router() { return this._router; }\n\n /** Runtime gate — false suspends grab / solve and empties the pick. */\n get enabled() { return this._enabled; }\n set enabled(v) {\n this._enabled = !!v;\n for (const m of this._members) m.h.enabled = this._enabled;\n }\n\n /** True while any member is grabbed. */\n grabbed() {\n for (const m of this._members) if (m.h.grabbed()) return true;\n return false;\n }\n\n /** The keyframe index under the pointer (or grabbed), else null. */\n hovered() {\n for (const m of this._members) if (m.h.hovered()) return m.index;\n return null;\n }\n\n /** Re-seed every idle member from its keyframe. Chainable. */\n sync() { this._syncIdle(); return this; }\n\n /** Dispose the members and the router, detach from the track. */\n dispose() {\n this._teardown();\n if (this._router) this._router.dispose();\n if (this._track.handles === this) this._track.handles = null;\n }\n\n _rebuild() {\n if (!this._router) this._router = this._makeRouter({ hover: this._hover });\n this._teardown();\n const n = this._track.keyframes.length;\n this._n = n;\n for (let i = 0; i < n; i++) {\n this._addViewMember(i, this._isCamera ? 'eye' : 'pos');\n if (this._center) this._addViewMember(i, 'center');\n if (this._rotAxis) this._addRotMember(i);\n }\n if (this.selected != null && this.selected >= n) this.selected = null;\n }\n\n _teardown() {\n for (const m of this._members) { this._router.remove(m.h); m.h.dispose(); }\n this._members.length = 0;\n this._rotByIndex.clear();\n }\n\n // A VIEW member bound to kf[field] by index, so set(i, spec) replacing the\n // keyframe never strands it.\n _addViewMember(index, field) {\n const track = this._track;\n const h = this._makeHandle({\n constraint: VIEW, grabPx: this._grabPx, snap: this._snap,\n bind: {\n get: () => track.keyframes[index] ? track.keyframes[index][field] : null,\n set: (v) => {\n const k = track.keyframes[index];\n if (!k) return;\n const a = k[field];\n a[0] = _vx(v, 0); a[1] = _vx(v, 1); a[2] = _vx(v, 2);\n },\n },\n });\n if (!h) return;\n this._wire(h, index, field);\n this._members.push({ h, index, field });\n this._router.add(h);\n }\n\n // A rot member: one DIAL about the declared axis at the keyframe's\n // position, unbound — θ lands in kf.rot through the hooks.\n _addRotMember(index) {\n const kf = this._track.keyframes[index];\n const h = this._makeHandle({\n constraint: DIAL, anchor: [kf.pos[0], kf.pos[1], kf.pos[2]],\n axis: this._rotAxis, radius: this._rotRadius, grabPx: this._grabPx, snap: this._rotSnap,\n });\n if (!h) return;\n this._wire(h, index, 'rot');\n const m = { h, index, field: 'rot' };\n this._members.push(m);\n this._rotByIndex.set(index, m);\n this._router.add(h);\n this._syncRot(m);\n }\n\n _wire(h, index, field) {\n const rotWrite = () => {\n const k = this._track.keyframes[index];\n if (k) { const u = this._rotAxis; qFromAxisAngle(k.rot, u[0], u[1], u[2], h.scalar()); }\n };\n h.onGrab = () => {\n this.selected = index;\n if (this.onGrab) this.onGrab(index, field, h);\n };\n h.onChange = (v) => {\n if (field === 'rot') rotWrite();\n else if (field === 'pos') {\n // Forward the dragged position into the keyframe's rot ring now, so\n // the ring never trails the dot by a frame.\n const rm = this._rotByIndex.get(index);\n const k = this._track.keyframes[index];\n if (rm && k) rm.h.anchor(k.pos);\n }\n if (this.onChange) this.onChange(v, index, field, h);\n };\n h.onRelease = () => { if (this.onRelease) this.onRelease(index, field, h); };\n h.onCancel = () => {\n if (field === 'rot') rotWrite(); // a DIAL is unbound: re-derive from the reverted θ\n if (this.onCancel) this.onCancel(index, field, h);\n };\n }\n\n _syncIdle() {\n for (const m of this._members) {\n if (m.h.grabbed()) continue;\n if (m.field === 'rot') this._syncRot(m);\n else m.h.sync();\n }\n }\n\n // Anchor the ring at the live keyframe position and set θ to the twist of\n // kf.rot about the axis: θ = 2·atan2(q.xyz · u, q.w).\n _syncRot(m) {\n const k = this._track.keyframes[m.index];\n if (!k) return;\n m.h.anchor(k.pos);\n const u = this._rotAxis;\n const th = 2 * Math.atan2(k.rot[0] * u[0] + k.rot[1] * u[1] + k.rot[2] * u[2], k.rot[3]);\n const c = m.h._constraint;\n if (c.s !== th) { c.s = th; c._dialPoint(); }\n }\n}\n","/**\n * @file Device streams — WebHID and Gamepad rate sources that feed a helm.\n * @module host/stream\n * @license AGPL-3.0-only\n *\n * The measure-by-subscription transports. Each yields lin[3] / ang[3] in raw\n * device units and, once bind(helm) ran, calls helm.feed(lin, ang) every\n * tick of the host's players — the helm's profile does all scaling, so a\n * stream carries no configuration beyond identification and decoding.\n *\n * hid — WebHID. connect() must run from a user gesture; reports land\n * out of band into the stream's buffers and the frame reads the\n * latest (last-write-wins). Permissions-Policy gates\n * requestDevice to top-level documents: a stream in an iframe\n * without allow=\"hid\" reports available === false and never\n * prompts.\n * gamepad — the Gamepad API, polled once per tick from\n * navigator.getGamepads(); an absent axis reads exactly 0.\n *\n * Both expose available and connected for a UI to reflect, and bind(helm),\n * unbind(), dispose().\n */\n\n'use strict';\n\nconst _nav = () => (typeof navigator !== 'undefined' ? navigator : null);\n\n/** The 3Dconnexion vendor ids: the SpaceNavigator and its successors. */\nexport const HID_FILTERS = [{ vendorId: 0x046d }, { vendorId: 0x256f }];\n\n/**\n * The SpaceNavigator decode: report 1 carries translation, report 2\n * rotation, each three int16 little-endian lanes; a firmware that packs all\n * six lanes into one report fills both halves from it.\n * @param {DataView} report The report's data (the id byte excluded).\n * @param {number} reportId\n * @param {number[]} lin Translation lanes, written.\n * @param {number[]} ang Rotation lanes, written.\n */\nexport function decodeSpaceNavigator(report, reportId, lin, ang) {\n if (report.byteLength >= 12) {\n for (let i = 0; i < 3; i++) { lin[i] = report.getInt16(2 * i, true); ang[i] = report.getInt16(6 + 2 * i, true); }\n return;\n }\n if (report.byteLength < 6) return;\n const t = reportId === 1 ? lin : reportId === 2 ? ang : null;\n if (!t) return;\n for (let i = 0; i < 3; i++) t[i] = report.getInt16(2 * i, true);\n}\n\n/** Whether WebHID's requestDevice is allowed in this document. */\nfunction _hidAllowed() {\n if (typeof document !== 'undefined' && document.featurePolicy && typeof document.featurePolicy.allowsFeature === 'function') {\n return document.featurePolicy.allowsFeature('hid');\n }\n if (typeof window !== 'undefined' && 'top' in window) return window.top === window.self;\n return true;\n}\n\nfunction _stream(host, lin, ang) {\n let helm = null;\n const s = {\n /** The latest translation lanes, raw device units. */\n lin,\n /** The latest rotation lanes, raw device units. */\n ang,\n /** The bound helm, or null. */\n get helm() { return helm; },\n /**\n * Feed a helm every tick. Chainable.\n * @param {object} target A PoseHelm (anything with feed(lin, ang)).\n * @returns {object} this\n */\n bind(target) {\n if (!target || typeof target.feed !== 'function') {\n console.error('[host] stream: bind() target must have feed(lin, ang). Leaving unbound.');\n return s;\n }\n helm = target;\n return s;\n },\n /** Stop feeding; the helm sees its last rate until it is fed again. */\n unbind() { helm = null; return s; },\n };\n const feed = () => { if (helm) helm.feed(lin, ang); };\n return { s, feed };\n}\n\n/**\n * A WebHID rate stream.\n *\n * @param {object} host\n * @param {{ filters?:object[], decode?:function, bind?:object, resume?:boolean,\n * hid?:object }} [opts]\n * filters: the requestDevice filters (default HID_FILTERS). decode:\n * decode(report, reportId, lin, ang) (default decodeSpaceNavigator).\n * bind: a helm to bind at once. resume (default true): attach a device\n * this origin was already granted, without a prompt. hid: the WebHID\n * interface (default navigator.hid) — the seam a test fills.\n * @returns {object} The stream: { available, connected, device, lin, ang,\n * connect(), bind(helm), unbind(), dispose() }.\n */\nexport function createHid(host, opts) {\n const o = opts || {};\n const hid = o.hid || (_nav() && _nav().hid) || null;\n const filters = o.filters || HID_FILTERS;\n const decode = typeof o.decode === 'function' ? o.decode : decodeSpaceNavigator;\n const lin = [0, 0, 0], ang = [0, 0, 0];\n const { s, feed } = _stream(host, lin, ang);\n let device = null;\n\n const onReport = (e) => decode(e.data, e.reportId, lin, ang);\n const onDisconnect = (e) => { if (device && e.device === device) detach(); };\n const matches = (d) => filters.length === 0 || filters.some((f) =>\n (f.vendorId == null || f.vendorId === d.vendorId) && (f.productId == null || f.productId === d.productId));\n\n function detach() {\n if (!device) return;\n device.removeEventListener('inputreport', onReport);\n if (device.opened && typeof device.close === 'function') device.close().catch(() => {});\n device = null;\n s.connected = false;\n lin[0] = lin[1] = lin[2] = ang[0] = ang[1] = ang[2] = 0;\n }\n\n async function attach(d) {\n detach();\n try { if (!d.opened) await d.open(); }\n catch (e) { console.error('[host] hid: open() failed: ' + e.message + '.'); return false; }\n device = d;\n d.addEventListener('inputreport', onReport);\n s.connected = true;\n return true;\n }\n\n Object.assign(s, {\n /** Whether WebHID exists and requestDevice is allowed here. */\n available: !!(hid && typeof hid.requestDevice === 'function') && _hidAllowed(),\n /** Whether a device is open and reporting. */\n connected: false,\n\n /**\n * Prompt for a device (a user gesture is required) and attach the choice.\n * @returns {Promise<boolean>} attached\n */\n async connect() {\n if (!s.available) { console.error('[host] hid: WebHID is unavailable here (a top-level Chromium document over https or localhost).'); return false; }\n let devices;\n try { devices = await hid.requestDevice({ filters }); }\n catch (e) { console.error('[host] hid: requestDevice rejected: ' + e.message + '.'); return false; }\n if (!devices || !devices.length) return false;\n return attach(devices[0]);\n },\n\n /**\n * Attach a device this origin was already granted, without a prompt.\n * @returns {Promise<boolean>} attached\n */\n async resume() {\n if (!hid || typeof hid.getDevices !== 'function') return false;\n let devices;\n try { devices = await hid.getDevices(); } catch (_) { return false; }\n const d = (devices || []).find(matches);\n return d ? attach(d) : false;\n },\n\n /** Close the device, remove every listener, unregister from the host. */\n dispose() {\n detach();\n if (hid && typeof hid.removeEventListener === 'function') hid.removeEventListener('disconnect', onDisconnect);\n host.players.remove(player);\n host.unregister(s);\n return s;\n },\n });\n\n /** The open HIDDevice, or null. */\n Object.defineProperty(s, 'device', { get: () => device, enumerable: true });\n\n const player = { tick() { feed(); return true; } };\n host.players.add(player);\n if (hid && typeof hid.addEventListener === 'function') hid.addEventListener('disconnect', onDisconnect);\n if (o.bind) s.bind(o.bind);\n if (s.available && o.resume !== false) s.resume();\n return host.register(s);\n}\n\n/**\n * The default gamepad map, the standard layout: left stick → lin[0] / lin[1],\n * right stick → ang[1] / ang[0], the triggers → lin[2] (right minus left).\n */\nexport const GAMEPAD_MAP = { lin: [0, 1, { buttons: [6, 7] }], ang: [3, 2, null] };\n\nfunction _lane(gp, spec) {\n if (spec == null) return 0;\n if (typeof spec === 'number') { const v = gp.axes[spec]; return typeof v === 'number' ? v : 0; }\n if (spec.buttons) {\n const n = gp.buttons[spec.buttons[0]], p = gp.buttons[spec.buttons[1]];\n return (p ? p.value : 0) - (n ? n.value : 0);\n }\n if (spec.button) { const b = gp.buttons[spec.button]; return b ? b.value : 0; }\n return 0;\n}\n\n/**\n * A Gamepad rate stream, polled once per tick.\n *\n * @param {object} host\n * @param {{ index?:number, map?:object, bind?:object, gamepads?:function }} [opts]\n * index: which gamepad (default: the first connected). map: { lin,\n * ang }, each three lane specs — an axis index, { buttons: [neg,\n * pos] }, { button } or null (default GAMEPAD_MAP). bind: a helm to\n * bind at once. gamepads: the poll (default navigator.getGamepads) —\n * the seam a test fills.\n * @returns {object} The stream: { available, connected, index, lin, ang,\n * bind(helm), unbind(), dispose() }.\n */\nexport function createGamepad(host, opts) {\n const o = opts || {};\n const nav = _nav();\n const poll = o.gamepads || (nav && typeof nav.getGamepads === 'function' ? () => nav.getGamepads() : null);\n const map = o.map || GAMEPAD_MAP;\n const lin = [0, 0, 0], ang = [0, 0, 0];\n const { s, feed } = _stream(host, lin, ang);\n\n Object.assign(s, {\n /** Whether the Gamepad API exists. */\n available: !!poll,\n /** Whether the last poll found a gamepad. */\n connected: false,\n /** The gamepad index polled, or null for the first connected. */\n index: o.index ?? null,\n /** Stop polling, unregister from the host. */\n dispose() { host.players.remove(player); host.unregister(s); return s; },\n });\n\n const player = {\n tick() {\n let gp = null;\n if (poll) {\n const list = poll() || [];\n if (s.index != null) gp = list[s.index] || null;\n else for (let i = 0; i < list.length; i++) if (list[i]) { gp = list[i]; break; }\n }\n s.connected = !!gp;\n for (let i = 0; i < 3; i++) {\n lin[i] = gp ? _lane(gp, map.lin[i]) : 0;\n ang[i] = gp ? _lane(gp, map.ang[i]) : 0;\n }\n feed();\n return true;\n },\n };\n host.players.add(player);\n if (o.bind) s.bind(o.bind);\n return host.register(s);\n}\n","/**\n * @file Media sources — images, video and Canvas2D rasters for a bridge's textures.\n * @module host/media\n * @license AGPL-3.0-only\n *\n * What a texture upload reads from: an ImageBitmap fetched from a URL, a\n * hidden <video> element from a file or the user's camera, a bitmap drawn\n * through a 2D context (the text path — glyph strips, billboard tags,\n * anything Canvas2D can typeset). No orientation option anywhere: whether\n * rows flip is the bridge's upload, since it depends on the GPU API's\n * texture space.\n */\n\n'use strict';\n\n/**\n * Fetch an image into an ImageBitmap.\n * @param {string} url\n * @param {{ fetch?:object, bitmap?:object }} [opts]\n * fetch: the fetch init (credentials, mode, …). bitmap: the\n * createImageBitmap options (premultiplyAlpha, colorSpaceConversion, …).\n * @returns {Promise<ImageBitmap>}\n */\nexport async function loadImage(url, opts) {\n const o = opts || {};\n const res = await fetch(url, o.fetch);\n if (!res.ok) throw new Error('[host] image: ' + url + ' → ' + res.status);\n const blob = await res.blob();\n return o.bitmap ? createImageBitmap(blob, o.bitmap) : createImageBitmap(blob);\n}\n\n/**\n * A hidden, muted, inline <video> element from a file or the user's camera.\n * `ready` resolves once metadata arrived (width / height known); a camera\n * denial rejects it. Inside an iframe a camera source needs allow=\"camera\"\n * on the frame.\n *\n * @param {{ src?:string, camera?:boolean|object, loop?:boolean, autoplay?:boolean,\n * document?:object, media?:object }} opts\n * src: a media URL. camera: true or getUserMedia video constraints\n * ({ facingMode, width, height }). loop (default true for src).\n * autoplay (default true): start() once ready. document / media: the\n * Document and MediaDevices to use (defaults: the globals) — the seam\n * a test fills.\n * @returns {{ el:HTMLVideoElement, ready:Promise<object>, width:number, height:number,\n * start():Promise<void>, stop():object, dispose():object }}\n */\nexport function createVideo(opts) {\n const o = opts || {};\n const doc = o.document || (typeof document !== 'undefined' ? document : null);\n if (!doc) { console.error('[host] video: no document.'); return null; }\n const el = doc.createElement('video');\n el.muted = true;\n el.playsInline = true;\n el.setAttribute('playsinline', '');\n el.setAttribute('muted', '');\n el.style.display = 'none';\n let stream = null;\n\n const v = {\n /** The <video> element — the bridge's upload source, refreshed each frame. */\n el,\n /** Intrinsic size, known once `ready` resolved. */\n width: 0, height: 0,\n /** Resolves with this source once metadata arrived; rejects on a camera denial or a load error. */\n ready: null,\n /** Play; resolves when playback began. */\n start() { const p = el.play(); return p && typeof p.catch === 'function' ? p.catch((e) => console.error('[host] video: play() failed: ' + e.message + '.')) : Promise.resolve(); },\n /** Pause. Chainable. */\n stop() { el.pause(); return v; },\n /** Stop, release the camera tracks, detach the element. */\n dispose() {\n el.pause();\n if (stream) { for (const t of stream.getTracks()) t.stop(); stream = null; }\n el.removeAttribute('src');\n el.srcObject = null;\n if (typeof el.remove === 'function') el.remove();\n return v;\n },\n };\n\n v.ready = new Promise((resolve, reject) => {\n const unlisten = () => { el.removeEventListener('loadedmetadata', onMeta); el.removeEventListener('error', onErr); };\n const fail = (msg) => { unlisten(); reject(new Error('[host] video: ' + msg)); };\n const onMeta = () => {\n v.width = el.videoWidth || 0; v.height = el.videoHeight || 0;\n unlisten();\n if (o.autoplay !== false) v.start();\n resolve(v);\n };\n const onErr = () => fail('failed to load ' + (o.src || 'the source') + '.');\n el.addEventListener('loadedmetadata', onMeta);\n el.addEventListener('error', onErr);\n if (o.camera) {\n const media = o.media || (typeof navigator !== 'undefined' && navigator.mediaDevices) || null;\n if (!media || typeof media.getUserMedia !== 'function') { fail('getUserMedia is unavailable here.'); return; }\n media.getUserMedia({ video: o.camera === true ? true : o.camera, audio: false })\n .then((s) => { stream = s; el.srcObject = s; })\n .catch((e) => fail('camera denied: ' + e.message + '.'));\n } else if (o.src) {\n el.loop = o.loop !== false;\n el.src = o.src;\n } else {\n fail('needs { src } or { camera }.');\n }\n });\n v.ready.catch(() => {}); // an unobserved rejection is the caller's to observe, not a crash\n return v;\n}\n\n/**\n * Draw through a 2D context and hand the result back as a texture source: an\n * ImageBitmap where OffscreenCanvas exists, else the canvas element itself.\n *\n * @param {function(CanvasRenderingContext2D, number, number):void} draw\n * @param {number} w Pixel width.\n * @param {number} h Pixel height.\n * @param {{ document?:object }} [opts] The Document for the fallback canvas.\n * @returns {ImageBitmap|HTMLCanvasElement|null}\n */\nexport function raster(draw, w, h, opts) {\n const o = opts || {};\n if (typeof OffscreenCanvas !== 'undefined') {\n const c = new OffscreenCanvas(w, h);\n draw(c.getContext('2d'), w, h);\n return c.transferToImageBitmap();\n }\n const doc = o.document || (typeof document !== 'undefined' ? document : null);\n if (!doc) { console.error('[host] raster: no OffscreenCanvas and no document.'); return null; }\n const c = doc.createElement('canvas');\n c.width = w; c.height = h;\n draw(c.getContext('2d'), w, h);\n return c;\n}\n","/**\n * @file The label layer — DOM text over the canvas, anchored in world or screen space.\n * @module host/labels\n * @license AGPL-3.0-only\n *\n * The replacement for WEBGL text() in HUDs, gizmo labels and formula\n * readouts, with the browser's own shaping. One absolutely positioned <div>\n * overlays the canvas as its next sibling, pointer-events: none, sized by\n * the canvas observer; the host sets the canvas parent to position:\n * relative when it is static, and says so in the console once.\n *\n * labels.set(id, text, x, y, z, opts) // a world anchor, projected each tick()\n * labels.setScreen(id, text, sx, sy, opts) // canvas px, the HUD form\n * labels.remove(id) · labels.clear() · labels.visible\n * labels.tick() // after the view bag is current\n *\n * opts: dx / dy pixel offsets, anchor ('center' default, 'left', 'right'),\n * class — a CSS class beside the layer's own 'host-label', frame — a\n * transient label that lives for the frame it was set in: a gizmo re-sets\n * it every draw and tick() removes it once a frame passes without. A label\n * whose screen depth leaves [0, 1] or whose anchor leaves the canvas is\n * hidden, not clamped. Elements are reused by id; tick() writes transforms\n * only, text when the string changed.\n */\n\n'use strict';\n\nimport { WORLD, SCREEN, mapLocation } from '@nakednous/tree';\n\nconst _p = [0, 0, 0];\nconst _ANCHOR = { center: -50, left: 0, right: -100 };\nconst _NO_OPTS = {};\n\n/**\n * Create the label layer of a canvas. The layer is inserted at once; it\n * needs a parent, so create it after the canvas is in the document.\n *\n * @param {object} host Its canvas, view bag and size are read.\n * @param {{ document?:object }} [opts] The Document (default: the global).\n * @returns {object|null} The layer, or null without a document or a parent.\n */\nexport function createLabels(host, opts) {\n const o = opts || {};\n const doc = o.document || (typeof document !== 'undefined' ? document : null);\n const canvas = host.canvas;\n const parent = canvas && canvas.parentNode;\n if (!doc || !parent) { console.error('[host] labels: the canvas needs a parent element.'); return null; }\n\n const el = doc.createElement('div');\n el.className = 'host-labels';\n Object.assign(el.style, {\n position: 'absolute', left: '0px', top: '0px', width: '0px', height: '0px',\n pointerEvents: 'none', overflow: 'hidden',\n });\n const cs = typeof getComputedStyle === 'function' ? getComputedStyle(parent) : null;\n if (cs && cs.position === 'static') {\n parent.style.position = 'relative';\n console.info('[host] labels: set the canvas parent to position: relative for the label layer.');\n }\n parent.insertBefore(el, canvas.nextSibling);\n\n const entries = new Map(); // id → { el, text, x, y, z, dx, dy, ax, screen, cls, sx, sy, shown }\n let width = 0, height = 0, left = -1, top = -1, visible = true;\n\n const entry = (id, text, o) => {\n let e = entries.get(id);\n if (!e) {\n const span = doc.createElement('span');\n Object.assign(span.style, { position: 'absolute', left: '0px', top: '0px', whiteSpace: 'nowrap', willChange: 'transform' });\n span.style.visibility = 'hidden';\n el.appendChild(span);\n e = { el: span, text: null, x: 0, y: 0, z: 0, dx: 0, dy: 0, ax: -50, screen: false, cls: null, sx: NaN, sy: NaN, shown: false, frame: false, fresh: false };\n entries.set(id, e);\n }\n if (e.text !== text) { e.text = text; e.el.textContent = text; }\n const c = o.class || null;\n if (e.cls !== c) { e.cls = c; e.el.className = c ? 'host-label ' + c : 'host-label'; }\n e.ax = _ANCHOR[o.anchor] ?? -50;\n e.dx = o.dx || 0; e.dy = o.dy || 0;\n e.frame = !!o.frame; e.fresh = true;\n return e;\n };\n const place = (e, sx, sy) => {\n if (sx === e.sx && sy === e.sy) return;\n e.sx = sx; e.sy = sy;\n e.el.style.transform = 'translate(' + sx + 'px, ' + sy + 'px) translate(' + e.ax + '%, -50%)';\n };\n const show = (e, on) => {\n if (e.shown === on) return;\n e.shown = on;\n e.el.style.visibility = on ? '' : 'hidden';\n };\n\n const labels = {\n /** The layer element. */\n el,\n /** Whether the layer shows; false hides every label at once. */\n get visible() { return visible; },\n set visible(v) { visible = !!v; el.style.display = visible ? '' : 'none'; },\n /** Live label count. */\n get size() { return entries.size; },\n\n /**\n * Place a label at a world anchor, projected each tick().\n * @param {string} id\n * @param {string} text\n * @param {number} x, y, z World anchor.\n * @param {{ dx?:number, dy?:number, anchor?:string, class?:string, frame?:boolean }} [opts]\n * @returns {object} this\n */\n set(id, text, x, y, z, opts) {\n const e = entry(id, text, opts || _NO_OPTS);\n e.screen = false; e.x = x; e.y = y; e.z = z;\n return labels;\n },\n\n /**\n * Place a label in canvas px — the HUD form.\n * @param {string} id\n * @param {string} text\n * @param {number} sx, sy Canvas px, y down.\n * @param {{ dx?:number, dy?:number, anchor?:string, class?:string, frame?:boolean }} [opts]\n * @returns {object} this\n */\n setScreen(id, text, sx, sy, opts) {\n const e = entry(id, text, opts || _NO_OPTS);\n e.screen = true; e.x = sx; e.y = sy; e.z = 0;\n return labels;\n },\n\n /** Remove a label. */\n remove(id) {\n const e = entries.get(id);\n if (e) { el.removeChild(e.el); entries.delete(id); }\n return labels;\n },\n\n /** Remove every label. */\n clear() { for (const id of [...entries.keys()]) labels.remove(id); return labels; },\n\n /**\n * Project every world label through the view bag and write the\n * transforms; hide what falls outside the canvas or the depth range.\n * Call after the view bag is current for the frame.\n * @returns {object} this\n */\n tick() {\n const ol = canvas.offsetLeft || 0, ot = canvas.offsetTop || 0;\n if (ol !== left || ot !== top) { left = ol; top = ot; el.style.left = ol + 'px'; el.style.top = ot + 'px'; }\n const view = host.view;\n for (const [id, e] of entries) {\n if (e.frame && !e.fresh) { labels.remove(id); continue; }\n e.fresh = false;\n let sx, sy, on;\n if (e.screen) { sx = e.x; sy = e.y; on = true; }\n else if (!view || view.stale) { on = false; }\n else {\n mapLocation(_p, e.x, e.y, e.z, WORLD, SCREEN, view, view.vp, view.ndcZMin);\n sx = _p[0]; sy = _p[1];\n on = _p[2] >= 0 && _p[2] <= 1 && sx >= 0 && sx <= width && sy >= 0 && sy <= height;\n }\n if (on) place(e, sx + e.dx, sy + e.dy);\n show(e, on);\n }\n return labels;\n },\n\n /**\n * The observer's write: the layer's size in CSS px.\n * @param {number} w\n * @param {number} h\n * @returns {object} this\n */\n resize(w, h) {\n width = w; height = h;\n el.style.width = w + 'px'; el.style.height = h + 'px';\n return labels;\n },\n\n /** Remove the layer and its labels. */\n dispose() {\n entries.clear();\n if (el.parentNode) el.parentNode.removeChild(el);\n host.unregister(labels);\n return labels;\n },\n };\n labels.resize(host.width || 0, host.height || 0);\n return host.register(labels);\n}\n","/**\n * @file The orbit — the fall-through camera gesture on unclaimed pointers.\n * @module host/orbit\n * @license AGPL-3.0-only\n *\n * What the handle gate yields to: one pointer orbits the camera state about\n * its center, two pointers dolly by their distance and pan by their\n * midpoint, the wheel dollies. update() consumes only unclaimed pointers and\n * returns true when it moved the camera, so\n *\n * if (!h.update()) orbit.update()\n *\n * reads as the gate. It writes cam only; the next setCamera(cam) installs it.\n * Two-pointer motion is computed from the pointers' own coordinates, never\n * from a browser's pinch synthesis, so it reads the same on every platform;\n * the canvas gets touch-action: none while the orbit lives so the browser\n * does not scroll or zoom the page instead. No damping, no inertia: direct\n * manipulation wants exactness, and a sketch that wants smoothing lerps the\n * camera it owns.\n *\n * Screen y runs down; which world direction that is depends on the\n * projection installed in the view bag: a y-up projection (GL's, tree's\n * default) maps a downward drag to the eye's −up, a y-flipped one (p5's,\n * mat4Proj[5] < 0) to +up. The orbit reads that sign off the bag each\n * update, so a drag down always brings the scene down.\n */\n\n'use strict';\n\nimport { createCamera, cameraCopy, cameraOrbit, cameraDolly, cameraPan, pixelRatio } from '@nakednous/tree';\n\nconst _clamp = { min: 0, max: Infinity };\n\n/**\n * Create an orbit on a camera state.\n *\n * @param {object} host\n * @param {object} cam The camera state written.\n * @param {{ rotate?:number, pan?:number, zoom?:number, wheel?:number,\n * minDistance?:number, maxDistance?:number, enabled?:boolean }} [opts]\n * rotate: radians per pixel (default 0.005). pan / zoom / wheel:\n * scalars on the two-pointer pan, the pinch and the wheel dolly\n * (default 1). minDistance / maxDistance: gaze-distance clamps.\n * @returns {object} The orbit: { cam, enabled, rotate, pan, zoom, wheel,\n * minDistance, maxDistance, update(), home(), dispose() }.\n */\nexport function createOrbit(host, cam, opts) {\n const o = opts || {};\n const canvas = host.canvas;\n const home = cameraCopy(createCamera(), cam);\n const tracked = new Map(); // pointer id → { x, y } as last consumed\n let wheelAcc = 0;\n\n const onWheel = (e) => {\n if (typeof e.preventDefault === 'function') e.preventDefault();\n const unit = e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? (host.height || 1) : 1;\n wheelAcc += (e.deltaY || 0) * unit;\n };\n canvas.addEventListener('wheel', onWheel, { passive: false });\n const touchAction = canvas.style ? canvas.style.touchAction : undefined;\n if (canvas.style) canvas.style.touchAction = 'none';\n\n const track = (p) => {\n let t = tracked.get(p.id);\n if (!t) { t = { x: p.x, y: p.y }; tracked.set(p.id, t); }\n else { t.x = p.x; t.y = p.y; }\n };\n const distance = () => {\n const e = cam.eye, c = cam.center;\n return Math.hypot(e[0] - c[0], e[1] - c[1], e[2] - c[2]);\n };\n const dolly = (factor) => {\n _clamp.min = orbit.minDistance; _clamp.max = orbit.maxDistance;\n cameraDolly(cam, factor, _clamp);\n };\n\n const orbit = {\n /** The camera state written. */\n cam,\n /** False makes update() a no-op that drops its pointer memory. */\n enabled: o.enabled !== false,\n /** Radians per pixel of one-pointer drag. */\n rotate: o.rotate ?? 0.005,\n /** Scalar on the two-pointer pan. */\n pan: o.pan ?? 1,\n /** Scalar on the pinch dolly's exponent. */\n zoom: o.zoom ?? 1,\n /** Scalar on the wheel dolly. */\n wheel: o.wheel ?? 1,\n /** Gaze-distance clamps for every dolly. */\n minDistance: o.minDistance ?? 0,\n maxDistance: o.maxDistance ?? Infinity,\n\n /**\n * Consume this frame's unclaimed pointer motion and wheel into cam.\n * @returns {boolean} Whether the camera moved.\n */\n update() {\n if (!orbit.enabled) { tracked.clear(); wheelAcc = 0; return false; }\n const src = host.pointer;\n let a = null, b = null;\n for (const p of src.pointers.values()) {\n if (p.owner !== null || p.up || p.cancel) { tracked.delete(p.id); continue; }\n if (a === null || p.id < a.id) { b = a; a = p; }\n else if (b === null || p.id < b.id) b = p;\n }\n for (const id of tracked.keys()) {\n if ((a === null || id !== a.id) && (b === null || id !== b.id)) tracked.delete(id);\n }\n let moved = false;\n const view = host.view;\n const ys = view.mat4Proj[5] < 0 ? -1 : 1; // screen-down is the eye's −up under a y-up projection, +up under p5's flip\n if (a !== null && b === null) {\n const t = tracked.get(a.id);\n if (t) {\n const dx = a.x - t.x, dy = a.y - t.y;\n if (dx !== 0 || dy !== 0) { cameraOrbit(cam, -dx * orbit.rotate, ys * dy * orbit.rotate); moved = true; }\n }\n track(a);\n } else if (a !== null && b !== null) {\n const ta = tracked.get(a.id), tb = tracked.get(b.id);\n if (ta && tb) {\n const dmx = (a.x + b.x - ta.x - tb.x) / 2, dmy = (a.y + b.y - ta.y - tb.y) / 2;\n if (dmx !== 0 || dmy !== 0) {\n const ratio = pixelRatio(view.mat4Proj, -view.vp[3] || 1, -distance(), view.ndcZMin);\n cameraPan(cam, -dmx * ratio * orbit.pan, ys * dmy * ratio * orbit.pan);\n moved = true;\n }\n const d0 = Math.hypot(ta.x - tb.x, ta.y - tb.y), d1 = Math.hypot(a.x - b.x, a.y - b.y);\n if (d0 > 0 && d1 > 0 && d0 !== d1) { dolly(Math.pow(d0 / d1, orbit.zoom)); moved = true; }\n }\n track(a); track(b);\n }\n if (wheelAcc !== 0) {\n dolly(Math.exp(wheelAcc * 0.001 * orbit.wheel));\n wheelAcc = 0;\n moved = true;\n }\n return moved;\n },\n\n /** Restore the pose captured at creation. */\n home() { cameraCopy(cam, home); return orbit; },\n\n /** Remove the wheel listener, restore touch-action, unregister from the host. */\n dispose() {\n canvas.removeEventListener('wheel', onWheel);\n if (canvas.style) canvas.style.touchAction = touchAction;\n tracked.clear();\n host.unregister(orbit);\n return orbit;\n },\n };\n return host.register(orbit);\n}\n","/**\n * @file The host context — one per canvas: pointer, view bag, players, loop, observer.\n * @module host\n * @license AGPL-3.0-only\n *\n * The signal host of a program: what it needs from the browser that is\n * neither math nor GPU — a canvas element's pointer input, the frame clock,\n * its size — and the registry its constructs tick from. Pure vanilla DOM;\n * everything it computes goes through @nakednous/tree, nothing it draws.\n *\n * const host = createHost(canvas, { onFrame })\n * host.pointer · host.view · host.players\n * host.width · host.height · host.dpr · host.dt · host.clock()\n * host.handle(opts) · host.router(handles, opts)\n * host.cameraHelm(cam, opts) · host.poseHelm(opts)\n * host.poseTrack(opts) · host.cameraTrack(cam, opts)\n * host.hid(opts) · host.gamepad(opts)\n * host.image(url) · host.video(opts) · host.raster(draw, w, h)\n * host.labels // the DOM label layer, created on first access\n * host.orbit(cam, opts)\n * host.tick(dt) // external-loop mode\n * host.dispose()\n *\n * Two loop modes. With { onFrame } the host runs requestAnimationFrame\n * (overridable through { raf, caf }): each frame computes dt (clamped to\n * 50 ms), ticks the players, calls onFrame(dt, host), then flushes the\n * pointer source. Without it the application, or the p5 adapter from\n * predraw, calls host.tick(dt) = players.tick(dt) and host.pointer.flush()\n * once its consumers ran. Nothing else in the host cares who owns the loop.\n *\n * The frame order inside onFrame: install the camera (which fills\n * host.view), update handles or routers, fall through to the orbit when\n * nothing grabbed, draw.\n */\n\n'use strict';\n\nimport { createView } from './view.js';\nimport { observeCanvas } from './canvas.js';\nimport { createPointer } from './pointer.js';\nimport { createPlayers, createLoop } from './loop.js';\nimport { Handle, validConstraint } from './handle.js';\nimport { PointerRouter } from './router.js';\nimport { cameraHelm, poseHelm } from './helm.js';\nimport { poseTrack, cameraTrack } from './track.js';\nimport { createHid, createGamepad } from './stream.js';\nimport { loadImage, createVideo, raster } from './media.js';\nimport { createLabels } from './labels.js';\nimport { createOrbit } from './orbit.js';\n\nexport { createView } from './view.js';\nexport { observeCanvas, measureCanvas } from './canvas.js';\nexport { createPointer } from './pointer.js';\nexport { createPlayers, createLoop } from './loop.js';\nexport { Handle, VIEW, isConstraint, validConstraint } from './handle.js';\nexport { PointerRouter } from './router.js';\nexport { cameraHelm, poseHelm, helmBasis } from './helm.js';\nexport { poseTrack, cameraTrack, TrackHandles } from './track.js';\nexport { createHid, createGamepad, decodeSpaceNavigator, HID_FILTERS, GAMEPAD_MAP } from './stream.js';\nexport { loadImage, createVideo, raster } from './media.js';\nexport { createLabels } from './labels.js';\nexport { createOrbit } from './orbit.js';\n\nconst _now = () => (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\n\n/**\n * Create the host context of a canvas.\n *\n * @param {HTMLCanvasElement} canvas\n * @param {{ ndcZMin?:number, onFrame?:function(number, object):void, raf?:function,\n * caf?:function, onSize?:function(number, number, number):void }} [opts]\n * ndcZMin: the GPU API's NDC-z convention, WEBGL (default) or WEBGPU —\n * written once, never detected. onFrame: the host's own loop; absent,\n * external-tick mode. onSize(width, height, dpr): the bridge's chance\n * to resize its drawing buffer.\n * @returns {object} The host.\n */\nexport function createHost(canvas, opts) {\n const o = opts || {};\n const t0 = _now();\n const constructs = new Set();\n let loop = null, observer = null, labels = null;\n const host = {\n canvas,\n width: 0, height: 0, dpr: 1,\n dt: 0,\n view: null, pointer: null, players: null,\n\n /** Seconds since the host was created. */\n clock() { return (_now() - t0) / 1000; },\n\n /**\n * External-loop mode: tick the players with dt (seconds). The caller\n * flushes the pointer source once its consumers ran.\n * @param {number} dt\n */\n tick(dt) { host.dt = dt; host.players.tick(dt); },\n\n /**\n * A draggable handle on this canvas — see host/handle. Returns null on\n * an invalid `constraint`.\n * @param {object} opts\n * @returns {Handle|null}\n */\n handle(opts) {\n const o = opts || {};\n if (!validConstraint(o.constraint)) {\n console.error('[host] handle: `constraint` must be SPHERE, PLANE, AXIS, DIAL, VIEW, or a contract-conforming constraint object; got ' + String(o.constraint) + '.');\n return null;\n }\n return host.register(new Handle(host, o));\n },\n\n /**\n * A shared pick over overlapping handles — see host/router.\n * @param {Handle[]} handles\n * @param {{ hover?:boolean }} [opts]\n * @returns {PointerRouter}\n */\n router(handles, opts) { return host.register(new PointerRouter(host, handles, opts)); },\n\n /** Fly a camera state body-relative from a 6-DOF rate stream — see host/helm. */\n cameraHelm(cam, opts) { return cameraHelm(host, cam, opts); },\n /** Integrate a 6-DOF rate stream into a pose in a declared frame — see host/helm. */\n poseHelm(opts) { return poseHelm(host, opts); },\n /** A core PoseTrack ticked while it plays — see host/track. */\n poseTrack(opts) { return poseTrack(host, opts); },\n /** A core CameraTrack evaluating into a camera state while it plays — see host/track. */\n cameraTrack(cam, opts) { return cameraTrack(host, cam, opts); },\n /** A WebHID 6-DOF rate stream — see host/stream. */\n hid(opts) { return createHid(host, opts); },\n /** A Gamepad rate stream, polled each tick — see host/stream. */\n gamepad(opts) { return createGamepad(host, opts); },\n /** Fetch an image into an ImageBitmap — see host/media. */\n image(url, opts) { return loadImage(url, opts); },\n /** A hidden <video> from a file or the camera, disposed with the host — see host/media. */\n video(opts) { return host.register(createVideo(opts)); },\n /** Draw through a 2D context into a texture source — see host/media. */\n raster(draw, w, h, opts) { return raster(draw, w, h, opts); },\n /**\n * The label layer — see host/labels. Created on first access, so a\n * canvas that never labels never gets a layer nor a repositioned parent.\n */\n get labels() {\n if (labels === null) labels = createLabels(host);\n return labels;\n },\n /** Whether the label layer exists, without creating it. */\n get hasLabels() { return labels !== null; },\n /** The fall-through camera gesture on unclaimed pointers — see host/orbit. */\n orbit(cam, opts) { return createOrbit(host, cam, opts); },\n\n /** Register a construct with dispose() so host.dispose() releases it. */\n register(c) { if (c) constructs.add(c); return c; },\n /** Unregister a construct. */\n unregister(c) { constructs.delete(c); },\n\n /** Stop the loop, disconnect the observer, remove every listener, dispose every construct. */\n dispose() {\n if (loop) loop.stop();\n for (const c of [...constructs]) { if (typeof c.dispose === 'function') c.dispose(); }\n constructs.clear();\n labels = null;\n observer.dispose();\n host.pointer.dispose();\n host.players.clear();\n },\n };\n\n host.view = createView({ ndcZMin: o.ndcZMin });\n host.players = createPlayers();\n host.pointer = createPointer(canvas, host.view);\n observer = observeCanvas(canvas, (w, h, dpr) => {\n host.width = w; host.height = h; host.dpr = dpr;\n host.view.resize(w, h);\n if (labels) labels.resize(w, h);\n if (typeof o.onSize === 'function') o.onSize(w, h, dpr);\n });\n\n if (typeof o.onFrame === 'function') {\n loop = createLoop({\n raf: o.raf, caf: o.caf,\n onFrame: (dt) => {\n host.dt = dt;\n host.players.tick(dt);\n o.onFrame(dt, host);\n host.pointer.flush();\n },\n });\n loop.start();\n }\n return host;\n}\n"],"names":["_clamp","_now","_vx"],"mappings":"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AAC,CAAC,CAAC;AACrC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AACjC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;AAClC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,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C,OAAO,CAAC,CAAC,GAAG;AACjE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;AACtD;;AA6GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE;AACtB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK;AAChD,E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"}