@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
@@ -0,0 +1,69 @@
1
+ import { CodeChunk } from "../../compiler/CodeChunk.js";
2
+ import { ATMOSPHERE_RADII_DECLARATION } from "./ATMOSPHERE_RADII_DECLARATION.js";
3
+
4
+ /**
5
+ * How far a ray inside the atmosphere may be marched, and whether it ends on the surface.
6
+ *
7
+ * The ground and the atmosphere shell are concentric on the planet and the ray is shared, so
8
+ * one quadratic setup serves both intersections — only the radius term differs. Calling a
9
+ * general sphere-intersection routine twice instead recomputes the ray-origin offset and all
10
+ * three dot products for the second sphere, and re-derives a leading coefficient that is 1
11
+ * for a unit direction.
12
+ *
13
+ * `origin_rel` is relative to the planet centre and assumed to be inside the atmosphere and
14
+ * at or above the surface, which is what makes the shell's far root the exit point.
15
+ * `ray_direction` must be normalised.
16
+ *
17
+ * `ground_distance` is negative when the ray never meets the surface, which includes looking
18
+ * up from above it: both roots are behind the origin there.
19
+ *
20
+ * @type {CodeChunk}
21
+ */
22
+ export const chunk_atmosphere_ray_bounds = CodeChunk.from(
23
+ //language=WGSL
24
+ `
25
+ struct AtmosphereRayBounds {
26
+ // as far as a march may go: the surface when the ray meets it, the shell otherwise
27
+ t_max: f32,
28
+ // distance to the surface, negative when there is no hit ahead
29
+ ground_distance: f32,
30
+ hits_ground: bool,
31
+ }
32
+
33
+ fn atmosphere_ray_bounds(
34
+ origin_rel: vec3<f32>,
35
+ ray_direction: vec3<f32>
36
+ ) -> AtmosphereRayBounds {
37
+
38
+ // ray_direction is a unit vector, so the leading coefficient is 1 and the factors of two
39
+ // divide out of both roots
40
+ let b = dot(origin_rel, ray_direction);
41
+ let r2 = dot(origin_rel, origin_rel);
42
+ let b2 = b * b;
43
+
44
+ // inside the shell, so its constant term is negative, the discriminant is positive, and
45
+ // the far root is where the ray leaves
46
+ let atmosphere_distance = -b + sqrt(max(b2 - (r2 - ATMOSPHERE_TOP_RADIUS_SQUARED), 0.0));
47
+
48
+ // the ground is the near root, and only when that root is ahead of us
49
+ let ground_discriminant = b2 - (r2 - ATMOSPHERE_GROUND_RADIUS_SQUARED);
50
+ let ground_distance = select(
51
+ -1.0,
52
+ -b - sqrt(max(ground_discriminant, 0.0)),
53
+ ground_discriminant >= 0.0
54
+ );
55
+
56
+ let hits_ground = ground_distance > 0.0;
57
+
58
+ var result: AtmosphereRayBounds;
59
+
60
+ result.t_max = select(atmosphere_distance, ground_distance, hits_ground);
61
+ result.ground_distance = ground_distance;
62
+ result.hits_ground = hits_ground;
63
+
64
+ return result;
65
+ }
66
+ `, [
67
+ ATMOSPHERE_RADII_DECLARATION,
68
+ ]
69
+ );
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Whether `inner` lies entirely within `outer`. Closed on both sides: touching faces count as
3
+ * contained, matching {@link chunk_aabb3_intersects_point}'s treatment of the boundary.
4
+ *
5
+ * @type {CodeChunk}
6
+ */
7
+ export const chunk_aabb3_contains_aabb3: CodeChunk;
8
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
9
+ //# sourceMappingURL=chunk_aabb3_contains_aabb3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_aabb3_contains_aabb3.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,yCAFU,SAAS,CAcZ;0BArBmB,gCAAgC"}
@@ -0,0 +1,22 @@
1
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+ import { AABB3_STRUCT } from "./AABB3_STRUCT.js";
3
+
4
+ /**
5
+ * Whether `inner` lies entirely within `outer`. Closed on both sides: touching faces count as
6
+ * contained, matching {@link chunk_aabb3_intersects_point}'s treatment of the boundary.
7
+ *
8
+ * @type {CodeChunk}
9
+ */
10
+ export const chunk_aabb3_contains_aabb3 = CodeChunk.from(
11
+ //language=WGSL
12
+ `
13
+ fn aabb3_contains_aabb3(
14
+ outer: ${AABB3_STRUCT.wgsl_ref},
15
+ inner: ${AABB3_STRUCT.wgsl_ref}
16
+ ) -> bool{
17
+
18
+ return all(inner.min >= outer.min) && all(inner.max <= outer.max);
19
+
20
+ }`, [
21
+ AABB3_STRUCT.declaration_chunk
22
+ ]);
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Bounds of 8 corner points after a point transform.
3
+ *
4
+ * The corners are transformed and *then* bounded, so the result is the tight bound of the
5
+ * transformed hull rather than the transform of a bound — no inflation under rotation. That
6
+ * distinction is the reason this exists instead of transforming an existing AABB3.
7
+ *
8
+ * Written out rather than looped: the corner array stays register-resident this way, and a
9
+ * dynamically indexed local array is the classic route to a scratch-memory spill in a kernel that
10
+ * runs once per froxel.
11
+ *
12
+ * @type {CodeChunk}
13
+ */
14
+ export const chunk_aabb3_from_transformed_corners: CodeChunk;
15
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
16
+ //# sourceMappingURL=chunk_aabb3_from_transformed_corners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_aabb3_from_transformed_corners.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,mDAFU,SAAS,CA0BZ;0BAxCmB,gCAAgC"}
@@ -0,0 +1,41 @@
1
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+ import { AABB3_STRUCT } from "./AABB3_STRUCT.js";
3
+
4
+ /**
5
+ * Bounds of 8 corner points after a point transform.
6
+ *
7
+ * The corners are transformed and *then* bounded, so the result is the tight bound of the
8
+ * transformed hull rather than the transform of a bound — no inflation under rotation. That
9
+ * distinction is the reason this exists instead of transforming an existing AABB3.
10
+ *
11
+ * Written out rather than looped: the corner array stays register-resident this way, and a
12
+ * dynamically indexed local array is the classic route to a scratch-memory spill in a kernel that
13
+ * runs once per froxel.
14
+ *
15
+ * @type {CodeChunk}
16
+ */
17
+ export const chunk_aabb3_from_transformed_corners = CodeChunk.from(
18
+ //language=WGSL
19
+ `
20
+ fn aabb3_from_transformed_corners(
21
+ corners: array<vec3<f32>, 8>,
22
+ transform: mat4x4<f32>
23
+ ) -> ${AABB3_STRUCT.wgsl_ref}{
24
+
25
+ let p0 = (transform * vec4<f32>(corners[0], 1.0)).xyz;
26
+ let p1 = (transform * vec4<f32>(corners[1], 1.0)).xyz;
27
+ let p2 = (transform * vec4<f32>(corners[2], 1.0)).xyz;
28
+ let p3 = (transform * vec4<f32>(corners[3], 1.0)).xyz;
29
+ let p4 = (transform * vec4<f32>(corners[4], 1.0)).xyz;
30
+ let p5 = (transform * vec4<f32>(corners[5], 1.0)).xyz;
31
+ let p6 = (transform * vec4<f32>(corners[6], 1.0)).xyz;
32
+ let p7 = (transform * vec4<f32>(corners[7], 1.0)).xyz;
33
+
34
+ let lo = min(min(min(p0, p1), min(p2, p3)), min(min(p4, p5), min(p6, p7)));
35
+ let hi = max(max(max(p0, p1), max(p2, p3)), max(max(p4, p5), max(p6, p7)));
36
+
37
+ return ${AABB3_STRUCT.make({ min: "lo", max: "hi" })};
38
+
39
+ }`, [
40
+ AABB3_STRUCT.declaration_chunk
41
+ ]);
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Transforms a frustum's 6 planes by a point transform, deriving the plane matrix from it.
3
+ *
4
+ * The derivation costs a generic 4x4 inverse. When the caller already holds the inverse of the
5
+ * transform it is passing — which is the usual shape, since object structs tend to carry both
6
+ * directions — `transpose(inverse(M)) == transpose(other_direction)` and
7
+ * {@link chunk_frustum_transform_plane_matrix} should be called directly with that transpose
8
+ * instead. Nothing is approximated by doing so; it removes a round-trip.
9
+ *
10
+ * @type {CodeChunk}
11
+ */
1
12
  export const chunk_frustum_transform_m4: CodeChunk;
