From e7f83858ac116519e5ca28bbd1f2e4bd1559c4e4 Mon Sep 17 00:00:00 2001 From: MartinFillon Date: Fri, 3 Oct 2025 12:39:07 +0200 Subject: [PATCH 1/2] feat(systems): start adding context to systems --- packages/ecs/src/ecs-library.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/ecs/src/ecs-library.ts b/packages/ecs/src/ecs-library.ts index 793a3e22..d45d2e2b 100644 --- a/packages/ecs/src/ecs-library.ts +++ b/packages/ecs/src/ecs-library.ts @@ -2,6 +2,7 @@ import { type AssetManagerLibrary } from "@nanoforge/asset-manager"; import { ASSET_MANAGER_LIBRARY, BaseComponentSystemLibrary, + type ExecutionContext, GRAPHICS_LIBRARY, type InitContext, } from "@nanoforge/common"; @@ -36,8 +37,8 @@ export class ECSLibrary extends BaseComponentSystemLibrary { this.registry = new this.module.Registry(); } - async run(): Promise { - this.runSystems(); + async run(ctx: ExecutionContext): 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: ExecutionContext): void { + this.registry.runSystems(ctx); } clearSystems(): void { From 95e7ccff2e140a1b5a6847d325d9a615d04af5f2 Mon Sep 17 00:00:00 2001 From: MartinFillon Date: Mon, 6 Oct 2025 20:45:59 +0200 Subject: [PATCH 2/2] feat(ecs): add ecs context to the systems --- packages/ecs/lib/libecs.d.ts | 21 ++++++++++++++++----- packages/ecs/src/ecs-library.ts | 6 +++--- packages/ecs/test/wasm/Registry.spec.ts | 6 +++--- packages/ecs/wasm/Registry.cpp | 2 +- packages/ecs/wasm/Registry.hpp | 10 +++++----- 5 files changed, 28 insertions(+), 17 deletions(-) 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 d45d2e2b..db735eee 100644 --- a/packages/ecs/src/ecs-library.ts +++ b/packages/ecs/src/ecs-library.ts @@ -2,13 +2,13 @@ import { type AssetManagerLibrary } from "@nanoforge/asset-manager"; import { ASSET_MANAGER_LIBRARY, BaseComponentSystemLibrary, - type ExecutionContext, GRAPHICS_LIBRARY, type InitContext, } from "@nanoforge/common"; 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; @@ -37,7 +37,7 @@ export class ECSLibrary extends BaseComponentSystemLibrary { this.registry = new this.module.Registry(); } - async run(ctx: ExecutionContext): Promise { + async run(ctx: ECSContext): Promise { this.runSystems(ctx); } @@ -69,7 +69,7 @@ export class ECSLibrary extends BaseComponentSystemLibrary { this.registry.clearEntities(); } - runSystems(ctx: ExecutionContext): void { + runSystems(ctx: ECSContext): void { this.registry.runSystems(ctx); } 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};