@woosh/meep-engine 3.11.1 → 3.11.3

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 (225) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  4. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +294 -290
  5. package/src/engine/graphics3/ParticipatingMedia.d.ts +111 -0
  6. package/src/engine/graphics3/ParticipatingMedia.d.ts.map +1 -0
  7. package/src/engine/graphics3/ParticipatingMedia.js +203 -0
  8. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts +34 -0
  9. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts.map +1 -0
  10. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.js +73 -0
  11. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +87 -0
  12. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -0
  13. package/src/engine/graphics3/ParticipatingMediaSystem3.js +184 -0
  14. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  15. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
  16. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
  17. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
  18. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
  19. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  20. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
  21. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
  22. package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
  23. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  24. package/src/shade/device/ShadeGPUCommandContext.js +994 -940
  25. package/src/shade/device/immediate_data_supported.d.ts +33 -0
  26. package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
  27. package/src/shade/device/immediate_data_supported.js +53 -0
  28. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
  29. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  30. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
  31. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
  32. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  33. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
  34. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  35. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
  36. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
  37. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
  38. package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
  39. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
  40. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  41. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
  42. package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
  43. package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
  44. package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
  45. package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
  46. package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
  47. package/src/shade/playground/volumetrics_froxel/README.md +104 -1
  48. package/src/shade/playground/volumetrics_froxel/index.html +20 -1
  49. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  50. package/src/shade/playground/volumetrics_froxel/main.js +298 -0
  51. package/src/shade/playground/volumetrics_froxel/measure.d.ts +119 -0
  52. package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -0
  53. package/src/shade/playground/volumetrics_froxel/measure.js +559 -0
  54. package/src/shade/renderer/GraphicsContext.d.ts +9 -2
  55. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  56. package/src/shade/renderer/GraphicsContext.js +13 -1
  57. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  58. package/src/shade/renderer/Renderer.js +22 -18
  59. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  60. package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
  61. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
  62. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
  63. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
  64. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
  65. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
  66. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
  67. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
  68. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  69. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
  70. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
  71. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
  72. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
  73. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
  74. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  75. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
  76. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
  77. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  78. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
  79. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
  80. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  81. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
  82. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
  83. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
  84. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
  85. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
  86. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
  87. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
  88. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
  89. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
  90. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
  91. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
  92. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  93. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +165 -84
  94. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  95. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
  96. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  97. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
  98. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  99. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +6 -2
  100. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  101. package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
  102. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  103. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  104. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
  105. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  106. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  107. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  108. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  109. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
  110. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  111. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
  112. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  113. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
  114. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  115. package/src/shade/renderer/shader/ComputeShader.js +6 -2
  116. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  117. package/src/shade/renderer/shader/ImageShader.js +4 -1
  118. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  119. package/src/shade/renderer/shader/ShaderDescriptor.js +26 -0
  120. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
  121. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
  122. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
  123. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
  124. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
  125. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
  126. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
  127. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
  128. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
  129. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
  130. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
  131. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
  132. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
  133. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
  134. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
  135. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
  136. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
  137. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
  138. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
  139. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
  140. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
  141. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
  142. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
  143. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
  144. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  145. package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
  146. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
  147. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
  148. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
  149. package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
  150. package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
  151. package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
  152. package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
  153. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
  154. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
  155. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
  156. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  157. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
  158. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
  159. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
  160. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
  161. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
  162. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  163. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
  164. package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
  165. package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
  166. package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
  167. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts +14 -13
  168. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  169. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +133 -129
  170. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
  171. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
  172. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  173. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +480 -315
  174. package/src/shade/renderer/volumetrics/NOTES.md +887 -8
  175. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +5 -0
  176. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  177. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +21 -2
  178. package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts +26 -0
  179. package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts.map +1 -1
  180. package/src/shade/renderer/volumetrics/SceneVolumetrics.js +64 -21
  181. package/src/shade/renderer/volumetrics/VOLUMETRICS_METADATA_STRUCT.d.ts.map +1 -1
  182. package/src/shade/renderer/volumetrics/VOLUMETRICS_METADATA_STRUCT.js +84 -28
  183. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.d.ts +98 -0
  184. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.d.ts.map +1 -0
  185. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.js +111 -0
  186. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.d.ts +84 -0
  187. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.d.ts.map +1 -0
  188. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.js +252 -0
  189. package/src/shade/renderer/volumetrics/chunk_integrate_optical_depth.js +75 -75
  190. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.d.ts +43 -0
  191. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.d.ts.map +1 -0
  192. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -0
  193. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts +20 -0
  194. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts.map +1 -0
  195. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.js +48 -0
  196. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts +38 -0
  197. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -0
  198. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +130 -0
  199. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +18 -3
  200. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  201. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +193 -70
  202. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +16 -0
  203. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  204. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +83 -15
  205. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  206. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
  207. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
  208. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +58 -0
  209. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -0
  210. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +290 -0
  211. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +25 -0
  212. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
  213. package/src/shade/wgsl/emulator/CPUBitmapData.js +33 -0
  214. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +2228 -2215
  215. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  216. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +210 -2
  217. package/src/shade/wgsl/emulator/cpu_texture_gather.d.ts +69 -0
  218. package/src/shade/wgsl/emulator/cpu_texture_gather.d.ts.map +1 -0
  219. package/src/shade/wgsl/emulator/cpu_texture_gather.js +148 -0
  220. package/src/shade/wgsl/emulator/cpu_texture_sample.d.ts +16 -0
  221. package/src/shade/wgsl/emulator/cpu_texture_sample.d.ts.map +1 -1
  222. package/src/shade/wgsl/emulator/cpu_texture_sample.js +176 -172
  223. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
  224. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
  225. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