2
13
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
3
14
  //# sourceMappingURL=chunk_frustum_transform_m4.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_frustum_transform_m4.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js"],"names":[],"mappings":"AAIA,mDA2BC;0BA/ByB,gCAAgC"}
1
+ {"version":3,"file":"chunk_frustum_transform_m4.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,yCAFU,SAAS,CAelB;0BA5ByB,gCAAgC"}
@@ -1,33 +1,29 @@
1
1
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
2
  import { chunk_mat4_inverse } from "../mat4/chunk_mat4_inverse.js";
3
- import { chunk_plane_normalize } from "../plane/chunk_plane_normalize.js";
3
+ import { chunk_frustum_transform_plane_matrix } from "./chunk_frustum_transform_plane_matrix.js";
4
4
 
5
+ /**
6
+ * Transforms a frustum's 6 planes by a point transform, deriving the plane matrix from it.
7
+ *
8
+ * The derivation costs a generic 4x4 inverse. When the caller already holds the inverse of the
9
+ * transform it is passing — which is the usual shape, since object structs tend to carry both
10
+ * directions — `transpose(inverse(M)) == transpose(other_direction)` and
11
+ * {@link chunk_frustum_transform_plane_matrix} should be called directly with that transpose
12
+ * instead. Nothing is approximated by doing so; it removes a round-trip.
13
+ *
14
+ * @type {CodeChunk}
15
+ */
5
16
  export const chunk_frustum_transform_m4 = CodeChunk.from(
6
17
  //language=WGSL
7
18
  `
8
19
  fn frustum_transform_m4(frustum: array<vec4<f32>, 6>, transform: mat4x4<f32>) -> array<vec4<f32>, 6> {
9
- var result: array<vec4<f32>, 6>;
10
-
11
- // 1. Compute the "Normal Matrix"
12
- // The mathematical rule for transforming planes (or normals) is:
20
+ // The mathematical rule for transforming planes is
13
21
  // NewPlane = Transpose(Inverse(Transform)) * OldPlane
14
22
  // This automatically handles rotation, translation, AND non-uniform scaling correctly.
15
- let normal_matrix = transpose(mat4_inverse(transform));
16
-
17
- for (var i = 0u; i < 6u; i++) {
18
- // 2. Transform the plane equation
19
- // We treat the plane (a,b,c,d) as a 4D vector.
20
- var p = normal_matrix * frustum[i];
21
-
22
- // 3. Re-normalize the plane
23
- result[i] = plane_normalize(p);
24
- }
25
-
26
- return result;
23
+ return frustum_transform_plane_matrix(frustum, transpose(mat4_inverse(transform)));
27
24
  }
28
25
  `, [
29
26
  chunk_mat4_inverse,
30
- chunk_plane_normalize,
27
+ chunk_frustum_transform_plane_matrix,
31
28
  ]
32
29
  )
