@woosh/meep-engine 3.60.4 → 3.60.6
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.
- package/CHANGELOG.md +2621 -0
- package/CONTRIBUTING.md +7 -0
- package/MIGRATION_2_TO_3.md +136 -0
- package/SECURITY.md +4 -0
- package/editor/EditorCameraNavigation.d.ts +2 -1
- package/editor/EditorCameraNavigation.d.ts.map +1 -1
- package/editor/EditorCameraNavigation.js +51 -57
- package/package.json +6 -2
- package/src/engine/EngineHarness.d.ts +3 -9
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +6 -8
- package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts +9 -6
- package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts.map +1 -1
- package/src/engine/graphics/camera/makeOrbitalCameraController.js +44 -71
- package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts +64 -0
- package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts.map +1 -0
- package/src/engine/graphics/camera/orbital/MomentumAxis.js +187 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts +86 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts.map +1 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.js +319 -0
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +34 -10
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +116 -30
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +1 -7
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -37
- package/src/engine/graphics/ecs/water/Water.d.ts +8 -0
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +8 -0
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +731 -734
- package/src/engine/graphics3/decal/DecalTileShader.d.ts +61 -0
- package/src/engine/graphics3/decal/DecalTileShader.d.ts.map +1 -0
- package/src/engine/graphics3/decal/DecalTileShader.js +138 -0
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts +10 -4
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +149 -44
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts +25 -0
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts.map +1 -0
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.js +55 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts +22 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts.map +1 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.js +70 -0
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts +7 -5
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_decal_composite.js +48 -44
- package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts +12 -0
- package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -0
- package/src/engine/graphics3/decal/shader_decal_tile_copy.js +78 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts +11 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts.map +1 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.js +80 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.d.ts +13 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.d.ts.map +1 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.js +23 -0
- package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts +4 -0
- package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts.map +1 -1
- package/src/engine/input/ecs/controllers/KeyboardCameraController.js +9 -45
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/playground/water_refraction/README.md +5 -6
- package/src/shade/playground/water_refraction/index.html +1 -1
- package/src/shade/renderer/Renderer.d.ts +11 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +50 -6
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +28 -45
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +111 -119
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +22 -3
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +84 -3
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.js +25 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +38 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +28 -59
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +84 -789
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +1 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +7 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +12 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +1 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
- package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
- package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
- package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts +11 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +16 -8
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +7 -3
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +26 -13
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts +14 -0
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +196 -68
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +42 -28
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +429 -414
- package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts +16 -0
- package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.js +156 -0
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +2 -2
- package/src/shade/renderer/scene/GPUSceneContext.js +5 -5
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
- package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
- package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
- package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +22 -13
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water_avboit.js +7 -7
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
- package/editor/REWORK_PLAN_2026_08.md +0 -692
- package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
- package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
- package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
- package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
- package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
- package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
- package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
- package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
- package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
- package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
- package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
- package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
- package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
- package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
- package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
- package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
- package/src/REVIEW_2026_08_06/adv-core.md +0 -511
- package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
- package/src/REVIEW_2026_08_06/adv-view.md +0 -446
- package/src/REVIEW_2026_08_06/api-core.md +0 -296
- package/src/REVIEW_2026_08_06/api-engine.md +0 -195
- package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
- package/src/REVIEW_2026_08_06/core-binary.md +0 -348
- package/src/REVIEW_2026_08_06/core-collection.md +0 -376
- package/src/REVIEW_2026_08_06/core-math.md +0 -221
- package/src/REVIEW_2026_08_06/core-process.md +0 -266
- package/src/REVIEW_2026_08_06/core-science.md +0 -223
- package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
- package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
- package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
- package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
- package/src/REVIEW_2026_08_06/engine-input.md +0 -197
- package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
- package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
- package/src/REVIEW_2026_08_06/generation.md +0 -176
- package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
- package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
- package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
- package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
- package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
- package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
- package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
- package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
- package/src/REVIEW_2026_08_06/view.md +0 -667
- package/src/REVIEW_2026_08_06.md +0 -610
- package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
- package/src/core/bvh2/bvh3/NOTES.md +0 -2
- package/src/core/bvh8/NOTES.md +0 -63
- package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
- package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
- package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
- package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
- package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
- package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
- package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
- package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
- package/src/core/geom/3d/gjk/NOTES.md +0 -8
- package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
- package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
- package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
- package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
- package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
- package/src/engine/REVIEW_2026_07_03.md +0 -211
- package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
- package/src/engine/control/first-person/DESIGN.md +0 -658
- package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
- package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
- package/src/engine/control/first-person/TODO.md +0 -160
- package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
- package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
- package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
- package/src/engine/ecs/ik/PLAN.md +0 -179
- package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
- package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
- package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
- package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
- package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
- package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
- package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
- package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
- package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
- package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
- package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
- package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
- package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
- package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
- package/src/engine/network/CONGESTION_CONTROL.md +0 -87
- package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
- package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
- package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
- package/src/engine/physics/cloth/PLAN.md +0 -3056
- package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
- package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
- package/src/engine/physics/fluid/solver/NOTES.md +0 -46
- package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
- package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
- package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
- package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
- package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
- package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
- package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
- package/src/format/image/avif/DECISIONS.md +0 -545
- package/src/format/image/jpeg/NOTES.md +0 -3
- package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
- package/src/generation/COORDINATES.md +0 -54
- package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
- package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
- package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
- package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
- package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
- package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
- package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
- package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
- package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
- package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
- package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
- package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
- package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
- package/src/shade/RENDERER_CONTRACT.md +0 -697
- package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
- package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
- package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
- package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
- package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
- package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
- package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
- package/src/shade/renderer/NOTES.md +0 -78
- package/src/shade/renderer/PLAN.md +0 -8
- package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
- package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
- package/src/shade/renderer/atmosphere/NOTES.md +0 -6
- package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
- package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
- package/src/shade/renderer/camera/orbital/README.md +0 -81
- package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
- package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/index.js +0 -9
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
- package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
- package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
- package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
- package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
- package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -481
- package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
- package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
- package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -529
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +0 -47
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +0 -80
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +0 -16
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +0 -67
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +0 -17
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +0 -145
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +0 -105
- package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4306
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
- package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
- package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
- package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
- package/src/shade/renderer/hiz/NOTES.md +0 -3
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
- package/src/shade/renderer/light/cluster/NOTES.md +0 -11
- package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
- package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
- package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
- package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
- package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
- package/src/shade/renderer/particles/DESIGN.md +0 -1011
- package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -280
- package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
- package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
- package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
- package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
- package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
- package/src/shade/renderer/postprocess/nss/NOTES.md +0 -332
- package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
- package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
- package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
- package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
- package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
- package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
- package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
- package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
- package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
- package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
- package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -391
- package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -153
- package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
- package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
- package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
- package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
- package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
- package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
- package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
- package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
- package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -927
- package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
- package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
- package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
- package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
- package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
- package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
- package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
- package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
- package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
- package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
- package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -3
- package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
- package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
- package/src/shade/wgsl/NOTES.md +0 -4
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GTAO's own spatial filter: one 3x3 edge-stopped pass over visibility and the bend.
|
|
3
|
+
*
|
|
4
|
+
* Its input and output are `rgba16float`: visibility in `x`, and in `yzw` the world-space bend, the bent normal
|
|
5
|
+
* minus the shading normal. The bend is what is filtered, never the bent normal, so an unoccluded texel, whose
|
|
6
|
+
* bend is zero, keeps the normal map's detail exactly however much its neighbours are averaged in.
|
|
7
|
+
*
|
|
8
|
+
* Visibility is filtered as `fragment_shader_denoise_ao` filters it — the A-trous step, its edge-stopping
|
|
9
|
+
* weights and phi values — with the variance taken from visibility alone, since the input carries no second
|
|
10
|
+
* moment. That shader stays as it is: it is shared with denoisers that do keep moments.
|
|
11
|
+
*
|
|
12
|
+
* @type {ImageShader}
|
|
13
|
+
*/
|
|
14
|
+
export const shader_gtao_spatial_denoise: ImageShader;
|
|
15
|
+
import { ImageShader } from "../../shader/ImageShader.js";
|
|
16
|
+
//# sourceMappingURL=shader_gtao_spatial_denoise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_gtao_spatial_denoise.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.js"],"names":[],"mappings":"AA+HA;;;;;;;;;;;;GAYG;AACH,0CAFU,WAAW,CAiBlB;4BAvJyB,6BAA6B"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { DEPTH_STENCIL_FOREGROUND_ONLY } from "../../depth/DEPTH_STENCIL_FOREGROUND_ONLY.js";
|
|
2
|
+
import { chunk_compute_edge_stopping_weight } from "../../shader/chunk/filter/chunk_compute_edge_stopping_weight.js";
|
|
3
|
+
import { chunk_decode_g_buffer_normal } from "../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
|
|
4
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
5
|
+
import { ImageShader } from "../../shader/ImageShader.js";
|
|
6
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
7
|
+
import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
|
|
8
|
+
|
|
9
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
10
|
+
|
|
11
|
+
resources.createGroup()
|
|
12
|
+
.addTexture("tInput")
|
|
13
|
+
.addTexture("tDepth")
|
|
14
|
+
.addTexture("tNormal", "uint");
|
|
15
|
+
|
|
16
|
+
const body = CodeChunk.from(
|
|
17
|
+
//language=WGSL
|
|
18
|
+
`
|
|
19
|
+
const phi_visibility = 4.0;
|
|
20
|
+
const phi_normal = 128.0;
|
|
21
|
+
const sigma_depth = 1.0;
|
|
22
|
+
|
|
23
|
+
const offsets = array< vec2<i32>, 8 >(
|
|
24
|
+
vec2( -1, -1 ),
|
|
25
|
+
vec2( 0, -1 ),
|
|
26
|
+
vec2( 1, -1 ),
|
|
27
|
+
vec2( -1, 0 ),
|
|
28
|
+
vec2( 1, 0 ),
|
|
29
|
+
vec2( -1, 1 ),
|
|
30
|
+
vec2( 0, 1 ),
|
|
31
|
+
vec2( 1, 1 ),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Visibility's spatial variance over a 3x3 Gaussian. The input carries visibility alone, so its second moment
|
|
35
|
+
// is the square of each texel's.
|
|
36
|
+
fn gtao_visibility_variance(ipos: vec2<i32>) -> f32 {
|
|
37
|
+
let kernel = array<f32, 3>(0.25, 0.125, 0.0625);
|
|
38
|
+
|
|
39
|
+
var moments = vec2<f32>(0.0);
|
|
40
|
+
|
|
41
|
+
for (var yy = -1; yy <= 1; yy++) {
|
|
42
|
+
for (var xx = -1; xx <= 1; xx++) {
|
|
43
|
+
let v = textureLoad(tInput, ipos + vec2<i32>(xx, yy), 0).x;
|
|
44
|
+
|
|
45
|
+
moments += vec2(v, v * v) * kernel[ abs(xx) + abs(yy) ];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return max(moments.y - moments.x * moments.x, 0.0);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@fragment
|
|
53
|
+
fn main(
|
|
54
|
+
@builtin(position) coord: vec4<f32>,
|
|
55
|
+
) -> @location(0) vec4<f32> {
|
|
56
|
+
let ipos = vec2<i32>(coord.xy);
|
|
57
|
+
let screen_size = vec2<i32>(textureDimensions(tInput));
|
|
58
|
+
|
|
59
|
+
const eps_variance = 1e-10;
|
|
60
|
+
const kernel_weights = array<f32,3>( 1.0, 2.0 / 3.0, 1.0 / 6.0 );
|
|
61
|
+
|
|
62
|
+
let center = textureLoad(tInput, ipos, 0);
|
|
63
|
+
|
|
64
|
+
let std_dev = sqrt(max(0.0, eps_variance + gtao_visibility_variance(ipos)));
|
|
65
|
+
|
|
66
|
+
let phi_luma = phi_visibility * std_dev;
|
|
67
|
+
|
|
68
|
+
let current_normal = decode_g_buffer_normal(textureLoad(tNormal, ipos, 0).xy);
|
|
69
|
+
let center_depth = textureLoad(tDepth, ipos, 0).r;
|
|
70
|
+
|
|
71
|
+
// the centre at weight 1, so the edge-stopping functions cannot leave nothing
|
|
72
|
+
var sum_w_visibility = 1.0;
|
|
73
|
+
var sum_visibility = center.x;
|
|
74
|
+
|
|
75
|
+
// The bend is averaged weighted by visibility as well. A bent normal stands for the visible directions;
|
|
76
|
+
// the bent normal of several texels together is the sum of each one's scaled by how much it sees,
|
|
77
|
+
// normalized, and with neighbours whose normals agree that is the shading normal plus this average.
|
|
78
|
+
var sum_w_bend = center.x;
|
|
79
|
+
var sum_bend = center.yzw * center.x;
|
|
80
|
+
|
|
81
|
+
for (var i = 0; i < 8; i++) {
|
|
82
|
+
let offset = offsets[i];
|
|
83
|
+
|
|
84
|
+
let p = ipos + offset;
|
|
85
|
+
|
|
86
|
+
if (any(p < vec2(0)) || any(p >= screen_size)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let kernel = kernel_weights[ abs(offset.x) ] * kernel_weights[ abs(offset.y) ];
|
|
91
|
+
|
|
92
|
+
let texel = textureLoad(tInput, p, 0);
|
|
93
|
+
|
|
94
|
+
let sample_normal = decode_g_buffer_normal(textureLoad(tNormal, p, 0).xy);
|
|
95
|
+
let sample_depth = textureLoad(tDepth, p, 0).r;
|
|
96
|
+
|
|
97
|
+
let w = compute_edge_stopping_weight(
|
|
98
|
+
center_depth,
|
|
99
|
+
sample_depth,
|
|
100
|
+
sigma_depth,
|
|
101
|
+
|
|
102
|
+
current_normal,
|
|
103
|
+
sample_normal,
|
|
104
|
+
phi_normal,
|
|
105
|
+
|
|
106
|
+
center.x,
|
|
107
|
+
texel.x,
|
|
108
|
+
phi_luma
|
|
109
|
+
) * kernel;
|
|
110
|
+
|
|
111
|
+
sum_w_visibility += w;
|
|
112
|
+
sum_visibility += w * texel.x;
|
|
113
|
+
|
|
114
|
+
let w_bend = w * texel.x;
|
|
115
|
+
|
|
116
|
+
sum_w_bend += w_bend;
|
|
117
|
+
sum_bend += w_bend * texel.yzw;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return vec4(sum_visibility / sum_w_visibility, sum_bend / sum_w_bend);
|
|
121
|
+
}
|
|
122
|
+
`,
|
|
123
|
+
[
|
|
124
|
+
chunk_decode_g_buffer_normal,
|
|
125
|
+
chunk_compute_edge_stopping_weight,
|
|
126
|
+
]);
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* GTAO's own spatial filter: one 3x3 edge-stopped pass over visibility and the bend.
|
|
130
|
+
*
|
|
131
|
+
* Its input and output are `rgba16float`: visibility in `x`, and in `yzw` the world-space bend, the bent normal
|
|
132
|
+
* minus the shading normal. The bend is what is filtered, never the bent normal, so an unoccluded texel, whose
|
|
133
|
+
* bend is zero, keeps the normal map's detail exactly however much its neighbours are averaged in.
|
|
134
|
+
*
|
|
135
|
+
* Visibility is filtered as `fragment_shader_denoise_ao` filters it — the A-trous step, its edge-stopping
|
|
136
|
+
* weights and phi values — with the variance taken from visibility alone, since the input carries no second
|
|
137
|
+
* moment. That shader stays as it is: it is shared with denoisers that do keep moments.
|
|
138
|
+
*
|
|
139
|
+
* @type {ImageShader}
|
|
140
|
+
*/
|
|
141
|
+
export const shader_gtao_spatial_denoise = ImageShader.from({
|
|
142
|
+
descriptor: ShaderDescriptor.from({
|
|
143
|
+
label: "GTAO Spatial Denoise",
|
|
144
|
+
resources,
|
|
145
|
+
body
|
|
146
|
+
}),
|
|
147
|
+
depthStencil: DEPTH_STENCIL_FOREGROUND_ONLY,
|
|
148
|
+
targets: [
|
|
149
|
+
{
|
|
150
|
+
format: "rgba16float",
|
|
151
|
+
// Background is skipped, so it keeps the clear: not occluded, not bent. Downstream neighbourhoods
|
|
152
|
+
// read across silhouettes and must see background as unoccluded.
|
|
153
|
+
clearValue: [1, 0, 0, 0],
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
});
|
|
@@ -105,8 +105,8 @@ export class GPUSceneContext {
|
|
|
105
105
|
* (REVIEW_LEDGER U1): `register` a container with {@link virtual_geometry_residency}, and every
|
|
106
106
|
* page after the root arrives because a cut asked for it. The renderer opens and closes each
|
|
107
107
|
* frame and schedules each reading, and {@link destroy} releases all of it; a host touches none
|
|
108
|
-
* of it. With them, the source of its geometries' caches ({@link VGeoSDFProxies}): a
|
|
109
|
-
*
|
|
108
|
+
* of it. With them, the source of its geometries' caches and cards ({@link VGeoSDFProxies}): a virtual
|
|
109
|
+
* geometry whose cache is asked for stands in through its proxy.
|
|
110
110
|
*
|
|
111
111
|
* @param {Object} [options] passed to {@link GPUVirtualGeometryPool} and
|
|
112
112
|
* {@link GPUVirtualGeometryRuntime}, except for `residency`
|
|
@@ -399,8 +399,8 @@ export class GPUSceneContext {
|
|
|
399
399
|
* (REVIEW_LEDGER U1): `register` a container with {@link virtual_geometry_residency}, and every
|
|
400
400
|
* page after the root arrives because a cut asked for it. The renderer opens and closes each
|
|
401
401
|
* frame and schedules each reading, and {@link destroy} releases all of it; a host touches none
|
|
402
|
-
* of it. With them, the source of its geometries' caches ({@link VGeoSDFProxies}): a
|
|
403
|
-
*
|
|
402
|
+
* of it. With them, the source of its geometries' caches and cards ({@link VGeoSDFProxies}): a virtual
|
|
403
|
+
* geometry whose cache is asked for stands in through its proxy.
|
|
404
404
|
*
|
|
405
405
|
* @param {Object} [options] passed to {@link GPUVirtualGeometryPool} and
|
|
406
406
|
* {@link GPUVirtualGeometryRuntime}, except for `residency`
|
|
@@ -448,8 +448,8 @@ export class GPUSceneContext {
|
|
|
448
448
|
|
|
449
449
|
feedback = new VGeoFeedbackLoop({ runtime, residency: tiers });
|
|
450
450
|
|
|
451
|
-
// last: it
|
|
452
|
-
proxies = new VGeoSDFProxies({
|
|
451
|
+
// last: it subscribes to the caches as it is made
|
|
452
|
+
proxies = new VGeoSDFProxies({ geometries: this.geometries });
|
|
453
453
|
} catch (error) {
|
|
454
454
|
// the pool is the only one holding anything yet: the fetcher spawns its workers on its
|
|
455
455
|
// first fetch, and the runtime makes its buffer on its first frame
|
|
@@ -874,7 +874,7 @@ export class GPUSceneContext {
|
|
|
874
874
|
return;
|
|
875
875
|
}
|
|
876
876
|
|
|
877
|
-
//
|
|
877
|
+
// it hears no more of the caches; its proxies stay with the geometry manager, destroyed with it
|
|
878
878
|
this.#virtual_geometry_proxies.destroy();
|
|
879
879
|
|
|
880
880
|
this.#virtual_geometry_feedback.destroy();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUSceneShadowmapContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUSceneShadowmapContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js"],"names":[],"mappings":"AA+JA;;GAEG;AACH;IA8aI;;;;;;;;OAQG;IACH,sBAPW,eAAe,aACf,eAAe,SAGf,kBAAkB,EAiE5B;IApfD,2BAAwG;IAExG;;;OAGG;IACH,SAFU,iBAAiB,CAEnB;IAQR;;;;;;;;OAQG;IACH,qBAFU,WAAW,CAED;IAsCpB;;;;;;;;OAQG;IACH,SAFU,OAAO,CAEF;IAEf;;;;;;;;;;OAUG;IACH,+BAFU,OAAO,CAEqB;IAEtC;;;;;;OAMG;IACH,yBAFU,OAAO,CAEe;IAehC;;;;;OAKG;IACH,mCAIC;IAjBD;;OAEG;IACH,kCAEC;IAcD;;;;;OAKG;IACH,kBAFU,MAAM,CAEK;IAiBrB;;;;OAIG;IACH,uCAMC;IAlBD;;OAEG;IACH,sCAEC;IA6BD;;;;OAIG;IACH,uCAMC;IAlBD;;OAEG;IACH,sCAEC;IA6BD;;;;OAIG;IACH,4CAKC;IAjBD;;OAEG;IACH,2CAEC;IA2BD;;;;;OAKG;IACH,wCAKC;IAlBD;;OAEG;IACH,uCAEC;IA4BD;;;;;;;;OAQG;IACH,6BAIC;IApBD;;OAEG;IACH,4BAEC;IA0CD;;;;OAIG;IACH,6BAIC;IAhBD;;OAEG;IACH,4BAEC;IA2FD;;OAEG;IACH,iCAEC;IAED;;;;;;OAMG;IACH,oCAEC;IAED;;;;;OAKG;IACH,oCAEC;IAoGD;;;;;OAKG;IACH,4BAMC;IA2MD;;;;;;;;;;;;OAYG;IACH;QAN+B,KAAK,EAAzB,UAAU;QACqD,IAAI,EAAnE,OAAO,8BAA8B,EAAE,cAAc;QACrC,KAAK,EAArB,MAAM;QACU,MAAM,EAAtB,MAAM;aA+BhB;IA0LD;;;;OAIG;IACH,eAHW,KAAK,GACH,SAAS,GAAC,SAAS,CAI/B;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IACH,6BAPW,MAAM,SAEN,eAAe,eACf,MAAM,mBACN,UAAU,MAAM,CAAC,QA0G3B;IA2GD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,kBAFW,sBAAsB,QA0FhC;IAwbD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,kBALa,OAAO,CAsTnB;IAED;;;;;;;;;;OAUG;IACH,iBALW,MAAM,SACN,MAAM,GACJ,KAAK,CAejB;IA2DD,gBAiBC;;CACJ;qCA1uEY,OAAO,2CAA2C,EAAE,sBAAsB;8BAC1E,OAAO,0BAA0B,EAAE,eAAe;qBAClD,OAAO,wBAAwB,EAAE,MAAM;iCACvC,OAAO,mCAAmC,EAAE,kBAAkB;oBAC9D,OAAO,4BAA4B,EAAE,KAAK;8BAC1C,OAAO,gCAAgC,EAAE,eAAe;wBACxD,OAAO,gBAAgB,EAAE,SAAS;8BAClC,OAAO,oDAAoD,EAAE,eAAe;oCAhFrD,+DAA+D;kCAkBjE,oCAAoC;4BAG1C,2BAA2B;2BApB5B,8DAA8D;kBAFvE,wCAAwC"}
|
|
@@ -95,11 +95,16 @@ const DEFAULT_SHADOWMAP_ATLAS_RESOLUTION = 4096;
|
|
|
95
95
|
/**
|
|
96
96
|
* Resolution by cascade.
|
|
97
97
|
* If the number of cascades is greater than the array length, the last resolution is used.
|
|
98
|
+
*
|
|
99
|
+
* 1536 is chosen for the cascade's HZB: half of it, 768 = 3·2⁸, is a mip 0 the HZB takes as it is, with
|
|
100
|
+
* no padding, so mip 0 halves the cascade exactly (a 2x2 footprint) and the rest of the pyramid is two
|
|
101
|
+
* 4-mip SPD passes and one single-mip pass. 1740 and 1440 padded mip 0 to 880 and 736, a 3x3 footprint
|
|
102
|
+
* and five single-mip passes each. Three cascades at 1536² hold about the texels 1740² + 2·1440² did.
|
|
103
|
+
*
|
|
98
104
|
* @type {number[]}
|
|
99
105
|
*/
|
|
100
106
|
const DEFAULT_SHADOWMAP_DIRECTIONAL_RESOLUTION = [
|
|
101
|
-
|
|
102
|
-
1440,
|
|
107
|
+
1536,
|
|
103
108
|
];
|
|
104
109
|
|
|
105
110
|
/**
|
|
@@ -17,12 +17,6 @@ export class GPUWaterRenderer {
|
|
|
17
17
|
inscatter_segments: number;
|
|
18
18
|
tessellation_pixels: number;
|
|
19
19
|
};
|
|
20
|
-
/**
|
|
21
|
-
* The frame's water bodies table, recorded by whoever owns the surfaces at the head of the frame;
|
|
22
|
-
* each drawable surface carries its row as `body_index`.
|
|
23
|
-
* @type {import("./medium/GPUWaterBodies.js").GPUWaterBodies|null}
|
|
24
|
-
*/
|
|
25
|
-
bodies: import("./medium/GPUWaterBodies.js").GPUWaterBodies | null;
|
|
26
20
|
/**
|
|
27
21
|
* What the lattice's per-frame lists may hold (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.3). Grown from
|
|
28
22
|
* each view's totals, read back a frame or two later; a frame over a budget drops its tail until then.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUWaterRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/GPUWaterRenderer.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUWaterRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/GPUWaterRenderer.js"],"names":[],"mappings":"AAqBA,sFAAsF;AACtF;IACI,WAAa;IACb,mBAAe;IACf,yBAAqB;IACrB,aAAS;IACT,WAAa;IACb;;;;;;;;;;;MAE6B;IAmB7B;;;OAGG;IACH;;;;;MAA8F;IAC9F;;;OAGG;IACH,wBAAyD;IAMzD,oCAIC;IAED,8FAA8F;IAC9F,qCAgBC;IAED,gBASC;IAuDD;;;;;;;;;;;;;;;;;MAyIC;IAQD;;;;;YAMC;IAED;;;;;;;;;;MAOC;IAED;;;;;;;;;;;;;;MAwBC;IAED,gGAAgG;IAChG,mEAYC;;CAyBJ;gCAtX+B,uCAAuC"}
|
|
@@ -4,6 +4,7 @@ import { DEFAULT_DEPTH_TEXTURE_VIEW } from "../depth/DEFAULT_DEPTH_TEXTURE_VIEW.
|
|
|
4
4
|
import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
|
|
5
5
|
import { graph_image_pass } from "../shader/graph/graph_image_pass.js";
|
|
6
6
|
import { ShaderSwitchSet } from "../shader/compiler/ShaderSwitchSet.js";
|
|
7
|
+
import { graph_water_meshlets } from "./medium/graph_water_meshlets.js";
|
|
7
8
|
import { graph_water_tessellation } from "./surface/graph_water_tessellation.js";
|
|
8
9
|
import { water_lod_view, WATER_LOD_VIEW_STRUCT } from "./surface/lod/WATER_LOD.js";
|
|
9
10
|
import { WATER_LOD_LIMITS_STRUCT, WATER_LOD_PATCH_INDICES, WATER_LOD_STATISTICS_WORDS,
|
|
@@ -28,12 +29,6 @@ export class GPUWaterRenderer {
|
|
|
28
29
|
settings = { enabled: true, max_distance: 300, distance_tolerance: 0.15,
|
|
29
30
|
max_updates: 4, fallback_steps: 48, mode: 0, reflections: 1, debug_view: 0, inscatter_segments: 4,
|
|
30
31
|
tessellation_pixels: 4 };
|
|
31
|
-
/**
|
|
32
|
-
* The frame's water bodies table, recorded by whoever owns the surfaces at the head of the frame;
|
|
33
|
-
* each drawable surface carries its row as `body_index`.
|
|
34
|
-
* @type {import("./medium/GPUWaterBodies.js").GPUWaterBodies|null}
|
|
35
|
-
*/
|
|
36
|
-
bodies = null;
|
|
37
32
|
#pipeline = create_water_pipeline();
|
|
38
33
|
/** The optics pipelines, each by the shader switch set it was built for. */
|
|
39
34
|
#finalize_pipelines = new Map();
|
|
@@ -169,7 +164,7 @@ export class GPUWaterRenderer {
|
|
|
169
164
|
// the lattice is chosen from the camera's position and its pixel angle, not its jittered projection's offset:
|
|
170
165
|
// raster jitter moves samples, not the mesh
|
|
171
166
|
const lod = water_lod_view(view_ctx.camera.camera.projection_matrix, resolution[1], Math.max(0.5, settings.tessellation_pixels));
|
|
172
|
-
const { meshlets, lod_bodies } =
|
|
167
|
+
const { meshlets, lod_bodies } = graph_water_meshlets({ graph, scene, camera, meshlet_capacity: this.meshlet_capacity,
|
|
173
168
|
visible_rows: surface.visible_rows, lod, steep: surface.steep });
|
|
174
169
|
const limits = { ...this.lod_budgets, triangles: Math.max(this.meshlet_capacity, 1) * GEOMETRY_MESHLET_TRIANGLE_LIMIT };
|
|
175
170
|
const patches = graph_water_tessellation({ graph, scene, camera, meshlets, lod_bodies, meshlet_capacity: this.meshlet_capacity,
|
|
@@ -225,7 +220,8 @@ export class GPUWaterRenderer {
|
|
|
225
220
|
data.commands = pass.read(patches.commands);
|
|
226
221
|
// Keep the accepted UV and both paths at f32 precision through final shading.
|
|
227
222
|
data.receiver = target("receiver", "rgba32float");
|
|
228
|
-
|
|
223
|
+
// the fragment's control path, shaded surface, coverage and body, bit-packed (shader_water.js WaterReceiver)
|
|
224
|
+
data.trace_metadata = target("trace metadata", "rgba32uint");
|
|
229
225
|
data.interface_depth = target("interface depth", "depth32float");
|
|
230
226
|
let states = this.#prepared.get(graph);
|
|
231
227
|
if (states === undefined) { states = new Map(); this.#prepared.set(graph, states); }
|
|
@@ -264,9 +260,10 @@ export class GPUWaterRenderer {
|
|
|
264
260
|
const bindings = WATER_FINALIZE_RESOURCES.generateBindings(shared, encoder);
|
|
265
261
|
const copy_pipeline = shader_water_background_copy.pipeline;
|
|
266
262
|
const copy_bindings = shader_water_background_copy.descriptor.resources.generateBindings({tScene: shared.tScene}, encoder);
|
|
263
|
+
// away from water nothing is transmitted through and nothing is added: the background copy leaves both
|
|
267
264
|
const render = encoder.constructRenderPass({label: 'Water / coherent optics', pipeline: finalize_pipeline, bindings: [],
|
|
268
|
-
colorAttachments: [d.transmission,d.radiance,d.background].map(handle => ({
|
|
269
|
-
view: resources.get(handle).obtainView(), loadOp: 'clear', storeOp: 'store', clearValue
|
|
265
|
+
colorAttachments: [[d.transmission, [1,1,1,0]], [d.radiance, [0,0,0,0]], [d.background, [0,0,0,0]]].map(([handle, clearValue]) => ({
|
|
266
|
+
view: resources.get(handle).obtainView(), loadOp: 'clear', storeOp: 'store', clearValue,
|
|
270
267
|
})), depthStencilAttachment: {view: resources.get(d.interface_depth).obtainView(DEFAULT_DEPTH_TEXTURE_VIEW), depthReadOnly: true},
|
|
271
268
|
});
|
|
272
269
|
render.setPipeline(graphics.render_pipelines.obtain(copy_pipeline)); render.record_pipeline(copy_pipeline);
|
|
@@ -353,7 +350,7 @@ export class GPUWaterRenderer {
|
|
|
353
350
|
const [color] = graph_image_pass({ graph, shader: shader_water_debug, output_resolution: resolution,
|
|
354
351
|
inputs: { inspection: { mode, resolution }, camera: data.camera, warp: data.warp, tIntegral: data.integral,
|
|
355
352
|
transmission: data.transmission, radiance: data.radiance,
|
|
356
|
-
receiver: data.receiver, interface_depth: data.interface_depth
|
|
353
|
+
receiver: data.receiver, interface_depth: data.interface_depth } });
|
|
357
354
|
return color;
|
|
358
355
|
}
|
|
359
356
|
|
|
@@ -362,7 +359,7 @@ export class GPUWaterRenderer {
|
|
|
362
359
|
const pass = graph.add("Water / pixel probe", data, (data, resources, { encoder, graphics }) => {
|
|
363
360
|
const buffer = graphics.device.createBuffer({ size: 1024, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST });
|
|
364
361
|
const pixel = probe.uv.map((v, i) => Math.min(resolution[i]-1, Math.max(0, Math.floor(v*resolution[i]))));
|
|
365
|
-
[data.receiver, data.transmission, data.radiance
|
|
362
|
+
[data.receiver, data.transmission, data.radiance].forEach((handle, i) => {
|
|
366
363
|
encoder.copyTextureToBuffer({ texture: resources.get(handle).gpu_texture, origin: [...pixel, 0] },
|
|
367
364
|
{ buffer, offset: i*256, bytesPerRow: 256 }, [1,1,1]);
|
|
368
365
|
});
|
|
@@ -370,16 +367,14 @@ export class GPUWaterRenderer {
|
|
|
370
367
|
try {
|
|
371
368
|
await buffer.mapAsync(GPUMapMode.READ);
|
|
372
369
|
const mapped = buffer.getMappedRange();
|
|
373
|
-
const half = offset => Array.from(new Float16Array(mapped, offset, 4));
|
|
374
|
-
const radiance = half(512);
|
|
375
|
-
radiance[3] = new Float32Array(mapped, 768, 4)[1];
|
|
376
370
|
probe.resolve({ pixel, resolution, frame_time: optical.frame_time, receiver: Array.from(new Float32Array(mapped, 0, 4)),
|
|
377
|
-
transmission: Array.from(new Float32Array(mapped, 256, 4)), radiance,
|
|
371
|
+
transmission: Array.from(new Float32Array(mapped, 256, 4)), radiance: Array.from(new Float16Array(mapped, 512, 4)),
|
|
372
|
+
stale: false });
|
|
378
373
|
} catch (error) { probe.reject(error); }
|
|
379
374
|
finally { buffer.destroy(); }
|
|
380
375
|
});
|
|
381
376
|
});
|
|
382
|
-
for (const key of ["receiver", "transmission", "radiance"
|
|
377
|
+
for (const key of ["receiver", "transmission", "radiance"]) { data[key] = pass.read(optical[key]); }
|
|
383
378
|
pass.make_side_effect();
|
|
384
379
|
}
|
|
385
380
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A view's water bodies: which the view draws and how, and their meshlets in row order.
|
|
3
|
+
*
|
|
4
|
+
* Draw culling over the frame's visible list (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.3), each drawn
|
|
5
|
+
* body's lattice frame at its row, and the drawn bodies' meshlets. The expansion is an ordered prefix scan over the
|
|
6
|
+
* rows, which preserves equal-depth ownership, including after holes and reuse.
|
|
7
|
+
*
|
|
8
|
+
* @param {object} options
|
|
9
|
+
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
|
|
10
|
+
* @param {object} options.scene GPU scene context
|
|
11
|
+
* @param {number} options.camera the view's camera uniform resource
|
|
12
|
+
* @param {number} options.meshlet_capacity every water meshlet the scene holds
|
|
13
|
+
* @param {GPUBuffer} options.visible_rows the frame's visible water rows
|
|
14
|
+
* @param {{ranges: number, orthographic: number, level: number, distance: number}} options.lod the view's lattice choice
|
|
15
|
+
* @param {GPUBuffer} options.steep per wave row: set for a body with a triangle too steep for the lattice
|
|
16
|
+
* @returns {{meshlets: number, lod_bodies: number}} resources
|
|
17
|
+
*/
|
|
18
|
+
export function graph_water_meshlets({ graph, scene, camera, meshlet_capacity, visible_rows, lod, steep }: {
|
|
19
|
+
graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
20
|
+
scene: object;
|
|
21
|
+
camera: number;
|
|
22
|
+
meshlet_capacity: number;
|
|
23
|
+
visible_rows: GPUBuffer;
|
|
24
|
+
lod: {
|
|
25
|
+
ranges: number;
|
|
26
|
+
orthographic: number;
|
|
27
|
+
level: number;
|
|
28
|
+
distance: number;
|
|
29
|
+
};
|
|
30
|
+
steep: GPUBuffer;
|
|
31
|
+
}): {
|
|
32
|
+
meshlets: number;
|
|
33
|
+
lod_bodies: number;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=graph_water_meshlets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph_water_meshlets.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/medium/graph_water_meshlets.js"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;;;;;GAgBG;AACH;IATsG,KAAK,EAAhG,OAAO,8DAA8D,EAAE,UAAU;IACjE,KAAK,EAArB,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,gBAAgB,EAAhC,MAAM;IACa,YAAY;IACkD,GAAG,EAApF;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;IACpD,KAAK;IACtB;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAmDlD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
|
|
2
|
+
import { round_up } from "../../../../core/math/round_up.js";
|
|
3
|
+
import {
|
|
4
|
+
graph_prefix_scan_csdldf,
|
|
5
|
+
prefix_scan_csdldf_output_descriptor
|
|
6
|
+
} from "../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
|
|
7
|
+
import { graph_create_buffer } from "../../shader/graph/graph_create_buffer.js";
|
|
8
|
+
import {
|
|
9
|
+
build_indirect_compute_dispatch_command,
|
|
10
|
+
INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
|
|
11
|
+
} from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
|
|
12
|
+
import { shader_prefix_sum_to_command } from "../../rasterize/expand/mesh/shader_prefix_sum_to_command.js";
|
|
13
|
+
import { shader_increment_count_by_prefix_sum } from "../../rasterize/expand/mesh/shader_increment_count_by_prefix_sum.js";
|
|
14
|
+
import { graph_compute_pass } from "../../shader/graph/compute/graph_compute_pass.js";
|
|
15
|
+
import { shader_water_meshlets_expand } from "./shader_water_meshlets.js";
|
|
16
|
+
import { shader_water_lod_bodies } from "../surface/lod/shader_water_lod.js";
|
|
17
|
+
import { WATER_LOD_BODY_STRUCT, WATER_LOD_VIEW_STRUCT } from "../surface/lod/WATER_LOD.js";
|
|
18
|
+
import { MESHLET_COLLECTION_STRUCT } from "../../rasterize/MESHLET_COLLECTION_STRUCT.js";
|
|
19
|
+
import { MESHLET_DEFINITION_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_DEFINITION_STRUCT.js";
|
|
20
|
+
|
|
21
|
+
const MESHLETS_OFFSET = MESHLET_COLLECTION_STRUCT.get('elements').offset;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A view's water bodies: which the view draws and how, and their meshlets in row order.
|
|
25
|
+
*
|
|
26
|
+
* Draw culling over the frame's visible list (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.3), each drawn
|
|
27
|
+
* body's lattice frame at its row, and the drawn bodies' meshlets. The expansion is an ordered prefix scan over the
|
|
28
|
+
* rows, which preserves equal-depth ownership, including after holes and reuse.
|
|
29
|
+
*
|
|
30
|
+
* @param {object} options
|
|
31
|
+
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
|
|
32
|
+
* @param {object} options.scene GPU scene context
|
|
33
|
+
* @param {number} options.camera the view's camera uniform resource
|
|
34
|
+
* @param {number} options.meshlet_capacity every water meshlet the scene holds
|
|
35
|
+
* @param {GPUBuffer} options.visible_rows the frame's visible water rows
|
|
36
|
+
* @param {{ranges: number, orthographic: number, level: number, distance: number}} options.lod the view's lattice choice
|
|
37
|
+
* @param {GPUBuffer} options.steep per wave row: set for a body with a triangle too steep for the lattice
|
|
38
|
+
* @returns {{meshlets: number, lod_bodies: number}} resources
|
|
39
|
+
*/
|
|
40
|
+
export function graph_water_meshlets({ graph, scene, camera, meshlet_capacity, visible_rows, lod, steep }) {
|
|
41
|
+
const table = scene.scene_database.get('water_bodies');
|
|
42
|
+
const capacity = Math.max(table.element_capacity, 1);
|
|
43
|
+
const data = {};
|
|
44
|
+
const pass = graph.add('Water / lod bodies', data, (d, resources, { encoder }) => {
|
|
45
|
+
const command = resources.get(d.command);
|
|
46
|
+
build_indirect_compute_dispatch_command(64, encoder, visible_rows, 0, command, 0, true);
|
|
47
|
+
shader_water_lod_bodies.dispatchIndirect({ encoder, command, bindings: {
|
|
48
|
+
capacity: round_up(capacity, 4), lod: encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod),
|
|
49
|
+
camera: resources.get(d.camera), scene_database: scene.scene_database_buffer,
|
|
50
|
+
geometries: scene.geometries.buffer_metadata, visible_rows, steep,
|
|
51
|
+
lod_bodies: resources.get(d.lod_bodies), counts: resources.get(d.counts),
|
|
52
|
+
} });
|
|
53
|
+
});
|
|
54
|
+
data.camera = pass.read(camera);
|
|
55
|
+
// The shared scan reads vec4u blocks, including the padded final block.
|
|
56
|
+
const bytes = 16 + round_up(capacity, 4) * 4;
|
|
57
|
+
data.counts = pass.create('counts', BufferResourceDescriptor.from(bytes, GPUBufferUsage.STORAGE, 0, bytes));
|
|
58
|
+
data.command = pass.create('Water lod bodies command', INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
|
|
59
|
+
data.lod_bodies = pass.create('Water lod bodies', BufferResourceDescriptor.from(capacity * WATER_LOD_BODY_STRUCT.size,
|
|
60
|
+
GPUBufferUsage.STORAGE));
|
|
61
|
+
const sums = graph_prefix_scan_csdldf({ graph, input: data.counts,
|
|
62
|
+
output: graph_create_buffer(graph, 'Water lod body meshlet sums', prefix_scan_csdldf_output_descriptor(capacity)),
|
|
63
|
+
element_max_count: capacity });
|
|
64
|
+
const command_data = {};
|
|
65
|
+
const command_pass = graph.add('Water / expand command', command_data, (d, resources, { encoder }) => {
|
|
66
|
+
shader_prefix_sum_to_command.dispatch({ encoder, bindings: {
|
|
67
|
+
prefix_sums: resources.get(d.sums), command: resources.get(d.command),
|
|
68
|
+
} });
|
|
69
|
+
});
|
|
70
|
+
command_data.sums = command_pass.read(sums);
|
|
71
|
+
const command = command_data.command = command_pass.create('command', INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
|
|
72
|
+
const expand_data = {};
|
|
73
|
+
const expand = graph.add('Water / expand meshlets', expand_data, (d, resources, { encoder }) => {
|
|
74
|
+
shader_water_meshlets_expand.dispatchIndirect({ encoder, command: resources.get(d.command), bindings: {
|
|
75
|
+
prefix_sums: resources.get(d.sums), output: resources.get(d.output),
|
|
76
|
+
scene_database: scene.scene_database_buffer, geometries: scene.geometries.buffer_metadata,
|
|
77
|
+
} });
|
|
78
|
+
});
|
|
79
|
+
expand_data.command = expand.read(command);
|
|
80
|
+
expand_data.sums = expand.read(sums);
|
|
81
|
+
// The collection struct holding this many meshlets, padded to its alignment: one meshlet is the binding's minimum.
|
|
82
|
+
const meshlets_bytes = round_up(MESHLETS_OFFSET + Math.max(meshlet_capacity, 1) * MESHLET_DEFINITION_STRUCT.aligned_size,
|
|
83
|
+
MESHLET_COLLECTION_STRUCT.align);
|
|
84
|
+
expand_data.output = expand.create('meshlets', BufferResourceDescriptor.from(meshlets_bytes,
|
|
85
|
+
GPUBufferUsage.STORAGE, 0, MESHLETS_OFFSET));
|
|
86
|
+
const { output } = graph_compute_pass({ graph, shader: shader_increment_count_by_prefix_sum,
|
|
87
|
+
bindings: { prefix_sums: sums, output: expand_data.output } });
|
|
88
|
+
return { meshlets: output, lod_bodies: data.lod_bodies };
|
|
89
|
+
}
|
|
@@ -24,7 +24,7 @@ export class GPUWaterQueries {
|
|
|
24
24
|
* @param {PipelineEnquiry} enquiry
|
|
25
25
|
*/
|
|
26
26
|
static enquirePipelines(enquiry: PipelineEnquiry): void;
|
|
27
|
-
static "__#
|
|
27
|
+
static "__#275@#execute"(pass: any, resources: any, context: any): void;
|
|
28
28
|
/**
|
|
29
29
|
* @param {object} options
|
|
30
30
|
* @param {GPUDevice} options.device
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_water.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_water.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water.js"],"names":[],"mappings":"AAwpBA,kEAAsH;AACtH,gFAAgF;AAChF,wFAEC;AArmBD,8CAKwB;AAwCxB;;;;GAIG;AACH,mEAA8D;AAgP9D,+CAsFmB;AA2MnB,4CAAmG;AACnG,uGAAuG;AACvG,qDACgE;AAChE,0DAAyC;yCA5nBA,8DAA8D;6BA2B1E,gCAAgC;4CAJjB,mDAAmD;0BAPrE,iCAAiC;iCAQ1B,+BAA+B"}
|
|
@@ -7,6 +7,8 @@ import { BRICK4_DATA_STRUCT } from "../global_illumination/brick4/gpu/BRICK4_DAT
|
|
|
7
7
|
import { PROBE_CLIPMAP_SAMPLING_GROUP } from "../global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js";
|
|
8
8
|
import { chunk_F_dielectric } from "../shader/chunk/brdf/fresnel/chunk_F_dielectric.js";
|
|
9
9
|
import { chunk_direction_view_to_world } from "../shader/chunk/camera/chunk_direction_view_to_world.js";
|
|
10
|
+
import { chunk_uv_octahedral_unit_decode } from "../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
|
|
11
|
+
import { chunk_uv_octahedral_unit_encode } from "../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
|
|
10
12
|
import { chunk_direction_world_to_view } from "../shader/chunk/camera/chunk_direction_world_to_view.js";
|
|
11
13
|
import { chunk_ray_at } from "../shader/chunk/geometry/ray/chunk_ray_at.js";
|
|
12
14
|
import { chunk_ffx_sssr_advance_ray } from "../shader/chunk/screen_space/chunk_ffx_sssr_advance_ray.js";
|
|
@@ -90,7 +92,7 @@ function water_resources(finalize = false) {
|
|
|
90
92
|
.add(WATER_PARTICLE_OFFSETS_RESOURCE)
|
|
91
93
|
.add(WATER_PARTICLE_ENTRIES_RESOURCE);
|
|
92
94
|
if (finalize) {
|
|
93
|
-
group.addTexture('receiver').addTexture('trace_metadata');
|
|
95
|
+
group.addTexture('receiver').addTexture('trace_metadata', 'uint');
|
|
94
96
|
}
|
|
95
97
|
return resources;
|
|
96
98
|
}
|
|
@@ -435,9 +437,12 @@ for (const resource of [CAMERA_RESOURCE, TRACE_RESOURCE, SCREEN_DEPTH_RESOURCE,
|
|
|
435
437
|
|
|
436
438
|
const body = CodeChunk.from(/* language=WGSL */ `
|
|
437
439
|
struct WaterReceiver {
|
|
438
|
-
@location(0) receiver: vec4<f32>,
|
|
439
|
-
@location(1) metadata: vec4<f32>,
|
|
440
440
|
// Receiver UV, bounded path, classified status + Newton updates / 32. Readback is opt-in.
|
|
441
|
+
@location(0) receiver: vec4<f32>,
|
|
442
|
+
// The fragment's control path (f32 bits); the surface it was shaded with, its normal octahedral in two unorm16
|
|
443
|
+
// and its slope variance beside its shore coverage in two f16; its body + 1. The optics take that surface from
|
|
444
|
+
// here rather than evaluate it again.
|
|
445
|
+
@location(1) metadata: vec4<u32>,
|
|
441
446
|
}
|
|
442
447
|
|
|
443
448
|
// A screen-space receiver must lie below the surface point the ray entered at: the refracted ray runs
|
|
@@ -515,10 +520,11 @@ fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterRecei
|
|
|
515
520
|
else if (status == 8u) { status = 24u + newton_failure; }
|
|
516
521
|
else if (status == 9u) { status = 31u; }
|
|
517
522
|
return WaterReceiver(vec4f(hit.uv, hit.distance, f32(status) + f32(newton_updates)/32.0),
|
|
518
|
-
|
|
523
|
+
vec4<u32>(bitcast<u32>(control_path), pack2x16unorm(uv_octahedral_unit_encode(pixel.normal)),
|
|
524
|
+
pack2x16float(vec2f(pixel.variance, coverage)), in.body_index + 1u));
|
|
519
525
|
}
|
|
520
526
|
`, [surface_body, chunk_water_screen_ray, chunk_direction_view_to_world,
|
|
521
|
-
chunk_water_receiver_texel, WATER_LEVEL_TOLERANCE_DECLARATION]);
|
|
527
|
+
chunk_water_receiver_texel, WATER_LEVEL_TOLERANCE_DECLARATION, chunk_uv_octahedral_unit_encode]);
|
|
522
528
|
|
|
523
529
|
const finalize_body = CodeChunk.from(/* language=WGSL */ `
|
|
524
530
|
struct WaterOptics {
|
|
@@ -528,12 +534,15 @@ struct WaterOptics {
|
|
|
528
534
|
}
|
|
529
535
|
@fragment
|
|
530
536
|
fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterOptics {
|
|
531
|
-
let pixel = water_pixel_surface(in, in.pixel_footprint);
|
|
532
|
-
let water = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, in.body_index);
|
|
533
537
|
let coord = vec2i(in.clip.xy);
|
|
534
538
|
let metadata = textureLoad(trace_metadata, coord, 0);
|
|
535
539
|
// Equal-depth surfaces must retain the same deterministic owner as receiver selection.
|
|
536
|
-
if (metadata.w !=
|
|
540
|
+
if (metadata.w != in.body_index + 1u) { discard; }
|
|
541
|
+
// the surface the receivers shaded this fragment with
|
|
542
|
+
let shading = unpack2x16float(metadata.z);
|
|
543
|
+
let pixel = WaterPixelSurface(uv_octahedral_unit_decode(unpack2x16unorm(metadata.y)), shading.x);
|
|
544
|
+
let coverage = shading.y;
|
|
545
|
+
let water = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, in.body_index);
|
|
537
546
|
let dimensions = vec2f(textureDimensions(tDepth, 0));
|
|
538
547
|
let uv = in.clip.xy / dimensions;
|
|
539
548
|
let receiver_data = textureLoad(receiver, coord, 0);
|
|
@@ -577,7 +586,7 @@ fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterOptic
|
|
|
577
586
|
// wave height across a few metres, against a tolerance the gather already allows.
|
|
578
587
|
let gathered = water_receiver_radiance(tScene, tDepth, tNormal, lookup,
|
|
579
588
|
camera.projection_matrix_inverse, camera.view_matrix_inverse, in.world, interface_normal, above);
|
|
580
|
-
var path = metadata.x;
|
|
589
|
+
var path = bitcast<f32>(metadata.x);
|
|
581
590
|
var color = original.rgb;
|
|
582
591
|
// the receiver seen through the surface: refracted, or the pixel's own when there is none
|
|
583
592
|
var receiver_coord = coord;
|
|
@@ -612,8 +621,8 @@ fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterOptic
|
|
|
612
621
|
scattered = exit * water_inscatter(body, in.world, direction, normalize(in.rest_normal), max(path, 0.0), trace.inscatter_segments);
|
|
613
622
|
}
|
|
614
623
|
let event = water_event(transmitted, fresnel * reflection + scattered);
|
|
615
|
-
let optical = water_transport(event, original.rgb, color,
|
|
616
|
-
return WaterOptics(vec4f(optical.transmission,
|
|
624
|
+
let optical = water_transport(event, original.rgb, color, coverage);
|
|
625
|
+
return WaterOptics(vec4f(optical.transmission, coverage), vec4f(optical.radiance, 0.0),
|
|
617
626
|
vec4f(optical.background, original.a));
|
|
618
627
|
}
|
|
619
628
|
`, [surface_body, chunk_water_screen_ray, chunk_F_dielectric, chunk_ffx_sssr_validate_hit,
|
|
@@ -621,7 +630,7 @@ fn fs_main(in: WaterVertexOut, @builtin(front_facing) above: bool) -> WaterOptic
|
|
|
621
630
|
chunk_water_receiver_downwelling, chunk_water_receiver_texel,
|
|
622
631
|
chunk_water_transport, chunk_water_receiver_radiance,
|
|
623
632
|
// water_gi_specular here, and water_gi_irradiance for the in-scatter and the downwelling light
|
|
624
|
-
chunk_water_gi]);
|
|
633
|
+
chunk_water_gi, chunk_uv_octahedral_unit_decode]);
|
|
625
634
|
|
|
626
635
|
export const water_shader = ShaderDescriptor.from({ label: "Water / receivers", resources, body });
|
|
627
636
|
/** The optics pass; its variants differ in the indirect lighting they fall back to, and bind alike. */
|
|
@@ -653,7 +662,7 @@ function water_pipeline(shader, targets, finalize) {
|
|
|
653
662
|
primitive: { topology: "triangle-list", cullMode: "none" },
|
|
654
663
|
});
|
|
655
664
|
}
|
|
656
|
-
export function create_water_pipeline() { return water_pipeline(water_shader, ['rgba32float', '
|
|
665
|
+
export function create_water_pipeline() { return water_pipeline(water_shader, ['rgba32float', 'rgba32uint'], false); }
|
|
657
666
|
/** The optics pipeline, its shader built for `switches` (a ShaderSwitchSet). */
|
|
658
667
|
export function create_water_finalize_pipeline(switches) {
|
|
659
668
|
return water_pipeline(water_finalize_shader.variant(switches), ['rgba32float', 'rgba16float', 'rgba16float'], true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_water_avboit.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water_avboit.js"],"names":[],"mappings":"AAkCA,mDAwBG;AAQH,+CAqCG;AAUH,4CA4BG;
|
|
1
|
+
{"version":3,"file":"shader_water_avboit.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water_avboit.js"],"names":[],"mappings":"AAkCA,mDAwBG;AAQH,+CAqCG;AAUH,4CA4BG;AAOH,uDAYG;AAOH,6CAqCG;8BA3L2B,4BAA4B;4BAC9B,0BAA0B"}
|