@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,246 +1,246 @@
1
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
- import { F16_MAX_DEFINITION } from "../../shader/chunk/math/F16_MAX_DEFINITION.js";
3
- import { ComputeShader } from "../../shader/ComputeShader.js";
4
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
5
- import { SAMPLER_LINEAR_UPSCALE } from "../../texture/SAMPLER_LINEAR_UPSCALE.js";
6
- import { chunk_nss_find_nearest_depth } from "./chunk_nss_find_nearest_depth.js";
7
- import { chunk_nss_luma_derivative } from "./chunk_nss_luma_derivative.js";
8
- import { NSS_WORKGROUP_SIZE } from "./NSS_CONSTANTS.js";
9
- import { NSS_SETTINGS_STRUCT } from "./NSS_SETTINGS_STRUCT.js";
10
-
11
- /**
12
- * NSS preprocess pass. Runs at render-resolution (one thread per render-res
13
- * pixel) and produces:
14
- * 1. The 12-channel network input tensor, packed into a single rgba16f
15
- * 3D storage texture with depth=3 (channels 0..3, 4..7, 8..11).
16
- * 2. The encoded "nearest depth offset" used by postprocess to dilate
17
- * velocity at output-res (`tNearestOffset` — components in [0, 1]
18
- * decode to {-1, 0, 1}² via `(x*2 - 1)`).
19
- *
20
- * Per-pixel logic (matches the algorithm in ARM's `Preprocess()`):
21
- * 1. Dilate depth over a 3×3 neighbourhood, remember the offset of the
22
- * nearest sample.
23
- * 2. Sample velocity at the dilated coord.
24
- * 3. Project to the previous frame, sample warped history (bilinear).
25
- * 4. Read the FSR2 depth-clip confidence from the upstream pass and
26
- * invert it into the network's "high = disocclusion" convention.
27
- * 5. Sample the warped feedback tensor (bilinear).
28
- * 6. Compute the luma derivative between current and warped history.
29
- * 7. Pack everything into the output tensor — colours
30
- * tonemapped via `Tonemap(EXPOSURE * raw)` to match ARM's training
31
- * distribution.
32
- *
33
- * @see ARM NSS reference: `Preprocess` in
34
- * `Source/NG-SDK/sdk/include/FidelityFX/gpu/nss/ffx_nss_preprocess.h`
35
- */
36
- const resources = new ShaderResourceSetDescriptor();
37
- resources.createGroup()
38
- .addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
39
- // ── inputs at render-res ──
40
- .addTexture("tColour", "float") // jittered scene colour, render-res
41
- // depth32float can't be bound as 'float' (filterable) — WebGPU only
42
- // accepts depth textures via 'unfilterable-float' in this context.
43
- // We only ever read this via textureLoad inside the depth dilation.
44
- .addTexture("tDepthCurrent", "unfilterable-float")
45
- .addTexture("tVelocity", "float") // pixel-space motion vectors, render-res
46
- // FSR2 depth-clip confidence (1 = trust history, 0 = disocclusion)
47
- // produced by the engine's shared shader_depth_occlusion_clip pass.
48
- // We invert it into ARM's "high = disocclusion" network input.
49
- .addTexture("tDisocclusionConfidence", "float")
50
- // ── inputs at output-res / feedback at render-res ──
51
- .addTexture("tHistory", "float") // previous frame upscaled colour, output-res
52
- .addTexture("tFeedbackIn", "float") // 4-ch feedback tensor from previous frame, render-res
53
- // ── settings ──
54
- .addUniform("settings", NSS_SETTINGS_STRUCT)
55
- // ── outputs ──
56
- // Single rgba16f 3D storage texture holds the 12-channel input tensor
57
- // packed across depth=3 layers (4 channels each). rgba16f gives the
58
- // network ~10 bits of mantissa per channel, which is plenty for
59
- // normalized [0, 1] inputs after the network's first BN/scale.
60
- .addStorageTexture("tTensor", "rgba16float", "3d", "write-only")
61
- // Nearest-depth offset packed as (dx+1, dy+1) / 2 -> [0, 1]. Postprocess
62
- // uses this to fetch the velocity at the dilated coordinate when warping
63
- // the history at output-resolution.
64
- .addStorageTexture("tNearestOffset", "rg8unorm", "2d", "write-only")
65
- ;
66
-
67
-
68
- const body = CodeChunk.from(
69
- //language=WGSL
70
- `
71
- const NSS_EXPOSURE: f32 = 7.38905609893; // e^2 — matches ARM's NSSCommon.ush
72
-
73
- // Karis tonemap (max-of-channels), applied to EXPOSURE-scaled colour.
74
- // ARM's training distribution: Tonemap(EXPOSURE * raw) -> network input.
75
- fn nss_tonemap_exposure(rgb: vec3<f32>) -> vec3<f32> {
76
- let finite = select(vec3<f32>(0.0), clamp(rgb, vec3<f32>(0.0), vec3<f32>(F16_MAX)), rgb == rgb);
77
- let scaled = finite * NSS_EXPOSURE;
78
- let m = max(max(scaled.r, scaled.g), scaled.b);
79
- return scaled / (1.0 + m);
80
- }
81
-
82
- // ARM's network was trained against inputs that go through their Quantize
83
- // formula: int8 = round(fp * 255 - 128). The conv then sees (uint8 - 128)
84
- // = signed int8 in [-128, 127] - i.e. fp 0 -> -128, fp 0.5 -> 0, fp 1 -> 127.
85
- // Our pipeline naively feeds fp [0, 1] which has DC offset +0.5 vs ARM's
86
- // expected DC of 0. The trained head biases were calibrated against that
87
- // near-zero DC, so feeding +0.5 puts every conv accumulator off by
88
- // (sum_of_weights * 0.5 * 255) - way outside the trained operating range.
89
- //
90
- // We use the SMOOTH (no-round) version of ARM's transform: a linear
91
- // remap [0, 1] -> approx [-1.008, 1.008] clamped to [-1, 1]. Matches
92
- // ARM's DC shift but without the round() discontinuities that caused
93
- // feature-dependent flickering when small jitter-driven input changes
94
- // pushed pixels across quantization boundaries. Network sensitivity to
95
- // near-boundary inputs would otherwise flip int8 outputs by 1/127 per
96
- // frame and propagate through every layer.
97
- //
98
- // Per-multiply lands at ~(ARM signed * int8_w) / 127^2, so our acc is
99
- // approx (ARM int32_acc / 127^2). Our rescale_factor (= 127 * mult /
100
- // 2^shift) then produces value_fp ~ int8_in / 127 going into the LUT -
101
- // the shape ARM's network was trained to produce.
102
- fn nss_arm_quantize(fp: f32) -> f32 {
103
- return clamp(fp * (255.0 / 127.0) - (128.0 / 127.0), -1.0, 1.0);
104
- }
105
-
106
- fn nss_arm_quantize_v3(rgb: vec3<f32>) -> vec3<f32> {
107
- return vec3<f32>(nss_arm_quantize(rgb.r), nss_arm_quantize(rgb.g), nss_arm_quantize(rgb.b));
108
- }
109
-
110
- fn nss_arm_quantize_v4(v: vec4<f32>) -> vec4<f32> {
111
- return vec4<f32>(nss_arm_quantize(v.x), nss_arm_quantize(v.y), nss_arm_quantize(v.z), nss_arm_quantize(v.w));
112
- }
113
-
114
- fn nss_warp_history_sample(prev_uv: vec2<f32>) -> vec3<f32> {
115
- let on_screen = all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0));
116
- if (!on_screen) {
117
- return vec3<f32>(0.0);
118
- }
119
- // ARM uses bilinear (LoadHistory in ffx_nss_callbacks_glsl.h:471);
120
- // Catmull-Rom is opt-in via HISTORY_CATMULL define.
121
- return max(vec3<f32>(0.0), textureSampleLevel(tHistory, sLinear, prev_uv, 0.0).rgb);
122
- }
123
-
124
- fn nss_warp_feedback_sample(prev_uv_render: vec2<f32>) -> vec4<f32> {
125
- let on_screen = all(prev_uv_render >= vec2<f32>(0.0)) && all(prev_uv_render <= vec2<f32>(1.0));
126
- if (!on_screen) {
127
- return vec4<f32>(0.0);
128
- }
129
- return textureSampleLevel(tFeedbackIn, sLinear, prev_uv_render, 0.0);
130
- }
131
-
132
- @compute @workgroup_size(${NSS_WORKGROUP_SIZE}, ${NSS_WORKGROUP_SIZE}, 1)
133
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
134
- let render_res_u = settings.render_resolution;
135
- let render_res = vec2<i32>(render_res_u);
136
-
137
- if (any(gid.xy >= render_res_u)) {
138
- return;
139
- }
140
-
141
- let st = vec2<i32>(gid.xy);
142
-
143
- // 1. Depth dilation
144
- var nearest_off = vec2<i32>(0, 0);
145
- let _dilated_depth = nss_find_nearest_depth(tDepthCurrent, st, render_res, &nearest_off);
146
-
147
- // 2. Velocity at the depth-nearest tap (FSR2 strategy — sharpens
148
- // silhouettes at disocclusion vs picking velocity at the centre).
149
- let velocity = textureLoad(tVelocity, st + nearest_off, 0).rg;
150
-
151
- // 3. Reproject to previous frame
152
- let st_centre = vec2<f32>(st) + 0.5;
153
- let prev_st_render = st_centre - velocity;
154
- let prev_uv_render = prev_st_render / vec2<f32>(render_res);
155
-
156
- // History lives at output resolution but the UV is the same in [0, 1].
157
- let history_rgb = nss_warp_history_sample(prev_uv_render);
158
-
159
- // 4. Disocclusion mask. The shared depth-clip pass returns FSR2
160
- // confidence (1 = trust history, 0 = disocclusion); ARM's network
161
- // input expects the inverse (high = disocclusion). Multiply by
162
- // history_validity so a hard reset zeros the mask too.
163
- let confidence = textureLoad(tDisocclusionConfidence, st, 0).r;
164
- let disocclusion_mask = (1.0 - saturate(confidence)) * saturate(settings.history_validity);
165
-
166
- // 5. Warped feedback. Multiplied by history_validity so the very first
167
- // frame (or any reset) feeds neutral (0.5 raw -> 0 post-quant)
168
- // feedback to the network instead of garbage from an uninitialised
169
- // texture.
170
- //
171
- // feedback_scale (debug knob, default 1.0) blends between actual FB
172
- // and the neutral value 0.5. At 0 the network sees raw 0.5 across
173
- // all FB channels, which post-quantize is ≈0 — the trained
174
- // "no signal" point, NOT a strong negative signal.
175
- let feedback_actual = nss_warp_feedback_sample(prev_uv_render);
176
- let feedback_neutral = vec4<f32>(0.5);
177
- let feedback = mix(
178
- feedback_neutral,
179
- feedback_actual,
180
- saturate(settings.history_validity) * saturate(settings.feedback_scale),
181
- );
182
-
183
- // 6. Current colour (load, no filtering — already at render-res)
184
- let current_rgb = max(vec3<f32>(0.0), textureLoad(tColour, st, 0).rgb);
185
-
186
- // 7. Luma derivative — uses raw colours; the chunk handles its own scaling.
187
- let luma_deriv = nss_luma_derivative(current_rgb, history_rgb);
188
-
189
- // Tonemap with EXPOSURE applied first — matches ARM's
190
- // Tonemap(EXPOSURE * raw) training distribution. Raw [0, 1] tonemap
191
- // (without exposure) lands values 2-5x below the network's trained
192
- // operating point.
193
- let history_t = nss_tonemap_exposure(history_rgb);
194
- let current_t = nss_tonemap_exposure(current_rgb);
195
-
196
- // Apply ARM's Quantize transformation in fp — converts our [0, 1] inputs
197
- // into the [-1, 1] signed-int8 / 127 distribution the trained network
198
- // expects (DC at 0, not +0.5). See nss_arm_quantize header for derivation.
199
- // settings.quantize_inputs (default 1.0) blends between this transform
200
- // and the raw [0, 1] tonemap (0.0). Useful as an A/B test knob.
201
- let q = saturate(settings.quantize_inputs);
202
- let history_q = mix(history_t, nss_arm_quantize_v3(history_t), q);
203
- let current_q = mix(current_t, nss_arm_quantize_v3(current_t), q);
204
- let disocclusion_q = mix(disocclusion_mask, nss_arm_quantize(disocclusion_mask), q);
205
- let feedback_q = mix(feedback, nss_arm_quantize_v4(feedback), q);
206
- let luma_deriv_q = mix(luma_deriv, nss_arm_quantize(luma_deriv), q);
207
-
208
- // ── Pack into 12-channel tensor ──
209
- // Layout (4ch × depth=3):
210
- // z=0 : history.rgb, current.r
211
- // z=1 : current.gb, disocclusion_mask, feedback.r
212
- // z=2 : feedback.gba, luma_derivative
213
- textureStore(tTensor, vec3<i32>(st, 0), vec4<f32>(history_q, current_q.r));
214
- textureStore(tTensor, vec3<i32>(st, 1), vec4<f32>(current_q.g, current_q.b, disocclusion_q, feedback_q.r));
215
- textureStore(tTensor, vec3<i32>(st, 2), vec4<f32>(feedback_q.gba, luma_deriv_q));
216
-
217
- // Pack nearest offset for postprocess: (-1, 0, 1) in each axis -> [0, 1]
218
- //
219
- // NOTE there are two offset codecs in flight per frame under NSS. This packs (offset + 1) * 0.5
220
- // into the rg of its own rg8unorm texture and shader_nss_postprocess decodes it inline; the TAA
221
- // depth-clip pass, which runs unconditionally and whose confidence output NSS consumes, packs
222
- // index/8 into one channel of its own output through chunk_depth_clip_offset_codec, which has a
223
- // round-trip spec. The 9-tap search itself is now shared (chunk_find_nearest_depth), so the two
224
- // agree on what they are encoding — but the search still runs twice over the same depth buffer and
225
- // a reader has to check which convention a given rg8unorm offset texture uses.
226
- //
227
- // Collapsing them means this pass reading the depth-clip g channel instead of writing
228
- // tNearestOffset, which changes what NSS is bound to and what its postprocess pair decodes. That is
229
- // a pipeline change with a visual outcome rather than a de-duplication, so it wants a measured
230
- // before/after on hardware; left as is deliberately. See DUP-039.
231
- let nearest_packed = (vec2<f32>(nearest_off) + 1.0) * 0.5;
232
- textureStore(tNearestOffset, st, vec4<f32>(nearest_packed, 0.0, 0.0));
233
- }
234
- `, [
235
- F16_MAX_DEFINITION,
236
- chunk_nss_find_nearest_depth,
237
- chunk_nss_luma_derivative,
238
- NSS_SETTINGS_STRUCT.declaration_chunk,
239
- ]
240
- );
241
-
242
- export const shader_nss_preprocess = ComputeShader.from({
243
- label: "NSS / preprocess",
244
- body,
245
- resources,
246
- });
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { F16_MAX_DEFINITION } from "../../shader/chunk/math/F16_MAX_DEFINITION.js";
3
+ import { ComputeShader } from "../../shader/ComputeShader.js";
4
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
5
+ import { SAMPLER_LINEAR_UPSCALE } from "../../texture/SAMPLER_LINEAR_UPSCALE.js";
6
+ import { chunk_nss_find_nearest_depth } from "./chunk_nss_find_nearest_depth.js";
7
+ import { chunk_nss_luma_derivative } from "./chunk_nss_luma_derivative.js";
8
+ import { NSS_WORKGROUP_SIZE } from "./NSS_CONSTANTS.js";
9
+ import { NSS_SETTINGS_STRUCT } from "./NSS_SETTINGS_STRUCT.js";
10
+
11
+ /**
12
+ * NSS preprocess pass. Runs at render-resolution (one thread per render-res
13
+ * pixel) and produces:
14
+ * 1. The 12-channel network input tensor, packed into a single rgba16f
15
+ * 3D storage texture with depth=3 (channels 0..3, 4..7, 8..11).
16
+ * 2. The encoded "nearest depth offset" used by postprocess to dilate
17
+ * velocity at output-res (`tNearestOffset` — components in [0, 1]
18
+ * decode to {-1, 0, 1}² via `(x*2 - 1)`).
19
+ *
20
+ * Per-pixel logic (matches the algorithm in ARM's `Preprocess()`):
21
+ * 1. Dilate depth over a 3×3 neighbourhood, remember the offset of the
22
+ * nearest sample.
23
+ * 2. Sample velocity at the dilated coord.
24
+ * 3. Project to the previous frame, sample warped history (bilinear).
25
+ * 4. Read the FSR2 depth-clip confidence from the upstream pass and
26
+ * invert it into the network's "high = disocclusion" convention.
27
+ * 5. Sample the warped feedback tensor (bilinear).
28
+ * 6. Compute the luma derivative between current and warped history.
29
+ * 7. Pack everything into the output tensor — colours
30
+ * tonemapped via `Tonemap(EXPOSURE * raw)` to match ARM's training
31
+ * distribution.
32
+ *
33
+ * @see ARM NSS reference: `Preprocess` in
34
+ * `Source/NG-SDK/sdk/include/FidelityFX/gpu/nss/ffx_nss_preprocess.h`
35
+ */
36
+ const resources = new ShaderResourceSetDescriptor();
37
+ resources.createGroup()
38
+ .addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
39
+ // ── inputs at render-res ──
40
+ .addTexture("tColour", "float") // jittered scene colour, render-res
41
+ // depth32float can't be bound as 'float' (filterable) — WebGPU only
42
+ // accepts depth textures via 'unfilterable-float' in this context.
43
+ // We only ever read this via textureLoad inside the depth dilation.
44
+ .addTexture("tDepthCurrent", "unfilterable-float")
45
+ .addTexture("tVelocity", "float") // pixel-space motion vectors, render-res
46
+ // FSR2 depth-clip confidence (1 = trust history, 0 = disocclusion)
47
+ // produced by the engine's shared shader_depth_occlusion_clip pass.
48
+ // We invert it into ARM's "high = disocclusion" network input.
49
+ .addTexture("tDisocclusionConfidence", "float")
50
+ // ── inputs at output-res / feedback at render-res ──
51
+ .addTexture("tHistory", "float") // previous frame upscaled colour, output-res
52
+ .addTexture("tFeedbackIn", "float") // 4-ch feedback tensor from previous frame, render-res
53
+ // ── settings ──
54
+ .addUniform("settings", NSS_SETTINGS_STRUCT)
55
+ // ── outputs ──
56
+ // Single rgba16f 3D storage texture holds the 12-channel input tensor
57
+ // packed across depth=3 layers (4 channels each). rgba16f gives the
58
+ // network ~10 bits of mantissa per channel, which is plenty for
59
+ // normalized [0, 1] inputs after the network's first BN/scale.
60
+ .addStorageTexture("tTensor", "rgba16float", "3d", "write-only")
61
+ // Nearest-depth offset packed as (dx+1, dy+1) / 2 -> [0, 1]. Postprocess
62
+ // uses this to fetch the velocity at the dilated coordinate when warping
63
+ // the history at output-resolution.
64
+ .addStorageTexture("tNearestOffset", "rg8unorm", "2d", "write-only")
65
+ ;
66
+
67
+
68
+ const body = CodeChunk.from(
69
+ //language=WGSL
70
+ `
71
+ const NSS_EXPOSURE: f32 = 7.38905609893; // e^2
72
+
73
+ // Karis tonemap (max-of-channels), applied to EXPOSURE-scaled colour.
74
+ // ARM's training distribution: Tonemap(EXPOSURE * raw) -> network input.
75
+ fn nss_tonemap_exposure(rgb: vec3<f32>) -> vec3<f32> {
76
+ let finite = select(vec3<f32>(0.0), clamp(rgb, vec3<f32>(0.0), vec3<f32>(F16_MAX)), rgb == rgb);
77
+ let scaled = finite * NSS_EXPOSURE;
78
+ let m = max(max(scaled.r, scaled.g), scaled.b);
79
+ return scaled / (1.0 + m);
80
+ }
81
+
82
+ // ARM's network was trained against inputs that go through their Quantize
83
+ // formula: int8 = round(fp * 255 - 128). The conv then sees (uint8 - 128)
84
+ // = signed int8 in [-128, 127] - i.e. fp 0 -> -128, fp 0.5 -> 0, fp 1 -> 127.
85
+ // Our pipeline naively feeds fp [0, 1] which has DC offset +0.5 vs ARM's
86
+ // expected DC of 0. The trained head biases were calibrated against that
87
+ // near-zero DC, so feeding +0.5 puts every conv accumulator off by
88
+ // (sum_of_weights * 0.5 * 255) - way outside the trained operating range.
89
+ //
90
+ // We use the SMOOTH (no-round) version of ARM's transform: a linear
91
+ // remap [0, 1] -> approx [-1.008, 1.008] clamped to [-1, 1]. Matches
92
+ // ARM's DC shift but without the round() discontinuities that caused
93
+ // feature-dependent flickering when small jitter-driven input changes
94
+ // pushed pixels across quantization boundaries. Network sensitivity to
95
+ // near-boundary inputs would otherwise flip int8 outputs by 1/127 per
96
+ // frame and propagate through every layer.
97
+ //
98
+ // Per-multiply lands at ~(ARM signed * int8_w) / 127^2, so our acc is
99
+ // approx (ARM int32_acc / 127^2). Our rescale_factor (= 127 * mult /
100
+ // 2^shift) then produces value_fp ~ int8_in / 127 going into the LUT -
101
+ // the shape ARM's network was trained to produce.
102
+ fn nss_arm_quantize(fp: f32) -> f32 {
103
+ return clamp(fp * (255.0 / 127.0) - (128.0 / 127.0), -1.0, 1.0);
104
+ }
105
+
106
+ fn nss_arm_quantize_v3(rgb: vec3<f32>) -> vec3<f32> {
107
+ return vec3<f32>(nss_arm_quantize(rgb.r), nss_arm_quantize(rgb.g), nss_arm_quantize(rgb.b));
108
+ }
109
+
110
+ fn nss_arm_quantize_v4(v: vec4<f32>) -> vec4<f32> {
111
+ return vec4<f32>(nss_arm_quantize(v.x), nss_arm_quantize(v.y), nss_arm_quantize(v.z), nss_arm_quantize(v.w));
112
+ }
113
+
114
+ fn nss_warp_history_sample(prev_uv: vec2<f32>) -> vec3<f32> {
115
+ let on_screen = all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0));
116
+ if (!on_screen) {
117
+ return vec3<f32>(0.0);
118
+ }
119
+ // ARM uses bilinear (LoadHistory in ffx_nss_callbacks_glsl.h:471);
120
+ // Catmull-Rom is opt-in via HISTORY_CATMULL define.
121
+ return max(vec3<f32>(0.0), textureSampleLevel(tHistory, sLinear, prev_uv, 0.0).rgb);
122
+ }
123
+
124
+ fn nss_warp_feedback_sample(prev_uv_render: vec2<f32>) -> vec4<f32> {
125
+ let on_screen = all(prev_uv_render >= vec2<f32>(0.0)) && all(prev_uv_render <= vec2<f32>(1.0));
126
+ if (!on_screen) {
127
+ return vec4<f32>(0.0);
128
+ }
129
+ return textureSampleLevel(tFeedbackIn, sLinear, prev_uv_render, 0.0);
130
+ }
131
+
132
+ @compute @workgroup_size(${NSS_WORKGROUP_SIZE}, ${NSS_WORKGROUP_SIZE}, 1)
133
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
134
+ let render_res_u = settings.render_resolution;
135
+ let render_res = vec2<i32>(render_res_u);
136
+
137
+ if (any(gid.xy >= render_res_u)) {
138
+ return;
139
+ }
140
+
141
+ let st = vec2<i32>(gid.xy);
142
+
143
+ // 1. Depth dilation
144
+ var nearest_off = vec2<i32>(0, 0);
145
+ let _dilated_depth = nss_find_nearest_depth(tDepthCurrent, st, render_res, &nearest_off);
146
+
147
+ // 2. Velocity at the depth-nearest tap (FSR2 strategy — sharpens
148
+ // silhouettes at disocclusion vs picking velocity at the centre).
149
+ let velocity = textureLoad(tVelocity, st + nearest_off, 0).rg;
150
+
151
+ // 3. Reproject to previous frame
152
+ let st_centre = vec2<f32>(st) + 0.5;
153
+ let prev_st_render = st_centre - velocity;
154
+ let prev_uv_render = prev_st_render / vec2<f32>(render_res);
155
+
156
+ // History lives at output resolution but the UV is the same in [0, 1].
157
+ let history_rgb = nss_warp_history_sample(prev_uv_render);
158
+
159
+ // 4. Disocclusion mask. The shared depth-clip pass returns FSR2
160
+ // confidence (1 = trust history, 0 = disocclusion); ARM's network
161
+ // input expects the inverse (high = disocclusion). Multiply by
162
+ // history_validity so a hard reset zeros the mask too.
163
+ let confidence = textureLoad(tDisocclusionConfidence, st, 0).r;
164
+ let disocclusion_mask = (1.0 - saturate(confidence)) * saturate(settings.history_validity);
165
+
166
+ // 5. Warped feedback. Multiplied by history_validity so the very first
167
+ // frame (or any reset) feeds neutral (0.5 raw -> 0 post-quant)
168
+ // feedback to the network instead of garbage from an uninitialised
169
+ // texture.
170
+ //
171
+ // feedback_scale (debug knob, default 1.0) blends between actual FB
172
+ // and the neutral value 0.5. At 0 the network sees raw 0.5 across
173
+ // all FB channels, which post-quantize is ≈0 — the trained
174
+ // "no signal" point, NOT a strong negative signal.
175
+ let feedback_actual = nss_warp_feedback_sample(prev_uv_render);
176
+ let feedback_neutral = vec4<f32>(0.5);
177
+ let feedback = mix(
178
+ feedback_neutral,
179
+ feedback_actual,
180
+ saturate(settings.history_validity) * saturate(settings.feedback_scale),
181
+ );
182
+
183
+ // 6. Current colour (load, no filtering — already at render-res)
184
+ let current_rgb = max(vec3<f32>(0.0), textureLoad(tColour, st, 0).rgb);
185
+
186
+ // 7. Luma derivative — uses raw colours; the chunk handles its own scaling.
187
+ let luma_deriv = nss_luma_derivative(current_rgb, history_rgb);
188
+
189
+ // Tonemap with EXPOSURE applied first — matches ARM's
190
+ // Tonemap(EXPOSURE * raw) training distribution. Raw [0, 1] tonemap
191
+ // (without exposure) lands values 2-5x below the network's trained
192
+ // operating point.
193
+ let history_t = nss_tonemap_exposure(history_rgb);
194
+ let current_t = nss_tonemap_exposure(current_rgb);
195
+
196
+ // Apply ARM's Quantize transformation in fp — converts our [0, 1] inputs
197
+ // into the [-1, 1] signed-int8 / 127 distribution the trained network
198
+ // expects (DC at 0, not +0.5). See nss_arm_quantize header for derivation.
199
+ // settings.quantize_inputs (default 1.0) blends between this transform
200
+ // and the raw [0, 1] tonemap (0.0). Useful as an A/B test knob.
201
+ let q = saturate(settings.quantize_inputs);
202
+ let history_q = mix(history_t, nss_arm_quantize_v3(history_t), q);
203
+ let current_q = mix(current_t, nss_arm_quantize_v3(current_t), q);
204
+ let disocclusion_q = mix(disocclusion_mask, nss_arm_quantize(disocclusion_mask), q);
205
+ let feedback_q = mix(feedback, nss_arm_quantize_v4(feedback), q);
206
+ let luma_deriv_q = mix(luma_deriv, nss_arm_quantize(luma_deriv), q);
207
+
208
+ // ── Pack into 12-channel tensor ──
209
+ // Layout (4ch × depth=3):
210
+ // z=0 : history.rgb, current.r
211
+ // z=1 : current.gb, disocclusion_mask, feedback.r
212
+ // z=2 : feedback.gba, luma_derivative
213
+ textureStore(tTensor, vec3<i32>(st, 0), vec4<f32>(history_q, current_q.r));
214
+ textureStore(tTensor, vec3<i32>(st, 1), vec4<f32>(current_q.g, current_q.b, disocclusion_q, feedback_q.r));
215
+ textureStore(tTensor, vec3<i32>(st, 2), vec4<f32>(feedback_q.gba, luma_deriv_q));
216
+
217
+ // Pack nearest offset for postprocess: (-1, 0, 1) in each axis -> [0, 1]
218
+ //
219
+ // NOTE there are two offset codecs in flight per frame under NSS. This packs (offset + 1) * 0.5
220
+ // into the rg of its own rg8unorm texture and shader_nss_postprocess decodes it inline; the TAA
221
+ // depth-clip pass, which runs unconditionally and whose confidence output NSS consumes, packs
222
+ // index/8 into one channel of its own output through chunk_depth_clip_offset_codec, which has a
223
+ // round-trip spec. The 9-tap search itself is now shared (chunk_find_nearest_depth), so the two
224
+ // agree on what they are encoding — but the search still runs twice over the same depth buffer and
225
+ // a reader has to check which convention a given rg8unorm offset texture uses.
226
+ //
227
+ // Collapsing them means this pass reading the depth-clip g channel instead of writing
228
+ // tNearestOffset, which changes what NSS is bound to and what its postprocess pair decodes. That is
229
+ // a pipeline change with a visual outcome rather than a de-duplication, so it wants a measured
230
+ // before/after on hardware; left as is deliberately. See DUP-039.
231
+ let nearest_packed = (vec2<f32>(nearest_off) + 1.0) * 0.5;
232
+ textureStore(tNearestOffset, st, vec4<f32>(nearest_packed, 0.0, 0.0));
233
+ }
234
+ `, [
235
+ F16_MAX_DEFINITION,
236
+ chunk_nss_find_nearest_depth,
237
+ chunk_nss_luma_derivative,
238
+ NSS_SETTINGS_STRUCT.declaration_chunk,
239
+ ]
240
+ );
241
+
242
+ export const shader_nss_preprocess = ComputeShader.from({
243
+ label: "NSS / preprocess",
244
+ body,
245
+ resources,
246
+ });
@@ -3,8 +3,7 @@
3
3
  * place — because there is more than one reason to reverse and they are not independent of each
