@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
@@ -34,12 +34,35 @@ import { chunk_calculate_multiscattering } from "./chunk_calculate_multiscatteri
34
34
  import { chunk_camera_ray_planar_depth_scale } from "./chunk_camera_ray_planar_depth_scale.js";
35
35
  import { chunk_volumetrics_froxel_content_offset } from "./chunk_volumetrics_froxel_content_offset.js";
36
36
  import { chunk_integrate_optical_depth } from "./chunk_integrate_optical_depth.js";
37
+ import {
38
+ chunk_volumetrics_sun_optical_depth,
39
+ volumetrics_sun_shadow_texture_name
40
+ } from "./chunk_volumetrics_sun_optical_depth.js";
41
+ import { VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT } from "./VOLUMETRICS_SUN_SHADOW_RESOLUTION.js";
37
42
  import { chunk_volumetrics_column_jitter } from "./chunk_volumetrics_column_jitter.js";
43
+ import { chunk_volumetrics_local_light_shadow } from "./chunk_volumetrics_local_light_shadow.js";
38
44
  import { VOLUMETRICS_METADATA_STRUCT } from "./VOLUMETRICS_METADATA_STRUCT.js";
39
45
 
46
+ /**
47
+ * Workgroup shape of this pass, `[x, y, z]` in froxels, read by both the `@workgroup_size` below
48
+ * and the dispatch in `graph_build_volumetrics` so the two cannot drift.
49
+ *
50
+ * Flat in z. Lights are binned into 3D clusters and the largest distance between neighbouring
51
+ * clusters is along depth, so a group spanning z is the one spanning the most unrelated light
52
+ * lists.
53
+ *
54
+ * 64 invocations — one wave64, two warps — is a deliberate trade: 16x16x1 measures faster on the
55
+ * RTX 4090 this was benchmarked on, and is kept off because that part's register file is unusually
56
+ * large and the result is not expected to generalize (AMD favours smaller groups). NOTES.md carries
57
+ * the numbers and the reasoning.
58
+ *
59
+ * @type {number[]}
60
+ */
61
+ export const VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION = [8, 8, 1];
62
+
40
63
  const resources = new ShaderResourceSetDescriptor();
41
64
 
42
- resources.createGroup()
65
+ const primary_group = resources.createGroup()
43
66
  .addUniform("volumetrics_metadata", VOLUMETRICS_METADATA_STRUCT)
44
67
  .addUniform("camera", CAMERA_UNIFORM_STRUCT)
45
68
  .addUniform("view", VIEW_UNIFORM_STRUCT)
@@ -48,8 +71,16 @@ resources.createGroup()
48
71
  .addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
49
72
  .addTexture("tSTBN_vec3", "unfilterable-float", "3d")
50
73
  .addTexture("tParticipatingMedia0", "float", "3d")
51
- .addTexture("tParticipatingMedia1", "float", "3d")
52
- .addStorageTexture("tLighting", "rgba16float", "3d", "write-only")
74
+ .addTexture("tParticipatingMedia1", "float", "3d");
75
+
76
+ // Q-04: the sun's optical depth, pre-integrated along the light axis by
77
+ // shader_volumetrics_build_sun_shadow_volume, one cascade per texture and innermost first.
78
+ // Sampled, not marched.
79
+ for (let cascade = 0; cascade < VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT; cascade++) {
80
+ primary_group.addTexture(volumetrics_sun_shadow_texture_name(cascade), "float", "3d");
81
+ }
82
+
83
+ primary_group.addStorageTexture("tLighting", "rgba16float", "3d", "write-only")
53
84
 
54
85
  // Lighting information
55
86
  resources.createGroup()
