@aardworx/wombat.rendering 0.8.1 → 0.9.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/dist/core/command.d.ts +7 -9
- package/dist/core/command.d.ts.map +1 -1
- package/dist/core/renderTask.d.ts +64 -1
- package/dist/core/renderTask.d.ts.map +1 -1
- package/dist/core/renderTask.js +3 -1
- package/dist/core/renderTask.js.map +1 -1
- package/dist/resources/preparedRenderObject.js +3 -3
- package/dist/resources/preparedRenderObject.js.map +1 -1
- package/dist/resources/uniformBuffer.d.ts.map +1 -1
- package/dist/resources/uniformBuffer.js +17 -0
- package/dist/resources/uniformBuffer.js.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.d.ts +105 -0
- package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/dispatch.js +355 -0
- package/dist/runtime/derivedUniforms/dispatch.js.map +1 -0
- package/dist/runtime/derivedUniforms/index.d.ts +6 -0
- package/dist/runtime/derivedUniforms/index.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/index.js +26 -0
- package/dist/runtime/derivedUniforms/index.js.map +1 -0
- package/dist/runtime/derivedUniforms/recipes.d.ts +42 -0
- package/dist/runtime/derivedUniforms/recipes.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/recipes.js +134 -0
- package/dist/runtime/derivedUniforms/recipes.js.map +1 -0
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +56 -0
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/sceneIntegration.js +171 -0
- package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -0
- package/dist/runtime/derivedUniforms/slotId.d.ts +15 -0
- package/dist/runtime/derivedUniforms/slotId.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/slotId.js +30 -0
- package/dist/runtime/derivedUniforms/slotId.js.map +1 -0
- package/dist/runtime/derivedUniforms/slots.d.ts +49 -0
- package/dist/runtime/derivedUniforms/slots.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/slots.js +123 -0
- package/dist/runtime/derivedUniforms/slots.js.map +1 -0
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts +13 -0
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.js +218 -0
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.js.map +1 -0
- package/dist/runtime/flattenTree.d.ts +5 -0
- package/dist/runtime/flattenTree.d.ts.map +1 -0
- package/dist/runtime/flattenTree.js +45 -0
- package/dist/runtime/flattenTree.js.map +1 -0
- package/dist/runtime/heapAdapter.d.ts +16 -0
- package/dist/runtime/heapAdapter.d.ts.map +1 -0
- package/dist/runtime/heapAdapter.js +263 -0
- package/dist/runtime/heapAdapter.js.map +1 -0
- package/dist/runtime/heapEffect.d.ts +235 -0
- package/dist/runtime/heapEffect.d.ts.map +1 -0
- package/dist/runtime/heapEffect.js +529 -0
- package/dist/runtime/heapEffect.js.map +1 -0
- package/dist/runtime/heapEffectIR.d.ts +34 -0
- package/dist/runtime/heapEffectIR.d.ts.map +1 -0
- package/dist/runtime/heapEffectIR.js +1161 -0
- package/dist/runtime/heapEffectIR.js.map +1 -0
- package/dist/runtime/heapEligibility.d.ts +9 -0
- package/dist/runtime/heapEligibility.d.ts.map +1 -0
- package/dist/runtime/heapEligibility.js +195 -0
- package/dist/runtime/heapEligibility.js.map +1 -0
- package/dist/runtime/heapScene.d.ts +240 -31
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +3334 -265
- package/dist/runtime/heapScene.js.map +1 -1
- package/dist/runtime/heapShaderFamily.d.ts +132 -0
- package/dist/runtime/heapShaderFamily.d.ts.map +1 -0
- package/dist/runtime/heapShaderFamily.js +866 -0
- package/dist/runtime/heapShaderFamily.js.map +1 -0
- package/dist/runtime/hybridScene.d.ts +133 -0
- package/dist/runtime/hybridScene.d.ts.map +1 -0
- package/dist/runtime/hybridScene.js +159 -0
- package/dist/runtime/hybridScene.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +9 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderTask.d.ts +21 -4
- package/dist/runtime/renderTask.d.ts.map +1 -1
- package/dist/runtime/renderTask.js +127 -32
- package/dist/runtime/renderTask.js.map +1 -1
- package/dist/runtime/runtime.d.ts +33 -3
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +12 -3
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/scenePass.d.ts +28 -3
- package/dist/runtime/scenePass.d.ts.map +1 -1
- package/dist/runtime/scenePass.js +37 -4
- package/dist/runtime/scenePass.js.map +1 -1
- package/dist/runtime/textureAtlas/atlasMipGutterKernel.d.ts +35 -0
- package/dist/runtime/textureAtlas/atlasMipGutterKernel.d.ts.map +1 -0
- package/dist/runtime/textureAtlas/atlasMipGutterKernel.js +247 -0
- package/dist/runtime/textureAtlas/atlasMipGutterKernel.js.map +1 -0
- package/dist/runtime/textureAtlas/atlasPool.d.ts +240 -0
- package/dist/runtime/textureAtlas/atlasPool.d.ts.map +1 -0
- package/dist/runtime/textureAtlas/atlasPool.js +798 -0
- package/dist/runtime/textureAtlas/atlasPool.js.map +1 -0
- package/dist/runtime/textureAtlas/bvhTree2d.d.ts +33 -0
- package/dist/runtime/textureAtlas/bvhTree2d.d.ts.map +1 -0
- package/dist/runtime/textureAtlas/bvhTree2d.js +501 -0
- package/dist/runtime/textureAtlas/bvhTree2d.js.map +1 -0
- package/dist/runtime/textureAtlas/packer.d.ts +50 -0
- package/dist/runtime/textureAtlas/packer.d.ts.map +1 -0
- package/dist/runtime/textureAtlas/packer.js +390 -0
- package/dist/runtime/textureAtlas/packer.js.map +1 -0
- package/dist/window/loop.d.ts +14 -0
- package/dist/window/loop.d.ts.map +1 -1
- package/dist/window/loop.js +18 -5
- package/dist/window/loop.js.map +1 -1
- package/package.json +6 -5
- package/src/core/command.ts +9 -9
- package/src/core/renderTask.ts +55 -2
- package/src/resources/preparedRenderObject.ts +3 -3
- package/src/resources/uniformBuffer.ts +15 -0
- package/src/runtime/derivedUniforms/dispatch.ts +407 -0
- package/src/runtime/derivedUniforms/index.ts +52 -0
- package/src/runtime/derivedUniforms/recipes.ts +159 -0
- package/src/runtime/derivedUniforms/sceneIntegration.ts +239 -0
- package/src/runtime/derivedUniforms/slotId.ts +35 -0
- package/src/runtime/derivedUniforms/slots.ts +155 -0
- package/src/runtime/derivedUniforms/uberKernel.wgsl.ts +220 -0
- package/src/runtime/flattenTree.ts +46 -0
- package/src/runtime/heapAdapter.ts +314 -0
- package/src/runtime/heapEffect.ts +728 -0
- package/src/runtime/heapEffectIR.ts +1211 -0
- package/src/runtime/heapEligibility.ts +189 -0
- package/src/runtime/heapScene.ts +3981 -349
- package/src/runtime/heapShaderFamily.ts +1102 -0
- package/src/runtime/hybridScene.ts +310 -0
- package/src/runtime/index.ts +45 -1
- package/src/runtime/renderTask.ts +167 -32
- package/src/runtime/runtime.ts +37 -4
- package/src/runtime/scenePass.ts +39 -4
- package/src/runtime/textureAtlas/atlasMipGutterKernel.ts +291 -0
- package/src/runtime/textureAtlas/atlasPool.ts +991 -0
- package/src/runtime/textureAtlas/bvhTree2d.ts +530 -0
- package/src/runtime/textureAtlas/packer.ts +429 -0
- package/src/window/loop.ts +32 -6
- package/dist/runtime/heapShader.d.ts +0 -12
- package/dist/runtime/heapShader.d.ts.map +0 -1
- package/dist/runtime/heapShader.js +0 -157
- package/dist/runtime/heapShader.js.map +0 -1
- package/src/runtime/heapShader.ts +0 -185
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
// §7 single-dispatch leaf dispatcher.
|
|
2
|
+
//
|
|
3
|
+
// Each bucket holds a static-ish records buffer (only edited on RO
|
|
4
|
+
// add/remove). Per frame the caller:
|
|
5
|
+
// 1. Drains dirty constituent avals and uploads the changed byte
|
|
6
|
+
// range to the shared constituents buffer.
|
|
7
|
+
// 2. Builds a dirty bitmask (one bit per constituent slot) and
|
|
8
|
+
// uploads it to the shared dirty buffer.
|
|
9
|
+
// 3. For each bucket, calls `dispatcher.encode(enc)` — one
|
|
10
|
+
// compute pass with one dispatch per bucket. The kernel
|
|
11
|
+
// early-returns on records whose inputs are all clean.
|
|
12
|
+
//
|
|
13
|
+
// No worklist building, no atomicAdd compaction, no per-frame record
|
|
14
|
+
// encoding. The records buffer changes only when ROs come and go.
|
|
15
|
+
import { ConstituentSlots, DF32_MAT4_BYTES, } from "./slots.js";
|
|
16
|
+
import { RECORD_STRIDE_BYTES, RECORD_STRIDE_U32, RECORD_FIELD, DERIVED_UBER_KERNEL_WGSL, } from "./uberKernel.wgsl.js";
|
|
17
|
+
/** Per-bucket records buffer. Records are added/removed when ROs
|
|
18
|
+
* enter/leave the bucket. Uses swap-remove to keep the buffer dense.
|
|
19
|
+
* CPU mirror is kept up-to-date; the dirty range is uploaded once
|
|
20
|
+
* per `flush()`. */
|
|
21
|
+
export class RecordsBuffer {
|
|
22
|
+
device;
|
|
23
|
+
cpu;
|
|
24
|
+
cap = 0; // record slots (capacity, in records)
|
|
25
|
+
count = 0; // live records
|
|
26
|
+
nextId = 0;
|
|
27
|
+
slotById = new Map();
|
|
28
|
+
idBySlot = [];
|
|
29
|
+
/** Dirty CPU-mirror byte range that must be uploaded next flush. */
|
|
30
|
+
dirtyMinByte = Infinity;
|
|
31
|
+
dirtyMaxByte = -1;
|
|
32
|
+
gpu;
|
|
33
|
+
gpuCap = 0; // record slots in `gpu`
|
|
34
|
+
constructor(device, initialCapacity = 64) {
|
|
35
|
+
this.device = device;
|
|
36
|
+
this.cap = initialCapacity;
|
|
37
|
+
this.cpu = new Uint32Array(this.cap * RECORD_STRIDE_U32);
|
|
38
|
+
}
|
|
39
|
+
/** Add a record. Returns a stable handle for later removal. */
|
|
40
|
+
add(rec) {
|
|
41
|
+
if (this.count === this.cap)
|
|
42
|
+
this.growCpu();
|
|
43
|
+
const slot = this.count++;
|
|
44
|
+
const id = this.nextId++;
|
|
45
|
+
this.slotById.set(id, slot);
|
|
46
|
+
this.idBySlot[slot] = id;
|
|
47
|
+
this.writeAt(slot, rec);
|
|
48
|
+
return id;
|
|
49
|
+
}
|
|
50
|
+
/** Swap-remove. The last record moves into the freed slot. */
|
|
51
|
+
remove(id) {
|
|
52
|
+
const slot = this.slotById.get(id);
|
|
53
|
+
if (slot === undefined) {
|
|
54
|
+
throw new Error("RecordsBuffer.remove: unknown id");
|
|
55
|
+
}
|
|
56
|
+
const last = this.count - 1;
|
|
57
|
+
if (slot !== last) {
|
|
58
|
+
// Move last → slot.
|
|
59
|
+
const srcOff = last * RECORD_STRIDE_U32;
|
|
60
|
+
const dstOff = slot * RECORD_STRIDE_U32;
|
|
61
|
+
for (let i = 0; i < RECORD_STRIDE_U32; i++) {
|
|
62
|
+
this.cpu[dstOff + i] = this.cpu[srcOff + i];
|
|
63
|
+
}
|
|
64
|
+
const movedId = this.idBySlot[last];
|
|
65
|
+
this.slotById.set(movedId, slot);
|
|
66
|
+
this.idBySlot[slot] = movedId;
|
|
67
|
+
this.markDirty(slot, slot + 1);
|
|
68
|
+
}
|
|
69
|
+
this.slotById.delete(id);
|
|
70
|
+
this.idBySlot.length = last;
|
|
71
|
+
this.count = last;
|
|
72
|
+
}
|
|
73
|
+
/** Live record count. */
|
|
74
|
+
get recordCount() { return this.count; }
|
|
75
|
+
/** Ensure GPU buffer matches cap and upload dirty CPU range. Call
|
|
76
|
+
* before `encode`. */
|
|
77
|
+
flush() {
|
|
78
|
+
if (this.gpu === undefined || this.gpuCap < this.cap) {
|
|
79
|
+
if (this.gpu !== undefined)
|
|
80
|
+
this.gpu.destroy();
|
|
81
|
+
this.gpu = this.device.createBuffer({
|
|
82
|
+
label: "derivedUniforms.records",
|
|
83
|
+
size: this.cap * RECORD_STRIDE_BYTES,
|
|
84
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
85
|
+
});
|
|
86
|
+
this.gpuCap = this.cap;
|
|
87
|
+
// Whole CPU mirror needs re-upload.
|
|
88
|
+
this.dirtyMinByte = 0;
|
|
89
|
+
this.dirtyMaxByte = this.count * RECORD_STRIDE_BYTES;
|
|
90
|
+
}
|
|
91
|
+
if (this.dirtyMaxByte > this.dirtyMinByte) {
|
|
92
|
+
const start = this.dirtyMinByte;
|
|
93
|
+
const end = Math.min(this.dirtyMaxByte, this.count * RECORD_STRIDE_BYTES);
|
|
94
|
+
if (end > start) {
|
|
95
|
+
this.device.queue.writeBuffer(this.gpu, start, this.cpu.buffer, this.cpu.byteOffset + start, end - start);
|
|
96
|
+
}
|
|
97
|
+
this.dirtyMinByte = Infinity;
|
|
98
|
+
this.dirtyMaxByte = -1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
buffer() {
|
|
102
|
+
if (this.gpu === undefined) {
|
|
103
|
+
// Empty bucket — make a tiny stub so binding always has something.
|
|
104
|
+
this.gpu = this.device.createBuffer({
|
|
105
|
+
label: "derivedUniforms.records.stub",
|
|
106
|
+
size: RECORD_STRIDE_BYTES,
|
|
107
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
108
|
+
});
|
|
109
|
+
this.gpuCap = 1;
|
|
110
|
+
}
|
|
111
|
+
return this.gpu;
|
|
112
|
+
}
|
|
113
|
+
dispose() {
|
|
114
|
+
if (this.gpu !== undefined) {
|
|
115
|
+
this.gpu.destroy();
|
|
116
|
+
this.gpu = undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// ── Internals ─────────────────────────────────────────────────────
|
|
120
|
+
writeAt(slot, rec) {
|
|
121
|
+
const off = slot * RECORD_STRIDE_U32;
|
|
122
|
+
this.cpu[off + RECORD_FIELD.recipe_id] = rec.recipe;
|
|
123
|
+
this.cpu[off + RECORD_FIELD.in0] = rec.in0;
|
|
124
|
+
this.cpu[off + RECORD_FIELD.in1] = rec.in1;
|
|
125
|
+
this.cpu[off + RECORD_FIELD.in2] = rec.in2;
|
|
126
|
+
this.cpu[off + RECORD_FIELD.out_byte] = rec.outByte;
|
|
127
|
+
this.markDirty(slot, slot + 1);
|
|
128
|
+
}
|
|
129
|
+
markDirty(startSlot, endSlot) {
|
|
130
|
+
const startByte = startSlot * RECORD_STRIDE_BYTES;
|
|
131
|
+
const endByte = endSlot * RECORD_STRIDE_BYTES;
|
|
132
|
+
if (startByte < this.dirtyMinByte)
|
|
133
|
+
this.dirtyMinByte = startByte;
|
|
134
|
+
if (endByte > this.dirtyMaxByte)
|
|
135
|
+
this.dirtyMaxByte = endByte;
|
|
136
|
+
}
|
|
137
|
+
growCpu() {
|
|
138
|
+
const newCap = this.cap * 2;
|
|
139
|
+
const grown = new Uint32Array(newCap * RECORD_STRIDE_U32);
|
|
140
|
+
grown.set(this.cpu);
|
|
141
|
+
this.cpu = grown;
|
|
142
|
+
this.cap = newCap;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** One compute pipeline shared across buckets — created once per scene. */
|
|
146
|
+
export class DerivedUniformsPipeline {
|
|
147
|
+
pipeline;
|
|
148
|
+
bgl;
|
|
149
|
+
constructor(device) {
|
|
150
|
+
const module = device.createShaderModule({ code: DERIVED_UBER_KERNEL_WGSL });
|
|
151
|
+
this.bgl = device.createBindGroupLayout({
|
|
152
|
+
entries: [
|
|
153
|
+
{ binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: { type: "read-only-storage" } },
|
|
154
|
+
{ binding: 1, visibility: GPUShaderStage.COMPUTE, buffer: { type: "storage" } },
|
|
155
|
+
{ binding: 2, visibility: GPUShaderStage.COMPUTE, buffer: { type: "read-only-storage" } },
|
|
156
|
+
{ binding: 3, visibility: GPUShaderStage.COMPUTE, buffer: { type: "uniform" } },
|
|
157
|
+
],
|
|
158
|
+
});
|
|
159
|
+
this.pipeline = device.createComputePipeline({
|
|
160
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [this.bgl] }),
|
|
161
|
+
compute: { module, entryPoint: "main" },
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** Per-bucket dispatcher. One bind group cached, rebuilt only when a
|
|
166
|
+
* bound buffer reference changes (constituents or main heap grew, or
|
|
167
|
+
* records buffer was re-created). */
|
|
168
|
+
export class DerivedUniformsDispatcher {
|
|
169
|
+
device;
|
|
170
|
+
pipe;
|
|
171
|
+
resources;
|
|
172
|
+
records;
|
|
173
|
+
cachedBg;
|
|
174
|
+
bgKeyConsts;
|
|
175
|
+
bgKeyHeap;
|
|
176
|
+
bgKeyRecs;
|
|
177
|
+
/** Tiny uniform holding the live record count — gates threads past
|
|
178
|
+
* the live range from reading stale swap-removed records. */
|
|
179
|
+
countBuf;
|
|
180
|
+
countCpu = new Uint32Array(1);
|
|
181
|
+
lastCountUploaded = -1;
|
|
182
|
+
constructor(device, pipe, resources, initialRecordCapacity = 64) {
|
|
183
|
+
this.device = device;
|
|
184
|
+
this.pipe = pipe;
|
|
185
|
+
this.resources = resources;
|
|
186
|
+
this.records = new RecordsBuffer(device, initialRecordCapacity);
|
|
187
|
+
this.countBuf = device.createBuffer({
|
|
188
|
+
label: "derivedUniforms.recordCount",
|
|
189
|
+
size: 16, // uniform min size
|
|
190
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/** Dispatch into an open compute pass. Caller is responsible for
|
|
194
|
+
* beginning/ending the pass and setting the pipeline once across
|
|
195
|
+
* all dispatchers (the pipeline is shared). */
|
|
196
|
+
dispatchInto(pass) {
|
|
197
|
+
const count = this.records.recordCount;
|
|
198
|
+
if (count === 0)
|
|
199
|
+
return false;
|
|
200
|
+
this.records.flush();
|
|
201
|
+
if (count !== this.lastCountUploaded) {
|
|
202
|
+
this.countCpu[0] = count;
|
|
203
|
+
this.device.queue.writeBuffer(this.countBuf, 0, this.countCpu.buffer, this.countCpu.byteOffset, 4);
|
|
204
|
+
this.lastCountUploaded = count;
|
|
205
|
+
}
|
|
206
|
+
pass.setBindGroup(0, this.bindGroup());
|
|
207
|
+
pass.dispatchWorkgroups(Math.ceil(count / 64));
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
/** Convenience: open/close a pass and dispatch. Use only when this
|
|
211
|
+
* is the sole dispatcher in the pass; otherwise use `dispatchInto`
|
|
212
|
+
* inside a caller-managed pass. */
|
|
213
|
+
encode(enc) {
|
|
214
|
+
if (this.records.recordCount === 0)
|
|
215
|
+
return false;
|
|
216
|
+
const pass = enc.beginComputePass({ label: "derivedUniforms.uber" });
|
|
217
|
+
pass.setPipeline(this.pipe.pipeline);
|
|
218
|
+
const ran = this.dispatchInto(pass);
|
|
219
|
+
pass.end();
|
|
220
|
+
return ran;
|
|
221
|
+
}
|
|
222
|
+
dispose() {
|
|
223
|
+
this.records.dispose();
|
|
224
|
+
this.countBuf.destroy();
|
|
225
|
+
}
|
|
226
|
+
bindGroup() {
|
|
227
|
+
const consts = this.resources.constituentsBuf();
|
|
228
|
+
const heap = this.resources.mainHeapBuf();
|
|
229
|
+
const recs = this.records.buffer();
|
|
230
|
+
if (this.cachedBg !== undefined &&
|
|
231
|
+
this.bgKeyConsts === consts && this.bgKeyHeap === heap &&
|
|
232
|
+
this.bgKeyRecs === recs) {
|
|
233
|
+
return this.cachedBg;
|
|
234
|
+
}
|
|
235
|
+
this.cachedBg = this.device.createBindGroup({
|
|
236
|
+
layout: this.pipe.bgl,
|
|
237
|
+
entries: [
|
|
238
|
+
{ binding: 0, resource: { buffer: consts } },
|
|
239
|
+
{ binding: 1, resource: { buffer: heap } },
|
|
240
|
+
{ binding: 2, resource: { buffer: recs } },
|
|
241
|
+
{ binding: 3, resource: { buffer: this.countBuf } },
|
|
242
|
+
],
|
|
243
|
+
});
|
|
244
|
+
this.bgKeyConsts = consts;
|
|
245
|
+
this.bgKeyHeap = heap;
|
|
246
|
+
this.bgKeyRecs = recs;
|
|
247
|
+
return this.cachedBg;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** Scene-side helper: O(changed) maintenance of a GPU dirty bitmask.
|
|
251
|
+
*
|
|
252
|
+
* Steady state (clean frame): zero work. The CPU mirror reflects the
|
|
253
|
+
* GPU buffer, so we only ever touch bits that actually flip.
|
|
254
|
+
*
|
|
255
|
+
* Each `upload(dirty)` call:
|
|
256
|
+
* 1. Clears the bits set last frame (O(prev_dirty)).
|
|
257
|
+
* 2. Sets the bits dirty this frame (O(dirty)).
|
|
258
|
+
* 3. Writes only the affected u32 range to the GPU (one writeBuffer).
|
|
259
|
+
* If both sets are empty, returns immediately. */
|
|
260
|
+
export class DirtyMaskUploader {
|
|
261
|
+
device;
|
|
262
|
+
cpu;
|
|
263
|
+
gpu;
|
|
264
|
+
gpuCapU32 = 0;
|
|
265
|
+
/** Bits set on the previous upload — must be cleared next time. */
|
|
266
|
+
prevDirty = [];
|
|
267
|
+
constructor(device, initialU32 = 8) {
|
|
268
|
+
this.device = device;
|
|
269
|
+
this.cpu = new Uint32Array(Math.max(1, initialU32));
|
|
270
|
+
}
|
|
271
|
+
/** Resize CPU + GPU mirrors so they cover `slotCount` bits. */
|
|
272
|
+
ensureCapacity(slotCount) {
|
|
273
|
+
const need = Math.max(1, Math.ceil(slotCount / 32));
|
|
274
|
+
if (need > this.cpu.length) {
|
|
275
|
+
let cap = Math.max(this.cpu.length, 1);
|
|
276
|
+
while (cap < need)
|
|
277
|
+
cap *= 2;
|
|
278
|
+
const grown = new Uint32Array(cap);
|
|
279
|
+
grown.set(this.cpu);
|
|
280
|
+
this.cpu = grown;
|
|
281
|
+
}
|
|
282
|
+
if (this.gpu === undefined || this.gpuCapU32 < need) {
|
|
283
|
+
if (this.gpu !== undefined)
|
|
284
|
+
this.gpu.destroy();
|
|
285
|
+
const cap = this.cpu.length;
|
|
286
|
+
this.gpu = this.device.createBuffer({
|
|
287
|
+
label: "derivedUniforms.dirtyMask",
|
|
288
|
+
size: cap * 4,
|
|
289
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
290
|
+
});
|
|
291
|
+
this.gpuCapU32 = cap;
|
|
292
|
+
// GPU buffer is fresh-zero; CPU mirror should match. Wipe any
|
|
293
|
+
// prevDirty (those bits live in the destroyed buffer).
|
|
294
|
+
this.prevDirty.length = 0;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/** Apply the new dirty set. O(prev_dirty + dirty), no O(slotCount). */
|
|
298
|
+
upload(dirty) {
|
|
299
|
+
let minU32 = Infinity;
|
|
300
|
+
let maxU32 = -Infinity;
|
|
301
|
+
for (const s of this.prevDirty) {
|
|
302
|
+
const i = s >>> 5;
|
|
303
|
+
const b = s & 31;
|
|
304
|
+
this.cpu[i] = (this.cpu[i] & ~(1 << b)) >>> 0;
|
|
305
|
+
if (i < minU32)
|
|
306
|
+
minU32 = i;
|
|
307
|
+
if (i > maxU32)
|
|
308
|
+
maxU32 = i;
|
|
309
|
+
}
|
|
310
|
+
this.prevDirty.length = 0;
|
|
311
|
+
for (const s of dirty) {
|
|
312
|
+
const i = s >>> 5;
|
|
313
|
+
const b = s & 31;
|
|
314
|
+
this.cpu[i] = (this.cpu[i] | (1 << b)) >>> 0;
|
|
315
|
+
if (i < minU32)
|
|
316
|
+
minU32 = i;
|
|
317
|
+
if (i > maxU32)
|
|
318
|
+
maxU32 = i;
|
|
319
|
+
this.prevDirty.push(s);
|
|
320
|
+
}
|
|
321
|
+
if (maxU32 < 0 || maxU32 === -Infinity)
|
|
322
|
+
return;
|
|
323
|
+
const startByte = minU32 * 4;
|
|
324
|
+
const endByte = (maxU32 + 1) * 4;
|
|
325
|
+
this.device.queue.writeBuffer(this.gpu, startByte, this.cpu.buffer, this.cpu.byteOffset + startByte, endByte - startByte);
|
|
326
|
+
}
|
|
327
|
+
buffer() {
|
|
328
|
+
if (this.gpu === undefined)
|
|
329
|
+
this.ensureCapacity(1);
|
|
330
|
+
return this.gpu;
|
|
331
|
+
}
|
|
332
|
+
dispose() {
|
|
333
|
+
if (this.gpu !== undefined) {
|
|
334
|
+
this.gpu.destroy();
|
|
335
|
+
this.gpu = undefined;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/** Upload the dirty constituent value range to the constituents GPU
|
|
340
|
+
* buffer. Helper used by the scene each frame after draining. */
|
|
341
|
+
export function uploadConstituentsRange(device, buf, mirror, dirty) {
|
|
342
|
+
let minSlot = Infinity, maxSlot = -1;
|
|
343
|
+
for (const s of dirty) {
|
|
344
|
+
if (s < minSlot)
|
|
345
|
+
minSlot = s;
|
|
346
|
+
if (s > maxSlot)
|
|
347
|
+
maxSlot = s;
|
|
348
|
+
}
|
|
349
|
+
if (maxSlot < 0)
|
|
350
|
+
return;
|
|
351
|
+
const startByte = minSlot * DF32_MAT4_BYTES;
|
|
352
|
+
const endByte = (maxSlot + 1) * DF32_MAT4_BYTES;
|
|
353
|
+
device.queue.writeBuffer(buf, startByte, mirror.buffer, mirror.byteOffset + startByte, endByte - startByte);
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { RecipeId, ALL_RECIPES, DERIVED_UNIFORM_NAMES, recipeIdByName, recipeName, recipeInputs, recipeInputCount, recipeOutput, type ConstituentRef, type RecipeOutput, } from "./recipes.js";
|
|
2
|
+
export { ConstituentSlots, DF32_MAT4_BYTES, type SlotIndex, type PairedSlots, type DerivationRecord, type SubscribeFn, } from "./slots.js";
|
|
3
|
+
export { DerivedUniformsDispatcher, DerivedUniformsPipeline, RecordsBuffer, uploadConstituentsRange, type DerivedUniformsResources, } from "./dispatch.js";
|
|
4
|
+
export { DerivedUniformsScene, registerRoDerivations, deregisterRoDerivations, isDerivedUniformName, type RoTrafoInputs, type RoDerivedRequest, type RoRegistration, } from "./sceneIntegration.js";
|
|
5
|
+
export { DERIVED_UBER_KERNEL_WGSL, } from "./uberKernel.wgsl.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,QAAQ,EACR,WAAW,EAAE,qBAAqB,EAClC,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EACxE,KAAK,cAAc,EAAE,KAAK,YAAY,GACvC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gBAAgB,EAAE,eAAe,EACjC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,GAC1E,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EAAE,uBAAuB,EAClD,aAAa,EAAE,uBAAuB,EACtC,KAAK,wBAAwB,GAC9B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,wBAAwB,GACzB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// §7 derived-uniforms module — public surface.
|
|
2
|
+
//
|
|
3
|
+
// Caller responsibilities (typically heapScene.ts):
|
|
4
|
+
//
|
|
5
|
+
// 1. Construct one DerivedUniformsScene per heap scene, one
|
|
6
|
+
// DerivedUniformsBucket per render bucket. The scene owns the
|
|
7
|
+
// shared constituents storage buffer + dirty bitmask + pipeline.
|
|
8
|
+
// 2. In the parent scene-object's `inputChanged(t, o)` router, call
|
|
9
|
+
// `scene.routeInputChanged(o)`. Returns true iff o matched.
|
|
10
|
+
// 3. In each RO's add path: `registerRoDerivations(scene, bucket, req)`
|
|
11
|
+
// allocates constituent slots and pushes records into the bucket's
|
|
12
|
+
// records buffer. In remove path: `deregisterRoDerivations(...)`.
|
|
13
|
+
// 4. In the per-frame compute prep, inside the parent sceneObj's
|
|
14
|
+
// `evaluateAlways(token, ...)` scope:
|
|
15
|
+
// const dirty = scene.constituents.pullDirty(token);
|
|
16
|
+
// scene.uploadDirty(dirty);
|
|
17
|
+
// for each bucket: bucket.dispatcher.encode(enc);
|
|
18
|
+
// All steps are O(changed); on clean frames they no-op.
|
|
19
|
+
//
|
|
20
|
+
// Identifying which uniform names are §7-owned: DERIVED_UNIFORM_NAMES.
|
|
21
|
+
export { RecipeId, ALL_RECIPES, DERIVED_UNIFORM_NAMES, recipeIdByName, recipeName, recipeInputs, recipeInputCount, recipeOutput, } from "./recipes.js";
|
|
22
|
+
export { ConstituentSlots, DF32_MAT4_BYTES, } from "./slots.js";
|
|
23
|
+
export { DerivedUniformsDispatcher, DerivedUniformsPipeline, RecordsBuffer, uploadConstituentsRange, } from "./dispatch.js";
|
|
24
|
+
export { DerivedUniformsScene, registerRoDerivations, deregisterRoDerivations, isDerivedUniformName, } from "./sceneIntegration.js";
|
|
25
|
+
export { DERIVED_UBER_KERNEL_WGSL, } from "./uberKernel.wgsl.js";
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,oDAAoD;AACpD,EAAE;AACF,8DAA8D;AAC9D,mEAAmE;AACnE,sEAAsE;AACtE,sEAAsE;AACtE,iEAAiE;AACjE,0EAA0E;AAC1E,wEAAwE;AACxE,uEAAuE;AACvE,mEAAmE;AACnE,2CAA2C;AAC3C,4DAA4D;AAC5D,mCAAmC;AACnC,yDAAyD;AACzD,6DAA6D;AAC7D,EAAE;AACF,uEAAuE;AAEvE,OAAO,EACL,QAAQ,EACR,WAAW,EAAE,qBAAqB,EAClC,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,GAEzE,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gBAAgB,EAAE,eAAe,GAElC,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EAAE,uBAAuB,EAClD,aAAa,EAAE,uBAAuB,GAEvC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GAIrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,wBAAwB,GACzB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Recipe IDs. Numeric values are stable — the kernel switches on them. */
|
|
2
|
+
export declare const enum RecipeId {
|
|
3
|
+
/** Model.fwd → f32 mat4. */
|
|
4
|
+
ModelTrafo = 0,
|
|
5
|
+
/** Model.bwd → f32 mat4. */
|
|
6
|
+
ModelTrafoInv = 1,
|
|
7
|
+
/** (Model.bwd)ᵀ upper-3×3 → f32 mat3. */
|
|
8
|
+
NormalMatrix = 2,
|
|
9
|
+
/** View.fwd · Model.fwd → f32 mat4. */
|
|
10
|
+
ModelViewTrafo = 3,
|
|
11
|
+
/** Model.bwd · View.bwd → f32 mat4. */
|
|
12
|
+
ModelViewTrafoInv = 4,
|
|
13
|
+
/** Proj.fwd · View.fwd · Model.fwd → f32 mat4. */
|
|
14
|
+
ModelViewProjTrafo = 5,
|
|
15
|
+
/** Model.bwd · View.bwd · Proj.bwd → f32 mat4. */
|
|
16
|
+
ModelViewProjTrafoInv = 6,
|
|
17
|
+
/** View.fwd → f32 mat4. */
|
|
18
|
+
ViewTrafo = 7,
|
|
19
|
+
/** View.bwd → f32 mat4. */
|
|
20
|
+
ViewTrafoInv = 8,
|
|
21
|
+
/** Proj.fwd · View.fwd → f32 mat4. */
|
|
22
|
+
ViewProjTrafo = 9,
|
|
23
|
+
/** View.bwd · Proj.bwd → f32 mat4. */
|
|
24
|
+
ViewProjTrafoInv = 10,
|
|
25
|
+
/** Proj.fwd → f32 mat4. */
|
|
26
|
+
ProjTrafo = 11,
|
|
27
|
+
/** Proj.bwd → f32 mat4. */
|
|
28
|
+
ProjTrafoInv = 12
|
|
29
|
+
}
|
|
30
|
+
export declare function recipeInputCount(id: RecipeId): 1 | 2 | 3;
|
|
31
|
+
/** Output shape — drives drawHeader byte allocation. */
|
|
32
|
+
export type RecipeOutput = "mat4" | "mat3";
|
|
33
|
+
export declare function recipeOutput(id: RecipeId): RecipeOutput;
|
|
34
|
+
/** Which side (forward/backward) of which Trafo3d each input slot draws from. */
|
|
35
|
+
export type ConstituentRef = "Model.fwd" | "Model.bwd" | "View.fwd" | "View.bwd" | "Proj.fwd" | "Proj.bwd";
|
|
36
|
+
export declare function recipeInputs(id: RecipeId): readonly ConstituentRef[];
|
|
37
|
+
/** All recipe IDs in switch order. */
|
|
38
|
+
export declare const ALL_RECIPES: readonly RecipeId[];
|
|
39
|
+
export declare const DERIVED_UNIFORM_NAMES: ReadonlySet<string>;
|
|
40
|
+
export declare function recipeIdByName(name: string): RecipeId | undefined;
|
|
41
|
+
export declare function recipeName(id: RecipeId): string;
|
|
42
|
+
//# sourceMappingURL=recipes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/recipes.ts"],"names":[],"mappings":"AAcA,2EAA2E;AAC3E,0BAAkB,QAAQ;IACxB,4BAA4B;IAC5B,UAAU,IAAe;IACzB,4BAA4B;IAC5B,aAAa,IAAY;IACzB,yCAAyC;IACzC,YAAY,IAAa;IAEzB,uCAAuC;IACvC,cAAc,IAAW;IACzB,uCAAuC;IACvC,iBAAiB,IAAQ;IACzB,kDAAkD;IAClD,kBAAkB,IAAO;IACzB,kDAAkD;IAClD,qBAAqB,IAAI;IAEzB,2BAA2B;IAC3B,SAAS,IAAgB;IACzB,2BAA2B;IAC3B,YAAY,IAAa;IACzB,sCAAsC;IACtC,aAAa,IAAY;IACzB,sCAAsC;IACtC,gBAAgB,KAAU;IAC1B,2BAA2B;IAC3B,SAAS,KAAiB;IAC1B,2BAA2B;IAC3B,YAAY,KAAc;CAC3B;AAmBD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAExD;AAED,wDAAwD;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAkB3C,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,YAAY,CAEvD;AAED,iFAAiF;AACjF,MAAM,MAAM,cAAc,GACtB,WAAW,GAAG,WAAW,GACzB,UAAU,GAAI,UAAU,GACxB,UAAU,GAAI,UAAU,CAAC;AAoB7B,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,cAAc,EAAE,CAEpE;AAmBD,sCAAsC;AACtC,eAAO,MAAM,WAAW,EAAE,SAAS,QAAQ,EAO1C,CAAC;AAMF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CACZ,CAAC;AAE3C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEjE;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// §7 derived-uniform recipe table — leaf-only flavour.
|
|
2
|
+
//
|
|
3
|
+
// Every recipe is a self-contained leaf: reads constituents directly,
|
|
4
|
+
// computes inline (one or two df32 muls + collapse), writes the final
|
|
5
|
+
// f32 mat4/mat3 to the main heap drawHeader. No intermediates, no
|
|
6
|
+
// layering, no dependents graph.
|
|
7
|
+
//
|
|
8
|
+
// Two consumers of the same df32 product (e.g. ModelViewTrafo and
|
|
9
|
+
// ModelViewProjTrafo for the same RO) recompute Model·View twice —
|
|
10
|
+
// trivial vs the encode-time savings of one flat dispatch.
|
|
11
|
+
//
|
|
12
|
+
// All df32 math runs through the verified primitives in
|
|
13
|
+
// uberKernel.wgsl.ts; the final consumer-facing values are f32.
|
|
14
|
+
/** Recipe IDs. Numeric values are stable — the kernel switches on them. */
|
|
15
|
+
export var RecipeId;
|
|
16
|
+
(function (RecipeId) {
|
|
17
|
+
/** Model.fwd → f32 mat4. */
|
|
18
|
+
RecipeId[RecipeId["ModelTrafo"] = 0] = "ModelTrafo";
|
|
19
|
+
/** Model.bwd → f32 mat4. */
|
|
20
|
+
RecipeId[RecipeId["ModelTrafoInv"] = 1] = "ModelTrafoInv";
|
|
21
|
+
/** (Model.bwd)ᵀ upper-3×3 → f32 mat3. */
|
|
22
|
+
RecipeId[RecipeId["NormalMatrix"] = 2] = "NormalMatrix";
|
|
23
|
+
/** View.fwd · Model.fwd → f32 mat4. */
|
|
24
|
+
RecipeId[RecipeId["ModelViewTrafo"] = 3] = "ModelViewTrafo";
|
|
25
|
+
/** Model.bwd · View.bwd → f32 mat4. */
|
|
26
|
+
RecipeId[RecipeId["ModelViewTrafoInv"] = 4] = "ModelViewTrafoInv";
|
|
27
|
+
/** Proj.fwd · View.fwd · Model.fwd → f32 mat4. */
|
|
28
|
+
RecipeId[RecipeId["ModelViewProjTrafo"] = 5] = "ModelViewProjTrafo";
|
|
29
|
+
/** Model.bwd · View.bwd · Proj.bwd → f32 mat4. */
|
|
30
|
+
RecipeId[RecipeId["ModelViewProjTrafoInv"] = 6] = "ModelViewProjTrafoInv";
|
|
31
|
+
/** View.fwd → f32 mat4. */
|
|
32
|
+
RecipeId[RecipeId["ViewTrafo"] = 7] = "ViewTrafo";
|
|
33
|
+
/** View.bwd → f32 mat4. */
|
|
34
|
+
RecipeId[RecipeId["ViewTrafoInv"] = 8] = "ViewTrafoInv";
|
|
35
|
+
/** Proj.fwd · View.fwd → f32 mat4. */
|
|
36
|
+
RecipeId[RecipeId["ViewProjTrafo"] = 9] = "ViewProjTrafo";
|
|
37
|
+
/** View.bwd · Proj.bwd → f32 mat4. */
|
|
38
|
+
RecipeId[RecipeId["ViewProjTrafoInv"] = 10] = "ViewProjTrafoInv";
|
|
39
|
+
/** Proj.fwd → f32 mat4. */
|
|
40
|
+
RecipeId[RecipeId["ProjTrafo"] = 11] = "ProjTrafo";
|
|
41
|
+
/** Proj.bwd → f32 mat4. */
|
|
42
|
+
RecipeId[RecipeId["ProjTrafoInv"] = 12] = "ProjTrafoInv";
|
|
43
|
+
})(RecipeId || (RecipeId = {}));
|
|
44
|
+
/** Number of constituent inputs each recipe consumes (1, 2, or 3). */
|
|
45
|
+
const INPUT_COUNT = {
|
|
46
|
+
[RecipeId.ModelTrafo]: 1,
|
|
47
|
+
[RecipeId.ModelTrafoInv]: 1,
|
|
48
|
+
[RecipeId.NormalMatrix]: 1,
|
|
49
|
+
[RecipeId.ModelViewTrafo]: 2,
|
|
50
|
+
[RecipeId.ModelViewTrafoInv]: 2,
|
|
51
|
+
[RecipeId.ModelViewProjTrafo]: 3,
|
|
52
|
+
[RecipeId.ModelViewProjTrafoInv]: 3,
|
|
53
|
+
[RecipeId.ViewTrafo]: 1,
|
|
54
|
+
[RecipeId.ViewTrafoInv]: 1,
|
|
55
|
+
[RecipeId.ViewProjTrafo]: 2,
|
|
56
|
+
[RecipeId.ViewProjTrafoInv]: 2,
|
|
57
|
+
[RecipeId.ProjTrafo]: 1,
|
|
58
|
+
[RecipeId.ProjTrafoInv]: 1,
|
|
59
|
+
};
|
|
60
|
+
export function recipeInputCount(id) {
|
|
61
|
+
return INPUT_COUNT[id];
|
|
62
|
+
}
|
|
63
|
+
const OUTPUT = {
|
|
64
|
+
[RecipeId.ModelTrafo]: "mat4",
|
|
65
|
+
[RecipeId.ModelTrafoInv]: "mat4",
|
|
66
|
+
[RecipeId.NormalMatrix]: "mat3",
|
|
67
|
+
[RecipeId.ModelViewTrafo]: "mat4",
|
|
68
|
+
[RecipeId.ModelViewTrafoInv]: "mat4",
|
|
69
|
+
[RecipeId.ModelViewProjTrafo]: "mat4",
|
|
70
|
+
[RecipeId.ModelViewProjTrafoInv]: "mat4",
|
|
71
|
+
[RecipeId.ViewTrafo]: "mat4",
|
|
72
|
+
[RecipeId.ViewTrafoInv]: "mat4",
|
|
73
|
+
[RecipeId.ViewProjTrafo]: "mat4",
|
|
74
|
+
[RecipeId.ViewProjTrafoInv]: "mat4",
|
|
75
|
+
[RecipeId.ProjTrafo]: "mat4",
|
|
76
|
+
[RecipeId.ProjTrafoInv]: "mat4",
|
|
77
|
+
};
|
|
78
|
+
export function recipeOutput(id) {
|
|
79
|
+
return OUTPUT[id];
|
|
80
|
+
}
|
|
81
|
+
const INPUTS = {
|
|
82
|
+
[RecipeId.ModelTrafo]: ["Model.fwd"],
|
|
83
|
+
[RecipeId.ModelTrafoInv]: ["Model.bwd"],
|
|
84
|
+
[RecipeId.NormalMatrix]: ["Model.bwd"],
|
|
85
|
+
// df_mul args are ordered (outer, inner) so the math product
|
|
86
|
+
// matches Aardvark's `View.mul(Model).forward = View.fwd · Model.fwd`.
|
|
87
|
+
[RecipeId.ModelViewTrafo]: ["View.fwd", "Model.fwd"],
|
|
88
|
+
[RecipeId.ModelViewTrafoInv]: ["Model.bwd", "View.bwd"],
|
|
89
|
+
[RecipeId.ModelViewProjTrafo]: ["Proj.fwd", "View.fwd", "Model.fwd"],
|
|
90
|
+
[RecipeId.ModelViewProjTrafoInv]: ["Model.bwd", "View.bwd", "Proj.bwd"],
|
|
91
|
+
[RecipeId.ViewTrafo]: ["View.fwd"],
|
|
92
|
+
[RecipeId.ViewTrafoInv]: ["View.bwd"],
|
|
93
|
+
[RecipeId.ViewProjTrafo]: ["Proj.fwd", "View.fwd"],
|
|
94
|
+
[RecipeId.ViewProjTrafoInv]: ["View.bwd", "Proj.bwd"],
|
|
95
|
+
[RecipeId.ProjTrafo]: ["Proj.fwd"],
|
|
96
|
+
[RecipeId.ProjTrafoInv]: ["Proj.bwd"],
|
|
97
|
+
};
|
|
98
|
+
export function recipeInputs(id) {
|
|
99
|
+
return INPUTS[id];
|
|
100
|
+
}
|
|
101
|
+
/** Public uniform name (one per recipe). */
|
|
102
|
+
const NAME = {
|
|
103
|
+
[RecipeId.ModelTrafo]: "ModelTrafo",
|
|
104
|
+
[RecipeId.ModelTrafoInv]: "ModelTrafoInv",
|
|
105
|
+
[RecipeId.NormalMatrix]: "NormalMatrix",
|
|
106
|
+
[RecipeId.ModelViewTrafo]: "ModelViewTrafo",
|
|
107
|
+
[RecipeId.ModelViewTrafoInv]: "ModelViewTrafoInv",
|
|
108
|
+
[RecipeId.ModelViewProjTrafo]: "ModelViewProjTrafo",
|
|
109
|
+
[RecipeId.ModelViewProjTrafoInv]: "ModelViewProjTrafoInv",
|
|
110
|
+
[RecipeId.ViewTrafo]: "ViewTrafo",
|
|
111
|
+
[RecipeId.ViewTrafoInv]: "ViewTrafoInv",
|
|
112
|
+
[RecipeId.ViewProjTrafo]: "ViewProjTrafo",
|
|
113
|
+
[RecipeId.ViewProjTrafoInv]: "ViewProjTrafoInv",
|
|
114
|
+
[RecipeId.ProjTrafo]: "ProjTrafo",
|
|
115
|
+
[RecipeId.ProjTrafoInv]: "ProjTrafoInv",
|
|
116
|
+
};
|
|
117
|
+
/** All recipe IDs in switch order. */
|
|
118
|
+
export const ALL_RECIPES = [
|
|
119
|
+
RecipeId.ModelTrafo, RecipeId.ModelTrafoInv, RecipeId.NormalMatrix,
|
|
120
|
+
RecipeId.ModelViewTrafo, RecipeId.ModelViewTrafoInv,
|
|
121
|
+
RecipeId.ModelViewProjTrafo, RecipeId.ModelViewProjTrafoInv,
|
|
122
|
+
RecipeId.ViewTrafo, RecipeId.ViewTrafoInv,
|
|
123
|
+
RecipeId.ViewProjTrafo, RecipeId.ViewProjTrafoInv,
|
|
124
|
+
RecipeId.ProjTrafo, RecipeId.ProjTrafoInv,
|
|
125
|
+
];
|
|
126
|
+
const BY_NAME = new Map(ALL_RECIPES.map(id => [NAME[id], id]));
|
|
127
|
+
export const DERIVED_UNIFORM_NAMES = new Set(ALL_RECIPES.map(id => NAME[id]));
|
|
128
|
+
export function recipeIdByName(name) {
|
|
129
|
+
return BY_NAME.get(name);
|
|
130
|
+
}
|
|
131
|
+
export function recipeName(id) {
|
|
132
|
+
return NAME[id];
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=recipes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/recipes.ts"],"names":[],"mappings":"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"}
|