@vworlds/vecs 1.0.24 → 1.0.26
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 +29 -778
- package/dist/component.d.ts +1 -1
- package/dist/component.js +1 -1
- package/dist/component.js.map +1 -1
- package/dist/component_meta.d.ts +5 -1
- package/dist/component_meta.js +10 -0
- package/dist/component_meta.js.map +1 -1
- package/dist/dsl.d.ts +2 -2
- package/dist/entity/entity.base.d.ts +2 -18
- package/dist/entity/entity.base.js +2 -20
- package/dist/entity/entity.base.js.map +1 -1
- package/dist/entity/entity.components.d.ts +1 -0
- package/dist/entity/entity.components.js +50 -0
- package/dist/entity/entity.components.js.map +1 -1
- package/dist/entity/entity.lifecycle.d.ts +3 -3
- package/dist/entity/entity.lifecycle.js +6 -9
- package/dist/entity/entity.lifecycle.js.map +1 -1
- package/dist/entity/entity.relationships.js +2 -2
- package/dist/entity/entity.relationships.js.map +1 -1
- package/dist/filter.d.ts +1 -0
- package/dist/filter.js +3 -2
- package/dist/filter.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/inject.d.ts +3 -2
- package/dist/inject.js.map +1 -1
- package/dist/modules/implements.d.ts +14 -0
- package/dist/modules/implements.js +98 -0
- package/dist/modules/implements.js.map +1 -0
- package/dist/package.json +1 -8
- package/dist/query/callbacks.d.ts +6 -2
- package/dist/query/callbacks.js +5 -2
- package/dist/query/callbacks.js.map +1 -1
- package/dist/query/query.d.ts +14 -1
- package/dist/query/query.js +26 -15
- package/dist/query/query.js.map +1 -1
- package/dist/system.d.ts +5 -4
- package/dist/system.js +17 -6
- package/dist/system.js.map +1 -1
- package/dist/util/array_map.d.ts +70 -12
- package/dist/util/array_map.js +113 -26
- package/dist/util/array_map.js.map +1 -1
- package/dist/util/bitset.js +0 -17
- package/dist/util/bitset.js.map +1 -1
- package/dist/util/events.d.ts +42 -12
- package/dist/util/events.js +94 -43
- package/dist/util/events.js.map +1 -1
- package/dist/util/ordered_set.js +43 -19
- package/dist/util/ordered_set.js.map +1 -1
- package/dist/world/world.deferred.js +2 -0
- package/dist/world/world.deferred.js.map +1 -1
- package/dist/world/world.entities.d.ts +8 -1
- package/dist/world/world.entities.js +25 -6
- package/dist/world/world.entities.js.map +1 -1
- package/dist/world/world.js +8 -1
- package/dist/world/world.js.map +1 -1
- package/dist/world/world.queries.js +6 -1
- package/dist/world/world.queries.js.map +1 -1
- package/dist/world/world.storage.d.ts +2 -2
- package/dist/world/world.storage.js +6 -3
- package/dist/world/world.storage.js.map +1 -1
- package/docs/README.md +50 -0
- package/docs/components.md +267 -0
- package/docs/concepts.md +86 -0
- package/docs/design-guide.md +506 -0
- package/docs/entities.md +175 -0
- package/docs/execution-model.md +173 -0
- package/docs/getting-started.md +215 -0
- package/docs/glossary.md +113 -0
- package/docs/modules.md +108 -0
- package/docs/queries-and-filters.md +187 -0
- package/docs/relationships.md +148 -0
- package/docs/systems.md +311 -0
- package/docs/utilities.md +139 -0
- package/package.json +1 -8
package/dist/util/ordered_set.js
CHANGED
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
* A `Set<T>` whose iteration order is determined by a comparator instead of
|
|
3
3
|
* insertion order.
|
|
4
4
|
*
|
|
5
|
-
* Backed by a sorted array
|
|
6
|
-
* search) plus the cost of an array splice
|
|
7
|
-
* lookup because sorted values may be mutable.
|
|
5
|
+
* Backed by a sorted array plus a side `Set<T>` for O(1) membership checks.
|
|
6
|
+
* Insertions are `O(log n)` (binary search) plus the cost of an array splice.
|
|
7
|
+
* Removal uses identity lookup because sorted values may be mutable.
|
|
8
|
+
*
|
|
9
|
+
* The backing array can go stale relative to the comparator: callers mark it
|
|
10
|
+
* dirty with {@link markDirty} when data the comparator reads has changed.
|
|
11
|
+
* The next order-dependent read re-sorts the whole array in place before
|
|
12
|
+
* returning. `has` is unaffected by dirtiness — it always checks the side set.
|
|
8
13
|
*
|
|
9
14
|
* Used by `Query.orderBy` to keep matched entities in a user-defined order so
|
|
10
15
|
* iteration in `forEach` and `each` walks them sorted.
|
|
@@ -16,6 +21,8 @@
|
|
|
16
21
|
export class OrderedSet {
|
|
17
22
|
constructor(compare) {
|
|
18
23
|
this._items = [];
|
|
24
|
+
this._members = new Set();
|
|
25
|
+
this._dirty = false;
|
|
19
26
|
this._compare = compare;
|
|
20
27
|
}
|
|
21
28
|
/**
|
|
@@ -36,6 +43,14 @@ export class OrderedSet {
|
|
|
36
43
|
}
|
|
37
44
|
return lo;
|
|
38
45
|
}
|
|
46
|
+
/** Re-sort the backing array in place when {@link markDirty} was called. */
|
|
47
|
+
_ensureSorted() {
|
|
48
|
+
if (!this._dirty) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this._items.sort(this._compare);
|
|
52
|
+
this._dirty = false;
|
|
53
|
+
}
|
|
39
54
|
/** Number of elements currently stored. */
|
|
40
55
|
get size() {
|
|
41
56
|
return this._items.length;
|
|
@@ -46,48 +61,52 @@ export class OrderedSet {
|
|
|
46
61
|
}
|
|
47
62
|
/**
|
|
48
63
|
* Insert `value` at the position determined by the comparator. No-op when
|
|
49
|
-
*
|
|
64
|
+
* `value` is already a member.
|
|
50
65
|
*
|
|
51
66
|
* @param value - Element to insert.
|
|
52
67
|
*/
|
|
53
68
|
add(value) {
|
|
54
|
-
|
|
55
|
-
if (i < this._items.length && this._compare(this._items[i], value) === 0) {
|
|
69
|
+
if (this._members.has(value)) {
|
|
56
70
|
return this;
|
|
57
71
|
}
|
|
72
|
+
this._ensureSorted();
|
|
73
|
+
const i = this._bisect(value);
|
|
58
74
|
this._items.splice(i, 0, value);
|
|
75
|
+
this._members.add(value);
|
|
59
76
|
return this;
|
|
60
77
|
}
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this._items.splice(i, 1);
|
|
68
|
-
return this.add(value);
|
|
78
|
+
/**
|
|
79
|
+
* Mark the backing array stale. The next order-dependent read re-sorts it
|
|
80
|
+
* with the comparator before returning.
|
|
81
|
+
*/
|
|
82
|
+
markDirty() {
|
|
83
|
+
this._dirty = true;
|
|
69
84
|
}
|
|
70
85
|
/**
|
|
71
|
-
* Return `true` when
|
|
86
|
+
* Return `true` when `value` is a member of the set, regardless of sort
|
|
87
|
+
* state. O(1) identity lookup against the side membership set.
|
|
72
88
|
*
|
|
73
89
|
* @param value - Element to look up.
|
|
74
90
|
*/
|
|
75
91
|
has(value) {
|
|
76
|
-
|
|
77
|
-
return i < this._items.length && this._compare(this._items[i], value) === 0;
|
|
92
|
+
return this._members.has(value);
|
|
78
93
|
}
|
|
79
94
|
/** Remove `value` by identity. Returns `true` if an element was removed. */
|
|
80
95
|
delete(value) {
|
|
96
|
+
if (!this._members.delete(value)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
81
99
|
const i = this._items.indexOf(value);
|
|
82
100
|
if (i !== -1) {
|
|
83
101
|
this._items.splice(i, 1);
|
|
84
|
-
return true;
|
|
85
102
|
}
|
|
86
|
-
return
|
|
103
|
+
return true;
|
|
87
104
|
}
|
|
88
105
|
/** Remove every element. */
|
|
89
106
|
clear() {
|
|
90
107
|
this._items.length = 0;
|
|
108
|
+
this._members.clear();
|
|
109
|
+
this._dirty = false;
|
|
91
110
|
}
|
|
92
111
|
/**
|
|
93
112
|
* Visit each element in sorted order.
|
|
@@ -97,26 +116,31 @@ export class OrderedSet {
|
|
|
97
116
|
* @param thisArg - Optional `this` binding for the callback.
|
|
98
117
|
*/
|
|
99
118
|
forEach(callbackfn, thisArg) {
|
|
119
|
+
this._ensureSorted();
|
|
100
120
|
for (const item of this._items) {
|
|
101
121
|
callbackfn.call(thisArg, item, item, this);
|
|
102
122
|
}
|
|
103
123
|
}
|
|
104
124
|
/** Iterator over elements in sorted order. */
|
|
105
125
|
[Symbol.iterator]() {
|
|
126
|
+
this._ensureSorted();
|
|
106
127
|
return this._items[Symbol.iterator]();
|
|
107
128
|
}
|
|
108
129
|
/** Iterator yielding `[value, value]` pairs in sorted order. */
|
|
109
130
|
*entries() {
|
|
131
|
+
this._ensureSorted();
|
|
110
132
|
for (const item of this._items) {
|
|
111
133
|
yield [item, item];
|
|
112
134
|
}
|
|
113
135
|
}
|
|
114
136
|
/** Iterator over elements in sorted order. */
|
|
115
137
|
keys() {
|
|
138
|
+
this._ensureSorted();
|
|
116
139
|
return this._items[Symbol.iterator]();
|
|
117
140
|
}
|
|
118
141
|
/** Iterator over elements in sorted order. */
|
|
119
142
|
values() {
|
|
143
|
+
this._ensureSorted();
|
|
120
144
|
return this._items[Symbol.iterator]();
|
|
121
145
|
}
|
|
122
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ordered_set.js","sourceRoot":"","sources":["../../src/util/ordered_set.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ordered_set.js","sourceRoot":"","sources":["../../src/util/ordered_set.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,7 +50,9 @@ export class Deferred extends Queries {
|
|
|
50
50
|
switch (cmd.kind) {
|
|
51
51
|
case 0 /* CommandKind.CreateEntity */:
|
|
52
52
|
this._entities.set(cmd.entity.eid, cmd.entity);
|
|
53
|
+
this._deferredEntities.delete(cmd.entity.eid);
|
|
53
54
|
this._notifyEntityCreated(cmd.entity);
|
|
55
|
+
cmd.onCreate?.(cmd.entity);
|
|
54
56
|
return;
|
|
55
57
|
case 1 /* CommandKind.Set */:
|
|
56
58
|
cmd.entity._set(cmd.meta, cmd.props);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.deferred.js","sourceRoot":"","sources":["../../src/world/world.deferred.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,OAAO,QAAS,SAAQ,OAAO;IAArC;;QACE,oEAAoE;QAC1D,kBAAa,GAAc,EAAE,CAAC;QACxC,oEAAoE;QAC1D,mBAAc,GAAG,CAAC,CAAC;QAC7B,oGAAoG;QAC1F,cAAS,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"world.deferred.js","sourceRoot":"","sources":["../../src/world/world.deferred.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,OAAO,QAAS,SAAQ,OAAO;IAArC;;QACE,oEAAoE;QAC1D,kBAAa,GAAc,EAAE,CAAC;QACxC,oEAAoE;QAC1D,mBAAc,GAAG,CAAC,CAAC;QAC7B,oGAAoG;QAC1F,cAAS,GAAG,KAAK,CAAC;IAyF9B,CAAC;IAvFC,kDAAkD;IAClD,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC;IACnD,CAAC;IAED,6DAA6D;IACtD,QAAQ,CAAC,GAAY;QAC1B,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;QACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,2BAA2B;IACpB,UAAU;QACf,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,wCAAwC;IACjC,KAAK,CAAC,EAAc;QACzB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,EAAE,EAAE,CAAC;QACP,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,4DAA4D;IACrD,QAAQ;QACb,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,wEAAwE;IACjE,KAAK;QACV,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,gDAAgD;IACtC,eAAe,CAAC,GAAY;QACpC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC;QACjC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB;gBACE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACtC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3B,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBACrC,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO;YACT;gBACE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5C,OAAO;QACX,CAAC;IACH,CAAC;IAED,oEAAoE;IAC1D,oBAAoB;QAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -3,7 +3,14 @@ import { Entity, type EID } from "../entity/index.js";
|
|
|
3
3
|
import { Deferred } from "./world.deferred.js";
|
|
4
4
|
import type { World } from "./world.js";
|
|
5
5
|
export declare class Entities extends Deferred {
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* Return the entity with id `eid`, creating it if it does not yet exist.
|
|
8
|
+
*
|
|
9
|
+
* In deferred mode, a newly created entity remains hidden from collections
|
|
10
|
+
* and queries until flush, but numeric lookups (`getEntity(eid)`,
|
|
11
|
+
* `entity(eid)`) and repeated `getOrCreateEntity(eid)` calls in the same
|
|
12
|
+
* deferred scope return that same pending entity.
|
|
13
|
+
*/
|
|
7
14
|
getOrCreateEntity(this: World, eid: EID, onCreateCallback?: (e: Entity) => void): Entity;
|
|
8
15
|
/** Look up an entity by component ref or identity name. */
|
|
9
16
|
getEntity(this: World, ref: ComponentRef | string): Entity | undefined;
|
|
@@ -2,19 +2,36 @@ import { Entity, Identity } from "../entity/index.js";
|
|
|
2
2
|
import { Deferred } from "./world.deferred.js";
|
|
3
3
|
const RESERVED_EID = 0;
|
|
4
4
|
export class Entities extends Deferred {
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Return the entity with id `eid`, creating it if it does not yet exist.
|
|
7
|
+
*
|
|
8
|
+
* In deferred mode, a newly created entity remains hidden from collections
|
|
9
|
+
* and queries until flush, but numeric lookups (`getEntity(eid)`,
|
|
10
|
+
* `entity(eid)`) and repeated `getOrCreateEntity(eid)` calls in the same
|
|
11
|
+
* deferred scope return that same pending entity.
|
|
12
|
+
*/
|
|
6
13
|
getOrCreateEntity(eid, onCreateCallback) {
|
|
7
14
|
if (eid === RESERVED_EID) {
|
|
8
15
|
throw new Error(`Entity eid ${eid} is reserved`);
|
|
9
16
|
}
|
|
10
17
|
let e = this._entities.get(eid);
|
|
18
|
+
if (!e && this.deferred) {
|
|
19
|
+
e = this._deferredEntities.get(eid);
|
|
20
|
+
}
|
|
11
21
|
if (!e) {
|
|
12
22
|
this._reserveEid(eid);
|
|
13
23
|
e = new Entity(this, eid);
|
|
14
|
-
this.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
24
|
+
if (this.deferred) {
|
|
25
|
+
// Mirror `_entity`: in deferred mode the entity is not registered or
|
|
26
|
+
// made visible to queries until the queue drains. The reservation above
|
|
27
|
+
// still happens eagerly so the id cannot be handed out again meanwhile.
|
|
28
|
+
this._deferredEntities.set(eid, e);
|
|
29
|
+
this._enqueue({ kind: 0 /* CommandKind.CreateEntity */, entity: e, onCreate: onCreateCallback });
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this._entities.set(eid, e);
|
|
33
|
+
this._notifyEntityCreated(e);
|
|
34
|
+
onCreateCallback?.(e);
|
|
18
35
|
}
|
|
19
36
|
}
|
|
20
37
|
return e;
|
|
@@ -31,7 +48,8 @@ export class Entities extends Deferred {
|
|
|
31
48
|
if (ref === RESERVED_EID) {
|
|
32
49
|
throw new Error(`Entity eid ${ref} is reserved`);
|
|
33
50
|
}
|
|
34
|
-
|
|
51
|
+
const entity = this._entities.get(ref);
|
|
52
|
+
return entity ?? (this.deferred ? this._deferredEntities.get(ref) : undefined);
|
|
35
53
|
}
|
|
36
54
|
return ref.world === this && this._entities.get(ref.eid) === ref ? ref : undefined;
|
|
37
55
|
}
|
|
@@ -85,6 +103,7 @@ export class Entities extends Deferred {
|
|
|
85
103
|
const eid = this._entityPool.alloc();
|
|
86
104
|
const e = new Constructor(this, eid);
|
|
87
105
|
if (this.deferred) {
|
|
106
|
+
this._deferredEntities.set(eid, e);
|
|
88
107
|
this._enqueue({ kind: 0 /* CommandKind.CreateEntity */, entity: e });
|
|
89
108
|
}
|
|
90
109
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.entities.js","sourceRoot":"","sources":["../../src/world/world.entities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAA8B,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,MAAM,OAAO,QAAS,SAAQ,QAAQ;IACpC
|
|
1
|
+
{"version":3,"file":"world.entities.js","sourceRoot":"","sources":["../../src/world/world.entities.ts"],"names":[],"mappings":"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"}
|
package/dist/world/world.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SilenceSource } from "../modules/relationships.js";
|
|
2
2
|
import { IdentityModule } from "../modules/identity.js";
|
|
3
|
+
import { ImplementsModule } from "../modules/implements.js";
|
|
3
4
|
import { PipelineModule } from "../modules/pipeline.js";
|
|
4
5
|
import { RelationshipsModule } from "../modules/relationships.js";
|
|
5
6
|
import { SingletonModule } from "../modules/singleton.js";
|
|
@@ -33,7 +34,13 @@ export class World extends Pipeline {
|
|
|
33
34
|
this.component(SilenceSource).onRemove((entity) => entity.get(Query)?._clearSilence());
|
|
34
35
|
this.component(Query).onRemove((_entity, query) => query.destroy());
|
|
35
36
|
this.component(System).onRemove((_entity, system) => system.destroy());
|
|
36
|
-
[
|
|
37
|
+
[
|
|
38
|
+
IdentityModule,
|
|
39
|
+
ImplementsModule,
|
|
40
|
+
SingletonModule,
|
|
41
|
+
RelationshipsModule,
|
|
42
|
+
PipelineModule,
|
|
43
|
+
].forEach((mod) => this.module(mod));
|
|
37
44
|
}
|
|
38
45
|
}
|
|
39
46
|
//# sourceMappingURL=world.js.map
|
package/dist/world/world.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.js","sourceRoot":"","sources":["../../src/world/world.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,KAAM,SAAQ,QAAQ;IACjC,YAAmB,UAAwB,EAAE;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,
|
|
1
|
+
{"version":3,"file":"world.js","sourceRoot":"","sources":["../../src/world/world.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,KAAM,SAAQ,QAAQ;IACjC,YAAmB,UAAwB,EAAE;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE;YACE,cAAc;YACd,gBAAgB;YAChB,eAAe;YACf,mBAAmB;YACnB,cAAc;SACf,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -2,6 +2,7 @@ import { isQueryConfig } from "../dsl.js";
|
|
|
2
2
|
import { Filter } from "../filter.js";
|
|
3
3
|
import { Query } from "../query/index.js";
|
|
4
4
|
import { getCachedTerm, getTerm, notifyComponentAdded, notifyComponentChanged, notifyComponentRemoved, notifyEntityCreated, notifyEntityDestroyed, } from "../terms/build.js";
|
|
5
|
+
import { ArrayMap } from "../util/array_map.js";
|
|
5
6
|
import { Storage } from "./world.storage.js";
|
|
6
7
|
export class Queries extends Storage {
|
|
7
8
|
constructor() {
|
|
@@ -13,7 +14,7 @@ export class Queries extends Storage {
|
|
|
13
14
|
/** @internal Canonical DSL key -> live term. */
|
|
14
15
|
this._termCache = new Map();
|
|
15
16
|
/** @internal Component eid -> pinned component leaf term. */
|
|
16
|
-
this._componentTerms = new
|
|
17
|
+
this._componentTerms = new ArrayMap();
|
|
17
18
|
/** @internal True while the world is driving one logical frame. */
|
|
18
19
|
this._frameInProgress = false;
|
|
19
20
|
/** @internal True while the world is auto-building pending queries. */
|
|
@@ -66,6 +67,10 @@ export class Queries extends Storage {
|
|
|
66
67
|
_getCachedTerm(q) {
|
|
67
68
|
return getCachedTerm(this, q);
|
|
68
69
|
}
|
|
70
|
+
/** @internal Return a cached term for a precomputed canonical DSL key, without creating one. */
|
|
71
|
+
_getCachedTermByKey(key) {
|
|
72
|
+
return this._termCache.get(key);
|
|
73
|
+
}
|
|
69
74
|
/** @internal Drive the component leaf for a newly attached component. */
|
|
70
75
|
_notifyComponentAdded(ceid, entity) {
|
|
71
76
|
notifyComponentAdded(this, ceid, entity);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.queries.js","sourceRoot":"","sources":["../../src/world/world.queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA2D,MAAM,WAAW,CAAC;AAEnG,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACL,aAAa,EACb,OAAO,EACP,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,MAAM,OAAO,OAAQ,SAAQ,OAAO;IAApC;;QACE,kFAAkF;QACxE,aAAQ,GAAY,EAAE,CAAC;QACjC,kEAAkE;QACxD,oBAAe,GAAG,IAAI,GAAG,EAAS,CAAC;QAC7C,gDAAgD;QAChC,eAAU,GAAG,IAAI,GAAG,EAAgB,CAAC;QACrD,6DAA6D;QAC7C,oBAAe,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"world.queries.js","sourceRoot":"","sources":["../../src/world/world.queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Entity } from "../entity/index.js";
|
|
2
|
-
import { type
|
|
2
|
+
import { type ReadonlyIterableArrayMap } from "../util/array_map.js";
|
|
3
3
|
import { Pools } from "./world.pools.js";
|
|
4
4
|
export declare class Storage extends Pools {
|
|
5
5
|
/** Read-only view of the live entities, keyed by entity id. */
|
|
6
|
-
get entities():
|
|
6
|
+
get entities(): ReadonlyIterableArrayMap<Entity>;
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ArrayMap } from "../util/array_map.js";
|
|
1
|
+
import { ArrayMap, IterableArrayMap } from "../util/array_map.js";
|
|
2
2
|
import { Pools } from "./world.pools.js";
|
|
3
3
|
export class Storage extends Pools {
|
|
4
4
|
constructor() {
|
|
@@ -6,12 +6,14 @@ export class Storage extends Pools {
|
|
|
6
6
|
/**
|
|
7
7
|
* @internal Entity id -> entity. Owns every live entity.
|
|
8
8
|
*
|
|
9
|
-
* Backed by an {@link
|
|
9
|
+
* Backed by an {@link IterableArrayMap} rather than a `Map`: entity ids are dense
|
|
10
10
|
* pooled integers, so array indexing beats hashing on the lookups that run
|
|
11
11
|
* per component during teardown (`world.entity(componentEid)` in
|
|
12
12
|
* `Entity._destroy`) and on every `world.entity(eid)` resolution.
|
|
13
13
|
*/
|
|
14
|
-
this._entities = new
|
|
14
|
+
this._entities = new IterableArrayMap();
|
|
15
|
+
/** @internal Entity id -> entity queued for deferred creation, not query-visible yet. */
|
|
16
|
+
this._deferredEntities = new ArrayMap();
|
|
15
17
|
}
|
|
16
18
|
/** Read-only view of the live entities, keyed by entity id. */
|
|
17
19
|
get entities() {
|
|
@@ -20,6 +22,7 @@ export class Storage extends Pools {
|
|
|
20
22
|
/** @internal Remove an entity from the world's entity map (called by `Entity._destroy`). */
|
|
21
23
|
_unregisterEntity(entity) {
|
|
22
24
|
this._entities.delete(entity.eid);
|
|
25
|
+
this._deferredEntities.delete(entity.eid);
|
|
23
26
|
this._poolFor(entity.eid).free(entity.eid);
|
|
24
27
|
}
|
|
25
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.storage.js","sourceRoot":"","sources":["../../src/world/world.storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"world.storage.js","sourceRoot":"","sources":["../../src/world/world.storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAiC,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAAlC;;QACE;;;;;;;WAOG;QACO,cAAS,GAAG,IAAI,gBAAgB,EAAU,CAAC;QAErD,yFAAyF;QAC/E,sBAAiB,GAAG,IAAI,QAAQ,EAAU,CAAC;IAavD,CAAC;IAXC,+DAA+D;IAC/D,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,4FAA4F;IACrF,iBAAiB,CAAC,MAAc;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF"}
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# vecs Documentation
|
|
2
|
+
|
|
3
|
+
Single-topic guides for `@vworlds/vecs`. Each guide moves from concept to how-to to a woven
|
|
4
|
+
reference, and every example uses the real public API. The exhaustive per-symbol reference is the
|
|
5
|
+
JSDoc on the source in `lib/vecs/src/` — read it in your IDE; these guides carry the concepts,
|
|
6
|
+
the idioms, and the reference tables you reach for while designing.
|
|
7
|
+
|
|
8
|
+
## Reading order
|
|
9
|
+
|
|
10
|
+
Read in this order the first time through:
|
|
11
|
+
|
|
12
|
+
1. [Getting started](./getting-started.md) — install, first world, first system, first tick.
|
|
13
|
+
2. [Concepts](./concepts.md) — the mental model: world, entity, component, system, query.
|
|
14
|
+
3. [Execution model](./execution-model.md) — phases, the pipeline, deferred mutation, reactive
|
|
15
|
+
routing. Read this before designing anything non-trivial.
|
|
16
|
+
4. Subsystem guides, in any order:
|
|
17
|
+
- [Components](./components.md) — registration, hooks, exclusivity, cleanup policies,
|
|
18
|
+
interfaces, singletons.
|
|
19
|
+
- [Entities](./entities.md) — creation, lookup, the component API, lifecycle.
|
|
20
|
+
- [Systems](./systems.md) — membership, reactive callbacks, `each`/`run`, cadence, injection.
|
|
21
|
+
- [Queries and filters](./queries-and-filters.md) — the query DSL, live queries, one-shot
|
|
22
|
+
filters, grouped queries, `Bitset`.
|
|
23
|
+
- [Relationships](./relationships.md) — entity-to-entity links, hierarchy, cleanup cascades.
|
|
24
|
+
- [Modules](./modules.md) — packaging features, composition, the built-in modules.
|
|
25
|
+
5. [Design guide](./design-guide.md) — opinionated patterns and anti-patterns distilled from real
|
|
26
|
+
designs. Read it once you know the machinery.
|
|
27
|
+
6. [Utilities](./utilities.md) — helper classes exported by `@vworlds/vecs` but not part of the ECS
|
|
28
|
+
lifecycle model.
|
|
29
|
+
|
|
30
|
+
Keep the [Glossary](./glossary.md) at hand for terminology.
|
|
31
|
+
|
|
32
|
+
## Map
|
|
33
|
+
|
|
34
|
+
| Guide | Covers |
|
|
35
|
+
| -------------------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
36
|
+
| [getting-started.md](./getting-started.md) | A runnable tutorial from `npm install` to a ticking world. |
|
|
37
|
+
| [concepts.md](./concepts.md) | The core vocabulary and how the pieces relate. |
|
|
38
|
+
| [execution-model.md](./execution-model.md) | `world.progress`, the 8 built-in phases, deferred commands, flush boundaries, event routing. |
|
|
39
|
+
| [components.md](./components.md) | `world.component`, hooks, exclusive groups, `CleanupPolicy`, `Implements`, `Singleton`. |
|
|
40
|
+
| [entities.md](./entities.md) | `world.entity`, `add`/`set`/`get`/`remove`/`destroy`, deferred read semantics. |
|
|
41
|
+
| [systems.md](./systems.md) | `world.system`, `with`/`without`, `enter`/`update`/`exit`, `each`/`run`, tick sources. |
|
|
42
|
+
| [queries-and-filters.md](./queries-and-filters.md) | `QueryDSL`, `Query`, `Filter`, `groupBy`, `ignoreSource`. |
|
|
43
|
+
| [relationships.md](./relationships.md) | `Relationship`, `ChildOf`/`DependsOn`, `parent`/`children`, `Traversable`, cascades. |
|
|
44
|
+
| [modules.md](./modules.md) | `Module<Config>`, `world.module`, composition, built-in modules. |
|
|
45
|
+
| [design-guide.md](./design-guide.md) | Patterns, anti-patterns, and a Phaser render-layer case study. |
|
|
46
|
+
| [utilities.md](./utilities.md) | Public helper classes: `Events`, `ArrayMap`, `IterableArrayMap`, plus `Bitset` cross-ref. |
|
|
47
|
+
| [glossary.md](./glossary.md) | ECS and vecs terminology. |
|
|
48
|
+
|
|
49
|
+
Networking (wire encoding with `@type`, protocol component ordering, replication) lives in the
|
|
50
|
+
`@vworlds/vecs-wire` and `@vworlds/vecs-protocol` packages and is only cross-referenced here.
|