@woosh/meep-engine 3.12.0 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- 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 +750 -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/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.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +14 -18
- 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
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@ import { TextureFilterType } from "../../../shade/renderer/texture/TextureFilter
|
|
|
10
10
|
import { SAMPLER_LINEAR_UPSCALE } from "../../../shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js";
|
|
11
11
|
import { graph_build_decal_clusters } from "./graph_build_decal_clusters.js";
|
|
12
12
|
import { DECAL_RECORD_WORD_COUNT } from "./DECAL_GPU_RECORD.js";
|
|
13
|
-
import {
|
|
13
|
+
import { shader_decal_composite } from "./shader_decal_composite.js";
|
|
14
14
|
import { build_light_cluster_parameters } from "../../../shade/renderer/light/cluster/build_light_cluster_parameters.js";
|
|
15
15
|
import { DECAL_CLUSTER_RESOLUTION_Z } from "./DECAL_CLUSTER.js";
|
|
16
16
|
|
|
@@ -190,12 +190,12 @@ export class GPUDecalRenderer {
|
|
|
190
190
|
const encoder = context.encoder;
|
|
191
191
|
const graphics = context.graphics;
|
|
192
192
|
|
|
193
|
-
const settings =
|
|
193
|
+
const settings = {
|
|
194
194
|
cluster_params,
|
|
195
195
|
screen_resolution: resolution,
|
|
196
196
|
distance_min: camera.camera.near,
|
|
197
197
|
distance_max: camera.camera.far,
|
|
198
|
-
}
|
|
198
|
+
};
|
|
199
199
|
|
|
200
200
|
const sampler = graphics.samplers.obtain(SAMPLER_LINEAR_UPSCALE);
|
|
201
201
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_decal_composite.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/shader_decal_composite.js"],"names":[],"mappings":"AA8DA,oDAKG;
|
|
1
|
+
{"version":3,"file":"shader_decal_composite.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/shader_decal_composite.js"],"names":[],"mappings":"AA8DA,oDAKG;AAqSH;;;;;;;;;;;;GAYG;AACH,qCAFU,WAAW,CAclB;6BAtV0B,qDAAqD;4BAPtD,+CAA+C"}
|
|
@@ -69,9 +69,11 @@ export const DECAL_COMPOSITE_SETTINGS = WebGPUStruct.from({
|
|
|
69
69
|
|
|
70
70
|
const resources = new ShaderResourceSetDescriptor();
|
|
71
71
|
|
|
72
|
+
// per-draw, 32 bytes, read-only: immediate data rather than a uniform buffer. camera stays bound.
|
|
73
|
+
resources.setImmediate("settings", DECAL_COMPOSITE_SETTINGS);
|
|
74
|
+
|
|
72
75
|
resources.createGroup()
|
|
73
|
-
.addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
74
|
-
.addUniform("settings", DECAL_COMPOSITE_SETTINGS);
|
|
76
|
+
.addUniform("camera", CAMERA_UNIFORM_STRUCT);
|
|
75
77
|
|
|
76
78
|
/*
|
|
77
79
|
The two integer targets are declared as such, exactly as `shader_deferred_main` declares the same
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUHighlightRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/highlight/GPUHighlightRenderer.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUHighlightRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/highlight/GPUHighlightRenderer.js"],"names":[],"mappings":"AAiBA;;;;;;GAMG;AACH;IAWI;;;;;;;;;OASG;IACH;QAN8B,KAAK;QACN,KAAK,EAAvB,WAAW;QACE,UAAU,EAAvB,MAAM;QACO,SAAS,EAAtB,MAAM;QACJ,MAAM,CA+BlB;IAmED,gBAOC;;CACJ"}
|
|
@@ -3,7 +3,6 @@ import { round_up } from "../../../core/math/round_up.js";
|
|
|
3
3
|
import { SceneColor } from "../../../shade/renderer/extension/SceneColor.js";
|
|
4
4
|
import { ViewTextures } from "../../../shade/renderer/extension/ViewTextures.js";
|
|
5
5
|
import {
|
|
6
|
-
HIGHLIGHT_OUTLINE_SETTINGS,
|
|
7
6
|
shader_highlight_outline
|
|
8
7
|
} from "./shader_highlight_outline.js";
|
|
9
8
|
|
|
@@ -88,11 +87,11 @@ export class GPUHighlightRenderer {
|
|
|
88
87
|
|
|
89
88
|
const color = resources.get(data.color);
|
|
90
89
|
|
|
91
|
-
const settings =
|
|
90
|
+
const settings = {
|
|
92
91
|
screen_resolution: resolution,
|
|
93
92
|
table_size,
|
|
94
93
|
thickness
|
|
95
|
-
}
|
|
94
|
+
};
|
|
96
95
|
|
|
97
96
|
shader_highlight_outline.draw({
|
|
98
97
|
encoder,
|
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
import { BlendState } from "../../../shade/descriptor/blend/BlendState.js";
|
|
2
|
-
import { CodeChunk } from "../../../shade/renderer/shader/compiler/CodeChunk.js";
|
|
3
|
-
import { ImageShader } from "../../../shade/renderer/shader/ImageShader.js";
|
|
4
|
-
import {
|
|
5
|
-
ShaderResourceSetDescriptor
|
|
6
|
-
} from "../../../shade/renderer/shader/resource/ShaderResourceSetDescriptor.js";
|
|
7
|
-
import { ShaderDescriptor } from "../../../shade/renderer/shader/ShaderDescriptor.js";
|
|
8
|
-
import { f32, u32, vec2u } from "../../../shade/renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
9
|
-
import { WebGPUArray } from "../../../shade/renderer/shader/type/WebGPUArray.js";
|
|
10
|
-
import { WebGPUStruct } from "../../../shade/renderer/shader/type/WebGPUStruct.js";
|
|
11
|
-
import { chunk_highlight_lookup } from "./chunk_highlight_lookup.js";
|
|
12
|
-
|
|
13
|
-
export const HIGHLIGHT_OUTLINE_SETTINGS = WebGPUStruct.from({
|
|
14
|
-
screen_resolution: vec2u,
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* How many rows the lookup table has, which is one past the highest mesh row that was
|
|
18
|
-
* highlighted when it was packed.
|
|
19
|
-
*/
|
|
20
|
-
table_size: u32,
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Outline width in pixels.
|
|
24
|
-
*/
|
|
25
|
-
thickness: f32,
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
resources.createGroup()
|
|
34
|
-
.addTexture("viz_mesh", "uint");
|
|
35
|
-
|
|
36
|
-
resources.createGroup()
|
|
37
|
-
.addStorageBuffer("highlight_table", WebGPUArray.u32);
|
|
38
|
-
|
|
39
|
-
const body = CodeChunk.from(
|
|
40
|
-
//language=WGSL
|
|
41
|
-
`
|
|
42
|
-
@fragment
|
|
43
|
-
fn main(
|
|
44
|
-
@builtin(position) coord : vec4<f32>,
|
|
45
|
-
) -> @location(0) vec4<f32> {
|
|
46
|
-
|
|
47
|
-
let here = vec2<i32>(coord.xy);
|
|
48
|
-
|
|
49
|
-
let resolution = vec2<i32>(settings.screen_resolution);
|
|
50
|
-
|
|
51
|
-
let table_size = settings.table_size;
|
|
52
|
-
|
|
53
|
-
let own = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, here, 0).r, table_size);
|
|
54
|
-
|
|
55
|
-
/*
|
|
56
|
-
The outline sits **outside** the silhouette. A pixel that is itself the highlighted mesh is left
|
|
57
|
-
alone — a highlight marks a unit without painting over it, which is the whole reason the legacy
|
|
58
|
-
path dilated its mask outwards before compositing.
|
|
59
|
-
*/
|
|
60
|
-
if (own.a > 0.0) {
|
|
61
|
-
discard;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
let thickness = settings.thickness;
|
|
65
|
-
|
|
66
|
-
let radius = i32(ceil(thickness));
|
|
67
|
-
|
|
68
|
-
/*
|
|
69
|
-
The strongest highlight within reach, by coverage. Nearest would need a second comparison and
|
|
70
|
-
would look the same: two highlights close enough to overlap an outline this thin are the same
|
|
71
|
-
size on screen, and the brighter one is the one the eye follows.
|
|
72
|
-
*/
|
|
73
|
-
var found = vec4<f32>(0.0);
|
|
74
|
-
|
|
75
|
-
for (var dy = -radius; dy <= radius; dy++) {
|
|
76
|
-
for (var dx = -radius; dx <= radius; dx++) {
|
|
77
|
-
let offset = vec2<f32>(f32(dx), f32(dy));
|
|
78
|
-
|
|
79
|
-
// a disc rather than a square, so the outline is the same width in every direction
|
|
80
|
-
if (dot(offset, offset) > thickness * thickness) {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
let at = here + vec2<i32>(dx, dy);
|
|
85
|
-
|
|
86
|
-
if (any(at < vec2<i32>(0)) || any(at >= resolution)) {
|
|
87
|
-
continue;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
let neighbour = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, at, 0).r, table_size);
|
|
91
|
-
|
|
92
|
-
if (neighbour.a > found.a) {
|
|
93
|
-
found = neighbour;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (found.a <= 0.0) {
|
|
99
|
-
discard;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// premultiplied, which is how the table stores it and how the blend state consumes it
|
|
103
|
-
return found;
|
|
104
|
-
}
|
|
105
|
-
`, [
|
|
106
|
-
chunk_highlight_lookup
|
|
107
|
-
]
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Paints an outline around every highlighted mesh, straight off the visibility buffer.
|
|
112
|
-
*
|
|
113
|
-
* **There is no second geometry pass, no dilation and no blur.** The renderer this replaces drew
|
|
114
|
-
* every highlighted object again into an id target of its own, ping-ponged two render targets to
|
|
115
|
-
* dilate the mask, blurred it, and decoded ids back to colours to composite — five render targets, a
|
|
116
|
-
* duplicated scene graph and its own skinned material variant. Shade already writes a per-pixel mesh
|
|
117
|
-
* id while drawing the frame, so an outline is a neighbourhood test on an integer texture and
|
|
118
|
-
* nothing more.
|
|
119
|
-
*
|
|
120
|
-
* **What that costs is the contract change in D27**: the visibility buffer knows only what was
|
|
121
|
-
* rasterized, so a unit standing behind a building is outlined where it can be seen and nowhere
|
|
122
|
-
* else. The old mask was drawn with the depth buffer cleared and showed through everything.
|
|
123
|
-
*
|
|
124
|
-
* @type {ImageShader}
|
|
125
|
-
*/
|
|
126
|
-
export const shader_highlight_outline = ImageShader.from({
|
|
127
|
-
descriptor: ShaderDescriptor.from({
|
|
128
|
-
label: "Highlight outline",
|
|
129
|
-
resources,
|
|
130
|
-
body
|
|
131
|
-
}),
|
|
132
|
-
targets: [
|
|
133
|
-
{
|
|
134
|
-
label: "outlined",
|
|
135
|
-
format: "rgba16float",
|
|
136
|
-
blend: BlendState.from({
|
|
137
|
-
color: {
|
|
138
|
-
operation: "add",
|
|
139
|
-
srcFactor: "one",
|
|
140
|
-
dstFactor: "one-minus-src-alpha"
|
|
141
|
-
},
|
|
142
|
-
alpha: {
|
|
143
|
-
operation: "add",
|
|
144
|
-
srcFactor: "one",
|
|
145
|
-
dstFactor: "one-minus-src-alpha"
|
|
146
|
-
}
|
|
147
|
-
})
|
|
148
|
-
}
|
|
149
|
-
]
|
|
150
|
-
});
|
|
1
|
+
import { BlendState } from "../../../shade/descriptor/blend/BlendState.js";
|
|
2
|
+
import { CodeChunk } from "../../../shade/renderer/shader/compiler/CodeChunk.js";
|
|
3
|
+
import { ImageShader } from "../../../shade/renderer/shader/ImageShader.js";
|
|
4
|
+
import {
|
|
5
|
+
ShaderResourceSetDescriptor
|
|
6
|
+
} from "../../../shade/renderer/shader/resource/ShaderResourceSetDescriptor.js";
|
|
7
|
+
import { ShaderDescriptor } from "../../../shade/renderer/shader/ShaderDescriptor.js";
|
|
8
|
+
import { f32, u32, vec2u } from "../../../shade/renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
9
|
+
import { WebGPUArray } from "../../../shade/renderer/shader/type/WebGPUArray.js";
|
|
10
|
+
import { WebGPUStruct } from "../../../shade/renderer/shader/type/WebGPUStruct.js";
|
|
11
|
+
import { chunk_highlight_lookup } from "./chunk_highlight_lookup.js";
|
|
12
|
+
|
|
13
|
+
export const HIGHLIGHT_OUTLINE_SETTINGS = WebGPUStruct.from({
|
|
14
|
+
screen_resolution: vec2u,
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* How many rows the lookup table has, which is one past the highest mesh row that was
|
|
18
|
+
* highlighted when it was packed.
|
|
19
|
+
*/
|
|
20
|
+
table_size: u32,
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Outline width in pixels.
|
|
24
|
+
*/
|
|
25
|
+
thickness: f32,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
29
|
+
|
|
30
|
+
// per-draw, 16 bytes, read-only: immediate data rather than a uniform buffer
|
|
31
|
+
resources.setImmediate("settings", HIGHLIGHT_OUTLINE_SETTINGS);
|
|
32
|
+
|
|
33
|
+
resources.createGroup()
|
|
34
|
+
.addTexture("viz_mesh", "uint");
|
|
35
|
+
|
|
36
|
+
resources.createGroup()
|
|
37
|
+
.addStorageBuffer("highlight_table", WebGPUArray.u32);
|
|
38
|
+
|
|
39
|
+
const body = CodeChunk.from(
|
|
40
|
+
//language=WGSL
|
|
41
|
+
`
|
|
42
|
+
@fragment
|
|
43
|
+
fn main(
|
|
44
|
+
@builtin(position) coord : vec4<f32>,
|
|
45
|
+
) -> @location(0) vec4<f32> {
|
|
46
|
+
|
|
47
|
+
let here = vec2<i32>(coord.xy);
|
|
48
|
+
|
|
49
|
+
let resolution = vec2<i32>(settings.screen_resolution);
|
|
50
|
+
|
|
51
|
+
let table_size = settings.table_size;
|
|
52
|
+
|
|
53
|
+
let own = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, here, 0).r, table_size);
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
The outline sits **outside** the silhouette. A pixel that is itself the highlighted mesh is left
|
|
57
|
+
alone — a highlight marks a unit without painting over it, which is the whole reason the legacy
|
|
58
|
+
path dilated its mask outwards before compositing.
|
|
59
|
+
*/
|
|
60
|
+
if (own.a > 0.0) {
|
|
61
|
+
discard;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let thickness = settings.thickness;
|
|
65
|
+
|
|
66
|
+
let radius = i32(ceil(thickness));
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
The strongest highlight within reach, by coverage. Nearest would need a second comparison and
|
|
70
|
+
would look the same: two highlights close enough to overlap an outline this thin are the same
|
|
71
|
+
size on screen, and the brighter one is the one the eye follows.
|
|
72
|
+
*/
|
|
73
|
+
var found = vec4<f32>(0.0);
|
|
74
|
+
|
|
75
|
+
for (var dy = -radius; dy <= radius; dy++) {
|
|
76
|
+
for (var dx = -radius; dx <= radius; dx++) {
|
|
77
|
+
let offset = vec2<f32>(f32(dx), f32(dy));
|
|
78
|
+
|
|
79
|
+
// a disc rather than a square, so the outline is the same width in every direction
|
|
80
|
+
if (dot(offset, offset) > thickness * thickness) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let at = here + vec2<i32>(dx, dy);
|
|
85
|
+
|
|
86
|
+
if (any(at < vec2<i32>(0)) || any(at >= resolution)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let neighbour = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, at, 0).r, table_size);
|
|
91
|
+
|
|
92
|
+
if (neighbour.a > found.a) {
|
|
93
|
+
found = neighbour;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (found.a <= 0.0) {
|
|
99
|
+
discard;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// premultiplied, which is how the table stores it and how the blend state consumes it
|
|
103
|
+
return found;
|
|
104
|
+
}
|
|
105
|
+
`, [
|
|
106
|
+
chunk_highlight_lookup
|
|
107
|
+
]
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Paints an outline around every highlighted mesh, straight off the visibility buffer.
|
|
112
|
+
*
|
|
113
|
+
* **There is no second geometry pass, no dilation and no blur.** The renderer this replaces drew
|
|
114
|
+
* every highlighted object again into an id target of its own, ping-ponged two render targets to
|
|
115
|
+
* dilate the mask, blurred it, and decoded ids back to colours to composite — five render targets, a
|
|
116
|
+
* duplicated scene graph and its own skinned material variant. Shade already writes a per-pixel mesh
|
|
117
|
+
* id while drawing the frame, so an outline is a neighbourhood test on an integer texture and
|
|
118
|
+
* nothing more.
|
|
119
|
+
*
|
|
120
|
+
* **What that costs is the contract change in D27**: the visibility buffer knows only what was
|
|
121
|
+
* rasterized, so a unit standing behind a building is outlined where it can be seen and nowhere
|
|
122
|
+
* else. The old mask was drawn with the depth buffer cleared and showed through everything.
|
|
123
|
+
*
|
|
124
|
+
* @type {ImageShader}
|
|
125
|
+
*/
|
|
126
|
+
export const shader_highlight_outline = ImageShader.from({
|
|
127
|
+
descriptor: ShaderDescriptor.from({
|
|
128
|
+
label: "Highlight outline",
|
|
129
|
+
resources,
|
|
130
|
+
body
|
|
131
|
+
}),
|
|
132
|
+
targets: [
|
|
133
|
+
{
|
|
134
|
+
label: "outlined",
|
|
135
|
+
format: "rgba16float",
|
|
136
|
+
blend: BlendState.from({
|
|
137
|
+
color: {
|
|
138
|
+
operation: "add",
|
|
139
|
+
srcFactor: "one",
|
|
140
|
+
dstFactor: "one-minus-src-alpha"
|
|
141
|
+
},
|
|
142
|
+
alpha: {
|
|
143
|
+
operation: "add",
|
|
144
|
+
srcFactor: "one",
|
|
145
|
+
dstFactor: "one-minus-src-alpha"
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
});
|
|
@@ -64,11 +64,11 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
64
64
|
/**
|
|
65
65
|
* @param {FluidComponent} fluid
|
|
66
66
|
*/
|
|
67
|
-
static "__#
|
|
67
|
+
static "__#360@#refresh_masks"(fluid: FluidComponent): void;
|
|
68
68
|
/**
|
|
69
69
|
* @param {FluidComponent} fluid
|
|
70
70
|
*/
|
|
71
|
-
static "__#
|
|
71
|
+
static "__#360@#clear_field"(fluid: FluidComponent): void;
|
|
72
72
|
/**
|
|
73
73
|
* Mark every cell of `fluid` whose centre lies within `inflation` of the
|
|
74
74
|
* posed shape as solid. Iteration is clipped to the shape's world AABB
|
|
@@ -80,7 +80,7 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
80
80
|
* @param {number} inflation world-units SDF threshold
|
|
81
81
|
* @param {Float64Array} point length-3 scratch
|
|
82
82
|
*/
|
|
83
|
-
static "__#
|
|
83
|
+
static "__#360@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
|
|
84
84
|
/**
|
|
85
85
|
* Write the obstacle's translation velocity onto every face of every cell
|
|
86
86
|
* it voxelized — the moving-wall boundary condition. Runs AFTER the mask
|
|
@@ -100,7 +100,7 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
100
100
|
* @param {number} wvy
|
|
101
101
|
* @param {number} wvz
|
|
102
102
|
*/
|
|
103
|
-
static "__#
|
|
103
|
+
static "__#360@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
|
|
104
104
|
constructor();
|
|
105
105
|
dependencies: (typeof FluidObstacle)[];
|
|
106
106
|
components_used: (ResourceAccessSpecification<typeof Transform> | ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof FluidComponent> | ResourceAccessSpecification<typeof FluidObstacle>)[];
|
|
@@ -541,7 +541,8 @@ frame or is removed and re-added keeps its buffers.
|
|
|
541
541
|
| `internal_resolution_scale` | render internally below output resolution; `DynamicResolutionScaling` drives it from frame time |
|
|
542
542
|
| `pixel_ratio`, `output_resolution`, `aspect_ratio`, `resize(x, y)` | |
|
|
543
543
|
| `motion_blur`, `dof`, `dof_unreal`, `nss`, `restir_di`, `path_tracer` | sub-objects with their own settings |
|
|
544
|
-
| `frame_count
|
|
544
|
+
| `frame_count` | |
|
|
545
|
+
| `profile_session` | assign a `GPUProfileSession` to record GPU timings; null when nothing is profiling |
|
|
545
546
|
|
|
546
547
|
---
|
|
547
548
|
|
|
@@ -19,6 +19,23 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
|
|
|
19
19
|
*/
|
|
20
20
|
static fromJSON(json: GPUComputePipelineDescriptor): ComputePipelineDescriptor;
|
|
21
21
|
compute: ProgrammableStage;
|
|
22
|
+
/**
|
|
23
|
+
* `[x, y, z]` of this pipeline's `@workgroup_size`.
|
|
24
|
+
*
|
|
25
|
+
* Read once, when the code is set, and kept — the source cannot change under a descriptor
|
|
26
|
+
* without going back through one of the factories, each of which reads it again. So every
|
|
27
|
+
* consumer downstream, a profile capture included, gets the number for free.
|
|
28
|
+
*
|
|
29
|
+
* Frozen, because it is handed out by reference to per-pass profile records and a descriptor
|
|
30
|
+
* that outlives a whole capture must not be mutable through one of them.
|
|
31
|
+
*
|
|
32
|
+
* Takes no part in {@link equals} or {@link hash}: it is derived from `compute.module`, which
|
|
33
|
+
* both already cover, and a cache key computed two ways is a cache that can disagree with
|
|
34
|
+
* itself.
|
|
35
|
+
*
|
|
36
|
+
* @returns {readonly number[]}
|
|
37
|
+
*/
|
|
38
|
+
get workgroup_size(): readonly number[];
|
|
22
39
|
/**
|
|
23
40
|
*
|
|
24
41
|
* @param {GPUComputePipelineDescriptor} json
|
|
@@ -35,6 +52,7 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
|
|
|
35
52
|
* @type {boolean}
|
|
36
53
|
*/
|
|
37
54
|
readonly isComputePipelineDescriptor: boolean;
|
|
55
|
+
#private;
|
|
38
56
|
}
|
|
39
57
|
import { PipelineDescriptorBase } from "../PipelineDescriptorBase.js";
|
|
40
58
|
import { ProgrammableStage } from "../ProgrammableStage.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComputePipelineDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ComputePipelineDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js"],"names":[],"mappings":"AAqBA;IAuDI;;;;;OAKG;IACH,mBAJW,MAAM,QACN,MAAM,UACN,wBAAwB,6BAelC;IAED;;;;;OAKG;IACH,wEALW,MAAM,6BA2BhB;IAED;;;OAGG;IACH,+EAMC;IAnHD,2BAAkC;IAOlC;;;;;;;;;;;;;;;OAeG;IACH,wCAEC;IA4FD;;;OAGG;IACH,mDAUC;IAED;;;;OAIG;IACH,cAHW,yBAAyB,GACxB,OAAO,CAMlB;IAUL;;;OAGG;IACH,sCAFU,OAAO,CAE8C;;CAN9D;uCAtKsC,8BAA8B;kCAEnC,yBAAyB;yCADlB,gCAAgC"}
|
|
@@ -1,14 +1,79 @@
|
|
|
1
1
|
import { assert } from "../../../../core/assert.js";
|
|
2
2
|
import { combine_hash } from "../../../../core/collection/array/combine_hash.js";
|
|
3
|
+
import {
|
|
4
|
+
compute_infer_workgroup_size_from_source
|
|
5
|
+
} from "../../../renderer/shader/util/compute_infer_workgroup_size_from_source.js";
|
|
3
6
|
import { GPUShaderStage } from "../../GPUShaderStage.js";
|
|
4
7
|
import { PipelineDescriptorBase } from "../PipelineDescriptorBase.js";
|
|
5
8
|
import { PipelineLayoutDescriptor } from "../PipelineLayoutDescriptor.js";
|
|
6
9
|
import { ProgrammableStage } from "../ProgrammableStage.js";
|
|
7
10
|
import { ShaderModuleDescriptor } from "../ShaderModuleDescriptor.js";
|
|
8
11
|
|
|
12
|
+
/**
|
|
13
|
+
* What {@link ComputePipelineDescriptor#workgroup_size} reads before any code has been set.
|
|
14
|
+
*
|
|
15
|
+
* Not a fallback for unreadable source — that throws. This is the value of a descriptor that has
|
|
16
|
+
* been constructed and not yet given a shader, which is a state only `new` produces.
|
|
17
|
+
*
|
|
18
|
+
* @type {readonly number[]}
|
|
19
|
+
*/
|
|
20
|
+
const WORKGROUP_SIZE_UNSET = Object.freeze([0, 0, 0]);
|
|
21
|
+
|
|
9
22
|
export class ComputePipelineDescriptor extends PipelineDescriptorBase {
|
|
10
23
|
compute = new ProgrammableStage();
|
|
11
24
|
|
|
25
|
+
/**
|
|
26
|
+
* @type {readonly number[]}
|
|
27
|
+
*/
|
|
28
|
+
#workgroup_size = WORKGROUP_SIZE_UNSET;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* `[x, y, z]` of this pipeline's `@workgroup_size`.
|
|
32
|
+
*
|
|
33
|
+
* Read once, when the code is set, and kept — the source cannot change under a descriptor
|
|
34
|
+
* without going back through one of the factories, each of which reads it again. So every
|
|
35
|
+
* consumer downstream, a profile capture included, gets the number for free.
|
|
36
|
+
*
|
|
37
|
+
* Frozen, because it is handed out by reference to per-pass profile records and a descriptor
|
|
38
|
+
* that outlives a whole capture must not be mutable through one of them.
|
|
39
|
+
*
|
|
40
|
+
* Takes no part in {@link equals} or {@link hash}: it is derived from `compute.module`, which
|
|
41
|
+
* both already cover, and a cache key computed two ways is a cache that can disagree with
|
|
42
|
+
* itself.
|
|
43
|
+
*
|
|
44
|
+
* @returns {readonly number[]}
|
|
45
|
+
*/
|
|
46
|
+
get workgroup_size() {
|
|
47
|
+
return this.#workgroup_size;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Read the workgroup size out of the code just assigned to {@link compute}, and **throw** if it
|
|
52
|
+
* cannot be read.
|
|
53
|
+
*
|
|
54
|
+
* Loud, and at construction. Every consumer of this number divides a thread count by it, so a
|
|
55
|
+
* guess that is wrong silently dispatches the wrong fraction of the workload — and a descriptor
|
|
56
|
+
* that cannot state its own workgroup size is one nobody downstream can use correctly. Better
|
|
57
|
+
* that it cannot be built than that it be built and dealt with.
|
|
58
|
+
*
|
|
59
|
+
* @returns {void}
|
|
60
|
+
*/
|
|
61
|
+
#read_workgroup_size() {
|
|
62
|
+
const code = this.compute.module.code;
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
this.#workgroup_size = Object.freeze(compute_infer_workgroup_size_from_source(code));
|
|
66
|
+
} catch (e) {
|
|
67
|
+
const error = new Error(
|
|
68
|
+
`Compute pipeline '${this.label}' has no readable workgroup size: ${e.message}`
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
error.cause = e;
|
|
72
|
+
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
12
77
|
/**
|
|
13
78
|
*
|
|
14
79
|
* @param {string} label
|
|
@@ -24,6 +89,8 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
|
|
|
24
89
|
r.label = label;
|
|
25
90
|
r.compute.module = ShaderModuleDescriptor.fromCode(code);
|
|
26
91
|
|
|
92
|
+
r.#read_workgroup_size();
|
|
93
|
+
|
|
27
94
|
return r;
|
|
28
95
|
|
|
29
96
|
}
|
|
@@ -53,6 +120,8 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
|
|
|
53
120
|
r.compute.constants = constants;
|
|
54
121
|
}
|
|
55
122
|
|
|
123
|
+
r.#read_workgroup_size();
|
|
124
|
+
|
|
56
125
|
return r;
|
|
57
126
|
}
|
|
58
127
|
|
|
@@ -78,6 +147,10 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
|
|
|
78
147
|
assert.isObject(json.compute, 'json.compute');
|
|
79
148
|
|
|
80
149
|
this.compute.fromJSON(json.compute);
|
|
150
|
+
|
|
151
|
+
// `fromJSON` replaces the module in place, so the size read for whatever was here before is
|
|
152
|
+
// now the wrong shader's. Read it again rather than leaving a stale divisor behind.
|
|
153
|
+
this.#read_workgroup_size();
|
|
81
154
|
}
|
|
82
155
|
|
|
83
156
|
/**
|