@vworlds/vecs 1.0.12 → 1.0.13
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 +85 -70
- package/dist/component.d.ts +22 -70
- package/dist/component.js +4 -59
- package/dist/component.js.map +1 -1
- package/dist/dsl.d.ts +9 -5
- package/dist/dsl.js +6 -3
- package/dist/dsl.js.map +1 -1
- package/dist/entity.d.ts +10 -11
- package/dist/entity.js +55 -51
- package/dist/entity.js.map +1 -1
- package/dist/filter.d.ts +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/query.d.ts +21 -21
- package/dist/query.js +17 -16
- package/dist/query.js.map +1 -1
- package/dist/system.d.ts +7 -7
- package/dist/system.js +11 -10
- package/dist/system.js.map +1 -1
- package/dist/util/array_map.js +11 -7
- package/dist/util/array_map.js.map +1 -1
- package/dist/util/bitset.d.ts +17 -3
- package/dist/util/bitset.js +47 -30
- package/dist/util/bitset.js.map +1 -1
- package/dist/world.d.ts +22 -15
- package/dist/world.js +28 -19
- package/dist/world.js.map +1 -1
- package/package.json +1 -1
package/dist/system.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type ComponentClass } from "./component.js";
|
|
2
2
|
import { Query } from "./query.js";
|
|
3
3
|
import { type QueryDSL, type MaybeRequired } from "./dsl.js";
|
|
4
4
|
import type { Entity } from "./entity.js";
|
|
@@ -17,7 +17,7 @@ type RunCallback = (now: number, delta: number) => void;
|
|
|
17
17
|
* .requires(Position, Velocity) // track entities with both components
|
|
18
18
|
* .phase("update")
|
|
19
19
|
* .enter([Position], (e, [pos]) => { pos.x = 0; })
|
|
20
|
-
* .update(Position, (pos) => { pos.x += pos.vx; })
|
|
20
|
+
* .update(Position, (e, pos) => { pos.x += pos.vx; })
|
|
21
21
|
* .exit((e) => { console.log("entity left", e.eid); });
|
|
22
22
|
* ```
|
|
23
23
|
*
|
|
@@ -44,7 +44,7 @@ type RunCallback = (now: number, delta: number) => void;
|
|
|
44
44
|
*
|
|
45
45
|
* @typeParam R - Component classes guaranteed present on every matched entity.
|
|
46
46
|
*/
|
|
47
|
-
export declare class System<R extends
|
|
47
|
+
export declare class System<R extends ComponentClass[] = []> extends Query<R> implements ITickSource {
|
|
48
48
|
constructor(name: string, world: World);
|
|
49
49
|
/** True when this system's cadence source fired during the current frame. */
|
|
50
50
|
get didTick(): boolean;
|
|
@@ -144,7 +144,7 @@ export declare class System<R extends (typeof Component)[] = []> extends Query<R
|
|
|
144
144
|
* Register a callback fired **every tick** for **every tracked entity**,
|
|
145
145
|
* unconditionally, with the listed components resolved from each entity.
|
|
146
146
|
*
|
|
147
|
-
* Unlike {@link update} (which only fires when `
|
|
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
149
|
* Components declared via {@link requires} are non-nullable in the resolved
|
|
150
150
|
* tuple; any other component class may be `undefined` if the entity lacks it.
|
|
@@ -172,7 +172,7 @@ export declare class System<R extends (typeof Component)[] = []> extends Query<R
|
|
|
172
172
|
* });
|
|
173
173
|
* ```
|
|
174
174
|
*/
|
|
175
|
-
each<J extends
|
|
175
|
+
each<J extends ComponentClass[]>(components: readonly [...J], callback: (e: Entity, resolved: {
|
|
176
176
|
[K in keyof J]: MaybeRequired<J[K], R>;
|
|
177
177
|
}) => void): this;
|
|
178
178
|
/**
|
|
@@ -190,7 +190,7 @@ export declare class System<R extends (typeof Component)[] = []> extends Query<R
|
|
|
190
190
|
* entity (type hint only — not validated at runtime).
|
|
191
191
|
* @returns This system, retyped with the guaranteed tuple as its `R`.
|
|
192
192
|
*/
|
|
193
|
-
query<T extends
|
|
193
|
+
query<T extends ComponentClass[] = []>(q: QueryDSL, _guaranteed?: readonly [...T]): System<T>;
|
|
194
194
|
/**
|
|
195
195
|
* Shorthand for `query([...components])` — tracks entities that have **all**
|
|
196
196
|
* of the listed component types.
|
|
@@ -202,7 +202,7 @@ export declare class System<R extends (typeof Component)[] = []> extends Query<R
|
|
|
202
202
|
* @param components - Component classes to require.
|
|
203
203
|
* @returns This system, retyped with the required tuple as its `R`.
|
|
204
204
|
*/
|
|
205
|
-
requires<T extends
|
|
205
|
+
requires<T extends ComponentClass[]>(...components: [...T]): System<T>;
|
|
206
206
|
/**
|
|
207
207
|
* Disable this system.
|
|
208
208
|
*
|
package/dist/system.js
CHANGED
|
@@ -11,7 +11,7 @@ import { ALWAYS_TICK_SOURCE, IntervalTickSource, RateTickSource, } from "./timer
|
|
|
11
11
|
* .requires(Position, Velocity) // track entities with both components
|
|
12
12
|
* .phase("update")
|
|
13
13
|
* .enter([Position], (e, [pos]) => { pos.x = 0; })
|
|
14
|
-
* .update(Position, (pos) => { pos.x += pos.vx; })
|
|
14
|
+
* .update(Position, (e, pos) => { pos.x += pos.vx; })
|
|
15
15
|
* .exit((e) => { console.log("entity left", e.eid); });
|
|
16
16
|
* ```
|
|
17
17
|
*
|
|
@@ -63,9 +63,10 @@ export class System extends Query {
|
|
|
63
63
|
if (this._enterCallback !== undefined) {
|
|
64
64
|
this._inbox.push({ kind: 0 /* InboxCommand.Enter */, entity: e });
|
|
65
65
|
}
|
|
66
|
-
e.components.forEach((c) => {
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
e.components.forEach((c, type) => {
|
|
67
|
+
const meta = this.world.getComponentMeta(type);
|
|
68
|
+
if (this._watchlistBitmask.hasBit(meta.bitPtr)) {
|
|
69
|
+
this._notifyModified(e, meta, c);
|
|
69
70
|
}
|
|
70
71
|
});
|
|
71
72
|
}
|
|
@@ -99,11 +100,11 @@ export class System extends Query {
|
|
|
99
100
|
* @internal Routing entry: push an inbox `update` event when the modified
|
|
100
101
|
* component matches the watchlist.
|
|
101
102
|
*/
|
|
102
|
-
_notifyModified(c) {
|
|
103
|
-
if (!this._enabled || !this._watchlistBitmask.hasBit(
|
|
103
|
+
_notifyModified(e, meta, c) {
|
|
104
|
+
if (!this._enabled || !this._watchlistBitmask.hasBit(meta.bitPtr)) {
|
|
104
105
|
return;
|
|
105
106
|
}
|
|
106
|
-
this._inbox.push({ kind: 2 /* InboxCommand.Update */, component: c });
|
|
107
|
+
this._inbox.push({ kind: 2 /* InboxCommand.Update */, entity: e, meta, component: c });
|
|
107
108
|
}
|
|
108
109
|
/**
|
|
109
110
|
* @internal Execute one tick: drain the inbox in arrival order, then run
|
|
@@ -131,9 +132,9 @@ export class System extends Query {
|
|
|
131
132
|
this._exitCallback(event.entity, event.snapshot);
|
|
132
133
|
break;
|
|
133
134
|
case 2 /* InboxCommand.Update */:
|
|
134
|
-
const callback = this._componentUpdateCallbacks.get(event.
|
|
135
|
+
const callback = this._componentUpdateCallbacks.get(event.meta.type);
|
|
135
136
|
if (callback) {
|
|
136
|
-
callback(event.component);
|
|
137
|
+
callback(event.entity, event.component);
|
|
137
138
|
}
|
|
138
139
|
break;
|
|
139
140
|
}
|
|
@@ -263,7 +264,7 @@ export class System extends Query {
|
|
|
263
264
|
* Register a callback fired **every tick** for **every tracked entity**,
|
|
264
265
|
* unconditionally, with the listed components resolved from each entity.
|
|
265
266
|
*
|
|
266
|
-
* Unlike {@link update} (which only fires when `
|
|
267
|
+
* Unlike {@link update} (which only fires when `entity.modified(C)` is
|
|
267
268
|
* called), `each` fires every tick the system runs, once per tracked entity.
|
|
268
269
|
* Components declared via {@link requires} are non-nullable in the resolved
|
|
269
270
|
* tuple; any other component class may be `undefined` if the entity lacks it.
|
package/dist/system.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.js","sourceRoot":"","sources":["../src/system.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,KAAK,EAAe,MAAM,YAAY,CAAC;AAEhD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,cAAc,GACf,MAAM,YAAY,CAAC;AAwBpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../src/system.ts"],"names":[],"mappings":"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"}
|
package/dist/util/array_map.js
CHANGED
|
@@ -29,10 +29,11 @@ export class ArrayMap {
|
|
|
29
29
|
* @param value - Value to store.
|
|
30
30
|
*/
|
|
31
31
|
set(key, value) {
|
|
32
|
-
|
|
32
|
+
const backend = this._backend;
|
|
33
|
+
if (backend[key] === undefined) {
|
|
33
34
|
this._size++;
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
+
backend[key] = value;
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
39
|
* Retrieve the value stored at `key`, or `undefined` if no entry exists.
|
|
@@ -56,8 +57,9 @@ export class ArrayMap {
|
|
|
56
57
|
* @param key - Non-negative integer key.
|
|
57
58
|
*/
|
|
58
59
|
delete(key) {
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
const backend = this._backend;
|
|
61
|
+
if (backend[key] !== undefined) {
|
|
62
|
+
backend[key] = undefined;
|
|
61
63
|
this._size--;
|
|
62
64
|
}
|
|
63
65
|
}
|
|
@@ -67,11 +69,13 @@ export class ArrayMap {
|
|
|
67
69
|
* @param callback - Invoked with `(value, key, map)` for each entry.
|
|
68
70
|
*/
|
|
69
71
|
forEach(callback) {
|
|
70
|
-
this._backend
|
|
72
|
+
const backend = this._backend;
|
|
73
|
+
for (let i = 0; i < backend.length; i++) {
|
|
74
|
+
const value = backend[i];
|
|
71
75
|
if (value !== undefined) {
|
|
72
|
-
callback(value,
|
|
76
|
+
callback(value, i, this);
|
|
73
77
|
}
|
|
74
|
-
}
|
|
78
|
+
}
|
|
75
79
|
}
|
|
76
80
|
/** Remove all entries and reset {@link size} to zero. */
|
|
77
81
|
clear() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array_map.js","sourceRoot":"","sources":["../../src/util/array_map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,QAAQ;IAArB;QACU,aAAQ,GAAsB,EAAE,CAAC;QACjC,UAAK,GAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"array_map.js","sourceRoot":"","sources":["../../src/util/array_map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,QAAQ;IAArB;QACU,aAAQ,GAAsB,EAAE,CAAC;QACjC,UAAK,GAAW,CAAC,CAAC;IAwE5B,CAAC;IAtEC,kDAAkD;IAClD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACI,GAAG,CAAC,GAAW,EAAE,KAAQ;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,GAAW;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,QAA2D;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;aAC1B;SACF;IACH,CAAC;IAED,yDAAyD;IAClD,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,CAAC;CACF"}
|
package/dist/util/bitset.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* compact bit-flag fields:
|
|
11
11
|
*
|
|
12
12
|
* ```ts
|
|
13
|
-
* class Tags
|
|
13
|
+
* class Tags {
|
|
14
14
|
* tags = new Bitset();
|
|
15
15
|
* }
|
|
16
16
|
*
|
|
@@ -33,12 +33,26 @@ export declare class Bitset {
|
|
|
33
33
|
*/
|
|
34
34
|
addBit(bptr: BitPtr): void;
|
|
35
35
|
/**
|
|
36
|
-
* Clear bit
|
|
37
|
-
*
|
|
36
|
+
* Clear the bit described by `bptr` (fast path using a pre-computed
|
|
37
|
+
* {@link BitPtr}). Storage is not compacted automatically; call
|
|
38
|
+
* {@link compact} to trim trailing zero words when needed.
|
|
39
|
+
*
|
|
40
|
+
* @param bptr - Pre-computed pointer to a bit position.
|
|
41
|
+
*/
|
|
42
|
+
deleteBit(bptr: BitPtr): void;
|
|
43
|
+
/**
|
|
44
|
+
* Clear bit `n`. Storage is not compacted automatically; call
|
|
45
|
+
* {@link compact} to trim trailing zero words when needed.
|
|
38
46
|
*
|
|
39
47
|
* @param n - Non-negative integer bit index.
|
|
40
48
|
*/
|
|
41
49
|
delete(n: number): void;
|
|
50
|
+
/**
|
|
51
|
+
* Trim trailing zero words from the backing storage.
|
|
52
|
+
*/
|
|
53
|
+
compact(): void;
|
|
54
|
+
/** Remove every set bit. */
|
|
55
|
+
clear(): void;
|
|
42
56
|
/**
|
|
43
57
|
* Return `true` when bit `n` is set.
|
|
44
58
|
*
|
package/dist/util/bitset.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* compact bit-flag fields:
|
|
11
11
|
*
|
|
12
12
|
* ```ts
|
|
13
|
-
* class Tags
|
|
13
|
+
* class Tags {
|
|
14
14
|
* tags = new Bitset();
|
|
15
15
|
* }
|
|
16
16
|
*
|
|
@@ -29,9 +29,7 @@ export class Bitset {
|
|
|
29
29
|
* @param n - Non-negative integer bit index.
|
|
30
30
|
*/
|
|
31
31
|
add(n) {
|
|
32
|
-
|
|
33
|
-
const bitmask = 1 << (n % 32);
|
|
34
|
-
this._addIndexBitmask(arrayIndex, bitmask);
|
|
32
|
+
this._bits[n >>> 5] |= 1 << n;
|
|
35
33
|
}
|
|
36
34
|
/**
|
|
37
35
|
* Set the bit described by `bptr` (fast path using a pre-computed
|
|
@@ -40,40 +38,53 @@ export class Bitset {
|
|
|
40
38
|
* @param bptr - Pre-computed pointer to a bit position.
|
|
41
39
|
*/
|
|
42
40
|
addBit(bptr) {
|
|
43
|
-
this.
|
|
41
|
+
this._bits[bptr.arrayIndex] |= bptr.bitmask;
|
|
44
42
|
}
|
|
45
43
|
/**
|
|
46
|
-
* Clear bit
|
|
47
|
-
*
|
|
44
|
+
* Clear the bit described by `bptr` (fast path using a pre-computed
|
|
45
|
+
* {@link BitPtr}). Storage is not compacted automatically; call
|
|
46
|
+
* {@link compact} to trim trailing zero words when needed.
|
|
47
|
+
*
|
|
48
|
+
* @param bptr - Pre-computed pointer to a bit position.
|
|
49
|
+
*/
|
|
50
|
+
deleteBit(bptr) {
|
|
51
|
+
const current = this._bits[bptr.arrayIndex];
|
|
52
|
+
if (current) {
|
|
53
|
+
this._bits[bptr.arrayIndex] = current & ~bptr.bitmask;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Clear bit `n`. Storage is not compacted automatically; call
|
|
58
|
+
* {@link compact} to trim trailing zero words when needed.
|
|
48
59
|
*
|
|
49
60
|
* @param n - Non-negative integer bit index.
|
|
50
61
|
*/
|
|
51
62
|
delete(n) {
|
|
52
|
-
const arrayIndex =
|
|
63
|
+
const arrayIndex = n >>> 5;
|
|
53
64
|
const current = this._bits[arrayIndex];
|
|
54
|
-
if (current
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
this._bits[arrayIndex] = current & ~(1 << (n % 32));
|
|
65
|
+
if (current) {
|
|
66
|
+
this._bits[arrayIndex] = current & ~(1 << n);
|
|
59
67
|
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Trim trailing zero words from the backing storage.
|
|
71
|
+
*/
|
|
72
|
+
compact() {
|
|
60
73
|
while (this._bits.length && this._bits[this._bits.length - 1] === 0) {
|
|
61
74
|
this._bits.pop();
|
|
62
75
|
}
|
|
63
76
|
}
|
|
77
|
+
/** Remove every set bit. */
|
|
78
|
+
clear() {
|
|
79
|
+
this._bits.length = 0;
|
|
80
|
+
}
|
|
64
81
|
/**
|
|
65
82
|
* Return `true` when bit `n` is set.
|
|
66
83
|
*
|
|
67
84
|
* @param n - Non-negative integer bit index.
|
|
68
85
|
*/
|
|
69
86
|
has(n) {
|
|
70
|
-
|
|
71
|
-
if (arrayIndex >= this._bits.length) {
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
const bitIndex = n % 32;
|
|
75
|
-
const bitmask = 1 << bitIndex;
|
|
76
|
-
return this._hasIndexBitmask(arrayIndex, bitmask);
|
|
87
|
+
return (this._bits[n >>> 5] & (1 << n)) !== 0;
|
|
77
88
|
}
|
|
78
89
|
/**
|
|
79
90
|
* Return `true` when the bit described by `bptr` is set (fast path).
|
|
@@ -81,7 +92,7 @@ export class Bitset {
|
|
|
81
92
|
* @param bptr - Pre-computed pointer to a bit position.
|
|
82
93
|
*/
|
|
83
94
|
hasBit(bptr) {
|
|
84
|
-
return this.
|
|
95
|
+
return (this._bits[bptr.arrayIndex] & bptr.bitmask) !== 0;
|
|
85
96
|
}
|
|
86
97
|
/**
|
|
87
98
|
* Return `true` when this bitset and `other` have exactly the same bits set.
|
|
@@ -89,7 +100,13 @@ export class Bitset {
|
|
|
89
100
|
* @param other - Bitset to compare against.
|
|
90
101
|
*/
|
|
91
102
|
equal(other) {
|
|
92
|
-
|
|
103
|
+
const maxLength = Math.max(this._bits.length, other._bits.length);
|
|
104
|
+
for (let i = 0; i < maxLength; i++) {
|
|
105
|
+
if ((this._bits[i] || 0) !== (other._bits[i] || 0)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
93
110
|
}
|
|
94
111
|
/**
|
|
95
112
|
* Return `true` when every bit set in `other` is also set in this bitset
|
|
@@ -101,11 +118,11 @@ export class Bitset {
|
|
|
101
118
|
* @param other - Bitset whose set bits must all appear in this bitset.
|
|
102
119
|
*/
|
|
103
120
|
hasBitset(other) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if ((
|
|
121
|
+
const bits = this._bits;
|
|
122
|
+
const otherBits = other._bits;
|
|
123
|
+
for (let i = 0; i < otherBits.length; i++) {
|
|
124
|
+
const otherWord = otherBits[i] | 0;
|
|
125
|
+
if ((bits[i] & otherWord) !== otherWord) {
|
|
109
126
|
return false;
|
|
110
127
|
}
|
|
111
128
|
}
|
|
@@ -177,8 +194,8 @@ export class BitPtr {
|
|
|
177
194
|
/** The raw bit index this pointer refers to. */
|
|
178
195
|
value) {
|
|
179
196
|
this.value = value;
|
|
180
|
-
this.arrayIndex =
|
|
181
|
-
this.bitmask = 1 <<
|
|
197
|
+
this.arrayIndex = value >>> 5;
|
|
198
|
+
this.bitmask = 1 << value;
|
|
182
199
|
}
|
|
183
200
|
/**
|
|
184
201
|
* Return `true` when both pointers refer to the same bit position.
|
|
@@ -186,7 +203,7 @@ export class BitPtr {
|
|
|
186
203
|
* @param other - Pointer to compare against.
|
|
187
204
|
*/
|
|
188
205
|
equals(other) {
|
|
189
|
-
return this.arrayIndex
|
|
206
|
+
return this.arrayIndex === other.arrayIndex && this.bitmask === other.bitmask;
|
|
190
207
|
}
|
|
191
208
|
}
|
|
192
209
|
//# sourceMappingURL=bitset.js.map
|
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,4DAA4D;QACrD,UAAK,GAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"bitset.js","sourceRoot":"","sources":["../../src/util/bitset.ts"],"names":[],"mappings":"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"}
|
package/dist/world.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type ComponentClass, ComponentClassOrType, ComponentMeta, Hook } from "./component.js";
|
|
2
2
|
import { Entity } from "./entity.js";
|
|
3
3
|
import { Query } from "./query.js";
|
|
4
4
|
import { System } from "./system.js";
|
|
@@ -23,6 +23,9 @@ import { IPhase } from "./phase.js";
|
|
|
23
23
|
* ```ts
|
|
24
24
|
* const world = new World();
|
|
25
25
|
*
|
|
26
|
+
* class Position { x = 0; y = 0; }
|
|
27
|
+
* class Velocity { vx = 0; vy = 0; }
|
|
28
|
+
*
|
|
26
29
|
* world.registerComponent(Position);
|
|
27
30
|
* world.registerComponent(Velocity);
|
|
28
31
|
*
|
|
@@ -30,6 +33,7 @@ import { IPhase } from "./phase.js";
|
|
|
30
33
|
* .requires(Position, Velocity)
|
|
31
34
|
* .each([Position, Velocity], (e, [pos, vel]) => {
|
|
32
35
|
* pos.x += vel.vx;
|
|
36
|
+
* e.modified(Position);
|
|
33
37
|
* });
|
|
34
38
|
*
|
|
35
39
|
* world.start();
|
|
@@ -48,6 +52,8 @@ import { IPhase } from "./phase.js";
|
|
|
48
52
|
* drains the queue at top level.
|
|
49
53
|
*/
|
|
50
54
|
export declare class World {
|
|
55
|
+
/** Hidden property key used to store this world's meta on component classes. */
|
|
56
|
+
readonly worldKey: string;
|
|
51
57
|
constructor();
|
|
52
58
|
/** Read-only view of the live entities, keyed by entity id. */
|
|
53
59
|
get entities(): Omit<Map<number, Entity>, "set" | "delete" | "clear">;
|
|
@@ -102,9 +108,9 @@ export declare class World {
|
|
|
102
108
|
/**
|
|
103
109
|
* Register a component class with the world.
|
|
104
110
|
*
|
|
105
|
-
* Must be called before any entity uses the component.
|
|
106
|
-
*
|
|
107
|
-
* called.
|
|
111
|
+
* Must be called before any entity uses the component. Components are plain
|
|
112
|
+
* classes constructed with no arguments. Registration is disabled once
|
|
113
|
+
* {@link start} (or {@link disableComponentRegistration}) is called.
|
|
108
114
|
*
|
|
109
115
|
* **Overloads:**
|
|
110
116
|
* - `registerComponent(Class)` — type id auto-assigned from the
|
|
@@ -116,13 +122,14 @@ export declare class World {
|
|
|
116
122
|
* - `registerComponent(Class, type, componentName)` — explicit id + name.
|
|
117
123
|
*
|
|
118
124
|
* @param ComponentClass - Component class to register.
|
|
119
|
-
* @
|
|
120
|
-
*
|
|
125
|
+
* @returns The world-specific metadata record for the component class.
|
|
126
|
+
* @throws When the class has already been registered in this world or
|
|
127
|
+
* registration is disabled.
|
|
121
128
|
*/
|
|
122
|
-
registerComponent(ComponentClass:
|
|
123
|
-
registerComponent(ComponentClass:
|
|
124
|
-
registerComponent(ComponentClass:
|
|
125
|
-
registerComponent(ComponentClass:
|
|
129
|
+
registerComponent(ComponentClass: ComponentClass): ComponentMeta;
|
|
130
|
+
registerComponent(ComponentClass: ComponentClass, type: number): ComponentMeta;
|
|
131
|
+
registerComponent(ComponentClass: ComponentClass, componentName?: string): ComponentMeta;
|
|
132
|
+
registerComponent(ComponentClass: ComponentClass, type: number, componentName: string): ComponentMeta;
|
|
126
133
|
/**
|
|
127
134
|
* Look up the {@link ComponentMeta} for a registered component.
|
|
128
135
|
*
|
|
@@ -147,14 +154,14 @@ export declare class World {
|
|
|
147
154
|
*
|
|
148
155
|
* ```ts
|
|
149
156
|
* world.hook(Sprite)
|
|
150
|
-
* .onAdd(c => c.initialize(scene))
|
|
151
|
-
* .onRemove(c => c.destroy());
|
|
157
|
+
* .onAdd((entity, c) => c.initialize(scene, entity))
|
|
158
|
+
* .onRemove((entity, c) => c.destroy(scene, entity));
|
|
152
159
|
* ```
|
|
153
160
|
*
|
|
154
161
|
* @param C - Component class.
|
|
155
162
|
* @returns The hook bound to that component type.
|
|
156
163
|
*/
|
|
157
|
-
hook<T extends
|
|
164
|
+
hook<T extends ComponentClass>(C: T): Hook<InstanceType<T>>;
|
|
158
165
|
/**
|
|
159
166
|
* Declare a group of mutually exclusive components.
|
|
160
167
|
*
|
|
@@ -176,7 +183,7 @@ export declare class World {
|
|
|
176
183
|
* @param components - Two or more component classes that cannot coexist.
|
|
177
184
|
* @throws When any class has not been registered.
|
|
178
185
|
*/
|
|
179
|
-
setExclusiveComponents(...components:
|
|
186
|
+
setExclusiveComponents(...components: ComponentClass[]): void;
|
|
180
187
|
/**
|
|
181
188
|
* Set the starting value of the auto-incrementing entity id counter.
|
|
182
189
|
*
|
|
@@ -298,7 +305,7 @@ export declare class World {
|
|
|
298
305
|
* guaranteed present (not validated at runtime).
|
|
299
306
|
*/
|
|
300
307
|
filter<Q extends QueryDSL>(q: Q): Filter<ExtractRequired<Q>>;
|
|
301
|
-
filter<T extends
|
|
308
|
+
filter<T extends ComponentClass[]>(q: QueryDSL, _guaranteed: readonly [...T]): Filter<T>;
|
|
302
309
|
/**
|
|
303
310
|
* Add a named phase to the update pipeline.
|
|
304
311
|
*
|
package/dist/world.js
CHANGED
|
@@ -30,6 +30,9 @@ const LOCAL_COMPONENT_MIN = 256;
|
|
|
30
30
|
* ```ts
|
|
31
31
|
* const world = new World();
|
|
32
32
|
*
|
|
33
|
+
* class Position { x = 0; y = 0; }
|
|
34
|
+
* class Velocity { vx = 0; vy = 0; }
|
|
35
|
+
*
|
|
33
36
|
* world.registerComponent(Position);
|
|
34
37
|
* world.registerComponent(Velocity);
|
|
35
38
|
*
|
|
@@ -37,6 +40,7 @@ const LOCAL_COMPONENT_MIN = 256;
|
|
|
37
40
|
* .requires(Position, Velocity)
|
|
38
41
|
* .each([Position, Velocity], (e, [pos, vel]) => {
|
|
39
42
|
* pos.x += vel.vx;
|
|
43
|
+
* e.modified(Position);
|
|
40
44
|
* });
|
|
41
45
|
*
|
|
42
46
|
* world.start();
|
|
@@ -60,8 +64,6 @@ export class World {
|
|
|
60
64
|
this._entities = new Map();
|
|
61
65
|
/** @internal All registered queries, including systems (which extend `Query`). */
|
|
62
66
|
this._queries = [];
|
|
63
|
-
/** @internal Component class → meta record. */
|
|
64
|
-
this._Class2Meta = new Map();
|
|
65
67
|
/** @internal Component type id → meta record. */
|
|
66
68
|
this._Type2Meta = new ArrayMap();
|
|
67
69
|
/** @internal Pre-registered name → type id mappings (server-assigned ids). */
|
|
@@ -86,6 +88,8 @@ export class World {
|
|
|
86
88
|
this._frameCounter = 0;
|
|
87
89
|
/** @internal True while the world is driving one logical frame. */
|
|
88
90
|
this._frameInProgress = false;
|
|
91
|
+
/** Hidden property key used to store this world's meta on component classes. */
|
|
92
|
+
this.worldKey = `__vecs_world_${Math.random().toString(36).slice(2)}`;
|
|
89
93
|
this._tickSources.add(ALWAYS_TICK_SOURCE);
|
|
90
94
|
}
|
|
91
95
|
/**
|
|
@@ -121,13 +125,13 @@ export class World {
|
|
|
121
125
|
this._entities.set(cmd.entity.eid, cmd.entity);
|
|
122
126
|
return;
|
|
123
127
|
case 1 /* CommandKind.Set */:
|
|
124
|
-
cmd.entity._set(cmd.
|
|
128
|
+
cmd.entity._set(cmd.meta, cmd.props);
|
|
125
129
|
return;
|
|
126
130
|
case 2 /* CommandKind.Modified */:
|
|
127
|
-
cmd.entity._modified(cmd.
|
|
131
|
+
cmd.entity._modified(cmd.meta);
|
|
128
132
|
return;
|
|
129
133
|
case 3 /* CommandKind.Remove */:
|
|
130
|
-
cmd.entity._remove(cmd.
|
|
134
|
+
cmd.entity._remove(cmd.meta);
|
|
131
135
|
return;
|
|
132
136
|
case 4 /* CommandKind.Destroy */:
|
|
133
137
|
cmd.entity._destroy();
|
|
@@ -286,7 +290,7 @@ export class World {
|
|
|
286
290
|
local = true;
|
|
287
291
|
}
|
|
288
292
|
}
|
|
289
|
-
let meta = this.
|
|
293
|
+
let meta = this._tryGetComponentMeta(ComponentClass);
|
|
290
294
|
if (meta) {
|
|
291
295
|
if (local) {
|
|
292
296
|
this._localComponentCounter--;
|
|
@@ -295,9 +299,20 @@ export class World {
|
|
|
295
299
|
}
|
|
296
300
|
this.registerComponentType(componentName, type);
|
|
297
301
|
meta = new ComponentMeta(ComponentClass, type, componentName);
|
|
298
|
-
|
|
302
|
+
Object.defineProperty(ComponentClass, this.worldKey, {
|
|
303
|
+
value: meta,
|
|
304
|
+
enumerable: false,
|
|
305
|
+
});
|
|
299
306
|
this._Type2Meta.set(type, meta);
|
|
300
307
|
console.log("Registered component %s with type=%d as %s component", componentName, type, local ? "local" : "networked");
|
|
308
|
+
return meta;
|
|
309
|
+
}
|
|
310
|
+
/** @internal Return registered metadata for this world without throwing. */
|
|
311
|
+
_tryGetComponentMeta(typeOrClass) {
|
|
312
|
+
if (typeof typeOrClass === "function") {
|
|
313
|
+
return typeOrClass[this.worldKey];
|
|
314
|
+
}
|
|
315
|
+
return this._Type2Meta.get(typeOrClass);
|
|
301
316
|
}
|
|
302
317
|
/**
|
|
303
318
|
* Look up the {@link ComponentMeta} for a registered component.
|
|
@@ -307,13 +322,7 @@ export class World {
|
|
|
307
322
|
* @throws When no component with that class or type id has been registered.
|
|
308
323
|
*/
|
|
309
324
|
getComponentMeta(typeOrClass) {
|
|
310
|
-
|
|
311
|
-
if (typeof typeOrClass === "function") {
|
|
312
|
-
meta = this._Class2Meta.get(typeOrClass);
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
meta = this._Type2Meta.get(typeOrClass);
|
|
316
|
-
}
|
|
325
|
+
const meta = this._tryGetComponentMeta(typeOrClass);
|
|
317
326
|
if (!meta) {
|
|
318
327
|
throw `unregistered component meta for component type or class '${typeOrClass}'`;
|
|
319
328
|
}
|
|
@@ -340,8 +349,8 @@ export class World {
|
|
|
340
349
|
*
|
|
341
350
|
* ```ts
|
|
342
351
|
* world.hook(Sprite)
|
|
343
|
-
* .onAdd(c => c.initialize(scene))
|
|
344
|
-
* .onRemove(c => c.destroy());
|
|
352
|
+
* .onAdd((entity, c) => c.initialize(scene, entity))
|
|
353
|
+
* .onRemove((entity, c) => c.destroy(scene, entity));
|
|
345
354
|
* ```
|
|
346
355
|
*
|
|
347
356
|
* @param C - Component class.
|
|
@@ -372,9 +381,9 @@ export class World {
|
|
|
372
381
|
* @throws When any class has not been registered.
|
|
373
382
|
*/
|
|
374
383
|
setExclusiveComponents(...components) {
|
|
375
|
-
const
|
|
376
|
-
for (let i = 0; i <
|
|
377
|
-
|
|
384
|
+
const metas = components.map((C) => this.getComponentMeta(C));
|
|
385
|
+
for (let i = 0; i < metas.length; i++) {
|
|
386
|
+
metas[i]._exclusive = metas.filter((_, j) => j !== i);
|
|
378
387
|
}
|
|
379
388
|
}
|
|
380
389
|
/**
|