From 3c786441bbfdfbb88e52fcaff4f09a9edb0e3397 Mon Sep 17 00:00:00 2001 From: kolaflash Date: Thu, 8 Jan 2026 14:12:40 +0100 Subject: [PATCH] WIP --- dev/main.tsx | 8 ++++++-- engine/Scene.ts | 34 ++++++++++++++++++++++++++++++++-- scenes/testScene/index.ts | 4 +++- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/dev/main.tsx b/dev/main.tsx index ee3162d..51d5853 100644 --- a/dev/main.tsx +++ b/dev/main.tsx @@ -11,6 +11,7 @@ import { ZoomScanIcon } from "#/dev/icons/ZoomScan.tsx"; import { currentScene, type SceneData, + sceneChangedHandlers, sceneGraph, setScene, } from "#/engine/Scene.ts"; @@ -71,10 +72,13 @@ const DevTools: Component<{ gameContainer: HTMLElement }> = ({ const setCurrentScene = async (items: ItemsRef): Promise => { const name = items.find((ref) => ref.item.isActive)!.item.label; await setScene(name); - setSceneData(currentScene.data); - setEntities(mapSceneEntities(currentScene.data)); }; + sceneChangedHandlers.add((data) => { + setSceneData(data); + setEntities(mapSceneEntities(data)); + }); + const setActiveEntity = (items: ItemsRef): void => { const activeRef = items.find((ref) => ref.item.isActive)!; const instances = currentScene.entityInstanceMap.get( diff --git a/engine/Scene.ts b/engine/Scene.ts index 84a2e93..ab2cd71 100644 --- a/engine/Scene.ts +++ b/engine/Scene.ts @@ -33,12 +33,20 @@ export type Scene = { }; 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(); +const scenePreProcessMap = new Map(); +const scenePostProcessMap = new Map(); const sceneDataMap = new Map(); -const sceneProcessMap = new Map(); const sceneEntiyMap = new Map(); + +export const sceneChangedHandlers = new Set(); + export const sceneGraph: Graph = new Map(); export const [loadScene, sceneCache] = useWithAsyncCache( @@ -112,6 +120,8 @@ export function useScene(data: SceneData): { names: T, ) => (name: T[number]) => Promise; process: (fn: Process) => void; + preProcess: (fn: PreProcess) => void; + postProcess: (fn: PreProcess) => void; } { sceneDataMap.set(data.name, data); sceneEntiyMap.set(data.name, new Map()); @@ -133,6 +143,12 @@ export function useScene(data: SceneData): { 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 { const process = sceneProcessMap.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; self.dispatchEvent(new Event("resize")); currentScene.process = process; currentScene.entityInstanceMap = entityInstanceMap; + + for (const handler of sceneChangedHandlers.values()) { + handler(data, currentScene.data); + } } diff --git a/scenes/testScene/index.ts b/scenes/testScene/index.ts index f2a8c4d..2595e24 100644 --- a/scenes/testScene/index.ts +++ b/scenes/testScene/index.ts @@ -1,8 +1,10 @@ import { useScene } from "#/engine/Scene.ts"; import data from "./data.json"; -const { process, linkScenes } = useScene(data); +const { process, preProcess, linkScenes } = useScene(data); linkScenes(["fooScene", "fuzzScene"] as const); +preProcess(() => {}); + process((_ctx, _delta) => {});