@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,292 +1,291 @@
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 { NSS_WORKGROUP_SIZE } from "./NSS_CONSTANTS.js";
6
- import { NSS_SETTINGS_STRUCT } from "./NSS_SETTINGS_STRUCT.js";
7
-
8
- /**
9
- * NSS postprocess pass. Runs at output-resolution (one thread per output
10
- * pixel). Reads:
11
- * - the per-render-pixel KPN columns (z=2..5 of the network output 3D
12
- * texture, in REVERSE order — slot 5 is column 0). Each column has
13
- * 4 channels = the 4 row weights for that column.
14
- * - the per-render-pixel ThetaAlpha (z=1): theta in .x (history blend
15
- * weight, [0, 1]), alpha in .y (accumulation rate, scaled to
16
- * [0.05, 0.4])
17
- * - the jittered scene colour at render-res (used for the spatial taps)
18
- * - the warped history at output-res
19
- * - the nearest-depth offset from preprocess (used to dilate velocity)
20
- *
21
- * Per-output-pixel logic mirrors ARM's reference (UE5.5 NSSPostprocess.usf):
22
- * 1. Solve which render-res pixel feeds each of the 4x4 KPN taps.
23
- * 2. Apply the KPN to those taps, normalising by the weight sum.
24
- * 3. Warp the history (bilinear) using velocity dilated by the nearest
25
- * depth offset.
26
- * 4. Blend the KPN colour with warped history using theta.
27
- * 5. In tonemapped (Karis) space, accumulate the center tap with alpha.
28
- * 6. Inverse tonemap, divide by EXPOSURE, write.
29
- *
30
- * @see ARM reference: UE5.5/Shaders/Private/NSSPostprocess.usf and
31
- * NSSCommon.ush in github.com/arm/neural-graphics-for-unreal
32
- */
33
-
34
- const resources = new ShaderResourceSetDescriptor();
35
- resources.createGroup()
36
- .addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
37
- // ── KPN coefficients + ThetaAlpha + FB (network output, 3D, depth=6) ──
38
- .addTexture("tNetworkOut", "float", "3d")
39
- // ── render-res inputs ──
40
- .addTexture("tColour", "float") // jittered scene colour
41
- .addTexture("tVelocity", "float") // pixel-space motion vectors
42
- .addTexture("tNearestOffset", "float") // packed (-1, 0, 1)² offset
43
- // ── output-res input ──
44
- .addTexture("tHistory", "float") // previous frame upscaled colour
45
- // ── settings ──
46
- .addUniform("settings", NSS_SETTINGS_STRUCT)
47
- // ── outputs ──
48
- .addStorageTexture("tOutput", "rgba16float", "2d", "write-only")
49
- ;
50
-
51
-
52
- const body = CodeChunk.from(
53
- //language=WGSL
54
- `
55
- const NSS_EXPOSURE: f32 = 7.38905609893; // e^2, matches ARM's NSSCommon.ush
56
-
57
- // Karis tonemap (max-of-channels) — matches ARM's NSSCommon.ush.
58
- fn nss_tonemap(rgb: vec3<f32>) -> vec3<f32> {
59
- let m = max(max(rgb.r, rgb.g), rgb.b);
60
- return rgb / (1.0 + m);
61
- }
62
-
63
- // Karis inverse — clamp to dodge the inf at m == 1.0.
64
- fn nss_tonemap_inv(rgb: vec3<f32>) -> vec3<f32> {
65
- let c = clamp(rgb, vec3<f32>(0.0), vec3<f32>(0.99999));
66
- let m = max(max(c.r, c.g), c.b);
67
- return c / (1.0 - m);
68
- }
69
-
70
- fn nss_warped_history(prev_uv: vec2<f32>) -> vec3<f32> {
71
- let on_screen = all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0));
72
- if (!on_screen) {
73
- return vec3<f32>(0.0);
74
- }
75
- // ARM uses Catmull-Rom by default for the history warp; bilinear is the
76
- // simpler approximation we keep here. (Catmull-Rom is in their
77
- // CatmullRomWithDering helper — TODO: port if quality demands it.)
78
- return max(vec3<f32>(0.0), textureSampleLevel(tHistory, sLinear, prev_uv, 0.0).rgb);
79
- }
80
-
81
- // Bilinear-sample a single z-slice of the network output 3D texture at a
82
- // render-res pixel position. Mirrors ARM's ManualBilinear4 — without this
83
- // every 2x2 output block in 2x mode would share the same per-render-pixel
84
- // theta/alpha/KPN values, leaving sharp blocky transitions. We do manual
85
- // 4-tap bilinear (rather than textureSampleLevel with the linear sampler)
86
- // so adjacent z layers — which carry semantically different head outputs —
87
- // don't get filtered together.
88
- fn nss_sample_layer_bilinear(render_pos: vec2<f32>, render_res_max: vec2<i32>, layer: i32) -> vec4<f32> {
89
- let pos = render_pos - 0.5;
90
- let base = floor(pos);
91
- let frac = pos - base;
92
- let bi = vec2<i32>(base);
93
- let lo = vec2<i32>(0, 0);
94
- let s00 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi, lo, render_res_max), layer), 0);
95
- let s10 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(1,0), lo, render_res_max), layer), 0);
96
- let s01 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(0,1), lo, render_res_max), layer), 0);
97
- let s11 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(1,1), lo, render_res_max), layer), 0);
98
- return mix(mix(s00, s10, frac.x), mix(s01, s11, frac.x), frac.y);
99
- }
100
-
101
- // SolveInputLocation: figure out which render-res pixel maps to a given
102
- // output-res pixel position, given upscale ratio and jitter. Direct port
103
- // of ARM's helper (NSSPostprocess.usf:80). Returns -1 when no render-res
104
- // sample lands at this output position.
105
- fn nss_solve_input_location(out_idx: i32, upscale: f32, jitter: f32) -> i32 {
106
- let lower = f32(out_idx) / upscale - (-jitter + 0.5);
107
- let upper = f32(out_idx + 1) / upscale - (-jitter + 0.5);
108
- let candidate = i32(floor(upper));
109
- if (lower < f32(candidate)) {
110
- return candidate;
111
- }
112
- return -1;
113
- }
114
-
115
- @compute @workgroup_size(${NSS_WORKGROUP_SIZE}, ${NSS_WORKGROUP_SIZE}, 1)
116
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
117
- let out_res_u = settings.output_resolution;
118
- let render_res_u = settings.render_resolution;
119
-
120
- if (any(gid.xy >= out_res_u)) {
121
- return;
122
- }
123
-
124
- let out_st = vec2<i32>(gid.xy);
125
- let render_res = vec2<i32>(render_res_u);
126
-
127
- let out_res_f = vec2<f32>(out_res_u);
128
- let render_res_f = vec2<f32>(render_res_u);
129
- let upscale = out_res_f / render_res_f;
130
-
131
- // Render-res pixel that hosts this output pixel's nearest network sample.
132
- // (Used for the per-render-res velocity / nearest-offset taps; the
133
- // network's per-pixel theta/alpha/KPN outputs are bilinear-sampled at
134
- // the OUTPUT pixel's render-res position instead — see below.)
135
- let render_centre = (vec2<f32>(out_st) + 0.5) / upscale;
136
- let coef_st = vec2<i32>(floor(render_centre));
137
- let render_res_max = render_res - vec2<i32>(1, 1);
138
- let coef_st_clamped = clamp(coef_st, vec2<i32>(0, 0), render_res_max);
139
-
140
- // ── KPN columns ──
141
- // ARM's quantized model maps OutputIndices.KPNFilterCol0 = 5,
142
- // KPNFilterCol1 = 4, KPNFilterCol2 = 3, KPNFilterCol3 = 2 (NSS.cpp:243).
143
- // Each column has 4 channels = the 4 row weights for that column.
144
- // Bilinear at render_centre (matches ARM's ManualBilinear4) — without
145
- // this, every 2x2 output block in 2x mode shares one set of weights and
146
- // we get blocky/jittery transitions across cell boundaries.
147
- let col0 = nss_sample_layer_bilinear(render_centre, render_res_max, 5);
148
- let col1 = nss_sample_layer_bilinear(render_centre, render_res_max, 4);
149
- let col2 = nss_sample_layer_bilinear(render_centre, render_res_max, 3);
150
- let col3 = nss_sample_layer_bilinear(render_centre, render_res_max, 2);
151
- // Force tiny positive — ARM does this to dodge 0/0 in the
152
- // weight-normalisation divide (NSSPostprocess.usf:118).
153
- let kpn_cols = array<vec4<f32>, 4>(
154
- max(col0, vec4<f32>(1e-7)),
155
- max(col1, vec4<f32>(1e-7)),
156
- max(col2, vec4<f32>(1e-7)),
157
- max(col3, vec4<f32>(1e-7)),
158
- );
159
-
160
- // ── Apply KPN ──
161
- // Outer loop is column index (matches ARM's "for x in 0..3" - we
162
- // load the 4 cols above and pick by index here). Inner loop is row
163
- // index. Each (col, row) tap reads the render-res sample at
164
- // OutputPixelPos + (col-1, row-1) and accumulates colour * weight,
165
- // with the centre tap (col=1, row=1) also captured for the
166
- // alpha-blend stage.
167
- var filtered_rgb = vec3<f32>(0.0);
168
- var weight_sum = 0.0;
169
- var center_tap_rgb = vec3<f32>(0.0);
170
- var center_tap_present = 0.0;
171
- for (var x = 0; x < 4; x = x + 1) {
172
- let col = kpn_cols[x];
173
- for (var y = 0; y < 4; y = y + 1) {
174
- let weight = col[y];
175
- let tap_out = out_st + vec2<i32>(x - 1, y - 1);
176
-
177
- let in_x = nss_solve_input_location(tap_out.x, upscale.x, settings.jitter.x * settings.jitter_sign.x);
178
- let in_y = nss_solve_input_location(tap_out.y, upscale.y, settings.jitter.y * settings.jitter_sign.y);
179
- if (in_x < 0 || in_y < 0) {
180
- continue;
181
- }
182
-
183
- let sample_st = clamp(vec2<i32>(in_x, in_y), vec2<i32>(0, 0), render_res - vec2<i32>(1, 1));
184
- let sample_rgb = max(vec3<f32>(0.0), textureLoad(tColour, sample_st, 0).rgb) * NSS_EXPOSURE;
185
-
186
- filtered_rgb += sample_rgb * weight;
187
- weight_sum += weight;
188
-
189
- if (x == 1 && y == 1) {
190
- center_tap_rgb = sample_rgb;
191
- center_tap_present = 1.0;
192
- }
193
- }
194
- }
195
- let kpn_rgb = filtered_rgb / max(weight_sum, 1e-5);
196
-
197
- // ── Warp history ──
198
- // Decode the nearest-depth offset to {-1, 0, 1}², use it to dilate
199
- // the velocity tap to the depth-nearest sample (same trick as
200
- // preprocess).
201
- let nearest_packed = textureLoad(tNearestOffset, coef_st_clamped, 0).rg;
202
- let nearest_offset = vec2<i32>(round(nearest_packed * 2.0 - 1.0));
203
-
204
- var velocity = textureLoad(tVelocity, coef_st_clamped + nearest_offset, 0).rg;
205
- // Motion zero-clamp (ARM NSSPostprocess.usf:215). Sub-pixel velocity on
206
- // near-static frames drifts prev_uv by fractions of a pixel each frame
207
- // and bilinear-resamples the history at slightly different sub-pixel
208
- // positions — visible as flicker even when nothing in the scene is
209
- // moving. ARM's threshold is 0.1 input pixels.
210
- if (length(velocity) <= 0.1) {
211
- velocity = vec2<f32>(0.0);
212
- }
213
- let velocity_out = velocity / (render_res_f / out_res_f); // render-res pixels → output-res pixels
214
-
215
- let prev_out_st = vec2<f32>(out_st) + 0.5 - velocity_out;
216
- let prev_uv = prev_out_st / out_res_f;
217
-
218
- let history_rgb = nss_warped_history(prev_uv) * NSS_EXPOSURE;
219
- let on_screen_f = select(0.0, 1.0, all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0)));
220
-
221
- // ── ThetaAlpha (head slot 1) ──
222
- // ARM's quantized model maps OutputIndices.ThetaAlpha = 1
223
- // (NSS.cpp:242). Channel x = theta (history blend weight, [0, 1] from
224
- // sigmoid LUT), channel y = alpha (raw [0, 1], remapped to
225
- // [0.05, 0.4] per NSSPostprocess.usf:248).
226
- // Bilinear at render_centre — same reasoning as the KPN cols above.
227
- let ta = nss_sample_layer_bilinear(render_centre, render_res_max, 1);
228
- let theta_network = saturate(ta.x);
229
- let theta_raw = select(theta_network, saturate(settings.theta_override), settings.theta_override >= 0.0);
230
- let theta = theta_raw * saturate(settings.history_validity) * on_screen_f;
231
- let alpha = (0.35 * saturate(ta.y) + 0.05) * settings.alpha_blend_scale;
232
-
233
- // ── Stage 1: blend KPN with warped history ──
234
- var blended = mix(kpn_rgb, history_rgb, theta);
235
-
236
- // ── Stage 2: accumulate centre tap in tonemapped space ──
237
- blended = mix(
238
- nss_tonemap(blended),
239
- nss_tonemap(center_tap_rgb),
240
- alpha * center_tap_present,
241
- );
242
-
243
- var final_rgb = max(vec3<f32>(0.0), nss_tonemap_inv(blended)) / NSS_EXPOSURE;
244
-
245
- // Debug visualisation. Useful for SEEING per-pixel network output
246
- // stability: a stable scene should produce a stable, spatially-varying
247
- // grayscale. Uniform gray = network has lost spatial discrimination
248
- // (only the bias survives). Flickering = network output itself is the
249
- // noise source.
250
- //
251
- // 1 = theta (slot 1.x sigmoid)
252
- // 2 = alpha (slot 1.y sigmoid)
253
- // 3 = KPN col 0 channel 0 (the (col=0, row=0) kernel weight at slot 5.x)
254
- // 4 = KPN total weight sum (all 16 weights, should be ~1 for a healthy
255
- // normalised kernel)
256
- // 5 = FB channel 0 (slot 0.x feedback)
257
- let dv = settings.debug_view;
258
- if (dv == 1u) {
259
- final_rgb = vec3<f32>(theta_network);
260
- } else if (dv == 2u) {
261
- final_rgb = vec3<f32>(saturate(ta.y));
262
- } else if (dv == 3u) {
263
- final_rgb = vec3<f32>(kpn_cols[0].x);
264
- } else if (dv == 4u) {
265
- // Sum the 4 channels of each col, then sum across cols. Visualises
266
- // how much "weight" the network is allocating in total. ARM's
267
- // post-norm KPN should sum to ~1; if uniformly mid-grey here too,
268
- // every head is bias-dominated.
269
- let sum_c = (kpn_cols[0] + kpn_cols[1] + kpn_cols[2] + kpn_cols[3]);
270
- let total = sum_c.x + sum_c.y + sum_c.z + sum_c.w;
271
- final_rgb = vec3<f32>(total * 0.25); // /4 to keep it visually in [0, 1]-ish
272
- } else if (dv == 5u) {
273
- let fb = nss_sample_layer_bilinear(render_centre, render_res_max, 0);
274
- final_rgb = vec3<f32>(fb.x);
275
- }
276
-
277
- // Alpha channel of the output stores the effective history weight, so
278
- // downstream passes (e.g. sharpening, post-filtering) can dampen
279
- // their effect where temporal accumulation is doing the heavy lifting.
280
- textureStore(tOutput, out_st, vec4<f32>(final_rgb, theta));
281
- }
282
- `, [
283
- NSS_SETTINGS_STRUCT.declaration_chunk,
284
- ]
285
- );
286
-
287
- export const shader_nss_postprocess = ComputeShader.from({
288
- label: "NSS / postprocess",
289
- body,
290
- resources,
291
- group_size: [NSS_WORKGROUP_SIZE, NSS_WORKGROUP_SIZE, 1],
292
- });
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 { NSS_WORKGROUP_SIZE } from "./NSS_CONSTANTS.js";
6
+ import { NSS_SETTINGS_STRUCT } from "./NSS_SETTINGS_STRUCT.js";
7
+
8
+ /**
9
+ * NSS postprocess pass. Runs at output-resolution (one thread per output
10
+ * pixel). Reads:
11
+ * - the per-render-pixel KPN columns (z=2..5 of the network output 3D
12
+ * texture, in REVERSE order — slot 5 is column 0). Each column has
13
+ * 4 channels = the 4 row weights for that column.
14
+ * - the per-render-pixel ThetaAlpha (z=1): theta in .x (history blend
15
+ * weight, [0, 1]), alpha in .y (accumulation rate, scaled to
16
+ * [0.05, 0.4])
17
+ * - the jittered scene colour at render-res (used for the spatial taps)
18
+ * - the warped history at output-res
19
+ * - the nearest-depth offset from preprocess (used to dilate velocity)
20
+ *
21
+ * Per-output-pixel logic mirrors ARM's reference (UE5.5 NSSPostprocess.usf):
22
+ * 1. Solve which render-res pixel feeds each of the 4x4 KPN taps.
23
+ * 2. Apply the KPN to those taps, normalising by the weight sum.
24
+ * 3. Warp the history (bilinear) using velocity dilated by the nearest
25
+ * depth offset.
26
+ * 4. Blend the KPN colour with warped history using theta.
27
+ * 5. In tonemapped (Karis) space, accumulate the center tap with alpha.
28
+ * 6. Inverse tonemap, divide by EXPOSURE, write.
29
+ *
30
+ * @see ARM reference: UE5.5/Shaders/Private/NSSPostprocess.usf and
31
+ * NSSCommon.ush in github.com/arm/neural-graphics-for-unreal
32
+ */
33
+
34
+ const resources = new ShaderResourceSetDescriptor();
35
+ resources.createGroup()
36
+ .addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
37
+ // ── KPN coefficients + ThetaAlpha + FB (network output, 3D, depth=6) ──
38
+ .addTexture("tNetworkOut", "float", "3d")
39
+ // ── render-res inputs ──
40
+ .addTexture("tColour", "float") // jittered scene colour
41
+ .addTexture("tVelocity", "float") // pixel-space motion vectors
42
+ .addTexture("tNearestOffset", "float") // packed (-1, 0, 1)² offset
43
+ // ── output-res input ──
44
+ .addTexture("tHistory", "float") // previous frame upscaled colour
45
+ // ── settings ──
46
+ .addUniform("settings", NSS_SETTINGS_STRUCT)
47
+ // ── outputs ──
48
+ .addStorageTexture("tOutput", "rgba16float", "2d", "write-only")
49
+ ;
50
+
51
+
52
+ const body = CodeChunk.from(
53
+ //language=WGSL
54
+ `
55
+ const NSS_EXPOSURE: f32 = 7.38905609893; // e^2, matches ARM's NSSCommon.ush
56
+
57
+ // Karis tonemap (max-of-channels) — matches ARM's NSSCommon.ush.
58
+ fn nss_tonemap(rgb: vec3<f32>) -> vec3<f32> {
59
+ let m = max(max(rgb.r, rgb.g), rgb.b);
60
+ return rgb / (1.0 + m);
61
+ }
62
+
63
+ // Karis inverse — clamp to dodge the inf at m == 1.0.
64
+ fn nss_tonemap_inv(rgb: vec3<f32>) -> vec3<f32> {
65
+ let c = clamp(rgb, vec3<f32>(0.0), vec3<f32>(0.99999));
66
+ let m = max(max(c.r, c.g), c.b);
67
+ return c / (1.0 - m);
68
+ }
69
+
70
+ fn nss_warped_history(prev_uv: vec2<f32>) -> vec3<f32> {
71
+ let on_screen = all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0));
72
+ if (!on_screen) {
73
+ return vec3<f32>(0.0);
74
+ }
75
+ // ARM uses Catmull-Rom by default for the history warp; bilinear is the
76
+ // simpler approximation we keep here. (Catmull-Rom is in their
77
+ // CatmullRomWithDering helper — TODO: port if quality demands it.)
78
+ return max(vec3<f32>(0.0), textureSampleLevel(tHistory, sLinear, prev_uv, 0.0).rgb);
79
+ }
80
+
81
+ // Bilinear-sample a single z-slice of the network output 3D texture at a
82
+ // render-res pixel position. Mirrors ARM's ManualBilinear4 — without this
83
+ // every 2x2 output block in 2x mode would share the same per-render-pixel
84
+ // theta/alpha/KPN values, leaving sharp blocky transitions. We do manual
85
+ // 4-tap bilinear (rather than textureSampleLevel with the linear sampler)
86
+ // so adjacent z layers — which carry semantically different head outputs —
87
+ // don't get filtered together.
88
+ fn nss_sample_layer_bilinear(render_pos: vec2<f32>, render_res_max: vec2<i32>, layer: i32) -> vec4<f32> {
89
+ let pos = render_pos - 0.5;
90
+ let base = floor(pos);
91
+ let frac = pos - base;
92
+ let bi = vec2<i32>(base);
93
+ let lo = vec2<i32>(0, 0);
94
+ let s00 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi, lo, render_res_max), layer), 0);
95
+ let s10 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(1,0), lo, render_res_max), layer), 0);
96
+ let s01 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(0,1), lo, render_res_max), layer), 0);
97
+ let s11 = textureLoad(tNetworkOut, vec3<i32>(clamp(bi + vec2<i32>(1,1), lo, render_res_max), layer), 0);
98
+ return mix(mix(s00, s10, frac.x), mix(s01, s11, frac.x), frac.y);
99
+ }
100
+
101
+ // SolveInputLocation: figure out which render-res pixel maps to a given
102
+ // output-res pixel position, given upscale ratio and jitter. Direct port
103
+ // of ARM's helper (NSSPostprocess.usf:80). Returns -1 when no render-res
104
+ // sample lands at this output position.
105
+ fn nss_solve_input_location(out_idx: i32, upscale: f32, jitter: f32) -> i32 {
106
+ let lower = f32(out_idx) / upscale - (-jitter + 0.5);
107
+ let upper = f32(out_idx + 1) / upscale - (-jitter + 0.5);
108
+ let candidate = i32(floor(upper));
109
+ if (lower < f32(candidate)) {
110
+ return candidate;
111
+ }
112
+ return -1;
113
+ }
114
+
115
+ @compute @workgroup_size(${NSS_WORKGROUP_SIZE}, ${NSS_WORKGROUP_SIZE}, 1)
116
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
117
+ let out_res_u = settings.output_resolution;
118
+ let render_res_u = settings.render_resolution;
119
+
120
+ if (any(gid.xy >= out_res_u)) {
121
+ return;
122
+ }
123
+
124
+ let out_st = vec2<i32>(gid.xy);
125
+ let render_res = vec2<i32>(render_res_u);
126
+
127
+ let out_res_f = vec2<f32>(out_res_u);
128
+ let render_res_f = vec2<f32>(render_res_u);
129
+ let upscale = out_res_f / render_res_f;
130
+
131
+ // Render-res pixel that hosts this output pixel's nearest network sample.
132
+ // (Used for the per-render-res velocity / nearest-offset taps; the
133
+ // network's per-pixel theta/alpha/KPN outputs are bilinear-sampled at
134
+ // the OUTPUT pixel's render-res position instead — see below.)
135
+ let render_centre = (vec2<f32>(out_st) + 0.5) / upscale;
136
+ let coef_st = vec2<i32>(floor(render_centre));
137
+ let render_res_max = render_res - vec2<i32>(1, 1);
138
+ let coef_st_clamped = clamp(coef_st, vec2<i32>(0, 0), render_res_max);
139
+
140
+ // ── KPN columns ──
141
+ // ARM's quantized model maps OutputIndices.KPNFilterCol0 = 5,
142
+ // KPNFilterCol1 = 4, KPNFilterCol2 = 3, KPNFilterCol3 = 2 (NSS.cpp:243).
143
+ // Each column has 4 channels = the 4 row weights for that column.
144
+ // Bilinear at render_centre (matches ARM's ManualBilinear4) — without
145
+ // this, every 2x2 output block in 2x mode shares one set of weights and
146
+ // we get blocky/jittery transitions across cell boundaries.
147
+ let col0 = nss_sample_layer_bilinear(render_centre, render_res_max, 5);
148
+ let col1 = nss_sample_layer_bilinear(render_centre, render_res_max, 4);
149
+ let col2 = nss_sample_layer_bilinear(render_centre, render_res_max, 3);
150
+ let col3 = nss_sample_layer_bilinear(render_centre, render_res_max, 2);
151
+ // Force tiny positive — ARM does this to dodge 0/0 in the
152
+ // weight-normalisation divide (NSSPostprocess.usf:118).
153
+ let kpn_cols = array<vec4<f32>, 4>(
154
+ max(col0, vec4<f32>(1e-7)),
155
+ max(col1, vec4<f32>(1e-7)),
156
+ max(col2, vec4<f32>(1e-7)),
157
+ max(col3, vec4<f32>(1e-7)),
158
+ );
159
+
160
+ // ── Apply KPN ──
161
+ // Outer loop is column index (matches ARM's "for x in 0..3" - we
162
+ // load the 4 cols above and pick by index here). Inner loop is row
163
+ // index. Each (col, row) tap reads the render-res sample at
164
+ // OutputPixelPos + (col-1, row-1) and accumulates colour * weight,
165
+ // with the centre tap (col=1, row=1) also captured for the
166
+ // alpha-blend stage.
167
+ var filtered_rgb = vec3<f32>(0.0);
168
+ var weight_sum = 0.0;
169
+ var center_tap_rgb = vec3<f32>(0.0);
170
+ var center_tap_present = 0.0;
171
+ for (var x = 0; x < 4; x = x + 1) {
172
+ let col = kpn_cols[x];
173
+ for (var y = 0; y < 4; y = y + 1) {
174
+ let weight = col[y];
175
+ let tap_out = out_st + vec2<i32>(x - 1, y - 1);
176
+
177
+ let in_x = nss_solve_input_location(tap_out.x, upscale.x, settings.jitter.x * settings.jitter_sign.x);
178
+ let in_y = nss_solve_input_location(tap_out.y, upscale.y, settings.jitter.y * settings.jitter_sign.y);
179
+ if (in_x < 0 || in_y < 0) {
180
+ continue;
181
+ }
182
+
183
+ let sample_st = clamp(vec2<i32>(in_x, in_y), vec2<i32>(0, 0), render_res - vec2<i32>(1, 1));
184
+ let sample_rgb = max(vec3<f32>(0.0), textureLoad(tColour, sample_st, 0).rgb) * NSS_EXPOSURE;
185
+
186
+ filtered_rgb += sample_rgb * weight;
187
+ weight_sum += weight;
188
+
189
+ if (x == 1 && y == 1) {
190
+ center_tap_rgb = sample_rgb;
191
+ center_tap_present = 1.0;
192
+ }
193
+ }
194
+ }
195
+ let kpn_rgb = filtered_rgb / max(weight_sum, 1e-5);
196
+
197
+ // ── Warp history ──
198
+ // Decode the nearest-depth offset to {-1, 0, 1}², use it to dilate
199
+ // the velocity tap to the depth-nearest sample (same trick as
200
+ // preprocess).
201
+ let nearest_packed = textureLoad(tNearestOffset, coef_st_clamped, 0).rg;
202
+ let nearest_offset = vec2<i32>(round(nearest_packed * 2.0 - 1.0));
203
+
204
+ var velocity = textureLoad(tVelocity, coef_st_clamped + nearest_offset, 0).rg;
205
+ // Motion zero-clamp (ARM NSSPostprocess.usf:215). Sub-pixel velocity on
206
+ // near-static frames drifts prev_uv by fractions of a pixel each frame
207
+ // and bilinear-resamples the history at slightly different sub-pixel
208
+ // positions — visible as flicker even when nothing in the scene is
209
+ // moving. ARM's threshold is 0.1 input pixels.
210
+ if (length(velocity) <= 0.1) {
211
+ velocity = vec2<f32>(0.0);
212
+ }
213
+ let velocity_out = velocity / (render_res_f / out_res_f); // render-res pixels → output-res pixels
214
+
215
+ let prev_out_st = vec2<f32>(out_st) + 0.5 - velocity_out;
216
+ let prev_uv = prev_out_st / out_res_f;
217
+
218
+ let history_rgb = nss_warped_history(prev_uv) * NSS_EXPOSURE;
219
+ let on_screen_f = select(0.0, 1.0, all(prev_uv >= vec2<f32>(0.0)) && all(prev_uv <= vec2<f32>(1.0)));
220
+
221
+ // ── ThetaAlpha (head slot 1) ──
222
+ // ARM's quantized model maps OutputIndices.ThetaAlpha = 1
223
+ // (NSS.cpp:242). Channel x = theta (history blend weight, [0, 1] from
224
+ // sigmoid LUT), channel y = alpha (raw [0, 1], remapped to
225
+ // [0.05, 0.4] per NSSPostprocess.usf:248).
226
+ // Bilinear at render_centre — same reasoning as the KPN cols above.
227
+ let ta = nss_sample_layer_bilinear(render_centre, render_res_max, 1);
228
+ let theta_network = saturate(ta.x);
229
+ let theta_raw = select(theta_network, saturate(settings.theta_override), settings.theta_override >= 0.0);
230
+ let theta = theta_raw * saturate(settings.history_validity) * on_screen_f;
231
+ let alpha = (0.35 * saturate(ta.y) + 0.05) * settings.alpha_blend_scale;
232
+
233
+ // ── Stage 1: blend KPN with warped history ──
234
+ var blended = mix(kpn_rgb, history_rgb, theta);
235
+
236
+ // ── Stage 2: accumulate centre tap in tonemapped space ──
237
+ blended = mix(
238
+ nss_tonemap(blended),
239
+ nss_tonemap(center_tap_rgb),
240
+ alpha * center_tap_present,
241
+ );
242
+
243
+ var final_rgb = max(vec3<f32>(0.0), nss_tonemap_inv(blended)) / NSS_EXPOSURE;
244
+
245
+ // Debug visualisation. Useful for SEEING per-pixel network output
246
+ // stability: a stable scene should produce a stable, spatially-varying
247
+ // grayscale. Uniform gray = network has lost spatial discrimination
248
+ // (only the bias survives). Flickering = network output itself is the
249
+ // noise source.
250
+ //
251
+ // 1 = theta (slot 1.x sigmoid)
252
+ // 2 = alpha (slot 1.y sigmoid)
253
+ // 3 = KPN col 0 channel 0 (the (col=0, row=0) kernel weight at slot 5.x)
254
+ // 4 = KPN total weight sum (all 16 weights, should be ~1 for a healthy
255
+ // normalised kernel)
256
+ // 5 = FB channel 0 (slot 0.x feedback)
257
+ let dv = settings.debug_view;
258
+ if (dv == 1u) {
259
+ final_rgb = vec3<f32>(theta_network);
260
+ } else if (dv == 2u) {
261
+ final_rgb = vec3<f32>(saturate(ta.y));
262
+ } else if (dv == 3u) {
263
+ final_rgb = vec3<f32>(kpn_cols[0].x);
264
+ } else if (dv == 4u) {
265
+ // Sum the 4 channels of each col, then sum across cols. Visualises
266
+ // how much "weight" the network is allocating in total. ARM's
267
+ // post-norm KPN should sum to ~1; if uniformly mid-grey here too,
268
+ // every head is bias-dominated.
269
+ let sum_c = (kpn_cols[0] + kpn_cols[1] + kpn_cols[2] + kpn_cols[3]);
270
+ let total = sum_c.x + sum_c.y + sum_c.z + sum_c.w;
271
+ final_rgb = vec3<f32>(total * 0.25); // /4 to keep it visually in [0, 1]-ish
272
+ } else if (dv == 5u) {
273
+ let fb = nss_sample_layer_bilinear(render_centre, render_res_max, 0);
274
+ final_rgb = vec3<f32>(fb.x);
275
+ }
276
+
277
+ // Alpha channel of the output stores the effective history weight, so
278
+ // downstream passes (e.g. sharpening, post-filtering) can dampen
279
+ // their effect where temporal accumulation is doing the heavy lifting.
280
+ textureStore(tOutput, out_st, vec4<f32>(final_rgb, theta));
281
+ }
282
+ `, [
283
+ NSS_SETTINGS_STRUCT.declaration_chunk,
284
+ ]
285
+ );
286
+
287
+ export const shader_nss_postprocess = ComputeShader.from({
288
+ label: "NSS / postprocess",
289
+ body,
290
+ resources,
291
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_nss_preprocess.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/nss/shader_nss_preprocess.js"],"names":[],"mappings":"AAiOA,kDAKG;8BArO2B,+BAA+B"}
1
+ {"version":3,"file":"shader_nss_preprocess.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/nss/shader_nss_preprocess.js"],"names":[],"mappings":"AAiOA,kDAIG;8BApO2B,+BAA+B"}