Depth-first session: drive registered kinds through Stage B (pure
def.geometry, drop system re-export) and Stage C (def.floorplan,
short-circuit legacy inline rendering in floorplan-panel.tsx).
spawn → C
- buildSpawnFloorplan wired on definition (was written but deferred
to avoid double-render).
- floorplan-panel.tsx's floorplanSpawnEntries useMemo short-circuits
to [] when nodeRegistry.has('spawn').
fence → B
- generateFenceGeometry exported from viewer; buildFenceGeometry
wraps it in a Group+Mesh with DEFAULT_STAIR_MATERIAL.
- def.geometry set; renderer + system fields dropped.
- Deleted nodes/src/fence/{renderer.tsx,system.tsx}.
fence → C
- buildFenceFloorplan: polyline along centerline (sampled for curved
fences via sampleWallCenterline from core). Stroke width = node.thickness.
- floorplan-panel.tsx's floorplanFenceEntries short-circuits.
slab → B
- generateSlabGeometry exported from viewer; buildSlabGeometry wraps
it in a Group+Mesh + cached material (preset / custom / default
pattern preserved from legacy renderer).
- def.geometry set; renderer + system fields dropped.
- Deleted nodes/src/slab/{renderer.tsx,system.tsx}.
slab → C
- buildSlabFloorplan: SVG path with outer polygon + hole subpaths
(uses getRenderableSlabPolygon from core for wall-clipping parity).
- floorplan-panel.tsx's slabPolygons short-circuits.
ceiling → B INTENTIONALLY SKIPPED
- Ceiling renderer renders React children (hosted items) + uses TSL
shader materials + named meshes that other systems poke
(getObjectByName('ceiling-grid')). Pure def.geometry can't preserve
that. Ceiling keeps def.renderer (the custom escape hatch) — same
pattern item uses. Documented in ceiling/definition.ts.
ceiling → C
- buildCeilingFloorplan: dashed-outline path with hole subpaths
(visually distinct from slab since ceilings are above).
- floorplan-panel.tsx's ceilingPolygons short-circuits.
Per-kind progress after this session:
- shelf: B ✅ C ✅ (Stage E since brand-new)
- spawn: A ✅ C ✅
- wall: A ✅ (B blocked on ctx.levelData design)
- fence: A ✅ B ✅ C ✅
- slab: A ✅ B ✅ C ✅
- ceiling: A ✅ C ✅ (B intentionally not applicable)
- door / window / item: A ✅ (B+C pending in future sessions)
Known test issue: `bun test` in packages/nodes fails to load
`three-bvh-csg` through the viewer's transitive imports (UMD/ESM
mismatch in Bun's test runner). The Next.js editor build works fine
because it bundles differently. Fix requires either dynamic imports
(breaks sync def.geometry contract) or test env config — deferred.
Other tests (schema, geometry, parity) pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
75 lines
3.9 KiB
TypeScript
75 lines
3.9 KiB
TypeScript
// `NodeRenderer` is the recursive dispatch component used by parent
|
|
// renderers (wall renders doors/windows, slab renders hosted items).
|
|
// Public so registry-driven kinds can compose children without reaching
|
|
// into viewer's internal paths.
|
|
|
|
// Ceiling internals re-exported for the registry-driven ceiling definition.
|
|
// The ceiling renderer uses TSL shaders for a grid pattern — too much code
|
|
// to duplicate at Stage A. Wrap-exported here, ported into the nodes
|
|
// folder in a later stage.
|
|
export { CeilingRenderer } from './components/renderers/ceiling/ceiling-renderer'
|
|
// Door + window internals for registry-driven door / window definitions.
|
|
// Each kind has a geometry system + animation system to mount via
|
|
// RegisteredSystems when the kind is registry-driven.
|
|
export { DoorRenderer } from './components/renderers/door/door-renderer'
|
|
export { ItemRenderer } from './components/renderers/item/item-renderer'
|
|
export { NodeRenderer } from './components/renderers/node-renderer'
|
|
export { WindowRenderer } from './components/renderers/window/window-renderer'
|
|
export { default as Viewer } from './components/viewer'
|
|
export type { HoverStyle, HoverStyles } from './components/viewer/post-processing'
|
|
export {
|
|
DEFAULT_HOVER_STYLES,
|
|
SSGI_PARAMS,
|
|
} from './components/viewer/post-processing'
|
|
export { WalkthroughControls } from './components/viewer/walkthrough-controls'
|
|
export { useNodeEvents } from './hooks/use-node-events'
|
|
export { ASSETS_CDN_URL, resolveAssetUrl, resolveCdnUrl } from './lib/asset-url'
|
|
export { SCENE_LAYER, ZONE_LAYER } from './lib/layers'
|
|
export {
|
|
applyMaterialPresetToMaterials,
|
|
clearMaterialCache,
|
|
createDefaultMaterial,
|
|
createMaterial,
|
|
createMaterialFromPresetRef,
|
|
DEFAULT_CEILING_MATERIAL,
|
|
DEFAULT_DOOR_MATERIAL,
|
|
DEFAULT_ROOF_MATERIAL,
|
|
DEFAULT_SLAB_MATERIAL,
|
|
DEFAULT_STAIR_MATERIAL,
|
|
DEFAULT_WALL_MATERIAL,
|
|
DEFAULT_WINDOW_MATERIAL,
|
|
disposeMaterial,
|
|
glassMaterial,
|
|
} from './lib/materials'
|
|
export { mergedOutline } from './lib/merged-outline-node'
|
|
export { default as useViewer } from './store/use-viewer'
|
|
export { CeilingSystem } from './systems/ceiling/ceiling-system'
|
|
export { DoorAnimationSystem } from './systems/door/door-animation-system'
|
|
export { DoorSystem } from './systems/door/door-system'
|
|
// Fence system follows the wall re-export pattern — composed into the
|
|
// registry-driven fence definition's `def.system`. Removed in Phase 6
|
|
// alongside the legacy fence mount point.
|
|
export { FenceSystem, generateFenceGeometry } from './systems/fence/fence-system'
|
|
export { InteractiveSystem } from './systems/interactive/interactive-system'
|
|
// Item systems for the registry-driven item definition. ItemSystem
|
|
// applies attachTo-driven transforms each frame; ItemLightSystem
|
|
// manages item-mounted light sources.
|
|
export { ItemSystem } from './systems/item/item-system'
|
|
export { ItemLightSystem } from './systems/item-light/item-light-system'
|
|
export { snapLevelsToTruePositions } from './systems/level/level-utils'
|
|
export { getRoofMaterialArray } from './systems/roof/roof-materials'
|
|
// Slab system follows the wall + fence re-export pattern — composed into
|
|
// the registry-driven slab definition's `def.system`. Removed in Phase 6
|
|
// alongside the legacy slab mount point.
|
|
export { generateSlabGeometry, SlabSystem } from './systems/slab/slab-system'
|
|
export { getStairBodyMaterials, getStairRailingMaterial } from './systems/stair/stair-materials'
|
|
export { WallCutout } from './systems/wall/wall-cutout'
|
|
export { getVisibleWallMaterials } from './systems/wall/wall-materials'
|
|
// Wall internals re-exported so `@pascal-app/nodes`' registry-driven wall
|
|
// definition can compose them into `def.system` without duplicating the
|
|
// 800+ lines of CSG / mitering logic during Phase 3. These exports are
|
|
// removed in Phase 6 when the legacy mount points are deleted.
|
|
export { WallSystem } from './systems/wall/wall-system'
|
|
export { WindowAnimationSystem } from './systems/window/window-animation-system'
|
|
export { WindowSystem } from './systems/window/window-system'
|