@woosh/meep-engine 3.60.3 → 3.60.5

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 (514) hide show
  1. package/CHANGELOG.md +2602 -0
  2. package/CONTRIBUTING.md +7 -0
  3. package/MIGRATION_2_TO_3.md +136 -0
  4. package/SECURITY.md +4 -0
  5. package/editor/EditorCameraNavigation.d.ts +2 -1
  6. package/editor/EditorCameraNavigation.d.ts.map +1 -1
  7. package/editor/EditorCameraNavigation.js +51 -57
  8. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +3 -0
  9. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
  10. package/editor/ecs/component/editors/ecs/Trail3DEditor.js +6 -0
  11. package/package.json +6 -2
  12. package/src/engine/EngineHarness.d.ts +3 -9
  13. package/src/engine/EngineHarness.d.ts.map +1 -1
  14. package/src/engine/EngineHarness.js +6 -8
  15. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts +9 -6
  16. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts.map +1 -1
  17. package/src/engine/graphics/camera/makeOrbitalCameraController.js +44 -71
  18. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts +64 -0
  19. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts.map +1 -0
  20. package/src/engine/graphics/camera/orbital/MomentumAxis.js +187 -0
  21. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts +86 -0
  22. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts.map +1 -0
  23. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.js +319 -0
  24. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +34 -10
  25. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  26. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +116 -30
  27. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +1 -7
  28. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  29. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -37
  30. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +1 -2
  31. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.d.ts +14 -0
  32. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.d.ts.map +1 -0
  33. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.js +22 -0
  34. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +19 -3
  35. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  36. package/src/engine/graphics/ecs/trail3d/Trail3D.js +31 -4
  37. package/src/engine/graphics/ecs/trail3d/advance_trail.js +1 -1
  38. package/src/engine/graphics/ecs/water/Water.d.ts +8 -0
  39. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  40. package/src/engine/graphics/ecs/water/Water.js +8 -0
  41. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +5 -5
  42. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +1 -1
  43. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +6 -6
  44. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  45. package/src/engine/graphics3/WaterSystem.js +731 -734
  46. package/src/engine/graphics3/decal/DecalTileShader.d.ts +61 -0
  47. package/src/engine/graphics3/decal/DecalTileShader.d.ts.map +1 -0
  48. package/src/engine/graphics3/decal/DecalTileShader.js +138 -0
  49. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts +10 -4
  50. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  51. package/src/engine/graphics3/decal/GPUDecalRenderer.js +149 -44
  52. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts +25 -0
  53. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts.map +1 -0
  54. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.js +55 -0
  55. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts +22 -0
  56. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts.map +1 -0
  57. package/src/engine/graphics3/decal/graph_gather_decal_tiles.js +70 -0
  58. package/src/engine/graphics3/decal/shader_decal_composite.d.ts +7 -5
  59. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  60. package/src/engine/graphics3/decal/shader_decal_composite.js +48 -44
  61. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts +12 -0
  62. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -0
  63. package/src/engine/graphics3/decal/shader_decal_tile_copy.js +78 -0
  64. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts +11 -0
  65. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts.map +1 -0
  66. package/src/engine/graphics3/decal/shader_gather_decal_tiles.js +80 -0
  67. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +10 -0
  68. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +1 -1
  69. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -1
  70. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts +13 -0
  71. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts.map +1 -0
  72. package/src/engine/input/devices/mouse/MouseEventButtons.js +23 -0
  73. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts +4 -0
  74. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts.map +1 -1
  75. package/src/engine/input/ecs/controllers/KeyboardCameraController.js +9 -45
  76. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +2 -2
  77. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +2 -2
  78. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  79. package/src/shade/playground/probe_clipmap/README.md +1 -0
  80. package/src/shade/playground/probe_clipmap/index.html +5 -0
  81. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  82. package/src/shade/playground/probe_clipmap/main.js +16 -2
  83. package/src/shade/playground/vgeo_scene/README.md +1 -1
  84. package/src/shade/playground/water_refraction/README.md +5 -6
  85. package/src/shade/playground/water_refraction/index.html +1 -1
  86. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  87. package/src/shade/renderer/Renderer.js +7 -5
  88. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +4 -6
  89. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -1
  90. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +34 -36
  91. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +1 -1
  92. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  93. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +162 -163
  94. package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts +1 -1
  95. package/src/shade/renderer/atmosphere/compute_mie_absorption.js +1 -1
  96. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.js +1 -1
  97. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.js +1 -1
  98. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -164
  99. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +1 -1
  100. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
  101. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  102. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
  103. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  104. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  105. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  106. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  107. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  108. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +4 -4
  109. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +4 -4
  110. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +2 -1
  111. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  112. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +18 -1
  113. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +2 -2
  114. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts +1 -1
  115. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.js +1 -1
  116. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts +4 -5
  117. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -1
  118. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +6 -7
  119. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
  120. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
  121. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
  122. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
  123. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
  124. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
  125. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
  126. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
  127. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  128. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +2 -8
  129. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +5 -5
  130. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  131. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +10 -10
  132. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +12 -0
  133. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  134. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +22 -0
  135. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +4 -4
  136. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  137. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +50 -13
  138. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +6 -0
  139. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  140. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +7 -0
  141. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.d.ts +13 -0
  142. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.d.ts.map +1 -0
  143. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.js +13 -0
  144. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +17 -0
  145. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  146. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +20 -0
  147. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
  148. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
  149. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
  150. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.d.ts +18 -0
  151. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.d.ts.map +1 -0
  152. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.js +42 -0
  153. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
  154. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +5 -4
  155. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +4 -0
  156. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  157. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +13 -2
  158. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.d.ts +52 -0
  159. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.d.ts.map +1 -0
  160. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.js +250 -0
  161. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  162. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
  163. package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
  164. package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
  165. package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
  166. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
  167. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
  168. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
  169. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
  170. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
  171. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
  172. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
  173. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  174. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
  175. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
  176. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
  177. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
  178. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
  179. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
  180. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
  181. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
  182. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
  183. package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
  184. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
  185. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  186. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
  187. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
  188. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
  189. package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
  190. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.d.ts +39 -0
  191. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.d.ts.map +1 -0
  192. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.js +119 -0
  193. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts +15 -7
  194. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  195. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +66 -83
  196. package/src/shade/renderer/light/environment/graph_filter_environment_map.d.ts.map +1 -1
  197. package/src/shade/renderer/light/environment/graph_filter_environment_map.js +15 -6
  198. package/src/shade/renderer/light/environment/shader_blur_environment_map.d.ts +3 -0
  199. package/src/shade/renderer/light/environment/shader_blur_environment_map.d.ts.map +1 -0
  200. package/src/shade/renderer/light/environment/shader_blur_environment_map.js +111 -0
  201. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.d.ts +3 -0
  202. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.d.ts.map +1 -0
  203. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.js +128 -0
  204. package/src/shade/renderer/light/environment/shader_downsample_environment_map.d.ts.map +1 -1
  205. package/src/shade/renderer/light/environment/shader_downsample_environment_map.js +0 -1
  206. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  207. package/src/shade/renderer/material/GPUMaterialManager.d.ts +7 -0
  208. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  209. package/src/shade/renderer/material/GPUMaterialManager.js +11 -0
  210. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
  211. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  212. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
  213. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -3
  214. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  215. package/src/shade/renderer/postprocess/nss/NSS.js +1 -3
  216. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.d.ts +5 -6
  217. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.d.ts.map +1 -1
  218. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.js +9 -10
  219. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  220. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +48 -49
  221. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  222. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +12 -16
  223. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +246 -246
  224. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts +1 -2
  225. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -1
  226. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +34 -35
  227. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.d.ts +2 -2
  228. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js +2 -2
  229. package/src/shade/renderer/shader/chunk/atmosphere/chunk_compute_extinction.js +1 -1
  230. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts +1 -1
  231. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.js +1 -1
  232. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_Schlick.d.ts +3 -3
  233. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_Schlick.js +3 -3
  234. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts +9 -10
  235. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts.map +1 -1
  236. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.js +9 -10
  237. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts +4 -4
  238. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js +5 -5
  239. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +1 -2
  240. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -1
  241. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +1 -2
  242. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.d.ts +14 -1
  243. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.d.ts.map +1 -1
  244. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.js +19 -6
  245. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.d.ts +10 -1
  246. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.d.ts.map +1 -1
  247. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.js +14 -6
  248. package/src/shade/renderer/shader/chunk/random/murmur/chunk_murmur3_vec3u.d.ts +1 -1
  249. package/src/shade/renderer/shader/chunk/random/murmur/chunk_murmur3_vec3u.js +1 -1
  250. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  251. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
  252. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts +2 -3
  253. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts.map +1 -1
  254. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.js +7 -8
  255. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts +1 -1
  256. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.js +12 -12
  257. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +2 -2
  258. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +3 -4
  260. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
  261. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  262. package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
  263. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
  264. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
  265. package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
  266. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  267. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  268. package/src/shade/renderer/water/shader_water.js +22 -13
  269. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
  270. package/src/shade/renderer/water/shader_water_avboit.js +7 -7
  271. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
  272. package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
  273. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
  274. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +0 -19
  275. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
  276. package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +2 -52
  277. package/editor/REWORK_PLAN_2026_08.md +0 -692
  278. package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
  279. package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
  280. package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
  281. package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
  282. package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
  283. package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
  284. package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
  285. package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
  286. package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
  287. package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
  288. package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
  289. package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
  290. package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
  291. package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
  292. package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
  293. package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
  294. package/src/REVIEW_2026_08_06/adv-core.md +0 -511
  295. package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
  296. package/src/REVIEW_2026_08_06/adv-view.md +0 -446
  297. package/src/REVIEW_2026_08_06/api-core.md +0 -296
  298. package/src/REVIEW_2026_08_06/api-engine.md +0 -195
  299. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
  300. package/src/REVIEW_2026_08_06/core-binary.md +0 -348
  301. package/src/REVIEW_2026_08_06/core-collection.md +0 -376
  302. package/src/REVIEW_2026_08_06/core-math.md +0 -221
  303. package/src/REVIEW_2026_08_06/core-process.md +0 -266
  304. package/src/REVIEW_2026_08_06/core-science.md +0 -223
  305. package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
  306. package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
  307. package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
  308. package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
  309. package/src/REVIEW_2026_08_06/engine-input.md +0 -197
  310. package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
  311. package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
  312. package/src/REVIEW_2026_08_06/generation.md +0 -176
  313. package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
  314. package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
  315. package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
  316. package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
  317. package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
  318. package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
  319. package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
  320. package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
  321. package/src/REVIEW_2026_08_06/view.md +0 -667
  322. package/src/REVIEW_2026_08_06.md +0 -610
  323. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
  324. package/src/core/bvh2/bvh3/NOTES.md +0 -2
  325. package/src/core/bvh8/NOTES.md +0 -63
  326. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
  327. package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
  328. package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
  329. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
  330. package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
  331. package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
  332. package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
  333. package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
  334. package/src/core/geom/3d/gjk/NOTES.md +0 -8
  335. package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
  336. package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
  337. package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
  338. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
  339. package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
  340. package/src/engine/REVIEW_2026_07_03.md +0 -211
  341. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
  342. package/src/engine/control/first-person/DESIGN.md +0 -658
  343. package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
  344. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
  345. package/src/engine/control/first-person/TODO.md +0 -160
  346. package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
  347. package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
  348. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
  349. package/src/engine/ecs/ik/PLAN.md +0 -179
  350. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
  351. package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
  352. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
  353. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
  354. package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
  355. package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
  356. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
  357. package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
  358. package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
  359. package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
  360. package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
  361. package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
  362. package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
  363. package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
  364. package/src/engine/network/CONGESTION_CONTROL.md +0 -87
  365. package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
  366. package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
  367. package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
  368. package/src/engine/physics/cloth/PLAN.md +0 -3056
  369. package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
  370. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
  371. package/src/engine/physics/fluid/solver/NOTES.md +0 -46
  372. package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
  373. package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
  374. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
  375. package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
  376. package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
  377. package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
  378. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
  379. package/src/format/image/avif/DECISIONS.md +0 -545
  380. package/src/format/image/jpeg/NOTES.md +0 -3
  381. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
  382. package/src/generation/COORDINATES.md +0 -54
  383. package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
  384. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
  385. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
  386. package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
  387. package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
  388. package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
  389. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
  390. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
  391. package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
  392. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
  393. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
  394. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
  395. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
  396. package/src/shade/RENDERER_CONTRACT.md +0 -697
  397. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
  398. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
  399. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
  400. package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
  401. package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
  402. package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
  403. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
  404. package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
  405. package/src/shade/renderer/NOTES.md +0 -78
  406. package/src/shade/renderer/PLAN.md +0 -8
  407. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
  408. package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
  409. package/src/shade/renderer/atmosphere/NOTES.md +0 -6
  410. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
  411. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
  412. package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
  413. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
  414. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
  415. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
  416. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
  417. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
  418. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
  419. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
  420. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
  421. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
  422. package/src/shade/renderer/camera/orbital/README.md +0 -81
  423. package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
  424. package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
  425. package/src/shade/renderer/camera/orbital/index.js +0 -9
  426. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
  427. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
  428. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
  429. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
  430. package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
  431. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
  432. package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
  433. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
  434. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
  435. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -483
  436. package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
  437. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
  438. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
  439. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
  440. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
  441. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
  442. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
  443. package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -536
  444. package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
  445. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4225
  446. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
  447. package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
  448. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
  449. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
  450. package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
  451. package/src/shade/renderer/hiz/NOTES.md +0 -3
  452. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
  453. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
  454. package/src/shade/renderer/light/cluster/NOTES.md +0 -11
  455. package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
  456. package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
  457. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.d.ts +0 -13
  458. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.d.ts.map +0 -1
  459. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.js +0 -198
  460. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
  461. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
  462. package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
  463. package/src/shade/renderer/particles/DESIGN.md +0 -1011
  464. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -283
  465. package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
  466. package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
  467. package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
  468. package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
  469. package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
  470. package/src/shade/renderer/postprocess/nss/NOTES.md +0 -339
  471. package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
  472. package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
  473. package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
  474. package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
  475. package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
  476. package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
  477. package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
  478. package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
  479. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
  480. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
  481. package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
  482. package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
  483. package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -394
  484. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -160
  485. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
  486. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
  487. package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
  488. package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
  489. package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
  490. package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
  491. package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
  492. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
  493. package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
  494. package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -932
  495. package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
  496. package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
  497. package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
  498. package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
  499. package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
  500. package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
  501. package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
  502. package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
  503. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
  504. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
  505. package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -4
  506. package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
  507. package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
  508. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
  509. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
  510. package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
  511. package/src/shade/wgsl/NOTES.md +0 -4
  512. package/src/view/elements/progress/segmented/segment_frame_transform.d.ts +0 -15
  513. package/src/view/elements/progress/segmented/segment_frame_transform.d.ts.map +0 -1
  514. package/src/view/elements/progress/segmented/segment_frame_transform.js +0 -69
