@woosh/meep-engine 3.65.0 → 3.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/package.json +1 -1
  2. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  3. package/src/engine/graphics3/GraphicsEngine.js +4 -9
  4. package/src/engine/graphics3/load_cube_environment.js +3 -3
  5. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  6. package/src/format/lut/cube/CubeLut.d.ts +38 -0
  7. package/src/format/lut/cube/CubeLut.d.ts.map +1 -0
  8. package/src/format/lut/cube/CubeLut.js +23 -0
  9. package/src/format/lut/cube/cube_read.d.ts +23 -0
  10. package/src/format/lut/cube/cube_read.d.ts.map +1 -0
  11. package/src/format/lut/cube/cube_read.js +199 -0
  12. package/src/format/lut/cube/cube_write.d.ts +15 -0
  13. package/src/format/lut/cube/cube_write.d.ts.map +1 -0
  14. package/src/format/lut/cube/cube_write.js +90 -0
  15. package/src/shade/playground/probe_clipmap/README.md +1 -0
  16. package/src/shade/playground/probe_clipmap/index.html +48 -0
  17. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  18. package/src/shade/playground/probe_clipmap/main.js +36 -0
  19. package/src/shade/renderer/Renderer.d.ts +7 -0
  20. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  21. package/src/shade/renderer/Renderer.js +225 -27
  22. package/src/shade/renderer/ShadeIndirectLightingMode.d.ts +1 -0
  23. package/src/shade/renderer/ShadeIndirectLightingMode.js +9 -0
  24. package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.d.ts +22 -0
  25. package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.d.ts.map +1 -0
  26. package/src/shade/renderer/atmosphere/ATMOSPHERE_PARAMETERS_STRUCT.js +160 -0
  27. package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.d.ts +45 -0
  28. package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.d.ts.map +1 -0
  29. package/src/shade/renderer/atmosphere/ATMOSPHERE_UNIT_SCALE.js +57 -0
  30. package/src/shade/renderer/atmosphere/GPUSky.d.ts +23 -8
  31. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  32. package/src/shade/renderer/atmosphere/GPUSky.js +91 -34
  33. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +17 -0
  34. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -1
  35. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +55 -25
  36. package/src/shade/renderer/atmosphere/SceneAtmosphere.d.ts +164 -0
  37. package/src/shade/renderer/atmosphere/SceneAtmosphere.d.ts.map +1 -0
  38. package/src/shade/renderer/atmosphere/SceneAtmosphere.js +308 -0
  39. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +3 -12
  40. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  41. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +52 -89
  42. package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.d.ts +14 -0
  43. package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.d.ts.map +1 -0
  44. package/src/shade/renderer/atmosphere/chunk_raymarch_sky_scattering.js +103 -0
  45. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +10 -4
  46. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  47. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +95 -57
  48. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +10 -14
  49. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  50. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +97 -69
  51. package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.d.ts +17 -0
  52. package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.d.ts.map +1 -1
  53. package/src/shade/renderer/atmosphere/chunk_sky_irradiance_lut_encode_uv.js +117 -48
  54. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +8 -0
  55. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  56. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +65 -35
  57. package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts +2 -1
  58. package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts.map +1 -1
  59. package/src/shade/renderer/atmosphere/compute_mie_absorption.js +6 -6
  60. package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.d.ts +41 -0
  61. package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.d.ts.map +1 -0
  62. package/src/shade/renderer/atmosphere/resolve_atmosphere_sun.js +123 -0
  63. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  64. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +21 -64
  65. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts +6 -2
  66. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  67. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +55 -179
  68. package/src/shade/renderer/atmosphere/shader_sky_view_lut.d.ts +7 -0
  69. package/src/shade/renderer/atmosphere/shader_sky_view_lut.d.ts.map +1 -0
  70. package/src/shade/renderer/atmosphere/shader_sky_view_lut.js +111 -0
  71. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts +0 -1
  72. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  73. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +68 -79
  74. package/src/shade/renderer/deferred/shader_background.js +1 -1
  75. package/src/shade/renderer/deferred/shader_background_sky.d.ts +5 -0
  76. package/src/shade/renderer/deferred/shader_background_sky.d.ts.map +1 -0
  77. package/src/shade/renderer/deferred/shader_background_sky.js +130 -0
  78. package/src/shade/renderer/deferred/tonemap/ColorGrade.d.ts +73 -4
  79. package/src/shade/renderer/deferred/tonemap/ColorGrade.d.ts.map +1 -1
  80. package/src/shade/renderer/deferred/tonemap/ColorGrade.js +113 -7
  81. package/src/shade/renderer/deferred/tonemap/TONEMAP_PURKINJE_SHIFT.d.ts +12 -0
  82. package/src/shade/renderer/deferred/tonemap/TONEMAP_PURKINJE_SHIFT.d.ts.map +1 -0
  83. package/src/shade/renderer/deferred/tonemap/TONEMAP_PURKINJE_SHIFT.js +12 -0
  84. package/src/shade/renderer/deferred/tonemap/ToneMapper.d.ts +15 -1
  85. package/src/shade/renderer/deferred/tonemap/ToneMapper.d.ts.map +1 -1
  86. package/src/shade/renderer/deferred/tonemap/ToneMapper.js +31 -3
  87. package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.d.ts +26 -0
  88. package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.d.ts.map +1 -0
  89. package/src/shade/renderer/deferred/tonemap/chunk_tonemap_purkinje.js +55 -0
  90. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_lut.d.ts +2 -2
  91. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_lut.d.ts.map +1 -1
  92. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_lut.js +6 -3
  93. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_lut.d.ts +3 -2
  94. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_lut.d.ts.map +1 -1
  95. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_lut.js +7 -3
  96. package/src/shade/renderer/extension/ViewTextures.d.ts +3 -2
  97. package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
  98. package/src/shade/renderer/extension/ViewTextures.js +3 -2
  99. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  100. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  101. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  102. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  103. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  104. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +1 -1
  105. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +20 -1
  106. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +29 -0
  108. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.d.ts +47 -0
  109. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.d.ts.map +1 -0
  110. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_light.js +246 -0
  111. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +4 -15
  112. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
  113. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +8 -148
  114. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +4 -9
  115. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  116. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +9 -58
  117. package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.d.ts +142 -0
  118. package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.d.ts.map +1 -0
  119. package/src/shade/renderer/global_illumination/screen_probe/GPUScreenProbeGI.js +938 -0
  120. package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.d.ts +192 -0
  121. package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.d.ts.map +1 -0
  122. package/src/shade/renderer/global_illumination/screen_probe/SCREEN_PROBE.js +231 -0
  123. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.d.ts +11 -0
  124. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.d.ts.map +1 -0
  125. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeDebugView.js +25 -0
  126. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.d.ts +110 -0
  127. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.d.ts.map +1 -0
  128. package/src/shade/renderer/global_illumination/screen_probe/ScreenProbeSettings.js +197 -0
  129. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.d.ts +150 -0
  130. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.d.ts.map +1 -0
  131. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe.js +408 -0
  132. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.d.ts +23 -0
  133. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.d.ts.map +1 -0
  134. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brdf_density.js +63 -0
  135. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.d.ts +24 -0
  136. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.d.ts.map +1 -0
  137. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_brick_origin.js +61 -0
  138. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.d.ts +39 -0
  139. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.d.ts.map +1 -0
  140. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_interpolate.js +126 -0
  141. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.d.ts +21 -0
  142. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.d.ts.map +1 -0
  143. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_lighting_history.js +74 -0
  144. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.d.ts +20 -0
  145. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.d.ts.map +1 -0
  146. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_march_distance.js +26 -0
  147. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.d.ts +24 -0
  148. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.d.ts.map +1 -0
  149. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_ray_sort.js +57 -0
  150. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.d.ts +22 -0
  151. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.d.ts.map +1 -0
  152. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_screen_march.js +53 -0
  153. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.d.ts +62 -0
  154. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.d.ts.map +1 -0
  155. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_surface.js +156 -0
  156. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.d.ts +18 -0
  157. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.d.ts.map +1 -0
  158. package/src/shade/renderer/global_illumination/screen_probe/chunk_screen_probe_workgroup_sum.js +50 -0
  159. package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.d.ts +21 -0
  160. package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.d.ts.map +1 -0
  161. package/src/shade/renderer/global_illumination/screen_probe/graph_screen_probe_debug_view.js +54 -0
  162. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.d.ts +67 -0
  163. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.d.ts.map +1 -0
  164. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_brick.js +509 -0
  165. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.d.ts +20 -0
  166. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.d.ts.map +1 -0
  167. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_debug.js +128 -0
  168. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.d.ts +62 -0
  169. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.d.ts.map +1 -0
  170. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_gather.js +478 -0
  171. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.d.ts +69 -0
  172. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.d.ts.map +1 -0
  173. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_importance.js +457 -0
  174. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.d.ts +27 -0
  175. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.d.ts.map +1 -0
  176. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.js +219 -0
  177. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.d.ts +22 -0
  178. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.d.ts.map +1 -0
  179. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_pick.js +151 -0
  180. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.d.ts +66 -0
  181. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.d.ts.map +1 -0
  182. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_place.js +301 -0
  183. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.d.ts +59 -0
  184. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.d.ts.map +1 -0
  185. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_resolve.js +364 -0
  186. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.d.ts +40 -0
  187. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.d.ts.map +1 -0
  188. package/src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_trace_screen.js +275 -0
  189. package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts.map +1 -1
  190. package/src/shade/renderer/grass/blade/GPUGrassBlades.js +17 -2
  191. package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts +18 -8
  192. package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts.map +1 -1
  193. package/src/shade/renderer/grass/blade/grass_blade_resolve.js +114 -32
  194. package/src/shade/renderer/light/GPULightCollection.d.ts +1 -1
  195. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  196. package/src/shade/renderer/light/GPULightCollection.js +213 -80
  197. package/src/shade/renderer/{atmosphere → light/environment}/chunk_sample_environment_color.d.ts +1 -2
  198. package/src/shade/renderer/light/environment/chunk_sample_environment_color.d.ts.map +1 -0
  199. package/src/shade/renderer/{atmosphere → light/environment}/chunk_sample_environment_color.js +3 -4
  200. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  201. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -1
  202. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +1 -1
  203. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts +35 -9
  204. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  205. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +81 -11
  206. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  207. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +4 -1
  208. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.d.ts +1 -1
  209. package/src/shade/renderer/postprocess/motion_blur/MotionBlur.js +1 -1
  210. package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.d.ts +1 -1
  211. package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.js +1 -1
  212. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +1 -1
  213. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  214. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +2 -0
  215. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +2 -0
  216. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts +6 -0
  217. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
  218. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +9 -1
  219. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts.map +1 -1
  220. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.js +4 -3
  221. package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.d.ts +17 -0
  222. package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.d.ts.map +1 -0
  223. package/src/shade/renderer/postprocess/velocity/VELOCITY_BUFFER.js +16 -0
  224. package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.d.ts +21 -0
  225. package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.d.ts.map +1 -0
  226. package/src/shade/renderer/postprocess/velocity/chunk_velocity_texel.js +30 -0
  227. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts +7 -5
  228. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
  229. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +19 -17
  230. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +2 -0
  231. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  232. package/src/shade/renderer/scene/GPUSceneContext.js +2 -1
  233. package/src/shade/renderer/scene/Scene.d.ts +9 -2
  234. package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
  235. package/src/shade/renderer/scene/Scene.js +10 -2
  236. package/src/shade/renderer/shader/ImageShader.d.ts +24 -12
  237. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  238. package/src/shade/renderer/shader/ImageShader.js +11 -8
  239. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.d.ts +3 -1
  240. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.d.ts.map +1 -1
  241. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_HEIGHT_DECLARATION.js +11 -3
  242. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +2 -11
  243. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -1
  244. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +23 -32
  245. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.d.ts +6 -0
  246. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.d.ts.map +1 -1
  247. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_RADIUS_DECLARATION.js +14 -2
  248. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_height.d.ts.map +1 -1
  249. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_height.js +4 -2
  250. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_intersection.d.ts.map +1 -1
  251. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_intersection.js +11 -3
  252. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -1
  253. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +68 -69
  254. package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.d.ts +4 -1
  255. package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.d.ts.map +1 -1
  256. package/src/shade/renderer/shader/chunk/atmosphere/chunk_get_sun_transmittance.js +46 -39
  257. package/src/shade/renderer/shader/chunk/atmosphere/chunk_position_relative_to_planet_center.d.ts.map +1 -1
  258. package/src/shade/renderer/shader/chunk/atmosphere/chunk_position_relative_to_planet_center.js +5 -3
  259. package/src/shade/renderer/shader/chunk/color/conversion/chunk_CRM_REC709_AP1.d.ts +6 -0
  260. package/src/shade/renderer/shader/chunk/color/conversion/chunk_CRM_REC709_AP1.d.ts.map +1 -1
  261. package/src/shade/renderer/shader/chunk/color/conversion/chunk_CRM_REC709_AP1.js +7 -0
  262. package/src/shade/renderer/shader/chunk/color/grade/chunk_color_grade.d.ts +4 -4
  263. package/src/shade/renderer/shader/chunk/color/grade/chunk_color_grade.d.ts.map +1 -1
  264. package/src/shade/renderer/shader/chunk/color/grade/chunk_color_grade.js +86 -5
  265. package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.d.ts +73 -0
  266. package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.d.ts.map +1 -0
  267. package/src/shade/renderer/shader/chunk/color/tonemap/purkinje/chunk_apply_purkinje_shift.js +139 -0
  268. package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.d.ts +14 -0
  269. package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.d.ts.map +1 -0
  270. package/src/shade/renderer/shader/chunk/depth/chunk_get_device_depth.js +30 -0
  271. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.d.ts +21 -0
  272. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.d.ts.map +1 -0
  273. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_equal_area_sphere.js +60 -0
  274. package/src/shade/renderer/shader/chunk/light/{sky/chunk_sample_sky_color.d.ts → io/chunk_light_get_sun.d.ts} +3 -6
  275. package/src/shade/renderer/shader/chunk/light/io/chunk_light_get_sun.d.ts.map +1 -0
  276. package/src/shade/renderer/shader/chunk/light/{sky/chunk_sample_sky_color.js → io/chunk_light_get_sun.js} +6 -26
  277. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_soft_shadows.js +1 -1
  278. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +3 -1
  279. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  280. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -2
  281. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  282. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +743 -739
  283. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +2 -0
  284. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  285. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +19 -17
  286. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.d.ts.map +1 -1
  287. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +5 -3
  288. package/src/shade/renderer/water/chunk_water_gi.js +2 -0
  289. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  290. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  291. package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.d.ts +0 -2
  292. package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.d.ts.map +0 -1
  293. package/src/engine/graphics/sh3/path_tracer/make_sky_hosek.js +0 -45
  294. package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.d.ts +0 -2
  295. package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.d.ts.map +0 -1
  296. package/src/engine/graphics/sh3/path_tracer/make_sky_rtiw.js +0 -17
  297. package/src/engine/graphics/sh3/sky/hosek/README.md +0 -4
  298. package/src/engine/graphics/sh3/sky/hosek/data.d.ts +0 -17
  299. package/src/engine/graphics/sh3/sky/hosek/data.d.ts.map +0 -1
  300. package/src/engine/graphics/sh3/sky/hosek/data.js +0 -3744
  301. package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.d.ts +0 -2
  302. package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.d.ts.map +0 -1
  303. package/src/engine/graphics/sh3/sky/hosek/prototype_hosek.js +0 -71
  304. package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.d.ts +0 -26
  305. package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.d.ts.map +0 -1
  306. package/src/engine/graphics/sh3/sky/hosek/render_hosek_sky_to_equirectangular.js +0 -70
  307. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.d.ts +0 -22
  308. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.d.ts.map +0 -1
  309. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +0 -388
  310. package/src/engine/graphics3/make_default_environment.d.ts +0 -15
  311. package/src/engine/graphics3/make_default_environment.d.ts.map +0 -1
  312. package/src/engine/graphics3/make_default_environment.js +0 -111
  313. package/src/shade/renderer/atmosphere/MIE_G.d.ts +0 -6
  314. package/src/shade/renderer/atmosphere/MIE_G.d.ts.map +0 -1
  315. package/src/shade/renderer/atmosphere/MIE_G.js +0 -5
  316. package/src/shade/renderer/atmosphere/chunk_sample_environment_color.d.ts.map +0 -1
  317. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.d.ts +0 -4
  318. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.d.ts.map +0 -1
  319. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.js +0 -44
  320. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.d.ts +0 -2
  321. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.d.ts.map +0 -1
  322. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.js +0 -43
  323. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.d.ts +0 -3
  324. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.d.ts.map +0 -1
  325. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_DENSITY_DECLARATION.js +0 -6
  326. package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.d.ts +0 -3
  327. package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.d.ts.map +0 -1
  328. package/src/shade/renderer/shader/chunk/atmosphere/chunk_absorb.js +0 -18
  329. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.d.ts +0 -14
  330. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.d.ts.map +0 -1
  331. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_optical_depth.js +0 -86
  332. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.d.ts +0 -8
  333. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.d.ts.map +0 -1
  334. package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.js +0 -125
  335. package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.d.ts +0 -3
  336. package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.d.ts.map +0 -1
  337. package/src/shade/renderer/shader/chunk/atmosphere/chunk_planet_intersection.js +0 -17
  338. package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.d.ts +0 -3
  339. package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.d.ts.map +0 -1
  340. package/src/shade/renderer/shader/chunk/atmosphere/chunk_sphere_intersection_nearest.js +0 -38
  341. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts +0 -16
  342. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts.map +0 -1
  343. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.js +0 -28
  344. package/src/shade/renderer/shader/chunk/color/tonemap/purkinjie/chunk_apply_purkinjie_shift.d.ts +0 -11
  345. package/src/shade/renderer/shader/chunk/color/tonemap/purkinjie/chunk_apply_purkinjie_shift.d.ts.map +0 -1
  346. package/src/shade/renderer/shader/chunk/color/tonemap/purkinjie/chunk_apply_purkinjie_shift.js +0 -56
  347. package/src/shade/renderer/shader/chunk/light/sky/chunk_sample_sky_color.d.ts.map +0 -1
  348. package/src/shade/renderer/view/GPUViewSkyContext.d.ts +0 -26
  349. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +0 -1
  350. package/src/shade/renderer/view/GPUViewSkyContext.js +0 -170
