@vworlds/vecs 1.0.19 → 1.0.21
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 +51 -48
- package/dist/component.d.ts +5 -2
- package/dist/component.js +4 -57
- package/dist/component.js.map +1 -1
- package/dist/component_meta.d.ts +15 -8
- package/dist/component_meta.js +6 -4
- package/dist/component_meta.js.map +1 -1
- package/dist/dsl.d.ts +56 -11
- package/dist/dsl.js +21 -31
- package/dist/dsl.js.map +1 -1
- package/dist/entity/entity.base.d.ts +4 -3
- package/dist/entity/entity.base.js +4 -4
- package/dist/entity/entity.base.js.map +1 -1
- package/dist/entity/entity.components.d.ts +16 -7
- package/dist/entity/entity.components.js +48 -23
- package/dist/entity/entity.components.js.map +1 -1
- package/dist/entity/entity.d.ts +5 -1
- package/dist/entity/entity.js +5 -0
- package/dist/entity/entity.js.map +1 -1
- package/dist/entity/entity.lifecycle.js +25 -25
- package/dist/entity/entity.lifecycle.js.map +1 -1
- package/dist/entity/entity.queries.js +0 -6
- package/dist/entity/entity.queries.js.map +1 -1
- package/dist/entity/entity.relationships.d.ts +1 -1
- package/dist/entity/entity.relationships.js +7 -5
- package/dist/entity/entity.relationships.js.map +1 -1
- package/dist/entity/index.d.ts +1 -1
- package/dist/entity/index.js.map +1 -1
- package/dist/filter.d.ts +6 -6
- package/dist/filter.js +2 -1
- package/dist/filter.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/inject.d.ts +18 -17
- package/dist/inject.js +34 -34
- package/dist/inject.js.map +1 -1
- package/dist/module.d.ts +0 -2
- package/dist/module.js +0 -3
- package/dist/module.js.map +1 -1
- package/dist/modules/relationship_types.d.ts +34 -0
- package/dist/modules/relationship_types.js +36 -0
- package/dist/modules/relationship_types.js.map +1 -0
- package/dist/modules/relationships.d.ts +24 -0
- package/dist/modules/relationships.js +82 -0
- package/dist/modules/relationships.js.map +1 -0
- package/dist/modules/singleton.js +1 -2
- package/dist/modules/singleton.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/query/callbacks.d.ts +17 -0
- package/dist/query/callbacks.js +113 -0
- package/dist/query/callbacks.js.map +1 -0
- package/dist/query/constants.d.ts +1 -0
- package/dist/query/constants.js +2 -0
- package/dist/query/constants.js.map +1 -0
- package/dist/query/{query.03.tracking.d.ts → group.d.ts} +11 -9
- package/dist/query/group.js +31 -0
- package/dist/query/group.js.map +1 -0
- package/dist/query/grouped_query.d.ts +26 -0
- package/dist/query/grouped_query.js +121 -0
- package/dist/query/grouped_query.js.map +1 -0
- package/dist/query/grouped_query_registry.d.ts +4 -0
- package/dist/query/grouped_query_registry.js +11 -0
- package/dist/query/grouped_query_registry.js.map +1 -0
- package/dist/query/grouping.d.ts +24 -0
- package/dist/query/{query.07.groups.js → grouping.js} +29 -60
- package/dist/query/grouping.js.map +1 -0
- package/dist/query/index.d.ts +6 -6
- package/dist/query/index.js +6 -4
- package/dist/query/index.js.map +1 -1
- package/dist/query/query.d.ts +58 -28
- package/dist/query/query.js +327 -88
- package/dist/query/query.js.map +1 -1
- package/dist/system.d.ts +18 -34
- package/dist/system.js +33 -49
- package/dist/system.js.map +1 -1
- package/dist/terms/all_term.d.ts +2 -6
- package/dist/terms/all_term.js +2 -7
- package/dist/terms/all_term.js.map +1 -1
- package/dist/terms/any_term.d.ts +2 -6
- package/dist/terms/any_term.js +2 -7
- package/dist/terms/any_term.js.map +1 -1
- package/dist/terms/build.d.ts +9 -6
- package/dist/terms/build.js +17 -14
- package/dist/terms/build.js.map +1 -1
- package/dist/terms/component_term.d.ts +3 -3
- package/dist/terms/component_term.js.map +1 -1
- package/dist/terms/composite_build.d.ts +32 -0
- package/dist/terms/composite_build.js +28 -0
- package/dist/terms/composite_build.js.map +1 -0
- package/dist/terms/only_term.d.ts +3 -3
- package/dist/terms/only_term.js.map +1 -1
- package/dist/terms/predicate_term.d.ts +3 -3
- package/dist/terms/predicate_term.js +3 -3
- package/dist/terms/predicate_term.js.map +1 -1
- package/dist/terms/target_term.d.ts +3 -2
- package/dist/terms/target_term.js +11 -17
- package/dist/terms/target_term.js.map +1 -1
- package/dist/util/dense_set.js +1 -1
- package/dist/util/id_pool.d.ts +2 -0
- package/dist/util/id_pool.js +10 -0
- package/dist/util/id_pool.js.map +1 -1
- package/dist/util/ordered_set.js +15 -10
- package/dist/util/ordered_set.js.map +1 -1
- package/dist/world/world.components.d.ts +5 -4
- package/dist/world/world.components.js +16 -16
- package/dist/world/world.components.js.map +1 -1
- package/dist/world/world.entities.d.ts +2 -2
- package/dist/world/world.entities.js.map +1 -1
- package/dist/world/world.js +2 -4
- package/dist/world/world.js.map +1 -1
- package/dist/world/world.modules.d.ts +2 -2
- package/dist/world/world.modules.js +6 -1
- package/dist/world/world.modules.js.map +1 -1
- package/dist/world/world.pools.d.ts +2 -1
- package/dist/world/world.pools.js.map +1 -1
- package/dist/world/world.queries.d.ts +3 -5
- package/dist/world/world.queries.js +11 -8
- package/dist/world/world.queries.js.map +1 -1
- package/package.json +1 -1
- package/dist/query/query.00.base.d.ts +0 -23
- package/dist/query/query.00.base.js +0 -77
- package/dist/query/query.00.base.js.map +0 -1
- package/dist/query/query.01.reactive.d.ts +0 -7
- package/dist/query/query.01.reactive.js +0 -58
- package/dist/query/query.01.reactive.js.map +0 -1
- package/dist/query/query.02.lifecycle.d.ts +0 -6
- package/dist/query/query.02.lifecycle.js +0 -63
- package/dist/query/query.02.lifecycle.js.map +0 -1
- package/dist/query/query.03.tracking.js +0 -31
- package/dist/query/query.03.tracking.js.map +0 -1
- package/dist/query/query.04.callbacks.d.ts +0 -14
- package/dist/query/query.04.callbacks.js +0 -65
- package/dist/query/query.04.callbacks.js.map +0 -1
- package/dist/query/query.05.updates.d.ts +0 -14
- package/dist/query/query.05.updates.js +0 -81
- package/dist/query/query.05.updates.js.map +0 -1
- package/dist/query/query.06.predicate.d.ts +0 -13
- package/dist/query/query.06.predicate.js +0 -40
- package/dist/query/query.06.predicate.js.map +0 -1
- package/dist/query/query.07.groups.d.ts +0 -41
- package/dist/query/query.07.groups.js.map +0 -1
- package/dist/relationship.d.ts +0 -19
- package/dist/relationship.js +0 -18
- package/dist/relationship.js.map +0 -1
package/dist/query/query.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { containsDownTerm, isQueryConfig, } from "../dsl.js";
|
|
2
|
+
import { forEachInjected, } from "../inject.js";
|
|
3
|
+
import { SilenceSource, Traversable } from "../modules/relationships.js";
|
|
4
|
+
import { ArrayMap } from "../util/array_map.js";
|
|
5
|
+
import { Bitset } from "../util/bitset.js";
|
|
6
|
+
import { OrderedSet } from "../util/ordered_set.js";
|
|
7
|
+
import { makeEnterCallback, makeExitCallback, makeSortedEntitySet, makeUpdateRegistration, } from "./callbacks.js";
|
|
8
|
+
import { SOURCE_TRACKED_QUERY_ERROR } from "./constants.js";
|
|
9
|
+
import { getGroupedQueryPrototype } from "./grouped_query_registry.js";
|
|
10
|
+
const EMPTY_ENTITIES = new Set();
|
|
7
11
|
/**
|
|
8
12
|
* A reactive, always-up-to-date set of entities matching a {@link QueryDSL}
|
|
9
13
|
* predicate.
|
|
@@ -23,116 +27,351 @@ import { Groups } from "./query.07.groups.js";
|
|
|
23
27
|
* you want a reactive entity set without pipeline integration.
|
|
24
28
|
*
|
|
25
29
|
* @typeParam R - Component classes guaranteed present on every matched entity
|
|
26
|
-
* (declared via {@link
|
|
27
|
-
* Components in `R` appear as non-nullable in {@link
|
|
30
|
+
* (declared via {@link with} or the `hint` field of a {@link QueryConfig}).
|
|
31
|
+
* Components in `R` appear as non-nullable in {@link orderBy}, {@link forEach},
|
|
28
32
|
* and {@link update} callback tuples.
|
|
29
33
|
*/
|
|
30
|
-
export class Query
|
|
34
|
+
export class Query {
|
|
31
35
|
constructor(name, world, track = true) {
|
|
32
|
-
|
|
36
|
+
/** True when membership or watched component data changed since the last reset. */
|
|
37
|
+
this.changed = false;
|
|
38
|
+
/** @internal DSL predicate used to build the root membership term. */
|
|
39
|
+
this._dsl = undefined;
|
|
40
|
+
/** @internal `enter` callback (already wraps any injection logic). */
|
|
41
|
+
this._enterCallback = undefined;
|
|
42
|
+
/** @internal `exit` callback (already wraps any injection logic). */
|
|
43
|
+
this._exitCallback = undefined;
|
|
44
|
+
/** @internal Component eids the exit callback needs snapshotted before component removal. */
|
|
45
|
+
this._exitSnapshotTypes = undefined;
|
|
46
|
+
/** @internal Whether membership APIs are enabled for this query. */
|
|
47
|
+
this._tracking = false;
|
|
48
|
+
/** @internal Bitmask of component eids this query reacts to via `update`. */
|
|
49
|
+
this._watchlistBitmask = new Bitset();
|
|
50
|
+
/** @internal `true` once this query has been registered with its world. */
|
|
51
|
+
this._built = false;
|
|
52
|
+
/** @internal Guards destroy hooks against recursive removal. */
|
|
53
|
+
this._destroyed = false;
|
|
54
|
+
/** @internal `true` once `with` has set an explicit predicate. */
|
|
55
|
+
this._hasExplicitQuery = false;
|
|
56
|
+
/** @internal Per-component-eid `update` callbacks. */
|
|
57
|
+
this._componentUpdateCallbacks = new ArrayMap();
|
|
58
|
+
this._queryComponentClass = Query;
|
|
59
|
+
this.entity = world.entity();
|
|
60
|
+
this.entity.name = name;
|
|
61
|
+
this.entity.attach(Query, this);
|
|
62
|
+
world._addUnbuiltQuery(this);
|
|
63
|
+
if (track) {
|
|
64
|
+
this.track();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/* -------------------------------------------------------------------------
|
|
68
|
+
* Identity And Membership Views
|
|
69
|
+
* -------------------------------------------------------------------------
|
|
70
|
+
* Read-only accessors over the backing entity and current matched set. These
|
|
71
|
+
* methods do not change query configuration or world registration state.
|
|
72
|
+
*/
|
|
73
|
+
/** `true` once this query has been registered with its world. */
|
|
74
|
+
get built() {
|
|
75
|
+
return this._built;
|
|
76
|
+
}
|
|
77
|
+
/** Unique display name; forwards to the backing entity identity. */
|
|
78
|
+
get name() {
|
|
79
|
+
return this.entity.name;
|
|
80
|
+
}
|
|
81
|
+
/** World that owns this query; forwards to the backing entity. */
|
|
82
|
+
get world() {
|
|
83
|
+
return this.entity.world;
|
|
84
|
+
}
|
|
85
|
+
get count() {
|
|
86
|
+
if (!this._tracking) {
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
return this._entities?.size ?? this.rootTerm?.count ?? 0;
|
|
90
|
+
}
|
|
91
|
+
[Symbol.iterator]() {
|
|
92
|
+
return this._matchedEntities()[Symbol.iterator]();
|
|
93
|
+
}
|
|
94
|
+
belongs(e) {
|
|
95
|
+
return this.rootTerm?.has(e) ?? false;
|
|
96
|
+
}
|
|
97
|
+
has(e) {
|
|
98
|
+
if (!this._tracking) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return this._entities?.has(e) ?? this.rootTerm?.has(e) ?? false;
|
|
102
|
+
}
|
|
103
|
+
forEach(arg0, arg1, arg2) {
|
|
104
|
+
this.changed = false;
|
|
105
|
+
this._forEach(arg0, arg1, arg2);
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @internal Iterate the matched entities with injection, **without**
|
|
110
|
+
* consuming the {@link changed} flag. Used by `System.each`, which runs every
|
|
111
|
+
* tick and must not reset `changed` (that flag tracks whether membership or
|
|
112
|
+
* watched data changed since the caller last read it).
|
|
113
|
+
*/
|
|
114
|
+
_forEach(arg0, arg1, arg2) {
|
|
115
|
+
forEachInjected(this.world, this._matchedEntities(), arg0, arg1, arg2);
|
|
116
|
+
}
|
|
117
|
+
toString() {
|
|
118
|
+
return this.name ?? "";
|
|
119
|
+
}
|
|
120
|
+
/* -------------------------------------------------------------------------
|
|
121
|
+
* Predicate And Membership Configuration
|
|
122
|
+
* -------------------------------------------------------------------------
|
|
123
|
+
* Fluent builder methods that decide which entities belong to the query and
|
|
124
|
+
* how that membership is tracked, ordered, grouped, or source-filtered.
|
|
125
|
+
*/
|
|
126
|
+
with(...specs) {
|
|
127
|
+
this._assertConfigurable();
|
|
128
|
+
const terms = [];
|
|
129
|
+
let cascade;
|
|
130
|
+
for (const spec of specs) {
|
|
131
|
+
if (isQueryConfig(spec)) {
|
|
132
|
+
terms.push(spec.with);
|
|
133
|
+
if (spec.cascade !== undefined) {
|
|
134
|
+
cascade = spec.cascade;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
terms.push(spec);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
this._dsl = this._dsl === undefined ? { all: terms } : { all: [this._dsl, ...terms] };
|
|
142
|
+
this._hasExplicitQuery = true;
|
|
143
|
+
if (cascade !== undefined) {
|
|
144
|
+
this.cascade(cascade);
|
|
145
|
+
}
|
|
146
|
+
return this;
|
|
147
|
+
}
|
|
148
|
+
without(dsl) {
|
|
149
|
+
this.with({ not: dsl });
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
track() {
|
|
153
|
+
this._assertConfigurable();
|
|
154
|
+
this._tracking = true;
|
|
155
|
+
return this;
|
|
156
|
+
}
|
|
157
|
+
orderBy(arg0, arg1, arg2) {
|
|
158
|
+
this._assertConfigurable();
|
|
159
|
+
this._tracking = true;
|
|
160
|
+
this._entities = makeSortedEntitySet(this.world, arg0, arg1, arg2);
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
cascade(rel, compare) {
|
|
164
|
+
this._assertConfigurable();
|
|
165
|
+
const relEntity = this.world.entity(rel);
|
|
166
|
+
const relMeta = relEntity.meta;
|
|
167
|
+
if (!relMeta.isRelationship) {
|
|
168
|
+
throw new Error(`Component ${relMeta.Class.name} is not a Relationship`);
|
|
169
|
+
}
|
|
170
|
+
const traversable = relEntity.get(Traversable);
|
|
171
|
+
if (!traversable) {
|
|
172
|
+
throw new Error(`Relationship ${relMeta.Class.name} does not have the Traversable trait`);
|
|
173
|
+
}
|
|
174
|
+
const depths = traversable.depths;
|
|
175
|
+
this.orderBy([], (a, _ra, b) => {
|
|
176
|
+
const da = depths.get(a) ?? -1;
|
|
177
|
+
const db = depths.get(b) ?? -1;
|
|
178
|
+
return da - db || compare?.(a, b) || 0;
|
|
179
|
+
});
|
|
180
|
+
this.update(relMeta.Class, (entity) => {
|
|
181
|
+
this._reSortCascade(entity, relMeta.eid);
|
|
182
|
+
});
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
groupBy(arg0, arg1) {
|
|
186
|
+
this._assertConfigurable();
|
|
187
|
+
Object.setPrototypeOf(this, getGroupedQueryPrototype());
|
|
188
|
+
return this._initialize(arg0, arg1);
|
|
189
|
+
}
|
|
190
|
+
ignoreSource(source) {
|
|
191
|
+
this._assertConfigurable();
|
|
192
|
+
const query = typeof source === "object" && !Array.isArray(source) && "entity" in source
|
|
193
|
+
? source
|
|
194
|
+
: this._buildSilenceQuery(source);
|
|
195
|
+
this.entity.set(SilenceSource, { target: query.entity });
|
|
196
|
+
this._silenceQuery = query;
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
enter(arg0, arg1, arg2) {
|
|
200
|
+
this._assertConfigurable();
|
|
201
|
+
this._enterCallback = makeEnterCallback(this.world, arg0, arg1, arg2);
|
|
202
|
+
return this;
|
|
203
|
+
}
|
|
204
|
+
exit(arg0, arg1, arg2) {
|
|
205
|
+
this._assertConfigurable();
|
|
206
|
+
const exit = makeExitCallback(this.world, arg0, arg1, arg2);
|
|
207
|
+
this._exitCallback = exit.callback;
|
|
208
|
+
this._exitSnapshotTypes = exit.snapshotTypes;
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
update(arg0, arg1, arg2, arg3) {
|
|
212
|
+
this._assertConfigurable();
|
|
213
|
+
const { componentEid, callback } = makeUpdateRegistration(this.world, arg0, arg1, arg2, arg3);
|
|
214
|
+
this._componentUpdateCallbacks.set(componentEid, callback);
|
|
215
|
+
this._watchlistBitmask.add(componentEid);
|
|
216
|
+
if (!this._hasExplicitQuery) {
|
|
217
|
+
this._dsl = this._watchlistBitmask.indices();
|
|
218
|
+
}
|
|
219
|
+
return this;
|
|
220
|
+
}
|
|
221
|
+
/* -------------------------------------------------------------------------
|
|
222
|
+
* World Registration And Routing Hooks
|
|
223
|
+
* -------------------------------------------------------------------------
|
|
224
|
+
* Public internals called by World, terms, and System subclasses to register,
|
|
225
|
+
* destroy, and route membership/update events through the query.
|
|
226
|
+
*/
|
|
227
|
+
build() {
|
|
228
|
+
if (this.built) {
|
|
229
|
+
return this;
|
|
230
|
+
}
|
|
231
|
+
if (this.world.deferred) {
|
|
232
|
+
this.world._addUnbuiltQuery(this);
|
|
233
|
+
return this;
|
|
234
|
+
}
|
|
235
|
+
return this._build();
|
|
33
236
|
}
|
|
34
|
-
}
|
|
35
|
-
const EMPTY_GROUPS = new Map();
|
|
36
|
-
/**
|
|
37
|
-
* A {@link Query} that has been partitioned by {@link Query.groupBy}. Adds the
|
|
38
|
-
* typed group-accessor surface ({@link group}, {@link groups}, etc.) on top of
|
|
39
|
-
* the query's usual reactive membership.
|
|
40
|
-
*
|
|
41
|
-
* `GroupedQuery` lives in the query module alongside `Query`. Instances are
|
|
42
|
-
* created lazily by {@link Query.groupBy} via `Object.setPrototypeOf`.
|
|
43
|
-
*
|
|
44
|
-
* @typeParam K - The grouping key type produced by the key function (or the
|
|
45
|
-
* relationship target entity, for the relationship form).
|
|
46
|
-
* @typeParam R - Component classes guaranteed present on every matched entity.
|
|
47
|
-
*/
|
|
48
|
-
export class GroupedQuery extends Query {
|
|
49
237
|
/** @internal */
|
|
50
|
-
|
|
51
|
-
if (this.
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
let keyOf;
|
|
55
|
-
let watchEids;
|
|
56
|
-
if (typeof arg1 === "function") {
|
|
57
|
-
const components = arg0;
|
|
58
|
-
const inject = mapInject(this.world, components);
|
|
59
|
-
const arity = injectArity(inject);
|
|
60
|
-
const resolved = new Array(arity);
|
|
61
|
-
keyOf = (e) => {
|
|
62
|
-
getInjected(e, inject, false, resolved);
|
|
63
|
-
return arg1(e, resolved);
|
|
64
|
-
};
|
|
65
|
-
watchEids = directInjectEids(inject);
|
|
66
|
-
this._composeGroupMembership(components);
|
|
238
|
+
_build() {
|
|
239
|
+
if (this.built) {
|
|
240
|
+
return this;
|
|
67
241
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
watchEids = [relEid];
|
|
72
|
-
this._composeGroupMembership([arg0]);
|
|
242
|
+
if (!this._isBuildable()) {
|
|
243
|
+
this.destroy();
|
|
244
|
+
return this;
|
|
73
245
|
}
|
|
74
|
-
|
|
75
|
-
|
|
246
|
+
this.world._removeUnbuiltQuery(this);
|
|
247
|
+
if (this._dsl !== undefined) {
|
|
248
|
+
if (this._tracking && containsDownTerm(this._dsl)) {
|
|
249
|
+
this.destroy();
|
|
250
|
+
throw new Error(SOURCE_TRACKED_QUERY_ERROR);
|
|
251
|
+
}
|
|
252
|
+
this.rootTerm = this.world.getTerm(this._dsl);
|
|
253
|
+
this._unsubscribeTerm = this.rootTerm.subscribe(this);
|
|
76
254
|
}
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
255
|
+
this.world._addQuery(this);
|
|
256
|
+
this._built = true;
|
|
257
|
+
this._backfill();
|
|
79
258
|
return this;
|
|
80
259
|
}
|
|
81
260
|
/** @internal */
|
|
261
|
+
_clearSilence() {
|
|
262
|
+
this._silenceQuery = undefined;
|
|
263
|
+
}
|
|
264
|
+
destroy() {
|
|
265
|
+
if (this._destroyed) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
this._destroyed = true;
|
|
269
|
+
this.world._removeQuery(this);
|
|
270
|
+
this._entities?.clear();
|
|
271
|
+
this._entities = undefined;
|
|
272
|
+
this._tracking = false;
|
|
273
|
+
if (!this.entity._destroyed && this.entity.get(this._queryComponentClass) !== undefined) {
|
|
274
|
+
this.entity.destroy();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/** @internal */
|
|
82
278
|
_enter(e) {
|
|
83
|
-
this.
|
|
84
|
-
|
|
279
|
+
this.changed = true;
|
|
280
|
+
this._entities?.add(e);
|
|
281
|
+
e._addQueryMembership(this);
|
|
282
|
+
this._enterCallback?.(e);
|
|
283
|
+
e.components.forEach((c, ceid) => {
|
|
284
|
+
if (!this._watchlistBitmask.has(ceid)) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
this._notifyModified(e, ceid, c);
|
|
288
|
+
});
|
|
85
289
|
}
|
|
86
290
|
/** @internal */
|
|
87
291
|
_exit(e) {
|
|
88
|
-
|
|
89
|
-
this.
|
|
292
|
+
this.changed = true;
|
|
293
|
+
this._exitCallback?.(e);
|
|
294
|
+
this._entities?.delete(e);
|
|
295
|
+
e._removeQueryMembership(this);
|
|
90
296
|
}
|
|
91
297
|
/** @internal */
|
|
92
|
-
_notifyModified(e,
|
|
93
|
-
|
|
94
|
-
|
|
298
|
+
_notifyModified(e, ceid, c) {
|
|
299
|
+
if (!this._watchlistBitmask.has(ceid)) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (this._isSourceSilenced()) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
this.changed = true;
|
|
306
|
+
const callback = this._componentUpdateCallbacks.get(ceid);
|
|
307
|
+
if (callback) {
|
|
308
|
+
callback(e, c);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
onTermEvent(kind, entity) {
|
|
312
|
+
if (kind === 0 /* TermEventKind.Enter */) {
|
|
313
|
+
this._enter(entity);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
this._exit(entity);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/** @internal */
|
|
320
|
+
_unsubscribeRootTerm() {
|
|
321
|
+
this._unsubscribeTerm?.();
|
|
322
|
+
this._unsubscribeTerm = undefined;
|
|
323
|
+
this.rootTerm = undefined;
|
|
95
324
|
}
|
|
96
325
|
/** @internal */
|
|
97
326
|
_watchesUpdates() {
|
|
98
|
-
return
|
|
327
|
+
return this._componentUpdateCallbacks.size > 0;
|
|
99
328
|
}
|
|
100
|
-
|
|
101
|
-
|
|
329
|
+
/** @internal Throw when a builder method is called after registration. */
|
|
330
|
+
_assertConfigurable() {
|
|
331
|
+
if (this.built) {
|
|
332
|
+
throw new Error(`query '${this.name}' has already been built`);
|
|
333
|
+
}
|
|
102
334
|
}
|
|
103
|
-
|
|
104
|
-
|
|
335
|
+
/** @internal */
|
|
336
|
+
_backfill() {
|
|
337
|
+
if (!this._tracking || !this.rootTerm) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
this.world.defer(() => {
|
|
341
|
+
for (const e of this.rootTerm ?? EMPTY_ENTITIES) {
|
|
342
|
+
this._enter(e);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
105
345
|
}
|
|
106
|
-
|
|
107
|
-
|
|
346
|
+
/** @internal Whether this object has enough configuration to enter the world. */
|
|
347
|
+
_isBuildable() {
|
|
348
|
+
return this._dsl !== undefined;
|
|
108
349
|
}
|
|
109
|
-
|
|
110
|
-
|
|
350
|
+
/** @internal */
|
|
351
|
+
_isSourceSilenced() {
|
|
352
|
+
const source = this.entity.world._routingSource;
|
|
353
|
+
return source !== undefined && this._silenceQuery?.has(source) === true;
|
|
111
354
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
this.
|
|
115
|
-
|
|
355
|
+
/** @internal */
|
|
356
|
+
_matchedEntities() {
|
|
357
|
+
if (!this._tracking) {
|
|
358
|
+
return EMPTY_ENTITIES;
|
|
359
|
+
}
|
|
360
|
+
return this._entities ?? this.rootTerm ?? EMPTY_ENTITIES;
|
|
116
361
|
}
|
|
117
|
-
|
|
118
|
-
this.
|
|
119
|
-
this.
|
|
120
|
-
return
|
|
362
|
+
_buildSilenceQuery(dsl) {
|
|
363
|
+
const q = this.world.query(`${this.name}:silence`).with(dsl);
|
|
364
|
+
q.entity.childOf(this.entity);
|
|
365
|
+
return q;
|
|
121
366
|
}
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
if (
|
|
125
|
-
|
|
367
|
+
_reSortCascade(entity, relEid) {
|
|
368
|
+
const entities = this._entities;
|
|
369
|
+
if (entities instanceof OrderedSet) {
|
|
370
|
+
entities.reSort(entity);
|
|
371
|
+
}
|
|
372
|
+
for (const child of entity._childrenByEid(relEid) ?? []) {
|
|
373
|
+
this._reSortCascade(child, relEid);
|
|
126
374
|
}
|
|
127
|
-
const existing = this._dsl ?? true;
|
|
128
|
-
this._dsl = { all: [existing, ...componentRefs] };
|
|
129
|
-
this._hasExplicitQuery = true;
|
|
130
|
-
}
|
|
131
|
-
destroy() {
|
|
132
|
-
this._grouping?.clear();
|
|
133
|
-
this._grouping = undefined;
|
|
134
|
-
super.destroy();
|
|
135
375
|
}
|
|
136
376
|
}
|
|
137
|
-
_setGroupedQueryCtor(GroupedQuery);
|
|
138
377
|
//# sourceMappingURL=query.js.map
|
package/dist/query/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query/query.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,SAAS,GAEV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAS,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,KAAsC,SAAQ,MAAS;IAClE,YAAY,IAAY,EAAE,KAAY,EAAE,QAAiB,IAAI;QAC3D,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAsB,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,YAAY,GAAgC,IAAI,GAAG,EAAE,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YAA0D,SAAQ,KAAQ;IAGrF,gBAAgB;IACT,WAAW,CAChB,IAAgD,EAChD,IAAwC;QAExC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,UAAU,IAAI,CAAC,IAAI,sBAAsB,CAAC;QAClD,CAAC;QACD,IAAI,KAA6B,CAAC;QAClC,IAAI,SAAmB,CAAC;QACxB,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAmC,CAAC;YACvD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE;gBACpB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACxC,OAAO,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC3B,CAAC,CAAC;YACF,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACtE,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,CAAC,uBAAuB,CAAC,CAAC,IAAoB,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;IACA,MAAM,CAAC,CAAS;QAC9B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gBAAgB;IACA,KAAK,CAAC,CAAS;QAC7B,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,gBAAgB;IACA,eAAe,CAAC,CAAS,EAAE,IAAmB,EAAE,CAAoB;QAClF,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,gBAAgB;IACA,eAAe;QAC7B,OAAO,KAAK,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,GAAM;QACjB,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAA4B,CAAC;IAC7D,CAAC;IAEM,MAAM;QACX,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,YAAY,CAAC,MAAM,EAAE,CAE/D,CAAC;IACJ,CAAC;IAEM,SAAS;QACd,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,IAAI,EAAE,CAAwB,CAAC;IAChF,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC1C,CAAC;IAEM,YAAY,CAAC,QAAsC;QACxD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,QAAkC,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,WAAW,CAAC,QAA8C;QAC/D,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,QAAgD,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,uBAAuB,CAAC,IAAwB;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAC/B,CAAC,GAAG,EAAuB,EAAE,CAC3B,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,UAAU,IAAI,GAAG,YAAY,MAAM,CAChF,CAAC;QACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,SAAU,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;CACF;AAED,oBAAoB,CAAC,YAAmB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query/query.ts"],"names":[],"mappings":"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"}
|
package/dist/system.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type ComponentType } from "./component.js";
|
|
2
2
|
import { Iter, type FanInjectTuple, type MaybeResolvedInjectTuple } from "./inject.js";
|
|
3
3
|
import { Query } from "./query/index.js";
|
|
4
|
-
import { type
|
|
4
|
+
import { type ExtractSpecsRequired, type QuerySpec } from "./dsl.js";
|
|
5
5
|
import { Entity } from "./entity/index.js";
|
|
6
6
|
import { type IPhase } from "./phase.js";
|
|
7
7
|
import { type World } from "./world/index.js";
|
|
@@ -15,7 +15,7 @@ type RunCallback = (now: number, delta: number) => void;
|
|
|
15
15
|
*
|
|
16
16
|
* ```ts
|
|
17
17
|
* world.system("Move")
|
|
18
|
-
* .
|
|
18
|
+
* .with(Position, Velocity) // track entities with both components
|
|
19
19
|
* .phase("update")
|
|
20
20
|
* .enter([Position], (e, [pos]) => { pos.x = 0; })
|
|
21
21
|
* .update(Position, (e, pos) => { pos.x += pos.vx; })
|
|
@@ -33,12 +33,12 @@ type RunCallback = (now: number, delta: number) => void;
|
|
|
33
33
|
*
|
|
34
34
|
* ### Component injection and type inference
|
|
35
35
|
*
|
|
36
|
-
* `enter`, `exit`, `update`, `each`, and `
|
|
36
|
+
* `enter`, `exit`, `update`, `each`, and `orderBy` accept an array of component
|
|
37
37
|
* classes resolved from the entity and passed as a typed tuple to the
|
|
38
38
|
* callback.
|
|
39
39
|
*
|
|
40
|
-
* Components declared via {@link
|
|
41
|
-
* {@link
|
|
40
|
+
* Components declared via {@link with} (or the `hint` field of a
|
|
41
|
+
* {@link QueryConfig}) are tracked as the type parameter `R`. Inside `orderBy`,
|
|
42
42
|
* `each`, and `update` injection callbacks they are non-nullable; any other
|
|
43
43
|
* component remains `Type | undefined`.
|
|
44
44
|
*
|
|
@@ -146,11 +146,11 @@ export declare class System<R extends ComponentType[] = []> extends Query<R> imp
|
|
|
146
146
|
*
|
|
147
147
|
* Unlike {@link update} (which only fires when `entity.modified(C)` is
|
|
148
148
|
* called), `each` fires every tick the system runs, once per tracked entity.
|
|
149
|
-
* Components declared via {@link
|
|
149
|
+
* Components declared via {@link with} are non-nullable in the resolved
|
|
150
150
|
* tuple; any other component class may be `undefined` if the entity lacks it.
|
|
151
151
|
*
|
|
152
152
|
* `each` does **not** modify the system's query — define membership with
|
|
153
|
-
* {@link
|
|
153
|
+
* {@link with} as usual. It does, however, implicitly
|
|
154
154
|
* enable {@link track}, so matched entities are exposed via {@link count},
|
|
155
155
|
* {@link has}, iteration, and {@link forEach}.
|
|
156
156
|
*
|
|
@@ -163,14 +163,14 @@ export declare class System<R extends ComponentType[] = []> extends Query<R> imp
|
|
|
163
163
|
*
|
|
164
164
|
* @param components - Component classes to resolve from each entity.
|
|
165
165
|
* @param callback - Receives the entity and a tuple of resolved component
|
|
166
|
-
* instances (`undefined` for any not covered by {@link
|
|
166
|
+
* instances (`undefined` for any not covered by {@link with}).
|
|
167
167
|
* @returns This system, for chaining.
|
|
168
168
|
* @throws When `each` has already been registered on this system.
|
|
169
169
|
*
|
|
170
170
|
* @example
|
|
171
171
|
* ```ts
|
|
172
172
|
* world.system("Move")
|
|
173
|
-
* .
|
|
173
|
+
* .with(Position, Velocity)
|
|
174
174
|
* .each([Position, Velocity], (e, [pos, vel]) => {
|
|
175
175
|
* pos.x += vel.vx;
|
|
176
176
|
* pos.y += vel.vy;
|
|
@@ -188,37 +188,21 @@ export declare class System<R extends ComponentType[] = []> extends Query<R> imp
|
|
|
188
188
|
* cursor instead of the bare entity. The cursor exposes the visited entity
|
|
189
189
|
* (`it.entity`) and, in `it.src`, the source entity each resolved component
|
|
190
190
|
* was read from (the visited entity for direct components, the relationship
|
|
191
|
-
* target for `
|
|
191
|
+
* target for `target`-injected ones).
|
|
192
192
|
*/
|
|
193
193
|
each<J extends FanInjectTuple>(cursor: typeof Iter, components: readonly [...J], callback: (it: Iter, resolved: MaybeResolvedInjectTuple<J, R>) => void): this;
|
|
194
194
|
/**
|
|
195
|
-
*
|
|
195
|
+
* Add entity-membership predicates using {@link QuerySpec} expressions.
|
|
196
196
|
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
* via `update` is disabled.
|
|
197
|
+
* Merges with any existing predicate using `all`. After calling `with`,
|
|
198
|
+
* watchlist auto-expansion via `update` is disabled.
|
|
200
199
|
*
|
|
201
|
-
*
|
|
202
|
-
* {@link Query.query} for details.
|
|
200
|
+
* `hint` fields are pure type-level hints — see {@link Query.with} for details.
|
|
203
201
|
*
|
|
204
|
-
* @param
|
|
205
|
-
* @
|
|
206
|
-
* entity (type hint only — not validated at runtime).
|
|
207
|
-
* @returns This system, retyped with the guaranteed tuple as its `R`.
|
|
202
|
+
* @param specs - Query specifications to add.
|
|
203
|
+
* @returns This system, retyped with the guaranteed components added to `R`.
|
|
208
204
|
*/
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Shorthand for `query([...components])` — tracks entities that have **all**
|
|
212
|
-
* of the listed component types.
|
|
213
|
-
*
|
|
214
|
-
* Equivalent to `query(components)`. The listed components are also
|
|
215
|
-
* recorded in the type parameter `R`, so {@link sort}, {@link each}, and
|
|
216
|
-
* {@link update} callbacks treat them as non-nullable.
|
|
217
|
-
*
|
|
218
|
-
* @param components - Component classes to require.
|
|
219
|
-
* @returns This system, retyped with the required tuple as its `R`.
|
|
220
|
-
*/
|
|
221
|
-
requires<T extends ComponentType[]>(...components: [...T]): System<T>;
|
|
205
|
+
with<const S extends readonly QuerySpec[]>(...specs: [...S]): System<[...R, ...ExtractSpecsRequired<S>]>;
|
|
222
206
|
/**
|
|
223
207
|
* Systems cannot use groupBy. Use `world.query(...).groupBy(...)` instead.
|
|
224
208
|
*/
|
|
@@ -244,7 +228,7 @@ export declare class System<R extends ComponentType[] = []> extends Query<R> imp
|
|
|
244
228
|
*
|
|
245
229
|
* @example
|
|
246
230
|
* ```ts
|
|
247
|
-
* const sys = world.system("AI").
|
|
231
|
+
* const sys = world.system("AI").with(Enemy).run(runAI);
|
|
248
232
|
* // Pause AI processing during a cutscene:
|
|
249
233
|
* sys.disable();
|
|
250
234
|
* // Resume:
|