33
-
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Transforms a frustum's 6 planes by an already-built plane matrix.
3
+ *
4
+ * A plane `p` satisfies `dot(p, x) == 0` for points `x` on it, so if points move by `x' = T x` the
5
+ * plane must move by `p' = inverse(transpose(T)) p` to describe the same surface. `T` and its
6
+ * transpose-inverse are therefore *different* matrices, and this function takes the second one
7
+ * ready-made — {@link chunk_frustum_transform_m4} is the wrapper that derives it from the first.
8
+ *
9
+ * The matrix is a full 4x4, not a 3x3 basis: its last row carries the translation, and that is
10
+ * exactly what produces the transformed plane's distance term. Rotating the normals alone would
11
+ * leave every plane at its original offset from the origin.
12
+ *
13
+ * Callers that already hold the transpose-inverse should use this directly. The common case is
14
+ * mapping a frustum into an object's local space: points go world -> local through
15
+ * `inverse(transform)`, so planes go through `transpose(inverse(inverse(transform)))`, which is just
16
+ * `transpose(transform)` — no inverse to compute at all when the object's forward transform is at
17
+ * hand.
18
+ *
19
+ * @type {CodeChunk}
20
+ */
21
+ export const chunk_frustum_transform_plane_matrix: CodeChunk;
22
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
23
+ //# sourceMappingURL=chunk_frustum_transform_plane_matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_frustum_transform_plane_matrix.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,mDAFU,SAAS,CAsBlB;0BA3CyB,gCAAgC"}
@@ -0,0 +1,44 @@
1
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+ import { chunk_plane_normalize } from "../plane/chunk_plane_normalize.js";
3
+
4
+ /**
5
+ * Transforms a frustum's 6 planes by an already-built plane matrix.
6
+ *
7
+ * A plane `p` satisfies `dot(p, x) == 0` for points `x` on it, so if points move by `x' = T x` the
8
+ * plane must move by `p' = inverse(transpose(T)) p` to describe the same surface. `T` and its
9
+ * transpose-inverse are therefore *different* matrices, and this function takes the second one
10
+ * ready-made — {@link chunk_frustum_transform_m4} is the wrapper that derives it from the first.
11
+ *
12
+ * The matrix is a full 4x4, not a 3x3 basis: its last row carries the translation, and that is
13
+ * exactly what produces the transformed plane's distance term. Rotating the normals alone would
14
+ * leave every plane at its original offset from the origin.
15
+ *
16
+ * Callers that already hold the transpose-inverse should use this directly. The common case is
17
+ * mapping a frustum into an object's local space: points go world -> local through
18
+ * `inverse(transform)`, so planes go through `transpose(inverse(inverse(transform)))`, which is just
19
+ * `transpose(transform)` — no inverse to compute at all when the object's forward transform is at
20
+ * hand.
21
+ *
22
+ * @type {CodeChunk}
23
+ */
24
+ export const chunk_frustum_transform_plane_matrix = CodeChunk.from(
25
+ //language=WGSL
26
+ `
27
+ fn frustum_transform_plane_matrix(
28
+ frustum: array<vec4<f32>, 6>,
29
+ plane_matrix: mat4x4<f32>
30
+ ) -> array<vec4<f32>, 6> {
31
+ var result: array<vec4<f32>, 6>;
32
+
33
+ for (var i = 0u; i < 6u; i++) {
34
+ // Re-normalize: the plane's normal picks up the transform's scale, and consumers that
35
+ // interpolate plane pairs (frustum_sample_point, frustum_slice) weight by normal length.
36
+ result[i] = plane_normalize(plane_matrix * frustum[i]);
37
+ }
38
+
39
+ return result;
40
+ }
41
+ `, [
42
+ chunk_plane_normalize,
43
+ ]
44
+ )
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_uv_octahedral_unit_decode.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,8CAFU,SAAS,CAmBb;0BA5BoB,gCAAgC"}
1
+ {"version":3,"file":"chunk_uv_octahedral_unit_decode.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,8CAFU,SAAS,CAiBb;0BAzBoB,gCAAgC"}
@@ -1,5 +1,4 @@
1
1
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
- import { chunk_sign_not_zero } from "../../math/chunk_sign_not_zero.js";
3
2
 
