@woosh/meep-engine 3.58.0 → 3.60.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/editor/particles/effect/ParticleEffectDocument.d.ts +162 -43
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
- package/editor/particles/effect/ParticleEffectDocument.js +450 -43
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts +12 -3
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.js +78 -23
- package/editor/particles/effect/make_starter_particle_effect.js +17 -17
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +3 -3
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +224 -67
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleGraphEditorView.js +44 -11
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +2 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.js +46 -16
- package/editor/view/particles/effect/ParticlePreviewView.js +2 -2
- package/editor/view/particles/effect/particle-editor.css +77 -68
- package/package.json +1 -1
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +2 -2
- package/src/engine/ecs/EntityManager.d.ts +29 -5
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +37 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +74 -17
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +156 -25
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +13 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +59 -13
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +3 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +9 -9
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts +15 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.js +78 -0
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +2 -0
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
- package/src/engine/graphics/ecs/trail3d/Trail3D.js +2 -0
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +1 -1
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +1 -1
- package/src/engine/graphics/trail/tube/TubeX.d.ts +5 -3
- package/src/engine/graphics/trail/tube/TubeX.d.ts.map +1 -1
- package/src/engine/graphics/trail/tube/TubeX.js +5 -3
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +3 -2
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +1 -1
- package/src/engine/graphics/trail/tube/tube_attributes_spec.js +9 -8
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +65 -4
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +1351 -904
- package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +1 -1
- package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -13
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/generation/foliage/FOLIAGE_DESIGN.md +26 -5
- package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +35 -0
- package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +2 -1
- package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +552 -0
- package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -1
- package/src/generation/foliage/analysis/tree_crown_opacity.js +2 -1
- package/src/generation/foliage/analysis/tree_render_cost.d.ts +5 -3
- package/src/generation/foliage/analysis/tree_render_cost.d.ts.map +1 -1
- package/src/generation/foliage/analysis/tree_render_cost.js +8 -7
- package/src/generation/foliage/asset/TreeAsset.d.ts +17 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
- package/src/generation/foliage/asset/TreeAsset.js +20 -0
- package/src/generation/foliage/asset/TreeSpeciesCache.d.ts +69 -0
- package/src/generation/foliage/asset/TreeSpeciesCache.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeSpeciesCache.js +147 -0
- package/src/generation/foliage/asset/generate_tree.d.ts +10 -0
- package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
- package/src/generation/foliage/asset/generate_tree.js +57 -29
- package/src/generation/foliage/asset/place_tree.d.ts +2 -1
- package/src/generation/foliage/asset/place_tree.d.ts.map +1 -1
- package/src/generation/foliage/asset/place_tree.js +2 -1
- package/src/generation/foliage/asset/tree_lod_plan.d.ts +4 -2
- package/src/generation/foliage/asset/tree_lod_plan.d.ts.map +1 -1
- package/src/generation/foliage/asset/tree_lod_plan.js +12 -14
- package/src/generation/foliage/asset/tree_shoot_instances.d.ts +119 -0
- package/src/generation/foliage/asset/tree_shoot_instances.d.ts.map +1 -0
- package/src/generation/foliage/asset/tree_shoot_instances.js +410 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts +155 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts.map +1 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.js +251 -0
- package/src/generation/foliage/config/TreeGrowth.d.ts +10 -0
- package/src/generation/foliage/config/TreeGrowth.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeGrowth.js +18 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts +6 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/TreeLODConfig.js +7 -0
- package/src/generation/foliage/index.d.ts +3 -0
- package/src/generation/foliage/index.js +3 -0
- package/src/generation/foliage/material/foliage_tile.d.ts +6 -6
- package/src/generation/foliage/material/foliage_tile.js +3 -3
- package/src/generation/foliage/material/tree_cluster_atlas.d.ts +44 -0
- package/src/generation/foliage/material/tree_cluster_atlas.d.ts.map +1 -0
- package/src/generation/foliage/material/tree_cluster_atlas.js +37 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +2 -2
- package/src/generation/foliage/mesh/foliage_scale_spread.d.ts +14 -0
- package/src/generation/foliage/mesh/foliage_scale_spread.d.ts.map +1 -0
- package/src/generation/foliage/mesh/foliage_scale_spread.js +15 -0
- package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts +8 -7
- package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_cluster_representatives.js +85 -40
- package/src/generation/foliage/mesh/tree_clusters.d.ts +26 -5
- package/src/generation/foliage/mesh/tree_clusters.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_clusters.js +52 -39
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +32 -54
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts +6 -1
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
- package/src/generation/foliage/presets/make_tree_species_preset.js +157 -3
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +19 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/TreeSkeleton.js +41 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +5 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +8 -1
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts +70 -0
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.js +171 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts +17 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.js +79 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts +12 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.js +56 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts +11 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.js +38 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +4 -11
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +8 -2034
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts +22 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.js +2050 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +10 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +27 -56
- package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/DepthStencilState.js +170 -144
- package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/MultisampleState.js +78 -65
- package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +176 -172
- package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/StencilFaceState.js +107 -88
- package/src/shade/playground/particle_ecs/README.md +9 -8
- package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
- package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +6 -6
- package/src/shade/playground/particle_ecs/bonfire_effects.js +6 -6
- package/src/shade/playground/particle_editor/README.md +14 -11
- package/src/shade/playground/particle_system/particle_prototype.js +18 -18
- package/src/shade/playground/particle_system/particle_scene.js +13 -13
- package/src/shade/playground/probe_clipmap/README.md +42 -0
- package/src/shade/playground/probe_clipmap/index.html +190 -0
- package/src/shade/playground/probe_clipmap/main.d.ts +8 -0
- package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -0
- package/src/shade/playground/probe_clipmap/main.js +365 -0
- package/src/shade/renderer/Renderer.d.ts +3 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +97 -43
- package/src/shade/renderer/extension/ViewTextures.d.ts +2 -1
- package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
- package/src/shade/renderer/extension/ViewTextures.js +2 -1
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +63 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +228 -16
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +27 -4
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +526 -23
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts +11 -0
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.js +21 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts +65 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +376 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +7 -3
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +70 -6
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts +20 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.js +80 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts +18 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.js +113 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +34 -12
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +56 -15
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +13 -26
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +25 -2
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +54 -32
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.js +37 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +2 -6
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts +131 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.js +467 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.js +111 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts +42 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.js +404 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.js +23 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.js +65 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +14 -70
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +13 -773
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts +55 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.js +248 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +15 -174
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +47 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +80 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +91 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +902 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +67 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +145 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +12 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +105 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.js +8 -24
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.js +1 -25
- package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.js +5 -23
- package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +20 -5
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +111 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +1596 -52
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +410 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +3 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +4 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +41 -17
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +57 -33
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +18 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +21 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +9 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +8 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +12 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +28 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +1 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +1 -74
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/{mesh/chunk_mesh_brick_object.d.ts → chunk_brick_object.d.ts} +8 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.js +42 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts +45 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.js +93 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +161 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +219 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +1 -15
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +1 -17
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +40 -12
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +373 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +3 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +6 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +15 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +28 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +66 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.js +210 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.js +86 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +41 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +439 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.js +135 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +3 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +12 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +32 -15
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +380 -57
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +156 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +189 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +193 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +458 -32
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts +19 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.js +40 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts +72 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +343 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +189 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +26 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +132 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +40 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +244 -32
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +8 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +29 -12
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts +12 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js +101 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +15 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +21 -22
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.js +257 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts +15 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.js +175 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +37 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +316 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.js +110 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +24 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +90 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts +45 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.js +205 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +15 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +54 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +60 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +6 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +26 -37
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +21 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +101 -38
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +6 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +26 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +5 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +9 -110
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +28 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +110 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.js +21 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts +5 -2
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.js +31 -23
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.js +22 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts +9 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.js +18 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts +8 -3
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.js +41 -32
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts +31 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.js +71 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts +47 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.js +210 -0
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +5 -4
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/defs.js +5 -4
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +56 -15
- 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 +410 -61
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts +4 -1
- 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 +16 -42
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts +15 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.js +60 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts +25 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.js +89 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts +3 -8
- 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 +28 -160
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts +12 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.js +74 -0
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts +3 -1
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.js +387 -188
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +13 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +40 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +11 -6
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +15 -8
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +9 -2
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +25 -11
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +1 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +90 -72
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +5 -0
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +9 -0
- package/src/shade/renderer/particles/DESIGN.md +151 -42
- package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +283 -0
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +10 -2
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +46 -8
- package/src/shade/renderer/particles/ParticleConstants.d.ts +23 -6
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +25 -6
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +5 -5
- package/src/shade/renderer/particles/bounds/shader_particle_bounds.js +187 -187
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +20 -9
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +36 -10
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +8 -7
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +25 -16
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts +51 -0
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.js +56 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +1 -1
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +22 -11
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +14 -11
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +4 -4
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +59 -24
- package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +3 -3
- package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -287
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +13 -6
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +46 -27
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +8 -2
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +240 -234
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts +1 -1
- package/src/shade/renderer/particles/graph/make_particle_group.js +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +3 -2
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_authoring.js +3 -2
- package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -170
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +25 -16
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_json.js +16 -2
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +29 -15
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_parameters.js +54 -22
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_presentation.js +18 -8
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +9 -2
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.js +70 -32
- package/src/shade/renderer/particles/graph_particles.d.ts +9 -4
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +27 -4
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts +7 -6
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +17 -16
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +17 -0
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleAssembler.js +35 -0
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +26 -6
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +61 -9
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +55 -4
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +79 -10
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +20 -6
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/particle_assembly.js +136 -25
- package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts +20 -0
- package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/particle_link_global_fields.js +46 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.js +8 -8
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +62 -28
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +102 -62
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +2 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +1 -1
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +4 -3
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +2 -2
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +3 -3
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +11 -11
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +4 -4
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +5 -4
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +1 -1
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +4 -4
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +13 -11
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +7 -7
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +3 -2
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +5 -4
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -51
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +5 -5
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_schedule.js +2 -2
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +5 -4
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +93 -22
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +336 -29
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +43 -3
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +43 -3
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +56 -26
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +89 -33
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts +85 -0
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.js +221 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +143 -18
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramHeap.js +378 -28
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +19 -7
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -9
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +8 -8
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +3 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +4 -0
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts +30 -0
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.js +121 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +3 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +12 -4
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +48 -11
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +36 -14
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts +13 -0
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.js +14 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts +10 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.js +15 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +4 -3
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +6 -5
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts +17 -2
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +25 -57
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts +13 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.js +70 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts +10 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.js +59 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts +12 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.js +49 -0
- package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.js +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material.js +2 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts +7 -0
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +15 -6
- package/src/shade/renderer/postprocess/PostProcess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/PostProcess.js +2 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +31 -19
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +44 -30
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +16 -2
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.js +4 -3
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts +7 -1
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +16 -0
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts +20 -2
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +53 -3
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts +10 -2
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +31 -3
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +17 -11
- package/src/shade/renderer/postprocess/taa/TAA.d.ts +4 -2
- package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/TAA.js +6 -1
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +10 -5
- package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/shader_taa.js +15 -12
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +26 -17
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts +4 -3
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +6 -4
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts +12 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.js +57 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +4 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +4 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +8 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +28 -15
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.js +19 -3
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +4 -2
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +3 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +27 -14
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +19 -3
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +7 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +26 -1
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts +7 -7
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +262 -294
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.js +21 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +43 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +87 -0
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts +2 -8
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.js +25 -52
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.js +52 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.js +12 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.js +37 -0
- package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.js +26 -60
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.js +54 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +25 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +43 -0
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts +7 -1
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.js +1 -1
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts +14 -0
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.js +37 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts +27 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.js +61 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.js +41 -0
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.js +42 -0
- package/src/shade/renderer/texture/util/texture_fill_rectangle.d.ts.map +1 -1
- package/src/shade/renderer/texture/util/texture_fill_rectangle.js +282 -267
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +8 -4
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +36 -36
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +6 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +498 -484
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +15 -2
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +57 -3
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +197 -191
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +4 -4
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +2 -1
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +5 -1
- package/src/shade/renderer/water/chunk_water_gi.d.ts +13 -3
- package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_gi.js +47 -5
- package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
- package/src/shade/renderer/water/shader_water.d.ts +3 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +9 -3
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +19 -0
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/CPUBitmapData.js +27 -0
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +39 -18
- package/src/view/elements/progress/segmented/GhostTrail.d.ts +56 -0
- package/src/view/elements/progress/segmented/GhostTrail.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/GhostTrail.js +98 -0
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts +3 -1
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js +3 -1
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts +11 -0
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.js +15 -0
- package/src/view/elements/progress/segmented/SegmentDefinition.d.ts +3 -0
- package/src/view/elements/progress/segmented/SegmentDefinition.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/SegmentDefinition.js +3 -0
- package/src/view/elements/progress/segmented/SegmentTier.d.ts +38 -0
- package/src/view/elements/progress/segmented/SegmentTier.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/SegmentTier.js +50 -0
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +155 -10
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +427 -101
- package/src/view/elements/progress/segmented/playground/index.html +78 -0
- package/src/view/elements/progress/segmented/playground/main.d.ts +2 -0
- package/src/view/elements/progress/segmented/playground/main.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/playground/main.js +173 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.d.ts +48 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.js +75 -0
- package/src/view/elements/progress/segmented/segment_notch_place.d.ts +18 -0
- package/src/view/elements/progress/segmented/segment_notch_place.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_notch_place.js +28 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.d.ts +32 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.js +103 -0
- package/src/view/elements/progress/segmented/segmented-resource-bar.css +142 -0
- package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts +0 -2
- package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts +0 -8
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.js +0 -42
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +0 -35
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +0 -247
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +0 -31
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +0 -42
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +0 -54
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +0 -14
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +0 -30
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +0 -23
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
2
|
import { PARTICLE_RECORD_HEADER_EMITTER, PARTICLE_RECORD_WORD_COUNT } from "../ParticleConstants.js";
|
|
3
|
-
import {
|
|
3
|
+
import { PARTICLE_FIELD_ABSENT } from "../data/PARTICLE_EMITTER_STRUCT.js";
|
|
4
4
|
import { chunk_particle_emitter } from "../data/chunk_particle_emitter.js";
|
|
5
5
|
import { chunk_particle_header } from "../data/particle_header.js";
|
|
6
6
|
import { chunk_particle_render_math } from "./chunk_particle_render_math.js";
|
|
@@ -26,7 +26,7 @@ export const chunk_particle_billboard_vertex = CodeChunk.from(
|
|
|
26
26
|
/* language=wgsl */ `
|
|
27
27
|
const PARTICLE_RECORD_WORDS : u32 = ${PARTICLE_RECORD_WORD_COUNT}u;
|
|
28
28
|
const PARTICLE_HEADER_EMITTER : u32 = ${PARTICLE_RECORD_HEADER_EMITTER}u;
|
|
29
|
-
const
|
|
29
|
+
const PARTICLE_FIELD_ABSENT : u32 = ${PARTICLE_FIELD_ABSENT}u;
|
|
30
30
|
|
|
31
31
|
struct ParticleVertexOut {
|
|
32
32
|
@builtin(position) clip : vec4<f32>,
|
|
@@ -61,18 +61,18 @@ fn particle_billboard_vertex(vi : u32, ii : u32) -> ParticleVertexOut {
|
|
|
61
61
|
let em = particle_emitter_read(&emitter_database, emitter_index);
|
|
62
62
|
|
|
63
63
|
var world_center = vec3<f32>(0.0);
|
|
64
|
-
if (em.render_position !=
|
|
64
|
+
if (em.render_position != PARTICLE_FIELD_ABSENT) { world_center = particle_read_vec(base, em.render_position, 3u).xyz; }
|
|
65
65
|
var size = 1.0;
|
|
66
|
-
if (em.render_size !=
|
|
66
|
+
if (em.render_size != PARTICLE_FIELD_ABSENT) { size = bitcast<f32>(pool[base + em.render_size]); }
|
|
67
67
|
var color = vec4<f32>(1.0);
|
|
68
|
-
if (em.render_color !=
|
|
68
|
+
if (em.render_color != PARTICLE_FIELD_ABSENT) { color = particle_read_vec(base, em.render_color, 4u); }
|
|
69
69
|
// the identity when the effect binds none
|
|
70
70
|
var orientation = vec4<f32>(0.0, 0.0, 0.0, 1.0);
|
|
71
|
-
if (em.render_orientation !=
|
|
71
|
+
if (em.render_orientation != PARTICLE_FIELD_ABSENT) { orientation = particle_read_vec(base, em.render_orientation, 4u); }
|
|
72
72
|
var frame = 0.0;
|
|
73
|
-
if (em.render_frame !=
|
|
73
|
+
if (em.render_frame != PARTICLE_FIELD_ABSENT) { frame = bitcast<f32>(pool[base + em.render_frame]); }
|
|
74
74
|
var velocity = vec3<f32>(0.0);
|
|
75
|
-
if (em.render_velocity !=
|
|
75
|
+
if (em.render_velocity != PARTICLE_FIELD_ABSENT) { velocity = particle_read_vec(base, em.render_velocity, 3u).xyz; }
|
|
76
76
|
|
|
77
77
|
let cam_right = camera.transform[0].xyz;
|
|
78
78
|
let cam_up = camera.transform[1].xyz;
|
|
@@ -51,7 +51,7 @@ struct ParticleBasis {
|
|
|
51
51
|
// A unit quaternion out of whatever a program wrote. A program integrating a spin drifts off unit
|
|
52
52
|
// length, and an unnormalised quaternion turns a vector by its rotation AND scales it by its squared
|
|
53
53
|
// length — the drift would show as size. The zero quaternion stays zero, which quat_rotate_v3 reads
|
|
54
|
-
// as no rotation at all, so
|
|
54
|
+
// as no rotation at all, so a particle field nobody wrote yet is the identity rather than a NaN.
|
|
55
55
|
fn particle_orientation_unit(q : vec4<f32>) -> vec4<f32> {
|
|
56
56
|
return q * inverseSqrt(max(dot(q, q), 1e-30));
|
|
57
57
|
}
|
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
* result. The caller fetches the node with `scene_read_node(&scene_database, em.node)`, and the age
|
|
11
11
|
* with {@link ./chunk_particle_emitter_age.js}.
|
|
12
12
|
*
|
|
13
|
+
* It also sets `vm_ctx.emitter_field_offset` from the record, so the program's emitter field reads
|
|
14
|
+
* find this emitter's block.
|
|
15
|
+
*
|
|
13
16
|
* The RNG seed is `hash_lowbias32_vec3u` over (emitter seed, slot, frame) — the engine's house
|
|
14
17
|
* hash, not a private one. It only has to be well mixed, since `random()` does the real work from
|
|
15
18
|
* here, and `rnd_state` feeds a PCG whose LCG step has a nonzero increment, so no seed value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_particle_setup_context.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/chunk_particle_setup_context.js"],"names":[],"mappings":"AAOA
|
|
1
|
+
{"version":3,"file":"chunk_particle_setup_context.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/chunk_particle_setup_context.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,2CAFU,SAAS,CA+BhB;0BA9DuB,oCAAoC"}
|
|
@@ -17,6 +17,9 @@ import { chunk_particle_vm } from "../vm/chunk_particle_vm.js";
|
|
|
17
17
|
* result. The caller fetches the node with `scene_read_node(&scene_database, em.node)`, and the age
|
|
18
18
|
* with {@link ./chunk_particle_emitter_age.js}.
|
|
19
19
|
*
|
|
20
|
+
* It also sets `vm_ctx.emitter_field_offset` from the record, so the program's emitter field reads
|
|
21
|
+
* find this emitter's block.
|
|
22
|
+
*
|
|
20
23
|
* The RNG seed is `hash_lowbias32_vec3u` over (emitter seed, slot, frame) — the engine's house
|
|
21
24
|
* hash, not a private one. It only has to be well mixed, since `random()` does the real work from
|
|
22
25
|
* here, and `rnd_state` feeds a PCG whose LCG step has a nonzero increment, so no seed value
|
|
@@ -49,6 +52,7 @@ fn particle_setup_context(
|
|
|
49
52
|
vm_ctx.emitter_position = (transform * vec4<f32>(0.0, 0.0, 0.0, 1.0)).xyz;
|
|
50
53
|
vm_ctx.emitter_direction = normalize((transform * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz);
|
|
51
54
|
vm_ctx.emitter_up = normalize((transform * vec4<f32>(0.0, 1.0, 0.0, 0.0)).xyz);
|
|
55
|
+
vm_ctx.emitter_field_offset = em.field_offset;
|
|
52
56
|
rnd_state = hash_lowbias32_vec3u(vec3<u32>(em.seed, slot, frame));
|
|
53
57
|
}
|
|
54
58
|
`, [
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threads per workgroup of {@link shader_particle_field_bind}: one per binding row, a page group
|
|
3
|
+
* per workgroup, as the emitter tick walks its table.
|
|
4
|
+
* @type {number}
|
|
5
|
+
*/
|
|
6
|
+
export const PARTICLE_FIELD_BIND_WORKGROUP_SIZE: number;
|
|
7
|
+
/**
|
|
8
|
+
* The transform bindings: one thread per row of the `field_bindings` table, reading the bound row's
|
|
9
|
+
* composed `global` out of the scene database and writing the channel the binding asks for into the
|
|
10
|
+
* field section of the program buffer — a global field, or a word of an emitter's block.
|
|
11
|
+
*
|
|
12
|
+
* It runs once a frame, after the hierarchy pass has composed the rows and before the spawn
|
|
13
|
+
* commands and the emitter tick, so every VM pass of the frame reads this frame's transforms. That
|
|
14
|
+
* is what lets a field follow a row only the GPU composes — an animated joint — with nothing copied
|
|
15
|
+
* through the CPU, as the emitter's own `EMITTER_POSITION` does. The host records it only while the
|
|
16
|
+
* table has rows.
|
|
17
|
+
*
|
|
18
|
+
* The program buffer is bound read-write here and only here. A bound word is written from scratch
|
|
19
|
+
* every frame, so whatever the CPU last uploaded to it is overwritten before anything reads it.
|
|
20
|
+
*
|
|
21
|
+
* Each channel is computed the way the emitter's builtin of the same name is in
|
|
22
|
+
* `chunk_particle_setup_context`, so a field bound to an entity reads as that entity's emitter
|
|
23
|
+
* builtins would. The orientation is the rotation left once each axis is normalised and a mirror
|
|
24
|
+
* is taken out of x.
|
|
25
|
+
*
|
|
26
|
+
* @type {ComputeShader}
|
|
27
|
+
*/
|
|
28
|
+
export const shader_particle_field_bind: ComputeShader;
|
|
29
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
30
|
+
//# sourceMappingURL=shader_particle_field_bind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_particle_field_bind.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_field_bind.js"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,iDAFU,MAAM,CAEqC;AAgFrD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,yCAFU,aAAa,CAMpB;8BAvH2B,+BAA+B"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
2
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
3
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
4
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
5
|
+
import { chunk_quat_from_m3 } from "../../shader/chunk/geometry/quaternion/chunk_quat_from_m3.js";
|
|
6
|
+
import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
|
|
7
|
+
import { PARTICLE_PROGRAM_FIELD_BASE_WORD } from "../ParticleConstants.js";
|
|
8
|
+
import { PARTICLE_FIELD_BINDING_DESCRIPTOR } from "../data/PARTICLE_DATABASE_SPEC.js";
|
|
9
|
+
import { PARTICLE_FIELD_BINDING_CHANNEL } from "../data/PARTICLE_FIELD_BINDING.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Threads per workgroup of {@link shader_particle_field_bind}: one per binding row, a page group
|
|
13
|
+
* per workgroup, as the emitter tick walks its table.
|
|
14
|
+
* @type {number}
|
|
15
|
+
*/
|
|
16
|
+
export const PARTICLE_FIELD_BIND_WORKGROUP_SIZE = 64;
|
|
17
|
+
|
|
18
|
+
const GROUP_SIZE = PARTICLE_FIELD_BIND_WORKGROUP_SIZE;
|
|
19
|
+
|
|
20
|
+
const PG = PARTICLE_FIELD_BINDING_DESCRIPTOR.page_iterator_symbol_prefix(GROUP_SIZE, false);
|
|
21
|
+
|
|
22
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
23
|
+
|
|
24
|
+
resources.createGroup()
|
|
25
|
+
.addStorageBuffer("scene_database", WebGPUArray.u32, false)
|
|
26
|
+
.addStorageBuffer("emitter_database", WebGPUArray.u32, false)
|
|
27
|
+
.addStorageBuffer("program", WebGPUArray.u32, true);
|
|
28
|
+
|
|
29
|
+
const body = CodeChunk.from(/* language=wgsl */ `
|
|
30
|
+
const FIELD_BIND_POSITION : u32 = ${PARTICLE_FIELD_BINDING_CHANNEL.POSITION}u;
|
|
31
|
+
const FIELD_BIND_DIRECTION : u32 = ${PARTICLE_FIELD_BINDING_CHANNEL.DIRECTION}u;
|
|
32
|
+
const FIELD_BIND_UP : u32 = ${PARTICLE_FIELD_BINDING_CHANNEL.UP}u;
|
|
33
|
+
const FIELD_BIND_PROGRAM_FIELD_BASE_WORD : u32 = ${PARTICLE_PROGRAM_FIELD_BASE_WORD}u;
|
|
34
|
+
|
|
35
|
+
@compute @workgroup_size(${GROUP_SIZE}, 1, 1)
|
|
36
|
+
fn main(
|
|
37
|
+
@builtin(workgroup_id) wg_id : vec3<u32>,
|
|
38
|
+
@builtin(local_invocation_index) local_id : u32,
|
|
39
|
+
) {
|
|
40
|
+
// page_address is uniform across the workgroup, so this branch is uniform.
|
|
41
|
+
if (!${PG}_setup(&emitter_database, wg_id.x, local_id)) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let slot_in_page = ${PG}_slot_in_page(local_id);
|
|
46
|
+
|
|
47
|
+
if (slot_in_page >= ${PG}_ELEMENTS_PER_PAGE || !${PG}_is_occupied(slot_in_page)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let bound = ${PG}_read(&emitter_database, slot_in_page);
|
|
52
|
+
let transform = scene_read_node(&scene_database, bound.source).global;
|
|
53
|
+
|
|
54
|
+
var value = vec4<f32>(0.0);
|
|
55
|
+
var words = 3u;
|
|
56
|
+
|
|
57
|
+
if (bound.channel == FIELD_BIND_POSITION) {
|
|
58
|
+
value = vec4<f32>((transform * vec4<f32>(0.0, 0.0, 0.0, 1.0)).xyz, 0.0);
|
|
59
|
+
} else if (bound.channel == FIELD_BIND_DIRECTION) {
|
|
60
|
+
value = vec4<f32>(normalize((transform * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz), 0.0);
|
|
61
|
+
} else if (bound.channel == FIELD_BIND_UP) {
|
|
62
|
+
value = vec4<f32>(normalize((transform * vec4<f32>(0.0, 1.0, 0.0, 0.0)).xyz), 0.0);
|
|
63
|
+
} else {
|
|
64
|
+
// the axes as products rather than column reads, as the builtins take them
|
|
65
|
+
let y = normalize((transform * vec4<f32>(0.0, 1.0, 0.0, 0.0)).xyz);
|
|
66
|
+
let z = normalize((transform * vec4<f32>(0.0, 0.0, 1.0, 0.0)).xyz);
|
|
67
|
+
var x = normalize((transform * vec4<f32>(1.0, 0.0, 0.0, 0.0)).xyz);
|
|
68
|
+
|
|
69
|
+
// A mirrored transform is a reflection, which no quaternion is: take the mirror out of x,
|
|
70
|
+
// and what is left is the rotation.
|
|
71
|
+
if (dot(cross(x, y), z) < 0.0) {
|
|
72
|
+
x = -x;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let rotation = mat3x3<f32>(x, y, z);
|
|
76
|
+
value = quat_from_m3(rotation);
|
|
77
|
+
words = 4u;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let k = program[FIELD_BIND_PROGRAM_FIELD_BASE_WORD] + bound.word;
|
|
81
|
+
|
|
82
|
+
program[k] = bitcast<u32>(value.x);
|
|
83
|
+
program[k + 1u] = bitcast<u32>(value.y);
|
|
84
|
+
program[k + 2u] = bitcast<u32>(value.z);
|
|
85
|
+
|
|
86
|
+
if (words > 3u) {
|
|
87
|
+
program[k + 3u] = bitcast<u32>(value.w);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
`, [
|
|
91
|
+
PARTICLE_FIELD_BINDING_DESCRIPTOR.chunk_iterate(GROUP_SIZE, false),
|
|
92
|
+
chunk_scene_database_access,
|
|
93
|
+
chunk_quat_from_m3,
|
|
94
|
+
]);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The transform bindings: one thread per row of the `field_bindings` table, reading the bound row's
|
|
98
|
+
* composed `global` out of the scene database and writing the channel the binding asks for into the
|
|
99
|
+
* field section of the program buffer — a global field, or a word of an emitter's block.
|
|
100
|
+
*
|
|
101
|
+
* It runs once a frame, after the hierarchy pass has composed the rows and before the spawn
|
|
102
|
+
* commands and the emitter tick, so every VM pass of the frame reads this frame's transforms. That
|
|
103
|
+
* is what lets a field follow a row only the GPU composes — an animated joint — with nothing copied
|
|
104
|
+
* through the CPU, as the emitter's own `EMITTER_POSITION` does. The host records it only while the
|
|
105
|
+
* table has rows.
|
|
106
|
+
*
|
|
107
|
+
* The program buffer is bound read-write here and only here. A bound word is written from scratch
|
|
108
|
+
* every frame, so whatever the CPU last uploaded to it is overwritten before anything reads it.
|
|
109
|
+
*
|
|
110
|
+
* Each channel is computed the way the emitter's builtin of the same name is in
|
|
111
|
+
* `chunk_particle_setup_context`, so a field bound to an entity reads as that entity's emitter
|
|
112
|
+
* builtins would. The orientation is the rotation left once each axis is normalised and a mirror
|
|
113
|
+
* is taken out of x.
|
|
114
|
+
*
|
|
115
|
+
* @type {ComputeShader}
|
|
116
|
+
*/
|
|
117
|
+
export const shader_particle_field_bind = ComputeShader.from({
|
|
118
|
+
label: "Particle Field Bind",
|
|
119
|
+
resources,
|
|
120
|
+
body,
|
|
121
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PARTICLE_VM_CONTEXT_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"PARTICLE_VM_CONTEXT_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,sDAWU;6BAhBmB,mCAAmC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
1
|
+
import { f32, u32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
2
|
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -13,4 +13,6 @@ export const PARTICLE_VM_CONTEXT_STRUCT = WebGPUStruct.from({
|
|
|
13
13
|
emitter_position: vec3f,
|
|
14
14
|
emitter_direction: vec3f,
|
|
15
15
|
emitter_up: vec3f,
|
|
16
|
+
/** where the emitter's block of emitter fields starts, in words from the field section's base */
|
|
17
|
+
emitter_field_offset: u32,
|
|
16
18
|
}).pack();
|
|
@@ -20,7 +20,7 @@ export function u32_to_unit_f32(u: number): number;
|
|
|
20
20
|
/**
|
|
21
21
|
* Execute one section of a particle program against a single particle record.
|
|
22
22
|
*
|
|
23
|
-
* The record is mutated in place (
|
|
23
|
+
* The record is mutated in place (particle field stores). Registers are local. Returns whether the
|
|
24
24
|
* particle asked to be destroyed and the advanced RNG state so the caller can persist it.
|
|
25
25
|
*
|
|
26
26
|
* This is the CPU reference semantics — the WGSL interpreter is written to match it exactly, and the
|
|
@@ -43,22 +43,30 @@ export function u32_to_unit_f32(u: number): number;
|
|
|
43
43
|
* which models the fused product, and `FRACT`, whose subtraction cannot round twice.
|
|
44
44
|
*
|
|
45
45
|
* @param {object} params
|
|
46
|
-
* @param {Uint32Array} params.words instruction words for the section (
|
|
46
|
+
* @param {Uint32Array} params.words instruction words for the section (INIT or UPDATE)
|
|
47
47
|
* @param {Float32Array} params.constants constant pool, one float per word
|
|
48
48
|
* @param {number} params.register_count size of the register file in `f32` slots
|
|
49
|
-
* @param {Uint32Array} params.record particle record words (mutated in place);
|
|
49
|
+
* @param {Uint32Array} params.record particle record words (mutated in place); particle fields are
|
|
50
|
+
* f32 bits
|
|
50
51
|
* @param {number[][]} [params.builtins] builtin values indexed by {@link VM_BUILTIN} id, each a 4-array
|
|
52
|
+
* @param {Uint32Array} [params.emitter_fields] the emitter's block of emitter fields, as f32 bit
|
|
53
|
+
* patterns; a read past its end is zero
|
|
54
|
+
* @param {Uint32Array} [params.global_fields] the global fields as f32 bit patterns, laid out by the
|
|
55
|
+
* system's global layout — the program must be linked against it, as placing it in the heap
|
|
56
|
+
* does; a read past its end is zero
|
|
51
57
|
* @param {number} [params.rng_state] initial RNG state (u32)
|
|
52
58
|
* @param {ParticleVMWindSampler|null} [params.sample_wind] how `SAMPLE_WIND` is answered; still air
|
|
53
59
|
* when left out
|
|
54
60
|
* @returns {{ killed: boolean, rng_state: number }}
|
|
55
61
|
*/
|
|
56
|
-
export function execute_particle_vm({ words, constants, register_count, record, builtins, rng_state, sample_wind, }: {
|
|
62
|
+
export function execute_particle_vm({ words, constants, register_count, record, builtins, emitter_fields, global_fields, rng_state, sample_wind, }: {
|
|
57
63
|
words: Uint32Array;
|
|
58
64
|
constants: Float32Array;
|
|
59
65
|
register_count: number;
|
|
60
66
|
record: Uint32Array;
|
|
61
67
|
builtins?: number[][];
|
|
68
|
+
emitter_fields?: Uint32Array;
|
|
69
|
+
global_fields?: Uint32Array;
|
|
62
70
|
rng_state?: number;
|
|
63
71
|
sample_wind?: ParticleVMWindSampler | null;
|
|
64
72
|
}): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParticleVMReference.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/ParticleVMReference.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ParticleVMReference.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/ParticleVMReference.js"],"names":[],"mappings":"AA+BA;;;;;;;GAOG;AACH,gCAHW,MAAM,GACJ;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAW5C;AAED;;;;;GAKG;AACH,mCAHW,MAAM,GACJ,MAAM,CAIlB;AA2FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH;IAhB+B,KAAK,EAAzB,WAAW;IACU,SAAS,EAA9B,YAAY;IACG,cAAc,EAA7B,MAAM;IACc,MAAM,EAA1B,WAAW;IAES,QAAQ,GAA5B,MAAM,EAAE,EAAE;IACW,cAAc,GAAnC,WAAW;IAEU,aAAa,GAAlC,WAAW;IAGK,SAAS,GAAzB,MAAM;IAC8B,WAAW,GAA/C,qBAAqB,GAAC,IAAI;IAExB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAqXlD;;;;;;;;;;;;0CA1aU,YAAY,KACZ,MAAM,KACN,MAAM,KACN,MAAM,KACJ,IAAI"}
|
|
@@ -4,6 +4,9 @@ import {
|
|
|
4
4
|
} from "../ParticleConstants.js";
|
|
5
5
|
import {
|
|
6
6
|
VM_BUILTIN_COMPONENTS,
|
|
7
|
+
VM_BUILTIN_EMITTER_FIELD_BASE,
|
|
8
|
+
VM_BUILTIN_FIELD_INDEX_MASK,
|
|
9
|
+
VM_BUILTIN_GLOBAL_FIELD_BASE,
|
|
7
10
|
VM_BUILTIN_PADDING,
|
|
8
11
|
VM_DEST,
|
|
9
12
|
VM_DST_MASK,
|
|
@@ -88,12 +91,22 @@ for (const [op, meta] of VM_ISA) {
|
|
|
88
91
|
|
|
89
92
|
const {
|
|
90
93
|
ABS, ACOS, ADD, ASIN, ATAN2, CLAMP, CMP_EQ, CMP_GE, CMP_GT, CMP_LE, CMP_LT, COS, CROSS,
|
|
91
|
-
DISTANCE, DIV, DOT, EXP, FLOOR, FRACT, HALT, KILL, LENGTH,
|
|
94
|
+
DISTANCE, DIV, DOT, EXP, FLOOR, FRACT, HALT, KILL, LENGTH, LOAD_PARTICLE_FIELD, LOAD_BUILTIN, LOAD_CONST,
|
|
92
95
|
LOG, MAD, MAX, MIN, MIX, MOV, MUL, NEG, NOP, NORMALIZE, POW, RANDOM, RSQRT, SAMPLE_WIND, SELECT,
|
|
93
|
-
SIN, SMOOTHSTEP, SQRT, STEP,
|
|
96
|
+
SIN, SMOOTHSTEP, SQRT, STEP, STORE_PARTICLE_FIELD, SUB, TAN,
|
|
94
97
|
} = VM_OP;
|
|
95
98
|
const KIND_REG = VM_KIND.REG;
|
|
96
99
|
const KIND_IMM = VM_KIND.IMM;
|
|
100
|
+
const EMITTER_FIELD_BASE = VM_BUILTIN_EMITTER_FIELD_BASE;
|
|
101
|
+
const GLOBAL_FIELD_BASE = VM_BUILTIN_GLOBAL_FIELD_BASE;
|
|
102
|
+
const FIELD_INDEX_MASK = VM_BUILTIN_FIELD_INDEX_MASK;
|
|
103
|
+
|
|
104
|
+
/** @type {Uint32Array} */
|
|
105
|
+
const NO_FIELDS = new Uint32Array(0);
|
|
106
|
+
|
|
107
|
+
// One word reinterpreted: a field is stored as f32 bit patterns, as the pool and the record are.
|
|
108
|
+
const FIELD_WORD = new Uint32Array(1);
|
|
109
|
+
const FIELD_WORD_F32 = new Float32Array(FIELD_WORD.buffer);
|
|
97
110
|
const OPCODE_MASK = VM_OP_MASK;
|
|
98
111
|
const WIDTH_SHIFT = VM_WIDTH_SHIFT;
|
|
99
112
|
const WIDTH_MASK = VM_WIDTH_MASK;
|
|
@@ -137,7 +150,7 @@ const LITERAL_U32 = new Uint32Array(LITERAL_F32.buffer);
|
|
|
137
150
|
/**
|
|
138
151
|
* Execute one section of a particle program against a single particle record.
|
|
139
152
|
*
|
|
140
|
-
* The record is mutated in place (
|
|
153
|
+
* The record is mutated in place (particle field stores). Registers are local. Returns whether the
|
|
141
154
|
* particle asked to be destroyed and the advanced RNG state so the caller can persist it.
|
|
142
155
|
*
|
|
143
156
|
* This is the CPU reference semantics — the WGSL interpreter is written to match it exactly, and the
|
|
@@ -160,11 +173,17 @@ const LITERAL_U32 = new Uint32Array(LITERAL_F32.buffer);
|
|
|
160
173
|
* which models the fused product, and `FRACT`, whose subtraction cannot round twice.
|
|
161
174
|
*
|
|
162
175
|
* @param {object} params
|
|
163
|
-
* @param {Uint32Array} params.words instruction words for the section (
|
|
176
|
+
* @param {Uint32Array} params.words instruction words for the section (INIT or UPDATE)
|
|
164
177
|
* @param {Float32Array} params.constants constant pool, one float per word
|
|
165
178
|
* @param {number} params.register_count size of the register file in `f32` slots
|
|
166
|
-
* @param {Uint32Array} params.record particle record words (mutated in place);
|
|
179
|
+
* @param {Uint32Array} params.record particle record words (mutated in place); particle fields are
|
|
180
|
+
* f32 bits
|
|
167
181
|
* @param {number[][]} [params.builtins] builtin values indexed by {@link VM_BUILTIN} id, each a 4-array
|
|
182
|
+
* @param {Uint32Array} [params.emitter_fields] the emitter's block of emitter fields, as f32 bit
|
|
183
|
+
* patterns; a read past its end is zero
|
|
184
|
+
* @param {Uint32Array} [params.global_fields] the global fields as f32 bit patterns, laid out by the
|
|
185
|
+
* system's global layout — the program must be linked against it, as placing it in the heap
|
|
186
|
+
* does; a read past its end is zero
|
|
168
187
|
* @param {number} [params.rng_state] initial RNG state (u32)
|
|
169
188
|
* @param {ParticleVMWindSampler|null} [params.sample_wind] how `SAMPLE_WIND` is answered; still air
|
|
170
189
|
* when left out
|
|
@@ -176,13 +195,15 @@ export function execute_particle_vm({
|
|
|
176
195
|
register_count,
|
|
177
196
|
record,
|
|
178
197
|
builtins = [],
|
|
198
|
+
emitter_fields = NO_FIELDS,
|
|
199
|
+
global_fields = NO_FIELDS,
|
|
179
200
|
rng_state = 0,
|
|
180
201
|
sample_wind = null,
|
|
181
202
|
}) {
|
|
182
203
|
// Register file: one f32 per slot. A value of width w occupies w consecutive slots.
|
|
183
204
|
const reg = new Float32Array(register_count);
|
|
184
205
|
|
|
185
|
-
// Reinterpret the record's u32 words as f32 for
|
|
206
|
+
// Reinterpret the record's u32 words as f32 for particle field load/store.
|
|
186
207
|
const record_f32 = new Float32Array(record.buffer, record.byteOffset, record.length);
|
|
187
208
|
|
|
188
209
|
let state = rng_state >>> 0;
|
|
@@ -268,17 +289,33 @@ export function execute_particle_vm({
|
|
|
268
289
|
for (let i = 0; i < w; i++) d[i] = constants[s0 + i];
|
|
269
290
|
break;
|
|
270
291
|
|
|
271
|
-
case
|
|
272
|
-
// Lanes past the
|
|
273
|
-
// asked for at width 3 is (x, 0, 0), which is what widening it
|
|
292
|
+
case LOAD_PARTICLE_FIELD:
|
|
293
|
+
// Lanes past the particle field's component count read zero — a one-component
|
|
294
|
+
// particle field asked for at width 3 is (x, 0, 0), which is what widening it
|
|
295
|
+
// costs: nothing.
|
|
274
296
|
for (let i = 0; i < w; i++) d[i] = i < s1 ? record_f32[s0 + i] : 0;
|
|
275
297
|
break;
|
|
276
298
|
|
|
277
|
-
case
|
|
299
|
+
case STORE_PARTICLE_FIELD:
|
|
278
300
|
for (let i = 0; i < s2; i++) record_f32[s1 + i] = a[i];
|
|
279
301
|
break;
|
|
280
302
|
|
|
281
303
|
case LOAD_BUILTIN: {
|
|
304
|
+
if (s0 >= EMITTER_FIELD_BASE) {
|
|
305
|
+
// A field: `w` words from the emitter's block or the global ones, as the WGSL
|
|
306
|
+
// reads them out of the field section.
|
|
307
|
+
const fields = s0 >= GLOBAL_FIELD_BASE ? global_fields : emitter_fields;
|
|
308
|
+
const index = s0 & FIELD_INDEX_MASK;
|
|
309
|
+
|
|
310
|
+
for (let i = 0; i < w; i++) {
|
|
311
|
+
const k = index + i;
|
|
312
|
+
|
|
313
|
+
FIELD_WORD[0] = k < fields.length ? fields[k] : 0;
|
|
314
|
+
d[i] = FIELD_WORD_F32[0];
|
|
315
|
+
}
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
|
|
282
319
|
/*
|
|
283
320
|
The host supplies the builtin's OWN lanes; the ISA supplies the rest.
|
|
284
321
|
|
|
@@ -440,7 +477,7 @@ export function execute_particle_vm({
|
|
|
440
477
|
// answer for a vector crossed with itself — where the device subtracts `inf - inf` and
|
|
441
478
|
// gets NaN. a = b = (0, 1e20, 1e20) is the shortest witness, and a NaN that exists
|
|
442
479
|
// only on the GPU is the worst shape this takes: invisible in the editor preview, and
|
|
443
|
-
// loose in a position
|
|
480
|
+
// loose in a position particle field from the first frame it appears.
|
|
444
481
|
case CROSS:
|
|
445
482
|
d[0] = Math.fround(Math.fround(a[1] * b[2]) - Math.fround(a[2] * b[1]));
|
|
446
483
|
d[1] = Math.fround(Math.fround(a[2] * b[0]) - Math.fround(a[0] * b[2]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_particle_vm.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/chunk_particle_vm.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk_particle_vm.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/chunk_particle_vm.js"],"names":[],"mappings":"AAwWA;;;GAGG;AACH,gCAFU,SAAS,CAEmG;0BA3W5F,oCAAoC"}
|
|
@@ -3,6 +3,9 @@ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
|
3
3
|
import {
|
|
4
4
|
PARTICLE_VM_INSTRUCTION_WORDS,
|
|
5
5
|
VM_BUILTIN,
|
|
6
|
+
VM_BUILTIN_EMITTER_FIELD_BASE,
|
|
7
|
+
VM_BUILTIN_FIELD_INDEX_MASK,
|
|
8
|
+
VM_BUILTIN_GLOBAL_FIELD_BASE,
|
|
6
9
|
VM_DST_MASK,
|
|
7
10
|
VM_DST_SHIFT,
|
|
8
11
|
VM_KIND,
|
|
@@ -19,6 +22,7 @@ import {
|
|
|
19
22
|
} from "../isa/ParticleVMISA.js";
|
|
20
23
|
import {
|
|
21
24
|
PARTICLE_PROGRAM_CODE_BASE_WORD,
|
|
25
|
+
PARTICLE_PROGRAM_FIELD_BASE_WORD,
|
|
22
26
|
PARTICLE_PROGRAM_HEADER_WORDS,
|
|
23
27
|
PARTICLE_VM_MAX_INSTRUCTIONS,
|
|
24
28
|
} from "../ParticleConstants.js";
|
|
@@ -48,12 +52,13 @@ import { PARTICLE_VM_CONTEXT_STRUCT } from "./PARTICLE_VM_CONTEXT_STRUCT.js";
|
|
|
48
52
|
* ## A lane per statement, never a computed component
|
|
49
53
|
*
|
|
50
54
|
* Nothing here indexes a vector by a variable. {@link vm_source} fills `v.x`, `v.y`, `v.z`, `v.w`
|
|
51
|
-
* one statement each behind a width test; the stores, the pool and
|
|
52
|
-
* do the same; the write-back is four predicated stores. The obvious loop —
|
|
53
|
-
* v[c] = ... }` — is the same program and three times slower on an RTX 4090
|
|
54
|
-
* for the simulate pass of a 4876-instruction effect at 20k alive): a
|
|
55
|
-
* computed index is addressable memory as far as the compiler is
|
|
56
|
-
* all moved to local memory and every lane became a store and a
|
|
55
|
+
* one statement each behind a width test; the stores, the pool and particle field loads and the RNG
|
|
56
|
+
* draws do the same; the write-back is four predicated stores. The obvious loop —
|
|
57
|
+
* `for (c < lanes) { v[c] = ... }` — is the same program and three times slower on an RTX 4090
|
|
58
|
+
* (5.0 ms against 1.7 ms for the simulate pass of a 4876-instruction effect at 20k alive): a
|
|
59
|
+
* vector written through a computed index is addressable memory as far as the compiler is
|
|
60
|
+
* concerned, so `a`, `b`, `c` and `d` all moved to local memory and every lane became a store and a
|
|
61
|
+
* reload. Spelled out, they stay in
|
|
57
62
|
* registers, and an instruction costs what it did under the per-opcode loops (within noise at 50k
|
|
58
63
|
* and 200k alive on the same effect), with the literal kind's savings on top. The register file is
|
|
59
64
|
* the one dynamically indexed array, as it always was.
|
|
@@ -124,9 +129,11 @@ import { PARTICLE_VM_CONTEXT_STRUCT } from "./PARTICLE_VM_CONTEXT_STRUCT.js";
|
|
|
124
129
|
* populate `vm_ctx` before invoking {@link particle_vm_execute}.
|
|
125
130
|
* - `particle_vm_execute(program, code_offset, instruction_count, constant_offset, pool,
|
|
126
131
|
* record_base)` runs one section. `program` is the packed program buffer — header, constant pool,
|
|
127
|
-
* code, see `ParticleConstants.PARTICLE_PROGRAM_HEADER_WORDS` — so code and data are one
|
|
128
|
-
*
|
|
129
|
-
*
|
|
132
|
+
* code, fields, see `ParticleConstants.PARTICLE_PROGRAM_HEADER_WORDS` — so code and data are one
|
|
133
|
+
* binding. Particle fields are read/written as f32 bit patterns inside `pool` at
|
|
134
|
+
* `record_base + particle_field_offset`. Emitter and global fields are read through
|
|
135
|
+
* `LOAD_BUILTIN` from the field section: a global field at its offset from the section's base, an
|
|
136
|
+
* emitter field from `vm_ctx.emitter_field_offset`, which `vm_ctx` must carry.
|
|
130
137
|
* - The three section parameters may be per-lane or wave-uniform; the interpreter is the same
|
|
131
138
|
* either way, but not its cost. Simulate passes them through `subgroupBroadcastFirst` because
|
|
132
139
|
* its waves are one program by construction (`../shaders/shader_particle_simulate.js`), and the
|
|
@@ -140,6 +147,7 @@ const PARTICLE_VM_MAX_INSTRUCTIONS : u32 = ${PARTICLE_VM_MAX_INSTRUCTIONS}u;
|
|
|
140
147
|
const PARTICLE_VM_INSTRUCTION_WORDS : u32 = ${PARTICLE_VM_INSTRUCTION_WORDS}u;
|
|
141
148
|
const PARTICLE_PROGRAM_HEADER_WORDS : u32 = ${PARTICLE_PROGRAM_HEADER_WORDS}u;
|
|
142
149
|
const PARTICLE_PROGRAM_CODE_BASE_WORD : u32 = ${PARTICLE_PROGRAM_CODE_BASE_WORD}u;
|
|
150
|
+
const PARTICLE_PROGRAM_FIELD_BASE_WORD : u32 = ${PARTICLE_PROGRAM_FIELD_BASE_WORD}u;
|
|
143
151
|
|
|
144
152
|
var<private> vm_killed : bool;
|
|
145
153
|
var<private> vm_ctx : ${PARTICLE_VM_CONTEXT_STRUCT.wgsl_ref};
|
|
@@ -238,9 +246,9 @@ fn particle_vm_execute(
|
|
|
238
246
|
if (w > 2u) { d.z = bitcast<f32>((*program)[k + 2u]); }
|
|
239
247
|
if (w > 3u) { d.w = bitcast<f32>((*program)[k + 3u]); }
|
|
240
248
|
}
|
|
241
|
-
case ${VM_OP.
|
|
242
|
-
// Lanes past the
|
|
243
|
-
//
|
|
249
|
+
case ${VM_OP.LOAD_PARTICLE_FIELD}u: {
|
|
250
|
+
// Lanes past the particle field's component count read zero, which is how a narrow
|
|
251
|
+
// particle field reaches a wider operation for free.
|
|
244
252
|
let k = record_base + s0;
|
|
245
253
|
let n = min(w, s1);
|
|
246
254
|
d.x = bitcast<f32>((*pool)[k]);
|
|
@@ -248,7 +256,7 @@ fn particle_vm_execute(
|
|
|
248
256
|
if (n > 2u) { d.z = bitcast<f32>((*pool)[k + 2u]); }
|
|
249
257
|
if (n > 3u) { d.w = bitcast<f32>((*pool)[k + 3u]); }
|
|
250
258
|
}
|
|
251
|
-
case ${VM_OP.
|
|
259
|
+
case ${VM_OP.STORE_PARTICLE_FIELD}u: {
|
|
252
260
|
// One record word per component; the width is the component count.
|
|
253
261
|
let k = record_base + s1;
|
|
254
262
|
(*pool)[k] = bitcast<u32>(a.x);
|
|
@@ -257,7 +265,21 @@ fn particle_vm_execute(
|
|
|
257
265
|
if (s2 > 3u) { (*pool)[k + 3u] = bitcast<u32>(a.w); }
|
|
258
266
|
lanes = 0u;
|
|
259
267
|
}
|
|
260
|
-
case ${VM_OP.LOAD_BUILTIN}u: {
|
|
268
|
+
case ${VM_OP.LOAD_BUILTIN}u: {
|
|
269
|
+
if (s0 < ${VM_BUILTIN_EMITTER_FIELD_BASE}u) {
|
|
270
|
+
d = vm_load_builtin(s0);
|
|
271
|
+
} else {
|
|
272
|
+
// A field: the instruction's width in words from the field section, as
|
|
273
|
+
// LOAD_CONST reads the pool. A global field is at its offset from the section's
|
|
274
|
+
// base; an emitter field from the emitter's own block.
|
|
275
|
+
var k = (*program)[PARTICLE_PROGRAM_FIELD_BASE_WORD] + (s0 & ${VM_BUILTIN_FIELD_INDEX_MASK}u);
|
|
276
|
+
if (s0 < ${VM_BUILTIN_GLOBAL_FIELD_BASE}u) { k = k + vm_ctx.emitter_field_offset; }
|
|
277
|
+
d.x = bitcast<f32>((*program)[k]);
|
|
278
|
+
if (w > 1u) { d.y = bitcast<f32>((*program)[k + 1u]); }
|
|
279
|
+
if (w > 2u) { d.z = bitcast<f32>((*program)[k + 2u]); }
|
|
280
|
+
if (w > 3u) { d.w = bitcast<f32>((*program)[k + 3u]); }
|
|
281
|
+
}
|
|
282
|
+
}
|
|
261
283
|
case ${VM_OP.KILL}u: {
|
|
262
284
|
if (a.x > 0.0) { vm_killed = true; }
|
|
263
285
|
lanes = 0u;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a shader reads the resident material textures — decided by {@link chunk_indirect_sample_texture},
|
|
3
|
+
* so the material reads written once (`sample_material_data`, `sample_material_alpha`) take one filter
|
|
4
|
+
* or the other by the pipeline they are linked into.
|
|
5
|
+
*
|
|
6
|
+
* Whether the pass averages its reads is the pass's, so it is fixed per shader: `Stochastic`, the
|
|
7
|
+
* default, for every pass that never sets it; `Exact` for the card capture, which stores each read.
|
|
8
|
+
*
|
|
9
|
+
* @type {ShaderSwitch}
|
|
10
|
+
*/
|
|
11
|
+
export const INDIRECT_TEXTURE_FILTER: ShaderSwitch;
|
|
12
|
+
import { ShaderSwitch } from "../../shader/compiler/ShaderSwitch.js";
|
|
13
|
+
//# sourceMappingURL=INDIRECT_TEXTURE_FILTER.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"INDIRECT_TEXTURE_FILTER.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.js"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,sCAFU,YAAY,CAEqF;6BAb9E,uCAAuC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ShaderSwitch } from "../../shader/compiler/ShaderSwitch.js";
|
|
2
|
+
import { IndirectTextureFilter } from "./IndirectTextureFilter.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* How a shader reads the resident material textures — decided by {@link chunk_indirect_sample_texture},
|
|
6
|
+
* so the material reads written once (`sample_material_data`, `sample_material_alpha`) take one filter
|
|
7
|
+
* or the other by the pipeline they are linked into.
|
|
8
|
+
*
|
|
9
|
+
* Whether the pass averages its reads is the pass's, so it is fixed per shader: `Stochastic`, the
|
|
10
|
+
* default, for every pass that never sets it; `Exact` for the card capture, which stores each read.
|
|
11
|
+
*
|
|
12
|
+
* @type {ShaderSwitch}
|
|
13
|
+
*/
|
|
14
|
+
export const INDIRECT_TEXTURE_FILTER = ShaderSwitch.enum('indirect texture filter', IndirectTextureFilter);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a read of the resident material textures (`indirect_sample_texture`) takes the texture filtered
|
|
3
|
+
* at a level: trilinearly, bilinear at the two levels around it and those lerped.
|
|
4
|
+
*/
|
|
5
|
+
export type IndirectTextureFilter = number;
|
|
6
|
+
export namespace IndirectTextureFilter {
|
|
7
|
+
let Stochastic: number;
|
|
8
|
+
let Exact: number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=IndirectTextureFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndirectTextureFilter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/path_tracer/shader/IndirectTextureFilter.js"],"names":[],"mappings":";;;;oCAIU,MAAM"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a read of the resident material textures (`indirect_sample_texture`) takes the texture filtered
|
|
3
|
+
* at a level: trilinearly, bilinear at the two levels around it and those lerped.
|
|
4
|
+
*
|
|
5
|
+
* @enum {number}
|
|
6
|
+
*/
|
|
7
|
+
export const IndirectTextureFilter = {
|
|
8
|
+
/**
|
|
9
|
+
* One tap of the filter, a texel of the two levels' eight drawn with its weight: what the filter
|
|
10
|
+
* gives on average, for a pass that averages many reads into each result — the path tracer.
|
|
11
|
+
*/
|
|
12
|
+
Stochastic: 0,
|
|
13
|
+
/** The filter itself, every tap weighed: for a pass that keeps each read as it is — the card capture. */
|
|
14
|
+
Exact: 1,
|
|
15
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* A resident material's tangent-space normal at `uv`, from its normal texture in the atlas
|
|
3
|
-
* the geometric normal exactly, when it has none
|
|
4
|
-
* INDIRECT_MATERIAL_STRUCT's `texture_normal` for why there is no
|
|
2
|
+
* A resident material's tangent-space normal at `uv`, from its normal texture in the atlas at `level`
|
|
3
|
+
* (see {@link chunk_indirect_sample_texture}) — or +Z, the geometric normal exactly, when it has none
|
|
4
|
+
* (`id` is GPU_DATABASE_NULL; see INDIRECT_MATERIAL_STRUCT's `texture_normal` for why there is no
|
|
5
|
+
* default texture to read instead).
|
|
5
6
|
*
|
|
6
7
|
* Reads the `textures` atlas binding, which {@link chunk_indirect_sample_texture} leaves to the
|
|
7
8
|
* shader that includes it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_indirect_sample_tangent_normal.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js"],"names":[],"mappings":"AAKA
|
|
1
|
+
{"version":3,"file":"chunk_indirect_sample_tangent_normal.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,mDAFU,SAAS,CAeZ;0BA3BmB,oCAAoC"}
|