@woosh/meep-engine 3.11.2 → 3.12.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 (551) hide show
  1. package/README.md +14 -18
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/SelectionVisualizer.js +127 -127
  4. package/editor/entity_world_bounds.js +27 -27
  5. package/editor/particles/rebuildParticleEmitter.js +31 -31
  6. package/editor/process/SymbolicDisplayProcess.js +1 -1
  7. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  8. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  9. package/editor/prototypeEditorShell.js +156 -156
  10. package/editor/selection/editor_pick.js +130 -130
  11. package/editor/selection/screen_rect_frustum.js +119 -119
  12. package/editor/tools/v2/TransformControls.js +971 -971
  13. package/package.json +1 -1
  14. package/src/engine/Engine.d.ts +3 -3
  15. package/src/engine/Engine.d.ts.map +1 -1
  16. package/src/engine/Engine.js +726 -726
  17. package/src/engine/EngineHarness.d.ts +1 -1
  18. package/src/engine/EngineHarness.js +590 -590
  19. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  21. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  23. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  24. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  25. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  26. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  27. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  29. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  30. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  31. package/src/engine/graphics/ecs/water/Water.js +104 -104
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  33. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  36. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  38. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  39. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  40. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  41. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  42. package/src/engine/graphics3/AnimationSystem.js +352 -0
  43. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  44. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  45. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  46. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  47. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  48. package/src/engine/graphics3/CameraSystem.js +170 -0
  49. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  50. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  51. package/src/engine/graphics3/CameraSystem3.js +6 -166
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  53. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  54. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  56. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  57. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  58. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  59. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  60. package/src/engine/graphics3/DecalSystem.js +441 -0
  61. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  62. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  63. package/src/engine/graphics3/DecalSystem3.js +6 -437
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  65. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  66. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  68. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  69. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  70. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  71. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  72. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  74. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  75. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  76. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  77. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  78. package/src/engine/graphics3/HighlightSystem.js +241 -0
  79. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  80. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  81. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  82. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  83. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  84. package/src/engine/graphics3/LightSystem.js +211 -0
  85. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  86. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  87. package/src/engine/graphics3/LightSystem3.js +6 -207
  88. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  89. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  90. package/src/engine/graphics3/MeshSystem.js +647 -0
  91. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  92. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  93. package/src/engine/graphics3/MeshSystem3.js +6 -642
  94. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  95. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  101. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  106. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  107. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  109. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  110. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  112. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  113. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  114. package/src/engine/graphics3/Pickable.d.ts +1 -1
  115. package/src/engine/graphics3/Pickable.js +65 -65
  116. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  117. package/src/engine/graphics3/PickingQuery.js +48 -48
  118. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  119. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  120. package/src/engine/graphics3/PickingSystem.js +273 -0
  121. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  122. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  123. package/src/engine/graphics3/PickingSystem3.js +6 -269
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  128. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  129. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  130. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  131. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  132. package/src/engine/graphics3/TerrainSystem.js +566 -0
  133. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  134. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  135. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  138. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  140. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  141. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  142. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  143. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  144. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  146. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  147. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  148. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  149. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  155. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  156. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  157. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  158. package/src/engine/graphics3/WaterSystem.js +293 -0
  159. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  160. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  161. package/src/engine/graphics3/WaterSystem3.js +6 -289
  162. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  163. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  164. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  165. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  166. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  167. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  169. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  172. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  175. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  176. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  177. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  178. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  180. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  182. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  183. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  184. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  185. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  186. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  187. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  188. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
  189. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
  190. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
  191. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
  192. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  193. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
  194. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
  195. package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
  196. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  197. package/src/shade/device/ShadeGPUCommandContext.js +994 -940
  198. package/src/shade/device/immediate_data_supported.d.ts +33 -0
  199. package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
  200. package/src/shade/device/immediate_data_supported.js +53 -0
  201. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
  202. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  203. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
  204. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
  205. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  206. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
  207. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  208. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
  209. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
  210. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
  211. package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
  212. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
  213. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  214. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
  215. package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
  216. package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
  217. package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
  218. package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
  219. package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
  220. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  221. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  222. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  223. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  224. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  225. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  226. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  227. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  228. package/src/shade/renderer/GraphicsContext.d.ts +9 -2
  229. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  230. package/src/shade/renderer/GraphicsContext.js +13 -1
  231. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  232. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  233. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  234. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  235. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  236. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  237. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  238. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  239. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  240. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  241. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  242. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  243. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  244. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  245. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  246. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  247. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  248. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  249. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  250. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  251. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  252. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  253. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  254. package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
  255. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
  256. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
  257. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
  258. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
  259. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
  260. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
  261. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
  262. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  263. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
  264. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
  265. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
  266. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
  267. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
  268. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  269. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
  270. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
  271. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  272. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
  273. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
  274. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  275. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
  276. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
  277. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
  278. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
  279. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
  280. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
  281. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
  282. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
  283. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
  284. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
  285. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
  286. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  287. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -84
  288. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  289. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
  290. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  291. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
  292. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  293. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  294. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  295. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  296. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  297. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  298. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  299. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  300. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  301. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  302. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  303. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  304. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  305. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  306. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  307. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  308. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  309. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  310. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  311. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  312. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  313. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  314. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  315. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  316. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  317. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  318. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  319. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  320. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  321. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  322. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  323. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  324. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  325. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  326. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  327. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  328. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  329. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  330. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  331. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  332. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  333. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +10 -9
  334. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  335. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  336. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  337. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  338. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  339. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  340. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  341. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  342. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  343. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  344. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  345. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  346. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  347. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  348. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  349. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  350. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  351. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  352. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  353. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  354. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  355. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  356. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  357. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  358. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  359. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  360. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  361. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  362. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  363. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  364. package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
  365. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  366. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  367. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  368. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  369. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  370. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  371. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  372. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  373. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  374. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  375. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  376. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  377. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  378. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
  380. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  382. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  384. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  385. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  386. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +57 -57
  387. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  388. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  389. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  390. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  391. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  392. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  393. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  394. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  395. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  396. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  397. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  398. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  399. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  400. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  401. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  402. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  403. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  404. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  405. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  406. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  407. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  408. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  409. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  410. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  411. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  412. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
  413. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  414. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  415. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  416. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  417. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  418. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  419. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  420. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
  421. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  422. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  423. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  424. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  425. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  426. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  427. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  428. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  429. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
  430. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  431. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  432. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  433. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  434. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  435. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  436. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  437. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  438. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  439. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  440. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  441. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  442. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  443. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  444. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  445. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  446. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  447. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  448. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  449. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  450. package/src/shade/renderer/shader/ComputeShader.js +350 -292
  451. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  452. package/src/shade/renderer/shader/ImageShader.js +217 -214
  453. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  454. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  455. package/src/shade/renderer/shader/ShaderDescriptor.js +46 -0
  456. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
  457. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
  458. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
  459. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
  460. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
  461. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
  462. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
  463. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
  464. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
  465. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
  466. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
  467. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
  468. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
  469. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
  470. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
  471. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
  472. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
  473. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
  474. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
  475. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
  476. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
  477. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
  478. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
  479. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
  480. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  481. package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
  482. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
  483. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
  484. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
  485. package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
  486. package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
  487. package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
  488. package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
  489. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
  490. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
  491. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
  492. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  493. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
  494. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
  495. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
  496. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
  497. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
  498. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  499. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
  500. package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
  501. package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
  502. package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
  503. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  504. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  505. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  506. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  507. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  508. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  509. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  510. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  511. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  512. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
  513. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
  514. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  515. package/src/shade/renderer/volumetrics/NOTES.md +238 -0
  516. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
  517. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
  518. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
  519. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
  520. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  521. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +591 -577
  522. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +17 -0
  523. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  524. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +20 -2
  525. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  526. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
  527. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
  528. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
  529. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
  530. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
  531. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  532. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  533. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  534. package/src/shade/renderer/water/shader_water.js +246 -246
  535. package/src/shade/vitest.setup.mjs +1 -1
  536. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  537. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
  538. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  539. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
  540. package/src/view/minimap/Minimap.d.ts +2 -2
  541. package/src/view/minimap/Minimap.d.ts.map +1 -1
  542. package/src/view/minimap/Minimap.js +225 -225
  543. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  544. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  545. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  546. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  547. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  548. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
  549. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
  550. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
  551. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
