draft item-system + elevation

This commit is contained in:
wass08
2026-01-27 19:05:08 +09:00
parent 150a0a4ca1
commit 11aba2af36
5 changed files with 116 additions and 7 deletions
@@ -0,0 +1,46 @@
import { useFrame } from '@react-three/fiber'
import * as THREE from 'three'
import { sceneRegistry } from '../../hooks/scene-registry/scene-registry'
import { spatialGridManager } from '../../hooks/spatial-grid/spatial-grid-manager'
import { resolveLevelId } from '../../hooks/spatial-grid/spatial-grid-sync'
import type { AnyNodeId, ItemNode, WallNode } from '../../schema'
import useScene from '../../store/use-scene'
// ============================================================================
// ITEM SYSTEM
// ============================================================================
export const ItemSystem = () => {
const { nodes, dirtyNodes, clearDirty } = useScene()
useFrame(() => {
if (dirtyNodes.size === 0) return
dirtyNodes.forEach((id) => {
const node = nodes[id]
if (!node || node.type !== 'item') return
const item = node as ItemNode
const mesh = sceneRegistry.nodes.get(id) as THREE.Object3D
if (!mesh) return
if (item.asset.attachTo === 'wall' || item.asset.attachTo === 'wall-side') {
// Wall-attached item: offset Z by half the parent wall's thickness
const parentWall = item.parentId ? nodes[item.parentId as AnyNodeId] : undefined
if (parentWall && parentWall.type === 'wall') {
const wallThickness = (parentWall as WallNode).thickness ?? 0.1
mesh.position.z = wallThickness / 2
}
} else if (!item.asset.attachTo) {
// Floor item: elevate by slab height
const levelId = resolveLevelId(item, nodes)
const slabElevation = spatialGridManager.getSlabElevationAt(levelId, item.position[0], item.position[2])
mesh.position.y = slabElevation
}
clearDirty(id as AnyNodeId)
})
})
return null
}