@@ -1,442 +0,0 @@
1
- # Virtual Shadow Map — build-out plan (2026-10-04)
2
-
3
- Branch: `claude/virtual-shadow-map-build-64d4ad`. Nothing lands on master until Alex says so.
4
-
5
- ## The brief
6
-
7
- * Finish the partial VSM in this directory, and give it a playground with debug views and scenes.
8
- * The number of page updates per frame is configurable.
9
- * Moving casters mark the pages they overlap stale. The detection runs **on the GPU in a compute
10
- shader**.
11
- * Page requests come back to the CPU the way VT and VGeo feedback do. There they are prioritised,
12
- allocated, and rendered under the budget.
13
- * Reuse the engine's code; no parallel versions of it.
14
- * An adversarial review at the end.
15
-
16
- ## Forks, settled with Alex before implementing
17
-
18
- * **F1 address space: clipmaps** (camera-centred, toroidal), not the prototype's single quadtree over
19
- a fixed region.
20
- * **F2 page rendering: a pooled view per page render**, reusing the raster/VG path as it is.
21
- * **F3: superseded prototype code is deleted** (D14).
22
-
23
- ## What exists today
24
-
25
- * A mip quadtree over one orthographic light frustum: 16384² virtual, 256 tiles, a 4096²
26
- `depth16unorm` pool.
27
- * A demand pass counting pixels per tile from the main depth, and a coarse-bounds reduction.
28
- * GPU allocation of pages **from zero every frame**. No caching, no invalidation, no page rendering
29
- (`vms_render_tiles.js` is empty), no sampling.
30
- * Nothing reaches it at runtime. `GPUViewLightContext` is never constructed, so `GPUViewShadowMaps`
31
- and `VirtualShadowmapRenderer` are reached only by specs.
32
-
33
- ## The clipmap
34
-
35
- ### Light space
36
-
37
- Light space is the view space of a rotation-only camera at the world origin, oriented as the light.
38
- In `Camera.update_view_matrix` terms:
39
-
40
- * `x = -dot(p, right)`
41
- * `y = dot(p, up)`
42
- * `d = dot(p, forward)`, the distance along the light
43
-
44
- The page grids live on (x, y), anchored to the world, so a page's content does not depend on where
45
- the camera is.
46
-
47
- ### Levels
48
-
49
- * There are `K` levels (default 12). Level `k` has texel `t_k = t_0 · 2^k`, with `t_0` defaulting
50
- to 1 cm.
51
- * Pages are 128 texels with a 4-texel border (`SHADOWMAP_ATLAS_BORDER`, which covers the PCF's
52
- ±3.25-texel footprint), so a slot is 136 texels.
53
- * Page `k` spans `p_k = 128 · t_k` world units. World page `(wx, wy)` at level `k` covers
54
- `[wx·p_k, (wx+1)·p_k) × [wy·p_k, (wy+1)·p_k)`.
55
- * Its parent at level `k+1` is `(wx >> 1, wy >> 1)` — floor division, exact for negatives on int32.
56
-
57
- ### Windows
58
-
59
- Each level keeps an `N×N` window of pages (default N = 64, which is 8192 texels a level).
60
-
61
- * The window origin is `floor(camera_xy / p_k) - N/2`. The CPU computes it and writes it to the
62
- record as integers, so the CPU and GPU agree exactly.
63
- * Cells are toroidal: world page `(wx, wy)` sits in cell `(wx mod N, wy mod N)`.
64
- * When a window scrolls, the CPU evicts only the cells it vacated. That costs O(scroll · N).
65
- * With the defaults, level 0 is selected within about 19 m of the camera. Its window reaches ±41 m.
66
- * The coarsest level's window is ±84 km.
67
- * The origin puts the camera's page N/2 pages in from the window's low edge, so on its high side the
68
- window reaches at least N/2 − 1 = 31 pages past the camera's page.
69
- * The window covers the region where its level is selected whenever
70
- `pixel_angle · (N/2 − 1) · 128 ≥ 2`, a pixel angle of at least 5.0e-4. That is a vertical field
71
- of view of about 31° or more at 1080p, and 57° or more at 4K. (The first draft of this plan had
72
- `N` for `N/2 − 1` and claimed 4x to spare; the review found it.)
73
- * Where it does not hold — a narrow field, a zoom, 4K at 50°, a negative LOD bias — the outer ring
74
- of each level on its high side is served by the next level up that contains the point. A
75
- positive LOD bias widens the margin.
76
-
77
- ### Depth range
78
-
79
- There is one range for the whole clipmap: `[d_c - D, d_c + D]`, where `d_c` is the camera's `d`
80
- snapped to `D/4`. D defaults to 1000 m.
81
-
82
- ### Mip selection
83
-
84
- `k0 = clamp(floor(log2(distance · pixel_angle / t_0) + bias), 0, K-1)`. The demand pass and every
85
- sampler run **one shared chunk**: the first level at or above `k0` whose window holds the point.
86
- So a pixel samples what it asked for, or a coarser resident page.
87
-
88
- The selection is distance-based (the camera position and pixel angle travel in the record), so a
89
- consumer with no neighbouring pixels — volumetrics, OIT, water — can still select a level.
90
-
91
- ### Fallback
92
-
93
- The sampler walks levels upward from the selected one until a resident page is found. The walk is
94
- bounded by `K ≤ 16` and is usually one step.
95
-
96
- VT's quadtree closure does not carry over to toroidal windows: a scroll would rewrite descendants
97
- across levels. So the walk replaces it.
98
-
99
- ## Where it lives: existing structures, no new bindings
100
-
101
- ### Pool
102
-
103
- The pool is a `bind()`-ed rect of the shadow atlas (`GPUSceneShadowmapContext.bind`,
104
- `MaxRectanglesPacker`, depth32float). At 4080² it holds 900 slots shared by every level.
105
-
106
- ### Light database
107
-
108
- Every lighting consumer already binds the light database. It gains three tables:
109
-
110
- * `shadow_virtual` — one record per map. It holds:
111
- * the light view (mat4);
112
- * the per-level window origins (`array<vec2i,16>`);
113
- * near/far;
114
- * `t_0`, K, N, page size, border, pool origin, slots per axis;
115
- * the main camera position and pixel angle, and the LOD bias;
116
- * the first rows and counts of its two runs (ranges, non-owning).
117
- * `shadow_virtual_page` — `K·N²` u32 rows, level-major, toroidal cell order. Each is a VT entry,
118
- `vt_entry_pack(phys_x, phys_y, level)`, or `VT_ENTRY_INVALID`.
119
- * `shadow_virtual_slot` — one row per physical slot: the world page it holds (level, wx, wy, valid).
120
- The stale test reads it.
121
-
122
- `shadow_directional` gains a nullable `virtual_map` link. `CSM_SHADOWMAP_STRUCT` becomes
123
- `DIRECTIONAL_SHADOWMAP_STRUCT`. `shadowmap_sample_directional` branches on the link, and the CSM path
124
- is untouched.
125
-
126
- ## Reused
127
-
128
- | Need | From |
129
- |---|---|
130
- | Slots, LRU, protect window, finest-first tie-break | `VTPhysicalCache`'s bookkeeping, split out of its textures with no behaviour change; the VT specs keep pinning it |
131
- | Page-table entry encode/decode | `vt_entry_pack`/`unpack`/`VT_ENTRY_INVALID`; the WGSL `vt_entry_unpack` lifted from `build_chunk_vt_lookup` into the static `chunk_vt_page_table_entry` that `VT_CONSTANTS` already names (a dangling link today) |
132
- | Readback | `graph_read_buffer`, with the in-flight cap that skips the frame when full (VT 3, VGeo 2) |
133
- | Choosing the frame's pages | `IndexedFloatMaxHeap` drained to the budget, as `ShadowmapDrawSelector` does |
134
- | Rendering a page | `RasterizationJob` + `execute_rasterization_jobs`, the shadow pass descriptors, a viewport into the atlas, exactly `#draw_direct`; meshlets, alpha-tested and **VG cut-per-view** come with it |
135
- | Sampling a page | `sample_shadowmap_atlas_for_light(page_view_projection, …, slot_rect)`: CSM's and spots' own bias and 5-tap PCF |
136
- | Map lifecycle | `Shadowmap`, `ShadowmapRegistry`, `process_lights`' rebuild-on-settings-change (the tetrahedron and cascade-count precedent) |
137
- | Mover inputs | `meshes.bounding_box`, `transforms.global`/`prev_global`, the `MESHES_TABLE` page iterator (the `shader_csm_caster_range` shape), the skinning bindings |
138
- | Compute passes | `ComputeShader` + `ShaderResourceSetDescriptor`, immediates for small per-dispatch state |
139
- | Debug | `RenderExtension` (`BeforePresent`/`Overlay`), `graph_image_pass`, the turbo depth map of `draw_texture_as_rgba` |
140
-
141
- ## Decisions
142
-
143
- **D5 Demand (GPU, per main-view pixel).**
144
- - The pass reads depth and computes the world position, then the level, the world page and the
145
- toroidal cell.
146
- - It does an `atomicAdd` on the cell's counter. The add is subgroup-aggregated when all of a
147
- subgroup's lanes hit one cell.
148
- - The lane that sees the old value 0 appends `[level, wx, wy, count, d]`. `d` is that pixel's light
149
- depth, used when a light changes. Dedupe and append happen in one step.
150
- - A fixed-size gather writes the final counts into the list.
151
- - No ancestors are requested by the GPU, per NOTES.md.
152
-
153
- **D6 Movers (GPU, scene-level, once a frame).**
154
- - The pass runs over every mesh-row slot, including slots in pages since freed. It uses the
155
- page-iterator dispatch and covers a high-water mark of rows.
156
- - It keeps a per-row buffer of the "bounds last seen". Since 2026-10-27 the scene owns the pass and
157
- the buffer (`GPUSceneContext.graph_movers`, `scene/movers/`), and the maps' stale pass is one
158
- reader of its list among others (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md D32).
159
- - A row is a mover when **any** of these holds:
160
- 1. `global != prev_global` — every rigid change, AABB-invariant rotations included;
161
- 2. its world box, geometry or material differs from the one last seen — appear, remove, mesh or
162
- material swap, deformation that changes bounds;
163
- 3. it is skinned and a joint's skin matrix differs from last frame's, which the animation manager
164
- keeps for motion vectors — a pose that changes inside the box. (The first build listed every
165
- skinned mesh every frame, by category; the review found it.)
166
- - The mover's `cur ∪ last` world box is appended to a list with capacity 4096.
167
- - The test is observed, not declared (the `LastUpdateFrame` shape).
168
-
169
- **D7 Stale (GPU, per map).**
170
- - An indirect `(ceil(slots/64), movers, 1)` dispatch: one workgroup per mover, one lane per slot,
171
- **no per-thread loop**.
172
- - Each lane widens the slot's page rect by its border, and tests it against the mover box projected
173
- through the light view.
174
- - On a hit, `atomicExchange(&stale[slot], 1) == 0` appends the slot to the stale list.
175
- - If the mover count exceeds capacity, every occupied slot is marked stale, and the overflow is
176
- counted.
177
-
178
- **D8 Readback.**
179
- - One transient feedback buffer per map, cleared with the encoder (never queue-written: the
180
- `framegraph-buffers-are-pooled` rule).
181
- - It holds a header (counts and drops), the request list, and the stale list.
182
- - Up to 3 readbacks are in flight. Each reading carries its frame.
183
- - Readings older than the map's last invalidation are dropped.
184
-
185
- **D9 CPU page manager** (`VSMPageManager`, pure CPU and specced on its own).
186
- - **Each reading** replaces the want set, because each reading is a whole-frame snapshot.
187
- - It touches the resident pages, and the serving fallback of every missing page.
188
- - It sets the per-slot stale flags, unless the slot was rendered at or after the reading's frame.
189
- - **Each frame**, candidates are drained from a max-heap to `page_budget`:
190
- - **Uncovered** wanted pages are those with no resident page anywhere up their chain. Each is
191
- covered by **one** page `COVER_STEP = 3` levels up, deduped per cell by frame stamp, before
192
- anything finer. A cover page is drawn only because pixels are about to sample it, which keeps to
193
- NOTES.md's "coarse tiles only when used".
194
- - **Stale and wanted** pages come next, ordered by pixel count.
195
- - **Missing but covered** pages come last, by pixel count, coarser first on ties.
196
- - A missing page takes a free slot, or evicts the least recently touched page outside the protect
197
- window. If nothing qualifies, it is refused and counted.
198
- - Rows change only on delta: page-table rows on install, evict and scroll, slot rows on install and
199
- evict. They are written before `draw()`'s existing `database.update`.
200
-
201
- **D10 Light change.** A change of the light's rotation, or of the snapped depth centre, means:
202
- - every page is evicted;
203
- - readings recorded before the change are dropped;
204
- - the last want set is **re-projected** into the new light space, through each want's page centre
205
- and representative `d`, so wants exist the same frame;
206
- - everything is now uncovered, so a few cover pages render first, the same frame.
207
-
208
- Shadows go coarse and refine at the budget rate. They are never sampled through a projection they
209
- were not rendered with.
210
-
211
- **D11 Rendering.**
212
- - One pooled `View` + `OrthographicCamera` per budget unit, from the shadow context's own
213
- `ViewManager` (VG `tau_scale` 2, like the cascades).
214
- - A page sets the light rotation and its border-widened ortho planes, and runs
215
- `RasterizationPipelineType.Fast`: the point-light path, without an HZB. A pooled view's previous
216
- HZB belongs to another page, and occlusion buys nothing on a 136² viewport.
217
- - All of a frame's page jobs go into one graph, as `#draw_direct` does with cascades.
218
- - Sampling widens the projection by the same border, so the page edges match what was rendered.
219
-
220
- **D12 Selection and knobs.**
221
- - `Renderer.feature_virtual_shadow_maps` (off by default) switches every directional light to VSM.
222
- - A flip rebuilds the maps in `process_lights`, like `feature_tetrahedron_point_shadows`.
223
- - `shadow_virtual_page_budget` (default 8) is the brief's page updates per frame.
224
- - `shadow_virtual_lod_bias` (0).
225
- - `shadow_virtual_first_texel_size` (0.01 m). Changing it rebuilds the maps.
226
-
227
- **D14 Deleted**, along with its specs:
228
- - `vsm_tile_allocation_pipeline`;
229
- - `vms_pipeline_compute_coarse_bounds` and `debug_inspect_coarse_bounds_buffer`;
230
- - `VirtualShadowmapRenderer`, `GPUViewShadowMaps`, `GPUViewLightContext`;
231
- - `GPUVirtualShadowTextureResidence`;
232
- - `render/vms_render_tiles.js`;
233
- - `VSM_UNIFORMS_STRUCT`;
234
- - `decode_tile_address` and `debug_inspect_residence_buffer` (quadtree-only).
235
-
236
- The demand pass is the prototype's residence pass reworked, and `VirtualShadowMap` evolves in place.
237
-
238
- ## Frame timeline
239
-
240
- ```
241
- frame N head: readings delivered since N-1 → want set, touches, stale flags
242
- select_for_draw: map.update — light view, windows (scroll → evict), invalidation, record
243
- → candidates → heap → page_budget jobs; allocate/evict → row deltas
244
- draw: page jobs (Fast, pooled views) into slots; records; database.update
245
- Shading graph, after the G-buffer:
246
- movers (scene, once) → per map: demand, gather, stale args, stale test → readback
247
- lighting: shadowmap_sample_directional → virtual_map? → level walk → VT entry →
248
- sample_shadowmap_atlas_for_light(page VP, slot rect)
249
- frame N+2..3 reading N lands, applied at the next head
250
- ```
251
-
252
- A mover's shadow lags by the readback latency (2–3 frames) plus its place in the queue. That lag
253
- comes with CPU scheduling, which the brief asks for. On the mover itself it reads as acne; see Known
254
- limits.
255
-
256
- ## Playground: `src/shade/playground/vsm/`
257
-
258
- **Scenes.**
259
- * **Courtyard:** ground, pillars, walls, an overhang, thin poles at distance, a long avenue reaching
260
- out through the clipmap levels, and movers (orbiting boxes, a pendulum, a bobbing sphere).
261
- * **Crowd:** N wandering boxes, adjustable past the 4096 mover capacity.
262
- * A **sun sweep** toggle in either scene.
263
-
264
- **Controls.**
265
- * VSM/CSM A/B.
266
- * Page budget, LOD bias, first texel size.
267
- * Movers and sun sweep on/off.
268
- * Camera fly-through presets.
269
- * Freeze residency (stop applying readings).
270
-
271
- **Debug views.**
272
- 1. A screen overlay, through an extension, showing one of: the serving level as a ramp; the deficit
273
- (desired − serving), red; page id hash, to show page edges; the plain shadow factor.
274
- 2. The physical pool, in the Overlay phase: turbo depth with the slot grid tinted by state (free,
275
- resident, stale, rendered this frame).
276
- 3. The clipmap, from CPU state on a 2D canvas: one panel per level for the N×N window, with
277
- resident, wanted, stale and uncovered cells, and the camera.
278
- 4. Stats:
279
- - wants, uncovered and stale per reading;
280
- - renders this frame, and the backlog;
281
- - movers and overflow;
282
- - pool use, evictions, refusals;
283
- - scroll evictions;
284
- - invalidations;
285
- - readbacks in flight and dropped.
286
-
287
- **Console.**
288
- - `vsm_lab` exposes `renderer`, `scene`, `map()`, `stats()` and `step(n)`.
289
- - `verify()` holds the animation still across its readbacks. It checks that the page-table rows equal
290
- the CPU's residency, that the slot rows agree, that no world page has two slots, and that a still
291
- scene converges to "nothing uncovered, nothing missing" within the expected number of frames.
292
-
293
- ## Work, as commits (each green)
294
-
295
- 1. VT extraction: the `VTPhysicalCache` slot base and `chunk_vt_page_table_entry`.
296
- 2. Light database: the `DIRECTIONAL_SHADOWMAP_STRUCT` rename + `virtual_map`, and the three VSM
297
- tables with links and ranges. CSM writes NULL.
298
- 3. Shared chunks: light-space, level selection, world page and toroidal cell, the page VP mirroring
299
- `ortho_reverse_z`, and the lookup with its level walk.
300
- 4. `VSMPageManager`: readings, want set, cover, priority, heap, allocation and eviction, windows and
301
- scroll, invalidation and re-projection, row deltas, debug accessors.
302
- 5. Shadow-context integration: the `process_lights` branch, settings pushes, page jobs in `draw`,
303
- records, evict and teardown.
304
- 6. GPU feedback: demand, gather, movers, stale test, readback, and the Renderer hook beside VT's.
305
- 7. Sampling: the `shadowmap_sample_directional` branch.
306
- 8. Deleting the superseded files (D14).
307
- 9. The playground, its scenes and debug views.
308
- 10. Adversarial review, and its ledger worked red-then-green.
309
-
310
- ## Tests, by tier (no mocks, hooks or `.each`; helpers inside the specs)
311
-
312
- * **Tier 1:** every new WGSL module validated.
313
- * **Tier 2 (emulator):**
314
- - level selection against a distance oracle, with the window fallback;
315
- - world page and cell for negative coordinates;
316
- - **the page VP built in WGSL equals the CPU page camera's VP** (render/sample agreement);
317
- - the lookup's level walk;
318
- - the demand kernel on synthetic depth, giving the list plus counts;
319
- - movers on real `gpu_database_words`: a still row, a moved row, appear, remove, mesh swap,
320
- and a row in a freed page;
321
- - the stale test: hit, miss, dedupe, overflow.
322
- * **Tier 3 (SoftwareGPUDevice):**
323
- - `process_lights` builds, rebuilds and evicts VSM maps, handing back the pool rect and rows;
324
- - `draw` encodes at most `budget` page passes, with viewports exactly on slots;
325
- - the host-written page and slot rows;
326
- - readback scheduling and its cap;
327
- - a teardown leak spec.
328
- * **CPU:**
329
- - priority, budget, and covers ahead of everything else;
330
- - LRU and the protect window;
331
- - the stale guard by frame;
332
- - scroll eviction;
333
- - invalidation and re-projection;
334
- - a random fuzz holding "page rows == residency".
335
- * **Tier 4:** a one-off headless-Chrome drive of the playground, reported and not committed:
336
- pictures, `verify()`, stats, and paired frame times at budgets 1/8/32, a few hundred frames.
337
-
338
- ## Known limits (stated, not fixed here)
339
-
340
- * A page drawn under a clamped VG cut stays coarse until it is invalidated. The pooled view does not
341
- keep per-page attribution for `caster_detail_pending`. This is a fact about the code; its cost has
342
- not been measured.
343
- * Demand and level selection follow the main view.
344
- * Continuous light rotation invalidates every frame. Caching then buys nothing, and the budget bounds
345
- what is drawn (UE's VSM has the same property).
346
- * Casters further than D along the light from the camera's snapped depth are clipped. A receiver
347
- past the far end is shadowed only by casters drawn inside the range: the atlas sampler holds its
348
- reference depth just above the cleared value, where it would otherwise read shadowed everywhere.
349
- * A change to a material's parameters — the same material, a new dissolve cutoff — is not a mover.
350
- * ~~A shadow starts 1–1.5 texels of its page short of where a caster meets the ground.~~ Closed
351
- 2026-10-04: every shadow caster is now drawn by its front faces, as the main view draws it. Back-face
352
- casting stacked on the shared rasterizer slope bias (`DEPTH_STENCIL_STATE_SHADOW`) had pushed a
353
- caster's steep far face past the ground near its base, in every shadow type. Point lights needed
354
- their sampler's depth bias made texel-scaled to stay clean on front faces.
355
- * **A mover self-shadows against its own stale image.** A stale slot reaches the CPU by readback, so a
356
- page holding a mover is 0–5 frames old when it is sampled, about 1.6 on average (courtyard, budget
357
- 64). Front-face casting puts that image on the mover's own lit faces, which read as hatched.
358
- - Measured on an RTX 4090 in headless Chrome, the same pose through stale pages against freshly
359
- drawn ones: pages 1, 2 and 3 frames stale, at the orbiters' motion at 140 fps, darken 27%, 47% and
360
- 52% of an orbiter's pixels by more than 10%. Cascades, which redraw every frame: 0%. Back faces
361
- cast in the same arms: 0–0.7%.
362
- - Fresh pages are clean, so the bias is sufficient. Bias cannot absorb staleness: a motion Δ over
363
- the latency needs |Δ·n| / cos θ of clearance, up to about 18 cm (9–18 texels at levels 0–1) for
364
- three frames at 3.6 m/s.
365
- - Removing it means drawing a mover's pages in the frame it moves, as UE 5.4 does: it invalidates
366
- the old footprint during the scene update and draws a moved instance into every allocated page.
367
- At the playground's close framing about 24 wanted pages hold a mover each frame, against 7 pages
368
- drawn per frame now.
369
- * Below the window coverage condition (see Windows), each level's outer ring is served a level
370
- coarser.
371
-
372
- ## Status (2026-10-04, branch only)
373
-
374
- Landed as planned, with these departures, each made when the code or a measurement asked for it:
375
-
376
- * **Window corners are a table** (`shadow_virtual_level`), not an array in the record: a by-value
377
- record array indexed by level spills to local memory (the CSM 217→80 µs lesson).
378
- * **Stale flags persist** on the GPU until a readback lists them, so a frame whose readback the cap
379
- skipped loses no movers.
380
- * **Priority is aged.** Covers first; stale and missing pages compete by
381
- `log2((1 + importance)(1 + frames waited))`, the weighting `compute_shadowmap_update_score` uses.
382
- Strict "stale before missing" starved missing pages for as long as anything moved: the 5000-walker
383
- crowd left 217 waiting.
384
- * **Pixels are weighed by where they are on screen.** The demand pass adds each pixel's weight under
385
- the automatic exposure's metering mask (`chunk_screen_importance`, moved out of the exposure's
386
- histogram shader so both share it): 64 at full importance over most of the screen, falling over
387
- 13% of its height in from each edge, never below 1. So a page wanted in the middle of the view
388
- outranks one wanted by as many pixels at its edge, and the middle resolves first.
389
- * **An uncovered page is offered itself** beside its cover, so a budget with room fills both the same
390
- frame.
391
- * **Agreement in the demand pass** is `subgroupMin == subgroupMax`. The emulator has no
392
- `subgroupAll`, and this form is exact on a device.
393
- * **The cell index uses `u32()` per component**: the emulator returns NaN components for a vector
394
- `bitcast` between i32 and u32.
395
- * **Engine fixes found on the way:**
396
- - the GPU database's WGSL serde gains i32/vec2-4i;
397
- - `read_wgsl_type_value` read signed vectors into a `Uint32Array` (negatives came back as their bit
398
- patterns).
399
-
400
- **Measured** on an RTX 4090, headless Chrome, 1600×900, courtyard, paired arms in one launch:
401
- - GPU per frame is 734–758 µs at budget 0, 779–795 at budget 1, 1072–1076 at budget 8 (7.1–7.5 pages),
402
- and 1273–1305 µs for 3 cascades.
403
- - A page costs about 40–45 µs GPU and about 85 µs CPU.
404
- - The feedback passes cost about 59 µs, the demand pass 46 of it.
405
- - `verify()` passes: GPU page table, slots and windows equal the CPU's after settling.
406
-
407
- So the pooled-view cost (F2) is measured: at budget 8 it is CSM's CPU cost and less than CSM's GPU
408
- cost in this scene.
409
-
410
- The sun sweep at 0.05 rad/s falls back to cover pages every frame, which is the light-change limit
411
- above, observed.
412
-
413
- ## Adversarial review (2026-10-04)
414
-
415
- Four reviewers, one dimension each: GPU shaders and dispatch, the page manager and integration,
416
- regressions and house rules, and the playground. The findings are in `REVIEW_LEDGER.md`, worked in
417
- order of severity, each pinned by a test that failed first wherever a test can see it, and each in a
418
- commit of its own. Among them:
419
-
420
- * **A receiver past the far end of the depth range read black.** Fixed in the shared atlas sampler.
421
- * **The bias was sized off the page's matrix**, which takes in the depth range as the sun climbs: 29 m
422
- a texel straight overhead. The virtual sampler hands the atlas sampler the page's texel.
423
- * **A light turning every frame lost every reading**, older than the cutoff each time. Readings are
424
- now carried from the light space they were recorded under, 16 remembered.
425
- * **A camera on a snap plane moved the depth range every frame.** The range re-centres only once the
426
- camera is a whole snap from its centre.
427
- * **Skinned meshes were movers by category**, and **mesh or material swaps were missed.**
428
- * The rest are smaller: the budget remainder, the pool search after a refusal, the dispatch fold,
429
- the readback stamps of a new view, the playground's `verify()`, inset, crowd and controls.
430
-
431
- **Measured on the device after the fixes** (RTX 4090, headless Chrome):
432
- * The demand pass's subgroup counting is exact. Every pixel on the ground gave requests whose pixel
433
- counts summed to the 1,265,556 pixels of the view, with no page asked for twice.
434
- * The movers' wave-aggregated append listed 400 of 400 moving walkers.
435
- * `verify()` passes on both scenes, with the new record and page-to-slot-to-page checks.
436
- * **The virtual path costs the cascades about 2.4 µs.** Every directional shader carries the virtual
437
- branch, uniform but compiled in. With cascades, deferred shading took 48.1–49.2 µs with it and
438
- 46.1–47.1 µs with the branch stripped, over three launches a side alternated at 1578×802, and
439
- volumetric lighting about 1 µs more. Open: taking it out would mean a lighting shader per
440
- technique.
441
- * The cascades share the matrix-read bias scale the virtual pages had, but measure 1.0–1.4x their
442
- true texel from 45° to 89° of elevation: their depth ranges are fitted, so it stays small.
@@ -1,43 +0,0 @@
1
- # Virtual shadow map — adversarial review ledger (2026-10-04)
2
-
3
- There were four reviewers, each covering one dimension:
4
-
5
- - **G**: shaders and dispatch.
6
- - **CPU**: page manager and integration.
7
- - **R**: regressions, house rules and test quality.
8
- - **P**: playground and debug views.
9
-
10
- Each row is worked red-then-green where a test can see it. "Device" means checked once on the RTX 4090 outside the repo, and reported in the commit.
11
-
12
- | # | Severity | Finding | Status | Pinned by |
13
- |---|---|---|---|---|
14
- | 1 | major | Turning VSM off left `shadow_directional.virtual_map` naming the freed row; the sun went unshadowed (R1) | fixed `0189945bd` | VirtualShadowMap.spec, the flip test |
15
- | 2 | major | Light rotating every frame: every reading is older than the cutoff and dropped, and the wants freeze and drift (CPU1) | fixed: readings carried through the view they were recorded under (16 light spaces remembered) | VSMPageManager.spec, the two "carried" tests |
16
- | 3 | major | Per-view `frame_index` restarts with a new camera; the map drops readings until it catches up (CPU2) | fixed: each map keeps its own count | graph_vsm_feedback.spec, the second-camera test |
17
- | 4 | major | Skinned rows are movers by category, every frame, idle or not (R6) | fixed: a skinned mesh is a mover when a joint's skin matrix differs from last frame's; the binding carries its joint count | shader_vsm_movers.spec, the skinned test; GPUMeshSkinningContext.spec, the matrices test |
18
- | 5 | major | `verify()` "settles" passes vacuously when every page is refused, and needs no reading taken after the freeze (P1) | fixed: needs a reading recorded after the stop that wants pages; refused pages count as waiting (row 11) | device: both scenes pass |
19
- | 6 | major | The inset's red edge shows GPU flags the compact pass has already cleared, not the CPU's stale state (P2) | fixed: the overlay uploads the page manager's stale state; a stale slot is washed red | device: screenshot of the crowd |
20
- | 7 | major | Each crowd resize leaks a whole scene's GPU state (P3) | fixed: the crowd resizes in place | device: 200 to 400, same scene |
21
- | 8 | minor | Depth snap has no hysteresis: a camera on a snap plane invalidates almost every frame (CPU3) | fixed: the range re-centres only once the camera is a snap from its centre | VirtualShadowMap.spec, the snap-plane test |
22
- | 9 | minor | A pool that does not fit allocates about 2.3 MB of manager arrays per retry, every frame (CPU4) | fixed: the pool is bound before the map is built | none: the allocation is not visible through the API |
23
- | 10 | minor | The budget remainder always goes to the first suns: with budget < suns, later suns starve (CPU5) | fixed: the remainder goes round the maps a frame at a time | VirtualShadowMap.spec, the two-suns test |
24
- | 11 | minor | After one refusal, `select` keeps draining the heap, scanning 900 slots per candidate (CPU6) | fixed: no slot search after the first refusal of a frame; the backlog counts the refused | VSMPageManager.spec, the full-pool test |
25
- | 12 | minor | The mover tracker outlives the feature (R2) | fixed: destroyed on the first frame with no virtual map | none: the tracker is private |
26
- | 13 | minor | Every directional-shadow shader carries the virtual path; cost not measured (R3) | measured, open: with cascades, deferred shading costs 48.1–49.2 µs with the path and 46.1–47.1 µs without (+2.4 µs, 5%), volumetric lighting +1 µs; RTX 4090, 1578×802, three launches a side alternated | device A/B, not committed |
27
- | 14 | minor | `afterEach` hooks in new specs (R4); vacuous assertions (R5) | fixed: hooks gone; the cover test derives its level from the constant | |
28
- | 15 | minor | The mover dispatch has no fold: 65,535 × 128 rows is a hard cap (R7) | fixed: folded into rows of 65,535 workgroups | shader_vsm_movers.spec, the folded test |
29
- | 16 | minor | Subgroup aggregation in demand and append is never exercised; the emulator is one lane wide (R/T2) | checked on the device: the requests' pixel counts summed to all 1,265,556 pixels with no page twice; 400 of 400 moving walkers listed | device, not committed |
30
- | 17 | minor | The rows spec reads the CPU copy, not what reaches the device (R/T3) | fixed: entries, slots and windows read from the database's flushed words | VirtualShadowMap.spec, the rows test |
31
- | 18 | minor | No test of the budget split or of two suns (R/T4) | fixed with row 10 | VirtualShadowMap.spec, the two-suns test |
32
- | 19 | minor | `verify()` readback runs while frames continue; record row not read back; no GPU cell↔slot check; TypeError on missing rows (P4, P5) | fixed: page updates held across the readback; record, rows present, and page to slot to page checked | device: both scenes pass |
33
- | 20 | minor | The overlay's doc claims more than it checks (P6); it draws last frame's map on a scene switch (P7) | fixed: doc says what it runs; the map is assigned before the render | |
34
- | 21 | minor | `configure({scene})` does not switch scenes; a reload restores the dropdown but not the scene (P8); status line stuck (P9) | fixed | device: configure switches both ways, status returns |
35
- | 22 | minor | README overstates "pause"; per-frame allocations in the playground; bfcache `pagehide` (P10–P12) | fixed: wording; no per-frame state objects, aim_sun keeps scratch; reload on a persisted pageshow, as caldera does | |
36
- | 23 | minor | CHANGELOG entry missing; PLAN.md untracked (R10) | fixed | |
37
- | 24 | major | A receiver past the far end of the depth range reads shadowed against a slot nothing was drawn into: ground over ~1 km down-sun under a 30° sun, all of it from 1.1 km up under a high one (G1) | fixed: the atlas sampler holds the reference depth just above the cleared value | chunk_shadowmap_sample_virtual.spec, the "beyond the far end" test |
38
- | 25 | major | The bias is sized by a texel read off the page's matrix, which takes in the depth range as the sun climbs: 1.4x the true texel at 45°, 5.8x at 80°, 29 m straight overhead (G2) | fixed: the virtual sampler hands the atlas sampler its page's texel | chunk_shadowmap_sample_virtual.spec, the "overhead sun" test |
39
- | 26 | minor | A mesh or material swapped in place, box and transform unchanged, is not a mover (G3) | fixed: the pass remembers each row's geometry and material with its box (8 words a row) | shader_vsm_movers.spec, the "in place" test |
40
- | 27 | minor | PLAN's window coverage condition is off by two: a level's window reaches 31 pages on its +x/+y side, so a view needs a pixel angle of at least 5.0e-4 (about 31° vertical field at 1080p, 57° at 4K), not 2.4e-4; below it the outer ring of each level is served one level coarser (G4) | PLAN corrected, and the coarser ring listed as a known limit; argued, not measured | |
41
- | — | note | verify script ships (R8): precedent `skinned_blas_refit/verify_*.js`; the owner's call | no change | |
42
- | — | note | Per-frame graph and job objects (R9): the `#draw_direct` pattern, scaling with the page budget only | no change | |
43
- | — | note | The cascades share the matrix-read bias scale of row 25: measured at 1.0–1.4x their true texel from 45° to 89°, their depth ranges being fitted | no change | device, not committed |