shadertown 0.7.0 → 0.8.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/generated/sources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/generated/sources.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,4EAA4E;AAC5E,oEAAoE;AAEpE,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,aAAa,EAAE,i6SAAi6S;IACh7S,OAAO,EAAE,qlZAAqlZ;IAC9lZ,QAAQ,EAAE,6+PAA6+P;IACv/P,QAAQ,EAAE,6gWAA6gW;IACvhW,OAAO,EAAE,+tXAA+tX;IACxuX,SAAS,EAAE,ysVAAysV;IACptV,OAAO,EAAE,ihQAAihQ;IAC1hQ,SAAS,EAAE,qoUAAqoU;IAChpU,UAAU,EAAE,+kQAA+kQ;IAC3lQ,SAAS,EAAE,89pBAA89pB;IACz+pB,OAAO,EAAE,kyoBAAkyoB;IAC3yoB,SAAS,EAAE,i6SAAi6S;IAC56S,QAAQ,EAAE,42PAA42P;IACt3P,OAAO,EAAE,8ypBAA8ypB;IACvzpB,SAAS,EAAE,mkWAAmkW;IAC9kW,OAAO,EAAE,myXAAmyX;IAC5yX,MAAM,EAAE,qkUAAqkU;IAC7kU,OAAO,EAAE,yhtBAAyhtB;IAClitB,YAAY,EAAE,ytPAAytP;IACvuP,MAAM,EAAE,soYAAsoY;IAC9oY,OAAO,EAAE,w5iBAAw5iB;IACj6iB,OAAO,EAAE,osZAAosZ;IAC7sZ,SAAS,EAAE,i9SAAi9S;IAC59S,UAAU,EAAE,4nPAA4nP;IACxoP,OAAO,EAAE,w5VAAw5V;IACj6V,QAAQ,EAAE,ujUAAujU;IACjkU,OAAO,EAAE,2gQAA2gQ;IACphQ,cAAc,EAAE,8+OAA8+O;IAC9/O,QAAQ,EAAE,g6UAAg6U;IAC16U,MAAM,EAAE,y9YAAy9Y;IACj+Y,cAAc,EAAE,s+QAAs+Q;IACt/Q,OAAO,EAAE,q0UAAq0U;IAC90U,WAAW,EAAE,41qBAA41qB;IACz2qB,QAAQ,EAAE,okSAAokS;IAC9kS,QAAQ,EAAE,ksVAAksV;IAC5sV,MAAM,EAAE,28YAA28Y;IACn9Y,eAAe,EAAE,i1YAAi1Y;IACl2Y,QAAQ,EAAE,67XAA67X;IACv8X,WAAW,EAAE,kyQAAkyQ;IAC/yQ,WAAW,EAAE,k8YAAk8Y;IAC/8Y,KAAK,EAAE,q+fAAq+f;IAC5+f,UAAU,EAAE,goSAAgoS;IAC5oS,WAAW,EAAE,0ndAA0nd;IACvod,cAAc,EAAE,+6UAA+6U;IAC/7U,YAAY,EAAE,qyRAAqyR;IACnzR,YAAY,EAAE,ksXAAksX;IAChtX,YAAY,EAAE,qlWAAqlW;IACnmW,WAAW,EAAE,o0UAAo0U;IACj1U,QAAQ,EAAE,swOAAswO;IAChxO,QAAQ,EAAE,2nsBAA2nsB;IACrosB,UAAU,EAAE,48WAA48W;IACx9W,QAAQ,EAAE,4kYAA4kY;IACtlY,QAAQ,EAAE,mrPAAmrP;IAC7rP,SAAS,EAAE,6lbAA6lb;IACxmb,WAAW,EAAE,slYAAslY;IACnmY,OAAO,EAAE,gvTAAgvT;IACzvT,MAAM,EAAE,29OAA29O;IACn+O,WAAW,EAAE,0sRAA0sR;IACvtR,OAAO,EAAE,mmWAAmmW;IAC5mW,OAAO,EAAE,uoXAAuoX;IAChpX,OAAO,EAAE,+sVAA+sV;IACxtV,OAAO,EAAE,ugTAAugT;IAChhT,SAAS,EAAE,ghPAAghP;IAC3hP,QAAQ,EAAE,q9SAAq9S;IAC/9S,SAAS,EAAE,+wPAA+wP;CAClxP,CAAC;AAEX,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa,EAAE,YAAY;IAC3B,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,QAAQ;IACjB,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,OAAO;IAClB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,OAAO;IAChB,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE,YAAY;IAC1B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,QAAQ;IACjB,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,YAAY;IACrB,cAAc,EAAE,YAAY;IAC5B,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,QAAQ;IAChB,cAAc,EAAE,YAAY;IAC5B,OAAO,EAAE,YAAY;IACrB,WAAW,EAAE,OAAO;IACpB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,QAAQ;IAChB,eAAe,EAAE,YAAY;IAC7B,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,QAAQ;IACrB,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,SAAS;IACtB,cAAc,EAAE,YAAY;IAC5B,YAAY,EAAE,YAAY;IAC1B,YAAY,EAAE,YAAY;IAC1B,YAAY,EAAE,YAAY;IAC1B,WAAW,EAAE,YAAY;IACzB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,OAAO;IACjB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,QAAQ;IACnB,WAAW,EAAE,QAAQ;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,YAAY;IACzB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,YAAY;CACf,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Effect, Frame } from "vgpu";
2
+ import type { ShaderName } from "./registry.js";
3
+ import type { Stage } from "./stage.js";
4
+ import type { ResolvedUniforms } from "./types.js";
5
+ /**
6
+ * The render graph a graph shader draws through, ported from the vgpu
7
+ * `fft-ocean` ("Particles ocean") example and folded into the Stage model.
8
+ *
9
+ * The example owned its own frame loop; here the loop belongs to the Stage,
10
+ * so the graph splits along the seam the Stage already has: `encode` runs
11
+ * every internal pass (field, normals, particles, bloom) inside `prepare`,
12
+ * and `present` is the ordinary full-screen effect the Stage draws into the
13
+ * surface afterwards — same command buffer, same ordering the example's
14
+ * `renderGraph` guaranteed, and the shared `Params` post chain on the way out.
15
+ *
16
+ * Everything else the example did is kept: HDR scene and bloom targets that
17
+ * track the canvas and are rebuilt (old ones destroyed) on resize, additive
18
+ * particles over a fixed camera, five blurred octaves recombined, and a
19
+ * `destroy` that releases every texture the graph allocated.
20
+ */
21
+ export interface ShaderGraph {
22
+ /** The final pass; the Stage binds `params` and draws it like any shader. */
23
+ readonly present: Effect;
24
+ /** Encodes every internal pass into the frame, ahead of the present pass. */
25
+ encode(frame: Frame, uniforms: ResolvedUniforms, deltaTime: number): void;
26
+ resize(width: number, height: number): void;
27
+ /** Pre-warms every internal pipeline, so the first frame is not a stall. */
28
+ compile(): Promise<void>;
29
+ destroy(): void;
30
+ }
31
+ export declare function createGraph(stage: Stage, name: ShaderName, width: number, height: number): ShaderGraph;
32
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,MAAM,EAAE,KAAK,EAAU,MAAM,MAAM,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,4EAA4E;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAqHD,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,WAAW,CA0Rb"}
package/dist/graph.js ADDED
@@ -0,0 +1,366 @@
1
+ import { draw, effect, sampler, target } from "vgpu";
2
+ import { shaderSources } from "./generated/sources.js";
3
+ /** Grid cells per side: the field textures, and one particle per cell. */
4
+ const GRID = 256;
5
+ /**
6
+ * Canonical framing, carried over from the example's tuning table: a 400-unit
7
+ * sea under a fixed cinematic camera, particles fading out with distance
8
+ * before the far edge can alias against the horizon.
9
+ */
10
+ const TUNING = {
11
+ world: 400,
12
+ /** World units per unit of `st_field` height. */
13
+ heightScale: 9,
14
+ pointSize: 1.1,
15
+ camera: {
16
+ eye: [0, 30, 90],
17
+ target: [0, 5, 55],
18
+ pitchDegrees: -10,
19
+ fovDegrees: 90,
20
+ near: 0.1,
21
+ far: 2000,
22
+ },
23
+ fade: { near: 60, far: 250, power: 3.2 },
24
+ bloom: {
25
+ threshold: 0.25,
26
+ smoothWidth: 0.01,
27
+ strength: 0.14,
28
+ radius: 0.46,
29
+ levels: 5,
30
+ kernelRadii: [6, 10, 14, 18, 22],
31
+ factors: [1, 0.8, 0.6, 0.4, 0.2],
32
+ },
33
+ };
34
+ /**
35
+ * The canvas height the point size is tuned for: what a catalogue card, the
36
+ * smallest place these shaders are shown, actually draws at.
37
+ *
38
+ * `pointSize` is in device pixels and the grid is a fixed 256 by 256, so a
39
+ * point covers a smaller share of a bigger canvas: the same sea that reads as
40
+ * a dense field on a catalogue card thins out to specks on a fullscreen hero,
41
+ * and thins out again on a 2x poster. Scaling the point with the canvas keeps
42
+ * one picture at every size.
43
+ *
44
+ * Only upwards. Below this height a point is already down to about two device
45
+ * pixels, and shrinking it further turns the field into flickering sub-pixel
46
+ * dust rather than a thinner sea.
47
+ */
48
+ const POINT_REFERENCE_HEIGHT = 240;
49
+ const pointScale = (size) => Math.max(1, size[1] / POINT_REFERENCE_HEIGHT);
50
+ const SIM_FORMAT = "rgba16float";
51
+ const HDR_FORMAT = "rgba16float";
52
+ const TRANSPARENT = [0, 0, 0, 0];
53
+ /** The example's fixed camera: pitch-only view, infinite-sea projection. */
54
+ function graphCamera(size) {
55
+ const { eye, target: at, pitchDegrees, fovDegrees, near, far } = TUNING.camera;
56
+ const angle = Math.atan2(eye[1] - at[1], eye[2] - at[2]) - (pitchDegrees * Math.PI) / 180;
57
+ const c = Math.cos(angle);
58
+ const s = Math.sin(angle);
59
+ const f = 1 / Math.tan((fovDegrees * Math.PI) / 360);
60
+ // What the shader's pointer unprojection needs: eye height and depth, the
61
+ // pitch the view applies, and the projection's focal scale.
62
+ const info = [eye[1], eye[2], angle, f];
63
+ const view = new Float32Array(16);
64
+ view[0] = view[15] = 1;
65
+ view[5] = view[10] = c;
66
+ view[6] = s;
67
+ view[9] = -s;
68
+ view[13] = -(c * eye[1] - s * eye[2]);
69
+ view[14] = -(s * eye[1] + c * eye[2]);
70
+ const projection = new Float32Array(16);
71
+ projection[0] = f / (size[0] / Math.max(1, size[1]));
72
+ projection[5] = f;
73
+ projection[10] = far / (near - far);
74
+ projection[11] = -1;
75
+ projection[14] = (far * near) / (near - far);
76
+ return { view, projection, info };
77
+ }
78
+ /** Matches the example's UnrealBloom coefficients: sigma = radius / 3. */
79
+ function gaussianCoefficients(kernelRadius) {
80
+ return Array.from({ length: 24 }, (_, index) => index < kernelRadius
81
+ ? (0.39894 * Math.exp((-0.5 * index * index) / (kernelRadius / 3) ** 2)) /
82
+ (kernelRadius / 3)
83
+ : 0);
84
+ }
85
+ function bloomSizes(size) {
86
+ let width = Math.max(1, Math.round(size[0] / 2));
87
+ let height = Math.max(1, Math.round(size[1] / 2));
88
+ return Array.from({ length: TUNING.bloom.levels }, () => {
89
+ const level = [width, height];
90
+ width = Math.max(1, Math.round(width / 2));
91
+ height = Math.max(1, Math.round(height / 2));
92
+ return level;
93
+ });
94
+ }
95
+ export function createGraph(stage, name, width, height) {
96
+ const gpu = stage.gpu;
97
+ const source = shaderSources[name];
98
+ const label = `shadertown:${name}`;
99
+ let destroyed = false;
100
+ const fieldTarget = target(gpu, {
101
+ size: [GRID, GRID],
102
+ format: SIM_FORMAT,
103
+ label: `${label}:field`,
104
+ });
105
+ const normalTarget = target(gpu, {
106
+ size: [GRID, GRID],
107
+ format: SIM_FORMAT,
108
+ label: `${label}:normals`,
109
+ });
110
+ const linearSampler = sampler(gpu, { minFilter: "linear", magFilter: "linear" });
111
+ const buildScreenTargets = (w, h) => {
112
+ const size = [Math.max(1, Math.floor(w)), Math.max(1, Math.floor(h))];
113
+ const sizes = bloomSizes(size);
114
+ return {
115
+ size,
116
+ scene: target(gpu, { size, format: HDR_FORMAT, label: `${label}:scene` }),
117
+ bright: target(gpu, { size: sizes[0], format: HDR_FORMAT, label: `${label}:bright` }),
118
+ composite: target(gpu, { size: sizes[0], format: HDR_FORMAT, label: `${label}:composite` }),
119
+ levels: sizes.map((levelSize, index) => ({
120
+ horizontal: target(gpu, { size: levelSize, format: HDR_FORMAT, label: `${label}:blur-h${index}` }),
121
+ vertical: target(gpu, { size: levelSize, format: HDR_FORMAT, label: `${label}:blur-v${index}` }),
122
+ })),
123
+ };
124
+ };
125
+ const destroyScreenTargets = (screen) => {
126
+ const all = [
127
+ screen.scene,
128
+ screen.bright,
129
+ screen.composite,
130
+ ...screen.levels.flatMap((level) => [level.horizontal, level.vertical]),
131
+ ];
132
+ let firstError;
133
+ let failed = false;
134
+ for (const t of all.reverse()) {
135
+ try {
136
+ t.color.destroy();
137
+ }
138
+ catch (error) {
139
+ if (!failed)
140
+ firstError = error;
141
+ failed = true;
142
+ }
143
+ }
144
+ if (failed)
145
+ throw firstError;
146
+ };
147
+ let screen = buildScreenTargets(width, height);
148
+ const graphUniforms = (size) => {
149
+ const camera = graphCamera(size);
150
+ return {
151
+ view: camera.view,
152
+ projection: camera.projection,
153
+ viewport: [size[0], size[1], pointScale(size), GRID],
154
+ world: [TUNING.world, TUNING.heightScale, TUNING.pointSize, TUNING.world / GRID],
155
+ fade: [TUNING.fade.near, TUNING.fade.far, TUNING.fade.power, 0],
156
+ camera: camera.info,
157
+ };
158
+ };
159
+ const fullscreen = (fragment, suffix, set) => draw(gpu, {
160
+ shader: source,
161
+ vertices: 3,
162
+ entry: { vertex: "vs_fullscreen", fragment },
163
+ label: `${label}:${suffix}`,
164
+ set,
165
+ });
166
+ const fieldDraw = fullscreen("fs_field", "field", { gu: graphUniforms(screen.size) });
167
+ const normalsDraw = fullscreen("fs_normals", "normals", {
168
+ gu: graphUniforms(screen.size),
169
+ t_field: fieldTarget,
170
+ });
171
+ const particlesDraw = draw(gpu, {
172
+ shader: source,
173
+ vertices: 6,
174
+ instances: GRID * GRID,
175
+ entry: { vertex: "vs_particles", fragment: "fs_particles" },
176
+ blend: {
177
+ color: { src: "src-alpha", dst: "one" },
178
+ alpha: { src: "one", dst: "one" },
179
+ },
180
+ label: `${label}:particles`,
181
+ set: {
182
+ gu: graphUniforms(screen.size),
183
+ t_field: fieldTarget,
184
+ t_normal: normalTarget,
185
+ },
186
+ });
187
+ const brightDraw = fullscreen("fs_bright", "bright", {
188
+ bloomU: {
189
+ threshold: TUNING.bloom.threshold,
190
+ smoothWidth: TUNING.bloom.smoothWidth,
191
+ strength: TUNING.bloom.strength,
192
+ radius: TUNING.bloom.radius,
193
+ factors0: TUNING.bloom.factors.slice(0, 4),
194
+ factors1: [TUNING.bloom.factors[4], 0, 0, 0],
195
+ },
196
+ t_scene: screen.scene,
197
+ linearSampler,
198
+ });
199
+ const blurDraws = TUNING.bloom.kernelRadii.map((radius, index) => {
200
+ const coefficients = gaussianCoefficients(radius);
201
+ const blurUniforms = (direction, size) => ({
202
+ direction,
203
+ invSize: [1 / size[0], 1 / size[1]],
204
+ coeffs0: coefficients.slice(0, 4),
205
+ coeffs1: coefficients.slice(4, 8),
206
+ coeffs2: coefficients.slice(8, 12),
207
+ coeffs3: coefficients.slice(12, 16),
208
+ coeffs4: coefficients.slice(16, 20),
209
+ coeffs5: coefficients.slice(20, 24),
210
+ });
211
+ const level = screen.levels[index];
212
+ const input = index === 0 ? screen.bright : screen.levels[index - 1].vertical;
213
+ return {
214
+ blurUniforms,
215
+ horizontal: fullscreen("fs_blur", `blur-h${index}`, {
216
+ blurU: blurUniforms([1, 0], [level.horizontal.size[0], level.horizontal.size[1]]),
217
+ t_input: input,
218
+ linearSampler,
219
+ }),
220
+ vertical: fullscreen("fs_blur", `blur-v${index}`, {
221
+ blurU: blurUniforms([0, 1], [level.vertical.size[0], level.vertical.size[1]]),
222
+ t_input: level.horizontal,
223
+ linearSampler,
224
+ }),
225
+ };
226
+ });
227
+ const compositeDraw = fullscreen("fs_composite", "composite", {
228
+ bloomU: {
229
+ threshold: TUNING.bloom.threshold,
230
+ smoothWidth: TUNING.bloom.smoothWidth,
231
+ strength: TUNING.bloom.strength,
232
+ radius: TUNING.bloom.radius,
233
+ factors0: TUNING.bloom.factors.slice(0, 4),
234
+ factors1: [TUNING.bloom.factors[4], 0, 0, 0],
235
+ },
236
+ t_blur1: screen.levels[0].vertical,
237
+ t_blur2: screen.levels[1].vertical,
238
+ t_blur3: screen.levels[2].vertical,
239
+ t_blur4: screen.levels[3].vertical,
240
+ t_blur5: screen.levels[4].vertical,
241
+ linearSampler,
242
+ });
243
+ const present = effect(gpu, source, { label: `${label}:present` }).set({
244
+ t_scene: screen.scene,
245
+ t_bloom: screen.composite,
246
+ linearSampler,
247
+ });
248
+ /** Points every consumer at the screen targets current now. */
249
+ const bindScreen = () => {
250
+ const gu = graphUniforms(screen.size);
251
+ fieldDraw.set({ gu });
252
+ normalsDraw.set({ gu });
253
+ particlesDraw.set({ gu });
254
+ brightDraw.set({ t_scene: screen.scene });
255
+ for (const [index, level] of screen.levels.entries()) {
256
+ const draws = blurDraws[index];
257
+ draws.horizontal.set({
258
+ blurU: draws.blurUniforms([1, 0], [level.horizontal.size[0], level.horizontal.size[1]]),
259
+ t_input: index === 0 ? screen.bright : screen.levels[index - 1].vertical,
260
+ });
261
+ draws.vertical.set({
262
+ blurU: draws.blurUniforms([0, 1], [level.vertical.size[0], level.vertical.size[1]]),
263
+ t_input: level.horizontal,
264
+ });
265
+ }
266
+ compositeDraw.set({
267
+ t_blur1: screen.levels[0].vertical,
268
+ t_blur2: screen.levels[1].vertical,
269
+ t_blur3: screen.levels[2].vertical,
270
+ t_blur4: screen.levels[3].vertical,
271
+ t_blur5: screen.levels[4].vertical,
272
+ });
273
+ present.set({ t_scene: screen.scene, t_bloom: screen.composite });
274
+ };
275
+ // The pointer the field actually sees: eased toward the real one, because
276
+ // a crown or a dent that teleports under a fast hand reads as a glitch —
277
+ // the same reason the compute simulations smooth their pointer.
278
+ let pointerX;
279
+ let pointerY;
280
+ return {
281
+ present,
282
+ encode(frame, uniforms, deltaTime) {
283
+ if (destroyed)
284
+ return;
285
+ if (pointerX === undefined || pointerY === undefined) {
286
+ pointerX = uniforms.pointer[0];
287
+ pointerY = uniforms.pointer[1];
288
+ }
289
+ const blend = 1 - Math.exp(-Math.max(deltaTime, 0) * 8);
290
+ pointerX += (uniforms.pointer[0] - pointerX) * blend;
291
+ pointerY += (uniforms.pointer[1] - pointerY) * blend;
292
+ const eased = { ...uniforms, pointer: [pointerX, pointerY] };
293
+ // The stages that read the shared Params block get this frame's values;
294
+ // the Stage hands the same object to the present pass afterwards.
295
+ fieldDraw.set({ params: eased });
296
+ particlesDraw.set({ params: eased });
297
+ const pass = (t, drawable) => frame.pass({ target: t, clear: TRANSPARENT }, (encoder) => encoder.draw(drawable));
298
+ pass(fieldTarget, fieldDraw);
299
+ pass(normalTarget, normalsDraw);
300
+ pass(screen.scene, particlesDraw);
301
+ pass(screen.bright, brightDraw);
302
+ for (const [index, level] of screen.levels.entries()) {
303
+ pass(level.horizontal, blurDraws[index].horizontal);
304
+ pass(level.vertical, blurDraws[index].vertical);
305
+ }
306
+ pass(screen.composite, compositeDraw);
307
+ },
308
+ resize(w, h) {
309
+ if (destroyed)
310
+ return;
311
+ const next = [Math.max(1, Math.floor(w)), Math.max(1, Math.floor(h))];
312
+ if (next[0] === screen.size[0] && next[1] === screen.size[1])
313
+ return;
314
+ const previous = screen;
315
+ screen = buildScreenTargets(next[0], next[1]);
316
+ bindScreen();
317
+ // Rebinding happened between frames, so nothing queued still reads these.
318
+ destroyScreenTargets(previous);
319
+ },
320
+ async compile() {
321
+ // The present pass compiles against the surface signature in the
322
+ // renderer, like every other shader; this warms everything behind it.
323
+ const results = await Promise.allSettled([
324
+ fieldDraw.compile(fieldTarget),
325
+ normalsDraw.compile(normalTarget),
326
+ particlesDraw.compile(screen.scene),
327
+ brightDraw.compile(screen.bright),
328
+ ...blurDraws.flatMap((draws, index) => [
329
+ draws.horizontal.compile(screen.levels[index].horizontal),
330
+ draws.vertical.compile(screen.levels[index].vertical),
331
+ ]),
332
+ compositeDraw.compile(screen.composite),
333
+ ]);
334
+ const failure = results.find((result) => result.status === "rejected");
335
+ if (failure)
336
+ throw failure.reason;
337
+ },
338
+ destroy() {
339
+ if (destroyed)
340
+ return;
341
+ destroyed = true;
342
+ let firstError;
343
+ let failed = false;
344
+ try {
345
+ destroyScreenTargets(screen);
346
+ }
347
+ catch (error) {
348
+ firstError = error;
349
+ failed = true;
350
+ }
351
+ for (const t of [normalTarget, fieldTarget]) {
352
+ try {
353
+ t.color.destroy();
354
+ }
355
+ catch (error) {
356
+ if (!failed)
357
+ firstError = error;
358
+ failed = true;
359
+ }
360
+ }
361
+ if (failed)
362
+ throw firstError;
363
+ },
364
+ };
365
+ }
366
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}