Both kinds share traits — hosted on walls, cuttable, animated open/
close state via a geometry system + animation system. Stage A
migration: register + wrap-export the legacy renderer + bundle both
per-kind systems. Pure geometry + floor-plan ports are later
milestones.
Files added (packages/nodes/src/door/, packages/nodes/src/window/):
- schema.ts: re-export from core.
- parametrics.ts: minimal — dimensions only. Door has 29 sliders +
segmented controls + presets in its legacy panel; window has 15+
sliders. Auto-inspector can't cover them at Stage A — legacy
panel keeps rendering via panel-manager.tsx case fall-through.
Stage E may extend parametrics or use parametrics.customPanel
escape hatch.
- definition.ts: capabilities (no `movable` — wall-bound drag is
bespoke; capability-driven dispatch keeps legacy MoveDoorTool /
MoveWindowTool), parametrics, renderer, system. defaults() uses
`DoorNode.parse({...stub})` to leverage zod's schema-level
`.default()` annotations — door has 40+ fields, window has 20+;
listing them inline duplicates the schema.
- renderer.tsx: wrap-export of legacy DoorRenderer / WindowRenderer
(thin 33-36 lines each).
- system.tsx: bundles each kind's TWO systems — DoorSystem +
DoorAnimationSystem, WindowSystem + WindowAnimationSystem. Both
per-kind systems mount via RegisteredSystems when the kind is
registry-driven; `<LegacySystem kind="door|window">` wrappers
around each individual system short-circuit.
- index.ts: barrel.
Files changed:
- packages/viewer/src/index.ts: new public exports for DoorRenderer,
DoorSystem, DoorAnimationSystem, WindowRenderer, WindowSystem,
WindowAnimationSystem.
- packages/nodes/src/index.ts: appends doorDefinition + windowDefinition.
- packages/editor/src/components/ui/panels/door-panel.tsx + window-
panel.tsx: panel slider-drag fix recipe applied. Drop the
subscribed `updateNode` action, drop the `node` dep from
handleUpdate / previewDoorUpdate / commitDoorPreview useCallbacks.
Use useScene.getState() inside. Door panel has 29 SliderControls,
window 15+ — both at high risk of the Maximum update depth
cascade without the fix.
Phase 5 progress: shelf ✅, spawn ✅, wall ✅, fence ✅, slab ✅, ceiling ✅,
door ✅, window ✅. Eight kinds on the registry. Item / stair / roof /
zone / containers remain.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
69 lines
3.5 KiB
TypeScript
69 lines
3.5 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 { 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 } from './systems/fence/fence-system'
|
|
export { InteractiveSystem } from './systems/interactive/interactive-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 { 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'
|