@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/dsl.js
CHANGED
|
@@ -1,86 +1,484 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* @internal Factory used by {@link _buildEntityTest} and by `Query.update`'s
|
|
7
|
-
* watchlist auto-expansion.
|
|
8
|
-
*
|
|
9
|
-
* @param world - World used to resolve component classes to type ids.
|
|
10
|
-
* @param components - Component classes or numeric type ids to require.
|
|
11
|
-
*/
|
|
12
|
-
export function _HAS(world, ...components) {
|
|
13
|
-
const testBitmask = _calculateComponentBitmask(components, world);
|
|
14
|
-
return (e) => e.componentBitmask.hasBitset(testBitmask);
|
|
1
|
+
import { Entity } from "./entity/index.js";
|
|
2
|
+
import { ChildOf } from "./relationship.js";
|
|
3
|
+
import { Bitset } from "./util/bitset.js";
|
|
4
|
+
function _isClassConstructor(value) {
|
|
5
|
+
return (typeof value === "function" && Function.prototype.toString.call(value).startsWith("class "));
|
|
15
6
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
7
|
+
function _componentRequirements(q) {
|
|
8
|
+
if (typeof q === "number" || q instanceof Entity) {
|
|
9
|
+
return [q];
|
|
10
|
+
}
|
|
11
|
+
if (_isClassConstructor(q)) {
|
|
12
|
+
return [q];
|
|
13
|
+
}
|
|
14
|
+
if (q instanceof Array) {
|
|
15
|
+
return q;
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
function _asShortestComponentRequirement(components) {
|
|
20
|
+
if (components.length === 0) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return components.length === 1 ? components[0] : components;
|
|
24
|
+
}
|
|
25
|
+
function _calculateComponentBitmask(types) {
|
|
26
|
+
const bitmask = new Bitset();
|
|
27
|
+
types.forEach((type) => {
|
|
28
|
+
bitmask.add(type);
|
|
29
|
+
});
|
|
30
|
+
return bitmask;
|
|
31
|
+
}
|
|
32
|
+
function _resolveComponentRequirement(component, world) {
|
|
33
|
+
return world.entity(component).eid;
|
|
34
|
+
}
|
|
35
|
+
export function _resolveRelationship(ref, world) {
|
|
36
|
+
const entity = world.entity(ref);
|
|
37
|
+
const meta = entity.ownMeta;
|
|
38
|
+
if (!meta.isRelationship) {
|
|
39
|
+
throw new Error(`Component ${meta.Class.name} is not a Relationship`);
|
|
40
|
+
}
|
|
41
|
+
return entity.eid;
|
|
23
42
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return (e) => !func(e);
|
|
43
|
+
function _resolveChildOfRelationship(world) {
|
|
44
|
+
return _resolveRelationship(ChildOf, world);
|
|
27
45
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
46
|
+
function _resolveBareComponent(component, world) {
|
|
47
|
+
if (typeof component === "number") {
|
|
48
|
+
return component;
|
|
49
|
+
}
|
|
50
|
+
if (component instanceof Entity) {
|
|
51
|
+
return component.eid;
|
|
52
|
+
}
|
|
53
|
+
return world.entity(component).eid;
|
|
54
|
+
}
|
|
55
|
+
function _sortComponentRequirements(components) {
|
|
56
|
+
return [...components].sort((a, b) => {
|
|
57
|
+
const aEid = typeof a === "number" ? a : a instanceof Entity ? a.eid : undefined;
|
|
58
|
+
const bEid = typeof b === "number" ? b : b instanceof Entity ? b.eid : undefined;
|
|
59
|
+
if (aEid !== undefined && bEid !== undefined) {
|
|
60
|
+
return aEid - bEid;
|
|
61
|
+
}
|
|
62
|
+
if (aEid !== undefined) {
|
|
63
|
+
return -1;
|
|
64
|
+
}
|
|
65
|
+
if (bEid !== undefined) {
|
|
66
|
+
return 1;
|
|
67
|
+
}
|
|
68
|
+
return 0;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function _asShortestHasOnlyRequirement(components) {
|
|
72
|
+
return components.length === 1 ? components[0] : components;
|
|
73
|
+
}
|
|
74
|
+
function _asCanonicalComponentRequirement(components, world) {
|
|
75
|
+
return _asShortestComponentRequirement(_sortComponentRequirements(components.map((component) => _resolveComponentRequirement(component, world))));
|
|
76
|
+
}
|
|
77
|
+
function _componentSortKey(q) {
|
|
78
|
+
if (typeof q === "number") {
|
|
79
|
+
return q;
|
|
80
|
+
}
|
|
81
|
+
if (q instanceof Entity) {
|
|
82
|
+
return q.eid;
|
|
83
|
+
}
|
|
84
|
+
if (q instanceof Array && q.length > 0 && q.every((term) => typeof term === "number")) {
|
|
85
|
+
return q[0];
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
function _termSortKey(q) {
|
|
90
|
+
if (typeof q === "boolean") {
|
|
91
|
+
return q ? "0:true" : "0:false";
|
|
92
|
+
}
|
|
93
|
+
const componentSortKey = _componentSortKey(q);
|
|
94
|
+
if (componentSortKey !== undefined) {
|
|
95
|
+
return `0:${componentSortKey.toString().padStart(12, "0")}`;
|
|
96
|
+
}
|
|
97
|
+
if (typeof q === "number") {
|
|
98
|
+
return `0:${q.toString().padStart(12, "0")}`;
|
|
99
|
+
}
|
|
100
|
+
if (q instanceof Array) {
|
|
101
|
+
return `1:${q.map(_termSortKey).join(",")}`;
|
|
102
|
+
}
|
|
103
|
+
if (q instanceof Entity) {
|
|
104
|
+
return `0:${q.eid.toString().padStart(12, "0")}`;
|
|
105
|
+
}
|
|
106
|
+
if (typeof q === "function") {
|
|
107
|
+
return "5";
|
|
108
|
+
}
|
|
109
|
+
if ("all" in q) {
|
|
110
|
+
return `2:${q.all.map(_termSortKey).join(",")}`;
|
|
111
|
+
}
|
|
112
|
+
if ("any" in q) {
|
|
113
|
+
return `3:${q.any.map(_termSortKey).join(",")}`;
|
|
114
|
+
}
|
|
115
|
+
if ("not" in q) {
|
|
116
|
+
return `4:${_termSortKey(q.not)}`;
|
|
117
|
+
}
|
|
118
|
+
if ("target" in q) {
|
|
119
|
+
const rel = q.target[0] instanceof Entity ? q.target[0].eid : q.target[0];
|
|
120
|
+
return `4:target:${String(rel).padStart(12, "0")}:${_termSortKey(q.target[1])}`;
|
|
121
|
+
}
|
|
122
|
+
if ("source" in q) {
|
|
123
|
+
const rel = q.source[0] instanceof Entity ? q.source[0].eid : q.source[0];
|
|
124
|
+
return `4:source:${String(rel).padStart(12, "0")}:${_termSortKey(q.source[1])}`;
|
|
125
|
+
}
|
|
126
|
+
if ("parent" in q) {
|
|
127
|
+
return `4:parent:${_termSortKey(q.parent)}`;
|
|
128
|
+
}
|
|
129
|
+
if ("children" in q) {
|
|
130
|
+
return `4:children:${_termSortKey(q.children)}`;
|
|
131
|
+
}
|
|
132
|
+
if ("test" in q) {
|
|
133
|
+
return `5:${q.watch instanceof Array ? q.watch.map(_termSortKey).join(",") : q.watch ? _termSortKey(q.watch) : ""}`;
|
|
134
|
+
}
|
|
135
|
+
return `4:${q.only instanceof Array ? q.only.map(_termSortKey).join(",") : _termSortKey(q.only)}`;
|
|
31
136
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return (e) => funcs.some((f) => f(e));
|
|
137
|
+
function _sortCommutativeTerms(terms) {
|
|
138
|
+
return [...terms].sort((a, b) => _termSortKey(a).localeCompare(_termSortKey(b)));
|
|
35
139
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
140
|
+
const _dslFunctionIds = new WeakMap();
|
|
141
|
+
let _nextDSLFunctionId = 1;
|
|
142
|
+
function _getDSLFunctionId(func) {
|
|
143
|
+
let id = _dslFunctionIds.get(func);
|
|
144
|
+
if (id === undefined) {
|
|
145
|
+
id = _nextDSLFunctionId++;
|
|
146
|
+
_dslFunctionIds.set(func, id);
|
|
147
|
+
}
|
|
148
|
+
return id;
|
|
149
|
+
}
|
|
150
|
+
function _canonicalDSLKey(q) {
|
|
151
|
+
if (typeof q === "boolean") {
|
|
152
|
+
return ["BOOL", q];
|
|
153
|
+
}
|
|
154
|
+
if (typeof q === "number") {
|
|
155
|
+
return ["HAS", q];
|
|
156
|
+
}
|
|
157
|
+
if (q instanceof Entity) {
|
|
158
|
+
return ["HAS", q.eid];
|
|
159
|
+
}
|
|
160
|
+
if (typeof q === "function") {
|
|
161
|
+
return ["HAS", q];
|
|
162
|
+
}
|
|
163
|
+
if (q instanceof Array) {
|
|
164
|
+
return ["ALL", q];
|
|
165
|
+
}
|
|
166
|
+
if ("only" in q) {
|
|
167
|
+
return ["ONLY", q.only instanceof Array ? q.only : [q.only]];
|
|
168
|
+
}
|
|
169
|
+
if ("all" in q) {
|
|
170
|
+
return ["ALL", q.all.map(_canonicalDSLKey)];
|
|
171
|
+
}
|
|
172
|
+
if ("any" in q) {
|
|
173
|
+
return ["ANY", q.any.map(_canonicalDSLKey)];
|
|
174
|
+
}
|
|
175
|
+
if ("not" in q) {
|
|
176
|
+
return ["NOT", _canonicalDSLKey(q.not)];
|
|
177
|
+
}
|
|
178
|
+
if ("target" in q) {
|
|
179
|
+
return [
|
|
180
|
+
"TARGET",
|
|
181
|
+
q.target[0] instanceof Entity ? q.target[0].eid : q.target[0],
|
|
182
|
+
_canonicalDSLKey(q.target[1]),
|
|
183
|
+
];
|
|
184
|
+
}
|
|
185
|
+
if ("source" in q) {
|
|
186
|
+
return [
|
|
187
|
+
"SOURCE",
|
|
188
|
+
q.source[0] instanceof Entity ? q.source[0].eid : q.source[0],
|
|
189
|
+
_canonicalDSLKey(q.source[1]),
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
if ("parent" in q) {
|
|
193
|
+
return ["PARENT", _canonicalDSLKey(q.parent)];
|
|
194
|
+
}
|
|
195
|
+
if ("children" in q) {
|
|
196
|
+
return ["CHILDREN", _canonicalDSLKey(q.children)];
|
|
197
|
+
}
|
|
198
|
+
if ("test" in q) {
|
|
199
|
+
if (q.watch === undefined) {
|
|
200
|
+
return ["FUNC", _getDSLFunctionId(q.test)];
|
|
201
|
+
}
|
|
202
|
+
return ["FUNC", _getDSLFunctionId(q.test), q.watch instanceof Array ? q.watch : [q.watch]];
|
|
203
|
+
}
|
|
204
|
+
throw new Error("Unrecognized query term");
|
|
205
|
+
}
|
|
206
|
+
function _fnv1a32(input) {
|
|
207
|
+
let hash = 0x811c9dc5;
|
|
208
|
+
for (let i = 0; i < input.length; i++) {
|
|
209
|
+
hash ^= input.charCodeAt(i);
|
|
210
|
+
hash = Math.imul(hash, 0x01000193);
|
|
211
|
+
}
|
|
212
|
+
return hash >>> 0;
|
|
39
213
|
}
|
|
40
214
|
/**
|
|
41
|
-
*
|
|
215
|
+
* Return the shortest equivalent form of a query DSL expression.
|
|
42
216
|
*
|
|
43
|
-
* @internal
|
|
44
|
-
* DSL expressions into the predicate stored on `Query._belongs`.
|
|
217
|
+
* @internal
|
|
45
218
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
219
|
+
* The simplifier resolves component classes to numeric type ids, flattens
|
|
220
|
+
* associative operators, removes boolean identities, unwraps singleton
|
|
221
|
+
* operators, sorts commutative expressions, and coalesces positive component
|
|
222
|
+
* requirements into the DSL's array shorthand. Explicit `{ test }` predicates
|
|
223
|
+
* are preserved as predicates.
|
|
48
224
|
*/
|
|
49
|
-
export function
|
|
50
|
-
if (typeof q === "
|
|
51
|
-
return
|
|
225
|
+
export function simplifyQueryDSL(q, world) {
|
|
226
|
+
if (typeof q === "boolean") {
|
|
227
|
+
return q;
|
|
52
228
|
}
|
|
53
|
-
if (
|
|
54
|
-
return
|
|
229
|
+
if (q instanceof Array) {
|
|
230
|
+
return _asCanonicalComponentRequirement(q, world);
|
|
55
231
|
}
|
|
56
|
-
|
|
232
|
+
if (typeof q === "number") {
|
|
57
233
|
return q;
|
|
58
234
|
}
|
|
235
|
+
if (q instanceof Entity) {
|
|
236
|
+
return q.eid;
|
|
237
|
+
}
|
|
238
|
+
if (typeof q === "function") {
|
|
239
|
+
return _resolveBareComponent(q, world);
|
|
240
|
+
}
|
|
241
|
+
if ("only" in q) {
|
|
242
|
+
const components = q.only;
|
|
243
|
+
return {
|
|
244
|
+
only: components instanceof Array
|
|
245
|
+
? _asShortestHasOnlyRequirement(_sortComponentRequirements(components.map((component) => _resolveComponentRequirement(component, world))))
|
|
246
|
+
: _resolveComponentRequirement(components, world),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
if ("all" in q) {
|
|
250
|
+
const simplifiedTerms = [];
|
|
251
|
+
for (const term of q.all.map((term) => simplifyQueryDSL(term, world))) {
|
|
252
|
+
if (term === false) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
if (term === true) {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (typeof term === "object" && term !== null && !(term instanceof Array) && "all" in term) {
|
|
259
|
+
simplifiedTerms.push(...term.all);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
simplifiedTerms.push(term);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const componentRequirements = [];
|
|
266
|
+
const otherTerms = [];
|
|
267
|
+
for (const term of simplifiedTerms) {
|
|
268
|
+
const requirements = _componentRequirements(term);
|
|
269
|
+
if (requirements) {
|
|
270
|
+
componentRequirements.push(...requirements);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
otherTerms.push(term);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const terms = componentRequirements.length > 0
|
|
277
|
+
? [_asCanonicalComponentRequirement(componentRequirements, world), ...otherTerms]
|
|
278
|
+
: otherTerms;
|
|
279
|
+
if (terms.length === 0) {
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
if (terms.length === 1) {
|
|
283
|
+
return terms[0];
|
|
284
|
+
}
|
|
285
|
+
return { all: _sortCommutativeTerms(terms) };
|
|
286
|
+
}
|
|
287
|
+
if ("any" in q) {
|
|
288
|
+
const terms = [];
|
|
289
|
+
for (const term of q.any.map((term) => simplifyQueryDSL(term, world))) {
|
|
290
|
+
if (term === true) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
if (term === false) {
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
if (typeof term === "object" && term !== null && !(term instanceof Array) && "any" in term) {
|
|
297
|
+
terms.push(...term.any);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
terms.push(term);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (terms.length === 0) {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
if (terms.length === 1) {
|
|
307
|
+
return terms[0];
|
|
308
|
+
}
|
|
309
|
+
return { any: _sortCommutativeTerms(terms) };
|
|
310
|
+
}
|
|
311
|
+
if ("not" in q) {
|
|
312
|
+
const term = simplifyQueryDSL(q.not, world);
|
|
313
|
+
if (typeof term === "boolean") {
|
|
314
|
+
return !term;
|
|
315
|
+
}
|
|
316
|
+
if (typeof term === "object" && term !== null && !(term instanceof Array) && "not" in term) {
|
|
317
|
+
return term.not;
|
|
318
|
+
}
|
|
319
|
+
return { not: term };
|
|
320
|
+
}
|
|
321
|
+
if ("target" in q) {
|
|
322
|
+
const inner = simplifyQueryDSL(q.target[1], world);
|
|
323
|
+
if (inner === false) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
return { target: [_resolveRelationship(q.target[0], world), inner] };
|
|
327
|
+
}
|
|
328
|
+
if ("source" in q) {
|
|
329
|
+
const inner = simplifyQueryDSL(q.source[1], world);
|
|
330
|
+
if (inner === false) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
return { source: [_resolveRelationship(q.source[0], world), inner] };
|
|
334
|
+
}
|
|
335
|
+
if ("parent" in q) {
|
|
336
|
+
const inner = simplifyQueryDSL(q.parent, world);
|
|
337
|
+
if (inner === false) {
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
return { target: [_resolveChildOfRelationship(world), inner] };
|
|
341
|
+
}
|
|
342
|
+
if ("children" in q) {
|
|
343
|
+
const inner = simplifyQueryDSL(q.children, world);
|
|
344
|
+
if (inner === false) {
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
return { source: [_resolveChildOfRelationship(world), inner] };
|
|
348
|
+
}
|
|
349
|
+
if ("test" in q) {
|
|
350
|
+
if (q.watch === undefined) {
|
|
351
|
+
return q;
|
|
352
|
+
}
|
|
353
|
+
const watch = q.watch instanceof Array ? q.watch : [q.watch];
|
|
354
|
+
const resolvedWatch = [
|
|
355
|
+
...new Set(watch.map((component) => _resolveComponentRequirement(component, world))),
|
|
356
|
+
].sort((a, b) => a - b);
|
|
357
|
+
return { test: q.test, watch: resolvedWatch };
|
|
358
|
+
}
|
|
359
|
+
return q;
|
|
360
|
+
}
|
|
361
|
+
export function containsDownTerm(q) {
|
|
362
|
+
if (typeof q !== "object" || q === null || q instanceof Array || q instanceof Entity) {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
if ("source" in q || "children" in q) {
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
if ("all" in q) {
|
|
369
|
+
return q.all.some(containsDownTerm);
|
|
370
|
+
}
|
|
371
|
+
if ("any" in q) {
|
|
372
|
+
return q.any.some(containsDownTerm);
|
|
373
|
+
}
|
|
374
|
+
if ("not" in q) {
|
|
375
|
+
return containsDownTerm(q.not);
|
|
376
|
+
}
|
|
377
|
+
if ("target" in q) {
|
|
378
|
+
return containsDownTerm(q.target[1]);
|
|
379
|
+
}
|
|
380
|
+
if ("parent" in q) {
|
|
381
|
+
return containsDownTerm(q.parent);
|
|
382
|
+
}
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Return a deterministic FNV-1a hash for a query DSL expression.
|
|
387
|
+
*
|
|
388
|
+
* Equivalent expressions hash identically because the DSL is simplified before
|
|
389
|
+
* hashing. Custom predicate functions are represented by process-local function
|
|
390
|
+
* identity ids. Like any 32-bit hash, collisions are theoretically possible.
|
|
391
|
+
*/
|
|
392
|
+
export function getDSLKey(q, world) {
|
|
393
|
+
return _fnv1a32(JSON.stringify(_canonicalDSLKey(simplifyQueryDSL(q, world))));
|
|
394
|
+
}
|
|
395
|
+
/** @internal Return the canonical cache key used by materialized terms. */
|
|
396
|
+
export function getDSLCacheKey(q, world) {
|
|
397
|
+
return JSON.stringify(_canonicalDSLKey(simplifyQueryDSL(q, world)));
|
|
398
|
+
}
|
|
399
|
+
function _compileMask(context, components, entityRef, comparison) {
|
|
400
|
+
const mask = _calculateComponentBitmask(components);
|
|
401
|
+
if (comparison === "hasBitset") {
|
|
402
|
+
// Inline the subset check against the mask's word values so the
|
|
403
|
+
// generated predicate is straight-line bitwise code with no method
|
|
404
|
+
// dispatch and no loop over zero words. The mask itself is not
|
|
405
|
+
// closed over for this term.
|
|
406
|
+
const inline = mask._compileSubsetCheck(`${entityRef}.componentBitmask._bits`);
|
|
407
|
+
return inline === "true" ? "true" : `(${inline})`;
|
|
408
|
+
}
|
|
409
|
+
const maskIndex = context.masks.push(mask) - 1;
|
|
410
|
+
return `${entityRef}.componentBitmask.${comparison}(m${maskIndex})`;
|
|
411
|
+
}
|
|
412
|
+
function _compileQueryExpression(world, q, context, entityRef) {
|
|
413
|
+
if (typeof q === "boolean") {
|
|
414
|
+
return q ? "true" : "false";
|
|
415
|
+
}
|
|
416
|
+
if (typeof q === "number") {
|
|
417
|
+
return _compileMask(context, [q], entityRef, "hasBitset");
|
|
418
|
+
}
|
|
419
|
+
if (typeof q === "function") {
|
|
420
|
+
return _compileMask(context, [world.entity(q).eid], entityRef, "hasBitset");
|
|
421
|
+
}
|
|
59
422
|
if (q instanceof Array) {
|
|
60
|
-
return
|
|
423
|
+
return _compileMask(context, q.map((component) => world.entity(component).eid), entityRef, "hasBitset");
|
|
61
424
|
}
|
|
62
|
-
if ("
|
|
63
|
-
|
|
425
|
+
if ("only" in q) {
|
|
426
|
+
const v = q.only;
|
|
427
|
+
return _compileMask(context, v instanceof Array
|
|
428
|
+
? v.map((component) => world.entity(component).eid)
|
|
429
|
+
: [world.entity(v).eid], entityRef, "equal");
|
|
430
|
+
}
|
|
431
|
+
if ("all" in q) {
|
|
432
|
+
if (q.all.length === 0) {
|
|
433
|
+
return "true";
|
|
434
|
+
}
|
|
435
|
+
return q.all
|
|
436
|
+
.map((sq) => `(${_compileQueryExpression(world, sq, context, entityRef)})`)
|
|
437
|
+
.join("&&");
|
|
64
438
|
}
|
|
65
|
-
if ("
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
return _HAS_ONLY(world, ...v);
|
|
439
|
+
if ("any" in q) {
|
|
440
|
+
if (q.any.length === 0) {
|
|
441
|
+
return "false";
|
|
69
442
|
}
|
|
70
|
-
return
|
|
443
|
+
return q.any
|
|
444
|
+
.map((sq) => `(${_compileQueryExpression(world, sq, context, entityRef)})`)
|
|
445
|
+
.join("||");
|
|
71
446
|
}
|
|
72
|
-
if ("
|
|
73
|
-
return
|
|
447
|
+
if ("not" in q) {
|
|
448
|
+
return `!(${_compileQueryExpression(world, q.not, context, entityRef)})`;
|
|
74
449
|
}
|
|
75
|
-
if ("
|
|
76
|
-
|
|
450
|
+
if ("target" in q) {
|
|
451
|
+
const relEid = _resolveRelationship(q.target[0], world);
|
|
452
|
+
const relMask = _compileMask(context, [relEid], entityRef, "hasBitset");
|
|
453
|
+
const inner = _compileQueryExpression(world, q.target[1], context, "p");
|
|
454
|
+
return `(${relMask})&&((p)=>p!==undefined&&(${inner}))(${entityRef}._get(${relEid})?.target)`;
|
|
77
455
|
}
|
|
78
|
-
if ("
|
|
79
|
-
|
|
456
|
+
if ("source" in q) {
|
|
457
|
+
const relEid = _resolveRelationship(q.source[0], world);
|
|
458
|
+
const inner = _compileQueryExpression(world, q.source[1], context, "p");
|
|
459
|
+
return `((cs)=>{if(cs===undefined)return false;for(const p of cs){if(${inner})return true;}return false;})(${entityRef}._childrenByEid(${relEid}))`;
|
|
80
460
|
}
|
|
81
|
-
if ("
|
|
82
|
-
|
|
461
|
+
if ("test" in q) {
|
|
462
|
+
const funcIndex = context.funcs.push(q.test) - 1;
|
|
463
|
+
return `f${funcIndex}(${entityRef})`;
|
|
83
464
|
}
|
|
84
|
-
throw "Unrecognized query term";
|
|
465
|
+
throw new Error("Unrecognized query term");
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Compile a {@link QueryDSL} expression into a runtime entity-test predicate.
|
|
469
|
+
*
|
|
470
|
+
* @internal Used by predicate-backed terms and the `Filter` fallback to
|
|
471
|
+
* translate user-supplied DSL expressions into runtime tests.
|
|
472
|
+
*
|
|
473
|
+
* @param world - World used to resolve registered component classes to type ids.
|
|
474
|
+
* @param q - Query expression.
|
|
475
|
+
*/
|
|
476
|
+
export function _compile(world, q) {
|
|
477
|
+
const context = { masks: [], funcs: [] };
|
|
478
|
+
const expression = _compileQueryExpression(world, simplifyQueryDSL(q, world), context, "e");
|
|
479
|
+
const maskNames = context.masks.map((_mask, index) => `m${index}`);
|
|
480
|
+
const funcNames = context.funcs.map((_func, index) => `f${index}`);
|
|
481
|
+
const factory = new Function(...maskNames, ...funcNames, `return function entityTest(e) { return ${expression}; };`);
|
|
482
|
+
return factory(...context.masks, ...context.funcs);
|
|
85
483
|
}
|
|
86
484
|
//# sourceMappingURL=dsl.js.map
|
package/dist/dsl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dsl.js","sourceRoot":"","sources":["../src/dsl.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dsl.js","sourceRoot":"","sources":["../src/dsl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ComponentMeta, type ComponentInstance, type ComponentType } from "../component_meta.js";
|
|
2
|
+
import { type ReadonlyArrayMap } from "../util/array_map.js";
|
|
3
|
+
import { Bitset } from "../util/bitset.js";
|
|
4
|
+
import { Events } from "../util/events.js";
|
|
5
|
+
import type { World } from "../world/index.js";
|
|
6
|
+
export type EntityEvents = Events<{
|
|
7
|
+
destroy(): void;
|
|
8
|
+
}>;
|
|
9
|
+
export declare class Base {
|
|
10
|
+
/** World that owns this entity. */
|
|
11
|
+
readonly world: World;
|
|
12
|
+
/** Unique numeric entity id assigned at creation. */
|
|
13
|
+
readonly eid: number;
|
|
14
|
+
/**
|
|
15
|
+
* Bitmask of component type ids currently attached to this entity. Used by
|
|
16
|
+
* the world for fast archetype matching against query predicates.
|
|
17
|
+
*/
|
|
18
|
+
readonly componentBitmask: Bitset;
|
|
19
|
+
/**
|
|
20
|
+
* Free-form property bag. Modules can use it to associate arbitrary data with
|
|
21
|
+
* an entity without registering a dedicated component.
|
|
22
|
+
*/
|
|
23
|
+
properties: Map<string, any>;
|
|
24
|
+
constructor(
|
|
25
|
+
/** World that owns this entity. */
|
|
26
|
+
world: World,
|
|
27
|
+
/** Unique numeric entity id assigned at creation. */
|
|
28
|
+
eid: number, ownComponentClass?: ComponentType);
|
|
29
|
+
/**
|
|
30
|
+
* Read-only view of all components currently attached to this entity, keyed
|
|
31
|
+
* by numeric component type id.
|
|
32
|
+
*
|
|
33
|
+
* The mutating methods (`set`, `delete`, `clear`) are not exposed. Use
|
|
34
|
+
* `entity.add`, `entity.attach`, `entity.set`, and `entity.remove` to change
|
|
35
|
+
* the component set.
|
|
36
|
+
*
|
|
37
|
+
* ```ts
|
|
38
|
+
* entity.components.forEach((c) => console.log(c.constructor.name));
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
get components(): ReadonlyArrayMap<ComponentInstance>;
|
|
42
|
+
/** `true` when no components are currently attached to this entity. */
|
|
43
|
+
get empty(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Typed event emitter for entity-level lifecycle events. Currently only the
|
|
46
|
+
* `"destroy"` event is emitted, just before the entity is fully torn down.
|
|
47
|
+
*
|
|
48
|
+
* The emitter is created lazily on first access.
|
|
49
|
+
*/
|
|
50
|
+
get events(): EntityEvents;
|
|
51
|
+
/** Metadata for using this entity's eid as a component key. Created lazily for plain entities. */
|
|
52
|
+
get ownMeta(): ComponentMeta;
|
|
53
|
+
/** Number of live component instances currently attached for this entity's component key. */
|
|
54
|
+
instanceCount(): number;
|
|
55
|
+
/** Returns `"EntityN"` where N is the entity id. */
|
|
56
|
+
toString(): string;
|
|
57
|
+
}
|