@aardworx/wombat.rendering 0.1.0 → 0.1.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.
Files changed (181) hide show
  1. package/dist/commands/clear.d.ts +3 -0
  2. package/dist/commands/clear.d.ts.map +1 -0
  3. package/dist/commands/clear.js +69 -0
  4. package/dist/commands/clear.js.map +1 -0
  5. package/dist/commands/index.d.ts +3 -0
  6. package/dist/commands/index.d.ts.map +1 -0
  7. package/dist/commands/index.js +5 -0
  8. package/dist/commands/index.js.map +1 -0
  9. package/dist/commands/render.d.ts +16 -0
  10. package/dist/commands/render.d.ts.map +1 -0
  11. package/dist/commands/render.js +93 -0
  12. package/dist/commands/render.js.map +1 -0
  13. package/dist/core/acquire.d.ts +3 -0
  14. package/dist/core/acquire.d.ts.map +1 -0
  15. package/dist/core/acquire.js +22 -0
  16. package/dist/core/acquire.js.map +1 -0
  17. package/dist/core/adaptiveResource.d.ts +29 -0
  18. package/dist/core/adaptiveResource.d.ts.map +1 -0
  19. package/dist/core/adaptiveResource.js +73 -0
  20. package/dist/core/adaptiveResource.js.map +1 -0
  21. package/dist/core/buffer.d.ts +20 -0
  22. package/dist/core/buffer.d.ts.map +1 -0
  23. package/dist/core/buffer.js +30 -0
  24. package/dist/core/buffer.js.map +1 -0
  25. package/dist/core/bufferView.d.ts +15 -0
  26. package/dist/core/bufferView.d.ts.map +1 -0
  27. package/dist/core/bufferView.js +12 -0
  28. package/dist/core/bufferView.js.map +1 -0
  29. package/dist/core/clear.d.ts +9 -0
  30. package/dist/core/clear.d.ts.map +1 -0
  31. package/dist/core/clear.js +7 -0
  32. package/dist/core/clear.js.map +1 -0
  33. package/dist/core/command.d.ts +45 -0
  34. package/dist/core/command.d.ts.map +1 -0
  35. package/dist/core/command.js +12 -0
  36. package/dist/core/command.js.map +1 -0
  37. package/dist/core/drawCall.d.ts +17 -0
  38. package/dist/core/drawCall.d.ts.map +1 -0
  39. package/dist/core/drawCall.js +5 -0
  40. package/dist/core/drawCall.js.map +1 -0
  41. package/dist/core/framebuffer.d.ts +32 -0
  42. package/dist/core/framebuffer.d.ts.map +1 -0
  43. package/dist/core/framebuffer.js +6 -0
  44. package/dist/core/framebuffer.js.map +1 -0
  45. package/dist/core/framebufferSignature.d.ts +12 -0
  46. package/dist/core/framebufferSignature.d.ts.map +1 -0
  47. package/dist/core/framebufferSignature.js +7 -0
  48. package/dist/core/framebufferSignature.js.map +1 -0
  49. package/dist/core/index.d.ts +20 -0
  50. package/dist/core/index.d.ts.map +1 -0
  51. package/dist/core/index.js +13 -0
  52. package/dist/core/index.js.map +1 -0
  53. package/dist/core/pipelineState.d.ts +56 -0
  54. package/dist/core/pipelineState.d.ts.map +1 -0
  55. package/dist/core/pipelineState.js +6 -0
  56. package/dist/core/pipelineState.js.map +1 -0
  57. package/dist/core/renderContext.d.ts +8 -0
  58. package/dist/core/renderContext.d.ts.map +1 -0
  59. package/dist/core/renderContext.js +39 -0
  60. package/dist/core/renderContext.js.map +1 -0
  61. package/dist/core/renderObject.d.ts +45 -0
  62. package/dist/core/renderObject.d.ts.map +1 -0
  63. package/dist/core/renderObject.js +11 -0
  64. package/dist/core/renderObject.js.map +1 -0
  65. package/dist/core/renderTask.d.ts +12 -0
  66. package/dist/core/renderTask.d.ts.map +1 -0
  67. package/dist/core/renderTask.js +5 -0
  68. package/dist/core/renderTask.js.map +1 -0
  69. package/dist/core/renderTree.d.ts +35 -0
  70. package/dist/core/renderTree.d.ts.map +1 -0
  71. package/dist/core/renderTree.js +17 -0
  72. package/dist/core/renderTree.js.map +1 -0
  73. package/dist/core/sampler.d.ts +12 -0
  74. package/dist/core/sampler.d.ts.map +1 -0
  75. package/dist/core/sampler.js +8 -0
  76. package/dist/core/sampler.js.map +1 -0
  77. package/dist/core/shader.d.ts +3 -0
  78. package/dist/core/shader.d.ts.map +1 -0
  79. package/dist/core/shader.js +6 -0
  80. package/dist/core/shader.js.map +1 -0
  81. package/dist/core/texture.d.ts +34 -0
  82. package/dist/core/texture.d.ts.map +1 -0
  83. package/dist/core/texture.js +29 -0
  84. package/dist/core/texture.js.map +1 -0
  85. package/dist/index.d.ts +6 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +18 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/resources/adaptiveBuffer.d.ts +22 -0
  90. package/dist/resources/adaptiveBuffer.d.ts.map +1 -0
  91. package/dist/resources/adaptiveBuffer.js +99 -0
  92. package/dist/resources/adaptiveBuffer.js.map +1 -0
  93. package/dist/resources/adaptiveSampler.d.ts +4 -0
  94. package/dist/resources/adaptiveSampler.d.ts.map +1 -0
  95. package/dist/resources/adaptiveSampler.js +73 -0
  96. package/dist/resources/adaptiveSampler.js.map +1 -0
  97. package/dist/resources/adaptiveTexture.d.ts +14 -0
  98. package/dist/resources/adaptiveTexture.d.ts.map +1 -0
  99. package/dist/resources/adaptiveTexture.js +265 -0
  100. package/dist/resources/adaptiveTexture.js.map +1 -0
  101. package/dist/resources/framebuffer.d.ts +14 -0
  102. package/dist/resources/framebuffer.d.ts.map +1 -0
  103. package/dist/resources/framebuffer.js +144 -0
  104. package/dist/resources/framebuffer.js.map +1 -0
  105. package/dist/resources/framebufferSignature.d.ts +10 -0
  106. package/dist/resources/framebufferSignature.d.ts.map +1 -0
  107. package/dist/resources/framebufferSignature.js +22 -0
  108. package/dist/resources/framebufferSignature.js.map +1 -0
  109. package/dist/resources/index.d.ts +14 -0
  110. package/dist/resources/index.d.ts.map +1 -0
  111. package/dist/resources/index.js +24 -0
  112. package/dist/resources/index.js.map +1 -0
  113. package/dist/resources/mipGen.d.ts +17 -0
  114. package/dist/resources/mipGen.d.ts.map +1 -0
  115. package/dist/resources/mipGen.js +125 -0
  116. package/dist/resources/mipGen.js.map +1 -0
  117. package/dist/resources/preparedComputeShader.d.ts +104 -0
  118. package/dist/resources/preparedComputeShader.d.ts.map +1 -0
  119. package/dist/resources/preparedComputeShader.js +341 -0
  120. package/dist/resources/preparedComputeShader.js.map +1 -0
  121. package/dist/resources/preparedRenderObject.d.ts +61 -0
  122. package/dist/resources/preparedRenderObject.d.ts.map +1 -0
  123. package/dist/resources/preparedRenderObject.js +430 -0
  124. package/dist/resources/preparedRenderObject.js.map +1 -0
  125. package/dist/resources/renderPipeline.d.ts +27 -0
  126. package/dist/resources/renderPipeline.d.ts.map +1 -0
  127. package/dist/resources/renderPipeline.js +102 -0
  128. package/dist/resources/renderPipeline.js.map +1 -0
  129. package/dist/resources/shaderDiagnostics.d.ts +14 -0
  130. package/dist/resources/shaderDiagnostics.d.ts.map +1 -0
  131. package/dist/resources/shaderDiagnostics.js +40 -0
  132. package/dist/resources/shaderDiagnostics.js.map +1 -0
  133. package/dist/resources/sourceMapDecoder.d.ts +23 -0
  134. package/dist/resources/sourceMapDecoder.d.ts.map +1 -0
  135. package/dist/resources/sourceMapDecoder.js +116 -0
  136. package/dist/resources/sourceMapDecoder.js.map +1 -0
  137. package/dist/resources/uniformBuffer.d.ts +23 -0
  138. package/dist/resources/uniformBuffer.d.ts.map +1 -0
  139. package/dist/resources/uniformBuffer.js +149 -0
  140. package/dist/resources/uniformBuffer.js.map +1 -0
  141. package/dist/resources/webgpuFlags.d.ts +32 -0
  142. package/dist/resources/webgpuFlags.d.ts.map +1 -0
  143. package/dist/resources/webgpuFlags.js +40 -0
  144. package/dist/resources/webgpuFlags.js.map +1 -0
  145. package/dist/runtime/copy.d.ts +3 -0
  146. package/dist/runtime/copy.d.ts.map +1 -0
  147. package/dist/runtime/copy.js +12 -0
  148. package/dist/runtime/copy.js.map +1 -0
  149. package/dist/runtime/index.d.ts +6 -0
  150. package/dist/runtime/index.d.ts.map +1 -0
  151. package/dist/runtime/index.js +7 -0
  152. package/dist/runtime/index.js.map +1 -0
  153. package/dist/runtime/renderTask.d.ts +10 -0
  154. package/dist/runtime/renderTask.d.ts.map +1 -0
  155. package/dist/runtime/renderTask.js +119 -0
  156. package/dist/runtime/renderTask.js.map +1 -0
  157. package/dist/runtime/renderTo.d.ts +40 -0
  158. package/dist/runtime/renderTo.d.ts.map +1 -0
  159. package/dist/runtime/renderTo.js +97 -0
  160. package/dist/runtime/renderTo.js.map +1 -0
  161. package/dist/runtime/runtime.d.ts +48 -0
  162. package/dist/runtime/runtime.d.ts.map +1 -0
  163. package/dist/runtime/runtime.js +100 -0
  164. package/dist/runtime/runtime.js.map +1 -0
  165. package/dist/runtime/scenePass.d.ts +25 -0
  166. package/dist/runtime/scenePass.d.ts.map +1 -0
  167. package/dist/runtime/scenePass.js +250 -0
  168. package/dist/runtime/scenePass.js.map +1 -0
  169. package/dist/window/canvas.d.ts +38 -0
  170. package/dist/window/canvas.d.ts.map +1 -0
  171. package/dist/window/canvas.js +194 -0
  172. package/dist/window/canvas.js.map +1 -0
  173. package/dist/window/index.d.ts +3 -0
  174. package/dist/window/index.d.ts.map +1 -0
  175. package/dist/window/index.js +4 -0
  176. package/dist/window/index.js.map +1 -0
  177. package/dist/window/loop.d.ts +16 -0
  178. package/dist/window/loop.d.ts.map +1 -0
  179. package/dist/window/loop.js +43 -0
  180. package/dist/window/loop.js.map +1 -0
  181. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../src/window/canvas.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,KAAK,IAAI,EAEV,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,wFAAwF;IACxF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,+GAA+G;IAC/G,SAAS,IAAI,IAAI,CAAC;IAClB,6EAA6E;IAC7E,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,iBAAiB,GAAG,eAAe,EAC3C,IAAI,GAAE,mBAAwB,GAC7B,gBAAgB,CAqGlB"}
