feat: implement StairOpeningSystem to handle automated stair opening updates and adjust camera distance constraints
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
'use client'
|
||||
|
||||
import { StairOpeningSystem } from '@pascal-app/core'
|
||||
import { Canvas, extend, type ThreeToJSXElements, useFrame, useThree } from '@react-three/fiber'
|
||||
import { useEffect, useMemo, useRef } from 'react'
|
||||
import * as THREE from 'three/webgpu'
|
||||
@@ -216,6 +217,9 @@ const Viewer: React.FC<ViewerProps> = ({
|
||||
builder, swaps the registered group's children. See
|
||||
wiki/architecture/node-definitions.md. */}
|
||||
<GeometrySystem />
|
||||
{/* Automated stair opening sync — updates slab/ceiling cutouts
|
||||
whenever stairs, slabs, or levels change. */}
|
||||
<StairOpeningSystem />
|
||||
{/* Mounts systems contributed by registry-backed kinds. Each
|
||||
kind's `def.system` is loaded via lazy() and rendered here,
|
||||
ordered by `system.priority`. */}
|
||||
|
||||
@@ -6,11 +6,10 @@ import {
|
||||
type StairSegmentNode,
|
||||
sceneRegistry,
|
||||
spatialGridManager,
|
||||
syncAutoStairOpenings,
|
||||
useScene,
|
||||
} from '@pascal-app/core'
|
||||
import { useFrame } from '@react-three/fiber'
|
||||
import { useEffect, useRef } from 'react'
|
||||
import { useRef } from 'react'
|
||||
import * as THREE from 'three'
|
||||
import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js'
|
||||
|
||||
@@ -30,26 +29,6 @@ export const StairSystem = () => {
|
||||
const dirtyNodes = useScene((state) => state.dirtyNodes)
|
||||
const clearDirty = useScene((state) => state.clearDirty)
|
||||
const rootNodeIds = useScene((state) => state.rootNodeIds)
|
||||
const syncingAutoOpeningsRef = useRef(false)
|
||||
|
||||
useEffect(() => {
|
||||
const applyUpdates = (updates: ReturnType<typeof syncAutoStairOpenings>) => {
|
||||
if (updates.length === 0) return
|
||||
syncingAutoOpeningsRef.current = true
|
||||
useScene.getState().updateNodes(updates)
|
||||
queueMicrotask(() => {
|
||||
syncingAutoOpeningsRef.current = false
|
||||
})
|
||||
}
|
||||
|
||||
applyUpdates(syncAutoStairOpenings(useScene.getState().nodes))
|
||||
|
||||
return useScene.subscribe((state, prevState) => {
|
||||
if (syncingAutoOpeningsRef.current) return
|
||||
if (state.nodes === prevState.nodes) return
|
||||
applyUpdates(syncAutoStairOpenings(state.nodes))
|
||||
})
|
||||
}, [])
|
||||
|
||||
useFrame(() => {
|
||||
if (rootNodeIds.length === 0) {
|
||||
|
||||
Reference in New Issue
Block a user