@woosh/meep-engine 3.17.1 → 3.18.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 (265) hide show
  1. package/editor/actions/concrete/ComponentAddAction.d.ts +1 -0
  2. package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -1
  3. package/editor/actions/concrete/ComponentAddAction.js +4 -0
  4. package/editor/actions/concrete/ComponentRemoveAction.d.ts +1 -0
  5. package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -1
  6. package/editor/actions/concrete/ComponentRemoveAction.js +4 -0
  7. package/editor/actions/concrete/EntityCreateAction.d.ts +1 -0
  8. package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -1
  9. package/editor/actions/concrete/EntityCreateAction.js +7 -0
  10. package/editor/actions/concrete/EntityRemoveAction.d.ts +1 -0
  11. package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -1
  12. package/editor/actions/concrete/EntityRemoveAction.js +4 -0
  13. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +10 -0
  14. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -1
  15. package/editor/actions/concrete/PatchTerrainHeightAction.js +107 -85
  16. package/editor/actions/concrete/TransformModifyAction.d.ts +1 -0
  17. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
  18. package/editor/actions/concrete/TransformModifyAction.js +4 -0
  19. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  20. package/editor/particles/effect/ParticleEffectDocument.js +10 -6
  21. package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
  22. package/editor/particles/effect/ParticleReferenceSimulation.js +98 -4
  23. package/editor/particles/effect/make_starter_particle_effect.d.ts.map +1 -1
  24. package/editor/particles/effect/make_starter_particle_effect.js +0 -2
  25. package/editor/tools/engine/ToolEngine.d.ts +30 -0
  26. package/editor/tools/engine/ToolEngine.d.ts.map +1 -1
  27. package/editor/tools/engine/ToolEngine.js +257 -188
  28. package/editor/view/ecs/EntityList.d.ts.map +1 -1
  29. package/editor/view/ecs/EntityList.js +6 -5
  30. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
  31. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +17 -9
  32. package/package.json +1 -1
  33. package/src/CODEC_LAYOUT_VERIFICATION.md +1 -2
  34. package/src/core/binary/meshopt/MESHOPT_VERTEX_BLOCK.d.ts +56 -0
  35. package/src/core/binary/meshopt/MESHOPT_VERTEX_BLOCK.d.ts.map +1 -0
  36. package/src/core/binary/meshopt/MESHOPT_VERTEX_BLOCK.js +73 -0
  37. package/src/core/binary/meshopt/meshopt_decode_vertex_buffer.d.ts.map +1 -1
  38. package/src/core/binary/meshopt/meshopt_decode_vertex_buffer.js +18 -63
  39. package/src/core/binary/meshopt/meshopt_encode_byte_group.d.ts +53 -0
  40. package/src/core/binary/meshopt/meshopt_encode_byte_group.d.ts.map +1 -0
  41. package/src/core/binary/meshopt/meshopt_encode_byte_group.js +140 -0
  42. package/src/core/binary/meshopt/meshopt_encode_data_block.d.ts +32 -0
  43. package/src/core/binary/meshopt/meshopt_encode_data_block.d.ts.map +1 -0
  44. package/src/core/binary/meshopt/meshopt_encode_data_block.js +77 -0
  45. package/src/core/binary/meshopt/meshopt_encode_index_sequence.d.ts +46 -0
  46. package/src/core/binary/meshopt/meshopt_encode_index_sequence.d.ts.map +1 -0
  47. package/src/core/binary/meshopt/meshopt_encode_index_sequence.js +146 -0
  48. package/src/core/binary/meshopt/meshopt_encode_vertex_buffer.d.ts +40 -0
  49. package/src/core/binary/meshopt/meshopt_encode_vertex_buffer.d.ts.map +1 -0
  50. package/src/core/binary/meshopt/meshopt_encode_vertex_buffer.js +700 -0
  51. package/src/core/binary/meshopt/meshopt_write_uint_var.d.ts +24 -0
  52. package/src/core/binary/meshopt/meshopt_write_uint_var.d.ts.map +1 -0
  53. package/src/core/binary/meshopt/meshopt_write_uint_var.js +39 -0
  54. package/src/core/math/random/seededRandom_Mulberry32.d.ts.map +1 -1
  55. package/src/core/math/random/seededRandom_Mulberry32.js +4 -2
  56. package/src/core/process/undo/Action.d.ts +19 -0
  57. package/src/core/process/undo/Action.d.ts.map +1 -1
  58. package/src/core/process/undo/Action.js +17 -0
  59. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +78 -0
  60. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -0
  61. package/src/engine/graphics3/GPUParticleEmitterSystem.js +310 -0
  62. package/src/engine/graphics3/GraphicsEngine.d.ts +17 -0
  63. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  64. package/src/engine/graphics3/GraphicsEngine.js +30 -10
  65. package/src/engine/graphics3/particles/particle_gpu_records.d.ts.map +1 -1
  66. package/src/engine/graphics3/particles/particle_gpu_records.js +0 -2
  67. package/src/engine/interpolation/InterpolationSystem.d.ts +7 -0
  68. package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
  69. package/src/engine/interpolation/InterpolationSystem.js +10 -0
  70. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  71. package/src/engine/network/NetworkSession.js +14 -34
  72. package/src/engine/network/time/RenderPlayout.d.ts +76 -0
  73. package/src/engine/network/time/RenderPlayout.d.ts.map +1 -0
  74. package/src/engine/network/time/RenderPlayout.js +163 -0
  75. package/src/engine/network/transport/adapters/WebSocketTransport.d.ts.map +1 -1
  76. package/src/engine/network/transport/adapters/WebSocketTransport.js +11 -4
  77. package/src/engine/physics/ecs/PhysicsSystem.d.ts +4 -12
  78. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  79. package/src/engine/physics/ecs/PhysicsSystem.js +39 -13
  80. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  81. package/src/engine/sound/simulation/core/VolumeField.d.ts.map +1 -1
  82. package/src/engine/sound/simulation/core/VolumeField.js +4 -1
  83. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +23 -2
  84. package/src/shade/playground/particle_system/README.md +139 -139
  85. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  86. package/src/shade/playground/particle_system/particle_prototype.js +0 -2
  87. package/src/shade/playground/particle_system/particle_scene.d.ts +6 -9
  88. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  89. package/src/shade/playground/particle_system/particle_scene.js +6 -13
  90. package/src/shade/playground/ssr_reprojection/README.md +103 -0
  91. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.d.ts +17 -0
  92. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.d.ts.map +1 -0
  93. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -0
  94. package/src/shade/playground/ssr_reprojection/index.html +79 -0
  95. package/src/shade/playground/ssr_reprojection/main.d.ts +2 -0
  96. package/src/shade/playground/ssr_reprojection/main.d.ts.map +1 -0
  97. package/src/shade/playground/ssr_reprojection/main.js +245 -0
  98. package/src/shade/playground/ssr_reprojection/scene.d.ts +18 -0
  99. package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -0
  100. package/src/shade/playground/ssr_reprojection/scene.js +51 -0
  101. package/src/shade/renderer/Renderer.d.ts +2 -23
  102. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  103. package/src/shade/renderer/Renderer.js +185 -218
  104. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +5 -8
  105. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  106. package/src/shade/renderer/animation/GPUAnimationManager.js +12 -12
  107. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  108. package/src/shade/renderer/buffer/table/GPUTypedTable.js +6 -0
  109. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  110. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +7 -0
  111. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_specular.d.ts +4 -0
  112. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_specular.d.ts.map +1 -0
  113. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_specular.js +51 -0
  114. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_specular.d.ts.map +1 -1
  115. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_specular.js +5 -35
  116. package/src/shade/renderer/particles/DESIGN.md +703 -514
  117. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +16 -4
  118. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  119. package/src/shade/renderer/particles/GPUParticleSystem.js +1189 -991
  120. package/src/shade/renderer/particles/ParticleConstants.d.ts +64 -0
  121. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  122. package/src/shade/renderer/particles/ParticleConstants.js +71 -0
  123. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts +57 -0
  124. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts.map +1 -0
  125. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +181 -0
  126. package/src/shade/renderer/particles/bounds/chunk_particle_bounds_unknown.d.ts +7 -0
  127. package/src/shade/renderer/particles/bounds/chunk_particle_bounds_unknown.d.ts.map +1 -0
  128. package/src/shade/renderer/particles/bounds/chunk_particle_bounds_unknown.js +12 -0
  129. package/src/shade/renderer/particles/bounds/graph_particle_bounds.d.ts +33 -0
  130. package/src/shade/renderer/particles/bounds/graph_particle_bounds.d.ts.map +1 -0
  131. package/src/shade/renderer/particles/bounds/graph_particle_bounds.js +67 -0
  132. package/src/shade/renderer/particles/bounds/shader_particle_bounds.d.ts +40 -0
  133. package/src/shade/renderer/particles/bounds/shader_particle_bounds.d.ts.map +1 -0
  134. package/src/shade/renderer/particles/bounds/shader_particle_bounds.js +187 -0
  135. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +15 -2
  136. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  137. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +14 -8
  138. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +58 -4
  139. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  140. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +79 -4
  141. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts +23 -1
  142. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts.map +1 -1
  143. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.js +35 -2
  144. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +4 -2
  145. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  146. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +5 -8
  147. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -1
  148. package/src/shade/renderer/particles/data/particle_emitter_record.js +0 -6
  149. package/src/shade/renderer/particles/graph_particles.d.ts +25 -3
  150. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  151. package/src/shade/renderer/particles/graph_particles.js +108 -31
  152. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +6 -4
  153. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  154. package/src/shade/renderer/particles/graph_particles_avboit.js +5 -5
  155. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +5 -0
  156. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  157. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +27 -6
  158. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +4 -0
  159. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
  160. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +6 -1
  161. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +35 -27
  162. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  163. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +424 -425
  164. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts +20 -0
  165. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts.map +1 -0
  166. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts +4 -0
  167. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts.map +1 -1
  168. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +38 -2
  169. package/src/shade/renderer/particles/shaders/chunk_particle_spawn_budget.d.ts +22 -0
  170. package/src/shade/renderer/particles/shaders/chunk_particle_spawn_budget.d.ts.map +1 -0
  171. package/src/shade/renderer/particles/shaders/chunk_particle_spawn_budget.js +42 -0
  172. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +1 -1
  173. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -1
  174. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +53 -22
  175. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts.map +1 -1
  176. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.js +213 -216
  177. package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts +50 -0
  178. package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts.map +1 -0
  179. package/src/shade/renderer/particles/shaders/shader_particle_render.js +1 -1
  180. package/src/shade/renderer/particles/warmup/chunk_particle_warmup_step.d.ts +36 -0
  181. package/src/shade/renderer/particles/warmup/chunk_particle_warmup_step.d.ts.map +1 -0
  182. package/src/shade/renderer/particles/warmup/chunk_particle_warmup_step.js +102 -0
  183. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts +102 -0
  184. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -0
  185. package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +329 -0
  186. package/src/shade/renderer/particles/warmup/shader_particle_warmup.d.ts +112 -0
  187. package/src/shade/renderer/particles/warmup/shader_particle_warmup.d.ts.map +1 -0
  188. package/src/shade/renderer/particles/warmup/shader_particle_warmup.js +318 -0
  189. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.d.ts +35 -0
  190. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.d.ts.map +1 -0
  191. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.js +108 -0
  192. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.d.ts +3 -0
  193. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.d.ts.map +1 -0
  194. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.js +70 -0
  195. package/src/shade/renderer/particles/warmup/warmup_schedule.d.ts +62 -0
  196. package/src/shade/renderer/particles/warmup/warmup_schedule.d.ts.map +1 -0
  197. package/src/shade/renderer/particles/warmup/warmup_schedule.js +55 -0
  198. package/src/shade/renderer/postprocess/PostProcess.d.ts.map +1 -1
  199. package/src/shade/renderer/postprocess/PostProcess.js +2 -1
  200. package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +286 -0
  201. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +57 -21
  202. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  203. package/src/shade/renderer/postprocess/ssr/SSR.js +230 -129
  204. package/src/shade/renderer/postprocess/ssr/SSRReprojectionMode.d.ts +11 -0
  205. package/src/shade/renderer/postprocess/ssr/SSRReprojectionMode.d.ts.map +1 -0
  206. package/src/shade/renderer/postprocess/ssr/SSRReprojectionMode.js +6 -0
  207. package/src/shade/renderer/postprocess/ssr/chunk_ssr_metadata.d.ts +4 -0
  208. package/src/shade/renderer/postprocess/ssr/chunk_ssr_metadata.d.ts.map +1 -0
  209. package/src/shade/renderer/postprocess/ssr/chunk_ssr_metadata.js +32 -0
  210. package/src/shade/renderer/postprocess/ssr/chunk_ssr_spatial_variance.d.ts +4 -0
  211. package/src/shade/renderer/postprocess/ssr/chunk_ssr_spatial_variance.d.ts.map +1 -0
  212. package/src/shade/renderer/postprocess/ssr/chunk_ssr_spatial_variance.js +41 -0
  213. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.d.ts +3 -0
  214. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.d.ts.map +1 -0
  215. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.js +30 -0
  216. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts +4 -0
  217. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts.map +1 -0
  218. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.js +70 -0
  219. package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.d.ts +21 -0
  220. package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.d.ts.map +1 -0
  221. package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.js +363 -0
  222. package/src/shade/renderer/postprocess/ssr/resolve/chunk_get_neighbour_weight.js +1 -1
  223. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_Brick4.d.ts +2 -0
  224. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_Brick4.d.ts.map +1 -0
  225. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_Brick4.js +24 -0
  226. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts +1 -6
  227. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  228. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +16 -332
  229. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts +1 -6
  230. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  231. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +25 -358
  232. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +0 -5
  233. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  234. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +201 -276
  235. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +1 -0
  236. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  237. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +167 -143
  238. package/src/shade/renderer/shader/graph/graph_create_buffer.d.ts +15 -0
  239. package/src/shade/renderer/shader/graph/graph_create_buffer.d.ts.map +1 -0
  240. package/src/shade/renderer/shader/graph/graph_create_buffer.js +20 -0
  241. package/src/shade/renderer/view/GPUViewContext.d.ts +3 -4
  242. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  243. package/src/shade/renderer/view/GPUViewContext.js +5 -5
  244. package/src/core/binary/meshopt/__meshopt_test_streams.d.ts +0 -24
  245. package/src/core/binary/meshopt/__meshopt_test_streams.d.ts.map +0 -1
  246. package/src/core/binary/meshopt/__meshopt_test_streams.js +0 -237
  247. package/src/core/geom/3d/atlas/atlas_test_fixtures.d.ts +0 -84
  248. package/src/core/geom/3d/atlas/atlas_test_fixtures.d.ts.map +0 -1
  249. package/src/core/geom/3d/atlas/atlas_test_fixtures.js +0 -266
  250. package/src/engine/asset/loaders/gltf_test_fixtures.d.ts +0 -97
  251. package/src/engine/asset/loaders/gltf_test_fixtures.d.ts.map +0 -1
  252. package/src/engine/asset/loaders/gltf_test_fixtures.js +0 -359
  253. package/src/engine/sound/simulation/core/OcclusionSolver.d.ts +0 -29
  254. package/src/engine/sound/simulation/core/OcclusionSolver.d.ts.map +0 -1
  255. package/src/shade/renderer/animation/skin_test_fixtures.d.ts +0 -86
  256. package/src/shade/renderer/animation/skin_test_fixtures.d.ts.map +0 -1
  257. package/src/shade/renderer/animation/skin_test_fixtures.js +0 -250
  258. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.d.ts +0 -16
  259. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.d.ts.map +0 -1
  260. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.js +0 -27
  261. package/src/shade/renderer/particles/particle_test_fixtures.d.ts +0 -151
  262. package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +0 -1
  263. package/src/shade/renderer/particles/particle_test_fixtures.js +0 -229
  264. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.js +0 -23
  265. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +0 -457
