@aardworx/wombat.rendering 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/core/command.d.ts +7 -9
  2. package/dist/core/command.d.ts.map +1 -1
  3. package/dist/core/renderTask.d.ts +64 -1
  4. package/dist/core/renderTask.d.ts.map +1 -1
  5. package/dist/core/renderTask.js +3 -1
  6. package/dist/core/renderTask.js.map +1 -1
  7. package/dist/resources/preparedRenderObject.js +3 -3
  8. package/dist/resources/preparedRenderObject.js.map +1 -1
  9. package/dist/resources/uniformBuffer.d.ts.map +1 -1
  10. package/dist/resources/uniformBuffer.js +17 -0
  11. package/dist/resources/uniformBuffer.js.map +1 -1
  12. package/dist/runtime/derivedUniforms/dispatch.d.ts +105 -0
  13. package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -0
  14. package/dist/runtime/derivedUniforms/dispatch.js +355 -0
  15. package/dist/runtime/derivedUniforms/dispatch.js.map +1 -0
  16. package/dist/runtime/derivedUniforms/index.d.ts +6 -0
  17. package/dist/runtime/derivedUniforms/index.d.ts.map +1 -0
  18. package/dist/runtime/derivedUniforms/index.js +26 -0
  19. package/dist/runtime/derivedUniforms/index.js.map +1 -0
  20. package/dist/runtime/derivedUniforms/recipes.d.ts +42 -0
  21. package/dist/runtime/derivedUniforms/recipes.d.ts.map +1 -0
  22. package/dist/runtime/derivedUniforms/recipes.js +134 -0
  23. package/dist/runtime/derivedUniforms/recipes.js.map +1 -0
  24. package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +56 -0
  25. package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -0
  26. package/dist/runtime/derivedUniforms/sceneIntegration.js +171 -0
  27. package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -0
  28. package/dist/runtime/derivedUniforms/slotId.d.ts +15 -0
  29. package/dist/runtime/derivedUniforms/slotId.d.ts.map +1 -0
  30. package/dist/runtime/derivedUniforms/slotId.js +30 -0
  31. package/dist/runtime/derivedUniforms/slotId.js.map +1 -0
  32. package/dist/runtime/derivedUniforms/slots.d.ts +49 -0
  33. package/dist/runtime/derivedUniforms/slots.d.ts.map +1 -0
  34. package/dist/runtime/derivedUniforms/slots.js +123 -0
  35. package/dist/runtime/derivedUniforms/slots.js.map +1 -0
  36. package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts +13 -0
  37. package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts.map +1 -0
  38. package/dist/runtime/derivedUniforms/uberKernel.wgsl.js +218 -0
  39. package/dist/runtime/derivedUniforms/uberKernel.wgsl.js.map +1 -0
  40. package/dist/runtime/flattenTree.d.ts +5 -0
  41. package/dist/runtime/flattenTree.d.ts.map +1 -0
  42. package/dist/runtime/flattenTree.js +45 -0
  43. package/dist/runtime/flattenTree.js.map +1 -0
  44. package/dist/runtime/heapAdapter.d.ts +16 -0
  45. package/dist/runtime/heapAdapter.d.ts.map +1 -0
  46. package/dist/runtime/heapAdapter.js +263 -0
  47. package/dist/runtime/heapAdapter.js.map +1 -0
  48. package/dist/runtime/heapEffect.d.ts +235 -0
  49. package/dist/runtime/heapEffect.d.ts.map +1 -0
  50. package/dist/runtime/heapEffect.js +518 -0
  51. package/dist/runtime/heapEffect.js.map +1 -0
  52. package/dist/runtime/heapEffectIR.d.ts +34 -0
  53. package/dist/runtime/heapEffectIR.d.ts.map +1 -0
  54. package/dist/runtime/heapEffectIR.js +1161 -0
  55. package/dist/runtime/heapEffectIR.js.map +1 -0
  56. package/dist/runtime/heapEligibility.d.ts +9 -0
  57. package/dist/runtime/heapEligibility.d.ts.map +1 -0
  58. package/dist/runtime/heapEligibility.js +195 -0
  59. package/dist/runtime/heapEligibility.js.map +1 -0
  60. package/dist/runtime/heapScene.d.ts +240 -31
  61. package/dist/runtime/heapScene.d.ts.map +1 -1
  62. package/dist/runtime/heapScene.js +3334 -265
  63. package/dist/runtime/heapScene.js.map +1 -1
  64. package/dist/runtime/heapShaderFamily.d.ts +132 -0
  65. package/dist/runtime/heapShaderFamily.d.ts.map +1 -0
  66. package/dist/runtime/heapShaderFamily.js +866 -0
  67. package/dist/runtime/heapShaderFamily.js.map +1 -0
  68. package/dist/runtime/hybridScene.d.ts +133 -0
  69. package/dist/runtime/hybridScene.d.ts.map +1 -0
  70. package/dist/runtime/hybridScene.js +159 -0
  71. package/dist/runtime/hybridScene.js.map +1 -0
  72. package/dist/runtime/index.d.ts +8 -0
  73. package/dist/runtime/index.d.ts.map +1 -1
  74. package/dist/runtime/index.js +9 -0
  75. package/dist/runtime/index.js.map +1 -1
  76. package/dist/runtime/renderTask.d.ts +21 -4
  77. package/dist/runtime/renderTask.d.ts.map +1 -1
  78. package/dist/runtime/renderTask.js +127 -32
  79. package/dist/runtime/renderTask.js.map +1 -1
  80. package/dist/runtime/runtime.d.ts +33 -3
  81. package/dist/runtime/runtime.d.ts.map +1 -1
  82. package/dist/runtime/runtime.js +12 -3
  83. package/dist/runtime/runtime.js.map +1 -1
  84. package/dist/runtime/scenePass.d.ts +28 -3
  85. package/dist/runtime/scenePass.d.ts.map +1 -1
  86. package/dist/runtime/scenePass.js +37 -4
  87. package/dist/runtime/scenePass.js.map +1 -1
  88. package/dist/runtime/textureAtlas/atlasMipGutterKernel.d.ts +35 -0
  89. package/dist/runtime/textureAtlas/atlasMipGutterKernel.d.ts.map +1 -0
  90. package/dist/runtime/textureAtlas/atlasMipGutterKernel.js +247 -0
  91. package/dist/runtime/textureAtlas/atlasMipGutterKernel.js.map +1 -0
  92. package/dist/runtime/textureAtlas/atlasPool.d.ts +240 -0
  93. package/dist/runtime/textureAtlas/atlasPool.d.ts.map +1 -0
  94. package/dist/runtime/textureAtlas/atlasPool.js +798 -0
  95. package/dist/runtime/textureAtlas/atlasPool.js.map +1 -0
  96. package/dist/runtime/textureAtlas/bvhTree2d.d.ts +33 -0
  97. package/dist/runtime/textureAtlas/bvhTree2d.d.ts.map +1 -0
  98. package/dist/runtime/textureAtlas/bvhTree2d.js +501 -0
  99. package/dist/runtime/textureAtlas/bvhTree2d.js.map +1 -0
  100. package/dist/runtime/textureAtlas/packer.d.ts +50 -0
  101. package/dist/runtime/textureAtlas/packer.d.ts.map +1 -0
  102. package/dist/runtime/textureAtlas/packer.js +390 -0
  103. package/dist/runtime/textureAtlas/packer.js.map +1 -0
  104. package/dist/window/loop.d.ts +14 -0
  105. package/dist/window/loop.d.ts.map +1 -1
  106. package/dist/window/loop.js +18 -5
  107. package/dist/window/loop.js.map +1 -1
  108. package/package.json +5 -4
  109. package/src/core/command.ts +9 -9
  110. package/src/core/renderTask.ts +55 -2
  111. package/src/resources/preparedRenderObject.ts +3 -3
  112. package/src/resources/uniformBuffer.ts +15 -0
  113. package/src/runtime/derivedUniforms/dispatch.ts +407 -0
  114. package/src/runtime/derivedUniforms/index.ts +52 -0
  115. package/src/runtime/derivedUniforms/recipes.ts +159 -0
  116. package/src/runtime/derivedUniforms/sceneIntegration.ts +239 -0
  117. package/src/runtime/derivedUniforms/slotId.ts +35 -0
  118. package/src/runtime/derivedUniforms/slots.ts +155 -0
  119. package/src/runtime/derivedUniforms/uberKernel.wgsl.ts +220 -0
  120. package/src/runtime/flattenTree.ts +46 -0
  121. package/src/runtime/heapAdapter.ts +314 -0
  122. package/src/runtime/heapEffect.ts +719 -0
  123. package/src/runtime/heapEffectIR.ts +1211 -0
  124. package/src/runtime/heapEligibility.ts +189 -0
  125. package/src/runtime/heapScene.ts +3981 -349
  126. package/src/runtime/heapShaderFamily.ts +1102 -0
  127. package/src/runtime/hybridScene.ts +310 -0
  128. package/src/runtime/index.ts +46 -0
  129. package/src/runtime/renderTask.ts +167 -32
  130. package/src/runtime/runtime.ts +37 -4
  131. package/src/runtime/scenePass.ts +39 -4
  132. package/src/runtime/textureAtlas/atlasMipGutterKernel.ts +291 -0
  133. package/src/runtime/textureAtlas/atlasPool.ts +991 -0
  134. package/src/runtime/textureAtlas/bvhTree2d.ts +530 -0
  135. package/src/runtime/textureAtlas/packer.ts +429 -0
  136. package/src/window/loop.ts +32 -6
