@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/dist/system.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Component } from "./component.js";
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 (typeof Component)[] = []> extends Query<R> implements ITickSource {
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 `component.modified()` is
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 (typeof Component)[]>(components: readonly [...J], callback: (e: Entity, resolved: {
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 (typeof Component)[] = []>(q: QueryDSL, _guaranteed?: readonly [...T]): System<T>;
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 (typeof Component)[]>(...components: [...T]): System<T>;
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
- if (this._watchlistBitmask.hasBit(c.bitPtr)) {
68
- this._notifyModified(c);
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(c.bitPtr)) {
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.component.type);
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 `component.modified()` is
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.
@@ -1 +1 @@
1
- {"version":3,"file":"system.js","sourceRoot":"","sources":["../src/system.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../src/system.ts"],"names":[],"mappings":"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"}
@@ -29,10 +29,11 @@ export class ArrayMap {
29
29
  * @param value - Value to store.
30
30
  */
31
31
  set(key, value) {
32
- if (this._backend[key] === undefined) {
32
+ const backend = this._backend;
33
+ if (backend[key] === undefined) {
33
34
  this._size++;
34
35
  }
35
- this._backend[key] = value;
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
- if (this._backend[key] !== undefined) {
60
- this._backend[key] = undefined;
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.forEach((value, index) => {
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, index, this);
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;IAoE5B,CAAC;IAlEC,kDAAkD;IAClD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACI,GAAG,CAAC,GAAW,EAAE,KAAQ;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC7B,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,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,QAA2D;QACxE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;aAC9B;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yDAAyD;IAClD,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,CAAC;CACF"}
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"}
@@ -10,7 +10,7 @@
10
10
  * compact bit-flag fields:
11
11
  *
12
12
  * ```ts
13
- * class Tags extends Component {
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 `n`. Trailing zero words are trimmed so the internal storage
37
- * stays compact.
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
  *
@@ -10,7 +10,7 @@
10
10
  * compact bit-flag fields:
11
11
  *
12
12
  * ```ts
13
- * class Tags extends Component {
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
- const arrayIndex = Math.floor(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._addIndexBitmask(bptr.arrayIndex, bptr.bitmask);
41
+ this._bits[bptr.arrayIndex] |= bptr.bitmask;
44
42
  }
45
43
  /**
46
- * Clear bit `n`. Trailing zero words are trimmed so the internal storage
47
- * stays compact.
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 = Math.floor(n / 32);
63
+ const arrayIndex = n >>> 5;
53
64
  const current = this._bits[arrayIndex];
54
- if (current === undefined) {
55
- return;
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
- const arrayIndex = Math.floor(n / 32);
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._hasIndexBitmask(bptr.arrayIndex, bptr.bitmask);
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
- return (this._bits.length === other._bits.length && this._bits.every((v, i) => other._bits[i] === v));
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
- if (this._bits.length < other._bits.length) {
105
- return false;
106
- }
107
- for (let i = 0; i < other._bits.length; i++) {
108
- if ((this._bits[i] & other._bits[i]) !== (other._bits[i] || 0)) {
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 = Math.floor(value / 32);
181
- this.bitmask = 1 << (value % 32);
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 == other.arrayIndex && this.bitmask == other.bitmask;
206
+ return this.arrayIndex === other.arrayIndex && this.bitmask === other.bitmask;
190
207
  }
191
208
  }
192
209
  //# sourceMappingURL=bitset.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bitset.js","sourceRoot":"","sources":["../../src/util/bitset.ts"],"names":[],"mappings":"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"}
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 { Component, ComponentClassOrType, ComponentMeta, Hook } from "./component.js";
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. Registration is
106
- * disabled once {@link start} (or {@link disableComponentRegistration}) is
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
- * @throws When the class has already been registered or registration is
120
- * disabled.
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: typeof Component): void;
123
- registerComponent(ComponentClass: typeof Component, type: number): void;
124
- registerComponent(ComponentClass: typeof Component, componentName?: string): void;
125
- registerComponent(ComponentClass: typeof Component, type: number, componentName: string): void;
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 typeof Component>(C: T): Hook<InstanceType<T>>;
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: (typeof Component)[]): void;
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 (typeof Component)[]>(q: QueryDSL, _guaranteed: readonly [...T]): Filter<T>;
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.type, cmd.props);
128
+ cmd.entity._set(cmd.meta, cmd.props);
125
129
  return;
126
130
  case 2 /* CommandKind.Modified */:
127
- cmd.entity._modified(cmd.type);
131
+ cmd.entity._modified(cmd.meta);
128
132
  return;
129
133
  case 3 /* CommandKind.Remove */:
130
- cmd.entity._remove(cmd.type);
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._Class2Meta.get(ComponentClass);
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
- this._Class2Meta.set(ComponentClass, meta);
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
- let meta;
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 types = components.map((C) => this.getComponentType(C));
376
- for (let i = 0; i < components.length; i++) {
377
- this.getComponentMeta(components[i]).exclusive = types.filter((_, j) => j !== i);
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
  /**