WIP
This commit is contained in:
+6
-2
@@ -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<void> => {
|
||||
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(
|
||||
|
||||
+32
-2
@@ -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<string, Process>();
|
||||
const scenePreProcessMap = new Map<string, PreProcess>();
|
||||
const scenePostProcessMap = new Map<string, PostProcess>();
|
||||
|
||||
const sceneDataMap = new Map<string, SceneData>();
|
||||
const sceneProcessMap = new Map<string, Process>();
|
||||
const sceneEntiyMap = new Map<string, EntityInstanceMap>();
|
||||
|
||||
export const sceneChangedHandlers = new Set<SceneChangeHandler>();
|
||||
|
||||
export const sceneGraph: Graph<string> = new Map();
|
||||
|
||||
export const [loadScene, sceneCache] = useWithAsyncCache(
|
||||
@@ -112,6 +120,8 @@ export function useScene(data: SceneData): {
|
||||
names: T,
|
||||
) => (name: T[number]) => Promise<void>;
|
||||
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<void> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) => {});
|
||||
|
||||
Reference in New Issue
Block a user