@woosh/meep-engine 3.58.0 → 3.59.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 +178 -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 +360 -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 +94 -38
- 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/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/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_clipmap/GPUProbeClipmapGI.d.ts +25 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +126 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +832 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +7 -0
- 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 +8 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +16 -0
- 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 +9 -0
- 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_INSTANCE_STRUCT.d.ts +0 -7
- 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 +0 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -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 +5 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +13 -22
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +99 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +139 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +65 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +393 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +17 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +108 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +31 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +113 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +85 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +273 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +13 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +151 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +13 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +133 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +22 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +135 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +20 -6
- 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 +152 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +7 -0
- 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 +8 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +14 -2
- 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 +50 -5
- 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 +188 -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 +4 -0
- 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 +26 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +3 -0
- 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 +8 -1
- 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 +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +1 -1
- 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 +26 -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 +210 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +3 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +3 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +2 -1
- 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 +5 -1
- 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 +3 -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 +27 -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/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/loader/gltf/tiny-gltf.d.ts +1 -1
- 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/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/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/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/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/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/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
|
@@ -4,14 +4,17 @@ import {
|
|
|
4
4
|
PARTICLE_DATABASE_INITIAL_SIZE,
|
|
5
5
|
PARTICLE_DATABASE_SPEC,
|
|
6
6
|
PARTICLE_EMITTER_STATE_TABLE,
|
|
7
|
-
PARTICLE_EMITTER_TABLE
|
|
7
|
+
PARTICLE_EMITTER_TABLE,
|
|
8
|
+
PARTICLE_FIELD_BINDING_TABLE,
|
|
8
9
|
} from "../data/PARTICLE_DATABASE_SPEC.js";
|
|
9
10
|
import { PARTICLE_EMITTER_STATE_EMPTY } from "../data/PARTICLE_EMITTER_STATE.js";
|
|
11
|
+
import { PARTICLE_FIELD_BINDING_CHANNEL_COMPONENTS } from "../data/PARTICLE_FIELD_BINDING.js";
|
|
10
12
|
import { create_emitter_record, write_emitter_record } from "../data/particle_emitter_record.js";
|
|
11
13
|
import { PARTICLE_GENERATION_FIRST, particle_generation_next } from "../data/particle_header.js";
|
|
12
14
|
import { GPUParticleEmitterContext } from "./GPUParticleEmitterContext.js";
|
|
13
15
|
import { ParticleEmitter } from "./ParticleEmitter.js";
|
|
14
16
|
import { ProgramHeap } from "./ProgramHeap.js";
|
|
17
|
+
import { warn_limited } from "../../../util/warn_limited.js";
|
|
15
18
|
|
|
16
19
|
/**
|
|
17
20
|
* @typedef {import("../../buffer/table/GPUTypedTable.js").GPUTypedTable} GPUTypedTable
|
|
@@ -40,17 +43,21 @@ const RECORD = create_emitter_record();
|
|
|
40
43
|
*
|
|
41
44
|
* **None of that bookkeeping is on the emitter.** An emitter is a description of an effect, with
|
|
42
45
|
* nothing in it that depends on a device; the row, the generation, the program placement, the
|
|
43
|
-
* `transforms` row it is placed at and the
|
|
46
|
+
* block of emitter fields, the transform bindings, the `transforms` row it is placed at and the
|
|
47
|
+
* atlas patch are a
|
|
44
48
|
* {@link ./GPUParticleEmitterContext.js} this registry holds against the emitter and hands out
|
|
45
49
|
* through {@link EmitterRegistry#context}. Registering an emitter creates one, removing it destroys
|
|
46
50
|
* one, and an emitter with no context here is an emitter this registry does not have.
|
|
47
51
|
*
|
|
48
52
|
* The GPU-owned per-emitter state is the database's second table, claimed and released here at the
|
|
49
|
-
* emitter's row and never written by the CPU otherwise.
|
|
53
|
+
* emitter's row and never written by the CPU otherwise. The third, `field_bindings`, holds one row
|
|
54
|
+
* per field bound to a transform, global fields' included.
|
|
50
55
|
*
|
|
51
|
-
* Programs
|
|
52
|
-
* into a packed {@link ProgramHeap} buffer
|
|
53
|
-
*
|
|
56
|
+
* Programs and field values are NOT in the database: programs are variable-length and shared, so
|
|
57
|
+
* they go into a packed {@link ProgramHeap} buffer, followed by the field section — the global
|
|
58
|
+
* fields, then every emitter's block of emitter fields — and the emitter record carries offsets
|
|
59
|
+
* into it. The heap is
|
|
60
|
+
* content-deduplicated and reference-counted — two emitters compiled from the same graph land on
|
|
54
61
|
* one program id, which is what the simulation-order bucketing buckets on, and the last emitter of
|
|
55
62
|
* an effect is what releases it.
|
|
56
63
|
*/
|
|
@@ -62,7 +69,7 @@ export class EmitterRegistry {
|
|
|
62
69
|
database;
|
|
63
70
|
|
|
64
71
|
/**
|
|
65
|
-
*
|
|
72
|
+
* Constants and code for every distinct program in the set, and the field values.
|
|
66
73
|
* @type {ProgramHeap}
|
|
67
74
|
*/
|
|
68
75
|
programs = new ProgramHeap();
|
|
@@ -91,7 +98,8 @@ export class EmitterRegistry {
|
|
|
91
98
|
* Whether {@link programs} has changed since {@link build_program} last packed it. The buffer is
|
|
92
99
|
* monolithic (a program is variable-length, so there is no table to page it into), so any change
|
|
93
100
|
* means re-uploading it whole — which is why the heap dedupes by content, and why this is
|
|
94
|
-
* separate from the per-row dirtiness the table tracks.
|
|
101
|
+
* separate from the per-row dirtiness the table tracks. Field values are not counted: they go
|
|
102
|
+
* out by the heap's dirty span ({@link ProgramHeap#fields_dirty}).
|
|
95
103
|
*
|
|
96
104
|
* Read off the heap's own version rather than kept as a flag: there is then no path that changes
|
|
97
105
|
* the programs and forgets to say so.
|
|
@@ -132,6 +140,12 @@ export class EmitterRegistry {
|
|
|
132
140
|
*/
|
|
133
141
|
#generation = PARTICLE_GENERATION_FIRST;
|
|
134
142
|
|
|
143
|
+
/**
|
|
144
|
+
* Global field transform bindings, by global field name.
|
|
145
|
+
* @type {Map<string, {row: number, transform_row: number, channel: number}>}
|
|
146
|
+
*/
|
|
147
|
+
#global_bindings = new Map();
|
|
148
|
+
|
|
135
149
|
/**
|
|
136
150
|
* @param {GPUDevice} device
|
|
137
151
|
*/
|
|
@@ -163,6 +177,14 @@ export class EmitterRegistry {
|
|
|
163
177
|
return this.database.get(PARTICLE_EMITTER_STATE_TABLE);
|
|
164
178
|
}
|
|
165
179
|
|
|
180
|
+
/**
|
|
181
|
+
* The transform binding table: one row per transform bound to a field.
|
|
182
|
+
* @returns {GPUTypedTable}
|
|
183
|
+
*/
|
|
184
|
+
get binding_table() {
|
|
185
|
+
return this.database.get(PARTICLE_FIELD_BINDING_TABLE);
|
|
186
|
+
}
|
|
187
|
+
|
|
166
188
|
/**
|
|
167
189
|
* @returns {number} number of live emitters
|
|
168
190
|
*/
|
|
@@ -201,8 +223,8 @@ export class EmitterRegistry {
|
|
|
201
223
|
}
|
|
202
224
|
|
|
203
225
|
/**
|
|
204
|
-
* What this registry assigned an emitter: its table row, generation, program placement,
|
|
205
|
-
* `transforms` row it is placed at and its atlas patch.
|
|
226
|
+
* What this registry assigned an emitter: its table row, generation, program placement, block of
|
|
227
|
+
* emitter fields, transform bindings, the `transforms` row it is placed at and its atlas patch.
|
|
206
228
|
*
|
|
207
229
|
* `undefined` for an emitter this registry does not hold — which is the way to ask whether one
|
|
208
230
|
* is live, there being no `-1` on the emitter to read instead.
|
|
@@ -223,6 +245,8 @@ export class EmitterRegistry {
|
|
|
223
245
|
* placed at — its entity's, one on — if already known; {@link set_transform_row} sets it
|
|
224
246
|
* later otherwise
|
|
225
247
|
* @returns {ParticleEmitter}
|
|
248
|
+
* @throws what {@link ProgramHeap#acquire} throws for a program whose global imports are refused;
|
|
249
|
+
* nothing is registered then
|
|
226
250
|
*/
|
|
227
251
|
add(config, transform_row = 0) {
|
|
228
252
|
const emitter = config.isParticleEmitter === true ? config : ParticleEmitter.from(config);
|
|
@@ -239,6 +263,11 @@ export class EmitterRegistry {
|
|
|
239
263
|
|
|
240
264
|
context.transform_row = transform_row;
|
|
241
265
|
|
|
266
|
+
// before the record: the record carries the block's offset
|
|
267
|
+
context.emitter_layout = emitter.emitter_layout;
|
|
268
|
+
context.field_block = this.programs.acquire_fields(emitter_field_word_count(context.emitter_layout));
|
|
269
|
+
this.programs.write_fields(context.field_block, emitter.emitter_fields);
|
|
270
|
+
|
|
242
271
|
// The table picks the slot — the lowest free one, so a removed emitter's row is reused
|
|
243
272
|
// rather than the id space growing without bound.
|
|
244
273
|
context.row = this.table.add(write_emitter_record(RECORD, emitter, context));
|
|
@@ -264,8 +293,9 @@ export class EmitterRegistry {
|
|
|
264
293
|
* its particles have died — remains available to an author who wants the tail to play out.
|
|
265
294
|
*
|
|
266
295
|
* The emitter itself comes out of this unchanged: what it loses is its context, which is
|
|
267
|
-
* everything being registered gave it. Its program
|
|
268
|
-
*
|
|
296
|
+
* everything being registered gave it. Its program, its block of emitter fields and its
|
|
297
|
+
* transform bindings go with the context — the heap counts program references, so an effect is
|
|
298
|
+
* only unpacked when its last emitter leaves.
|
|
269
299
|
*
|
|
270
300
|
* @param {ParticleEmitter} emitter
|
|
271
301
|
*/
|
|
@@ -290,10 +320,19 @@ export class EmitterRegistry {
|
|
|
290
320
|
this.table.remove(context.row);
|
|
291
321
|
this.state_table.remove(context.row);
|
|
292
322
|
|
|
323
|
+
for (const binding of context.bindings.values()) {
|
|
324
|
+
this.binding_table.remove(binding.row);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
context.bindings.clear();
|
|
328
|
+
|
|
293
329
|
this.programs.release(context.placement);
|
|
330
|
+
this.programs.release_fields(context.field_block);
|
|
294
331
|
|
|
295
332
|
context.placement = null;
|
|
296
333
|
context.program = null;
|
|
334
|
+
context.field_block = null;
|
|
335
|
+
context.emitter_layout = null;
|
|
297
336
|
|
|
298
337
|
this.#contexts.delete(emitter);
|
|
299
338
|
}
|
|
@@ -302,17 +341,19 @@ export class EmitterRegistry {
|
|
|
302
341
|
* Give a registered emitter different bytecode to run: its old program loses a reference, the new
|
|
303
342
|
* one gains one, and its row is restaged with the new placement.
|
|
304
343
|
*
|
|
305
|
-
* This is the runtime edit
|
|
306
|
-
*
|
|
307
|
-
*
|
|
344
|
+
* This is the runtime edit an author reworking an effect in the editor makes: the program of an
|
|
345
|
+
* emitter that is already live changes, and the effect it used to run goes away with the last
|
|
346
|
+
* emitter that ran it.
|
|
308
347
|
*
|
|
309
|
-
* The
|
|
310
|
-
* change with it: particles already in flight are laid out the old way, and new bytecode
|
|
311
|
-
* them at new offsets would read somebody else's field. Re-laying-out an effect means
|
|
312
|
-
* emitters.
|
|
348
|
+
* The particle field {@link ../layout/ParticleLayout.js layout} is NOT part of this and must
|
|
349
|
+
* not change with it: particles already in flight are laid out the old way, and new bytecode
|
|
350
|
+
* reading them at new offsets would read somebody else's field. Re-laying-out an effect means
|
|
351
|
+
* new emitters.
|
|
313
352
|
*
|
|
314
353
|
* @param {ParticleEmitter} emitter
|
|
315
354
|
* @param {import("../isa/ParticleProgram.js").ParticleProgram} program
|
|
355
|
+
* @throws what {@link ProgramHeap#acquire} throws for a program whose global imports are refused;
|
|
356
|
+
* the emitter keeps the program it had
|
|
316
357
|
*/
|
|
317
358
|
set_program(emitter, program) {
|
|
318
359
|
assert.defined(program, 'program');
|
|
@@ -340,6 +381,188 @@ export class EmitterRegistry {
|
|
|
340
381
|
context.invalidate();
|
|
341
382
|
}
|
|
342
383
|
|
|
384
|
+
/**
|
|
385
|
+
* Write a row of the scene's `transforms` table into one of an emitter's emitter fields every
|
|
386
|
+
* frame, on the GPU: `channel` says which part of the row's composed `global`. Binding a field
|
|
387
|
+
* that is already bound rebinds it.
|
|
388
|
+
*
|
|
389
|
+
* @param {ParticleEmitter} emitter
|
|
390
|
+
* @param {string} name an emitter field of the program the emitter runs
|
|
391
|
+
* @param {number} transform_row the row to read — the bound entity's, held by the caller
|
|
392
|
+
* @param {number} channel a {@link ../data/PARTICLE_FIELD_BINDING.js PARTICLE_FIELD_BINDING_CHANNEL}
|
|
393
|
+
* @throws if the emitter has no such field, the channel is unknown, or the field is not exactly
|
|
394
|
+
* as wide as the channel
|
|
395
|
+
*/
|
|
396
|
+
bind_emitter_field(emitter, name, transform_row, channel) {
|
|
397
|
+
assert.isNonNegativeInteger(transform_row, 'transform_row');
|
|
398
|
+
|
|
399
|
+
const context = this.#contexts.get(emitter);
|
|
400
|
+
|
|
401
|
+
assert.defined(context, 'emitter is not registered here');
|
|
402
|
+
|
|
403
|
+
const layout = binding_layout(emitter, context);
|
|
404
|
+
|
|
405
|
+
if (layout === null || !layout.has(name)) {
|
|
406
|
+
throw new Error(`The emitter has no emitter field '${name}' to bind`);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
check_binding_width(name, layout.componentsOf(name), channel);
|
|
410
|
+
|
|
411
|
+
let binding = context.bindings.get(name);
|
|
412
|
+
|
|
413
|
+
if (binding === undefined) {
|
|
414
|
+
binding = { row: -1, transform_row, channel };
|
|
415
|
+
context.bindings.set(name, binding);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
binding.transform_row = transform_row;
|
|
419
|
+
binding.channel = channel;
|
|
420
|
+
|
|
421
|
+
this.#stage_binding(binding, context.field_block.offset + layout.offsetOf(name));
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* The emitter layout {@link bind_emitter_field} binds an emitter's fields against: the emitter's
|
|
426
|
+
* own, unless its program was refused, and then that of the program it still runs.
|
|
427
|
+
*
|
|
428
|
+
* @param {ParticleEmitter} emitter
|
|
429
|
+
* @returns {import("../layout/ParticleLayout.js").ParticleLayout|null}
|
|
430
|
+
*/
|
|
431
|
+
binding_layout(emitter) {
|
|
432
|
+
const context = this.#contexts.get(emitter);
|
|
433
|
+
|
|
434
|
+
assert.defined(context, 'emitter is not registered here');
|
|
435
|
+
|
|
436
|
+
return binding_layout(emitter, context);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Stop writing a transform into an emitter field. The field holds the emitter's own value again
|
|
441
|
+
* from the next {@link EmitterRegistry#flush}, which restages the emitter.
|
|
442
|
+
*
|
|
443
|
+
* @param {ParticleEmitter} emitter
|
|
444
|
+
* @param {string} name
|
|
445
|
+
* @returns {boolean} false when the field was not bound
|
|
446
|
+
*/
|
|
447
|
+
unbind_emitter_field(emitter, name) {
|
|
448
|
+
const context = this.#contexts.get(emitter);
|
|
449
|
+
|
|
450
|
+
assert.defined(context, 'emitter is not registered here');
|
|
451
|
+
|
|
452
|
+
const binding = context.bindings.get(name);
|
|
453
|
+
|
|
454
|
+
if (binding === undefined) {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
this.binding_table.remove(binding.row);
|
|
459
|
+
context.bindings.delete(name);
|
|
460
|
+
context.invalidate();
|
|
461
|
+
|
|
462
|
+
return true;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Write a row of the scene's `transforms` table into a global field every frame, on the GPU.
|
|
467
|
+
* The global field is declared at the channel's width if nothing has declared it yet.
|
|
468
|
+
*
|
|
469
|
+
* @param {string} name
|
|
470
|
+
* @param {number} transform_row the row to read — the bound entity's, held by the caller
|
|
471
|
+
* @param {number} channel a {@link ../data/PARTICLE_FIELD_BINDING.js PARTICLE_FIELD_BINDING_CHANNEL}
|
|
472
|
+
* @throws if the channel is unknown, the global field is declared with another width than the
|
|
473
|
+
* channel's, or declaring it would run past the reserved words
|
|
474
|
+
*/
|
|
475
|
+
bind_global_field(name, transform_row, channel) {
|
|
476
|
+
assert.isNonNegativeInteger(transform_row, 'transform_row');
|
|
477
|
+
|
|
478
|
+
const components = PARTICLE_FIELD_BINDING_CHANNEL_COMPONENTS[channel];
|
|
479
|
+
const globals = this.programs.global_fields;
|
|
480
|
+
|
|
481
|
+
// the channel first: an unknown one has no width, and must not reach the layout
|
|
482
|
+
check_binding_width(name, globals.has(name) ? globals.get(name).components : components, channel);
|
|
483
|
+
|
|
484
|
+
const offset = globals.declare(name, components);
|
|
485
|
+
|
|
486
|
+
let binding = this.#global_bindings.get(name);
|
|
487
|
+
|
|
488
|
+
if (binding === undefined) {
|
|
489
|
+
binding = { row: -1, transform_row, channel };
|
|
490
|
+
this.#global_bindings.set(name, binding);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
binding.transform_row = transform_row;
|
|
494
|
+
binding.channel = channel;
|
|
495
|
+
|
|
496
|
+
this.#stage_binding(binding, offset);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Stop writing a transform into a global field. It reads its own value again — the last one set,
|
|
501
|
+
* or zero — which this marks to go out with the next field upload.
|
|
502
|
+
*
|
|
503
|
+
* @param {string} name
|
|
504
|
+
* @returns {boolean} false when the field was not bound
|
|
505
|
+
*/
|
|
506
|
+
unbind_global_field(name) {
|
|
507
|
+
const binding = this.#global_bindings.get(name);
|
|
508
|
+
|
|
509
|
+
if (binding === undefined) {
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
this.binding_table.remove(binding.row);
|
|
514
|
+
this.#global_bindings.delete(name);
|
|
515
|
+
|
|
516
|
+
const field = this.programs.global_fields.get(name);
|
|
517
|
+
|
|
518
|
+
this.programs.resend_fields(field.offset, field.offset + field.components);
|
|
519
|
+
|
|
520
|
+
return true;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* @param {{row: number, transform_row: number, channel: number}} binding
|
|
525
|
+
* @param {number} word where it writes, from the field section's base
|
|
526
|
+
*/
|
|
527
|
+
#stage_binding(binding, word) {
|
|
528
|
+
BINDING_RECORD.source = binding.transform_row;
|
|
529
|
+
BINDING_RECORD.word = word;
|
|
530
|
+
BINDING_RECORD.channel = binding.channel;
|
|
531
|
+
|
|
532
|
+
if (binding.row === -1) {
|
|
533
|
+
binding.row = this.binding_table.add(BINDING_RECORD);
|
|
534
|
+
} else {
|
|
535
|
+
this.binding_table.set(binding.row, BINDING_RECORD);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Restage an emitter's bindings at where its fields now are, dropping any whose field the
|
|
541
|
+
* running program's layout no longer has at that width.
|
|
542
|
+
*
|
|
543
|
+
* @param {GPUParticleEmitterContext} context
|
|
544
|
+
*/
|
|
545
|
+
#restage_bindings(context) {
|
|
546
|
+
if (context.bindings.size === 0) {
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
const layout = context.emitter_layout;
|
|
551
|
+
|
|
552
|
+
for (const [name, binding] of context.bindings) {
|
|
553
|
+
if (
|
|
554
|
+
layout === null || !layout.has(name)
|
|
555
|
+
|| layout.componentsOf(name) !== PARTICLE_FIELD_BINDING_CHANNEL_COMPONENTS[binding.channel]
|
|
556
|
+
) {
|
|
557
|
+
this.binding_table.remove(binding.row);
|
|
558
|
+
context.bindings.delete(name);
|
|
559
|
+
continue;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
this.#stage_binding(binding, context.field_block.offset + layout.offsetOf(name));
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
343
566
|
/**
|
|
344
567
|
* Look up a live emitter by its table row.
|
|
345
568
|
*
|
|
@@ -403,13 +626,19 @@ export class EmitterRegistry {
|
|
|
403
626
|
}
|
|
404
627
|
|
|
405
628
|
/**
|
|
406
|
-
* Restage the table rows of every emitter
|
|
629
|
+
* Restage the table rows of every emitter that has changed since the last flush, with its
|
|
630
|
+
* emitter field values and its transform bindings.
|
|
407
631
|
*
|
|
408
|
-
* "
|
|
632
|
+
* "Changed" is the emitter's own change counter: an emitter is restaged when its
|
|
409
633
|
* {@link ./ParticleEmitter.js ParticleEmitter#version} is not the one its row was staged from,
|
|
410
634
|
* or when something in its context changed. So an author marks an edited emitter with
|
|
411
635
|
* `needsUpdate = true`, and there is no second flag to forget.
|
|
412
636
|
*
|
|
637
|
+
* An emitter whose {@link ./ParticleEmitter.js ParticleEmitter#program} was replaced is moved to
|
|
638
|
+
* it here. A program the heap refuses is warned about and not tried again until the emitter's
|
|
639
|
+
* program changes; the emitter keeps running the one it had, and with it the block, values and
|
|
640
|
+
* bindings of that program's emitter layout. Does not throw for it.
|
|
641
|
+
*
|
|
413
642
|
* Cheap to call every frame: an emitter that has not changed costs one integer comparison, and
|
|
414
643
|
* the table coalesces repeated writes to one row within a frame anyway. Walks the context map
|
|
415
644
|
* rather than the emitter list so that a pass over the set is not also a lookup per emitter.
|
|
@@ -419,18 +648,40 @@ export class EmitterRegistry {
|
|
|
419
648
|
flush() {
|
|
420
649
|
const table = this.table;
|
|
421
650
|
|
|
422
|
-
// Reconcile
|
|
423
|
-
// and move
|
|
651
|
+
// Reconcile program and emitter-layout edits before checking relocation: acquiring a program
|
|
652
|
+
// or a resized field block can repack the heap and move rows we would otherwise have
|
|
653
|
+
// already staged.
|
|
424
654
|
for (const [emitter, context] of this.#contexts) {
|
|
425
|
-
if (emitter.program !== context.program) {
|
|
426
|
-
|
|
655
|
+
if (emitter.program !== context.program && emitter.program !== context.refused_program) {
|
|
656
|
+
try {
|
|
657
|
+
this.set_program(emitter, emitter.program);
|
|
658
|
+
context.refused_program = null;
|
|
659
|
+
} catch (e) {
|
|
660
|
+
// one effect the global layout cannot take must not stop every other emitter's frame
|
|
661
|
+
context.refused_program = emitter.program;
|
|
662
|
+
warn_limited(`EmitterRegistry: a program was refused and the emitter keeps its old one: ${e.message}`);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
// the emitter's layout is its program's: while that program is refused, the layout stays
|
|
667
|
+
// the one the running program reads
|
|
668
|
+
if (emitter.program === context.program) {
|
|
669
|
+
context.emitter_layout = emitter.emitter_layout;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
const word_count = emitter_field_word_count(context.emitter_layout);
|
|
673
|
+
|
|
674
|
+
if (context.field_block.word_count !== word_count) {
|
|
675
|
+
this.programs.release_fields(context.field_block);
|
|
676
|
+
context.field_block = this.programs.acquire_fields(word_count);
|
|
677
|
+
context.invalidate();
|
|
427
678
|
}
|
|
428
679
|
}
|
|
429
680
|
|
|
430
681
|
const placement_version = this.programs.placement_version;
|
|
431
682
|
|
|
432
|
-
// A repack moved every program that was already placed, so every row holds
|
|
433
|
-
// where
|
|
683
|
+
// A repack moved every program or field block that was already placed, so every row holds
|
|
684
|
+
// offsets into where they used to be. That is the one change no emitter announces — it is not an edit
|
|
434
685
|
// to any of them — so it is asked of the heap once here rather than pushed onto each context.
|
|
435
686
|
const relocated = placement_version !== this.#staged_placement_version;
|
|
436
687
|
|
|
@@ -442,17 +693,30 @@ export class EmitterRegistry {
|
|
|
442
693
|
}
|
|
443
694
|
|
|
444
695
|
table.set(context.row, write_emitter_record(RECORD, emitter, context));
|
|
696
|
+
|
|
697
|
+
// Written on every restage, as the record is; after a relocation alone the repack has
|
|
698
|
+
// already moved them, and this writes the same words again. Values laid out for a
|
|
699
|
+
// refused program's layout are not the running program's, and the block keeps the
|
|
700
|
+
// last ones that were.
|
|
701
|
+
if (context.emitter_layout === emitter.emitter_layout) {
|
|
702
|
+
this.programs.write_fields(context.field_block, emitter.emitter_fields);
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
// a binding writes at the block's offset, which may have moved
|
|
706
|
+
this.#restage_bindings(context);
|
|
707
|
+
|
|
445
708
|
context.staged(emitter);
|
|
446
709
|
}
|
|
447
710
|
}
|
|
448
711
|
|
|
449
712
|
/**
|
|
450
|
-
* The packed program buffer — header, constant pools, code — rebuilt whole.
|
|
713
|
+
* The packed program buffer — header, constant pools, code, fields — rebuilt whole.
|
|
451
714
|
*
|
|
452
715
|
* Call when {@link programs_dirty}; it answers the flag. The buffer is monolithic (a program is
|
|
453
716
|
* variable-length, so there is no table to page it into), so this is a full rebuild — the heap's
|
|
454
717
|
* content deduplication is what keeps it rare (it changes only when an effect the set has never
|
|
455
|
-
* seen is registered, or when
|
|
718
|
+
* seen is registered, or when a section is repacked to make room). Field value changes go by the
|
|
719
|
+
* heap's dirty span instead.
|
|
456
720
|
*
|
|
457
721
|
* @returns {Uint32Array}
|
|
458
722
|
*/
|
|
@@ -462,3 +726,46 @@ export class EmitterRegistry {
|
|
|
462
726
|
return this.programs.build_buffer();
|
|
463
727
|
}
|
|
464
728
|
}
|
|
729
|
+
|
|
730
|
+
/**
|
|
731
|
+
* The one record every binding row is staged through; the table serializes it synchronously.
|
|
732
|
+
*/
|
|
733
|
+
const BINDING_RECORD = { source: 0, word: 0, channel: 0 };
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* @param {string} name
|
|
737
|
+
* @param {number} components the field's
|
|
738
|
+
* @param {number} channel
|
|
739
|
+
* @throws if the channel does not write exactly as many words as the field has
|
|
740
|
+
*/
|
|
741
|
+
function check_binding_width(name, components, channel) {
|
|
742
|
+
const words = PARTICLE_FIELD_BINDING_CHANNEL_COMPONENTS[channel];
|
|
743
|
+
|
|
744
|
+
if (words === undefined) {
|
|
745
|
+
throw new Error(`Unknown transform binding channel ${channel}`);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
if (components !== words) {
|
|
749
|
+
throw new Error(`Field '${name}' has ${components} components and the channel writes ${words}`);
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/**
|
|
754
|
+
* @param {ParticleEmitter} emitter
|
|
755
|
+
* @param {GPUParticleEmitterContext} context its context
|
|
756
|
+
* @returns {import("../layout/ParticleLayout.js").ParticleLayout|null} see {@link EmitterRegistry#binding_layout}
|
|
757
|
+
*/
|
|
758
|
+
function binding_layout(emitter, context) {
|
|
759
|
+
return emitter.program === context.refused_program ? context.emitter_layout : emitter.emitter_layout;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/**
|
|
763
|
+
* How many words of emitter fields a block laid out by `layout` has to hold, and nothing for an
|
|
764
|
+
* effect that declares none.
|
|
765
|
+
*
|
|
766
|
+
* @param {import("../layout/ParticleLayout.js").ParticleLayout|null} layout
|
|
767
|
+
* @returns {number}
|
|
768
|
+
*/
|
|
769
|
+
function emitter_field_word_count(layout) {
|
|
770
|
+
return layout === null ? 0 : layout.word_count;
|
|
771
|
+
}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* Everything the GPU side knows about one {@link ./ParticleEmitter.js} that the emitter itself has
|
|
3
3
|
* no business knowing.
|
|
4
4
|
*
|
|
5
|
-
* An emitter is a description of an effect: what to run, how fast, how big, which
|
|
5
|
+
* An emitter is a description of an effect: what to run, how fast, how big, which particle field is
|
|
6
6
|
* the colour. None of that depends on a device. The rest — which row of the emitter table it was
|
|
7
|
-
* given, which tenancy of that row it is, where its program
|
|
8
|
-
*
|
|
7
|
+
* given, which tenancy of that row it is, where its program and its emitter fields were placed in
|
|
8
|
+
* the program heap, which transforms are bound to those fields, which `transforms` row it was
|
|
9
|
+
* registered at, where its texture was packed into the atlas —
|
|
9
10
|
* is the particle system's bookkeeping, true only while the emitter is registered and only for the
|
|
10
11
|
* registry that registered it. Kept on the emitter it would travel with a saved effect, mean
|
|
11
12
|
* nothing when loaded, and be there for an author to set to a number the table has never heard of.
|
|
@@ -55,6 +56,45 @@ export class GPUParticleEmitterContext {
|
|
|
55
56
|
* @type {import("./ProgramPlacement.js").ProgramPlacement|null}
|
|
56
57
|
*/
|
|
57
58
|
placement: import("./ProgramPlacement.js").ProgramPlacement | null;
|
|
59
|
+
/**
|
|
60
|
+
* Where this emitter's own emitter fields sit in the field section of the {@link ./ProgramHeap.js}:
|
|
61
|
+
* the instance's data, beside the class's code and constants but never shared with another
|
|
62
|
+
* emitter of the same program. Held rather than copied out for the same reason as
|
|
63
|
+
* {@link placement} — a repack rewrites its offset in place. A zero-word block for an emitter
|
|
64
|
+
* whose effect declares no emitter fields; `null` only outside registration.
|
|
65
|
+
*
|
|
66
|
+
* @type {import("./ProgramHeap.js").FieldBlock|null}
|
|
67
|
+
*/
|
|
68
|
+
field_block: import("./ProgramHeap.js").FieldBlock | null;
|
|
69
|
+
/**
|
|
70
|
+
* The emitter layout {@link program} was compiled against: what sizes {@link field_block} and
|
|
71
|
+
* places the values and bindings in it. The emitter's own `emitter_layout`, except while a
|
|
72
|
+
* program change is refused ({@link refused_program}) — the emitter's layout is then the refused
|
|
73
|
+
* program's, and this stays with the program that runs.
|
|
74
|
+
*
|
|
75
|
+
* @type {import("../layout/ParticleLayout.js").ParticleLayout|null}
|
|
76
|
+
*/
|
|
77
|
+
emitter_layout: import("../layout/ParticleLayout.js").ParticleLayout | null;
|
|
78
|
+
/**
|
|
79
|
+
* This emitter's transform bindings, by emitter field name: the `field_bindings` row each one
|
|
80
|
+
* occupies, the `transforms` row it reads and the channel it writes. Restaged with the emitter,
|
|
81
|
+
* because the word a binding writes is the block's offset plus the field's, and the block moves.
|
|
82
|
+
*
|
|
83
|
+
* @type {Map<string, {row: number, transform_row: number, channel: number}>}
|
|
84
|
+
*/
|
|
85
|
+
bindings: Map<string, {
|
|
86
|
+
row: number;
|
|
87
|
+
transform_row: number;
|
|
88
|
+
channel: number;
|
|
89
|
+
}>;
|
|
90
|
+
/**
|
|
91
|
+
* A program {@link ./EmitterRegistry.js EmitterRegistry#flush} could not give this emitter —
|
|
92
|
+
* one whose global imports the system's layout refuses — so that it is not tried again every
|
|
93
|
+
* frame. The emitter keeps running the program it had.
|
|
94
|
+
*
|
|
95
|
+
* @type {import("../isa/ParticleProgram.js").ParticleProgram|null}
|
|
96
|
+
*/
|
|
97
|
+
refused_program: import("../isa/ParticleProgram.js").ParticleProgram | null;
|
|
58
98
|
/** Author's immutable program reference, distinct from the heap's owned copy.
|
|
59
99
|
* @type {import("../isa/ParticleProgram.js").ParticleProgram|null}
|
|
60
100
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUParticleEmitterContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"GPUParticleEmitterContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IAEI;;;;;;;;OAQG;IACH,KAFU,MAAM,CAEP;IAET;;;;;;OAMG;IACH,YAFU,MAAM,CAED;IAEf;;;;;;OAMG;IACH,eAFU,MAAM,CAEE;IAElB;;;;;;;OAOG;IACH,WAFU,OAAO,uBAAuB,EAAE,gBAAgB,GAAC,IAAI,CAE9C;IAEjB;;;;;;;;OAQG;IACH,aAFU,OAAO,kBAAkB,EAAE,UAAU,GAAC,IAAI,CAEjC;IAEnB;;;;;;;OAOG;IACH,gBAFU,OAAO,6BAA6B,EAAE,cAAc,GAAC,IAAI,CAE7C;IAEtB;;;;;;OAMG;IACH,UAFU,IAAI,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC,CAEvD;IAErB;;;;;;OAMG;IACH,iBAFU,OAAO,2BAA2B,EAAE,eAAe,GAAC,IAAI,CAE3C;IAEvB;;OAEG;IACH,SAFU,OAAO,2BAA2B,EAAE,eAAe,GAAC,IAAI,CAEnD;IAEf;;;;;;;;;;OAUG;IACH,cAFU,YAAY,CAEwB;IAE9C;;;;;;;;;;;;;;OAcG;IACH,gBAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,kBAHW,OAAO,sBAAsB,EAAE,eAAe,GAC5C,OAAO,CAInB;IAED;;;OAGG;IACH,mBAEC;IAED;;;;OAIG;IACH,gBAFW,OAAO,sBAAsB,EAAE,eAAe,QAMxD;CACJ"}
|
|
@@ -4,10 +4,11 @@ import { assert } from "../../../../core/assert.js";
|
|
|
4
4
|
* Everything the GPU side knows about one {@link ./ParticleEmitter.js} that the emitter itself has
|
|
5
5
|
* no business knowing.
|
|
6
6
|
*
|
|
7
|
-
* An emitter is a description of an effect: what to run, how fast, how big, which
|
|
7
|
+
* An emitter is a description of an effect: what to run, how fast, how big, which particle field is
|
|
8
8
|
* the colour. None of that depends on a device. The rest — which row of the emitter table it was
|
|
9
|
-
* given, which tenancy of that row it is, where its program
|
|
10
|
-
*
|
|
9
|
+
* given, which tenancy of that row it is, where its program and its emitter fields were placed in
|
|
10
|
+
* the program heap, which transforms are bound to those fields, which `transforms` row it was
|
|
11
|
+
* registered at, where its texture was packed into the atlas —
|
|
11
12
|
* is the particle system's bookkeeping, true only while the emitter is registered and only for the
|
|
12
13
|
* registry that registered it. Kept on the emitter it would travel with a saved effect, mean
|
|
13
14
|
* nothing when loaded, and be there for an author to set to a number the table has never heard of.
|
|
@@ -62,6 +63,45 @@ export class GPUParticleEmitterContext {
|
|
|
62
63
|
*/
|
|
63
64
|
placement = null;
|
|
64
65
|
|
|
66
|
+
/**
|
|
67
|
+
* Where this emitter's own emitter fields sit in the field section of the {@link ./ProgramHeap.js}:
|
|
68
|
+
* the instance's data, beside the class's code and constants but never shared with another
|
|
69
|
+
* emitter of the same program. Held rather than copied out for the same reason as
|
|
70
|
+
* {@link placement} — a repack rewrites its offset in place. A zero-word block for an emitter
|
|
71
|
+
* whose effect declares no emitter fields; `null` only outside registration.
|
|
72
|
+
*
|
|
73
|
+
* @type {import("./ProgramHeap.js").FieldBlock|null}
|
|
74
|
+
*/
|
|
75
|
+
field_block = null;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The emitter layout {@link program} was compiled against: what sizes {@link field_block} and
|
|
79
|
+
* places the values and bindings in it. The emitter's own `emitter_layout`, except while a
|
|
80
|
+
* program change is refused ({@link refused_program}) — the emitter's layout is then the refused
|
|
81
|
+
* program's, and this stays with the program that runs.
|
|
82
|
+
*
|
|
83
|
+
* @type {import("../layout/ParticleLayout.js").ParticleLayout|null}
|
|
84
|
+
*/
|
|
85
|
+
emitter_layout = null;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* This emitter's transform bindings, by emitter field name: the `field_bindings` row each one
|
|
89
|
+
* occupies, the `transforms` row it reads and the channel it writes. Restaged with the emitter,
|
|
90
|
+
* because the word a binding writes is the block's offset plus the field's, and the block moves.
|
|
91
|
+
*
|
|
92
|
+
* @type {Map<string, {row: number, transform_row: number, channel: number}>}
|
|
93
|
+
*/
|
|
94
|
+
bindings = new Map();
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* A program {@link ./EmitterRegistry.js EmitterRegistry#flush} could not give this emitter —
|
|
98
|
+
* one whose global imports the system's layout refuses — so that it is not tried again every
|
|
99
|
+
* frame. The emitter keeps running the program it had.
|
|
100
|
+
*
|
|
101
|
+
* @type {import("../isa/ParticleProgram.js").ParticleProgram|null}
|
|
102
|
+
*/
|
|
103
|
+
refused_program = null;
|
|
104
|
+
|
|
65
105
|
/** Author's immutable program reference, distinct from the heap's owned copy.
|
|
66
106
|
* @type {import("../isa/ParticleProgram.js").ParticleProgram|null}
|
|
67
107
|
*/
|