@vworlds/vecs 1.0.15 → 1.0.17
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 +13 -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 +30 -0
- package/dist/util/id_pool.js +222 -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 +106 -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 +63 -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
package/dist/util/bitset.js
CHANGED
|
@@ -20,7 +20,11 @@
|
|
|
20
20
|
*/
|
|
21
21
|
export class Bitset {
|
|
22
22
|
constructor() {
|
|
23
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* @internal Underlying word storage; exposed for tests and read directly
|
|
25
|
+
* from query predicates emitted by {@link _compileSubsetCheck}. Renaming
|
|
26
|
+
* this field is a breaking change for compiled query code generation.
|
|
27
|
+
*/
|
|
24
28
|
this._bits = [];
|
|
25
29
|
}
|
|
26
30
|
/**
|
|
@@ -29,7 +33,12 @@ export class Bitset {
|
|
|
29
33
|
* @param n - Non-negative integer bit index.
|
|
30
34
|
*/
|
|
31
35
|
add(n) {
|
|
32
|
-
|
|
36
|
+
const idx = n >>> 5;
|
|
37
|
+
const bits = this._bits;
|
|
38
|
+
while (bits.length <= idx) {
|
|
39
|
+
bits.push(0);
|
|
40
|
+
}
|
|
41
|
+
bits[idx] |= 1 << n;
|
|
33
42
|
}
|
|
34
43
|
/**
|
|
35
44
|
* Set the bit described by `bptr` (fast path using a pre-computed
|
|
@@ -48,10 +57,7 @@ export class Bitset {
|
|
|
48
57
|
* @param bptr - Pre-computed pointer to a bit position.
|
|
49
58
|
*/
|
|
50
59
|
deleteBit(bptr) {
|
|
51
|
-
|
|
52
|
-
if (current) {
|
|
53
|
-
this._bits[bptr.arrayIndex] = current & ~bptr.bitmask;
|
|
54
|
-
}
|
|
60
|
+
this._bits[bptr.arrayIndex] &= ~bptr.bitmask;
|
|
55
61
|
}
|
|
56
62
|
/**
|
|
57
63
|
* Clear bit `n`. Storage is not compacted automatically; call
|
|
@@ -60,11 +66,7 @@ export class Bitset {
|
|
|
60
66
|
* @param n - Non-negative integer bit index.
|
|
61
67
|
*/
|
|
62
68
|
delete(n) {
|
|
63
|
-
|
|
64
|
-
const current = this._bits[arrayIndex];
|
|
65
|
-
if (current) {
|
|
66
|
-
this._bits[arrayIndex] = current & ~(1 << n);
|
|
67
|
-
}
|
|
69
|
+
this._bits[n >>> 5] &= ~(1 << n);
|
|
68
70
|
}
|
|
69
71
|
/**
|
|
70
72
|
* Trim trailing zero words from the backing storage.
|
|
@@ -120,8 +122,9 @@ export class Bitset {
|
|
|
120
122
|
hasBitset(other) {
|
|
121
123
|
const bits = this._bits;
|
|
122
124
|
const otherBits = other._bits;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
const len = otherBits.length;
|
|
126
|
+
for (let i = 0; i < len; i++) {
|
|
127
|
+
const otherWord = otherBits[i];
|
|
125
128
|
if ((bits[i] & otherWord) !== otherWord) {
|
|
126
129
|
return false;
|
|
127
130
|
}
|
|
@@ -134,14 +137,59 @@ export class Bitset {
|
|
|
134
137
|
* @param callback - Invoked once per set bit.
|
|
135
138
|
*/
|
|
136
139
|
forEach(callback) {
|
|
137
|
-
this._bits
|
|
140
|
+
const bits = this._bits;
|
|
141
|
+
const len = bits.length;
|
|
142
|
+
for (let j = 0; j < len; j++) {
|
|
143
|
+
let w = bits[j];
|
|
144
|
+
if (w === 0) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const base = j << 5;
|
|
148
|
+
if (w === -1) {
|
|
149
|
+
callback(base);
|
|
150
|
+
callback(base + 1);
|
|
151
|
+
callback(base + 2);
|
|
152
|
+
callback(base + 3);
|
|
153
|
+
callback(base + 4);
|
|
154
|
+
callback(base + 5);
|
|
155
|
+
callback(base + 6);
|
|
156
|
+
callback(base + 7);
|
|
157
|
+
callback(base + 8);
|
|
158
|
+
callback(base + 9);
|
|
159
|
+
callback(base + 10);
|
|
160
|
+
callback(base + 11);
|
|
161
|
+
callback(base + 12);
|
|
162
|
+
callback(base + 13);
|
|
163
|
+
callback(base + 14);
|
|
164
|
+
callback(base + 15);
|
|
165
|
+
callback(base + 16);
|
|
166
|
+
callback(base + 17);
|
|
167
|
+
callback(base + 18);
|
|
168
|
+
callback(base + 19);
|
|
169
|
+
callback(base + 20);
|
|
170
|
+
callback(base + 21);
|
|
171
|
+
callback(base + 22);
|
|
172
|
+
callback(base + 23);
|
|
173
|
+
callback(base + 24);
|
|
174
|
+
callback(base + 25);
|
|
175
|
+
callback(base + 26);
|
|
176
|
+
callback(base + 27);
|
|
177
|
+
callback(base + 28);
|
|
178
|
+
callback(base + 29);
|
|
179
|
+
callback(base + 30);
|
|
180
|
+
callback(base + 31);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
138
183
|
for (let i = 0; i < 32; i++) {
|
|
139
|
-
if ((
|
|
140
|
-
callback(
|
|
184
|
+
if ((w & 1) !== 0) {
|
|
185
|
+
callback(base + i);
|
|
186
|
+
}
|
|
187
|
+
w >>>= 1;
|
|
188
|
+
if (w === 0) {
|
|
189
|
+
break;
|
|
141
190
|
}
|
|
142
|
-
b >>= 1;
|
|
143
191
|
}
|
|
144
|
-
}
|
|
192
|
+
}
|
|
145
193
|
}
|
|
146
194
|
/**
|
|
147
195
|
* Return an array of every set bit index in ascending order.
|
|
@@ -169,13 +217,50 @@ export class Bitset {
|
|
|
169
217
|
this._bits[arrayIndex] = bitmask;
|
|
170
218
|
}
|
|
171
219
|
/**
|
|
172
|
-
*
|
|
173
|
-
* `
|
|
220
|
+
* Emit a JavaScript expression that evaluates to `true` when the bitset
|
|
221
|
+
* addressed by `targetBitsExpr` (a `number[]` of 32-bit words) contains
|
|
222
|
+
* every bit set in this bitset.
|
|
223
|
+
*
|
|
224
|
+
* The expression is intended to be spliced into source generated through
|
|
225
|
+
* `new Function(...)` so that a `hasBitset` call against this (immutable)
|
|
226
|
+
* mask is replaced by straight-line bitwise checks with the mask's word
|
|
227
|
+
* values baked in as numeric literals. Zero words are skipped at code
|
|
228
|
+
* generation time, so the runtime expression never iterates them.
|
|
229
|
+
*
|
|
230
|
+
* Contract:
|
|
231
|
+
* - Empty mask -> `"true"`.
|
|
232
|
+
* - One non-zero word -> a single `(target[i]&W)===W` term (no outer
|
|
233
|
+
* parens; `===` binds tighter than `&&` / `||`, so embedding in an
|
|
234
|
+
* AND / OR chain is precedence-safe).
|
|
235
|
+
* - Multiple non-zero words -> terms joined by `&&`, no outer parens.
|
|
236
|
+
* - A word whose value sets bit 31 emits as a negative int32 literal
|
|
237
|
+
* (e.g. `-2147483648`); JS bitwise `&` is defined to coerce both
|
|
238
|
+
* operands to int32, so the round-trip comparison is correct.
|
|
239
|
+
* - When `target.length` is smaller than the mask, the missing slots
|
|
240
|
+
* read as `undefined`; `undefined & W` coerces to `0`, and
|
|
241
|
+
* `0 === W` (W !== 0) is `false`, matching `hasBitset` semantics.
|
|
242
|
+
*
|
|
243
|
+
* The mask's `_bits` are read at the time `_compileSubsetCheck` runs,
|
|
244
|
+
* so a caller that mutates the mask after compilation will not affect
|
|
245
|
+
* already-emitted strings.
|
|
174
246
|
*
|
|
175
247
|
* @internal
|
|
248
|
+
*
|
|
249
|
+
* @param targetBitsExpr - JS expression that, when evaluated at runtime,
|
|
250
|
+
* yields the target's `_bits` array. Embedded verbatim into the
|
|
251
|
+
* emitted code; it must be free of side effects (it is evaluated
|
|
252
|
+
* once per non-zero word of this mask).
|
|
176
253
|
*/
|
|
177
|
-
|
|
178
|
-
|
|
254
|
+
_compileSubsetCheck(targetBitsExpr) {
|
|
255
|
+
const conjuncts = [];
|
|
256
|
+
for (let i = 0; i < this._bits.length; i++) {
|
|
257
|
+
const w = this._bits[i] | 0;
|
|
258
|
+
if (w === 0) {
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
conjuncts.push(`(${targetBitsExpr}[${i}]&${w})===${w}`);
|
|
262
|
+
}
|
|
263
|
+
return conjuncts.length === 0 ? "true" : conjuncts.join("&&");
|
|
179
264
|
}
|
|
180
265
|
}
|
|
181
266
|
/**
|
package/dist/util/bitset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitset.js","sourceRoot":"","sources":["../../src/util/bitset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,MAAM;IAAnB;QACE
|
|
1
|
+
{"version":3,"file":"bitset.js","sourceRoot":"","sources":["../../src/util/bitset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `Set<T>` whose members are kept in a dense backing array so iteration is a
|
|
3
|
+
* tight indexed loop rather than a hash-table walk.
|
|
4
|
+
*
|
|
5
|
+
* Membership is tracked in a side `Map<T, number>` that records each element's
|
|
6
|
+
* slot, so `add` is a push and `delete` swaps the last element into the vacated
|
|
7
|
+
* slot and pops — both O(1) and without the tombstone slots a churned native
|
|
8
|
+
* `Set` accumulates. The swap means iteration order is **not** insertion order
|
|
9
|
+
* after a deletion; that is fine for query membership, whose order is
|
|
10
|
+
* unspecified unless `Query.sort` is used (which keeps an {@link OrderedSet}
|
|
11
|
+
* instead).
|
|
12
|
+
*
|
|
13
|
+
* @internal Used only inside the package.
|
|
14
|
+
*
|
|
15
|
+
* @typeParam T - Element type stored in the set.
|
|
16
|
+
*/
|
|
17
|
+
export class DenseSet {
|
|
18
|
+
constructor() {
|
|
19
|
+
this._items = [];
|
|
20
|
+
this._slot = new Map();
|
|
21
|
+
}
|
|
22
|
+
/** Number of elements currently stored. */
|
|
23
|
+
get size() {
|
|
24
|
+
return this._items.length;
|
|
25
|
+
}
|
|
26
|
+
/** Tag used by `Object.prototype.toString` for stringification. */
|
|
27
|
+
get [Symbol.toStringTag]() {
|
|
28
|
+
return "DenseSet";
|
|
29
|
+
}
|
|
30
|
+
/** Insert `value` if not already present. */
|
|
31
|
+
add(value) {
|
|
32
|
+
if (!this._slot.has(value)) {
|
|
33
|
+
this._slot.set(value, this._items.length);
|
|
34
|
+
this._items.push(value);
|
|
35
|
+
}
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
/** Return `true` when `value` is a member. */
|
|
39
|
+
has(value) {
|
|
40
|
+
return this._slot.has(value);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Remove `value`. Returns `true` if it was present. The last element is
|
|
44
|
+
* swapped into the vacated slot, so surviving order may change.
|
|
45
|
+
*/
|
|
46
|
+
delete(value) {
|
|
47
|
+
const i = this._slot.get(value);
|
|
48
|
+
if (i === undefined) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const last = this._items.pop();
|
|
52
|
+
if (last !== value) {
|
|
53
|
+
this._items[i] = last;
|
|
54
|
+
this._slot.set(last, i);
|
|
55
|
+
}
|
|
56
|
+
this._slot.delete(value);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/** Remove every element. */
|
|
60
|
+
clear() {
|
|
61
|
+
this._items.length = 0;
|
|
62
|
+
this._slot.clear();
|
|
63
|
+
}
|
|
64
|
+
/** Visit each element (current order) without allocating an iterator. */
|
|
65
|
+
forEach(callbackfn, thisArg) {
|
|
66
|
+
const items = this._items;
|
|
67
|
+
for (let i = 0; i < items.length; i++) {
|
|
68
|
+
callbackfn.call(thisArg, items[i], items[i], this);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Iterator over elements in current order. */
|
|
72
|
+
[Symbol.iterator]() {
|
|
73
|
+
return this._items[Symbol.iterator]();
|
|
74
|
+
}
|
|
75
|
+
/** Iterator yielding `[value, value]` pairs. */
|
|
76
|
+
*entries() {
|
|
77
|
+
for (const item of this._items) {
|
|
78
|
+
yield [item, item];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Iterator over elements in current order. */
|
|
82
|
+
keys() {
|
|
83
|
+
return this._items[Symbol.iterator]();
|
|
84
|
+
}
|
|
85
|
+
/** Iterator over elements in current order. */
|
|
86
|
+
values() {
|
|
87
|
+
return this._items[Symbol.iterator]();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=dense_set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dense_set.js","sourceRoot":"","sources":["../../src/util/dense_set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,QAAQ;IAArB;QACmB,WAAM,GAAQ,EAAE,CAAC;QACjB,UAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IA+EhD,CAAC;IA7EC,2CAA2C;IAC3C,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,mEAAmE;IACnE,IAAW,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,6CAA6C;IACtC,GAAG,CAAC,KAAQ;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8CAA8C;IACvC,GAAG,CAAC,KAAQ;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAQ;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAG,CAAC;QAChC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4BAA4B;IACrB,KAAK;QACV,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,yEAAyE;IAClE,OAAO,CAAC,UAAsD,EAAE,OAAiB;QACtF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,+CAA+C;IACxC,CAAC,MAAM,CAAC,QAAQ,CAAC;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,gDAAgD;IACzC,CAAC,OAAO;QACb,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,+CAA+C;IACxC,IAAI;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,+CAA+C;IACxC,MAAM;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface IdPoolConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
min: number;
|
|
4
|
+
max?: number;
|
|
5
|
+
reuseWaitFrames?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const DEFAULT_ID_REUSE_WAIT_FRAMES = 16;
|
|
8
|
+
export declare class IdPool {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly min: number;
|
|
11
|
+
readonly max: number | undefined;
|
|
12
|
+
readonly reuseWaitFrames: number;
|
|
13
|
+
private _bits;
|
|
14
|
+
private _freeBelowNext;
|
|
15
|
+
private _lowest;
|
|
16
|
+
private _minFreeWord;
|
|
17
|
+
private _next;
|
|
18
|
+
private readonly _waitBuckets;
|
|
19
|
+
private _waitCursor;
|
|
20
|
+
constructor(name: string, min: number, max: number | undefined, reuseWaitFrames?: number);
|
|
21
|
+
advanceFrame(): void;
|
|
22
|
+
alloc(): number;
|
|
23
|
+
free(id: number): void;
|
|
24
|
+
owns(id: number): boolean;
|
|
25
|
+
peek(): number;
|
|
26
|
+
reserve(id: number): void;
|
|
27
|
+
private _growBits;
|
|
28
|
+
private _free;
|
|
29
|
+
}
|
|
30
|
+
export declare function validateIdPoolConfigs(configs: readonly IdPoolConfig[]): void;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
export const DEFAULT_ID_REUSE_WAIT_FRAMES = 16;
|
|
2
|
+
export class IdPool {
|
|
3
|
+
constructor(name, min, max, reuseWaitFrames = DEFAULT_ID_REUSE_WAIT_FRAMES) {
|
|
4
|
+
this.name = name;
|
|
5
|
+
this.min = min;
|
|
6
|
+
this.max = max;
|
|
7
|
+
this.reuseWaitFrames = reuseWaitFrames;
|
|
8
|
+
// Occupancy bitmap: bit `(id - min)` is 1 iff `id` is currently reserved.
|
|
9
|
+
// Stored as a growable plain-number array (V8 keeps these as SMIs / packed
|
|
10
|
+
// double-tagged words, which gives the fastest random-access read/write).
|
|
11
|
+
this._bits = [];
|
|
12
|
+
// Number of reusable ids strictly below `_next`. When zero, alloc can skip
|
|
13
|
+
// the bitmap scan entirely and just hand out the next never-used id.
|
|
14
|
+
this._freeBelowNext = 0;
|
|
15
|
+
// Cached "lowest free id below `_next`", or -1 when not known. The
|
|
16
|
+
// free/alloc/free/alloc churn pattern hits this on every call and lets
|
|
17
|
+
// alloc skip the bitmap word walk.
|
|
18
|
+
this._lowest = -1;
|
|
19
|
+
// Word cursor: the lowest word index in `_bits` that *might* contain a 0
|
|
20
|
+
// bit below `_next`. Pure hint - alloc walks forward from here. Bumped
|
|
21
|
+
// up when alloc fills a word to all-ones and pulled back down by free.
|
|
22
|
+
this._minFreeWord = 0;
|
|
23
|
+
this._waitCursor = 0;
|
|
24
|
+
if (!Number.isSafeInteger(reuseWaitFrames) || reuseWaitFrames < 0) {
|
|
25
|
+
throw new Error(`Id pool '${name}' reuseWaitFrames must be a non-negative integer`);
|
|
26
|
+
}
|
|
27
|
+
this._next = min;
|
|
28
|
+
this._waitBuckets = Array.from({ length: reuseWaitFrames }, () => []);
|
|
29
|
+
}
|
|
30
|
+
advanceFrame() {
|
|
31
|
+
if (this.reuseWaitFrames === 0) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this._waitCursor = (this._waitCursor + 1) % this.reuseWaitFrames;
|
|
35
|
+
const bucket = this._waitBuckets[this._waitCursor];
|
|
36
|
+
for (let i = 0; i < bucket.length; i++) {
|
|
37
|
+
this._free(bucket[i]);
|
|
38
|
+
}
|
|
39
|
+
bucket.length = 0;
|
|
40
|
+
}
|
|
41
|
+
alloc() {
|
|
42
|
+
const cached = this._lowest;
|
|
43
|
+
if (cached !== -1) {
|
|
44
|
+
this._lowest = -1;
|
|
45
|
+
const offset = cached - this.min;
|
|
46
|
+
const word = offset >>> 5;
|
|
47
|
+
this._bits[word] = this._bits[word] | (1 << offset);
|
|
48
|
+
this._freeBelowNext--;
|
|
49
|
+
return cached;
|
|
50
|
+
}
|
|
51
|
+
if (this._freeBelowNext > 0) {
|
|
52
|
+
const bits = this._bits;
|
|
53
|
+
let word = this._minFreeWord;
|
|
54
|
+
while (bits[word] === -1) {
|
|
55
|
+
word++;
|
|
56
|
+
}
|
|
57
|
+
const w = bits[word];
|
|
58
|
+
const bit = ctz32(~w);
|
|
59
|
+
const nw = w | (1 << bit);
|
|
60
|
+
bits[word] = nw;
|
|
61
|
+
this._minFreeWord = nw === -1 ? word + 1 : word;
|
|
62
|
+
this._freeBelowNext--;
|
|
63
|
+
return this.min + word * 32 + bit;
|
|
64
|
+
}
|
|
65
|
+
const max = this.max;
|
|
66
|
+
let id = this._next;
|
|
67
|
+
while (max === undefined || id <= max) {
|
|
68
|
+
const offset = id - this.min;
|
|
69
|
+
const word = offset >>> 5;
|
|
70
|
+
const mask = 1 << offset;
|
|
71
|
+
this._growBits(word + 1);
|
|
72
|
+
const cur = this._bits[word];
|
|
73
|
+
if ((cur & mask) === 0) {
|
|
74
|
+
this._bits[word] = cur | mask;
|
|
75
|
+
this._next = id + 1;
|
|
76
|
+
return id;
|
|
77
|
+
}
|
|
78
|
+
id++;
|
|
79
|
+
}
|
|
80
|
+
throw new Error(`Id pool '${this.name}' is exhausted`);
|
|
81
|
+
}
|
|
82
|
+
free(id) {
|
|
83
|
+
if (!this.owns(id)) {
|
|
84
|
+
throw new Error(`Id ${id} does not belong to pool '${this.name}'`);
|
|
85
|
+
}
|
|
86
|
+
if (this.reuseWaitFrames === 0) {
|
|
87
|
+
this._free(id);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
this._waitBuckets[this._waitCursor].push(id);
|
|
91
|
+
}
|
|
92
|
+
owns(id) {
|
|
93
|
+
return id >= this.min && (this.max === undefined || id <= this.max);
|
|
94
|
+
}
|
|
95
|
+
peek() {
|
|
96
|
+
if (this._lowest !== -1) {
|
|
97
|
+
return this._lowest;
|
|
98
|
+
}
|
|
99
|
+
if (this._freeBelowNext > 0) {
|
|
100
|
+
const bits = this._bits;
|
|
101
|
+
let word = this._minFreeWord;
|
|
102
|
+
while (bits[word] === -1) {
|
|
103
|
+
word++;
|
|
104
|
+
}
|
|
105
|
+
return this.min + word * 32 + ctz32(~bits[word]);
|
|
106
|
+
}
|
|
107
|
+
const max = this.max;
|
|
108
|
+
let id = this._next;
|
|
109
|
+
while (max === undefined || id <= max) {
|
|
110
|
+
const offset = id - this.min;
|
|
111
|
+
const word = offset >>> 5;
|
|
112
|
+
const mask = 1 << offset;
|
|
113
|
+
if (word >= this._bits.length || (this._bits[word] & mask) === 0) {
|
|
114
|
+
return id;
|
|
115
|
+
}
|
|
116
|
+
id++;
|
|
117
|
+
}
|
|
118
|
+
throw new Error(`Id pool '${this.name}' is exhausted`);
|
|
119
|
+
}
|
|
120
|
+
reserve(id) {
|
|
121
|
+
if (!this.owns(id)) {
|
|
122
|
+
throw new Error(`Id ${id} does not belong to pool '${this.name}'`);
|
|
123
|
+
}
|
|
124
|
+
const offset = id - this.min;
|
|
125
|
+
const word = offset >>> 5;
|
|
126
|
+
this._growBits(word + 1);
|
|
127
|
+
const mask = 1 << offset;
|
|
128
|
+
const cur = this._bits[word];
|
|
129
|
+
if ((cur & mask) !== 0) {
|
|
130
|
+
throw new Error(`Id ${id} is already reserved`);
|
|
131
|
+
}
|
|
132
|
+
this._bits[word] = cur | mask;
|
|
133
|
+
if (id < this._next) {
|
|
134
|
+
this._freeBelowNext--;
|
|
135
|
+
}
|
|
136
|
+
if (this._lowest === id) {
|
|
137
|
+
this._lowest = -1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
_growBits(length) {
|
|
141
|
+
const bits = this._bits;
|
|
142
|
+
while (bits.length < length) {
|
|
143
|
+
bits.push(0);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
_free(id) {
|
|
147
|
+
const offset = id - this.min;
|
|
148
|
+
const word = offset >>> 5;
|
|
149
|
+
if (word >= this._bits.length) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const mask = 1 << offset;
|
|
153
|
+
const cur = this._bits[word];
|
|
154
|
+
if ((cur & mask) === 0) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
this._bits[word] = cur & ~mask;
|
|
158
|
+
if (id < this._next) {
|
|
159
|
+
this._freeBelowNext++;
|
|
160
|
+
if (word < this._minFreeWord) {
|
|
161
|
+
this._minFreeWord = word;
|
|
162
|
+
}
|
|
163
|
+
// Cache slot: track the lowest free id we've seen. If a lower id was
|
|
164
|
+
// already cached, it stays visible in the bitmap pool and will be found
|
|
165
|
+
// by the normal free-id scan after the cached id is allocated.
|
|
166
|
+
const lowest = this._lowest;
|
|
167
|
+
if (lowest === -1 || id < lowest) {
|
|
168
|
+
this._lowest = id;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function ctz32(x) {
|
|
174
|
+
// For x with at least one set bit, returns the index of the lowest set bit.
|
|
175
|
+
// The IdPool callers guarantee the input has at least one set bit.
|
|
176
|
+
return 31 - Math.clz32(x & -x);
|
|
177
|
+
}
|
|
178
|
+
export function validateIdPoolConfigs(configs) {
|
|
179
|
+
if (configs.length === 0) {
|
|
180
|
+
throw new Error("At least one id pool is required");
|
|
181
|
+
}
|
|
182
|
+
const names = new Set();
|
|
183
|
+
let openEndedCount = 0;
|
|
184
|
+
let expectedMin = 1;
|
|
185
|
+
configs.forEach((config, index) => {
|
|
186
|
+
if (names.has(config.name)) {
|
|
187
|
+
throw new Error(`Duplicate id pool name '${config.name}'`);
|
|
188
|
+
}
|
|
189
|
+
names.add(config.name);
|
|
190
|
+
if (!Number.isSafeInteger(config.min) || config.min <= 0) {
|
|
191
|
+
throw new Error(`Id pool '${config.name}' must start at a positive integer`);
|
|
192
|
+
}
|
|
193
|
+
if (config.min !== expectedMin) {
|
|
194
|
+
throw new Error(`Id pools must cover 1..Infinity without holes`);
|
|
195
|
+
}
|
|
196
|
+
if (config.reuseWaitFrames !== undefined &&
|
|
197
|
+
(!Number.isSafeInteger(config.reuseWaitFrames) || config.reuseWaitFrames < 0)) {
|
|
198
|
+
throw new Error(`Id pool '${config.name}' reuseWaitFrames must be a non-negative integer`);
|
|
199
|
+
}
|
|
200
|
+
if (config.max === undefined) {
|
|
201
|
+
openEndedCount++;
|
|
202
|
+
if (index !== configs.length - 1) {
|
|
203
|
+
throw new Error("Only the final id pool may be open-ended");
|
|
204
|
+
}
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (!Number.isSafeInteger(config.max) || config.max <= 0) {
|
|
208
|
+
throw new Error(`Id pool '${config.name}' max must be a positive integer`);
|
|
209
|
+
}
|
|
210
|
+
if (config.max < config.min) {
|
|
211
|
+
throw new Error(`Id pool '${config.name}' max must be >= min`);
|
|
212
|
+
}
|
|
213
|
+
expectedMin = config.max + 1;
|
|
214
|
+
});
|
|
215
|
+
if (openEndedCount !== 1) {
|
|
216
|
+
throw new Error("Exactly one id pool must be open-ended");
|
|
217
|
+
}
|
|
218
|
+
if (!names.has("component") || !names.has("module") || !names.has("entity")) {
|
|
219
|
+
throw new Error("Id pools must include 'component', 'module', and 'entity'");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=id_pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id_pool.js","sourceRoot":"","sources":["../../src/util/id_pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/world/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class Base {
|
|
2
|
+
constructor() {
|
|
3
|
+
/**
|
|
4
|
+
* @internal Per-world registry mapping a component class to its
|
|
5
|
+
* component-entity. The registry is per-world so the lookup stays off the
|
|
6
|
+
* global component class objects while keeping repeated class lookups fast.
|
|
7
|
+
*/
|
|
8
|
+
this._classRegistry = new Map();
|
|
9
|
+
/**
|
|
10
|
+
* @internal Name -> entity index populated by {@link IdentityModule} hooks.
|
|
11
|
+
* Duplicate names are last-writer-wins.
|
|
12
|
+
*/
|
|
13
|
+
this._identityNameIndex = new Map();
|
|
14
|
+
/**
|
|
15
|
+
* @internal Tracks the last indexed name per entity so that renames,
|
|
16
|
+
* removals, and destroy cleanup can delete stale entries safely.
|
|
17
|
+
*/
|
|
18
|
+
this._identityIndexedNames = new WeakMap();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=world.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world.base.js","sourceRoot":"","sources":["../../src/world/world.base.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,IAAI;IAAjB;QACE;;;;WAIG;QACa,mBAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE3D;;;WAGG;QACa,uBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE/D;;;WAGG;QACa,0BAAqB,GAAG,IAAI,OAAO,EAAkB,CAAC;IAexE,CAAC;CAAA"}
|