@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
@@ -0,0 +1,68 @@
1
+ import { RenderExtension } from "../../renderer/extension/RenderExtension.js";
2
+ import { ImageShader } from "../../renderer/shader/ImageShader.js";
3
+ import { CodeChunk } from "../../renderer/shader/compiler/CodeChunk.js";
4
+ import { chunk_decode_g_buffer_normal } from "../../renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
5
+ import { graph_image_pass } from "../../renderer/shader/graph/graph_image_pass.js";
6
+ import { graph_import_texture } from "../../renderer/shader/graph/graph_import_texture.js";
7
+ import { ShaderResourceSetDescriptor } from "../../renderer/shader/resource/ShaderResourceSetDescriptor.js";
8
+ import { ShaderDescriptor } from "../../renderer/shader/ShaderDescriptor.js";
9
+ import { GPUTextureContext } from "../../renderer/texture/GPUTextureContext.js";
10
+ import { download_texture_data } from "../../renderer/texture/download_texture_data.js";
11
+
12
+ const resources = new ShaderResourceSetDescriptor();
13
+ resources.createGroup().addTexture('tBefore').addTexture('tAfter').addTexture('tNormal', 'uint');
14
+ const shader = new ImageShader({
15
+ descriptor: ShaderDescriptor.from({label:'SSR lab / spatial effect',resources,
16
+ body:CodeChunk.from(/* language=WGSL */ `
17
+ @fragment fn main(@builtin(position) coord:vec4f) -> @location(0) vec4f {
18
+ let p = vec2i(coord.xy);
19
+ if (decode_g_buffer_normal(textureLoad(tNormal,p,0).xy).y < 0.99) { return vec4f(-1.0); }
20
+ let a = textureLoad(tBefore,p,0);
21
+ let b = textureLoad(tAfter,p,0);
22
+ let difference = abs(a.rgb-b.rgb);
23
+ return vec4f(max(difference.r,max(difference.g,difference.b)),a.w,b.w,1.0);
24
+ }`, [chunk_decode_g_buffer_normal])}),
25
+ targets:[{format:'rgba32float'}],
26
+ });
27
+
28
+ /** Same-frame GPU input/output comparison. Opt-in; no cost during ordinary playback. */
29
+ export class SpatialFilterProbe extends RenderExtension {
30
+ name = 'SSR lab / measure spatial filter';
31
+ enabled = false;
32
+ texture;
33
+ device;
34
+ constructor(device) { super(); this.device=device; }
35
+ record(frame) {
36
+ if (!this.enabled) { return; }
37
+ // This diagnostic intentionally inspects the playground's production graph.
38
+ const pass=frame.graph.__pass_nodes.find(p=>p.name==='SSR / spatial denoise with metadata');
39
+ const resolve=frame.graph.__pass_nodes.find(p=>p.name==='SSR resolve / IBL');
40
+ if (!resolve) { throw new Error('Enable SSR to measure its spatial filter.'); }
41
+ const before=pass ? pass.data.tInput : resolve.data['@output'][0];
42
+ const after=pass ? pass.data['@output'][0] : before;
43
+ const [width,height]=frame.resolution;
44
+ if (!this.texture || this.texture.width!==width || this.texture.height!==height) {
45
+ this.texture?.destroy();
46
+ this.texture=GPUTextureContext.fromTexture(this.device.createTexture({
47
+ size:[width,height,1],format:'rgba32float',
48
+ usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,
49
+ }),this.device);
50
+ }
51
+ graph_image_pass({graph:frame.graph,shader,
52
+ inputs:{tBefore:before,tAfter:after,tNormal:resolve.data.tNormal},
53
+ output:[graph_import_texture(frame.graph,this.texture,'SSR spatial measurement')],
54
+ });
55
+ }
56
+ async read() {
57
+ const data=await download_texture_data({device:this.device,source:this.texture.gpu_texture});
58
+ let pixels=0,changed=0,zero_variance=0,mean=0,max=0;
59
+ for(let i=0;i<data.length;i+=4) {
60
+ if(data[i]<0) { continue; }
61
+ if(!Number.isFinite(data[i])) { throw new Error('Non-finite denoising output.'); }
62
+ pixels++; changed+=data[i]>0.001 ? 1 : 0; zero_variance+=data[i+1]<=1e-6 ? 1 : 0;
63
+ mean+=data[i]; max=Math.max(max,data[i]);
64
+ }
65
+ if(pixels===0) { throw new Error('No upward-facing mirror pixels in this view.'); }
66
+ return {pixels,changed_percent:100*changed/pixels,zero_variance_percent:100*zero_variance/pixels,mean:mean/pixels,max};
67
+ }
68
+ }
@@ -0,0 +1,79 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Meep — SSR reflection lab</title>
7
+ <style>
8
+ :root { color-scheme: dark; font: 14px/1.5 system-ui, sans-serif; background: #11151c; color: #e4eaf2; }
9
+ * { box-sizing: border-box; }
10
+ body { margin: 0; padding: 24px; }
11
+ header { display: flex; align-items: baseline; gap: 16px; margin-bottom: 18px; }
12
+ h1 { font-size: 24px; margin: 0; font-weight: 600; }
13
+ header span, .hint, small { color: #a2afc1; }
14
+ main { display: grid; grid-template-columns: minmax(0, 1fr) 290px; gap: 20px; align-items: start; }
15
+ .stage { position: relative; background: #090c11; border: 1px solid #344153; border-radius: 8px; overflow: hidden; }
16
+ /* Renderer writes inline presentation dimensions; both layers must scale together. */
17
+ canvas { display: block; width: 100% !important; height: auto !important; }
18
+ #overlay { position: absolute; inset: 0; pointer-events: none; }
19
+ aside { background: #1a212c; border: 1px solid #344153; border-radius: 8px; padding: 18px; }
20
+ label { display: block; margin-bottom: 13px; }
21
+ label > span { display: block; font-size: 12px; color: #a2afc1; margin-bottom: 4px; }
22
+ select, button { width: 100%; background: #252f3e; border: 1px solid #45556a; color: inherit; border-radius: 5px; padding: 8px; font: inherit; }
23
+ button { cursor: pointer; }
24
+ button:hover { background: #344359; }
25
+ button:disabled { opacity: .4; cursor: default; }
26
+ .buttons { display: flex; gap: 8px; margin-bottom: 10px; }
27
+ .check { display: flex; gap: 8px; align-items: center; }
28
+ input[type=range] { width: 100%; accent-color: #74c8ff; }
29
+ hr { border: 0; border-top: 1px solid #344153; margin: 18px 0; }
30
+ #status { font: 12px/1.5 ui-monospace, Consolas, monospace; white-space: pre-wrap; color: #95d6b4; }
31
+ #status.error { color: #ff9a9a; }
32
+ #hint { min-height: 3em; margin: 14px 0 0; }
33
+ .legend { display: flex; gap: 24px; flex-wrap: wrap; margin-top: 12px; color: #a2afc1; font-size: 12px; }
34
+ .legend b { color: #dce9ff; }
35
+ details { margin-top: 18px; max-width: 85ch; color: #a2afc1; }
36
+ summary { color: #dce9ff; cursor: pointer; }
37
+ @media (max-width: 850px) { main { grid-template-columns: 1fr; } aside { width: 100%; } header { display: block; } }
38
+ </style>
39
+ </head>
40
+ <body tabindex="0">
41
+ <header><h1>SSR reflection lab</h1><span>Camera parallax · temporal stability · rejection</span></header>
42
+ <main>
43
+ <section>
44
+ <div class="stage"><canvas id="view" width="960" height="600" tabindex="0" aria-label="Interactive WebGPU reflection scene"></canvas><canvas id="overlay" width="960" height="600" aria-hidden="true"></canvas></div>
45
+ <div class="legend"><span><b>Solid cross</b> — ideal reflected centre</span><span><b>Dashed cross</b> — point fixed to the floor</span></div>
46
+ <p id="hint" class="hint"></p>
47
+ <details open><summary>A quick visual check</summary>
48
+ <ol>
49
+ <li>Run <b>Lateral camera</b> with <b>Parallax</b>. Reflections should follow the solid crosses as the floor moves underneath.</li>
50
+ <li>Restart the same motion with <b>Surface only</b>, then <b>No temporal history</b>. Look for trails, delayed edges, and changes in noise.</li>
51
+ <li>Try <b>Moving object</b> and <b>Occluder</b>. Inspect the magenta object’s trail and newly revealed floor. Use <b>Camera cut</b> to check reset.</li>
52
+ </ol>
53
+ <p><b>Spatial denoising</b> smooths neighbouring reflection pixels in three passes. It is on by default and independent of reprojection. Turn it off and select <b>No temporal history</b> to inspect the resolve output; resolve still reuses neighbouring ray hits and filters radiance for roughness.</p>
54
+ <p>The crosses are geometric guides for object centres, not a pixel-perfect lighting reference. SSR loses information when reflected objects are hidden or off-screen. Surface only retains the new validation and blending fixes; it is not the old shader.</p>
55
+ </details>
56
+ </section>
57
+ <aside>
58
+ <label><span>Reprojection</span><select id="mode"><option value="0">Parallax</option><option value="1">Surface only</option><option value="2">No temporal history</option><option value="off">SSR off</option></select></label>
59
+ <label><span>Experiment</span><select id="experiment"><option value="lateral">Lateral camera</option><option value="forward">Forward camera</option><option value="orbit">Orbit camera</option><option value="object">Moving object</option><option value="occluder">Occluder</option><option value="still">Still camera / noise</option><option value="free">Free camera</option></select></label>
60
+ <label><span>Motion speed <output id="speed-value">1.0×</output></span><input id="speed" aria-label="Motion speed" type="range" min="0.2" max="2" value="1" step="0.1"></label>
61
+ <label><span>Mirror roughness <output id="roughness-value">0.03</output></span><input id="roughness" aria-label="Mirror roughness" type="range" min="0.01" max="0.7" value="0.03" step="0.01"></label>
62
+ <label><span>Render resolution</span><select id="resolution"><option value="640">640 × 400</option><option value="960" selected>960 × 600</option><option value="1280">1280 × 800</option></select></label>
63
+ <label class="check"><input id="guides" type="checkbox" checked>Show geometric guides</label>
64
+ <label class="check"><input id="denoising" type="checkbox" checked>Spatial denoising</label>
65
+ <label class="check"><input id="taa" type="checkbox">Final-image TAA</label>
66
+ <hr>
67
+ <div class="buttons"><button id="play">Pause motion</button><button id="step">Step frame</button></div>
68
+ <div class="buttons"><button id="restart">Restart path</button><button id="cut">Camera cut</button></div>
69
+ <button id="reset">Reset reflection history</button>
70
+ <hr>
71
+ <button id="measure">Measure spatial filter</button>
72
+ <button id="compile">Validate GPU shaders</button>
73
+ <p id="status" role="status">Starting WebGPU…</p>
74
+ <small>Fixed exposure. Bloom, sharpening, and motion blur are off. Free camera: drag to orbit, right-drag to pan, wheel to zoom.</small>
75
+ </aside>
76
+ </main>
77
+ <script type="module" src="./main.js"></script>
78
+ </body>
79
+ </html>
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/ssr_reprojection/main.js"],"names":[],"mappings":""}
@@ -0,0 +1,245 @@
1
+ import { SpatialFilterProbe } from "./SpatialFilterProbe.js";
2
+ import Vector3 from "../../../core/geom/Vector3.js";
3
+ import { PerspectiveCamera } from "../../renderer/camera/PerspectiveCamera.js";
4
+ import { OrbitalCameraController } from "../../renderer/camera/OrbitalCameraController.js";
5
+ import { create_frame_loop } from "../../renderer/create_frame_loop.js";
6
+ import { Renderer } from "../../renderer/Renderer.js";
7
+ import { ShadeIndirectLightingMode } from "../../renderer/ShadeIndirectLightingMode.js";
8
+ import { ssr_trace_shader } from "../../renderer/postprocess/ssr/ssr_trace_shader.js";
9
+ import { ssr_resolve_shader_IBL } from "../../renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js";
10
+ import { ssr_resolve_shader_LPV } from "../../renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js";
11
+ import { ssr_reproject_shader } from "../../renderer/postprocess/ssr/ssr_reproject_shader.js";
12
+ import { ssr_spatial_denoise_shader, ssr_spatial_denoise_metadata_shader } from "../../renderer/postprocess/ssr/ssr_spatial_denoise_shader.js";
13
+ import { create_scene } from "./scene.js";
14
+
15
+ const element = id => document.getElementById(id);
16
+ const hints = {
17
+ lateral: 'The camera translates sideways without turning. The solid reflection guides should move differently from the dashed points attached to the floor.',
18
+ forward: 'The camera moves towards and away from the mirror. Watch reflection size and trailing edges against the solid guides.',
19
+ orbit: 'The camera rotates around the scene. Inspect reflection edges at oblique angles and near the edge of the mirror.',
20
+ object: 'The camera and mirror stay still while C moves. This deliberately challenges the current algorithm: mirror geometry alone cannot identify reflected-object motion.',
21
+ occluder: 'A dark pillar crosses the view. Look for stale reflections on newly revealed floor; screen-space tracing also loses hidden source geometry.',
22
+ still: 'The camera stays still while sampling continues. Compare temporal modes for noise; pausing motion still renders new samples.',
23
+ free: 'Drag on the scene to orbit, right-drag to pan, or scroll to zoom. Restart path returns to the original camera.',
24
+ };
25
+
26
+ function report(text, error = false) {
27
+ element('status').textContent = text;
28
+ element('status').classList.toggle('error', error);
29
+ }
30
+
31
+ async function start() {
32
+ if (!navigator.gpu) { throw new Error('WebGPU is unavailable in this browser. Open this localhost page in a current WebGPU-enabled browser.'); }
33
+ const canvas = element('view'), overlay = element('overlay');
34
+ const context = canvas.getContext('webgpu');
35
+ if (!context) { throw new Error('Could not create a WebGPU canvas context.'); }
36
+ const renderer = new Renderer();
37
+ report("Acquiring GPU and loading engine textures…");
38
+ await renderer.initialize({ context, pixelRatio: 1 });
39
+ renderer.feature_ssr_enabled = true;
40
+ renderer.indirect_lighting_mode = ShadeIndirectLightingMode.IBL;
41
+ renderer.feature_taa_enabled = false;
42
+ renderer.feature_ssao_enabled = false;
43
+ renderer.feature_bloom_enabled = false;
44
+ renderer.feature_sharpening_enabled = false;
45
+ renderer.feature_motion_blur_enabled = false;
46
+ renderer.feature_automatic_exposure_enabled = false;
47
+ renderer.exposure_compensation = 1;
48
+ renderer.internal_resolution_scale = 1;
49
+ report("Building procedural scene…");
50
+ const world = await create_scene();
51
+ const camera = new PerspectiveCamera();
52
+ camera.near = 0.1;
53
+ camera.far = 80;
54
+ camera.fov = 50 * Math.PI / 180;
55
+ const controller = new OrbitalCameraController(camera, canvas);
56
+ controller.movement_speed_scale = 0.5;
57
+ let phase = 0, frame_count = 0, paused = false, cut_side = 0, stopped = false;
58
+ let stop_loop;
59
+ let check_busy = false;
60
+ let last_status = 0;
61
+ let anchors = [];
62
+
63
+ function pose(position, target) {
64
+ camera.transform.setTranslation(...position);
65
+ camera.transform.lookAt(new Vector3(...target));
66
+ camera.transform.updateMatrix();
67
+ }
68
+ function update_scene() {
69
+ const experiment = element('experiment').value;
70
+ const t = Math.sin(phase);
71
+ const offset = cut_side * 2;
72
+ if (experiment === 'free') { controller.update(); }
73
+ else if (experiment === 'lateral') { pose([2 * t + offset, 3.4, 8], [2 * t + offset, 0.3, -1.5]); }
74
+ else if (experiment === 'forward') { pose([offset, 3.4, 8 + 1.6 * t], [offset, 0.3, -1.5 + 1.6 * t]); }
75
+ else if (experiment === 'orbit') { pose([4 * t + offset, 3.4, 8 - 0.7 * t * t], [0, 0.3, -1.5]); }
76
+ else { pose([offset, 3.4, 8], [0, 0.3, -1.5]); }
77
+ const moving = world.targets[2];
78
+ const x = moving.position[0] + (experiment === 'object' ? 1.3 * t : 0);
79
+ moving.mesh.transform_local.setTranslation(x, moving.position[1], moving.position[2]);
80
+ moving.mesh.updateMatrices();
81
+ world.occluder.transform_local.setTranslation(experiment === 'occluder' ? 3 * t : 20, 1, 1);
82
+ world.occluder.updateMatrices();
83
+ }
84
+ function reset_anchors() {
85
+ const c = camera.transform.translation;
86
+ // Independent oracle: mirror physical centres across y=0, then intersect C->V
87
+ // with the plane once. These anchors stay on the floor as the camera moves.
88
+ anchors = world.targets.map(({ mesh }) => {
89
+ const p = mesh.transform_local.translation;
90
+ const v = [p[0], -p[1], p[2]];
91
+ const t = -c[1] / (v[1] - c[1]);
92
+ return [c[0] + (v[0] - c[0]) * t, 0, c[2] + (v[2] - c[2]) * t];
93
+ });
94
+ }
95
+ function restart() {
96
+ phase = 0; cut_side = 0;
97
+ pose([0, 3.4, 8], [0, 0.3, -1.5]);
98
+ controller.look(new Vector3(0, 3.4, 8), new Vector3(0, 0.3, -1.5));
99
+ update_scene(); reset_anchors();
100
+ renderer.indicate_view_change();
101
+ element('hint').textContent = hints[element('experiment').value];
102
+ }
103
+ function resize() {
104
+ const width = Number(element('resolution').value), height = width * 5 / 8;
105
+ canvas.width = overlay.width = width;
106
+ canvas.height = overlay.height = height;
107
+ camera.aspect = width / height;
108
+ renderer.resize(width, height);
109
+ }
110
+ function apply_mode() {
111
+ const mode = element('mode').value;
112
+ renderer.feature_ssr_enabled = mode !== 'off';
113
+ renderer.ssr.reprojection_mode = mode === 'off' ? 0 : Number(mode);
114
+ restart();
115
+ }
116
+ function draw_guides() {
117
+ const ctx = overlay.getContext('2d');
118
+ ctx.clearRect(0, 0, overlay.width, overlay.height);
119
+ if (!element('guides').checked) { return; }
120
+ const m = camera.view_projection_matrix;
121
+ const project = p => {
122
+ const w = m[3]*p[0] + m[7]*p[1] + m[11]*p[2] + m[15];
123
+ if (w <= 0) { return null; }
124
+ return [(0.5 + 0.5*(m[0]*p[0]+m[4]*p[1]+m[8]*p[2]+m[12])/w)*overlay.width,
125
+ (0.5 - 0.5*(m[1]*p[0]+m[5]*p[1]+m[9]*p[2]+m[13])/w)*overlay.height];
126
+ };
127
+ const cross = (p, dashed, color, label) => {
128
+ const xy = project(p);
129
+ if (!xy) { return; }
130
+ const [x,y] = xy;
131
+ ctx.strokeStyle = color; ctx.fillStyle = color; ctx.lineWidth = 1.5;
132
+ ctx.setLineDash(dashed ? [3,3] : []);
133
+ ctx.beginPath(); ctx.moveTo(x-8,y); ctx.lineTo(x+8,y); ctx.moveTo(x,y-8); ctx.lineTo(x,y+8); ctx.stroke();
134
+ if (label) { ctx.font = '12px system-ui'; ctx.fillText(label,x+11,y-5); }
135
+ };
136
+ world.targets.forEach(({mesh,color,label},i) => {
137
+ const p = mesh.transform_local.translation;
138
+ cross([p[0],-p[1],p[2]],false,color,label);
139
+ cross(anchors[i],true,'#c2ccd9','');
140
+ });
141
+ }
142
+ function frame(dt, advance = true) {
143
+ if (stopped || check_busy) { return; }
144
+ try {
145
+ if (advance) { phase += dt * Number(element('speed').value) * 0.7; }
146
+ update_scene();
147
+ renderer.render(camera, world.scene, dt);
148
+ draw_guides(); frame_count++;
149
+ if (performance.now() - last_status > 500) {
150
+ report(`${canvas.width} × ${canvas.height} · frame ${frame_count}\n${paused ? 'Motion paused · sampling continues' : 'Running'} · ${element('mode').selectedOptions[0].textContent}`);
151
+ last_status = performance.now();
152
+ }
153
+ } catch (error) { fail(error); }
154
+ }
155
+ function fail(error) {
156
+ stopped = true; stop_loop?.();
157
+ report(error.message ?? String(error), true);
158
+ console.error(error);
159
+ }
160
+ const device = renderer.graphics.device;
161
+ const spatial_probe = new SpatialFilterProbe(device);
162
+ renderer.add_extension(spatial_probe);
163
+ element('measure').addEventListener('click', async () => {
164
+ if (check_busy || stopped) { return; }
165
+ if (!renderer.feature_ssr_enabled) { report('Enable SSR before measuring.'); return; }
166
+ check_busy = true;
167
+ const denoising_enabled = renderer.ssr.spatial_denoising_enabled;
168
+ element('measure').disabled = true;
169
+ try {
170
+ spatial_probe.enabled = true;
171
+ renderer.render(camera, world.scene, 0);
172
+ spatial_probe.enabled = false;
173
+ const r = await spatial_probe.read();
174
+ report(`Spatial pass 1 · same-frame GPU comparison
175
+ Denoising ${denoising_enabled ? 'ON' : 'OFF'}
176
+ Mirror pixels changed >0.001: ${r.changed_percent.toFixed(2)}%
177
+ Mean / max RGB change: ${r.mean.toFixed(6)} / ${r.max.toFixed(4)}
178
+ Input variance ≤1e-6: ${r.zero_variance_percent.toFixed(2)}%`);
179
+ last_status = performance.now()+30000;
180
+ } catch (error) { report(error.message,true); }
181
+ finally {
182
+ spatial_probe.enabled=false;
183
+ spatial_probe.texture?.destroy();
184
+ spatial_probe.texture=undefined;
185
+ check_busy=false;
186
+ element('measure').disabled=false;
187
+ }
188
+ });
189
+ device.addEventListener('uncapturederror', event => fail(event.error));
190
+ device.lost.then(info => fail(new Error(`GPU device lost: ${info.message}`)));
191
+ element('mode').addEventListener('change', apply_mode);
192
+ element('experiment').addEventListener('change', restart);
193
+ element('resolution').addEventListener('change', resize);
194
+ element('speed').addEventListener('input', () => { element('speed-value').textContent = `${Number(element('speed').value).toFixed(1)}×`; });
195
+ element('roughness').addEventListener('input', () => {
196
+ world.mirror_material.roughness_factor = Number(element('roughness').value);
197
+ element('roughness-value').textContent = world.mirror_material.roughness_factor.toFixed(2);
198
+ renderer.indicate_view_change();
199
+ });
200
+ element('denoising').addEventListener('change', () => {
201
+ renderer.ssr.spatial_denoising_enabled = element('denoising').checked;
202
+ last_status = 0;
203
+ });
204
+ element('taa').addEventListener('change', () => { renderer.feature_taa_enabled = element('taa').checked; });
205
+ element('play').addEventListener('click', () => {
206
+ paused = !paused; element('play').textContent = paused ? 'Play motion' : 'Pause motion';
207
+ });
208
+ element('step').addEventListener('click', () => { paused = true; element('play').textContent = 'Play motion'; frame(1/60); });
209
+ element('restart').addEventListener('click', restart);
210
+ element('cut').addEventListener('click', () => {
211
+ cut_side = cut_side === 1 ? -1 : 1;
212
+ if (element('experiment').value === 'free') { element('experiment').value = 'still'; }
213
+ renderer.indicate_view_change();
214
+ });
215
+ element('reset').addEventListener('click', () => { renderer.ssr.reset_history = true; });
216
+ element('compile').addEventListener('click', async () => {
217
+ if (check_busy) { return; }
218
+ check_busy = true; element('compile').disabled = true;
219
+ try {
220
+ const messages = [];
221
+ for (const shader of [ssr_trace_shader, ssr_resolve_shader_IBL, ssr_resolve_shader_LPV,
222
+ ssr_reproject_shader, ssr_spatial_denoise_shader, ssr_spatial_denoise_metadata_shader]) {
223
+ device.pushErrorScope('validation');
224
+ const module = device.createShaderModule({label:shader.descriptor.label,code:shader.descriptor.source});
225
+ const info = await module.getCompilationInfo();
226
+ const error = await device.popErrorScope();
227
+ const errors = info.messages.filter(m => m.type === 'error');
228
+ messages.push(`${shader.descriptor.label}: ${error || errors.length ? 'FAIL' : 'OK'}`);
229
+ if (error) { messages.push(error.message); }
230
+ messages.push(...errors.map(m => `${m.lineNum}:${m.linePos} ${m.message}`));
231
+ }
232
+ report(messages.join('\n'), messages.some(m => m.includes('FAIL')));
233
+ last_status = performance.now() + 12000;
234
+ } catch (error) { report(error.message, true); }
235
+ finally { check_busy = false; element('compile').disabled = false; }
236
+ });
237
+ resize(); restart();
238
+ // Explicit stepping is useful for reproducible runs in a background tab.
239
+ globalThis.ssr_lab = { renderer, camera, world, step: (n = 1) => { for (let i=0;i<n;i++) { frame(1/60); } return frame_count; } };
240
+ const manual = new URLSearchParams(location.search).has('manual');
241
+ if (!manual) { stop_loop = create_frame_loop(dt => frame(Math.min(dt, 0.05), !paused), 30); }
242
+ frame(0, false);
243
+ }
244
+
245
+ start().catch(error => { report(error.message, true); console.error(error); });
@@ -0,0 +1,18 @@
1
+ /** Small, entirely procedural scene. The top of the mirror is exactly y=0. */
2
+ export function create_scene(): Promise<{
3
+ scene: Scene;
4
+ mirror_material: StandardShadeMaterial;
5
+ targets: {
6
+ mesh: Mesh;
7
+ label: string;
8
+ position: number[];
9
+ size: number[];
10
+ color: string;
11
+ rgb: number[];
12
+ }[];
13
+ occluder: Mesh;
14
+ }>;
15
+ import { Scene } from "../../renderer/scene/Scene.js";
16
+ import { StandardShadeMaterial } from "../../renderer/material/StandardShadeMaterial.js";
17
+ import { Mesh } from "../../renderer/scene/Mesh.js";
18
+ //# sourceMappingURL=scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/ssr_reprojection/scene.js"],"names":[],"mappings":"AAUA,8EAA8E;AAC9E;;;;;;;;;;;;GAuCC;sBA3CqB,+BAA+B;sCAHf,kDAAkD;qBAEnE,8BAA8B"}
@@ -0,0 +1,51 @@
1
+ import { Color } from "../../../core/color/Color.js";
2
+ import Vector3 from "../../../core/geom/Vector3.js";
3
+ import { BoxGeometry } from "../../renderer/geometry/BoxGeometry.js";
4
+ import { MeshoptClusterizer } from "../../renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js";
5
+ import { StandardShadeMaterial } from "../../renderer/material/StandardShadeMaterial.js";
6
+ import { make_sunlight } from "../../renderer/light/make_sunlight.js";
7
+ import { Mesh } from "../../renderer/scene/Mesh.js";
8
+ import { Scene } from "../../renderer/scene/Scene.js";
9
+ import { make_flat_environment } from "../skinned_blas_refit/flat_environment.js";
10
+
11
+ /** Small, entirely procedural scene. The top of the mirror is exactly y=0. */
12
+ export async function create_scene() {
13
+ await MeshoptClusterizer.ready;
14
+ const scene = new Scene();
15
+ const cube = new BoxGeometry();
16
+ const material = (rgb, roughness = 0.65, metallic = 0, glow = 0) => {
17
+ const result = new StandardShadeMaterial();
18
+ result.diffuse_color.copy(new Color(...rgb));
19
+ result.emissive_factor.copy(new Color(...rgb.map(v => v * glow)));
20
+ result.roughness_factor = roughness;
21
+ result.metallic_factor = metallic;
22
+ return result;
23
+ };
24
+ const box = (name, position, scale, mat) => {
25
+ const mesh = Mesh.from(cube, mat);
26
+ mesh.name = name;
27
+ mesh.transform_local.setTranslation(...position);
28
+ mesh.transform_local.setScale(...scale);
29
+ mesh.updateMatrices();
30
+ scene.add(mesh);
31
+ return mesh;
32
+ };
33
+ const mirror_material = material([0.85, 0.88, 0.92], 0.03, 1);
34
+ box('Planar mirror', [0, -0.1, -1], [14, 0.2, 13], mirror_material);
35
+ // Sparse fixed lines make the different motion of floor and reflection visible.
36
+ const grid = material([0.11, 0.14, 0.18], 0.3, 0.7);
37
+ for (let i = -6; i <= 6; i += 2) {
38
+ box('Floor grid X', [i, 0.002, -1], [0.016, 0.004, 13], grid);
39
+ box('Floor grid Z', [0, 0.002, i - 1], [14, 0.004, 0.016], grid);
40
+ }
41
+ const targets = [
42
+ { label: 'A', position: [-2.4, 1.3, -1.8], size: [0.85, 2.1, 0.8], color: '#ff966b', rgb: [1, 0.23, 0.08] },
43
+ { label: 'B', position: [0, 1.7, -3.4], size: [0.9, 2.7, 0.8], color: '#82cfff', rgb: [0.08, 0.5, 1] },
44
+ { label: 'C', position: [2.3, 1.1, -0.8], size: [0.85, 1.7, 0.8], color: '#e9a4ff', rgb: [0.75, 0.1, 1] },
45
+ ].map(spec => ({ ...spec, mesh: box(spec.label, spec.position, spec.size, material(spec.rgb, 0.5, 0, 0.35)) }));
46
+ // Keep its resource identity stable while moving it into/out of the view.
47
+ const occluder = box('Moving occluder', [20, 1, 1], [0.7, 2, 0.35], material([0.04, 0.05, 0.06]));
48
+ scene.lights.environment = make_flat_environment([0.045, 0.055, 0.075]);
49
+ scene.lights.add(make_sunlight({ intensity: 1.5, direction: new Vector3(-0.4, -1, -0.3), temperature: 6500 }));
50
+ return { scene, mirror_material, targets, occluder };
51
+ }
@@ -53,15 +53,6 @@ export class Renderer {
53
53
  * @type {boolean}
54
54
  */
55
55
  feature_particles_enabled: boolean;
56
- /**
57
- * Most particles alive at once in a scene — the pool every emitter of that scene draws its
58
- * records from. Read once, when the scene's {@link GPUParticleSystem} is created on the first
59
- * frame {@link feature_particles_enabled} is on for it; the pool does not grow afterwards, so
60
- * set this before that frame. Left undefined, the system's own default applies.
61
- *
62
- * @type {number|undefined}
63
- */
64
- particle_capacity: number | undefined;
65
56
  feature_ssr_enabled: boolean;
66
57
  feature_ssao_enabled: boolean;
67
58
  /**
@@ -190,20 +181,6 @@ export class Renderer {
190
181
  * @returns {DepthOfFieldU}
191
182
  */
192
183
  get dof_unreal(): DepthOfFieldU;
193
- /**
194
- * When true and {@link indirect_lighting_mode} is Brick4, run a single fused
195
- * pass that produces the resolved indirect lighting directly (combining the
196
- * brick4 diffuse, brick4 specular and indirect resolve passes). Trades a
197
- * bit of cache pressure inside the pass for substantially less memory
198
- * bandwidth: no intermediate rgba16float diffuse/specular targets, the
199
- * g-buffer is read once, and a single brick4 probe pair is shared between
200
- * the diffuse and specular evaluations.
201
- *
202
- * SSR is mutually exclusive with the fused path (it needs the standalone
203
- * specular target as input), so when SSR is enabled the split path is used.
204
- * @type {boolean}
205
- */
206
- fused_indirect: boolean;
207
184
  /**
208
185
  * RCAS
209
186
  * @type {boolean}
@@ -346,6 +323,8 @@ export class Renderer {
346
323
  * @param {Scene} scene
347
324
  */
348
325
  update_lpv(scene: Scene): void;
326
+ /** SSR settings, available after initialize(). @returns {import("./postprocess/ssr/SSR.js").SSR} */
327
+ get ssr(): import("./postprocess/ssr/SSR.js").SSR;
349
328
  /**
350
329
  * ReSTIR DI subsystem — exposed for runtime tuning (e.g. GUI toggles like
351
330
  * `use_screen_space_shadow`, `m_initial`).
@@ -1 +1 @@
1
- {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}