@driftengine/core 4.8.7 → 4.10.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 (263) hide show
  1. package/CHANGELOG.json +123 -11
  2. package/README.md +43 -38
  3. package/dist/index.d.ts +8 -1
  4. package/dist/index.js +11 -3
  5. package/dist/render/ambientHarmonics.d.ts +1 -1
  6. package/dist/render/ambientHarmonics.js +1 -1
  7. package/dist/render/areaLights.d.ts +4 -4
  8. package/dist/render/areaLights.js +1 -1
  9. package/dist/render/atmosphere.d.ts +13 -0
  10. package/dist/render/atmosphere.js +9 -1
  11. package/dist/render/backend/api.d.ts +19 -4
  12. package/dist/render/backend/createRenderer.d.ts +6 -0
  13. package/dist/render/backend/createRenderer.js +4 -1
  14. package/dist/render/backend/select.js +11 -5
  15. package/dist/render/backend/webgl2/boneAnimations.d.ts +29 -0
  16. package/dist/render/backend/webgl2/boneAnimations.js +80 -0
  17. package/dist/render/backend/webgl2/instanced.d.ts +5 -1
  18. package/dist/render/backend/webgl2/instanced.js +13 -1
  19. package/dist/render/backend/webgl2/renderer.d.ts +180 -4
  20. package/dist/render/backend/webgl2/renderer.js +550 -40
  21. package/dist/render/backend/webgl2/skinPaletteTexture.d.ts +5 -3
  22. package/dist/render/backend/webgl2/skinPaletteTexture.js +6 -4
  23. package/dist/render/backend/webgpu/boneAnimations.d.ts +34 -0
  24. package/dist/render/backend/webgpu/boneAnimations.js +76 -0
  25. package/dist/render/backend/webgpu/buffers.d.ts +19 -4
  26. package/dist/render/backend/webgpu/buffers.js +18 -11
  27. package/dist/render/backend/webgpu/compressedUpload.d.ts +0 -1
  28. package/dist/render/backend/webgpu/compressedUpload.js +53 -8
  29. package/dist/render/backend/webgpu/depthPass.d.ts +59 -3
  30. package/dist/render/backend/webgpu/depthPass.js +49 -14
  31. package/dist/render/backend/webgpu/device.d.ts +7 -1
  32. package/dist/render/backend/webgpu/device.js +31 -3
  33. package/dist/render/backend/webgpu/drawCommand.d.ts +18 -4
  34. package/dist/render/backend/webgpu/drawCommand.js +10 -3
  35. package/dist/render/backend/webgpu/flatPass.d.ts +100 -42
  36. package/dist/render/backend/webgpu/flatPass.js +191 -43
  37. package/dist/render/backend/webgpu/instanced.d.ts +14 -1
  38. package/dist/render/backend/webgpu/instanced.js +24 -1
  39. package/dist/render/backend/webgpu/materialStore.d.ts +101 -0
  40. package/dist/render/backend/webgpu/materialStore.js +265 -0
  41. package/dist/render/backend/webgpu/pipelineCache.d.ts +6 -0
  42. package/dist/render/backend/webgpu/pipelineCache.js +7 -0
  43. package/dist/render/backend/webgpu/postPass.d.ts +51 -9
  44. package/dist/render/backend/webgpu/postPass.js +16 -2
  45. package/dist/render/backend/webgpu/reflectionSurfacePass.d.ts +30 -0
  46. package/dist/render/backend/webgpu/reflectionSurfacePass.js +100 -0
  47. package/dist/render/backend/webgpu/renderer.d.ts +283 -37
  48. package/dist/render/backend/webgpu/renderer.js +1363 -202
  49. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +7 -3
  50. package/dist/render/backend/webgpu/skinPaletteRing.js +13 -7
  51. package/dist/render/backend/webgpu/skinPaletteTexture.d.ts +6 -0
  52. package/dist/render/backend/webgpu/skinPaletteTexture.js +7 -1
  53. package/dist/render/backend/webgpu/staticBundles.d.ts +125 -0
  54. package/dist/render/backend/webgpu/staticBundles.js +241 -0
  55. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +10 -3
  56. package/dist/render/backend/webgpu/surfaceTexturePass.js +20 -2
  57. package/dist/render/backend/webgpu/uniformRing.d.ts +21 -0
  58. package/dist/render/backend/webgpu/uniformRing.js +9 -1
  59. package/dist/render/bloomChain.d.ts +3 -3
  60. package/dist/render/boneAnimation.d.ts +92 -0
  61. package/dist/render/boneAnimation.js +133 -0
  62. package/dist/render/compressedSource.d.ts +33 -13
  63. package/dist/render/compressedSource.js +70 -25
  64. package/dist/render/displayRange.d.ts +31 -0
  65. package/dist/render/displayRange.js +47 -0
  66. package/dist/render/filmicCurve.d.ts +74 -0
  67. package/dist/render/filmicCurve.js +203 -0
  68. package/dist/render/fog.d.ts +4 -1
  69. package/dist/render/fog.js +12 -2
  70. package/dist/render/frame/resources.d.ts +2 -2
  71. package/dist/render/frame/resources.js +6 -0
  72. package/dist/render/frameReflections.d.ts +40 -0
  73. package/dist/render/frameReflections.js +48 -0
  74. package/dist/render/glCompressed.js +83 -0
  75. package/dist/render/instances.d.ts +26 -0
  76. package/dist/render/lightBudget.d.ts +10 -0
  77. package/dist/render/lightBudget.js +10 -0
  78. package/dist/render/lightmap.d.ts +1 -1
  79. package/dist/render/mesh.d.ts +5 -0
  80. package/dist/render/mesh.js +6 -0
  81. package/dist/render/pass.d.ts +49 -0
  82. package/dist/render/pointLightSelection.d.ts +4 -4
  83. package/dist/render/reflectionSurfaceTargets.d.ts +28 -0
  84. package/dist/render/reflectionSurfaceTargets.js +99 -0
  85. package/dist/render/renderQuality.d.ts +39 -8
  86. package/dist/render/renderQuality.js +4 -0
  87. package/dist/render/sceneTarget.d.ts +5 -0
  88. package/dist/render/sceneTarget.js +24 -1
  89. package/dist/render/screenSpaceReflection.d.ts +7 -1
  90. package/dist/render/screenSpaceReflection.js +5 -0
  91. package/dist/render/shaders/arcane.d.ts +1 -1
  92. package/dist/render/shaders/bolt.d.ts +1 -1
  93. package/dist/render/shaders/boneAnimation.d.ts +19 -0
  94. package/dist/render/shaders/boneAnimation.js +63 -0
  95. package/dist/render/shaders/caustics.d.ts +1 -1
  96. package/dist/render/shaders/depth.d.ts +7 -0
  97. package/dist/render/shaders/depth.js +35 -10
  98. package/dist/render/shaders/film.d.ts +1 -1
  99. package/dist/render/shaders/filmLook.js +2 -1
  100. package/dist/render/shaders/fire.d.ts +1 -1
  101. package/dist/render/shaders/flat/glassTint.d.ts +1 -1
  102. package/dist/render/shaders/flat/glassTint.js +2 -0
  103. package/dist/render/shaders/flat/index.d.ts +16 -0
  104. package/dist/render/shaders/flat/index.js +33 -5
  105. package/dist/render/shaders/flat/main.d.ts +1 -1
  106. package/dist/render/shaders/flat/main.js +43 -5
  107. package/dist/render/shaders/flat/models.js +1 -1
  108. package/dist/render/shaders/flat/overlay.d.ts +16 -0
  109. package/dist/render/shaders/flat/overlay.js +117 -0
  110. package/dist/render/shaders/flat/pointShadow.js +3 -3
  111. package/dist/render/shaders/flat/preamble.js +38 -24
  112. package/dist/render/shaders/flat/reflectionSurface.d.ts +21 -0
  113. package/dist/render/shaders/flat/reflectionSurface.js +61 -0
  114. package/dist/render/shaders/fog.d.ts +1 -1
  115. package/dist/render/shaders/fog.js +9 -2
  116. package/dist/render/shaders/fringe.d.ts +29 -0
  117. package/dist/render/shaders/fringe.js +55 -0
  118. package/dist/render/shaders/generated/arcane.wgsl.d.ts +1 -1
  119. package/dist/render/shaders/generated/arcane.wgsl.js +1 -1
  120. package/dist/render/shaders/generated/bolt.wgsl.d.ts +1 -1
  121. package/dist/render/shaders/generated/bolt.wgsl.js +1 -1
  122. package/dist/render/shaders/generated/caustics.wgsl.d.ts +1 -1
  123. package/dist/render/shaders/generated/caustics.wgsl.js +1 -1
  124. package/dist/render/shaders/generated/depth.wgsl.d.ts +93 -0
  125. package/dist/render/shaders/generated/depth.wgsl.js +93 -0
  126. package/dist/render/shaders/generated/film.wgsl.d.ts +1 -1
  127. package/dist/render/shaders/generated/film.wgsl.js +1 -1
  128. package/dist/render/shaders/generated/fire.wgsl.d.ts +1 -1
  129. package/dist/render/shaders/generated/fire.wgsl.js +1 -1
  130. package/dist/render/shaders/generated/flat.wgsl.d.ts +3254 -2920
  131. package/dist/render/shaders/generated/flat.wgsl.js +3292 -2957
  132. package/dist/render/shaders/generated/line.wgsl.d.ts +1 -1
  133. package/dist/render/shaders/generated/line.wgsl.js +1 -1
  134. package/dist/render/shaders/generated/particle.wgsl.d.ts +4 -4
  135. package/dist/render/shaders/generated/particle.wgsl.js +4 -4
  136. package/dist/render/shaders/generated/rush.wgsl.d.ts +56 -26
  137. package/dist/render/shaders/generated/rush.wgsl.js +56 -26
  138. package/dist/render/shaders/generated/scatter.wgsl.d.ts +1 -1
  139. package/dist/render/shaders/generated/scatter.wgsl.js +1 -1
  140. package/dist/render/shaders/generated/smoke.wgsl.d.ts +1 -1
  141. package/dist/render/shaders/generated/smoke.wgsl.js +1 -1
  142. package/dist/render/shaders/generated/ssrResolve.wgsl.d.ts +29 -0
  143. package/dist/render/shaders/generated/ssrResolve.wgsl.js +29 -0
  144. package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +22 -2
  145. package/dist/render/shaders/generated/ssrTrace.wgsl.js +22 -2
  146. package/dist/render/shaders/generated/water.wgsl.d.ts +1 -1
  147. package/dist/render/shaders/generated/water.wgsl.js +1 -1
  148. package/dist/render/shaders/gpudriven/fog.wgsl.d.ts +2 -2
  149. package/dist/render/shaders/gpudriven/fog.wgsl.js +11 -3
  150. package/dist/render/shaders/line.d.ts +1 -1
  151. package/dist/render/shaders/outputTransform.d.ts +7 -0
  152. package/dist/render/shaders/outputTransform.js +28 -14
  153. package/dist/render/shaders/particle.d.ts +3 -3
  154. package/dist/render/shaders/rush.js +54 -11
  155. package/dist/render/shaders/scatter.d.ts +1 -1
  156. package/dist/render/shaders/smoke.d.ts +1 -1
  157. package/dist/render/shaders/ssrResolve.d.ts +17 -0
  158. package/dist/render/shaders/ssrResolve.js +51 -0
  159. package/dist/render/shaders/ssrTrace.js +26 -0
  160. package/dist/render/shaders/vertexChannel.d.ts +7 -0
  161. package/dist/render/shaders/vertexChannel.js +26 -0
  162. package/dist/render/shaders/water.d.ts +1 -1
  163. package/dist/render/ssrPass.d.ts +16 -0
  164. package/dist/render/ssrPass.js +106 -1
  165. package/dist/render/staticDraws.d.ts +47 -0
  166. package/dist/render/staticDraws.js +43 -0
  167. package/dist/render/surfaceOverlay.d.ts +132 -0
  168. package/dist/render/surfaceOverlay.js +85 -0
  169. package/dist/render/surfaceTexture.d.ts +57 -7
  170. package/dist/render/surfaceTexture.js +125 -17
  171. package/dist/render/temporalAa.d.ts +14 -0
  172. package/dist/render/temporalAa.js +20 -0
  173. package/dist/render/vertexDefaults.d.ts +17 -0
  174. package/dist/render/vertexDefaults.js +24 -0
  175. package/package.json +6 -6
  176. package/src/index.ts +24 -2
  177. package/src/render/ambientHarmonics.ts +1 -1
  178. package/src/render/areaLights.ts +4 -4
  179. package/src/render/atmosphere.ts +22 -1
  180. package/src/render/backend/api.ts +22 -3
  181. package/src/render/backend/createRenderer.ts +18 -1
  182. package/src/render/backend/select.ts +10 -5
  183. package/src/render/backend/webgl2/boneAnimations.ts +105 -0
  184. package/src/render/backend/webgl2/instanced.ts +20 -1
  185. package/src/render/backend/webgl2/renderer.ts +672 -37
  186. package/src/render/backend/webgl2/skinPaletteTexture.ts +6 -4
  187. package/src/render/backend/webgpu/boneAnimations.ts +97 -0
  188. package/src/render/backend/webgpu/buffers.ts +42 -16
  189. package/src/render/backend/webgpu/compressedUpload.ts +59 -9
  190. package/src/render/backend/webgpu/depthPass.ts +51 -10
  191. package/src/render/backend/webgpu/device.ts +42 -3
  192. package/src/render/backend/webgpu/drawCommand.ts +22 -4
  193. package/src/render/backend/webgpu/flatPass.ts +250 -40
  194. package/src/render/backend/webgpu/instanced.ts +32 -1
  195. package/src/render/backend/webgpu/materialStore.ts +276 -0
  196. package/src/render/backend/webgpu/pipelineCache.ts +7 -0
  197. package/src/render/backend/webgpu/postPass.ts +18 -0
  198. package/src/render/backend/webgpu/reflectionSurfacePass.ts +114 -0
  199. package/src/render/backend/webgpu/renderer.ts +1655 -230
  200. package/src/render/backend/webgpu/skinPaletteRing.ts +13 -7
  201. package/src/render/backend/webgpu/skinPaletteTexture.ts +7 -1
  202. package/src/render/backend/webgpu/staticBundles.ts +363 -0
  203. package/src/render/backend/webgpu/surfaceTexturePass.ts +29 -3
  204. package/src/render/backend/webgpu/uniformRing.ts +10 -1
  205. package/src/render/bloomChain.ts +3 -3
  206. package/src/render/boneAnimation.ts +223 -0
  207. package/src/render/compressedSource.ts +121 -29
  208. package/src/render/displayRange.ts +61 -0
  209. package/src/render/filmicCurve.ts +229 -0
  210. package/src/render/fog.ts +19 -3
  211. package/src/render/frame/resources.ts +6 -0
  212. package/src/render/frameReflections.ts +72 -0
  213. package/src/render/glCompressed.ts +83 -0
  214. package/src/render/instances.ts +27 -0
  215. package/src/render/lightBudget.ts +11 -0
  216. package/src/render/lightmap.ts +1 -1
  217. package/src/render/mesh.ts +6 -0
  218. package/src/render/pass.ts +53 -1
  219. package/src/render/pointLightSelection.ts +4 -4
  220. package/src/render/reflectionSurfaceTargets.ts +105 -0
  221. package/src/render/renderQuality.ts +44 -8
  222. package/src/render/sceneTarget.ts +30 -2
  223. package/src/render/screenSpaceReflection.ts +7 -1
  224. package/src/render/shaders/boneAnimation.ts +63 -0
  225. package/src/render/shaders/depth.ts +45 -10
  226. package/src/render/shaders/filmLook.ts +2 -1
  227. package/src/render/shaders/flat/glassTint.ts +5 -1
  228. package/src/render/shaders/flat/index.ts +49 -5
  229. package/src/render/shaders/flat/main.ts +43 -5
  230. package/src/render/shaders/flat/models.ts +1 -1
  231. package/src/render/shaders/flat/overlay.ts +117 -0
  232. package/src/render/shaders/flat/pointShadow.ts +3 -3
  233. package/src/render/shaders/flat/preamble.ts +38 -24
  234. package/src/render/shaders/flat/reflectionSurface.ts +61 -0
  235. package/src/render/shaders/fog.ts +9 -2
  236. package/src/render/shaders/fringe.ts +59 -0
  237. package/src/render/shaders/generated/arcane.wgsl.ts +1 -1
  238. package/src/render/shaders/generated/bolt.wgsl.ts +1 -1
  239. package/src/render/shaders/generated/caustics.wgsl.ts +1 -1
  240. package/src/render/shaders/generated/depth.wgsl.ts +95 -0
  241. package/src/render/shaders/generated/film.wgsl.ts +1 -1
  242. package/src/render/shaders/generated/fire.wgsl.ts +1 -1
  243. package/src/render/shaders/generated/flat.wgsl.ts +3292 -2957
  244. package/src/render/shaders/generated/line.wgsl.ts +1 -1
  245. package/src/render/shaders/generated/particle.wgsl.ts +4 -4
  246. package/src/render/shaders/generated/rush.wgsl.ts +56 -26
  247. package/src/render/shaders/generated/scatter.wgsl.ts +1 -1
  248. package/src/render/shaders/generated/smoke.wgsl.ts +1 -1
  249. package/src/render/shaders/generated/ssrResolve.wgsl.ts +30 -0
  250. package/src/render/shaders/generated/ssrTrace.wgsl.ts +22 -2
  251. package/src/render/shaders/generated/water.wgsl.ts +1 -1
  252. package/src/render/shaders/gpudriven/fog.wgsl.ts +11 -3
  253. package/src/render/shaders/outputTransform.ts +30 -14
  254. package/src/render/shaders/rush.ts +54 -11
  255. package/src/render/shaders/ssrResolve.ts +52 -0
  256. package/src/render/shaders/ssrTrace.ts +26 -0
  257. package/src/render/shaders/vertexChannel.ts +27 -0
  258. package/src/render/ssrPass.ts +138 -1
  259. package/src/render/staticDraws.ts +95 -0
  260. package/src/render/surfaceOverlay.ts +195 -0
  261. package/src/render/surfaceTexture.ts +161 -27
  262. package/src/render/temporalAa.ts +20 -0
  263. package/src/render/vertexDefaults.ts +28 -0