4
3
  /**
5
4
  *
@@ -24,6 +23,4 @@ fn uv_octahedral_unit_decode( uv: vec2<f32> ) -> vec3<f32>{
24
23
 
25
24
  return normalize( nor );
26
25
  }
27
- `,[
28
- chunk_sign_not_zero
29
- ])
26
+ `, [])
@@ -23,6 +23,11 @@ export class CodeChunk {
23
23
  * @returns {boolean} true iff added, false if already present
24
24
  */
25
25
  addExtension(extension: WebGPUExtensionType): boolean;
26
+ /**
27
+ * @param {string} extension a WGSL language extension name, e.g. `immediate_address_space`
28
+ * @returns {boolean} true iff added, false if already present
29
+ */
30
+ addLanguageExtension(extension: string): boolean;
26
31
  /**
27
32
  *
28
33
  * @param {CodeChunk} dependency
@@ -52,11 +57,12 @@ export class CodeChunk {
52
57
  */
53
58
  coalesceDependencies(): CodeChunk[];
54
59
  /**
55
- * @returns {{text:string, extensions: string[]}}
60
+ * @returns {{text:string, extensions: string[], language_extensions: string[]}}
56
61
  */
57
62
  compile(): {
58
63
  text: string;
59
64
  extensions: string[];
65
+ language_extensions: string[];
60
66
  };