@@ -0,0 +1,194 @@
1
+ // attachCanvas — bind a `GPUDevice` to an `HTMLCanvasElement` /
2
+ // `OffscreenCanvas` and expose the swap-chain as an
3
+ // `aval<IFramebuffer>` so render tasks just plug it into a
4
+ // `Render` command's `output`.
5
+ //
6
+ // Each call to `framebuffer.getValue(token)` returns a fresh
7
+ // `IFramebuffer` whose color view is the current swap-chain
8
+ // texture (`context.getCurrentTexture().createView()`). Inside
9
+ // the render loop we mark the framebuffer aval outdated once per
10
+ // rAF tick so the runtime samples the new texture.
11
+ //
12
+ // The size aval is fed by a `ResizeObserver`; on size change we
13
+ // re-`configure()` the canvas context and bump a cval that the
14
+ // framebuffer aval depends on.
15
+ //
16
+ // MSAA: when `sampleCount > 1`, we allocate a hidden multisample
17
+ // color (and depth) texture sized to the canvas; the swap-chain
18
+ // texture becomes the resolve target. The render-pass descriptor
19
+ // builder in `@aardworx/wombat.rendering-commands` already wires
20
+ // `resolveTarget` based on the framebuffer's `resolveColors`.
21
+ import {} from "../core/index.js";
22
+ import { HashMap, cval, transact, } from "@aardworx/wombat.adaptive";
23
+ export function attachCanvas(device, canvas, opts = {}) {
24
+ const ctx = canvas.getContext("webgpu");
25
+ if (ctx === null)
26
+ throw new Error("attachCanvas: getContext('webgpu') returned null");
27
+ const colorName = opts.colorAttachmentName ?? "color";
28
+ const format = opts.format ?? navigator.gpu.getPreferredCanvasFormat();
29
+ const alphaMode = opts.alphaMode ?? "premultiplied";
30
+ const sampleCount = opts.sampleCount ?? 1;
31
+ const dpr = opts.devicePixelRatio ?? (typeof window !== "undefined" ? window.devicePixelRatio : 1);
32
+ // initial size from the canvas's CSS size (or its native dimensions for OffscreenCanvas).
33
+ const initial = currentSize(canvas, dpr);
34
+ const sizeC = cval({ width: initial.width, height: initial.height });
35
+ const frameC = cval(0);
36
+ // Apply the initial configure. We re-configure on every size change.
37
+ configure(ctx, device, format, alphaMode);
38
+ applySize(canvas, initial.width, initial.height);
39
+ // Hidden multisample color texture, present only when sampleCount > 1.
40
+ let msaaColor;
41
+ const ensureMsaaColor = (w, h) => {
42
+ if (sampleCount <= 1)
43
+ return undefined;
44
+ if (msaaColor !== undefined)
45
+ msaaColor.destroy();
46
+ msaaColor = device.createTexture({
47
+ size: { width: w, height: h, depthOrArrayLayers: 1 },
48
+ format,
49
+ sampleCount,
50
+ usage: GPUTextureUsage.RENDER_ATTACHMENT,
51
+ label: "canvas.color.msaa",
52
+ });
53
+ return msaaColor;
54
+ };
55
+ ensureMsaaColor(initial.width, initial.height);
56
+ // Optional shared depth texture re-allocated on size change.
57
+ let depthTexture;
58
+ const ensureDepth = (w, h) => {
59
+ if (opts.depthFormat === undefined)
60
+ return undefined;
61
+ if (depthTexture !== undefined)
62
+ depthTexture.destroy();
63
+ depthTexture = device.createTexture({
64
+ size: { width: w, height: h, depthOrArrayLayers: 1 },
65
+ format: opts.depthFormat,
66
+ sampleCount,
67
+ usage: GPUTextureUsage.RENDER_ATTACHMENT,
68
+ label: "canvas.depth",
69
+ });
70
+ return depthTexture;
71
+ };
72
+ ensureDepth(initial.width, initial.height);
73
+ // ResizeObserver — only meaningful for HTMLCanvasElement.
74
+ let observer;
75
+ if (typeof ResizeObserver !== "undefined" && canvas instanceof globalThis.HTMLCanvasElement) {
76
+ observer = new ResizeObserver((entries) => {
77
+ for (const e of entries) {
78
+ const cssWidth = e.contentBoxSize?.[0]?.inlineSize ?? canvas.clientWidth;
79
+ const cssHeight = e.contentBoxSize?.[0]?.blockSize ?? canvas.clientHeight;
80
+ const w = Math.max(1, Math.floor(cssWidth * dpr));
81
+ const h = Math.max(1, Math.floor(cssHeight * dpr));
82
+ if (w !== sizeC.value.width || h !== sizeC.value.height) {
83
+ applySize(canvas, w, h);
84
+ ensureMsaaColor(w, h);
85
+ ensureDepth(w, h);
86
+ transact(() => {
87
+ sizeC.value = { width: w, height: h };
88
+ });
89
+ }
90
+ }
91
+ });
92
+ observer.observe(canvas);
93
+ }
94
+ const signature = {
95
+ colors: HashMap.empty().add(colorName, format),
96
+ sampleCount,
97
+ ...(opts.depthFormat !== undefined
98
+ ? { depthStencil: depthAttachmentSig(opts.depthFormat) }
99
+ : {}),
100
+ };
101
+ // The framebuffer aval depends on (size, frame). Reading it pulls
102
+ // a fresh swap-chain texture; the frameC bump after each markFrame()
103
+ // is what re-fires the chain on the same size.
104
+ const framebuffer = sizeC.bind((sz) => frameC.map(() => makeFramebuffer(ctx, signature, sz, msaaColor, depthTexture, colorName)));
105
+ return {
106
+ framebuffer,
107
+ size: sizeC,
108
+ signature,
109
+ markFrame() {
110
+ transact(() => { frameC.value = frameC.value + 1; });
111
+ },
112
+ dispose() {
113
+ if (observer !== undefined)
114
+ observer.disconnect();
115
+ if (msaaColor !== undefined) {
116
+ msaaColor.destroy();
117
+ msaaColor = undefined;
118
+ }
119
+ if (depthTexture !== undefined) {
120
+ depthTexture.destroy();
121
+ depthTexture = undefined;
122
+ }
123
+ try {
124
+ ctx.unconfigure();
125
+ }
126
+ catch { /* already gone */ }
127
+ },
128
+ };
129
+ }
130
+ function configure(ctx, device, format, alphaMode) {
131
+ ctx.configure({
132
+ device, format, alphaMode,
133
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,
134
+ });
135
+ }
136
+ function currentSize(canvas, dpr) {
137
+ if (canvas.clientWidth !== undefined) {
138
+ const c = canvas;
139
+ return {
140
+ width: Math.max(1, Math.floor((c.clientWidth || c.width) * dpr)),
141
+ height: Math.max(1, Math.floor((c.clientHeight || c.height) * dpr)),
142
+ };
143
+ }
144
+ const c = canvas;
145
+ return { width: c.width, height: c.height };
146
+ }
147
+ function applySize(canvas, w, h) {
148
+ if (canvas.clientWidth !== undefined) {
149
+ const c = canvas;
150
+ c.width = w;
151
+ c.height = h;
152
+ }
153
+ else {
154
+ const c = canvas;
155
+ c.width = w;
156
+ c.height = h;
157
+ }
158
+ }
159
+ function makeFramebuffer(ctx, signature, size, msaaColor, depthTexture, colorName) {
160
+ const swap = ctx.getCurrentTexture();
161
+ const swapView = swap.createView();
162
+ const msaa = signature.sampleCount > 1;
163
+ // Pass attachment view: the multisample texture when MSAA is on,
164
+ // otherwise the swap-chain texture directly.
165
+ const passView = msaa
166
+ ? (msaaColor ?? swap).createView()
167
+ : swapView;
168
+ const colors = HashMap.empty().add(colorName, passView);
169
+ const resolveColors = msaa
170
+ ? HashMap.empty().add(colorName, swapView)
171
+ : undefined;
172
+ // `colorTextures` exposes the *sampleable* texture (always the
173
+ // swap-chain — multisample textures are not sampleable in the
174
+ // normal sense).
175
+ const colorTextures = HashMap.empty().add(colorName, swap);
176
+ const fb = {
177
+ signature,
178
+ colors,
179
+ colorTextures,
180
+ ...(resolveColors !== undefined ? { resolveColors } : {}),
181
+ width: size.width,
182
+ height: size.height,
183
+ ...(depthTexture !== undefined
184
+ ? { depthStencil: depthTexture.createView(), depthStencilTexture: depthTexture }
185
+ : {}),
186
+ };
187
+ return fb;
188
+ }
189
+ function depthAttachmentSig(format) {
190
+ const hasDepth = /^depth/.test(format) || format === "depth24plus-stencil8" || format === "depth32float-stencil8";
191
+ const hasStencil = /stencil/.test(format);
192
+ return { format, hasDepth, hasStencil };
193
+ }
194
+ //# sourceMappingURL=canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../src/window/canvas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { attachCanvas, type AttachCanvasOptions, type CanvasAttachment, } from "./canvas.js";
2
+ export { runFrame, type FrameCallback, type FrameInfo, type RunFrameOptions, } from "./loop.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/window/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Public API of @aardworx/wombat.rendering-window.
2
+ export { attachCanvas, } from "./canvas.js";
3
+ export { runFrame, } from "./loop.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/window/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,EACL,YAAY,GAGb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,QAAQ,GAIT,MAAM,WAAW,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { AdaptiveToken } from "@aardworx/wombat.adaptive";
2
+ import type { CanvasAttachment } from "./canvas.js";
3
+ export interface RunFrameOptions {
4
+ /** Stop after N frames. Useful for tests + finite animations. */
5
+ readonly maxFrames?: number;
6
+ }
7
+ export type FrameCallback = (token: AdaptiveToken, info: FrameInfo) => void;
8
+ export interface FrameInfo {
9
+ readonly frame: number;
10
+ readonly timestampMs: number;
11
+ readonly deltaMs: number;
12
+ }
13
+ export declare function runFrame(attachment: CanvasAttachment, frame: FrameCallback, opts?: RunFrameOptions): {
14
+ stop(): void;
15
+ };
16
+ //# sourceMappingURL=loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAE5E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CACtB,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,eAAoB,GACzB;IAAE,IAAI,IAAI,IAAI,CAAA;CAAE,CA8BlB"}
@@ -0,0 +1,43 @@
1
+ // runFrame — requestAnimationFrame-driven loop integrated with
2
+ // wombat.adaptive transactions. Each tick:
3
+ // 1. Bumps the canvas attachment's frame counter so its
4
+ // framebuffer aval invalidates and the next read returns the
5
+ // current swap-chain texture.
6
+ // 2. Calls the user's `frame(token)` callback. The user runs
7
+ // their `IRenderTask` here.
8
+ //
9
+ // Returns a `stop()` to cancel the loop.
10
+ import { AdaptiveToken as Tok } from "@aardworx/wombat.adaptive";
11
+ export function runFrame(attachment, frame, opts = {}) {
12
+ let stopped = false;
13
+ let frameNo = 0;
14
+ let lastTime = performance.now();
15
+ let rafId = 0;
16
+ const tick = (now) => {
17
+ if (stopped)
18
+ return;
19
+ const delta = now - lastTime;
20
+ lastTime = now;
21
+ attachment.markFrame();
22
+ try {
23
+ frame(Tok.top, { frame: frameNo, timestampMs: now, deltaMs: delta });
24
+ }
25
+ catch (e) {
26
+ stopped = true;
27
+ console.error("runFrame: error in frame callback", e);
28
+ throw e;
29
+ }
30
+ frameNo++;
31
+ if (opts.maxFrames !== undefined && frameNo >= opts.maxFrames)
32
+ return;
33
+ rafId = requestAnimationFrame(tick);
34
+ };
35
+ rafId = requestAnimationFrame(tick);
36
+ return {
37
+ stop() {
38
+ stopped = true;
39
+ cancelAnimationFrame(rafId);
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,2CAA2C;AAC3C,0DAA0D;AAC1D,kEAAkE;AAClE,mCAAmC;AACnC,+DAA+D;AAC/D,iCAAiC;AACjC,EAAE;AACF,yCAAyC;AAGzC,OAAO,EAAE,aAAa,IAAI,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAgBjE,MAAM,UAAU,QAAQ,CACtB,UAA4B,EAC5B,KAAoB,EACpB,OAAwB,EAAE;IAE1B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,KAAK,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC7B,QAAQ,GAAG,GAAG,CAAC;QACf,UAAU,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,CAAC;QACV,CAAC;QACD,OAAO,EAAE,CAAC;QACV,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QACtE,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO;QACL,IAAI;YACF,OAAO,GAAG,IAAI,CAAC;YACf,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aardworx/wombat.rendering",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "WebGPU rendering layer for the Wombat TypeScript stack — RenderObject/RenderTask/runtime + window glue, port of Aardvark.Rendering's lower layers on top of WebGPU and wombat.shader.",
5
5
  "license": "MIT",
6
6
  "author": "krauthaufen",