@nakednous/host 0.0.4 → 0.0.5
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/README.md +4 -4
- package/dist/index.js +135 -77
- package/dist/index.js.map +1 -1
- package/package.json +3 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../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","../node_modules/webgl-obj-loader/dist/webgl-obj-loader.min.js","../src/media.js","../src/labels.js","../src/orbit.js","../src/index.js"],"sourcesContent":["/**\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","!function(e,t){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var n=t();for(var a in n)(\"object\"==typeof exports?exports:e)[a]=n[a]}}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var s=t[a]={i:a,l:!1,exports:{}};return e[a].call(s.exports,s,s.exports,n),s.l=!0,s.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var s in e)n.d(a,s,function(t){return e[t]}.bind(null,s));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"/\",n(n.s=0)}({\"./src/index.ts\":\n/*!**********************!*\\\n !*** ./src/index.ts ***!\n \\**********************/\n/*! exports provided: OBJ, Attribute, DuplicateAttributeException, Layout, Material, MaterialLibrary, Mesh, TYPES, downloadModels, downloadMeshes, initMeshBuffers, deleteMeshBuffers, version */function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval('__webpack_require__.r(__webpack_exports__);\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"OBJ\", function() { return OBJ; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"version\", function() { return version; });\\n/* harmony import */ var _mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mesh */ \"./src/mesh.ts\");\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Mesh\", function() { return _mesh__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\\n\\n/* harmony import */ var _material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./material */ \"./src/material.ts\");\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Material\", function() { return _material__WEBPACK_IMPORTED_MODULE_1__[\"Material\"]; });\\n\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MaterialLibrary\", function() { return _material__WEBPACK_IMPORTED_MODULE_1__[\"MaterialLibrary\"]; });\\n\\n/* harmony import */ var _layout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./layout */ \"./src/layout.ts\");\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Attribute\", function() { return _layout__WEBPACK_IMPORTED_MODULE_2__[\"Attribute\"]; });\\n\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"DuplicateAttributeException\", function() { return _layout__WEBPACK_IMPORTED_MODULE_2__[\"DuplicateAttributeException\"]; });\\n\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Layout\", function() { return _layout__WEBPACK_IMPORTED_MODULE_2__[\"Layout\"]; });\\n\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TYPES\", function() { return _layout__WEBPACK_IMPORTED_MODULE_2__[\"TYPES\"]; });\\n\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"downloadModels\", function() { return _utils__WEBPACK_IMPORTED_MODULE_3__[\"downloadModels\"]; });\\n\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"downloadMeshes\", function() { return _utils__WEBPACK_IMPORTED_MODULE_3__[\"downloadMeshes\"]; });\\n\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"initMeshBuffers\", function() { return _utils__WEBPACK_IMPORTED_MODULE_3__[\"initMeshBuffers\"]; });\\n\\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"deleteMeshBuffers\", function() { return _utils__WEBPACK_IMPORTED_MODULE_3__[\"deleteMeshBuffers\"]; });\\n\\n\\n\\n\\n\\nconst version = \"2.0.3\";\\nconst OBJ = {\\n Attribute: _layout__WEBPACK_IMPORTED_MODULE_2__[\"Attribute\"],\\n DuplicateAttributeException: _layout__WEBPACK_IMPORTED_MODULE_2__[\"DuplicateAttributeException\"],\\n Layout: _layout__WEBPACK_IMPORTED_MODULE_2__[\"Layout\"],\\n Material: _material__WEBPACK_IMPORTED_MODULE_1__[\"Material\"],\\n MaterialLibrary: _material__WEBPACK_IMPORTED_MODULE_1__[\"MaterialLibrary\"],\\n Mesh: _mesh__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\\n TYPES: _layout__WEBPACK_IMPORTED_MODULE_2__[\"TYPES\"],\\n downloadModels: _utils__WEBPACK_IMPORTED_MODULE_3__[\"downloadModels\"],\\n downloadMeshes: _utils__WEBPACK_IMPORTED_MODULE_3__[\"downloadMeshes\"],\\n initMeshBuffers: _utils__WEBPACK_IMPORTED_MODULE_3__[\"initMeshBuffers\"],\\n deleteMeshBuffers: _utils__WEBPACK_IMPORTED_MODULE_3__[\"deleteMeshBuffers\"],\\n version,\\n};\\n/**\\n * @namespace\\n */\\n\\n\\n\\n//# sourceURL=webpack:///./src/index.ts?')},\"./src/layout.ts\":\n/*!***********************!*\\\n !*** ./src/layout.ts ***!\n \\***********************/\n/*! exports provided: TYPES, DuplicateAttributeException, Attribute, Layout */function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval('__webpack_require__.r(__webpack_exports__);\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"TYPES\", function() { return TYPES; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DuplicateAttributeException\", function() { return DuplicateAttributeException; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Attribute\", function() { return Attribute; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Layout\", function() { return Layout; });\\nvar TYPES;\\n(function (TYPES) {\\n TYPES[\"BYTE\"] = \"BYTE\";\\n TYPES[\"UNSIGNED_BYTE\"] = \"UNSIGNED_BYTE\";\\n TYPES[\"SHORT\"] = \"SHORT\";\\n TYPES[\"UNSIGNED_SHORT\"] = \"UNSIGNED_SHORT\";\\n TYPES[\"FLOAT\"] = \"FLOAT\";\\n})(TYPES || (TYPES = {}));\\n/**\\n * An exception for when two or more of the same attributes are found in the\\n * same layout.\\n * @private\\n */\\nclass DuplicateAttributeException extends Error {\\n /**\\n * Create a DuplicateAttributeException\\n * @param {Attribute} attribute - The attribute that was found more than\\n * once in the {@link Layout}\\n */\\n constructor(attribute) {\\n super(`found duplicate attribute: ${attribute.key}`);\\n }\\n}\\n/**\\n * Represents how a vertex attribute should be packed into an buffer.\\n * @private\\n */\\nclass Attribute {\\n /**\\n * Create an attribute. Do not call this directly, use the predefined\\n * constants.\\n * @param {string} key - The name of this attribute as if it were a key in\\n * an Object. Use the camel case version of the upper snake case\\n * const name.\\n * @param {number} size - The number of components per vertex attribute.\\n * Must be 1, 2, 3, or 4.\\n * @param {string} type - The data type of each component for this\\n * attribute. Possible values:<br/>\\n * \"BYTE\": signed 8-bit integer, with values in [-128, 127]<br/>\\n * \"SHORT\": signed 16-bit integer, with values in\\n * [-32768, 32767]<br/>\\n * \"UNSIGNED_BYTE\": unsigned 8-bit integer, with values in\\n * [0, 255]<br/>\\n * \"UNSIGNED_SHORT\": unsigned 16-bit integer, with values in\\n * [0, 65535]<br/>\\n * \"FLOAT\": 32-bit floating point number\\n * @param {boolean} normalized - Whether integer data values should be\\n * normalized when being casted to a float.<br/>\\n * If true, signed integers are normalized to [-1, 1].<br/>\\n * If true, unsigned integers are normalized to [0, 1].<br/>\\n * For type \"FLOAT\", this parameter has no effect.\\n */\\n constructor(key, size, type, normalized = false) {\\n this.key = key;\\n this.size = size;\\n this.type = type;\\n this.normalized = normalized;\\n switch (type) {\\n case \"BYTE\":\\n case \"UNSIGNED_BYTE\":\\n this.sizeOfType = 1;\\n break;\\n case \"SHORT\":\\n case \"UNSIGNED_SHORT\":\\n this.sizeOfType = 2;\\n break;\\n case \"FLOAT\":\\n this.sizeOfType = 4;\\n break;\\n default:\\n throw new Error(`Unknown gl type: ${type}`);\\n }\\n this.sizeInBytes = this.sizeOfType * size;\\n }\\n}\\n/**\\n * A class to represent the memory layout for a vertex attribute array. Used by\\n * {@link Mesh}\\'s TBD(...) method to generate a packed array from mesh data.\\n * <p>\\n * Layout can sort of be thought of as a C-style struct declaration.\\n * {@link Mesh}\\'s TBD(...) method will use the {@link Layout} instance to\\n * pack an array in the given attribute order.\\n * <p>\\n * Layout also is very helpful when calling a WebGL context\\'s\\n * <code>vertexAttribPointer</code> method. If you\\'ve created a buffer using\\n * a Layout instance, then the same Layout instance can be used to determine\\n * the size, type, normalized, stride, and offset parameters for\\n * <code>vertexAttribPointer</code>.\\n * <p>\\n * For example:\\n * <pre><code>\\n *\\n * const index = glctx.getAttribLocation(shaderProgram, \"pos\");\\n * glctx.vertexAttribPointer(\\n * layout.position.size,\\n * glctx[layout.position.type],\\n * layout.position.normalized,\\n * layout.position.stride,\\n * layout.position.offset);\\n * </code></pre>\\n * @see {@link Mesh}\\n */\\nclass Layout {\\n /**\\n * Create a Layout object. This constructor will throw if any duplicate\\n * attributes are given.\\n * @param {Array} ...attributes - An ordered list of attributes that\\n * describe the desired memory layout for each vertex attribute.\\n * <p>\\n *\\n * @see {@link Mesh}\\n */\\n constructor(...attributes) {\\n this.attributes = attributes;\\n this.attributeMap = {};\\n let offset = 0;\\n let maxStrideMultiple = 0;\\n for (const attribute of attributes) {\\n if (this.attributeMap[attribute.key]) {\\n throw new DuplicateAttributeException(attribute);\\n }\\n // Add padding to satisfy WebGL\\'s requirement that all\\n // vertexAttribPointer calls have an offset that is a multiple of\\n // the type size.\\n if (offset % attribute.sizeOfType !== 0) {\\n offset += attribute.sizeOfType - (offset % attribute.sizeOfType);\\n console.warn(\"Layout requires padding before \" + attribute.key + \" attribute\");\\n }\\n this.attributeMap[attribute.key] = {\\n attribute: attribute,\\n size: attribute.size,\\n type: attribute.type,\\n normalized: attribute.normalized,\\n offset: offset,\\n };\\n offset += attribute.sizeInBytes;\\n maxStrideMultiple = Math.max(maxStrideMultiple, attribute.sizeOfType);\\n }\\n // Add padding to the end to satisfy WebGL\\'s requirement that all\\n // vertexAttribPointer calls have a stride that is a multiple of the\\n // type size. Because we\\'re putting differently sized attributes into\\n // the same buffer, it must be padded to a multiple of the largest\\n // type size.\\n if (offset % maxStrideMultiple !== 0) {\\n offset += maxStrideMultiple - (offset % maxStrideMultiple);\\n console.warn(\"Layout requires padding at the back\");\\n }\\n this.stride = offset;\\n for (const attribute of attributes) {\\n this.attributeMap[attribute.key].stride = this.stride;\\n }\\n }\\n}\\n// Geometry attributes\\n/**\\n * Attribute layout to pack a vertex\\'s x, y, & z as floats\\n *\\n * @see {@link Layout}\\n */\\nLayout.POSITION = new Attribute(\"position\", 3, TYPES.FLOAT);\\n/**\\n * Attribute layout to pack a vertex\\'s normal\\'s x, y, & z as floats\\n *\\n * @see {@link Layout}\\n */\\nLayout.NORMAL = new Attribute(\"normal\", 3, TYPES.FLOAT);\\n/**\\n * Attribute layout to pack a vertex\\'s normal\\'s x, y, & z as floats.\\n * <p>\\n * This value will be computed on-the-fly based on the texture coordinates.\\n * If no texture coordinates are available, the generated value will default to\\n * 0, 0, 0.\\n *\\n * @see {@link Layout}\\n */\\nLayout.TANGENT = new Attribute(\"tangent\", 3, TYPES.FLOAT);\\n/**\\n * Attribute layout to pack a vertex\\'s normal\\'s bitangent x, y, & z as floats.\\n * <p>\\n * This value will be computed on-the-fly based on the texture coordinates.\\n * If no texture coordinates are available, the generated value will default to\\n * 0, 0, 0.\\n * @see {@link Layout}\\n */\\nLayout.BITANGENT = new Attribute(\"bitangent\", 3, TYPES.FLOAT);\\n/**\\n * Attribute layout to pack a vertex\\'s texture coordinates\\' u & v as floats\\n *\\n * @see {@link Layout}\\n */\\nLayout.UV = new Attribute(\"uv\", 2, TYPES.FLOAT);\\n// Material attributes\\n/**\\n * Attribute layout to pack an unsigned short to be interpreted as a the index\\n * into a {@link Mesh}\\'s materials list.\\n * <p>\\n * The intention of this value is to send all of the {@link Mesh}\\'s materials\\n * into multiple shader uniforms and then reference the current one by this\\n * vertex attribute.\\n * <p>\\n * example glsl code:\\n *\\n * <pre><code>\\n * // this is bound using MATERIAL_INDEX\\n * attribute int materialIndex;\\n *\\n * struct Material {\\n * vec3 diffuse;\\n * vec3 specular;\\n * vec3 specularExponent;\\n * };\\n *\\n * uniform Material materials[MAX_MATERIALS];\\n *\\n * // ...\\n *\\n * vec3 diffuse = materials[materialIndex];\\n *\\n * </code></pre>\\n * TODO: More description & test to make sure subscripting by attributes even\\n * works for webgl\\n *\\n * @see {@link Layout}\\n */\\nLayout.MATERIAL_INDEX = new Attribute(\"materialIndex\", 1, TYPES.SHORT);\\nLayout.MATERIAL_ENABLED = new Attribute(\"materialEnabled\", 1, TYPES.UNSIGNED_SHORT);\\nLayout.AMBIENT = new Attribute(\"ambient\", 3, TYPES.FLOAT);\\nLayout.DIFFUSE = new Attribute(\"diffuse\", 3, TYPES.FLOAT);\\nLayout.SPECULAR = new Attribute(\"specular\", 3, TYPES.FLOAT);\\nLayout.SPECULAR_EXPONENT = new Attribute(\"specularExponent\", 3, TYPES.FLOAT);\\nLayout.EMISSIVE = new Attribute(\"emissive\", 3, TYPES.FLOAT);\\nLayout.TRANSMISSION_FILTER = new Attribute(\"transmissionFilter\", 3, TYPES.FLOAT);\\nLayout.DISSOLVE = new Attribute(\"dissolve\", 1, TYPES.FLOAT);\\nLayout.ILLUMINATION = new Attribute(\"illumination\", 1, TYPES.UNSIGNED_SHORT);\\nLayout.REFRACTION_INDEX = new Attribute(\"refractionIndex\", 1, TYPES.FLOAT);\\nLayout.SHARPNESS = new Attribute(\"sharpness\", 1, TYPES.FLOAT);\\nLayout.MAP_DIFFUSE = new Attribute(\"mapDiffuse\", 1, TYPES.SHORT);\\nLayout.MAP_AMBIENT = new Attribute(\"mapAmbient\", 1, TYPES.SHORT);\\nLayout.MAP_SPECULAR = new Attribute(\"mapSpecular\", 1, TYPES.SHORT);\\nLayout.MAP_SPECULAR_EXPONENT = new Attribute(\"mapSpecularExponent\", 1, TYPES.SHORT);\\nLayout.MAP_DISSOLVE = new Attribute(\"mapDissolve\", 1, TYPES.SHORT);\\nLayout.ANTI_ALIASING = new Attribute(\"antiAliasing\", 1, TYPES.UNSIGNED_SHORT);\\nLayout.MAP_BUMP = new Attribute(\"mapBump\", 1, TYPES.SHORT);\\nLayout.MAP_DISPLACEMENT = new Attribute(\"mapDisplacement\", 1, TYPES.SHORT);\\nLayout.MAP_DECAL = new Attribute(\"mapDecal\", 1, TYPES.SHORT);\\nLayout.MAP_EMISSIVE = new Attribute(\"mapEmissive\", 1, TYPES.SHORT);\\n\\n\\n//# sourceURL=webpack:///./src/layout.ts?')},\"./src/material.ts\":\n/*!*************************!*\\\n !*** ./src/material.ts ***!\n \\*************************/\n/*! exports provided: Material, MaterialLibrary */function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval('__webpack_require__.r(__webpack_exports__);\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Material\", function() { return Material; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MaterialLibrary\", function() { return MaterialLibrary; });\\n/**\\n * The Material class.\\n */\\nclass Material {\\n constructor(name) {\\n this.name = name;\\n /**\\n * Constructor\\n * @param {String} name the unique name of the material\\n */\\n // The values for the following attibutes\\n // are an array of R, G, B normalized values.\\n // Ka - Ambient Reflectivity\\n this.ambient = [0, 0, 0];\\n // Kd - Defuse Reflectivity\\n this.diffuse = [0, 0, 0];\\n // Ks\\n this.specular = [0, 0, 0];\\n // Ke\\n this.emissive = [0, 0, 0];\\n // Tf\\n this.transmissionFilter = [0, 0, 0];\\n // d\\n this.dissolve = 0;\\n // valid range is between 0 and 1000\\n this.specularExponent = 0;\\n // either d or Tr; valid values are normalized\\n this.transparency = 0;\\n // illum - the enum of the illumination model to use\\n this.illumination = 0;\\n // Ni - Set to \"normal\" (air).\\n this.refractionIndex = 1;\\n // sharpness\\n this.sharpness = 0;\\n // map_Kd\\n this.mapDiffuse = emptyTextureOptions();\\n // map_Ka\\n this.mapAmbient = emptyTextureOptions();\\n // map_Ks\\n this.mapSpecular = emptyTextureOptions();\\n // map_Ns\\n this.mapSpecularExponent = emptyTextureOptions();\\n // map_d\\n this.mapDissolve = emptyTextureOptions();\\n // map_aat\\n this.antiAliasing = false;\\n // map_bump or bump\\n this.mapBump = emptyTextureOptions();\\n // disp\\n this.mapDisplacement = emptyTextureOptions();\\n // decal\\n this.mapDecal = emptyTextureOptions();\\n // map_Ke\\n this.mapEmissive = emptyTextureOptions();\\n // refl - when the reflection type is a cube, there will be multiple refl\\n // statements for each side of the cube. If it\\'s a spherical\\n // reflection, there should only ever be one.\\n this.mapReflections = [];\\n }\\n}\\nconst SENTINEL_MATERIAL = new Material(\"sentinel\");\\n/**\\n * https://en.wikipedia.org/wiki/Wavefront_.obj_file\\n * http://paulbourke.net/dataformats/mtl/\\n */\\nclass MaterialLibrary {\\n constructor(data) {\\n this.data = data;\\n /**\\n * Constructs the Material Parser\\n * @param mtlData the MTL file contents\\n */\\n this.currentMaterial = SENTINEL_MATERIAL;\\n this.materials = {};\\n this.parse();\\n }\\n /* eslint-disable camelcase */\\n /* the function names here disobey camelCase conventions\\n to make parsing/routing easier. see the parse function\\n documentation for more information. */\\n /**\\n * Creates a new Material object and adds to the registry.\\n * @param tokens the tokens associated with the directive\\n */\\n parse_newmtl(tokens) {\\n const name = tokens[0];\\n // console.info(\\'Parsing new Material:\\', name);\\n this.currentMaterial = new Material(name);\\n this.materials[name] = this.currentMaterial;\\n }\\n /**\\n * See the documenation for parse_Ka below for a better understanding.\\n *\\n * Given a list of possible color tokens, returns an array of R, G, and B\\n * color values.\\n *\\n * @param tokens the tokens associated with the directive\\n * @return {*} a 3 element array containing the R, G, and B values\\n * of the color.\\n */\\n parseColor(tokens) {\\n if (tokens[0] == \"spectral\") {\\n throw new Error(\"The MTL parser does not support spectral curve files. You will \" +\\n \"need to convert the MTL colors to either RGB or CIEXYZ.\");\\n }\\n if (tokens[0] == \"xyz\") {\\n throw new Error(\"The MTL parser does not currently support XYZ colors. Either convert the \" +\\n \"XYZ values to RGB or create an issue to add support for XYZ\");\\n }\\n // from my understanding of the spec, RGB values at this point\\n // will either be 3 floats or exactly 1 float, so that\\'s the check\\n // that i\\'m going to perform here\\n if (tokens.length == 3) {\\n const [x, y, z] = tokens;\\n return [parseFloat(x), parseFloat(y), parseFloat(z)];\\n }\\n // Since tokens at this point has a length of 3, we\\'re going to assume\\n // it\\'s exactly 1, skipping the check for 2.\\n const value = parseFloat(tokens[0]);\\n // in this case, all values are equivalent\\n return [value, value, value];\\n }\\n /**\\n * Parse the ambient reflectivity\\n *\\n * A Ka directive can take one of three forms:\\n * - Ka r g b\\n * - Ka spectral file.rfl\\n * - Ka xyz x y z\\n * These three forms are mutually exclusive in that only one\\n * declaration can exist per material. It is considered a syntax\\n * error otherwise.\\n *\\n * The \"Ka\" form specifies the ambient reflectivity using RGB values.\\n * The \"g\" and \"b\" values are optional. If only the \"r\" value is\\n * specified, then the \"g\" and \"b\" values are assigned the value of\\n * \"r\". Values are normally in the range 0.0 to 1.0. Values outside\\n * of this range increase or decrease the reflectivity accordingly.\\n *\\n * The \"Ka spectral\" form specifies the ambient reflectivity using a\\n * spectral curve. \"file.rfl\" is the name of the \".rfl\" file containing\\n * the curve data. \"factor\" is an optional argument which is a multiplier\\n * for the values in the .rfl file and defaults to 1.0 if not specified.\\n *\\n * The \"Ka xyz\" form specifies the ambient reflectivity using CIEXYZ values.\\n * \"x y z\" are the values of the CIEXYZ color space. The \"y\" and \"z\" arguments\\n * are optional and take on the value of the \"x\" component if only \"x\" is\\n * specified. The \"x y z\" values are normally in the range of 0.0 to 1.0 and\\n * increase or decrease ambient reflectivity accordingly outside of that\\n * range.\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_Ka(tokens) {\\n this.currentMaterial.ambient = this.parseColor(tokens);\\n }\\n /**\\n * Diffuse Reflectivity\\n *\\n * Similar to the Ka directive. Simply replace \"Ka\" with \"Kd\" and the rules\\n * are the same\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_Kd(tokens) {\\n this.currentMaterial.diffuse = this.parseColor(tokens);\\n }\\n /**\\n * Spectral Reflectivity\\n *\\n * Similar to the Ka directive. Simply replace \"Ks\" with \"Kd\" and the rules\\n * are the same\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_Ks(tokens) {\\n this.currentMaterial.specular = this.parseColor(tokens);\\n }\\n /**\\n * Emissive\\n *\\n * The amount and color of light emitted by the object.\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_Ke(tokens) {\\n this.currentMaterial.emissive = this.parseColor(tokens);\\n }\\n /**\\n * Transmission Filter\\n *\\n * Any light passing through the object is filtered by the transmission\\n * filter, which only allows specific colors to pass through. For example, Tf\\n * 0 1 0 allows all of the green to pass through and filters out all of the\\n * red and blue.\\n *\\n * Similar to the Ka directive. Simply replace \"Ks\" with \"Tf\" and the rules\\n * are the same\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_Tf(tokens) {\\n this.currentMaterial.transmissionFilter = this.parseColor(tokens);\\n }\\n /**\\n * Specifies the dissolve for the current material.\\n *\\n * Statement: d [-halo] `factor`\\n *\\n * Example: \"d 0.5\"\\n *\\n * The factor is the amount this material dissolves into the background. A\\n * factor of 1.0 is fully opaque. This is the default when a new material is\\n * created. A factor of 0.0 is fully dissolved (completely transparent).\\n *\\n * Unlike a real transparent material, the dissolve does not depend upon\\n * material thickness nor does it have any spectral character. Dissolve works\\n * on all illumination models.\\n *\\n * The dissolve statement allows for an optional \"-halo\" flag which indicates\\n * that a dissolve is dependent on the surface orientation relative to the\\n * viewer. For example, a sphere with the following dissolve, \"d -halo 0.0\",\\n * will be fully dissolved at its center and will appear gradually more opaque\\n * toward its edge.\\n *\\n * \"factor\" is the minimum amount of dissolve applied to the material. The\\n * amount of dissolve will vary between 1.0 (fully opaque) and the specified\\n * \"factor\". The formula is:\\n *\\n * dissolve = 1.0 - (N*v)(1.0-factor)\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_d(tokens) {\\n // this ignores the -halo option as I can\\'t find any documentation on what\\n // it\\'s supposed to be.\\n this.currentMaterial.dissolve = parseFloat(tokens.pop() || \"0\");\\n }\\n /**\\n * The \"illum\" statement specifies the illumination model to use in the\\n * material. Illumination models are mathematical equations that represent\\n * various material lighting and shading effects.\\n *\\n * The illumination number can be a number from 0 to 10. The following are\\n * the list of illumination enumerations and their summaries:\\n * 0. Color on and Ambient off\\n * 1. Color on and Ambient on\\n * 2. Highlight on\\n * 3. Reflection on and Ray trace on\\n * 4. Transparency: Glass on, Reflection: Ray trace on\\n * 5. Reflection: Fresnel on and Ray trace on\\n * 6. Transparency: Refraction on, Reflection: Fresnel off and Ray trace on\\n * 7. Transparency: Refraction on, Reflection: Fresnel on and Ray trace on\\n * 8. Reflection on and Ray trace off\\n * 9. Transparency: Glass on, Reflection: Ray trace off\\n * 10. Casts shadows onto invisible surfaces\\n *\\n * Example: \"illum 2\" to specify the \"Highlight on\" model\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_illum(tokens) {\\n this.currentMaterial.illumination = parseInt(tokens[0]);\\n }\\n /**\\n * Optical Density (AKA Index of Refraction)\\n *\\n * Statement: Ni `index`\\n *\\n * Example: Ni 1.0\\n *\\n * Specifies the optical density for the surface. `index` is the value\\n * for the optical density. The values can range from 0.001 to 10. A value of\\n * 1.0 means that light does not bend as it passes through an object.\\n * Increasing the optical_density increases the amount of bending. Glass has\\n * an index of refraction of about 1.5. Values of less than 1.0 produce\\n * bizarre results and are not recommended\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_Ni(tokens) {\\n this.currentMaterial.refractionIndex = parseFloat(tokens[0]);\\n }\\n /**\\n * Specifies the specular exponent for the current material. This defines the\\n * focus of the specular highlight.\\n *\\n * Statement: Ns `exponent`\\n *\\n * Example: \"Ns 250\"\\n *\\n * `exponent` is the value for the specular exponent. A high exponent results\\n * in a tight, concentrated highlight. Ns Values normally range from 0 to\\n * 1000.\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_Ns(tokens) {\\n this.currentMaterial.specularExponent = parseInt(tokens[0]);\\n }\\n /**\\n * Specifies the sharpness of the reflections from the local reflection map.\\n *\\n * Statement: sharpness `value`\\n *\\n * Example: \"sharpness 100\"\\n *\\n * If a material does not have a local reflection map defined in its material\\n * defintions, sharpness will apply to the global reflection map defined in\\n * PreView.\\n *\\n * `value` can be a number from 0 to 1000. The default is 60. A high value\\n * results in a clear reflection of objects in the reflection map.\\n *\\n * Tip: sharpness values greater than 100 introduce aliasing effects in\\n * flat surfaces that are viewed at a sharp angle.\\n *\\n * @param tokens the tokens associated with the directive\\n */\\n parse_sharpness(tokens) {\\n this.currentMaterial.sharpness = parseInt(tokens[0]);\\n }\\n /**\\n * Parses the -cc flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -cc flag\\n * @param options the Object of all image options\\n */\\n parse_cc(values, options) {\\n options.colorCorrection = values[0] == \"on\";\\n }\\n /**\\n * Parses the -blendu flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -blendu flag\\n * @param options the Object of all image options\\n */\\n parse_blendu(values, options) {\\n options.horizontalBlending = values[0] == \"on\";\\n }\\n /**\\n * Parses the -blendv flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -blendv flag\\n * @param options the Object of all image options\\n */\\n parse_blendv(values, options) {\\n options.verticalBlending = values[0] == \"on\";\\n }\\n /**\\n * Parses the -boost flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -boost flag\\n * @param options the Object of all image options\\n */\\n parse_boost(values, options) {\\n options.boostMipMapSharpness = parseFloat(values[0]);\\n }\\n /**\\n * Parses the -mm flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -mm flag\\n * @param options the Object of all image options\\n */\\n parse_mm(values, options) {\\n options.modifyTextureMap.brightness = parseFloat(values[0]);\\n options.modifyTextureMap.contrast = parseFloat(values[1]);\\n }\\n /**\\n * Parses and sets the -o, -s, and -t u, v, and w values\\n *\\n * @param values the values passed to the -o, -s, -t flag\\n * @param {Object} option the Object of either the -o, -s, -t option\\n * @param {Integer} defaultValue the Object of all image options\\n */\\n parse_ost(values, option, defaultValue) {\\n while (values.length < 3) {\\n values.push(defaultValue.toString());\\n }\\n option.u = parseFloat(values[0]);\\n option.v = parseFloat(values[1]);\\n option.w = parseFloat(values[2]);\\n }\\n /**\\n * Parses the -o flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -o flag\\n * @param options the Object of all image options\\n */\\n parse_o(values, options) {\\n this.parse_ost(values, options.offset, 0);\\n }\\n /**\\n * Parses the -s flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -s flag\\n * @param options the Object of all image options\\n */\\n parse_s(values, options) {\\n this.parse_ost(values, options.scale, 1);\\n }\\n /**\\n * Parses the -t flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -t flag\\n * @param options the Object of all image options\\n */\\n parse_t(values, options) {\\n this.parse_ost(values, options.turbulence, 0);\\n }\\n /**\\n * Parses the -texres flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -texres flag\\n * @param options the Object of all image options\\n */\\n parse_texres(values, options) {\\n options.textureResolution = parseFloat(values[0]);\\n }\\n /**\\n * Parses the -clamp flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -clamp flag\\n * @param options the Object of all image options\\n */\\n parse_clamp(values, options) {\\n options.clamp = values[0] == \"on\";\\n }\\n /**\\n * Parses the -bm flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -bm flag\\n * @param options the Object of all image options\\n */\\n parse_bm(values, options) {\\n options.bumpMultiplier = parseFloat(values[0]);\\n }\\n /**\\n * Parses the -imfchan flag and updates the options object with the values.\\n *\\n * @param values the values passed to the -imfchan flag\\n * @param options the Object of all image options\\n */\\n parse_imfchan(values, options) {\\n options.imfChan = values[0];\\n }\\n /**\\n * This only exists for relection maps and denotes the type of reflection.\\n *\\n * @param values the values passed to the -type flag\\n * @param options the Object of all image options\\n */\\n parse_type(values, options) {\\n options.reflectionType = values[0];\\n }\\n /**\\n * Parses the texture\\'s options and returns an options object with the info\\n *\\n * @param tokens all of the option tokens to pass to the texture\\n * @return {Object} a complete object of objects to apply to the texture\\n */\\n parseOptions(tokens) {\\n const options = emptyTextureOptions();\\n let option;\\n let values;\\n const optionsToValues = {};\\n tokens.reverse();\\n while (tokens.length) {\\n // token is guaranteed to exists here, hence the explicit \"as\"\\n const token = tokens.pop();\\n if (token.startsWith(\"-\")) {\\n option = token.substr(1);\\n optionsToValues[option] = [];\\n }\\n else if (option) {\\n optionsToValues[option].push(token);\\n }\\n }\\n for (option in optionsToValues) {\\n if (!optionsToValues.hasOwnProperty(option)) {\\n continue;\\n }\\n values = optionsToValues[option];\\n const optionMethod = this[`parse_${option}`];\\n if (optionMethod) {\\n optionMethod.bind(this)(values, options);\\n }\\n }\\n return options;\\n }\\n /**\\n * Parses the given texture map line.\\n *\\n * @param tokens all of the tokens representing the texture\\n * @return a complete object of objects to apply to the texture\\n */\\n parseMap(tokens) {\\n // according to wikipedia:\\n // (https://en.wikipedia.org/wiki/Wavefront_.obj_file#Vendor_specific_alterations)\\n // there is at least one vendor that places the filename before the options\\n // rather than after (which is to spec). All options start with a \\'-\\'\\n // so if the first token doesn\\'t start with a \\'-\\', we\\'re going to assume\\n // it\\'s the name of the map file.\\n let optionsString;\\n let filename = \"\";\\n if (!tokens[0].startsWith(\"-\")) {\\n [filename, ...optionsString] = tokens;\\n }\\n else {\\n filename = tokens.pop();\\n optionsString = tokens;\\n }\\n const options = this.parseOptions(optionsString);\\n options.filename = filename.replace(/\\\\\\\\/g, \"/\");\\n return options;\\n }\\n /**\\n * Parses the ambient map.\\n *\\n * @param tokens list of tokens for the map_Ka direcive\\n */\\n parse_map_Ka(tokens) {\\n this.currentMaterial.mapAmbient = this.parseMap(tokens);\\n }\\n /**\\n * Parses the diffuse map.\\n *\\n * @param tokens list of tokens for the map_Kd direcive\\n */\\n parse_map_Kd(tokens) {\\n this.currentMaterial.mapDiffuse = this.parseMap(tokens);\\n }\\n /**\\n * Parses the specular map.\\n *\\n * @param tokens list of tokens for the map_Ks direcive\\n */\\n parse_map_Ks(tokens) {\\n this.currentMaterial.mapSpecular = this.parseMap(tokens);\\n }\\n /**\\n * Parses the emissive map.\\n *\\n * @param tokens list of tokens for the map_Ke direcive\\n */\\n parse_map_Ke(tokens) {\\n this.currentMaterial.mapEmissive = this.parseMap(tokens);\\n }\\n /**\\n * Parses the specular exponent map.\\n *\\n * @param tokens list of tokens for the map_Ns direcive\\n */\\n parse_map_Ns(tokens) {\\n this.currentMaterial.mapSpecularExponent = this.parseMap(tokens);\\n }\\n /**\\n * Parses the dissolve map.\\n *\\n * @param tokens list of tokens for the map_d direcive\\n */\\n parse_map_d(tokens) {\\n this.currentMaterial.mapDissolve = this.parseMap(tokens);\\n }\\n /**\\n * Parses the anti-aliasing option.\\n *\\n * @param tokens list of tokens for the map_aat direcive\\n */\\n parse_map_aat(tokens) {\\n this.currentMaterial.antiAliasing = tokens[0] == \"on\";\\n }\\n /**\\n * Parses the bump map.\\n *\\n * @param tokens list of tokens for the map_bump direcive\\n */\\n parse_map_bump(tokens) {\\n this.currentMaterial.mapBump = this.parseMap(tokens);\\n }\\n /**\\n * Parses the bump map.\\n *\\n * @param tokens list of tokens for the bump direcive\\n */\\n parse_bump(tokens) {\\n this.parse_map_bump(tokens);\\n }\\n /**\\n * Parses the disp map.\\n *\\n * @param tokens list of tokens for the disp direcive\\n */\\n parse_disp(tokens) {\\n this.currentMaterial.mapDisplacement = this.parseMap(tokens);\\n }\\n /**\\n * Parses the decal map.\\n *\\n * @param tokens list of tokens for the map_decal direcive\\n */\\n parse_decal(tokens) {\\n this.currentMaterial.mapDecal = this.parseMap(tokens);\\n }\\n /**\\n * Parses the refl map.\\n *\\n * @param tokens list of tokens for the refl direcive\\n */\\n parse_refl(tokens) {\\n this.currentMaterial.mapReflections.push(this.parseMap(tokens));\\n }\\n /**\\n * Parses the MTL file.\\n *\\n * Iterates line by line parsing each MTL directive.\\n *\\n * This function expects the first token in the line\\n * to be a valid MTL directive. That token is then used\\n * to try and run a method on this class. parse_[directive]\\n * E.g., the `newmtl` directive would try to call the method\\n * parse_newmtl. Each parsing function takes in the remaining\\n * list of tokens and updates the currentMaterial class with\\n * the attributes provided.\\n */\\n parse() {\\n const lines = this.data.split(/\\\\r?\\\\n/);\\n for (let line of lines) {\\n line = line.trim();\\n if (!line || line.startsWith(\"#\")) {\\n continue;\\n }\\n const [directive, ...tokens] = line.split(/\\\\s/);\\n const parseMethod = this[`parse_${directive}`];\\n if (!parseMethod) {\\n console.warn(`Don\\'t know how to parse the directive: \"${directive}\"`);\\n continue;\\n }\\n // console.log(`Parsing \"${directive}\" with tokens: ${tokens}`);\\n parseMethod.bind(this)(tokens);\\n }\\n // some cleanup. These don\\'t need to be exposed as public data.\\n delete this.data;\\n this.currentMaterial = SENTINEL_MATERIAL;\\n }\\n}\\nfunction emptyTextureOptions() {\\n return {\\n colorCorrection: false,\\n horizontalBlending: true,\\n verticalBlending: true,\\n boostMipMapSharpness: 0,\\n modifyTextureMap: {\\n brightness: 0,\\n contrast: 1,\\n },\\n offset: { u: 0, v: 0, w: 0 },\\n scale: { u: 1, v: 1, w: 1 },\\n turbulence: { u: 0, v: 0, w: 0 },\\n clamp: false,\\n textureResolution: null,\\n bumpMultiplier: 1,\\n imfChan: null,\\n filename: \"\",\\n };\\n}\\n\\n\\n//# sourceURL=webpack:///./src/material.ts?')},\"./src/mesh.ts\":\n/*!*********************!*\\\n !*** ./src/mesh.ts ***!\n \\*********************/\n/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval('__webpack_require__.r(__webpack_exports__);\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Mesh; });\\n/* harmony import */ var _layout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./layout */ \"./src/layout.ts\");\\n\\n/**\\n * The main Mesh class. The constructor will parse through the OBJ file data\\n * and collect the vertex, vertex normal, texture, and face information. This\\n * information can then be used later on when creating your VBOs. See\\n * OBJ.initMeshBuffers for an example of how to use the newly created Mesh\\n */\\nclass Mesh {\\n /**\\n * Create a Mesh\\n * @param {String} objectData - a string representation of an OBJ file with\\n * newlines preserved.\\n * @param {Object} options - a JS object containing valid options. See class\\n * documentation for options.\\n * @param {bool} options.enableWTextureCoord - Texture coordinates can have\\n * an optional \"w\" coordinate after the u and v coordinates. This extra\\n * value can be used in order to perform fancy transformations on the\\n * textures themselves. Default is to truncate to only the u an v\\n * coordinates. Passing true will provide a default value of 0 in the\\n * event that any or all texture coordinates don\\'t provide a w value.\\n * Always use the textureStride attribute in order to determine the\\n * stride length of the texture coordinates when rendering the element\\n * array.\\n * @param {bool} options.calcTangentsAndBitangents - Calculate the tangents\\n * and bitangents when loading of the OBJ is completed. This adds two new\\n * attributes to the Mesh instance: `tangents` and `bitangents`.\\n */\\n constructor(objectData, options) {\\n this.name = \"\";\\n this.indicesPerMaterial = [];\\n this.materialsByIndex = {};\\n this.tangents = [];\\n this.bitangents = [];\\n options = options || {};\\n options.materials = options.materials || {};\\n options.enableWTextureCoord = !!options.enableWTextureCoord;\\n // the list of unique vertex, normal, texture, attributes\\n this.vertexNormals = [];\\n this.textures = [];\\n // the indicies to draw the faces\\n this.indices = [];\\n this.textureStride = options.enableWTextureCoord ? 3 : 2;\\n /*\\n The OBJ file format does a sort of compression when saving a model in a\\n program like Blender. There are at least 3 sections (4 including textures)\\n within the file. Each line in a section begins with the same string:\\n * \\'v\\': indicates vertex section\\n * \\'vn\\': indicates vertex normal section\\n * \\'f\\': indicates the faces section\\n * \\'vt\\': indicates vertex texture section (if textures were used on the model)\\n Each of the above sections (except for the faces section) is a list/set of\\n unique vertices.\\n\\n Each line of the faces section contains a list of\\n (vertex, [texture], normal) groups.\\n\\n **Note:** The following documentation will use a capital \"V\" Vertex to\\n denote the above (vertex, [texture], normal) groups whereas a lowercase\\n \"v\" vertex is used to denote an X, Y, Z coordinate.\\n\\n Some examples:\\n // the texture index is optional, both formats are possible for models\\n // without a texture applied\\n f 1/25 18/46 12/31\\n f 1//25 18//46 12//31\\n\\n // A 3 vertex face with texture indices\\n f 16/92/11 14/101/22 1/69/1\\n\\n // A 4 vertex face\\n f 16/92/11 40/109/40 38/114/38 14/101/22\\n\\n The first two lines are examples of a 3 vertex face without a texture applied.\\n The second is an example of a 3 vertex face with a texture applied.\\n The third is an example of a 4 vertex face. Note: a face can contain N\\n number of vertices.\\n\\n Each number that appears in one of the groups is a 1-based index\\n corresponding to an item from the other sections (meaning that indexing\\n starts at one and *not* zero).\\n\\n For example:\\n `f 16/92/11` is saying to\\n - take the 16th element from the [v] vertex array\\n - take the 92nd element from the [vt] texture array\\n - take the 11th element from the [vn] normal array\\n and together they make a unique vertex.\\n Using all 3+ unique Vertices from the face line will produce a polygon.\\n\\n Now, you could just go through the OBJ file and create a new vertex for\\n each face line and WebGL will draw what appears to be the same model.\\n However, vertices will be overlapped and duplicated all over the place.\\n\\n Consider a cube in 3D space centered about the origin and each side is\\n 2 units long. The front face (with the positive Z-axis pointing towards\\n you) would have a Top Right vertex (looking orthogonal to its normal)\\n mapped at (1,1,1) The right face would have a Top Left vertex (looking\\n orthogonal to its normal) at (1,1,1) and the top face would have a Bottom\\n Right vertex (looking orthogonal to its normal) at (1,1,1). Each face\\n has a vertex at the same coordinates, however, three distinct vertices\\n will be drawn at the same spot.\\n\\n To solve the issue of duplicate Vertices (the `(vertex, [texture], normal)`\\n groups), while iterating through the face lines, when a group is encountered\\n the whole group string (\\'16/92/11\\') is checked to see if it exists in the\\n packed.hashindices object, and if it doesn\\'t, the indices it specifies\\n are used to look up each attribute in the corresponding attribute arrays\\n already created. The values are then copied to the corresponding unpacked\\n array (flattened to play nice with WebGL\\'s ELEMENT_ARRAY_BUFFER indexing),\\n the group string is added to the hashindices set and the current unpacked\\n index is used as this hashindices value so that the group of elements can\\n be reused. The unpacked index is incremented. If the group string already\\n exists in the hashindices object, its corresponding value is the index of\\n that group and is appended to the unpacked indices array.\\n */\\n const verts = [];\\n const vertNormals = [];\\n const textures = [];\\n const materialNamesByIndex = [];\\n const materialIndicesByName = {};\\n // keep track of what material we\\'ve seen last\\n let currentMaterialIndex = -1;\\n let currentObjectByMaterialIndex = 0;\\n // unpacking stuff\\n const unpacked = {\\n verts: [],\\n norms: [],\\n textures: [],\\n hashindices: {},\\n indices: [[]],\\n materialIndices: [],\\n index: 0,\\n };\\n const VERTEX_RE = /^v\\\\s/;\\n const NORMAL_RE = /^vn\\\\s/;\\n const TEXTURE_RE = /^vt\\\\s/;\\n const FACE_RE = /^f\\\\s/;\\n const WHITESPACE_RE = /\\\\s+/;\\n const USE_MATERIAL_RE = /^usemtl/;\\n // array of lines separated by the newline\\n const lines = objectData.split(\"\\\\n\");\\n for (let line of lines) {\\n line = line.trim();\\n if (!line || line.startsWith(\"#\")) {\\n continue;\\n }\\n const elements = line.split(WHITESPACE_RE);\\n elements.shift();\\n if (VERTEX_RE.test(line)) {\\n // if this is a vertex\\n verts.push(...elements);\\n }\\n else if (NORMAL_RE.test(line)) {\\n // if this is a vertex normal\\n vertNormals.push(...elements);\\n }\\n else if (TEXTURE_RE.test(line)) {\\n let coords = elements;\\n // by default, the loader will only look at the U and V\\n // coordinates of the vt declaration. So, this truncates the\\n // elements to only those 2 values. If W texture coordinate\\n // support is enabled, then the texture coordinate is\\n // expected to have three values in it.\\n if (elements.length > 2 && !options.enableWTextureCoord) {\\n coords = elements.slice(0, 2);\\n }\\n else if (elements.length === 2 && options.enableWTextureCoord) {\\n // If for some reason W texture coordinate support is enabled\\n // and only the U and V coordinates are given, then we supply\\n // the default value of 0 so that the stride length is correct\\n // when the textures are unpacked below.\\n coords.push(\"0\");\\n }\\n textures.push(...coords);\\n }\\n else if (USE_MATERIAL_RE.test(line)) {\\n const materialName = elements[0];\\n // check to see if we\\'ve ever seen it before\\n if (!(materialName in materialIndicesByName)) {\\n // new material we\\'ve never seen\\n materialNamesByIndex.push(materialName);\\n materialIndicesByName[materialName] = materialNamesByIndex.length - 1;\\n // push new array into indices\\n // already contains an array at index zero, don\\'t add\\n if (materialIndicesByName[materialName] > 0) {\\n unpacked.indices.push([]);\\n }\\n }\\n // keep track of the current material index\\n currentMaterialIndex = materialIndicesByName[materialName];\\n // update current index array\\n currentObjectByMaterialIndex = currentMaterialIndex;\\n }\\n else if (FACE_RE.test(line)) {\\n // if this is a face\\n /*\\n split this face into an array of Vertex groups\\n for example:\\n f 16/92/11 14/101/22 1/69/1\\n becomes:\\n [\\'16/92/11\\', \\'14/101/22\\', \\'1/69/1\\'];\\n */\\n const triangles = triangulate(elements);\\n for (const triangle of triangles) {\\n for (let j = 0, eleLen = triangle.length; j < eleLen; j++) {\\n const hash = triangle[j] + \",\" + currentMaterialIndex;\\n if (hash in unpacked.hashindices) {\\n unpacked.indices[currentObjectByMaterialIndex].push(unpacked.hashindices[hash]);\\n }\\n else {\\n /*\\n Each element of the face line array is a Vertex which has its\\n attributes delimited by a forward slash. This will separate\\n each attribute into another array:\\n \\'19/92/11\\'\\n becomes:\\n Vertex = [\\'19\\', \\'92\\', \\'11\\'];\\n where\\n Vertex[0] is the vertex index\\n Vertex[1] is the texture index\\n Vertex[2] is the normal index\\n Think of faces having Vertices which are comprised of the\\n attributes location (v), texture (vt), and normal (vn).\\n */\\n const vertex = triangle[j].split(\"/\");\\n // it\\'s possible for faces to only specify the vertex\\n // and the normal. In this case, vertex will only have\\n // a length of 2 and not 3 and the normal will be the\\n // second item in the list with an index of 1.\\n const normalIndex = vertex.length - 1;\\n /*\\n The verts, textures, and vertNormals arrays each contain a\\n flattend array of coordinates.\\n\\n Because it gets confusing by referring to Vertex and then\\n vertex (both are different in my descriptions) I will explain\\n what\\'s going on using the vertexNormals array:\\n\\n vertex[2] will contain the one-based index of the vertexNormals\\n section (vn). One is subtracted from this index number to play\\n nice with javascript\\'s zero-based array indexing.\\n\\n Because vertexNormal is a flattened array of x, y, z values,\\n simple pointer arithmetic is used to skip to the start of the\\n vertexNormal, then the offset is added to get the correct\\n component: +0 is x, +1 is y, +2 is z.\\n\\n This same process is repeated for verts and textures.\\n */\\n // Vertex position\\n unpacked.verts.push(+verts[(+vertex[0] - 1) * 3 + 0]);\\n unpacked.verts.push(+verts[(+vertex[0] - 1) * 3 + 1]);\\n unpacked.verts.push(+verts[(+vertex[0] - 1) * 3 + 2]);\\n // Vertex textures\\n if (textures.length) {\\n const stride = options.enableWTextureCoord ? 3 : 2;\\n unpacked.textures.push(+textures[(+vertex[1] - 1) * stride + 0]);\\n unpacked.textures.push(+textures[(+vertex[1] - 1) * stride + 1]);\\n if (options.enableWTextureCoord) {\\n unpacked.textures.push(+textures[(+vertex[1] - 1) * stride + 2]);\\n }\\n }\\n // Vertex normals\\n unpacked.norms.push(+vertNormals[(+vertex[normalIndex] - 1) * 3 + 0]);\\n unpacked.norms.push(+vertNormals[(+vertex[normalIndex] - 1) * 3 + 1]);\\n unpacked.norms.push(+vertNormals[(+vertex[normalIndex] - 1) * 3 + 2]);\\n // Vertex material indices\\n unpacked.materialIndices.push(currentMaterialIndex);\\n // add the newly created Vertex to the list of indices\\n unpacked.hashindices[hash] = unpacked.index;\\n unpacked.indices[currentObjectByMaterialIndex].push(unpacked.hashindices[hash]);\\n // increment the counter\\n unpacked.index += 1;\\n }\\n }\\n }\\n }\\n }\\n this.vertices = unpacked.verts;\\n this.vertexNormals = unpacked.norms;\\n this.textures = unpacked.textures;\\n this.vertexMaterialIndices = unpacked.materialIndices;\\n this.indices = unpacked.indices[currentObjectByMaterialIndex];\\n this.indicesPerMaterial = unpacked.indices;\\n this.materialNames = materialNamesByIndex;\\n this.materialIndices = materialIndicesByName;\\n this.materialsByIndex = {};\\n if (options.calcTangentsAndBitangents) {\\n this.calculateTangentsAndBitangents();\\n }\\n }\\n /**\\n * Calculates the tangents and bitangents of the mesh that forms an orthogonal basis together with the\\n * normal in the direction of the texture coordinates. These are useful for setting up the TBN matrix\\n * when distorting the normals through normal maps.\\n * Method derived from: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/\\n *\\n * This method requires the normals and texture coordinates to be parsed and set up correctly.\\n * Adds the tangents and bitangents as members of the class instance.\\n */\\n calculateTangentsAndBitangents() {\\n console.assert(!!(this.vertices &&\\n this.vertices.length &&\\n this.vertexNormals &&\\n this.vertexNormals.length &&\\n this.textures &&\\n this.textures.length), \"Missing attributes for calculating tangents and bitangents\");\\n const unpacked = {\\n tangents: [...new Array(this.vertices.length)].map(_ => 0),\\n bitangents: [...new Array(this.vertices.length)].map(_ => 0),\\n };\\n // Loop through all faces in the whole mesh\\n const indices = this.indices;\\n const vertices = this.vertices;\\n const normals = this.vertexNormals;\\n const uvs = this.textures;\\n for (let i = 0; i < indices.length; i += 3) {\\n const i0 = indices[i + 0];\\n const i1 = indices[i + 1];\\n const i2 = indices[i + 2];\\n const x_v0 = vertices[i0 * 3 + 0];\\n const y_v0 = vertices[i0 * 3 + 1];\\n const z_v0 = vertices[i0 * 3 + 2];\\n const x_uv0 = uvs[i0 * 2 + 0];\\n const y_uv0 = uvs[i0 * 2 + 1];\\n const x_v1 = vertices[i1 * 3 + 0];\\n const y_v1 = vertices[i1 * 3 + 1];\\n const z_v1 = vertices[i1 * 3 + 2];\\n const x_uv1 = uvs[i1 * 2 + 0];\\n const y_uv1 = uvs[i1 * 2 + 1];\\n const x_v2 = vertices[i2 * 3 + 0];\\n const y_v2 = vertices[i2 * 3 + 1];\\n const z_v2 = vertices[i2 * 3 + 2];\\n const x_uv2 = uvs[i2 * 2 + 0];\\n const y_uv2 = uvs[i2 * 2 + 1];\\n const x_deltaPos1 = x_v1 - x_v0;\\n const y_deltaPos1 = y_v1 - y_v0;\\n const z_deltaPos1 = z_v1 - z_v0;\\n const x_deltaPos2 = x_v2 - x_v0;\\n const y_deltaPos2 = y_v2 - y_v0;\\n const z_deltaPos2 = z_v2 - z_v0;\\n const x_uvDeltaPos1 = x_uv1 - x_uv0;\\n const y_uvDeltaPos1 = y_uv1 - y_uv0;\\n const x_uvDeltaPos2 = x_uv2 - x_uv0;\\n const y_uvDeltaPos2 = y_uv2 - y_uv0;\\n const rInv = x_uvDeltaPos1 * y_uvDeltaPos2 - y_uvDeltaPos1 * x_uvDeltaPos2;\\n const r = 1.0 / Math.abs(rInv < 0.0001 ? 1.0 : rInv);\\n // Tangent\\n const x_tangent = (x_deltaPos1 * y_uvDeltaPos2 - x_deltaPos2 * y_uvDeltaPos1) * r;\\n const y_tangent = (y_deltaPos1 * y_uvDeltaPos2 - y_deltaPos2 * y_uvDeltaPos1) * r;\\n const z_tangent = (z_deltaPos1 * y_uvDeltaPos2 - z_deltaPos2 * y_uvDeltaPos1) * r;\\n // Bitangent\\n const x_bitangent = (x_deltaPos2 * x_uvDeltaPos1 - x_deltaPos1 * x_uvDeltaPos2) * r;\\n const y_bitangent = (y_deltaPos2 * x_uvDeltaPos1 - y_deltaPos1 * x_uvDeltaPos2) * r;\\n const z_bitangent = (z_deltaPos2 * x_uvDeltaPos1 - z_deltaPos1 * x_uvDeltaPos2) * r;\\n // Gram-Schmidt orthogonalize\\n //t = glm::normalize(t - n * glm:: dot(n, t));\\n const x_n0 = normals[i0 * 3 + 0];\\n const y_n0 = normals[i0 * 3 + 1];\\n const z_n0 = normals[i0 * 3 + 2];\\n const x_n1 = normals[i1 * 3 + 0];\\n const y_n1 = normals[i1 * 3 + 1];\\n const z_n1 = normals[i1 * 3 + 2];\\n const x_n2 = normals[i2 * 3 + 0];\\n const y_n2 = normals[i2 * 3 + 1];\\n const z_n2 = normals[i2 * 3 + 2];\\n // Tangent\\n const n0_dot_t = x_tangent * x_n0 + y_tangent * y_n0 + z_tangent * z_n0;\\n const n1_dot_t = x_tangent * x_n1 + y_tangent * y_n1 + z_tangent * z_n1;\\n const n2_dot_t = x_tangent * x_n2 + y_tangent * y_n2 + z_tangent * z_n2;\\n const x_resTangent0 = x_tangent - x_n0 * n0_dot_t;\\n const y_resTangent0 = y_tangent - y_n0 * n0_dot_t;\\n const z_resTangent0 = z_tangent - z_n0 * n0_dot_t;\\n const x_resTangent1 = x_tangent - x_n1 * n1_dot_t;\\n const y_resTangent1 = y_tangent - y_n1 * n1_dot_t;\\n const z_resTangent1 = z_tangent - z_n1 * n1_dot_t;\\n const x_resTangent2 = x_tangent - x_n2 * n2_dot_t;\\n const y_resTangent2 = y_tangent - y_n2 * n2_dot_t;\\n const z_resTangent2 = z_tangent - z_n2 * n2_dot_t;\\n const magTangent0 = Math.sqrt(x_resTangent0 * x_resTangent0 + y_resTangent0 * y_resTangent0 + z_resTangent0 * z_resTangent0);\\n const magTangent1 = Math.sqrt(x_resTangent1 * x_resTangent1 + y_resTangent1 * y_resTangent1 + z_resTangent1 * z_resTangent1);\\n const magTangent2 = Math.sqrt(x_resTangent2 * x_resTangent2 + y_resTangent2 * y_resTangent2 + z_resTangent2 * z_resTangent2);\\n // Bitangent\\n const n0_dot_bt = x_bitangent * x_n0 + y_bitangent * y_n0 + z_bitangent * z_n0;\\n const n1_dot_bt = x_bitangent * x_n1 + y_bitangent * y_n1 + z_bitangent * z_n1;\\n const n2_dot_bt = x_bitangent * x_n2 + y_bitangent * y_n2 + z_bitangent * z_n2;\\n const x_resBitangent0 = x_bitangent - x_n0 * n0_dot_bt;\\n const y_resBitangent0 = y_bitangent - y_n0 * n0_dot_bt;\\n const z_resBitangent0 = z_bitangent - z_n0 * n0_dot_bt;\\n const x_resBitangent1 = x_bitangent - x_n1 * n1_dot_bt;\\n const y_resBitangent1 = y_bitangent - y_n1 * n1_dot_bt;\\n const z_resBitangent1 = z_bitangent - z_n1 * n1_dot_bt;\\n const x_resBitangent2 = x_bitangent - x_n2 * n2_dot_bt;\\n const y_resBitangent2 = y_bitangent - y_n2 * n2_dot_bt;\\n const z_resBitangent2 = z_bitangent - z_n2 * n2_dot_bt;\\n const magBitangent0 = Math.sqrt(x_resBitangent0 * x_resBitangent0 +\\n y_resBitangent0 * y_resBitangent0 +\\n z_resBitangent0 * z_resBitangent0);\\n const magBitangent1 = Math.sqrt(x_resBitangent1 * x_resBitangent1 +\\n y_resBitangent1 * y_resBitangent1 +\\n z_resBitangent1 * z_resBitangent1);\\n const magBitangent2 = Math.sqrt(x_resBitangent2 * x_resBitangent2 +\\n y_resBitangent2 * y_resBitangent2 +\\n z_resBitangent2 * z_resBitangent2);\\n unpacked.tangents[i0 * 3 + 0] += x_resTangent0 / magTangent0;\\n unpacked.tangents[i0 * 3 + 1] += y_resTangent0 / magTangent0;\\n unpacked.tangents[i0 * 3 + 2] += z_resTangent0 / magTangent0;\\n unpacked.tangents[i1 * 3 + 0] += x_resTangent1 / magTangent1;\\n unpacked.tangents[i1 * 3 + 1] += y_resTangent1 / magTangent1;\\n unpacked.tangents[i1 * 3 + 2] += z_resTangent1 / magTangent1;\\n unpacked.tangents[i2 * 3 + 0] += x_resTangent2 / magTangent2;\\n unpacked.tangents[i2 * 3 + 1] += y_resTangent2 / magTangent2;\\n unpacked.tangents[i2 * 3 + 2] += z_resTangent2 / magTangent2;\\n unpacked.bitangents[i0 * 3 + 0] += x_resBitangent0 / magBitangent0;\\n unpacked.bitangents[i0 * 3 + 1] += y_resBitangent0 / magBitangent0;\\n unpacked.bitangents[i0 * 3 + 2] += z_resBitangent0 / magBitangent0;\\n unpacked.bitangents[i1 * 3 + 0] += x_resBitangent1 / magBitangent1;\\n unpacked.bitangents[i1 * 3 + 1] += y_resBitangent1 / magBitangent1;\\n unpacked.bitangents[i1 * 3 + 2] += z_resBitangent1 / magBitangent1;\\n unpacked.bitangents[i2 * 3 + 0] += x_resBitangent2 / magBitangent2;\\n unpacked.bitangents[i2 * 3 + 1] += y_resBitangent2 / magBitangent2;\\n unpacked.bitangents[i2 * 3 + 2] += z_resBitangent2 / magBitangent2;\\n // TODO: check handedness\\n }\\n this.tangents = unpacked.tangents;\\n this.bitangents = unpacked.bitangents;\\n }\\n /**\\n * @param layout - A {@link Layout} object that describes the\\n * desired memory layout of the generated buffer\\n * @return The packed array in the ... TODO\\n */\\n makeBufferData(layout) {\\n const numItems = this.vertices.length / 3;\\n const buffer = new ArrayBuffer(layout.stride * numItems);\\n buffer.numItems = numItems;\\n const dataView = new DataView(buffer);\\n for (let i = 0, vertexOffset = 0; i < numItems; i++) {\\n vertexOffset = i * layout.stride;\\n // copy in the vertex data in the order and format given by the\\n // layout param\\n for (const attribute of layout.attributes) {\\n const offset = vertexOffset + layout.attributeMap[attribute.key].offset;\\n switch (attribute.key) {\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].POSITION.key:\\n dataView.setFloat32(offset, this.vertices[i * 3], true);\\n dataView.setFloat32(offset + 4, this.vertices[i * 3 + 1], true);\\n dataView.setFloat32(offset + 8, this.vertices[i * 3 + 2], true);\\n break;\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].UV.key:\\n dataView.setFloat32(offset, this.textures[i * 2], true);\\n dataView.setFloat32(offset + 4, this.textures[i * 2 + 1], true);\\n break;\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].NORMAL.key:\\n dataView.setFloat32(offset, this.vertexNormals[i * 3], true);\\n dataView.setFloat32(offset + 4, this.vertexNormals[i * 3 + 1], true);\\n dataView.setFloat32(offset + 8, this.vertexNormals[i * 3 + 2], true);\\n break;\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].MATERIAL_INDEX.key:\\n dataView.setInt16(offset, this.vertexMaterialIndices[i], true);\\n break;\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].AMBIENT.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.ambient[0], true);\\n dataView.setFloat32(offset + 4, material.ambient[1], true);\\n dataView.setFloat32(offset + 8, material.ambient[2], true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].DIFFUSE.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.diffuse[0], true);\\n dataView.setFloat32(offset + 4, material.diffuse[1], true);\\n dataView.setFloat32(offset + 8, material.diffuse[2], true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].SPECULAR.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.specular[0], true);\\n dataView.setFloat32(offset + 4, material.specular[1], true);\\n dataView.setFloat32(offset + 8, material.specular[2], true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].SPECULAR_EXPONENT.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.specularExponent, true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].EMISSIVE.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.emissive[0], true);\\n dataView.setFloat32(offset + 4, material.emissive[1], true);\\n dataView.setFloat32(offset + 8, material.emissive[2], true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].TRANSMISSION_FILTER.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.transmissionFilter[0], true);\\n dataView.setFloat32(offset + 4, material.transmissionFilter[1], true);\\n dataView.setFloat32(offset + 8, material.transmissionFilter[2], true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].DISSOLVE.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.dissolve, true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].ILLUMINATION.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setInt16(offset, material.illumination, true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].REFRACTION_INDEX.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.refractionIndex, true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].SHARPNESS.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setFloat32(offset, material.sharpness, true);\\n break;\\n }\\n case _layout__WEBPACK_IMPORTED_MODULE_0__[\"Layout\"].ANTI_ALIASING.key: {\\n const materialIndex = this.vertexMaterialIndices[i];\\n const material = this.materialsByIndex[materialIndex];\\n if (!material) {\\n console.warn(\\'Material \"\\' +\\n this.materialNames[materialIndex] +\\n \\'\" not found in mesh. Did you forget to call addMaterialLibrary(...)?\"\\');\\n break;\\n }\\n dataView.setInt16(offset, material.antiAliasing ? 1 : 0, true);\\n break;\\n }\\n }\\n }\\n }\\n return buffer;\\n }\\n makeIndexBufferData() {\\n const buffer = new Uint16Array(this.indices);\\n buffer.numItems = this.indices.length;\\n return buffer;\\n }\\n makeIndexBufferDataForMaterials(...materialIndices) {\\n const indices = new Array().concat(...materialIndices.map(mtlIdx => this.indicesPerMaterial[mtlIdx]));\\n const buffer = new Uint16Array(indices);\\n buffer.numItems = indices.length;\\n return buffer;\\n }\\n addMaterialLibrary(mtl) {\\n for (const name in mtl.materials) {\\n if (!(name in this.materialIndices)) {\\n // This material is not referenced by the mesh\\n continue;\\n }\\n const material = mtl.materials[name];\\n // Find the material index for this material\\n const materialIndex = this.materialIndices[material.name];\\n // Put the material into the materialsByIndex object at the right\\n // spot as determined when the obj file was parsed\\n this.materialsByIndex[materialIndex] = material;\\n }\\n }\\n}\\nfunction* triangulate(elements) {\\n if (elements.length <= 3) {\\n yield elements;\\n }\\n else if (elements.length === 4) {\\n yield [elements[0], elements[1], elements[2]];\\n yield [elements[2], elements[3], elements[0]];\\n }\\n else {\\n for (let i = 1; i < elements.length - 1; i++) {\\n yield [elements[0], elements[i], elements[i + 1]];\\n }\\n }\\n}\\n\\n\\n//# sourceURL=webpack:///./src/mesh.ts?')},\"./src/utils.ts\":\n/*!**********************!*\\\n !*** ./src/utils.ts ***!\n \\**********************/\n/*! exports provided: downloadModels, downloadMeshes, initMeshBuffers, deleteMeshBuffers */function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval('__webpack_require__.r(__webpack_exports__);\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"downloadModels\", function() { return downloadModels; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"downloadMeshes\", function() { return downloadMeshes; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"initMeshBuffers\", function() { return initMeshBuffers; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deleteMeshBuffers\", function() { return deleteMeshBuffers; });\\n/* harmony import */ var _mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mesh */ \"./src/mesh.ts\");\\n/* harmony import */ var _material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./material */ \"./src/material.ts\");\\n\\n\\nfunction downloadMtlTextures(mtl, root) {\\n const mapAttributes = [\\n \"mapDiffuse\",\\n \"mapAmbient\",\\n \"mapSpecular\",\\n \"mapDissolve\",\\n \"mapBump\",\\n \"mapDisplacement\",\\n \"mapDecal\",\\n \"mapEmissive\",\\n ];\\n if (!root.endsWith(\"/\")) {\\n root += \"/\";\\n }\\n const textures = [];\\n for (const materialName in mtl.materials) {\\n if (!mtl.materials.hasOwnProperty(materialName)) {\\n continue;\\n }\\n const material = mtl.materials[materialName];\\n for (const attr of mapAttributes) {\\n const mapData = material[attr];\\n if (!mapData || !mapData.filename) {\\n continue;\\n }\\n const url = root + mapData.filename;\\n textures.push(fetch(url)\\n .then(response => {\\n if (!response.ok) {\\n throw new Error();\\n }\\n return response.blob();\\n })\\n .then(function (data) {\\n const image = new Image();\\n image.src = URL.createObjectURL(data);\\n mapData.texture = image;\\n return new Promise(resolve => (image.onload = resolve));\\n })\\n .catch(() => {\\n console.error(`Unable to download texture: ${url}`);\\n }));\\n }\\n }\\n return Promise.all(textures);\\n}\\nfunction getMtl(modelOptions) {\\n if (!(typeof modelOptions.mtl === \"string\")) {\\n return modelOptions.obj.replace(/\\\\.obj$/, \".mtl\");\\n }\\n return modelOptions.mtl;\\n}\\n/**\\n * Accepts a list of model request objects and returns a Promise that\\n * resolves when all models have been downloaded and parsed.\\n *\\n * The list of model objects follow this interface:\\n * {\\n * obj: \\'path/to/model.obj\\',\\n * mtl: true | \\'path/to/model.mtl\\',\\n * downloadMtlTextures: true | false\\n * mtlTextureRoot: \\'/models/suzanne/maps\\'\\n * name: \\'suzanne\\'\\n * }\\n *\\n * The `obj` attribute is required and should be the path to the\\n * model\\'s .obj file relative to the current repo (absolute URLs are\\n * suggested).\\n *\\n * The `mtl` attribute is optional and can either be a boolean or\\n * a path to the model\\'s .mtl file relative to the current URL. If\\n * the value is `true`, then the path and basename given for the `obj`\\n * attribute is used replacing the .obj suffix for .mtl\\n * E.g.: {obj: \\'models/foo.obj\\', mtl: true} would search for \\'models/foo.mtl\\'\\n *\\n * The `name` attribute is optional and is a human friendly name to be\\n * included with the parsed OBJ and MTL files. If not given, the base .obj\\n * filename will be used.\\n *\\n * The `downloadMtlTextures` attribute is a flag for automatically downloading\\n * any images found in the MTL file and attaching them to each Material\\n * created from that file. For example, if material.mapDiffuse is set (there\\n * was data in the MTL file), then material.mapDiffuse.texture will contain\\n * the downloaded image. This option defaults to `true`. By default, the MTL\\'s\\n * URL will be used to determine the location of the images.\\n *\\n * The `mtlTextureRoot` attribute is optional and should point to the location\\n * on the server that this MTL\\'s texture files are located. The default is to\\n * use the MTL file\\'s location.\\n *\\n * @returns {Promise} the result of downloading the given list of models. The\\n * promise will resolve with an object whose keys are the names of the models\\n * and the value is its Mesh object. Each Mesh object will automatically\\n * have its addMaterialLibrary() method called to set the given MTL data (if given).\\n */\\nfunction downloadModels(models) {\\n const finished = [];\\n for (const model of models) {\\n if (!model.obj) {\\n throw new Error(\\'\"obj\" attribute of model object not set. The .obj file is required to be set \\' +\\n \"in order to use downloadModels()\");\\n }\\n const options = {\\n indicesPerMaterial: !!model.indicesPerMaterial,\\n calcTangentsAndBitangents: !!model.calcTangentsAndBitangents,\\n };\\n // if the name is not provided, dervive it from the given OBJ\\n let name = model.name;\\n if (!name) {\\n const parts = model.obj.split(\"/\");\\n name = parts[parts.length - 1].replace(\".obj\", \"\");\\n }\\n const namePromise = Promise.resolve(name);\\n const meshPromise = fetch(model.obj)\\n .then(response => response.text())\\n .then(data => {\\n return new _mesh__WEBPACK_IMPORTED_MODULE_0__[\"default\"](data, options);\\n });\\n let mtlPromise;\\n // Download MaterialLibrary file?\\n if (model.mtl) {\\n const mtl = getMtl(model);\\n mtlPromise = fetch(mtl)\\n .then(response => response.text())\\n .then((data) => {\\n const material = new _material__WEBPACK_IMPORTED_MODULE_1__[\"MaterialLibrary\"](data);\\n if (model.downloadMtlTextures !== false) {\\n let root = model.mtlTextureRoot;\\n if (!root) {\\n // get the directory of the MTL file as default\\n root = mtl.substr(0, mtl.lastIndexOf(\"/\"));\\n }\\n // downloadMtlTextures returns a Promise that\\n // is resolved once all of the images it\\n // contains are downloaded. These are then\\n // attached to the map data objects\\n return Promise.all([Promise.resolve(material), downloadMtlTextures(material, root)]);\\n }\\n return Promise.all([Promise.resolve(material), undefined]);\\n })\\n .then((value) => {\\n return value[0];\\n });\\n }\\n const parsed = [namePromise, meshPromise, mtlPromise];\\n finished.push(Promise.all(parsed));\\n }\\n return Promise.all(finished).then(ms => {\\n // the \"finished\" promise is a list of name, Mesh instance,\\n // and MaterialLibary instance. This unpacks and returns an\\n // object mapping name to Mesh (Mesh points to MTL).\\n const models = {};\\n for (const model of ms) {\\n const [name, mesh, mtl] = model;\\n mesh.name = name;\\n if (mtl) {\\n mesh.addMaterialLibrary(mtl);\\n }\\n models[name] = mesh;\\n }\\n return models;\\n });\\n}\\n/**\\n * Takes in an object of `mesh_name`, `\\'/url/to/OBJ/file\\'` pairs and a callback\\n * function. Each OBJ file will be ajaxed in and automatically converted to\\n * an OBJ.Mesh. When all files have successfully downloaded the callback\\n * function provided will be called and passed in an object containing\\n * the newly created meshes.\\n *\\n * **Note:** In order to use this function as a way to download meshes, a\\n * webserver of some sort must be used.\\n *\\n * @param {Object} nameAndAttrs an object where the key is the name of the mesh and the value is the url to that mesh\\'s OBJ file\\n *\\n * @param {Function} completionCallback should contain a function that will take one parameter: an object array where the keys will be the unique object name and the value will be a Mesh object\\n *\\n * @param {Object} meshes In case other meshes are loaded separately or if a previously declared variable is desired to be used, pass in a (possibly empty) json object of the pattern: { \\'<mesh_name>\\': OBJ.Mesh }\\n *\\n */\\nfunction downloadMeshes(nameAndURLs, completionCallback, meshes) {\\n if (meshes === undefined) {\\n meshes = {};\\n }\\n const completed = [];\\n for (const mesh_name in nameAndURLs) {\\n if (!nameAndURLs.hasOwnProperty(mesh_name)) {\\n continue;\\n }\\n const url = nameAndURLs[mesh_name];\\n completed.push(fetch(url)\\n .then(response => response.text())\\n .then(data => {\\n return [mesh_name, new _mesh__WEBPACK_IMPORTED_MODULE_0__[\"default\"](data)];\\n }));\\n }\\n Promise.all(completed).then(ms => {\\n for (const [name, mesh] of ms) {\\n meshes[name] = mesh;\\n }\\n return completionCallback(meshes);\\n });\\n}\\nfunction _buildBuffer(gl, type, data, itemSize) {\\n const buffer = gl.createBuffer();\\n const arrayView = type === gl.ARRAY_BUFFER ? Float32Array : Uint16Array;\\n gl.bindBuffer(type, buffer);\\n gl.bufferData(type, new arrayView(data), gl.STATIC_DRAW);\\n buffer.itemSize = itemSize;\\n buffer.numItems = data.length / itemSize;\\n return buffer;\\n}\\n/**\\n * Takes in the WebGL context and a Mesh, then creates and appends the buffers\\n * to the mesh object as attributes.\\n *\\n * @param {WebGLRenderingContext} gl the `canvas.getContext(\\'webgl\\')` context instance\\n * @param {Mesh} mesh a single `OBJ.Mesh` instance\\n *\\n * The newly created mesh attributes are:\\n *\\n * Attrbute | Description\\n * :--- | ---\\n * **normalBuffer** |contains the model's Vertex Normals\\n * normalBuffer.itemSize |set to 3 items\\n * normalBuffer.numItems |the total number of vertex normals\\n * |\\n * **textureBuffer** |contains the model's Texture Coordinates\\n * textureBuffer.itemSize |set to 2 items\\n * textureBuffer.numItems |the number of texture coordinates\\n * |\\n * **vertexBuffer** |contains the model's Vertex Position Coordinates (does not include w)\\n * vertexBuffer.itemSize |set to 3 items\\n * vertexBuffer.numItems |the total number of vertices\\n * |\\n * **indexBuffer** |contains the indices of the faces\\n * indexBuffer.itemSize |is set to 1\\n * indexBuffer.numItems |the total number of indices\\n *\\n * A simple example (a lot of steps are missing, so don\\'t copy and paste):\\n *\\n * const gl = canvas.getContext(\\'webgl\\'),\\n * mesh = OBJ.Mesh(obj_file_data);\\n * // compile the shaders and create a shader program\\n * const shaderProgram = gl.createProgram();\\n * // compilation stuff here\\n * ...\\n * // make sure you have vertex, vertex normal, and texture coordinate\\n * // attributes located in your shaders and attach them to the shader program\\n * shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"aVertexPosition\");\\n * gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\\n *\\n * shaderProgram.vertexNormalAttribute = gl.getAttribLocation(shaderProgram, \"aVertexNormal\");\\n * gl.enableVertexAttribArray(shaderProgram.vertexNormalAttribute);\\n *\\n * shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, \"aTextureCoord\");\\n * gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\\n *\\n * // create and initialize the vertex, vertex normal, and texture coordinate buffers\\n * // and save on to the mesh object\\n * OBJ.initMeshBuffers(gl, mesh);\\n *\\n * // now to render the mesh\\n * gl.bindBuffer(gl.ARRAY_BUFFER, mesh.vertexBuffer);\\n * gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, mesh.vertexBuffer.itemSize, gl.FLOAT, false, 0, 0);\\n * // it\\'s possible that the mesh doesn\\'t contain\\n * // any texture coordinates (e.g. suzanne.obj in the development branch).\\n * // in this case, the texture vertexAttribArray will need to be disabled\\n * // before the call to drawElements\\n * if(!mesh.textures.length){\\n * gl.disableVertexAttribArray(shaderProgram.textureCoordAttribute);\\n * }\\n * else{\\n * // if the texture vertexAttribArray has been previously\\n * // disabled, then it needs to be re-enabled\\n * gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);\\n * gl.bindBuffer(gl.ARRAY_BUFFER, mesh.textureBuffer);\\n * gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, mesh.textureBuffer.itemSize, gl.FLOAT, false, 0, 0);\\n * }\\n *\\n * gl.bindBuffer(gl.ARRAY_BUFFER, mesh.normalBuffer);\\n * gl.vertexAttribPointer(shaderProgram.vertexNormalAttribute, mesh.normalBuffer.itemSize, gl.FLOAT, false, 0, 0);\\n *\\n * gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, model.mesh.indexBuffer);\\n * gl.drawElements(gl.TRIANGLES, model.mesh.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);\\n */\\nfunction initMeshBuffers(gl, mesh) {\\n mesh.normalBuffer = _buildBuffer(gl, gl.ARRAY_BUFFER, mesh.vertexNormals, 3);\\n mesh.textureBuffer = _buildBuffer(gl, gl.ARRAY_BUFFER, mesh.textures, mesh.textureStride);\\n mesh.vertexBuffer = _buildBuffer(gl, gl.ARRAY_BUFFER, mesh.vertices, 3);\\n mesh.indexBuffer = _buildBuffer(gl, gl.ELEMENT_ARRAY_BUFFER, mesh.indices, 1);\\n return mesh;\\n}\\nfunction deleteMeshBuffers(gl, mesh) {\\n gl.deleteBuffer(mesh.normalBuffer);\\n gl.deleteBuffer(mesh.textureBuffer);\\n gl.deleteBuffer(mesh.vertexBuffer);\\n gl.deleteBuffer(mesh.indexBuffer);\\n}\\n\\n\\n//# sourceURL=webpack:///./src/utils.ts?')},0:\n/*!****************************!*\\\n !*** multi ./src/index.ts ***!\n \\****************************/\n/*! no static exports found */function(module,exports,__webpack_require__){eval('module.exports = __webpack_require__(/*! /home/aaron/google_drive/projects/webgl-obj-loader/src/index.ts */\"./src/index.ts\");\\n\\n\\n//# sourceURL=webpack:///multi_./src/index.ts?')}})}));","/**\n * @file Media sources — images, video and Canvas2D rasters for a bridge's textures, OBJ models for its buffers.\n * @module host/media\n * @license AGPL-3.0-only\n *\n * A model arrives as arrays for a bridge's buffer upload: loadModel fetches an\n * OBJ file and adapts webgl-obj-loader's mesh, no parser of its own.\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\nimport OBJ from 'webgl-obj-loader';\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 * Fetch an OBJ model into the arrays shape: position and indices, plus normal\n * and texcoord when the file carries them. twgl's createBufferInfoFromArrays\n * takes the result as it is.\n *\n * Parsing is webgl-obj-loader's: faces are triangulated and each distinct\n * position / uv / normal triple becomes one vertex. Materials are ignored.\n *\n * @param {string} url\n * @param {{ fetch?:object }} [opts] fetch: the fetch init (credentials, mode, …).\n * @returns {Promise<{ position:{numComponents:number,data:Float32Array},\n * normal?:{numComponents:number,data:Float32Array},\n * texcoord?:{numComponents:number,data:Float32Array},\n * indices:{numComponents:number,data:Uint32Array} }>}\n */\nexport async function loadModel(url, opts) {\n const o = opts || {};\n const res = await fetch(url, o.fetch);\n if (!res.ok) throw new Error('[host] model: ' + url + ' → ' + res.status);\n const mesh = new OBJ.Mesh(await res.text());\n const out = {\n position: { numComponents: 3, data: new Float32Array(mesh.vertices) },\n indices: { numComponents: 3, data: new Uint32Array(mesh.indices) },\n };\n // a file without normals leaves the loader's normals unset, one per component\n const n = mesh.vertexNormals;\n if (n.length && n.every(Number.isFinite)) out.normal = { numComponents: 3, data: new Float32Array(n) };\n if (mesh.textures.length) out.texcoord = { numComponents: mesh.textureStride, data: new Float32Array(mesh.textures) };\n return out;\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 // a hovering mouse has an entry without a press; only pressed, unclaimed, live pointers drive\n if (!p.down || 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) · host.model(url)\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, loadModel } 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, loadModel } 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 /** Fetch an OBJ model into the arrays shape — see host/media. */\n model(url, opts) { return loadModel(url, 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":["_now","_vx","this"],"mappings":"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","x_google_ignoreList":[9]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../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/obj.js","../src/media.js","../src/labels.js","../src/orbit.js","../src/index.js"],"sourcesContent":["/**\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 OBJ text → the arrays shape a bridge's buffer upload takes.\n * @module host/obj\n * @license AGPL-3.0-only\n *\n * Positions, texture coordinates and normals. Faces are fan-triangulated — a\n * quad as 0 1 2 · 2 3 0 — and each distinct position / uv / normal triple\n * becomes one vertex, in order of first use. Indices are 1-based, or negative\n * counting back from the last declared element. Groups, objects, smoothing and\n * materials are ignored.\n */\n\n'use strict';\n\nconst _index = (s, count) => {\n const i = parseInt(s, 10);\n return i < 0 ? count + i : i - 1;\n};\n\n/**\n * Parse OBJ text into `{ position, normal?, texcoord?, indices }`; normal and\n * texcoord only when some face vertex names one.\n * @param {string} text\n * @returns {{ position:{numComponents:number,data:Float32Array},\n * normal?:{numComponents:number,data:Float32Array},\n * texcoord?:{numComponents:number,data:Float32Array},\n * indices:{numComponents:number,data:Uint32Array} }}\n */\nexport function parseObj(text) {\n const v = [], vt = [], vn = [];\n const position = [], texcoord = [], normal = [], indices = [];\n const seen = new Map();\n let uvs = false, normals = false;\n\n const vertex = (token) => {\n const [ps, ts, ns] = token.split('/');\n const p = _index(ps, v.length / 3);\n const t = ts ? _index(ts, vt.length / 2) : -1;\n const n = ns ? _index(ns, vn.length / 3) : -1;\n const key = p + '/' + t + '/' + n;\n let id = seen.get(key);\n if (id !== undefined) return id;\n position.push(v[3 * p], v[3 * p + 1], v[3 * p + 2]);\n if (t >= 0) { texcoord.push(vt[2 * t], vt[2 * t + 1]); uvs = true; } else texcoord.push(0, 0);\n if (n >= 0) { normal.push(vn[3 * n], vn[3 * n + 1], vn[3 * n + 2]); normals = true; } else normal.push(0, 0, 0);\n id = position.length / 3 - 1;\n seen.set(key, id);\n return id;\n };\n\n for (const raw of text.split('\\n')) {\n const line = raw.trim();\n if (!line || line[0] === '#') continue;\n const parts = line.split(/\\s+/);\n switch (parts[0]) {\n case 'v': v.push(+parts[1], +parts[2], +parts[3]); break;\n case 'vt': vt.push(+parts[1], +(parts[2] ?? 0)); break;\n case 'vn': vn.push(+parts[1], +parts[2], +parts[3]); break;\n case 'f': {\n const ids = parts.slice(1).map(vertex);\n if (ids.length === 4) indices.push(ids[0], ids[1], ids[2], ids[2], ids[3], ids[0]);\n else for (let i = 1; i + 1 < ids.length; i++) indices.push(ids[0], ids[i], ids[i + 1]);\n break;\n }\n }\n }\n\n const out = {\n position: { numComponents: 3, data: new Float32Array(position) },\n indices: { numComponents: 3, data: new Uint32Array(indices) },\n };\n if (normals) out.normal = { numComponents: 3, data: new Float32Array(normal) };\n if (uvs) out.texcoord = { numComponents: 2, data: new Float32Array(texcoord) };\n return out;\n}\n","/**\n * @file Media sources — images, video and Canvas2D rasters for a bridge's textures, OBJ models for its buffers.\n * @module host/media\n * @license AGPL-3.0-only\n *\n * A model arrives as arrays for a bridge's buffer upload: loadModel fetches an\n * OBJ file and parses it (host/obj).\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\nimport { parseObj } from './obj.js';\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 * Fetch an OBJ model into the arrays shape: position and indices, plus normal\n * and texcoord when the file carries them. twgl's createBufferInfoFromArrays\n * takes the result as it is.\n *\n * Faces are triangulated and each distinct position / uv / normal triple\n * becomes one vertex. Materials are ignored.\n *\n * @param {string} url\n * @param {{ fetch?:object }} [opts] fetch: the fetch init (credentials, mode, …).\n * @returns {Promise<{ position:{numComponents:number,data:Float32Array},\n * normal?:{numComponents:number,data:Float32Array},\n * texcoord?:{numComponents:number,data:Float32Array},\n * indices:{numComponents:number,data:Uint32Array} }>}\n */\nexport async function loadModel(url, opts) {\n const o = opts || {};\n const res = await fetch(url, o.fetch);\n if (!res.ok) throw new Error('[host] model: ' + url + ' → ' + res.status);\n return parseObj(await res.text());\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. `damping`, seconds, makes the\n * camera trail the gesture through a first-order lag: each step of a drag —\n * orbit, pan and dolly lanes — and each wheel notch is an impulse the camera\n * drains with that time constant through tree's coast, so it follows the\n * finger about `damping` behind and, after a release, travels the rest of\n * what the finger did and no more, a flick easing out. A fresh touch drops\n * what is still draining, so do home() and enabled = false. The default is\n * 0.2 s; 0 makes the orbit exact.\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, coastStep, coastAlive } from '@nakednous/tree';\n\nconst _clamp = { min: 0, max: Infinity };\nconst _now = () => (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();\nconst EPS = 1e-4; // a rate below this in every lane ends the drain\nconst DT_MAX = 0.1; // seconds, the measured frame's clamp\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, damping?: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). damping: the lag's time constant in seconds (default\n * 0.2; 0 exact). minDistance / maxDistance: gaze-distance clamps.\n * @returns {object} The orbit: { cam, enabled, rotate, pan, zoom, wheel, damping,\n * minDistance, maxDistance, update(dt), 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 const rate = [0, 0, 0, 0, 0]; // what is still draining: dAz, dEl, panX, panY, log dolly — per second\n const step = [0, 0, 0, 0, 0]; // one frame of it\n let lastNow = 0, wasPressed = false;\n\n const cancel = () => { for (let i = 0; i < 5; i++) rate[i] = 0; };\n const apply = (s) => {\n if (s[0] !== 0 || s[1] !== 0) cameraOrbit(cam, s[0], s[1]);\n if (s[2] !== 0 || s[3] !== 0) cameraPan(cam, s[2], s[3]);\n if (s[4] !== 0) dolly(Math.exp(s[4]));\n };\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 /** The lag's time constant, seconds; 0 makes the orbit exact. */\n damping: o.damping ?? 0.2,\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 * through the lag when damping is on.\n * @param {number} [dt] The frame in seconds; measured since the last update when omitted.\n * @returns {boolean} Whether the camera moved.\n */\n update(dt) {\n const now = _now();\n if (typeof dt !== 'number') dt = lastNow ? Math.min((now - lastNow) / 1000, DT_MAX) : 0;\n lastNow = now;\n if (!orbit.enabled) { tracked.clear(); wheelAcc = 0; cancel(); wasPressed = false; return false; }\n const src = host.pointer;\n let a = null, b = null;\n for (const p of src.pointers.values()) {\n // a hovering mouse has an entry without a press; only pressed, unclaimed, live pointers drive\n if (!p.down || 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 const tau = orbit.damping > 0 ? orbit.damping : 0;\n const pressed = a !== null;\n if (pressed && !wasPressed) cancel(); // a fresh touch catches the scene: what was still draining is dropped\n wasPressed = pressed;\n let moved = false;\n let az = 0, el = 0, px = 0, py = 0, ld = 0; // this frame's step\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) { az = -dx * orbit.rotate; el = ys * dy * orbit.rotate; }\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 px = -dmx * ratio * orbit.pan; py = ys * dmy * ratio * orbit.pan;\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) ld = orbit.zoom * Math.log(d0 / d1);\n }\n track(a); track(b);\n }\n // the step: exact, or — with damping — an impulse the drain below spreads over time\n if (az !== 0 || el !== 0 || px !== 0 || py !== 0 || ld !== 0) {\n if (tau > 0) { rate[0] += az / tau; rate[1] += el / tau; rate[2] += px / tau; rate[3] += py / tau; rate[4] += ld / tau; }\n else { step[0] = az; step[1] = el; step[2] = px; step[3] = py; step[4] = ld; apply(step); moved = true; }\n }\n if (wheelAcc !== 0) {\n const w = wheelAcc * 0.001 * orbit.wheel;\n wheelAcc = 0;\n if (tau > 0) rate[4] += w / tau;\n else { dolly(Math.exp(w)); moved = true; }\n }\n if (tau > 0 && coastAlive(rate, EPS)) { apply(coastStep(step, rate, dt, tau)); moved = true; }\n return moved;\n },\n\n /** Restore the pose captured at creation; whatever was draining is dropped. */\n home() { cameraCopy(cam, home); cancel(); 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 cancel();\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) · host.model(url)\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, loadModel } 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, loadModel } 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 /** Fetch an OBJ model into the arrays shape — see host/media. */\n model(url, opts) { return loadModel(url, 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":["_now","_vx"],"mappings":"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"}
|