@typeonce/ritmo-render 0.7.0 → 0.9.0
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 +1 -1
- package/dist/RenderSync.d.ts +4 -1
- package/dist/RenderSync.d.ts.map +1 -1
- package/dist/RenderSync.js +31 -23
- package/dist/RenderSync.js.map +1 -1
- package/package.json +2 -2
- package/src/RenderSync.ts +33 -23
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ const runtime = Game.Runtime.make({
|
|
|
32
32
|
detach: (mesh) => scene.remove(mesh)
|
|
33
33
|
}))
|
|
34
34
|
)
|
|
35
|
-
})
|
|
35
|
+
}).value
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
For Pixi, [`@typeonce/ritmo-pixi`](https://www.npmjs.com/package/@typeonce/ritmo-pixi) provides `PixiNodeRegistry.make(container)`, an implementation of the same registry contract. The host provides it with `Game.Runtime.service`; render systems keep depending on the generic service descriptor.
|
package/dist/RenderSync.d.ts
CHANGED
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
* entity loses any of them or despawns. A node appears whichever of those
|
|
8
8
|
* components arrives last, and goes as soon as one leaves. `RenderSync.system(...)` builds one system that does all three,
|
|
9
9
|
* in a safe order (destroy, create, update), for one bound `Game`. What a
|
|
10
|
-
* node looks like and how state is applied stay caller-defined.
|
|
10
|
+
* node looks like and how state is applied stay caller-defined. The registry
|
|
11
|
+
* belongs to the system: when removals were dropped before it read them
|
|
12
|
+
* (`lagged()`, after it did not run for long), it destroys every node whose
|
|
13
|
+
* entity no longer matches, so give each `RenderSync.system` its own registry.
|
|
11
14
|
*
|
|
12
15
|
* Change detection is per system, so the system sees every addition, change,
|
|
13
16
|
* and removal exactly once, wherever it sits in the schedule, and applies each
|
package/dist/RenderSync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderSync.d.ts","sourceRoot":"","sources":["../src/RenderSync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"RenderSync.d.ts","sourceRoot":"","sources":["../src/RenderSync.ts"],"names":[],"mappings":"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"}
|
package/dist/RenderSync.js
CHANGED
|
@@ -6,6 +6,7 @@ export const system = (Game, options) => {
|
|
|
6
6
|
// above carries the exact requirements (the registry and extra services).
|
|
7
7
|
const System = Game.System;
|
|
8
8
|
const Query = Game.Query;
|
|
9
|
+
const anyOf = Game.Query.anyOf;
|
|
9
10
|
const transform = options.transform;
|
|
10
11
|
const selection = {
|
|
11
12
|
...options.select,
|
|
@@ -44,11 +45,18 @@ export const system = (Game, options) => {
|
|
|
44
45
|
// Despawns are recorded as removals of every component, so these cover them too.
|
|
45
46
|
removedReads[`removed${index}`] = Game.System.readRemoved(descriptor);
|
|
46
47
|
});
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
// One query: an entity whose required component was added, or whose
|
|
49
|
+
// trigger changed, is synced once.
|
|
50
|
+
const filters = [
|
|
51
|
+
...additions.map((descriptor) => Game.Query.added(descriptor)),
|
|
52
|
+
...triggers.map((trigger) => Game.Query.changed(trigger))
|
|
53
|
+
];
|
|
54
|
+
// Never empty: `required` always holds the renderable.
|
|
55
|
+
queries["sync"] = Query({ selection, filters: [filters.length === 1 ? filters[0] : anyOf(...filters)] });
|
|
56
|
+
// Every entity that should have a node: read only after removals were lost.
|
|
57
|
+
queries["members"] = Query({
|
|
58
|
+
selection: { __renderable: Game.Query.read(options.renderable) },
|
|
59
|
+
with: required.filter((descriptor) => descriptor !== options.renderable)
|
|
52
60
|
});
|
|
53
61
|
return System(options.name, {
|
|
54
62
|
queries,
|
|
@@ -60,29 +68,29 @@ export const system = (Game, options) => {
|
|
|
60
68
|
const registry = services.__registry;
|
|
61
69
|
// Destroy first: an entity that lost a required component has no node,
|
|
62
70
|
// and one that lost it and got it back since the last run gets a fresh one.
|
|
71
|
+
let lagged = false;
|
|
63
72
|
for (let index = 0; index < required.length; index++) {
|
|
64
|
-
|
|
73
|
+
const stream = removed[`removed${index}`];
|
|
74
|
+
for (const entity of stream.all())
|
|
65
75
|
registry.remove(entity);
|
|
76
|
+
if (stream.lagged())
|
|
77
|
+
lagged = true;
|
|
66
78
|
}
|
|
67
|
-
|
|
68
|
-
for
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
79
|
+
// Removals were dropped before this system read them (it did not run
|
|
80
|
+
// for longer than the stream keeps them): destroy every node whose
|
|
81
|
+
// entity no longer has one, so none stays on screen.
|
|
82
|
+
if (lagged) {
|
|
83
|
+
const members = new Set();
|
|
84
|
+
for (const { entity } of queries["members"].each())
|
|
85
|
+
members.add(entity.id);
|
|
86
|
+
for (const [entity] of [...registry.entries()]) {
|
|
87
|
+
if (!members.has(entity))
|
|
88
|
+
registry.remove(entity);
|
|
75
89
|
}
|
|
76
90
|
}
|
|
77
|
-
for (
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
continue;
|
|
81
|
-
applied.add(entity.id);
|
|
82
|
-
const context = contextOf(entity, data, services, resources);
|
|
83
|
-
const node = registry.get(entity.id) ?? registry.ensure(entity.id, () => options.create(context));
|
|
84
|
-
options.apply(node, context);
|
|
85
|
-
}
|
|
91
|
+
for (const { entity, data } of queries["sync"].each()) {
|
|
92
|
+
const context = contextOf(entity, data, services, resources);
|
|
93
|
+
options.apply(registry.ensure(entity.id, () => options.create(context)), context);
|
|
86
94
|
}
|
|
87
95
|
});
|
|
88
96
|
};
|
package/dist/RenderSync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderSync.js","sourceRoot":"","sources":["../src/RenderSync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RenderSync.js","sourceRoot":"","sources":["../src/RenderSync.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typeonce/ritmo-render",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Renderer-agnostic entity-to-node mirroring for Ritmo",
|
|
5
5
|
"author": "Sandro Maglione",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"provenance": true
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@typeonce/ritmo": "^0.
|
|
48
|
+
"@typeonce/ritmo": "^0.9.0"
|
|
49
49
|
},
|
|
50
50
|
"engines": {
|
|
51
51
|
"node": ">=20"
|
package/src/RenderSync.ts
CHANGED
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
* entity loses any of them or despawns. A node appears whichever of those
|
|
8
8
|
* components arrives last, and goes as soon as one leaves. `RenderSync.system(...)` builds one system that does all three,
|
|
9
9
|
* in a safe order (destroy, create, update), for one bound `Game`. What a
|
|
10
|
-
* node looks like and how state is applied stay caller-defined.
|
|
10
|
+
* node looks like and how state is applied stay caller-defined. The registry
|
|
11
|
+
* belongs to the system: when removals were dropped before it read them
|
|
12
|
+
* (`lagged()`, after it did not run for long), it destroys every node whose
|
|
13
|
+
* entity no longer matches, so give each `RenderSync.system` its own registry.
|
|
11
14
|
*
|
|
12
15
|
* Change detection is per system, so the system sees every addition, change,
|
|
13
16
|
* and removal exactly once, wherever it sits in the schedule, and applies each
|
|
@@ -189,6 +192,7 @@ export const system = <
|
|
|
189
192
|
// above carries the exact requirements (the registry and extra services).
|
|
190
193
|
const System = Game.System as unknown as (name: string, spec: object, run: (context: any) => void) => unknown
|
|
191
194
|
const Query = Game.Query as unknown as (spec: object) => object
|
|
195
|
+
const anyOf = Game.Query.anyOf as unknown as (...filters: ReadonlyArray<object>) => object
|
|
192
196
|
const transform = options.transform as Schema.ComponentDescriptor<S> | undefined
|
|
193
197
|
const selection = {
|
|
194
198
|
...options.select,
|
|
@@ -235,11 +239,18 @@ export const system = <
|
|
|
235
239
|
// Despawns are recorded as removals of every component, so these cover them too.
|
|
236
240
|
removedReads[`removed${index}`] = Game.System.readRemoved(descriptor)
|
|
237
241
|
})
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
242
|
+
// One query: an entity whose required component was added, or whose
|
|
243
|
+
// trigger changed, is synced once.
|
|
244
|
+
const filters = [
|
|
245
|
+
...additions.map((descriptor) => Game.Query.added(descriptor)),
|
|
246
|
+
...triggers.map((trigger) => Game.Query.changed(trigger))
|
|
247
|
+
]
|
|
248
|
+
// Never empty: `required` always holds the renderable.
|
|
249
|
+
queries["sync"] = Query({ selection, filters: [filters.length === 1 ? filters[0] : anyOf(...filters)] })
|
|
250
|
+
// Every entity that should have a node: read only after removals were lost.
|
|
251
|
+
queries["members"] = Query({
|
|
252
|
+
selection: { __renderable: Game.Query.read(options.renderable) },
|
|
253
|
+
with: required.filter((descriptor) => descriptor !== options.renderable)
|
|
243
254
|
})
|
|
244
255
|
|
|
245
256
|
return System(options.name, {
|
|
@@ -252,27 +263,26 @@ export const system = <
|
|
|
252
263
|
const registry = services.__registry as NodeRegistry<Node>
|
|
253
264
|
// Destroy first: an entity that lost a required component has no node,
|
|
254
265
|
// and one that lost it and got it back since the last run gets a fresh one.
|
|
266
|
+
let lagged = false
|
|
255
267
|
for (let index = 0; index < required.length; index++) {
|
|
256
|
-
|
|
268
|
+
const stream = removed[`removed${index}`]
|
|
269
|
+
for (const entity of stream.all()) registry.remove(entity)
|
|
270
|
+
if (stream.lagged()) lagged = true
|
|
257
271
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
272
|
+
// Removals were dropped before this system read them (it did not run
|
|
273
|
+
// for longer than the stream keeps them): destroy every node whose
|
|
274
|
+
// entity no longer has one, so none stays on screen.
|
|
275
|
+
if (lagged) {
|
|
276
|
+
const members = new Set<number>()
|
|
277
|
+
for (const { entity } of queries["members"].each()) members.add(entity.id)
|
|
278
|
+
for (const [entity] of [...registry.entries()]) {
|
|
279
|
+
if (!members.has(entity)) registry.remove(entity)
|
|
266
280
|
}
|
|
267
281
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
const context = contextOf(entity, data, services, resources)
|
|
273
|
-
const node = registry.get(entity.id) ?? registry.ensure(entity.id, () => options.create(context))
|
|
274
|
-
options.apply(node, context)
|
|
275
|
-
}
|
|
282
|
+
|
|
283
|
+
for (const { entity, data } of queries["sync"].each()) {
|
|
284
|
+
const context = contextOf(entity, data, services, resources)
|
|
285
|
+
options.apply(registry.ensure(entity.id, () => options.create(context)), context)
|
|
276
286
|
}
|
|
277
287
|
}) as RenderSystem<S, Root, Registry | Services[keyof Services] | Resources[keyof Resources] | ConditionNeedsFromConditions<When>>
|
|
278
288
|
}
|