@aura3d/ecs 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +18 -0
  2. package/dist/Archetype.d.ts +11 -0
  3. package/dist/Archetype.d.ts.map +1 -0
  4. package/dist/Archetype.js +19 -0
  5. package/dist/Archetype.js.map +1 -0
  6. package/dist/Bitset.d.ts +12 -0
  7. package/dist/Bitset.d.ts.map +1 -0
  8. package/dist/Bitset.js +43 -0
  9. package/dist/Bitset.js.map +1 -0
  10. package/dist/CommandBuffer.d.ts +16 -0
  11. package/dist/CommandBuffer.d.ts.map +1 -0
  12. package/dist/CommandBuffer.js +86 -0
  13. package/dist/CommandBuffer.js.map +1 -0
  14. package/dist/Component.d.ts +18 -0
  15. package/dist/Component.d.ts.map +1 -0
  16. package/dist/Component.js +7 -0
  17. package/dist/Component.js.map +1 -0
  18. package/dist/ComponentRegistry.d.ts +12 -0
  19. package/dist/ComponentRegistry.d.ts.map +1 -0
  20. package/dist/ComponentRegistry.js +36 -0
  21. package/dist/ComponentRegistry.js.map +1 -0
  22. package/dist/ComponentStore.d.ts +21 -0
  23. package/dist/ComponentStore.d.ts.map +1 -0
  24. package/dist/ComponentStore.js +66 -0
  25. package/dist/ComponentStore.js.map +1 -0
  26. package/dist/ECSProfiler.d.ts +12 -0
  27. package/dist/ECSProfiler.d.ts.map +1 -0
  28. package/dist/ECSProfiler.js +13 -0
  29. package/dist/ECSProfiler.js.map +1 -0
  30. package/dist/ECSSerializer.d.ts +18 -0
  31. package/dist/ECSSerializer.d.ts.map +1 -0
  32. package/dist/ECSSerializer.js +37 -0
  33. package/dist/ECSSerializer.js.map +1 -0
  34. package/dist/Entity.d.ts +8 -0
  35. package/dist/Entity.d.ts.map +1 -0
  36. package/dist/Entity.js +14 -0
  37. package/dist/Entity.js.map +1 -0
  38. package/dist/EntityManager.d.ts +12 -0
  39. package/dist/EntityManager.d.ts.map +1 -0
  40. package/dist/EntityManager.js +33 -0
  41. package/dist/EntityManager.js.map +1 -0
  42. package/dist/Query.d.ts +24 -0
  43. package/dist/Query.d.ts.map +1 -0
  44. package/dist/Query.js +47 -0
  45. package/dist/Query.js.map +1 -0
  46. package/dist/SparseSet.d.ts +14 -0
  47. package/dist/SparseSet.d.ts.map +1 -0
  48. package/dist/SparseSet.js +50 -0
  49. package/dist/SparseSet.js.map +1 -0
  50. package/dist/System.d.ts +18 -0
  51. package/dist/System.d.ts.map +1 -0
  52. package/dist/System.js +2 -0
  53. package/dist/System.js.map +1 -0
  54. package/dist/SystemScheduler.d.ts +10 -0
  55. package/dist/SystemScheduler.d.ts.map +1 -0
  56. package/dist/SystemScheduler.js +79 -0
  57. package/dist/SystemScheduler.js.map +1 -0
  58. package/dist/World.d.ts +27 -0
  59. package/dist/World.d.ts.map +1 -0
  60. package/dist/World.js +68 -0
  61. package/dist/World.js.map +1 -0
  62. package/dist/components/ActiveComponent.d.ts +16 -0
  63. package/dist/components/ActiveComponent.d.ts.map +1 -0
  64. package/dist/components/ActiveComponent.js +46 -0
  65. package/dist/components/ActiveComponent.js.map +1 -0
  66. package/dist/components/HierarchyComponent.d.ts +34 -0
  67. package/dist/components/HierarchyComponent.d.ts.map +1 -0
  68. package/dist/components/HierarchyComponent.js +103 -0
  69. package/dist/components/HierarchyComponent.js.map +1 -0
  70. package/dist/components/NameComponent.d.ts +5 -0
  71. package/dist/components/NameComponent.d.ts.map +1 -0
  72. package/dist/components/NameComponent.js +10 -0
  73. package/dist/components/NameComponent.js.map +1 -0
  74. package/dist/components/TagComponent.d.ts +5 -0
  75. package/dist/components/TagComponent.d.ts.map +1 -0
  76. package/dist/components/TagComponent.js +10 -0
  77. package/dist/components/TagComponent.js.map +1 -0
  78. package/dist/components/TransformComponent.d.ts +18 -0
  79. package/dist/components/TransformComponent.d.ts.map +1 -0
  80. package/dist/components/TransformComponent.js +27 -0
  81. package/dist/components/TransformComponent.js.map +1 -0
  82. package/dist/index.d.ts +22 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +22 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/systems/ActiveSystem.d.ts +16 -0
  87. package/dist/systems/ActiveSystem.d.ts.map +1 -0
  88. package/dist/systems/ActiveSystem.js +61 -0
  89. package/dist/systems/ActiveSystem.js.map +1 -0
  90. package/dist/systems/HierarchySystem.d.ts +25 -0
  91. package/dist/systems/HierarchySystem.d.ts.map +1 -0
  92. package/dist/systems/HierarchySystem.js +185 -0
  93. package/dist/systems/HierarchySystem.js.map +1 -0
  94. package/dist/systems/index.d.ts +3 -0
  95. package/dist/systems/index.d.ts.map +1 -0
  96. package/dist/systems/index.js +3 -0
  97. package/dist/systems/index.js.map +1 -0
  98. package/package.json +18 -0
  99. package/src/Archetype.ts +23 -0
  100. package/src/Bitset.ts +47 -0
  101. package/src/CommandBuffer.ts +97 -0
  102. package/src/Component.ts +25 -0
  103. package/src/ComponentRegistry.ts +38 -0
  104. package/src/ComponentStore.ts +72 -0
  105. package/src/ECSProfiler.ts +19 -0
  106. package/src/ECSSerializer.ts +45 -0
  107. package/src/Entity.ts +19 -0
  108. package/src/EntityManager.ts +36 -0
  109. package/src/Query.ts +57 -0
  110. package/src/SparseSet.ts +56 -0
  111. package/src/System.ts +20 -0
  112. package/src/SystemScheduler.ts +79 -0
  113. package/src/World.ts +76 -0
  114. package/src/components/ActiveComponent.ts +56 -0
  115. package/src/components/HierarchyComponent.ts +124 -0
  116. package/src/components/NameComponent.ts +7 -0
  117. package/src/components/TagComponent.ts +7 -0
  118. package/src/components/TransformComponent.ts +34 -0
  119. package/src/index.ts +21 -0
  120. package/src/systems/ActiveSystem.ts +64 -0
  121. package/src/systems/HierarchySystem.ts +182 -0
  122. package/src/systems/index.ts +2 -0
  123. package/tests/ecs.test.ts +134 -0
  124. package/tsconfig.json +9 -0
