@woosh/meep-engine 3.64.1 → 3.65.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 (324) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/build/bundle-worker-image-decoder.js +1 -1
  3. package/build/bundle-worker-terrain.js +1 -1
  4. package/package.json +1 -1
  5. package/src/core/binary/BinaryBuffer.d.ts +5 -0
  6. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  7. package/src/core/binary/BinaryBuffer.js +39 -5
  8. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts +65 -6
  9. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts.map +1 -1
  10. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +451 -101
  11. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +4 -2
  12. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -1
  13. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +4 -2
  14. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts +8 -1
  15. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts.map +1 -1
  16. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +45 -10
  17. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
  18. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +237 -119
  19. package/src/engine/graphics/ecs/grass/GrassSpecies.d.ts +143 -0
  20. package/src/engine/graphics/ecs/grass/GrassSpecies.d.ts.map +1 -0
  21. package/src/engine/graphics/ecs/grass/GrassSpecies.js +189 -0
  22. package/src/engine/graphics/ecs/grass/GrassSurface.d.ts +25 -0
  23. package/src/engine/graphics/ecs/grass/GrassSurface.d.ts.map +1 -0
  24. package/src/engine/graphics/ecs/grass/GrassSurface.js +32 -0
  25. package/src/engine/graphics/ecs/grass/GroundCover.d.ts +68 -0
  26. package/src/engine/graphics/ecs/grass/GroundCover.d.ts.map +1 -0
  27. package/src/engine/graphics/ecs/grass/GroundCover.js +85 -0
  28. package/src/engine/graphics3/GrassSurfaceSystem.d.ts +153 -0
  29. package/src/engine/graphics3/GrassSurfaceSystem.d.ts.map +1 -0
  30. package/src/engine/graphics3/GrassSurfaceSystem.js +1076 -0
  31. package/src/engine/graphics3/GroundCoverSystem.d.ts +33 -0
  32. package/src/engine/graphics3/GroundCoverSystem.d.ts.map +1 -0
  33. package/src/engine/graphics3/GroundCoverSystem.js +58 -0
  34. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  35. package/src/engine/network/NetworkSession.js +372 -110
  36. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  37. package/src/engine/network/orchestrator/NetworkPeer.js +6 -1
  38. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  39. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +9 -2
  40. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  41. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +325 -140
  42. package/src/engine/network/sim/SimActionExecutor.d.ts +4 -1
  43. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  44. package/src/engine/network/sim/SimActionExecutor.js +65 -9
  45. package/src/engine/network/state/PredictionHistory.d.ts.map +1 -1
  46. package/src/engine/network/state/PredictionHistory.js +6 -1
  47. package/src/engine/network/time/AdaptiveRenderDelay.d.ts +25 -14
  48. package/src/engine/network/time/AdaptiveRenderDelay.d.ts.map +1 -1
  49. package/src/engine/network/time/AdaptiveRenderDelay.js +38 -20
  50. package/src/engine/network/time/RenderPlayout.d.ts +23 -3
  51. package/src/engine/network/time/RenderPlayout.d.ts.map +1 -1
  52. package/src/engine/network/time/RenderPlayout.js +40 -4
  53. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  54. package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.d.ts +5 -1
  55. package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.d.ts.map +1 -1
  56. package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.js +27 -1
  57. package/src/shade/device/shader/ShaderModuleCompiler.d.ts +2 -0
  58. package/src/shade/device/shader/ShaderModuleCompiler.d.ts.map +1 -1
  59. package/src/shade/device/shader/ShaderModuleCompiler.js +25 -2
  60. package/src/shade/playground/grass_surfaces/index.html +75 -0
  61. package/src/shade/playground/grass_surfaces/main.d.ts +2 -0
  62. package/src/shade/playground/grass_surfaces/main.d.ts.map +1 -0
  63. package/src/shade/playground/grass_surfaces/main.js +593 -0
  64. package/src/shade/playground/grass_surfaces/read_grass_surfaces.d.ts +62 -0
  65. package/src/shade/playground/grass_surfaces/read_grass_surfaces.d.ts.map +1 -0
  66. package/src/shade/playground/grass_surfaces/read_grass_surfaces.js +188 -0
  67. package/src/shade/playground/probe_clipmap_box/README.md +5 -1
  68. package/src/shade/playground/probe_clipmap_box/index.html +12 -0
  69. package/src/shade/playground/probe_clipmap_box/main.d.ts.map +1 -1
  70. package/src/shade/playground/probe_clipmap_box/main.js +15 -0
  71. package/src/shade/playground/probe_clipmap_box/scene.d.ts +8 -1
  72. package/src/shade/playground/probe_clipmap_box/scene.d.ts.map +1 -1
  73. package/src/shade/playground/probe_clipmap_box/scene.js +74 -6
  74. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  75. package/src/shade/renderer/Renderer.js +47 -43
  76. package/src/shade/renderer/extension/ViewTextures.d.ts +12 -5
  77. package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
  78. package/src/shade/renderer/extension/ViewTextures.js +19 -5
  79. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +3 -1
  80. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  81. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +6 -1
  82. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +7 -0
  83. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
  84. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +10 -0
  85. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +7 -1
  86. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  87. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +46 -15
  88. package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.d.ts +3 -2
  89. package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.d.ts.map +1 -1
  90. package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.js +3 -2
  91. package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.d.ts +22 -0
  92. package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.d.ts.map +1 -0
  93. package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.js +247 -0
  94. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +50 -0
  95. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  96. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +101 -0
  97. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +2 -1
  98. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +2 -1
  100. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +8 -0
  101. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
  102. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +12 -0
  103. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +12 -6
  104. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +35 -29
  106. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.js +4 -2
  108. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_material.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_material.js +6 -4
  110. package/src/shade/renderer/global_illumination/probe_clipmap/material/GPUBrickMaterial.d.ts.map +1 -1
  111. package/src/shade/renderer/global_illumination/probe_clipmap/material/GPUBrickMaterial.js +2 -1
  112. package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.d.ts +6 -5
  113. package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.d.ts.map +1 -1
  114. package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.js +15 -14
  115. package/src/shade/renderer/global_illumination/probe_clipmap/material/shader_brick_material_gather.d.ts.map +1 -1
  116. package/src/shade/renderer/global_illumination/probe_clipmap/material/shader_brick_material_gather.js +4 -2
  117. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +19 -2
  118. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  119. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +128 -10
  120. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +19 -1
  121. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  122. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +27 -2
  123. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.d.ts +19 -11
  124. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.d.ts.map +1 -1
  125. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.js +35 -11
  126. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  127. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +3 -1
  128. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.d.ts +40 -0
  129. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.d.ts.map +1 -0
  130. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.js +174 -0
  131. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_material.d.ts +4 -4
  132. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_material.js +10 -10
  133. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.d.ts +31 -0
  134. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.d.ts.map +1 -0
  135. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.js +54 -0
  136. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +8 -4
  137. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
  138. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +10 -21
  139. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +7 -2
  140. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -1
  141. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +33 -29
  142. package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.d.ts +28 -0
  143. package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.d.ts.map +1 -0
  144. package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.js +138 -0
  145. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +13 -9
  146. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
  147. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +18 -11
  148. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +1 -1
  149. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts.map +1 -1
  150. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +4 -2
  151. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
  152. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +2 -3
  153. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +5 -3
  154. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
  155. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +15 -30
  156. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -1
  157. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  158. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +4 -2
  159. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +11 -0
  160. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -1
  161. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +29 -2
  162. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.d.ts +40 -0
  163. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.d.ts.map +1 -0
  164. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.js +126 -0
  165. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.d.ts +36 -0
  166. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.d.ts.map +1 -0
  167. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.js +221 -0
  168. package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.d.ts +40 -0
  169. package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.d.ts.map +1 -0
  170. package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.js +86 -0
  171. package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts +135 -0
  172. package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts.map +1 -0
  173. package/src/shade/renderer/grass/blade/GPUGrassBlades.js +676 -0
  174. package/src/shade/renderer/grass/blade/GRASS_BLADE.d.ts +145 -0
  175. package/src/shade/renderer/grass/blade/GRASS_BLADE.d.ts.map +1 -0
  176. package/src/shade/renderer/grass/blade/GRASS_BLADE.js +179 -0
  177. package/src/shade/renderer/grass/blade/chunk_grass_blade.d.ts +63 -0
  178. package/src/shade/renderer/grass/blade/chunk_grass_blade.d.ts.map +1 -0
  179. package/src/shade/renderer/grass/blade/chunk_grass_blade.js +244 -0
  180. package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.d.ts +58 -0
  181. package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.d.ts.map +1 -0
  182. package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.js +174 -0
  183. package/src/shade/renderer/grass/blade/grass_blade_id_draw.d.ts +25 -0
  184. package/src/shade/renderer/grass/blade/grass_blade_id_draw.d.ts.map +1 -0
  185. package/src/shade/renderer/grass/blade/grass_blade_id_draw.js +133 -0
  186. package/src/shade/renderer/grass/blade/grass_blade_mechanics.d.ts +80 -0
  187. package/src/shade/renderer/grass/blade/grass_blade_mechanics.d.ts.map +1 -0
  188. package/src/shade/renderer/grass/blade/grass_blade_mechanics.js +92 -0
  189. package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts +29 -0
  190. package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts.map +1 -0
  191. package/src/shade/renderer/grass/blade/grass_blade_resolve.js +175 -0
  192. package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.d.ts +14 -0
  193. package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.d.ts.map +1 -0
  194. package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.js +45 -0
  195. package/src/shade/renderer/grass/blade/shader_grass_blade_expand.d.ts +61 -0
  196. package/src/shade/renderer/grass/blade/shader_grass_blade_expand.d.ts.map +1 -0
  197. package/src/shade/renderer/grass/blade/shader_grass_blade_expand.js +340 -0
  198. package/src/shade/renderer/grass/blade/shader_grass_cell_count.d.ts +46 -0
  199. package/src/shade/renderer/grass/blade/shader_grass_cell_count.d.ts.map +1 -0
  200. package/src/shade/renderer/grass/blade/shader_grass_cell_count.js +280 -0
  201. package/src/shade/renderer/grass/population/chunk_grass_population.d.ts +60 -0
  202. package/src/shade/renderer/grass/population/chunk_grass_population.d.ts.map +1 -0
  203. package/src/shade/renderer/grass/population/chunk_grass_population.js +171 -0
  204. package/src/shade/renderer/grass/press/GPUGrassPress.d.ts +99 -0
  205. package/src/shade/renderer/grass/press/GPUGrassPress.d.ts.map +1 -0
  206. package/src/shade/renderer/grass/press/GPUGrassPress.js +436 -0
  207. package/src/shade/renderer/grass/press/GRASS_PRESS.d.ts +179 -0
  208. package/src/shade/renderer/grass/press/GRASS_PRESS.d.ts.map +1 -0
  209. package/src/shade/renderer/grass/press/GRASS_PRESS.js +217 -0
  210. package/src/shade/renderer/grass/press/chunk_grass_press.d.ts +65 -0
  211. package/src/shade/renderer/grass/press/chunk_grass_press.d.ts.map +1 -0
  212. package/src/shade/renderer/grass/press/chunk_grass_press.js +296 -0
  213. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +31 -0
  214. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -0
  215. package/src/shade/renderer/grass/press/shader_grass_press_mark.js +169 -0
  216. package/src/shade/renderer/grass/press/shader_grass_press_stamp.d.ts +27 -0
  217. package/src/shade/renderer/grass/press/shader_grass_press_stamp.d.ts.map +1 -0
  218. package/src/shade/renderer/grass/press/shader_grass_press_stamp.js +183 -0
  219. package/src/shade/renderer/grass/surface/GPUGrassSurfaces.d.ts +193 -0
  220. package/src/shade/renderer/grass/surface/GPUGrassSurfaces.d.ts.map +1 -0
  221. package/src/shade/renderer/grass/surface/GPUGrassSurfaces.js +1253 -0
  222. package/src/shade/renderer/grass/surface/GRASS_SURFACE.d.ts +211 -0
  223. package/src/shade/renderer/grass/surface/GRASS_SURFACE.d.ts.map +1 -0
  224. package/src/shade/renderer/grass/surface/GRASS_SURFACE.js +241 -0
  225. package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.d.ts +82 -0
  226. package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.d.ts.map +1 -0
  227. package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.js +111 -0
  228. package/src/shade/renderer/grass/surface/chunk_grass_column_cross.d.ts +39 -0
  229. package/src/shade/renderer/grass/surface/chunk_grass_column_cross.d.ts.map +1 -0
  230. package/src/shade/renderer/grass/surface/chunk_grass_column_cross.js +85 -0
  231. package/src/shade/renderer/grass/surface/chunk_grass_directory.d.ts +29 -0
  232. package/src/shade/renderer/grass/surface/chunk_grass_directory.d.ts.map +1 -0
  233. package/src/shade/renderer/grass/surface/chunk_grass_directory.js +112 -0
  234. package/src/shade/renderer/grass/surface/chunk_grass_slot.d.ts +27 -0
  235. package/src/shade/renderer/grass/surface/chunk_grass_slot.d.ts.map +1 -0
  236. package/src/shade/renderer/grass/surface/chunk_grass_slot.js +50 -0
  237. package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.d.ts +21 -0
  238. package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.d.ts.map +1 -0
  239. package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.js +41 -0
  240. package/src/shade/renderer/grass/surface/chunk_grass_surface_window.d.ts +32 -0
  241. package/src/shade/renderer/grass/surface/chunk_grass_surface_window.d.ts.map +1 -0
  242. package/src/shade/renderer/grass/surface/chunk_grass_surface_window.js +136 -0
  243. package/src/shade/renderer/grass/surface/chunk_grass_surfel.d.ts +37 -0
  244. package/src/shade/renderer/grass/surface/chunk_grass_surfel.d.ts.map +1 -0
  245. package/src/shade/renderer/grass/surface/chunk_grass_surfel.js +85 -0
  246. package/src/shade/renderer/grass/surface/chunk_grass_tile.d.ts +25 -0
  247. package/src/shade/renderer/grass/surface/chunk_grass_tile.d.ts.map +1 -0
  248. package/src/shade/renderer/grass/surface/chunk_grass_tile.js +52 -0
  249. package/src/shade/renderer/grass/surface/shader_grass_directory_fill.d.ts +23 -0
  250. package/src/shade/renderer/grass/surface/shader_grass_directory_fill.d.ts.map +1 -0
  251. package/src/shade/renderer/grass/surface/shader_grass_directory_fill.js +87 -0
  252. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts +43 -0
  253. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts.map +1 -0
  254. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.js +265 -0
  255. package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.d.ts +13 -0
  256. package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.d.ts.map +1 -0
  257. package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.js +49 -0
  258. package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.d.ts +62 -0
  259. package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.d.ts.map +1 -0
  260. package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.js +162 -0
  261. package/src/shade/renderer/grass/surface/shader_grass_surface_retire.d.ts +40 -0
  262. package/src/shade/renderer/grass/surface/shader_grass_surface_retire.d.ts.map +1 -0
  263. package/src/shade/renderer/grass/surface/shader_grass_surface_retire.js +155 -0
  264. package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.d.ts +19 -0
  265. package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.d.ts.map +1 -0
  266. package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.js +58 -0
  267. package/src/shade/renderer/grass/surface/shader_grass_surface_want.d.ts +30 -0
  268. package/src/shade/renderer/grass/surface/shader_grass_surface_want.d.ts.map +1 -0
  269. package/src/shade/renderer/grass/surface/shader_grass_surface_want.js +251 -0
  270. package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.d.ts +21 -0
  271. package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.d.ts.map +1 -0
  272. package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.js +75 -0
  273. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
  274. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +4 -23
  275. package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.d.ts +12 -0
  276. package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.d.ts.map +1 -0
  277. package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.js +29 -0
  278. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  279. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +22 -0
  280. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  281. package/src/shade/renderer/scene/GPUSceneContext.js +3 -0
  282. package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.d.ts +27 -0
  283. package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.d.ts.map +1 -0
  284. package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.js +38 -0
  285. package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.d.ts +28 -0
  286. package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.d.ts.map +1 -0
  287. package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.js +58 -0
  288. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
  289. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +8 -0
  290. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts +37 -0
  291. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts.map +1 -0
  292. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js +148 -0
  293. package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.d.ts +20 -0
  294. package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.d.ts.map +1 -0
  295. package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.js +169 -0
  296. package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.d.ts +18 -0
  297. package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.d.ts.map +1 -1
  298. package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.js +28 -0
  299. package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.d.ts +13 -0
  300. package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.d.ts.map +1 -0
  301. package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.js +22 -0
  302. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  303. package/src/shade/renderer/water/GPUWaterRenderer.js +4 -0
  304. package/src/shade/renderer/wind/GPUSceneWind.d.ts +52 -5
  305. package/src/shade/renderer/wind/GPUSceneWind.d.ts.map +1 -1
  306. package/src/shade/renderer/wind/GPUSceneWind.js +164 -8
  307. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts +3 -1
  308. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts.map +1 -1
  309. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.js +3 -1
  310. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +2 -1
  311. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
  312. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +18 -13
  313. package/src/shade/renderer/wind/chunk_wind_field_sample_previous.d.ts +13 -0
  314. package/src/shade/renderer/wind/chunk_wind_field_sample_previous.d.ts.map +1 -0
  315. package/src/shade/renderer/wind/chunk_wind_field_sample_previous.js +23 -0
  316. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts +1 -0
  317. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts.map +1 -1
  318. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.js +6 -1
  319. package/src/shade/renderer/wind/wind_field_add_resources.d.ts +11 -0
  320. package/src/shade/renderer/wind/wind_field_add_resources.d.ts.map +1 -1
  321. package/src/shade/renderer/wind/wind_field_add_resources.js +15 -0
  322. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
  323. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  324. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +2 -0