@@ -201,16 +201,6 @@ export class Renderer {
201
201
  */
202
202
  feature_particles_enabled = false;
203
203
 
204
- /**
205
- * Most particles alive at once in a scene — the pool every emitter of that scene draws its
206
- * records from. Read once, when the scene's {@link GPUParticleSystem} is created on the first
207
- * frame {@link feature_particles_enabled} is on for it; the pool does not grow afterwards, so
208
- * set this before that frame. Left undefined, the system's own default applies.
209
- *
210
- * @type {number|undefined}
211
- */
212
- particle_capacity = undefined;
213
-
214
204
  feature_ssr_enabled = false;
215
205
  feature_ssao_enabled = true;
216
206
  /**
@@ -397,21 +387,6 @@ export class Renderer {
397
387
  */
398
388
  get dof_unreal() { return this.#depth_of_field_unreal; }
399
389
 
400
- /**
401
- * When true and {@link indirect_lighting_mode} is Brick4, run a single fused
402
- * pass that produces the resolved indirect lighting directly (combining the
403
- * brick4 diffuse, brick4 specular and indirect resolve passes). Trades a
404
- * bit of cache pressure inside the pass for substantially less memory
405
- * bandwidth: no intermediate rgba16float diffuse/specular targets, the
406
- * g-buffer is read once, and a single brick4 probe pair is shared between
407
- * the diffuse and specular evaluations.
408
- *
409
- * SSR is mutually exclusive with the fused path (it needs the standalone
410
- * specular target as input), so when SSR is enabled the split path is used.
411
- * @type {boolean}
412
- */
413
- fused_indirect = true;
414
-
415
390
  /**
416
391
  * RCAS
417
392
  * @type {boolean}
@@ -796,8 +771,7 @@ export class Renderer {
796
771
  }
797
772
 
798
773
  /**
799
- * Compute deferred indirect specular and diffuse contributions
800
- * based on the active indirect lighting mode.
774
+ * Build and composite deferred indirect lighting, including fused and SSR paths.
801
775
  *
802
776
  * @param {object} params
803
777
  * @param {FrameGraph} params.graph
@@ -805,6 +779,7 @@ export class Renderer {
805
779
  * @param {GPUSceneContext} params.scene_ctx
806
780
  * @param {number} params.bent_normals - graph resource ID
807
781
  * @param {number} params.current_color_out - graph resource ID (scene color, needed for SSR)
782
+ * @param {number} params.gr_texture_depth_previous
808
783
  * @param {number} params.gr_texture_depth_current
809
784
  * @param {number} params.gr_texture_hzb
810
785
  * @param {number} params.gr_texture_material_albedo_ao
@@ -816,7 +791,7 @@ export class Renderer {
816
791
  * @param {number} params.gr_buffer_camera_current
817
792
  * @param {number} params.gr_buffer_camera_previous
818
793
  * @param {Vector2} params.resolution
819
- * @returns {{indirect_specular: number, indirect_diffuse: number}}
794
+ * @returns {number} Updated scene-color graph resource ID
820
795
  */
821
796
  #graph_indirect_lighting({
822
797
  graph,
@@ -826,6 +801,7 @@ export class Renderer {
826
801
  current_color_out,
827
802
  //
828
803
  gr_texture_depth_current,
804
+ gr_texture_depth_previous,
829
805
  gr_texture_hzb,
830
806
  gr_texture_material_albedo_ao,
831
807
  gr_texture_pbr,
@@ -838,24 +814,136 @@ export class Renderer {
838
814
  resolution,
839
815
  }) {
840
816
 
841
- const mode = this.indirect_lighting_mode;
842
-
843
- let indirect_specular = -1;
844
- let indirect_diffuse = -1;
817
+ const mode = this.indirect_lighting_mode;
818
+ // Prefer fusion where supported to avoid intermediate diffuse/specular
819
+ // targets and repeated G-buffer reads. This is a local graph policy.
820
+ const prefer_fused = true;
821
+ const lpv = scene_ctx.light_probe_volume;
822
+ let diffuse_pass;
823
+ let specular_pass;
824
+ let ssr_inputs;
825
+
826
+ // Each mode owns its diffuse/specular pair and any fused implementation.
827
+ // SSR overrides specular below using the same explicitly selected mode.
828
+ switch (mode) {
829
+ case ShadeIndirectLightingMode.IBL:
830
+ ssr_inputs = { input_environment: gr_texture_environment };
831
+ diffuse_pass = {
832
+ shader: shader_diffuse_IBL,
833
+ inputs: {
834
+ tBentNormals: bent_normals,
835
+ tGBufferAlbedo: gr_texture_material_albedo_ao,
836
+ tEnvironment: gr_texture_environment,
837
+ },
838
+ };
839
+ specular_pass = {
840
+ shader: shader_specular_IBL,
841
+ inputs: {
842
+ tBentNormals: bent_normals,
843
+ tNormals: gr_texture_normal,
844
+ tDepth: gr_texture_depth_current,
845
+ tPBR: gr_texture_pbr,
846
+ tEnvironment: gr_texture_environment,
847
+ camera: gr_buffer_camera_current,
848
+ },
849
+ };
850
+ break;
845
851
 
846
- const lpv = scene_ctx.light_probe_volume;
852
+ case ShadeIndirectLightingMode.Brick4:
853
+ // SSR needs its own specular resolve and denoising passes.
854
+ if (prefer_fused && !this.feature_ssr_enabled) {
855
+ [current_color_out] = graph_image_pass({
856
+ graph,
857
+ shader: shader_brick4_indirect_lighting,
858
+ output: [current_color_out],
859
+ input_depth: gr_texture_depth_current,
860
+ load_op: "load",
861
+ inputs: {
862
+ tDepth: gr_texture_depth_current,
863
+ tGBufferNormals: gr_texture_normal,
864
+ tBentNormals: bent_normals,
865
+ tGBufferAlbedo: gr_texture_material_albedo_ao,
866
+ tGBufferPBR: gr_texture_pbr,
867
+ tSTBN_vec2: STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec2,
868
+ view: view_ctx.uniform_buffer.buffer,
869
+ camera: gr_buffer_camera_current,
870
+ //
871
+ brick4: scene_ctx.volumetric_light_map.buffer,
872
+ tSplitSum: STATIC_GRAPHICS_ENGINE_ASSETS.split_sum,
873
+ },
874
+ });
875
+ return current_color_out;
876
+ }
877
+ ssr_inputs = { brick4: scene_ctx.volumetric_light_map };
878
+ diffuse_pass = {
879
+ shader: shader_brick4_diffuse,
880
+ inputs: {
881
+ tDepth: gr_texture_depth_current,
882
+ tBentNormals: bent_normals,
883
+ tAlbedoAO: gr_texture_material_albedo_ao,
884
+ tSTBN_vec2: STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec2,
885
+ camera: gr_buffer_camera_current,
886
+ view: view_ctx.uniform_buffer.buffer,
887
+ brick4: scene_ctx.volumetric_light_map.buffer,
888
+ },
889
+ };
890
+ specular_pass = {
891
+ shader: shader_brick4_specular,
892
+ inputs: {
893
+ tDepth: gr_texture_depth_current,
894
+ tNormals: gr_texture_normal,
895
+ tPBR: gr_texture_pbr,
896
+ tSTBN_vec2: STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec2,
897
+ camera: gr_buffer_camera_current,
898
+ view: view_ctx.uniform_buffer.buffer,
899
+ brick4: scene_ctx.volumetric_light_map.buffer,
900
+ },
901
+ };
902
+ break;
847
903
 
848
- //
849
- // ── SPECULAR ────────────────────────────────────────────
850
- //
904
+ case ShadeIndirectLightingMode.LPV:
905
+ ssr_inputs = { lpv, input_environment: gr_texture_environment };
906
+ diffuse_pass = {
907
+ shader: shader_diffuse_LPV,
908
+ inputs: {
909
+ camera: gr_buffer_camera_current,
910
+ tDepth: gr_texture_depth_current,
911
+ tBentNormals: bent_normals,
912
+ tGBufferAlbedo: gr_texture_material_albedo_ao,
913
+ lpv_atlas_radiance: lpv.atlas.texture_radiance,
914
+ lpv_atlas_depth: lpv.atlas.texture_depth,
915
+ lpv_lookup: lpv.buffer_mesh_bvh,
916
+ lpv_metadata: lpv.buffer_metadata,
917
+ lpv_mesh: lpv.buffer_mesh,
918
+ lpv_probes: lpv.buffer_probes,
919
+ },
920
+ };
921
+ // Without SSR, LPV uses environment-map specular.
922
+ specular_pass = {
923
+ shader: shader_specular_IBL,
924
+ inputs: {
925
+ tBentNormals: bent_normals,
926
+ tNormals: gr_texture_normal,
927
+ tDepth: gr_texture_depth_current,
928
+ tPBR: gr_texture_pbr,
929
+ tEnvironment: gr_texture_environment,
930
+ camera: gr_buffer_camera_current,
931
+ },
932
+ };
933
+ break;
851
934
 
852
- // SSR replaces the specular IBL fallback when enabled.
853
- // NOTE: SSR is currently not supported in Brick4 mode — this is a known
854
- // limitation and will be addressed in a future update.
855
- if (this.feature_ssr_enabled && mode !== ShadeIndirectLightingMode.Brick4) {
935
+ default:
936
+ throw new Error(`Unsupported indirect lighting mode: ${mode}`);
937
+ }
856
938
 
857
- const ssr = this.#postprocess.ssr.graph_pass({
858
- graph,
939
+ let indirect_specular;
940
+ if (this.feature_ssr_enabled) {
941
+ const ssr = this.#postprocess.ssr.graph_pass({
942
+ graph,
943
+ ...ssr_inputs,
944
+ view_ctx,
945
+ jitter: view_ctx.jitter,
946
+ input_depth_previous: gr_texture_depth_previous,
859
947
  input_depth: gr_texture_depth_current,
860
948
  input_hzb: gr_texture_hzb,
861
949
  input_scene_color: current_color_out,
@@ -864,118 +952,53 @@ export class Renderer {
864
952
  input_normal: gr_texture_normal,
865
953
  input_velocity: gr_velocity,
866
954
  input_occlusion: gr_occlusion_clip,
867
- input_environment: gr_texture_environment,
868
955
  camera_current: gr_buffer_camera_current,
869
956
  camera_previous: gr_buffer_camera_previous,
870
- lpv: mode === ShadeIndirectLightingMode.LPV ? lpv : undefined,
957
+ indirect_lighting_mode: mode,
871
958
  resolution,
872
959
  });
873
960
 
874
961
  indirect_specular = ssr.denoised;
875
-
876
- } else if (mode === ShadeIndirectLightingMode.Brick4) {
877
-
878
- // Brick4 specular from volumetric lightmap
879
- [indirect_specular] = graph_image_pass({
880
- graph,
881
- shader: shader_brick4_specular,
882
- input_depth: gr_texture_depth_current,
883
- inputs: {
884
- tDepth: gr_texture_depth_current,
885
- tNormals: gr_texture_normal,
886
- tPBR: gr_texture_pbr,
887
- tSTBN_vec2: STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec2,
888
- camera: gr_buffer_camera_current,
889
- view: view_ctx.uniform_buffer.buffer,
890
- brick4: scene_ctx.volumetric_light_map.buffer,
891
- },
892
- output_resolution: view_ctx.resolution,
893
- });
894
-
895
962
  } else {
896
- // IBL / LPV fallback — environment map specular
897
963
  [indirect_specular] = graph_image_pass({
898
964
  graph,
899
- shader: shader_specular_IBL,
965
+ ...specular_pass,
900
966
  input_depth: gr_texture_depth_current,
901
- inputs: {
902
- tBentNormals: bent_normals,
903
- tNormals: gr_texture_normal,
904
- tDepth: gr_texture_depth_current,
905
- tPBR: gr_texture_pbr,
906
- tEnvironment: gr_texture_environment,
907
- camera: gr_buffer_camera_current,
908
- },
909
967
  output_resolution: view_ctx.resolution,
910
968
  });
911
969
  }
912
970
 
913
- //
914
- // ── DIFFUSE ─────────────────────────────────────────────
915
- //
916
-
917
- switch (mode) {
918
-
919
- case ShadeIndirectLightingMode.IBL:
920
- // Environment map irradiance
921
- [indirect_diffuse] = graph_image_pass({
922
- graph,
923
- shader: shader_diffuse_IBL,
924
- input_depth: gr_texture_depth_current,
925
- inputs: {
926
- tBentNormals: bent_normals,
927
- tGBufferAlbedo: gr_texture_material_albedo_ao,
928
- tEnvironment: gr_texture_environment,
929
- },
930
- output_resolution: view_ctx.resolution,
931
- });
932
- break;
933
-
934
- case ShadeIndirectLightingMode.Brick4:
935
- // Brick4 diffuse from volumetric lightmap
936
- [indirect_diffuse] = graph_image_pass({
937
- graph,
938
- shader: shader_brick4_diffuse,
939
- input_depth: gr_texture_depth_current,
940
- inputs: {
941
- tDepth: gr_texture_depth_current,
942
- tBentNormals: bent_normals,
943
- tAlbedoAO: gr_texture_material_albedo_ao,
944
- tSTBN_vec2: STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec2,
945
- camera: gr_buffer_camera_current,
946
- view: view_ctx.uniform_buffer.buffer,
947
- brick4: scene_ctx.volumetric_light_map.buffer,
948
- },
949
- output_resolution: view_ctx.resolution,
950
- });
951
- break;
971
+ const [indirect_diffuse] = graph_image_pass({
972
+ graph,
973
+ ...diffuse_pass,
974
+ input_depth: gr_texture_depth_current,
975
+ output_resolution: view_ctx.resolution,
976
+ });
952
977
 
953
- case ShadeIndirectLightingMode.LPV:
954
- // Light Probe Volume diffuse
955
- [indirect_diffuse] = graph_image_pass({
956
- graph,
957
- shader: shader_diffuse_LPV,
958
- input_depth: gr_texture_depth_current,
959
- inputs: {
960
- camera: gr_buffer_camera_current,
961
- tDepth: gr_texture_depth_current,
962
- tBentNormals: bent_normals,
963
- tGBufferAlbedo: gr_texture_material_albedo_ao,
964
- //
965
- lpv_atlas_radiance: lpv.atlas.texture_radiance,
966
- lpv_atlas_depth: lpv.atlas.texture_depth,
967
- //
968
- lpv_lookup: lpv.buffer_mesh_bvh,
969
- lpv_metadata: lpv.buffer_metadata,
970
- lpv_mesh: lpv.buffer_mesh,
971
- lpv_probes: lpv.buffer_probes,
972
- },
973
- output_resolution: view_ctx.resolution,
974
- });
975
- break;
976
- }
978
+ // resolve indirect lighting
979
+ [current_color_out] = graph_image_pass({
980
+ graph,
981
+ shader: shader_resolve_indirect_lighting,
982
+ output: [current_color_out],
983
+ input_depth: gr_texture_depth_current,
984
+ load_op: "load",
985
+ inputs: {
986
+ tIndirectDiffuse: indirect_diffuse,
987
+ tIndirectSpecular: indirect_specular,
988
+ //
989
+ tGBufferNormals: gr_texture_normal,
990
+ tBentNormals: bent_normals,
991
+ tGBufferAlbedo: gr_texture_material_albedo_ao,
992
+ tGBufferPBR: gr_texture_pbr,
993
+ tDepth: gr_texture_depth_current,
994
+ //
995
+ camera: gr_buffer_camera_current,
996
+ //
997
+ tSplitSum: STATIC_GRAPHICS_ENGINE_ASSETS.split_sum,
998
+ },
999
+ });
977
1000
 
978
- return { indirect_specular, indirect_diffuse };
1001
+ return current_color_out;
979
1002
  }
980
1003
 
981
1004
  /**
@@ -983,6 +1006,9 @@ export class Renderer {
983
1006
  */
984
1007
  #postprocess
985
1008
 
1009
+ /** SSR settings, available after initialize(). @returns {import("./postprocess/ssr/SSR.js").SSR} */
1010
+ get ssr() { return this.#postprocess.ssr; }
1011
+
986
1012
  /**
987
1013
  * @type {ReSTIRDI}
988
1014
  */
@@ -1021,7 +1047,7 @@ export class Renderer {
1021
1047
  let system = this.#particle_systems.get(scene_ctx);
1022
1048
 
1023
1049
  if (system === undefined) {
1024
- system = new GPUParticleSystem(this.#graphics, scene_ctx, { capacity: this.particle_capacity });
1050
+ system = new GPUParticleSystem(this.#graphics, scene_ctx);
1025
1051
  this.#particle_systems.set(scene_ctx, system);
1026
1052
  }
1027
1053
 
@@ -2203,85 +2229,26 @@ export class Renderer {
2203
2229
  output: [current_color_out],
2204
2230
  });
2205
2231
 
2206
- {
2207
- // Fused brick4 path: skip the intermediate diffuse/specular targets and the
2208
- // separate resolve, doing it all in a single shader. SSR isn't compatible
2209
- // since it consumes the standalone specular target.
2210
- const use_fused_indirect = this.fused_indirect
2211
- && this.indirect_lighting_mode === ShadeIndirectLightingMode.Brick4
2212
- && !this.feature_ssr_enabled;
2213
-
2214
- if (use_fused_indirect) {
2215
-
2216
- [current_color_out] = graph_image_pass({
2217
- graph,
2218
- shader: shader_brick4_indirect_lighting,
2219
- output: [current_color_out],
2220
- input_depth: gr_texture_depth_current,
2221
- load_op: "load",
2222
- inputs: {
2223
- tDepth: gr_texture_depth_current,
2224
- tGBufferNormals: gr_texture_normal,
2225
- tBentNormals: bent_normals,
2226
- tGBufferAlbedo: gr_texture_material_albedo_ao,
2227
- tGBufferPBR: gr_texture_pbr,
2228
- tSTBN_vec2: STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec2,
2229
- view: view_ctx.uniform_buffer.buffer,
2230
- camera: gr_buffer_camera_current,
2231
- //
2232
- brick4: scene_ctx.volumetric_light_map.buffer,
2233
- tSplitSum: STATIC_GRAPHICS_ENGINE_ASSETS.split_sum,
2234
- },
2235
- });
2236
-
2237
- } else {
2238
-
2239
- const { indirect_specular, indirect_diffuse } = this.#graph_indirect_lighting({
2240
- graph,
2241
- view_ctx,
2242
- scene_ctx,
2243
- bent_normals,
2244
- current_color_out,
2245
- //
2246
- gr_texture_depth_current,
2247
- gr_texture_hzb,
2248
- gr_texture_material_albedo_ao,
2249
- gr_texture_pbr,
2250
- gr_texture_normal,
2251
- gr_texture_environment,
2252
- gr_velocity,
2253
- gr_occlusion_clip,
2254
- gr_buffer_camera_current,
2255
- gr_buffer_camera_previous,
2256
- resolution,
2257
- });
2258
-
2259
- // resolve indirect lighting
2260
- [current_color_out] = graph_image_pass({
2261
- graph,
2262
- shader: shader_resolve_indirect_lighting,
2263
- output: [current_color_out],
2264
- input_depth: gr_texture_depth_current,
2265
- load_op: "load",
2266
- inputs: {
2267
- tIndirectDiffuse: indirect_diffuse,
2268
- tIndirectSpecular: indirect_specular,
2269
- //
2270
- tGBufferNormals: gr_texture_normal,
2271
- tBentNormals: bent_normals,
2272
- tGBufferAlbedo: gr_texture_material_albedo_ao,
2273
- tGBufferPBR: gr_texture_pbr,
2274
- tDepth: gr_texture_depth_current,
2275
- //
2276
- camera: gr_buffer_camera_current,
2277
- //
2278
- tSplitSum: STATIC_GRAPHICS_ENGINE_ASSETS.split_sum,
2279
- },
2280
- });
2281
-
2282
- }
2283
-
2284
- }
2232
+ current_color_out = this.#graph_indirect_lighting({
2233
+ graph,
2234
+ view_ctx,
2235
+ scene_ctx,
2236
+ bent_normals,
2237
+ current_color_out,
2238
+ //
2239
+ gr_texture_depth_current,
2240
+ gr_texture_depth_previous,
2241
+ gr_texture_hzb,
2242
+ gr_texture_material_albedo_ao,
2243
+ gr_texture_pbr,
2244
+ gr_texture_normal,
2245
+ gr_texture_environment,
2246
+ gr_velocity,
2247
+ gr_occlusion_clip,
2248
+ gr_buffer_camera_current,
2249
+ gr_buffer_camera_previous,
2250
+ resolution,
2251
+ });
2285
2252
 
2286
2253
  // Composite volumetric fog over the finalized opaque + background + indirect colour.
2287
2254
  // A dedicated pass (not inline in the shading shaders) because indirect lighting is added
@@ -478,14 +478,11 @@ export class GPUAnimationManager {
478
478
  * clamped to {@link MAX_DT_SECONDS} to keep a stall from
479
479
  * leaking multiple seconds into the next tick.
480
480
  *
481
- * Early-outs: the clip passes (tick/apply/resolve/hierarchy)
482
- * gate on the `animation_bound_track_groups` table being
483
- * non-empty; skin matrix prep + skinning gate on registered
484
- * skins instead — a skin whose joints are host-driven (no
485
- * clips bound) still gets fresh skinning matrices every frame.
486
- * With nothing registered no GPU work is encoded beyond the
487
- * database flush — safe to call every frame regardless of
488
- * registration state.
481
+ * Clip tick/apply/resolve gate on bound tracks; hierarchy propagation runs
482
+ * every frame, before skin matrix prep and skinning. CPU-driven nodes need it
483
+ * too: scene uploads seed global with the previous pose, and propagation
484
+ * composes the current one. On idle frames it advances prev_global so motion
485
+ * vectors settle to zero. Skin passes still gate on registered skins.
489
486
  *
490
487
  * @param {ShadeGPUCommandContext} cmd_ctx
491
488
  * @param {number} dt_seconds wall-clock seconds since last call
@@ -1 +1 @@
1
- {"version":3,"file":"GPUAnimationManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/GPUAnimationManager.js"],"names":[],"mappings":"AAiIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;IA6OI;;;;OAIG;IACH,sCAHW,MAAM,kCAgBhB;IAED;;OAEG;IACH,4BAEC;IAED;;;;;;;;;;;;OAYG;IACH,gCAEC;IAED;;;;;;;;;;OAUG;IACH,qCAEC;IAED;;;;;;OAMG;IACH,gCAEC;IAED;;;;;;;;;;OAUG;IACH,mCAEC;IAED;;;;;;;;;;;;OAYG;IACH,4CAFW,MAAM,QA6BhB;IAED;;;;;OAKG;IACH,kBAHW,MAAM,GACJ;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAK3D;IAED;;;;;;;;;;;;OAYG;IACH,gCAHW,MAAM,GACJ,MAAM,CAOlB;IAED;;;;;;;;;;;OAWG;IACH,kCAFa,MAAM,CA+BlB;IAED;;;;;;;;;;;;;;OAcG;IACH,oBAJW;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAEhD,MAAM,CA2BlB;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH;eAPc,MAAM;qBACA,MAAM;mBACR,MAAM;kBACP,MAAM;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAEhE,MAAM,CAkElB;IAgCD;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAHW,MAAM,QACN,MAAM,QAKhB;IAED;;;;;;;;OAQG;IACH,2BAHW,MAAM,QACN,MAAM,QAKhB;IAED;;;;;;;;;;;;;;OAcG;IACH,6BAHW,MAAM,UACN,MAAM,QAKhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,mBAHW,MAAM,SACN,MAAM,QAShB;IAED;;;;;;;OAOG;IACH,qBAHW,MAAM,SACN,MAAM,QAShB;IAED;;;;;;;;;;;OAWG;IACH,eAFW,MAAM,QAShB;IAED;;;;;;;;;OASG;IACH,cAFW,MAAM,QAShB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH;gBAJe,MAAM;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,YAAY,GAAG,MAAM,EAAE,CAAA;SAAE,CAAC;QAEhE,MAAM,CAoElB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,2BAFa,MAAM,CA0FlB;IAyLD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,yCAFa,MAAM,CAsElB;IAwDD;;;;;;;;;;;;;;;OAeG;IACH,yBAFW,MAAM,QAoChB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,yBAFW,MAAM,QA6ChB;IAqHD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,8CAIC;IAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,iEA2CC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,kDAFW,MAAM,QAgChB;IA8FD,gBAYC;;CACJ;4BAn6D2B,gCAAgC"}
1
+ {"version":3,"file":"GPUAnimationManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/GPUAnimationManager.js"],"names":[],"mappings":"AAiIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;IA6OI;;;;OAIG;IACH,sCAHW,MAAM,kCAgBhB;IAED;;OAEG;IACH,4BAEC;IAED;;;;;;;;;;;;OAYG;IACH,gCAEC;IAED;;;;;;;;;;OAUG;IACH,qCAEC;IAED;;;;;;OAMG;IACH,gCAEC;IAED;;;;;;;;;;OAUG;IACH,mCAEC;IAED;;;;;;;;;;;;OAYG;IACH,4CAFW,MAAM,QA6BhB;IAED;;;;;OAKG;IACH,kBAHW,MAAM,GACJ;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAK3D;IAED;;;;;;;;;;;;OAYG;IACH,gCAHW,MAAM,GACJ,MAAM,CAOlB;IAED;;;;;;;;;;;OAWG;IACH,kCAFa,MAAM,CA+BlB;IAED;;;;;;;;;;;;;;OAcG;IACH,oBAJW;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAEhD,MAAM,CA2BlB;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH;eAPc,MAAM;qBACA,MAAM;mBACR,MAAM;kBACP,MAAM;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAEhE,MAAM,CAkElB;IAgCD;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAHW,MAAM,QACN,MAAM,QAKhB;IAED;;;;;;;;OAQG;IACH,2BAHW,MAAM,QACN,MAAM,QAKhB;IAED;;;;;;;;;;;;;;OAcG;IACH,6BAHW,MAAM,UACN,MAAM,QAKhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,mBAHW,MAAM,SACN,MAAM,QAShB;IAED;;;;;;;OAOG;IACH,qBAHW,MAAM,SACN,MAAM,QAShB;IAED;;;;;;;;;;;OAWG;IACH,eAFW,MAAM,QAShB;IAED;;;;;;;;;OASG;IACH,cAFW,MAAM,QAShB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH;gBAJe,MAAM;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,YAAY,GAAG,MAAM,EAAE,CAAA;SAAE,CAAC;QAEhE,MAAM,CAoElB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,2BAFa,MAAM,CA0FlB;IAyLD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,yCAFa,MAAM,CAsElB;IAwDD;;;;;;;;;;;;;;;OAeG;IACH,yBAFW,MAAM,QAoChB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,yBAFW,MAAM,QA6ChB;IAqHD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,8CAIC;IAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,iEA2CC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,kDAFW,MAAM,QAmChB;IA8FD,gBAYC;;CACJ;4BAn6D2B,gCAAgC"}
@@ -1806,14 +1806,11 @@ export class GPUAnimationManager {
1806
1806
  * clamped to {@link MAX_DT_SECONDS} to keep a stall from
1807
1807
  * leaking multiple seconds into the next tick.
1808
1808
  *
1809
- * Early-outs: the clip passes (tick/apply/resolve/hierarchy)
1810
- * gate on the `animation_bound_track_groups` table being
1811
- * non-empty; skin matrix prep + skinning gate on registered
1812
- * skins instead — a skin whose joints are host-driven (no
1813
- * clips bound) still gets fresh skinning matrices every frame.
1814
- * With nothing registered no GPU work is encoded beyond the
1815
- * database flush — safe to call every frame regardless of
1816
- * registration state.
1809
+ * Clip tick/apply/resolve gate on bound tracks; hierarchy propagation runs
1810
+ * every frame, before skin matrix prep and skinning. CPU-driven nodes need it
1811
+ * too: scene uploads seed global with the previous pose, and propagation
1812
+ * composes the current one. On idle frames it advances prev_global so motion
1813
+ * vectors settle to zero. Skin passes still gate on registered skins.
1817
1814
  *
1818
1815
  * @param {ShadeGPUCommandContext} cmd_ctx
1819
1816
  * @param {number} dt_seconds wall-clock seconds since last call
@@ -1829,16 +1826,19 @@ export class GPUAnimationManager {
1829
1826
  // Flush database + drain pending registrations.
1830
1827
  this.update(cmd_ctx);
1831
1828
 
1832
- // Clip-pass gate: no bound tracks → apply has nothing to
1833
- // do, and resolve + hierarchy propagation cascade from
1834
- // apply. Skipping them keeps the per-frame cost at "one
1835
- // database update" when the scene has no clip animation.
1829
+ // Only clip evaluation is conditional. Every scene needs current globals.
1836
1830
  const apply_groups = this.#database
1837
1831
  .get('animation_bound_track_groups')
1838
1832
  .dispatch_group_count(ANIMATION_APPLY_WORKGROUP_SIZE);
1839
1833
 
1840
1834
  if (apply_groups > 0) {
1841
1835
  this.#encode_clip_passes(cmd_ctx, dt, apply_groups);
1836
+ } else {
1837
+ // CPU uploads seed global with the previous pose. Even without clips,
1838
+ // compose current globals and advance prev_global before skinning/rendering.
1839
+ const graph = new FrameGraph("GPUAnimationManager/TransformHierarchy");
1840
+ graph_scene_update_transform_hierarchy({ graph, scene: this.#scene_context });
1841
+ cmd_ctx.encodeGraph(graph);
1842
1842
  }
1843
1843
 
1844
1844
  // Skin matrix prep + skinning deformation. Both no-op when
@@ -1 +1 @@
1
- {"version":3,"file":"GPUTypedTable.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUTypedTable.js"],"names":[],"mappings":"AAuCA;;;GAGG;AACH;IAmDI;;;OAGG;IACH,iDAOC;IA5DD;;OAEG;IACH,oCAAW;IAEX;;;;OAIG;IACH,OAFU,IAAI,MAAM,EAAC,eAAe,CAAC,CAEnB;IAElB;;;;OAIG;IACH,uBAFU,YAAY,CAE6D;IAEnF;;;;;OAKG;IACH,iBAFU,MAAM,CAEe;IAE/B;;;;OAIG;IACH,WAFU,MAAM,CAES;IAEzB;;;;;;OAMG;IACH,oBAFU,MAAM,CAEkB;IAElC;;;OAGG;IACH,kBAFU,iBAAe,SAAS,CAEjB;IAejB;;;;;OAKG;IACH,WAHW,CAAC,GACC,MAAM,CAQlB;IAED;;;;;OAKG;IACH,sBAFW,MAAM,QAkChB;IAED;;;;;;;;;;OAUG;IACH,cAcC;IAoED;;;;;;OAMG;IACH,mBAJW,MAAM,GACJ,CAAC,GAAC,SAAS,CA4BvB;IAgDD;;;OAGG;IACH,cAsBC;IA+BD;;;;OAIG;IACH,mBAHW,MAAM,SACN,CAAC,QA4EX;IAED;;;OAGG;IACH,2BAIC;IAED;;OAEG;IACH,oBAEC;IAED;;;;;;;;;;OAUG;IACH,+BAEC;IAED;;;;;;;;;;OAUG;IACH,mCAJW,WAAW,UACX,MAAM,GACL,MAAM,CAoBjB;IAED;;;;;;;;;;;;OAYG;IACH,kCAMC;IAED;;;;;;;;;;;;;;OAcG;IACH,mCAHW,MAAM,GACL,MAAM,CAKjB;IAED,gBAEC;;CACJ;gCA3jB+B,sBAAsB;6BAPzB,yCAAyC;uBAC/C,mCAAmC"}
1
+ {"version":3,"file":"GPUTypedTable.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUTypedTable.js"],"names":[],"mappings":"AAuCA;;;GAGG;AACH;IAmDI;;;OAGG;IACH,iDAOC;IA5DD;;OAEG;IACH,oCAAW;IAEX;;;;OAIG;IACH,OAFU,IAAI,MAAM,EAAC,eAAe,CAAC,CAEnB;IAElB;;;;OAIG;IACH,uBAFU,YAAY,CAE6D;IAEnF;;;;;OAKG;IACH,iBAFU,MAAM,CAEe;IAE/B;;;;OAIG;IACH,WAFU,MAAM,CAES;IAEzB;;;;;;OAMG;IACH,oBAFU,MAAM,CAEkB;IAElC;;;OAGG;IACH,kBAFU,iBAAe,SAAS,CAEjB;IAejB;;;;;OAKG;IACH,WAHW,CAAC,GACC,MAAM,CAQlB;IAED;;;;;OAKG;IACH,sBAFW,MAAM,QAkChB;IAED;;;;;;;;;;OAUG;IACH,cAcC;IAoED;;;;;;OAMG;IACH,mBAJW,MAAM,GACJ,CAAC,GAAC,SAAS,CA4BvB;IAgDD;;;OAGG;IACH,cAsBC;IA+BD;;;;OAIG;IACH,mBAHW,MAAM,SACN,CAAC,QAkFX;IAED;;;OAGG;IACH,2BAIC;IAED;;OAEG;IACH,oBAEC;IAED;;;;;;;;;;OAUG;IACH,+BAEC;IAED;;;;;;;;;;OAUG;IACH,mCAJW,WAAW,UACX,MAAM,GACL,MAAM,CAoBjB;IAED;;;;;;;;;;;;OAYG;IACH,kCAMC;IAED;;;;;;;;;;;;;;OAcG;IACH,mCAHW,MAAM,GACL,MAAM,CAKjB;IAED,gBAEC;;CACJ;gCAjkB+B,sBAAsB;6BAPzB,yCAAyC;uBAC/C,mCAAmC"}
@@ -464,6 +464,12 @@ export class GPUTypedTable {
464
464
  write_wgsl_type_value(value, upload_buffer, type);
465
465
  upload_buffer.position = tail;
466
466
  } else {
467
+ // Reserve the whole stride up front. The writes below only reach the last
468
+ // field, so on a type with tail padding they would leave the buffer short of
469
+ // the tail we are about to move `position` to — and `position` is what
470
+ // GPUDatabase.update copies out to, past the end of `data`.
471
+ upload_buffer.ensureCapacity(tail + step_size);
472
+
467
473
  upload_buffer.writeUint32(element_index);
468
474
  write_wgsl_type_value(value, upload_buffer, type);
469
475
  upload_buffer.position = tail + step_size;
@@ -1 +1 @@
1
- {"version":3,"file":"GPUSingleTypeTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js"],"names":[],"mappings":"AAsEA;;;GAGG;AACH;IAsCI;;;;;OAKG;IACH,uDAkBC;IA7DD;;;OAGG;IACH,0BAAK;IAEL;;;OAGG;IACH,2BAAM;IAEN;;;OAGG;IACH,sBAA2E;IAE3E;;;OAGG;IACH,kBAAyB;IAOzB;;;OAGG;IACH,+BAEC;IA4BD;;;OAGG;IACH,WAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;;;OAIG;IACH,WAHW,MAAM,kBAsChB;IAED;;;;OAIG;IACH,aAHW,MAAM,OAiBhB;IAuCD;;;OAGG;IACH,kDAgDC;IAED,0BAQC;IAED,gBAEC;;CACJ"}
1
+ {"version":3,"file":"GPUSingleTypeTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js"],"names":[],"mappings":"AAsEA;;;GAGG;AACH;IAsCI;;;;;OAKG;IACH,uDAkBC;IA7DD;;;OAGG;IACH,0BAAK;IAEL;;;OAGG;IACH,2BAAM;IAEN;;;OAGG;IACH,sBAA2E;IAE3E;;;OAGG;IACH,kBAAyB;IAOzB;;;OAGG;IACH,+BAEC;IA4BD;;;OAGG;IACH,WAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;;;OAIG;IACH,WAHW,MAAM,kBA6ChB;IAED;;;;OAIG;IACH,aAHW,MAAM,OAiBhB;IAuCD;;;OAGG;IACH,kDAgDC;IAED,0BAQC;IAED,gBAEC;;CACJ"}
@@ -191,6 +191,13 @@ export class GPUSingleTypeTable {
191
191
  }
192
192
 
193
193
  upload_buffer.position = tail;
194
+
195
+ // Reserve the whole stride up front. The writes below only reach the last field,
196
+ // so on a type that pads out to `aligned_size` they would leave the buffer short
197
+ // of the tail rounded up to below — and that tail is what `update` copies out to,
198
+ // past the end of `data`.
199
+ upload_buffer.ensureCapacity(tail + stride);
200
+
194
201
  upload_buffer.writeUint32(id);
195
202
  write_wgsl_type_value(value, upload_buffer, this.type);
196
203
 
@@ -0,0 +1,4 @@
1
+ /** GGX-convolved radiance shared by standalone specular and SSR fallback. */
2
+ export const chunk_brick4_sample_specular: CodeChunk;
3
+ import { CodeChunk } from "../../../../shader/compiler/CodeChunk.js";
4
+ //# sourceMappingURL=chunk_brick4_sample_specular.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_brick4_sample_specular.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_specular.js"],"names":[],"mappings":"AAMA,6EAA6E;AAC7E,qDA2CE;0BAjDwB,0CAA0C"}