@@ -66,7 +97,7 @@ resources.createGroup()
66
97
  const body = CodeChunk.from(
67
98
  //language=WGSL
68
99
  `
69
- @compute @workgroup_size(16,16)
100
+ @compute @workgroup_size(${VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION.join(",")})
70
101
  fn main(
71
102
  @builtin(global_invocation_id) voxel_coord : vec3<u32>
72
103
  ){
@@ -199,7 +230,7 @@ fn main(
199
230
 
200
231
  let sun = get_directional_light_info_by_index(&light_data, directional_index);
201
232
 
202
- let sun_lut_uv = sky_lut_compute_uv(position_ws, sun.direction);
233
+ let sun_lut_uv = sky_lut_compute_uv(position_ws, sun.direction, vec2<f32>(textureDimensions(tSunTransmittance)));
203
234
 
204
235
  let shadow_term = shadowmap_get_directional_light_visibility(
205
236
  &light_data,
@@ -222,14 +253,37 @@ fn main(
222
253
  sun_lut_uv, 0.0
223
254
  ).rgb;
224
255
 
225
- // .direction points TOWARD the light; march the optical-depth ray toward the light (+direction).
226
- let shadow_ray = ${RAY_STRUCT.make({
227
- origin: "position_ws",
228
- direction: "sun.direction",
229
- tmax: "sun.distance",
230
- })};
231
-
232
- let optical_depth = integrate_optical_depth(shadow_ray);
256
+ // Q-04. Every froxel on this sun ray is asking for the same integral, one increment
257
+ // apart, and the march recomputes all of it from scratch for each: O(froxels * steps)
258
+ // to produce O(froxels) of information. The sun is where that is worst, because its
259
+ // tmax is the distance to the sun clipped to the frustum, so the march spans the whole
260
+ // grid rather than the few metres a lamp's does.
261
+ //
262
+ // So read the answer out of the cascades built once this frame with their axis on the
263
+ // sun, where the increment relation IS the storage — see
264
+ // shader_volumetrics_build_sun_shadow_volume. Same quantity, same units, one fetch.
265
+ //
266
+ // The march below is not an alternative to it, it is what is left for the lights the
267
+ // cascades do not cover: a second directional light, since there is one ladder and it
268
+ // is aligned to one direction, and the two cases that cannot place a box at all, which
269
+ // sun_shadow_light_index reports by holding a value no light index can equal.
270
+ var optical_depth: vec3<f32>;
271
+
272
+ if (directional_index == volumetrics_metadata.sun_shadow_light_index) {
273
+
274
+ optical_depth = volumetrics_sun_optical_depth(position_ws);
275
+
276
+ } else {
277
+
278
+ // .direction points TOWARD the light; march the optical-depth ray toward the light (+direction).
279
+ let shadow_ray = ${RAY_STRUCT.make({
280
+ origin: "position_ws",
281
+ direction: "sun.direction",
282
+ tmax: "sun.distance",
283
+ })};
284
+
285
+ optical_depth = integrate_optical_depth(shadow_ray);
286
+ }
233
287
 
234
288
  let ms = calculate_multiscattering(
235
289
  optical_depth,
@@ -284,7 +338,16 @@ fn main(
284
338
  volumetrics_metadata.ms_extinction_decay
285
339
  );
286
340
 
287
- inScatteringSum += ms * direct_light.color;
341
+ // Before this, integrate_optical_depth was the ONLY thing occluding a local light:
342
+ // the medium shadowed itself and geometry did not shadow it at all, so a torch behind a
343
+ // wall lit the fog through the wall and a light through a window cast no shaft. The
344
+ // directional loop above has always multiplied its shadow map in; this is the same
345
+ // operation for the clustered lights, which is what Frostbite and UE both do in the
346
+ // froxel pass. One nearest atlas tap rather than the deferred path's filter kernel —
347
+ // see the chunk for why that is not a compromise here.
348
+ let shadow_term = volumetrics_point_light_shadow(&light_data, light_index, position_ws);
349
+
350
+ inScatteringSum += shadow_term * ms * direct_light.color;
288
351
  }
289
352
 
290
353
  for (var k = 0u; k < spot_count; k++) {
@@ -316,7 +379,10 @@ fn main(
316
379
  volumetrics_metadata.ms_extinction_decay
317
380
  );
318
381
 
319
- inScatteringSum += ms * direct_light.color;
382
+ // see the point loop above
383
+ let shadow_term = volumetrics_spot_light_shadow(&light_data, light_index, position_ws);
384
+
385
+ inScatteringSum += shadow_term * ms * direct_light.color;
320
386
  }
321
387
  }
322
388
 
@@ -350,10 +416,12 @@ fn main(
350
416
  chunk_get_point_light_info_by_index,
351
417
  chunk_get_spot_light_info_by_index,
352
418
  chunk_shadowmap_get_light_visibility,
419
+ chunk_volumetrics_local_light_shadow,
353
420
  chunk_sky_lut_compute_uv,
354
421
 
355
422
  RAY_STRUCT.declaration_chunk,
356
423
  chunk_integrate_optical_depth,
424
+ chunk_volumetrics_sun_optical_depth,
357
425
  chunk_calculate_multiscattering,
358
426
  chunk_rgb_to_luminance,
359
427
  chunk_volumetrics_column_jitter,
@@ -1 +1 @@
1
- {"version":3,"file":"shader_volumetrics_build_participating_media.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js"],"names":[],"mappings":"AA2LA,yEAIE;8BA5K4B,4BAA4B"}
1
+ {"version":3,"file":"shader_volumetrics_build_participating_media.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js"],"names":[],"mappings":"AAsMA,yEAIE;8BArL4B,4BAA4B"}
@@ -12,7 +12,9 @@ import { chunk_rgb_to_luminance } from "../shader/chunk/color/chunk_rgb_to_lumin
12
12
  import { AABB3_STRUCT } from "../shader/chunk/geometry/aabb3/AABB3_STRUCT.js";
13
13
  import { chunk_aabb3_intersects_frustum } from "../shader/chunk/geometry/aabb3/chunk_aabb3_intersects_frustum.js";
14
14
  import { chunk_frustum_slice } from "../shader/chunk/geometry/frustum/chunk_frustum_slice.js";
15
- import { chunk_frustum_transform_m4 } from "../shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js";
15
+ import {
16
+ chunk_frustum_transform_plane_matrix
17
+ } from "../shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js";
16
18
  import { chunk_mat4_extract_scale } from "../shader/chunk/geometry/mat4/chunk_mat4_extract_scale.js";
17
19
  import { chunk_random } from "../shader/chunk/random/chunk_random.js";
18
20
  import { chunk_random_initialize } from "../shader/chunk/random/chunk_random_initialize.js";
@@ -101,44 +103,53 @@ fn main(
101
103
  var particle_diameter = 0.0;
102
104
  var scattering_luma_sum = 0.0;
103
105
  var anisotropic_g = 0.0;
104
-
106
+
105
107
  for(var i=0u; i < scene_volumetrics_metadata.instance_count; i++){
106
-
108
+
107
109
  let volume = scene_volumes[i];
108
-
109
- // transform froxel into volume's coordinate space
110
- let local_frustum = frustum_transform_m4(froxel_frustum, volume.transform_inverse);
111
-
110
+
111
+ // Transform froxel into volume's coordinate space. Points go world -> local through
112
+ // transform_inverse, so planes go by the transpose of *its* inverse, which is just
113
+ // transpose(transform) — already resident, where deriving it costs a generic 4x4 inverse.
114
+ // Full 4x4 rather than a 3x3 basis: the last row carries the translation, and that is what
115
+ // supplies each transformed plane's distance term.
116
+ let local_frustum = frustum_transform_plane_matrix(froxel_frustum, transpose(volume.transform));
117
+
112
118
  const unit_bounds = ${AABB3_STRUCT.make({
113
119
  min: "vec3(-0.5)",
114
120
  max: "vec3(0.5)",
115
121
  })};
116
-
117
- // TODO we can check intersection degree, if froxel is 100% inside the volume - we can skip costly coverage computation.
118
-
122
+
119
123
  let aabb_intersects = aabb3_intersects_frustum(unit_bounds, local_frustum);
120
-
124
+
121
125
  if(!aabb_intersects){
122
126
  // skip
123
127
  continue;
124
128
  }
125
-
129
+
130
+ // A froxel proved to lie entirely inside the volume has a coverage of exactly 1.0 and, deep
131
+ // enough in, a fade of exactly 1.0 — both skippable. It is not done here because it does not
132
+ // pay: proving it needs the froxel's 8 vertices, which cost the same 8 three-plane
133
+ // intersections the coverage estimator spends, and only 7 to 33 percent of froxels qualify.
134
+ // NOTES.md has the measured hit rates and the arithmetic, and
135
+ // volumetrics_froxel_containment.spec.js keeps the geometry proven if the balance changes.
136
+
126
137
  // estimate volume coverage to avoid aliasing and get a better overlap test
127
138
  var volume_coverage = frustum_unit_box_coverage(local_frustum);
128
-
139
+
129
140
  if(volume_coverage == 0.0){
130
141
  // skip
131
142
  continue;
132
143
  }
133
-
144
+
134
145
  let world_scale = mat4_extract_scale(volume.transform);
135
-
146
+
136
147
  let edge_fade_factor = compute_volume_fade_factor(
137
148
  local_frustum,
138
149
  world_scale,
139
- volume.fade_distance
150
+ volume.fade_distance
140
151
  );
141
-
152
+
142
153
  let weight = volume.density * volume_coverage * edge_fade_factor;
143
154
 
144
155
  let volume_scattering = volume.particle_spec.scattering * weight;
@@ -172,7 +183,7 @@ fn main(
172
183
  chunk_density_mie,
173
184
  chunk_cluster_depth_from_z_slice,
174
185
  chunk_frustum_slice,
175
- chunk_frustum_transform_m4,
186
+ chunk_frustum_transform_plane_matrix,
176
187
  chunk_aabb3_intersects_frustum,
177
188
  chunk_compute_near_far_from_projection,
178
189
  chunk_random_initialize,