diff --git a/dev/main.tsx b/dev/main.tsx index 0b2f979..31cfe28 100644 --- a/dev/main.tsx +++ b/dev/main.tsx @@ -28,8 +28,13 @@ async function fetchBrowserData(dir: string): Promise { } function mapSceneEntities(sceneData: SceneData): BrowserFolder { - const entites = sceneData.entities.reduce((root, entiry, index) => { - root.set(`${entiry.id}:${index}`, `${entiry.id}:${index}`); + const sets = {}; + const entites = sceneData.entities.reduce((root, entiry) => { + sets[entiry.id] = sets[entiry.id] === undefined ? 0 : sets[entiry.id] + 1; + root.set( + `${entiry.id}:${sets[entiry.id]}`, + `${entiry.id}:${sets[entiry.id]}`, + ); return root; }, new Map() as BrowserFolder); diff --git a/engine/Scene.ts b/engine/Scene.ts index ed5685d..76984e6 100644 --- a/engine/Scene.ts +++ b/engine/Scene.ts @@ -76,7 +76,9 @@ function linkScenes(a: string, b: string): void { } export function useScene(data: SceneData): { - linkScenes: (ids: string[]) => () => Promise; + linkScenes: ( + ids: T, + ) => (id: T[number]) => Promise; process: (fn: Process) => void; } { sceneDataMap.set(data.id, data); @@ -88,7 +90,9 @@ export function useScene(data: SceneData): { linkScenes(data.id, id); } - return async () => {}; + return async (id) => { + return changeScene(id); + }; }, process(fn) { sceneProcessMap.set(data.id, (ctx, delta) => { @@ -100,12 +104,27 @@ export function useScene(data: SceneData): { }; } +export function changeScene(id: string): Promise { + const data = sceneDataMap.get(id)!; + const process = sceneProcessMap.get(id)!; + const entityInstanceMap = sceneEntiyMap.get(id)!; + for (const neighbour of getNeighbours(sceneGraph, id)) { + if (!sceneCache.has(neighbour)) { + sceneCache.set(neighbour, loadScene(neighbour)); + } + } + currentScene.data = data; + currentScene.process = process; + currentScene.entityInstanceMap = entityInstanceMap; +} + export async function loadScene(id: string): Promise { await import(`#/scenes/${id}/index.ts`); const data = sceneDataMap.get(id)!; const process = sceneProcessMap.get(id)!; const entityInstanceMap = sceneEntiyMap.get(id)!; + entityInstanceMap.clear(); Promise.all( data.entities.map(async (entity: Entity) => { @@ -121,7 +140,7 @@ export async function loadScene(id: string): Promise { const instance: Entity = { ...structuredClone(entityMap.get(entity.id)!), - position: entity.position, + ...structuredClone(entity), }; entityInstanceMap.get(entity.id)!.instances.push(instance); diff --git a/scenes/fooScene/index.ts b/scenes/fooScene/index.ts index 5bf8bd6..8a4c4a0 100644 --- a/scenes/fooScene/index.ts +++ b/scenes/fooScene/index.ts @@ -1,6 +1,10 @@ import { useScene } from "#/engine/Scene.ts"; import data from "./data.json"; -const { process } = useScene(data); +const { process, linkScenes } = useScene(data); + +// const changeScene = linkScenes(["testScene"] as const); + +// changeScene("testScene"); process((_ctx, _delta) => {});