@woosh/meep-engine 3.60.4 → 3.60.5
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 +2602 -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.map +1 -1
- package/src/shade/renderer/Renderer.js +7 -5
- 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 +2 -2
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +2 -2
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +2 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +18 -1
- 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/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/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 +5 -5
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +10 -10
- 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 +7 -0
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +11 -0
- 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/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/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
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { assert } from "../../../../core/assert.js";
|
|
2
2
|
import { HashMap } from "../../../../core/collection/map/HashMap.js";
|
|
3
|
-
import Signal from "../../../../core/events/signal/Signal.js";
|
|
4
3
|
import IdPool from "../../../../core/IdPool.js";
|
|
5
4
|
import { isPowerOfTwo } from "../../../../core/math/isPowerOfTwo.js";
|
|
6
5
|
import { round_up } from "../../../../core/math/round_up.js";
|
|
7
6
|
import { TextureViewDescriptor } from "../../../descriptor/texture/TextureViewDescriptor.js";
|
|
8
7
|
import { ShadeGPUCommandContext } from "../../../device/ShadeGPUCommandContext.js";
|
|
9
8
|
import { GPU_DATABASE_NULL } from "../../buffer/table/GPU_DATABASE_NULL.js";
|
|
10
|
-
import { WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION } from "../../gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js";
|
|
11
9
|
import { MEDIA_TABLE_CAPACITY, MEDIA_TABLE_STRUCT } from "../../medium/MEDIA_TABLE_STRUCT.js";
|
|
12
10
|
import { MEDIUM_STRUCT } from "../../medium/MEDIUM_STRUCT.js";
|
|
13
11
|
import { write_gpu_typed_buffer } from "../../shader/type/serde/write_gpu_typed_buffer.js";
|
|
@@ -25,7 +23,6 @@ import {
|
|
|
25
23
|
RESIDENT_MATERIAL_TEXTURE_RESOLUTION,
|
|
26
24
|
RESIDENT_MATERIAL_TEXTURE_SLOT_RESOLUTION
|
|
27
25
|
} from "./RESIDENT_MATERIAL_TEXTURE_LAYOUT.js";
|
|
28
|
-
import { shader_resident_texture_means, shader_resident_texture_rows } from "./shader_resident_texture_means.js";
|
|
29
26
|
|
|
30
27
|
/**
|
|
31
28
|
* @typedef {import("../../GraphicsContext.js").GraphicsContext} GraphicsContext
|
|
@@ -131,13 +128,6 @@ const NEUTRAL_SURFACE = Object.freeze({
|
|
|
131
128
|
|
|
132
129
|
export class GPUResidentMaterialContext {
|
|
133
130
|
|
|
134
|
-
/**
|
|
135
|
-
* Sent with a material when it is repacked because its {@link ShadeMaterial#version} moved: the
|
|
136
|
-
* row the device reads changes with the next {@link update}. Not sent for a material's first pack.
|
|
137
|
-
* @type {Signal<ShadeMaterial>}
|
|
138
|
-
*/
|
|
139
|
-
onMaterialRepacked = new Signal();
|
|
140
|
-
|
|
141
131
|
/**
|
|
142
132
|
* @type {GraphicsContext}
|
|
143
133
|
*/
|
|
@@ -200,31 +190,6 @@ export class GPUResidentMaterialContext {
|
|
|
200
190
|
return this.#buffer_textures;
|
|
201
191
|
}
|
|
202
192
|
|
|
203
|
-
/**
|
|
204
|
-
* Each texture slot's mean, `vec4<f32>`, of its texels as the atlas stores them: an albedo's colour
|
|
205
|
-
* premultiplied by its coverage. Written whenever the textures are (§6.6 of
|
|
206
|
-
* PROBE_CLIPMAP_PROPOSAL_2026_10_27.md): what a GI hit that no card sees takes of its material.
|
|
207
|
-
* Replaced when the slots outgrow it, so take it each frame.
|
|
208
|
-
*
|
|
209
|
-
* @type {GPUBuffer}
|
|
210
|
-
*/
|
|
211
|
-
#buffer_texture_means;
|
|
212
|
-
|
|
213
|
-
/** The rows' sums the means are made of. @type {GPUBuffer|null} */
|
|
214
|
-
#buffer_texture_rows = null;
|
|
215
|
-
|
|
216
|
-
/** Slots the means hold. */
|
|
217
|
-
#texture_means_capacity = 0;
|
|
218
|
-
|
|
219
|
-
#texture_means_settings = { slot_count: 0 };
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* @returns {GPUBuffer}
|
|
223
|
-
*/
|
|
224
|
-
get buffer_texture_means() {
|
|
225
|
-
return this.#buffer_texture_means;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
193
|
/**
|
|
229
194
|
*
|
|
230
195
|
* @returns {GPUTextureView}
|
|
@@ -368,13 +333,6 @@ export class GPUResidentMaterialContext {
|
|
|
368
333
|
size: MEDIA_TABLE_STRUCT.size,
|
|
369
334
|
});
|
|
370
335
|
|
|
371
|
-
// a slot's worth until the first textures are written
|
|
372
|
-
this.#buffer_texture_means = device.createBuffer({
|
|
373
|
-
label: 'Material Texture Means',
|
|
374
|
-
usage: GPUBufferUsage.STORAGE,
|
|
375
|
-
size: 16,
|
|
376
|
-
});
|
|
377
|
-
|
|
378
336
|
this.#buffer_textures = new GPUTextureContext(device);
|
|
379
337
|
const descriptor = this.#buffer_textures.descriptor;
|
|
380
338
|
|
|
@@ -485,8 +443,8 @@ export class GPUResidentMaterialContext {
|
|
|
485
443
|
* Make a material resident, or repack it if its {@link ShadeMaterial#version} has moved since —
|
|
486
444
|
* the same contract {@link GPUMaterialManager} restages by. A hit used to be final, so a factor
|
|
487
445
|
* set after the first pack never reached the row. Every caller re-obtains what it needs before
|
|
488
|
-
* {@link update}: the scene's drawn list,
|
|
489
|
-
* moves, so the check rides on walks that already happen.
|
|
446
|
+
* {@link update} or {@link commit}: the scene's drawn list, the manager's materials whenever its
|
|
447
|
+
* version moves, or what a card capture traces, so the check rides on walks that already happen.
|
|
490
448
|
*
|
|
491
449
|
* @param {ShadeMaterial} material
|
|
492
450
|
* @returns {MaterialInfo}
|
|
@@ -505,8 +463,6 @@ export class GPUResidentMaterialContext {
|
|
|
505
463
|
this.#pack_material(info);
|
|
506
464
|
} else if (info.version !== material.version) {
|
|
507
465
|
this.#pack_material(info);
|
|
508
|
-
|
|
509
|
-
this.onMaterialRepacked.send1(material);
|
|
510
466
|
}
|
|
511
467
|
|
|
512
468
|
return info;
|
|
@@ -592,8 +548,6 @@ export class GPUResidentMaterialContext {
|
|
|
592
548
|
}
|
|
593
549
|
}
|
|
594
550
|
|
|
595
|
-
this.#record_texture_means(encoder, textures);
|
|
596
|
-
|
|
597
551
|
encoder.finish();
|
|
598
552
|
|
|
599
553
|
}
|
|
@@ -683,65 +637,6 @@ export class GPUResidentMaterialContext {
|
|
|
683
637
|
}
|
|
684
638
|
}
|
|
685
639
|
|
|
686
|
-
/**
|
|
687
|
-
* Every texture slot's mean, after the slots are written (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §6.6):
|
|
688
|
-
* the rows' sums, then the slots' means, which {@link buffer_texture_means} holds.
|
|
689
|
-
*
|
|
690
|
-
* @param {ShadeGPUCommandContext} encoder
|
|
691
|
-
* @param {TextureInfo[]} textures
|
|
692
|
-
*/
|
|
693
|
-
#record_texture_means(encoder, textures) {
|
|
694
|
-
let slot_count = 0;
|
|
695
|
-
|
|
696
|
-
for (let i = 0; i < textures.length; i++) {
|
|
697
|
-
slot_count = Math.max(slot_count, textures[i].id + 1);
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
if (slot_count === 0) {
|
|
701
|
-
return;
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
if (this.#texture_means_capacity < slot_count) {
|
|
705
|
-
// textures arrive a few at a time as a scene loads: doubling replaces the buffers a
|
|
706
|
-
// logarithmic number of times
|
|
707
|
-
const capacity = Math.max(slot_count, 2 * this.#texture_means_capacity);
|
|
708
|
-
|
|
709
|
-
this.#buffer_texture_means.destroy();
|
|
710
|
-
this.#buffer_texture_rows?.destroy();
|
|
711
|
-
|
|
712
|
-
this.#texture_means_capacity = capacity;
|
|
713
|
-
this.#buffer_texture_means = this.#device.createBuffer({
|
|
714
|
-
label: 'Material Texture Means',
|
|
715
|
-
usage: GPUBufferUsage.STORAGE,
|
|
716
|
-
size: 16 * capacity,
|
|
717
|
-
});
|
|
718
|
-
this.#buffer_texture_rows = this.#device.createBuffer({
|
|
719
|
-
label: 'Material Texture Rows',
|
|
720
|
-
usage: GPUBufferUsage.STORAGE,
|
|
721
|
-
size: 16 * RESIDENT_MATERIAL_TEXTURE_RESOLUTION * capacity,
|
|
722
|
-
});
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
const settings = this.#texture_means_settings;
|
|
726
|
-
|
|
727
|
-
settings.slot_count = slot_count;
|
|
728
|
-
|
|
729
|
-
// a workgroup a slot, folded as folded_workgroup_index reads it: the array holds more slots than a
|
|
730
|
-
// dimension does
|
|
731
|
-
shader_resident_texture_rows.dispatch({
|
|
732
|
-
encoder,
|
|
733
|
-
group_count_x: Math.min(slot_count, WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION),
|
|
734
|
-
group_count_y: Math.ceil(slot_count / WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION),
|
|
735
|
-
bindings: { settings, textures: this.textureView, texture_rows: this.#buffer_texture_rows },
|
|
736
|
-
});
|
|
737
|
-
|
|
738
|
-
shader_resident_texture_means.dispatch({
|
|
739
|
-
encoder,
|
|
740
|
-
group_count_x: Math.ceil(slot_count / 64),
|
|
741
|
-
bindings: { settings, texture_rows: this.#buffer_texture_rows, texture_means: this.#buffer_texture_means },
|
|
742
|
-
});
|
|
743
|
-
}
|
|
744
|
-
|
|
745
640
|
build_materials() {
|
|
746
641
|
|
|
747
642
|
/**
|
|
@@ -871,25 +766,29 @@ export class GPUResidentMaterialContext {
|
|
|
871
766
|
|
|
872
767
|
}
|
|
873
768
|
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
769
|
+
/**
|
|
770
|
+
* Write what {@link obtain_material} made resident or repacked since the last commit, and the media
|
|
771
|
+
* that moved. Takes none of the manager's materials, unlike {@link update}: for a reader that makes
|
|
772
|
+
* resident only what it reads.
|
|
773
|
+
*/
|
|
774
|
+
commit() {
|
|
878
775
|
this.#write_media();
|
|
879
|
-
|
|
880
|
-
if (this.#version === this.#version_commited) {
|
|
881
|
-
return;
|
|
882
|
-
}
|
|
883
|
-
|
|
884
776
|
this.#commit();
|
|
885
777
|
}
|
|
886
778
|
|
|
779
|
+
/**
|
|
780
|
+
* Make every material the manager holds resident, then {@link commit}: for the readers that trace
|
|
781
|
+
* the whole scene.
|
|
782
|
+
*/
|
|
783
|
+
update() {
|
|
784
|
+
this.#update_from_manager();
|
|
785
|
+
this.commit();
|
|
786
|
+
}
|
|
787
|
+
|
|
887
788
|
|
|
888
789
|
destroy() {
|
|
889
790
|
this.#buffer_materials.destroy();
|
|
890
791
|
this.#buffer_media.destroy();
|
|
891
792
|
this.#buffer_textures.destroy();
|
|
892
|
-
this.#buffer_texture_means.destroy();
|
|
893
|
-
this.#buffer_texture_rows?.destroy();
|
|
894
793
|
}
|
|
895
794
|
}
|
|
@@ -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"}
|