@@ -0,0 +1,50 @@
1
+ import { Box2i, V2i } from "@aardworx/wombat.base";
2
+ /**
3
+ * Immutable 2D atlas. Generic over `K` (entry key — anything that's a
4
+ * valid `Map` key works; we recommend strings or numbers).
5
+ */
6
+ export declare class TexturePacking<K> {
7
+ readonly size: V2i;
8
+ readonly allowRotate: boolean;
9
+ private readonly free;
10
+ /** Used rects keyed on the user's K. */
11
+ readonly used: ReadonlyMap<K, Box2i>;
12
+ private constructor();
13
+ static empty<K>(size: V2i, allowRotate?: boolean): TexturePacking<K>;
14
+ static create<K>(size: V2i, allowRotate?: boolean): TexturePacking<K>;
15
+ get count(): number;
16
+ get isEmpty(): boolean;
17
+ /** All free MaxRects. */
18
+ get freeRects(): Iterable<Box2i>;
19
+ get occupancy(): number;
20
+ /**
21
+ * Try to insert one entry. Returns the new packing on success, or
22
+ * `null` if no free rect (with optional rotation) can accommodate
23
+ * `size`.
24
+ *
25
+ * If `id` is already present:
26
+ * - same size → returns `this` (no-op).
27
+ * - different size → removes then re-adds.
28
+ */
29
+ tryAdd(id: K, size: V2i): TexturePacking<K> | null;
30
+ /** Atomic batch insert: returns null if any element would not fit. */
31
+ tryAdd(many: Iterable<readonly [K, V2i]>): TexturePacking<K> | null;
32
+ private tryAddOne;
33
+ /** Remove `id` (no-op if absent). */
34
+ remove(id: K): TexturePacking<K>;
35
+ }
36
+ export declare const empty: <K>(size: V2i) => TexturePacking<K>;
37
+ export declare const isEmpty: <K>(p: TexturePacking<K>) => boolean;
38
+ export declare const count: <K>(p: TexturePacking<K>) => number;
39
+ export declare const occupancy: <K>(p: TexturePacking<K>) => number;
40
+ export declare const tryAdd: <K>(id: K, size: V2i, p: TexturePacking<K>) => TexturePacking<K> | null;
41
+ /** Sort-then-tryAdd helper. Sorting by descending max-extent matches the F# heuristic. */
42
+ export declare const tryAddMany: <K>(elements: Iterable<readonly [K, V2i]>, p: TexturePacking<K>) => TexturePacking<K> | null;
43
+ export declare const tryOfArray: <K>(size: V2i, elements: ReadonlyArray<readonly [K, V2i]>) => TexturePacking<K> | null;
44
+ /**
45
+ * Build an optimal-square packing for the given elements, doubling
46
+ * the side until everything fits then binary-searching down. Mirrors
47
+ * F#'s `TexturePacking.square`.
48
+ */
49
+ export declare const square: <K>(elements: ReadonlyArray<readonly [K, V2i]>) => TexturePacking<K>;
50
+ //# sourceMappingURL=packer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packer.d.ts","sourceRoot":"","sources":["../../../src/runtime/textureAtlas/packer.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAS,KAAK,EAAO,GAAG,EAAE,MAAM,uBAAuB,CAAC;AA6K/D;;;GAGG;AACH,qBAAa,cAAc,CAAC,CAAC;aAET,IAAI,EAAE,GAAG;aACT,WAAW,EAAE,OAAO;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,wCAAwC;aACxB,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC;IAL7C,OAAO;IAQP,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAE,OAAc,GAAG,cAAc,CAAC,CAAC,CAAC;IAS1E,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAE,OAAc,GAAG,cAAc,CAAC,CAAC,CAAC;IAI3E,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,yBAAyB;IACzB,IAAI,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,CAE/B;IAED,IAAI,SAAS,IAAI,MAAM,CAQtB;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAClD,sEAAsE;IACtE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAanE,OAAO,CAAC,SAAS;IAiEjB,qCAAqC;IACrC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;CAyBjC;AAID,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,MAAM,GAAG,KAAG,cAAc,CAAC,CAAC,CAAkC,CAAC;AACxF,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,KAAG,OAAoB,CAAC;AACvE,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,KAAG,MAAiB,CAAC;AAClE,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,KAAG,MAAqB,CAAC;AAC1E,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,KAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IACnE,CAAC;AAErB,0FAA0F;AAC1F,eAAO,MAAM,UAAU,GAAI,CAAC,EAC1B,UAAU,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EACrC,GAAG,cAAc,CAAC,CAAC,CAAC,KACnB,cAAc,CAAC,CAAC,CAAC,GAAG,IAItB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,CAAC,EAC1B,MAAM,GAAG,EACT,UAAU,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KACzC,cAAc,CAAC,CAAC,CAAC,GAAG,IAA4C,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,UAAU,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAG,cAAc,CAAC,CAAC,CA+BtF,CAAC"}
@@ -0,0 +1,390 @@
1
+ // TexturePacking — incremental immutable MaxRects-style 2D rectangle
2
+ // packer over `BvhTree2d`.
3
+ //
4
+ // Port of `Aardvark.Geometry.TexturePacking<'a>` from
5
+ // `aardvark.base/src/Aardvark.Geometry/TexturePacking.fs`. Algorithm:
6
+ // - Atlas is described by a set of free MaxRects (contained in a
7
+ // `BvhTree2d` keyed on the rect itself for O(log N) queries).
8
+ // - tryAdd picks the free rect with the smallest waste that fits the
9
+ // incoming size (with optional 90° rotation), splits the chosen
10
+ // rect into the placed sub-rect plus residual MaxRects.
11
+ // - Remove restores a sub-rect and merges with adjacent free rects
12
+ // using the F# `merge` routine, which incrementally maintains
13
+ // non-overlapping MaxRects covering the released region + neighbours.
14
+ //
15
+ // The wombat port keys the BVH on `Box2i` value-objects. We use a
16
+ // stable string key (`"minX,minY,maxX,maxY"`) so identical rectangles
17
+ // share a Map slot — Box2i instances themselves are reference types in
18
+ // JS and would not collide otherwise.
19
+ import { Box2d, Box2i, V2d, V2i } from "@aardworx/wombat.base";
20
+ import { BvhTree2d } from "./bvhTree2d.js";
21
+ // ─── Box2i helpers (mirroring the F# helpers in this module) ───────
22
+ const boxKey = (b) => {
23
+ const mn = b.min, mx = b.max;
24
+ return `${mn.x},${mn.y},${mx.x},${mx.y}`;
25
+ };
26
+ const sizeOf = (b) => {
27
+ const mn = b.min, mx = b.max;
28
+ return new V2i(mx.x - mn.x + 1, mx.y - mn.y + 1);
29
+ };
30
+ const isValid2i = (b) => {
31
+ const mn = b.min, mx = b.max;
32
+ return mn.x <= mx.x && mn.y <= mx.y;
33
+ };
34
+ const intersects2i = (a, b) => {
35
+ const amin = a.min, amax = a.max, bmin = b.min, bmax = b.max;
36
+ return amin.x <= bmax.x && amax.x >= bmin.x && amin.y <= bmax.y && amax.y >= bmin.y;
37
+ };
38
+ const intersectsTouching2i = (a, b) => {
39
+ // Mirror F# `intersects` inside `maxRects`: a 1-unit halo so adjacent
40
+ // rectangles count as overlapping (used to detect contact).
41
+ const amin = a.min, amax = a.max, bmin = b.min, bmax = b.max;
42
+ return amin.x <= bmax.x + 1 && amax.x >= bmin.x - 1 && amin.y <= bmax.y + 1 && amax.y >= bmin.y - 1;
43
+ };
44
+ const contains2i = (outer, inner) => {
45
+ const omin = outer.min, omax = outer.max, imin = inner.min, imax = inner.max;
46
+ return omin.x <= imin.x && omin.y <= imin.y && omax.x >= imax.x && omax.y >= imax.y;
47
+ };
48
+ const equals2i = (a, b) => {
49
+ const amin = a.min, amax = a.max, bmin = b.min, bmax = b.max;
50
+ return amin.x === bmin.x && amin.y === bmin.y && amax.x === bmax.x && amax.y === bmax.y;
51
+ };
52
+ const mkBox = (minX, minY, maxX, maxY) => new Box2i(minX, minY, maxX, maxY);
53
+ // `createBox`: half-pixel padded Box2d for BVH key. Exact mirror of
54
+ // F#'s `createBox`.
55
+ const createBox = (b) => {
56
+ const mn = b.min, mx = b.max;
57
+ return Box2d.fromMinMax(new V2d(mn.x - 0.5, mn.y - 0.5), new V2d(mx.x + 0.5, mx.y + 0.5));
58
+ };
59
+ // Subtract `b` from `a` (the placed rect from a free rect) and produce
60
+ // up to four residual MaxRects strips. Mirrors F#'s `split`.
61
+ const splitRects = (a, b) => {
62
+ const cands = [
63
+ mkBox(b.max.x + 1, a.min.y, a.max.x, a.max.y),
64
+ mkBox(a.min.x, a.min.y, b.min.x - 1, a.max.y),
65
+ mkBox(a.min.x, b.max.y + 1, a.max.x, a.max.y),
66
+ mkBox(a.min.x, a.min.y, a.max.x, b.min.y - 1),
67
+ ];
68
+ return cands.filter(isValid2i);
69
+ };
70
+ // MaxRects union/cleanup. Direct port of F#'s `maxRects`.
71
+ const maxRectsCombine = (a, b) => {
72
+ if (intersectsTouching2i(a, b)) {
73
+ if (contains2i(a, b))
74
+ return [a];
75
+ if (contains2i(b, a))
76
+ return [b];
77
+ const ax0 = a.min.x, ax1 = a.max.x, ay0 = a.min.y, ay1 = a.max.y;
78
+ const bx0 = b.min.x, bx1 = b.max.x, by0 = b.min.y, by1 = b.max.y;
79
+ // RangeX of a contains RangeX of b: ax0<=bx0 && ax1>=bx1
80
+ const abx = ax0 <= bx0 && ax1 >= bx1;
81
+ const bax = bx0 <= ax0 && bx1 >= ax1;
82
+ const aby = ay0 <= by0 && ay1 >= by1;
83
+ const bay = by0 <= ay0 && by1 >= ay1;
84
+ if (abx && bax) {
85
+ // identical X — Y-union
86
+ return [mkBox(ax0, Math.min(ay0, by0), ax1, Math.max(ay1, by1))];
87
+ }
88
+ if (aby && bay) {
89
+ return [mkBox(Math.min(ax0, bx0), ay0, Math.max(ax1, bx1), ay1)];
90
+ }
91
+ if (abx) {
92
+ return [mkBox(bx0, Math.min(ay0, by0), bx1, Math.max(ay1, by1)), a];
93
+ }
94
+ if (bax) {
95
+ return [mkBox(ax0, Math.min(ay0, by0), ax1, Math.max(ay1, by1)), b];
96
+ }
97
+ if (aby) {
98
+ return [mkBox(Math.min(ax0, bx0), by0, Math.max(ax1, bx1), by1), a];
99
+ }
100
+ if (bay) {
101
+ return [mkBox(Math.min(ax0, bx0), ay0, Math.max(ax1, bx1), ay1), b];
102
+ }
103
+ // Cross case: produce the two orthogonal strips of each rect's
104
+ // overlap with the other, plus both originals; filter invalid.
105
+ const out = [
106
+ mkBox(Math.min(ax0, bx0), Math.max(ay0, by0), Math.max(ax1, bx1), Math.min(ay1, by1)),
107
+ mkBox(Math.max(ax0, bx0), Math.min(ay0, by0), Math.min(ax1, bx1), Math.max(ay1, by1)),
108
+ a,
109
+ b,
110
+ ];
111
+ return out.filter(isValid2i);
112
+ }
113
+ return [a, b];
114
+ };
115
+ // Merge a freshly-released rect `n` with already-known adjacent free
116
+ // rects, producing the new MaxRects covering the union. Direct port
117
+ // of F#'s `merge`.
118
+ const merge = (n, boxes) => {
119
+ const boxArr = [...boxes];
120
+ if (boxArr.length === 0)
121
+ return [n];
122
+ let free = BvhTree2d.empty();
123
+ const addOne = (b) => {
124
+ const q = mkBox(b.min.x - 1, b.min.y - 1, b.max.x + 1, b.max.y + 1);
125
+ const touching = [];
126
+ for (const [, val] of free.getIntersecting(createBox(q))) {
127
+ if (intersectsTouching2i(val, q))
128
+ touching.push(val);
129
+ }
130
+ if (touching.length === 0) {
131
+ free = free.add(boxKey(b), createBox(b), b);
132
+ return;
133
+ }
134
+ for (const o of touching) {
135
+ free = free.remove(boxKey(o));
136
+ for (const r of maxRectsCombine(o, b)) {
137
+ // skip if any existing free rect already contains r
138
+ let contained = false;
139
+ for (const [, val] of free.getContaining(createBox(r))) {
140
+ if (contains2i(val, r)) {
141
+ contained = true;
142
+ break;
143
+ }
144
+ }
145
+ if (!contained) {
146
+ // remove any free rect r contains
147
+ const containedKeys = [];
148
+ for (const [k, val] of free.getContained(createBox(r))) {
149
+ if (contains2i(r, val))
150
+ containedKeys.push(k);
151
+ void val;
152
+ }
153
+ for (const k of containedKeys)
154
+ free = free.remove(k);
155
+ free = free.add(boxKey(r), createBox(r), r);
156
+ }
157
+ }
158
+ }
159
+ };
160
+ addOne(n);
161
+ for (const b of boxArr)
162
+ addOne(b);
163
+ return [...free.toSeq()].map(([, , v]) => v);
164
+ };
165
+ // Add a free rect into the tree iff no existing rect already contains
166
+ // it. Mirror of F#'s `addFree`.
167
+ const addFree = (b, free) => {
168
+ if (!isValid2i(b))
169
+ return free;
170
+ let containing = false;
171
+ for (const [, v] of free.getContaining(createBox(b))) {
172
+ if (contains2i(v, b)) {
173
+ containing = true;
174
+ break;
175
+ }
176
+ }
177
+ if (containing)
178
+ return free;
179
+ return free.add(boxKey(b), createBox(b), b);
180
+ };
181
+ /**
182
+ * Immutable 2D atlas. Generic over `K` (entry key — anything that's a
183
+ * valid `Map` key works; we recommend strings or numbers).
184
+ */
185
+ export class TexturePacking {
186
+ size;
187
+ allowRotate;
188
+ free;
189
+ used;
190
+ constructor(size, allowRotate, free,
191
+ /** Used rects keyed on the user's K. */
192
+ used) {
193
+ this.size = size;
194
+ this.allowRotate = allowRotate;
195
+ this.free = free;
196
+ this.used = used;
197
+ }
198
+ static empty(size, allowRotate = true) {
199
+ if (size.x <= 0 || size.y <= 0) {
200
+ return new TexturePacking(new V2i(0, 0), allowRotate, BvhTree2d.empty(), new Map());
201
+ }
202
+ const bb = mkBox(0, 0, size.x - 1, size.y - 1);
203
+ const tree = BvhTree2d.empty().add(boxKey(bb), createBox(bb), bb);
204
+ return new TexturePacking(size, allowRotate, tree, new Map());
205
+ }
206
+ static create(size, allowRotate = true) {
207
+ return TexturePacking.empty(size, allowRotate);
208
+ }
209
+ get count() {
210
+ return this.used.size;
211
+ }
212
+ get isEmpty() {
213
+ return this.used.size === 0;
214
+ }
215
+ /** All free MaxRects. */
216
+ get freeRects() {
217
+ return [...this.free.toSeq()].map(([, , v]) => v);
218
+ }
219
+ get occupancy() {
220
+ let area = 0;
221
+ for (const [, b] of this.used) {
222
+ const s = sizeOf(b);
223
+ area += s.x * s.y;
224
+ }
225
+ const total = this.size.x * this.size.y;
226
+ return total > 0 ? area / total : 0;
227
+ }
228
+ tryAdd(a, b) {
229
+ if (b === undefined) {
230
+ let cur = this;
231
+ for (const [id, sz] of a) {
232
+ if (cur === null)
233
+ return null;
234
+ cur = cur.tryAddOne(id, sz);
235
+ }
236
+ return cur;
237
+ }
238
+ return this.tryAddOne(a, b);
239
+ }
240
+ tryAddOne(id, size) {
241
+ if (size.x <= 0 || size.y <= 0)
242
+ return this;
243
+ const ex = this.used.get(id);
244
+ if (ex !== undefined) {
245
+ const s = sizeOf(ex);
246
+ if (s.x === size.x && s.y === size.y)
247
+ return this;
248
+ const removed = this.remove(id);
249
+ return removed.tryAddOne(id, size);
250
+ }
251
+ // Score each free rect; pick the smallest waste that fits.
252
+ let best;
253
+ for (const [, , rect] of this.free.toSeq()) {
254
+ const sh = sizeOf(rect);
255
+ const f0 = sh.x >= size.x && sh.y >= size.y;
256
+ const f1 = this.allowRotate ? sh.x >= size.y && sh.y >= size.x : false;
257
+ const w0 = (sh.x - size.x) * (sh.y - size.y);
258
+ const w1 = (sh.x - size.y) * (sh.y - size.x);
259
+ let cand;
260
+ if (f0 && f1) {
261
+ if (w0 < w1)
262
+ cand = { score: w0, upright: true };
263
+ else
264
+ cand = { score: w1, upright: false };
265
+ }
266
+ else if (f0)
267
+ cand = { score: w0, upright: true };
268
+ else if (f1)
269
+ cand = { score: w1, upright: false };
270
+ if (cand !== undefined && (best === undefined || cand.score < best.score)) {
271
+ best = { rect, upright: cand.upright, score: cand.score };
272
+ }
273
+ }
274
+ if (best === undefined)
275
+ return null;
276
+ const placedSize = best.upright ? size : new V2i(size.y, size.x);
277
+ const fitting = best.rect;
278
+ // Two slabs left of `fitting` after placement: right strip + top
279
+ // strip. Mirror F# layout.
280
+ const r0 = mkBox(fitting.min.x + placedSize.x, fitting.min.y, fitting.max.x, fitting.max.y);
281
+ const r1 = mkBox(fitting.min.x, fitting.min.y + placedSize.y, fitting.max.x, fitting.max.y);
282
+ const rect = mkBox(fitting.min.x, fitting.min.y, fitting.min.x + placedSize.x - 1, fitting.min.y + placedSize.y - 1);
283
+ let free = this.free.remove(boxKey(fitting));
284
+ free = addFree(r0, free);
285
+ free = addFree(r1, free);
286
+ // For every other free rect intersecting `rect`, replace with
287
+ // `splitRects(other, rect)`.
288
+ const intersecting = [];
289
+ for (const [, , v] of free.toSeq()) {
290
+ if (intersects2i(v, rect))
291
+ intersecting.push([boxKey(v), v]);
292
+ }
293
+ for (const [k, other] of intersecting) {
294
+ free = free.remove(k);
295
+ for (const p of splitRects(other, rect))
296
+ free = addFree(p, free);
297
+ }
298
+ const newUsed = new Map(this.used);
299
+ newUsed.set(id, rect);
300
+ return new TexturePacking(this.size, this.allowRotate, free, newUsed);
301
+ }
302
+ /** Remove `id` (no-op if absent). */
303
+ remove(id) {
304
+ const rect = this.used.get(id);
305
+ if (rect === undefined)
306
+ return this;
307
+ const newUsed = new Map(this.used);
308
+ newUsed.delete(id);
309
+ const qi = mkBox(rect.min.x - 1, rect.min.y - 1, rect.max.x + 1, rect.max.y + 1);
310
+ const adjacent = [];
311
+ for (const [, , v] of [...this.free.getIntersecting(createBox(qi))].map(([k, vv]) => [k, vv, vv])) {
312
+ if (v.min.x === qi.max.x ||
313
+ v.max.x === qi.min.x ||
314
+ v.min.y === qi.max.y ||
315
+ v.max.y === qi.min.y) {
316
+ adjacent.push(v);
317
+ }
318
+ }
319
+ let free = this.free;
320
+ for (const a of adjacent)
321
+ free = free.remove(boxKey(a));
322
+ for (const m of merge(rect, adjacent))
323
+ free = addFree(m, free);
324
+ return new TexturePacking(this.size, this.allowRotate, free, newUsed);
325
+ }
326
+ }
327
+ // ─── Module-level helpers (matching the F# `module TexturePacking`) ─
328
+ export const empty = (size) => TexturePacking.empty(size);
329
+ export const isEmpty = (p) => p.isEmpty;
330
+ export const count = (p) => p.count;
331
+ export const occupancy = (p) => p.occupancy;
332
+ export const tryAdd = (id, size, p) => p.tryAdd(id, size);
333
+ /** Sort-then-tryAdd helper. Sorting by descending max-extent matches the F# heuristic. */
334
+ export const tryAddMany = (elements, p) => {
335
+ const arr = [...elements];
336
+ arr.sort((a, b) => Math.max(b[1].x, b[1].y) - Math.max(a[1].x, a[1].y));
337
+ return p.tryAdd(arr);
338
+ };
339
+ export const tryOfArray = (size, elements) => tryAddMany(elements, empty(size));
340
+ /**
341
+ * Build an optimal-square packing for the given elements, doubling
342
+ * the side until everything fits then binary-searching down. Mirrors
343
+ * F#'s `TexturePacking.square`.
344
+ */
345
+ export const square = (elements) => {
346
+ const arr = [...elements];
347
+ arr.sort((a, b) => Math.max(b[1].x, b[1].y) - Math.max(a[1].x, a[1].y));
348
+ if (arr.length === 0)
349
+ return empty(new V2i(0, 0));
350
+ if (arr.length === 1) {
351
+ const [id, sz] = arr[0];
352
+ const s = Math.max(sz.x, sz.y);
353
+ return empty(new V2i(s, s)).tryAdd(id, sz);
354
+ }
355
+ let area = 0;
356
+ for (const [, sz] of arr)
357
+ area += sz.x * sz.y;
358
+ let lo = Math.floor(Math.sqrt(area));
359
+ let hi = nextPow2(lo);
360
+ let best = tryOfArray(new V2i(hi, hi), arr);
361
+ while (best === null) {
362
+ lo = hi;
363
+ hi = hi * 2;
364
+ best = tryOfArray(new V2i(hi, hi), arr);
365
+ }
366
+ let bestPacking = best;
367
+ while (hi > lo + 1) {
368
+ const m = (hi + lo) >> 1;
369
+ const p = tryOfArray(new V2i(m, m), arr);
370
+ if (p !== null) {
371
+ bestPacking = p;
372
+ hi = m;
373
+ }
374
+ else {
375
+ lo = m;
376
+ }
377
+ }
378
+ return bestPacking;
379
+ };
380
+ function nextPow2(n) {
381
+ if (n <= 1)
382
+ return 1;
383
+ let p = 1;
384
+ while (p < n)
385
+ p *= 2;
386
+ return p;
387
+ }
388
+ // silence unused-helper warning at export-time tooling
389
+ void equals2i;
390
+ //# sourceMappingURL=packer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packer.js","sourceRoot":"","sources":["../../../src/runtime/textureAtlas/packer.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,20 @@ export interface RunFrameOptions {
13
13
  * behavior.
