@woosh/meep-engine 3.11.3 → 3.13.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 (596) 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/GPUDecalRenderer.js +3 -3
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  169. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  172. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  175. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  176. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  177. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  178. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  179. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  180. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  181. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  182. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  183. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  184. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  185. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  186. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  187. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  188. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  189. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  190. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  191. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  192. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  193. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  194. package/src/shade/RENDERER_CONTRACT.md +2 -1
  195. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  196. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  197. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  198. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +750 -0
  199. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  200. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  201. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  202. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  203. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  204. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  205. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  206. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  207. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  208. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  209. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  210. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  211. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  212. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  213. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  214. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  215. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  216. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  217. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  218. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -2
  219. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  220. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -2
  221. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  222. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +135 -134
  223. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  224. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  225. package/src/shade/renderer/Renderer.d.ts +0 -6
  226. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  227. package/src/shade/renderer/Renderer.js +0 -29
  228. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  229. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  230. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  231. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  232. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  233. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  234. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  235. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  236. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  237. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  238. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  239. package/src/shade/renderer/animation/shader_animation_tick.js +4 -2
  240. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  241. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  242. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  243. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +3 -2
  244. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  245. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +4 -2
  246. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  247. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  248. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +24 -10
  249. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  250. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +3 -2
  251. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  252. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +5 -2
  253. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  254. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  255. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  256. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
  257. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  258. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  259. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  260. package/src/shade/renderer/buffer/table/GPUDatabase.js +16 -22
  261. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  262. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  263. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  264. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +11 -5
  265. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  266. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +43 -42
  267. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  268. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  269. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  270. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  271. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  272. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  273. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  274. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  275. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  276. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  277. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  278. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  279. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  280. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  281. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  282. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +5 -2
  283. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  284. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +3 -11
  285. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  286. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  287. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +6 -4
  288. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  289. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  290. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  291. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  292. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  293. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  294. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  295. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  296. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  297. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  298. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  299. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  300. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  301. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  302. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  303. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +9 -6
  304. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  305. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  306. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  307. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  308. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  309. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  310. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  311. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  312. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  313. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  314. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +10 -10
  315. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  316. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +4 -2
  317. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  318. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -83
  319. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  320. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +4 -2
  321. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  322. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  323. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  324. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  325. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  326. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  327. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -85
  328. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  329. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -192
  330. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  331. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  332. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  333. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  334. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  335. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  336. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  337. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  338. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  339. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  340. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  341. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  342. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  343. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  344. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  345. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +4 -7
  346. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  347. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  348. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  349. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  350. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  351. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  352. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  353. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  354. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  355. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  356. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  357. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  358. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  359. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  360. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  361. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  362. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  363. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  364. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  365. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  366. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  367. package/src/shade/renderer/particles/graph_particles.js +5 -3
  368. package/src/shade/renderer/particles/prototypeParticleSystem.js +5 -7
  369. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  370. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +27 -13
  371. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  372. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +4 -4
  373. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  374. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  375. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  376. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +18 -7
  377. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  378. package/src/shade/renderer/particles/sort/shader_particle_sort.js +47 -21
  379. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  380. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  381. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  382. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  383. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  384. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  385. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  386. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  387. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  388. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  389. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  390. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +19 -17
  391. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  392. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  393. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  394. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  395. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  396. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  397. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  398. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  399. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  400. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  401. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  402. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +5 -8
  403. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  404. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  405. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  406. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  407. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  408. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  409. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  410. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +4 -2
  411. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  412. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +4 -2
  413. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  414. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  415. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  416. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  417. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  418. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  419. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  420. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  421. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  422. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  423. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  424. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  425. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  426. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  427. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +3 -2
  428. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  429. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  430. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  431. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  432. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  433. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  434. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  435. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  436. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  437. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  438. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  439. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  440. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  441. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  442. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  443. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  444. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  445. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  446. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  447. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  448. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  449. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  450. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  451. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  452. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  453. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  454. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  455. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  456. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  457. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  458. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  459. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  460. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  461. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
  462. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  463. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  464. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  465. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  466. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  467. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  468. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  469. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +6 -2
  470. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  471. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -2
  472. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  473. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  474. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  475. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  476. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  477. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  478. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  479. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  480. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  481. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +5 -2
  482. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  483. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  484. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  485. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  486. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  487. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  488. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  489. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  490. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  491. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  492. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  493. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  494. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  495. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  496. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  497. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  498. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  499. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  500. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  501. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  502. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  503. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  504. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  505. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  506. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  507. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  508. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  509. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +5 -3
  510. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  511. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +4 -3
  512. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  513. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +4 -3
  514. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  515. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  516. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  517. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +3 -7
  518. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  519. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  520. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  521. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  522. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  523. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  524. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  525. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  526. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -145
  527. package/src/shade/renderer/shader/ComputeShader.d.ts +26 -5
  528. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  529. package/src/shade/renderer/shader/ComputeShader.js +347 -296
  530. package/src/shade/renderer/shader/ImageShader.js +217 -217
  531. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  532. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  533. package/src/shade/renderer/shader/ShaderDescriptor.js +20 -0
  534. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  535. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  536. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  537. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  538. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  539. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  540. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  541. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  542. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  543. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +14 -18
  544. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  545. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  546. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  547. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  548. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  549. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  550. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  551. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  552. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  553. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +6 -4
  554. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  555. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  556. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  557. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +11 -12
  558. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  559. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  560. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  561. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  562. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  563. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  564. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  565. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  566. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  567. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +3 -2
  568. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  569. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  570. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +14 -19
  571. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
  572. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  573. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
  574. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  575. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  576. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  577. package/src/shade/renderer/water/shader_water.js +246 -246
  578. package/src/shade/vitest.setup.mjs +1 -1
  579. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  580. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  581. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  582. package/src/view/minimap/Minimap.d.ts +2 -2
  583. package/src/view/minimap/Minimap.d.ts.map +1 -1
  584. package/src/view/minimap/Minimap.js +225 -225
  585. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  586. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  587. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  588. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  589. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  590. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  591. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  592. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  593. package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
  594. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  595. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  596. 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"}