4
4
  * other.
5
5
  *
6
- * Feed the answer to `triangle_list_reverse_winding`. Nanite's `ReverseWindingOrder` is the same
7
- * function for the same reason: a GPU-driven draw mixes instances that disagree about this, so it
6
+ * Feed the answer to `triangle_list_reverse_winding`: a GPU-driven draw mixes instances that disagree about this, so it
8
7
  * cannot be pipeline state, and every reason has to be combined before the corner is chosen.
9
8
  *
10
9
  * @see chunk_triangle_list_reverse_winding
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_triangle_winding_is_reversed.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,iDAFU,SAAS,CAmBb;0BA/BoB,iCAAiC"}
1
+ {"version":3,"file":"chunk_triangle_winding_is_reversed.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,iDAFU,SAAS,CAmBb;0BA9BoB,iCAAiC"}
@@ -1,35 +1,34 @@
1
- import { chunk_material_draw_side } from "../material/chunk_material_draw_side.js";
2
- import { chunk_node3d_flags } from "../scene/chunk_node3d_flags.js";
3
- import { NODE3D_STRUCT } from "../scene/NODE3D_STRUCT.js";
4
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
5
-
6
- /**
7
- * The whole of what a vertex shader needs to know to emit a triangle the right way round, in one
8
- * place — because there is more than one reason to reverse and they are not independent of each
9
- * other.
10
- *
11
- * Feed the answer to `triangle_list_reverse_winding`. Nanite's `ReverseWindingOrder` is the same
12
- * function for the same reason: a GPU-driven draw mixes instances that disagree about this, so it
13
- * cannot be pipeline state, and every reason has to be combined before the corner is chosen.
14
- *
15
- * @see chunk_triangle_list_reverse_winding
16
- * @type {CodeChunk}
17
- */
18
- export const chunk_triangle_winding_is_reversed = CodeChunk.from(
19
- //language=WGSL
20
- `
21
- /**
22
- * Whether this instance's triangles must be emitted back to front.
23
- *
24
- * Two reasons, and they cancel: the instance's transform reflects, or the material asks for the
25
- * back face. A back-sided material on a mirrored instance is wound like a front-sided one on an
26
- * ordinary instance, and draws with the same pipeline state as both.
27
- */
28
- fn triangle_winding_is_reversed( node: ${NODE3D_STRUCT.wgsl_ref}, draw_side: u32 ) -> bool{
29
- return node3d_global_is_mirrored(node) != material_draws_back_side(draw_side);
30
- }
31
- `, [
32
- NODE3D_STRUCT.declaration_chunk,
33
- chunk_node3d_flags,
34
- chunk_material_draw_side,
35
- ])
1
+ import { chunk_material_draw_side } from "../material/chunk_material_draw_side.js";
2
+ import { chunk_node3d_flags } from "../scene/chunk_node3d_flags.js";
3
+ import { NODE3D_STRUCT } from "../scene/NODE3D_STRUCT.js";
4
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
5
+
6
+ /**
7
+ * The whole of what a vertex shader needs to know to emit a triangle the right way round, in one
8
+ * place — because there is more than one reason to reverse and they are not independent of each
9
+ * other.
10
+ *
11
+ * Feed the answer to `triangle_list_reverse_winding`: a GPU-driven draw mixes instances that disagree about this, so it
12
+ * cannot be pipeline state, and every reason has to be combined before the corner is chosen.
13
+ *
14
+ * @see chunk_triangle_list_reverse_winding
15
+ * @type {CodeChunk}
16
+ */
17
+ export const chunk_triangle_winding_is_reversed = CodeChunk.from(
18
+ //language=WGSL
19
+ `
20
+ /**
21
+ * Whether this instance's triangles must be emitted back to front.
22
+ *
23
+ * Two reasons, and they cancel: the instance's transform reflects, or the material asks for the
24
+ * back face. A back-sided material on a mirrored instance is wound like a front-sided one on an
25
+ * ordinary instance, and draws with the same pipeline state as both.
26
+ */
27
+ fn triangle_winding_is_reversed( node: ${NODE3D_STRUCT.wgsl_ref}, draw_side: u32 ) -> bool{
28
+ return node3d_global_is_mirrored(node) != material_draws_back_side(draw_side);
29
+ }
30
+ `, [
31
+ NODE3D_STRUCT.declaration_chunk,
32
+ chunk_node3d_flags,
33
+ chunk_material_draw_side,
34
+ ])
@@ -7,7 +7,7 @@ export const C_MIE_SCATTERING_DECLARATION: CodeChunk;
7
7
  * Mie extinction: scattering plus absorption. Hillaire's Earth authors this and the scattering,
