@woosh/meep-engine 3.12.0 → 3.13.1
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/package.json +1 -1
- package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/ConvexHullShape3D.js +41 -25
- package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PosedShape3D.js +7 -2
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
- package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
- package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/RENDERER_CONTRACT.md +2 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
- package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +755 -0
- package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +801 -994
- package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
- package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
- package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
- package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
- package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
- package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
- package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
- package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
- package/src/shade/device/timing/GPUTimerArray.js +261 -289
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
- package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
- package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
- package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
- package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
- package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
- package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
- package/src/shade/renderer/Renderer.d.ts +0 -6
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +0 -29
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
- package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
- package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
- package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
- package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
- package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
- package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
- package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
- package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
- package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
- package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
- package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
- package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
- package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
- package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
- package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
- package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
- package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
- package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +5 -3
- package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
- package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
- package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
- package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
- package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
- package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
- package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
- package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
- package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
- package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
- package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
- package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
- package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
- package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
- package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
- package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
- package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
- package/src/shade/renderer/scene/Mesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/Mesh.js +4 -6
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
- package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +14 -17
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +16 -7
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1342 -1326
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts +13 -0
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/Shadowmap.js +14 -0
- package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts +79 -0
- package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.js +196 -0
- package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts +91 -0
- package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/ShadowmapRegistry.js +156 -0
- package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
- package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
- package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
- package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
- package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
- package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
- package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
- package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
- package/src/shade/wgsl/validate_wgsl_source.js +8 -3
- package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
- package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
- package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
- package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
- package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
- package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
|
@@ -7,10 +7,12 @@ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourc
|
|
|
7
7
|
|
|
8
8
|
const resources = new ShaderResourceSetDescriptor();
|
|
9
9
|
|
|
10
|
+
// per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
|
|
11
|
+
resources.setImmediate("size", u32);
|
|
12
|
+
|
|
10
13
|
resources.createGroup()
|
|
11
14
|
.addStorageBuffer("source", WebGPUArray.u32)
|
|
12
15
|
.addStorageBuffer("destination", WebGPUArray.u32, true)
|
|
13
|
-
.addUniform("size", u32)
|
|
14
16
|
|
|
15
17
|
const body = CodeChunk.from(
|
|
16
18
|
//language=WGSL
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_tonemap_HDR.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/deferred/shader_tonemap_HDR.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_tonemap_HDR.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/deferred/shader_tonemap_HDR.js"],"names":[],"mappings":"AA8DA,6CAYG;4BAlEyB,0BAA0B"}
|
|
@@ -16,9 +16,12 @@ const SETTINGS_STRUCT = WebGPUStruct.from({
|
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
const resources = new ShaderResourceSetDescriptor();
|
|
19
|
+
|
|
20
|
+
// per-pass, eight bytes, read-only: immediate data rather than a uniform buffer. exposure stays
|
|
21
|
+
// bound - it is computed on the GPU, so there is no CPU value to write.
|
|
22
|
+
resources.setImmediate("settings", SETTINGS_STRUCT);
|
|
19
23
|
resources.createGroup()
|
|
20
24
|
.addTexture("input_color", "float")
|
|
21
|
-
.addUniform("settings", SETTINGS_STRUCT)
|
|
22
25
|
.addUniform("exposure", F32_CONTAINER_STRUCT)
|
|
23
26
|
|
|
24
27
|
const body = CodeChunk.from(
|
|
@@ -42,12 +42,12 @@ export class GPUDynamicMeshResidency {
|
|
|
42
42
|
*/
|
|
43
43
|
create_bindings(encoder: ShadeGPUCommandContext, mesh: DynamicMesh, camera: GPUBuffer): any[];
|
|
44
44
|
/**
|
|
45
|
-
* @param {
|
|
45
|
+
* @param {ShadeGPURenderPassEncoder} render_pass
|
|
46
46
|
* @param {GraphicsContext} graphics
|
|
47
47
|
* @param {RenderPipelineDescriptor} pipeline
|
|
48
48
|
* @param {Array} bindings from {@link create_bindings}
|
|
49
49
|
*/
|
|
50
|
-
draw(render_pass:
|
|
50
|
+
draw(render_pass: ShadeGPURenderPassEncoder, graphics: GraphicsContext, pipeline: RenderPipelineDescriptor, bindings: any[]): void;
|
|
51
51
|
destroy(): void;
|
|
52
52
|
#private;
|
|
53
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUDynamicMeshResidency.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/dynamic/GPUDynamicMeshResidency.js"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH;IAuBI;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,SAFU,MAAM,CAEH;IAEb;;;;;OAKG;IACH,kCAJW,YAAY,sBACZ,MAAM,WACN,WAAW,QAoCrB;IAED;;;;;;;;;;;;;;;OAeG;IACH,8FAYC;IAED;;;;;OAKG;IACH,
|
|
1
|
+
{"version":3,"file":"GPUDynamicMeshResidency.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/dynamic/GPUDynamicMeshResidency.js"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH;IAuBI;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,SAFU,MAAM,CAEH;IAEb;;;;;OAKG;IACH,kCAJW,YAAY,sBACZ,MAAM,WACN,WAAW,QAoCrB;IAED;;;;;;;;;;;;;;;OAeG;IACH,8FAYC;IAED;;;;;OAKG;IACH,mIAIC;IAED,gBAcC;;CACJ"}
|
|
@@ -1,167 +1,167 @@
|
|
|
1
|
-
import { round_up } from "../../../core/math/round_up.js";
|
|
2
|
-
import { DYNAMIC_MESH_DRAW_STRUCT, DYNAMIC_MESH_RESOURCES } from "./shader_dynamic_mesh.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Growth factor for the vertex and index buffers.
|
|
6
|
-
*
|
|
7
|
-
* Dynamic geometry changes size constantly — a trail lengthens as it is emitted and shortens as it
|
|
8
|
-
* expires — so buffers are grown with headroom and never shrunk. Sizing exactly would mean
|
|
9
|
-
* reallocating on almost every frame for content whose whole purpose is to change.
|
|
10
|
-
*
|
|
11
|
-
* @type {number}
|
|
12
|
-
*/
|
|
13
|
-
const GROWTH_FACTOR = 1.5;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Storage buffers are bound by size, and a binding's size has to be a multiple of 4 — so a grown
|
|
17
|
-
* capacity is rounded up rather than taken as the growth factor leaves it. Without this, a buffer
|
|
18
|
-
* whose contents happen to land on the wrong number of bytes is rejected at bind time: 36 bytes of
|
|
19
|
-
* indices grown by 1.5 gives 54, which is not a legal binding size.
|
|
20
|
-
*
|
|
21
|
-
* @type {number}
|
|
22
|
-
*/
|
|
23
|
-
const BUFFER_SIZE_ALIGNMENT = 4;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* What one {@link Geometry} owns on the GPU while it is being drawn by the dynamic path.
|
|
27
|
-
*
|
|
28
|
-
* Keyed on the geometry rather than on the mesh or on batch membership, so an effect that is hidden
|
|
29
|
-
* for a frame, or removed and re-added, does not pay for its buffers again.
|
|
30
|
-
*/
|
|
31
|
-
export class GPUDynamicMeshResidency {
|
|
32
|
-
/**
|
|
33
|
-
* Interleaved vertices, laid out per {@link DYNAMIC_MESH_VERTEX_STRIDE}.
|
|
34
|
-
*
|
|
35
|
-
* @type {GPUBuffer|null}
|
|
36
|
-
*/
|
|
37
|
-
#vertices = null;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* @type {number} capacity in bytes
|
|
41
|
-
*/
|
|
42
|
-
#vertices_capacity = 0;
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* @type {GPUBuffer|null}
|
|
46
|
-
*/
|
|
47
|
-
#indices = null;
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* @type {number} capacity in bytes
|
|
51
|
-
*/
|
|
52
|
-
#indices_capacity = 0;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* How many indices to draw — the count from the last upload, not the buffer's capacity.
|
|
56
|
-
*
|
|
57
|
-
* @type {number}
|
|
58
|
-
*/
|
|
59
|
-
index_count = 0;
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* The {@link Geometry.version} this was uploaded from.
|
|
63
|
-
*
|
|
64
|
-
* @type {number}
|
|
65
|
-
*/
|
|
66
|
-
version = -1;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* @param {GPUDevice} device
|
|
70
|
-
* @param {Float32Array} staging interleaved vertices, valid up to `vertex_float_count`
|
|
71
|
-
* @param {number} vertex_float_count
|
|
72
|
-
* @param {Uint32Array} indices
|
|
73
|
-
*/
|
|
74
|
-
write(device, staging, vertex_float_count, indices) {
|
|
75
|
-
const vertex_bytes = vertex_float_count * 4;
|
|
76
|
-
const index_bytes = indices.length * 4;
|
|
77
|
-
|
|
78
|
-
if (this.#vertices_capacity < vertex_bytes) {
|
|
79
|
-
if (this.#vertices !== null) {
|
|
80
|
-
this.#vertices.destroy();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
this.#vertices_capacity = round_up(Math.ceil(vertex_bytes * GROWTH_FACTOR), BUFFER_SIZE_ALIGNMENT);
|
|
84
|
-
this.#vertices = device.createBuffer({
|
|
85
|
-
size: this.#vertices_capacity,
|
|
86
|
-
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
87
|
-
label: "DynamicMesh/vertices",
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (this.#indices_capacity < index_bytes) {
|
|
92
|
-
if (this.#indices !== null) {
|
|
93
|
-
this.#indices.destroy();
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
this.#indices_capacity = round_up(Math.ceil(index_bytes * GROWTH_FACTOR), BUFFER_SIZE_ALIGNMENT);
|
|
97
|
-
this.#indices = device.createBuffer({
|
|
98
|
-
size: this.#indices_capacity,
|
|
99
|
-
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
100
|
-
label: "DynamicMesh/indices",
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
device.queue.writeBuffer(this.#vertices, 0, staging.buffer, staging.byteOffset, vertex_bytes);
|
|
105
|
-
device.queue.writeBuffer(this.#indices, 0, indices.buffer, indices.byteOffset, index_bytes);
|
|
106
|
-
|
|
107
|
-
this.index_count = indices.length;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Build this mesh's bind groups for the frame.
|
|
112
|
-
*
|
|
113
|
-
* **Must be called before the render pass is opened.** The per-draw constants are staged through
|
|
114
|
-
* a transient buffer, and staging records a copy onto the command encoder — which WebGPU locks
|
|
115
|
-
* for as long as a pass is open on it. Doing this lazily at draw time is the obvious shape and
|
|
116
|
-
* an invalid one.
|
|
117
|
-
*
|
|
118
|
-
* The constants are transient because one mesh is one draw and its transform and colour are
|
|
119
|
-
* expected to differ every frame, so there is nothing worth keeping between them.
|
|
120
|
-
*
|
|
121
|
-
* @param {ShadeGPUCommandContext} encoder
|
|
122
|
-
* @param {DynamicMesh} mesh
|
|
123
|
-
* @param {GPUBuffer} camera
|
|
124
|
-
* @returns {Array} bind groups, for {@link draw}
|
|
125
|
-
*/
|
|
126
|
-
create_bindings(encoder, mesh, camera) {
|
|
127
|
-
const draw_buffer = encoder.allocateTransientValueBuffer(DYNAMIC_MESH_DRAW_STRUCT, {
|
|
128
|
-
model: mesh.transform_global,
|
|
129
|
-
color: mesh.color,
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
return DYNAMIC_MESH_RESOURCES.generateBindings({
|
|
133
|
-
camera,
|
|
134
|
-
draw: draw_buffer,
|
|
135
|
-
vertices: this.#vertices,
|
|
136
|
-
indices: this.#indices,
|
|
137
|
-
}, encoder);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* @param {
|
|
142
|
-
* @param {GraphicsContext} graphics
|
|
143
|
-
* @param {RenderPipelineDescriptor} pipeline
|
|
144
|
-
* @param {Array} bindings from {@link create_bindings}
|
|
145
|
-
*/
|
|
146
|
-
draw(render_pass, graphics, pipeline, bindings) {
|
|
147
|
-
graphics.setPipelineBindings(render_pass, pipeline, bindings);
|
|
148
|
-
|
|
149
|
-
render_pass.draw(this.index_count);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
destroy() {
|
|
153
|
-
if (this.#vertices !== null) {
|
|
154
|
-
this.#vertices.destroy();
|
|
155
|
-
this.#vertices = null;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (this.#indices !== null) {
|
|
159
|
-
this.#indices.destroy();
|
|
160
|
-
this.#indices = null;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
this.#vertices_capacity = 0;
|
|
164
|
-
this.#indices_capacity = 0;
|
|
165
|
-
this.index_count = 0;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
1
|
+
import { round_up } from "../../../core/math/round_up.js";
|
|
2
|
+
import { DYNAMIC_MESH_DRAW_STRUCT, DYNAMIC_MESH_RESOURCES } from "./shader_dynamic_mesh.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Growth factor for the vertex and index buffers.
|
|
6
|
+
*
|
|
7
|
+
* Dynamic geometry changes size constantly — a trail lengthens as it is emitted and shortens as it
|
|
8
|
+
* expires — so buffers are grown with headroom and never shrunk. Sizing exactly would mean
|
|
9
|
+
* reallocating on almost every frame for content whose whole purpose is to change.
|
|
10
|
+
*
|
|
11
|
+
* @type {number}
|
|
12
|
+
*/
|
|
13
|
+
const GROWTH_FACTOR = 1.5;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Storage buffers are bound by size, and a binding's size has to be a multiple of 4 — so a grown
|
|
17
|
+
* capacity is rounded up rather than taken as the growth factor leaves it. Without this, a buffer
|
|
18
|
+
* whose contents happen to land on the wrong number of bytes is rejected at bind time: 36 bytes of
|
|
19
|
+
* indices grown by 1.5 gives 54, which is not a legal binding size.
|
|
20
|
+
*
|
|
21
|
+
* @type {number}
|
|
22
|
+
*/
|
|
23
|
+
const BUFFER_SIZE_ALIGNMENT = 4;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* What one {@link Geometry} owns on the GPU while it is being drawn by the dynamic path.
|
|
27
|
+
*
|
|
28
|
+
* Keyed on the geometry rather than on the mesh or on batch membership, so an effect that is hidden
|
|
29
|
+
* for a frame, or removed and re-added, does not pay for its buffers again.
|
|
30
|
+
*/
|
|
31
|
+
export class GPUDynamicMeshResidency {
|
|
32
|
+
/**
|
|
33
|
+
* Interleaved vertices, laid out per {@link DYNAMIC_MESH_VERTEX_STRIDE}.
|
|
34
|
+
*
|
|
35
|
+
* @type {GPUBuffer|null}
|
|
36
|
+
*/
|
|
37
|
+
#vertices = null;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @type {number} capacity in bytes
|
|
41
|
+
*/
|
|
42
|
+
#vertices_capacity = 0;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @type {GPUBuffer|null}
|
|
46
|
+
*/
|
|
47
|
+
#indices = null;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @type {number} capacity in bytes
|
|
51
|
+
*/
|
|
52
|
+
#indices_capacity = 0;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* How many indices to draw — the count from the last upload, not the buffer's capacity.
|
|
56
|
+
*
|
|
57
|
+
* @type {number}
|
|
58
|
+
*/
|
|
59
|
+
index_count = 0;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The {@link Geometry.version} this was uploaded from.
|
|
63
|
+
*
|
|
64
|
+
* @type {number}
|
|
65
|
+
*/
|
|
66
|
+
version = -1;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @param {GPUDevice} device
|
|
70
|
+
* @param {Float32Array} staging interleaved vertices, valid up to `vertex_float_count`
|
|
71
|
+
* @param {number} vertex_float_count
|
|
72
|
+
* @param {Uint32Array} indices
|
|
73
|
+
*/
|
|
74
|
+
write(device, staging, vertex_float_count, indices) {
|
|
75
|
+
const vertex_bytes = vertex_float_count * 4;
|
|
76
|
+
const index_bytes = indices.length * 4;
|
|
77
|
+
|
|
78
|
+
if (this.#vertices_capacity < vertex_bytes) {
|
|
79
|
+
if (this.#vertices !== null) {
|
|
80
|
+
this.#vertices.destroy();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
this.#vertices_capacity = round_up(Math.ceil(vertex_bytes * GROWTH_FACTOR), BUFFER_SIZE_ALIGNMENT);
|
|
84
|
+
this.#vertices = device.createBuffer({
|
|
85
|
+
size: this.#vertices_capacity,
|
|
86
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
87
|
+
label: "DynamicMesh/vertices",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (this.#indices_capacity < index_bytes) {
|
|
92
|
+
if (this.#indices !== null) {
|
|
93
|
+
this.#indices.destroy();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
this.#indices_capacity = round_up(Math.ceil(index_bytes * GROWTH_FACTOR), BUFFER_SIZE_ALIGNMENT);
|
|
97
|
+
this.#indices = device.createBuffer({
|
|
98
|
+
size: this.#indices_capacity,
|
|
99
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
100
|
+
label: "DynamicMesh/indices",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
device.queue.writeBuffer(this.#vertices, 0, staging.buffer, staging.byteOffset, vertex_bytes);
|
|
105
|
+
device.queue.writeBuffer(this.#indices, 0, indices.buffer, indices.byteOffset, index_bytes);
|
|
106
|
+
|
|
107
|
+
this.index_count = indices.length;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Build this mesh's bind groups for the frame.
|
|
112
|
+
*
|
|
113
|
+
* **Must be called before the render pass is opened.** The per-draw constants are staged through
|
|
114
|
+
* a transient buffer, and staging records a copy onto the command encoder — which WebGPU locks
|
|
115
|
+
* for as long as a pass is open on it. Doing this lazily at draw time is the obvious shape and
|
|
116
|
+
* an invalid one.
|
|
117
|
+
*
|
|
118
|
+
* The constants are transient because one mesh is one draw and its transform and colour are
|
|
119
|
+
* expected to differ every frame, so there is nothing worth keeping between them.
|
|
120
|
+
*
|
|
121
|
+
* @param {ShadeGPUCommandContext} encoder
|
|
122
|
+
* @param {DynamicMesh} mesh
|
|
123
|
+
* @param {GPUBuffer} camera
|
|
124
|
+
* @returns {Array} bind groups, for {@link draw}
|
|
125
|
+
*/
|
|
126
|
+
create_bindings(encoder, mesh, camera) {
|
|
127
|
+
const draw_buffer = encoder.allocateTransientValueBuffer(DYNAMIC_MESH_DRAW_STRUCT, {
|
|
128
|
+
model: mesh.transform_global,
|
|
129
|
+
color: mesh.color,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
return DYNAMIC_MESH_RESOURCES.generateBindings({
|
|
133
|
+
camera,
|
|
134
|
+
draw: draw_buffer,
|
|
135
|
+
vertices: this.#vertices,
|
|
136
|
+
indices: this.#indices,
|
|
137
|
+
}, encoder);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @param {ShadeGPURenderPassEncoder} render_pass
|
|
142
|
+
* @param {GraphicsContext} graphics
|
|
143
|
+
* @param {RenderPipelineDescriptor} pipeline
|
|
144
|
+
* @param {Array} bindings from {@link create_bindings}
|
|
145
|
+
*/
|
|
146
|
+
draw(render_pass, graphics, pipeline, bindings) {
|
|
147
|
+
graphics.setPipelineBindings(render_pass, pipeline, bindings);
|
|
148
|
+
|
|
149
|
+
render_pass.draw(this.index_count);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
destroy() {
|
|
153
|
+
if (this.#vertices !== null) {
|
|
154
|
+
this.#vertices.destroy();
|
|
155
|
+
this.#vertices = null;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (this.#indices !== null) {
|
|
159
|
+
this.#indices.destroy();
|
|
160
|
+
this.#indices = null;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
this.#vertices_capacity = 0;
|
|
164
|
+
this.#indices_capacity = 0;
|
|
165
|
+
this.index_count = 0;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -2,7 +2,7 @@ import { assert } from "../../../core/assert.js";
|
|
|
2
2
|
import { TextureDescriptor } from "../../descriptor/texture/TextureDescriptor.js";
|
|
3
3
|
import { TextureViewDescriptor } from "../../descriptor/texture/TextureViewDescriptor.js";
|
|
4
4
|
import { SAMPLER_LINEAR_UPSCALE } from "../texture/SAMPLER_LINEAR_UPSCALE.js";
|
|
5
|
-
import {
|
|
5
|
+
import { shader_fog_of_war } from "./shader_fog_of_war.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Composites fog of war over the frame.
|
|
@@ -95,12 +95,12 @@ export class GPUFogOfWarRenderer {
|
|
|
95
95
|
|
|
96
96
|
const mask = this.#obtain_mask(graphics, field);
|
|
97
97
|
|
|
98
|
-
const fog =
|
|
98
|
+
const fog = {
|
|
99
99
|
uv_transform: field.uv_transform,
|
|
100
100
|
color: field.color,
|
|
101
101
|
resolution: [field.sampler.width, field.sampler.height],
|
|
102
102
|
edge_extend: field.edge_extend
|
|
103
|
-
}
|
|
103
|
+
};
|
|
104
104
|
|
|
105
105
|
shader_fog_of_war.draw({
|
|
106
106
|
encoder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_fog_of_war.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/fow/shader_fog_of_war.js"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,6CAqBsB;
|
|
1
|
+
{"version":3,"file":"shader_fog_of_war.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/fow/shader_fog_of_war.js"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,6CAqBsB;AA4KtB;;;;;;;;;;;GAWG;AACH,gCAFU,WAAW,CA0BlB;AAEH;;;;GAIG;AACH,mCAFU,2BAA2B,CAES;6BAlPjB,gCAAgC;4BAJjC,0BAA0B;4CACV,mDAAmD"}
|
|
@@ -43,9 +43,11 @@ export const FOG_OF_WAR_STRUCT = WebGPUStruct.from({
|
|
|
43
43
|
|
|
44
44
|
const resources = new ShaderResourceSetDescriptor();
|
|
45
45
|
|
|
46
|
+
// per-draw, 48 bytes, read-only: immediate data rather than a uniform buffer
|
|
47
|
+
resources.setImmediate("fog", FOG_OF_WAR_STRUCT);
|
|
48
|
+
|
|
46
49
|
resources.createGroup()
|
|
47
50
|
.addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
48
|
-
.addUniform("fog", FOG_OF_WAR_STRUCT)
|
|
49
51
|
// as an unfilterable float and read with `.r`, which is how every depth-reading pass in the
|
|
50
52
|
// engine binds the depth buffer
|
|
51
53
|
.addTexture("tDepth")
|
|
@@ -1,102 +1,102 @@
|
|
|
1
|
-
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import {
|
|
3
|
-
import { shader_bvh_refit } from "../../gpu_primitive/bvh/shader_bvh_refit.js";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Bring a BLAS's bounds back in line with vertices that have moved, leaving its shape alone.
|
|
8
|
-
*
|
|
9
|
-
* Two dispatches. The first rewrites every leaf's box from the triangle it names, as the vertex
|
|
10
|
-
* buffer holds it now; the second carries those boxes up the tree. Nothing is sorted, nothing is
|
|
11
|
-
* emitted, and no node's children change — which is the entire reason this is worth having next to
|
|
12
|
-
* a full build. A skinned mesh does it every frame.
|
|
13
|
-
*
|
|
14
|
-
* The caller supplies the *owner* rather than a tree, and this asks the manager where that owner's
|
|
15
|
-
* tree lives. Nothing here knows what a clone is, or that skinning is why the vertices moved.
|
|
16
|
-
*
|
|
17
|
-
* Silently does nothing when the owner has no resident tree — a geometry can reach a frame before
|
|
18
|
-
* its BLAS has been uploaded, and "there is nothing to refit yet" is an ordinary state rather than
|
|
19
|
-
* a failure.
|
|
20
|
-
*
|
|
21
|
-
* @param {ShadeGPUCommandContext} cmd
|
|
22
|
-
* @param {GPUGeometryBVHManager} blas tree residency — arenas for nodes, parents and leaf lists
|
|
23
|
-
* @param {GPUGeometryManager} geometries geometry metadata table the leaf pass reads vertices through
|
|
24
|
-
* @param {object} owner identity the tree was registered under, per {@link GPUGeometryBVHManager#obtain}
|
|
25
|
-
* @param {number} geometry_index row in the geometry table whose vertices the bounds come from —
|
|
26
|
-
* for a skinned mesh, the clone that skinning deformed, not the source holding the rest pose
|
|
27
|
-
* @returns {boolean} whether anything was recorded
|
|
28
|
-
*/
|
|
29
|
-
export function record_blas_refit(cmd, { blas, geometries, owner, geometry_index }) {
|
|
30
|
-
assert.defined(cmd, 'cmd');
|
|
31
|
-
assert.defined(blas, 'blas');
|
|
32
|
-
assert.defined(geometries, 'geometries');
|
|
33
|
-
assert.defined(owner, 'owner');
|
|
34
|
-
assert.isNonNegativeInteger(geometry_index, 'geometry_index');
|
|
35
|
-
|
|
36
|
-
const target = blas.get_refit_target(owner);
|
|
37
|
-
|
|
38
|
-
if (target === undefined) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const { node_word_offset, node_count, leaf_count, parents_offset, leaf_nodes_offset } = target;
|
|
43
|
-
|
|
44
|
-
if (leaf_count === 0) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const meshlets = geometries.meshlets;
|
|
49
|
-
|
|
50
|
-
// ── 1. Leaf bounds: one thread per leaf, straight from the vertex buffer ──
|
|
51
|
-
shader_blas_refit_leaf_bounds.dispatchThreads({
|
|
52
|
-
encoder: cmd,
|
|
53
|
-
thread_count_x: leaf_count,
|
|
54
|
-
bindings: {
|
|
55
|
-
settings:
|
|
56
|
-
leaf_count,
|
|
57
|
-
node_word_offset,
|
|
58
|
-
leaf_nodes_offset,
|
|
59
|
-
geometry_index,
|
|
60
|
-
}
|
|
61
|
-
leaf_nodes: blas.buffer_leaf_nodes,
|
|
62
|
-
geometries: geometries.buffer_metadata,
|
|
63
|
-
meshlet_metadata: meshlets.buffer_metadata,
|
|
64
|
-
meshlet_data: meshlets.buffer_data,
|
|
65
|
-
nodes: blas.buffer_data,
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
// ── 2. Climb: arrival counters carry the new boxes to the root ──
|
|
70
|
-
//
|
|
71
|
-
// One counter per node of this tree, and every one of them has to start at zero: a leftover
|
|
72
|
-
// count lets a first arrival believe it is a second and fit a node from a sibling nothing has
|
|
73
|
-
// written yet. The transient allocator pools its buffers, so whatever comes back is carrying
|
|
74
|
-
// the last frame's counts and gets cleared. Sized by node rather than by leaf because the
|
|
75
|
-
// counters are indexed by node id, and a tree read off an arena has holes in that numbering.
|
|
76
|
-
const counters_size = Math.max(1, node_count) * Uint32Array.BYTES_PER_ELEMENT;
|
|
77
|
-
|
|
78
|
-
const counters = cmd.allocateTransientBuffer(GPUBufferUsage.STORAGE, counters_size);
|
|
79
|
-
|
|
80
|
-
cmd.clearBuffer(counters, 0, counters_size);
|
|
81
|
-
|
|
82
|
-
shader_bvh_refit.dispatchThreads({
|
|
83
|
-
encoder: cmd,
|
|
84
|
-
thread_count_x: leaf_count,
|
|
85
|
-
bindings: {
|
|
86
|
-
settings:
|
|
87
|
-
element_count: leaf_count,
|
|
88
|
-
node_word_offset,
|
|
89
|
-
// a BLAS has no header — its root is node 0 by convention
|
|
90
|
-
root_word_offset: BVH_NO_ROOT_WORD,
|
|
91
|
-
parents_offset,
|
|
92
|
-
leaf_nodes_offset,
|
|
93
|
-
}
|
|
94
|
-
parents: blas.buffer_parents,
|
|
95
|
-
leaf_nodes: blas.buffer_leaf_nodes,
|
|
96
|
-
counters,
|
|
97
|
-
nodes: blas.buffer_data,
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { BVH_NO_ROOT_WORD } from "../../gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js";
|
|
3
|
+
import { shader_bvh_refit } from "../../gpu_primitive/bvh/shader_bvh_refit.js";
|
|
4
|
+
import { shader_blas_refit_leaf_bounds } from "./shader_blas_refit_leaf_bounds.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Bring a BLAS's bounds back in line with vertices that have moved, leaving its shape alone.
|
|
8
|
+
*
|
|
9
|
+
* Two dispatches. The first rewrites every leaf's box from the triangle it names, as the vertex
|
|
10
|
+
* buffer holds it now; the second carries those boxes up the tree. Nothing is sorted, nothing is
|
|
11
|
+
* emitted, and no node's children change — which is the entire reason this is worth having next to
|
|
12
|
+
* a full build. A skinned mesh does it every frame.
|
|
13
|
+
*
|
|
14
|
+
* The caller supplies the *owner* rather than a tree, and this asks the manager where that owner's
|
|
15
|
+
* tree lives. Nothing here knows what a clone is, or that skinning is why the vertices moved.
|
|
16
|
+
*
|
|
17
|
+
* Silently does nothing when the owner has no resident tree — a geometry can reach a frame before
|
|
18
|
+
* its BLAS has been uploaded, and "there is nothing to refit yet" is an ordinary state rather than
|
|
19
|
+
* a failure.
|
|
20
|
+
*
|
|
21
|
+
* @param {ShadeGPUCommandContext} cmd
|
|
22
|
+
* @param {GPUGeometryBVHManager} blas tree residency — arenas for nodes, parents and leaf lists
|
|
23
|
+
* @param {GPUGeometryManager} geometries geometry metadata table the leaf pass reads vertices through
|
|
24
|
+
* @param {object} owner identity the tree was registered under, per {@link GPUGeometryBVHManager#obtain}
|
|
25
|
+
* @param {number} geometry_index row in the geometry table whose vertices the bounds come from —
|
|
26
|
+
* for a skinned mesh, the clone that skinning deformed, not the source holding the rest pose
|
|
27
|
+
* @returns {boolean} whether anything was recorded
|
|
28
|
+
*/
|
|
29
|
+
export function record_blas_refit(cmd, { blas, geometries, owner, geometry_index }) {
|
|
30
|
+
assert.defined(cmd, 'cmd');
|
|
31
|
+
assert.defined(blas, 'blas');
|
|
32
|
+
assert.defined(geometries, 'geometries');
|
|
33
|
+
assert.defined(owner, 'owner');
|
|
34
|
+
assert.isNonNegativeInteger(geometry_index, 'geometry_index');
|
|
35
|
+
|
|
36
|
+
const target = blas.get_refit_target(owner);
|
|
37
|
+
|
|
38
|
+
if (target === undefined) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const { node_word_offset, node_count, leaf_count, parents_offset, leaf_nodes_offset } = target;
|
|
43
|
+
|
|
44
|
+
if (leaf_count === 0) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const meshlets = geometries.meshlets;
|
|
49
|
+
|
|
50
|
+
// ── 1. Leaf bounds: one thread per leaf, straight from the vertex buffer ──
|
|
51
|
+
shader_blas_refit_leaf_bounds.dispatchThreads({
|
|
52
|
+
encoder: cmd,
|
|
53
|
+
thread_count_x: leaf_count,
|
|
54
|
+
bindings: {
|
|
55
|
+
settings: {
|
|
56
|
+
leaf_count,
|
|
57
|
+
node_word_offset,
|
|
58
|
+
leaf_nodes_offset,
|
|
59
|
+
geometry_index,
|
|
60
|
+
},
|
|
61
|
+
leaf_nodes: blas.buffer_leaf_nodes,
|
|
62
|
+
geometries: geometries.buffer_metadata,
|
|
63
|
+
meshlet_metadata: meshlets.buffer_metadata,
|
|
64
|
+
meshlet_data: meshlets.buffer_data,
|
|
65
|
+
nodes: blas.buffer_data,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// ── 2. Climb: arrival counters carry the new boxes to the root ──
|
|
70
|
+
//
|
|
71
|
+
// One counter per node of this tree, and every one of them has to start at zero: a leftover
|
|
72
|
+
// count lets a first arrival believe it is a second and fit a node from a sibling nothing has
|
|
73
|
+
// written yet. The transient allocator pools its buffers, so whatever comes back is carrying
|
|
74
|
+
// the last frame's counts and gets cleared. Sized by node rather than by leaf because the
|
|
75
|
+
// counters are indexed by node id, and a tree read off an arena has holes in that numbering.
|
|
76
|
+
const counters_size = Math.max(1, node_count) * Uint32Array.BYTES_PER_ELEMENT;
|
|
77
|
+
|
|
78
|
+
const counters = cmd.allocateTransientBuffer(GPUBufferUsage.STORAGE, counters_size);
|
|
79
|
+
|
|
80
|
+
cmd.clearBuffer(counters, 0, counters_size);
|
|
81
|
+
|
|
82
|
+
shader_bvh_refit.dispatchThreads({
|
|
83
|
+
encoder: cmd,
|
|
84
|
+
thread_count_x: leaf_count,
|
|
85
|
+
bindings: {
|
|
86
|
+
settings: {
|
|
87
|
+
element_count: leaf_count,
|
|
88
|
+
node_word_offset,
|
|
89
|
+
// a BLAS has no header — its root is node 0 by convention
|
|
90
|
+
root_word_offset: BVH_NO_ROOT_WORD,
|
|
91
|
+
parents_offset,
|
|
92
|
+
leaf_nodes_offset,
|
|
93
|
+
},
|
|
94
|
+
parents: blas.buffer_parents,
|
|
95
|
+
leaf_nodes: blas.buffer_leaf_nodes,
|
|
96
|
+
counters,
|
|
97
|
+
nodes: blas.buffer_data,
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_blas_refit_leaf_bounds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js"],"names":[],"mappings":"AAkBA,iDAAkD;AAElD;;;;GAIG;AACH,+CAFU,YAAY,CAqBO;
|
|
1
|
+
{"version":3,"file":"shader_blas_refit_leaf_bounds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js"],"names":[],"mappings":"AAkBA,iDAAkD;AAElD;;;;GAIG;AACH,+CAFU,YAAY,CAqBO;AAyD7B;;;;;;;;;;;;;;;;;;GAkBG;AACH,4CAFU,aAAa,CAMpB;6BA1H0B,mCAAmC;8BAElC,+BAA+B"}
|