2026-01-28 10:54:12 +09:00

48 lines
1.4 KiB
TypeScript

import useEditor from '@/store/use-editor'
import { Vector3 } from 'three'
import { useDraftNode } from './use-draft-node'
import { usePlacementCoordinator } from './use-placement-coordinator'
import type { PlacementState } from './placement-types'
function getInitialState(node: { asset: { attachTo?: string }; parentId: string | null }): PlacementState {
const attachTo = node.asset.attachTo
if (attachTo === 'wall' || attachTo === 'wall-side') {
return { surface: 'wall', wallId: node.parentId, ceilingId: null }
}
if (attachTo === 'ceiling') {
return { surface: 'ceiling', wallId: null, ceilingId: node.parentId }
}
return { surface: 'floor', wallId: null, ceilingId: null }
}
export const MoveTool: React.FC = () => {
const movingNode = useEditor((state) => state.movingNode)
const draftNode = useDraftNode()
const exitMoveMode = () => {
useEditor.getState().setMovingNode(null)
}
const cursor = usePlacementCoordinator({
asset: movingNode!.asset,
draftNode,
initialState: movingNode ? getInitialState(movingNode) : undefined,
initDraft: (gridPosition) => {
if (!movingNode) return
draftNode.adopt(movingNode)
gridPosition.copy(new Vector3(...movingNode.position))
},
onCommitted: () => {
exitMoveMode()
return false
},
onCancel: () => {
draftNode.destroy()
exitMoveMode()
},
})
if (!movingNode) return null
return <>{cursor}</>
}