@@ -0,0 +1,251 @@
1
+ import { CAMERA_RESOURCE } from "../../camera/CAMERA_RESOURCE.js";
2
+ import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
3
+ import { COLLECTION_U32_STRUCT_WRITE } from "../../gpu_primitive/COLLECTION_U32_STRUCT_WRITE.js";
4
+ import { chunk_slot_stack } from "../../gpu_primitive/slot_stack/chunk_slot_stack.js";
5
+ import { TRANSFORMS_TABLE } from "../../scene/chunk_scene_database_access.js";
6
+ import { SCENE_DATABASE_RESOURCE } from "../../scene/SCENE_DATABASE_RESOURCE.js";
7
+ import { chunk_aabb3_from_transformed_corners } from "../../shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js";
8
+ import { chunk_aabb3_intersects_frustum } from "../../shader/chunk/geometry/aabb3/chunk_aabb3_intersects_frustum.js";
9
+ import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
10
+ import { chunk_lower_bound_branchless } from "../../shader/chunk/math/chunk_lower_bound_branchless.js";
11
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
12
+ import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
13
+ import { ComputeShader } from "../../shader/ComputeShader.js";
14
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
15
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
16
+ import { chunk_grass_directory } from "./chunk_grass_directory.js";
17
+ import { chunk_grass_surface_frame } from "./chunk_grass_surface_frame.js";
18
+ import { chunk_grass_surface_window } from "./chunk_grass_surface_window.js";
19
+ import {
20
+ GRASS_COLUMN_CROSSINGS,
21
+ GRASS_POOL_FREE_COUNT,
22
+ GRASS_POOL_STARVED,
23
+ GRASS_SLOT_HEIGHT_MAX,
24
+ GRASS_SLOT_HEIGHT_MIN,
25
+ GRASS_SLOT_LAYER_COUNT,
26
+ GRASS_SLOT_LEVEL_LAYER,
27
+ GRASS_SLOT_NORMAL_SPREAD,
28
+ GRASS_SLOT_STATE,
29
+ GRASS_SLOT_STATE_BAKED,
30
+ GRASS_SLOT_STATE_ORPHAN,
31
+ GRASS_SLOT_STATE_PENDING,
32
+ GRASS_SLOT_STATE_STALE,
33
+ GRASS_SLOT_SURFACE,
34
+ GRASS_SLOT_SURFEL_COUNT,
35
+ GRASS_SLOT_TILE_X,
36
+ GRASS_SLOT_TILE_Z,
37
+ GRASS_SLOT_WANTED_FRAME
38
+ } from "./GRASS_SURFACE.js";
39
+ import {
40
+ GRASS_DIRECTORY_RESOURCE,
41
+ GRASS_POOL_RESOURCE,
42
+ GRASS_SURFACE_VIEW_SETTINGS,
43
+ GRASS_SURFACES_RESOURCE
44
+ } from "./GRASS_SURFACE_VIEW.js";
45
+
46
+ const resources = new ShaderResourceSetDescriptor();
47
+
48
+ resources.setImmediate("settings", GRASS_SURFACE_VIEW_SETTINGS);
49
+
50
+ resources.createGroup()
51
+ .add(CAMERA_RESOURCE)
52
+ .add(SCENE_DATABASE_RESOURCE)
53
+ .add(GRASS_SURFACES_RESOURCE)
54
+ .addStorageBuffer("prefix_sums", COLLECTION_U32_STRUCT_READ)
55
+ .add(GRASS_POOL_RESOURCE)
56
+ .add(GRASS_DIRECTORY_RESOURCE)
57
+ .addStorageBuffer("grass_free", WebGPUArray.u32, true)
58
+ .addStorageBuffer("grass_jobs", COLLECTION_U32_STRUCT_WRITE, true);
59
+
60
+ /**
61
+ * Asks for the tiles of the grass surfaces a view wants, a thread a tile of a window
62
+ * ({@link shader_grass_surface_window_count}, whose counts, summed, are `prefix_sums`).
63
+ *
64
+ * A thread finds its level of its surface from the sums and its tile from its place among that window's
65
+ * threads. A tile outside its level's ring (`grass_tile_wanted`) or outside the view's frustum is not
66
+ * wanted, and the thread ends.
67
+ *
68
+ * **A wanted tile's layers.** Layer 0 always; and once layer 0 is baked, the layers past it that its record
69
+ * counts. For each:
70
+ *
71
+ * - held by a slot (`grass_directory_find`): the slot's record is stamped with the frame. A stale slot also
72
+ * takes a place in the frame's bake list, with what a bake gathers into its record reset, and keeps its
73
+ * state: it reads as it was until the bake has run;
74
+ * - not held: the thread takes a place in the frame's bake list (`grass_jobs`, at most `job_capacity`
75
+ * places, a count that keeps rising past them) and a slot off the free stack, writes the slot's record
76
+ * for the layer, pending, and lists it in the directory. With the bake list full the layer waits for a
77
+ * later frame. With no slot free the place holds `GRASS_SLOT_NONE` and the pool's starved count rises.
78
+ * A slot the directory has no room for is marked an orphan and its place holds `GRASS_SLOT_NONE`.
79
+ *
80
+ * Every thread's layers are its own, so no two threads of a dispatch ask for the same one; two views ask
81
+ * in two dispatches, and the second finds what the first took.
82
+ *
83
+ * Dispatched through `shader_prefix_sum_to_command`'s folded command.
84
+ *
85
+ * @type {ComputeShader}
86
+ */
87
+ export const shader_grass_surface_want = ComputeShader.from({
88
+ label: "Grass Surface Want",
89
+ resources,
90
+ body: CodeChunk.from(
91
+ //language=WGSL
92
+ `
93
+ // what a bake counts and gathers into a slot's record, as a bake is to find it
94
+ fn grass_slot_reset_bake(record: u32) {
95
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_LAYER_COUNT}u], 0u);
96
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_SURFEL_COUNT}u], 0u);
97
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_HEIGHT_MIN}u], 0xFFFFFFFFu);
98
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_HEIGHT_MAX}u], 0u);
99
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_NORMAL_SPREAD}u], 0u);
100
+ }
101
+
102
+ // stamp the layer's slot as wanted, or take a slot and a place in the bake for it; the slot that holds it, or none yet
103
+ fn grass_want_layer(surface: u32, level: u32, layer: u32, tile: vec2<i32>) -> u32 {
104
+ let level_layer = level | (layer << 8u);
105
+
106
+ let held = grass_directory_find(surface, level_layer, tile);
107
+
108
+ if (held != GRASS_SLOT_NONE) {
109
+ let record = grass_slot_record(held);
110
+
111
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_WANTED_FRAME}u], settings.frame);
112
+
113
+ if (atomicLoad(&grass_pool[record + ${GRASS_SLOT_STATE}u]) == ${GRASS_SLOT_STATE_STALE}u) {
114
+ // baked again where it is, once the frame's bake has a place for it; until then it reads as it was
115
+ let place = atomicAdd(&grass_jobs.count, 1u);
116
+
117
+ if (place < settings.job_capacity) {
118
+ grass_slot_reset_bake(record);
119
+
120
+ grass_jobs.elements[place] = held;
121
+ }
122
+ }
123
+
124
+ return held;
125
+ }
126
+
127
+ let place = atomicAdd(&grass_jobs.count, 1u);
128
+
129
+ if (place >= settings.job_capacity) {
130
+ return GRASS_SLOT_NONE;
131
+ }
132
+
133
+ let slot = slot_stack_pop(&grass_pool[${GRASS_POOL_FREE_COUNT}u], &grass_free, settings.slot_capacity);
134
+
135
+ grass_jobs.elements[place] = slot;
136
+
137
+ if (slot == SLOT_STACK_NONE) {
138
+ atomicAdd(&grass_pool[${GRASS_POOL_STARVED}u], 1u);
139
+
140
+ return GRASS_SLOT_NONE;
141
+ }
142
+
143
+ let record = grass_slot_record(slot);
144
+
145
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_SURFACE}u], surface);
146
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_LEVEL_LAYER}u], level_layer);
147
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_TILE_X}u], bitcast<u32>(tile.x));
148
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_TILE_Z}u], bitcast<u32>(tile.y));
149
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_STATE}u], ${GRASS_SLOT_STATE_PENDING}u);
150
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_WANTED_FRAME}u], settings.frame);
151
+
152
+ grass_slot_reset_bake(record);
153
+
154
+ if (!grass_directory_insert(surface, level_layer, tile, slot)) {
155
+ atomicStore(&grass_pool[record + ${GRASS_SLOT_STATE}u], ${GRASS_SLOT_STATE_ORPHAN}u);
156
+
157
+ grass_jobs.elements[place] = GRASS_SLOT_NONE;
158
+
159
+ return GRASS_SLOT_NONE;
160
+ }
161
+
162
+ return slot;
163
+ }
164
+
165
+ @compute @workgroup_size(${COMPUTE_SHADER_DEFAULT_GROUP_SIZE})
166
+ fn main(
167
+ @builtin(workgroup_id) workgroup_id: vec3<u32>,
168
+ @builtin(local_invocation_index) lane: u32,
169
+ ) {
170
+ let thread = folded_workgroup_index(workgroup_id) * ${COMPUTE_SHADER_DEFAULT_GROUP_SIZE}u + lane;
171
+
172
+ // the sums are inclusive: a thread belongs to the first window whose sum is past it
173
+ let windows = prefix_sums.count;
174
+ let index = lower_bound_branchless(&prefix_sums.elements, thread + 1u, windows);
175
+
176
+ if (index >= windows) {
177
+ return;
178
+ }
179
+
180
+ var place = thread;
181
+
182
+ if (index > 0u) {
183
+ place -= prefix_sums.elements[index - 1u];
184
+ }
185
+
186
+ let surface = grass_surfaces[index / settings.level_count];
187
+ let level = index % settings.level_count;
188
+
189
+ let frame = grass_surface_frame(${TRANSFORMS_TABLE.marshalling_method_read_field('global')}(&scene_database, surface.node));
190
+ let eye = grass_world_to_frame(frame, camera.transform[3].xyz);
191
+
192
+ let window = grass_surface_window(settings, surface, level, eye);
193
+
194
+ let tile = window.corner + vec2<i32>(i32(place % window.size.x), i32(place / window.size.x));
195
+
196
+ let tile_box = grass_tile_box(settings, surface, level, tile);
197
+
198
+ if (!grass_tile_wanted(settings, surface, level, tile_box, eye)) {
199
+ return;
200
+ }
201
+
202
+ // where the tile's grass can be, against the view's frustum
203
+ let low = tile_box.low;
204
+ let high = tile_box.high;
205
+
206
+ let box = aabb3_from_transformed_corners(array<vec3<f32>, 8>(
207
+ vec3<f32>(low.x, low.y, low.z),
208
+ vec3<f32>(high.x, low.y, low.z),
209
+ vec3<f32>(low.x, high.y, low.z),
210
+ vec3<f32>(high.x, high.y, low.z),
211
+ vec3<f32>(low.x, low.y, high.z),
212
+ vec3<f32>(high.x, low.y, high.z),
213
+ vec3<f32>(low.x, high.y, high.z),
214
+ vec3<f32>(high.x, high.y, high.z),
215
+ ), frame);
216
+
217
+ if (!aabb3_intersects_frustum(box, camera.frustum)) {
218
+ return;
219
+ }
220
+
221
+ let top = grass_want_layer(surface.node, level, 0u, tile);
222
+
223
+ if (top == GRASS_SLOT_NONE) {
224
+ return;
225
+ }
226
+
227
+ let record = grass_slot_record(top);
228
+
229
+ if (atomicLoad(&grass_pool[record + ${GRASS_SLOT_STATE}u]) != ${GRASS_SLOT_STATE_BAKED}u) {
230
+ return;
231
+ }
232
+
233
+ // a tile has no more layers than a column's walk has crossings
234
+ let layers = min(atomicLoad(&grass_pool[record + ${GRASS_SLOT_LAYER_COUNT}u]), ${GRASS_COLUMN_CROSSINGS}u);
235
+
236
+ for (var layer = 1u; layer < layers; layer++) {
237
+ grass_want_layer(surface.node, level, layer, tile);
238
+ }
239
+ }
240
+ `, [
241
+ chunk_folded_workgroup_index,
242
+ chunk_lower_bound_branchless,
243
+ chunk_slot_stack,
244
+ chunk_aabb3_from_transformed_corners,
245
+ chunk_aabb3_intersects_frustum,
246
+ chunk_grass_surface_frame,
247
+ chunk_grass_surface_window,
248
+ chunk_grass_directory,
249
+ TRANSFORMS_TABLE.chunk_read_field('global'),
250
+ ]),
251
+ });
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Threads in a workgroup of {@link shader_grass_surface_window_count}.
3
+ *
4
+ * @type {number}
5
+ */
6
+ export const GRASS_SURFACE_WINDOW_COUNT_WORKGROUP_SIZE: number;
7
+ /**
8
+ * Counts the tiles a view may want of each level of each grass surface, a thread a level of a surface.
9
+ *
10
+ * Thread `s * level_count + l` writes how many tiles the window of level `l` of surface `s` has
11
+ * (`grass_surface_window`) to `grass_window_counts.elements` at its own index, and thread 0 writes how many
12
+ * counts there are to `grass_window_counts.count`. Threads past `surface_count * level_count` write nothing,
13
+ * so the dispatch covers that many threads and need not be exact.
14
+ *
15
+ * The counts are what a prefix scan turns into a thread a tile for {@link shader_grass_surface_want}.
16
+ *
17
+ * @type {ComputeShader}
18
+ */
19
+ export const shader_grass_surface_window_count: ComputeShader;
20
+ import { ComputeShader } from "../../shader/ComputeShader.js";
21
+ //# sourceMappingURL=shader_grass_surface_window_count.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_grass_surface_window_count.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/grass/surface/shader_grass_surface_window_count.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,wDAFU,MAAM,CAE4C;AAY5D;;;;;;;;;;;GAWG;AACH,gDAFU,aAAa,CAoCpB;8BArE2B,+BAA+B"}
@@ -0,0 +1,75 @@
1
+ import { CAMERA_RESOURCE } from "../../camera/CAMERA_RESOURCE.js";
2
+ import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
3
+ import { TRANSFORMS_TABLE } from "../../scene/chunk_scene_database_access.js";
4
+ import { SCENE_DATABASE_RESOURCE } from "../../scene/SCENE_DATABASE_RESOURCE.js";
5
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
6
+ import { ComputeShader } from "../../shader/ComputeShader.js";
7
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
8
+ import { chunk_grass_surface_frame } from "./chunk_grass_surface_frame.js";
9
+ import { chunk_grass_surface_window } from "./chunk_grass_surface_window.js";
10
+ import { GRASS_SURFACE_VIEW_SETTINGS, GRASS_SURFACES_RESOURCE } from "./GRASS_SURFACE_VIEW.js";
11
+
12
+ /**
13
+ * Threads in a workgroup of {@link shader_grass_surface_window_count}.
14
+ *
15
+ * @type {number}
16
+ */
17
+ export const GRASS_SURFACE_WINDOW_COUNT_WORKGROUP_SIZE = 64;
18
+
19
+ const resources = new ShaderResourceSetDescriptor();
20
+
21
+ resources.setImmediate("settings", GRASS_SURFACE_VIEW_SETTINGS);
22
+
23
+ resources.createGroup()
24
+ .add(CAMERA_RESOURCE)
25
+ .add(SCENE_DATABASE_RESOURCE)
26
+ .add(GRASS_SURFACES_RESOURCE)
27
+ .addStorageBuffer("grass_window_counts", COLLECTION_U32_STRUCT_READ, true);
28
+
29
+ /**
30
+ * Counts the tiles a view may want of each level of each grass surface, a thread a level of a surface.
31
+ *
32
+ * Thread `s * level_count + l` writes how many tiles the window of level `l` of surface `s` has
33
+ * (`grass_surface_window`) to `grass_window_counts.elements` at its own index, and thread 0 writes how many
34
+ * counts there are to `grass_window_counts.count`. Threads past `surface_count * level_count` write nothing,
35
+ * so the dispatch covers that many threads and need not be exact.
36
+ *
37
+ * The counts are what a prefix scan turns into a thread a tile for {@link shader_grass_surface_want}.
38
+ *
39
+ * @type {ComputeShader}
40
+ */
41
+ export const shader_grass_surface_window_count = ComputeShader.from({
42
+ label: "Grass Surface Window Count",
43
+ resources,
44
+ body: CodeChunk.from(
45
+ //language=WGSL
46
+ `
47
+ @compute @workgroup_size(${GRASS_SURFACE_WINDOW_COUNT_WORKGROUP_SIZE})
48
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
49
+ let index = id.x;
50
+ let total = settings.surface_count * settings.level_count;
51
+
52
+ if (index == 0u) {
53
+ grass_window_counts.count = total;
54
+ }
55
+
56
+ if (index >= total) {
57
+ return;
58
+ }
59
+
60
+ let surface = grass_surfaces[index / settings.level_count];
61
+ let level = index % settings.level_count;
62
+
63
+ let frame = grass_surface_frame(${TRANSFORMS_TABLE.marshalling_method_read_field('global')}(&scene_database, surface.node));
64
+ let eye = grass_world_to_frame(frame, camera.transform[3].xyz);
65
+
66
+ let window = grass_surface_window(settings, surface, level, eye);
67
+
68
+ grass_window_counts.elements[index] = window.size.x * window.size.y;
69
+ }
70
+ `, [
71
+ chunk_grass_surface_frame,
72
+ chunk_grass_surface_window,
73
+ TRANSFORMS_TABLE.chunk_read_field('global'),
74
+ ]),
75
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"graph_add_per_object_velocity.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js"],"names":[],"mappings":"AAkRA;;;;GAIG;AACH,+DAFW,eAAe,QAIzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH;IAhB4B,KAAK;IACT,aAAa,EAA1B,MAAM;IACO,kBAAkB,EAA/B,MAAM;IACO,uBAAuB,EAApC,MAAM;IACO,qBAAqB,EAAlC,MAAM;IACO,uBAAuB,EAApC,MAAM;IACO,mBAAmB,EAAhC,MAAM;IACO,4BAA4B,EAAzC,MAAM;IACO,qBAAqB,EAAlC,MAAM;IACQ,eAAe,EAA7B,OAAO;IAGQ,UAAU,EAAzB,MAAM,EAAE;IACa,IAAI;IACvB,MAAM,CA8ElB;8BAhXY,OAAO,6CAA6C,EAAE,eAAe"}
1
+ {"version":3,"file":"graph_add_per_object_velocity.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js"],"names":[],"mappings":"AA8QA;;;;GAIG;AACH,+DAFW,eAAe,QAIzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH;IAhB4B,KAAK;IACT,aAAa,EAA1B,MAAM;IACO,kBAAkB,EAA/B,MAAM;IACO,uBAAuB,EAApC,MAAM;IACO,qBAAqB,EAAlC,MAAM;IACO,uBAAuB,EAApC,MAAM;IACO,mBAAmB,EAAhC,MAAM;IACO,4BAA4B,EAAzC,MAAM;IACO,qBAAqB,EAAlC,MAAM;IACQ,eAAe,EAA7B,OAAO;IAGQ,UAAU,EAAzB,MAAM,EAAE;IACa,IAAI;IACvB,MAAM,CA+DlB;8BA9VY,OAAO,6CAA6C,EAAE,eAAe"}
@@ -1,6 +1,4 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { m4_invert } from "../../../../core/geom/3d/mat4/m4_invert.js";
3
- import { m4_multiply } from "../../../../core/geom/3d/mat4/m4_multiply.js";
4
2
  import { mat4x4f, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
5
3
  import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
6
4
  import { U32_CONTAINER_STRUCT } from "../../shader/type/U32_CONTAINER_STRUCT.js";
@@ -33,6 +31,7 @@ import { ImageShader } from "../../shader/ImageShader.js";
33
31
  import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
34
32
  import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
35
33
  import { construct_pixel_reprojection_matrix } from "./construct_pixel_reprojection_matrix.js";
34
+ import { view_velocity_matrices } from "./view_velocity_matrices.js";
36
35
  import {
37
36
  construct_reprojection_matrix_rotation_only,
38
37
  } from "./construct_reprojection_matrix.js";
@@ -266,9 +265,6 @@ const shader = new ImageShader({
266
265
  }]
267
266
  });
