@woosh/meep-engine 3.11.3 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/README.md +14 -18
  2. package/editor/SelectionVisualizer.js +127 -127
  3. package/editor/entity_world_bounds.js +27 -27
  4. package/editor/particles/rebuildParticleEmitter.js +31 -31
  5. package/editor/process/SymbolicDisplayProcess.js +1 -1
  6. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  7. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  8. package/editor/prototypeEditorShell.js +156 -156
  9. package/editor/selection/editor_pick.js +130 -130
  10. package/editor/selection/screen_rect_frustum.js +119 -119
  11. package/editor/tools/v2/TransformControls.js +971 -971
  12. package/package.json +1 -1
  13. package/src/engine/Engine.d.ts +3 -3
  14. package/src/engine/Engine.d.ts.map +1 -1
  15. package/src/engine/Engine.js +726 -726
  16. package/src/engine/EngineHarness.d.ts +1 -1
  17. package/src/engine/EngineHarness.js +590 -590
  18. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  19. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  21. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  23. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  24. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  25. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  26. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  27. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  29. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  30. package/src/engine/graphics/ecs/water/Water.js +104 -104
  31. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  33. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  36. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  38. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  39. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  40. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  41. package/src/engine/graphics3/AnimationSystem.js +352 -0
  42. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  43. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  44. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  45. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  46. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  47. package/src/engine/graphics3/CameraSystem.js +170 -0
  48. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  49. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  50. package/src/engine/graphics3/CameraSystem3.js +6 -166
  51. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  53. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  54. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  56. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  57. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  58. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  59. package/src/engine/graphics3/DecalSystem.js +441 -0
  60. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  61. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  62. package/src/engine/graphics3/DecalSystem3.js +6 -437
  63. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  65. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  66. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  68. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  69. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  70. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  71. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  72. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  74. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  75. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  76. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  77. package/src/engine/graphics3/HighlightSystem.js +241 -0
  78. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  79. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  80. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  81. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  82. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  83. package/src/engine/graphics3/LightSystem.js +211 -0
  84. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  85. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  86. package/src/engine/graphics3/LightSystem3.js +6 -207
  87. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  88. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  89. package/src/engine/graphics3/MeshSystem.js +647 -0
  90. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  91. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  92. package/src/engine/graphics3/MeshSystem3.js +6 -642
  93. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  94. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  95. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  101. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  106. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  107. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  109. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  110. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  112. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  113. package/src/engine/graphics3/Pickable.d.ts +1 -1
  114. package/src/engine/graphics3/Pickable.js +65 -65
  115. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  116. package/src/engine/graphics3/PickingQuery.js +48 -48
  117. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  118. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  119. package/src/engine/graphics3/PickingSystem.js +273 -0
  120. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  121. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  122. package/src/engine/graphics3/PickingSystem3.js +6 -269
  123. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  128. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  129. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  130. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  131. package/src/engine/graphics3/TerrainSystem.js +566 -0
  132. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  133. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  134. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  135. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  138. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  140. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  141. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  142. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  143. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  144. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  146. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  147. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  148. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  149. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  155. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  156. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  157. package/src/engine/graphics3/WaterSystem.js +293 -0
  158. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  159. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  160. package/src/engine/graphics3/WaterSystem3.js +6 -289
  161. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  162. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  163. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  164. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  165. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  166. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  167. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  169. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  172. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  175. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  176. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  177. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  178. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  180. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  182. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  183. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  184. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  185. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  186. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  187. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  188. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  189. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  190. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  191. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  192. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  193. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  194. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  195. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  196. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  197. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  198. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  199. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  201. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  202. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  203. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  204. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  205. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  206. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  207. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  208. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  209. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  210. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  211. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  212. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  213. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  214. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  215. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  216. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  217. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  218. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
  219. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  220. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  221. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  222. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  223. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  224. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  225. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  226. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  227. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  228. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  229. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  230. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  231. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  232. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  233. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  234. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  235. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  236. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  237. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  238. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  239. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  240. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  241. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  242. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  243. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  244. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  245. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  246. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  247. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  248. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  249. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  250. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  251. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  252. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  253. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  254. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  255. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  256. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  257. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  258. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  259. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  260. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +4 -7
  261. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  262. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  263. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  264. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  265. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  266. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  267. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  268. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  269. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  270. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  271. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  272. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  273. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  274. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  275. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  276. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  277. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  278. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  279. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  280. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  281. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  282. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  283. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  284. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  285. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  286. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  287. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  288. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  289. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  290. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  291. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  292. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  293. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  294. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  295. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  296. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  297. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  298. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  299. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  300. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  301. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  302. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  303. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +2 -2
  304. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  305. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  306. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  307. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  308. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  309. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
  310. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  311. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  312. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  313. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  314. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  315. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  316. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  317. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  318. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  319. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  320. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  321. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  322. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  323. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  324. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  325. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  326. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  327. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  328. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  329. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  330. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  331. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  332. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  333. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  334. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  335. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  336. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  337. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  338. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  339. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  340. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  341. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  342. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  343. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  344. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  345. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  346. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  347. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  348. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  349. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  350. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  351. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  352. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  353. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  354. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  355. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  356. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  357. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  358. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  359. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  360. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  361. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  362. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  363. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  364. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  365. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  366. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  367. package/src/shade/renderer/shader/ComputeShader.js +350 -296
  368. package/src/shade/renderer/shader/ImageShader.js +217 -217
  369. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  370. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  371. package/src/shade/renderer/shader/ShaderDescriptor.js +20 -0
  372. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  373. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  374. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  375. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  376. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  377. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  378. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  379. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  380. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  381. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  382. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  383. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +12 -15
  384. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
  385. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  386. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
  387. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  388. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  389. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  390. package/src/shade/renderer/water/shader_water.js +246 -246
  391. package/src/shade/vitest.setup.mjs +1 -1
  392. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  393. package/src/view/minimap/Minimap.d.ts +2 -2
  394. package/src/view/minimap/Minimap.d.ts.map +1 -1
  395. package/src/view/minimap/Minimap.js +225 -225
  396. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  397. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  398. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  399. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  400. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  401. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