@@ -1,4 +1,32 @@
1
1
  export class ShaderResourceSetDescriptor {
2
+ /**
3
+ * @returns {{name: string, type: WebGPUType}|undefined}
4
+ */
5
+ get immediate(): {
6
+ name: string;
7
+ type: WebGPUType;
8
+ };
9
+ /**
10
+ * Bytes of immediate data this shader reads, rounded up to the 4-byte granularity WebGPU
11
+ * requires of `immediateSize`. Zero when there is no immediate declaration.
12
+ *
13
+ * @returns {number}
14
+ */
15
+ get immediateSize(): number;
16
+ /**
17
+ * Declare this shader's immediate data — the WGSL `immediate` address space, which reaches the
18
+ * GPU through `setImmediates` on the pass encoder rather than through a bind group.
19
+ *
20
+ * Every restriction below is checked here rather than left to `createShaderModule`, because the
21
+ * device-side failure is a shader-creation error whose message names neither this descriptor nor
22
+ * the shader it belongs to.
23
+ *
24
+ * @param {string} name
25
+ * @param {WebGPUType|string} _type must be host-shareable, constructible, array-free, and fit
26
+ * the device's `maxImmediateSize`
27
+ * @returns {this}
28
+ */
29
+ setImmediate(name: string, _type: WebGPUType | string): this;
2
30
  /**
3
31
  * Do not modify directly
4
32
  * @returns {ShaderResourceGroupDescriptor[]}
@@ -14,7 +42,20 @@ export class ShaderResourceSetDescriptor {
14
42
  * @param {string} name
15
43
  * @returns {ShaderResourceDescriptor}
16
44
  */
17
- getResourceByName(name: string): ShaderResourceDescriptor;
45
+ /**
46
+ * Whether `name` is this shader's immediate data.
47
+ *
48
+ * Immediate data is deliberately absent from {@link getResourceByName}: it is not a bound
49
+ * resource and has no binding layout, so anything walking the resource interface should not see
50
+ * it. The graph helpers still need to recognise the name, because an immediate value travels to
51
+ * the encoder as a plain value rather than as a graph resource — and a `u32` immediate is a
52
+ * number, which those helpers would otherwise read as a graph resource id.
53
+ *
54
+ * @param {string} name
55
+ * @returns {boolean}
56
+ */
57
+ isImmediateName(name: string): boolean;
58
+ getResourceByName(name: any): import("./ShaderResourceDescriptor.js").ShaderResourceDescriptor;
18
59
  /**
19
60
  *
20
61
  * @param {number} [index]
@@ -60,6 +101,23 @@ export class ShaderResourceSetDescriptor {
60
101
  * @return {CodeChunk}
61
102
  */
62
103
  generateCodeChunk(): CodeChunk;
104
+ /**
105
+ * Serialise this shader's immediate data into `buffer` at its current `position`, advancing
106
+ * `position` past what was written.
107
+ *
108
+ * **Allocates nothing.** That is the point of taking a caller-owned {@link BinaryBuffer} rather
109
+ * than returning bytes: `write_gpu_typed_buffer` would rebind a scratch buffer with a fresh
110
+ * `DataView` and `Uint8Array` on every call, which is two allocations per dispatch for a value
111
+ * that is often four bytes. {@link write_wgsl_type_value} takes the buffer directly and does not.
112
+ *
113
+ * The caller owns `position` because the caller owns the buffer — this only ever appends at the
114
+ * cursor it is handed.
115
+ *
116
+ * @param {Object} map the same binding map {@link generateBindings} reads
117
+ * @param {BinaryBuffer} buffer must already be set to the platform's endianness
118
+ * @returns {boolean} false when this shader declares no immediate data, and nothing was written
119
+ */
120
+ writeImmediate(map: any, buffer: BinaryBuffer): boolean;
63
121
  #private;
64
122
  }
