@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
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn a virtual geometry into an ordinary meshlet geometry of at most `triangle_limit` triangles: a
|
|
3
|
+
* proxy, for whatever wants a plain mesh of an asset that is only clusters.
|
|
4
|
+
*
|
|
5
|
+
* **No simplification happens here.** The DAG already holds the asset at every level of detail; the
|
|
6
|
+
* proxy is a cut through it, and the cut's clusters are meshlets already (`VGEO_FORMAT.md` §8). The
|
|
7
|
+
* cut starts at the roots and refines, one group at a time, the group whose parents carry the largest
|
|
8
|
+
* `self_error`, and stops at the first refinement that would take it over the limit — so the error is
|
|
9
|
+
* as uniform as the DAG allows.
|
|
10
|
+
*
|
|
11
|
+
* A group is refined only once every one of its parents is in the cut (`group_parent_count`, §6), and
|
|
12
|
+
* then all of them are replaced together, so the cut is watertight at every step, as a view's cut is.
|
|
13
|
+
*
|
|
14
|
+
* Pages are installed as the descent reaches them, down to one band below the cut: a small proxy of a
|
|
15
|
+
* large asset reads the coarse prefix of the file and nothing else.
|
|
16
|
+
*
|
|
17
|
+
* The DAG's roots are as coarse as it goes: a limit below the roots' triangle count gets the roots.
|
|
18
|
+
*
|
|
19
|
+
* @param {VGeoContainerReader} reader an open container, which is one material's geometry; the pages the
|
|
20
|
+
* descent reaches are installed into it and left there
|
|
21
|
+
* @param {number} triangle_limit
|
|
22
|
+
* @returns {Promise<MeshletGeometry>}
|
|
23
|
+
*
|
|
24
|
+
* @author Alex Goldring
|
|
25
|
+
* @copyright Company Named Limited (c) 2026
|
|
26
|
+
*/
|
|
27
|
+
export function vgeo_to_proxy_mesh(reader: VGeoContainerReader, triangle_limit: number): Promise<MeshletGeometry>;
|
|
28
|
+
export type VGeoContainerReader = import("../format/read/VGeoContainerReader.js").VGeoContainerReader;
|
|
29
|
+
export type VGeoPage = import("../format/read/VGeoPage.js").VGeoPage;
|
|
30
|
+
import { MeshletGeometry } from "../../MeshletGeometry.js";
|
|
31
|
+
//# sourceMappingURL=vgeo_to_proxy_mesh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_to_proxy_mesh.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,2CARW,mBAAmB,kBAEnB,MAAM,GACJ,QAAQ,eAAe,CAAC,CAcpC;kCA7CY,OAAO,uCAAuC,EAAE,mBAAmB;uBACnE,OAAO,4BAA4B,EAAE,QAAQ;gCAP1B,0BAA0B"}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
|
|
3
|
+
import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
|
|
4
|
+
import { IndexedFloatMaxHeap } from "../../../../../core/collection/heap/IndexedFloatMaxHeap.js";
|
|
5
|
+
import { aabb3_array_combine } from "../../../../../core/geom/3d/aabb/aabb3_array_combine.js";
|
|
6
|
+
import { blas_from_meshlets } from "../../blas_from_meshlets.js";
|
|
7
|
+
import { MESHLET_METADATA_STRUCT } from "../../meshlet/encoding/MESHLET_METADATA_STRUCT.js";
|
|
8
|
+
import { MeshletGeometry } from "../../MeshletGeometry.js";
|
|
9
|
+
import { VGEO_NO_CHILD } from "../format/cluster/VGEO_NO_CHILD.js";
|
|
10
|
+
import { VGEO_SAME_PAGE } from "../format/cluster/VGEO_SAME_PAGE.js";
|
|
11
|
+
import { vgeo_meshlet_metadata_write } from "../runtime/vgeo_meshlet_metadata_write.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {import("../format/read/VGeoContainerReader.js").VGeoContainerReader} VGeoContainerReader
|
|
15
|
+
* @typedef {import("../format/read/VGeoPage.js").VGeoPage} VGeoPage
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A page not yet given its groups' ids.
|
|
20
|
+
* @type {number}
|
|
21
|
+
*/
|
|
22
|
+
const NO_BASE = -1;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Turn a virtual geometry into an ordinary meshlet geometry of at most `triangle_limit` triangles: a
|
|
26
|
+
* proxy, for whatever wants a plain mesh of an asset that is only clusters.
|
|
27
|
+
*
|
|
28
|
+
* **No simplification happens here.** The DAG already holds the asset at every level of detail; the
|
|
29
|
+
* proxy is a cut through it, and the cut's clusters are meshlets already (`VGEO_FORMAT.md` §8). The
|
|
30
|
+
* cut starts at the roots and refines, one group at a time, the group whose parents carry the largest
|
|
31
|
+
* `self_error`, and stops at the first refinement that would take it over the limit — so the error is
|
|
32
|
+
* as uniform as the DAG allows.
|
|
33
|
+
*
|
|
34
|
+
* A group is refined only once every one of its parents is in the cut (`group_parent_count`, §6), and
|
|
35
|
+
* then all of them are replaced together, so the cut is watertight at every step, as a view's cut is.
|
|
36
|
+
*
|
|
37
|
+
* Pages are installed as the descent reaches them, down to one band below the cut: a small proxy of a
|
|
38
|
+
* large asset reads the coarse prefix of the file and nothing else.
|
|
39
|
+
*
|
|
40
|
+
* The DAG's roots are as coarse as it goes: a limit below the roots' triangle count gets the roots.
|
|
41
|
+
*
|
|
42
|
+
* @param {VGeoContainerReader} reader an open container, which is one material's geometry; the pages the
|
|
43
|
+
* descent reaches are installed into it and left there
|
|
44
|
+
* @param {number} triangle_limit
|
|
45
|
+
* @returns {Promise<MeshletGeometry>}
|
|
46
|
+
*
|
|
47
|
+
* @author Alex Goldring
|
|
48
|
+
* @copyright Company Named Limited (c) 2026
|
|
49
|
+
*/
|
|
50
|
+
export async function vgeo_to_proxy_mesh(reader, triangle_limit) {
|
|
51
|
+
assert.defined(reader.root, 'reader.root — the container must be open');
|
|
52
|
+
assert.isNonNegativeInteger(triangle_limit, 'triangle_limit');
|
|
53
|
+
|
|
54
|
+
const cut = new ProxyCut(reader);
|
|
55
|
+
|
|
56
|
+
await cut.descend(triangle_limit);
|
|
57
|
+
|
|
58
|
+
return cut.build();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The cut, and the bookkeeping of its descent.
|
|
63
|
+
*
|
|
64
|
+
* Groups are given dense ids as their page is installed, so the per-group state is typed arrays sized
|
|
65
|
+
* once from the header's `total_groups`.
|
|
66
|
+
*/
|
|
67
|
+
class ProxyCut {
|
|
68
|
+
/**
|
|
69
|
+
* @param {VGeoContainerReader} reader
|
|
70
|
+
*/
|
|
71
|
+
constructor(reader) {
|
|
72
|
+
this.reader = reader;
|
|
73
|
+
|
|
74
|
+
const capacity = reader.header.total_groups;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* First group id of each page; {@link NO_BASE} until the page is installed.
|
|
78
|
+
*/
|
|
79
|
+
this.page_base = new Int32Array(reader.header.total_pages).fill(NO_BASE);
|
|
80
|
+
|
|
81
|
+
this.next_base = 0;
|
|
82
|
+
|
|
83
|
+
this.group_page = new Uint32Array(capacity);
|
|
84
|
+
this.group_index = new Uint16Array(capacity);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Parents of the group in the cut so far.
|
|
88
|
+
*/
|
|
89
|
+
this.arrived = new Uint16Array(capacity);
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Their triangles: what refining the group takes out of the cut.
|
|
93
|
+
*/
|
|
94
|
+
this.parent_triangles = new Uint32Array(capacity);
|
|
95
|
+
|
|
96
|
+
this.refined = new Uint8Array(capacity);
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Groups whose every parent is in the cut, by the error those parents carry.
|
|
100
|
+
*/
|
|
101
|
+
this.refinable = new IndexedFloatMaxHeap(capacity);
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Every cluster that entered the cut, as the id of its group, its index in its page and the id
|
|
105
|
+
* of its child group (-1 for a leaf). One leaves the cut when its child group is refined.
|
|
106
|
+
* @type {number[]}
|
|
107
|
+
*/
|
|
108
|
+
this.entered_group = [];
|
|
109
|
+
this.entered_cluster = [];
|
|
110
|
+
this.entered_child = [];
|
|
111
|
+
|
|
112
|
+
this.triangle_count = 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @param {number} limit
|
|
117
|
+
* @returns {Promise<void>}
|
|
118
|
+
*/
|
|
119
|
+
async descend(limit) {
|
|
120
|
+
const root = this.reader.root;
|
|
121
|
+
|
|
122
|
+
this.#register(root);
|
|
123
|
+
|
|
124
|
+
for (let group = 0; group < root.group_parent_count.length; group++) {
|
|
125
|
+
// no cluster refines into it: the top of the DAG
|
|
126
|
+
if (root.group_parent_count[group] === 0) {
|
|
127
|
+
await this.#enter(this.page_base[root.index] + group);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const refinable = this.refinable;
|
|
132
|
+
|
|
133
|
+
while (refinable.size > 0) {
|
|
134
|
+
const id = refinable.pop_max();
|
|
135
|
+
|
|
136
|
+
if (this.triangle_count - this.parent_triangles[id] + this.#group_triangles(id) > limit) {
|
|
137
|
+
// the largest error left does not fit: refining anywhere finer would make it less uniform
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
this.refined[id] = 1;
|
|
142
|
+
this.triangle_count -= this.parent_triangles[id];
|
|
143
|
+
|
|
144
|
+
await this.#enter(id);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The cut's clusters as a meshlet geometry: their payloads gathered as they are stored, a metadata
|
|
150
|
+
* row each, and the BVH the mesh path builds.
|
|
151
|
+
*
|
|
152
|
+
* @returns {MeshletGeometry}
|
|
153
|
+
*/
|
|
154
|
+
build() {
|
|
155
|
+
/** @type {VGeoPage[]} */
|
|
156
|
+
const pages = [];
|
|
157
|
+
/** @type {number[]} */
|
|
158
|
+
const clusters = [];
|
|
159
|
+
|
|
160
|
+
let data_size = 0;
|
|
161
|
+
|
|
162
|
+
for (let i = 0; i < this.entered_group.length; i++) {
|
|
163
|
+
const child = this.entered_child[i];
|
|
164
|
+
|
|
165
|
+
if (child !== -1 && this.refined[child] === 1) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const page = this.reader.page(this.group_page[this.entered_group[i]]);
|
|
170
|
+
const cluster = this.entered_cluster[i];
|
|
171
|
+
|
|
172
|
+
pages.push(page);
|
|
173
|
+
clusters.push(cluster);
|
|
174
|
+
|
|
175
|
+
data_size += page.cluster_payload_size[cluster];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const count = clusters.length;
|
|
179
|
+
|
|
180
|
+
const data = new Uint8Array(data_size);
|
|
181
|
+
|
|
182
|
+
const metadata = BinaryBuffer.fromEndianness(platform_compute_endianness());
|
|
183
|
+
|
|
184
|
+
metadata.setCapacity(count * MESHLET_METADATA_STRUCT.size);
|
|
185
|
+
|
|
186
|
+
const result = new MeshletGeometry();
|
|
187
|
+
|
|
188
|
+
const box = result.bounding_box;
|
|
189
|
+
|
|
190
|
+
box.set([Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity]);
|
|
191
|
+
|
|
192
|
+
let address = 0;
|
|
193
|
+
|
|
194
|
+
for (let i = 0; i < count; i++) {
|
|
195
|
+
const page = pages[i];
|
|
196
|
+
const cluster = clusters[i];
|
|
197
|
+
|
|
198
|
+
const start = page.payload_offset + page.cluster_payload_offset[cluster];
|
|
199
|
+
const size = page.cluster_payload_size[cluster];
|
|
200
|
+
|
|
201
|
+
data.set(page.bytes.subarray(start, start + size), address);
|
|
202
|
+
|
|
203
|
+
// §11.8: every payload size is a multiple of four, so each cluster starts on a word
|
|
204
|
+
vgeo_meshlet_metadata_write(metadata, page, cluster, address >>> 2);
|
|
205
|
+
|
|
206
|
+
// `aabb` is the cluster's tight fit, so their union is the proxy's
|
|
207
|
+
aabb3_array_combine(box, 0, box, 0, page.aabb, cluster * 6);
|
|
208
|
+
|
|
209
|
+
address += size;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const batch = result.meshlets;
|
|
213
|
+
|
|
214
|
+
batch.count = count;
|
|
215
|
+
batch.data_buffer = data.buffer;
|
|
216
|
+
batch.metadata_buffer = metadata.data.slice(0, count * MESHLET_METADATA_STRUCT.size);
|
|
217
|
+
|
|
218
|
+
// the box-diagonal sphere `meshlet_geometry_build_from_geometry` gives a mesh
|
|
219
|
+
const sphere = result.bounding_sphere;
|
|
220
|
+
|
|
221
|
+
sphere[0] = (box[0] + box[3]) * 0.5;
|
|
222
|
+
sphere[1] = (box[1] + box[4]) * 0.5;
|
|
223
|
+
sphere[2] = (box[2] + box[5]) * 0.5;
|
|
224
|
+
sphere[3] = 0.5 * Math.hypot(box[3] - box[0], box[4] - box[1], box[5] - box[2]);
|
|
225
|
+
|
|
226
|
+
result.name = this.reader.source.name;
|
|
227
|
+
result.primitive_count = this.triangle_count;
|
|
228
|
+
result.bvh = blas_from_meshlets(batch, result.primitive_count, box);
|
|
229
|
+
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* @param {number} id
|
|
235
|
+
* @returns {number}
|
|
236
|
+
*/
|
|
237
|
+
#group_triangles(id) {
|
|
238
|
+
const page = this.reader.page(this.group_page[id]);
|
|
239
|
+
const group = this.group_index[id];
|
|
240
|
+
|
|
241
|
+
const first = page.group_cluster_first[group];
|
|
242
|
+
const end = first + page.group_cluster_count[group];
|
|
243
|
+
|
|
244
|
+
let triangles = 0;
|
|
245
|
+
|
|
246
|
+
for (let cluster = first; cluster < end; cluster++) {
|
|
247
|
+
triangles += page.triangle_count[cluster];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return triangles;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Give an installed page's groups their ids.
|
|
255
|
+
*
|
|
256
|
+
* @param {VGeoPage} page
|
|
257
|
+
*/
|
|
258
|
+
#register(page) {
|
|
259
|
+
if (this.page_base[page.index] !== NO_BASE) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const base = this.next_base;
|
|
264
|
+
const group_count = page.group_cluster_count.length;
|
|
265
|
+
|
|
266
|
+
this.page_base[page.index] = base;
|
|
267
|
+
|
|
268
|
+
for (let group = 0; group < group_count; group++) {
|
|
269
|
+
this.group_page[base + group] = page.index;
|
|
270
|
+
this.group_index[base + group] = group;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
this.next_base = base + group_count;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Put a group's clusters in the cut, and count each in at its child group, which becomes
|
|
278
|
+
* refinable once its last parent arrives.
|
|
279
|
+
*
|
|
280
|
+
* @param {number} id
|
|
281
|
+
* @returns {Promise<void>}
|
|
282
|
+
*/
|
|
283
|
+
async #enter(id) {
|
|
284
|
+
const reader = this.reader;
|
|
285
|
+
const page = reader.page(this.group_page[id]);
|
|
286
|
+
const group = this.group_index[id];
|
|
287
|
+
|
|
288
|
+
const first = page.group_cluster_first[group];
|
|
289
|
+
const end = first + page.group_cluster_count[group];
|
|
290
|
+
|
|
291
|
+
// the child pages first: a child group's parent count lives in its own page
|
|
292
|
+
const installs = [];
|
|
293
|
+
|
|
294
|
+
for (let cluster = first; cluster < end; cluster++) {
|
|
295
|
+
const child_ref = page.child_ref[cluster];
|
|
296
|
+
|
|
297
|
+
if (child_ref === VGEO_NO_CHILD || child_ref === VGEO_SAME_PAGE) {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const child_page = page.child_page_index[child_ref];
|
|
302
|
+
|
|
303
|
+
if (!reader.is_resident(child_page)) {
|
|
304
|
+
installs.push(reader.install(
|
|
305
|
+
child_page, page.child_frame_offset[child_ref], page.child_fetch_size[child_ref]
|
|
306
|
+
));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
for (const child_page of await Promise.all(installs)) {
|
|
311
|
+
this.#register(child_page);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
for (let cluster = first; cluster < end; cluster++) {
|
|
315
|
+
const triangles = page.triangle_count[cluster];
|
|
316
|
+
|
|
317
|
+
this.triangle_count += triangles;
|
|
318
|
+
|
|
319
|
+
this.entered_group.push(id);
|
|
320
|
+
this.entered_cluster.push(cluster);
|
|
321
|
+
|
|
322
|
+
const child_ref = page.child_ref[cluster];
|
|
323
|
+
|
|
324
|
+
if (child_ref === VGEO_NO_CHILD) {
|
|
325
|
+
this.entered_child.push(-1);
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const child_page = reader.page(child_ref === VGEO_SAME_PAGE ? page.index : page.child_page_index[child_ref]);
|
|
330
|
+
const child_group = page.child_group[cluster];
|
|
331
|
+
const child = this.page_base[child_page.index] + child_group;
|
|
332
|
+
|
|
333
|
+
this.entered_child.push(child);
|
|
334
|
+
|
|
335
|
+
this.arrived[child]++;
|
|
336
|
+
this.parent_triangles[child] += triangles;
|
|
337
|
+
|
|
338
|
+
if (this.arrived[child] === child_page.group_parent_count[child_group]) {
|
|
339
|
+
this.refinable.insert(child, page.self_error[cluster]);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One cluster's meshlet metadata row, written at `buffer`'s position.
|
|
3
|
+
*
|
|
4
|
+
* `VGEO_FORMAT.md` §8: the 40-byte rows are synthesized from the cluster record — `aabb` becomes
|
|
5
|
+
* `bounds_box`, the u8 counts widen to u32, `encoding_flags` passes through. Only `address` depends
|
|
6
|
+
* on where the payload went, so the caller says.
|
|
7
|
+
*
|
|
8
|
+
* @param {BinaryBuffer} buffer
|
|
9
|
+
* @param {VGeoPage} page
|
|
10
|
+
* @param {number} cluster index within `page`
|
|
11
|
+
* @param {number} address where the cluster's payload starts in the data the row will be read against, in 4-byte words
|
|
12
|
+
*
|
|
13
|
+
* @author Alex Goldring
|
|
14
|
+
* @copyright Company Named Limited (c) 2026
|
|
15
|
+
*/
|
|
16
|
+
export function vgeo_meshlet_metadata_write(buffer: BinaryBuffer, page: VGeoPage, cluster: number, address: number): void;
|
|
17
|
+
//# sourceMappingURL=vgeo_meshlet_metadata_write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_meshlet_metadata_write.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AACH,2FANW,MAAM,WACN,MAAM,QAahB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
|
|
2
|
+
import {
|
|
3
|
+
MESHLET_METADATA_STRUCT
|
|
4
|
+
} from "../../meshlet/encoding/MESHLET_METADATA_STRUCT.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* One cluster's meshlet metadata row, written at `buffer`'s position.
|
|
8
|
+
*
|
|
9
|
+
* `VGEO_FORMAT.md` §8: the 40-byte rows are synthesized from the cluster record — `aabb` becomes
|
|
10
|
+
* `bounds_box`, the u8 counts widen to u32, `encoding_flags` passes through. Only `address` depends
|
|
11
|
+
* on where the payload went, so the caller says.
|
|
12
|
+
*
|
|
13
|
+
* @param {BinaryBuffer} buffer
|
|
14
|
+
* @param {VGeoPage} page
|
|
15
|
+
* @param {number} cluster index within `page`
|
|
16
|
+
* @param {number} address where the cluster's payload starts in the data the row will be read against, in 4-byte words
|
|
17
|
+
*
|
|
18
|
+
* @author Alex Goldring
|
|
19
|
+
* @copyright Company Named Limited (c) 2026
|
|
20
|
+
*/
|
|
21
|
+
export function vgeo_meshlet_metadata_write(buffer, page, cluster, address) {
|
|
22
|
+
write_wgsl_type_value({
|
|
23
|
+
bounds_box: page.aabb.subarray(cluster * 6, cluster * 6 + 6),
|
|
24
|
+
address,
|
|
25
|
+
primitive_count: page.triangle_count[cluster],
|
|
26
|
+
vertex_count: page.vertex_count[cluster],
|
|
27
|
+
flags: page.encoding_flags[cluster],
|
|
28
|
+
}, buffer, MESHLET_METADATA_STRUCT);
|
|
29
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgeo_runtime_meshlet_batch.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,4DALa,YAAY,
|
|
1
|
+
{"version":3,"file":"vgeo_runtime_meshlet_batch.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,4DALa,YAAY,CAuCxB;6BAzD4B,+BAA+B"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { assert } from "../../../../../core/assert.js";
|
|
2
2
|
import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
|
|
3
3
|
import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
|
|
4
|
-
import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
|
|
5
4
|
import {
|
|
6
5
|
MESHLET_METADATA_STRUCT
|
|
7
6
|
} from "../../meshlet/encoding/MESHLET_METADATA_STRUCT.js";
|
|
8
7
|
import { MeshletBatch } from "../../meshlet/MeshletBatch.js";
|
|
8
|
+
import { vgeo_meshlet_metadata_write } from "./vgeo_meshlet_metadata_write.js";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* A decoded page, as the meshlet pool takes it.
|
|
@@ -46,18 +46,12 @@ export function vgeo_runtime_meshlet_batch(page) {
|
|
|
46
46
|
metadata.setCapacity(count * MESHLET_METADATA_STRUCT.size);
|
|
47
47
|
|
|
48
48
|
for (let cluster = 0; cluster < count; cluster++) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
*/
|
|
56
|
-
address: page.cluster_payload_offset[cluster] >>> 2,
|
|
57
|
-
primitive_count: page.triangle_count[cluster],
|
|
58
|
-
vertex_count: page.vertex_count[cluster],
|
|
59
|
-
flags: page.encoding_flags[cluster],
|
|
60
|
-
}, metadata, MESHLET_METADATA_STRUCT);
|
|
49
|
+
/*
|
|
50
|
+
Words, and relative to the page's payload section — `GPUMeshletManager` adds the
|
|
51
|
+
allocation's own offset when it uploads. Format §11.8 makes every payload offset a
|
|
52
|
+
multiple of four, so this division is exact rather than rounded.
|
|
53
|
+
*/
|
|
54
|
+
vgeo_meshlet_metadata_write(metadata, page, cluster, page.cluster_payload_offset[cluster] >>> 2);
|
|
61
55
|
}
|
|
62
56
|
|
|
63
57
|
// `BinaryBuffer.data` is the ArrayBuffer itself, and `setCapacity` may have rounded it up;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUProbeClipmapGI.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js"],"names":[],"mappings":"AAeA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IA0DI;;OAEG;IACH,sBAFW,eAAe,EAMzB;IAED;;OAEG;IACH,qCAEC;IAED;;OAEG;IACH,qCAEC;IAED;;OAEG;IACH,oCAEC;IAED;;;;;;;;;;;;;;OAcG;IACH;QAT+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACgB,QAAQ,EAAtC,oBAAoB;QACJ,KAAK,EAArB,MAAM;QACU,MAAM,EAAtB,MAAM;QACK,IAAI;QACE,MAAM,GAAvB,MAAM;
|
|
1
|
+
{"version":3,"file":"GPUProbeClipmapGI.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js"],"names":[],"mappings":"AAeA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IA0DI;;OAEG;IACH,sBAFW,eAAe,EAMzB;IAED;;OAEG;IACH,qCAEC;IAED;;OAEG;IACH,qCAEC;IAED;;OAEG;IACH,oCAEC;IAED;;;;;;;;;;;;;;OAcG;IACH;QAT+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACgB,QAAQ,EAAtC,oBAAoB;QACJ,KAAK,EAArB,MAAM;QACU,MAAM,EAAtB,MAAM;QACK,IAAI;QACE,MAAM,GAAvB,MAAM;aA2FhB;IAED;;;OAGG;IACH,0BAEC;IAED;;;;;;;;;OASG;IACH,4CAUC;IAwDD;;;;;;;;;;OAUG;IACH;QAN+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACgB,QAAQ,EAAtC,oBAAoB;QACF,UAAU,EAA5B,MAAM,EAAE;QACN,MAAM,CAmBlB;IAED;;;;;OAKG;IACH,uBAFW,aAAa,QASvB;IAED;;;OAGG;IACH,0BAHW,aAAa,GACX,OAAO,CAanB;IAyCD;;;OAGG;IACH,gBAoBC;IAED,gBAcC;;CACJ;yBA9bY,OAAO,8DAA8D,EAAE,UAAU;8BACjF,OAAO,0BAA0B,EAAE,eAAe;6BAClD,OAAO,8BAA8B,EAAE,cAAc;mCACrD,OAAO,2BAA2B,EAAE,oBAAoB;4BACxD,OAAO,4BAA4B,EAAE,aAAa;gCAjB/B,4BAA4B;gCAQ5B,4BAA4B;uCAErB,6BAA6B"}
|
|
@@ -180,12 +180,6 @@ export class GPUProbeClipmapGI {
|
|
|
180
180
|
|
|
181
181
|
const scene = view.scene;
|
|
182
182
|
const sdf = scene.geometries.sdf;
|
|
183
|
-
const materials = this.#graphics.materials_resident;
|
|
184
|
-
|
|
185
|
-
// the scene's materials as they are this frame: a repack recaptures its pairs
|
|
186
|
-
materials.ensure_scene_materials(scene);
|
|
187
|
-
materials.update();
|
|
188
|
-
|
|
189
183
|
sdf.configure(settings.mesh_sdf_voxel_size, settings.mesh_sdf_max_bricks);
|
|
190
184
|
sdf.trim();
|
|
191
185
|
sdf.cards.capture_mode = settings.card_capture_mode;
|
|
@@ -193,7 +187,7 @@ export class GPUProbeClipmapGI {
|
|
|
193
187
|
graph,
|
|
194
188
|
budget: settings.mesh_sdf_bake_budget,
|
|
195
189
|
capture_budget: settings.card_capture_budget,
|
|
196
|
-
materials,
|
|
190
|
+
materials: this.#graphics.materials_resident,
|
|
197
191
|
material_contexts: this.#graphics.materials,
|
|
198
192
|
});
|
|
199
193
|
|
|
@@ -235,7 +229,6 @@ export class GPUProbeClipmapGI {
|
|
|
235
229
|
brick_clipmap: this.#brick_clipmap,
|
|
236
230
|
bricks,
|
|
237
231
|
scene,
|
|
238
|
-
materials,
|
|
239
232
|
card_rows: this.#holds.rows_buffer,
|
|
240
233
|
resampling: settings.resampling,
|
|
241
234
|
});
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
* its hold and its pair, the new ones taken before the old ones go, so a cache or card set a row keeps
|
|
16
16
|
* drawing is never let go in between.
|
|
17
17
|
*
|
|
18
|
-
* When the
|
|
19
|
-
*
|
|
18
|
+
* When the material manager restages a material whose version moved, each of that material's pairs
|
|
19
|
+
* is recaptured (§6.5), and the holds of its rows move to the side it draws now.
|
|
20
20
|
*
|
|
21
21
|
* {@link attach} subscribes and walks the rows already there; {@link detach} gives every hold and card
|
|
22
22
|
* set back. Neither trims: a cache with no holder stays until its user trims, so leaving the mode keeps
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
export class ProbeClipmapSceneHolds {
|
|
26
26
|
/**
|
|
27
27
|
* @param {GPUSceneContext} scene
|
|
28
|
-
* @param {GraphicsContext} graphics whose
|
|
28
|
+
* @param {GraphicsContext} graphics whose material manager's restages recapture the pairs of the material
|
|
29
29
|
*/
|
|
30
30
|
constructor(scene: GPUSceneContext, graphics: GraphicsContext);
|
|
31
31
|
/**
|
|
@@ -43,7 +43,7 @@ export class ProbeClipmapSceneHolds {
|
|
|
43
43
|
*/
|
|
44
44
|
get pair_count(): number;
|
|
45
45
|
/**
|
|
46
|
-
* Recaptures asked for, a pair each time its material was
|
|
46
|
+
* Recaptures asked for, a pair each time its material was restaged.
|
|
47
47
|
* @returns {number}
|
|
48
48
|
*/
|
|
49
49
|
get recaptures_requested(): number;
|
|
@@ -79,6 +79,6 @@ export type GPUSceneContext = import("../../scene/GPUSceneContext.js").GPUSceneC
|
|
|
79
79
|
export type MeshletGeometry = import("../../geometry/MeshletGeometry.js").MeshletGeometry;
|
|
80
80
|
export type GPUGeometryMetadata = import("../../geometry/GPUGeometryMetadata.js").GPUGeometryMetadata;
|
|
81
81
|
export type ShadeMaterial = import("../../material/ShadeMaterial.js").ShadeMaterial;
|
|
82
|
-
export type
|
|
82
|
+
export type GPUMaterialManager = import("../../material/GPUMaterialManager.js").GPUMaterialManager;
|
|
83
83
|
export type GraphicsContext = import("../../GraphicsContext.js").GraphicsContext;
|
|
84
84
|
//# sourceMappingURL=ProbeClipmapSceneHolds.d.ts.map
|
package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProbeClipmapSceneHolds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js"],"names":[],"mappings":"AAwDA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAwEI;;;OAGG;IACH,mBAHW,eAAe,YACf,eAAe,EASzB;IAED;;OAEG;IACH,sEAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,mCAEC;IAED;;;OAGG;IACH,qCAEC;IAED,0BAEC;IAED;;;;;;OAMG;IACH,oBAJW,mBAAmB,YACnB,aAAa,GACX,MAAM,GAAC,SAAS,CAI5B;IAED;;;;OAIG;IACH,6BAIC;IAED,eAiBC;IAED,eAuCC;IAED;;OAEG;IACH,cAiBC;;CA4TJ;8BA1mBY,OAAO,gCAAgC,EAAE,eAAe;8BACxD,OAAO,mCAAmC,EAAE,eAAe;kCAC3D,OAAO,uCAAuC,EAAE,mBAAmB;4BACnE,OAAO,iCAAiC,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"ProbeClipmapSceneHolds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js"],"names":[],"mappings":"AAwDA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAwEI;;;OAGG;IACH,mBAHW,eAAe,YACf,eAAe,EASzB;IAED;;OAEG;IACH,sEAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,mCAEC;IAED;;;OAGG;IACH,qCAEC;IAED,0BAEC;IAED;;;;;;OAMG;IACH,oBAJW,mBAAmB,YACnB,aAAa,GACX,MAAM,GAAC,SAAS,CAI5B;IAED;;;;OAIG;IACH,6BAIC;IAED,eAiBC;IAED,eAuCC;IAED;;OAEG;IACH,cAiBC;;CA4TJ;8BA1mBY,OAAO,gCAAgC,EAAE,eAAe;8BACxD,OAAO,mCAAmC,EAAE,eAAe;kCAC3D,OAAO,uCAAuC,EAAE,mBAAmB;4BACnE,OAAO,iCAAiC,EAAE,aAAa;iCACvD,OAAO,sCAAsC,EAAE,kBAAkB;8BACjE,OAAO,0BAA0B,EAAE,eAAe"}
|
|
@@ -10,7 +10,7 @@ import { row_of_entity } from "../../scene/rows/GPUSceneRows.js";
|
|
|
10
10
|
* @typedef {import("../../geometry/MeshletGeometry.js").MeshletGeometry} MeshletGeometry
|
|
11
11
|
* @typedef {import("../../geometry/GPUGeometryMetadata.js").GPUGeometryMetadata} GPUGeometryMetadata
|
|
12
12
|
* @typedef {import("../../material/ShadeMaterial.js").ShadeMaterial} ShadeMaterial
|
|
13
|
-
* @typedef {import("../../material/
|
|
13
|
+
* @typedef {import("../../material/GPUMaterialManager.js").GPUMaterialManager} GPUMaterialManager
|
|
14
14
|
* @typedef {import("../../GraphicsContext.js").GraphicsContext} GraphicsContext
|
|
15
15
|
*/
|
|
16
16
|
|
|
@@ -71,8 +71,8 @@ class Pair {
|
|
|
71
71
|
* its hold and its pair, the new ones taken before the old ones go, so a cache or card set a row keeps
|
|
72
72
|
* drawing is never let go in between.
|
|
73
73
|
*
|
|
74
|
-
* When the
|
|
75
|
-
*
|
|
74
|
+
* When the material manager restages a material whose version moved, each of that material's pairs
|
|
75
|
+
* is recaptured (§6.5), and the holds of its rows move to the side it draws now.
|
|
76
76
|
*
|
|
77
77
|
* {@link attach} subscribes and walks the rows already there; {@link detach} gives every hold and card
|
|
78
78
|
* set back. Neither trims: a cache with no holder stays until its user trims, so leaving the mode keeps
|
|
@@ -86,7 +86,7 @@ export class ProbeClipmapSceneHolds {
|
|
|
86
86
|
#scene;
|
|
87
87
|
|
|
88
88
|
/**
|
|
89
|
-
* @type {
|
|
89
|
+
* @type {GPUMaterialManager}
|
|
90
90
|
*/
|
|
91
91
|
#materials;
|
|
92
92
|
|
|
@@ -152,14 +152,14 @@ export class ProbeClipmapSceneHolds {
|
|
|
152
152
|
|
|
153
153
|
/**
|
|
154
154
|
* @param {GPUSceneContext} scene
|
|
155
|
-
* @param {GraphicsContext} graphics whose
|
|
155
|
+
* @param {GraphicsContext} graphics whose material manager's restages recapture the pairs of the material
|
|
156
156
|
*/
|
|
157
157
|
constructor(scene, graphics) {
|
|
158
158
|
assert.defined(scene, 'scene');
|
|
159
159
|
assert.defined(graphics, 'graphics');
|
|
160
160
|
|
|
161
161
|
this.#scene = scene;
|
|
162
|
-
this.#materials = graphics.
|
|
162
|
+
this.#materials = graphics.materials;
|
|
163
163
|
this.#device = graphics.device;
|
|
164
164
|
}
|
|
165
165
|
|
|
@@ -187,7 +187,7 @@ export class ProbeClipmapSceneHolds {
|
|
|
187
187
|
}
|
|
188
188
|
|
|
189
189
|
/**
|
|
190
|
-
* Recaptures asked for, a pair each time its material was
|
|
190
|
+
* Recaptures asked for, a pair each time its material was restaged.
|
|
191
191
|
* @returns {number}
|
|
192
192
|
*/
|
|
193
193
|
get recaptures_requested() {
|
|
@@ -241,7 +241,7 @@ export class ProbeClipmapSceneHolds {
|
|
|
241
241
|
this.#scene.geometries.sdf.onBaked.add(this.#baked, this);
|
|
242
242
|
cards.onResident.add(this.#card_set_resident, this);
|
|
243
243
|
cards.onWithdrawn.add(this.#card_set_withdrawn, this);
|
|
244
|
-
this.#materials.
|
|
244
|
+
this.#materials.onMaterialRestaged.add(this.#restaged, this);
|
|
245
245
|
|
|
246
246
|
// a row not yet written is taken now, and moved when it is
|
|
247
247
|
rows.for_each_mesh((entity, geometry, material, skinned, flags) => this.#written(entity, geometry, material, flags));
|
|
@@ -263,7 +263,7 @@ export class ProbeClipmapSceneHolds {
|
|
|
263
263
|
sdf.onBaked.remove(this.#baked, this);
|
|
264
264
|
cards.onResident.remove(this.#card_set_resident, this);
|
|
265
265
|
cards.onWithdrawn.remove(this.#card_set_withdrawn, this);
|
|
266
|
-
this.#materials.
|
|
266
|
+
this.#materials.onMaterialRestaged.remove(this.#restaged, this);
|
|
267
267
|
|
|
268
268
|
for (const [entity, record] of this.#held) {
|
|
269
269
|
sdf.release(record, this.#pair_of.get(entity).two_sided);
|
|
@@ -524,7 +524,7 @@ export class ProbeClipmapSceneHolds {
|
|
|
524
524
|
/**
|
|
525
525
|
* @param {ShadeMaterial} material
|
|
526
526
|
*/
|
|
527
|
-
#
|
|
527
|
+
#restaged(material) {
|
|
528
528
|
const of_material = this.#pairs_of_material.get(material.id);
|
|
529
529
|
|
|
530
530
|
if (of_material === undefined) {
|
|
@@ -156,13 +156,11 @@ export class GPUProbeClipmap {
|
|
|
156
156
|
* the update orders after
|
|
157
157
|
* @param {import("../../../scene/GPUSceneContext.js").GPUSceneContext} options.scene the scene the rays
|
|
158
158
|
* light and shade: its lights, its environment, its rows and their geometry caches' cards
|
|
159
|
-
* @param {import("../../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext} options.materials
|
|
160
|
-
* the resident materials, updated this frame: what a hit no card sees takes
|
|
161
159
|
* @param {GPUBuffer} options.card_rows the row → card set table, a word a `meshes` row
|
|
162
160
|
* @param {boolean} options.resampling whether each update re-samples its neighbours, adding what they have
|
|
163
161
|
* seen to its rays (`shader_probe_clipmap_resample`)
|
|
164
162
|
*/
|
|
165
|
-
graph_update({ graph, x, y, z, depth, normal, camera, stbn, resolution, response_frames, ray_budget, rays_per_probe, brick_clipmap, bricks, scene,
|
|
163
|
+
graph_update({ graph, x, y, z, depth, normal, camera, stbn, resolution, response_frames, ray_budget, rays_per_probe, brick_clipmap, bricks, scene, card_rows, resampling }: {
|
|
166
164
|
graph: FrameGraph;
|
|
167
165
|
x: number;
|
|
168
166
|
y: number;
|
|
@@ -178,7 +176,6 @@ export class GPUProbeClipmap {
|
|
|
178
176
|
brick_clipmap: import("../brick/GPUBrickClipmap.js").GPUBrickClipmap;
|
|
179
177
|
bricks: number;
|
|
180
178
|
scene: import("../../../scene/GPUSceneContext.js").GPUSceneContext;
|
|
181
|
-
materials: import("../../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext;
|
|
182
179
|
card_rows: GPUBuffer;
|
|
183
180
|
resampling: boolean;
|
|
184
181
|
}): void;
|