Stair system (full stack): - New StairNode + StairSegmentNode schemas with flights, landings, L/U-shapes - StairSystem: geometry generation with throttled per-frame updates - Stair tool, edit system, panels, tree node, and renderers - Event bus types, scene registry, and command palette entries Scene graph utilities: - cloneLevelSubtree: deep-clone a level with remapped IDs - forkSceneGraph: clone + strip scan/guide nodes for project forking Core improvements: - Read-only mode on scene store (blocks create/update/delete when locked) - readOnly guards on node-actions and collection actions - Upload store for scan/guide file upload handling Viewer state: - previewSelectedIds for box-select live preview - hoverHighlightMode (default/delete) for delete-mode hover outline
47 lines
2.2 KiB
TypeScript
47 lines
2.2 KiB
TypeScript
'use client'
|
|
|
|
import { type AnyNode, useScene } from '@pascal-app/core'
|
|
import { BuildingRenderer } from './building/building-renderer'
|
|
import { CeilingRenderer } from './ceiling/ceiling-renderer'
|
|
import { DoorRenderer } from './door/door-renderer'
|
|
import { GuideRenderer } from './guide/guide-renderer'
|
|
import { ItemRenderer } from './item/item-renderer'
|
|
import { LevelRenderer } from './level/level-renderer'
|
|
import { RoofRenderer } from './roof/roof-renderer'
|
|
import { RoofSegmentRenderer } from './roof-segment/roof-segment-renderer'
|
|
import { ScanRenderer } from './scan/scan-renderer'
|
|
import { SiteRenderer } from './site/site-renderer'
|
|
import { SlabRenderer } from './slab/slab-renderer'
|
|
import { StairRenderer } from './stair/stair-renderer'
|
|
import { StairSegmentRenderer } from './stair-segment/stair-segment-renderer'
|
|
import { WallRenderer } from './wall/wall-renderer'
|
|
import { WindowRenderer } from './window/window-renderer'
|
|
import { ZoneRenderer } from './zone/zone-renderer'
|
|
|
|
export const NodeRenderer = ({ nodeId }: { nodeId: AnyNode['id'] }) => {
|
|
const node = useScene((state) => state.nodes[nodeId])
|
|
|
|
if (!node) return null
|
|
|
|
return (
|
|
<>
|
|
{node.type === 'site' && <SiteRenderer node={node} />}
|
|
{node.type === 'building' && <BuildingRenderer node={node} />}
|
|
{node.type === 'ceiling' && <CeilingRenderer node={node} />}
|
|
{node.type === 'level' && <LevelRenderer node={node} />}
|
|
{node.type === 'item' && <ItemRenderer node={node} />}
|
|
{node.type === 'slab' && <SlabRenderer node={node} />}
|
|
{node.type === 'wall' && <WallRenderer node={node} />}
|
|
{node.type === 'door' && <DoorRenderer node={node} />}
|
|
{node.type === 'window' && <WindowRenderer node={node} />}
|
|
{node.type === 'zone' && <ZoneRenderer node={node} />}
|
|
{node.type === 'roof' && <RoofRenderer node={node} />}
|
|
{node.type === 'roof-segment' && <RoofSegmentRenderer node={node} />}
|
|
{node.type === 'stair' && <StairRenderer node={node} />}
|
|
{node.type === 'stair-segment' && <StairSegmentRenderer node={node} />}
|
|
{node.type === 'scan' && <ScanRenderer node={node} />}
|
|
{node.type === 'guide' && <GuideRenderer node={node} />}
|
|
</>
|
|
)
|
|
}
|