65
123
  export namespace ShaderResourceSetDescriptor {
@@ -1 +1 @@
1
- {"version":3,"file":"ShaderResourceSetDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js"],"names":[],"mappings":"AAwHA;IAQI;;;OAGG;IACH,8CAEC;IAGD;;;OAGG;IACH,6CAEC;IAaD;;;;OAIG;IACH,wBAHW,MAAM,4BAehB;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GAEJ,6BAA6B,CAsBzC;IAED;;;;OAIG;IACH,gBAHW,6BAA6B,GAC3B,OAAO,CAQnB;IAED;;;OAGG;IACH,qBAFW,iBAAe,MAAM,QAW/B;IAED;;OAEG;IACH,oCAFa,wBAAwB,CAepC;IAED;;;OAGG;IACH,yBAFY,EAAE,EAAE,CAcf;IAED;;;;OAIG;IACH,8BAHW,iBAAe,MAAM,GACnB,wBAAwB,CAMpC;IAED;;;;;OAKG;IACH,8DAFa,oBAAoB,EAAE,CAgBlC;IAED;;;OAGG;IACH,qBAFY,SAAS,CAoFpB;;CACJ;;eAKS,SAAS,2BAA2B,CAAC;;8CA9XD,oCAAoC;yCANzC,0DAA0D;0BAIzE,0BAA0B"}
1
+ {"version":3,"file":"ShaderResourceSetDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js"],"names":[],"mappings":"AA8HA;IAoBI;;OAEG;IACH;cAFoB,MAAM;;MAIzB;IAED;;;;;OAKG;IACH,4BAMC;IAED;;;;;;;;;;;;OAYG;IACH,mBALW,MAAM,SACN,aAAW,MAAM,GAEf,IAAI,CA6ChB;IAED;;;OAGG;IACH,8CAEC;IAGD;;;OAGG;IACH,6CAEC;IAaD;;;;OAIG;IACH;;;;;;;;;;;OAWG;IACH,sBAHW,MAAM,GACJ,OAAO,CAInB;IAED,+FAYC;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GAEJ,6BAA6B,CAsBzC;IAED;;;;OAIG;IACH,gBAHW,6BAA6B,GAC3B,OAAO,CAQnB;IAED;;;OAGG;IACH,qBAFW,iBAAe,MAAM,QAW/B;IAED;;OAEG;IACH,oCAFa,wBAAwB,CAiBpC;IAED;;;OAGG;IACH,yBAFY,EAAE,EAAE,CAcf;IAED;;;;OAIG;IACH,8BAHW,iBAAe,MAAM,GACnB,wBAAwB,CAMpC;IAED;;;;;OAKG;IACH,8DAFa,oBAAoB,EAAE,CAgBlC;IAED;;;OAGG;IACH,qBAFY,SAAS,CAwGpB;IAED;;;;;;;;;;;;;;;OAeG;IACH,gDAFa,OAAO,CA0CnB;;CACJ;;eAKS,SAAS,2BAA2B,CAAC;;8CAzjBD,oCAAoC;yCAXzC,0DAA0D;0BAIzE,0BAA0B"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
+ import { round_up } from "../../../../core/math/round_up.js";
2
3
  import LineBuilder from "../../../../core/codegen/LineBuilder.js";
