code organization

This commit is contained in:
wass08
2026-01-16 09:46:19 +09:00
parent 45a34d7df6
commit 60cb60fdaa
11 changed files with 37 additions and 21 deletions
+3 -3
View File
@@ -7,7 +7,7 @@ import {
useScene, useScene,
WallNode, WallNode,
} from "@pascal-app/core"; } from "@pascal-app/core";
import { Viewer } from "@pascal-app/viewer"; import { useViewer, Viewer } from "@pascal-app/viewer";
import { Stats } from "@react-three/drei"; import { Stats } from "@react-three/drei";
import { useFrame, useThree } from "@react-three/fiber"; import { useFrame, useThree } from "@react-three/fiber";
import { useEffect, useMemo, useRef } from "react"; import { useEffect, useMemo, useRef } from "react";
@@ -264,8 +264,8 @@ const Selector = () => {
}; };
const LevelModeSwitcher = () => { const LevelModeSwitcher = () => {
const setLevelMode = useScene((state) => state.setLevelMode); const setLevelMode = useViewer((state) => state.setLevelMode);
const levelMode = useScene((state) => state.levelMode); const levelMode = useViewer((state) => state.levelMode);
return ( return (
<div className="absolute top-4 left-4 z-10 flex gap-2"> <div className="absolute top-4 left-4 z-10 flex gap-2">
+1 -1
View File
@@ -7,6 +7,7 @@
"@react-three/drei": "^10", "@react-three/drei": "^10",
"@react-three/fiber": "^9", "@react-three/fiber": "^9",
"three": "^0.182.0", "three": "^0.182.0",
"zustand": "^5.0.10",
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.3.11", "@biomejs/biome": "^2.3.11",
@@ -47,7 +48,6 @@
"mitt": "^3.0.1", "mitt": "^3.0.1",
"nanoid": "^5.1.6", "nanoid": "^5.1.6",
"zod": "^4.3.5", "zod": "^4.3.5",
"zustand": "^5.0.10",
}, },
"devDependencies": { "devDependencies": {
"@repo/typescript-config": "*", "@repo/typescript-config": "*",
+2 -1
View File
@@ -15,7 +15,8 @@
"dependencies": { "dependencies": {
"@react-three/drei": "^10", "@react-three/drei": "^10",
"@react-three/fiber": "^9", "@react-three/fiber": "^9",
"three": "^0.182.0" "three": "^0.182.0",
"zustand": "^5.0.10"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.3.11", "@biomejs/biome": "^2.3.11",
+1 -2
View File
@@ -25,7 +25,6 @@
"dedent": "^1.7.1", "dedent": "^1.7.1",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"nanoid": "^5.1.6", "nanoid": "^5.1.6",
"zod": "^4.3.5", "zod": "^4.3.5"
"zustand": "^5.0.10"
} }
} }
+2 -2
View File
@@ -1,5 +1,5 @@
// Store // Store
export { default as useScene } from "./store/useScene"; export { default as useScene } from "./store/use-scene";
// Hooks // Hooks
export { export {
@@ -8,7 +8,7 @@ export {
} from "./hooks/scene-registry/scene-registry"; } from "./hooks/scene-registry/scene-registry";
// Systems // Systems
export { LevelSystem } from "./systems/level/level-system"; export { LevelSystem } from "../../viewer/src/systems/level/level-system";
export { WallSystem } from "./systems/wall/wall-system"; export { WallSystem } from "./systems/wall/wall-system";
// Events // Events
@@ -20,9 +20,6 @@ type SceneState = {
loadScene: () => void; loadScene: () => void;
markDirty: (id: AnyNodeId) => void; markDirty: (id: AnyNodeId) => void;
clearDirty: (id: AnyNodeId) => void; clearDirty: (id: AnyNodeId) => void;
levelMode: "stacked" | "exploded" | "solo" | "manual";
setLevelMode: (mode: "stacked" | "exploded" | "solo" | "manual") => void;
}; };
const useScene = create<SceneState>()((set, get) => ({ const useScene = create<SceneState>()((set, get) => ({
@@ -117,9 +114,6 @@ const useScene = create<SceneState>()((set, get) => ({
clearDirty: (id) => { clearDirty: (id) => {
get().dirtyNodes.delete(id); get().dirtyNodes.delete(id);
}, },
levelMode: "exploded",
setLevelMode: (mode) => set({ levelMode: mode }),
})); }));
useScene.getState().loadScene(); useScene.getState().loadScene();
@@ -2,7 +2,7 @@ import { useFrame } from "@react-three/fiber";
import * as THREE from "three"; import * as THREE from "three";
import { sceneRegistry } from "../../hooks/scene-registry/scene-registry"; import { sceneRegistry } from "../../hooks/scene-registry/scene-registry";
import { AnyNode, WallNode } from "../../schema"; import { AnyNode, WallNode } from "../../schema";
import useScene from "../../store/useScene"; import useScene from "../../store/use-scene";
export const WallSystem = () => { export const WallSystem = () => {
const { nodes, dirtyNodes, clearDirty } = useScene(); const { nodes, dirtyNodes, clearDirty } = useScene();
+1 -1
View File
@@ -4,6 +4,6 @@
"outDir": "dist", "outDir": "dist",
"rootDir": "src" "rootDir": "src"
}, },
"include": ["src"], "include": ["src", "../viewer/src/systems/level"],
"exclude": ["node_modules", "dist"] "exclude": ["node_modules", "dist"]
} }
+2
View File
@@ -1 +1,3 @@
export { default as Viewer } from "./components/viewer/viewer"; export { default as Viewer } from "./components/viewer/viewer";
export { default as useViewer } from "./store/use-viewer";
+21
View File
@@ -0,0 +1,21 @@
"use client";
import { LevelNode } from "@pascal-app/core";
import { create } from "zustand";
type ViewerState = {
levelMode: "stacked" | "exploded" | "solo" | "manual";
setLevelMode: (mode: "stacked" | "exploded" | "solo" | "manual") => void;
currentLevelId: LevelNode["id"] | null;
setCurrentLevelId: (id: LevelNode["id"] | null) => void;
};
const useViewer = create<ViewerState>()((set, get) => ({
levelMode: "exploded",
setLevelMode: (mode) => set({ levelMode: mode }),
currentLevelId: null,
setCurrentLevelId: (id) => set({ currentLevelId: id }),
}));
export default useViewer;
@@ -1,15 +1,14 @@
import { LevelNode, sceneRegistry, useScene } from "@pascal-app/core";
import { useFrame } from "@react-three/fiber"; import { useFrame } from "@react-three/fiber";
import { lerp } from "three/src/math/MathUtils.js"; import { lerp } from "three/src/math/MathUtils.js";
import { sceneRegistry } from "../../hooks/scene-registry/scene-registry"; import useViewer from "../../store/use-viewer";
import { LevelNode } from "../../schema";
import useScene from "../../store/useScene";
const LEVEL_HEIGHT = 2.5; const LEVEL_HEIGHT = 2.5;
const EXPLODED_GAP = 5; const EXPLODED_GAP = 5;
export const LevelSystem = () => { export const LevelSystem = () => {
useFrame((_, delta) => { useFrame((_, delta) => {
const levelMode = useScene.getState().levelMode; const levelMode = useViewer.getState().levelMode;
sceneRegistry.byType.level.forEach((levelId) => { sceneRegistry.byType.level.forEach((levelId) => {
const obj = sceneRegistry.nodes.get(levelId); const obj = sceneRegistry.nodes.get(levelId);
if (obj) { if (obj) {