diff --git a/packages/ecs/lib/libecs.d.ts b/packages/ecs/lib/libecs.d.ts index 3186f04f..f8c646d4 100644 --- a/packages/ecs/lib/libecs.d.ts +++ b/packages/ecs/lib/libecs.d.ts @@ -1,4 +1,17 @@ // TypeScript bindings for emscripten-generated code. Automatically generated at compile time. +declare namespace RuntimeExports { + let HEAPF32: any; + let HEAPF64: any; + let HEAP_DATA_VIEW: any; + let HEAP8: any; + let HEAPU8: any; + let HEAP16: any; + let HEAPU16: any; + let HEAP32: any; + let HEAPU32: any; + let HEAP64: any; + let HEAPU64: any; +} interface WasmModule { } @@ -7,8 +20,6 @@ export interface ClassHandle { delete(): void; deleteLater(): this; isDeleted(): boolean; - // @ts-ignore - If targeting lower than ESNext, this symbol might not exist. - [Symbol.dispose](): void; clone(): this; } export interface container extends ClassHandle { @@ -47,8 +58,7 @@ export interface Registry extends ClassHandle { killEntity(_0: Entity): void; clearEntities(): void; removeComponent(_0: Entity, _1: {name: string, [key: string]: any}): void; - addSystem(_0: (registry: Registry) => void): void; - runSystems(): void; + addSystem(_0: (registry: Registry, ctx: any) => void): void; clearSystems(): void; entityFromIndex(_0: number): Entity; removeSystem(_0: number): void; @@ -56,6 +66,7 @@ export interface Registry extends ClassHandle { getEntityComponentConst(_0: Entity, _1: {name: string, [key: string]: any}): any | undefined; getEntityComponent(_0: Entity, _1: {name: string, [key: string]: any}): any | undefined; addComponent(_0: Entity, _1: {name: string, [key: string]: any}): any | undefined; + runSystems(_0: any): void; getZipper(_0: any): any; } @@ -74,5 +85,5 @@ interface EmbindModule { }; } -export type MainModule = WasmModule & EmbindModule; +export type MainModule = WasmModule & typeof RuntimeExports & EmbindModule; export default function MainModuleFactory (options?: unknown): Promise; diff --git a/packages/ecs/src/ecs-library.ts b/packages/ecs/src/ecs-library.ts index 793a3e22..db735eee 100644 --- a/packages/ecs/src/ecs-library.ts +++ b/packages/ecs/src/ecs-library.ts @@ -8,6 +8,7 @@ import { import type { Entity, MainModule, Registry, SparseArray } from "../lib"; import { Module } from "../lib"; +import { type ECSContext } from "./ecs-context.type"; export type Component = { name: string; [key: string]: any }; export type System = (registry: Registry) => void; @@ -36,8 +37,8 @@ export class ECSLibrary extends BaseComponentSystemLibrary { this.registry = new this.module.Registry(); } - async run(): Promise { - this.runSystems(); + async run(ctx: ECSContext): Promise { + this.runSystems(ctx); } addComponent(entity: Entity, component: Component): void { @@ -68,8 +69,8 @@ export class ECSLibrary extends BaseComponentSystemLibrary { this.registry.clearEntities(); } - runSystems(): void { - this.registry.runSystems(); + runSystems(ctx: ECSContext): void { + this.registry.runSystems(ctx); } clearSystems(): void { diff --git a/packages/ecs/test/wasm/Registry.spec.ts b/packages/ecs/test/wasm/Registry.spec.ts index a5edffaa..2e8b9fb1 100644 --- a/packages/ecs/test/wasm/Registry.spec.ts +++ b/packages/ecs/test/wasm/Registry.spec.ts @@ -114,7 +114,7 @@ describe("Registry", () => { for (let i = 0; i <= 15; i++) { expect(counter).toBe(i); - r.runSystems(); + r.runSystems(null); } expect(counter).toBe(16); }); @@ -154,12 +154,12 @@ describe("Registry", () => { expect(r.getComponents(Position).get(e.getId())).toStrictEqual(new Position(-2, -2)); expect(r.getComponents(Position).get(e2.getId())).toStrictEqual(new Position(2, 2)); expect(r.getComponents(Position).get(e3.getId())).toStrictEqual(new Position(0, 0)); - r.runSystems(); + r.runSystems(null); expect(r.getComponents(Position).get(e.getId())).toStrictEqual(new Position(-1, -1)); expect(r.getComponents(Position).get(e2.getId())).toStrictEqual(new Position(1, 1)); expect(r.getComponents(Position).get(e3.getId())).toStrictEqual(new Position(0, 0)); - r.runSystems(); + r.runSystems(null); expect(r.getComponents(Position).get(e.getId())).toStrictEqual(new Position(0, 0)); expect(r.getComponents(Position).get(e2.getId())).toStrictEqual(new Position(0, 0)); diff --git a/packages/ecs/wasm/Registry.cpp b/packages/ecs/wasm/Registry.cpp index 25f14a18..87f2dbd7 100644 --- a/packages/ecs/wasm/Registry.cpp +++ b/packages/ecs/wasm/Registry.cpp @@ -23,7 +23,7 @@ namespace nfo { EMSCRIPTEN_BINDINGS(Registry) { emscripten::register_type("{name: string, [key: string]: any}"); - emscripten::register_type("(registry: Registry) => void"); + emscripten::register_type("(registry: Registry, ctx: any) => void"); emscripten::class_("Registry") .constructor() diff --git a/packages/ecs/wasm/Registry.hpp b/packages/ecs/wasm/Registry.hpp index d0253021..e3f45cda 100644 --- a/packages/ecs/wasm/Registry.hpp +++ b/packages/ecs/wasm/Registry.hpp @@ -159,11 +159,11 @@ namespace nfo { _systems.clear(); } - void run_systems() + void run_systems(const emscripten::val &ctx) { - std::vector> systems_copy = _systems; - for (std::function &system : systems_copy) - system(*this); + std::vector> systems_copy = _systems; + for (std::function &system : systems_copy) + system(*this, ctx); } void log(const Entity &entity) const @@ -214,7 +214,7 @@ namespace nfo { std::unordered_map> _remove_functions; std::unordered_map> _loggers; - std::vector> _systems; + std::vector> _systems; std::vector _dead_entities; std::size_t _next_entity{0};