3
4
  import { array_push_if_unique } from "../../../../core/collection/array/array_push_if_unique.js";
4
5
  import { objectKeyByValue } from "../../../../core/model/object/objectKeyByValue.js";
@@ -7,6 +8,11 @@ import {
7
8
  wgsl_texture_declaration_by_sample_type
8
9
  } from "../../texture/format/wgsl_texture_declaration_by_sample_type.js";
9
10
  import { CodeChunk } from "../compiler/CodeChunk.js";
11
+ import { parse_wgsl_type } from "../type/parse_wgsl_type.js";
12
+ import { type_has_arrays } from "../type/type_has_arrays.js";
13
+ import { type_has_atomics } from "../type/type_has_atomics.js";
14
+ import { write_wgsl_type_value } from "../type/serde/write_gpu_typed_buffer.js";
15
+ import { IMMEDIATE_ADDRESS_SPACE_EXTENSION, IMMEDIATE_SIZE_FLOOR } from "./IMMEDIATE_DATA.js";
10
16
  import { ResourceType } from "./ResourceType.js";
11
17
  import { ShaderResourceGroupDescriptor } from "./ShaderResourceGroupDescriptor.js";
12
18
 
@@ -126,6 +132,97 @@ export class ShaderResourceSetDescriptor {
126
132
  */
127
133
  #groups = [];
128
134
 
135
+ /**
136
+ * The shader's immediate data declaration, or undefined when it has none.
137
+ *
138
+ * Deliberately not a member of any {@link ShaderResourceGroupDescriptor}: immediate data has no
139
+ * `@group` and no `@binding`, and WGSL is explicit that it is part of a shader's *interface*
140
+ * without being part of its *resource interface*. Modelling it as a group member would give it
141
+ * a binding index that does not exist.
142
+ *
143
+ * @type {{name: string, type: WebGPUType}|undefined}
144
+ */
145
+ #immediate = undefined;
146
+
147
+ /**
148
+ * @returns {{name: string, type: WebGPUType}|undefined}
149
+ */
150
+ get immediate() {
151
+ return this.#immediate;
152
+ }
153
+
154
+ /**
155
+ * Bytes of immediate data this shader reads, rounded up to the 4-byte granularity WebGPU
156
+ * requires of `immediateSize`. Zero when there is no immediate declaration.
157
+ *
158
+ * @returns {number}
159
+ */
160
+ get immediateSize() {
161
+ if (this.#immediate === undefined) {
162
+ return 0;
163
+ }
164
+
165
+ return round_up(this.#immediate.type.size, 4);
166
+ }
167
+
168
+ /**
169
+ * Declare this shader's immediate data — the WGSL `immediate` address space, which reaches the
170
+ * GPU through `setImmediates` on the pass encoder rather than through a bind group.
171
+ *
172
+ * Every restriction below is checked here rather than left to `createShaderModule`, because the
173
+ * device-side failure is a shader-creation error whose message names neither this descriptor nor
174
+ * the shader it belongs to.
175
+ *
176
+ * @param {string} name
177
+ * @param {WebGPUType|string} _type must be host-shareable, constructible, array-free, and fit
178
+ * the device's `maxImmediateSize`
179
+ * @returns {this}
180
+ */
181
+ setImmediate(name, _type) {
182
+ assert.isString(name, 'name');
183
+ assert.defined(_type, 'type');
184
+
185
+ if (this.#immediate !== undefined) {
186
+ throw new Error(
187
+ `Immediate data is already declared as '${this.#immediate.name}'. WGSL allows at most one immediate variable per entry point, so '${name}' would have to replace it.`
188
+ );
189
+ }
190
+
191
+ let type = _type;
192
+
193
+ if (typeof type === "string") {
194
+ type = parse_wgsl_type(type);
195
+ } else {
196
+ assert.equal(type.isWebGPUType, true, 'type.isWebGPUType !== true');
197
+ }
198
+
199
+ if (type.runtime_sized) {
200
+ throw new Error(`Immediate data '${name}' must have a size known ahead of time, and '${type}' is runtime-sized`);
201
+ }
202
+
203
+ if (type_has_arrays(type)) {
204
+ throw new Error(
205
+ `Immediate data '${name}' may not contain an array: the immediate address space excludes arrays and structures with array members. Keep the array in a storage buffer and pass an index.`
206
+ );
207
+ }
208
+
209
+ // https://www.w3.org/TR/WGSL/#atomic-type — an immediate is immutable, so an atomic in one
210
+ // could never be operated on anyway
211
+ assert.equal(type_has_atomics(type), false, 'atomics are not allowed in immediate data');
212
+
213
+ const size = round_up(type.size, 4);
214
+
215
+ if (size > IMMEDIATE_SIZE_FLOOR) {
216
+ throw new Error(
217
+ `Immediate data '${name}' is ${size} bytes, over the ${IMMEDIATE_SIZE_FLOOR}-byte maxImmediateSize that every WebGPU device is guaranteed to offer. Move the bulk of it to a uniform buffer.`
218
+ );
219
+ }
220
+
221
+ this.#immediate = { name, type };
222
+
223
+ return this;
224
+ }
225
+
129
226
  /**
130
227
  * Do not modify directly
131
228
  * @returns {ShaderResourceGroupDescriptor[]}
@@ -159,6 +256,22 @@ export class ShaderResourceSetDescriptor {
159
256
  * @param {string} name
160
257
  * @returns {ShaderResourceDescriptor}
161
258
  */
259
+ /**
260
+ * Whether `name` is this shader's immediate data.
261
+ *
262
+ * Immediate data is deliberately absent from {@link getResourceByName}: it is not a bound
263
+ * resource and has no binding layout, so anything walking the resource interface should not see
264
+ * it. The graph helpers still need to recognise the name, because an immediate value travels to
265
+ * the encoder as a plain value rather than as a graph resource — and a `u32` immediate is a
266
+ * number, which those helpers would otherwise read as a graph resource id.
267
+ *
268
+ * @param {string} name
269
+ * @returns {boolean}
270
+ */
271
+ isImmediateName(name) {
272
+ return this.#immediate !== undefined && this.#immediate.name === name;
273
+ }
274
+
162
275
  getResourceByName(name) {
163
276
 
164
277
  for (const group of this.#groups) {
@@ -244,6 +357,8 @@ export class ShaderResourceSetDescriptor {
244
357
  r.bindGroupLayouts[i] = group.generateBindGroupLayoutDescriptor();
245
358
  }
246
359
 
360
+ r.immediateSize = this.immediateSize;
361
+
247
362
  return r;
248
363
  }
249
364
 
@@ -273,7 +388,7 @@ export class ShaderResourceSetDescriptor {
273
388
  generatePipelineLayout(stage) {
274
389
  assert.defined(stage, 'stage');
275
390
 
276
- return PipelineLayoutDescriptor.forStage(stage, this.generateBindingsArray());
391
+ return PipelineLayoutDescriptor.forStage(stage, this.generateBindingsArray(), this.immediateSize);
277
392
  }
278
393
 
279
394
  /**
@@ -313,6 +428,19 @@ export class ShaderResourceSetDescriptor {
313
428
 
314
429
  const groups = this.#groups;
315
430
 
431
+ const immediate = this.#immediate;
432
+
433
+ if (immediate !== undefined) {
434
+ const immediate_type = immediate.type;
435
+
436
+ if (immediate_type.requires_declaration) {
437
+ dependencies.add(immediate_type.declaration_chunk);
438
+ }
439
+
440
+ // no @group, no @binding — this is the one module-scope variable that has neither
441
+ builder.add(`var<immediate> ${immediate.name} : ${immediate_type.wgsl_ref};`);
442
+ }
443
+
316
444
  for (let group_index = 0; group_index < groups.length; group_index++) {
317
445
  const group = groups[group_index];
318
446
 
@@ -382,8 +510,73 @@ export class ShaderResourceSetDescriptor {
382
510
 
383
511
  }
384
512
 
385
- return CodeChunk.from(builder.build(), Array.from(dependencies));
513
+ const chunk = CodeChunk.from(builder.build(), Array.from(dependencies));
514
+
515
+ if (immediate !== undefined) {
516
+ // `requires`, not `enable` — see CodeChunk#addLanguageExtension
517
+ chunk.addLanguageExtension(IMMEDIATE_ADDRESS_SPACE_EXTENSION);
518
+ }
519
+
520
+ return chunk;
521
+
522
+ }
523
+
524
+ /**
525
+ * Serialise this shader's immediate data into `buffer` at its current `position`, advancing
526
+ * `position` past what was written.
527
+ *
528
+ * **Allocates nothing.** That is the point of taking a caller-owned {@link BinaryBuffer} rather
529
+ * than returning bytes: `write_gpu_typed_buffer` would rebind a scratch buffer with a fresh
530
+ * `DataView` and `Uint8Array` on every call, which is two allocations per dispatch for a value
531
+ * that is often four bytes. {@link write_wgsl_type_value} takes the buffer directly and does not.
532
+ *
533
+ * The caller owns `position` because the caller owns the buffer — this only ever appends at the
534
+ * cursor it is handed.
535
+ *
536
+ * @param {Object} map the same binding map {@link generateBindings} reads
537
+ * @param {BinaryBuffer} buffer must already be set to the platform's endianness
538
+ * @returns {boolean} false when this shader declares no immediate data, and nothing was written
539
+ */
540
+ writeImmediate(map, buffer) {
541
+ const immediate = this.#immediate;
542
+
543
+ if (immediate === undefined) {
544
+ return false;
545
+ }
546
+
547
+ const value = map[immediate.name];
386
548
 
549
+ if (value === undefined || value === null) {
550
+ throw new Error(
551
+ `Value for immediate data '${immediate.name}' is missing from the input. Unlike a buffer binding it has no default: WebGPU refuses a draw whose immediate slots were never written.`
552
+ );
553
+ }
554
+
555
+ const start = buffer.position;
556
+ const size = this.immediateSize;
557
+
558
+ buffer.ensureCapacity(start + size);
559
+
560
+ write_wgsl_type_value(value, buffer, immediate.type);
561
+
562
+ // Zero-fill out to the declared size rather than stopping where the last member ended.
563
+ //
564
+ // The serialiser stops after the final member, so a struct with trailing padding — say
565
+ // `{vec4f, u32}`, 20 bytes written of a 32-byte type — leaves a tail. That tail is padding,
566
+ // WebGPU's AccessibleSlots excludes padding, and a short write would in fact validate. It
567
+ // would also mean the bytes handed to `setImmediates` are shorter than the `immediateSize`
568
+ // the pipeline layout declares, which is true-but-subtle in a way that only holds as long as
569
+ // nobody changes how either number is derived. Writing the full declared size costs at most
570
+ // 64 bytes of memset and makes the two trivially equal.
571
+ const written = buffer.position - start;
572
+
573
+ for (let i = written; i < size; i++) {
574
+ buffer.raw_bytes[start + i] = 0;
575
+ }
576
+
577
+ buffer.position = start + size;
578
+
579
+ return true;
387
580
  }
388
581
  }
389
582
 
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Whether a type is, or transitively contains, an array.
3
+ *
4
+ * Exists for the `immediate` address space, whose store type must be "a host-shareable constructible
5
+ * type, excluding arrays and structures that contain array members". The restriction is not
6
+ * arbitrary: immediates lower to D3D12 root constants and Metal `setBytes`, where a dynamically
7
+ * indexed array has nowhere good to live.
8
+ *
9
+ * @see https://www.w3.org/TR/WGSL/#var-decls
10
+ * @param {WebGPUType} t
11
+ * @return {boolean}
12
+ */
13
+ export function type_has_arrays(t: WebGPUType): boolean;
14
+ //# sourceMappingURL=type_has_arrays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type_has_arrays.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/type/type_has_arrays.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,gDAFY,OAAO,CAsBlB"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Whether a type is, or transitively contains, an array.
3
+ *
4
+ * Exists for the `immediate` address space, whose store type must be "a host-shareable constructible
5
+ * type, excluding arrays and structures that contain array members". The restriction is not
6
+ * arbitrary: immediates lower to D3D12 root constants and Metal `setBytes`, where a dynamically
7
+ * indexed array has nowhere good to live.
8
+ *
9
+ * @see https://www.w3.org/TR/WGSL/#var-decls
10
+ * @param {WebGPUType} t
11
+ * @return {boolean}
12
+ */
13
+ export function type_has_arrays(t) {
14
+ if (t.isArray) {
15
+ return true;
16
+ }
17
+
18
+ if (t.isPrimitive || t.isAtomic) {
19
+ return false;
20
+ }
21
+
22
+ if (t.isStruct) {
23
+ for (const f of t.fields) {
24
+ if (type_has_arrays(f.type)) {
25
+ return true;
26
+ }
27
+ }
28
+
29
+ return false;
30
+ }
31
+
32
+ throw new Error(`Unsupported type '${t}'`);
33
+ }
@@ -1,19 +1,20 @@
1
1
  /**
2
- * Cone-sampled point shadow PCF. Samples random directions inside a cone around the receiver-
3
- * to-light vector and re-encodes each one to the octahedral atlas. The cone aperture comes
4
- * from the GDC bulb-radius scaling in {@link chunk_max_penumbra_percentage}; the factor of 2
5
- * carries over the texels tangent-plane conversion an earlier disk-based variant used (1
6
- * atlas texel 2/face_dim of Δn.xy near the +Z pole), so the angular footprint stays
7
- * comparable.
2
+ * Cone-sampled point shadow PCF: 8 random directions inside a cone around the receiver-to-light
3
+ * vector, each re-encoded to the light's octahedral map, one `textureLoad` per tap, ending in
4
+ * {@link chunk_contact_harden_pcf_kernel}. Tap directions come from {@link chunk_random}, which the
5
+ * calling shader (deferred lighting / volumetrics) initialises per invocation, so neighbouring
6
+ * pixels decorrelate without a rotation table or a blue-noise disk.
8
7
  *
9
- * No blue-noise disk, no rotation table, no atlas-border clamp. Random tap directions come
10
- * from {@link chunk_random}, which the calling shader (deferred lighting / volumetrics)
11
- * initialises per invocation, so neighbours decorrelate naturally. Each tap is one
12
- * \`textureLoad\` and the loop ends in {@link chunk_contact_harden_pcf_kernel} unchanged.
8
+ * The aperture is the GDC bulb-radius scaling in {@link chunk_max_penumbra_percentage}; the factor
9
+ * of 2 carries over the texels tangent-plane conversion an earlier disk-based variant used (1
10
+ * atlas texel ≈ 2/face_dim of Δn.xy near the +Z pole), so the angular footprint stays comparable.
13
11
  *
14
- * No clamp on the aperture: the receiver direction is sampled in 3D and re-encoded per tap, so
15
- * the octahedral encode always lands in [0, 1]² — even a full-sphere aperture stays inside
16
- * this light's slot.
12
+ * Addressing: `atlas_aabb` is the INNER octahedral surface, and the cube octahedral remap
13
+ * surrounds it with a `SHADOWMAP_ATLAS_BORDER`-texel skirt holding
14
+ * `inner[texture_octahedral_wrap_texel_coordinates(local)]`. Under the bilinear convention
15
+ * `uv * size - 0.5` a uv on the edge of the square rounds to -1 or `size` — one texel into that
16
+ * skirt, which is this light's own wrapped data. The encode always lands in [0, 1]² and the round
17
+ * can overshoot by at most one texel, so the aperture needs no clamp.
17
18
  *
18
19
  * @see chunk_cone_sample_direction
19
20
  * @type {CodeChunk}
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_shadowmap_sample_point2.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,4CAFU,SAAS,CA8FjB;0BAvHwB,uCAAuC"}
1
+ {"version":3,"file":"chunk_shadowmap_sample_point2.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,4CAFU,SAAS,CAiGjB;0BA3HwB,uCAAuC"}