Skip to content

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) ​

  1. Pickable: one THREE.Mesh (or group leaf) per canonical id in iss-modules.json, with userData.moduleId === id and userData.issPickable === true.
  2. Non-pickable: merged geometry under name truss_merged with userData.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.

Orrery — architecture documentation · MIT · No tracking