@driftengine/core 4.10.0 → 4.11.1
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/CHANGELOG.json +107 -0
- package/README.md +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +2 -2
- package/dist/render/ambientOcclusionPass.d.ts +3 -2
- package/dist/render/ambientOcclusionPass.js +4 -2
- package/dist/render/backend/api.d.ts +21 -1
- package/dist/render/backend/webgl2/renderer.d.ts +141 -3
- package/dist/render/backend/webgl2/renderer.js +454 -42
- package/dist/render/backend/webgpu/buffers.d.ts +5 -0
- package/dist/render/backend/webgpu/buffers.js +98 -48
- package/dist/render/backend/webgpu/clothKernels.d.ts +8 -0
- package/dist/render/backend/webgpu/clothKernels.js +76 -0
- package/dist/render/backend/webgpu/clothOps.d.ts +39 -0
- package/dist/render/backend/webgpu/clothOps.js +78 -0
- package/dist/render/backend/webgpu/clothSetLayout.d.ts +25 -0
- package/dist/render/backend/webgpu/clothSetLayout.js +84 -0
- package/dist/render/backend/webgpu/clothSetPack.d.ts +33 -0
- package/dist/render/backend/webgpu/clothSetPack.js +144 -0
- package/dist/render/backend/webgpu/drawCommand.d.ts +2 -0
- package/dist/render/backend/webgpu/drawCommand.js +1 -0
- package/dist/render/backend/webgpu/flatPass.d.ts +1 -1
- package/dist/render/backend/webgpu/flatPass.js +2 -1
- package/dist/render/backend/webgpu/gpuClothSet.d.ts +80 -0
- package/dist/render/backend/webgpu/gpuClothSet.js +462 -0
- package/dist/render/backend/webgpu/latePass.js +1 -0
- package/dist/render/backend/webgpu/motionPass.js +15 -6
- package/dist/render/backend/webgpu/pipelineCache.d.ts +22 -1
- package/dist/render/backend/webgpu/pipelineCache.js +39 -1
- package/dist/render/backend/webgpu/postPass.d.ts +1 -1
- package/dist/render/backend/webgpu/renderer.d.ts +100 -1
- package/dist/render/backend/webgpu/renderer.js +423 -95
- package/dist/render/backend/webgpu/shaders/clothSolve.wgsl.d.ts +9 -2
- package/dist/render/backend/webgpu/shaders/clothSolve.wgsl.js +121 -47
- package/dist/render/backend/webgpu/staticBundles.js +2 -1
- package/dist/render/backend/webgpu/vertexFormats.d.ts +22 -0
- package/dist/render/backend/webgpu/vertexFormats.js +97 -0
- package/dist/render/globalMediumPass.d.ts +2 -0
- package/dist/render/globalMediumPass.js +1 -0
- package/dist/render/indexWidth.d.ts +17 -0
- package/dist/render/indexWidth.js +23 -0
- package/dist/render/instances.d.ts +13 -1
- package/dist/render/instances.js +10 -0
- package/dist/render/lightMatrix.d.ts +11 -0
- package/dist/render/lightMatrix.js +14 -0
- package/dist/render/mesh.d.ts +9 -0
- package/dist/render/mesh.js +38 -14
- package/dist/render/occlusionFade.d.ts +21 -0
- package/dist/render/occlusionFade.js +27 -0
- package/dist/render/renderQuality.d.ts +30 -0
- package/dist/render/renderQuality.js +5 -0
- package/dist/render/rendererHarness.d.ts +7 -0
- package/dist/render/rendererHarness.js +12 -0
- package/dist/render/sceneTarget.d.ts +2 -0
- package/dist/render/sceneTarget.js +1 -1
- package/dist/render/shader.d.ts +15 -0
- package/dist/render/shader.js +41 -0
- package/dist/render/shaders/ambientOcclusion.js +12 -1
- package/dist/render/shaders/flat/directionalShadow.js +84 -10
- package/dist/render/shaders/flat/glassTint.d.ts +1 -1
- package/dist/render/shaders/flat/glassTint.js +3 -0
- package/dist/render/shaders/flat/index.d.ts +15 -0
- package/dist/render/shaders/flat/index.js +24 -4
- package/dist/render/shaders/flat/layered.d.ts +27 -0
- package/dist/render/shaders/flat/layered.js +198 -0
- package/dist/render/shaders/flat/main.d.ts +1 -1
- package/dist/render/shaders/flat/main.js +50 -16
- package/dist/render/shaders/flat/mapReads.d.ts +10 -0
- package/dist/render/shaders/flat/mapReads.js +38 -0
- package/dist/render/shaders/flat/movingSun.d.ts +21 -0
- package/dist/render/shaders/flat/movingSun.js +46 -0
- package/dist/render/shaders/flat/normalMap.d.ts +6 -2
- package/dist/render/shaders/flat/normalMap.js +23 -3
- package/dist/render/shaders/flat/overlay.d.ts +3 -2
- package/dist/render/shaders/flat/overlay.js +41 -19
- package/dist/render/shaders/flat/preamble.js +23 -5
- package/dist/render/shaders/flat/worldUv.d.ts +22 -0
- package/dist/render/shaders/flat/worldUv.js +113 -0
- package/dist/render/shaders/generated/ambientOcclusion.wgsl.d.ts +6 -1
- package/dist/render/shaders/generated/ambientOcclusion.wgsl.js +6 -1
- package/dist/render/shaders/generated/flat.wgsl.d.ts +768 -368
- package/dist/render/shaders/generated/flat.wgsl.js +791 -391
- package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +8 -3
- package/dist/render/shaders/generated/globalMedium.wgsl.js +8 -3
- package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +15 -10
- package/dist/render/shaders/generated/lightVolume.wgsl.js +16 -11
- package/dist/render/shaders/globalMedium.js +9 -1
- package/dist/render/shaders/lightVolume.js +9 -1
- package/dist/render/shaders/tangentFrame.d.ts +1 -1
- package/dist/render/shaders/tangentFrame.js +16 -3
- package/dist/render/skinnedClothRun.d.ts +28 -0
- package/dist/render/skinnedClothRun.js +103 -35
- package/dist/render/surfaceLayers.d.ts +107 -0
- package/dist/render/surfaceLayers.js +82 -0
- package/dist/render/surfaceOverlay.d.ts +16 -3
- package/dist/render/surfaceOverlay.js +11 -6
- package/dist/render/surfaceProjection.d.ts +34 -0
- package/dist/render/surfaceProjection.js +30 -0
- package/dist/render/surfaceTexture.d.ts +39 -0
- package/dist/render/transmission.d.ts +21 -0
- package/dist/render/transmission.js +21 -0
- package/dist/render/vertexPacking.d.ts +48 -0
- package/dist/render/vertexPacking.js +68 -0
- package/dist/ui/splash.d.ts +42 -2
- package/dist/ui/splash.js +78 -13
- package/package.json +6 -6
- package/src/index.ts +6 -2
- package/src/render/ambientOcclusionPass.ts +4 -1
- package/src/render/backend/api.ts +31 -0
- package/src/render/backend/webgl2/renderer.ts +519 -56
- package/src/render/backend/webgpu/buffers.ts +153 -54
- package/src/render/backend/webgpu/clothKernels.ts +86 -0
- package/src/render/backend/webgpu/clothOps.ts +86 -0
- package/src/render/backend/webgpu/clothSetLayout.ts +102 -0
- package/src/render/backend/webgpu/clothSetPack.ts +197 -0
- package/src/render/backend/webgpu/drawCommand.ts +3 -0
- package/src/render/backend/webgpu/flatPass.ts +26 -28
- package/src/render/backend/webgpu/gpuClothSet.ts +564 -0
- package/src/render/backend/webgpu/latePass.ts +1 -0
- package/src/render/backend/webgpu/motionPass.ts +18 -7
- package/src/render/backend/webgpu/pipelineCache.ts +46 -7
- package/src/render/backend/webgpu/renderer.ts +622 -164
- package/src/render/backend/webgpu/shaders/clothSolve.wgsl.ts +121 -47
- package/src/render/backend/webgpu/staticBundles.ts +2 -1
- package/src/render/backend/webgpu/vertexFormats.ts +113 -0
- package/src/render/globalMediumPass.ts +7 -0
- package/src/render/indexWidth.ts +27 -0
- package/src/render/instances.ts +18 -1
- package/src/render/lightMatrix.ts +15 -0
- package/src/render/mesh.ts +66 -14
- package/src/render/occlusionFade.ts +29 -0
- package/src/render/renderQuality.ts +38 -0
- package/src/render/rendererHarness.ts +15 -0
- package/src/render/sceneTarget.ts +3 -0
- package/src/render/shader.ts +59 -0
- package/src/render/shaders/ambientOcclusion.ts +12 -1
- package/src/render/shaders/flat/directionalShadow.ts +84 -10
- package/src/render/shaders/flat/glassTint.ts +7 -1
- package/src/render/shaders/flat/index.ts +39 -4
- package/src/render/shaders/flat/layered.ts +198 -0
- package/src/render/shaders/flat/main.ts +50 -16
- package/src/render/shaders/flat/mapReads.ts +38 -0
- package/src/render/shaders/flat/movingSun.ts +46 -0
- package/src/render/shaders/flat/normalMap.ts +23 -3
- package/src/render/shaders/flat/overlay.ts +41 -19
- package/src/render/shaders/flat/preamble.ts +23 -5
- package/src/render/shaders/flat/worldUv.ts +113 -0
- package/src/render/shaders/generated/ambientOcclusion.wgsl.ts +6 -1
- package/src/render/shaders/generated/flat.wgsl.ts +791 -391
- package/src/render/shaders/generated/globalMedium.wgsl.ts +8 -3
- package/src/render/shaders/generated/lightVolume.wgsl.ts +16 -11
- package/src/render/shaders/globalMedium.ts +9 -1
- package/src/render/shaders/lightVolume.ts +9 -1
- package/src/render/shaders/tangentFrame.ts +16 -3
- package/src/render/skinnedClothRun.ts +138 -38
- package/src/render/surfaceLayers.ts +176 -0
- package/src/render/surfaceOverlay.ts +24 -7
- package/src/render/surfaceProjection.ts +57 -0
- package/src/render/surfaceTexture.ts +39 -0
- package/src/render/transmission.ts +27 -0
- package/src/render/vertexPacking.ts +109 -0
- package/src/ui/splash.ts +83 -14
- package/dist/render/backend/webgpu/gpuSkinnedCloth.d.ts +0 -74
- package/dist/render/backend/webgpu/gpuSkinnedCloth.js +0 -452
- package/src/render/backend/webgpu/gpuSkinnedCloth.ts +0 -502
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Several garments' packs as one set of buffers, so that one dispatch solves a colour of one kind of
|
|
3
|
+
* constraint for every garment at once: `packCloth`'s sections laid end to end, and each kind's
|
|
4
|
+
* records regrouped so a colour of all of them is one range.
|
|
5
|
+
*
|
|
6
|
+
* **Why regrouping by colour keeps each garment's solve.** A batch is a set of constraints that share
|
|
7
|
+
* no movable particle, and two garments share no particle at all, so colour `b` of every garment is
|
|
8
|
+
* still such a set. Each garment's own colours still run in its own order, 0 then 1 then 2, so it is
|
|
9
|
+
* solved exactly as it would be alone: the CPU solver, which steps garments one at a time, is the
|
|
10
|
+
* reference for every one of them.
|
|
11
|
+
*
|
|
12
|
+
* **Every index a record or a static holds is the set's**: a particle is offset by where its garment
|
|
13
|
+
* starts, a joint by where its garment's skin matrices start. A section `packCloth` lays at `s · n`
|
|
14
|
+
* lies at `s · N` here, with a garment's particles at its base inside it, and one more section says
|
|
15
|
+
* which garment each particle is — what a kernel reads its garment's numbers by.
|
|
16
|
+
*
|
|
17
|
+
* **What it gives up**: a colour is dispatched over the most records any garment has in it, so a set
|
|
18
|
+
* of one garment of nine colours and fourteen of three runs nine colours' dispatches for all of them;
|
|
19
|
+
* and a garment joins a set when the set is made, so changing one rebuilds the set.
|
|
20
|
+
*/
|
|
21
|
+
import { CLOTH_STATIC_FLOATS } from './clothSolvePack.js';
|
|
22
|
+
/** Floats of statics a particle in a set: a garment's own, and which garment it is. */
|
|
23
|
+
export const CLOTH_SET_STATIC_FLOATS = CLOTH_STATIC_FLOATS + 1;
|
|
24
|
+
/** `packCloth`'s sections: where each starts, in particle counts, and its floats a particle. */
|
|
25
|
+
const SECTIONS = [
|
|
26
|
+
[0, 1],
|
|
27
|
+
[1, 1],
|
|
28
|
+
[2, 2],
|
|
29
|
+
[4, 2],
|
|
30
|
+
[6, 1],
|
|
31
|
+
[7, 3],
|
|
32
|
+
[10, 3],
|
|
33
|
+
[13, 16],
|
|
34
|
+
];
|
|
35
|
+
/** Where the influences start, and where the garment's index sits, in particle counts. */
|
|
36
|
+
const INFLUENCES = 13;
|
|
37
|
+
const GARMENT = CLOTH_STATIC_FLOATS;
|
|
38
|
+
export function packClothSet(packs) {
|
|
39
|
+
const garments = [];
|
|
40
|
+
let count = 0;
|
|
41
|
+
let joints = 0;
|
|
42
|
+
let colliders = 0;
|
|
43
|
+
for (const pack of packs) {
|
|
44
|
+
garments.push({
|
|
45
|
+
particleBase: count,
|
|
46
|
+
count: pack.count,
|
|
47
|
+
jointBase: joints,
|
|
48
|
+
joints: pack.joints,
|
|
49
|
+
colliderBase: colliders,
|
|
50
|
+
colliders: pack.colliders,
|
|
51
|
+
limits: pack.limits,
|
|
52
|
+
rigged: pack.rigged,
|
|
53
|
+
});
|
|
54
|
+
count += pack.count;
|
|
55
|
+
joints += pack.joints;
|
|
56
|
+
colliders += pack.colliders;
|
|
57
|
+
}
|
|
58
|
+
const statics = new Float32Array(count * CLOTH_SET_STATIC_FLOATS);
|
|
59
|
+
packs.forEach((pack, g) => {
|
|
60
|
+
const { particleBase: base, count: n, jointBase } = garments[g];
|
|
61
|
+
for (const [start, stride] of SECTIONS) {
|
|
62
|
+
const from = pack.statics.subarray(start * n, (start + stride) * n);
|
|
63
|
+
statics.set(from, start * count + base * stride);
|
|
64
|
+
}
|
|
65
|
+
/* Each influence's joint, the set's: four joints, four weights, four joints, four weights. */
|
|
66
|
+
for (let i = 0; i < n; i++) {
|
|
67
|
+
const at = INFLUENCES * count + (base + i) * 16;
|
|
68
|
+
for (let k = 0; k < 4; k++) {
|
|
69
|
+
statics[at + k] = statics[at + k] + jointBase;
|
|
70
|
+
statics[at + 8 + k] = statics[at + 8 + k] + jointBase;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
statics.fill(g, GARMENT * count + base, GARMENT * count + base + n);
|
|
74
|
+
});
|
|
75
|
+
const distances = sum(packs, (pack) => pack.distances);
|
|
76
|
+
const bendings = sum(packs, (pack) => pack.bendings);
|
|
77
|
+
const tethers = sum(packs, (pack) => pack.tethers);
|
|
78
|
+
const constraints = new Uint32Array(distances * 4 + bendings * 6 + tethers * 3);
|
|
79
|
+
/* Each kind: where its records start, a record's words, how many of them are particles. */
|
|
80
|
+
const distanceBatches = regroup(packs, garments, constraints, 0, 4, 2, 'distanceBatches');
|
|
81
|
+
const bendingStart = distances * 4;
|
|
82
|
+
const bendingBatches = regroup(packs, garments, constraints, bendingStart, 6, 4, 'bendingBatches');
|
|
83
|
+
const tetherStart = bendingStart + bendings * 6;
|
|
84
|
+
const tetherBatches = regroup(packs, garments, constraints, tetherStart, 3, 2, 'tetherBatches');
|
|
85
|
+
return {
|
|
86
|
+
count,
|
|
87
|
+
statics,
|
|
88
|
+
constraints,
|
|
89
|
+
distances,
|
|
90
|
+
bendings,
|
|
91
|
+
tethers,
|
|
92
|
+
distanceBatches,
|
|
93
|
+
bendingBatches,
|
|
94
|
+
tetherBatches,
|
|
95
|
+
joints,
|
|
96
|
+
colliders,
|
|
97
|
+
garments,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function sum(packs, of) {
|
|
101
|
+
let total = 0;
|
|
102
|
+
for (const pack of packs)
|
|
103
|
+
total += of(pack);
|
|
104
|
+
return total;
|
|
105
|
+
}
|
|
106
|
+
/** Where one kind's records start in a garment's own pack, in words. */
|
|
107
|
+
function kindStart(pack, kind) {
|
|
108
|
+
if (kind === 'distanceBatches')
|
|
109
|
+
return 0;
|
|
110
|
+
if (kind === 'bendingBatches')
|
|
111
|
+
return pack.distances * 4;
|
|
112
|
+
return pack.distances * 4 + pack.bendings * 6;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* One kind's records, colour by colour and within a colour garment by garment, into `out` from
|
|
116
|
+
* `start`; each record's first `ids` words offset by its garment's first particle. The set's colours.
|
|
117
|
+
*/
|
|
118
|
+
function regroup(packs, garments, out, start, words, ids, kind) {
|
|
119
|
+
let colours = 0;
|
|
120
|
+
for (const pack of packs)
|
|
121
|
+
colours = Math.max(colours, pack[kind].length - 1);
|
|
122
|
+
const batches = new Uint32Array(colours + 1);
|
|
123
|
+
let record = 0;
|
|
124
|
+
for (let b = 0; b < colours; b++) {
|
|
125
|
+
packs.forEach((pack, g) => {
|
|
126
|
+
const own = pack[kind];
|
|
127
|
+
if (b + 1 >= own.length)
|
|
128
|
+
return;
|
|
129
|
+
const base = garments[g].particleBase;
|
|
130
|
+
const from = kindStart(pack, kind);
|
|
131
|
+
for (let r = own[b]; r < own[b + 1]; r++) {
|
|
132
|
+
const src = from + r * words;
|
|
133
|
+
const dst = start + record * words;
|
|
134
|
+
for (let w = 0; w < words; w++) {
|
|
135
|
+
const word = pack.constraints[src + w];
|
|
136
|
+
out[dst + w] = w < ids ? word + base : word;
|
|
137
|
+
}
|
|
138
|
+
record++;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
batches[b + 1] = record;
|
|
142
|
+
}
|
|
143
|
+
return batches;
|
|
144
|
+
}
|
|
@@ -26,6 +26,8 @@ export interface DrawCommand {
|
|
|
26
26
|
readonly vertexBuffers: (GPUBuffer | null)[];
|
|
27
27
|
vertexCount: number;
|
|
28
28
|
indexBuffer: GPUBuffer | null;
|
|
29
|
+
/** How wide an index of `indexBuffer` is: a mesh's own, thirty-two bits for everything else. */
|
|
30
|
+
indexFormat: GPUIndexFormat;
|
|
29
31
|
indexed: boolean;
|
|
30
32
|
count: number;
|
|
31
33
|
instances: number;
|
|
@@ -294,7 +294,7 @@ skinPass?: SkinHalf,
|
|
|
294
294
|
*/
|
|
295
295
|
reflectionSurface?: boolean,
|
|
296
296
|
/** An instanced pipeline that plays a bone animation. The key must carry it: `|anim`. */
|
|
297
|
-
animated?: boolean): GPURenderPipeline;
|
|
297
|
+
animated?: boolean): GPURenderPipeline | null;
|
|
298
298
|
/**
|
|
299
299
|
* The same pipeline, compiled off the main thread.
|
|
300
300
|
*
|
|
@@ -625,7 +625,8 @@ skinPass = 'whole',
|
|
|
625
625
|
reflectionSurface = false,
|
|
626
626
|
/** An instanced pipeline that plays a bone animation. The key must carry it: `|anim`. */
|
|
627
627
|
animated = false) {
|
|
628
|
-
|
|
628
|
+
/* None where draws skip a compile and this one has not landed: see `PipelineCache.lit`. */
|
|
629
|
+
return cache.lit(key, () => flatDescriptor(cache, device, layout, variant, key, present, translucent, skinned, morphed, depthWrite, depthLayer, instanced, oit, doubleSided, alphaToCoverage, skinEight, cloth, model, skinPass, reflectionSurface, animated));
|
|
629
630
|
}
|
|
630
631
|
/**
|
|
631
632
|
* The same pipeline, compiled off the main thread.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { SkinnedClothSetup } from '@driftengine/physics';
|
|
2
|
+
import { GpuClothParticles } from './clothTextures.ts';
|
|
3
|
+
export declare class GpuClothSet {
|
|
4
|
+
private readonly device;
|
|
5
|
+
private readonly garments;
|
|
6
|
+
private readonly packed;
|
|
7
|
+
private readonly kernels;
|
|
8
|
+
private readonly buffers;
|
|
9
|
+
private readonly state;
|
|
10
|
+
private readonly frameData;
|
|
11
|
+
private readonly paces;
|
|
12
|
+
private readonly group;
|
|
13
|
+
/** One round's records, every garment's: the head an op's, the rest each garment's own. */
|
|
14
|
+
private readonly staging;
|
|
15
|
+
private readonly stagingWords;
|
|
16
|
+
private readonly stagingFloats;
|
|
17
|
+
/** Each kind's first batch slot, and the first garment's publishing slot. */
|
|
18
|
+
private readonly batchSlot;
|
|
19
|
+
private readonly groups;
|
|
20
|
+
private readonly substeps;
|
|
21
|
+
private readonly iterations;
|
|
22
|
+
private encoder;
|
|
23
|
+
private pass;
|
|
24
|
+
private round;
|
|
25
|
+
constructor(device: GPUDevice, setups: readonly SkinnedClothSetup[]);
|
|
26
|
+
/** How many garments the set holds. */
|
|
27
|
+
get size(): number;
|
|
28
|
+
/** Garment `g`'s particles, what `setCloth` draws its bound meshes by. */
|
|
29
|
+
particles(g: number): GpuClothParticles;
|
|
30
|
+
/** Garment `g`'s rig for the steps to come; see `ClothControl.setPose`. */
|
|
31
|
+
setPose(g: number, globals: Float32Array, model: Float32Array): void;
|
|
32
|
+
/** The frame's sample of the scene's wind for garment `g`. See `SkinnedCloth.setWind`. */
|
|
33
|
+
setWind(g: number, x: number, y: number, z: number): void;
|
|
34
|
+
/** Garment `g` back to its skinned pose, settled; the next `step` publishes it. */
|
|
35
|
+
reset(g: number): void;
|
|
36
|
+
/**
|
|
37
|
+
* `dt` of the caller's time in whole fixed steps for every garment, and each garment's particles
|
|
38
|
+
* at its `alpha` published for the draws that follow, as the particles of `frame`.
|
|
39
|
+
*/
|
|
40
|
+
step(dt: number, frame: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Garment `g`'s particles where its last step left them, three floats each: for the parity check,
|
|
43
|
+
* which compares them with the CPU solver's positions. Not for a frame — it waits on the device.
|
|
44
|
+
*/
|
|
45
|
+
read(g: number): Promise<Float32Array>;
|
|
46
|
+
/** Its buffers; the particle textures are the renderer's to retire with the frame. */
|
|
47
|
+
dispose(): void;
|
|
48
|
+
private at;
|
|
49
|
+
/** Garment `g`: its schedule over a device that queues, its particles and its own numbers. */
|
|
50
|
+
private garment;
|
|
51
|
+
/**
|
|
52
|
+
* A garment's own words of its record, which every round carries: its colliders, its texture's
|
|
53
|
+
* width and its constants. Its limits ride in the head beside `live`, written as it joins a round.
|
|
54
|
+
*/
|
|
55
|
+
private writeOwn;
|
|
56
|
+
/** Garments that cannot step together, refused by the first number they disagree on. */
|
|
57
|
+
private refuseStrangers;
|
|
58
|
+
private targetsChanged;
|
|
59
|
+
private queueOp;
|
|
60
|
+
private queueStep;
|
|
61
|
+
/** Every op every garment is waiting on, a round of one kind at a time, in each garment's order. */
|
|
62
|
+
private run;
|
|
63
|
+
/** Whether any garment has `kind` next. */
|
|
64
|
+
private waiting;
|
|
65
|
+
/** One round: every garment with `kind` next takes part, and the rest sit it out. */
|
|
66
|
+
private runRound;
|
|
67
|
+
private stepRound;
|
|
68
|
+
/** Every colour of one kind across the set, in colour order, each a dispatch over its range. */
|
|
69
|
+
private batches;
|
|
70
|
+
private dispatch;
|
|
71
|
+
private passFor;
|
|
72
|
+
/** A round's slot, sending what is recorded first where the slots are spent: its byte offset. */
|
|
73
|
+
private takeRound;
|
|
74
|
+
/** Where the records of the round at `roundAt` sit in `paces`. */
|
|
75
|
+
private paceOffset;
|
|
76
|
+
/** Send what has been recorded: every slot it reads was written ahead of it on the queue. */
|
|
77
|
+
private flush;
|
|
78
|
+
/** A garment's skin matrices — or its model, with no rig — and its colliders, into the set's. */
|
|
79
|
+
private writeFrameData;
|
|
80
|
+
}
|