@vworlds/vecs 1.0.9 → 1.0.11
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/.husky/pre-commit +1 -0
- package/README.md +218 -229
- package/dist/command.d.ts +1 -0
- package/dist/command.js +2 -0
- package/dist/command.js.map +1 -0
- package/dist/component.d.ts +51 -59
- package/dist/component.js +31 -25
- package/dist/component.js.map +1 -1
- package/dist/dsl.d.ts +34 -26
- package/dist/dsl.js +46 -20
- package/dist/dsl.js.map +1 -1
- package/dist/entity.d.ts +110 -127
- package/dist/entity.js +323 -164
- package/dist/entity.js.map +1 -1
- package/dist/filter.d.ts +31 -23
- package/dist/filter.js +41 -32
- package/dist/filter.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/package.json +3 -1
- package/dist/phase.d.ts +5 -28
- package/dist/phase.js +11 -10
- package/dist/phase.js.map +1 -1
- package/dist/query.d.ts +128 -94
- package/dist/query.js +254 -145
- package/dist/query.js.map +1 -1
- package/dist/system.d.ts +64 -128
- package/dist/system.js +156 -149
- package/dist/system.js.map +1 -1
- package/dist/util/array_map.d.ts +4 -55
- package/dist/util/array_map.js +35 -37
- package/dist/util/array_map.js.map +1 -1
- package/dist/util/bitset.d.ts +40 -50
- package/dist/util/bitset.js +76 -62
- package/dist/util/bitset.js.map +1 -1
- package/dist/util/events.d.ts +14 -18
- package/dist/util/events.js +24 -3
- package/dist/util/events.js.map +1 -1
- package/dist/util/ordered_set.d.ts +1 -17
- package/dist/util/ordered_set.js +74 -25
- package/dist/util/ordered_set.js.map +1 -1
- package/dist/world.d.ts +222 -201
- package/dist/world.js +394 -323
- package/dist/world.js.map +1 -1
- package/eslint-rules/internal-underscore.js +60 -0
- package/eslint.config.js +5 -0
- package/package.json +3 -1
package/dist/query.js
CHANGED
|
@@ -1,144 +1,277 @@
|
|
|
1
1
|
import { OrderedSet } from "./util/ordered_set.js";
|
|
2
|
-
import {
|
|
2
|
+
import { ArrayMap } from "./util/array_map.js";
|
|
3
|
+
import { Bitset } from "./util/bitset.js";
|
|
4
|
+
import { _HAS, _buildEntityTest, } from "./dsl.js";
|
|
3
5
|
const EMPTY_ENTITIES = new Set();
|
|
4
6
|
/**
|
|
5
|
-
* A reactive, always-
|
|
6
|
-
*
|
|
7
|
+
* A reactive, always-up-to-date set of entities matching a {@link QueryDSL}
|
|
8
|
+
* predicate.
|
|
7
9
|
*
|
|
8
|
-
* `Query`
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* is exposed via {@link entities} and {@link forEach}.
|
|
10
|
+
* `Query` listens to entity / component mutations through the world's command
|
|
11
|
+
* queue and tracks which entities currently satisfy its predicate. It fires
|
|
12
|
+
* `enter`, `exit`, and `update` callbacks as the matched set changes. The
|
|
13
|
+
* tracked set is exposed via {@link entities} and {@link forEach}.
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
15
|
+
* Callbacks fire **synchronously** when the world routes a command — so
|
|
16
|
+
* mutations made inside one of these callbacks are themselves observed
|
|
17
|
+
* immediately by other queries / systems.
|
|
16
18
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
* {@link System} extends `Query` and queues callbacks into an inbox replayed
|
|
20
|
+
* during `_run` instead of firing them immediately. Use `Query` directly when
|
|
21
|
+
* you want a reactive entity set without pipeline integration.
|
|
22
|
+
*
|
|
23
|
+
* @typeParam R - Component classes guaranteed present on every matched entity
|
|
24
|
+
* (declared via {@link requires} or the `_guaranteed` hint of {@link query}).
|
|
25
|
+
* Components in `R` appear as non-nullable in {@link sort}, {@link forEach},
|
|
26
|
+
* and {@link update} callback tuples.
|
|
21
27
|
*/
|
|
22
28
|
export class Query {
|
|
23
29
|
constructor(
|
|
24
|
-
/** Unique name
|
|
30
|
+
/** Unique display name; appears in logs and debug output. */
|
|
25
31
|
name,
|
|
26
|
-
/**
|
|
32
|
+
/** World that owns this query. */
|
|
27
33
|
world, track = true) {
|
|
28
34
|
this.name = name;
|
|
29
35
|
this.world = world;
|
|
30
|
-
|
|
31
|
-
this._exitCallback = [];
|
|
36
|
+
/** @internal Predicate compiled from the query DSL; defaults to "match nothing". */
|
|
32
37
|
this._belongs = (_e) => false;
|
|
33
|
-
|
|
38
|
+
/** @internal `true` once {@link query} or {@link requires} has set an explicit predicate. */
|
|
39
|
+
this._hasQuery = false;
|
|
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 Type ids the exit callback needs snapshotted before component removal. */
|
|
45
|
+
this._exitSnapshotTypes = undefined;
|
|
46
|
+
/** @internal Per-component-type `update` callbacks. */
|
|
47
|
+
this._componentUpdateCallbacks = new ArrayMap();
|
|
48
|
+
/** @internal Bitmask of component types this query reacts to via `update`. */
|
|
49
|
+
this._watchlistBitmask = new Bitset();
|
|
34
50
|
world._addQuery(this);
|
|
35
51
|
if (track) {
|
|
36
52
|
this.track();
|
|
37
53
|
}
|
|
38
54
|
}
|
|
39
|
-
/** Returns the query name. */
|
|
40
|
-
toString() {
|
|
41
|
-
return this.name;
|
|
42
|
-
}
|
|
43
55
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* Idempotent. When called after {@link World.start}, immediately backfills all
|
|
48
|
-
* existing entities that currently satisfy the query predicate.
|
|
49
|
-
*
|
|
50
|
-
* @returns `this` for chaining.
|
|
56
|
+
* @internal Backfill the tracked set with every existing entity that
|
|
57
|
+
* satisfies the current predicate. Runs inside a deferred scope so the
|
|
58
|
+
* caller's reentrant routing remains consistent.
|
|
51
59
|
*/
|
|
52
|
-
|
|
53
|
-
this._entities ?? (this._entities = new Set());
|
|
54
|
-
this.backfill();
|
|
55
|
-
return this;
|
|
56
|
-
}
|
|
57
|
-
backfill() {
|
|
60
|
+
_backfill() {
|
|
58
61
|
if (this._entities === undefined) {
|
|
59
62
|
return;
|
|
60
63
|
}
|
|
61
|
-
this.world.
|
|
62
|
-
|
|
63
|
-
e.
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
this.world.defer(() => {
|
|
65
|
+
this.world.entities.forEach((e) => {
|
|
66
|
+
if (this.belongs(e) && !e._isInQuery(this)) {
|
|
67
|
+
this._enter(e);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
66
70
|
});
|
|
67
71
|
}
|
|
68
72
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* Populated as entities enter (and removed as they exit). Empty unless
|
|
72
|
-
* tracking is enabled (default for standalone queries; requires an explicit
|
|
73
|
-
* {@link track} call on {@link System | systems}).
|
|
73
|
+
* @internal Resolve one element of an `inject` tuple to a component
|
|
74
|
+
* instance, falling back to `exitSnapshot` when the entity is mid-exit.
|
|
74
75
|
*/
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
forEach(componentsOrCallback, callback) {
|
|
79
|
-
if (typeof componentsOrCallback === "function") {
|
|
80
|
-
this._entities?.forEach(componentsOrCallback);
|
|
76
|
+
_getComponent(e, C, exitSnapshot) {
|
|
77
|
+
if (typeof C === "number") {
|
|
78
|
+
return exitSnapshot?.get(C) ?? e.get(C);
|
|
81
79
|
}
|
|
82
80
|
else {
|
|
83
|
-
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
const types = componentsOrCallback.map((C) => this.world.getComponentType(C));
|
|
87
|
-
this._entities.forEach((e) => {
|
|
88
|
-
const resolved = types.map((t) => e.get(t));
|
|
89
|
-
callback(e, resolved);
|
|
90
|
-
});
|
|
81
|
+
return e.parent?.get(C.parent);
|
|
91
82
|
}
|
|
92
83
|
}
|
|
93
|
-
/**
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
/**
|
|
85
|
+
* @internal Resolve every element of an `inject` tuple, throwing if any
|
|
86
|
+
* required component is missing on the entity (or its parent).
|
|
87
|
+
*/
|
|
88
|
+
_getInjected(e, inject, exitSnapshot) {
|
|
89
|
+
const injected = [];
|
|
90
|
+
inject.forEach((C) => {
|
|
91
|
+
const c = this._getComponent(e, C, exitSnapshot);
|
|
92
|
+
if (!c) {
|
|
93
|
+
throw "query does not contain component";
|
|
94
|
+
}
|
|
95
|
+
injected.push(c);
|
|
96
|
+
});
|
|
97
|
+
return injected;
|
|
96
98
|
}
|
|
97
|
-
/**
|
|
98
|
-
|
|
99
|
-
|
|
99
|
+
/**
|
|
100
|
+
* @internal Translate a tuple of component classes (or `{ parent: C }`
|
|
101
|
+
* markers) into the corresponding type ids understood by {@link _getInjected}.
|
|
102
|
+
*/
|
|
103
|
+
_mapInjectedClassToTypes(inject) {
|
|
104
|
+
return inject.map((C) => {
|
|
105
|
+
if (typeof C === "function") {
|
|
106
|
+
return this.world.getComponentType(C);
|
|
107
|
+
}
|
|
108
|
+
return { parent: this.world.getComponentType(C.parent) };
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* @internal Add `e` to the tracked set, register query membership on the
|
|
113
|
+
* entity, fire any registered `enter` callback, then bridge the entity's
|
|
114
|
+
* already-attached watched components through {@link _notifyModified} so
|
|
115
|
+
* `update` callbacks see them once on entry.
|
|
116
|
+
*
|
|
117
|
+
* `System` overrides this to push events into its inbox.
|
|
118
|
+
*/
|
|
100
119
|
_enter(e) {
|
|
101
|
-
this._enterCallback.forEach((cb) => cb(e));
|
|
102
120
|
this._entities?.add(e);
|
|
121
|
+
e._addQueryMembership(this);
|
|
122
|
+
this._enterCallback?.(e);
|
|
123
|
+
e.components.forEach((c) => {
|
|
124
|
+
if (this._watchlistBitmask.hasBit(c.bitPtr)) {
|
|
125
|
+
this._notifyModified(c);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
103
128
|
}
|
|
104
|
-
/**
|
|
129
|
+
/**
|
|
130
|
+
* @internal Remove `e` from the tracked set, deregister query membership,
|
|
131
|
+
* and fire any registered `exit` callback. `System` overrides this to push
|
|
132
|
+
* an inbox event.
|
|
133
|
+
*/
|
|
105
134
|
_exit(e) {
|
|
106
|
-
this._exitCallback
|
|
135
|
+
this._exitCallback?.(e);
|
|
107
136
|
this._entities?.delete(e);
|
|
137
|
+
e._removeQueryMembership(this);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* @internal Routing entry: when the watchlist matches, invoke the registered
|
|
141
|
+
* `update` callback for the component type. `System` overrides this to push
|
|
142
|
+
* an inbox event instead of firing immediately.
|
|
143
|
+
*/
|
|
144
|
+
_notifyModified(c) {
|
|
145
|
+
if (!this._watchlistBitmask.hasBit(c.bitPtr)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const callback = this._componentUpdateCallbacks.get(c.type);
|
|
149
|
+
if (callback) {
|
|
150
|
+
callback(c);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Read-only view of the entities currently tracked by this query.
|
|
155
|
+
*
|
|
156
|
+
* Populated as entities enter and removed as they exit. Empty unless
|
|
157
|
+
* tracking is enabled — that is the default for standalone queries created
|
|
158
|
+
* via {@link World.query}, but {@link System} requires an explicit
|
|
159
|
+
* {@link track}, {@link sort}, or `each` call.
|
|
160
|
+
*/
|
|
161
|
+
get entities() {
|
|
162
|
+
return this._entities ?? EMPTY_ENTITIES;
|
|
163
|
+
}
|
|
164
|
+
/** Returns the query name. */
|
|
165
|
+
toString() {
|
|
166
|
+
return this.name;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Enable entity tracking: matched entities are inserted into {@link entities}
|
|
170
|
+
* as they enter and removed as they exit.
|
|
171
|
+
*
|
|
172
|
+
* Idempotent. When called after {@link World.start}, immediately backfills
|
|
173
|
+
* every existing entity that satisfies the current predicate.
|
|
174
|
+
*
|
|
175
|
+
* @returns This query, for chaining.
|
|
176
|
+
*/
|
|
177
|
+
track() {
|
|
178
|
+
this._entities ?? (this._entities = new Set());
|
|
179
|
+
this._backfill();
|
|
180
|
+
return this;
|
|
181
|
+
}
|
|
182
|
+
/** Returns `true` when `e` satisfies this query's predicate. */
|
|
183
|
+
belongs(e) {
|
|
184
|
+
return this._belongs(e);
|
|
185
|
+
}
|
|
186
|
+
forEach(componentsOrCallback, callback) {
|
|
187
|
+
this.world.beginDefer();
|
|
188
|
+
try {
|
|
189
|
+
if (typeof componentsOrCallback === "function") {
|
|
190
|
+
this._entities?.forEach(componentsOrCallback);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
if (!this._entities || !this.world) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const types = componentsOrCallback.map((C) => this.world.getComponentType(C));
|
|
197
|
+
this._entities.forEach((e) => {
|
|
198
|
+
const resolved = types.map((t) => e.get(t));
|
|
199
|
+
callback(e, resolved);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
this.world.endDefer();
|
|
205
|
+
}
|
|
108
206
|
}
|
|
109
207
|
enter(injectOrCallback, callback) {
|
|
110
208
|
if (typeof injectOrCallback === "function") {
|
|
111
|
-
this._enterCallback
|
|
209
|
+
this._enterCallback = injectOrCallback;
|
|
112
210
|
}
|
|
113
211
|
else {
|
|
114
|
-
const inject = this.
|
|
115
|
-
this._enterCallback
|
|
116
|
-
callback(e, this.
|
|
117
|
-
}
|
|
212
|
+
const inject = this._mapInjectedClassToTypes(injectOrCallback);
|
|
213
|
+
this._enterCallback = (e) => {
|
|
214
|
+
callback(e, this._getInjected(e, inject));
|
|
215
|
+
};
|
|
118
216
|
}
|
|
119
217
|
return this;
|
|
120
218
|
}
|
|
121
219
|
exit(injectOrCallback, callback) {
|
|
122
220
|
if (typeof injectOrCallback === "function") {
|
|
123
|
-
this._exitCallback
|
|
221
|
+
this._exitCallback = injectOrCallback;
|
|
222
|
+
this._exitSnapshotTypes = undefined;
|
|
124
223
|
}
|
|
125
224
|
else {
|
|
126
|
-
const inject = this.
|
|
127
|
-
this.
|
|
128
|
-
|
|
129
|
-
|
|
225
|
+
const inject = this._mapInjectedClassToTypes(injectOrCallback);
|
|
226
|
+
this._exitSnapshotTypes = inject.filter((t) => typeof t === "number");
|
|
227
|
+
this._exitCallback = (e, exitSnapshot) => {
|
|
228
|
+
callback(e, this._getInjected(e, inject, exitSnapshot));
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return this;
|
|
232
|
+
}
|
|
233
|
+
update(ComponentClass, injectOrCallback, callback) {
|
|
234
|
+
const type = this.world.getComponentType(ComponentClass);
|
|
235
|
+
if (typeof injectOrCallback === "function") {
|
|
236
|
+
callback = injectOrCallback;
|
|
237
|
+
this._componentUpdateCallbacks.set(type, callback);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
const inject = injectOrCallback;
|
|
241
|
+
const injectedComponentTypes = inject.map((C) => this.world.getComponentType(C));
|
|
242
|
+
const cb = (c) => {
|
|
243
|
+
const injected = [];
|
|
244
|
+
injectedComponentTypes.forEach((InjectedComponentType) => {
|
|
245
|
+
injected.push(c.entity.get(InjectedComponentType));
|
|
246
|
+
});
|
|
247
|
+
if (callback) {
|
|
248
|
+
callback(c, injected);
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
this._componentUpdateCallbacks.set(type, cb);
|
|
252
|
+
}
|
|
253
|
+
this._watchlistBitmask.add(type);
|
|
254
|
+
if (!this._hasQuery) {
|
|
255
|
+
// Update-only queries derive membership from the watched component set.
|
|
256
|
+
// Install that predicate before backfill so the default match-nothing
|
|
257
|
+
// predicate is never used for update-watchlist expansion.
|
|
258
|
+
const watchlist = this._watchlistBitmask.indices();
|
|
259
|
+
this._belongs = _HAS(this.world, ...watchlist);
|
|
260
|
+
this._backfill();
|
|
130
261
|
}
|
|
131
262
|
return this;
|
|
132
263
|
}
|
|
133
264
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* component instances for each pair
|
|
265
|
+
* Switch the tracked set to a sorted ordering: matched entities are stored
|
|
266
|
+
* in the position determined by `compare`, which receives a tuple of
|
|
267
|
+
* resolved component instances for each pair being ordered.
|
|
268
|
+
*
|
|
269
|
+
* Implies {@link track}.
|
|
137
270
|
*
|
|
138
271
|
* @param components - Component classes to resolve and pass to `compare`.
|
|
139
|
-
* @param compare -
|
|
140
|
-
* `a` should sort
|
|
141
|
-
* @returns
|
|
272
|
+
* @param compare - Negative when `a` should sort before `b`, zero for
|
|
273
|
+
* equality, positive when `a` should sort after `b`.
|
|
274
|
+
* @returns This query, for chaining.
|
|
142
275
|
*
|
|
143
276
|
* @example
|
|
144
277
|
* ```ts
|
|
@@ -149,22 +282,23 @@ export class Query {
|
|
|
149
282
|
*/
|
|
150
283
|
sort(components, compare) {
|
|
151
284
|
const types = components.map((C) => this.world.getComponentType(C));
|
|
152
|
-
this._entities = new OrderedSet((a, b) => compare(types.map((t) => a.get(t
|
|
153
|
-
this.
|
|
285
|
+
this._entities = new OrderedSet((a, b) => compare(types.map((t) => a.get(t)), types.map((t) => b.get(t))));
|
|
286
|
+
this._backfill();
|
|
154
287
|
return this;
|
|
155
288
|
}
|
|
156
289
|
/**
|
|
157
|
-
* Set the entity
|
|
290
|
+
* Set the entity-membership predicate using a {@link QueryDSL} expression.
|
|
158
291
|
*
|
|
159
|
-
* Replaces any previous predicate. The optional `
|
|
160
|
-
* pure type-level hint: it tells {@link sort}
|
|
161
|
-
*
|
|
162
|
-
* those positions. It has no
|
|
292
|
+
* Replaces any previous predicate. The optional `_guaranteed` tuple is a
|
|
293
|
+
* pure type-level hint: it tells {@link sort} / {@link forEach} /
|
|
294
|
+
* {@link update} callbacks which components are guaranteed present on every
|
|
295
|
+
* matched entity, eliminating `| undefined` from those positions. It has no
|
|
296
|
+
* effect at runtime.
|
|
163
297
|
*
|
|
164
|
-
* @param q -
|
|
298
|
+
* @param q - Query expression.
|
|
165
299
|
* @param _guaranteed - Component classes guaranteed present on every matched
|
|
166
300
|
* entity (type hint only — not validated at runtime).
|
|
167
|
-
* @returns
|
|
301
|
+
* @returns This query, retyped with the guaranteed tuple as its `R`.
|
|
168
302
|
*
|
|
169
303
|
* @example
|
|
170
304
|
* ```ts
|
|
@@ -176,68 +310,43 @@ export class Query {
|
|
|
176
310
|
* ```
|
|
177
311
|
*/
|
|
178
312
|
query(q, _guaranteed) {
|
|
179
|
-
this._belongs =
|
|
180
|
-
this.
|
|
181
|
-
this.
|
|
313
|
+
this._belongs = _buildEntityTest(this.world, q);
|
|
314
|
+
this._hasQuery = true;
|
|
315
|
+
this._backfill();
|
|
182
316
|
return this;
|
|
183
317
|
}
|
|
184
318
|
/**
|
|
185
|
-
*
|
|
319
|
+
* Shorthand for `query([...components])`: track entities that have **all**
|
|
320
|
+
* of the listed component types.
|
|
186
321
|
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
322
|
+
* Equivalent to `query({ HAS: components })`. Unlike `query`, the listed
|
|
323
|
+
* components are also recorded in the type parameter `R`, so {@link sort}
|
|
324
|
+
* and {@link forEach} callbacks see them as non-nullable.
|
|
190
325
|
*
|
|
191
|
-
*
|
|
326
|
+
* @param components - Component classes to require.
|
|
327
|
+
* @returns This query, retyped with the required tuple as its `R`.
|
|
192
328
|
*/
|
|
193
|
-
|
|
194
|
-
this.
|
|
195
|
-
this
|
|
196
|
-
this.world = undefined;
|
|
329
|
+
requires(...components) {
|
|
330
|
+
this.query(components);
|
|
331
|
+
return this;
|
|
197
332
|
}
|
|
198
333
|
/**
|
|
199
|
-
*
|
|
200
|
-
* **all** of the listed component types.
|
|
334
|
+
* Permanently remove this query from the world.
|
|
201
335
|
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
336
|
+
* Every entity that currently belongs to this query has the membership
|
|
337
|
+
* silently purged (no `exit` callbacks fire), the tracked set is cleared,
|
|
338
|
+
* and the `world` reference is forced to `undefined`. Calling any method on
|
|
339
|
+
* the query afterwards is **undefined behavior**.
|
|
205
340
|
*
|
|
206
|
-
* @
|
|
207
|
-
* @returns `this` for chaining.
|
|
341
|
+
* Not supported on {@link System} — calling it on a system throws.
|
|
208
342
|
*/
|
|
209
|
-
|
|
210
|
-
this.
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
c = e.get(C, considerDeleted);
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
c = e.parent && e.parent.get(C.parent, considerDeleted);
|
|
220
|
-
}
|
|
221
|
-
return c;
|
|
222
|
-
}
|
|
223
|
-
getInjected(e, inject, considerDeleted = false) {
|
|
224
|
-
const injected = [];
|
|
225
|
-
inject.forEach((C) => {
|
|
226
|
-
const c = this.getComponent(e, C, considerDeleted);
|
|
227
|
-
if (!c) {
|
|
228
|
-
throw "query does not contain component";
|
|
229
|
-
}
|
|
230
|
-
injected.push(c);
|
|
231
|
-
});
|
|
232
|
-
return injected;
|
|
233
|
-
}
|
|
234
|
-
mapInjectedClassToTypes(inject) {
|
|
235
|
-
return inject.map((C) => {
|
|
236
|
-
if (typeof C === "function") {
|
|
237
|
-
return this.world.getComponentType(C);
|
|
238
|
-
}
|
|
239
|
-
return { parent: this.world.getComponentType(C.parent) };
|
|
240
|
-
});
|
|
343
|
+
destroy() {
|
|
344
|
+
this.world._removeQuery(this);
|
|
345
|
+
this._entities?.forEach((e) => e._purgeQuery(this));
|
|
346
|
+
this._entities?.clear();
|
|
347
|
+
this._entities = undefined;
|
|
348
|
+
this._belongs = (_e) => false;
|
|
349
|
+
this.world = undefined;
|
|
241
350
|
}
|
|
242
351
|
}
|
|
243
352
|
//# sourceMappingURL=query.js.map
|
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|