@@ -1,231 +1,230 @@
1
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
- import { ComputeShader } from "../../shader/ComputeShader.js";
3
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
4
- import { SAMPLER_LINEAR_UPSCALE } from "../../texture/SAMPLER_LINEAR_UPSCALE.js";
5
- import { chunk_nss_find_nearest_depth } from "./chunk_nss_find_nearest_depth.js";
6
- import { chunk_nss_luma_derivative } from "./chunk_nss_luma_derivative.js";
7
- import { NSS_WORKGROUP_SIZE } from "./NSS_CONSTANTS.js";
8
- import { NSS_SETTINGS_STRUCT } from "./NSS_SETTINGS_STRUCT.js";
9
-
10
- /**
11
- * NSS preprocess pass. Runs at render-resolution (one thread per render-res
12
- * pixel) and produces:
13
- * 1. The 12-channel network input tensor, packed into a single rgba16f
14
- * 3D storage texture with depth=3 (channels 0..3, 4..7, 8..11).
15
- * 2. The encoded "nearest depth offset" used by postprocess to dilate
16
- * velocity at output-res (`tNearestOffset` — components in [0, 1]
17
- * decode to {-1, 0, 1}² via `(x*2 - 1)`).
18
- *
19
- * Per-pixel logic (matches the algorithm in ARM's `Preprocess()`):
20
- * 1. Dilate depth over a 3×3 neighbourhood, remember the offset of the
21
- * nearest sample.
22
- * 2. Sample velocity at the dilated coord.
23
- * 3. Project to the previous frame, sample warped history (bilinear).
24
- * 4. Read the FSR2 depth-clip confidence from the upstream pass and
25
- * invert it into the network's "high = disocclusion" convention.
26
- * 5. Sample the warped feedback tensor (bilinear).
27
- * 6. Compute the luma derivative between current and warped history.
28
- * 7. Pack everything into the output tensor — colours
29
- * tonemapped via `Tonemap(EXPOSURE * raw)` to match ARM's training
30
- * distribution.
31
- *
32
- * @see ARM NSS reference: `Preprocess` in
33
- * `Source/NG-SDK/sdk/include/FidelityFX/gpu/nss/ffx_nss_preprocess.h`
34
- */
35
- const resources = new ShaderResourceSetDescriptor();
36
- resources.createGroup()
37
- .addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
38
- // ── inputs at render-res ──
39
- .addTexture("tColour", "float") // jittered scene colour, render-res
40
- // depth32float can't be bound as 'float' (filterable) — WebGPU only
41
- // accepts depth textures via 'unfilterable-float' in this context.
42
- // We only ever read this via textureLoad inside the depth dilation.
43
- .addTexture("tDepthCurrent", "unfilterable-float")
44
- .addTexture("tVelocity", "float") // pixel-space motion vectors, render-res
45
- // FSR2 depth-clip confidence (1 = trust history, 0 = disocclusion)
46
- // produced by the engine's shared shader_depth_occlusion_clip pass.
47
- // We invert it into ARM's "high = disocclusion" network input.
48
- .addTexture("tDisocclusionConfidence", "float")
49
- // ── inputs at output-res / feedback at render-res ──
50
- .addTexture("tHistory", "float") // previous frame upscaled colour, output-res
51
- .addTexture("tFeedbackIn", "float") // 4-ch feedback tensor from previous frame, render-res
52
- // ── settings ──
53
- .addUniform("settings", NSS_SETTINGS_STRUCT)
54
- // ── outputs ──
55
- // Single rgba16f 3D storage texture holds the 12-channel input tensor
56
- // packed across depth=3 layers (4 channels each). rgba16f gives the
57
- // network ~10 bits of mantissa per channel, which is plenty for
58
- // normalized [0, 1] inputs after the network's first BN/scale.
59
- .addStorageTexture("tTensor", "rgba16float", "3d", "write-only")
60
- // Nearest-depth offset packed as (dx+1, dy+1) / 2 -> [0, 1]. Postprocess
61
- // uses this to fetch the velocity at the dilated coordinate when warping
62
- // the history at output-resolution.
63
- .addStorageTexture("tNearestOffset", "rg8unorm", "2d", "write-only")
64
- ;
65
-
66
-
67
- const body = CodeChunk.from(
68
- //language=WGSL
69
- `
70
- const NSS_EXPOSURE: f32 = 7.38905609893; // e^2 — matches ARM's NSSCommon.ush
71
-
72
- // Karis tonemap (max-of-channels), applied to EXPOSURE-scaled colour.
73
- // ARM's training distribution: Tonemap(EXPOSURE * raw) -> network input.
74
- fn nss_tonemap_exposure(rgb: vec3<f32>) -> vec3<f32> {
75
- let scaled = rgb * NSS_EXPOSURE;
76
- let m = max(max(scaled.r, scaled.g), scaled.b);
77
- return scaled / (1.0 + m);
78
- }
79
-
80
- // ARM's network was trained against inputs that go through their Quantize
81
- // formula: int8 = round(fp * 255 - 128). The conv then sees (uint8 - 128)
82
- // = signed int8 in [-128, 127] - i.e. fp 0 -> -128, fp 0.5 -> 0, fp 1 -> 127.
83
- // Our pipeline naively feeds fp [0, 1] which has DC offset +0.5 vs ARM's
84
- // expected DC of 0. The trained head biases were calibrated against that
85
- // near-zero DC, so feeding +0.5 puts every conv accumulator off by
86
- // (sum_of_weights * 0.5 * 255) - way outside the trained operating range.
87
- //
88
- // We use the SMOOTH (no-round) version of ARM's transform: a linear
89
- // remap [0, 1] -> approx [-1.008, 1.008] clamped to [-1, 1]. Matches
90
- // ARM's DC shift but without the round() discontinuities that caused
91
- // feature-dependent flickering when small jitter-driven input changes
92
- // pushed pixels across quantization boundaries. Network sensitivity to
93
- // near-boundary inputs would otherwise flip int8 outputs by 1/127 per
94
- // frame and propagate through every layer.
95
- //
96
- // Per-multiply lands at ~(ARM signed * int8_w) / 127^2, so our acc is
97
- // approx (ARM int32_acc / 127^2). Our rescale_factor (= 127 * mult /
98
- // 2^shift) then produces value_fp ~ int8_in / 127 going into the LUT -
99
- // the shape ARM's network was trained to produce.
100
- fn nss_arm_quantize(fp: f32) -> f32 {
101
- return clamp(fp * (255.0 / 127.0) - (128.0 / 127.0), -1.0, 1.0);
102
- }
103
-
104
- fn nss_arm_quantize_v3(rgb: vec3<f32>) -> vec3<f32> {
105
- return vec3<f32>(nss_arm_quantize(rgb.r), nss_arm_quantize(rgb.g), nss_arm_quantize(rgb.b));
106
- }
107
-
108
- fn nss_arm_quantize_v4(v: vec4<f32>) -> vec4<f32> {
109
- return vec4<f32>(nss_arm_quantize(v.x), nss_arm_quantize(v.y), nss_arm_quantize(v.z), nss_arm_quantize(v.w));
110
- }
111
-
112
- fn nss_warp_history_sample(prev_uv: vec2<f32>) -> vec3<f32> {
113
- let on_screen = all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0));
114
- if (!on_screen) {
115
- return vec3<f32>(0.0);
116
- }
117
- // ARM uses bilinear (LoadHistory in ffx_nss_callbacks_glsl.h:471);
118
- // Catmull-Rom is opt-in via HISTORY_CATMULL define.
119
- return max(vec3<f32>(0.0), textureSampleLevel(tHistory, sLinear, prev_uv, 0.0).rgb);
120
- }
121
-
122
- fn nss_warp_feedback_sample(prev_uv_render: vec2<f32>) -> vec4<f32> {
123
- let on_screen = all(prev_uv_render >= vec2<f32>(0.0)) && all(prev_uv_render <= vec2<f32>(1.0));
124
- if (!on_screen) {
125
- return vec4<f32>(0.0);
126
- }
127
- return textureSampleLevel(tFeedbackIn, sLinear, prev_uv_render, 0.0);
128
- }
129
-
130
- @compute @workgroup_size(${NSS_WORKGROUP_SIZE}, ${NSS_WORKGROUP_SIZE}, 1)
131
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
132
- let render_res_u = settings.render_resolution;
133
- let render_res = vec2<i32>(render_res_u);
134
-
135
- if (any(gid.xy >= render_res_u)) {
136
- return;
137
- }
138
-
139
- let st = vec2<i32>(gid.xy);
140
-
141
- // 1. Depth dilation
142
- var nearest_off = vec2<i32>(0, 0);
143
- let _dilated_depth = nss_find_nearest_depth(tDepthCurrent, st, render_res, &nearest_off);
144
-
145
- // 2. Velocity at the depth-nearest tap (FSR2 strategy — sharpens
146
- // silhouettes at disocclusion vs picking velocity at the centre).
147
- let velocity = textureLoad(tVelocity, st + nearest_off, 0).rg;
148
-
149
- // 3. Reproject to previous frame
150
- let st_centre = vec2<f32>(st) + 0.5;
151
- let prev_st_render = st_centre - velocity;
152
- let prev_uv_render = prev_st_render / vec2<f32>(render_res);
153
-
154
- // History lives at output resolution but the UV is the same in [0, 1].
155
- let history_rgb = nss_warp_history_sample(prev_uv_render);
156
-
157
- // 4. Disocclusion mask. The shared depth-clip pass returns FSR2
158
- // confidence (1 = trust history, 0 = disocclusion); ARM's network
159
- // input expects the inverse (high = disocclusion). Multiply by
160
- // history_validity so a hard reset zeros the mask too.
161
- let confidence = textureLoad(tDisocclusionConfidence, st, 0).r;
162
- let disocclusion_mask = (1.0 - saturate(confidence)) * saturate(settings.history_validity);
163
-
164
- // 5. Warped feedback. Multiplied by history_validity so the very first
165
- // frame (or any reset) feeds neutral (0.5 raw -> 0 post-quant)
166
- // feedback to the network instead of garbage from an uninitialised
167
- // texture.
168
- //
169
- // feedback_scale (debug knob, default 1.0) blends between actual FB
170
- // and the neutral value 0.5. At 0 the network sees raw 0.5 across
171
- // all FB channels, which post-quantize is ≈0 — the trained
172
- // "no signal" point, NOT a strong negative signal.
173
- let feedback_actual = nss_warp_feedback_sample(prev_uv_render);
174
- let feedback_neutral = vec4<f32>(0.5);
175
- let feedback = mix(
176
- feedback_neutral,
177
- feedback_actual,
178
- saturate(settings.history_validity) * saturate(settings.feedback_scale),
179
- );
180
-
181
- // 6. Current colour (load, no filtering — already at render-res)
182
- let current_rgb = max(vec3<f32>(0.0), textureLoad(tColour, st, 0).rgb);
183
-
184
- // 7. Luma derivative — uses raw colours; the chunk handles its own scaling.
185
- let luma_deriv = nss_luma_derivative(current_rgb, history_rgb);
186
-
187
- // Tonemap with EXPOSURE applied first — matches ARM's
188
- // Tonemap(EXPOSURE * raw) training distribution. Raw [0, 1] tonemap
189
- // (without exposure) lands values 2-5x below the network's trained
190
- // operating point.
191
- let history_t = nss_tonemap_exposure(history_rgb);
192
- let current_t = nss_tonemap_exposure(current_rgb);
193
-
194
- // Apply ARM's Quantize transformation in fp — converts our [0, 1] inputs
195
- // into the [-1, 1] signed-int8 / 127 distribution the trained network
196
- // expects (DC at 0, not +0.5). See nss_arm_quantize header for derivation.
197
- // settings.quantize_inputs (default 1.0) blends between this transform
198
- // and the raw [0, 1] tonemap (0.0). Useful as an A/B test knob.
199
- let q = saturate(settings.quantize_inputs);
200
- let history_q = mix(history_t, nss_arm_quantize_v3(history_t), q);
201
- let current_q = mix(current_t, nss_arm_quantize_v3(current_t), q);
202
- let disocclusion_q = mix(disocclusion_mask, nss_arm_quantize(disocclusion_mask), q);
203
- let feedback_q = mix(feedback, nss_arm_quantize_v4(feedback), q);
204
- let luma_deriv_q = mix(luma_deriv, nss_arm_quantize(luma_deriv), q);
205
-
206
- // ── Pack into 12-channel tensor ──
207
- // Layout (4ch × depth=3):
208
- // z=0 : history.rgb, current.r
209
- // z=1 : current.gb, disocclusion_mask, feedback.r
210
- // z=2 : feedback.gba, luma_derivative
211
- textureStore(tTensor, vec3<i32>(st, 0), vec4<f32>(history_q, current_q.r));
212
- textureStore(tTensor, vec3<i32>(st, 1), vec4<f32>(current_q.g, current_q.b, disocclusion_q, feedback_q.r));
213
- textureStore(tTensor, vec3<i32>(st, 2), vec4<f32>(feedback_q.gba, luma_deriv_q));
214
-
215
- // Pack nearest offset for postprocess: (-1, 0, 1) in each axis -> [0, 1]
216
- let nearest_packed = (vec2<f32>(nearest_off) + 1.0) * 0.5;
217
- textureStore(tNearestOffset, st, vec4<f32>(nearest_packed, 0.0, 0.0));
218
- }
219
- `, [
220
- chunk_nss_find_nearest_depth,
221
- chunk_nss_luma_derivative,
222
- NSS_SETTINGS_STRUCT.declaration_chunk,
223
- ]
224
- );
225
-
226
- export const shader_nss_preprocess = ComputeShader.from({
227
- label: "NSS / preprocess",
228
- body,
229
- resources,
230
- group_size: [NSS_WORKGROUP_SIZE, NSS_WORKGROUP_SIZE, 1],
231
- });
1
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
2
+ import { ComputeShader } from "../../shader/ComputeShader.js";
3
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
4
+ import { SAMPLER_LINEAR_UPSCALE } from "../../texture/SAMPLER_LINEAR_UPSCALE.js";
5
+ import { chunk_nss_find_nearest_depth } from "./chunk_nss_find_nearest_depth.js";
6
+ import { chunk_nss_luma_derivative } from "./chunk_nss_luma_derivative.js";
7
+ import { NSS_WORKGROUP_SIZE } from "./NSS_CONSTANTS.js";
8
+ import { NSS_SETTINGS_STRUCT } from "./NSS_SETTINGS_STRUCT.js";
9
+
10
+ /**
11
+ * NSS preprocess pass. Runs at render-resolution (one thread per render-res
12
+ * pixel) and produces:
13
+ * 1. The 12-channel network input tensor, packed into a single rgba16f
14
+ * 3D storage texture with depth=3 (channels 0..3, 4..7, 8..11).
15
+ * 2. The encoded "nearest depth offset" used by postprocess to dilate
16
+ * velocity at output-res (`tNearestOffset` — components in [0, 1]
17
+ * decode to {-1, 0, 1}² via `(x*2 - 1)`).
18
+ *
19
+ * Per-pixel logic (matches the algorithm in ARM's `Preprocess()`):
20
+ * 1. Dilate depth over a 3×3 neighbourhood, remember the offset of the
21
+ * nearest sample.
22
+ * 2. Sample velocity at the dilated coord.
23
+ * 3. Project to the previous frame, sample warped history (bilinear).
24
+ * 4. Read the FSR2 depth-clip confidence from the upstream pass and
25
+ * invert it into the network's "high = disocclusion" convention.
26
+ * 5. Sample the warped feedback tensor (bilinear).
27
+ * 6. Compute the luma derivative between current and warped history.
28
+ * 7. Pack everything into the output tensor — colours
29
+ * tonemapped via `Tonemap(EXPOSURE * raw)` to match ARM's training
30
+ * distribution.
31
+ *
32
+ * @see ARM NSS reference: `Preprocess` in
33
+ * `Source/NG-SDK/sdk/include/FidelityFX/gpu/nss/ffx_nss_preprocess.h`
34
+ */
35
+ const resources = new ShaderResourceSetDescriptor();
36
+ resources.createGroup()
37
+ .addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
38
+ // ── inputs at render-res ──
39
+ .addTexture("tColour", "float") // jittered scene colour, render-res
40
+ // depth32float can't be bound as 'float' (filterable) — WebGPU only
41
+ // accepts depth textures via 'unfilterable-float' in this context.
42
+ // We only ever read this via textureLoad inside the depth dilation.
43
+ .addTexture("tDepthCurrent", "unfilterable-float")
44
+ .addTexture("tVelocity", "float") // pixel-space motion vectors, render-res
45
+ // FSR2 depth-clip confidence (1 = trust history, 0 = disocclusion)
46
+ // produced by the engine's shared shader_depth_occlusion_clip pass.
47
+ // We invert it into ARM's "high = disocclusion" network input.
48
+ .addTexture("tDisocclusionConfidence", "float")
49
+ // ── inputs at output-res / feedback at render-res ──
50
+ .addTexture("tHistory", "float") // previous frame upscaled colour, output-res
51
+ .addTexture("tFeedbackIn", "float") // 4-ch feedback tensor from previous frame, render-res
52
+ // ── settings ──
53
+ .addUniform("settings", NSS_SETTINGS_STRUCT)
54
+ // ── outputs ──
55
+ // Single rgba16f 3D storage texture holds the 12-channel input tensor
56
+ // packed across depth=3 layers (4 channels each). rgba16f gives the
57
+ // network ~10 bits of mantissa per channel, which is plenty for
58
+ // normalized [0, 1] inputs after the network's first BN/scale.
59
+ .addStorageTexture("tTensor", "rgba16float", "3d", "write-only")
60
+ // Nearest-depth offset packed as (dx+1, dy+1) / 2 -> [0, 1]. Postprocess
61
+ // uses this to fetch the velocity at the dilated coordinate when warping
62
+ // the history at output-resolution.
63
+ .addStorageTexture("tNearestOffset", "rg8unorm", "2d", "write-only")
64
+ ;
65
+
66
+
67
+ const body = CodeChunk.from(
68
+ //language=WGSL
69
+ `
70
+ const NSS_EXPOSURE: f32 = 7.38905609893; // e^2 — matches ARM's NSSCommon.ush
71
+
72
+ // Karis tonemap (max-of-channels), applied to EXPOSURE-scaled colour.
73
+ // ARM's training distribution: Tonemap(EXPOSURE * raw) -> network input.
74
+ fn nss_tonemap_exposure(rgb: vec3<f32>) -> vec3<f32> {
75
+ let scaled = rgb * NSS_EXPOSURE;
76
+ let m = max(max(scaled.r, scaled.g), scaled.b);
77
+ return scaled / (1.0 + m);
78
+ }
79
+
80
+ // ARM's network was trained against inputs that go through their Quantize
81
+ // formula: int8 = round(fp * 255 - 128). The conv then sees (uint8 - 128)
82
+ // = signed int8 in [-128, 127] - i.e. fp 0 -> -128, fp 0.5 -> 0, fp 1 -> 127.
83
+ // Our pipeline naively feeds fp [0, 1] which has DC offset +0.5 vs ARM's
84
+ // expected DC of 0. The trained head biases were calibrated against that
85
+ // near-zero DC, so feeding +0.5 puts every conv accumulator off by
86
+ // (sum_of_weights * 0.5 * 255) - way outside the trained operating range.
87
+ //
88
+ // We use the SMOOTH (no-round) version of ARM's transform: a linear
89
+ // remap [0, 1] -> approx [-1.008, 1.008] clamped to [-1, 1]. Matches
90
+ // ARM's DC shift but without the round() discontinuities that caused
91
+ // feature-dependent flickering when small jitter-driven input changes
92
+ // pushed pixels across quantization boundaries. Network sensitivity to
93
+ // near-boundary inputs would otherwise flip int8 outputs by 1/127 per
94
+ // frame and propagate through every layer.
95
+ //
96
+ // Per-multiply lands at ~(ARM signed * int8_w) / 127^2, so our acc is
97
+ // approx (ARM int32_acc / 127^2). Our rescale_factor (= 127 * mult /
98
+ // 2^shift) then produces value_fp ~ int8_in / 127 going into the LUT -
99
+ // the shape ARM's network was trained to produce.
100
+ fn nss_arm_quantize(fp: f32) -> f32 {
101
+ return clamp(fp * (255.0 / 127.0) - (128.0 / 127.0), -1.0, 1.0);
102
+ }
103
+
104
+ fn nss_arm_quantize_v3(rgb: vec3<f32>) -> vec3<f32> {
105
+ return vec3<f32>(nss_arm_quantize(rgb.r), nss_arm_quantize(rgb.g), nss_arm_quantize(rgb.b));
106
+ }
107
+
108
+ fn nss_arm_quantize_v4(v: vec4<f32>) -> vec4<f32> {
109
+ return vec4<f32>(nss_arm_quantize(v.x), nss_arm_quantize(v.y), nss_arm_quantize(v.z), nss_arm_quantize(v.w));
110
+ }
111
+
112
+ fn nss_warp_history_sample(prev_uv: vec2<f32>) -> vec3<f32> {
113
+ let on_screen = all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0));
114
+ if (!on_screen) {
115
+ return vec3<f32>(0.0);
116
+ }
117
+ // ARM uses bilinear (LoadHistory in ffx_nss_callbacks_glsl.h:471);
118
+ // Catmull-Rom is opt-in via HISTORY_CATMULL define.
119
+ return max(vec3<f32>(0.0), textureSampleLevel(tHistory, sLinear, prev_uv, 0.0).rgb);
120
+ }
121
+
122
+ fn nss_warp_feedback_sample(prev_uv_render: vec2<f32>) -> vec4<f32> {
123
+ let on_screen = all(prev_uv_render >= vec2<f32>(0.0)) && all(prev_uv_render <= vec2<f32>(1.0));
124
+ if (!on_screen) {
125
+ return vec4<f32>(0.0);
126
+ }
127
+ return textureSampleLevel(tFeedbackIn, sLinear, prev_uv_render, 0.0);
128
+ }
129
+
130
+ @compute @workgroup_size(${NSS_WORKGROUP_SIZE}, ${NSS_WORKGROUP_SIZE}, 1)
131
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
132
+ let render_res_u = settings.render_resolution;
133
+ let render_res = vec2<i32>(render_res_u);
134
+
135
+ if (any(gid.xy >= render_res_u)) {
136
+ return;
137
+ }
138
+
139
+ let st = vec2<i32>(gid.xy);
140
+
141
+ // 1. Depth dilation
142
+ var nearest_off = vec2<i32>(0, 0);
143
+ let _dilated_depth = nss_find_nearest_depth(tDepthCurrent, st, render_res, &nearest_off);
144
+
145
+ // 2. Velocity at the depth-nearest tap (FSR2 strategy — sharpens
146
+ // silhouettes at disocclusion vs picking velocity at the centre).
147
+ let velocity = textureLoad(tVelocity, st + nearest_off, 0).rg;
148
+
149
+ // 3. Reproject to previous frame
150
+ let st_centre = vec2<f32>(st) + 0.5;
151
+ let prev_st_render = st_centre - velocity;
152
+ let prev_uv_render = prev_st_render / vec2<f32>(render_res);
153
+
154
+ // History lives at output resolution but the UV is the same in [0, 1].
155
+ let history_rgb = nss_warp_history_sample(prev_uv_render);
156
+
157
+ // 4. Disocclusion mask. The shared depth-clip pass returns FSR2
158
+ // confidence (1 = trust history, 0 = disocclusion); ARM's network
159
+ // input expects the inverse (high = disocclusion). Multiply by
160
+ // history_validity so a hard reset zeros the mask too.
161
+ let confidence = textureLoad(tDisocclusionConfidence, st, 0).r;
162
+ let disocclusion_mask = (1.0 - saturate(confidence)) * saturate(settings.history_validity);
163
+
164
+ // 5. Warped feedback. Multiplied by history_validity so the very first
165
+ // frame (or any reset) feeds neutral (0.5 raw -> 0 post-quant)
166
+ // feedback to the network instead of garbage from an uninitialised
167
+ // texture.
168
+ //
169
+ // feedback_scale (debug knob, default 1.0) blends between actual FB
170
+ // and the neutral value 0.5. At 0 the network sees raw 0.5 across
171
+ // all FB channels, which post-quantize is ≈0 — the trained
172
+ // "no signal" point, NOT a strong negative signal.
173
+ let feedback_actual = nss_warp_feedback_sample(prev_uv_render);
174
+ let feedback_neutral = vec4<f32>(0.5);
175
+ let feedback = mix(
176
+ feedback_neutral,
177
+ feedback_actual,
178
+ saturate(settings.history_validity) * saturate(settings.feedback_scale),
179
+ );
180
+
181
+ // 6. Current colour (load, no filtering — already at render-res)
182
+ let current_rgb = max(vec3<f32>(0.0), textureLoad(tColour, st, 0).rgb);
183
+
184
+ // 7. Luma derivative — uses raw colours; the chunk handles its own scaling.
185
+ let luma_deriv = nss_luma_derivative(current_rgb, history_rgb);
186
+
187
+ // Tonemap with EXPOSURE applied first — matches ARM's
188
+ // Tonemap(EXPOSURE * raw) training distribution. Raw [0, 1] tonemap
189
+ // (without exposure) lands values 2-5x below the network's trained
190
+ // operating point.
191
+ let history_t = nss_tonemap_exposure(history_rgb);
192
+ let current_t = nss_tonemap_exposure(current_rgb);
193
+
194
+ // Apply ARM's Quantize transformation in fp — converts our [0, 1] inputs
195
+ // into the [-1, 1] signed-int8 / 127 distribution the trained network
196
+ // expects (DC at 0, not +0.5). See nss_arm_quantize header for derivation.
197
+ // settings.quantize_inputs (default 1.0) blends between this transform
198
+ // and the raw [0, 1] tonemap (0.0). Useful as an A/B test knob.
199
+ let q = saturate(settings.quantize_inputs);
200
+ let history_q = mix(history_t, nss_arm_quantize_v3(history_t), q);
201
+ let current_q = mix(current_t, nss_arm_quantize_v3(current_t), q);
202
+ let disocclusion_q = mix(disocclusion_mask, nss_arm_quantize(disocclusion_mask), q);
203
+ let feedback_q = mix(feedback, nss_arm_quantize_v4(feedback), q);
204
+ let luma_deriv_q = mix(luma_deriv, nss_arm_quantize(luma_deriv), q);
205
+
206
+ // ── Pack into 12-channel tensor ──
207
+ // Layout (4ch × depth=3):
208
+ // z=0 : history.rgb, current.r
209
+ // z=1 : current.gb, disocclusion_mask, feedback.r
210
+ // z=2 : feedback.gba, luma_derivative
211
+ textureStore(tTensor, vec3<i32>(st, 0), vec4<f32>(history_q, current_q.r));
212
+ textureStore(tTensor, vec3<i32>(st, 1), vec4<f32>(current_q.g, current_q.b, disocclusion_q, feedback_q.r));
213
+ textureStore(tTensor, vec3<i32>(st, 2), vec4<f32>(feedback_q.gba, luma_deriv_q));
214
+
215
+ // Pack nearest offset for postprocess: (-1, 0, 1) in each axis -> [0, 1]
216
+ let nearest_packed = (vec2<f32>(nearest_off) + 1.0) * 0.5;
217
+ textureStore(tNearestOffset, st, vec4<f32>(nearest_packed, 0.0, 0.0));
218
+ }
219
+ `, [
220
+ chunk_nss_find_nearest_depth,
221
+ chunk_nss_luma_derivative,
222
+ NSS_SETTINGS_STRUCT.declaration_chunk,
223
+ ]
224
+ );
225
+
226
+ export const shader_nss_preprocess = ComputeShader.from({
227
+ label: "NSS / preprocess",
228
+ body,
229
+ resources,
230
+ });
@@ -1,3 +1,17 @@
1
- export const shader_ffx_denoiser_reflections_reproject: ComputeShader;
2
- import { ComputeShader } from "../../../shader/ComputeShader.js";
1
+ /**
2
+ * An unfinished translation of the FidelityFX reflection denoiser's reprojection pass.
3
+ *
4
+ * Not yet a shader, and not yet valid WGSL: the body still carries HLSL spellings the port has not
5
+ * reached (`FfxFloat16x4`, `FfxInt32x2`, `FFX_GROUP_MEMORY_BARRIER`), and `main` is an empty stub
6
+ * with no `@compute` and no `@workgroup_size`. It was a `ComputeShader` here until the workgroup
7
+ * size started being read out of the WGSL, which is a question this source cannot answer; it stays
8
+ * a chunk until someone finishes the port and writes the entry point.
9
+ *
10
+ * The bindings it will want are one texture, `tRadiance`.
11
+ *
12
+ * @see https://github.com/GPUOpen-LibrariesAndSDKs/FidelityFX-SDK/blob/1bbe66e7ea0d358e84af4471a90aa9c35b583de0/sdk/include/FidelityFX/gpu/denoiser/ffx_denoiser_reflections_reproject.h
13
+ * @type {CodeChunk}
14
+ */
15
+ export const chunk_ffx_denoiser_reflections_reproject: CodeChunk;
16
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
3
17
  //# sourceMappingURL=shader_ffx_denoiser_reflections_reproject.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_ffx_denoiser_reflections_reproject.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js"],"names":[],"mappings":"AAqcA,sEAGG;8BApc2B,kCAAkC"}