268
267
 
269
- const scratch_unjit_view_proj_curr_f64 = new Float64Array(16);
270
- const scratch_unjit_view_proj_prev_f64 = new Float64Array(16);
271
- const scratch_unjit_inv_view_proj_curr_f64 = new Float64Array(16);
272
268
  const scratch_unjit_view_proj_prev_f32 = new Float32Array(16);
273
269
  const scratch_unjit_inv_view_proj_curr_f32 = new Float32Array(16);
274
270
 
@@ -359,24 +355,9 @@ export function graph_add_per_object_velocity({
359
355
  const current_camera = view.camera.camera;
360
356
  const previous_camera = view.gpu_previous_camera_state.camera;
361
357
 
362
- // Un-jittered current-frame inverse view-projection (for
363
- // unprojecting depth → world without folding in jitter shift).
364
- m4_multiply(
365
- scratch_unjit_view_proj_curr_f64,
366
- current_camera.projection_matrix,
367
- current_camera.view_matrix
368
- );
369
- m4_invert(scratch_unjit_inv_view_proj_curr_f64, scratch_unjit_view_proj_curr_f64);
370
-
371
- // Un-jittered previous-frame view-projection.
372
- m4_multiply(
373
- scratch_unjit_view_proj_prev_f64,
374
- previous_camera.projection_matrix,
375
- previous_camera.view_matrix
376
- );
377
-
378
- scratch_unjit_inv_view_proj_curr_f32.set(scratch_unjit_inv_view_proj_curr_f64);
379
- scratch_unjit_view_proj_prev_f32.set(scratch_unjit_view_proj_prev_f64);
358
+ // Un-jittered: this frame's inverse view-projection (depth → world without the jitter's shift)
359
+ // and last frame's view-projection.
360
+ view_velocity_matrices(view, scratch_unjit_inv_view_proj_curr_f32, scratch_unjit_view_proj_prev_f32);
380
361
 
381
362
  // Background rotation-only reprojection (pixel space).
382
363
  const reprojection_matrix_64 = new Float64Array(16);
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The two matrices a pass needs to say how far a pixel's surface moved on screen: this frame's inverse
3
+ * view-projection, to take a pixel and its depth to the world, and last frame's view-projection, to take
4
+ * where that point was back to the screen. Both are free of the sub-pixel jitter, as the velocity buffer
5
+ * is: a still surface has no velocity however the frame is jittered.
6
+ *
7
+ * @param {GPUViewContext} view
8
+ * @param {Float32Array} inverse_view_projection receives this frame's, 16 elements
9
+ * @param {Float32Array} view_projection_previous receives last frame's, 16 elements
10
+ */
11
+ export function view_velocity_matrices(view: GPUViewContext, inverse_view_projection: Float32Array, view_projection_previous: Float32Array): void;
12
+ //# sourceMappingURL=view_velocity_matrices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view_velocity_matrices.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/velocity/view_velocity_matrices.js"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,sFAHW,YAAY,4BACZ,YAAY,QActB"}
@@ -0,0 +1,29 @@
1
+ import { m4_invert } from "../../../../core/geom/3d/mat4/m4_invert.js";
2
+ import { m4_multiply } from "../../../../core/geom/3d/mat4/m4_multiply.js";
3
+
4
+ const scratch_view_projection = new Float64Array(16);
5
+ const scratch_inverse = new Float64Array(16);
6
+
7
+ /**
8
+ * The two matrices a pass needs to say how far a pixel's surface moved on screen: this frame's inverse
9
+ * view-projection, to take a pixel and its depth to the world, and last frame's view-projection, to take
10
+ * where that point was back to the screen. Both are free of the sub-pixel jitter, as the velocity buffer
11
+ * is: a still surface has no velocity however the frame is jittered.
12
+ *
13
+ * @param {GPUViewContext} view
14
+ * @param {Float32Array} inverse_view_projection receives this frame's, 16 elements
15
+ * @param {Float32Array} view_projection_previous receives last frame's, 16 elements
16
+ */
17
+ export function view_velocity_matrices(view, inverse_view_projection, view_projection_previous) {
18
+ const current = view.camera.camera;
19
+ const previous = view.gpu_previous_camera_state.camera;
20
+
21
+ m4_multiply(scratch_view_projection, current.projection_matrix, current.view_matrix);
22
+ m4_invert(scratch_inverse, scratch_view_projection);
23
+
24
+ inverse_view_projection.set(scratch_inverse);
25
+
26
+ m4_multiply(scratch_view_projection, previous.projection_matrix, previous.view_matrix);
27
+
28
+ view_projection_previous.set(scratch_view_projection);
29
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_meshes_transparent_avboit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js"],"names":[],"mappings":"AA4DA;;;;;GAKG;AACH,oDAHW,UAAU,MAAM,CAAC,GACf,MAAM,EAAE,CAOpB;AAED;;;;;;;;;;;;GAYG;AACH;IAT+B,KAAK;IACA,KAAK;IACd,MAAM,EAAtB,MAAM;IACqB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACD,kBAAkB,EAAlC,MAAM;IACU,wBAAwB,EAAxC,MAAM;IACW,SAAS,GAA1B,MAAM;IACJ,MAAM,CA4DlB;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,SAAS,EAAzB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACmB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACQ,MAAM,GAA/B,cAAc;IACZ,MAAM,CAuDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6KAFa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAiJjE;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,QAAQ,EAAxB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACN,MAAM,CAoClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,sUAFa;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CA4M7D;AAED;;;;;;;;GAQG;AACH,+EAHW,UAAU,MAAM,CAAC,GACf;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAe/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH;IA3B+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,QAAQ,EAA1B,MAAM,EAAE;IACQ,aAAa,EAA7B,MAAM;IACU,aAAa,EAA7B,MAAM;IACuB,MAAM;IACnB,wBAAwB,EAAxC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACU,kBAAkB,EAAlC,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,oBAAoB,EAApC,MAAM;IAC6B,sBAAsB,EAAzD;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAGC,eAAe,GAAzC,eAAe;IAGsF,MAAM,EAA3G,OAAO,iEAAiE,EAAE,iBAAiB;IAGlE,MAAM,GAA/B,cAAc;IACiD,aAAa,GAA5E,OAAO,wBAAwB,EAAE,iBAAiB,EAAE;IAElD,MAAM,CAsTlB;+BAz9B8B,qBAAqB;gCAIpB,6CAA6C"}
1
+ {"version":3,"file":"graph_rasterize_meshes_transparent_avboit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js"],"names":[],"mappings":"AA4DA;;;;;GAKG;AACH,oDAHW,UAAU,MAAM,CAAC,GACf,MAAM,EAAE,CAOpB;AAED;;;;;;;;;;;;GAYG;AACH;IAT+B,KAAK;IACA,KAAK;IACd,MAAM,EAAtB,MAAM;IACqB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACD,kBAAkB,EAAlC,MAAM;IACU,wBAAwB,EAAxC,MAAM;IACW,SAAS,GAA1B,MAAM;IACJ,MAAM,CA4DlB;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,SAAS,EAAzB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACmB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACQ,MAAM,GAA/B,cAAc;IACZ,MAAM,CAuDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6KAFa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAiJjE;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,QAAQ,EAAxB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACN,MAAM,CAoClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,sUAFa;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CA4M7D;AAED;;;;;;;;GAQG;AACH,+EAHW,UAAU,MAAM,CAAC,GACf;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAe/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH;IA3B+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,QAAQ,EAA1B,MAAM,EAAE;IACQ,aAAa,EAA7B,MAAM;IACU,aAAa,EAA7B,MAAM;IACuB,MAAM;IACnB,wBAAwB,EAAxC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACU,kBAAkB,EAAlC,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,oBAAoB,EAApC,MAAM;IAC6B,sBAAsB,EAAzD;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAGC,eAAe,GAAzC,eAAe;IAGsF,MAAM,EAA3G,OAAO,iEAAiE,EAAE,iBAAiB;IAGlE,MAAM,GAA/B,cAAc;IACiD,aAAa,GAA5E,OAAO,wBAAwB,EAAE,iBAAiB,EAAE;IAElD,MAAM,CA4UlB;+BA/+B8B,qBAAqB;gCAIpB,6CAA6C"}
@@ -867,6 +867,28 @@ export function graph_rasterize_meshes_transparent_avboit({
867
867
  label: `${view_ctx.label}/AVBOIT-double`,
868
868
  });
869
869
 
870
+ // The meshes' fragments pick the probes around them, which no pixel of the G-buffer asked for: their meshlets
871
+ // ask, for the frame after. A bucket of no material lists none.
872
+ if (material_count_front > 0) {
873
+ probes.graph_want_meshlets({
874
+ graph,
875
+ scene: scene_ctx,
876
+ camera: gr_camera,
877
+ meshlet_collection: prep_front.meshlet_collection,
878
+ meshlet_iterator_command: prep_front.meshlet_iterator_command,
879
+ });
880
+ }
881
+
882
+ if (material_count_double > 0) {
883
+ probes.graph_want_meshlets({
884
+ graph,
885
+ scene: scene_ctx,
886
+ camera: gr_camera,
887
+ meshlet_collection: prep_double.meshlet_collection,
888
+ meshlet_iterator_command: prep_double.meshlet_iterator_command,
889
+ });
890
+ }
891
+
870
892
  // Occupancy and warp
871
893
  // ======
872
894
 
@@ -1 +1 @@
1
- {"version":3,"file":"GPUSceneContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/GPUSceneContext.js"],"names":[],"mappings":"AA4EA;;;;;;;;;GASG;AACH;IAEI;;;;;;;OAOG;IACH,iCAFW,eAAe,QASzB;IA4KD;;;;OAIG;IACH,sBAHW,eAAe,SACf,KAAK,EAyCf;IAtND;;;OAGG;IACH,aAFU,MAAM,CAEE;IAElB;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAGV;;OAEG;IACH,sBAFU,cAAc,CAEH;IASrB;;;OAGG;IACH,mBAEC;IAOD,uCAEC;IAOD;;;;;OAKG;IACH,yBAEC;IAUD;;;;;OAKG;IACH,kBAEC;IAQD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,8CAEC;IAOD;;;OAGG;IACH,8CAEC;IA2ID;;OAEG;IACH,kDAEC;IAED;;OAEG;IACH,gDAEC;IAED;;OAEG;IACH,kDAEC;IAED;;OAEG;IACH,+CAEC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH;QAH0C,SAAS,GAAxC,oBAAoB;QAClB,yBAAyB,CA4DrC;IAED;;OAEG;IACH,6CAEC;IAYD;;;;;OAKG;IACH,gEAEC;IAED;;;OAGG;IACH,kCAEC;IAED;;;;;OAKG;IACH,uCAEC;IAED;;;;;;;;;;;OAWG;IACH,uCAUC;IAED,+BAUC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,yBAEC;IAED;;;;;OAKG;IACH,sCAMC;IAOD;;;;;;;OAOG;IACH,8EAEC;IA6BD;;;;;OAKG;IACH,cAsEC;IAED;;;;;OAKG;IACH,YAFW,eAAe,QAyBzB;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,cAHW,sBAAsB,cACtB,MAAM,QAuBhB;IAUD;;;;;;;;;;;OAWG;IACH,oBAHW,UAAU,GACR,MAAM,CAQlB;IAoCD;;;;;;;OAOG;IACH,gBAuBC;IAwCL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;8BAl3BY,OAAO,0CAA0C,EAAE,eAAe;8BAClE,OAAO,uBAAuB,EAAE,eAAe;iCAC/C,OAAO,mCAAmC,EAAE,kBAAkB;iCAC9D,OAAO,mCAAmC,EAAE,kBAAkB;4BAC9D,OAAO,8BAA8B,EAAE,aAAa;8BACpD,OAAO,iDAAiD,EAAE,eAAe;yBACzE,OAAO,2DAA2D,EAAE,UAAU;+BA5B5D,iDAAiD;sBAM1D,YAAY;oCAFE,uCAAuC;6BAC9C,yBAAyB;uBAH/B,yBAAyB;mCACb,gCAAgC;oCAF/B,mDAAmD;kDAMrC,wCAAwC;0CAlBhD,0DAA0D;8BAItE,8CAA8C;iCAF3C,iDAAiD;+BAInD,2CAA2C;qCADrC,qDAAqD;oCAItD,qCAAqC;4BAC7C,gCAAgC;uCASrB,iDAAiD;6BAQ3D,wBAAwB;wCADb,mCAAmC;uCAlBpC,wCAAwC"}
1
+ {"version":3,"file":"GPUSceneContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/GPUSceneContext.js"],"names":[],"mappings":"AA4EA;;;;;;;;;GASG;AACH;IAEI;;;;;;;OAOG;IACH,iCAFW,eAAe,QASzB;IA4KD;;;;OAIG;IACH,sBAHW,eAAe,SACf,KAAK,EAyCf;IAtND;;;OAGG;IACH,aAFU,MAAM,CAEE;IAElB;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAGV;;OAEG;IACH,sBAFU,cAAc,CAEH;IASrB;;;OAGG;IACH,mBAEC;IAOD,uCAEC;IAOD;;;;;OAKG;IACH,yBAEC;IAUD;;;;;OAKG;IACH,kBAEC;IAQD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,8CAEC;IAOD;;;OAGG;IACH,8CAEC;IA2ID;;OAEG;IACH,kDAEC;IAED;;OAEG;IACH,gDAEC;IAED;;OAEG;IACH,kDAEC;IAED;;OAEG;IACH,+CAEC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH;QAH0C,SAAS,GAAxC,oBAAoB;QAClB,yBAAyB,CA4DrC;IAED;;OAEG;IACH,6CAEC;IAYD;;;;;OAKG;IACH,gEAEC;IAED;;;OAGG;IACH,kCAEC;IAED;;;;;OAKG;IACH,uCAEC;IAED;;;;;;;;;;;OAWG;IACH,uCAUC;IAED,+BAUC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,yBAEC;IAED;;;;;OAKG;IACH,sCAMC;IAOD;;;;;;;OAOG;IACH,8EAEC;IA6BD;;;;;OAKG;IACH,cAsEC;IAED;;;;;OAKG;IACH,YAFW,eAAe,QA4BzB;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,cAHW,sBAAsB,cACtB,MAAM,QAuBhB;IAUD;;;;;;;;;;;OAWG;IACH,oBAHW,UAAU,GACR,MAAM,CAQlB;IAoCD;;;;;;;OAOG;IACH,gBAuBC;IAwCL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;8BAr3BY,OAAO,0CAA0C,EAAE,eAAe;8BAClE,OAAO,uBAAuB,EAAE,eAAe;iCAC/C,OAAO,mCAAmC,EAAE,kBAAkB;iCAC9D,OAAO,mCAAmC,EAAE,kBAAkB;4BAC9D,OAAO,8BAA8B,EAAE,aAAa;8BACpD,OAAO,iDAAiD,EAAE,eAAe;yBACzE,OAAO,2DAA2D,EAAE,UAAU;+BA5B5D,iDAAiD;sBAM1D,YAAY;oCAFE,uCAAuC;6BAC9C,yBAAyB;uBAH/B,yBAAyB;mCACb,gCAAgC;oCAF/B,mDAAmD;kDAMrC,wCAAwC;0CAlBhD,0DAA0D;8BAItE,8CAA8C;iCAF3C,iDAAiD;+BAInD,2CAA2C;qCADrC,qDAAqD;oCAItD,qCAAqC;4BAC7C,gCAAgC;uCASrB,iDAAiD;6BAQ3D,wBAAwB;wCADb,mCAAmC;uCAlBpC,wCAAwC"}
@@ -723,6 +723,9 @@ export class GPUSceneContext {
723
723
  this.#light_probe_volume.update();
724
724
  this.#lights.update(ctx);
725
725
  this.#volumetrics.update(ctx, 0);
726
+
727
+ // what the frame before read is this frame's history; producers write after this
728
+ this.#wind.advance_frame();
726
729
  this.#wind.update();
727
730
 
728
731
  // Per-frame animation database flush — picks up any new clips,
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The `lattice_bits` of a surface whose densest species has `density` blades a square metre, on surfels
3
+ * `finest_spacing` apart: the least whole number of doublings of a surfel's side that reaches the density.
4
+ *
5
+ * @param {number} density blades a square metre, above zero
6
+ * @param {number} finest_spacing metres
7
+ * @returns {number}
8
+ */
9
+ export function grass_surface_lattice_bits(density: number, finest_spacing: number): number;
10
+ /**
11
+ * What grows on a grass surface, taken over every species its members grow: a record of the scene
12
+ * database's `grass_surface_params` table, at the surface's own `transforms` row. A row nothing has written
13
+ * reads as zeros, a surface on which nothing grows.
14
+ *
15
+ * - `lattice_bits`: the surface's blade lattice has `2^lattice_bits` points along a side of a finest
16
+ * surfel's square, the fewest that make the lattice as dense as the densest species.
17
+ * - `density`: the densest species' blades in a square metre.
18
+ * - `blade_length`, `blade_length_min`: the longest and the shortest species' blade, metres.
19
+ * - `blade_width_min`: the narrowest species' blade, metres.
20
+ * - `cover`: the greatest product of a species' density and its blade's width, a metre of blade a square
21
+ * metre of ground.
22
+ *
23
+ * @type {WebGPUStruct}
24
+ */
25
+ export const GRASS_SURFACE_PARAMS_STRUCT: WebGPUStruct;
26
+ import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
27
+ //# sourceMappingURL=GRASS_SURFACE_PARAMS_STRUCT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GRASS_SURFACE_PARAMS_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.js"],"names":[],"mappings":"AA2BA;;;;;;;GAOG;AACH,oDAJW,MAAM,kBACN,MAAM,GACJ,MAAM,CAIlB;AAlCD;;;;;;;;;;;;;;GAcG;AACH,0CAFU,YAAY,CASU;6BAxBH,gCAAgC"}
@@ -0,0 +1,38 @@
1
+ import { f32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
3
+
4
+ /**
5
+ * What grows on a grass surface, taken over every species its members grow: a record of the scene
6
+ * database's `grass_surface_params` table, at the surface's own `transforms` row. A row nothing has written
7
+ * reads as zeros, a surface on which nothing grows.
8
+ *
9
+ * - `lattice_bits`: the surface's blade lattice has `2^lattice_bits` points along a side of a finest
10
+ * surfel's square, the fewest that make the lattice as dense as the densest species.
11
+ * - `density`: the densest species' blades in a square metre.
12
+ * - `blade_length`, `blade_length_min`: the longest and the shortest species' blade, metres.
13
+ * - `blade_width_min`: the narrowest species' blade, metres.
14
+ * - `cover`: the greatest product of a species' density and its blade's width, a metre of blade a square
15
+ * metre of ground.
16
+ *
17
+ * @type {WebGPUStruct}
18
+ */
19
+ export const GRASS_SURFACE_PARAMS_STRUCT = WebGPUStruct.from({
20
+ lattice_bits: u32,
21
+ density: f32,
22
+ blade_length: f32,
23
+ blade_length_min: f32,
24
+ blade_width_min: f32,
25
+ cover: f32,
26
+ }, "GrassSurfaceParams").pack();
27
+
28
+ /**
29
+ * The `lattice_bits` of a surface whose densest species has `density` blades a square metre, on surfels
30
+ * `finest_spacing` apart: the least whole number of doublings of a surfel's side that reaches the density.
31
+ *
32
+ * @param {number} density blades a square metre, above zero
33
+ * @param {number} finest_spacing metres
34
+ * @returns {number}
35
+ */
36
+ export function grass_surface_lattice_bits(density, finest_spacing) {
37
+ return Math.max(0, Math.ceil(Math.log2(finest_spacing * Math.sqrt(density)) - 1e-9));
38
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A mesh row's membership of a grass surface: which surface it is ground of, what a column of that
3
+ * surface traces to find it, and what grows on it.
4
+ *
5
+ * A record of the scene database's `mesh_ground_covers` table, which shares the `meshes` table's index
6
+ * space: a row's ground cover is at the row's own index.
7
+ *
8
+ * **`flags` says what holds.** A row nothing has written, and a row on a page the table has never
9
+ * allocated, both read as a record of zeros, so zero flags is "not ground of any surface" and the other
10
+ * fields are read only when {@link MESH_GROUND_COVER_FLAG_MEMBER} is set.
11
+ */
12
+ export const MESH_GROUND_COVER_STRUCT: WebGPUStruct;
13
+ /**
14
+ * The row is a member of the surface its record names. Its faces are ground of that surface: they
15
+ * hold surfels, and they hide the ground of other members under them.
16
+ *
17
+ * @type {number}
18
+ */
19
+ export const MESH_GROUND_COVER_FLAG_MEMBER: number;
20
+ /**
21
+ * Something grows on the member, and its record's `species` holds. A member without it only hides
22
+ * ground.
23
+ *
24
+ * @type {number}
25
+ */
26
+ export const MESH_GROUND_COVER_FLAG_GROWS: number;
27
+ import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
28
+ //# sourceMappingURL=MESH_GROUND_COVER_STRUCT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MESH_GROUND_COVER_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,oDA2B6B;AAE7B;;;;;GAKG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;;;GAKG;AACH,2CAFU,MAAM,CAE8B;6BAxDjB,gCAAgC"}