This commit is contained in:
kolaflash
2026-01-08 14:12:40 +01:00
parent b227ed5db2
commit 3c786441bb
3 changed files with 41 additions and 5 deletions
+6 -2
View File
@@ -11,6 +11,7 @@ import { ZoomScanIcon } from "#/dev/icons/ZoomScan.tsx";
import { import {
currentScene, currentScene,
type SceneData, type SceneData,
sceneChangedHandlers,
sceneGraph, sceneGraph,
setScene, setScene,
} from "#/engine/Scene.ts"; } from "#/engine/Scene.ts";
@@ -71,10 +72,13 @@ const DevTools: Component<{ gameContainer: HTMLElement }> = ({
const setCurrentScene = async (items: ItemsRef): Promise<void> => { const setCurrentScene = async (items: ItemsRef): Promise<void> => {
const name = items.find((ref) => ref.item.isActive)!.item.label; const name = items.find((ref) => ref.item.isActive)!.item.label;
await setScene(name); await setScene(name);
setSceneData(currentScene.data);
setEntities(mapSceneEntities(currentScene.data));
}; };
sceneChangedHandlers.add((data) => {
setSceneData(data);
setEntities(mapSceneEntities(data));
});
const setActiveEntity = (items: ItemsRef): void => { const setActiveEntity = (items: ItemsRef): void => {
const activeRef = items.find((ref) => ref.item.isActive)!; const activeRef = items.find((ref) => ref.item.isActive)!;
const instances = currentScene.entityInstanceMap.get( const instances = currentScene.entityInstanceMap.get(
+32 -2
View File
@@ -33,12 +33,20 @@ export type Scene = {
}; };
export type Process = (ctx: CanvasRenderingContext2D, delta: number) => void; export type Process = (ctx: CanvasRenderingContext2D, delta: number) => void;
export type PreProcess = () => void;
export type PostProcess = () => void;
export type SceneChangeCallback = (from: Scene, to: Scene) => void; export type SceneChangeHandler = (to: SceneData, from: SceneData) => void;
const sceneProcessMap = new Map<string, Process>();
const scenePreProcessMap = new Map<string, PreProcess>();
const scenePostProcessMap = new Map<string, PostProcess>();
const sceneDataMap = new Map<string, SceneData>(); const sceneDataMap = new Map<string, SceneData>();
const sceneProcessMap = new Map<string, Process>();
const sceneEntiyMap = new Map<string, EntityInstanceMap>(); const sceneEntiyMap = new Map<string, EntityInstanceMap>();
export const sceneChangedHandlers = new Set<SceneChangeHandler>();
export const sceneGraph: Graph<string> = new Map(); export const sceneGraph: Graph<string> = new Map();
export const [loadScene, sceneCache] = useWithAsyncCache( export const [loadScene, sceneCache] = useWithAsyncCache(
@@ -112,6 +120,8 @@ export function useScene(data: SceneData): {
names: T, names: T,
) => (name: T[number]) => Promise<void>; ) => (name: T[number]) => Promise<void>;
process: (fn: Process) => void; process: (fn: Process) => void;
preProcess: (fn: PreProcess) => void;
postProcess: (fn: PreProcess) => void;
} { } {
sceneDataMap.set(data.name, data); sceneDataMap.set(data.name, data);
sceneEntiyMap.set(data.name, new Map()); sceneEntiyMap.set(data.name, new Map());
@@ -133,6 +143,12 @@ export function useScene(data: SceneData): {
animateEntities(ctx, delta); animateEntities(ctx, delta);
}); });
}, },
preProcess(fn): void {
scenePreProcessMap.set(data.name, fn);
},
postProcess(fn): void {
scenePostProcessMap.set(data.name, fn);
},
}; };
} }
@@ -148,10 +164,24 @@ export async function setScene(name: string): Promise<void> {
const process = sceneProcessMap.get(name)!; const process = sceneProcessMap.get(name)!;
const entityInstanceMap = sceneEntiyMap.get(name)!; const entityInstanceMap = sceneEntiyMap.get(name)!;
const preProcess = scenePreProcessMap.get(name);
if (preProcess) {
preProcess();
}
const postProcess = scenePostProcessMap.get(currentScene.data.name);
if (postProcess) {
postProcess();
}
currentScene.data = data; currentScene.data = data;
self.dispatchEvent(new Event("resize")); self.dispatchEvent(new Event("resize"));
currentScene.process = process; currentScene.process = process;
currentScene.entityInstanceMap = entityInstanceMap; currentScene.entityInstanceMap = entityInstanceMap;
for (const handler of sceneChangedHandlers.values()) {
handler(data, currentScene.data);
}
} }
+3 -1
View File
@@ -1,8 +1,10 @@
import { useScene } from "#/engine/Scene.ts"; import { useScene } from "#/engine/Scene.ts";
import data from "./data.json"; import data from "./data.json";
const { process, linkScenes } = useScene(data); const { process, preProcess, linkScenes } = useScene(data);
linkScenes(["fooScene", "fuzzScene"] as const); linkScenes(["fooScene", "fuzzScene"] as const);
preProcess(() => {});
process((_ctx, _delta) => {}); process((_ctx, _delta) => {});