@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityManager.js","sourceRoot":"","sources":["../../../../packages/ecs/src/EntityManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAe,MAAM,aAAa,CAAC;AAE1C,MAAM,OAAO,aAAa;IACP,WAAW,GAAa,EAAE,CAAC;IAC3B,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1B,IAAI,GAAa,EAAE,CAAC;IAErC,MAAM;QACJ,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACtD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,4BAA4B,EAAE,6BAA6B,CAAC,CAAC;QAC/I,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,UAAU,CAAC;IACxF,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import { type ComponentCtor } from "./Component.js";
2
+ import { type ComponentRegistry } from "./ComponentRegistry.js";
3
+ import { type ComponentStore } from "./ComponentStore.js";
4
+ import { type Entity } from "./Entity.js";
5
+ import { type EntityManager } from "./EntityManager.js";
6
+ export interface QueryOptions {
7
+ include?: ComponentCtor[];
8
+ exclude?: ComponentCtor[];
9
+ }
10
+ export declare class Query {
11
+ private readonly entities;
12
+ private readonly store;
13
+ private readonly includeMask;
14
+ private readonly excludeMask;
15
+ private readonly include;
16
+ private readonly exclude;
17
+ constructor(entities: EntityManager, store: ComponentStore, registry: ComponentRegistry, options: QueryOptions);
18
+ matches(entity: Entity): boolean;
19
+ toArray(): Entity[];
20
+ forEach(visitor: (entity: Entity) => void): void;
21
+ first(): Entity | undefined;
22
+ single(): Entity;
23
+ }
24
+ //# sourceMappingURL=Query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/Query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,qBAAa,KAAK;IAOd,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;gBAGhC,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,cAAc,EACtC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,YAAY;IAQvB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKhC,OAAO,IAAI,MAAM,EAAE;IAOnB,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhD,KAAK,IAAI,MAAM,GAAG,SAAS;IAI3B,MAAM,IAAI,MAAM;CAKjB"}
package/dist/Query.js ADDED
@@ -0,0 +1,47 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import { Bitset } from "./Bitset.js";
3
+ import {} from "./Component.js";
4
+ import {} from "./ComponentRegistry.js";
5
+ import {} from "./ComponentStore.js";
6
+ import {} from "./Entity.js";
7
+ import {} from "./EntityManager.js";
8
+ export class Query {
9
+ entities;
10
+ store;
11
+ includeMask;
12
+ excludeMask;
13
+ include;
14
+ exclude;
15
+ constructor(entities, store, registry, options) {
16
+ this.entities = entities;
17
+ this.store = store;
18
+ this.include = options.include ?? [];
19
+ this.exclude = options.exclude ?? [];
20
+ this.includeMask = Bitset.from(this.include.map((ctor) => registry.require(ctor).id));
21
+ this.excludeMask = Bitset.from(this.exclude.map((ctor) => registry.require(ctor).id));
22
+ }
23
+ matches(entity) {
24
+ const signature = this.store.signature(entity);
25
+ return signature.containsAll(this.includeMask) && !signature.intersects(this.excludeMask);
26
+ }
27
+ toArray() {
28
+ if (this.include.length === 1 && this.exclude.length === 0) {
29
+ return this.store.entitiesWith(this.include[0]);
30
+ }
31
+ return this.entities.entities().filter((entity) => this.matches(entity));
32
+ }
33
+ forEach(visitor) {
34
+ for (const entity of this.toArray())
35
+ visitor(entity);
36
+ }
37
+ first() {
38
+ return this.toArray()[0];
39
+ }
40
+ single() {
41
+ const result = this.toArray();
42
+ if (result.length !== 1)
43
+ throw new ValidationError("QUERY_SINGLE", `Expected exactly one entity, found ${result.length}.`);
44
+ return result[0];
45
+ }
46
+ }
47
+ //# sourceMappingURL=Query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Query.js","sourceRoot":"","sources":["../../../../packages/ecs/src/Query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAsB,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAA0B,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAuB,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAe,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAsB,MAAM,oBAAoB,CAAC;AAOxD,MAAM,OAAO,KAAK;IAOG;IACA;IAPF,WAAW,CAAS;IACpB,WAAW,CAAS;IACpB,OAAO,CAA2B;IAClC,OAAO,CAA2B;IAEnD,YACmB,QAAuB,EACvB,KAAqB,EACtC,QAA2B,EAC3B,OAAqB;QAHJ,aAAQ,GAAR,QAAQ,CAAe;QACvB,UAAK,GAAL,KAAK,CAAgB;QAItC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,CAAC,OAAiC;QACvC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,sCAAsC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3H,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { type Entity } from "./Entity.js";
2
+ export declare class SparseSet<T> {
3
+ private readonly denseEntities;
4
+ private readonly denseValues;
5
+ private readonly sparse;
6
+ add(entity: Entity, value: T): void;
7
+ get(entity: Entity): T | undefined;
8
+ has(entity: Entity): boolean;
9
+ delete(entity: Entity): boolean;
10
+ entries(): [Entity, T][];
11
+ entities(): Entity[];
12
+ get size(): number;
13
+ }
14
+ //# sourceMappingURL=SparseSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SparseSet.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/SparseSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAErD,qBAAa,SAAS,CAAC,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAW;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IAEpD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAYnC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAKlC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAgB/B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE;IAIxB,QAAQ,IAAI,MAAM,EAAE;IAIpB,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,50 @@
1
+ import { entityKey } from "./Entity.js";
2
+ export class SparseSet {
3
+ denseEntities = [];
4
+ denseValues = [];
5
+ sparse = new Map();
6
+ add(entity, value) {
7
+ const key = entityKey(entity);
8
+ const existing = this.sparse.get(key);
9
+ if (existing !== undefined) {
10
+ this.denseValues[existing] = value;
11
+ return;
12
+ }
13
+ this.sparse.set(key, this.denseEntities.length);
14
+ this.denseEntities.push(entity);
15
+ this.denseValues.push(value);
16
+ }
17
+ get(entity) {
18
+ const index = this.sparse.get(entityKey(entity));
19
+ return index === undefined ? undefined : this.denseValues[index];
20
+ }
21
+ has(entity) {
22
+ return this.sparse.has(entityKey(entity));
23
+ }
24
+ delete(entity) {
25
+ const key = entityKey(entity);
26
+ const index = this.sparse.get(key);
27
+ if (index === undefined)
28
+ return false;
29
+ const lastIndex = this.denseEntities.length - 1;
30
+ const lastEntity = this.denseEntities[lastIndex];
31
+ const lastValue = this.denseValues[lastIndex];
32
+ this.denseEntities[index] = lastEntity;
33
+ this.denseValues[index] = lastValue;
34
+ this.sparse.set(entityKey(lastEntity), index);
35
+ this.denseEntities.pop();
36
+ this.denseValues.pop();
37
+ this.sparse.delete(key);
38
+ return true;
39
+ }
40
+ entries() {
41
+ return this.denseEntities.map((entity, index) => [entity, this.denseValues[index]]);
42
+ }
43
+ entities() {
44
+ return this.denseEntities.map((entity) => ({ ...entity }));
45
+ }
46
+ get size() {
47
+ return this.denseEntities.length;
48
+ }
49
+ }
50
+ //# sourceMappingURL=SparseSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SparseSet.js","sourceRoot":"","sources":["../../../../packages/ecs/src/SparseSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAErD,MAAM,OAAO,SAAS;IACH,aAAa,GAAa,EAAE,CAAC;IAC7B,WAAW,GAAQ,EAAE,CAAC;IACtB,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEpD,GAAG,CAAC,MAAc,EAAE,KAAQ;QAC1B,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YACnC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import { type World } from "./World.js";
2
+ export type SystemPhase = "fixed" | "update" | "late";
3
+ export interface SystemContext {
4
+ readonly deltaTime: number;
5
+ readonly elapsedTime: number;
6
+ readonly frame: number;
7
+ }
8
+ export interface System {
9
+ readonly name: string;
10
+ readonly phase?: SystemPhase;
11
+ readonly priority?: number;
12
+ readonly before?: readonly string[];
13
+ readonly after?: readonly string[];
14
+ onAdd?(world: World): void;
15
+ onRemove?(world: World): void;
16
+ update(world: World, context: SystemContext): void;
17
+ }
18
+ //# sourceMappingURL=System.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"System.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/System.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;CACpD"}
package/dist/System.js ADDED
@@ -0,0 +1,2 @@
1
+ import {} from "./World.js";
2
+ //# sourceMappingURL=System.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"System.js","sourceRoot":"","sources":["../../../../packages/ecs/src/System.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type System, type SystemContext, type SystemPhase } from "./System.js";
2
+ import { type World } from "./World.js";
3
+ export declare class SystemScheduler {
4
+ private readonly systems;
5
+ add(system: System, world?: World): void;
6
+ remove(name: string, world?: World): boolean;
7
+ order(phase?: SystemPhase): System[];
8
+ update(world: World, context: SystemContext): void;
9
+ }
10
+ //# sourceMappingURL=SystemScheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemScheduler.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/SystemScheduler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAMxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO;IAO5C,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAKpC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;CAKnD"}
@@ -0,0 +1,79 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import {} from "./System.js";
3
+ import {} from "./World.js";
4
+ const phaseOrder = ["fixed", "update", "late"];
5
+ export class SystemScheduler {
6
+ systems = new Map();
7
+ add(system, world) {
8
+ if (this.systems.has(system.name))
9
+ throw new ValidationError("DUPLICATE_SYSTEM", `Duplicate system name: ${system.name}`);
10
+ this.systems.set(system.name, system);
11
+ system.onAdd?.(world);
12
+ }
13
+ remove(name, world) {
14
+ const system = this.systems.get(name);
15
+ if (!system)
16
+ return false;
17
+ system.onRemove?.(world);
18
+ return this.systems.delete(name);
19
+ }
20
+ order(phase) {
21
+ const systems = [...this.systems.values()].filter((system) => (system.phase ?? "update") === (phase ?? system.phase ?? "update"));
22
+ return sortSystems(systems);
23
+ }
24
+ update(world, context) {
25
+ for (const phase of phaseOrder) {
26
+ for (const system of this.order(phase))
27
+ system.update(world, context);
28
+ }
29
+ }
30
+ }
31
+ function sortSystems(systems) {
32
+ const byName = new Map(systems.map((system) => [system.name, system]));
33
+ const graph = new Map();
34
+ const indegree = new Map();
35
+ const insertion = new Map(systems.map((system, index) => [system.name, index]));
36
+ for (const system of systems) {
37
+ graph.set(system.name, new Set());
38
+ indegree.set(system.name, 0);
39
+ }
40
+ for (const system of systems) {
41
+ for (const dependency of system.after ?? [])
42
+ addEdge(dependency, system.name);
43
+ for (const dependent of system.before ?? [])
44
+ addEdge(system.name, dependent);
45
+ }
46
+ const ready = systems
47
+ .filter((system) => indegree.get(system.name) === 0)
48
+ .sort(compareSystems);
49
+ const result = [];
50
+ while (ready.length > 0) {
51
+ const system = ready.shift();
52
+ result.push(system);
53
+ for (const dependent of graph.get(system.name) ?? []) {
54
+ indegree.set(dependent, (indegree.get(dependent) ?? 0) - 1);
55
+ if (indegree.get(dependent) === 0) {
56
+ ready.push(byName.get(dependent));
57
+ ready.sort(compareSystems);
58
+ }
59
+ }
60
+ }
61
+ if (result.length !== systems.length)
62
+ throw new ValidationError("ECS_SYSTEM_CYCLE", "ECS system dependency cycle rejected.");
63
+ return result;
64
+ function addEdge(from, to) {
65
+ if (!byName.has(from))
66
+ throw new ValidationError("MISSING_ECS_SYSTEM_DEPENDENCY", `Missing ECS system dependency: ${from}`);
67
+ if (!byName.has(to))
68
+ throw new ValidationError("MISSING_ECS_SYSTEM_DEPENDENCY", `Missing ECS system dependency: ${to}`);
69
+ const edges = graph.get(from);
70
+ if (!edges.has(to)) {
71
+ edges.add(to);
72
+ indegree.set(to, (indegree.get(to) ?? 0) + 1);
73
+ }
74
+ }
75
+ function compareSystems(a, b) {
76
+ return (a.priority ?? 0) - (b.priority ?? 0) || (insertion.get(a.name) ?? 0) - (insertion.get(b.name) ?? 0);
77
+ }
78
+ }
79
+ //# sourceMappingURL=SystemScheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemScheduler.js","sourceRoot":"","sources":["../../../../packages/ecs/src/SystemScheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type ComponentCtor, type ComponentSchema } from "./Component.js";
2
+ import { ComponentRegistry } from "./ComponentRegistry.js";
3
+ import { ComponentStore } from "./ComponentStore.js";
4
+ import { type Entity } from "./Entity.js";
5
+ import { EntityManager } from "./EntityManager.js";
6
+ import { Query, type QueryOptions } from "./Query.js";
7
+ import { SystemScheduler } from "./SystemScheduler.js";
8
+ import { type SystemContext } from "./System.js";
9
+ export declare class World {
10
+ readonly entities: EntityManager;
11
+ readonly registry: ComponentRegistry;
12
+ readonly components: ComponentStore;
13
+ readonly systems: SystemScheduler;
14
+ private version;
15
+ registerComponent<T extends object>(ctor: ComponentCtor<T>, schema?: ComponentSchema): void;
16
+ createEntity(): Entity;
17
+ destroyEntity(entity: Entity): boolean;
18
+ add<T extends object>(entity: Entity, ctor: ComponentCtor<T>, component: T): void;
19
+ remove<T extends object>(entity: Entity, ctor: ComponentCtor<T>): boolean;
20
+ get<T extends object>(entity: Entity, ctor: ComponentCtor<T>): T | undefined;
21
+ has<T extends object>(entity: Entity, ctor: ComponentCtor<T>): boolean;
22
+ query(options: QueryOptions): Query;
23
+ update(context: SystemContext): void;
24
+ getVersion(): number;
25
+ assertAlive(entity: Entity): void;
26
+ }
27
+ //# sourceMappingURL=World.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"World.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/World.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,qBAAa,KAAK;IAChB,QAAQ,CAAC,QAAQ,gBAAuB;IACxC,QAAQ,CAAC,QAAQ,oBAA2B;IAC5C,QAAQ,CAAC,UAAU,iBAAqC;IACxD,QAAQ,CAAC,OAAO,kBAAyB;IACzC,OAAO,CAAC,OAAO,CAAK;IAEpB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI;IAI3F,YAAY,IAAI,MAAM;IAKtB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAUtC,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI;IAOjF,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,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,KAAK;IAInC,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIpC,UAAU,IAAI,MAAM;IAIpB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGlC"}
package/dist/World.js ADDED
@@ -0,0 +1,68 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import {} from "./Component.js";
3
+ import { ComponentRegistry } from "./ComponentRegistry.js";
4
+ import { ComponentStore } from "./ComponentStore.js";
5
+ import {} from "./Entity.js";
6
+ import { EntityManager } from "./EntityManager.js";
7
+ import { Query } from "./Query.js";
8
+ import { SystemScheduler } from "./SystemScheduler.js";
9
+ import {} from "./System.js";
10
+ export class World {
11
+ entities = new EntityManager();
12
+ registry = new ComponentRegistry();
13
+ components = new ComponentStore(this.registry);
14
+ systems = new SystemScheduler();
15
+ version = 0;
16
+ registerComponent(ctor, schema) {
17
+ this.registry.register(ctor, schema);
18
+ }
19
+ createEntity() {
20
+ this.version += 1;
21
+ return this.entities.create();
22
+ }
23
+ destroyEntity(entity) {
24
+ this.assertAlive(entity);
25
+ const destroyed = this.entities.destroy(entity);
26
+ if (destroyed) {
27
+ this.components.deleteEntity(entity);
28
+ this.version += 1;
29
+ }
30
+ return destroyed;
31
+ }
32
+ add(entity, ctor, component) {
33
+ this.assertAlive(entity);
34
+ if (!this.registry.get(ctor))
35
+ this.registry.register(ctor);
36
+ this.components.add(entity, ctor, component);
37
+ this.version += 1;
38
+ }
39
+ remove(entity, ctor) {
40
+ this.assertAlive(entity);
41
+ const removed = this.components.remove(entity, ctor);
42
+ if (removed)
43
+ this.version += 1;
44
+ return removed;
45
+ }
46
+ get(entity, ctor) {
47
+ this.assertAlive(entity);
48
+ return this.components.get(entity, ctor);
49
+ }
50
+ has(entity, ctor) {
51
+ this.assertAlive(entity);
52
+ return this.components.has(entity, ctor);
53
+ }
54
+ query(options) {
55
+ return new Query(this.entities, this.components, this.registry, options);
56
+ }
57
+ update(context) {
58
+ this.systems.update(this, context);
59
+ }
60
+ getVersion() {
61
+ return this.version;
62
+ }
63
+ assertAlive(entity) {
64
+ if (!this.entities.isAlive(entity))
65
+ throw new ValidationError("ENTITY_NOT_ALIVE", `Entity is not alive: ${entity.id}:${entity.generation}`);
66
+ }
67
+ }
68
+ //# sourceMappingURL=World.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"World.js","sourceRoot":"","sources":["../../../../packages/ecs/src/World.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type ComponentSchema } from "../Component.js";
2
+ export interface SerializedActiveComponent {
3
+ readonly activeSelf: boolean;
4
+ }
5
+ export declare class ActiveComponent {
6
+ activeSelf: boolean;
7
+ activeInHierarchy: boolean;
8
+ constructor(active?: boolean);
9
+ get isActive(): boolean;
10
+ get isActiveInHierarchy(): boolean;
11
+ setActive(active: boolean): void;
12
+ toggle(): void;
13
+ toJSON(): SerializedActiveComponent;
14
+ static readonly schema: ComponentSchema;
15
+ }
16
+ //# sourceMappingURL=ActiveComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/ActiveComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,qBAAa,eAAe;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;gBAEf,MAAM,UAAO;IAMzB,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAKhC,MAAM,IAAI,IAAI;IAId,MAAM,IAAI,yBAAyB;IAInC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAYrC;CACH"}
@@ -0,0 +1,46 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import {} from "../Component.js";
3
+ export class ActiveComponent {
4
+ activeSelf;
5
+ activeInHierarchy;
6
+ constructor(active = true) {
7
+ if (typeof active !== "boolean")
8
+ throw new ValidationError("ACTIVE_COMPONENT", "ActiveComponent expects a boolean active state.");
9
+ this.activeSelf = active;
10
+ this.activeInHierarchy = active;
11
+ }
12
+ get isActive() {
13
+ return this.activeSelf;
14
+ }
15
+ get isActiveInHierarchy() {
16
+ return this.activeInHierarchy;
17
+ }
18
+ setActive(active) {
19
+ if (typeof active !== "boolean")
20
+ throw new ValidationError("ACTIVE_COMPONENT", "Active state must be boolean.");
21
+ this.activeSelf = active;
22
+ }
23
+ toggle() {
24
+ this.activeSelf = !this.activeSelf;
25
+ }
26
+ toJSON() {
27
+ return { activeSelf: this.activeSelf };
28
+ }
29
+ static schema = {
30
+ version: 1,
31
+ serialize(component) {
32
+ const active = component;
33
+ return { activeSelf: active.activeSelf };
34
+ },
35
+ deserialize(data) {
36
+ if (!isRecord(data) || typeof data.activeSelf !== "boolean") {
37
+ throw new ValidationError("ACTIVE_COMPONENT_DESERIALIZE", "ActiveComponent data requires activeSelf boolean.");
38
+ }
39
+ return new ActiveComponent(data.activeSelf);
40
+ }
41
+ };
42
+ }
43
+ function isRecord(value) {
44
+ return typeof value === "object" && value !== null;
45
+ }
46
+ //# sourceMappingURL=ActiveComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/ActiveComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAwB,MAAM,iBAAiB,CAAC;AAMvD,MAAM,OAAO,eAAe;IAC1B,UAAU,CAAU;IACpB,iBAAiB,CAAU;IAE3B,YAAY,MAAM,GAAG,IAAI;QACvB,IAAI,OAAO,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,iDAAiD,CAAC,CAAC;QAClI,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,SAAS,CAAC,MAAe;QACvB,IAAI,OAAO,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,+BAA+B,CAAC,CAAC;QAChH,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;IACrC,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,CAAU,MAAM,GAAoB;QACxC,OAAO,EAAE,CAAC;QACV,SAAS,CAAC,SAAiB;YACzB,MAAM,MAAM,GAAG,SAA4B,CAAC;YAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3C,CAAC;QACD,WAAW,CAAC,IAAa;YACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC5D,MAAM,IAAI,eAAe,CAAC,8BAA8B,EAAE,mDAAmD,CAAC,CAAC;YACjH,CAAC;YACD,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC;;AAGJ,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type ComponentSchema } from "../Component.js";
2
+ import { type Entity } from "../Entity.js";
3
+ export interface SerializedHierarchyComponent {
4
+ readonly parent: Entity | null;
5
+ readonly children: readonly Entity[];
6
+ readonly previousSibling: Entity | null;
7
+ readonly nextSibling: Entity | null;
8
+ readonly depth: number;
9
+ }
10
+ export declare class HierarchyComponent {
11
+ parent: Entity | null;
12
+ previousSibling: Entity | null;
13
+ nextSibling: Entity | null;
14
+ depth: number;
15
+ private readonly childEntities;
16
+ constructor(parent?: Entity | null);
17
+ get children(): readonly Entity[];
18
+ get childCount(): number;
19
+ get firstChild(): Entity | null;
20
+ get lastChild(): Entity | null;
21
+ hasParent(): boolean;
22
+ hasChildren(): boolean;
23
+ includesChild(entity: Entity): boolean;
24
+ forEachChild(callback: (child: Entity) => void): void;
25
+ getSiblingIndex(entity?: Entity): number;
26
+ _setParent(parent: Entity | null): void;
27
+ _addChild(child: Entity): void;
28
+ _removeChild(child: Entity): boolean;
29
+ _clearChildren(): void;
30
+ _moveChild(child: Entity, index: number): void;
31
+ toJSON(): SerializedHierarchyComponent;
32
+ static readonly schema: ComponentSchema;
33
+ }
34
+ //# sourceMappingURL=HierarchyComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HierarchyComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/HierarchyComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAElE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAkB;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,KAAK,SAAK;IACV,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAElC,MAAM,GAAE,MAAM,GAAG,IAAW;IAIxC,IAAI,QAAQ,IAAI,SAAS,MAAM,EAAE,CAEhC;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,OAAO;IAItB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC,YAAY,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIrD,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAKxC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIvC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOpC,cAAc,IAAI,IAAI;IAItB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9C,MAAM,IAAI,4BAA4B;IAUtC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAkBrC;CACH"}
@@ -0,0 +1,103 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import {} from "../Component.js";
3
+ import { entityKey, sameEntity } from "../Entity.js";
4
+ export class HierarchyComponent {
5
+ parent;
6
+ previousSibling = null;
7
+ nextSibling = null;
8
+ depth = 0;
9
+ childEntities = [];
10
+ constructor(parent = null) {
11
+ this.parent = parent;
12
+ }
13
+ get children() {
14
+ return this.childEntities;
15
+ }
16
+ get childCount() {
17
+ return this.childEntities.length;
18
+ }
19
+ get firstChild() {
20
+ return this.childEntities[0] ?? null;
21
+ }
22
+ get lastChild() {
23
+ return this.childEntities[this.childEntities.length - 1] ?? null;
24
+ }
25
+ hasParent() {
26
+ return this.parent !== null;
27
+ }
28
+ hasChildren() {
29
+ return this.childEntities.length > 0;
30
+ }
31
+ includesChild(entity) {
32
+ return this.childEntities.some((child) => sameEntity(child, entity));
33
+ }
34
+ forEachChild(callback) {
35
+ for (const child of this.childEntities)
36
+ callback(child);
37
+ }
38
+ getSiblingIndex(entity) {
39
+ if (!entity)
40
+ return this.parent ? 0 : -1;
41
+ return this.childEntities.findIndex((child) => sameEntity(child, entity));
42
+ }
43
+ _setParent(parent) {
44
+ this.parent = parent;
45
+ }
46
+ _addChild(child) {
47
+ if (!this.includesChild(child))
48
+ this.childEntities.push(child);
49
+ }
50
+ _removeChild(child) {
51
+ const index = this.childEntities.findIndex((entry) => sameEntity(entry, child));
52
+ if (index < 0)
53
+ return false;
54
+ this.childEntities.splice(index, 1);
55
+ return true;
56
+ }
57
+ _clearChildren() {
58
+ this.childEntities.length = 0;
59
+ }
60
+ _moveChild(child, index) {
61
+ const current = this.childEntities.findIndex((entry) => sameEntity(entry, child));
62
+ if (current < 0)
63
+ throw new ValidationError("ECS_HIERARCHY_CHILD", `Entity is not a child: ${entityKey(child)}`);
64
+ const [entry] = this.childEntities.splice(current, 1);
65
+ this.childEntities.splice(Math.max(0, Math.min(index, this.childEntities.length)), 0, entry);
66
+ }
67
+ toJSON() {
68
+ return {
69
+ parent: this.parent ? { ...this.parent } : null,
70
+ children: this.childEntities.map((child) => ({ ...child })),
71
+ previousSibling: this.previousSibling ? { ...this.previousSibling } : null,
72
+ nextSibling: this.nextSibling ? { ...this.nextSibling } : null,
73
+ depth: this.depth
74
+ };
75
+ }
76
+ static schema = {
77
+ version: 1,
78
+ serialize(component) {
79
+ return component.toJSON();
80
+ },
81
+ deserialize(data) {
82
+ if (!isRecord(data) || !Array.isArray(data.children)) {
83
+ throw new ValidationError("HIERARCHY_COMPONENT_DESERIALIZE", "HierarchyComponent data requires children array.");
84
+ }
85
+ const hierarchy = new HierarchyComponent(isEntity(data.parent) ? data.parent : null);
86
+ for (const child of data.children) {
87
+ if (isEntity(child))
88
+ hierarchy._addChild(child);
89
+ }
90
+ hierarchy.previousSibling = isEntity(data.previousSibling) ? data.previousSibling : null;
91
+ hierarchy.nextSibling = isEntity(data.nextSibling) ? data.nextSibling : null;
92
+ hierarchy.depth = typeof data.depth === "number" && Number.isFinite(data.depth) ? Math.max(0, Math.floor(data.depth)) : 0;
93
+ return hierarchy;
94
+ }
95
+ };
96
+ }
97
+ function isRecord(value) {
98
+ return typeof value === "object" && value !== null;
99
+ }
100
+ function isEntity(value) {
101
+ return isRecord(value) && Number.isSafeInteger(value.id) && Number.isSafeInteger(value.generation);
102
+ }
103
+ //# sourceMappingURL=HierarchyComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HierarchyComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/HierarchyComponent.ts"],"names":[],"mappings":"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"}