Symptom: a shelf placed on a level with a raised slab underneath visually clipped through it — `ItemSystem` lifted items onto slabs, but shelves (and other floor-placed registry kinds) had no equivalent path. Fix: lift the slab-elevation logic out of `ItemSystem` into a generic `<FloorElevationSystem>` keyed off a new `capabilities.floorPlaced` config. Any kind that opts in declares a `footprint(node)` (dimensions + rotation used to query overlapping slabs) and an optional `applies` predicate (skips items whose `asset.attachTo` is wall / ceiling). The new system runs at frame priority 1 so its `mesh.position.y` override lands before `ItemSystem` / `GeometrySystem` (priority 2) clear the dirty mark. The spatial-grid sync's `markNodesOverlappingSlab` also dropped its hardcoded `item` branch in favour of an iteration over every registered kind that declares `floorPlaced` — so any new floor-placed kind picks up slab-driven re-elevation automatically. Tagged kinds: - `item` — `footprint = getScaledDimensions`, `applies = !asset.attachTo` - `shelf` — `footprint = (w, h, d)` - `column` — `footprint = (w, h, d)` - `spawn` — `footprint = (0.6, 1.8, 0.6)` (marker) `ItemSystem` retains only the wall-side z-offset block (`mesh.position.z = wallThickness / 2`). The elevation block + its `getScaledDimensions` / `resolveLevelId` / `spatialGridManager` imports moved to the generic system. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
100 lines
4.9 KiB
TypeScript
100 lines
4.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.
|
|
|
|
export { ErrorBoundary } from './components/error-boundary'
|
|
// Stage A wrap-exports for the rest of the kinds — `@pascal-app/nodes`
|
|
// registers each via `def.renderer` (and `def.system` when present)
|
|
// Generic dispatch component used by recursive renderers (e.g. level →
|
|
// children, building → children). The per-kind renderers live in
|
|
// `@pascal-app/nodes/<kind>/renderer.tsx` and are loaded by the registry
|
|
// — no per-kind re-exports needed.
|
|
export { NodeRenderer } from './components/renderers/node-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 { useAssetUrl } from './hooks/use-asset-url'
|
|
export { useGLTFKTX2 } from './hooks/use-gltf-ktx2'
|
|
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,
|
|
baseMaterial,
|
|
clearMaterialCache,
|
|
createDefaultMaterial,
|
|
createMaterial,
|
|
createMaterialFromPresetRef,
|
|
DEFAULT_CEILING_MATERIAL,
|
|
DEFAULT_DOOR_MATERIAL,
|
|
DEFAULT_ROOF_MATERIAL,
|
|
DEFAULT_SHELF_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 { unionPolygons } from './lib/polygon-union'
|
|
export { useItemLightPool } from './store/use-item-light-pool'
|
|
export { default as useViewer } from './store/use-viewer'
|
|
export { CeilingSystem } from './systems/ceiling/ceiling-system'
|
|
export {
|
|
createColumnBoxGeometry,
|
|
createColumnCylinderGeometry,
|
|
createColumnSphereGeometry,
|
|
createColumnTorusGeometry,
|
|
} from './systems/column/column-geometry'
|
|
export { DoorAnimationSystem } from './systems/door/door-animation-system'
|
|
export { DoorSystem } from './systems/door/door-system'
|
|
export { ElevatorInteractionSystem } from './systems/elevator/elevator-interaction-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'
|
|
// Generic floor-elevation system. Lifts the rendered mesh of any kind
|
|
// whose definition declares `capabilities.floorPlaced` by the slab
|
|
// elevation under its footprint. Replaces the per-kind elevation block
|
|
// that used to live inside `ItemSystem`.
|
|
export { FloorElevationSystem } from './systems/floor-elevation/floor-elevation-system'
|
|
export { GuideSystem } from './systems/guide/guide-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 { LevelSystem } from './systems/level/level-system'
|
|
export { snapLevelsToTruePositions } from './systems/level/level-utils'
|
|
export { getRoofMaterialArray } from './systems/roof/roof-materials'
|
|
export { RoofSystem } from './systems/roof/roof-system'
|
|
export { ScanSystem } from './systems/scan/scan-system'
|
|
// 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,
|
|
getStraightStairSegmentBodyMaterials,
|
|
type StairBodyMaterials,
|
|
} from './systems/stair/stair-materials'
|
|
export { StairSystem } from './systems/stair/stair-system'
|
|
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'
|
|
export { ZoneSystem } from './systems/zone/zone-system'
|