1
+ {"version":3,"file":"shader_ffx_denoiser_reflections_reproject.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AACH,uDAFU,SAAS,CAubjB;0BArcwB,uCAAuC"}
@@ -2,18 +2,22 @@ import { chunk_unpack_float16_4 } from "../../../shader/chunk/binary/chunk_unpac
2
2
  import { chunk_rgb_to_luminance } from "../../../shader/chunk/color/chunk_rgb_to_luminance.js";
3
3
  import { chunk_dot2 } from "../../../shader/chunk/math/chunk_dot2.js";
4
4
  import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
5
- import { ComputeShader } from "../../../shader/ComputeShader.js";
6
- import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
7
-
8
- const resources = new ShaderResourceSetDescriptor();
9
- resources.createGroup()
10
- .addTexture("tRadiance");
11
5
 
12
6
  /**
7
+ * An unfinished translation of the FidelityFX reflection denoiser's reprojection pass.
8
+ *
9
+ * Not yet a shader, and not yet valid WGSL: the body still carries HLSL spellings the port has not
10
+ * reached (`FfxFloat16x4`, `FfxInt32x2`, `FFX_GROUP_MEMORY_BARRIER`), and `main` is an empty stub
11
+ * with no `@compute` and no `@workgroup_size`. It was a `ComputeShader` here until the workgroup
12
+ * size started being read out of the WGSL, which is a question this source cannot answer; it stays
13
+ * a chunk until someone finishes the port and writes the entry point.
14
+ *
15
+ * The bindings it will want are one texture, `tRadiance`.
16
+ *
13
17
  * @see https://github.com/GPUOpen-LibrariesAndSDKs/FidelityFX-SDK/blob/1bbe66e7ea0d358e84af4471a90aa9c35b583de0/sdk/include/FidelityFX/gpu/denoiser/ffx_denoiser_reflections_reproject.h
14
18
  * @type {CodeChunk}
15
19
  */
