@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,5 @@
1
+ export declare class NameComponent {
2
+ name: string;
3
+ constructor(name: string);
4
+ }
5
+ //# sourceMappingURL=NameComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NameComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/NameComponent.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAa;IACL,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAGhC"}
@@ -0,0 +1,10 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ export class NameComponent {
3
+ name;
4
+ constructor(name) {
5
+ this.name = name;
6
+ if (!name)
7
+ throw new ValidationError("NAME_COMPONENT", "NameComponent requires a non-empty name.");
8
+ }
9
+ }
10
+ //# sourceMappingURL=NameComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NameComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/NameComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,OAAO,aAAa;IACL;IAAnB,YAAmB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAC7B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,eAAe,CAAC,gBAAgB,EAAE,0CAA0C,CAAC,CAAC;IACrG,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export declare class TagComponent {
2
+ tag: string;
3
+ constructor(tag: string);
4
+ }
5
+ //# sourceMappingURL=TagComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/TagComponent.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACJ,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM;CAG/B"}
@@ -0,0 +1,10 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ export class TagComponent {
3
+ tag;
4
+ constructor(tag) {
5
+ this.tag = tag;
6
+ if (!tag)
7
+ throw new ValidationError("TAG_COMPONENT", "TagComponent requires a non-empty tag.");
8
+ }
9
+ }
10
+ //# sourceMappingURL=TagComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/TagComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,OAAO,YAAY;IACJ;IAAnB,YAAmB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;QAC5B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,wCAAwC,CAAC,CAAC;IACjG,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import { Quaternion, Vector3 } from "@aura3d/math";
2
+ export declare class TransformComponent {
3
+ position: [number, number, number];
4
+ rotation: [number, number, number, number];
5
+ scale: [number, number, number];
6
+ constructor(position?: Vector3 | readonly [number, number, number], rotation?: Quaternion | readonly [number, number, number, number], scale?: Vector3 | readonly [number, number, number]);
7
+ toJSON(): {
8
+ position: [number, number, number];
9
+ rotation: [number, number, number, number];
10
+ scale: [number, number, number];
11
+ };
12
+ toMath(): {
13
+ position: Vector3;
14
+ rotation: Quaternion;
15
+ scale: Vector3;
16
+ };
17
+ }
18
+ //# sourceMappingURL=TransformComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/TransformComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEnD,qBAAa,kBAAkB;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAG9B,QAAQ,GAAE,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAwB,EAC5E,QAAQ,GAAE,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAA+B,EAC9F,KAAK,GAAE,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAuB;IAQ1E,MAAM,IAAI;QAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAQ7H,MAAM,IAAI;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE;CAOtE"}
@@ -0,0 +1,27 @@
1
+ import { Quaternion, Vector3 } from "@aura3d/math";
2
+ export class TransformComponent {
3
+ position;
4
+ rotation;
5
+ scale;
6
+ constructor(position = Vector3.zero.clone(), rotation = Quaternion.identity.clone(), scale = Vector3.one.clone()) {
7
+ this.position = position instanceof Vector3 ? position.toArray() : [...position];
8
+ const normalizedRotation = rotation instanceof Quaternion ? rotation.normalize() : new Quaternion(rotation[0], rotation[1], rotation[2], rotation[3]).normalize();
9
+ this.rotation = [normalizedRotation.x, normalizedRotation.y, normalizedRotation.z, normalizedRotation.w];
10
+ this.scale = scale instanceof Vector3 ? scale.toArray() : [...scale];
11
+ }
12
+ toJSON() {
13
+ return {
14
+ position: [...this.position],
15
+ rotation: [...this.rotation],
16
+ scale: [...this.scale]
17
+ };
18
+ }
19
+ toMath() {
20
+ return {
21
+ position: new Vector3(this.position[0], this.position[1], this.position[2]),
22
+ rotation: new Quaternion(this.rotation[0], this.rotation[1], this.rotation[2], this.rotation[3]),
23
+ scale: new Vector3(this.scale[0], this.scale[1], this.scale[2])
24
+ };
25
+ }
26
+ }
27
+ //# sourceMappingURL=TransformComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/TransformComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,OAAO,kBAAkB;IAC7B,QAAQ,CAA2B;IACnC,QAAQ,CAAmC;IAC3C,KAAK,CAA2B;IAEhC,YACE,WAAwD,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAC5E,WAAmE,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,EAC9F,QAAqD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;QAExE,IAAI,CAAC,QAAQ,GAAG,QAAQ,YAAY,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACjF,MAAM,kBAAkB,GAAG,QAAQ,YAAY,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAClK,IAAI,CAAC,QAAQ,GAAG,CAAC,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACzG,IAAI,CAAC,KAAK,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACvE,CAAC;IAED,MAAM;QACJ,OAAO;YACL,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;SACvB,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO;YACL,QAAQ,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3E,QAAQ,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAChG,KAAK,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ export * from "./Entity.js";
2
+ export * from "./EntityManager.js";
3
+ export * from "./Component.js";
4
+ export * from "./ComponentRegistry.js";
5
+ export * from "./SparseSet.js";
6
+ export * from "./Bitset.js";
7
+ export * from "./ComponentStore.js";
8
+ export * from "./Archetype.js";
9
+ export * from "./Query.js";
10
+ export * from "./CommandBuffer.js";
11
+ export * from "./System.js";
12
+ export * from "./SystemScheduler.js";
13
+ export * from "./World.js";
14
+ export * from "./ECSSerializer.js";
15
+ export * from "./ECSProfiler.js";
16
+ export * from "./components/TransformComponent.js";
17
+ export * from "./components/NameComponent.js";
18
+ export * from "./components/TagComponent.js";
19
+ export * from "./components/ActiveComponent.js";
20
+ export * from "./components/HierarchyComponent.js";
21
+ export * from "./systems/index.js";
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ export * from "./Entity.js";
2
+ export * from "./EntityManager.js";
3
+ export * from "./Component.js";
4
+ export * from "./ComponentRegistry.js";
5
+ export * from "./SparseSet.js";
6
+ export * from "./Bitset.js";
7
+ export * from "./ComponentStore.js";
8
+ export * from "./Archetype.js";
9
+ export * from "./Query.js";
10
+ export * from "./CommandBuffer.js";
11
+ export * from "./System.js";
12
+ export * from "./SystemScheduler.js";
13
+ export * from "./World.js";
14
+ export * from "./ECSSerializer.js";
15
+ export * from "./ECSProfiler.js";
16
+ export * from "./components/TransformComponent.js";
17
+ export * from "./components/NameComponent.js";
18
+ export * from "./components/TagComponent.js";
19
+ export * from "./components/ActiveComponent.js";
20
+ export * from "./components/HierarchyComponent.js";
21
+ export * from "./systems/index.js";
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/ecs/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type Entity } from "../Entity.js";
2
+ import { type System, type SystemContext } from "../System.js";
3
+ import { type World } from "../World.js";
4
+ export declare class ActiveSystem implements System {
5
+ readonly name = "ActiveSystem";
6
+ readonly phase = "update";
7
+ readonly priority = -90;
8
+ onActiveChanged?: (entity: Entity, activeInHierarchy: boolean) => void;
9
+ update(world: World, _context: SystemContext): void;
10
+ setActive(world: World, entity: Entity, active: boolean): void;
11
+ isActive(world: World, entity: Entity): boolean;
12
+ isActiveInHierarchy(world: World, entity: Entity): boolean;
13
+ getActiveEntities(world: World): Entity[];
14
+ getInactiveEntities(world: World): Entity[];
15
+ }
16
+ //# sourceMappingURL=ActiveSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveSystem.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/ActiveSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,qBAAa,YAAa,YAAW,MAAM;IACzC,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,YAAY;IAC1B,QAAQ,CAAC,QAAQ,OAAO;IACxB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAcnD,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAW9D,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/C,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAI1D,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IAIzC,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;CAG5C"}
@@ -0,0 +1,61 @@
1
+ import {} from "../Entity.js";
2
+ import {} from "../System.js";
3
+ import {} from "../World.js";
4
+ import { ActiveComponent } from "../components/ActiveComponent.js";
5
+ import { HierarchyComponent } from "../components/HierarchyComponent.js";
6
+ export class ActiveSystem {
7
+ name = "ActiveSystem";
8
+ phase = "update";
9
+ priority = -90;
10
+ onActiveChanged;
11
+ update(world, _context) {
12
+ const memo = new Map();
13
+ const entities = world.query({ include: [ActiveComponent] }).toArray().sort((left, right) => {
14
+ return (world.get(left, HierarchyComponent)?.depth ?? 0) - (world.get(right, HierarchyComponent)?.depth ?? 0);
15
+ });
16
+ for (const entity of entities) {
17
+ const component = world.get(entity, ActiveComponent);
18
+ if (!component)
19
+ continue;
20
+ const previous = component.activeInHierarchy;
21
+ component.activeInHierarchy = computeActiveInHierarchy(world, entity, memo);
22
+ if (previous !== component.activeInHierarchy)
23
+ this.onActiveChanged?.(entity, component.activeInHierarchy);
24
+ }
25
+ }
26
+ setActive(world, entity, active) {
27
+ let component = world.get(entity, ActiveComponent);
28
+ if (!component) {
29
+ component = new ActiveComponent(active);
30
+ world.add(entity, ActiveComponent, component);
31
+ }
32
+ else {
33
+ component.setActive(active);
34
+ }
35
+ this.update(world, { deltaTime: 0, elapsedTime: 0, frame: 0 });
36
+ }
37
+ isActive(world, entity) {
38
+ return world.get(entity, ActiveComponent)?.activeSelf ?? true;
39
+ }
40
+ isActiveInHierarchy(world, entity) {
41
+ return world.get(entity, ActiveComponent)?.activeInHierarchy ?? true;
42
+ }
43
+ getActiveEntities(world) {
44
+ return world.query({ include: [ActiveComponent] }).toArray().filter((entity) => this.isActiveInHierarchy(world, entity));
45
+ }
46
+ getInactiveEntities(world) {
47
+ return world.query({ include: [ActiveComponent] }).toArray().filter((entity) => !this.isActiveInHierarchy(world, entity));
48
+ }
49
+ }
50
+ function computeActiveInHierarchy(world, entity, memo) {
51
+ const key = `${entity.id}:${entity.generation}`;
52
+ const cached = memo.get(key);
53
+ if (cached !== undefined)
54
+ return cached;
55
+ const activeSelf = world.get(entity, ActiveComponent)?.activeSelf ?? true;
56
+ const parent = world.get(entity, HierarchyComponent)?.parent ?? null;
57
+ const active = activeSelf && (parent ? computeActiveInHierarchy(world, parent, memo) : true);
58
+ memo.set(key, active);
59
+ return active;
60
+ }
61
+ //# sourceMappingURL=ActiveSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveSystem.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/ActiveSystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type Entity } from "../Entity.js";
2
+ import { type System, type SystemContext } from "../System.js";
3
+ import { type World } from "../World.js";
4
+ export declare class HierarchySystem implements System {
5
+ readonly name = "HierarchySystem";
6
+ readonly phase = "update";
7
+ readonly priority = -100;
8
+ update(world: World, _context: SystemContext): void;
9
+ setParent(world: World, child: Entity, parent: Entity | null): void;
10
+ addChild(world: World, parent: Entity, child: Entity): void;
11
+ removeFromParent(world: World, entity: Entity): void;
12
+ getParent(world: World, entity: Entity): Entity | null;
13
+ getChildren(world: World, entity: Entity): readonly Entity[];
14
+ getDepth(world: World, entity: Entity): number;
15
+ forEachDescendant(world: World, entity: Entity, callback: (descendant: Entity, depth: number) => void): void;
16
+ isAncestorOf(world: World, ancestor: Entity, descendant: Entity): boolean;
17
+ isDescendantOf(world: World, descendant: Entity, ancestor: Entity): boolean;
18
+ setSiblingIndex(world: World, entity: Entity, index: number): void;
19
+ detachChildren(world: World, entity: Entity): Entity[];
20
+ validateHierarchy(world: World): boolean;
21
+ detectCycles(world: World): Entity[];
22
+ private updateDescendantDepths;
23
+ private refreshChildSiblings;
24
+ }
25
+ //# sourceMappingURL=HierarchySystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HierarchySystem.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/HierarchySystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,qBAAa,eAAgB,YAAW,MAAM;IAC5C,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,KAAK,YAAY;IAC1B,QAAQ,CAAC,QAAQ,QAAQ;IAEzB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAanD,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IA+BnE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3D,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpD,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;IAI5D,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAI9C,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAU5G,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAazE,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI3E,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOlE,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAMtD,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IASxC,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IAqBpC,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,oBAAoB;CAY7B"}
@@ -0,0 +1,185 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+ import { entityKey, sameEntity } from "../Entity.js";
3
+ import {} from "../System.js";
4
+ import {} from "../World.js";
5
+ import { HierarchyComponent } from "../components/HierarchyComponent.js";
6
+ export class HierarchySystem {
7
+ name = "HierarchySystem";
8
+ phase = "update";
9
+ priority = -100;
10
+ update(world, _context) {
11
+ for (const entity of world.query({ include: [HierarchyComponent] }).toArray()) {
12
+ const hierarchy = world.get(entity, HierarchyComponent);
13
+ if (!hierarchy)
14
+ continue;
15
+ if (hierarchy.parent && !world.entities.isAlive(hierarchy.parent)) {
16
+ hierarchy._setParent(null);
17
+ hierarchy.depth = 0;
18
+ }
19
+ }
20
+ const cycles = this.detectCycles(world);
21
+ if (cycles.length > 0)
22
+ throw new ValidationError("ECS_HIERARCHY_CYCLE", `Hierarchy cycle detected: ${cycles.map(entityKey).join(", ")}`);
23
+ }
24
+ setParent(world, child, parent) {
25
+ world.assertAlive(child);
26
+ if (parent)
27
+ world.assertAlive(parent);
28
+ if (parent && sameEntity(child, parent))
29
+ throw new ValidationError("ECS_HIERARCHY_SELF_PARENT", "Entity cannot be parented to itself.");
30
+ const childHierarchy = ensureHierarchy(world, child);
31
+ if (parent)
32
+ ensureHierarchy(world, parent);
33
+ if (parent && this.isAncestorOf(world, child, parent)) {
34
+ throw new ValidationError("ECS_HIERARCHY_CYCLE", `Parenting ${entityKey(child)} to ${entityKey(parent)} would create a cycle.`);
35
+ }
36
+ const previousParent = childHierarchy.parent;
37
+ if (sameOptionalEntity(childHierarchy.parent, parent))
38
+ return;
39
+ if (previousParent) {
40
+ world.get(previousParent, HierarchyComponent)?._removeChild(child);
41
+ this.refreshChildSiblings(world, previousParent);
42
+ }
43
+ childHierarchy._setParent(parent ? { ...parent } : null);
44
+ childHierarchy.previousSibling = null;
45
+ childHierarchy.nextSibling = null;
46
+ if (parent) {
47
+ const parentHierarchy = ensureHierarchy(world, parent);
48
+ parentHierarchy._addChild(child);
49
+ this.refreshChildSiblings(world, parent);
50
+ childHierarchy.depth = parentHierarchy.depth + 1;
51
+ }
52
+ else {
53
+ childHierarchy.depth = 0;
54
+ }
55
+ this.updateDescendantDepths(world, child);
56
+ }
57
+ addChild(world, parent, child) {
58
+ this.setParent(world, child, parent);
59
+ }
60
+ removeFromParent(world, entity) {
61
+ this.setParent(world, entity, null);
62
+ }
63
+ getParent(world, entity) {
64
+ return world.get(entity, HierarchyComponent)?.parent ?? null;
65
+ }
66
+ getChildren(world, entity) {
67
+ return world.get(entity, HierarchyComponent)?.children ?? [];
68
+ }
69
+ getDepth(world, entity) {
70
+ return world.get(entity, HierarchyComponent)?.depth ?? 0;
71
+ }
72
+ forEachDescendant(world, entity, callback) {
73
+ const hierarchy = world.get(entity, HierarchyComponent);
74
+ if (!hierarchy)
75
+ return;
76
+ for (const child of hierarchy.children) {
77
+ const childHierarchy = world.get(child, HierarchyComponent);
78
+ callback(child, childHierarchy?.depth ?? hierarchy.depth + 1);
79
+ this.forEachDescendant(world, child, callback);
80
+ }
81
+ }
82
+ isAncestorOf(world, ancestor, descendant) {
83
+ let cursor = world.get(descendant, HierarchyComponent)?.parent ?? null;
84
+ const guard = new Set();
85
+ while (cursor) {
86
+ if (sameEntity(cursor, ancestor))
87
+ return true;
88
+ const key = entityKey(cursor);
89
+ if (guard.has(key))
90
+ return false;
91
+ guard.add(key);
92
+ cursor = world.get(cursor, HierarchyComponent)?.parent ?? null;
93
+ }
94
+ return false;
95
+ }
96
+ isDescendantOf(world, descendant, ancestor) {
97
+ return this.isAncestorOf(world, ancestor, descendant);
98
+ }
99
+ setSiblingIndex(world, entity, index) {
100
+ const hierarchy = world.get(entity, HierarchyComponent);
101
+ if (!hierarchy?.parent)
102
+ return;
103
+ world.get(hierarchy.parent, HierarchyComponent)?._moveChild(entity, index);
104
+ this.refreshChildSiblings(world, hierarchy.parent);
105
+ }
106
+ detachChildren(world, entity) {
107
+ const children = [...this.getChildren(world, entity)];
108
+ for (const child of children)
109
+ this.setParent(world, child, null);
110
+ return children;
111
+ }
112
+ validateHierarchy(world) {
113
+ return this.detectCycles(world).length === 0 && world.query({ include: [HierarchyComponent] }).toArray().every((entity) => {
114
+ const hierarchy = world.get(entity, HierarchyComponent);
115
+ if (!hierarchy?.parent)
116
+ return true;
117
+ const parent = world.get(hierarchy.parent, HierarchyComponent);
118
+ return Boolean(parent?.includesChild(entity));
119
+ });
120
+ }
121
+ detectCycles(world) {
122
+ const cycles = [];
123
+ const visiting = new Set();
124
+ const visited = new Set();
125
+ const visit = (entity) => {
126
+ const key = entityKey(entity);
127
+ if (visiting.has(key)) {
128
+ cycles.push(entity);
129
+ return;
130
+ }
131
+ if (visited.has(key))
132
+ return;
133
+ visiting.add(key);
134
+ const parent = world.get(entity, HierarchyComponent)?.parent;
135
+ if (parent)
136
+ visit(parent);
137
+ visiting.delete(key);
138
+ visited.add(key);
139
+ };
140
+ for (const entity of world.query({ include: [HierarchyComponent] }).toArray())
141
+ visit(entity);
142
+ return cycles;
143
+ }
144
+ updateDescendantDepths(world, entity) {
145
+ const hierarchy = world.get(entity, HierarchyComponent);
146
+ if (!hierarchy)
147
+ return;
148
+ for (const child of hierarchy.children) {
149
+ const childHierarchy = world.get(child, HierarchyComponent);
150
+ if (!childHierarchy)
151
+ continue;
152
+ childHierarchy.depth = hierarchy.depth + 1;
153
+ this.updateDescendantDepths(world, child);
154
+ }
155
+ }
156
+ refreshChildSiblings(world, parent) {
157
+ const parentHierarchy = world.get(parent, HierarchyComponent);
158
+ if (!parentHierarchy)
159
+ return;
160
+ const children = parentHierarchy.children;
161
+ for (let index = 0; index < children.length; index += 1) {
162
+ const child = children[index];
163
+ const hierarchy = world.get(child, HierarchyComponent);
164
+ if (!hierarchy)
165
+ continue;
166
+ hierarchy.previousSibling = children[index - 1] ? { ...children[index - 1] } : null;
167
+ hierarchy.nextSibling = children[index + 1] ? { ...children[index + 1] } : null;
168
+ }
169
+ }
170
+ }
171
+ function ensureHierarchy(world, entity) {
172
+ if (!world.registry.get(HierarchyComponent))
173
+ world.registerComponent(HierarchyComponent);
174
+ const existing = world.get(entity, HierarchyComponent);
175
+ if (existing)
176
+ return existing;
177
+ world.add(entity, HierarchyComponent, new HierarchyComponent());
178
+ return world.get(entity, HierarchyComponent);
179
+ }
180
+ function sameOptionalEntity(left, right) {
181
+ if (!left || !right)
182
+ return left === right;
183
+ return sameEntity(left, right);
184
+ }
185
+ //# sourceMappingURL=HierarchySystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HierarchySystem.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/HierarchySystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./ActiveSystem.js";
2
+ export * from "./HierarchySystem.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./ActiveSystem.js";
2
+ export * from "./HierarchySystem.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@aura3d/ecs",
3
+ "version": "1.0.6",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "sideEffects": false,
14
+ "dependencies": {
15
+ "@aura3d/math": "1.0.6",
16
+ "@aura3d/core": "1.0.6"
17
+ }
18
+ }
@@ -0,0 +1,23 @@
1
+ import { Bitset } from "./Bitset.js";
2
+ import { type Entity } from "./Entity.js";
3
+
4
+ export class Archetype {
5
+ readonly signature: Bitset;
6
+ private readonly members = new Map<number, Entity>();
7
+
8
+ constructor(signature: Bitset) {
9
+ this.signature = signature.clone();
10
+ }
11
+
12
+ add(entity: Entity): void {
13
+ this.members.set(entity.id, entity);
14
+ }
15
+
16
+ delete(entity: Entity): boolean {
17
+ return this.members.delete(entity.id);
18
+ }
19
+
20
+ entities(): Entity[] {
21
+ return [...this.members.values()].sort((a, b) => a.id - b.id);
22
+ }
23
+ }
package/src/Bitset.ts ADDED
@@ -0,0 +1,47 @@
1
+ import { ValidationError } from "@aura3d/core";
2
+
3
+ export class Bitset {
4
+ private readonly values = new Set<number>();
5
+
6
+ static from(values: Iterable<number>): Bitset {
7
+ const bitset = new Bitset();
8
+ for (const value of values) bitset.add(value);
9
+ return bitset;
10
+ }
11
+
12
+ add(value: number): this {
13
+ if (!Number.isSafeInteger(value) || value < 0) throw new ValidationError("BITSET_VALUE", "Bitset values must be non-negative safe integers.");
14
+ this.values.add(value);
15
+ return this;
16
+ }
17
+
18
+ delete(value: number): boolean {
19
+ return this.values.delete(value);
20
+ }
21
+
22
+ has(value: number): boolean {
23
+ return this.values.has(value);
24
+ }
25
+
26
+ containsAll(other: Bitset): boolean {
27
+ for (const value of other.values) {
28
+ if (!this.values.has(value)) return false;
29
+ }
30
+ return true;
31
+ }
32
+
33
+ intersects(other: Bitset): boolean {
34
+ for (const value of other.values) {
35
+ if (this.values.has(value)) return true;
36
+ }
37
+ return false;
38
+ }
39
+
40
+ toArray(): number[] {
41
+ return [...this.values].sort((a, b) => a - b);
42
+ }
43
+
44
+ clone(): Bitset {
45
+ return Bitset.from(this.values);
46
+ }
47
+ }