8
8
  * not the absorption -- 0.004440 and 0.003996 per km.
9
9
  *
10
- * @see https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Application/SkyAtmosphereCommon.cpp#L40
10
+ * @see "A Scalable and Production Ready Sky and Atmosphere Rendering Technique", Hillaire (2020)
11
11
  */
12
12
  export const C_MIE_EXTINCTION_DECLARATION: CodeChunk;
13
13
  /**
@@ -15,7 +15,7 @@ export const C_MIE_EXTINCTION_DECLARATION: CodeChunk;
15
15
  * a tenth of the extinction. The shadertoy port wrote the 4.4 extinction here as the absorption,
16
16
  * which put the extinction at 8.396e-6.
17
17
  *
18
- * @see https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Application/Game.cpp#L707
18
+ * @see "A Scalable and Production Ready Sky and Atmosphere Rendering Technique", Hillaire (2020)
19
19
  */
20
20
  export const C_MIE_ABSORPTION_DECLARATION: CodeChunk;
21
21
  import { CodeChunk } from "../../compiler/CodeChunk.js";
@@ -13,7 +13,7 @@ export const C_MIE_SCATTERING_DECLARATION = CodeChunk.from(
13
13
  * Mie extinction: scattering plus absorption. Hillaire's Earth authors this and the scattering,
14
14
  * not the absorption -- 0.004440 and 0.003996 per km.
15
15
  *
16
- * @see https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Application/SkyAtmosphereCommon.cpp#L40
16
+ * @see "A Scalable and Production Ready Sky and Atmosphere Rendering Technique", Hillaire (2020)
17
17
  */
18
18
  export const C_MIE_EXTINCTION_DECLARATION = CodeChunk.from(
19
19
  //language=WGSL
@@ -25,7 +25,7 @@ export const C_MIE_EXTINCTION_DECLARATION = CodeChunk.from(
25
25
  * a tenth of the extinction. The shadertoy port wrote the 4.4 extinction here as the absorption,
26
26
  * which put the extinction at 8.396e-6.
27
27
  *
28
- * @see https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Application/Game.cpp#L707
28
+ * @see "A Scalable and Production Ready Sky and Atmosphere Rendering Technique", Hillaire (2020)
29
29
  */
30
30
  export const C_MIE_ABSORPTION_DECLARATION = CodeChunk.from(
31
31
  //language=WGSL
@@ -16,7 +16,7 @@ fn compute_extinction(densities: vec3<f32>) -> vec3<f32>{
16
16
  let mie_absorption = mie_density * C_MIE_ABSORPTION;
17
17
  let mie_scattering = mie_density * C_MIE_SCATTERING;
18
18
 
19
- // note - taken from the Hillaire's atmosphere code: https://github.com/sebh/UnrealEngineSkyAtmosphere/blob/183ead5bdacc701b3b626347a680a2f3cd3d4fbd/Resources/RenderSkyCommon.hlsl#L248
19
+ // Rayleigh does not absorb
20
20
  let rayleigh_absorption = 0.0;
21
21
  let rayleigh_scattering = densities.x * C_RAYLEIGH;
22
22