@vworlds/vecs 1.0.15 → 1.0.16
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 +249 -119
- package/dist/component.d.ts +52 -76
- package/dist/component.js +60 -45
- package/dist/component.js.map +1 -1
- package/dist/component_meta.d.ts +98 -0
- package/dist/component_meta.js +65 -0
- package/dist/component_meta.js.map +1 -0
- package/dist/dsl.d.ts +46 -34
- package/dist/dsl.js +459 -61
- package/dist/dsl.js.map +1 -1
- package/dist/entity/entity.base.d.ts +57 -0
- package/dist/entity/entity.base.js +81 -0
- package/dist/entity/entity.base.js.map +1 -0
- package/dist/entity/entity.components.d.ts +117 -0
- package/dist/entity/entity.components.js +244 -0
- package/dist/entity/entity.components.js.map +1 -0
- package/dist/entity/entity.d.ts +35 -0
- package/dist/entity/entity.identity.d.ts +8 -0
- package/dist/entity/entity.identity.js +15 -0
- package/dist/entity/entity.identity.js.map +1 -0
- package/dist/entity/entity.js +33 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/entity.lifecycle.d.ts +12 -0
- package/dist/entity/entity.lifecycle.js +111 -0
- package/dist/entity/entity.lifecycle.js.map +1 -0
- package/dist/entity/entity.queries.d.ts +3 -0
- package/dist/entity/entity.queries.js +33 -0
- package/dist/entity/entity.queries.js.map +1 -0
- package/dist/entity/entity.relationships.d.ts +9 -0
- package/dist/entity/entity.relationships.js +74 -0
- package/dist/entity/entity.relationships.js.map +1 -0
- package/dist/entity/index.d.ts +2 -0
- package/dist/entity/index.js +3 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/filter.d.ts +27 -8
- package/dist/filter.js +33 -18
- package/dist/filter.js.map +1 -1
- package/dist/index.d.ts +13 -5
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/inject.d.ts +80 -0
- package/dist/inject.js +270 -0
- package/dist/inject.js.map +1 -0
- package/dist/module.d.ts +23 -0
- package/dist/module.js +17 -0
- package/dist/module.js.map +1 -0
- package/dist/modules/identity.d.ts +15 -0
- package/dist/modules/identity.js +41 -0
- package/dist/modules/identity.js.map +1 -0
- package/dist/modules/singleton.d.ts +26 -0
- package/dist/modules/singleton.js +41 -0
- package/dist/modules/singleton.js.map +1 -0
- package/dist/package.json +12 -1
- package/dist/phase.d.ts +2 -2
- package/dist/query/index.d.ts +6 -0
- package/dist/query/index.js +5 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/query.00.base.d.ts +23 -0
- package/dist/query/query.00.base.js +77 -0
- package/dist/query/query.00.base.js.map +1 -0
- package/dist/query/query.01.reactive.d.ts +7 -0
- package/dist/query/query.01.reactive.js +58 -0
- package/dist/query/query.01.reactive.js.map +1 -0
- package/dist/query/query.02.lifecycle.d.ts +6 -0
- package/dist/query/query.02.lifecycle.js +63 -0
- package/dist/query/query.02.lifecycle.js.map +1 -0
- package/dist/query/query.03.tracking.d.ts +15 -0
- package/dist/query/query.03.tracking.js +31 -0
- package/dist/query/query.03.tracking.js.map +1 -0
- package/dist/query/query.04.callbacks.d.ts +14 -0
- package/dist/query/query.04.callbacks.js +65 -0
- package/dist/query/query.04.callbacks.js.map +1 -0
- package/dist/query/query.05.updates.d.ts +14 -0
- package/dist/query/query.05.updates.js +81 -0
- package/dist/query/query.05.updates.js.map +1 -0
- package/dist/query/query.06.predicate.d.ts +13 -0
- package/dist/query/query.06.predicate.js +40 -0
- package/dist/query/query.06.predicate.js.map +1 -0
- package/dist/query/query.07.groups.d.ts +41 -0
- package/dist/query/query.07.groups.js +110 -0
- package/dist/query/query.07.groups.js.map +1 -0
- package/dist/query/query.d.ts +53 -0
- package/dist/query/query.js +138 -0
- package/dist/query/query.js.map +1 -0
- package/dist/relationship.d.ts +19 -0
- package/dist/relationship.js +18 -0
- package/dist/relationship.js.map +1 -0
- package/dist/system.d.ts +37 -23
- package/dist/system.js +80 -64
- package/dist/system.js.map +1 -1
- package/dist/terms/all_term.d.ts +32 -0
- package/dist/terms/all_term.js +41 -0
- package/dist/terms/all_term.js.map +1 -0
- package/dist/terms/any_term.d.ts +33 -0
- package/dist/terms/any_term.js +42 -0
- package/dist/terms/any_term.js.map +1 -0
- package/dist/terms/build.d.ts +62 -0
- package/dist/terms/build.js +382 -0
- package/dist/terms/build.js.map +1 -0
- package/dist/terms/component_term.d.ts +37 -0
- package/dist/terms/component_term.js +49 -0
- package/dist/terms/component_term.js.map +1 -0
- package/dist/terms/empty_term.d.ts +6 -0
- package/dist/terms/empty_term.js +12 -0
- package/dist/terms/empty_term.js.map +1 -0
- package/dist/terms/index.d.ts +11 -0
- package/dist/terms/index.js +12 -0
- package/dist/terms/index.js.map +1 -0
- package/dist/terms/not_term.d.ts +35 -0
- package/dist/terms/not_term.js +47 -0
- package/dist/terms/not_term.js.map +1 -0
- package/dist/terms/only_term.d.ts +47 -0
- package/dist/terms/only_term.js +79 -0
- package/dist/terms/only_term.js.map +1 -0
- package/dist/terms/predicate_term.d.ts +80 -0
- package/dist/terms/predicate_term.js +109 -0
- package/dist/terms/predicate_term.js.map +1 -0
- package/dist/terms/target_term.d.ts +43 -0
- package/dist/terms/target_term.js +87 -0
- package/dist/terms/target_term.js.map +1 -0
- package/dist/terms/term.d.ts +94 -0
- package/dist/terms/term.js +202 -0
- package/dist/terms/term.js.map +1 -0
- package/dist/terms/world_term.d.ts +68 -0
- package/dist/terms/world_term.js +99 -0
- package/dist/terms/world_term.js.map +1 -0
- package/dist/timer.js +2 -2
- package/dist/timer.js.map +1 -1
- package/dist/util/array_map.js +12 -0
- package/dist/util/array_map.js.map +1 -1
- package/dist/util/bitset.js +107 -22
- package/dist/util/bitset.js.map +1 -1
- package/dist/util/dense_set.d.ts +1 -0
- package/dist/util/dense_set.js +90 -0
- package/dist/util/dense_set.js.map +1 -0
- package/dist/util/id_pool.d.ts +23 -0
- package/dist/util/id_pool.js +194 -0
- package/dist/util/id_pool.js.map +1 -0
- package/dist/world/index.d.ts +3 -0
- package/dist/world/index.js +3 -0
- package/dist/world/index.js.map +1 -0
- package/dist/world/world.base.d.ts +6 -0
- package/dist/world/world.base.js +21 -0
- package/dist/world/world.base.js.map +1 -0
- package/dist/world/world.components.d.ts +67 -0
- package/dist/world/world.components.js +93 -0
- package/dist/world/world.components.js.map +1 -0
- package/dist/world/world.d.ts +29 -0
- package/dist/world/world.deferred.d.ts +13 -0
- package/dist/world/world.deferred.js +93 -0
- package/dist/world/world.deferred.js.map +1 -0
- package/dist/world/world.entities.d.ts +18 -0
- package/dist/world/world.entities.js +97 -0
- package/dist/world/world.entities.js.map +1 -0
- package/dist/world/world.js +39 -0
- package/dist/world/world.js.map +1 -0
- package/dist/world/world.modules.d.ts +12 -0
- package/dist/world/world.modules.js +21 -0
- package/dist/world/world.modules.js.map +1 -0
- package/dist/world/world.pipeline.d.ts +21 -0
- package/dist/world/world.pipeline.js +105 -0
- package/dist/world/world.pipeline.js.map +1 -0
- package/dist/world/world.pools.d.ts +9 -0
- package/dist/world/world.pools.js +59 -0
- package/dist/world/world.pools.js.map +1 -0
- package/dist/world/world.queries.d.ts +18 -0
- package/dist/world/world.queries.js +101 -0
- package/dist/world/world.queries.js.map +1 -0
- package/dist/world/world.storage.d.ts +7 -0
- package/dist/world/world.storage.js +26 -0
- package/dist/world/world.storage.js.map +1 -0
- package/package.json +12 -1
- package/dist/entity.d.ts +0 -215
- package/dist/entity.js +0 -457
- package/dist/entity.js.map +0 -1
- package/dist/query.d.ts +0 -251
- package/dist/query.js +0 -353
- package/dist/query.js.map +0 -1
- package/dist/world.d.ts +0 -389
- package/dist/world.js +0 -631
- package/dist/world.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world.pools.js","sourceRoot":"","sources":["../../src/world/world.pools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ComponentType } from "../component.js";
|
|
2
|
+
import { type ExtractRequired, type QueryDSL } from "../dsl.js";
|
|
3
|
+
import { Filter } from "../filter.js";
|
|
4
|
+
import { Query } from "../query/index.js";
|
|
5
|
+
import { Term } from "../terms/index.js";
|
|
6
|
+
import { Storage } from "./world.storage.js";
|
|
7
|
+
import type { World } from "./world.js";
|
|
8
|
+
export declare class Queries extends Storage {
|
|
9
|
+
/** Read-only view of every registered query (includes systems). */
|
|
10
|
+
get queries(): ReadonlyArray<Query>;
|
|
11
|
+
/** Create a non-reactive {@link Filter} that matches entities satisfying `q`. */
|
|
12
|
+
filter<Q extends QueryDSL>(this: World, q: Q): Filter<ExtractRequired<Q>>;
|
|
13
|
+
filter<T extends ComponentType[]>(this: World, q: QueryDSL, _guaranteed: readonly [...T]): Filter<T>;
|
|
14
|
+
/** Create and return a standalone {@link Query}, ready for fluent configuration. */
|
|
15
|
+
query(this: World, name: string): Query;
|
|
16
|
+
/** Return the shared materialized term for a reactive query DSL expression. */
|
|
17
|
+
getTerm(this: World, q: QueryDSL): Term;
|
|
18
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Filter } from "../filter.js";
|
|
2
|
+
import { Query } from "../query/index.js";
|
|
3
|
+
import { getCachedTerm, getTerm, notifyComponentAdded, notifyComponentChanged, notifyComponentRemoved, notifyEntityCreated, notifyEntityDestroyed, } from "../terms/build.js";
|
|
4
|
+
import { Storage } from "./world.storage.js";
|
|
5
|
+
export class Queries extends Storage {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
/** @internal All registered queries, including systems (which extend `Query`). */
|
|
9
|
+
this._queries = [];
|
|
10
|
+
/** @internal Queries created but not yet built into the world. */
|
|
11
|
+
this._unbuiltQueries = new Set();
|
|
12
|
+
/** @internal Canonical DSL key -> live term. */
|
|
13
|
+
this._termCache = new Map();
|
|
14
|
+
/** @internal Component eid -> pinned component leaf term. */
|
|
15
|
+
this._componentTerms = new Map();
|
|
16
|
+
/** @internal True while the world is driving one logical frame. */
|
|
17
|
+
this._frameInProgress = false;
|
|
18
|
+
/** @internal True while the world is auto-building pending queries. */
|
|
19
|
+
this._buildingPendingQueries = false;
|
|
20
|
+
}
|
|
21
|
+
/** Read-only view of every registered query (includes systems). */
|
|
22
|
+
get queries() {
|
|
23
|
+
return this._queries;
|
|
24
|
+
}
|
|
25
|
+
/** @internal Register and index a freshly built {@link Query}. */
|
|
26
|
+
_addQuery(q) {
|
|
27
|
+
if (this._frameInProgress && !this._buildingPendingQueries) {
|
|
28
|
+
throw new Error("queries cannot be built while a frame is in progress");
|
|
29
|
+
}
|
|
30
|
+
this._removeUnbuiltQuery(q);
|
|
31
|
+
this._queries.push(q);
|
|
32
|
+
}
|
|
33
|
+
/** @internal Track a newly-created query until it is explicitly or automatically built. */
|
|
34
|
+
_addUnbuiltQuery(q) {
|
|
35
|
+
this._unbuiltQueries.add(q);
|
|
36
|
+
}
|
|
37
|
+
/** @internal Unregister a query and purge its membership from every entity. */
|
|
38
|
+
_removeQuery(q) {
|
|
39
|
+
this._removeUnbuiltQuery(q);
|
|
40
|
+
const idx = this._queries.indexOf(q);
|
|
41
|
+
if (idx !== -1) {
|
|
42
|
+
this._queries.splice(idx, 1);
|
|
43
|
+
}
|
|
44
|
+
q._unsubscribeRootTerm();
|
|
45
|
+
this._entities.forEach((e) => e._purgeQuery(q));
|
|
46
|
+
}
|
|
47
|
+
/** @internal Stop tracking a pending query. */
|
|
48
|
+
_removeUnbuiltQuery(q) {
|
|
49
|
+
this._unbuiltQueries.delete(q);
|
|
50
|
+
}
|
|
51
|
+
filter(q, _guaranteed) {
|
|
52
|
+
return new Filter(this, q);
|
|
53
|
+
}
|
|
54
|
+
/** Create and return a standalone {@link Query}, ready for fluent configuration. */
|
|
55
|
+
query(name) {
|
|
56
|
+
return new Query(name, this);
|
|
57
|
+
}
|
|
58
|
+
/** Return the shared materialized term for a reactive query DSL expression. */
|
|
59
|
+
getTerm(q) {
|
|
60
|
+
return getTerm(this, q);
|
|
61
|
+
}
|
|
62
|
+
/** @internal Return a cached term without creating one. */
|
|
63
|
+
_getCachedTerm(q) {
|
|
64
|
+
return getCachedTerm(this, q);
|
|
65
|
+
}
|
|
66
|
+
/** @internal Drive the component leaf for a newly attached component. */
|
|
67
|
+
_notifyComponentAdded(eid, entity) {
|
|
68
|
+
notifyComponentAdded(this, eid, entity);
|
|
69
|
+
}
|
|
70
|
+
/** @internal Drive predicate/target refresh for changed component data. */
|
|
71
|
+
_notifyComponentChanged(eid, entity) {
|
|
72
|
+
notifyComponentChanged(this, eid, entity);
|
|
73
|
+
}
|
|
74
|
+
/** @internal Drive the component leaf for a detached component. */
|
|
75
|
+
_notifyComponentRemoved(eid, entity) {
|
|
76
|
+
notifyComponentRemoved(this, eid, entity);
|
|
77
|
+
}
|
|
78
|
+
/** @internal Drive the world leaf for a created entity. */
|
|
79
|
+
_notifyEntityCreated(entity) {
|
|
80
|
+
notifyEntityCreated(this, entity);
|
|
81
|
+
}
|
|
82
|
+
/** @internal Drive the world/component leaves for a destroyed entity. */
|
|
83
|
+
_notifyEntityDestroyed(entity) {
|
|
84
|
+
notifyEntityDestroyed(this, entity);
|
|
85
|
+
}
|
|
86
|
+
/** @internal Build every query that has not yet entered the world. */
|
|
87
|
+
_buildPendingQueries() {
|
|
88
|
+
if (this._unbuiltQueries.size === 0) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const pending = [...this._unbuiltQueries];
|
|
92
|
+
this._buildingPendingQueries = true;
|
|
93
|
+
try {
|
|
94
|
+
pending.forEach((q) => q._build());
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
this._buildingPendingQueries = false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=world.queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world.queries.js","sourceRoot":"","sources":["../../src/world/world.queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Entity } from "../entity/index.js";
|
|
2
|
+
import { type ReadonlyArrayMap } from "../util/array_map.js";
|
|
3
|
+
import { Pools } from "./world.pools.js";
|
|
4
|
+
export declare class Storage extends Pools {
|
|
5
|
+
/** Read-only view of the live entities, keyed by entity id. */
|
|
6
|
+
get entities(): ReadonlyArrayMap<Entity>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ArrayMap } from "../util/array_map.js";
|
|
2
|
+
import { Pools } from "./world.pools.js";
|
|
3
|
+
export class Storage extends Pools {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
/**
|
|
7
|
+
* @internal Entity id -> entity. Owns every live entity.
|
|
8
|
+
*
|
|
9
|
+
* Backed by an {@link ArrayMap} rather than a `Map`: entity ids are dense
|
|
10
|
+
* pooled integers, so array indexing beats hashing on the lookups that run
|
|
11
|
+
* per component during teardown (`world.entity(componentEid)` in
|
|
12
|
+
* `Entity._destroy`) and on every `world.entity(eid)` resolution.
|
|
13
|
+
*/
|
|
14
|
+
this._entities = new ArrayMap();
|
|
15
|
+
}
|
|
16
|
+
/** Read-only view of the live entities, keyed by entity id. */
|
|
17
|
+
get entities() {
|
|
18
|
+
return this._entities;
|
|
19
|
+
}
|
|
20
|
+
/** @internal Remove an entity from the world's entity map (called by `Entity._destroy`). */
|
|
21
|
+
_unregisterEntity(entity) {
|
|
22
|
+
this._entities.delete(entity.eid);
|
|
23
|
+
this._poolFor(entity.eid).free(entity.eid);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=world.storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world.storage.js","sourceRoot":"","sources":["../../src/world/world.storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAyB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAAlC;;QACE;;;;;;;WAOG;QACO,cAAS,GAAG,IAAI,QAAQ,EAAU,CAAC;IAY/C,CAAC;IAVC,+DAA+D;IAC/D,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,4FAA4F;IACrF,iBAAiB,CAAC,MAAc;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vworlds/vecs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"development": {
|
|
10
|
+
"types": "./src/index.ts",
|
|
11
|
+
"import": "./src/index.ts"
|
|
12
|
+
},
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
7
17
|
"scripts": {
|
|
8
18
|
"clean": "rimraf dist",
|
|
9
19
|
"prepack": "npm run build",
|
|
10
20
|
"build": "npm run clean && npm run compile",
|
|
11
21
|
"compile": "tsc -p tsconfig.build.json && cp \"./package.json\" ./dist/",
|
|
22
|
+
"bench:ecs": "NODE_OPTIONS=--max-old-space-size=32768 RUN_VECS_ECS_BENCH=1 vitest run tests/ecs.bench.test.ts --pool=forks --poolOptions.forks.singleFork",
|
|
12
23
|
"test": "vitest run",
|
|
13
24
|
"test:watch": "vitest",
|
|
14
25
|
"lint": "eslint \"src/**/*.ts\" \"tests/**/*.ts\" --no-error-on-unmatched-pattern",
|
package/dist/entity.d.ts
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { type Component, type ComponentClass, type ComponentClassOrType } from "./component.js";
|
|
2
|
-
import type { World } from "./world.js";
|
|
3
|
-
import { ReadonlyArrayMap } from "./util/array_map.js";
|
|
4
|
-
import { Events } from "./util/events.js";
|
|
5
|
-
import { Bitset } from "./util/bitset.js";
|
|
6
|
-
type EntityEvents = Events<{
|
|
7
|
-
destroy(): void;
|
|
8
|
-
}>;
|
|
9
|
-
/**
|
|
10
|
-
* A game object: a unique numeric id with an arbitrary set of
|
|
11
|
-
* {@link Component | components} attached.
|
|
12
|
-
*
|
|
13
|
-
* Never instantiate `Entity` directly. Use {@link World.entity} for an
|
|
14
|
-
* auto-assigned id, or {@link World.getOrCreateEntity} when the id comes from
|
|
15
|
-
* an external authority such as a game server:
|
|
16
|
-
*
|
|
17
|
-
* ```ts
|
|
18
|
-
* const e = world.entity();
|
|
19
|
-
* e.set(Position, { x: 100 });
|
|
20
|
-
* ```
|
|
21
|
-
*
|
|
22
|
-
* Entities support a parent-child hierarchy. `parent` and `children` form a
|
|
23
|
-
* bidirectional link maintained by {@link setParent}; the children set is
|
|
24
|
-
* created lazily. Destroying a parent recursively destroys its children.
|
|
25
|
-
*
|
|
26
|
-
* ## Deferred semantics
|
|
27
|
-
*
|
|
28
|
-
* Inside a system body or `forEach` iteration the world is in **deferred
|
|
29
|
-
* mode**: `add` / `attach` / `set` / `modified` / `remove` / `destroy` /
|
|
30
|
-
* `setParent` only enqueue commands. The data layer (the components map and
|
|
31
|
-
* `componentBitmask`) is mutated when the world drains its queue. Concretely,
|
|
32
|
-
* while deferred:
|
|
33
|
-
*
|
|
34
|
-
* - `entity.get(C)` returns `undefined` after `entity.add(C)` (no instance yet).
|
|
35
|
-
* - `entity.get(C)` returns `undefined` after `entity.attach(instance)` if C was absent.
|
|
36
|
-
* - `entity.get(C)` returns the previous value after `entity.set(C, props)`.
|
|
37
|
-
* - `entity.get(C)` still returns the component after `entity.remove(C)`.
|
|
38
|
-
*
|
|
39
|
-
* Outside deferred mode the same calls execute inline and mutations are
|
|
40
|
-
* visible immediately.
|
|
41
|
-
*/
|
|
42
|
-
export declare class Entity {
|
|
43
|
-
/** World that owns this entity. */
|
|
44
|
-
readonly world: World;
|
|
45
|
-
/** Unique numeric entity id assigned at creation. */
|
|
46
|
-
readonly eid: number;
|
|
47
|
-
/**
|
|
48
|
-
* Bitmask of component type ids currently attached to this entity. Used by
|
|
49
|
-
* the world for fast archetype matching against query predicates.
|
|
50
|
-
*/
|
|
51
|
-
readonly componentBitmask: Bitset;
|
|
52
|
-
/**
|
|
53
|
-
* Free-form property bag. Modules can use it to associate arbitrary data with
|
|
54
|
-
* an entity without registering a dedicated component.
|
|
55
|
-
*/
|
|
56
|
-
properties: Map<string, any>;
|
|
57
|
-
constructor(
|
|
58
|
-
/** World that owns this entity. */
|
|
59
|
-
world: World,
|
|
60
|
-
/** Unique numeric entity id assigned at creation. */
|
|
61
|
-
eid: number);
|
|
62
|
-
/** Fire every `onAdd` hook registered for `meta`. */
|
|
63
|
-
private _runOnAddHandlers;
|
|
64
|
-
/** Fire every `onSet` hook registered for `meta`. */
|
|
65
|
-
private _runOnSetHandlers;
|
|
66
|
-
/**
|
|
67
|
-
* Re-evaluate every world query for this entity, firing `_enter` / `_exit`
|
|
68
|
-
* routing whenever membership flipped.
|
|
69
|
-
*/
|
|
70
|
-
private _updateQueries;
|
|
71
|
-
/** Store a component instance and perform the shared add-side bookkeeping. */
|
|
72
|
-
private _storeComponent;
|
|
73
|
-
/** Perform the shared set-side hook and query update routing. */
|
|
74
|
-
private _notifyComponentSet;
|
|
75
|
-
/**
|
|
76
|
-
* Construct a fresh component of `type`, apply `props`, store it on this
|
|
77
|
-
* entity, fire the `onAdd` hook, and route query updates.
|
|
78
|
-
*
|
|
79
|
-
* If the component type belongs to an exclusivity group, any conflicting
|
|
80
|
-
* component already on this entity is removed first.
|
|
81
|
-
*/
|
|
82
|
-
private _new;
|
|
83
|
-
/**
|
|
84
|
-
* Read-only view of direct child entities. The backing set is created lazily
|
|
85
|
-
* on the first child link; before that this getter returns a shared empty set.
|
|
86
|
-
*/
|
|
87
|
-
get children(): ReadonlySet<Entity>;
|
|
88
|
-
/**
|
|
89
|
-
* Read-only view of all components currently attached to this entity, keyed
|
|
90
|
-
* by numeric component type id.
|
|
91
|
-
*
|
|
92
|
-
* The mutating methods (`set`, `delete`, `clear`) are not exposed. Use
|
|
93
|
-
* `entity.add`, `entity.attach`, `entity.set`, and `entity.remove` to change
|
|
94
|
-
* the component set.
|
|
95
|
-
*
|
|
96
|
-
* ```ts
|
|
97
|
-
* entity.components.forEach((c) => console.log(c.constructor.name));
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
get components(): ReadonlyArrayMap<Component>;
|
|
101
|
-
/** `true` when no components are currently attached to this entity. */
|
|
102
|
-
get empty(): boolean;
|
|
103
|
-
/**
|
|
104
|
-
* Typed event emitter for entity-level lifecycle events. Currently only the
|
|
105
|
-
* `"destroy"` event is emitted, just before the entity is fully torn down.
|
|
106
|
-
*
|
|
107
|
-
* The emitter is created lazily on first access.
|
|
108
|
-
*/
|
|
109
|
-
get events(): EntityEvents;
|
|
110
|
-
/** Parent entity in the scene hierarchy, or `undefined` for a root entity. */
|
|
111
|
-
get parent(): Entity | undefined;
|
|
112
|
-
/**
|
|
113
|
-
* Attach a component to this entity if it is not already present.
|
|
114
|
-
*
|
|
115
|
-
* Idempotent. Does not fire `onSet` -- use {@link set} when you want to apply
|
|
116
|
-
* data and notify watchers.
|
|
117
|
-
*
|
|
118
|
-
* @param Class - Component class to instantiate.
|
|
119
|
-
* @returns This entity, for chaining.
|
|
120
|
-
*/
|
|
121
|
-
add<C extends ComponentClass>(Class: C): Entity;
|
|
122
|
-
/**
|
|
123
|
-
* Attach a component by numeric type id.
|
|
124
|
-
*
|
|
125
|
-
* @param type - Numeric component type id.
|
|
126
|
-
* @returns This entity, for chaining.
|
|
127
|
-
*/
|
|
128
|
-
add(type: number): Entity;
|
|
129
|
-
/**
|
|
130
|
-
* Attach an existing component instance to this entity and store that exact
|
|
131
|
-
* object. If a component of the same registered class already exists, it is
|
|
132
|
-
* replaced rather than assigned into.
|
|
133
|
-
*
|
|
134
|
-
* `attach` uses the instance constructor to resolve component metadata, so
|
|
135
|
-
* the constructor must already be registered in this world. The operation
|
|
136
|
-
* fires hooks and query updates like a `set` operation.
|
|
137
|
-
*
|
|
138
|
-
* @param component - Existing component instance to store on the entity.
|
|
139
|
-
* @returns This entity, for chaining.
|
|
140
|
-
*/
|
|
141
|
-
attach(component: Component): Entity;
|
|
142
|
-
/**
|
|
143
|
-
* Destroy this entity and recursively destroy its children.
|
|
144
|
-
*
|
|
145
|
-
* Each component fires its `onRemove` hook, the `"destroy"` event is emitted
|
|
146
|
-
* just before teardown, and the entity is unregistered from the world.
|
|
147
|
-
* After destruction the entity must not be used.
|
|
148
|
-
*/
|
|
149
|
-
destroy(): void;
|
|
150
|
-
/**
|
|
151
|
-
* Look up a component on this entity.
|
|
152
|
-
*
|
|
153
|
-
* @param typeOrClass - Component class or numeric type id.
|
|
154
|
-
* @returns The component instance, or `undefined` when it is not attached.
|
|
155
|
-
*/
|
|
156
|
-
get<C extends ComponentClass>(typeOrClass: number | C): InstanceType<C> | undefined;
|
|
157
|
-
/**
|
|
158
|
-
* Mark a component type as having changed, queueing the corresponding `onSet` / `update`
|
|
159
|
-
* notifications.
|
|
160
|
-
*
|
|
161
|
-
* Repeated calls before the world routes the modified command are coalesced via
|
|
162
|
-
* the entity's dirty component bitset.
|
|
163
|
-
*
|
|
164
|
-
* @param typeOrClass - Component class or numeric type id whose data changed.
|
|
165
|
-
* @returns This entity, for chaining.
|
|
166
|
-
*/
|
|
167
|
-
modified(typeOrClass: ComponentClassOrType): Entity;
|
|
168
|
-
/**
|
|
169
|
-
* Detach a component from this entity.
|
|
170
|
-
*
|
|
171
|
-
* In deferred mode the removal is queued; `get(C)` continues to return the
|
|
172
|
-
* component until the queue drains. When applied, queries fire `exit`
|
|
173
|
-
* callbacks first and the `onRemove` hook fires last.
|
|
174
|
-
*
|
|
175
|
-
* @param Class - Component class to detach.
|
|
176
|
-
*/
|
|
177
|
-
remove<C extends ComponentClass>(Class: C): void;
|
|
178
|
-
/**
|
|
179
|
-
* Detach a component by numeric type id.
|
|
180
|
-
*
|
|
181
|
-
* @param type - Numeric component type id.
|
|
182
|
-
*/
|
|
183
|
-
remove(type: number): void;
|
|
184
|
-
/**
|
|
185
|
-
* Reparent this entity. In deferred mode the change is queued; outside
|
|
186
|
-
* deferred mode it executes inline.
|
|
187
|
-
*
|
|
188
|
-
* @param newParent - New parent, or `undefined` to make this a root entity.
|
|
189
|
-
*/
|
|
190
|
-
setParent(newParent: Entity | undefined): void;
|
|
191
|
-
/**
|
|
192
|
-
* Attach a component (creating it if necessary), copy `props` onto the
|
|
193
|
-
* instance, and fire the `onSet` hook plus any `update` callbacks for the
|
|
194
|
-
* component type.
|
|
195
|
-
*
|
|
196
|
-
* In deferred mode `props` are not applied until the queued `Set` command is
|
|
197
|
-
* routed.
|
|
198
|
-
*
|
|
199
|
-
* @param Class - Component class to instantiate.
|
|
200
|
-
* @param props - Properties to assign onto the component instance.
|
|
201
|
-
* @returns This entity, for chaining.
|
|
202
|
-
*/
|
|
203
|
-
set<C extends ComponentClass>(Class: C, props: Partial<InstanceType<C>>): Entity;
|
|
204
|
-
/**
|
|
205
|
-
* Attach a component by numeric type id and copy `props` onto it.
|
|
206
|
-
*
|
|
207
|
-
* @param type - Numeric component type id.
|
|
208
|
-
* @param props - Properties to assign onto the component instance.
|
|
209
|
-
* @returns This entity, for chaining.
|
|
210
|
-
*/
|
|
211
|
-
set(type: number, props: Partial<Component>): Entity;
|
|
212
|
-
/** Returns `"EntityN"` where N is the entity id. */
|
|
213
|
-
toString(): string;
|
|
214
|
-
}
|
|
215
|
-
export {};
|