ADR-041 — ISS module pickability and scene graph
Status · Accepted
Date · 2026-05-05
Closes · RFC-013 (with ADR-040, ADR-042)
TA anchor · §components
Related · ADR-040, PRD-010
Context
RFC-013 OQ-2 asked how to balance pick granularity vs draw calls. PRD-010 / GH-41 require 17 pick targets: 16 pressurised modules + Canadarm2. Truss and solar arrays are scenery in V1.
Decision
Hybrid mesh split (RFC Option C + Canadarm)
- Pickable: one
THREE.Mesh(or group leaf) per canonicalidiniss-modules.json, withuserData.moduleId === idanduserData.issPickable === true. - Non-pickable: merged geometry under name
truss_mergedwithuserData.issPickable === false— raycaster excludes these meshes from module hits (or filters after intersect).
Highlight
Emissive pulse on MeshStandardMaterial for the selected module (no outline pass in V1 — OutlinePass not assumed available on low-end WebGL).
Draw calls
Expect ~18 meshes (17 pickable + 1 truss) — within mobile budget for static geometry.
Consequences
Positive: Trivial userData.moduleId wiring from raycast → panel.
Negative: NASA-derived future imports must preserve naming map or an alias table in code.
Implementation notes
Scene traversal after GLTFLoader.load: register pickables in an array for Raycaster.intersectObjects.