16
- const body = CodeChunk.from(
20
+ export const chunk_ffx_denoiser_reflections_reproject = CodeChunk.from(
17
21
  //language=WGSL
18
22
  `
19
23
 
@@ -450,8 +454,4 @@ fn main(){
450
454
  chunk_rgb_to_luminance,
451
455
  chunk_dot2,
452
456
  ]
453
- );
454
- export const shader_ffx_denoiser_reflections_reproject = ComputeShader.from({
455
- label: "ffx_denoiser_reflections_reproject",
456
- body
457
- });
457
+ );
@@ -316,9 +316,9 @@ export function graph_prepare_meshlet_draw_commands_by_material({
316
316
  const prefix_sums = resources.get(data.prefix_sums);
317
317
  const commands = resources.get(data.commands);
318
318
 
319
- shader_make_meshlet_indirect_draw_commands_by_material.dispatchLinear({
319
+ shader_make_meshlet_indirect_draw_commands_by_material.dispatchThreads({
320
320
  encoder: context.encoder,
321
- element_count: material_count,
321
+ thread_count_x: material_count,
322
322
  bindings: {
323
323
  commands,
324
324
  prefix_sums,
@@ -1 +1 @@
1
- {"version":3,"file":"shader_count_meshlets_by_material.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js"],"names":[],"mappings":"AAgEA,8DAKE;8BA1D4B,+BAA+B"}
1
+ {"version":3,"file":"shader_count_meshlets_by_material.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js"],"names":[],"mappings":"AAgEA,8DAIE;8BAzD4B,+BAA+B"}