@@ -1,261 +1,261 @@
1
- import { CAMERA_UNIFORM_STRUCT } from "../camera/CAMERA_UNIFORM_STRUCT.js";
2
- import { chunk_stbn_sample_vec3 } from "../shader/chunk/noise/chunk_stbn_sample_vec3.js";
3
- import {
4
- chunk_compute_near_far_from_projection
5
- } from "../shader/chunk/camera/chunk_compute_near_far_from_projection.js";
6
- import { chunk_rgb_to_luminance } from "../shader/chunk/color/chunk_rgb_to_luminance.js";
7
- import { chunk_texel_coordinate_to_uv } from "../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
8
- import { chunk_uv_to_texel_coordinate } from "../shader/chunk/texture/chunk_uv_to_texel_coordinate.js";
9
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
10
- import { ComputeShader } from "../shader/ComputeShader.js";
11
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
12
- import { VIEW_UNIFORM_STRUCT } from "../view/VIEW_UNIFORM_STRUCT.js";
13
- import { chunk_cluster_depth_from_z_slice } from "../light/cluster/chunk_cluster_depth_from_z_slice.js";
14
- import { chunk_cluster_depth_to_z_slice } from "../light/cluster/chunk_cluster_depth_to_z_slice.js";
15
- import { VOLUMETRICS_METADATA_STRUCT } from "./VOLUMETRICS_METADATA_STRUCT.js";
16
- import { WebGPUArray } from "../shader/type/WebGPUArray.js";
17
- import { chunk_camera_ray_from_uv } from "../shader/chunk/geometry/ray/chunk_camera_ray_from_uv.js";
18
- import { chunk_directional_lights_iteration_mask } from "../shader/chunk/light/io/chunk_directional_lights_iteration_mask.js";
19
- import { chunk_get_directional_light_info_by_index } from "../shader/chunk/light/io/chunk_get_directional_light_info_by_index.js";
20
- import { chunk_sky_lut_compute_uv } from "../atmosphere/chunk_sky_lut_compute_uv.js";
21
- import { chunk_calculate_multiscattering } from "./chunk_calculate_multiscattering.js";
22
- import { chunk_camera_ray_planar_depth_scale } from "./chunk_camera_ray_planar_depth_scale.js";
23
- import { PARTICIPATING_MEDIA_VOLUME_STRUCT } from "./PARTICIPATING_MEDIA_VOLUME_STRUCT.js";
24
- import { SCENE_VOLUMETRICS_METADATA_STRUCT } from "./SCENE_VOLUMETRICS_METADATA_STRUCT.js";
25
-
26
- const resources = new ShaderResourceSetDescriptor();
27
-
28
- resources.createGroup()
29
- .addUniform("camera", CAMERA_UNIFORM_STRUCT)
30
- .addUniform("view", VIEW_UNIFORM_STRUCT)
31
- .addTexture("tSTBN_vec3", "unfilterable-float", "3d")
32
- .addUniform("volumetrics_metadata", VOLUMETRICS_METADATA_STRUCT)
33
- .addTexture("tParticipatingMedia0", "float", "3d")
34
- .addTexture("tParticipatingMedia1", "float", "3d")
35
- .addTexture("tVolumeLighting", "float", "3d") // pre-integrated volumetric light scattering
36
- // RDR2-style far field: beyond froxel_far the pass ray-marches the scene volumes directly,
37
- // lit by the directional sun + atmosphere (single scattering, no self-shadow).
38
- .addUniform("scene_volumetrics_metadata", SCENE_VOLUMETRICS_METADATA_STRUCT)
39
- .addStorageBuffer("scene_volumes", WebGPUArray.from(PARTICIPATING_MEDIA_VOLUME_STRUCT))
40
- .addStorageBuffer("light_data", WebGPUArray.u32)
41
- .addTexture("tSunTransmittance", "float", "2d")
42
- .addSampler("sLinear")
43
- .addStorageTexture("tOutput", "rgba16float", "3d", "write-only");
44
-
45
-
46
- /**
47
- * see https://github.com/GPUOpen-Effects/Hybrid-Stochastic-Reflections/blob/b3eef4be70db3522c54d289766e6db797777163c/sample/src/Shaders/Atmosphere.h#L149
48
- * see https://github.com/AirGuanZ/AtmosphereRenderer/blob/94055f272814a850aafa072555a839311b3d2924/asset/aerial_lut.hlsl#L33
49
- * @type {CodeChunk}
50
- */
51
- const body = CodeChunk.from(
52
- //language=WGSL
53
- `
54
- struct FarVolumeSample {
55
- scattering: vec3<f32>,
56
- extinction: vec3<f32>,
57
- phase_g: f32,
58
- }
59
-
60
- // Point-sample the scene participating-media volumes (coarse: full density inside the box, no edge
61
- // fade — that is a near-field nicety). Used only beyond the froxel grid.
62
- fn far_sample_volumes(world_pos: vec3<f32>) -> FarVolumeSample {
63
- var scattering = vec3<f32>(0.0);
64
- var extinction = vec3<f32>(0.0);
65
- var g_weighted = 0.0;
66
- var scattering_luma = 0.0;
67
-
68
- let count = scene_volumetrics_metadata.instance_count;
69
- for (var i = 0u; i < count; i++) {
70
- let volume = scene_volumes[i];
71
- let local = (volume.transform_inverse * vec4<f32>(world_pos, 1.0)).xyz;
72
- if (any(abs(local) > vec3<f32>(0.5))) {
73
- continue;
74
- }
75
- let weight = volume.density;
76
- let vs = volume.particle_spec.scattering * weight;
77
- let ve = volume.particle_spec.extinction * weight;
78
- scattering += vs;
79
- extinction += ve;
80
- let luma = rgb_to_luminance(vs);
81
- g_weighted += volume.particle_spec.g * luma;
82
- scattering_luma += luma;
83
- }
84
- var g = 0.0;
85
- if (scattering_luma > 0.0) {
86
- g = g_weighted / scattering_luma;
87
- }
88
- return FarVolumeSample(scattering, extinction, g);
89
- }
90
-
91
- // In-scatter (.rgb) + mono extinction (.a) at a march point. Inside the froxel grid (depth <=
92
- // froxel_far) this is the pre-lit grid sample; beyond it we ray-march the volumes directly and light
93
- // them with the directional sun + atmospheric transmittance (single scattering, no self-shadow).
94
- fn far_sample_lighting(depth: f32, uvw_grid: vec3<f32>, world_pos: vec3<f32>, ray_dir: vec3<f32>) -> vec4<f32> {
95
- if (depth <= volumetrics_metadata.froxel_far) {
96
- // The froxel grid uses its own (tighter) depth curve, so map this LUT depth to the grid
97
- // slice before sampling (identity when froxel_far == camera.far).
98
- let res_z = f32(textureDimensions(tVolumeLighting).z);
99
- let grid_slice = cluster_depth_to_z_slice(depth, volumetrics_metadata.froxel_cluster_parameters, res_z);
100
- let vl = textureSampleLevel(tVolumeLighting, sLinear, vec3<f32>(uvw_grid.xy, grid_slice / res_z), 0.0);
101
- return vec4<f32>(vl.rgb, vl.a);
102
- }
103
-
104
- let s = far_sample_volumes(world_pos);
105
-
106
- var inscatter = vec3<f32>(0.0);
107
- var directional_bits = directional_lights_iteration_mask(&light_data);
108
- while (directional_bits != 0u) {
109
- let directional_index = countTrailingZeros(directional_bits);
110
- directional_bits &= ~(1u << directional_index);
111
-
112
- let sun = get_directional_light_info_by_index(&light_data, directional_index);
113
- let u = dot(sun.direction, ray_dir);
114
- let sun_lut_uv = sky_lut_compute_uv(world_pos, sun.direction);
115
- let transmittance_atmospheric = textureSampleLevel(tSunTransmittance, sLinear, sun_lut_uv, 0.0).rgb;
116
-
117
- let ms = calculate_multiscattering(vec3<f32>(0.0), s.scattering, s.extinction, u, s.phase_g, volumetrics_metadata.ms_octave_count, volumetrics_metadata.ms_extinction_decay);
118
- inscatter += ms * transmittance_atmospheric * sun.color;
119
- }
120
-
121
- return vec4<f32>(inscatter, rgb_to_luminance(s.extinction));
122
- }
123
-
124
- @compute @workgroup_size(16, 16, 1)
125
- fn main(
126
- @builtin(global_invocation_id) voxel_coord: vec3<u32>
127
- ){
128
- let resolution = textureDimensions(tOutput);
129
-
130
- if (any(voxel_coord.xy >= resolution.xy)) {
131
- return;
132
- }
133
-
134
- let noise = stbn_sample_vec3(vec3(voxel_coord.xy, view.frame_index));
135
-
136
- let tile_uv = saturate(
137
- texel_coordinate_to_uv(vec2f(voxel_coord.xy) + vec2(noise.xy - 0.5), resolution.xy)
138
- );
139
-
140
- let camera_near_far = compute_near_far_from_projection(camera.projection_matrix);
141
- let camera_far = camera_near_far.y;
142
-
143
- // view ray for this froxel column, used to place far-field march samples in world space
144
- let view_ray = camera_ray_from_uv(tile_uv, camera);
145
-
146
- var inScatter = vec3<f32>(0.0);
147
- var throughput = vec3<f32>(1.0);
148
-
149
- // Every t below is a PLANAR view-space depth off the froxel curve, but the loop uses their
150
- // difference as a segment length in Beer's law and walks them along a unit ray to place world
151
- // positions. Both want arc length, which is longer by 1/cos(theta). Uncorrected, the optical
152
- // path is under-integrated by cos(theta) and fog thins toward the frame edges.
153
- //
154
- // Constant for the whole column, so this is one reciprocal per invocation rather than per slice.
155
- let depth_to_distance = camera_ray_planar_depth_scale(view_ray.direction, camera);
156
-
157
- // start at the near plane
158
- var t_prev = camera_near_far.x;
159
-
160
- // --- TRAPEZOIDAL SETUP ---
161
- // Prime the loop with the value at the start (Slice 0)
162
- let uvw_start = vec3<f32>(tile_uv, 0.0);
163
-
164
- // in-scatter (.rgb) and the TAA-accumulated mono extinction coefficient (.a) now share the
165
- // volume-lighting texture, so a single sample provides both.
166
- let vl_start = far_sample_lighting(camera_near_far.x, uvw_start, view_ray.origin + view_ray.direction * (camera_near_far.x * depth_to_distance), view_ray.direction);
167
- var light_prev = vl_start.rgb;
168
- var extinction_prev = vl_start.a;
169
-
170
- for (var z_index: u32 = 0u; z_index < resolution.z; z_index++ ) {
171
-
172
- // --- STORE BEFORE INTEGRATE ---
173
- // Texel z_index holds the cumulative in-scatter / transmittance integrated from the near
174
- // plane up to the NEAR face of this slab, i.e. up to depth from_z_slice(z_index). Storing
175
- // the running accumulator BEFORE integrating this slab's segment is what aligns texel
176
- // z_index with from_z_slice(z_index) -- the same convention the deferred read samples back
177
- // with (slice + 0.5) / resolution.z (see chunk_sample_volumetrics and
178
- // volumetrics_position_world_to_froxel_uvw). Storing after-integrate instead would shift
179
- // every texel one slab deeper, over-attenuating the read by a full froxel.
180
- let transmittance = rgb_to_luminance( throughput );
181
-
182
- textureStore(
183
- tOutput,
184
- vec3<u32>(voxel_coord.x, voxel_coord.y, z_index),
185
- vec4<f32>(inScatter, transmittance)
186
- );
187
-
188
- // We clamp the index to not sample outside the texture
189
- let next_index = min(z_index + 1u, resolution.z - 1u);
190
- let next_index_dithered = f32(next_index) + noise.z;
191
-
192
- // 1. Calculate Geometry
193
- let t_next = min(camera_far, cluster_depth_from_z_slice(
194
- next_index_dithered,
195
- volumetrics_metadata.cluster_parameters,
196
- f32(resolution.z)
197
- ));
198
-
199
- // planar depth difference -> arc length along the view ray (C-01b)
200
- let dt = max(0.0, t_next - t_prev) * depth_to_distance;
201
-
202
- // 2. Fetch "Next" Value (The end of this segment)
203
- let uvw_next = vec3<f32>(tile_uv, next_index_dithered / f32(resolution.z));
204
-
205
- let world_pos_next = view_ray.origin + view_ray.direction * (t_next * depth_to_distance);
206
- let vl_next = far_sample_lighting(t_next, uvw_next, world_pos_next, view_ray.direction);
207
- let media_extinction = vl_next.a;
208
- let light_next = vl_next.rgb;
209
-
210
- // TODO we should probably offset this to be linear in view-space distance
211
- const SAMPLE_CENTER_POINT = 0.5;
212
-
213
- // 3. Trapezoidal Average
214
- // Instead of taking just the center, we average start and end to form a slope
215
- let extinction_step = mix(extinction_prev, media_extinction, SAMPLE_CENTER_POINT);
216
- let light_step = mix(light_prev, light_next, SAMPLE_CENTER_POINT);
217
-
218
- // 4. Integration (Hillaire) using the averaged values. Extinction is a mono sigma_t scalar,
219
- // so transmittance is mono and broadcasts to weight the RGB throughput / in-scatter.
220
- let sample_extinction = dt * extinction_step;
221
- let sample_transmittance = exp(-sample_extinction);
222
-
223
- let media_extinction_safe = max(extinction_step, 1e-9);
224
-
225
- // "S - S * T" is the integral of constant L over the interval.
226
- // Since we trapezoid-averaged L (light_step), this is a much better approximation
227
- // for the interval than just using L_center.
228
- let light_scattering_integrated = (light_step - light_step * sample_transmittance) / media_extinction_safe;
229
-
230
- inScatter += throughput * light_scattering_integrated;
231
- throughput *= sample_transmittance;
232
-
233
- // Advance
234
- t_prev = t_next;
235
- extinction_prev = media_extinction;
236
- light_prev = light_next;
237
-
238
- }
239
- }
240
- `, [
241
- chunk_rgb_to_luminance,
242
- chunk_compute_near_far_from_projection,
243
- chunk_texel_coordinate_to_uv,
244
- chunk_uv_to_texel_coordinate,
245
- chunk_cluster_depth_from_z_slice,
246
- chunk_cluster_depth_to_z_slice,
247
- chunk_stbn_sample_vec3,
248
- chunk_camera_ray_from_uv,
249
- chunk_camera_ray_planar_depth_scale,
250
- chunk_directional_lights_iteration_mask,
251
- chunk_get_directional_light_info_by_index,
252
- chunk_sky_lut_compute_uv,
253
- chunk_calculate_multiscattering,
254
- ]
255
- )
256
-
257
- export const shader_volumetrics_build_scattering_lut = ComputeShader.from({
258
- label: "Volumetrics / build scattering lut",
259
- resources,
260
- body
1
+ import { CAMERA_UNIFORM_STRUCT } from "../camera/CAMERA_UNIFORM_STRUCT.js";
2
+ import { chunk_stbn_sample_vec3 } from "../shader/chunk/noise/chunk_stbn_sample_vec3.js";
3
+ import {
4
+ chunk_compute_near_far_from_projection
5
+ } from "../shader/chunk/camera/chunk_compute_near_far_from_projection.js";
6
+ import { chunk_rgb_to_luminance } from "../shader/chunk/color/chunk_rgb_to_luminance.js";
7
+ import { chunk_texel_coordinate_to_uv } from "../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
8
+ import { chunk_uv_to_texel_coordinate } from "../shader/chunk/texture/chunk_uv_to_texel_coordinate.js";
9
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
10
+ import { ComputeShader } from "../shader/ComputeShader.js";
11
+ import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
12
+ import { VIEW_UNIFORM_STRUCT } from "../view/VIEW_UNIFORM_STRUCT.js";
13
+ import { chunk_cluster_depth_from_z_slice } from "../light/cluster/chunk_cluster_depth_from_z_slice.js";
14
+ import { chunk_cluster_depth_to_z_slice } from "../light/cluster/chunk_cluster_depth_to_z_slice.js";
15
+ import { VOLUMETRICS_METADATA_STRUCT } from "./VOLUMETRICS_METADATA_STRUCT.js";
16
+ import { WebGPUArray } from "../shader/type/WebGPUArray.js";
17
+ import { chunk_camera_ray_from_uv } from "../shader/chunk/geometry/ray/chunk_camera_ray_from_uv.js";
18
+ import { chunk_directional_lights_iteration_mask } from "../shader/chunk/light/io/chunk_directional_lights_iteration_mask.js";
19
+ import { chunk_get_directional_light_info_by_index } from "../shader/chunk/light/io/chunk_get_directional_light_info_by_index.js";
20
+ import { chunk_sky_lut_compute_uv } from "../atmosphere/chunk_sky_lut_compute_uv.js";
21
+ import { chunk_calculate_multiscattering } from "./chunk_calculate_multiscattering.js";
22
+ import { chunk_camera_ray_planar_depth_scale } from "./chunk_camera_ray_planar_depth_scale.js";
23
+ import { PARTICIPATING_MEDIA_VOLUME_STRUCT } from "./PARTICIPATING_MEDIA_VOLUME_STRUCT.js";
24
+ import { SCENE_VOLUMETRICS_METADATA_STRUCT } from "./SCENE_VOLUMETRICS_METADATA_STRUCT.js";
25
+
26
+ const resources = new ShaderResourceSetDescriptor();
27
+
28
+ resources.createGroup()
29
+ .addUniform("camera", CAMERA_UNIFORM_STRUCT)
30
+ .addUniform("view", VIEW_UNIFORM_STRUCT)
31
+ .addTexture("tSTBN_vec3", "unfilterable-float", "3d")
32
+ .addUniform("volumetrics_metadata", VOLUMETRICS_METADATA_STRUCT)
33
+ .addTexture("tParticipatingMedia0", "float", "3d")
34
+ .addTexture("tParticipatingMedia1", "float", "3d")
35
+ .addTexture("tVolumeLighting", "float", "3d") // pre-integrated volumetric light scattering
36
+ // RDR2-style far field: beyond froxel_far the pass ray-marches the scene volumes directly,
37
+ // lit by the directional sun + atmosphere (single scattering, no self-shadow).
38
+ .addUniform("scene_volumetrics_metadata", SCENE_VOLUMETRICS_METADATA_STRUCT)
39
+ .addStorageBuffer("scene_volumes", WebGPUArray.from(PARTICIPATING_MEDIA_VOLUME_STRUCT))
40
+ .addStorageBuffer("light_data", WebGPUArray.u32)
41
+ .addTexture("tSunTransmittance", "float", "2d")
42
+ .addSampler("sLinear")
43
+ .addStorageTexture("tOutput", "rgba16float", "3d", "write-only");
44
+
45
+
46
+ /**
47
+ * see https://github.com/GPUOpen-Effects/Hybrid-Stochastic-Reflections/blob/b3eef4be70db3522c54d289766e6db797777163c/sample/src/Shaders/Atmosphere.h#L149
48
+ * see https://github.com/AirGuanZ/AtmosphereRenderer/blob/94055f272814a850aafa072555a839311b3d2924/asset/aerial_lut.hlsl#L33
49
+ * @type {CodeChunk}
50
+ */
51
+ const body = CodeChunk.from(
52
+ //language=WGSL
53
+ `
54
+ struct FarVolumeSample {
55
+ scattering: vec3<f32>,
56
+ extinction: vec3<f32>,
57
+ phase_g: f32,
58
+ }
59
+
60
+ // Point-sample the scene participating-media volumes (coarse: full density inside the box, no edge
61
+ // fade — that is a near-field nicety). Used only beyond the froxel grid.
62
+ fn far_sample_volumes(world_pos: vec3<f32>) -> FarVolumeSample {
63
+ var scattering = vec3<f32>(0.0);
64
+ var extinction = vec3<f32>(0.0);
65
+ var g_weighted = 0.0;
66
+ var scattering_luma = 0.0;
67
+
68
+ let count = scene_volumetrics_metadata.instance_count;
69
+ for (var i = 0u; i < count; i++) {
70
+ let volume = scene_volumes[i];
71
+ let local = (volume.transform_inverse * vec4<f32>(world_pos, 1.0)).xyz;
72
+ if (any(abs(local) > vec3<f32>(0.5))) {
73
+ continue;
74
+ }
75
+ let weight = volume.density;
76
+ let vs = volume.particle_spec.scattering * weight;
77
+ let ve = volume.particle_spec.extinction * weight;
78
+ scattering += vs;
79
+ extinction += ve;
80
+ let luma = rgb_to_luminance(vs);
81
+ g_weighted += volume.particle_spec.g * luma;
82
+ scattering_luma += luma;
83
+ }
84
+ var g = 0.0;
85
+ if (scattering_luma > 0.0) {
86
+ g = g_weighted / scattering_luma;
87
+ }
88
+ return FarVolumeSample(scattering, extinction, g);
89
+ }
90
+
91
+ // In-scatter (.rgb) + mono extinction (.a) at a march point. Inside the froxel grid (depth <=
92
+ // froxel_far) this is the pre-lit grid sample; beyond it we ray-march the volumes directly and light
93
+ // them with the directional sun + atmospheric transmittance (single scattering, no self-shadow).
94
+ fn far_sample_lighting(depth: f32, uvw_grid: vec3<f32>, world_pos: vec3<f32>, ray_dir: vec3<f32>) -> vec4<f32> {
95
+ if (depth <= volumetrics_metadata.froxel_far) {
96
+ // The froxel grid uses its own (tighter) depth curve, so map this LUT depth to the grid
97
+ // slice before sampling (identity when froxel_far == camera.far).
98
+ let res_z = f32(textureDimensions(tVolumeLighting).z);
99
+ let grid_slice = cluster_depth_to_z_slice(depth, volumetrics_metadata.froxel_cluster_parameters, res_z);
100
+ let vl = textureSampleLevel(tVolumeLighting, sLinear, vec3<f32>(uvw_grid.xy, grid_slice / res_z), 0.0);
101
+ return vec4<f32>(vl.rgb, vl.a);
102
+ }
103
+
104
+ let s = far_sample_volumes(world_pos);
105
+
106
+ var inscatter = vec3<f32>(0.0);
107
+ var directional_bits = directional_lights_iteration_mask(&light_data);
108
+ while (directional_bits != 0u) {
109
+ let directional_index = countTrailingZeros(directional_bits);
110
+ directional_bits &= ~(1u << directional_index);
111
+
112
+ let sun = get_directional_light_info_by_index(&light_data, directional_index);
113
+ let u = dot(sun.direction, ray_dir);
114
+ let sun_lut_uv = sky_lut_compute_uv(world_pos, sun.direction, vec2<f32>(textureDimensions(tSunTransmittance)));
115
+ let transmittance_atmospheric = textureSampleLevel(tSunTransmittance, sLinear, sun_lut_uv, 0.0).rgb;
116
+
117
+ let ms = calculate_multiscattering(vec3<f32>(0.0), s.scattering, s.extinction, u, s.phase_g, volumetrics_metadata.ms_octave_count, volumetrics_metadata.ms_extinction_decay);
118
+ inscatter += ms * transmittance_atmospheric * sun.color;
119
+ }
120
+
121
+ return vec4<f32>(inscatter, rgb_to_luminance(s.extinction));
122
+ }
123
+
124
+ @compute @workgroup_size(16, 16, 1)
125
+ fn main(
126
+ @builtin(global_invocation_id) voxel_coord: vec3<u32>
127
+ ){
128
+ let resolution = textureDimensions(tOutput);
129
+
130
+ if (any(voxel_coord.xy >= resolution.xy)) {
131
+ return;
132
+ }
133
+
134
+ let noise = stbn_sample_vec3(vec3(voxel_coord.xy, view.frame_index));
135
+
136
+ let tile_uv = saturate(
137
+ texel_coordinate_to_uv(vec2f(voxel_coord.xy) + vec2(noise.xy - 0.5), resolution.xy)
138
+ );
139
+
140
+ let camera_near_far = compute_near_far_from_projection(camera.projection_matrix);
141
+ let camera_far = camera_near_far.y;
142
+
143
+ // view ray for this froxel column, used to place far-field march samples in world space
144
+ let view_ray = camera_ray_from_uv(tile_uv, camera);
145
+
146
+ var inScatter = vec3<f32>(0.0);
147
+ var throughput = vec3<f32>(1.0);
148
+
149
+ // Every t below is a PLANAR view-space depth off the froxel curve, but the loop uses their
150
+ // difference as a segment length in Beer's law and walks them along a unit ray to place world
151
+ // positions. Both want arc length, which is longer by 1/cos(theta). Uncorrected, the optical
152
+ // path is under-integrated by cos(theta) and fog thins toward the frame edges.
153
+ //
154
+ // Constant for the whole column, so this is one reciprocal per invocation rather than per slice.
155
+ let depth_to_distance = camera_ray_planar_depth_scale(view_ray.direction, camera);
156
+
157
+ // start at the near plane
158
+ var t_prev = camera_near_far.x;
159
+
160
+ // --- TRAPEZOIDAL SETUP ---
161
+ // Prime the loop with the value at the start (Slice 0)
162
+ let uvw_start = vec3<f32>(tile_uv, 0.0);
163
+
164
+ // in-scatter (.rgb) and the TAA-accumulated mono extinction coefficient (.a) now share the
165
+ // volume-lighting texture, so a single sample provides both.
166
+ let vl_start = far_sample_lighting(camera_near_far.x, uvw_start, view_ray.origin + view_ray.direction * (camera_near_far.x * depth_to_distance), view_ray.direction);
167
+ var light_prev = vl_start.rgb;
168
+ var extinction_prev = vl_start.a;
169
+
170
+ for (var z_index: u32 = 0u; z_index < resolution.z; z_index++ ) {
171
+
172
+ // --- STORE BEFORE INTEGRATE ---
173
+ // Texel z_index holds the cumulative in-scatter / transmittance integrated from the near
174
+ // plane up to the NEAR face of this slab, i.e. up to depth from_z_slice(z_index). Storing
175
+ // the running accumulator BEFORE integrating this slab's segment is what aligns texel
176
+ // z_index with from_z_slice(z_index) -- the same convention the deferred read samples back
177
+ // with (slice + 0.5) / resolution.z (see chunk_sample_volumetrics and
178
+ // volumetrics_position_world_to_froxel_uvw). Storing after-integrate instead would shift
179
+ // every texel one slab deeper, over-attenuating the read by a full froxel.
180
+ let transmittance = rgb_to_luminance( throughput );
181
+
182
+ textureStore(
183
+ tOutput,
184
+ vec3<u32>(voxel_coord.x, voxel_coord.y, z_index),
185
+ vec4<f32>(inScatter, transmittance)
186
+ );
187
+
188
+ // We clamp the index to not sample outside the texture
189
+ let next_index = min(z_index + 1u, resolution.z - 1u);
190
+ let next_index_dithered = f32(next_index) + noise.z;
191
+
192
+ // 1. Calculate Geometry
193
+ let t_next = min(camera_far, cluster_depth_from_z_slice(
194
+ next_index_dithered,
195
+ volumetrics_metadata.cluster_parameters,
196
+ f32(resolution.z)
197
+ ));
198
+
199
+ // planar depth difference -> arc length along the view ray (C-01b)
200
+ let dt = max(0.0, t_next - t_prev) * depth_to_distance;
201
+
202
+ // 2. Fetch "Next" Value (The end of this segment)
203
+ let uvw_next = vec3<f32>(tile_uv, next_index_dithered / f32(resolution.z));
204
+
205
+ let world_pos_next = view_ray.origin + view_ray.direction * (t_next * depth_to_distance);
206
+ let vl_next = far_sample_lighting(t_next, uvw_next, world_pos_next, view_ray.direction);
207
+ let media_extinction = vl_next.a;
208
+ let light_next = vl_next.rgb;
209
+
210
+ // TODO we should probably offset this to be linear in view-space distance
211
+ const SAMPLE_CENTER_POINT = 0.5;
212
+
213
+ // 3. Trapezoidal Average
214
+ // Instead of taking just the center, we average start and end to form a slope
215
+ let extinction_step = mix(extinction_prev, media_extinction, SAMPLE_CENTER_POINT);
216
+ let light_step = mix(light_prev, light_next, SAMPLE_CENTER_POINT);
217
+
218
+ // 4. Integration (Hillaire) using the averaged values. Extinction is a mono sigma_t scalar,
219
+ // so transmittance is mono and broadcasts to weight the RGB throughput / in-scatter.
220
+ let sample_extinction = dt * extinction_step;
221
+ let sample_transmittance = exp(-sample_extinction);
222
+
223
+ let media_extinction_safe = max(extinction_step, 1e-9);
224
+
225
+ // "S - S * T" is the integral of constant L over the interval.
226
+ // Since we trapezoid-averaged L (light_step), this is a much better approximation
227
+ // for the interval than just using L_center.
228
+ let light_scattering_integrated = (light_step - light_step * sample_transmittance) / media_extinction_safe;
229
+
230
+ inScatter += throughput * light_scattering_integrated;
231
+ throughput *= sample_transmittance;
232
+
233
+ // Advance
234
+ t_prev = t_next;
235
+ extinction_prev = media_extinction;
236
+ light_prev = light_next;
237
+
238
+ }
239
+ }
240
+ `, [
241
+ chunk_rgb_to_luminance,
242
+ chunk_compute_near_far_from_projection,
243
+ chunk_texel_coordinate_to_uv,
244
+ chunk_uv_to_texel_coordinate,
245
+ chunk_cluster_depth_from_z_slice,
246
+ chunk_cluster_depth_to_z_slice,
247
+ chunk_stbn_sample_vec3,
248
+ chunk_camera_ray_from_uv,
249
+ chunk_camera_ray_planar_depth_scale,
250
+ chunk_directional_lights_iteration_mask,
251
+ chunk_get_directional_light_info_by_index,
252
+ chunk_sky_lut_compute_uv,
253
+ chunk_calculate_multiscattering,
254
+ ]
255
+ )
256
+
257
+ export const shader_volumetrics_build_scattering_lut = ComputeShader.from({
258
+ label: "Volumetrics / build scattering lut",
259
+ resources,
260
+ body
261
261
  });
@@ -1,8 +1,58 @@
1
1
  /**
2
- * One build shader per cascade, innermost first.
2
+ * Q-04. Builds one cascade of the sun's optical-depth volume so the lighting pass can read a
3
+ * froxel's media self-shadowing in one fetch instead of marching 16 steps toward the sun for it.
3
4
  *
4
- * @type {ComputeShader[]}
5
+ * The structure is a light-aligned voxel grid holding a prefix sum of extinction along the sun
6
+ * axis — in the shadow-map taxonomy an opacity shadow map (Kim & Neumann 2001) with enough slices
7
+ * and hardware trilinear reconstruction that the slice artefacts it is remembered for do not
8
+ * appear, and exact rather than approximate for the piecewise-constant field a voxel grid is.
9
+ * Enshrouded (GPC 2024) ships the same thing, cascaded: 3D volumes with their z axis on the primary
10
+ * light, initialised from the participating media and then integrated by a 2D dispatch per column,
11
+ * each cascade seeded from the one outside it. Frostbite (SIGGRAPH 2015) cascades its extinction
12
+ * volume the same way, three clip-map levels of it, for the same reason.
13
+ *
14
+ * Fourier Opacity Mapping is the better-known answer and is the wrong one here. It exists because
15
+ * the medium usually arrives as unordered rasterized particles, where the only thing you can do is
16
+ * accumulate a fixed-size, order-independent, additively-blendable summary — and it pays for that
17
+ * with ringing at sharp density transitions. This engine's medium is already a 3D texture with a
18
+ * defined order along any axis, so the scan is available, exact, and has nothing to ring.
19
+ *
20
+ * Two shaders, written out: the outermost cascade, whose scan starts at zero, and every cascade
21
+ * inside it, whose scan starts from the cascade outside. That is a difference in *bindings* — the
22
+ * second reads a texture the first does not have — so it cannot be data. Which cascade is being
23
+ * built can be, and is: it arrives as immediate data, so the inner cascades share one pipeline.
24
+ *
25
+ * @see chunk_volumetrics_sun_optical_depth for the read side
26
+ * @see build_volumetrics_sun_shadow_transform for where each box is placed, and why it is stable
27
+ */
28
+ /**
29
+ * Which cascade a dispatch is building.
30
+ *
31
+ * Per-dispatch, uniform, read-only and eight bytes, which is the shape immediate data exists for:
32
+ * no pooled buffer, no staging copy, no bind group.
33
+ *
34
+ * `sub_steps` travels with it rather than being derived in the shader because it is a property of
35
+ * the cascade ladder rather than of the box: {@link volumetrics_sun_shadow_sub_steps} is where the
36
+ * rule that it is even and at least two lives, and nothing in the metadata lets the shader
37
+ * re-derive it.
38
+ *
39
+ * @type {WebGPUStruct}
40
+ */
41
+ export const VOLUMETRICS_SUN_SHADOW_BUILD_SETTINGS: WebGPUStruct;
42
+ /**
43
+ * The outermost cascade. Nothing is outside it, so its scan starts from zero and it binds no outer
44
+ * volume.
45
+ *
46
+ * @type {ComputeShader}
47
+ */
48
+ export const shader_volumetrics_build_sun_shadow_volume_outermost: ComputeShader;
49
+ /**
50
+ * Every cascade but the outermost, seeded from the one outside it. Which one that is arrives as
51
+ * immediate data, so the whole inner ladder shares this pipeline.
52
+ *
53
+ * @type {ComputeShader}
5
54
  */
6
- export const shader_volumetrics_build_sun_shadow_volume: ComputeShader[];
55
+ export const shader_volumetrics_build_sun_shadow_volume_seeded: ComputeShader;
56
+ import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
7
57
  import { ComputeShader } from "../shader/ComputeShader.js";
8
58
  //# sourceMappingURL=shader_volumetrics_build_sun_shadow_volume.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_volumetrics_build_sun_shadow_volume.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js"],"names":[],"mappings":"AAuKA;;;;GAIG;AACH,yDAFU,aAAa,EAAE,CAG0E;8BA3KrE,4BAA4B"}
1
+ {"version":3,"file":"shader_volumetrics_build_sun_shadow_volume.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;;;;;;;;;;;;GAYG;AACH,oDAFU,YAAY,CAKkB;AAaxC;;;;;GAKG;AACH,mEAFU,aAAa,CA8FpB;AAcH;;;;;GAKG;AACH,gEAFU,aAAa,CAwGpB;6BA3R0B,gCAAgC;8BAH/B,4BAA4B"}