61
67
  toString(): string;
62
68
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"CodeChunk.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/compiler/CodeChunk.js"],"names":[],"mappings":"AAOA;IAMI;;;OAGG;IACH,cAFU,SAAS,SAAS,CAAC,CAEoB;IAwEjD;;;;;OAKG;IACH,kBAHW,MAAM,iBADN,SAAS,EAAE,GAET,SAAS,CAqBrB;IAzGD,2BAEC;IAcD;;;OAGG;IACH,mBAEC;IAeD;;;;OAIG;IACH,wBAHW,mBAAmB,GACjB,OAAO,CAMnB;IAED;;;;OAIG;IACH,0BAHW,SAAS,GACP,OAAO,CAmBnB;IAqCD;;;;OAIG;IACH,6CAHW,IAAI,SAAS,CAAC,GACZ,OAAO,CAgBnB;IAED;;;;OAIG;IACH,+BAHW,SAAS,GACP,OAAO,CAqBnB;IAED;;;OAGG;IACH,uBAFa,SAAS,EAAE,CAoCvB;IAED;;;OAGG;IACH,wBAFY,SAAS,EAAE,CAgDtB;IAED;;OAEG;IACH;cAFmB,MAAM;oBAAc,MAAM,EAAE;MAoC9C;IAED,mBAEC;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,YAFW,SAAS,QAMnB;IAED;;;OAGG;IACH,SAFY,SAAS,CAQpB;IAED;;;;OAIG;IACH,cAHW,SAAS,GACP,OAAO,CAWnB;;CACJ;oCAnVmC,4CAA4C"}
1
+ {"version":3,"file":"CodeChunk.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/compiler/CodeChunk.js"],"names":[],"mappings":"AAOA;IAMI;;;OAGG;IACH,cAFU,SAAS,SAAS,CAAC,CAEoB;IAkGjD;;;;;OAKG;IACH,kBAHW,MAAM,iBADN,SAAS,EAAE,GAET,SAAS,CAqBrB;IAnID,2BAEC;IAcD;;;OAGG;IACH,mBAEC;IAeD;;;;OAIG;IACH,wBAHW,mBAAmB,GACjB,OAAO,CAMnB;IAkBD;;;OAGG;IACH,gCAHW,MAAM,GACJ,OAAO,CAMnB;IAED;;;;OAIG;IACH,0BAHW,SAAS,GACP,OAAO,CAmBnB;IAqCD;;;;OAIG;IACH,6CAHW,IAAI,SAAS,CAAC,GACZ,OAAO,CAgBnB;IAED;;;;OAIG;IACH,+BAHW,SAAS,GACP,OAAO,CAqBnB;IAED;;;OAGG;IACH,uBAFa,SAAS,EAAE,CAoCvB;IAED;;;OAGG;IACH,wBAFY,SAAS,EAAE,CAgDtB;IAED;;OAEG;IACH;cAFmB,MAAM;oBAAc,MAAM,EAAE;6BAAuB,MAAM,EAAE;MA4C7E;IAED,mBAEC;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,YAFW,SAAS,QAOnB;IAED;;;OAGG;IACH,SAFY,SAAS,CAQpB;IAED;;;;OAIG;IACH,cAHW,SAAS,GACP,OAAO,CAWnB;;CACJ;oCAtXmC,4CAA4C"}
@@ -55,6 +55,32 @@ export class CodeChunk {
55
55
  return array_push_if_unique(this.#extensions, extension);
56
56
  }
57
57
 
58
+ /**
59
+ * WGSL language extensions this chunk uses, emitted as `requires`.
60
+ *
61
+ * A separate channel from {@link #extensions} on purpose. WGSL has two kinds of extension and
62
+ * they take different directives: an *enable-extension* is a device capability negotiated
63
+ * through `GPUFeatureName` and written `enable f16;`, while a *language extension* is available
64
+ * whenever the implementation supports it, is not a `GPUFeatureName` at all, and is written
65
+ * `requires immediate_address_space;`. Putting a language extension through
66
+ * {@link addExtension} would fail its {@link WebGPUExtensionType} assert, and if it somehow got
67
+ * past that it would emit the wrong directive and be looked for in the wrong namespace.
68
+ *
69
+ * @see https://www.w3.org/TR/WGSL/#language-extensions
70
+ * @type {string[]}
71
+ */
72
+ #language_extensions = [];
73
+
74
+ /**
75
+ * @param {string} extension a WGSL language extension name, e.g. `immediate_address_space`
76
+ * @returns {boolean} true iff added, false if already present
77
+ */
78
+ addLanguageExtension(extension) {
79
+ assert.isString(extension, 'extension');
80
+
81
+ return array_push_if_unique(this.#language_extensions, extension);
82
+ }
83
+
58
84
  /**
59
85
  *
60
86
  * @param {CodeChunk} dependency
@@ -254,7 +280,7 @@ export class CodeChunk {
254
280
  }
255
281
 
256
282
  /**
257
- * @returns {{text:string, extensions: string[]}}
283
+ * @returns {{text:string, extensions: string[], language_extensions: string[]}}
258
284
  */
259
285
  compile() {
260
286
 
@@ -262,6 +288,7 @@ export class CodeChunk {
262
288
  queue.push(this);
263
289
 
264
290
  const extension_hash = {};
291
+ const language_extension_hash = {};
265
292
 
266
293
  /**
267
294
  *
@@ -279,16 +306,23 @@ export class CodeChunk {
279
306
  for (let j = 0; j < ext.length; j++) {
280
307
  extension_hash[ext[j]] = true;
281
308
  }
309
+
310
+ const lang_ext = chunk.#language_extensions;
311
+ for (let j = 0; j < lang_ext.length; j++) {
312
+ language_extension_hash[lang_ext[j]] = true;
313
+ }
282
314
  }
283
315
 
284
316
  // Enable required extensions
285
317
  const extensions = Object.keys(extension_hash).sort();
318
+ const language_extensions = Object.keys(language_extension_hash).sort();
286
319
 
287
320
  const text = result_parts.join('\n');
288
321
 
289
322
  return {
290
323
  text,
291
- extensions
324
+ extensions,
325
+ language_extensions
292
326
  };
293
327
  }
294
328
 
@@ -312,6 +346,7 @@ export class CodeChunk {
312
346
  this.#text = other.#text;
313
347
  this.#dependencies = other.#dependencies.slice();
314
348
  this.#extensions = other.#extensions.slice();
349
+ this.#language_extensions = other.#language_extensions.slice();
315
350
  }
316
351
 
317
352
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"compute_binding_read_names.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/graph/compute/compute_binding_read_names.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,+GAFY,MAAM,EAAE,CAuBnB"}
1
+ {"version":3,"file":"compute_binding_read_names.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/graph/compute/compute_binding_read_names.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,+GAFY,MAAM,EAAE,CA6BnB"}
@@ -14,6 +14,12 @@ export function compute_binding_read_names(binding_names, shader_resources) {
14
14
  const binding_names_read = [];
15
15
 
16
16
  for (const binding_name of binding_names) {
17
+ if (shader_resources.isImmediateName(binding_name)) {
18
+ // immediate data is immutable, so it is always a read
19
+ binding_names_read.push(binding_name);
20
+ continue;
21
+ }
22
+
17
23
  const resource = shader_resources.getResourceByName(binding_name);
18
24
 
19
25
  if (resource === undefined) {
@@ -58,7 +58,7 @@ export function graph_compute_indirect_pass({
58
58
 
59
59
  command_handle = pass.read(command);
60
60
 
61
- graph_prepare_pass_input_data(binding_names_read, bindings, pass, pass_data);
61
+ graph_prepare_pass_input_data(binding_names_read, bindings, pass, pass_data, shader_resources);
62
62
 
63
63
  return graph_prepare_compute_resources(
64
64
  shader_resources,
@@ -56,7 +56,7 @@ export function graph_compute_pass({
56
56
 
57
57
  const pass = graph.add(shader_descriptor.label, pass_data, execute);
58
58
 
59
- graph_prepare_pass_input_data(binding_names_read, bindings, pass, pass_data);
59
+ graph_prepare_pass_input_data(binding_names_read, bindings, pass, pass_data, shader_resources);
60
60
 
61
61
  return graph_prepare_compute_resources(
62
62
  shader_resources,
@@ -152,7 +152,7 @@ export function graph_image_pass({
152
152
  const pass = graph.add(shader_descriptor.label, pass_data, execute);
153
153
 
154
154
  // parse inputs
155
- graph_prepare_pass_input_data(input_names, inputs, pass, pass_data);
155
+ graph_prepare_pass_input_data(input_names, inputs, pass, pass_data, shader_descriptor.resources);
156
156
 
157
157
  if (input_depth !== -1) {
158
158
  pass_data[DEPTH_TEXTURE_NAME] = pass.read(input_depth);
@@ -1 +1 @@
1
- {"version":3,"file":"graph_prepare_bindings.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/graph/graph_prepare_bindings.js"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,yFANW,MAAM,EAAE,oFAmDlB"}
1
+ {"version":3,"file":"graph_prepare_bindings.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/graph/graph_prepare_bindings.js"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,yFANW,MAAM,EAAE,oFA0DlB"}
@@ -27,6 +27,13 @@ export function graph_prepare_bindings(
27
27
  for (let i = 0; i < input_name_count; i++) {
28
28
  const input_key = input_names[i];
29
29
 
30
+ if (resources_descriptor.isImmediateName(input_key)) {
31
+ // hand the value on unchanged — ComputeShader/ImageShader serialise it through
32
+ // ShaderResourceSetDescriptor#writeImmediate, and it never becomes a binding
33
+ bindings[input_key] = data[input_key];
34
+ continue;
35
+ }
36
+
30
37
  const resource_spec = resources_descriptor.getResourceByName(input_key);
31
38
 
32
39
  if (resource_spec === undefined) {
@@ -4,6 +4,8 @@
4
4
  * @param {Object} inputs
5
5
  * @param {FrameGraphBuilder} pass
6
6
  * @param {Object} pass_data
7
+ * @param {ShaderResourceSetDescriptor} [shader_resources] when given, its immediate data is carried
8
+ * through verbatim instead of being read as a graph resource
7
9
  */
8
- export function graph_prepare_pass_input_data(input_names: string[], inputs: any, pass: FrameGraphBuilder, pass_data: any): void;
10
+ export function graph_prepare_pass_input_data(input_names: string[], inputs: any, pass: FrameGraphBuilder, pass_data: any, shader_resources?: ShaderResourceSetDescriptor): void;
9
11
  //# sourceMappingURL=graph_prepare_pass_input_data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph_prepare_pass_input_data.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,2DALW,MAAM,EAAE,8DA+BlB"}
1
+ {"version":3,"file":"graph_prepare_pass_input_data.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,2DAPW,MAAM,EAAE,8GA0ClB"}
@@ -4,12 +4,15 @@
4
4
  * @param {Object} inputs
5
5
  * @param {FrameGraphBuilder} pass
6
6
  * @param {Object} pass_data
7
+ * @param {ShaderResourceSetDescriptor} [shader_resources] when given, its immediate data is carried
8
+ * through verbatim instead of being read as a graph resource
7
9
  */
8
10
  export function graph_prepare_pass_input_data(
9
11
  input_names,
10
12
  inputs,
11
13
  pass,
12
- pass_data
14
+ pass_data,
15
+ shader_resources
13
16
  ) {
14
17
  const input_count = input_names.length;
15
18
  for (let i = 0; i < input_count; i++) {
@@ -17,6 +20,14 @@ export function graph_prepare_pass_input_data(
17
20
 
18
21
  const input_field_value = inputs[input_key];
19
22
 
23
+ // An immediate is a value, not a resource the graph owns — and a `u32` immediate is a
24
+ // number, which the branch below would otherwise take for a graph resource id and read as
25
+ // one. Nothing to declare to the graph, so it passes straight through.
26
+ if (shader_resources !== undefined && shader_resources.isImmediateName(input_key)) {
27
+ pass_data[input_key] = input_field_value;
28
+ continue;
29
+ }
30
+
20
31
  let pass_input_value;
21
32
 
22
33
  const input_field_type = typeof input_field_value;
@@ -1 +1 @@
1
- {"version":3,"file":"RenderPassDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/pass/RenderPassDescriptor.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IACI;;OAEG;IACH,mCAAQ;IAER;;OAEG;IACH,uCAAS;IAET;;;OAGG;IACH,kBAFU,qCAAqC,CAEzB;IAEtB;;;OAGG;IACH,wBAFU,0CAA0C,CAEsB;IAG1E;;;;;;;;;;OAUG;IACH,8GAVW,mBAAmB,2BA+E7B;IAED;;;;;;;;;;OAUG;IACH,yIAiCC;IAED;;;;;;;OAOG;IACH,0GAcC;IAGL;;;OAGG;IACH,iCAFU,OAAO,CAEoC;CANpD;2DApL0D,iDAAiD"}
1
+ {"version":3,"file":"RenderPassDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/pass/RenderPassDescriptor.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IACI;;OAEG;IACH,mCAAQ;IAER;;OAEG;IACH,uCAAS;IAET;;;OAGG;IACH,kBAFU,qCAAqC,CAEzB;IAEtB;;;OAGG;IACH,wBAFU,0CAA0C,CAEsB;IAG1E;;;;;;;;;;OAUG;IACH,8GAVW,mBAAmB,2BA+E7B;IAED;;;;;;;;;;OAUG;IACH,yIAkCC;IAED;;;;;;;OAOG;IACH,0GAcC;IAGL;;;OAGG;IACH,iCAFU,OAAO,CAEoC;CANpD;2DArL0D,iDAAiD"}
@@ -152,6 +152,7 @@ export class RenderPassDescriptor {
152
152
  return encoder.constructRenderPass({
153
153
  pipeline,
154
154
  bindings: this.resources.generateBindings(bindings),
155
+ immediate: encoder.writeImmediate(this.resources, bindings),
155
156
  colorAttachments: gpu_descriptor.colorAttachments,
156
157
  depthStencilAttachment: gpu_descriptor.depthStencilAttachment,
157
158
  });
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The WGSL language extension the `immediate` address space lives behind.
3
+ *
4
+ * Written with `requires`, not `enable` — it is a *language* extension, available whenever the
5
+ * implementation supports it, and it is not a `GPUFeatureName`.
6
+ *
7
+ * @see https://www.w3.org/TR/WGSL/#language_extension-immediate_address_space
8
+ * @type {string}
9
+ */
10
+ export const IMMEDIATE_ADDRESS_SPACE_EXTENSION: string;
11
+ /**
12
+ * The `maxImmediateSize` every conformant WebGPU device reports at minimum — a `maximum`-class limit
13
+ * whose default is 64 bytes, with no separate compatibility-mode value.
14
+ *
15
+ * Declaring more than this would compile on whichever machine happened to offer more and fail
16
+ * everywhere else, so it is refused where the declaration is written rather than where it breaks.
17
+ *
18
+ * @type {number}
19
+ */
20
+ export const IMMEDIATE_SIZE_FLOOR: number;
21
+ //# sourceMappingURL=IMMEDIATE_DATA.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMMEDIATE_DATA.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/IMMEDIATE_DATA.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,gDAFU,MAAM,CAE2D;AAE3E;;;;;;;;GAQG;AACH,mCAFU,MAAM,CAEuB"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The WGSL language extension the `immediate` address space lives behind.
3
+ *
4
+ * Written with `requires`, not `enable` — it is a *language* extension, available whenever the
5
+ * implementation supports it, and it is not a `GPUFeatureName`.
6
+ *
7
+ * @see https://www.w3.org/TR/WGSL/#language_extension-immediate_address_space
8
+ * @type {string}
9
+ */
10
+ export const IMMEDIATE_ADDRESS_SPACE_EXTENSION = 'immediate_address_space';
11
+
12
+ /**
13
+ * The `maxImmediateSize` every conformant WebGPU device reports at minimum — a `maximum`-class limit
14
+ * whose default is 64 bytes, with no separate compatibility-mode value.
15
+ *
16
+ * Declaring more than this would compile on whichever machine happened to offer more and fail
17
+ * everywhere else, so it is refused where the declaration is written rather than where it breaks.
18
+ *
19
+ * @type {number}
20
+ */
21
+ export const IMMEDIATE_SIZE_FLOOR = 64;