@@ -0,0 +1,457 @@
1
+ import { chunk_rgb_to_luminance } from "../../shader/chunk/color/chunk_rgb_to_luminance.js";
2
+ import { chunk_project_position_from_depth } from "../../shader/chunk/camera/chunk_project_position_from_depth.js";
3
+ import { chunk_is_background } from "../../shader/chunk/depth/chunk_is_background.js";
4
+ import {
5
+ chunk_decode_g_buffer_face_normal
6
+ } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_face_normal.js";
7
+ import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
8
+ import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
9
+ import { chunk_sh3_cosine_convolved_basis_at } from "../../shader/chunk/spherical_harmonics/chunk_sh3_basis_at.js";
10
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
11
+ import { ComputeShader } from "../../shader/ComputeShader.js";
12
+ import { ShaderResourceDescriptor } from "../../shader/resource/ShaderResourceDescriptor.js";
13
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
14
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
15
+ import { STBN_VEC2_RESOURCE } from "../../STATIC_GRAPHICS_ENGINE_ASSET_RESOURCES.js";
16
+ import { chunk_probe_clipmap_sample_radiance } from "../probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js";
17
+ import { PROBE_CLIPMAP_SAMPLING_GROUP } from "../probe_clipmap/probe/chunk_probe_clipmap_pick.js";
18
+ import {
19
+ chunk_screen_probe,
20
+ chunk_screen_probe_counts,
21
+ chunk_screen_probe_ray_jitter,
22
+ SCREEN_PROBE_DISPATCH_READ_RESOURCE,
23
+ SCREEN_PROBE_EXPOSURE_PREVIOUS_RESOURCE,
24
+ SCREEN_PROBE_EXPOSURE_RESOURCE,
25
+ SCREEN_PROBE_FRAME_RESOURCE,
26
+ SCREEN_PROBE_PICKS_READ_RESOURCE,
27
+ SCREEN_PROBE_RAY_INFO_WRITE_RESOURCE,
28
+ SCREEN_PROBES_PREVIOUS_RESOURCE,
29
+ SCREEN_PROBES_READ_RESOURCE
30
+ } from "./chunk_screen_probe.js";
31
+ import {
32
+ SCREEN_PROBE_CAMERA_PREVIOUS_RESOURCE,
33
+ SCREEN_PROBE_CAMERA_RESOURCE,
34
+ SCREEN_PROBE_DEPTH_RESOURCE,
35
+ SCREEN_PROBE_PBR_RESOURCE,
36
+ SCREEN_PROBE_VELOCITY_RESOURCE
37
+ } from "./chunk_screen_probe_surface.js";
38
+ import { chunk_screen_probe_brdf_density } from "./chunk_screen_probe_brdf_density.js";
39
+ import { chunk_screen_probe_lighting_history } from "./chunk_screen_probe_lighting_history.js";
40
+ import { chunk_screen_probe_ray_sort } from "./chunk_screen_probe_ray_sort.js";
41
+ import { chunk_screen_probe_workgroup_sum } from "./chunk_screen_probe_workgroup_sum.js";
42
+ import {
43
+ SCREEN_PROBE_BRDF_PIXEL_WEIGHT,
44
+ SCREEN_PROBE_MIN_PDF,
45
+ SCREEN_PROBE_OCTAHEDRON_LIMIT,
46
+ SCREEN_PROBE_THREAD_WORKGROUP_SIZE
47
+ } from "./SCREEN_PROBE.js";
48
+
49
+ /** Each probe's BRDF density, SH3 in three `vec4`s: coefficients 0–3, 4–7, and 8 alone. @type {ShaderResourceDescriptor} */
50
+ export const SCREEN_PROBE_BRDF_READ_RESOURCE = ShaderResourceDescriptor.storageBuffer("screen_probe_brdf", WebGPUArray.vec4f);
51
+ /** @type {ShaderResourceDescriptor} */
52
+ export const SCREEN_PROBE_BRDF_WRITE_RESOURCE = ShaderResourceDescriptor.storageBuffer("screen_probe_brdf", WebGPUArray.vec4f, true);
53
+
54
+ /** Each probe texel's lighting density, `r32float`, a texel a texel in the probes' atlas. @type {ShaderResourceDescriptor} */
55
+ export const SCREEN_PROBE_LIGHTING_PDF_READ_RESOURCE = ShaderResourceDescriptor.texture("screen_probe_lighting_pdf", "unfilterable-float");
56
+ /** @type {ShaderResourceDescriptor} */
57
+ export const SCREEN_PROBE_LIGHTING_PDF_WRITE_RESOURCE = ShaderResourceDescriptor.storageTexture("screen_probe_lighting_pdf", "r32float", "2d", "write-only");
58
+
59
+ /** Last frame's probe radiance after the spatial filter, `rgba16float`. @type {ShaderResourceDescriptor} */
60
+ export const SCREEN_PROBE_RADIANCE_HISTORY_RESOURCE = ShaderResourceDescriptor.texture("screen_probe_radiance_history", "unfilterable-float");
61
+
62
+ /** The G-buffer's shading normals. @type {ShaderResourceDescriptor} */
63
+ export const SCREEN_PROBE_NORMAL_RESOURCE = ShaderResourceDescriptor.texture("tNormal", "uint");
64
+
65
+ const brdf_resources = new ShaderResourceSetDescriptor();
66
+
67
+ brdf_resources.createGroup()
68
+ .add(SCREEN_PROBE_FRAME_RESOURCE)
69
+ .add(SCREEN_PROBE_CAMERA_RESOURCE)
70
+ .add(SCREEN_PROBES_READ_RESOURCE)
71
+ .add(SCREEN_PROBE_DISPATCH_READ_RESOURCE)
72
+ .add(SCREEN_PROBE_BRDF_WRITE_RESOURCE)
73
+ .add(SCREEN_PROBE_DEPTH_RESOURCE)
74
+ .add(SCREEN_PROBE_PBR_RESOURCE)
75
+ .add(SCREEN_PROBE_NORMAL_RESOURCE);
76
+
77
+ /**
78
+ * A probe's BRDF density (Lumen's `ScreenProbeComputeBRDFProbabilityDensityFunctionCS`): a workgroup a probe, a lane a
79
+ * pixel of an 8 × 8 grid over the square of 2D pixels about it, the pixels whose light interpolates from it. The centre
80
+ * lane takes the probe's own pixel.
81
+ *
82
+ * A pixel counts where it stands on the probe's surface: the probe's plane weight from the pixel's plane is past
83
+ * `SCREEN_PROBE_BRDF_PIXEL_WEIGHT` (the centre always counts). It adds its clamped cosine lobe about its shading normal
84
+ * as SH3 (`sh3_cosine_convolved_basis_at`, Lumen's `CalcDiffuseTransferSH3`), and the probe's density is the mean of
85
+ * the lobes: at a direction, how much the pixels' diffuse would weigh light from it.
86
+ *
87
+ * Lumen offsets its grid by `t/8·2D − 1` pixels, to one side of the probe; here the cells are centred on it, as the
88
+ * pixels that read the probe are.
89
+ *
90
+ * @type {ComputeShader}
91
+ */
92
+ export const shader_screen_probe_brdf_pdf = ComputeShader.from({
93
+ label: "Screen Probe BRDF PDF",
94
+ resources: brdf_resources,
95
+ body: CodeChunk.from(
96
+ //language=WGSL
97
+ `
98
+ @compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
99
+ fn main(
100
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
101
+ @builtin(local_invocation_index) lane: u32,
102
+ @builtin(subgroup_invocation_id) subgroup_lane: u32,
103
+ @builtin(subgroup_size) subgroup_size: u32,
104
+ ) {
105
+ let probe = folded_workgroup_index(workgroup_id);
106
+
107
+ if (probe >= screen_probe_count()) {
108
+ return;
109
+ }
110
+
111
+ let record = screen_probes[probe];
112
+
113
+ if (record.depth <= 0.0) {
114
+ return;
115
+ }
116
+
117
+ let frame = screen_probe_frame;
118
+ let span = f32(1u << frame.downsample_shift);
119
+
120
+ // an 8 × 8 grid of cells over [-D, D) about the probe, the centre lane on the probe's own pixel
121
+ let cell = vec2<f32>(f32(lane & 7u), f32(lane >> 3u));
122
+ let centre = lane == 36u;
123
+ let offset = select((cell + 0.5) * (span * 0.25) - span, vec2<f32>(0.0), centre);
124
+ let pixel = vec2<u32>(clamp(vec2<f32>(screen_probe_pixel_decode(record.pixel)) + offset, vec2<f32>(0.0), vec2<f32>(frame.view_size - 1u)));
125
+
126
+ var lobe = array<f32, 9>();
127
+ var counted = 0.0;
128
+
129
+ let device_depth = textureLoad(tDepth, pixel, 0).r;
130
+
131
+ if (!is_background(device_depth)) {
132
+ let uv = (vec2<f32>(pixel) + 0.5) / vec2<f32>(frame.view_size);
133
+ let position = project_position_from_depth(uv, device_depth, camera.view_projection_matrix_inverse);
134
+ let face = decode_g_buffer_face_normal(textureLoad(tPBR, pixel, 0));
135
+ let plane = vec4<f32>(face, dot(face, position));
136
+
137
+ if (centre || screen_probe_plane_weight(plane, record.position, record.depth) > ${SCREEN_PROBE_BRDF_PIXEL_WEIGHT}) {
138
+ lobe = sh3_cosine_convolved_basis_at(decode_g_buffer_normal(textureLoad(tNormal, pixel, 0).x));
139
+ counted = 1.0;
140
+ }
141
+ }
142
+
143
+ let s0 = screen_probe_workgroup_sum(vec4<f32>(lobe[0], lobe[1], lobe[2], lobe[3]), lane, subgroup_lane, subgroup_size);
144
+ let s1 = screen_probe_workgroup_sum(vec4<f32>(lobe[4], lobe[5], lobe[6], lobe[7]), lane, subgroup_lane, subgroup_size);
145
+ let s2 = screen_probe_workgroup_sum(vec4<f32>(lobe[8], counted, 0.0, 0.0), lane, subgroup_lane, subgroup_size);
146
+
147
+ if (lane == 0u) {
148
+ // the centre always counts, so the count is at least one
149
+ let mean = 1.0 / max(s2.y, 1.0);
150
+
151
+ screen_probe_brdf[probe * 3u] = s0 * mean;
152
+ screen_probe_brdf[probe * 3u + 1u] = s1 * mean;
153
+ screen_probe_brdf[probe * 3u + 2u] = vec4<f32>(s2.x * mean, 0.0, 0.0, 0.0);
154
+ }
155
+ }
156
+ `, [
157
+ chunk_screen_probe,
158
+ chunk_screen_probe_counts,
159
+ chunk_screen_probe_workgroup_sum,
160
+ chunk_folded_workgroup_index,
161
+ chunk_is_background,
162
+ chunk_project_position_from_depth,
163
+ chunk_decode_g_buffer_face_normal,
164
+ chunk_decode_g_buffer_normal,
165
+ chunk_sh3_cosine_convolved_basis_at,
166
+ ]),
167
+ });
168
+
169
+ const lighting_resources = new ShaderResourceSetDescriptor();
170
+
171
+ lighting_resources.createGroup()
172
+ .add(SCREEN_PROBE_FRAME_RESOURCE)
173
+ .add(SCREEN_PROBE_EXPOSURE_RESOURCE)
174
+ .add(SCREEN_PROBE_EXPOSURE_PREVIOUS_RESOURCE)
175
+ .add(SCREEN_PROBE_CAMERA_PREVIOUS_RESOURCE)
176
+ .add(SCREEN_PROBE_VELOCITY_RESOURCE)
177
+ .add(SCREEN_PROBES_READ_RESOURCE)
178
+ .add(SCREEN_PROBES_PREVIOUS_RESOURCE)
179
+ .add(SCREEN_PROBE_PICKS_READ_RESOURCE)
180
+ .add(SCREEN_PROBE_DISPATCH_READ_RESOURCE)
181
+ .add(SCREEN_PROBE_RADIANCE_HISTORY_RESOURCE)
182
+ .add(SCREEN_PROBE_LIGHTING_PDF_WRITE_RESOURCE)
183
+ .add(STBN_VEC2_RESOURCE);
184
+
185
+ lighting_resources.addGroup(PROBE_CLIPMAP_SAMPLING_GROUP);
186
+
187
+ /**
188
+ * A probe's lighting density (Lumen's `ScreenProbeComputeLightingProbabilityDensityFunctionCS`): a workgroup a probe,
189
+ * its lanes over its n² texels.
190
+ *
191
+ * - **History**: last frame's four uniform probes around the probe's surface point that stood on its surface
192
+ * (`screen_probe_lighting_history`), each giving its filtered radiance in the same texel, since a texel is a
193
+ * direction in the world. They are averaged, pre-exposed as last frame's exposure left them and brought to this
194
+ * frame's (`screen_probe_exposure` over `screen_probe_exposure_previous`), as Lumen rescales its history.
195
+ * - **The rest**: the share of the four that gave nothing, 1 − accepted / 4, is the world-space probes' radiance the
196
+ * probe's pick reads (`screen_probe_picks`), along the texel's direction at this frame's jitter, pre-exposed by this
197
+ * frame's exposure. Where nothing was picked, the history alone, or one where there is none: a density that ranks
198
+ * nothing.
199
+ * - The density is each texel's luminance over the probe's sum.
200
+ *
201
+ * @type {ComputeShader}
202
+ */
203
+ export const shader_screen_probe_lighting_pdf = ComputeShader.from({
204
+ label: "Screen Probe Lighting PDF",
205
+ resources: lighting_resources,
206
+ body: CodeChunk.from(
207
+ //language=WGSL
208
+ `
209
+ const SCREEN_PROBE_TEXEL_LIMIT = ${SCREEN_PROBE_OCTAHEDRON_LIMIT * SCREEN_PROBE_OCTAHEDRON_LIMIT}u;
210
+
211
+ var<workgroup> screen_probe_texel_pdf: array<f32, SCREEN_PROBE_TEXEL_LIMIT>;
212
+
213
+ // a history probe's radiance in a texel, none where it gave none: a uniform probe's place in last frame's atlas is its
214
+ // tile's
215
+ fn screen_probe_history_radiance(index: u32, texel: vec2<u32>) -> vec3<f32> {
216
+ if (index == SCREEN_PROBE_HISTORY_NONE) {
217
+ return vec3<f32>(0.0);
218
+ }
219
+
220
+ let columns = screen_probe_frame.previous_tile_count.x;
221
+ let base = vec2<u32>(index % columns, index / columns) * screen_probe_frame.octahedron_resolution;
222
+
223
+ return textureLoad(screen_probe_radiance_history, base + texel, 0).rgb;
224
+ }
225
+
226
+ fn screen_probe_picked_radiance(pick: ScreenProbePick, direction: vec3<f32>) -> vec3<f32> {
227
+ var radiance = vec3<f32>(0.0);
228
+
229
+ // each share by name
230
+ if (pick.weights.x > 0.0) { radiance += pick.weights.x * probe_clipmap_radiance(pick.slots.x, direction).rgb; }
231
+ if (pick.weights.y > 0.0) { radiance += pick.weights.y * probe_clipmap_radiance(pick.slots.y, direction).rgb; }
232
+ if (pick.weights.z > 0.0) { radiance += pick.weights.z * probe_clipmap_radiance(pick.slots.z, direction).rgb; }
233
+ if (pick.weights.w > 0.0) { radiance += pick.weights.w * probe_clipmap_radiance(pick.slots.w, direction).rgb; }
234
+
235
+ return radiance;
236
+ }
237
+
238
+ @compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
239
+ fn main(
240
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
241
+ @builtin(local_invocation_index) lane: u32,
242
+ @builtin(subgroup_invocation_id) subgroup_lane: u32,
243
+ @builtin(subgroup_size) subgroup_size: u32,
244
+ ) {
245
+ let probe = folded_workgroup_index(workgroup_id);
246
+
247
+ if (probe >= screen_probe_count()) {
248
+ return;
249
+ }
250
+
251
+ let record = screen_probes[probe];
252
+
253
+ if (record.depth <= 0.0) {
254
+ return;
255
+ }
256
+
257
+ let frame = screen_probe_frame;
258
+ let n = frame.octahedron_resolution;
259
+ let texels = n * n;
260
+ let pick = screen_probe_picks[probe];
261
+ let picked = dot(pick.weights, vec4<f32>(1.0)) > 0.0;
262
+
263
+ // last frame's four uniform probes around the point, where they stood on its surface
264
+ let history = screen_probe_lighting_history(record);
265
+ let accepted = dot(select(vec4<f32>(0.0), vec4<f32>(1.0), history != vec4<u32>(SCREEN_PROBE_HISTORY_NONE)), vec4<f32>(1.0));
266
+ let rest = 1.0 - saturate(accepted / 4.0);
267
+ let exposure = screen_probe_exposure.value;
268
+ let rescale = exposure / max(screen_probe_exposure_previous.value, 1e-20);
269
+ let jitter = screen_probe_ray_jitter(screen_probe_noise_tile(probe, screen_probe_pixel_decode(record.pixel)));
270
+
271
+ var local_sum = 0.0;
272
+
273
+ for (var t = lane; t < texels; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
274
+ let texel = vec2<u32>(t & (n - 1u), t >> frame.octahedron_shift);
275
+
276
+ var lighting = vec3<f32>(0.0);
277
+
278
+ if (accepted > 0.0) {
279
+ lighting = (screen_probe_history_radiance(history.x, texel) + screen_probe_history_radiance(history.y, texel)
280
+ + screen_probe_history_radiance(history.z, texel) + screen_probe_history_radiance(history.w, texel)) * (rescale / accepted);
281
+ }
282
+
283
+ if (rest > 0.0 && picked) {
284
+ let direction = screen_probe_ray_direction(screen_probe_ray_info_pack(texel, 1u), jitter);
285
+
286
+ lighting += (rest * exposure) * screen_probe_picked_radiance(pick, direction);
287
+ } else if (accepted == 0.0) {
288
+ lighting = vec3<f32>(1.0);
289
+ }
290
+
291
+ let pdf = rgb_to_luminance(lighting);
292
+
293
+ screen_probe_texel_pdf[t] = pdf;
294
+ local_sum += pdf;
295
+ }
296
+
297
+ let total = screen_probe_workgroup_sum(vec4<f32>(local_sum, 0.0, 0.0, 0.0), lane, subgroup_lane, subgroup_size).x;
298
+ let inverse = 1.0 / max(total, 1e-4);
299
+
300
+ for (var t = lane; t < texels; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
301
+ textureStore(screen_probe_lighting_pdf, screen_probe_texel(probe, t), vec4<f32>(screen_probe_texel_pdf[t] * inverse, 0.0, 0.0, 0.0));
302
+ }
303
+ }
304
+ `, [
305
+ chunk_screen_probe,
306
+ chunk_screen_probe_counts,
307
+ chunk_screen_probe_ray_jitter,
308
+ chunk_screen_probe_workgroup_sum,
309
+ chunk_folded_workgroup_index,
310
+ chunk_screen_probe_lighting_history,
311
+ chunk_rgb_to_luminance,
312
+ chunk_probe_clipmap_sample_radiance,
313
+ ]),
314
+ });
315
+
316
+ const rays_resources = new ShaderResourceSetDescriptor();
317
+
318
+ rays_resources.createGroup()
319
+ .add(SCREEN_PROBE_FRAME_RESOURCE)
320
+ .add(SCREEN_PROBES_READ_RESOURCE)
321
+ .add(SCREEN_PROBE_DISPATCH_READ_RESOURCE)
322
+ .add(SCREEN_PROBE_BRDF_READ_RESOURCE)
323
+ .add(SCREEN_PROBE_LIGHTING_PDF_READ_RESOURCE)
324
+ .add(SCREEN_PROBE_RAY_INFO_WRITE_RESOURCE);
325
+
326
+ /**
327
+ * A probe's rays (Lumen's `ScreenProbeGenerateRaysCS`): a workgroup a probe, its lanes over its n² rays, each written
328
+ * as the texel and level it falls in (`screen_probe_ray_info_pack`), a ray's slot its place in the sorted order.
329
+ *
330
+ * 1. **Density**: each texel's BRDF density at its centre, `max(0, Σ brdf·Y(ω))`; times its lighting density · n².
331
+ * A texel any of whose directions the BRDF density reaches `SCREEN_PROBE_MIN_PDF` is held there
332
+ * (`screen_probe_brdf_keeps`), so the light ranks texels and only the pixels' lobes cull one; another falls under
333
+ * it unless its light lifts it.
334
+ * 2. **Sort**: the probe's own rays, ascending by density, ties in index order (`screen_probe_ray_sort`: the engine's
335
+ * bitonic network in the workgroup's memory, O(n² log² n) a probe, where Lumen ranks every ray against every other,
336
+ * O(n⁴)).
337
+ * 3. **Reassignment**: the sorted rays in threes from the lowest; a three whose highest is under the minimum gives
338
+ * its rays to the highest texel not yet given, from the top: that texel splits into its four children at twice the
339
+ * resolution, the three take three children and the texel the fourth. One level only, as Lumen's parallel path.
340
+ * A child holds a quarter of its parent's solid angle (the map is equal-area), which the composite weighs it by.
341
+ *
342
+ * With importance sampling off, or where the probe stands on no surface, ray i is texel i at the probe's own n.
343
+ *
344
+ * @type {ComputeShader}
345
+ */
346
+ export const shader_screen_probe_generate_rays = ComputeShader.from({
347
+ label: "Screen Probe Generate Rays",
348
+ resources: rays_resources,
349
+ body: CodeChunk.from(
350
+ //language=WGSL
351
+ `
352
+ const SCREEN_PROBE_TEXEL_LIMIT = ${SCREEN_PROBE_OCTAHEDRON_LIMIT * SCREEN_PROBE_OCTAHEDRON_LIMIT}u;
353
+
354
+ var<workgroup> screen_probe_split: atomic<u32>;
355
+
356
+ fn screen_probe_brdf_of(probe: u32) -> ScreenProbeBRDF {
357
+ return ScreenProbeBRDF(screen_probe_brdf[probe * 3u], screen_probe_brdf[probe * 3u + 1u], screen_probe_brdf[probe * 3u + 2u].x);
358
+ }
359
+
360
+ @compute @workgroup_size(${SCREEN_PROBE_THREAD_WORKGROUP_SIZE})
361
+ fn main(
362
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
363
+ @builtin(local_invocation_index) lane: u32,
364
+ ) {
365
+ let probe = folded_workgroup_index(workgroup_id);
366
+
367
+ if (probe >= screen_probe_count()) {
368
+ return;
369
+ }
370
+
371
+ let frame = screen_probe_frame;
372
+ let n = frame.octahedron_resolution;
373
+ let count = n * n;
374
+ let record = screen_probes[probe];
375
+
376
+ if (frame.importance_sampling == 0u || record.depth <= 0.0) {
377
+ for (var t = lane; t < count; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
378
+ textureStore(screen_probe_ray_info, screen_probe_texel(probe, t), vec4<u32>(screen_probe_ray_info_pack(vec2<u32>(t & (n - 1u), t >> frame.octahedron_shift), 1u), 0u, 0u, 0u));
379
+ }
380
+
381
+ return;
382
+ }
383
+
384
+ let scale = f32(count);
385
+ let brdf = screen_probe_brdf_of(probe);
386
+
387
+ for (var t = lane; t < count; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
388
+ let texel = vec2<u32>(t & (n - 1u), t >> frame.octahedron_shift);
389
+ let direction = uv_equal_area_sphere_decode((vec2<f32>(texel) + 0.5) / f32(n));
390
+
391
+ let density = screen_probe_brdf_density(brdf, direction);
392
+ let lighting = textureLoad(screen_probe_lighting_pdf, screen_probe_texel(probe, t), 0).r;
393
+
394
+ var pdf = density * lighting * scale;
395
+
396
+ // the light ranks what the lobes keep, it culls nothing
397
+ if (screen_probe_brdf_keeps(brdf, texel, n)) {
398
+ pdf = max(pdf, ${SCREEN_PROBE_MIN_PDF});
399
+ }
400
+
401
+ // held off −0, so the density's bits order as it does
402
+ screen_probe_sort[t] = vec2<u32>(screen_probe_ray_info_pack(texel, 1u), bitcast<u32>(abs(pdf)));
403
+ }
404
+
405
+ if (lane == 0u) {
406
+ atomicStore(&screen_probe_split, 0u);
407
+ }
408
+
409
+ workgroupBarrier();
410
+
411
+ screen_probe_ray_sort(lane, ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u, count);
412
+
413
+ // threes of the lowest under the minimum give their rays to the highest, one texel each from the top
414
+ for (var i = lane; i < count; i += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
415
+ let three = i / 3u;
416
+ let member = i - 3u * three;
417
+ let split = count - 1u - three;
418
+ let highest = 3u * three + 2u;
419
+
420
+ if (highest < split && bitcast<f32>(screen_probe_sort[count + highest].y) < ${SCREEN_PROBE_MIN_PDF}) {
421
+ let parent = screen_probe_sort[count + split].x;
422
+ let child = screen_probe_ray_info_texel(parent) * 2u + vec2<u32>((member + 1u) & 1u, (member + 1u) >> 1u);
423
+
424
+ screen_probe_sort[count + i] = vec2<u32>(screen_probe_ray_info_pack(child, screen_probe_ray_info_level(parent) - 1u), 0u);
425
+
426
+ if (member == 0u) {
427
+ atomicAdd(&screen_probe_split, 1u);
428
+ }
429
+ }
430
+ }
431
+
432
+ workgroupBarrier();
433
+
434
+ let split_count = atomicLoad(&screen_probe_split);
435
+
436
+ // and each split texel takes its first child
437
+ for (var i = lane; i < split_count; i += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
438
+ let at = count + count - 1u - i;
439
+ let parent = screen_probe_sort[at].x;
440
+
441
+ screen_probe_sort[at] = vec2<u32>(screen_probe_ray_info_pack(screen_probe_ray_info_texel(parent) * 2u, screen_probe_ray_info_level(parent) - 1u), 0u);
442
+ }
443
+
444
+ workgroupBarrier();
445
+
446
+ for (var t = lane; t < count; t += ${SCREEN_PROBE_THREAD_WORKGROUP_SIZE}u) {
447
+ textureStore(screen_probe_ray_info, screen_probe_texel(probe, t), vec4<u32>(screen_probe_sort[count + t].x, 0u, 0u, 0u));
448
+ }
449
+ }
450
+ `, [
451
+ chunk_screen_probe,
452
+ chunk_screen_probe_counts,
453
+ chunk_folded_workgroup_index,
454
+ chunk_screen_probe_ray_sort,
455
+ chunk_screen_probe_brdf_density,
456
+ ]),
457
+ });
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The screen probes' deferred indirect light in one pass, for SSR off: the diffuse is the screen probes' (the temporal
3
+ * filter's output, E at the bent normal), and the specular the world-space probes', picked and resolved as the probe
4
+ * clipmap's fused pass takes it (`probe_clipmap_radiance_of`), the environment's where no probe weighs anything. The
5
+ * two are resolved as `shader_resolve_indirect_lighting` resolves the IBL pair: AO multiplies the diffuse, the
6
+ * specular is occluded along its lobe, and the result is added to the scene's colour.
7
+ *
8
+ * @type {ImageShader}
9
+ */
10
+ export const shader_screen_probe_indirect_lighting: ImageShader;
11
+ /**
12
+ * The screen probes' deferred diffuse, for SSR on: the temporal filter's output, E at the bent normal, times AO, as
13
+ * the IBL pass bakes AO in at the source, so `shader_resolve_indirect_lighting` and SSR's hits read it as any mode's.
14
+ *
15
+ * @type {ImageShader}
16
+ */
17
+ export const shader_screen_probe_diffuse: ImageShader;
18
+ /**
19
+ * Keep the frame's lit colour of the opaque surfaces for the next frame's screen traces: a thread a pixel, copied as
20
+ * it stands once the indirect light is added, before fog and transparencies, which are not the surfaces' radiance.
21
+ *
22
+ * @type {ComputeShader}
23
+ */
24
+ export const shader_screen_probe_color_capture: ComputeShader;
25
+ import { ImageShader } from "../../shader/ImageShader.js";
26
+ import { ComputeShader } from "../../shader/ComputeShader.js";
27
+ //# sourceMappingURL=shader_screen_probe_indirect_lighting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_screen_probe_indirect_lighting.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/screen_probe/shader_screen_probe_indirect_lighting.js"],"names":[],"mappings":"AAmDA;;;;;;;;GAQG;AACH,oDAFU,WAAW,CA8FlB;AAQH;;;;;GAKG;AACH,0CAFU,WAAW,CAyBlB;AAQH;;;;;GAKG;AACH,gDAFU,aAAa,CAiBpB;4BAxMyB,6BAA6B;8BAD3B,+BAA+B"}