WIP
This commit is contained in:
+6
-2
@@ -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
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) => {});
|
||||||
|
|||||||
Reference in New Issue
Block a user