From 82a18de88c77413965101340498f6526a405f157 Mon Sep 17 00:00:00 2001 From: wass08 Date: Wed, 28 Jan 2026 10:54:12 +0900 Subject: [PATCH] move + item corrections --- .../components/editor/selection-manager.tsx | 15 +- .../components/tools/item/item-tool.tsx | 413 +--------------- .../components/tools/item/move-tool.tsx | 47 ++ .../components/tools/item/use-draft-node.ts | 113 ++++- .../tools/item/use-placement-coordinator.tsx | 443 ++++++++++++++++++ apps/editor/components/tools/tool-manager.tsx | 5 +- .../ui/item-catalog/catalog-items.tsx | 254 +++++----- apps/editor/public/items/glass-door/model.glb | Bin 23344 -> 23444 bytes .../public/items/shower-angle/model.glb | Bin 458008 -> 489460 bytes .../public/items/shower-square/model.glb | Bin 489460 -> 458008 bytes .../public/items/window-large/model.glb | Bin 6788 -> 6872 bytes .../public/items/window-rectangle/model.glb | Bin 7584 -> 7668 bytes .../public/items/window-square/model.glb | Bin 7824 -> 7924 bytes apps/editor/store/use-editor.tsx | 6 +- 14 files changed, 745 insertions(+), 551 deletions(-) create mode 100644 apps/editor/components/tools/item/move-tool.tsx create mode 100644 apps/editor/components/tools/item/use-placement-coordinator.tsx diff --git a/apps/editor/components/editor/selection-manager.tsx b/apps/editor/components/editor/selection-manager.tsx index b1362dec..1c263a46 100644 --- a/apps/editor/components/editor/selection-manager.tsx +++ b/apps/editor/components/editor/selection-manager.tsx @@ -46,6 +46,11 @@ const SELECTION_STRATEGIES: Record = { structure: { types: ["wall", "item", "zone", "slab", "ceiling"], handleSelect: (node, isShift) => { + // Single click on item (door/window) → enter move mode + if (!isShift && node.type === 'item') { + useEditor.getState().setMovingNode(node as ItemNode); + return; + } const { selection, setSelection } = useViewer.getState(); if (node.type === 'zone') { setSelection({ zoneId: node.id }); @@ -88,6 +93,11 @@ const SELECTION_STRATEGIES: Record = { furnish: { types: ["item"], handleSelect: (node, isShift) => { + // Single click on item → enter move mode + if (!isShift && node.type === 'item') { + useEditor.getState().setMovingNode(node as ItemNode); + return; + } const { selection, setSelection } = useViewer.getState(); const nextIds = isShift ? selection.selectedIds.includes(node.id) @@ -112,8 +122,11 @@ export const SelectionManager = () => { const phase = useEditor((s) => s.phase); const mode = useEditor((s) => s.mode); + const movingNode = useEditor((s) => s.movingNode); + useEffect(() => { if (mode !== "select") return; + if (movingNode) return; const strategy = SELECTION_STRATEGIES[phase]; if (!strategy) return; @@ -158,7 +171,7 @@ export const SelectionManager = () => { }); emitter.off("grid:click", onGridClick); }; - }, [phase, mode]); + }, [phase, mode, movingNode]); return ; }; diff --git a/apps/editor/components/tools/item/item-tool.tsx b/apps/editor/components/tools/item/item-tool.tsx index 327848ed..f2884345 100644 --- a/apps/editor/components/tools/item/item-tool.tsx +++ b/apps/editor/components/tools/item/item-tool.tsx @@ -1,413 +1,22 @@ -import { - type CeilingEvent, - emitter, - type GridEvent, - sceneRegistry, - useScene, - useSpatialQuery, - type WallEvent, -} from '@pascal-app/core' -import { useViewer } from '@pascal-app/viewer' -import { useFrame } from '@react-three/fiber' -import { useEffect, useRef } from 'react' -import { BoxGeometry, type Mesh, type MeshStandardMaterial, Vector3 } from 'three' import useEditor from '@/store/use-editor' -import { resolveLevelId } from '../../../../../packages/core/src/hooks/spatial-grid/spatial-grid-sync' -import { - ceilingStrategy, - checkCanPlace, - floorStrategy, - wallStrategy, -} from './placement-strategies' -import type { PlacementState, TransitionResult } from './placement-types' import { useDraftNode } from './use-draft-node' +import { usePlacementCoordinator } from './use-placement-coordinator' export const ItemTool: React.FC = () => { - const cursorRef = useRef(null!) - const gridPosition = useRef(new Vector3(0, 0, 0)) - const placementState = useRef({ - surface: 'floor', - wallId: null, - ceilingId: null, - }) - const selectedItem = useEditor((state) => state.selectedItem) - const { canPlaceOnFloor, canPlaceOnWall, canPlaceOnCeiling } = useSpatialQuery() const draftNode = useDraftNode() - useEffect(() => { - if (!selectedItem) return - - useScene.temporal.getState().pause() - - const validators = { canPlaceOnFloor, canPlaceOnWall, canPlaceOnCeiling } - - // Reset placement state for new item - placementState.current = { surface: 'floor', wallId: null, ceilingId: null } - - // ---- Helpers ---- - - const getContext = () => ({ - asset: selectedItem, - levelId: useViewer.getState().selection.levelId, - draftItem: draftNode.current, - gridPosition: gridPosition.current, - state: { ...placementState.current }, - }) - - const revalidate = (): boolean => { - const placeable = checkCanPlace(getContext(), validators) - ;(cursorRef.current.material as MeshStandardMaterial).color.set( - placeable ? 'green' : 'red', - ) - return placeable - } - - const applyTransition = (result: TransitionResult) => { - Object.assign(placementState.current, result.stateUpdate) - gridPosition.current.set(...result.gridPosition) - cursorRef.current.position.set(...result.cursorPosition) - cursorRef.current.rotation.y = result.cursorRotationY - - const draft = draftNode.current - if (draft) { - Object.assign(draft, result.nodeUpdate) - useScene.getState().updateNode(draft.id, result.nodeUpdate) + const cursor = usePlacementCoordinator({ + asset: selectedItem!, + draftNode, + initDraft: (gridPosition) => { + if (!selectedItem?.attachTo) { + draftNode.create(gridPosition, selectedItem!) } - revalidate() - } - - /** - * Create a draft from a transition result on the first valid move. - * If placement is invalid at this position, the draft is immediately destroyed - * so no item appears in the scene until the cursor reaches a valid spot. - */ - const ensureDraft = (result: TransitionResult) => { - gridPosition.current.set(...result.gridPosition) - cursorRef.current.position.set(...result.cursorPosition) - cursorRef.current.rotation.y = result.cursorRotationY - - draftNode.create(gridPosition.current, selectedItem) - - const draft = draftNode.current - if (draft) { - Object.assign(draft, result.nodeUpdate) - useScene.getState().updateNode(draft.id, result.nodeUpdate) - } - - if (!revalidate()) { - draftNode.destroy() - } - } - - // ---- Create initial draft (floor items only) ---- - // Wall/ceiling items are created on surface enter to avoid floating items. - - if (!selectedItem.attachTo) { - draftNode.create(gridPosition.current, selectedItem) - } - revalidate() - - // ---- Floor Handlers ---- - - const onGridMove = (event: GridEvent) => { - const result = floorStrategy.move(getContext(), event) - if (!result) return - - gridPosition.current.set(...result.gridPosition) - cursorRef.current.position.set(...result.cursorPosition) - - const draft = draftNode.current - if (draft) draft.position = result.gridPosition - - revalidate() - } - - const onGridClick = (event: GridEvent) => { - const result = floorStrategy.click(getContext(), event, validators) - if (!result) return - - draftNode.commit(result.nodeUpdate) - draftNode.create(gridPosition.current, selectedItem) - revalidate() - } - - // ---- Wall Handlers ---- - - const onWallEnter = (event: WallEvent) => { - const nodes = useScene.getState().nodes - const result = wallStrategy.enter(getContext(), event, resolveLevelId, nodes) - if (!result) return - - event.stopPropagation() - applyTransition(result) - - // Try to create draft immediately if placement is valid - if (!draftNode.current) { - ensureDraft(result) - } - } - - const onWallMove = (event: WallEvent) => { - const ctx = getContext() - - // If not yet on wall surface (e.g. entered via invalid top face), - // promote this move to an enter when hitting a valid side face. - if (ctx.state.surface !== 'wall') { - const nodes = useScene.getState().nodes - const enterResult = wallStrategy.enter(ctx, event, resolveLevelId, nodes) - if (!enterResult) return - - event.stopPropagation() - applyTransition(enterResult) - return - } - - // No draft yet (first move after enter) — create at current position if valid - if (!draftNode.current) { - const nodes = useScene.getState().nodes - const setup = wallStrategy.enter(getContext(), event, resolveLevelId, nodes) - if (!setup) return - - event.stopPropagation() - ensureDraft(setup) - return - } - - const result = wallStrategy.move(ctx, event) - if (!result) return - - event.stopPropagation() - gridPosition.current.set(...result.gridPosition) - cursorRef.current.position.set(...result.cursorPosition) - cursorRef.current.rotation.y = result.cursorRotationY - - // Sync side/rotation on draft ref (needed by checkCanPlace) - const draft = draftNode.current - if (draft && result.nodeUpdate) { - if ('side' in result.nodeUpdate) draft.side = result.nodeUpdate.side - if ('rotation' in result.nodeUpdate) - draft.rotation = result.nodeUpdate.rotation as [number, number, number] - } - - const placeable = revalidate() - - // Only update mesh + store when placement is valid - if (draft && placeable) { - draft.position = result.gridPosition - const mesh = sceneRegistry.nodes.get(draft.id) - if (mesh) { - mesh.position.copy(gridPosition.current) - const rot = result.nodeUpdate?.rotation - if (rot) mesh.rotation.y = rot[1] - } - if (result.nodeUpdate) { - useScene.getState().updateNode(draft.id, result.nodeUpdate) - } - if (result.dirtyNodeId) { - useScene.getState().dirtyNodes.add(result.dirtyNodeId) - } - } - } - - const onWallClick = (event: WallEvent) => { - const result = wallStrategy.click(getContext(), event, validators) - if (!result) return - - event.stopPropagation() - draftNode.commit(result.nodeUpdate) - if (result.dirtyNodeId) { - useScene.getState().dirtyNodes.add(result.dirtyNodeId) - } - - // Re-enter the wall — applyTransition creates the next draft at the correct position - const nodes = useScene.getState().nodes - const enterResult = wallStrategy.enter(getContext(), event, resolveLevelId, nodes) - if (enterResult) { - applyTransition(enterResult) - } else { - revalidate() - } - } - - const onWallLeave = (event: WallEvent) => { - const result = wallStrategy.leave(getContext()) - if (!result) return - - event.stopPropagation() - - // Wall/ceiling items: destroy draft so it doesn't float on the floor - if (selectedItem.attachTo) { - draftNode.destroy() - Object.assign(placementState.current, result.stateUpdate) - } else { - applyTransition(result) - } - } - - // ---- Ceiling Handlers ---- - - const onCeilingEnter = (event: CeilingEvent) => { - const nodes = useScene.getState().nodes - const result = ceilingStrategy.enter(getContext(), event, resolveLevelId, nodes) - if (!result) return - - event.stopPropagation() - applyTransition(result) - - // Try to create draft immediately if placement is valid - if (!draftNode.current) { - ensureDraft(result) - } - } - - const onCeilingMove = (event: CeilingEvent) => { - // No draft yet (first move after enter) — create at current position if valid - if (!draftNode.current && placementState.current.surface === 'ceiling') { - const nodes = useScene.getState().nodes - const setup = ceilingStrategy.enter(getContext(), event, resolveLevelId, nodes) - if (!setup) return - - event.stopPropagation() - ensureDraft(setup) - return - } - - const result = ceilingStrategy.move(getContext(), event) - if (!result) return - - event.stopPropagation() - gridPosition.current.set(...result.gridPosition) - cursorRef.current.position.set(...result.cursorPosition) - - revalidate() - - const draft = draftNode.current - if (draft) { - draft.position = result.gridPosition - const mesh = sceneRegistry.nodes.get(draft.id) - if (mesh) mesh.position.copy(gridPosition.current) - } - } - - const onCeilingClick = (event: CeilingEvent) => { - const result = ceilingStrategy.click(getContext(), event, validators) - if (!result) return - - event.stopPropagation() - draftNode.commit(result.nodeUpdate) - - // Re-enter the ceiling — applyTransition creates the next draft at the correct position - const nodes = useScene.getState().nodes - const enterResult = ceilingStrategy.enter(getContext(), event, resolveLevelId, nodes) - if (enterResult) { - applyTransition(enterResult) - } else { - revalidate() - } - } - - const onCeilingLeave = (event: CeilingEvent) => { - const result = ceilingStrategy.leave(getContext()) - if (!result) return - - event.stopPropagation() - - // Wall/ceiling items: destroy draft so it doesn't float on the floor - if (selectedItem.attachTo) { - draftNode.destroy() - Object.assign(placementState.current, result.stateUpdate) - } else { - applyTransition(result) - } - } - - // ---- Keyboard rotation ---- - - const ROTATION_STEP = Math.PI / 2 - const onKeyDown = (event: KeyboardEvent) => { - const draft = draftNode.current - if (!draft) return - - let rotationDelta = 0 - if (event.key === 'r' || event.key === 'R') rotationDelta = ROTATION_STEP - else if (event.key === 't' || event.key === 'T') rotationDelta = -ROTATION_STEP - - if (rotationDelta !== 0) { - event.preventDefault() - const currentRotation = draft.rotation - const newRotationY = (currentRotation[1] ?? 0) + rotationDelta - draft.rotation = [currentRotation[0], newRotationY, currentRotation[2]] - - useScene.getState().updateNode(draft.id, { rotation: draft.rotation }) - cursorRef.current.rotation.y = newRotationY - revalidate() - } - } - window.addEventListener('keydown', onKeyDown) - - // ---- Bounding box geometry ---- - - const boxGeometry = new BoxGeometry( - selectedItem.dimensions[0], - selectedItem.dimensions[1], - selectedItem.dimensions[2], - ) - boxGeometry.translate(0, selectedItem.dimensions[1] / 2, 0) - cursorRef.current.geometry = boxGeometry - - // ---- Subscribe ---- - - emitter.on('grid:move', onGridMove) - emitter.on('grid:click', onGridClick) - emitter.on('wall:enter', onWallEnter) - emitter.on('wall:move', onWallMove) - emitter.on('wall:click', onWallClick) - emitter.on('wall:leave', onWallLeave) - emitter.on('ceiling:enter', onCeilingEnter) - emitter.on('ceiling:move', onCeilingMove) - emitter.on('ceiling:click', onCeilingClick) - emitter.on('ceiling:leave', onCeilingLeave) - - return () => { - draftNode.destroy() - useScene.temporal.getState().resume() - emitter.off('grid:move', onGridMove) - emitter.off('grid:click', onGridClick) - emitter.off('wall:enter', onWallEnter) - emitter.off('wall:move', onWallMove) - emitter.off('wall:click', onWallClick) - emitter.off('wall:leave', onWallLeave) - emitter.off('ceiling:enter', onCeilingEnter) - emitter.off('ceiling:move', onCeilingMove) - emitter.off('ceiling:click', onCeilingClick) - emitter.off('ceiling:leave', onCeilingLeave) - window.removeEventListener('keydown', onKeyDown) - } - }, [selectedItem, canPlaceOnFloor, canPlaceOnWall, canPlaceOnCeiling, draftNode]) - - useFrame((_, delta) => { - if (draftNode.current && placementState.current.surface === 'floor') { - const mesh = sceneRegistry.nodes.get(draftNode.current.id) - if (mesh) { - // If distance is large, snap immediately - const distance = mesh.position.distanceToSquared(gridPosition.current) - if (distance > 1) { - mesh.position.copy(gridPosition.current) - return - } - // Otherwise, lerp smoothly - mesh.position.lerp(gridPosition.current, delta * 20) - } - } + }, + onCommitted: () => true, }) - return ( - - - - - - - ) + if (!selectedItem) return null + return <>{cursor} } diff --git a/apps/editor/components/tools/item/move-tool.tsx b/apps/editor/components/tools/item/move-tool.tsx new file mode 100644 index 00000000..77634d2e --- /dev/null +++ b/apps/editor/components/tools/item/move-tool.tsx @@ -0,0 +1,47 @@ +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} +} diff --git a/apps/editor/components/tools/item/use-draft-node.ts b/apps/editor/components/tools/item/use-draft-node.ts index 3c5c6579..b8d93338 100644 --- a/apps/editor/components/tools/item/use-draft-node.ts +++ b/apps/editor/components/tools/item/use-draft-node.ts @@ -5,23 +5,41 @@ import type { Vector3 } from 'three' import type { Asset } from '../../../../../packages/core/src/schema/nodes/item' import { stripTransient } from './placement-math' +interface OriginalState { + position: [number, number, number] + rotation: [number, number, number] + side: ItemNode['side'] + parentId: string | null + metadata: ItemNode['metadata'] +} + export interface DraftNodeHandle { /** Current draft item, or null */ readonly current: ItemNode | null + /** Whether the current draft was adopted (move mode) vs created (create mode) */ + readonly isAdopted: boolean /** Create a new draft item at the given position. Returns the created node or null. */ create: (gridPosition: Vector3, asset: Asset) => ItemNode | null - /** Commit the current draft: delete draft (paused), resume, create fresh node (tracked), re-pause. */ + /** Take ownership of an existing scene node as the draft (for move mode). */ + adopt: (node: ItemNode) => void + /** Commit the current draft. Create mode: delete+recreate. Move mode: update in place. */ commit: (finalUpdate: Partial) => string | null - /** Destroy the current draft: delete node (stays paused, no undo entry). */ + /** Destroy the current draft. Create mode: delete node. Move mode: restore original state. */ destroy: () => void } /** * Hook that manages the lifecycle of a transient (draft) item node. * Handles temporal pause/resume for undo/redo isolation. + * + * Supports two modes: + * - Create mode (via `create()`): draft is a new transient node. Commit = delete+recreate (undo removes node). + * - Move mode (via `adopt()`): draft is an existing node. Commit = update in place (undo reverts position). */ export function useDraftNode(): DraftNodeHandle { const draftRef = useRef(null) + const adoptedRef = useRef(false) + const originalStateRef = useRef(null) const create = useCallback((gridPosition: Vector3, asset: Asset): ItemNode | null => { const currentLevelId = useViewer.getState().selection.levelId @@ -33,17 +51,77 @@ export function useDraftNode(): DraftNodeHandle { asset, metadata: { isTransient: true }, }) - console.log('create node', node) useScene.getState().createNode(node, currentLevelId) draftRef.current = node + adoptedRef.current = false + originalStateRef.current = null return node }, []) + const adopt = useCallback((node: ItemNode): void => { + // Save original state so destroy() can restore it + const meta = (typeof node.metadata === 'object' && node.metadata !== null && !Array.isArray(node.metadata)) + ? node.metadata as Record + : {} + + originalStateRef.current = { + position: [...node.position] as [number, number, number], + rotation: [...node.rotation] as [number, number, number], + side: node.side, + parentId: node.parentId, + metadata: node.metadata, + } + + draftRef.current = node + adoptedRef.current = true + + // Mark as transient so it renders as a draft + useScene.getState().updateNode(node.id, { + metadata: { ...meta, isTransient: true }, + }) + }, []) + const commit = useCallback((finalUpdate: Partial): string | null => { const draft = draftRef.current if (!draft) return null + if (adoptedRef.current) { + // Move mode: update in place (single undoable action) + const { parentId: newParentId, ...updateProps } = finalUpdate + const parentId = newParentId ?? originalStateRef.current?.parentId ?? useViewer.getState().selection.levelId + const original = originalStateRef.current! + + // Restore original state while paused — so the undo baseline is clean + useScene.getState().updateNode(draft.id, { + position: original.position, + rotation: original.rotation, + side: original.side, + parentId: original.parentId, + metadata: original.metadata, + }) + + // Resume → tracked update (undo reverts to original) + useScene.temporal.getState().resume() + + useScene.getState().updateNode(draft.id, { + position: updateProps.position ?? draft.position, + rotation: updateProps.rotation ?? draft.rotation, + side: updateProps.side ?? draft.side, + metadata: updateProps.metadata ?? stripTransient(draft.metadata), + parentId: parentId as string, + }) + + useScene.temporal.getState().pause() + + const id = draft.id + draftRef.current = null + adoptedRef.current = false + originalStateRef.current = null + return id + } + + // Create mode: delete draft (paused), resume, create fresh node (tracked), re-pause const { parentId: newParentId, ...updateProps } = finalUpdate const parentId = (newParentId ?? useViewer.getState().selection.levelId) as AnyNodeId if (!parentId) return null @@ -68,14 +146,33 @@ export function useDraftNode(): DraftNodeHandle { // Re-pause for next draft cycle useScene.temporal.getState().pause() + adoptedRef.current = false + originalStateRef.current = null return finalNode.id }, []) const destroy = useCallback(() => { - if (draftRef.current) { + if (!draftRef.current) return + + if (adoptedRef.current && originalStateRef.current) { + // Move mode: restore original state instead of deleting + const original = originalStateRef.current + + useScene.getState().updateNode(draftRef.current.id, { + position: original.position, + rotation: original.rotation, + side: original.side, + parentId: original.parentId, + metadata: original.metadata, + }) + } else { + // Create mode: delete the transient node useScene.getState().deleteNode(draftRef.current.id) - draftRef.current = null } + + draftRef.current = null + adoptedRef.current = false + originalStateRef.current = null }, []) return useMemo( @@ -83,10 +180,14 @@ export function useDraftNode(): DraftNodeHandle { get current() { return draftRef.current }, + get isAdopted() { + return adoptedRef.current + }, create, + adopt, commit, destroy, }), - [create, commit, destroy], + [create, adopt, commit, destroy], ) } diff --git a/apps/editor/components/tools/item/use-placement-coordinator.tsx b/apps/editor/components/tools/item/use-placement-coordinator.tsx new file mode 100644 index 00000000..302391f8 --- /dev/null +++ b/apps/editor/components/tools/item/use-placement-coordinator.tsx @@ -0,0 +1,443 @@ +import { + type CeilingEvent, + emitter, + type GridEvent, + sceneRegistry, + useScene, + useSpatialQuery, + type WallEvent, +} from '@pascal-app/core' +import { useViewer } from '@pascal-app/viewer' +import { useFrame } from '@react-three/fiber' +import { useEffect, useRef } from 'react' +import { BoxGeometry, type Mesh, type MeshStandardMaterial, Vector3 } from 'three' +import { resolveLevelId } from '../../../../../packages/core/src/hooks/spatial-grid/spatial-grid-sync' +import { + ceilingStrategy, + checkCanPlace, + floorStrategy, + wallStrategy, +} from './placement-strategies' +import type { PlacementState, TransitionResult } from './placement-types' +import type { DraftNodeHandle } from './use-draft-node' +import type { Asset } from '../../../../../packages/core/src/schema/nodes/item' + +export interface PlacementCoordinatorConfig { + asset: Asset + draftNode: DraftNodeHandle + initDraft: (gridPosition: Vector3) => void + onCommitted: () => boolean + onCancel?: () => void + initialState?: PlacementState +} + +export function usePlacementCoordinator(config: PlacementCoordinatorConfig): React.ReactNode { + const cursorRef = useRef(null!) + const gridPosition = useRef(new Vector3(0, 0, 0)) + const placementState = useRef( + config.initialState ?? { surface: 'floor', wallId: null, ceilingId: null }, + ) + + const { canPlaceOnFloor, canPlaceOnWall, canPlaceOnCeiling } = useSpatialQuery() + const { asset, draftNode } = config + + useEffect(() => { + useScene.temporal.getState().pause() + + const validators = { canPlaceOnFloor, canPlaceOnWall, canPlaceOnCeiling } + + // Reset placement state + placementState.current = config.initialState ?? { + surface: 'floor', + wallId: null, + ceilingId: null, + } + + // ---- Helpers ---- + + const getContext = () => ({ + asset, + levelId: useViewer.getState().selection.levelId, + draftItem: draftNode.current, + gridPosition: gridPosition.current, + state: { ...placementState.current }, + }) + + const revalidate = (): boolean => { + const placeable = checkCanPlace(getContext(), validators) + ;(cursorRef.current.material as MeshStandardMaterial).color.set( + placeable ? 'green' : 'red', + ) + return placeable + } + + const applyTransition = (result: TransitionResult) => { + Object.assign(placementState.current, result.stateUpdate) + gridPosition.current.set(...result.gridPosition) + cursorRef.current.position.set(...result.cursorPosition) + cursorRef.current.rotation.y = result.cursorRotationY + + const draft = draftNode.current + if (draft) { + Object.assign(draft, result.nodeUpdate) + // In move mode, skip store updates — only the ref + mesh matter during drag + if (!draftNode.isAdopted) { + useScene.getState().updateNode(draft.id, result.nodeUpdate) + } + } + revalidate() + } + + const ensureDraft = (result: TransitionResult) => { + gridPosition.current.set(...result.gridPosition) + cursorRef.current.position.set(...result.cursorPosition) + cursorRef.current.rotation.y = result.cursorRotationY + + draftNode.create(gridPosition.current, asset) + + const draft = draftNode.current + if (draft) { + Object.assign(draft, result.nodeUpdate) + if (!draftNode.isAdopted) { + useScene.getState().updateNode(draft.id, result.nodeUpdate) + } + } + + if (!revalidate()) { + draftNode.destroy() + } + } + + // ---- Init draft ---- + config.initDraft(gridPosition.current) + + // Sync cursor to the draft mesh's world position (handles floor + wall/ceiling items) + if (draftNode.current) { + const mesh = sceneRegistry.nodes.get(draftNode.current.id) + if (mesh) { + mesh.getWorldPosition(cursorRef.current.position) + } else { + cursorRef.current.position.copy(gridPosition.current) + } + } + + revalidate() + + // ---- Floor Handlers ---- + + const onGridMove = (event: GridEvent) => { + const result = floorStrategy.move(getContext(), event) + if (!result) return + + gridPosition.current.set(...result.gridPosition) + cursorRef.current.position.set(...result.cursorPosition) + + const draft = draftNode.current + if (draft) draft.position = result.gridPosition + + revalidate() + } + + const onGridClick = (event: GridEvent) => { + const result = floorStrategy.click(getContext(), event, validators) + if (!result) return + + draftNode.commit(result.nodeUpdate) + if (config.onCommitted()) { + draftNode.create(gridPosition.current, asset) + revalidate() + } + } + + // ---- Wall Handlers ---- + + const onWallEnter = (event: WallEvent) => { + const nodes = useScene.getState().nodes + const result = wallStrategy.enter(getContext(), event, resolveLevelId, nodes) + if (!result) return + + event.stopPropagation() + applyTransition(result) + + if (!draftNode.current) { + ensureDraft(result) + } + } + + const onWallMove = (event: WallEvent) => { + const ctx = getContext() + + if (ctx.state.surface !== 'wall') { + const nodes = useScene.getState().nodes + const enterResult = wallStrategy.enter(ctx, event, resolveLevelId, nodes) + if (!enterResult) return + + event.stopPropagation() + applyTransition(enterResult) + return + } + + if (!draftNode.current) { + const nodes = useScene.getState().nodes + const setup = wallStrategy.enter(getContext(), event, resolveLevelId, nodes) + if (!setup) return + + event.stopPropagation() + ensureDraft(setup) + return + } + + const result = wallStrategy.move(ctx, event) + if (!result) return + + event.stopPropagation() + gridPosition.current.set(...result.gridPosition) + cursorRef.current.position.set(...result.cursorPosition) + cursorRef.current.rotation.y = result.cursorRotationY + + const draft = draftNode.current + if (draft && result.nodeUpdate) { + if ('side' in result.nodeUpdate) draft.side = result.nodeUpdate.side + if ('rotation' in result.nodeUpdate) + draft.rotation = result.nodeUpdate.rotation as [number, number, number] + } + + const placeable = revalidate() + + if (draft && placeable) { + draft.position = result.gridPosition + const mesh = sceneRegistry.nodes.get(draft.id) + if (mesh) { + mesh.position.copy(gridPosition.current) + const rot = result.nodeUpdate?.rotation + if (rot) mesh.rotation.y = rot[1] + } + // In move mode, skip store updates — only the ref + mesh matter during drag + if (!draftNode.isAdopted) { + if (result.nodeUpdate) { + useScene.getState().updateNode(draft.id, result.nodeUpdate) + } + if (result.dirtyNodeId) { + useScene.getState().dirtyNodes.add(result.dirtyNodeId) + } + } + } + } + + const onWallClick = (event: WallEvent) => { + const result = wallStrategy.click(getContext(), event, validators) + if (!result) return + + event.stopPropagation() + draftNode.commit(result.nodeUpdate) + if (result.dirtyNodeId) { + useScene.getState().dirtyNodes.add(result.dirtyNodeId) + } + + if (config.onCommitted()) { + const nodes = useScene.getState().nodes + const enterResult = wallStrategy.enter(getContext(), event, resolveLevelId, nodes) + if (enterResult) { + applyTransition(enterResult) + } else { + revalidate() + } + } + } + + const onWallLeave = (event: WallEvent) => { + const result = wallStrategy.leave(getContext()) + if (!result) return + + event.stopPropagation() + + if (asset.attachTo) { + draftNode.destroy() + Object.assign(placementState.current, result.stateUpdate) + } else { + applyTransition(result) + } + } + + // ---- Ceiling Handlers ---- + + const onCeilingEnter = (event: CeilingEvent) => { + const nodes = useScene.getState().nodes + const result = ceilingStrategy.enter(getContext(), event, resolveLevelId, nodes) + if (!result) return + + event.stopPropagation() + applyTransition(result) + + if (!draftNode.current) { + ensureDraft(result) + } + } + + const onCeilingMove = (event: CeilingEvent) => { + if (!draftNode.current && placementState.current.surface === 'ceiling') { + const nodes = useScene.getState().nodes + const setup = ceilingStrategy.enter(getContext(), event, resolveLevelId, nodes) + if (!setup) return + + event.stopPropagation() + ensureDraft(setup) + return + } + + const result = ceilingStrategy.move(getContext(), event) + if (!result) return + + event.stopPropagation() + gridPosition.current.set(...result.gridPosition) + cursorRef.current.position.set(...result.cursorPosition) + + revalidate() + + const draft = draftNode.current + if (draft) { + draft.position = result.gridPosition + const mesh = sceneRegistry.nodes.get(draft.id) + if (mesh) mesh.position.copy(gridPosition.current) + } + } + + const onCeilingClick = (event: CeilingEvent) => { + const result = ceilingStrategy.click(getContext(), event, validators) + if (!result) return + + event.stopPropagation() + draftNode.commit(result.nodeUpdate) + + if (config.onCommitted()) { + const nodes = useScene.getState().nodes + const enterResult = ceilingStrategy.enter(getContext(), event, resolveLevelId, nodes) + if (enterResult) { + applyTransition(enterResult) + } else { + revalidate() + } + } + } + + const onCeilingLeave = (event: CeilingEvent) => { + const result = ceilingStrategy.leave(getContext()) + if (!result) return + + event.stopPropagation() + + if (asset.attachTo) { + draftNode.destroy() + Object.assign(placementState.current, result.stateUpdate) + } else { + applyTransition(result) + } + } + + // ---- Keyboard rotation ---- + + const ROTATION_STEP = Math.PI / 2 + const onKeyDown = (event: KeyboardEvent) => { + // Escape / right-click → cancel + if (event.key === 'Escape' && config.onCancel) { + event.preventDefault() + config.onCancel() + return + } + + const draft = draftNode.current + if (!draft) return + + let rotationDelta = 0 + if (event.key === 'r' || event.key === 'R') rotationDelta = ROTATION_STEP + else if (event.key === 't' || event.key === 'T') rotationDelta = -ROTATION_STEP + + if (rotationDelta !== 0) { + event.preventDefault() + const currentRotation = draft.rotation + const newRotationY = (currentRotation[1] ?? 0) + rotationDelta + draft.rotation = [currentRotation[0], newRotationY, currentRotation[2]] + + // In move mode, skip store update — only the ref + cursor mesh matter during drag + if (!draftNode.isAdopted) { + useScene.getState().updateNode(draft.id, { rotation: draft.rotation }) + } + cursorRef.current.rotation.y = newRotationY + revalidate() + } + } + window.addEventListener('keydown', onKeyDown) + + // ---- Right-click cancel ---- + const onContextMenu = (event: MouseEvent) => { + if (config.onCancel) { + event.preventDefault() + config.onCancel() + } + } + window.addEventListener('contextmenu', onContextMenu) + + // ---- Bounding box geometry ---- + + const boxGeometry = new BoxGeometry( + asset.dimensions[0], + asset.dimensions[1], + asset.dimensions[2], + ) + boxGeometry.translate(0, asset.dimensions[1] / 2, 0) + cursorRef.current.geometry = boxGeometry + + // ---- Subscribe ---- + + emitter.on('grid:move', onGridMove) + emitter.on('grid:click', onGridClick) + emitter.on('wall:enter', onWallEnter) + emitter.on('wall:move', onWallMove) + emitter.on('wall:click', onWallClick) + emitter.on('wall:leave', onWallLeave) + emitter.on('ceiling:enter', onCeilingEnter) + emitter.on('ceiling:move', onCeilingMove) + emitter.on('ceiling:click', onCeilingClick) + emitter.on('ceiling:leave', onCeilingLeave) + + return () => { + draftNode.destroy() + useScene.temporal.getState().resume() + emitter.off('grid:move', onGridMove) + emitter.off('grid:click', onGridClick) + emitter.off('wall:enter', onWallEnter) + emitter.off('wall:move', onWallMove) + emitter.off('wall:click', onWallClick) + emitter.off('wall:leave', onWallLeave) + emitter.off('ceiling:enter', onCeilingEnter) + emitter.off('ceiling:move', onCeilingMove) + emitter.off('ceiling:click', onCeilingClick) + emitter.off('ceiling:leave', onCeilingLeave) + window.removeEventListener('keydown', onKeyDown) + window.removeEventListener('contextmenu', onContextMenu) + } + }, [asset, canPlaceOnFloor, canPlaceOnWall, canPlaceOnCeiling, draftNode]) + + useFrame((_, delta) => { + if (draftNode.current && placementState.current.surface === 'floor') { + const mesh = sceneRegistry.nodes.get(draftNode.current.id) + if (mesh) { + const distance = mesh.position.distanceToSquared(gridPosition.current) + if (distance > 1) { + mesh.position.copy(gridPosition.current) + return + } + mesh.position.lerp(gridPosition.current, delta * 20) + } + } + }) + + return ( + + + + + + + ) +} diff --git a/apps/editor/components/tools/tool-manager.tsx b/apps/editor/components/tools/tool-manager.tsx index cb245217..ac884c60 100644 --- a/apps/editor/components/tools/tool-manager.tsx +++ b/apps/editor/components/tools/tool-manager.tsx @@ -2,6 +2,7 @@ import useEditor, { type Phase, type Tool } from "@/store/use-editor"; import { useViewer } from "@pascal-app/viewer"; import { CeilingTool } from "./ceiling/ceiling-tool"; import { ItemTool } from "./item/item-tool"; +import { MoveTool } from "./item/move-tool"; import { SlabTool } from "./slab/slab-tool"; import { WallTool } from "./wall/wall-tool"; import { ZoneBoundaryEditor } from "./zone/zone-boundary-editor"; @@ -25,6 +26,7 @@ export const ToolManager: React.FC = () => { const phase = useEditor((state) => state.phase); const mode = useEditor((state) => state.mode); const tool = useEditor((state) => state.tool); + const movingNode = useEditor((state) => state.movingNode); const selectedZoneId = useViewer((state) => state.selection.zoneId); // Show zone boundary editor when in structure/select mode with a zone selected @@ -39,7 +41,8 @@ export const ToolManager: React.FC = () => { return ( <> {showZoneBoundaryEditor && } - {BuildToolComponent && } + {movingNode && } + {!movingNode && BuildToolComponent && } ); }; diff --git a/apps/editor/components/ui/item-catalog/catalog-items.tsx b/apps/editor/components/ui/item-catalog/catalog-items.tsx index ecf64c96..42eb2a55 100644 --- a/apps/editor/components/ui/item-catalog/catalog-items.tsx +++ b/apps/editor/components/ui/item-catalog/catalog-items.tsx @@ -30,7 +30,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "hydrant", - "category": "furniture", + "category": "appliance", "name": "hydrant", "thumbnail": "/items/hydrant/thumbnail.webp", "src": "/items/hydrant/model.glb", @@ -58,7 +58,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "sunbed", - "category": "furniture", + "category": "outdoor", "name": "sunbed", "thumbnail": "/items/sunbed/thumbnail.webp", "src": "/items/sunbed/model.glb", @@ -86,19 +86,19 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "palm", - "category": "furniture", + "category": "outdoor", "name": "palm", "thumbnail": "/items/palm/thumbnail.webp", "src": "/items/palm/model.glb", "scale": [ 0.37, - 0.37000000000000005, + 0.37, 0.37 ], "offset": [ - 0.13999999999999999, 0, - -0.20000000000000007 + 0, + 0.02 ], "rotation": [ 0, @@ -106,15 +106,15 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 3.500000000000003, - 4.500000000000007, - 3.500000000000004 + 1, + 4.5, + 1 ] }, { "id": "fence", - "category": "furniture", + "category": "outdoor", "name": "fence", "thumbnail": "/items/fence/thumbnail.webp", "src": "/items/fence/model.glb", @@ -142,7 +142,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "patio-umbrella", - "category": "furniture", + "category": "outdoor", "name": "patio-umbrella", "thumbnail": "/items/patio-umbrella/thumbnail.webp", "src": "/items/patio-umbrella/model.glb", @@ -154,7 +154,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ "offset": [ 0, 0, - 0.09 + 0 ], "rotation": [ 0, @@ -162,9 +162,9 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 3.500000000000003, - 3.0000000000000013, - 3.500000000000002 + 1, + 3, + 1 ] }, @@ -198,7 +198,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "smoke-detector", - "category": "furniture", + "category": "appliance", "name": "smoke-detector", "thumbnail": "/items/smoke-detector/thumbnail.webp", "src": "/items/smoke-detector/model.glb", @@ -256,7 +256,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "sprinkler", - "category": "furniture", + "category": "appliance", "name": "sprinkler", "thumbnail": "/items/sprinkler/thumbnail.webp", "src": "/items/sprinkler/model.glb", @@ -314,7 +314,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "ceiling-fan", - "category": "furniture", + "category": "appliance", "name": "ceiling-fan", "thumbnail": "/items/ceiling-fan/thumbnail.webp", "src": "/items/ceiling-fan/model.glb", @@ -363,9 +363,9 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 2, - 2, - 0.4 + 1.9999999999999991, + 2.0000000000000004, + 0.39999999999999936 ], "attachTo": "wall" }, @@ -401,7 +401,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "glass-door", - "category": "furniture", + "category": "door", "name": "glass-door", "thumbnail": "/items/glass-door/thumbnail.webp", "src": "/items/glass-door/model.glb", @@ -430,7 +430,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "door", - "category": "furniture", + "category": "door", "name": "door", "thumbnail": "/items/door/thumbnail.webp", "src": "/items/door/model.glb", @@ -459,7 +459,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "thermostat", - "category": "furniture", + "category": "appliance", "name": "thermostat", "thumbnail": "/items/thermostat/thumbnail.webp", "src": "/items/thermostat/model.glb", @@ -489,7 +489,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "parking-spot", - "category": "furniture", + "category": "outdoor", "name": "parking-spot", "thumbnail": "/items/parking-spot/thumbnail.webp", "src": "/items/parking-spot/model.glb", @@ -517,7 +517,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "ac-block", - "category": "furniture", + "category": "appliance", "name": "ac-block", "thumbnail": "/items/ac-block/thumbnail.webp", "src": "/items/ac-block/model.glb", @@ -545,7 +545,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "fire-detector", - "category": "furniture", + "category": "appliance", "name": "fire-detector", "thumbnail": "/items/fire-detector/thumbnail.webp", "src": "/items/fire-detector/model.glb", @@ -574,7 +574,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "exit-sign", - "category": "furniture", + "category": "appliance", "name": "exit-sign", "thumbnail": "/items/exit-sign/thumbnail.webp", "src": "/items/exit-sign/model.glb", @@ -594,28 +594,28 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 0.9999999999999999, + 1, 0.5, - 0.30000000000000004 + 0.3 ], - "attachTo": "wall" + "attachTo": "wall-side" }, { "id": "electric-panel", - "category": "furniture", + "category": "appliance", "name": "electric-panel", "thumbnail": "/items/electric-panel/thumbnail.webp", "src": "/items/electric-panel/model.glb", "scale": [ - 0.6100000000000002, - 0.7399999999999999, + 0.61, + 0.74, 0.7 ], "offset": [ 0, 0, - 0.060000000000000005 + 0.06 ], "rotation": [ 0, @@ -623,17 +623,17 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 0.5000000000000001, - 0.9999999999999999, - 0.30000000000000004 + 0.5, + 1, + 0.3 ], - "attachTo": "wall" + "attachTo": "wall-side" }, { "id": "alarm-keypad", - "category": "furniture", + "category": "appliance", "name": "alarm-keypad", "thumbnail": "/items/alarm-keypad/thumbnail.webp", "src": "/items/alarm-keypad/model.glb", @@ -671,9 +671,9 @@ export const CATALOG_ITEMS: AssetInput[] = [ 1 ], "offset": [ - -0.08, 0, - 0.020000000000000004 + 0.1, + 0.01 ], "rotation": [ 0, @@ -681,10 +681,11 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 0.500000000000001, - 0.30000000000000004, - 0.5000000000000003 - ] + 1, + 0.5, + 0.7 + ], + "attachTo": "wall-side" }, { @@ -745,7 +746,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "skate", - "category": "furniture", + "category": "outdoor", "name": "skate", "thumbnail": "/items/skate/thumbnail.webp", "src": "/items/skate/model.glb", @@ -801,7 +802,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "outdoor-playhouse", - "category": "furniture", + "category": "outdoor", "name": "outdoor-playhouse", "thumbnail": "/items/outdoor-playhouse/thumbnail.webp", "src": "/items/outdoor-playhouse/model.glb", @@ -829,7 +830,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "scooter", - "category": "furniture", + "category": "outdoor", "name": "scooter", "thumbnail": "/items/scooter/thumbnail.webp", "src": "/items/scooter/model.glb", @@ -857,7 +858,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "basket-hoop", - "category": "furniture", + "category": "outdoor", "name": "basket-hoop", "thumbnail": "/items/basket-hoop/thumbnail.webp", "src": "/items/basket-hoop/model.glb", @@ -941,7 +942,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "hood", - "category": "furniture", + "category": "kitchen", "name": "hood", "thumbnail": "/items/hood/thumbnail.webp", "src": "/items/hood/model.glb", @@ -952,8 +953,8 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "offset": [ 0, - 0.5200000000000002, - 0.00999999999999999 + 0.52, + 0.01 ], "rotation": [ 0, @@ -961,16 +962,16 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 1.5000000000000016, + 1.5, 1, - 1.1000000000000003 + 1.1 ], - "attachTo": "wall" + "attachTo": "wall-side" }, { "id": "kitchen-shelf", - "category": "furniture", + "category": "kitchen", "name": "kitchen-shelf", "thumbnail": "/items/kitchen-shelf/thumbnail.webp", "src": "/items/kitchen-shelf/model.glb", @@ -981,8 +982,8 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "offset": [ 0, - 0.5200000000000002, - 0.00999999999999999 + 0.52, + 0.01 ], "rotation": [ 0, @@ -990,11 +991,11 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 2.500000000000002, + 2.5, 1, - 1.1000000000000003 + 1.1 ], - "attachTo": "wall" + "attachTo": "wall-side" }, { @@ -1027,7 +1028,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "drying-rack", - "category": "furniture", + "category": "bathroom", "name": "drying-rack", "thumbnail": "/items/drying-rack/thumbnail.webp", "src": "/items/drying-rack/model.glb", @@ -1066,8 +1067,8 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "offset": [ 0, - 0.19000000000000003, - 0.11999999999999998 + 0.19, + 0.12 ], "rotation": [ 0, @@ -1075,16 +1076,16 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 0.5000000000000008, 0.5, - 0.5000000000000003 + 0.5, + 0.5 ], "attachTo": "wall-side" }, { "id": "cutting-board", - "category": "furniture", + "category": "kitchen", "name": "cutting-board", "thumbnail": "/items/cutting-board/thumbnail.webp", "src": "/items/cutting-board/model.glb", @@ -1112,7 +1113,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "frying-pan", - "category": "furniture", + "category": "kitchen", "name": "frying-pan", "thumbnail": "/items/frying-pan/thumbnail.webp", "src": "/items/frying-pan/model.glb", @@ -1140,7 +1141,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "kitchen-utensils", - "category": "furniture", + "category": "kitchen", "name": "kitchen-utensils", "thumbnail": "/items/kitchen-utensils/thumbnail.webp", "src": "/items/kitchen-utensils/model.glb", @@ -1168,7 +1169,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "kitchen-counter", - "category": "furniture", + "category": "kitchen", "name": "kitchen-counter", "thumbnail": "/items/kitchen-counter/thumbnail.webp", "src": "/items/kitchen-counter/model.glb", @@ -1196,7 +1197,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "kitchen-cabinet", - "category": "furniture", + "category": "kitchen", "name": "kitchen-cabinet", "thumbnail": "/items/kitchen-cabinet/thumbnail.webp", "src": "/items/kitchen-cabinet/model.glb", @@ -1336,7 +1337,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "television", - "category": "furniture", + "category": "appliance", "name": "television", "thumbnail": "/items/television/thumbnail.webp", "src": "/items/television/model.glb", @@ -1392,7 +1393,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "air-conditioning", - "category": "furniture", + "category": "appliance", "name": "air-conditioning", "thumbnail": "/items/air-conditioning/thumbnail.webp", "src": "/items/air-conditioning/model.glb", @@ -1403,8 +1404,8 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "offset": [ 0, - 0.37000000000000016, - 0.21000000000000005 + 0.37, + 0.21 ], "rotation": [ 0, @@ -1414,14 +1415,14 @@ export const CATALOG_ITEMS: AssetInput[] = [ "dimensions": [ 2, 1, - 0.8999999999999999 + 0.9 ], - "attachTo": "wall" + "attachTo": "wall-side" }, { "id": "sewing-machine", - "category": "furniture", + "category": "appliance", "name": "sewing-machine", "thumbnail": "/items/sewing-machine/thumbnail.webp", "src": "/items/sewing-machine/model.glb", @@ -1533,7 +1534,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "toaster", - "category": "furniture", + "category": "appliance", "name": "toaster", "thumbnail": "/items/toaster/thumbnail.webp", "src": "/items/toaster/model.glb", @@ -1618,7 +1619,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "kettle", - "category": "furniture", + "category": "appliance", "name": "kettle", "thumbnail": "/items/kettle/thumbnail.webp", "src": "/items/kettle/model.glb", @@ -1646,7 +1647,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "iron", - "category": "furniture", + "category": "appliance", "name": "iron", "thumbnail": "/items/iron/thumbnail.webp", "src": "/items/iron/model.glb", @@ -1760,7 +1761,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "coffee-machine", - "category": "furniture", + "category": "appliance", "name": "coffee-machine", "thumbnail": "/items/coffee-machine/thumbnail.webp", "src": "/items/coffee-machine/model.glb", @@ -1788,7 +1789,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "wine-bottle", - "category": "furniture", + "category": "kitchen", "name": "wine-bottle", "thumbnail": "/items/wine-bottle/thumbnail.webp", "src": "/items/wine-bottle/model.glb", @@ -1816,7 +1817,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "fruits", - "category": "furniture", + "category": "kitchen", "name": "fruits", "thumbnail": "/items/fruits/thumbnail.webp", "src": "/items/fruits/model.glb", @@ -1868,7 +1869,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ 1, 0.1 ], - "attachTo": "wall" + "attachTo": "wall-side" }, { @@ -1901,7 +1902,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "ball", - "category": "furniture", + "category": "outdoor", "name": "ball", "thumbnail": "/items/ball/thumbnail.webp", "src": "/items/ball/model.glb", @@ -1950,7 +1951,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "dimensions": [ 1.5, - 1, + 0.8, 1 ] }, @@ -2037,12 +2038,12 @@ export const CATALOG_ITEMS: AssetInput[] = [ 1, 0.2 ], - "attachTo": "wall" + "attachTo": "wall-side" }, { "id": "stereo-speaker", - "category": "furniture", + "category": "appliance", "name": "stereo-speaker", "thumbnail": "/items/stereo-speaker/thumbnail.webp", "src": "/items/stereo-speaker/model.glb", @@ -2098,7 +2099,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "stove", - "category": "furniture", + "category": "kitchen", "name": "stove", "thumbnail": "/items/stove/thumbnail.webp", "src": "/items/stove/model.glb", @@ -2126,7 +2127,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "fridge", - "category": "furniture", + "category": "kitchen", "name": "fridge", "thumbnail": "/items/fridge/thumbnail.webp", "src": "/items/fridge/model.glb", @@ -2154,7 +2155,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "kitchen", - "category": "furniture", + "category": "kitchen", "name": "kitchen", "thumbnail": "/items/kitchen/thumbnail.webp", "src": "/items/kitchen/model.glb", @@ -2182,7 +2183,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "microwave", - "category": "furniture", + "category": "kitchen", "name": "microwave", "thumbnail": "/items/microwave/thumbnail.webp", "src": "/items/microwave/model.glb", @@ -2322,7 +2323,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "washing-machine", - "category": "furniture", + "category": "bathroom", "name": "washing-machine", "thumbnail": "/items/washing-machine/thumbnail.webp", "src": "/items/washing-machine/model.glb", @@ -2350,7 +2351,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "laundry-bag", - "category": "furniture", + "category": "bathroom", "name": "laundry-bag", "thumbnail": "/items/laundry-bag/thumbnail.webp", "src": "/items/laundry-bag/model.glb", @@ -2378,7 +2379,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "shower-angle", - "category": "furniture", + "category": "bathroom", "name": "shower-angle", "thumbnail": "/items/shower-angle/thumbnail.webp", "src": "/items/shower-angle/model.glb", @@ -2406,7 +2407,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "bathtub", - "category": "furniture", + "category": "bathroom", "name": "bathtub", "thumbnail": "/items/bathtub/thumbnail.webp", "src": "/items/bathtub/model.glb", @@ -2427,14 +2428,14 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "dimensions": [ 2.5, - 1, + 0.8, 1.5 ] }, { "id": "toilet", - "category": "furniture", + "category": "bathroom", "name": "toilet", "thumbnail": "/items/toilet/thumbnail.webp", "src": "/items/toilet/model.glb", @@ -2455,7 +2456,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "dimensions": [ 1, - 1, + 0.9, 1 ] }, @@ -2483,14 +2484,14 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "dimensions": [ 2.5, - 1, + 0.8, 1.5 ] }, { "id": "shower-square", - "category": "furniture", + "category": "bathroom", "name": "shower-square", "thumbnail": "/items/shower-square/thumbnail.webp", "src": "/items/shower-square/model.glb", @@ -2518,7 +2519,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "bathroom-sink", - "category": "furniture", + "category": "bathroom", "name": "bathroom-sink", "thumbnail": "/items/bathroom-sink/thumbnail.webp", "src": "/items/bathroom-sink/model.glb", @@ -2547,7 +2548,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ { "id": "coffee-table", "category": "furniture", - "name": "Coffee-table", + "name": "coffee-table", "thumbnail": "/items/coffee-table/thumbnail.webp", "src": "/items/coffee-table/model.glb", "scale": [ @@ -2566,16 +2567,16 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0 ], "dimensions": [ - 2.0, - 0.5, + 2, + 0.4, 1.5 ] }, { "id": "computer", - "category": "furniture", - "name": "Computer", + "category": "appliance", + "name": "computer", "thumbnail": "/items/computer/thumbnail.webp", "src": "/items/computer/model.glb", "scale": [ @@ -2624,7 +2625,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "dimensions": [ 1.5, - 1, + 0.8, 1.5 ] }, @@ -2652,7 +2653,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "dimensions": [ 1, - 1.5, + 1.2, 1 ] }, @@ -2708,7 +2709,7 @@ export const CATALOG_ITEMS: AssetInput[] = [ ], "dimensions": [ 2.5, - 1, + 0.8, 1 ] }, @@ -2796,32 +2797,5 @@ export const CATALOG_ITEMS: AssetInput[] = [ 0.30000000000000004 ], "attachTo": "wall" - }, - { - "id": "couch-medium", - "category": "furniture", - "name": "Couch", - "thumbnail": "/items/couch-medium/thumbnail.webp", - "src": "/items/couch-medium/model.glb", - "scale": [ - 0.39, - 0.39, - 0.39 - ], - "offset": [ - 0, - 0, - 0.03 - ], - "rotation": [ - 0, - 0, - 0 - ], - "dimensions": [ - 2, - 0.8, - 1 - ] - }, + } ]; diff --git a/apps/editor/public/items/glass-door/model.glb b/apps/editor/public/items/glass-door/model.glb index 22e441f5619ea1e1dcafacfaee762d78017f266b..5abb96db3c5bffc17f6d211332860ce2abda488e 100644 GIT binary patch delta 3049 zcmZA330Ra>7YFeF9}or@mRN>GltpkIU%mO;hWr zS-GIJpeCqeN<~O!Wm-mQnw7XlmR7cX^|jb{pnUrBd7tw;=bd}sb7AJrb7%W*uG~Yv zNmEJ&x&c@@1~{<8FN0Fy9_=b;C$~MFDcqCaYR#&V0MK^bwJyi~QCdmRr zqy&2<%ew}P%- zN}T>-l4QMKN^=9HF4!nlxkkCt*H5OU7-d6tu+(LSy7E(8ZsMQYOO}TOYj;oAg49TN zsmqQRe}AKtW?8iB?2ad!vi#&?c7T-XYFF%L>2Hdaz5Wr>keT&FzZ7Z8^>LN-i*u7Y zlSP(g2kq=X$lYh(_ote^Ee+59$=x-4K!dv^rT9y8Zlsjv8D)K57pc#)x-OV<++;;T zj06r05%WN!g7_St^f%YtkB{#TwMi}Tk z#>cS=$G8f|`5|w{Xne@gILePW1~=g&-h>Z$mRoTn&hkba<_L_!5RA~+hOsEe1a$&# z!#Iq`WOXto;tt$}GPMl1q7-*xk~#^uV<8q}sk#))F&EP?4|AQ$6wE;-rm9nMA7kPj$sQIL~W3kF#2C!58WmIH%PJTvRXOf>zsb zMm>XXuoJtnk~=k4@Fg^0wYr+Zm+>0bs%yE1jo6N5>M}mfy?7HfY7N)(EgVFxTFYno z4&KEUbqil`@;$tcYPFg#@7?e#LhH-RVUi)rXzvNniS@ ze)OgX4K%7o`ZIw^?4$N!Pew9;of+v=u44!zXi`m#W*|cur^c}>V;RpLY7cf{6uYyR z+Ka&qVs9p@i40>n&FrRjV+@nom#JzhtvtbxnWCmJP51n#%u=(M!F2Xxwwg^lPty4r zGc{$hzwY@{%vE!lLkDkQo|?x2Jj2txUcH_J`3HVLfm*nJiGHfT;xRs;`2n4HBOm7~bro-737_DT>XRJFoB0&i zsp~j~qxlS%tIIizW!%6`>L!lo1U|>j>So@-NqnAL)vdgfQ@D*A)r~B7ayobLCG{oF zVkLKSkGhBV@Ls;mMzxXiIG3-oUajZdbh3$WsBiEgKFl}yj`|K4^AWzyL+T+u%B6gd zudA=~e%s)(h$(@ni_0%`|o?5clap+2oW7n`s`MGnf`{df+Bp})<^P9}vO*8lD}D7~wwdK{UZAuFM`;d{ zLYu!H-XVG*2mU>7lvb-z`iF-6HP0F)O{S2J=c@8-axkm?XM&&9XL?I{uD=Y;yiR{! z1j~ATZ9{IT=U?Zh)D?7%Z$Cbhe=K*D6ix3ReYvb7x8JWEJFDZqJxk2s7}IJ!WB2Ri zEt+dJ|I;JvYLBB8b2^@B&)P$L^Sgw#_x%4}qt2H(4g}8MbWn^mSfc z)2tznR5UPeE5?v9EC^ae%T@Zs<#Hn%UrVAt@UX4ePF4F_o=>ldXs0j!_plVjl Ox?Hf%NmLVcx&Hwin}7HK delta 2775 zcmbu;cXU)`8V2y^$w&$eDI_5ynN$NAk`SgPGXX*fU>HS;N~i(>X=>D*t6%X?w@<^d4KOa_iK0N&b#~o>-Mwx z*y?^25dhpnfQH@8gESLtsn#eqi7=(iHS=w^S(j{IMnnX>=3Hc9g1a~nCx-vd52@p50-Hr_fyz2zb1nq7qM0aiFBcXC_CtG(SeRGMl2qCNrkoRK=9pg2jGo zV~m@Pg?Y1S$7JP#?2$8SM)w&rX6opg><*rQ+i$MKF0<6(p5-f4#!zcQ>xkUPZqh(zi8V$K~RtqC|&TnV4hh6sHn%tPc}iG@~k$OnkCk z;WU}aPRpJAUW8dx={9ypC)3H{utE;E%~Yr6nAwUoioL0IW}wq)#yRgW_0CLl)){X? z{axk_XUN2-^);b1yQxZxPN+;?UG`c1nZuvQ%_%$l`iioTtr2M%5oSYww|OX|lc~#a zScfw*qs-<0AxEE@S*0;=Z?>#98+YSqi?aJlXIVWzDzS`vfMZ$i6tm71W7@l%=9}0Y z6VB~nuEe%B!($6{FUPFUbC{R%r7`j_ zbD_st-oBO1%xarvF1VsioG+x+aVFiDta_S>^(UEOzBDs2FW%Jpx|#IY#(9l9rkS#~ z@z+iY7i5}%-(xNoq?oDxToc=_omJ~ki7>-DCzwkEQ_U5Z-7L<_F|CRVt>{3=)-?C> zr6ZfG9HsLjt-&4YZDv@h!^Gw#=!6v0ThBV7v)z24-5WRPGbqa}8Q^Skb->WFO!Hco z8%$1x(<~ZfH}>*q)4ihFOfT zyk$F-w_D$Z5+jVgBHp~$#qs~|b^JQBVX!;x+SBQXQ;kpgpQDto9c@nc>K5L^TTzKU ztc1l~OhilUVoTIjN( zfHugN`EVf@c}SJ1aG(|1B1h&R0~NRlx1b^{`k({aqm%4}0+hgyLRpB8@S+QfWD$aB zhca}N-QYu4bVf*qa3f0L!Oik!^ne@1=q-DrCjux(ciA1i&=r5J@5ITm-yJ8_uf za1ZXrIK^FP0XrtiNr=>C)9)3jXo2S#izJzZT0YNsOvLk?7}n4FGNUmWFLN?Zvl=y+ zfojFQs-|G3oQeBY0kh?7Jfx}`)8sTftkFqWAQxbcDmxyRk7K^730NwZVzH_k%#-u5 z95EVSC0F4|RW%5&Ra%RuRaRq*+=30NVz5H4z(yTegB@}QwyTgS0S5)%>%)%5og%cUZqnIwIvxbl0KHM$u=6zv4hJ|P}%=@_rOE6o` z=0kh}%P>dI;iEK|iwEU{oX3?|gC%ka7jZS#VVPXUC%7J)@w9xJ%ee_pVS!x072JyF zuuiVyYCexTY>`{IfwkC!XBe&(n`q$~tdVQDohLaS#7Ppb@HnqS6pk|r$M_PPVmw~b z=t-Vn1g7Eyr{WZwpn;8^(x+xP%F}G77dcryWw9yuC?eHab$nHw^(s!Or*`s$Jb|+~ z66OxR-1r|r4jYimdNiOOXK)^`<1P6XUc>M3Hr|!*;!XS>@8d)HA^w2(a1IycMO?xK zyn%P*JNN)U;yRK)g8Uc0!AJN`euqzR1>fRh`7u7npYS!lkl`=zSNsu|aaCT$_xL;h zfuH10_zV7wf8uBPGd{zo0B!sfHhzh(5Wyeh5BM9JFow<8L=nY(+{a0Uywo+=vmQ3dLOqHoj;fp*>hjh@%G^R5{W-yZ{aR{wt zYaUZ|Qoqw7MZKD;mZ#-u99L5vVU8Lshp(uoPP2{rs|{a77V}uhEJa&g?O7y?7|vxb z{S3+=_hBDOn6I3#iEY_|WwMN|b#-P}*;NN0LwEL2?!g;$-NaH^s(D9nGkeS4*XH+O zrE;b2w`D&Ll7qBo76-7W?5TOV9L%b)4z9X3X&6T;kG!_&D2`PgtA9iT?&478p_igy~6$Kp8d#HXC32V9PcGwP*a^`wi-;KraDEJ8qCE5 mI0%1Tv1QNLiQV0u$8P_% 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 F{y&&!X)^!- delta 43755 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 diff --git a/apps/editor/public/items/shower-square/model.glb b/apps/editor/public/items/shower-square/model.glb index 3d14f12656f7e08064e846022d7ee3f4feaf85b2..9de4fba9bb37d383967fcf26fb11cc9638690522 100644 GIT binary patch delta 43755 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 delta 75431 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 F{y&&!X)^!- diff --git a/apps/editor/public/items/window-large/model.glb b/apps/editor/public/items/window-large/model.glb index f958bf29cfded620685d9221acf04e612741be16..a998b1ea66747b2fa5934a1f908c0b6c875fba33 100644 GIT binary patch delta 1113 zcmaJ=O=}ZT6rD+?iJFqOw(*-bzKxPT%ln>rQK{c3Xj7|#AVntWSOaNNlL;siRB$JV zazPLTh5iAdKR}o6bm78<;6KofKfpUtFgD=8%$zyr-Fwfy@6BWVMdw!=SI?y!$N93) zaX#dp=fA-5=z1@tEF5f5BuoInbHCpX+VJ&X8N%;nw3t0c++zMuerT=HP z|6atGDXgasjp<%*nUb}rb34KUH(+1-7<^A19z!mSqjo)PkTUC0IF?@6&3nr|bpOZd zVk2xubBuAI=~5}6WTCQj>EuOHwv=2wd;N5!vUKJqBV~@^q~2Vq*OCgH!;|!U${M&l zvH|PfOah;K$CKA5?|7P<0LDho)#A1>z)(m z9VhK1KYPk?9nZ-+8GL4(5vOu}?A`k(i|X-^cK#up3?%_TZg`Qf?Gp M6vlVBnEZEvUu%~o3jhEB delta 1140 zcmah}Jxmi}7=Fw3&lcM2^#@uAkc$&s$=!E%-+hO|p)raBlo+E%gHo^s3_l7bVhpJR zgKYA)|{&%Hm-`+RrFeKyz4(DdBp z^GyJ-o&tF1-wb`dHMLS$Tq($kytG)z7G@V0}#x zW`4HnKm8YlG?&mV%~EyB44v3Eqg3IIl<*^}D)sAxnT%`Wrnd`wJzY)2z>2pM@6>3> z*NLw=)hUkny79ZGOVCsUAG^13+gsxm@4$X8Ta}fu5LVlfwm*JK%+=btG?5hHt9_#5f|w47?lYO&l)}wYDVA^dn-r&X2*j z#C573Ue8}J!(n-SP|Q?D0W~b;>S!Zj5nik zEK42uG+KM!5J%97is(pT{3yjSEVW@-35fU5|5Csnep_OARM8FSC5aJku7@PnvNE{`I^B;i#VUA&F2K*Up zEBy}6xY0;1;b`O>E<{?mi6QQBxRi-J7f_KT+(@0o-DJzJ!;0;XUR QCU|7wHcUgFV;*ww2RLVHy8r+H diff --git a/apps/editor/public/items/window-rectangle/model.glb b/apps/editor/public/items/window-rectangle/model.glb index 549bda3f619bff14bfaa3b0e3c36117ea75c5087..3557e5416117a274316f7dea404232fcc42d9696 100644 GIT binary patch delta 1534 zcma)+&u<%55XZl}c5Kt6&TogNfl+Nn4t@b<;K_gs@4R#MH4( zY$u>9N|3lwp+@fxNE|sK{{fXa0tYy?C+Lw=#i0jIh*=YfB;|mm_wjgUXXZPzPyTxJ z#b|u3FgvLNc+m%Z*1RA8t$90NTq$iYGUjS>Tf6;0R5OPkZVs$VGNm$RkX+IlfZ?$iTq$*<%lN`=zqq`zD(ZEC4`HsZ3zhjY(h zp5f{L$HNzNZR4OpP)erM-d1a8r{S)w=cw7de4>uZZ`HG{^r&CWZRY)gmSQ`)+*f;L zM@aPWorN9!fp#GMM!_%UMi}GrQ#F}%b!{e-ogTlgr954my*xLO$z(4rGA+faghu`%Po=7dq{cF_jzg$MB%y%I})`m&CsUIj1~RIF4zX zmTQZKK+0y^Gi{HPa7Sl{<-C*-=n48A$)Mf?iWf9fgp7v=6c*U>^YDO5yX296#g^H~ zXqbj&@=?U=4h&se`lOo6tgcpaRob}_^2^9jmuDXf7_J)xx`k;R%`jamHWy7&%FzJr z$&g<~{v%-8ZX-a0A89UVlN1>0IPSL$c{e)LCFmU=7Aq_YP>0T!0yb+*aa=3a|EDuQ zHiV#CAn(M6+5}w?y1Ik29l*t_GpNT}epc(T)?d|nqJykN_xEc3&z@(Bd~_;Cr={M~ z`;&5O6$+ZLN@oortRP3sA&L*NjyN%n6Ubu&oy1PGqJSb2!~{A}!hJLoo6&<9PNI+4 zhgap$Yo~W#!6|gnd4v8kR78jogz*-JaE^EmCOC$XBqnhd21cM0bufyK!XY~JtVgjV zF$oJPxDZ4E8ye1Fi@1d<-o$BCh!t$37yT#`%e&ab0A5FpSi?tn8y9eqcoAbX>>9?2 z<2a8rCTQF=ofR5(64!{=X!JbZL57&2(F>SCmYAi{OSpw8;uMX33A4CIyoal}f;lV@ z7chjEN?Ajl>%hHO}ab7e=`>UKmZhF($_6bR%I*G|lgGo_^oX^ZTAZ(pzc& zjl$&%P5@gyK*{@#|EK!gda1Zxl48Bn6#W-VqPlem*OLxe^`C9yOsVmZm3l zSu;#UHFSekR9!KQ6rro8p{QC+Nf^3js+Or~vZ0!~uGsI*+ZT@i%Y-;bXr^Lvrlo6Y zDrFf)EY2Z{#a_+yYMQDf2{GY`il5z4r>cudPp{~2YRIoB7b!JEv>xjdA2dZ>ifW1T z?)Sv9=dQM^KlDVMiYmVJoN=j4=e=o{YFXlaZz{-VOuBxnl$%&sSj&~9A?AN;9tI=Kr+#IM^+A!tG+F!z*@zK9QhKguG&g z+K%sQJ8svE1^PvAphw&Zw~4p!<$no9#JkjA_xL=U!@%aSxYp4vraFA0JJ2Qm?)0+7 z=f9h>(}zj|BMuxx3miOd97j9CWEep-p%o{{6X<{!PWVYbLTH8u0Wtu7X}Hivw!tSR zBFgqw>o-oZ8IiYd`hRqaok)CpyyH8k_%$Ml+adpUZ|F0pXz%IU-V5(J8e+F=&rt`b zyBf0`Smqm>$z~MktAHhPiB48=lW$z*@nZ$+bhW}0L@d<~nzc_cmmm{J;S8RHMOqlbV;H~&xq;glL=;uBiaL5Bp+Z*h79K(Uan$&z;TE33 zvlt`CZ~+-SjdSEVoaH`>7$rw>9wQj%Mn-rF+{Z;+A}?_}D|iuC$Sd4V2`^)coZ@!M zxQYpKg4=lxuOUlj@d74s4LLG5j+by5^T?BVyoy(_h-q>f&trkkH^>dVjyLGMN>(w8 S89J|!6 diff --git a/apps/editor/public/items/window-square/model.glb b/apps/editor/public/items/window-square/model.glb index 0894575318df1a39f5d7e2a5f1808680531cc31d..8dc0a2a82596b01fddd74cf26a0383c9d0c2a70e 100644 GIT binary patch delta 1329 zcma)+&r=&^7{|Z6AxT?0lt37yl#p3wssk&&@9vx3ePhG#BBg~;N~OxsHbB5=LYySk zCK%x0L2r)l^k|R0c(9!uJl65%!K(*5WA!iKU~kqLpG`fa)PtGX&-?82WS{5rzMIKc zsb{HapgBb7?VYN%Q|?_`0cj_1D#+eyEx1NS_)q zjY6i9E#)$KBgyOQbrSk_`cgi#n;m70tEc+#uxA>J>E(sVD@Ib9#>&MT)9Li`%q>Pw zvASvGcDHhy*)rX6#RC(%<*9PuM}OH5#?63nqIhf*xT6AoPo+jFEPTp`w}MQ)c`yvasg$4UrGGFwH?@vEKn8=F^hasJKQWD~tARoFS8!0L z1MLsRR5FwbBy303LdhOlO=F{4$)>lr%h?JYx?lMzWJWC#Z7tZ$wbaS*NYu7oE(khm zH5VR^%44kr9hdqt^dAMs5`LlEIW|Mkh%Z7Tugn&%C;Sn#qe?gx74*7W)r6ODnuA_Z zlguA9(sf)}+G^^Ac}hs((GNAg(%qOLU#ZHC)FKaR`H0!Miw5JP!k_xQc$P zsz3YWK@G#G;V#~SjXJT8Jy>wCPu$06a4~`^v5EtDxPUR@7?OA!_^t0!j%yd1WW!+ZFU#B0PFc2OkpI g@pwz@=f_*}%~%~q9Cd%-w0aQfJf%@Pzom|U089i-8vpGE76lPH{-UYw&_o+QnBULsH1uv;}~wCyM7HsOuYi|uho-eFl{ zsaO=~h|_oN{WV2PCCbz1|Mg&5mZ533s+vOR274Gv+ooaLT3RuMs;9Lyhd82ZLKiw0 z3)8fVJYd1u#LH~AbpprIwyFrB8k#9ATL?{0anQDOev4`QREtOJhD`-;&aG$-w>P}~ zj=bZ|x>PFpvK~WK=v!Y#;(IDFv%EBSWPbkK+)^Twb~1l-CZ)8ntgR_kG3fWsK}pk% ztqD!l6)JZnov-kDS5{J5J9S|j&d^BOZh4)qTF%U{*&5ePn)Rmwx}jOsVl^I*_eASo z_`h*eK^FDl;3*HS$|E%1x0`NBKKfD`pzERM>&eh_ZVq(Nud+<{2A@D|=g0f(7~aY(S$6PRJn zu<>Jf4<%-ajUUH6PBTxl@hNj)QMa_p+ z-59hje{rKZ=rOv{yBU9y-uU6ev0T&8R$Y6T$Ul;Jl5PxYnsDkLqZ_?VLyy!vjPrli z=Czs!{TA9yLy;HgJ|EyBVVTctH{A>Q=(ZH$bNnpblsYLN_6NBS|1Bzn zw$oTBKsS2>bX^M2J=w?Yfv1(_!rp@}bf60^UTt^=J%}=+2%{Z-^fCL;3m@DFGJ}Yq S6JCUvAxP}sgKlOw0{90`;)<*Q diff --git a/apps/editor/store/use-editor.tsx b/apps/editor/store/use-editor.tsx index 036e81c8..0d80d636 100644 --- a/apps/editor/store/use-editor.tsx +++ b/apps/editor/store/use-editor.tsx @@ -1,6 +1,6 @@ 'use client' -import { type BuildingNode, type LevelNode, useScene } from '@pascal-app/core' +import { type BuildingNode, type ItemNode, type LevelNode, useScene } from '@pascal-app/core' import { useViewer } from '@pascal-app/viewer' import { create } from 'zustand' import type { Asset } from '../../../packages/core/src/schema/nodes/item' @@ -56,6 +56,8 @@ type EditorState = { setCatalogCategory: (category: CatalogCategory | null) => void selectedItem: Asset | null setSelectedItem: (item: Asset) => void + movingNode: ItemNode | null + setMovingNode: (node: ItemNode | null) => void } const useEditor = create()((set, get) => ({ @@ -169,6 +171,8 @@ const useEditor = create()((set, get) => ({ setCatalogCategory: (category) => set({ catalogCategory: category }), selectedItem: null, setSelectedItem: (item) => set({ selectedItem: item }), + movingNode: null, + setMovingNode: (node) => set({ movingNode: node }), })) export default useEditor