@@ -2,7 +2,7 @@
2
2
  * One recorded draw, in the only shape this backend ever issues.
3
3
  *
4
4
  * Sampled across three unrelated verbs — panels, particles, wind streaks — the sequence is the
5
- * same every time: a pipeline, a bind group with up to two dynamic offsets, some vertex
5
+ * same every time: a pipeline, a bind group with up to four dynamic offsets, some vertex
6
6
  * buffers, perhaps an index buffer, then a draw. Nothing in it is specific to what is being
7
7
  * drawn except the values.
8
8
  *
@@ -13,9 +13,14 @@
13
13
  export interface DrawCommand {
14
14
  pipeline: GPURenderPipeline | null;
15
15
  bindGroup: GPUBindGroup | null;
16
- /** Dynamic offsets, held as two numbers rather than an array so a reset stays free. */
16
+ /**
17
+ * Dynamic offsets, held as numbers rather than an array so a reset stays free. Four only for a
18
+ * lit mesh: its draw's slot, its pass's, its material's and its view's, in binding order.
19
+ */
17
20
  offsetA: number;
18
21
  offsetB: number;
22
+ offsetC: number;
23
+ offsetD: number;
19
24
  offsetCount: number;
20
25
  /** Fixed length; `vertexCount` says how many slots are live. */
21
26
  readonly vertexBuffers: (GPUBuffer | null)[];
@@ -29,6 +34,12 @@ export interface DrawCommand {
29
34
  * cull's survivors, counted on the device. Null for every other draw.
30
35
  */
31
36
  indirect: GPUBuffer | null;
37
+ /**
38
+ * Render bundles to execute instead of everything above: a static list recorded once, replayed
39
+ * as one command. Held as the array `executeBundles` takes, kept by the list, so issuing it
40
+ * allocates nothing. Null for every other command, and put back to null by every take.
41
+ */
42
+ bundles: readonly GPURenderBundle[] | null;
32
43
  }
33
44
  export interface CommandPool {
34
45
  commands: DrawCommand[];
@@ -40,8 +51,11 @@ export declare function createCommandPool(capacity: number): CommandPool;
40
51
  /**
41
52
  * Hand out the next command, growing if a frame overruns.
42
53
  *
43
- * The entry is **not cleared**. Every caller fills every field it uses, and clearing here would
44
- * be a write per field per draw for no reader — the same reasoning the node arena uses.
54
+ * The entry is **not cleared**, but for `bundles`. Every caller fills every field it uses, and
55
+ * clearing here would be a write per field per draw for no reader — the same reasoning the node
56
+ * arena uses. `bundles` is the exception because almost no caller knows it exists: a pooled command
57
+ * that once carried a static list's bundles and was then taken for an ordinary draw would replay the
58
+ * list instead, so the one field nobody fills is the one field put back here.
45
59
  */
46
60
  export declare function takeCommand(pool: CommandPool): number;
47
61
  /** Empty the pool for a new frame. Keeps every entry; that is the whole point. */
@@ -2,7 +2,7 @@
2
2
  * One recorded draw, in the only shape this backend ever issues.
3
3
  *
4
4
  * Sampled across three unrelated verbs — panels, particles, wind streaks — the sequence is the
5
- * same every time: a pipeline, a bind group with up to two dynamic offsets, some vertex
5
+ * same every time: a pipeline, a bind group with up to four dynamic offsets, some vertex
6
6
  * buffers, perhaps an index buffer, then a draw. Nothing in it is specific to what is being
7
7
  * drawn except the values.
8
8
  *
@@ -22,6 +22,8 @@ function emptyCommand() {
22
22
  bindGroup: null,
23
23
  offsetA: 0,
24
24
  offsetB: 0,
25
+ offsetC: 0,
26
+ offsetD: 0,
25
27
  offsetCount: 0,
26
28
  vertexBuffers: new Array(VERTEX_BUFFER_SLOTS).fill(null),
27
29
  vertexCount: 0,
@@ -30,6 +32,7 @@ function emptyCommand() {
30
32
  count: 0,
31
33
  instances: 1,
32
34
  indirect: null,
35
+ bundles: null,
33
36
  };
34
37
  }
35
38
  export function createCommandPool(capacity) {
@@ -41,8 +44,11 @@ export function createCommandPool(capacity) {
41
44
  /**
42
45
  * Hand out the next command, growing if a frame overruns.
43
46
  *
44
- * The entry is **not cleared**. Every caller fills every field it uses, and clearing here would
45
- * be a write per field per draw for no reader — the same reasoning the node arena uses.
47
+ * The entry is **not cleared**, but for `bundles`. Every caller fills every field it uses, and
48
+ * clearing here would be a write per field per draw for no reader — the same reasoning the node
49
+ * arena uses. `bundles` is the exception because almost no caller knows it exists: a pooled command
50
+ * that once carried a static list's bundles and was then taken for an ordinary draw would replay the
51
+ * list instead, so the one field nobody fills is the one field put back here.
46
52
  */
47
53
  export function takeCommand(pool) {
48
54
  const at = pool.taken;
@@ -51,6 +57,7 @@ export function takeCommand(pool) {
51
57
  pool.taken = at + 1;
52
58
  if (pool.taken > pool.highWater)
53
59
  pool.highWater = pool.taken;
60
+ pool.commands[at].bundles = null;
54
61
  return at;
55
62
  }
56
63
  /** Empty the pool for a new frame. Keeps every entry; that is the whole point. */
@@ -63,11 +63,27 @@ export interface StageBindings {
63
63
  readonly textures: Readonly<Record<string, TextureBinding>>;
64
64
  /** Each pipeline-overridable constant's id, by the GLSL name it was declared under. */
65
65
  readonly overrides?: Readonly<Record<string, number>>;
66
+ /**
67
+ * The second block, of the uniforms marked `// wgsl:material`: its binding, size and fields.
68
+ * Absent from a stage that marks none, which is every stage but the lit fragment's.
69
+ */
70
+ readonly materialUniforms?: number;
71
+ readonly materialSize?: number;
72
+ readonly materialFields?: StageBindings['fields'];
73
+ /**
74
+ * The vertex stage's view block, of the uniforms marked `// wgsl:view`: the camera, the light's
75
+ * matrix and the wind, which a pass settles. Absent from every stage but the lit vertex one.
76
+ */
77
+ readonly viewUniforms?: number;
78
+ readonly viewSize?: number;
79
+ readonly viewFields?: StageBindings['fields'];
66
80
  }
67
81
  /** The key for a set of vertex flags: the same rule `variantKey` uses, flags on, sorted, joined. */
68
- export declare function flatVertexKey(skinned: boolean, morphed: boolean, instanced?: boolean): string;
82
+ export declare function flatVertexKey(skinned: boolean, morphed: boolean, instanced?: boolean,
83
+ /** Whether an instanced variant plays a bone animation. See `shaders/boneAnimation.ts`. */
84
+ animated?: boolean): string;
69
85
  /** Everything the generator recorded about one variant of the vertex stage. */
70
- export declare function flatVertexBindings(skinned: boolean, morphed?: boolean, instanced?: boolean): StageBindings;
86
+ export declare function flatVertexBindings(skinned: boolean, morphed?: boolean, instanced?: boolean, animated?: boolean): StageBindings;
71
87
  /**
72
88
  * A vertex stage's constants, keyed by each override's **id** as the fragment's are: `SKIN_EIGHT` and
73
89
  * `CLOTH_BOUND` in a skinned stage, `LIGHTMAP_REGIONS` in an instanced one, nothing in any other. Every override a stage declares is set, and one this does
@@ -78,63 +94,51 @@ export declare function vertexConstants(bindings: StageBindings, skinEight: bool
78
94
  /** Whether an instanced stage reads its tint lane as a lightmap region. See `lightmap.ts`. */
79
95
  lightmapRegions?: boolean): Record<string, number>;
80
96
  export declare const FLAT_VERT_FIELDS: {
81
- readonly uViewProj: {
82
- readonly offset: 0;
83
- readonly size: 64;
84
- readonly type: "mat4";
85
- };
86
97
  readonly uHasTangents: {
87
- readonly offset: 64;
98
+ readonly offset: 0;
88
99
  readonly size: 4;
89
100
  readonly type: "int";
90
101
  };
91
- readonly uLightViewProj: {
92
- readonly offset: 80;
93
- readonly size: 64;
94
- readonly type: "mat4";
95
- };
96
102
  readonly uUvScale: {
97
- readonly offset: 144;
103
+ readonly offset: 8;
98
104
  readonly size: 8;
99
105
  readonly type: "vec2";
100
106
  };
101
107
  readonly uUvOffset: {
102
- readonly offset: 152;
108
+ readonly offset: 16;
103
109
  readonly size: 8;
104
110
  readonly type: "vec2";
105
111
  };
106
112
  readonly uModel: {
107
- readonly offset: 160;
113
+ readonly offset: 32;
108
114
  readonly size: 64;
109
115
  readonly type: "mat4";
110
116
  };
111
117
  readonly uTint: {
112
- readonly offset: 224;
118
+ readonly offset: 96;
113
119
  readonly size: 12;
114
120
  readonly type: "vec3";
115
121
  };
116
- readonly uWindDirection: {
117
- readonly offset: 240;
118
- readonly size: 8;
119
- readonly type: "vec2";
120
- };
121
- readonly uWindSpeed: {
122
- readonly offset: 248;
122
+ };
123
+ /** The animated instanced variant's block: the instanced fields, and the clip's `uBoneClip`. */
124
+ export declare const FLAT_ANIMATED_VERT_FIELDS: {
125
+ readonly uHasTangents: {
126
+ readonly offset: 0;
123
127
  readonly size: 4;
124
- readonly type: "float";
128
+ readonly type: "int";
125
129
  };
126
- readonly uWindGust: {
127
- readonly offset: 252;
128
- readonly size: 4;
129
- readonly type: "float";
130
+ readonly uUvScale: {
131
+ readonly offset: 8;
132
+ readonly size: 8;
133
+ readonly type: "vec2";
130
134
  };
131
- readonly uWindTime: {
132
- readonly offset: 256;
133
- readonly size: 4;
134
- readonly type: "float";
135
+ readonly uUvOffset: {
136
+ readonly offset: 16;
137
+ readonly size: 8;
138
+ readonly type: "vec2";
135
139
  };
136
- readonly uWindSpatialPhase: {
137
- readonly offset: 264;
140
+ readonly uBoneClip: {
141
+ readonly offset: 24;
138
142
  readonly size: 8;
139
143
  readonly type: "vec2";
140
144
  };
@@ -147,18 +151,63 @@ export declare const FLAT_VERT_FIELDS: {
147
151
  * 144 bytes a slot and is what a single ring costs.
148
152
  */
149
153
  export declare const FLAT_VERT_SIZE: number;
154
+ /** The view block's fields, binding and size: the largest variant's, as `FLAT_VERT_SIZE` is. */
155
+ export declare const FLAT_VIEW_FIELDS: Readonly<Record<string, {
156
+ readonly offset: number;
157
+ readonly size: number;
158
+ readonly length?: number;
159
+ readonly stride?: number;
160
+ }>>;
161
+ export declare const FLAT_VIEW_SIZE: number;
162
+ /**
163
+ * The most sampled textures and distinct samplers any lit variant carrying the environment probe
164
+ * binds in its fragment stage, counted from the generated bindings: what a device must allow per
165
+ * stage before the probe's permutation can be built. A sampler several textures share counts once,
166
+ * which is what `// wgsl:share` buys.
167
+ */
168
+ export declare function probeStageCeilings(): {
169
+ readonly textures: number;
170
+ readonly samplers: number;
171
+ };
150
172
  /** Everything the generator recorded about one permutation of the fragment stage. */
151
173
  export declare function flatFragmentBindings(variant: FlatVariant): StageBindings;
174
+ /**
175
+ * The lit fragment stage's two blocks as the renderer keeps them on the CPU: the pass's, then the
176
+ * material's straight after it, in one scratch, with every field at its offset in that scratch.
177
+ *
178
+ * **One scratch rather than two, so no setter has to know which block its field is in.** A setter
179
+ * writes by name, as it always has; the draw copies the material's bytes — `passSize` onwards — into
180
+ * the store and the pass's bytes into a ring slot, each only when something has changed it.
181
+ */
182
+ export interface FlatFragmentScratch {
183
+ readonly fields: StageBindings['fields'];
184
+ /** Bytes of the pass's block, which is where the material's starts in the scratch. */
185
+ readonly passSize: number;
186
+ readonly passBinding: number;
187
+ readonly materialSize: number;
188
+ readonly materialBinding: number;
189
+ }
190
+ export declare function flatFragmentScratch(variant: FlatVariant): FlatFragmentScratch;
152
191
  /** The depth format both backends compare with. */
153
192
  export { DEPTH_FORMAT } from '../../depthConvention.ts';
154
193
  /**
155
194
  * The layout this variant binds against.
156
195
  *
157
- * The vertex block is **dynamic**, because every draw supplies its own model matrix and tint
158
- * from its own slot of one buffer. The fragment block is not: it holds the lights, the fog
159
- * and the camera, settled once by `bindMeshPass` and unchanged between draws.
196
+ * All four blocks are **dynamic**: the vertex block because every draw supplies its own model
197
+ * matrix and tint from its own slot of one buffer; the fragment stage's pass block — the lights, the
198
+ * fog, the camera — and the vertex stage's view block because a frame binds more than one pass; and
199
+ * the material block because a material changes between draws. Their dynamic offsets go in binding
200
+ * order: the draw's, the pass's, the material's, the view's.
160
201
  */
161
- export declare function createFlatBindGroupLayout(device: GPUDevice, variant: FlatVariant, skinned?: boolean, morphed?: boolean): GPUBindGroupLayout;
202
+ export declare function createFlatBindGroupLayout(device: GPUDevice, variant: FlatVariant, skinned?: boolean, morphed?: boolean,
203
+ /** The instanced variant that plays a bone animation: its three vertex textures. */
204
+ animated?: boolean): GPUBindGroupLayout;
205
+ /** What an animated draw binds besides its material: the clip's two textures and its batch's clocks. */
206
+ export interface AnimationViews {
207
+ readonly places: GPUTextureView;
208
+ readonly turns: GPUTextureView;
209
+ readonly clocks: GPUTextureView;
210
+ }
162
211
  /**
163
212
  * Bind the buffers and one view per declared texture.
164
213
  *
@@ -168,7 +217,7 @@ export declare function createFlatBindGroupLayout(device: GPUDevice, variant: Fl
168
217
  * and WebGPU still requires something there, which is why `renderer.ts` keeps an
169
218
  * `emptyTexture2D` for the same reason on the other side.
170
219
  */
171
- export declare function createFlatBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, variant: FlatVariant, perDraw: GPUBuffer, perFrame: GPUBuffer, resolve: (name: string) => {
220
+ export declare function createFlatBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, variant: FlatVariant, perDraw: GPUBuffer, passes: GPUBuffer, materials: GPUBuffer, views: GPUBuffer, resolve: (name: string) => {
172
221
  view: GPUTextureView;
173
222
  sampler: GPUSampler;
174
223
  },
@@ -177,7 +226,9 @@ palette?: GPUTextureView | null,
177
226
  /** The delta view for a morphed bind group, or null for an unmorphed one. */
178
227
  deltas?: GPUTextureView | null,
179
228
  /** A skinned bind group's cloth views — the draw's, or the stand-in where it sets none. */
180
- cloth?: ClothViews | null): GPUBindGroup;
229
+ cloth?: ClothViews | null,
230
+ /** An animated instanced group's views. See `AnimationViews`. */
231
+ animation?: AnimationViews | null): GPUBindGroup;
181
232
  /**
182
233
  * The pipeline, cached by the state that distinguishes it.
183
234
  *
@@ -236,7 +287,14 @@ cloth?: boolean,
236
287
  /** Which shading model its fragment stage shades by, null the standard. The key must carry it. */
237
288
  model?: SurfaceModelKind | null,
238
289
  /** Which half of a skin it draws. The key must carry it: `|ss`, `|sd` or `|sa`. See `SkinHalf`. */
239
- skinPass?: SkinHalf): GPURenderPipeline;
290
+ skinPass?: SkinHalf,
291
+ /**
292
+ * The reflection pass's surface half: the draw again, against its own depth, into the two
293
+ * targets `reflectionSurfacePass.ts` holds. The key must carry it: `|rs`.
294
+ */
295
+ reflectionSurface?: boolean,
296
+ /** An instanced pipeline that plays a bone animation. The key must carry it: `|anim`. */
297
+ animated?: boolean): GPURenderPipeline;
240
298
  /**
241
299
  * The same pipeline, compiled off the main thread.
242
300
  *