@woosh/meep-engine 3.11.2 → 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 (551) hide show
  1. package/README.md +14 -18
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/SelectionVisualizer.js +127 -127
  4. package/editor/entity_world_bounds.js +27 -27
  5. package/editor/particles/rebuildParticleEmitter.js +31 -31
  6. package/editor/process/SymbolicDisplayProcess.js +1 -1
  7. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  8. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  9. package/editor/prototypeEditorShell.js +156 -156
  10. package/editor/selection/editor_pick.js +130 -130
  11. package/editor/selection/screen_rect_frustum.js +119 -119
  12. package/editor/tools/v2/TransformControls.js +971 -971
  13. package/package.json +1 -1
  14. package/src/engine/Engine.d.ts +3 -3
  15. package/src/engine/Engine.d.ts.map +1 -1
  16. package/src/engine/Engine.js +726 -726
  17. package/src/engine/EngineHarness.d.ts +1 -1
  18. package/src/engine/EngineHarness.js +590 -590
  19. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  21. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  23. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  24. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  25. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  26. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  27. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  29. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  30. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  31. package/src/engine/graphics/ecs/water/Water.js +104 -104
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  33. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  36. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  38. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  39. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  40. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  41. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  42. package/src/engine/graphics3/AnimationSystem.js +352 -0
  43. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  44. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  45. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  46. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  47. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  48. package/src/engine/graphics3/CameraSystem.js +170 -0
  49. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  50. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  51. package/src/engine/graphics3/CameraSystem3.js +6 -166
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  53. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  54. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  56. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  57. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  58. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  59. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  60. package/src/engine/graphics3/DecalSystem.js +441 -0
  61. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  62. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  63. package/src/engine/graphics3/DecalSystem3.js +6 -437
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  65. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  66. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  68. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  69. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  70. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  71. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  72. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  74. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  75. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  76. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  77. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  78. package/src/engine/graphics3/HighlightSystem.js +241 -0
  79. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  80. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  81. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  82. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  83. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  84. package/src/engine/graphics3/LightSystem.js +211 -0
  85. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  86. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  87. package/src/engine/graphics3/LightSystem3.js +6 -207
  88. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  89. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  90. package/src/engine/graphics3/MeshSystem.js +647 -0
  91. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  92. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  93. package/src/engine/graphics3/MeshSystem3.js +6 -642
  94. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  95. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  101. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  106. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  107. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  109. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  110. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  112. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  113. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  114. package/src/engine/graphics3/Pickable.d.ts +1 -1
  115. package/src/engine/graphics3/Pickable.js +65 -65
  116. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  117. package/src/engine/graphics3/PickingQuery.js +48 -48
  118. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  119. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  120. package/src/engine/graphics3/PickingSystem.js +273 -0
  121. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  122. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  123. package/src/engine/graphics3/PickingSystem3.js +6 -269
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  128. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  129. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  130. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  131. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  132. package/src/engine/graphics3/TerrainSystem.js +566 -0
  133. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  134. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  135. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  138. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  140. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  141. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  142. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  143. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  144. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  146. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  147. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  148. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  149. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  155. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  156. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  157. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  158. package/src/engine/graphics3/WaterSystem.js +293 -0
  159. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  160. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  161. package/src/engine/graphics3/WaterSystem3.js +6 -289
  162. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  163. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  164. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  165. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  166. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  167. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  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/highlight/pack_highlight_table.d.ts +2 -2
  177. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  178. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  180. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  182. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  183. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  184. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  185. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  186. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  187. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  188. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
  189. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
  190. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
  191. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
  192. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  193. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
  194. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
  195. package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
  196. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  197. package/src/shade/device/ShadeGPUCommandContext.js +994 -940
  198. package/src/shade/device/immediate_data_supported.d.ts +33 -0
  199. package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
  200. package/src/shade/device/immediate_data_supported.js +53 -0
  201. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
  202. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  203. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
  204. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
  205. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  206. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
  207. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  208. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
  209. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
  210. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
  211. package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
  212. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
  213. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  214. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
  215. package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
  216. package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
  217. package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
  218. package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
  219. package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
  220. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  221. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  222. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  223. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  224. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  225. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  226. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  227. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  228. package/src/shade/renderer/GraphicsContext.d.ts +9 -2
  229. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  230. package/src/shade/renderer/GraphicsContext.js +13 -1
  231. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  232. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  233. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  234. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  235. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  236. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  237. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  238. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  239. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  240. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  241. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  242. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  243. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  244. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  245. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  246. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  247. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  248. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  249. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  250. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  251. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  252. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  253. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  254. package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
  255. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
  256. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
  257. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
  258. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
  259. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
  260. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
  261. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
  262. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  263. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
  264. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
  265. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
  266. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
  267. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
  268. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  269. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
  270. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
  271. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  272. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
  273. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
  274. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  275. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
  276. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
  277. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
  278. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
  279. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
  280. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
  281. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
  282. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
  283. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
  284. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
  285. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
  286. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  287. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -84
  288. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  289. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
  290. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  291. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
  292. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  293. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  294. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  295. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  296. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  297. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  298. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  299. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  300. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  301. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  302. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  303. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  304. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  305. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  306. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  307. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  308. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  309. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  310. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  311. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  312. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  313. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  314. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  315. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  316. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  317. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  318. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  319. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  320. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  321. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  322. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  323. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  324. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  325. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  326. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  327. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  328. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  329. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  330. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  331. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  332. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  333. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +10 -9
  334. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  335. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  336. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  337. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  338. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  339. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  340. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  341. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  342. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  343. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  344. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  345. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  346. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  347. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  348. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  349. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  350. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  351. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  352. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  353. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  354. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  355. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  356. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  357. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  358. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  359. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  360. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  361. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  362. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  363. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  364. package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
  365. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  366. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  367. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  368. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  369. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  370. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  371. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  372. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  373. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  374. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  375. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  376. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  377. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  378. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
  380. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  382. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  384. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  385. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  386. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +57 -57
  387. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  388. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  389. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  390. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  391. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  392. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  393. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  394. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  395. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  396. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  397. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  398. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  399. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  400. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  401. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  402. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  403. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  404. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  405. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  406. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  407. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  408. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  409. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  410. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  411. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  412. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
  413. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  414. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  415. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  416. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  417. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  418. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  419. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  420. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
  421. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  422. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  423. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  424. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  425. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  426. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  427. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  428. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  429. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
  430. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  431. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  432. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  433. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  434. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  435. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  436. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  437. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  438. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  439. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  440. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  441. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  442. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  443. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  444. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  445. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  446. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  447. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  448. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  449. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  450. package/src/shade/renderer/shader/ComputeShader.js +350 -292
  451. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  452. package/src/shade/renderer/shader/ImageShader.js +217 -214
  453. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  454. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  455. package/src/shade/renderer/shader/ShaderDescriptor.js +46 -0
  456. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
  457. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
  458. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
  459. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
  460. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
  461. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
  462. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
  463. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
  464. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
  465. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
  466. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
  467. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
  468. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
  469. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
  470. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
  471. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
  472. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
  473. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
  474. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
  475. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
  476. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
  477. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
  478. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
  479. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
  480. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  481. package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
  482. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
  483. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
  484. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
  485. package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
  486. package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
  487. package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
  488. package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
  489. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
  490. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
  491. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
  492. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  493. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
  494. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
  495. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
  496. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
  497. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
  498. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  499. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
  500. package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
  501. package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
  502. package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
  503. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  504. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  505. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  506. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  507. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  508. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  509. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  510. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  511. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  512. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
  513. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
  514. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  515. package/src/shade/renderer/volumetrics/NOTES.md +238 -0
  516. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
  517. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
  518. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
  519. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
  520. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  521. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +591 -577
  522. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +17 -0
  523. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  524. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +20 -2
  525. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  526. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
  527. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
  528. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
  529. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
  530. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
  531. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  532. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  533. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  534. package/src/shade/renderer/water/shader_water.js +246 -246
  535. package/src/shade/vitest.setup.mjs +1 -1
  536. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  537. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
  538. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  539. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
  540. package/src/view/minimap/Minimap.d.ts +2 -2
  541. package/src/view/minimap/Minimap.d.ts.map +1 -1
  542. package/src/view/minimap/Minimap.js +225 -225
  543. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  544. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  545. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  546. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  547. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  548. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
  549. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
  550. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
  551. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
@@ -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"}