import { useRegistry, useScene, type WallNode } from '@pascal-app/core' import { useEffect, useLayoutEffect, useMemo, useRef } from 'react' import { BufferGeometry, Float32BufferAttribute, type Mesh } from 'three' import { useNodeEvents } from '../../../hooks/use-node-events' import { getVisibleWallMaterials } from '../../../systems/wall/wall-materials' import { NodeRenderer } from '../node-renderer' // Phase 3 verification — see the matching `[wall:registry]` log in // nodes/src/wall/renderer.tsx. When this fires, wall is on the legacy // path; the registry-driven WallRenderer is not in use. Drop alongside // the legacy file at Phase 6. let didLogFirstLegacyWallMount = false function createEmptyWallGeometry() { const geometry = new BufferGeometry() geometry.setAttribute('position', new Float32BufferAttribute([], 3)) geometry.addGroup(0, 0, 0) geometry.addGroup(0, 0, 1) geometry.addGroup(0, 0, 2) return geometry } export const WallRenderer = ({ node }: { node: WallNode }) => { const ref = useRef(null!) const placeholderGeometry = useMemo(createEmptyWallGeometry, []) const collisionPlaceholderGeometry = useMemo(() => { const geometry = new BufferGeometry() geometry.setAttribute('position', new Float32BufferAttribute([], 3)) return geometry }, []) useRegistry(node.id, 'wall', ref) useLayoutEffect(() => { useScene.getState().markDirty(node.id) }, [node.id]) useEffect(() => { if (didLogFirstLegacyWallMount) return didLogFirstLegacyWallMount = true console.info( '[wall:legacy] first legacy WallRenderer mounted — registry-driven WallRenderer is NOT in use', ) }, []) useEffect(() => { return () => { placeholderGeometry.dispose() collisionPlaceholderGeometry.dispose() } }, [collisionPlaceholderGeometry, placeholderGeometry]) const handlers = useNodeEvents(node, 'wall') const material = getVisibleWallMaterials(node) return ( {node.children.map((childId) => ( ))} ) }