@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
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,23 @@
|
|
|
1
|
+
export interface IdPoolConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
min: number;
|
|
4
|
+
max?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class IdPool {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly min: number;
|
|
9
|
+
readonly max: number | undefined;
|
|
10
|
+
private _bits;
|
|
11
|
+
private _freeBelowNext;
|
|
12
|
+
private _lowest;
|
|
13
|
+
private _minFreeWord;
|
|
14
|
+
private _next;
|
|
15
|
+
constructor(name: string, min: number, max: number | undefined);
|
|
16
|
+
alloc(): number;
|
|
17
|
+
free(id: number): void;
|
|
18
|
+
owns(id: number): boolean;
|
|
19
|
+
peek(): number;
|
|
20
|
+
reserve(id: number): void;
|
|
21
|
+
private _growBits;
|
|
22
|
+
}
|
|
23
|
+
export declare function validateIdPoolConfigs(configs: readonly IdPoolConfig[]): void;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
export class IdPool {
|
|
2
|
+
constructor(name, min, max) {
|
|
3
|
+
this.name = name;
|
|
4
|
+
this.min = min;
|
|
5
|
+
this.max = max;
|
|
6
|
+
// Occupancy bitmap: bit `(id - min)` is 1 iff `id` is currently reserved.
|
|
7
|
+
// Stored as a growable plain-number array (V8 keeps these as SMIs / packed
|
|
8
|
+
// double-tagged words, which gives the fastest random-access read/write).
|
|
9
|
+
this._bits = [];
|
|
10
|
+
// Number of reserved ids strictly below `_next`. When zero, alloc can skip
|
|
11
|
+
// the bitmap scan entirely and just hand out the next never-used id.
|
|
12
|
+
this._freeBelowNext = 0;
|
|
13
|
+
// Cached "lowest free id below `_next`", or -1 when not known. The
|
|
14
|
+
// free/alloc/free/alloc churn pattern hits this on every call and lets
|
|
15
|
+
// alloc skip the bitmap word walk.
|
|
16
|
+
this._lowest = -1;
|
|
17
|
+
// Word cursor: the lowest word index in `_bits` that *might* contain a 0
|
|
18
|
+
// bit below `_next`. Pure hint - alloc walks forward from here. Bumped
|
|
19
|
+
// up when alloc fills a word to all-ones and pulled back down by free.
|
|
20
|
+
this._minFreeWord = 0;
|
|
21
|
+
this._next = min;
|
|
22
|
+
}
|
|
23
|
+
alloc() {
|
|
24
|
+
const cached = this._lowest;
|
|
25
|
+
if (cached !== -1) {
|
|
26
|
+
this._lowest = -1;
|
|
27
|
+
const offset = cached - this.min;
|
|
28
|
+
const word = offset >>> 5;
|
|
29
|
+
this._bits[word] = this._bits[word] | (1 << offset);
|
|
30
|
+
this._freeBelowNext--;
|
|
31
|
+
return cached;
|
|
32
|
+
}
|
|
33
|
+
if (this._freeBelowNext > 0) {
|
|
34
|
+
const bits = this._bits;
|
|
35
|
+
let word = this._minFreeWord;
|
|
36
|
+
while (bits[word] === -1) {
|
|
37
|
+
word++;
|
|
38
|
+
}
|
|
39
|
+
const w = bits[word];
|
|
40
|
+
const bit = ctz32(~w);
|
|
41
|
+
const nw = w | (1 << bit);
|
|
42
|
+
bits[word] = nw;
|
|
43
|
+
this._minFreeWord = nw === -1 ? word + 1 : word;
|
|
44
|
+
this._freeBelowNext--;
|
|
45
|
+
return this.min + word * 32 + bit;
|
|
46
|
+
}
|
|
47
|
+
const max = this.max;
|
|
48
|
+
let id = this._next;
|
|
49
|
+
while (max === undefined || id <= max) {
|
|
50
|
+
const offset = id - this.min;
|
|
51
|
+
const word = offset >>> 5;
|
|
52
|
+
const mask = 1 << offset;
|
|
53
|
+
this._growBits(word + 1);
|
|
54
|
+
const cur = this._bits[word];
|
|
55
|
+
if ((cur & mask) === 0) {
|
|
56
|
+
this._bits[word] = cur | mask;
|
|
57
|
+
this._next = id + 1;
|
|
58
|
+
return id;
|
|
59
|
+
}
|
|
60
|
+
id++;
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`Id pool '${this.name}' is exhausted`);
|
|
63
|
+
}
|
|
64
|
+
free(id) {
|
|
65
|
+
if (!this.owns(id)) {
|
|
66
|
+
throw new Error(`Id ${id} does not belong to pool '${this.name}'`);
|
|
67
|
+
}
|
|
68
|
+
const offset = id - this.min;
|
|
69
|
+
const word = offset >>> 5;
|
|
70
|
+
if (word >= this._bits.length) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const mask = 1 << offset;
|
|
74
|
+
const cur = this._bits[word];
|
|
75
|
+
if ((cur & mask) === 0) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this._bits[word] = cur & ~mask;
|
|
79
|
+
if (id < this._next) {
|
|
80
|
+
this._freeBelowNext++;
|
|
81
|
+
if (word < this._minFreeWord) {
|
|
82
|
+
this._minFreeWord = word;
|
|
83
|
+
}
|
|
84
|
+
// Cache slot: track the lowest free id we've seen. If a lower id was
|
|
85
|
+
// already cached, push it back into the "anonymous" bitmap pool and
|
|
86
|
+
// promote `id`. Otherwise, if no lower-than-id is cached, take the
|
|
87
|
+
// slot.
|
|
88
|
+
const lowest = this._lowest;
|
|
89
|
+
if (lowest === -1 || id < lowest) {
|
|
90
|
+
this._lowest = id;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
owns(id) {
|
|
95
|
+
return id >= this.min && (this.max === undefined || id <= this.max);
|
|
96
|
+
}
|
|
97
|
+
peek() {
|
|
98
|
+
if (this._lowest !== -1) {
|
|
99
|
+
return this._lowest;
|
|
100
|
+
}
|
|
101
|
+
if (this._freeBelowNext > 0) {
|
|
102
|
+
const bits = this._bits;
|
|
103
|
+
let word = this._minFreeWord;
|
|
104
|
+
while (bits[word] === -1) {
|
|
105
|
+
word++;
|
|
106
|
+
}
|
|
107
|
+
return this.min + word * 32 + ctz32(~bits[word]);
|
|
108
|
+
}
|
|
109
|
+
const max = this.max;
|
|
110
|
+
let id = this._next;
|
|
111
|
+
while (max === undefined || id <= max) {
|
|
112
|
+
const offset = id - this.min;
|
|
113
|
+
const word = offset >>> 5;
|
|
114
|
+
const mask = 1 << offset;
|
|
115
|
+
if (word >= this._bits.length || (this._bits[word] & mask) === 0) {
|
|
116
|
+
return id;
|
|
117
|
+
}
|
|
118
|
+
id++;
|
|
119
|
+
}
|
|
120
|
+
throw new Error(`Id pool '${this.name}' is exhausted`);
|
|
121
|
+
}
|
|
122
|
+
reserve(id) {
|
|
123
|
+
if (!this.owns(id)) {
|
|
124
|
+
throw new Error(`Id ${id} does not belong to pool '${this.name}'`);
|
|
125
|
+
}
|
|
126
|
+
const offset = id - this.min;
|
|
127
|
+
const word = offset >>> 5;
|
|
128
|
+
this._growBits(word + 1);
|
|
129
|
+
const mask = 1 << offset;
|
|
130
|
+
const cur = this._bits[word];
|
|
131
|
+
if ((cur & mask) !== 0) {
|
|
132
|
+
throw new Error(`Id ${id} is already reserved`);
|
|
133
|
+
}
|
|
134
|
+
this._bits[word] = cur | mask;
|
|
135
|
+
if (id < this._next) {
|
|
136
|
+
this._freeBelowNext--;
|
|
137
|
+
}
|
|
138
|
+
if (this._lowest === id) {
|
|
139
|
+
this._lowest = -1;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
_growBits(length) {
|
|
143
|
+
const bits = this._bits;
|
|
144
|
+
while (bits.length < length) {
|
|
145
|
+
bits.push(0);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function ctz32(x) {
|
|
150
|
+
// For x with at least one set bit, returns the index of the lowest set bit.
|
|
151
|
+
// The IdPool callers guarantee the input has at least one set bit.
|
|
152
|
+
return 31 - Math.clz32(x & -x);
|
|
153
|
+
}
|
|
154
|
+
export function validateIdPoolConfigs(configs) {
|
|
155
|
+
if (configs.length === 0) {
|
|
156
|
+
throw new Error("At least one id pool is required");
|
|
157
|
+
}
|
|
158
|
+
const names = new Set();
|
|
159
|
+
let openEndedCount = 0;
|
|
160
|
+
let expectedMin = 1;
|
|
161
|
+
configs.forEach((config, index) => {
|
|
162
|
+
if (names.has(config.name)) {
|
|
163
|
+
throw new Error(`Duplicate id pool name '${config.name}'`);
|
|
164
|
+
}
|
|
165
|
+
names.add(config.name);
|
|
166
|
+
if (!Number.isSafeInteger(config.min) || config.min <= 0) {
|
|
167
|
+
throw new Error(`Id pool '${config.name}' must start at a positive integer`);
|
|
168
|
+
}
|
|
169
|
+
if (config.min !== expectedMin) {
|
|
170
|
+
throw new Error(`Id pools must cover 1..Infinity without holes`);
|
|
171
|
+
}
|
|
172
|
+
if (config.max === undefined) {
|
|
173
|
+
openEndedCount++;
|
|
174
|
+
if (index !== configs.length - 1) {
|
|
175
|
+
throw new Error("Only the final id pool may be open-ended");
|
|
176
|
+
}
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (!Number.isSafeInteger(config.max) || config.max <= 0) {
|
|
180
|
+
throw new Error(`Id pool '${config.name}' max must be a positive integer`);
|
|
181
|
+
}
|
|
182
|
+
if (config.max < config.min) {
|
|
183
|
+
throw new Error(`Id pool '${config.name}' max must be >= min`);
|
|
184
|
+
}
|
|
185
|
+
expectedMin = config.max + 1;
|
|
186
|
+
});
|
|
187
|
+
if (openEndedCount !== 1) {
|
|
188
|
+
throw new Error("Exactly one id pool must be open-ended");
|
|
189
|
+
}
|
|
190
|
+
if (!names.has("component") || !names.has("module") || !names.has("entity")) {
|
|
191
|
+
throw new Error("Id pools must include 'component', 'module', and 'entity'");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# 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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Component, type ComponentClass, type ComponentType } from "../component.js";
|
|
2
|
+
import { Entities } from "./world.entities.js";
|
|
3
|
+
import { type World } from "./world.js";
|
|
4
|
+
export declare class Components extends Entities {
|
|
5
|
+
/**
|
|
6
|
+
* Register a component class with this world, or look up a previously
|
|
7
|
+
* registered component entity.
|
|
8
|
+
*
|
|
9
|
+
* On the first call with a given class, a new `Component` entity is created
|
|
10
|
+
* and its id is drawn from the `"component"` id pool (1–899 by default).
|
|
11
|
+
* Subsequent calls with the same class return the same entity. The same class
|
|
12
|
+
* may be registered independently in multiple worlds.
|
|
13
|
+
*
|
|
14
|
+
* Pass an explicit numeric `eid` to pin the component to a server-assigned
|
|
15
|
+
* stable id instead of auto-allocating one.
|
|
16
|
+
*
|
|
17
|
+
* Passing a **string** resolves an already-registered component entity by
|
|
18
|
+
* name (set via `world.component(C).name = "..."`). Throws if no entity with
|
|
19
|
+
* that name exists or if the named entity is not a `Component` entity.
|
|
20
|
+
*
|
|
21
|
+
* After {@link start} (or {@link disableComponentRegistration}), registering a
|
|
22
|
+
* new class throws.
|
|
23
|
+
*
|
|
24
|
+
* @param ComponentClass - The component class to register or retrieve.
|
|
25
|
+
* @param eid - Optional explicit numeric entity id.
|
|
26
|
+
* @returns The `Component` entity for the given class.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* world.component(Position); // register and auto-assign id
|
|
31
|
+
* world.component(Position, 42); // register with explicit id 42
|
|
32
|
+
* const meta = world.component(Position).ownMeta; // access metadata
|
|
33
|
+
* world.component(Position).name = "Position";
|
|
34
|
+
* world.component("Position"); // look up by name
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
component<T extends ComponentType>(this: World, ComponentClass: T, eid?: number): Component<T>;
|
|
38
|
+
component(this: World, name: string): Component;
|
|
39
|
+
/** Prevent any further calls to {@link component}. */
|
|
40
|
+
disableComponentRegistration(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Read the singleton data stored on the component entity for `Class`.
|
|
43
|
+
*
|
|
44
|
+
* This is a convenience shorthand for `world.component(Class).get(Class)`.
|
|
45
|
+
* Use it when you store world-global state as a component on the component
|
|
46
|
+
* entity itself (the Singleton pattern).
|
|
47
|
+
*
|
|
48
|
+
* @param Class - Registered component class.
|
|
49
|
+
* @returns The component instance stored on the component entity, or
|
|
50
|
+
* `undefined` when none has been set.
|
|
51
|
+
*/
|
|
52
|
+
get<C extends ComponentClass>(this: World, Class: C): Readonly<InstanceType<C>> | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Attach or update the singleton data stored on the component entity for `Class`.
|
|
55
|
+
*
|
|
56
|
+
* Shorthand for `world.component(Class).set(Class, props)`. Stores `props`
|
|
57
|
+
* on the component entity itself so the data can be retrieved globally via
|
|
58
|
+
* {@link get}.
|
|
59
|
+
*
|
|
60
|
+
* @param Class - Registered component class.
|
|
61
|
+
* @param props - Properties to merge onto the component instance.
|
|
62
|
+
* @returns The `Component` entity, for chaining.
|
|
63
|
+
*/
|
|
64
|
+
set<C extends ComponentClass>(this: World, Class: C, props: Partial<InstanceType<C>>): Component<C>;
|
|
65
|
+
/** Declare a group of mutually exclusive components. */
|
|
66
|
+
setExclusiveComponents(this: World, ...components: ComponentClass[]): void;
|
|
67
|
+
}
|