14
14
  */
15
15
  readonly onAfterFrame?: () => void;
16
+ /**
17
+ * Frame pacer. When provided, runFrame awaits this promise after
18
+ * each frame's eval and BEFORE invoking `onAfterFrame` / scheduling
19
+ * the next rAF. Caps the JS encode rate to whatever the pacer
20
+ * resolves at — typically `() => device.queue.onSubmittedWorkDone()`
21
+ * to keep the GPU queue at depth 1 instead of letting submit-
22
+ * returns-immediately balloon the queue under load.
23
+ *
24
+ * Without a pacer, JS happily encodes 60 frames/s into a GPU that's
25
+ * actually running at 10 fps — the compositor then drops frames
26
+ * silently and the perceived rate has nothing to do with rAF rate.
27
+ * Always supply a pacer for continuous-redraw scenes.
28
+ */
29
+ readonly pacer?: () => Promise<void>;
16
30
  }
17
31
  export type FrameCallback = (token: AdaptiveToken, info: FrameInfo) => void;
18
32
  export interface FrameInfo {
@@ -1 +1 @@
1
- {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAQ,aAAa,EAAe,MAAM,2BAA2B,CAAC;AAElF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;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,CAqElB"}
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAQ,aAAa,EAAe,MAAM,2BAA2B,CAAC;AAElF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;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,CAiFlB"}
@@ -47,6 +47,17 @@ export function runFrame(attachment, frame, opts = {}) {
47
47
  frameNo++;
48
48
  return frameNo;
49
49
  });
50
+ const finalizeFrame = () => {
51
+ if (stopped)
52
+ return;
53
+ if (opts.onAfterFrame !== undefined) {
54
+ transact(opts.onAfterFrame);
55
+ }
56
+ if (opts.maxFrames !== undefined && frameNo >= opts.maxFrames) {
57
+ stopped = true;
58
+ sub.dispose();
59
+ }
60
+ };
50
61
  const tick = () => {
51
62
  if (stopped)
52
63
  return;
@@ -62,12 +73,14 @@ export function runFrame(attachment, frame, opts = {}) {
62
73
  // Inside the eval the same mark would race the
63
74
  // `outOfDate=false` reset and animation would stall after one
64
75
  // frame.
65
- if (opts.onAfterFrame !== undefined) {
66
- transact(opts.onAfterFrame);
76
+ if (opts.pacer !== undefined) {
77
+ opts.pacer().then(finalizeFrame, (e) => {
78
+ stopped = true;
79
+ console.error("runFrame: pacer rejected", e);
80
+ });
67
81
  }
68
- if (opts.maxFrames !== undefined && frameNo >= opts.maxFrames) {
69
- stopped = true;
70
- sub.dispose();
82
+ else {
83
+ finalizeFrame();
71
84
  }
72
85
  };
73
86
  const sub = renderAval.addMarkingCallback(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/window/loop.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,iEAAiE;AACjE,gEAAgE;AAChE,oEAAoE;AACpE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,0DAA0D;AAC1D,iCAAiC;AACjC,+DAA+D;AAC/D,6DAA6D;AAC7D,4DAA4D;AAC5D,iEAAiE;AACjE,iCAAiC;AACjC,6DAA6D;AAC7D,gEAAgE;AAChE,iEAAiE;AACjE,kEAAkE;AAClE,2CAA2C;AAC3C,gEAAgE;AAChE,wDAAwD;AACxD,EAAE;AACF,oEAAoE;AAGpE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAwC3D,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;IACd,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,mEAAmE;IACnE,kEAAkE;IAClE,+DAA+D;IAC/D,MAAM,UAAU,GAAiB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACrD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC7B,QAAQ,GAAG,GAAG,CAAC;QACf,UAAU,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,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,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,GAAS,EAAE;QAC/B,IAAI,OAAO;YAAE,OAAO;QACpB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9D,OAAO,GAAG,IAAI,CAAC;YACf,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,KAAK,CAAC;QAChB,6DAA6D;QAC7D,+DAA+D;QAC/D,+DAA+D;QAC/D,sBAAsB;QACtB,UAAU,CAAC,KAAK,EAAC,iBAAiB,CAAC,CAAC;QACpC,2DAA2D;QAC3D,mDAAmD;QACnD,yDAAyD;QACzD,+CAA+C;QAC/C,8DAA8D;QAC9D,SAAS;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;gBACrC,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,GAAG,GAAiB,UAExB,CAAC,kBAAkB,CAAC,GAAG,EAAE;QACzB,IAAI,OAAO,IAAI,OAAO;YAAE,OAAO;QAC/B,OAAO,GAAG,IAAI,CAAC;QACf,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,6DAA6D;IAC7D,OAAO,GAAG,IAAI,CAAC;IACf,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAEpC,OAAO;QACL,IAAI;YACF,OAAO,GAAG,IAAI,CAAC;YACf,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC5B,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aardworx/wombat.rendering",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "WebGPU rendering layer for the Wombat TypeScript stack \u2014 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",
@@ -54,14 +54,15 @@
54
54
  "src"
55
55
  ],
56
56
  "dependencies": {
57
- "@aardworx/wombat.adaptive": "^0.2.2",
57
+ "@aardworx/wombat.adaptive": "^0.2.3",
58
58
  "@aardworx/wombat.base": "^0.4.2",
59
- "@aardworx/wombat.shader": "^0.5.0"
59
+ "@aardworx/wombat.shader": "^0.5.2"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@webgpu/types": "^0.1.69"
63
63
  },
64
64
  "publishConfig": {
65
65
  "access": "public"
66
- }
66
+ },
67
+ "private": false
67
68
  }
@@ -9,9 +9,7 @@
9
9
  // AdaptiveResource update logic and run implicitly when a Render
10
10
  // command needs a dirty resource.
11
11
 
12
- import type { aval } from "@aardworx/wombat.adaptive";
13
12
  import type { ClearValues } from "./clear.js";
14
- import type { IFramebuffer } from "./framebuffer.js";
15
13
  import type { RenderTree } from "./renderTree.js";
16
14
 
17
15
  export interface BufferCopyRange {
@@ -37,14 +35,16 @@ export interface TextureCopy {
37
35
  export type CopySpec = BufferCopy | TextureCopy;
38
36
 
39
37
  /**
40
- * `Render` and `Clear` take an `aval<IFramebuffer>` for their output
41
- * so that swap-chain framebuffers (which produce a fresh
42
- * `GPUTextureView` every animation frame) flow through cleanly.
43
- * For static FBOs, wrap with `cval(...)` from `@aardworx/wombat.adaptive`
44
- * the runtime evaluates the aval per frame.
38
+ * `Render` and `Clear` no longer carry their own framebuffer — the
39
+ * task is created against a fixed `FramebufferSignature`, and the
40
+ * concrete `IFramebuffer` is supplied at `run`/`encode` time. All
41
+ * Render/Clear commands in a task share that framebuffer; multi-
42
+ * framebuffer scenes compose multiple tasks at the call site.
43
+ *
44
+ * `Copy` and `Custom` are framebuffer-agnostic and unchanged.
45
45
  */
46
46
  export type Command =
47
- | { readonly kind: "Render"; readonly output: aval<IFramebuffer>; readonly tree: RenderTree }
48
- | { readonly kind: "Clear"; readonly output: aval<IFramebuffer>; readonly values: ClearValues }
47
+ | { readonly kind: "Render"; readonly tree: RenderTree }
48
+ | { readonly kind: "Clear"; readonly values: ClearValues }
49
49
  | { readonly kind: "Copy"; readonly copy: CopySpec }
50
50
  | { readonly kind: "Custom"; readonly encode: (cmd: GPUCommandEncoder) => void };