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