From 980dd4c3dc4bb638c948e2491a40665aa8312421 Mon Sep 17 00:00:00 2001 From: wass08 Date: Tue, 20 Jan 2026 08:39:14 +0900 Subject: [PATCH] level items --- apps/editor/components/tools/item/item-tool.tsx | 8 ++++++++ apps/editor/store/use-editor.tsx | 2 +- packages/core/src/hooks/spatial-grid/spatial-grid-sync.ts | 5 ++++- packages/viewer/src/store/use-viewer.ts | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/editor/components/tools/item/item-tool.tsx b/apps/editor/components/tools/item/item-tool.tsx index 242b63b5..a2e4c204 100644 --- a/apps/editor/components/tools/item/item-tool.tsx +++ b/apps/editor/components/tools/item/item-tool.tsx @@ -16,6 +16,7 @@ import { is } from "@react-three/fiber/dist/declarations/src/core/utils"; import { use, useEffect, useRef } from "react"; import { BoxGeometry, Line, Mesh, MeshStandardMaterial, Vector3 } from "three"; import { randInt } from "three/src/math/MathUtils.js"; +import { resolveLevelId } from "../../../../../packages/core/src/hooks/spatial-grid/spatial-grid-sync"; export const ItemTool: React.FC = () => { const cursorRef = useRef(null!); @@ -131,6 +132,12 @@ export const ItemTool: React.FC = () => { }; const onWallEnter = (event: WallEvent) => { + if ( + useViewer.getState().currentLevelId !== + resolveLevelId(event.node, useScene.getState().nodes) + ) { + return; + } if ( draftItem.current?.asset.attachTo === "wall" || draftItem.current?.asset.attachTo === "wall-side" @@ -157,6 +164,7 @@ export const ItemTool: React.FC = () => { }; const onWallLeave = (event: WallEvent) => { + if (!isOnWall.current) return; isOnWall.current = false; currentWallId = null; event.stopPropagation(); diff --git a/apps/editor/store/use-editor.tsx b/apps/editor/store/use-editor.tsx index 4c3231dc..035a645c 100644 --- a/apps/editor/store/use-editor.tsx +++ b/apps/editor/store/use-editor.tsx @@ -95,7 +95,7 @@ const useEditor = create()((set, get) => ({ } } } - viewer.setLevelMode("exploded"); // Better for structure editing + viewer.setLevelMode("stacked"); // Better for structure editing break; case "furnish": diff --git a/packages/core/src/hooks/spatial-grid/spatial-grid-sync.ts b/packages/core/src/hooks/spatial-grid/spatial-grid-sync.ts index d8c96485..4f658f8c 100644 --- a/packages/core/src/hooks/spatial-grid/spatial-grid-sync.ts +++ b/packages/core/src/hooks/spatial-grid/spatial-grid-sync.ts @@ -2,7 +2,10 @@ import { AnyNode } from "../../schema"; import useScene from "../../store/use-scene"; import { spatialGridManager } from "./spatial-grid-manager"; -function resolveLevelId(node: AnyNode, nodes: Record): string { +export function resolveLevelId( + node: AnyNode, + nodes: Record, +): string { // If the node itself is a level if (node.type === "level") return node.id; diff --git a/packages/viewer/src/store/use-viewer.ts b/packages/viewer/src/store/use-viewer.ts index baf31ddd..783cb5a1 100644 --- a/packages/viewer/src/store/use-viewer.ts +++ b/packages/viewer/src/store/use-viewer.ts @@ -14,7 +14,7 @@ type ViewerState = { }; const useViewer = create()((set, get) => ({ - levelMode: "exploded", + levelMode: "stacked", setLevelMode: (mode) => set({ levelMode: mode }), currentLevelId: null, setCurrentLevelId: (id) => set({ currentLevelId: id }),