@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.
- package/README.md +18 -0
- package/dist/Archetype.d.ts +11 -0
- package/dist/Archetype.d.ts.map +1 -0
- package/dist/Archetype.js +19 -0
- package/dist/Archetype.js.map +1 -0
- package/dist/Bitset.d.ts +12 -0
- package/dist/Bitset.d.ts.map +1 -0
- package/dist/Bitset.js +43 -0
- package/dist/Bitset.js.map +1 -0
- package/dist/CommandBuffer.d.ts +16 -0
- package/dist/CommandBuffer.d.ts.map +1 -0
- package/dist/CommandBuffer.js +86 -0
- package/dist/CommandBuffer.js.map +1 -0
- package/dist/Component.d.ts +18 -0
- package/dist/Component.d.ts.map +1 -0
- package/dist/Component.js +7 -0
- package/dist/Component.js.map +1 -0
- package/dist/ComponentRegistry.d.ts +12 -0
- package/dist/ComponentRegistry.d.ts.map +1 -0
- package/dist/ComponentRegistry.js +36 -0
- package/dist/ComponentRegistry.js.map +1 -0
- package/dist/ComponentStore.d.ts +21 -0
- package/dist/ComponentStore.d.ts.map +1 -0
- package/dist/ComponentStore.js +66 -0
- package/dist/ComponentStore.js.map +1 -0
- package/dist/ECSProfiler.d.ts +12 -0
- package/dist/ECSProfiler.d.ts.map +1 -0
- package/dist/ECSProfiler.js +13 -0
- package/dist/ECSProfiler.js.map +1 -0
- package/dist/ECSSerializer.d.ts +18 -0
- package/dist/ECSSerializer.d.ts.map +1 -0
- package/dist/ECSSerializer.js +37 -0
- package/dist/ECSSerializer.js.map +1 -0
- package/dist/Entity.d.ts +8 -0
- package/dist/Entity.d.ts.map +1 -0
- package/dist/Entity.js +14 -0
- package/dist/Entity.js.map +1 -0
- package/dist/EntityManager.d.ts +12 -0
- package/dist/EntityManager.d.ts.map +1 -0
- package/dist/EntityManager.js +33 -0
- package/dist/EntityManager.js.map +1 -0
- package/dist/Query.d.ts +24 -0
- package/dist/Query.d.ts.map +1 -0
- package/dist/Query.js +47 -0
- package/dist/Query.js.map +1 -0
- package/dist/SparseSet.d.ts +14 -0
- package/dist/SparseSet.d.ts.map +1 -0
- package/dist/SparseSet.js +50 -0
- package/dist/SparseSet.js.map +1 -0
- package/dist/System.d.ts +18 -0
- package/dist/System.d.ts.map +1 -0
- package/dist/System.js +2 -0
- package/dist/System.js.map +1 -0
- package/dist/SystemScheduler.d.ts +10 -0
- package/dist/SystemScheduler.d.ts.map +1 -0
- package/dist/SystemScheduler.js +79 -0
- package/dist/SystemScheduler.js.map +1 -0
- package/dist/World.d.ts +27 -0
- package/dist/World.d.ts.map +1 -0
- package/dist/World.js +68 -0
- package/dist/World.js.map +1 -0
- package/dist/components/ActiveComponent.d.ts +16 -0
- package/dist/components/ActiveComponent.d.ts.map +1 -0
- package/dist/components/ActiveComponent.js +46 -0
- package/dist/components/ActiveComponent.js.map +1 -0
- package/dist/components/HierarchyComponent.d.ts +34 -0
- package/dist/components/HierarchyComponent.d.ts.map +1 -0
- package/dist/components/HierarchyComponent.js +103 -0
- package/dist/components/HierarchyComponent.js.map +1 -0
- package/dist/components/NameComponent.d.ts +5 -0
- package/dist/components/NameComponent.d.ts.map +1 -0
- package/dist/components/NameComponent.js +10 -0
- package/dist/components/NameComponent.js.map +1 -0
- package/dist/components/TagComponent.d.ts +5 -0
- package/dist/components/TagComponent.d.ts.map +1 -0
- package/dist/components/TagComponent.js +10 -0
- package/dist/components/TagComponent.js.map +1 -0
- package/dist/components/TransformComponent.d.ts +18 -0
- package/dist/components/TransformComponent.d.ts.map +1 -0
- package/dist/components/TransformComponent.js +27 -0
- package/dist/components/TransformComponent.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/systems/ActiveSystem.d.ts +16 -0
- package/dist/systems/ActiveSystem.d.ts.map +1 -0
- package/dist/systems/ActiveSystem.js +61 -0
- package/dist/systems/ActiveSystem.js.map +1 -0
- package/dist/systems/HierarchySystem.d.ts +25 -0
- package/dist/systems/HierarchySystem.d.ts.map +1 -0
- package/dist/systems/HierarchySystem.js +185 -0
- package/dist/systems/HierarchySystem.js.map +1 -0
- package/dist/systems/index.d.ts +3 -0
- package/dist/systems/index.d.ts.map +1 -0
- package/dist/systems/index.js +3 -0
- package/dist/systems/index.js.map +1 -0
- package/package.json +18 -0
- package/src/Archetype.ts +23 -0
- package/src/Bitset.ts +47 -0
- package/src/CommandBuffer.ts +97 -0
- package/src/Component.ts +25 -0
- package/src/ComponentRegistry.ts +38 -0
- package/src/ComponentStore.ts +72 -0
- package/src/ECSProfiler.ts +19 -0
- package/src/ECSSerializer.ts +45 -0
- package/src/Entity.ts +19 -0
- package/src/EntityManager.ts +36 -0
- package/src/Query.ts +57 -0
- package/src/SparseSet.ts +56 -0
- package/src/System.ts +20 -0
- package/src/SystemScheduler.ts +79 -0
- package/src/World.ts +76 -0
- package/src/components/ActiveComponent.ts +56 -0
- package/src/components/HierarchyComponent.ts +124 -0
- package/src/components/NameComponent.ts +7 -0
- package/src/components/TagComponent.ts +7 -0
- package/src/components/TransformComponent.ts +34 -0
- package/src/index.ts +21 -0
- package/src/systems/ActiveSystem.ts +64 -0
- package/src/systems/HierarchySystem.ts +182 -0
- package/src/systems/index.ts +2 -0
- package/tests/ecs.test.ts +134 -0
- 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"}
|
package/dist/Query.d.ts
ADDED
|
@@ -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"}
|
package/dist/System.d.ts
ADDED
|
@@ -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 @@
|
|
|
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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"}
|
package/dist/World.d.ts
ADDED
|
@@ -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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAA4C,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAe,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAqB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAsB,MAAM,aAAa,CAAC;AAEjD,MAAM,OAAO,KAAK;IACP,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAC/B,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACnC,UAAU,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,OAAO,GAAG,CAAC,CAAC;IAEpB,iBAAiB,CAAmB,IAAsB,EAAE,MAAwB;QAClF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,YAAY;QACV,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,aAAa,CAAC,MAAc;QAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,GAAG,CAAmB,MAAc,EAAE,IAAsB,EAAE,SAAY;QACxE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,CAAmB,MAAc,EAAE,IAAsB;QAC7D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,OAAO;YAAE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAmB,MAAc,EAAE,IAAsB;QAC1D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAmB,MAAc,EAAE,IAAsB;QAC1D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAqB;QACzB,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,OAAsB;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,wBAAwB,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9I,CAAC;CACF"}
|
|
@@ -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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"}
|