package/README.md ADDED
@@ -0,0 +1,18 @@
1
+ # @aura3d/ecs
2
+
3
+ `@aura3d/ecs` owns entity identity, component registration/storage, sparse-set and archetype data structures, queries, command buffering, systems, scheduling, serialization, profiling, and common transform/name/tag components.
4
+
5
+ ## Public API
6
+
7
+ - `Entity`, `EntityManager`: deterministic entity allocation, liveness, and recycling.
8
+ - `Component`, `ComponentRegistry`, `ComponentStore`, `SparseSet`, `Bitset`, `Archetype`: component metadata and storage primitives.
9
+ - `Query`: include/exclude query execution over component stores.
10
+ - `CommandBuffer`: deferred entity and component mutation.
11
+ - `System`, `SystemScheduler`, `World`: ECS update ownership, phase ordering, and system execution.
12
+ - `ECSSerializer`, `ECSProfiler`: deterministic serialization and runtime stats.
13
+ - `TransformComponent`, `NameComponent`, `TagComponent`, `ActiveComponent`, `HierarchyComponent`: common components for scene, gameplay, active-state, and parent/child integration.
14
+ - `ActiveSystem`, `HierarchySystem`: active-in-hierarchy propagation, cycle-safe parenting, traversal, sibling ordering, and hierarchy validation.
15
+
16
+ ## Verification
17
+
18
+ Entity lifecycle, component stores, queries, command buffers, scheduler behavior, hierarchy/active systems, serialization, profiling, and scene/ECS integration are covered by `tests/unit/ecs/runtime.test.ts` and `tests/integration/scene-ecs-contracts.test.ts`. Export and import consistency is covered by `pnpm verify:exports` and `pnpm verify:imports`.
@@ -0,0 +1,11 @@
1
+ import { Bitset } from "./Bitset.js";
2
+ import { type Entity } from "./Entity.js";
3
+ export declare class Archetype {
4
+ readonly signature: Bitset;
5
+ private readonly members;
6
+ constructor(signature: Bitset);
7
+ add(entity: Entity): void;
8
+ delete(entity: Entity): boolean;
9
+ entities(): Entity[];
10
+ }
11
+ //# sourceMappingURL=Archetype.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Archetype.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/Archetype.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,qBAAa,SAAS;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;gBAEzC,SAAS,EAAE,MAAM;IAI7B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/B,QAAQ,IAAI,MAAM,EAAE;CAGrB"}
@@ -0,0 +1,19 @@
1
+ import { Bitset } from "./Bitset.js";
2
+ import {} from "./Entity.js";
3
+ export class Archetype {
4
+ signature;
5
+ members = new Map();
6
+ constructor(signature) {
7
+ this.signature = signature.clone();
8
+ }
9
+ add(entity) {
10
+ this.members.set(entity.id, entity);
11
+ }
12
+ delete(entity) {
13
+ return this.members.delete(entity.id);
14
+ }
15
+ entities() {
16
+ return [...this.members.values()].sort((a, b) => a.id - b.id);
17
+ }
18
+ }
19
+ //# sourceMappingURL=Archetype.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Archetype.js","sourceRoot":"","sources":["../../../../packages/ecs/src/Archetype.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAe,MAAM,aAAa,CAAC;AAE1C,MAAM,OAAO,SAAS;IACX,SAAS,CAAS;IACV,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ export declare class Bitset {
2
+ private readonly values;
3
+ static from(values: Iterable<number>): Bitset;
4
+ add(value: number): this;
5
+ delete(value: number): boolean;
6
+ has(value: number): boolean;
7
+ containsAll(other: Bitset): boolean;
8
+ intersects(other: Bitset): boolean;
9
+ toArray(): number[];
10
+ clone(): Bitset;
11
+ }
12
+ //# sourceMappingURL=Bitset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bitset.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/Bitset.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM;IAM7C,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMxB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3B,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOnC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOlC,OAAO,IAAI,MAAM,EAAE;IAInB,KAAK,IAAI,MAAM;CAGhB"}
package/dist/Bitset.js ADDED
@@ -0,0 +1,43 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ export class Bitset {
3
+ values = new Set();
4
+ static from(values) {
5
+ const bitset = new Bitset();
6
+ for (const value of values)
7
+ bitset.add(value);
8
+ return bitset;
9
+ }
10
+ add(value) {
11
+ if (!Number.isSafeInteger(value) || value < 0)
12
+ throw new ValidationError("BITSET_VALUE", "Bitset values must be non-negative safe integers.");
13
+ this.values.add(value);
14
+ return this;
15
+ }
16
+ delete(value) {
17
+ return this.values.delete(value);
18
+ }
19
+ has(value) {
20
+ return this.values.has(value);
21
+ }
22
+ containsAll(other) {
23
+ for (const value of other.values) {
24
+ if (!this.values.has(value))
25
+ return false;
26
+ }
27
+ return true;
28
+ }
29
+ intersects(other) {
30
+ for (const value of other.values) {
31
+ if (this.values.has(value))
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ toArray() {
37
+ return [...this.values].sort((a, b) => a - b);
38
+ }
39
+ clone() {
40
+ return Bitset.from(this.values);
41
+ }
42
+ }
43
+ //# sourceMappingURL=Bitset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bitset.js","sourceRoot":"","sources":["../../../../packages/ecs/src/Bitset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,OAAO,MAAM;IACA,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,MAAM,CAAC,IAAI,CAAC,MAAwB;QAClC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,KAAa;QACf,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,mDAAmD,CAAC,CAAC;QAC9I,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,KAAa;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC1C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,KAAK;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import { type ComponentCtor } from "./Component.js";
2
+ import { type Entity } from "./Entity.js";
3
+ import { type World } from "./World.js";
4
+ export type EntityRef = Entity | {
5
+ readonly tempId: number;
6
+ };
7
+ export declare class CommandBuffer {
8
+ private nextTempId;
9
+ private readonly commands;
10
+ createEntity(): EntityRef;
11
+ destroyEntity(entity: EntityRef): void;
12
+ add<T extends object>(entity: EntityRef, ctor: ComponentCtor<T>, component: T): void;
13
+ remove<T extends object>(entity: EntityRef, ctor: ComponentCtor<T>): void;
14
+ flush(world: World): Entity[];
15
+ }
16
+ //# sourceMappingURL=CommandBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandBuffer.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/CommandBuffer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAQ7D,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,YAAY,IAAI,SAAS;IAOzB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAItC,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI;IAIpF,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAIzE,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;CAmB9B"}
@@ -0,0 +1,86 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import {} from "./Component.js";
3
+ import { entityKey } from "./Entity.js";
4
+ import {} from "./World.js";
5
+ export class CommandBuffer {
6
+ nextTempId = 1;
7
+ commands = [];
8
+ createEntity() {
9
+ const ref = { tempId: this.nextTempId };
10
+ this.nextTempId += 1;
11
+ this.commands.push({ kind: "create", tempId: ref.tempId });
12
+ return ref;
13
+ }
14
+ destroyEntity(entity) {
15
+ this.commands.push({ kind: "destroy", entity });
16
+ }
17
+ add(entity, ctor, component) {
18
+ this.commands.push({ kind: "add", entity, ctor, component });
19
+ }
20
+ remove(entity, ctor) {
21
+ this.commands.push({ kind: "remove", entity, ctor });
22
+ }
23
+ flush(world) {
24
+ validateCommands(world, this.commands);
25
+ const tempEntities = new Map();
26
+ const created = [];
27
+ const commands = this.commands.splice(0, this.commands.length);
28
+ for (const command of commands) {
29
+ if (command.kind === "create") {
30
+ const entity = world.createEntity();
31
+ tempEntities.set(command.tempId, entity);
32
+ created.push(entity);
33
+ continue;
34
+ }
35
+ const entity = resolve(command.entity, tempEntities);
36
+ if (command.kind === "destroy")
37
+ world.destroyEntity(entity);
38
+ if (command.kind === "add")
39
+ world.add(entity, command.ctor, command.component);
40
+ if (command.kind === "remove")
41
+ world.remove(entity, command.ctor);
42
+ }
43
+ return created;
44
+ }
45
+ }
46
+ function validateCommands(world, commands) {
47
+ const tempAlive = new Set();
48
+ const deadEntities = new Set();
49
+ for (const command of commands) {
50
+ if (command.kind === "create") {
51
+ tempAlive.add(command.tempId);
52
+ continue;
53
+ }
54
+ validateEntityRef(world, command.entity, tempAlive, deadEntities);
55
+ if (command.kind === "remove")
56
+ world.registry.require(command.ctor);
57
+ if (command.kind === "destroy") {
58
+ if ("tempId" in command.entity) {
59
+ tempAlive.delete(command.entity.tempId);
60
+ }
61
+ else {
62
+ deadEntities.add(entityKey(command.entity));
63
+ }
64
+ }
65
+ }
66
+ }
67
+ function validateEntityRef(world, ref, tempAlive, deadEntities) {
68
+ if ("tempId" in ref) {
69
+ if (!tempAlive.has(ref.tempId))
70
+ throw new ValidationError("TEMP_ENTITY", `Temporary entity is not alive: ${ref.tempId}`);
71
+ return;
72
+ }
73
+ world.assertAlive(ref);
74
+ if (deadEntities.has(entityKey(ref)))
75
+ throw new ValidationError("ENTITY_NOT_ALIVE", `Entity was already destroyed by this command buffer: ${entityKey(ref)}`);
76
+ }
77
+ function resolve(ref, tempEntities) {
78
+ if ("tempId" in ref) {
79
+ const entity = tempEntities.get(ref.tempId);
80
+ if (!entity)
81
+ throw new ValidationError("TEMP_ENTITY", `Temporary entity was not created: ${ref.tempId}`);
82
+ return entity;
83
+ }
84
+ return ref;
85
+ }
86
+ //# sourceMappingURL=CommandBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandBuffer.js","sourceRoot":"","sources":["../../../../packages/ecs/src/CommandBuffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface ComponentCtor<T = object> {
2
+ readonly prototype: T;
3
+ readonly name: string;
4
+ readonly schema?: ComponentSchema;
5
+ }
6
+ export interface ComponentSchema {
7
+ readonly version: number;
8
+ serialize?(component: object): unknown;
9
+ deserialize?(data: unknown): object;
10
+ }
11
+ export interface ComponentType<T = object> {
12
+ readonly id: number;
13
+ readonly name: string;
14
+ readonly ctor: ComponentCtor<T>;
15
+ readonly schema: ComponentSchema;
16
+ }
17
+ export declare function componentName(ctor: ComponentCtor): string;
18
+ //# sourceMappingURL=Component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Component.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/Component.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM;IACvC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,WAAW,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CAClC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAGzD"}
@@ -0,0 +1,7 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ export function componentName(ctor) {
3
+ if (!ctor.name)
4
+ throw new ValidationError("COMPONENT_NAME", "Component classes must have a stable name.");
5
+ return ctor.name;
6
+ }
7
+ //# sourceMappingURL=Component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Component.js","sourceRoot":"","sources":["../../../../packages/ecs/src/Component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAqB/C,MAAM,UAAU,aAAa,CAAC,IAAmB;IAC/C,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,eAAe,CAAC,gBAAgB,EAAE,4CAA4C,CAAC,CAAC;IAC1G,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type ComponentCtor, type ComponentSchema, type ComponentType } from "./Component.js";
2
+ export declare class ComponentRegistry {
3
+ private nextId;
4
+ private readonly byCtor;
5
+ private readonly byName;
6
+ register<T extends object>(ctor: ComponentCtor<T>, schema?: ComponentSchema): ComponentType<T>;
7
+ get<T extends object>(ctor: ComponentCtor<T>): ComponentType<T> | undefined;
8
+ require<T extends object>(ctor: ComponentCtor<T>): ComponentType<T>;
9
+ getByName(name: string): ComponentType | undefined;
10
+ list(): ComponentType[];
11
+ }
12
+ //# sourceMappingURL=ComponentRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComponentRegistry.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/ComponentRegistry.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE7G,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAE3D,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC;IAY9F,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS;IAI3E,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAMnE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIlD,IAAI,IAAI,aAAa,EAAE;CAGxB"}
@@ -0,0 +1,36 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import { componentName } from "./Component.js";
3
+ export class ComponentRegistry {
4
+ nextId = 0;
5
+ byCtor = new Map();
6
+ byName = new Map();
7
+ register(ctor, schema) {
8
+ const name = componentName(ctor);
9
+ const existingByCtor = this.byCtor.get(ctor);
10
+ if (existingByCtor)
11
+ return existingByCtor;
12
+ if (this.byName.has(name))
13
+ throw new ValidationError("DUPLICATE_COMPONENT", `Duplicate component name: ${name}`);
14
+ const type = { id: this.nextId, name, ctor, schema: schema ?? ctor.schema ?? { version: 1 } };
15
+ this.nextId += 1;
16
+ this.byCtor.set(ctor, type);
17
+ this.byName.set(name, type);
18
+ return type;
19
+ }
20
+ get(ctor) {
21
+ return this.byCtor.get(ctor);
22
+ }
23
+ require(ctor) {
24
+ const type = this.get(ctor);
25
+ if (!type)
26
+ throw new ValidationError("UNREGISTERED_COMPONENT", `Component is not registered: ${componentName(ctor)}`);
27
+ return type;
28
+ }
29
+ getByName(name) {
30
+ return this.byName.get(name);
31
+ }
32
+ list() {
33
+ return [...this.byCtor.values()].sort((a, b) => a.id - b.id);
34
+ }
35
+ }
36
+ //# sourceMappingURL=ComponentRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComponentRegistry.js","sourceRoot":"","sources":["../../../../packages/ecs/src/ComponentRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAgE,MAAM,gBAAgB,CAAC;AAE7G,MAAM,OAAO,iBAAiB;IACpB,MAAM,GAAG,CAAC,CAAC;IACF,MAAM,GAAG,IAAI,GAAG,EAAgC,CAAC;IACjD,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE3D,QAAQ,CAAmB,IAAsB,EAAE,MAAwB;QACzE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,cAAc;YAAE,OAAO,cAAkC,CAAC;QAC9D,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACjH,MAAM,IAAI,GAAqB,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QAChH,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAqB,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAqB,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAmB,IAAsB;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAiC,CAAC;IAC/D,CAAC;IAED,OAAO,CAAmB,IAAsB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,eAAe,CAAC,wBAAwB,EAAE,gCAAgC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import { Bitset } from "./Bitset.js";
2
+ import { type ComponentCtor } from "./Component.js";
3
+ import { ComponentRegistry } from "./ComponentRegistry.js";
4
+ import { type Entity } from "./Entity.js";
5
+ export declare class ComponentStore {
6
+ private readonly registry;
7
+ private readonly stores;
8
+ private readonly signatures;
9
+ constructor(registry: ComponentRegistry);
10
+ add<T extends object>(entity: Entity, ctor: ComponentCtor<T>, component: T): void;
11
+ remove<T extends object>(entity: Entity, ctor: ComponentCtor<T>): boolean;
12
+ get<T extends object>(entity: Entity, ctor: ComponentCtor<T>): T | undefined;
13
+ has<T extends object>(entity: Entity, ctor: ComponentCtor<T>): boolean;
14
+ deleteEntity(entity: Entity): void;
15
+ signature(entity: Entity): Bitset;
16
+ entries<T extends object>(ctor: ComponentCtor<T>): [Entity, T][];
17
+ entitiesWith<T extends object>(ctor: ComponentCtor<T>): Entity[];
18
+ private storeFor;
19
+ private signatureFor;
20
+ }
21
+ //# sourceMappingURL=ComponentStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComponentStore.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/ComponentStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;gBAE3B,QAAQ,EAAE,iBAAiB;IAExD,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI;IAMjF,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO;IAOzE,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;IAK5E,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO;IAKtE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIjC,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE;IAKhE,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE;IAKhE,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,YAAY;CAQrB"}
@@ -0,0 +1,66 @@
1
+ import { Bitset } from "./Bitset.js";
2
+ import {} from "./Component.js";
3
+ import { ComponentRegistry } from "./ComponentRegistry.js";
4
+ import {} from "./Entity.js";
5
+ import { SparseSet } from "./SparseSet.js";
6
+ export class ComponentStore {
7
+ registry;
8
+ stores = new Map();
9
+ signatures = new Map();
10
+ constructor(registry) {
11
+ this.registry = registry;
12
+ }
13
+ add(entity, ctor, component) {
14
+ const type = this.registry.require(ctor);
15
+ this.storeFor(type).add(entity, component);
16
+ this.signatureFor(entity).add(type.id);
17
+ }
18
+ remove(entity, ctor) {
19
+ const type = this.registry.require(ctor);
20
+ const removed = this.storeFor(type).delete(entity);
21
+ if (removed)
22
+ this.signatureFor(entity).delete(type.id);
23
+ return removed;
24
+ }
25
+ get(entity, ctor) {
26
+ const type = this.registry.require(ctor);
27
+ return this.storeFor(type).get(entity);
28
+ }
29
+ has(entity, ctor) {
30
+ const type = this.registry.require(ctor);
31
+ return this.storeFor(type).has(entity);
32
+ }
33
+ deleteEntity(entity) {
34
+ for (const store of this.stores.values())
35
+ store.delete(entity);
36
+ this.signatures.delete(entity.id);
37
+ }
38
+ signature(entity) {
39
+ return this.signatures.get(entity.id)?.clone() ?? new Bitset();
40
+ }
41
+ entries(ctor) {
42
+ const type = this.registry.require(ctor);
43
+ return this.storeFor(type).entries();
44
+ }
45
+ entitiesWith(ctor) {
46
+ const type = this.registry.require(ctor);
47
+ return this.storeFor(type).entities();
48
+ }
49
+ storeFor(type) {
50
+ let store = this.stores.get(type.id);
51
+ if (!store) {
52
+ store = new SparseSet();
53
+ this.stores.set(type.id, store);
54
+ }
55
+ return store;
56
+ }
57
+ signatureFor(entity) {
58
+ let signature = this.signatures.get(entity.id);
59
+ if (!signature) {
60
+ signature = new Bitset();
61
+ this.signatures.set(entity.id, signature);
62
+ }
63
+ return signature;
64
+ }
65
+ }
66
+ //# sourceMappingURL=ComponentStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComponentStore.js","sourceRoot":"","sources":["../../../../packages/ecs/src/ComponentStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type World } from "./World.js";
2
+ export interface ECSProfileSnapshot {
3
+ entities: number;
4
+ components: {
5
+ name: string;
6
+ id: number;
7
+ count: number;
8
+ }[];
9
+ version: number;
10
+ }
11
+ export declare function profileWorld(world: World): ECSProfileSnapshot;
12
+ //# sourceMappingURL=ECSProfiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSProfiler.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/ECSProfiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB,CAU7D"}
@@ -0,0 +1,13 @@
1
+ import {} from "./World.js";
2
+ export function profileWorld(world) {
3
+ return {
4
+ entities: world.entities.size,
5
+ components: world.registry.list().map((type) => ({
6
+ name: type.name,
7
+ id: type.id,
8
+ count: world.components.entries(type.ctor).length
9
+ })),
10
+ version: world.getVersion()
11
+ };
12
+ }
13
+ //# sourceMappingURL=ECSProfiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSProfiler.js","sourceRoot":"","sources":["../../../../packages/ecs/src/ECSProfiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,YAAY,CAAC;AAQxC,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;QAC7B,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;SAClD,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type ComponentCtor } from "./Component.js";
2
+ import { type Entity } from "./Entity.js";
3
+ import { World } from "./World.js";
4
+ export interface SerializedEntity {
5
+ id: number;
6
+ generation: number;
7
+ components: Record<string, unknown>;
8
+ }
9
+ export interface SerializedWorld {
10
+ version: 1;
11
+ entities: SerializedEntity[];
12
+ }
13
+ export declare function serializeWorld(world: World): SerializedWorld;
14
+ export declare function deserializeWorld(serialized: SerializedWorld, componentTypes: ComponentCtor[]): {
15
+ world: World;
16
+ remap: Map<string, Entity>;
17
+ };
18
+ //# sourceMappingURL=ECSSerializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSSerializer.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/ECSSerializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,CAU5D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAgB3I"}
@@ -0,0 +1,37 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import {} from "./Component.js";
3
+ import {} from "./Entity.js";
4
+ import { World } from "./World.js";
5
+ export function serializeWorld(world) {
6
+ const entities = world.entities.entities().map((entity) => {
7
+ const components = {};
8
+ for (const type of world.registry.list()) {
9
+ const value = world.components.get(entity, type.ctor);
10
+ if (value)
11
+ components[type.name] = type.schema.serialize ? type.schema.serialize(value) : structuredClone(value);
12
+ }
13
+ return { id: entity.id, generation: entity.generation, components };
14
+ });
15
+ return { version: 1, entities };
16
+ }
17
+ export function deserializeWorld(serialized, componentTypes) {
18
+ if (serialized.version !== 1)
19
+ throw new ValidationError("ECS_VERSION", `Unsupported ECS version: ${serialized.version}`);
20
+ const world = new World();
21
+ for (const type of componentTypes)
22
+ world.registerComponent(type);
23
+ const remap = new Map();
24
+ for (const serializedEntity of serialized.entities) {
25
+ const entity = world.createEntity();
26
+ remap.set(`${serializedEntity.id}:${serializedEntity.generation}`, entity);
27
+ for (const [name, data] of Object.entries(serializedEntity.components)) {
28
+ const type = world.registry.getByName(name);
29
+ if (!type)
30
+ throw new ValidationError("ECS_DESERIALIZE_COMPONENT", `Missing component type during ECS deserialize: ${name}`);
31
+ const component = type.schema.deserialize ? type.schema.deserialize(data) : data;
32
+ world.add(entity, type.ctor, component);
33
+ }
34
+ }
35
+ return { world, remap };
36
+ }
37
+ //# sourceMappingURL=ECSSerializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSSerializer.js","sourceRoot":"","sources":["../../../../packages/ecs/src/ECSSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAsB,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAe,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAanC,MAAM,UAAU,cAAc,CAAC,KAAY;IACzC,MAAM,QAAQ,GAAuB,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5E,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAqB,CAAC,CAAC;YACvE,IAAI,KAAK;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACnH,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAA2B,EAAE,cAA+B;IAC3F,IAAI,UAAU,CAAC,OAAO,KAAK,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,aAAa,EAAE,4BAA4B,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IACzH,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,cAAc;QAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,gBAAgB,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACpC,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,EAAE,IAAI,gBAAgB,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3E,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE,kDAAkD,IAAI,EAAE,CAAC,CAAC;YAC5H,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjF,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAqB,EAAE,SAAmB,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface Entity {
2
+ readonly id: number;
3
+ readonly generation: number;
4
+ }
5
+ export declare function entityKey(entity: Entity): string;
6
+ export declare function sameEntity(a: Entity, b: Entity): boolean;
7
+ export declare function assertEntity(entity: Entity): void;
8
+ //# sourceMappingURL=Entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Entity.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/Entity.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGjD"}
package/dist/Entity.js ADDED
@@ -0,0 +1,14 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ export function entityKey(entity) {
3
+ return `${entity.id}:${entity.generation}`;
4
+ }
5
+ export function sameEntity(a, b) {
6
+ return a.id === b.id && a.generation === b.generation;
7
+ }
8
+ export function assertEntity(entity) {
9
+ if (!Number.isSafeInteger(entity.id) || entity.id < 0)
10
+ throw new ValidationError("ENTITY_ID", "Entity id must be a non-negative safe integer.");
11
+ if (!Number.isSafeInteger(entity.generation) || entity.generation < 0)
12
+ throw new ValidationError("ENTITY_GENERATION", "Entity generation must be a non-negative safe integer.");
13
+ }
14
+ //# sourceMappingURL=Entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Entity.js","sourceRoot":"","sources":["../../../../packages/ecs/src/Entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAO/C,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS,EAAE,CAAS;IAC7C,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,GAAG,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,WAAW,EAAE,gDAAgD,CAAC,CAAC;IAChJ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,wDAAwD,CAAC,CAAC;AAClL,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type Entity } from "./Entity.js";
2
+ export declare class EntityManager {
3
+ private readonly generations;
4
+ private readonly alive;
5
+ private readonly free;
6
+ create(): Entity;
7
+ destroy(entity: Entity): boolean;
8
+ isAlive(entity: Entity): boolean;
9
+ get size(): number;
10
+ entities(): Entity[];
11
+ }
12
+ //# sourceMappingURL=EntityManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityManager.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/EntityManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IAErC,MAAM,IAAI,MAAM;IAOhB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAShC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,QAAQ,IAAI,MAAM,EAAE;CAGrB"}
@@ -0,0 +1,33 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import {} from "./Entity.js";
3
+ export class EntityManager {
4
+ generations = [];
5
+ alive = new Set();
6
+ free = [];
7
+ create() {
8
+ const id = this.free.pop() ?? this.generations.length;
9
+ this.generations[id] ??= 0;
10
+ this.alive.add(id);
11
+ return { id, generation: this.generations[id] };
12
+ }
13
+ destroy(entity) {
14
+ if (!this.isAlive(entity))
15
+ return false;
16
+ this.alive.delete(entity.id);
17
+ this.generations[entity.id] += 1;
18
+ if (!Number.isSafeInteger(this.generations[entity.id]))
19
+ throw new ValidationError("ENTITY_GENERATION_OVERFLOW", "Entity generation overflow.");
20
+ this.free.push(entity.id);
21
+ return true;
22
+ }
23
+ isAlive(entity) {
24
+ return this.alive.has(entity.id) && this.generations[entity.id] === entity.generation;
25
+ }
26
+ get size() {
27
+ return this.alive.size;
28
+ }
29
+ entities() {
30
+ return [...this.alive].sort((a, b) => a - b).map((id) => ({ id, generation: this.generations[id] }));
31
+ }
32
+ }
33
+ //# sourceMappingURL=EntityManager.js.map