event systems
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"dedent": "^1.7.1",
|
||||
"mitt": "^3.0.1",
|
||||
"nanoid": "^5.1.6",
|
||||
"zod": "^4.3.5",
|
||||
"zustand": "^5.0.10"
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
import mitt from "mitt";
|
||||
import { ItemNode, WallNode } from "../schema";
|
||||
import { AnyNode } from "../schema/types";
|
||||
export interface GridEvent {
|
||||
position: [number, number];
|
||||
}
|
||||
|
||||
export interface NodeEvent {
|
||||
node: AnyNode;
|
||||
position: [number, number, number]; // [x, y, z] world coordinates
|
||||
normal?: [number, number, number]; // [x, y, z] normal vector
|
||||
stopPropagation: () => void;
|
||||
}
|
||||
|
||||
export interface WallEvent extends NodeEvent {
|
||||
node: WallNode;
|
||||
}
|
||||
|
||||
export interface ItemEvent extends NodeEvent {
|
||||
node: ItemNode;
|
||||
}
|
||||
|
||||
type EditorEvents = {
|
||||
"grid:click": GridEvent;
|
||||
"grid:rightclick": GridEvent;
|
||||
"grid:move": GridEvent;
|
||||
"grid:double-click": GridEvent;
|
||||
"grid:enter": GridEvent;
|
||||
"grid:leave": GridEvent;
|
||||
"grid:pointerdown": GridEvent;
|
||||
"grid:pointerup": GridEvent;
|
||||
"wall:click": WallEvent;
|
||||
"wall:move": WallEvent;
|
||||
"wall:enter": WallEvent;
|
||||
"wall:leave": WallEvent;
|
||||
"wall:pointerdown": WallEvent;
|
||||
"wall:pointerup": WallEvent;
|
||||
"item:click": ItemEvent;
|
||||
"item:move": ItemEvent;
|
||||
"item:enter": ItemEvent;
|
||||
"item:leave": ItemEvent;
|
||||
"item:pointerdown": ItemEvent;
|
||||
"item:pointerup": ItemEvent;
|
||||
};
|
||||
export const emitter = mitt<EditorEvents>();
|
||||
@@ -2,11 +2,17 @@
|
||||
export { default as useScene } from "./store/useScene";
|
||||
|
||||
// Hooks
|
||||
export { useRegistry } from "./hooks/scene-registry/scene-registry";
|
||||
export {
|
||||
sceneRegistry,
|
||||
useRegistry,
|
||||
} from "./hooks/scene-registry/scene-registry";
|
||||
|
||||
// Systems
|
||||
export { LevelSystem } from "./systems/level/level-system";
|
||||
export { WallSystem } from "./systems/wall/wall-system";
|
||||
|
||||
// Events
|
||||
export { emitter } from "./events/bus";
|
||||
|
||||
// Schema
|
||||
export * from "./schema";
|
||||
|
||||
@@ -43,9 +43,9 @@ function updateWallGeometry(wallId: string) {
|
||||
if (!mesh) return;
|
||||
|
||||
const childrenIds = node.children || [];
|
||||
const childrenNodes = childrenIds.map(
|
||||
(childId) => useScene.getState().nodes[childId]
|
||||
);
|
||||
const childrenNodes = childrenIds
|
||||
.map((childId) => useScene.getState().nodes[childId])
|
||||
.filter((n): n is AnyNode => n !== undefined);
|
||||
|
||||
// Perform the Extrusion with Holes logic we discussed
|
||||
const newGeo = generateExtrudedWall(node, childrenNodes);
|
||||
|
||||
Reference in New Issue
Block a user