This commit is contained in:
wass08
2026-01-21 10:03:29 +09:00
parent 14b0e6a98d
commit 5de0818633
53 changed files with 1241 additions and 1420 deletions
+65 -70
View File
@@ -1,111 +1,106 @@
"use client";
'use client'
import {
AssetInput,
BuildingNode,
LevelNode,
useScene,
} from "@pascal-app/core";
import { useViewer } from "@pascal-app/viewer";
import { create } from "zustand";
import { Asset } from "../../../packages/core/src/schema/nodes/item";
import { type BuildingNode, 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'
export type Phase = "site" | "structure" | "furnish";
export type Phase = 'site' | 'structure' | 'furnish'
export type Mode = "select" | "edit" | "delete" | "build";
export type Mode = 'select' | 'edit' | 'delete' | 'build'
// Structure mode tools (building elements)
export type StructureTool =
| "wall"
| "room"
| "custom-room"
| "slab"
| "ceiling"
| "roof"
| "column"
| "stair"
| "item"
| "zone";
| 'wall'
| 'room'
| 'custom-room'
| 'slab'
| 'ceiling'
| 'roof'
| 'column'
| 'stair'
| 'item'
| 'zone'
// Furnish mode tools (items and decoration)
export type FurnishTool = "item";
export type FurnishTool = 'item'
// Site mode tools
export type SiteTool = "property-line";
export type SiteTool = 'property-line'
// Catalog categories for furnish mode items
export type CatalogCategory =
| "furniture"
| "appliance"
| "bathroom"
| "kitchen"
| "outdoor"
| "window"
| "door";
| 'furniture'
| 'appliance'
| 'bathroom'
| 'kitchen'
| 'outdoor'
| 'window'
| 'door'
// Combined tool type
export type Tool = SiteTool | StructureTool | FurnishTool;
export type Tool = SiteTool | StructureTool | FurnishTool
type EditorState = {
phase: Phase;
setPhase: (phase: Phase) => void;
mode: Mode;
setMode: (mode: Mode) => void;
tool: Tool | null;
setTool: (tool: Tool | null) => void;
catalogCategory: CatalogCategory | null;
setCatalogCategory: (category: CatalogCategory | null) => void;
selectedItem: Asset | null;
setSelectedItem: (item: Asset) => void;
};
phase: Phase
setPhase: (phase: Phase) => void
mode: Mode
setMode: (mode: Mode) => void
tool: Tool | null
setTool: (tool: Tool | null) => void
catalogCategory: CatalogCategory | null
setCatalogCategory: (category: CatalogCategory | null) => void
selectedItem: Asset | null
setSelectedItem: (item: Asset) => void
}
const useEditor = create<EditorState>()((set, get) => ({
phase: "site",
phase: 'site',
setPhase: (phase) => {
const currentPhase = get().phase;
if (currentPhase === phase) return;
const currentPhase = get().phase
if (currentPhase === phase) return
set({ phase });
set({ phase })
const viewer = useViewer.getState();
const scene = useScene.getState();
const viewer = useViewer.getState()
const scene = useScene.getState()
switch (phase) {
case "site":
case 'site':
// In Site mode, we zoom out and deselect specific levels/buildings
viewer.resetSelection();
viewer.setLevelMode("stacked");
break;
viewer.resetSelection()
viewer.setLevelMode('stacked')
break
case "structure":
case 'structure':
// In Structure mode, we often want to focus on a specific building/level
// Auto-select the first building if none is selected
if (!viewer.selection.buildingId) {
const firstBuildingId = scene.rootNodeIds.find((id) => {
const node = scene.nodes[id];
return node?.type === "building" || null;
});
const node = scene.nodes[id]
return node?.type === 'building' || null
})
if (firstBuildingId) {
viewer.setSelection({
buildingId: firstBuildingId as BuildingNode["id"],
});
const buildingNode = scene.nodes[firstBuildingId] as BuildingNode;
const firstLevelId = buildingNode.children[0];
buildingId: firstBuildingId as BuildingNode['id'],
})
const buildingNode = scene.nodes[firstBuildingId] as BuildingNode
const firstLevelId = buildingNode.children[0]
if (firstLevelId) {
viewer.setSelection({ levelId: firstLevelId as LevelNode["id"] });
viewer.setSelection({ levelId: firstLevelId as LevelNode['id'] })
}
}
}
viewer.setLevelMode("stacked"); // Better for structure editing
break;
viewer.setLevelMode('stacked') // Better for structure editing
break
case "furnish":
case 'furnish':
// Maybe in furnish mode we force "solo" level view to see inside rooms
viewer.setLevelMode("solo");
break;
viewer.setLevelMode('solo')
break
}
},
mode: "select",
mode: 'select',
setMode: (mode) => set({ mode }),
tool: null,
setTool: (tool) => set({ tool }),
@@ -113,6 +108,6 @@ const useEditor = create<EditorState>()((set, get) => ({
setCatalogCategory: (category) => set({ catalogCategory: category }),
selectedItem: null,
setSelectedItem: (item) => set({ selectedItem: item }),
}));
}))
export default useEditor;
export default useEditor