@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
|
@@ -12,8 +12,9 @@ import View from "../../../../src/view/View.js";
|
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Everything about an effect that is not its simulation: how fast it emits, how its particles are
|
|
15
|
-
* blended and oriented, which
|
|
16
|
-
* schema those channels can name
|
|
15
|
+
* blended and oriented, which particle field drives which render channel, the particle field
|
|
16
|
+
* schema those channels can name, and the emitter and global fields the effect declares, with
|
|
17
|
+
* their starting and preview values.
|
|
17
18
|
*
|
|
18
19
|
* There is nothing here for bounds. An emitter has none to declare — the box the culling and
|
|
19
20
|
* occupancy passes use is measured from the live particles on the GPU — so the one bounds-related
|
|
@@ -23,17 +24,17 @@ import View from "../../../../src/view/View.js";
|
|
|
23
24
|
* nothing visible until something says that `position` is what the renderer should place the quad
|
|
24
25
|
* at — so it is a third panel over the same document rather than a section of either.
|
|
25
26
|
*
|
|
26
|
-
* ## Why the
|
|
27
|
+
* ## Why the particle field schema is here
|
|
27
28
|
*
|
|
28
|
-
* The layout is the contract between the simulation and the renderer: the VM addresses
|
|
29
|
-
* the word offsets it assigns, and the emitter record stores those same offsets for the
|
|
30
|
-
* channels. Editing it is editing that contract, which is why adding one is guarded by
|
|
31
|
-
* {@link ParticleEffectDocument#
|
|
32
|
-
* the channels that named it.
|
|
29
|
+
* The layout is the contract between the simulation and the renderer: the VM addresses particle
|
|
30
|
+
* fields by the word offsets it assigns, and the emitter record stores those same offsets for the
|
|
31
|
+
* render channels. Editing it is editing that contract, which is why adding one is guarded by
|
|
32
|
+
* {@link ParticleEffectDocument#addParticleField} rather than done by hand, and why removing one
|
|
33
|
+
* unbinds the channels that named it.
|
|
33
34
|
*/
|
|
34
35
|
|
|
35
36
|
/**
|
|
36
|
-
* Emitter
|
|
37
|
+
* Emitter settings that are a plain number, and the range a control should hold them to.
|
|
37
38
|
* @type {Array<{key: string, label: string, min: number, step: number, help: string}>}
|
|
38
39
|
*/
|
|
39
40
|
const NUMERIC_FIELDS = [
|
|
@@ -80,7 +81,7 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
80
81
|
/**
|
|
81
82
|
* @type {EmptyView}
|
|
82
83
|
*/
|
|
83
|
-
#
|
|
84
|
+
#particle_fields;
|
|
84
85
|
|
|
85
86
|
/**
|
|
86
87
|
* @type {EmptyView}
|
|
@@ -88,11 +89,11 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
88
89
|
#channels;
|
|
89
90
|
|
|
90
91
|
/**
|
|
91
|
-
* The rows listing the
|
|
92
|
-
* survives a rebuild with whatever is typed into it.
|
|
92
|
+
* The rows listing the particle fields. Separate from the section around it so the "add" row
|
|
93
|
+
* below survives a rebuild with whatever is typed into it.
|
|
93
94
|
* @type {EmptyView}
|
|
94
95
|
*/
|
|
95
|
-
#
|
|
96
|
+
#particle_field_rows;
|
|
96
97
|
|
|
97
98
|
/**
|
|
98
99
|
* The row each render channel picker sits in, by channel name. Held so a mis-sized binding can
|
|
@@ -109,16 +110,41 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
109
110
|
#channel_selects = new Map();
|
|
110
111
|
|
|
111
112
|
/**
|
|
112
|
-
* The
|
|
113
|
+
* The particle field schema the option lists were last built from.
|
|
113
114
|
*
|
|
114
|
-
* Only the
|
|
115
|
-
* change to the effect is far more often something else - a spawn rate, a node
|
|
116
|
-
* they are rebuilt when this changes and left alone otherwise, which is also what
|
|
117
|
-
* half-typed
|
|
115
|
+
* Only the particle fields decide the *shape* of the channel pickers and the particle field
|
|
116
|
+
* list, and a change to the effect is far more often something else - a spawn rate, a node
|
|
117
|
+
* parameter. So they are rebuilt when this changes and left alone otherwise, which is also what
|
|
118
|
+
* keeps a half-typed particle field name from being swept away by an unrelated edit.
|
|
118
119
|
*
|
|
119
120
|
* @type {string}
|
|
120
121
|
*/
|
|
121
|
-
#
|
|
122
|
+
#particle_fields_signature = "";
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* The rows listing the emitter fields, with the value each emitter of the effect starts from.
|
|
126
|
+
* @type {EmptyView}
|
|
127
|
+
*/
|
|
128
|
+
#emitter_field_rows;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The emitter field declarations, values included, the rows were last built from. A value is
|
|
132
|
+
* committed on `change`, so a rebuild after one never lands under an author's typing.
|
|
133
|
+
* @type {string}
|
|
134
|
+
*/
|
|
135
|
+
#emitter_fields_signature = "";
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* The rows listing the global fields the effect imports, with the value the preview gives each.
|
|
139
|
+
* @type {EmptyView}
|
|
140
|
+
*/
|
|
141
|
+
#global_field_rows;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The global field imports, values included, the rows were last built from.
|
|
145
|
+
* @type {string}
|
|
146
|
+
*/
|
|
147
|
+
#global_fields_signature = "";
|
|
122
148
|
|
|
123
149
|
/**
|
|
124
150
|
* @param {object} options
|
|
@@ -146,14 +172,46 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
146
172
|
|
|
147
173
|
this.#buildChannelRows();
|
|
148
174
|
|
|
149
|
-
this.#
|
|
150
|
-
this.#
|
|
151
|
-
this.addChild(this.#
|
|
175
|
+
this.#particle_fields = new EmptyView({ classList: ['section', 'particle-fields'] });
|
|
176
|
+
this.#particle_fields.addChild(new LabelView("particle fields", { classList: ['heading'] }));
|
|
177
|
+
this.addChild(this.#particle_fields);
|
|
178
|
+
|
|
179
|
+
this.#particle_field_rows = new EmptyView({ classList: ['particle-field-rows'] });
|
|
152
180
|
|
|
153
|
-
this.#
|
|
181
|
+
this.#particle_fields.addChild(this.#particle_field_rows);
|
|
182
|
+
this.#particle_fields.addChild(this.#buildFieldAdder(
|
|
183
|
+
'add-particle-field',
|
|
184
|
+
'new particle field',
|
|
185
|
+
(name, components) => this.effect.addParticleField(name, components)
|
|
186
|
+
));
|
|
154
187
|
|
|
155
|
-
|
|
156
|
-
|
|
188
|
+
const emitter_fields = new EmptyView({ classList: ['section', 'emitter-fields'] });
|
|
189
|
+
|
|
190
|
+
emitter_fields.addChild(new LabelView("emitter fields", { classList: ['heading'] }));
|
|
191
|
+
this.addChild(emitter_fields);
|
|
192
|
+
|
|
193
|
+
this.#emitter_field_rows = new EmptyView({ classList: ['particle-field-rows'] });
|
|
194
|
+
|
|
195
|
+
emitter_fields.addChild(this.#emitter_field_rows);
|
|
196
|
+
emitter_fields.addChild(this.#buildFieldAdder(
|
|
197
|
+
'add-emitter-field',
|
|
198
|
+
'new emitter field',
|
|
199
|
+
(name, components) => this.effect.addEmitterField(name, components)
|
|
200
|
+
));
|
|
201
|
+
|
|
202
|
+
const global_fields = new EmptyView({ classList: ['section', 'global-fields'] });
|
|
203
|
+
|
|
204
|
+
global_fields.addChild(new LabelView("global fields", { classList: ['heading'] }));
|
|
205
|
+
this.addChild(global_fields);
|
|
206
|
+
|
|
207
|
+
this.#global_field_rows = new EmptyView({ classList: ['particle-field-rows'] });
|
|
208
|
+
|
|
209
|
+
global_fields.addChild(this.#global_field_rows);
|
|
210
|
+
global_fields.addChild(this.#buildFieldAdder(
|
|
211
|
+
'add-global-field',
|
|
212
|
+
'imported global field',
|
|
213
|
+
(name, components) => this.effect.addGlobalField(name, components)
|
|
214
|
+
));
|
|
157
215
|
|
|
158
216
|
this.bindSignal(effect.on.changed, this.refresh, this);
|
|
159
217
|
this.on.linked.add(this.refresh, this);
|
|
@@ -164,27 +222,120 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
164
222
|
/**
|
|
165
223
|
* Re-read everything from the document.
|
|
166
224
|
*
|
|
167
|
-
* Values are pushed into every control; the option lists and the
|
|
168
|
-
* when the
|
|
169
|
-
* rebuilding them on every edit would sweep away whatever an author was in the middle of.
|
|
225
|
+
* Values are pushed into every control; the option lists and the field rows are rebuilt only
|
|
226
|
+
* when the declarations they show changed, because that is the only thing their shape follows
|
|
227
|
+
* and rebuilding them on every edit would sweep away whatever an author was in the middle of.
|
|
170
228
|
*/
|
|
171
229
|
refresh() {
|
|
172
230
|
for (const reader of this.#readers) {
|
|
173
231
|
reader();
|
|
174
232
|
}
|
|
175
233
|
|
|
176
|
-
const signature = this.effect.
|
|
177
|
-
.map(
|
|
234
|
+
const signature = this.effect.particle_fields
|
|
235
|
+
.map(particle_field => `${particle_field.name}:${particle_field.components}`)
|
|
178
236
|
.join(",");
|
|
179
237
|
|
|
180
|
-
if (signature !== this.#
|
|
181
|
-
this.#
|
|
238
|
+
if (signature !== this.#particle_fields_signature) {
|
|
239
|
+
this.#particle_fields_signature = signature;
|
|
182
240
|
|
|
183
241
|
this.#writeChannelOptions();
|
|
184
|
-
this.#
|
|
242
|
+
this.#buildParticleFields();
|
|
185
243
|
}
|
|
186
244
|
|
|
187
245
|
this.#writeChannelValues();
|
|
246
|
+
|
|
247
|
+
const emitter_signature = JSON.stringify(this.effect.emitter_fields);
|
|
248
|
+
|
|
249
|
+
if (emitter_signature !== this.#emitter_fields_signature) {
|
|
250
|
+
this.#emitter_fields_signature = emitter_signature;
|
|
251
|
+
|
|
252
|
+
this.#buildDeclaredFields(this.#emitter_field_rows, 'emitter-field', this.effect.emitter_fields, {
|
|
253
|
+
layout: () => this.effect.buildEmitterLayout(),
|
|
254
|
+
set_value: (name, value) => this.effect.setEmitterFieldValue(name, value),
|
|
255
|
+
remove: name => this.effect.removeEmitterField(name),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const global_signature = JSON.stringify(this.effect.global_fields);
|
|
260
|
+
|
|
261
|
+
if (global_signature !== this.#global_fields_signature) {
|
|
262
|
+
this.#global_fields_signature = global_signature;
|
|
263
|
+
|
|
264
|
+
this.#buildDeclaredFields(this.#global_field_rows, 'global-field', this.effect.global_fields, {
|
|
265
|
+
layout: () => this.effect.buildGlobalLayout(),
|
|
266
|
+
set_value: (name, value) => this.effect.setGlobalFieldValue(name, value),
|
|
267
|
+
remove: name => this.effect.removeGlobalField(name),
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Declared fields with a value each — emitter fields with the value an emitter starts from,
|
|
274
|
+
* global fields with the value the preview gives them — one number per component, and the word
|
|
275
|
+
* each occupies in its layout.
|
|
276
|
+
*
|
|
277
|
+
* @param {EmptyView} rows
|
|
278
|
+
* @param {string} row_class
|
|
279
|
+
* @param {Array<{name: string, components: number, value: number[]}>} declarations
|
|
280
|
+
* @param {{layout: function():(import("../../../../src/shade/renderer/particles/layout/ParticleLayout.js").ParticleLayout|null), set_value: function(string, number[]):void, remove: function(string):void}} edits
|
|
281
|
+
*/
|
|
282
|
+
#buildDeclaredFields(rows, row_class, declarations, edits) {
|
|
283
|
+
rows.removeAllChildren();
|
|
284
|
+
|
|
285
|
+
let layout = null;
|
|
286
|
+
|
|
287
|
+
try {
|
|
288
|
+
layout = edits.layout();
|
|
289
|
+
} catch (e) {
|
|
290
|
+
rows.addChild(new LabelView(e.message, { classList: ['problem', 'error'] }));
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
for (const declaration of declarations) {
|
|
294
|
+
const entry = new EmptyView({ classList: ['particle-field', row_class] });
|
|
295
|
+
|
|
296
|
+
const offset = layout === null || !layout.has(declaration.name)
|
|
297
|
+
? "?"
|
|
298
|
+
: String(layout.offsetOf(declaration.name));
|
|
299
|
+
|
|
300
|
+
entry.addChild(new LabelView(declaration.name, { classList: ['name'] }));
|
|
301
|
+
entry.addChild(new LabelView(`w${offset} · ${declaration.components}c`, { classList: ['where'] }));
|
|
302
|
+
|
|
303
|
+
for (let i = 0; i < declaration.components; i++) {
|
|
304
|
+
const input = document.createElement('input');
|
|
305
|
+
|
|
306
|
+
input.setAttribute('type', 'number');
|
|
307
|
+
input.setAttribute('step', 'any');
|
|
308
|
+
input.classList.add('lane');
|
|
309
|
+
input.value = String(declaration.value[i] ?? 0);
|
|
310
|
+
|
|
311
|
+
input.addEventListener('change', () => {
|
|
312
|
+
const parsed = Number.parseFloat(input.value);
|
|
313
|
+
|
|
314
|
+
if (!Number.isFinite(parsed)) {
|
|
315
|
+
input.value = String(declaration.value[i] ?? 0);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const value = Array.from({ length: declaration.components }, (_, lane) => declaration.value[lane] ?? 0);
|
|
320
|
+
|
|
321
|
+
value[i] = parsed;
|
|
322
|
+
|
|
323
|
+
edits.set_value(declaration.name, value);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
entry.addChild(new EmptyView({ el: input }));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const remove = new EmptyView({ classList: ['remove'] });
|
|
330
|
+
|
|
331
|
+
remove.addChild(new LabelView("✕"));
|
|
332
|
+
remove.el.setAttribute('title', `Remove '${declaration.name}'`);
|
|
333
|
+
remove.el.addEventListener('click', () => edits.remove(declaration.name));
|
|
334
|
+
|
|
335
|
+
entry.addChild(remove);
|
|
336
|
+
|
|
337
|
+
rows.addChild(entry);
|
|
338
|
+
}
|
|
188
339
|
}
|
|
189
340
|
|
|
190
341
|
/**
|
|
@@ -271,7 +422,7 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
271
422
|
}
|
|
272
423
|
|
|
273
424
|
/**
|
|
274
|
-
* Re-read the options every picker offers from the effect's
|
|
425
|
+
* Re-read the options every picker offers from the effect's particle fields.
|
|
275
426
|
*/
|
|
276
427
|
#writeChannelOptions() {
|
|
277
428
|
for (const select of this.#channel_selects.values()) {
|
|
@@ -282,11 +433,11 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
282
433
|
|
|
283
434
|
const options = [none];
|
|
284
435
|
|
|
285
|
-
for (const
|
|
436
|
+
for (const particle_field of this.effect.particle_fields) {
|
|
286
437
|
const option = document.createElement('option');
|
|
287
438
|
|
|
288
|
-
option.value =
|
|
289
|
-
option.textContent = `${
|
|
439
|
+
option.value = particle_field.name;
|
|
440
|
+
option.textContent = `${particle_field.name} (${particle_field.components})`;
|
|
290
441
|
|
|
291
442
|
options.push(option);
|
|
292
443
|
}
|
|
@@ -296,43 +447,43 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
296
447
|
}
|
|
297
448
|
|
|
298
449
|
/**
|
|
299
|
-
* Point every picker at what the emitter binds now. A binding naming
|
|
300
|
-
* reads as unbound, which is what the record would carry.
|
|
450
|
+
* Point every picker at what the emitter binds now. A binding naming a particle field that is
|
|
451
|
+
* gone reads as unbound, which is what the record would carry.
|
|
301
452
|
*/
|
|
302
453
|
#writeChannelValues() {
|
|
303
454
|
for (const [channel, select] of this.#channel_selects) {
|
|
304
455
|
const bound = this.effect.emitter.render[channel];
|
|
305
|
-
const
|
|
456
|
+
const particle_field = this.effect.particle_fields.find(candidate => candidate.name === bound);
|
|
306
457
|
|
|
307
|
-
select.value =
|
|
458
|
+
select.value = particle_field === undefined ? "" : bound;
|
|
308
459
|
|
|
309
|
-
this.#markChannelWidth(channel,
|
|
460
|
+
this.#markChannelWidth(channel, particle_field);
|
|
310
461
|
}
|
|
311
462
|
}
|
|
312
463
|
|
|
313
464
|
/**
|
|
314
|
-
* Mark a channel whose
|
|
465
|
+
* Mark a channel whose particle field is narrower than the render pass reads.
|
|
315
466
|
*
|
|
316
467
|
* The read is a fixed width — see {@link EMITTER_RENDER_CHANNEL_COMPONENTS} — so a narrow
|
|
317
|
-
*
|
|
318
|
-
* downstream objects to it, which is exactly why it is worth saying here.
|
|
468
|
+
* particle field is not a smaller read, it is a read into whatever the layout packed next.
|
|
469
|
+
* Nothing downstream objects to it, which is exactly why it is worth saying here.
|
|
319
470
|
*
|
|
320
471
|
* @param {string} channel
|
|
321
|
-
* @param {{name: string, components: number}|undefined}
|
|
472
|
+
* @param {{name: string, components: number}|undefined} particle_field
|
|
322
473
|
*/
|
|
323
|
-
#markChannelWidth(channel,
|
|
474
|
+
#markChannelWidth(channel, particle_field) {
|
|
324
475
|
const channel_row = this.#channel_rows.get(channel);
|
|
325
476
|
const wanted = EMITTER_RENDER_CHANNEL_COMPONENTS[channel];
|
|
326
477
|
|
|
327
|
-
const mismatched =
|
|
478
|
+
const mismatched = particle_field !== undefined && particle_field.components < wanted;
|
|
328
479
|
|
|
329
480
|
channel_row.setClass('mismatched', mismatched);
|
|
330
481
|
|
|
331
482
|
if (mismatched) {
|
|
332
483
|
channel_row.el.setAttribute(
|
|
333
484
|
'title',
|
|
334
|
-
`The render pass reads ${wanted} words for '${channel}', and '${
|
|
335
|
-
+ `${
|
|
485
|
+
`The render pass reads ${wanted} words for '${channel}', and '${particle_field.name}' is `
|
|
486
|
+
+ `${particle_field.components}. The rest comes from whatever the layout packed after it.`
|
|
336
487
|
);
|
|
337
488
|
} else {
|
|
338
489
|
channel_row.el.removeAttribute('title');
|
|
@@ -340,51 +491,57 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
340
491
|
}
|
|
341
492
|
|
|
342
493
|
/**
|
|
343
|
-
* The
|
|
494
|
+
* The particle field schema, with the word each occupies — which is what the VM
|
|
344
495
|
* addresses and what the emitter record stores for a render channel.
|
|
345
496
|
*/
|
|
346
|
-
#
|
|
347
|
-
this.#
|
|
497
|
+
#buildParticleFields() {
|
|
498
|
+
this.#particle_field_rows.removeAllChildren();
|
|
348
499
|
|
|
349
500
|
let layout = null;
|
|
350
501
|
|
|
351
502
|
try {
|
|
352
503
|
layout = this.effect.buildLayout();
|
|
353
504
|
} catch (e) {
|
|
354
|
-
this.#
|
|
505
|
+
this.#particle_field_rows.addChild(new LabelView(e.message, { classList: ['problem', 'error'] }));
|
|
355
506
|
}
|
|
356
507
|
|
|
357
|
-
for (const
|
|
358
|
-
const entry = new EmptyView({ classList: ['
|
|
508
|
+
for (const particle_field of this.effect.particle_fields) {
|
|
509
|
+
const entry = new EmptyView({ classList: ['particle-field'] });
|
|
359
510
|
|
|
360
|
-
const offset = layout === null || !layout.has(
|
|
511
|
+
const offset = layout === null || !layout.has(particle_field.name)
|
|
361
512
|
? "?"
|
|
362
|
-
: String(layout.offsetOf(
|
|
513
|
+
: String(layout.offsetOf(particle_field.name));
|
|
363
514
|
|
|
364
|
-
entry.addChild(new LabelView(
|
|
365
|
-
entry.addChild(new LabelView(`w${offset} · ${
|
|
515
|
+
entry.addChild(new LabelView(particle_field.name, { classList: ['name'] }));
|
|
516
|
+
entry.addChild(new LabelView(`w${offset} · ${particle_field.components}c`, { classList: ['where'] }));
|
|
366
517
|
|
|
367
518
|
const remove = new EmptyView({ classList: ['remove'] });
|
|
368
519
|
|
|
369
520
|
remove.addChild(new LabelView("✕"));
|
|
370
|
-
remove.el.setAttribute('title', `Remove '${
|
|
371
|
-
remove.el.addEventListener('click', () => this.effect.
|
|
521
|
+
remove.el.setAttribute('title', `Remove '${particle_field.name}'`);
|
|
522
|
+
remove.el.addEventListener('click', () => this.effect.removeParticleField(particle_field.name));
|
|
372
523
|
|
|
373
524
|
entry.addChild(remove);
|
|
374
525
|
|
|
375
|
-
this.#
|
|
526
|
+
this.#particle_field_rows.addChild(entry);
|
|
376
527
|
}
|
|
377
528
|
}
|
|
378
529
|
|
|
379
530
|
/**
|
|
531
|
+
* A row that declares a field: a name, a component count, and an "add" that hands both to
|
|
532
|
+
* `declare` and shows what it throws.
|
|
533
|
+
*
|
|
534
|
+
* @param {string} class_name
|
|
535
|
+
* @param {string} placeholder
|
|
536
|
+
* @param {function(string, number):void} declare
|
|
380
537
|
* @returns {View}
|
|
381
538
|
*/
|
|
382
|
-
#
|
|
383
|
-
const adder = new EmptyView({ classList: [
|
|
539
|
+
#buildFieldAdder(class_name, placeholder, declare) {
|
|
540
|
+
const adder = new EmptyView({ classList: [class_name] });
|
|
384
541
|
|
|
385
542
|
const name = text_input("");
|
|
386
543
|
|
|
387
|
-
name.setAttribute('placeholder',
|
|
544
|
+
name.setAttribute('placeholder', placeholder);
|
|
388
545
|
|
|
389
546
|
const components = document.createElement('select');
|
|
390
547
|
|
|
@@ -415,7 +572,7 @@ export class ParticleEmitterInspectorView extends View {
|
|
|
415
572
|
}
|
|
416
573
|
|
|
417
574
|
try {
|
|
418
|
-
|
|
575
|
+
declare(candidate, Number.parseInt(components.value, 10));
|
|
419
576
|
|
|
420
577
|
name.value = "";
|
|
421
578
|
} catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParticleGraphEditorView.d.ts","sourceRoot":"","sources":["../../../../../editor/view/particles/effect/ParticleGraphEditorView.js"],"names":[],"mappings":"AA4LA;IA6FI;;;;;OAKG;IACH;QAJyG,MAAM,EAApG,OAAO,qDAAqD,EAAE,sBAAsB;QAC1D,eAAe;OAsDnD;IAhDG,mBAAuC;IAIvC;;OAEG;IACH,QAFU,OAAO,qDAAqD,EAAE,sBAAsB,CAE1E;IAEpB;;OAEG;IACH,2CAAsC;
|
|
1
|
+
{"version":3,"file":"ParticleGraphEditorView.d.ts","sourceRoot":"","sources":["../../../../../editor/view/particles/effect/ParticleGraphEditorView.js"],"names":[],"mappings":"AA4LA;IA6FI;;;;;OAKG;IACH;QAJyG,MAAM,EAApG,OAAO,qDAAqD,EAAE,sBAAsB;QAC1D,eAAe;OAsDnD;IAhDG,mBAAuC;IAIvC;;OAEG;IACH,QAFU,OAAO,qDAAqD,EAAE,sBAAsB,CAE1E;IAEpB;;OAEG;IACH,2CAAsC;IAgY1C;;;;;;;;;;;;;;;OAeG;IACH,kBAHa,QAAQ,eAAa,IAAI,CAAC,CAwEtC;IAED;;;;;;;;OAQG;IACH,oBAFa,QAAQ,cAAc,CAAC,CAgCnC;IAwKD;;;;;;;;;;;;;OAaG;IACH,iBAHW,OAAO,qEAAqE,EAAE,iBAAiB,GAC7F,IAAI,CAsDhB;IAED;;;OAGG;IACH,cAFa,IAAI,CAIhB;IAED;;;;;OAKG;IACH,sBAHW,MAAM,GACJ,IAAI,CAWhB;IAED;;;;OAIG;IACH,cAFa,OAAO,qEAAqE,EAAE,iBAAiB,EAAE,CAI7G;IAED;;;;;;;;;;OAUG;IACH,gBAuCC;IAwBD;;;;;;;OAOG;IACH,wDAHW,MAAM,GACJ,qBAAqB,CAiBjC;IAqED;;;;OAIG;IACH,gBAFa,mBAAmB,CAQ/B;IAED;;OAEG;IACH,eAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,aAFW,MAAM,QAmBhB;IAoGD;;;;;;;;;OASG;IACH,mBAJW,OAAO,qEAAqE,EAAE,iBAAiB,SAC/F,MAAM,GACJ,IAAI,CAqBhB;IAED;;;;;;;;;;;OAWG;IACH,wBAoCC;IAoDD;;;;;OAKG;IACH,qBAHW,MAAM,WACN,MAAM,QA2BhB;IAED;;;;;OAKG;IACH,cAFa,OAAO,6CAA6C,EAAE,uBAAuB,GAAC,IAAI,CAI9F;IAED,eAuBC;;CAgCJ;iBAziDgB,8BAA8B;gCAvCf,sDAAsD;oCA0ClD,yCAAyC"}
|
|
@@ -57,8 +57,8 @@ import { ParticleNodeParametersView } from "./ParticleNodeParametersView.js";
|
|
|
57
57
|
*
|
|
58
58
|
* Built *with* the node-graph editor rather than in it. Everything particle-specific arrives
|
|
59
59
|
* through the seams the base offers — the node library the canvas's add-node menu offers, a
|
|
60
|
-
* parameter-view factory that draws vector, enum,
|
|
61
|
-
* clipboard needs (a group's boundary blocks are not something there can be a second of), and a
|
|
60
|
+
* parameter-view factory that draws vector, enum, field and swizzle controls, the one rule
|
|
61
|
+
* the clipboard needs (a group's boundary blocks are not something there can be a second of), and a
|
|
62
62
|
* problems list fed by the document's own compile. The base is left knowing nothing about particles.
|
|
63
63
|
*
|
|
64
64
|
* ## Adding a node
|
|
@@ -135,8 +135,8 @@ const PARTICLE_TYPE_COLORS = new Map([
|
|
|
135
135
|
* @type {Array<{name: string, types: string[]}>}
|
|
136
136
|
*/
|
|
137
137
|
const PALETTE_CATEGORIES = [
|
|
138
|
-
{ name: "sources", types: ["const", "color", "builtin", "
|
|
139
|
-
{ name: "output", types: ["
|
|
138
|
+
{ name: "sources", types: ["const", "color", "builtin", "particleField", "random"] },
|
|
139
|
+
{ name: "output", types: ["setParticleField", "kill"] },
|
|
140
140
|
// The three that are authored data rather than wiring, and are edited as a picture: a gradient
|
|
141
141
|
// strip and a curve plot. Their own heading, because "a colour ramp" is a thing an
|
|
142
142
|
// author goes looking for by name and would not think to look for under `sources`.
|
|
@@ -558,7 +558,11 @@ export class ParticleGraphEditorView extends View {
|
|
|
558
558
|
return {};
|
|
559
559
|
}
|
|
560
560
|
|
|
561
|
-
return particle_node_default_parameters(description.name, {
|
|
561
|
+
return particle_node_default_parameters(description.name, {
|
|
562
|
+
layout: this.#layoutOrNothing(),
|
|
563
|
+
emitter_layout: this.#emitterLayoutOrNothing(),
|
|
564
|
+
global_layout: this.#globalLayoutOrNothing(),
|
|
565
|
+
});
|
|
562
566
|
}
|
|
563
567
|
|
|
564
568
|
/**
|
|
@@ -936,7 +940,7 @@ export class ParticleGraphEditorView extends View {
|
|
|
936
940
|
}
|
|
937
941
|
|
|
938
942
|
/**
|
|
939
|
-
* The effect's
|
|
943
|
+
* The effect's particle field schema, or nothing when the declarations do not make one.
|
|
940
944
|
*
|
|
941
945
|
* @returns {import("../../../../src/shade/renderer/particles/layout/ParticleLayout.js").ParticleLayout|undefined}
|
|
942
946
|
*/
|
|
@@ -944,7 +948,32 @@ export class ParticleGraphEditorView extends View {
|
|
|
944
948
|
try {
|
|
945
949
|
return this.effect.buildLayout();
|
|
946
950
|
} catch (e) {
|
|
947
|
-
// a broken
|
|
951
|
+
// a broken particle field schema types the particle field reads as unknown, and
|
|
952
|
+
// nothing else
|
|
953
|
+
return undefined;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
/**
|
|
958
|
+
* @returns {import("../../../../src/shade/renderer/particles/layout/ParticleLayout.js").ParticleLayout|undefined}
|
|
959
|
+
*/
|
|
960
|
+
#emitterLayoutOrNothing() {
|
|
961
|
+
try {
|
|
962
|
+
return this.effect.buildEmitterLayout() ?? undefined;
|
|
963
|
+
} catch (e) {
|
|
964
|
+
// the same for a broken emitter field schema and the emitter field reads
|
|
965
|
+
return undefined;
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
/**
|
|
970
|
+
* @returns {import("../../../../src/shade/renderer/particles/layout/ParticleLayout.js").ParticleLayout|undefined}
|
|
971
|
+
*/
|
|
972
|
+
#globalLayoutOrNothing() {
|
|
973
|
+
try {
|
|
974
|
+
return this.effect.buildGlobalLayout() ?? undefined;
|
|
975
|
+
} catch (e) {
|
|
976
|
+
// and for broken global field imports and the global field reads
|
|
948
977
|
return undefined;
|
|
949
978
|
}
|
|
950
979
|
}
|
|
@@ -1165,9 +1194,9 @@ export class ParticleGraphEditorView extends View {
|
|
|
1165
1194
|
let types = this.#group_types.get(group);
|
|
1166
1195
|
|
|
1167
1196
|
if (types === undefined) {
|
|
1168
|
-
// No layout: a group has no effect and so no
|
|
1169
|
-
// reads
|
|
1170
|
-
// on the effect it is placed in.
|
|
1197
|
+
// No layout: a group has no effect and so no particle field schema of its own. A group
|
|
1198
|
+
// that reads a particle field types that read as unknown, which is honest — what it
|
|
1199
|
+
// reads depends on the effect it is placed in.
|
|
1171
1200
|
types = infer_particle_graph_types(group.graph);
|
|
1172
1201
|
|
|
1173
1202
|
this.#group_types.set(group, types);
|
|
@@ -1186,7 +1215,11 @@ export class ParticleGraphEditorView extends View {
|
|
|
1186
1215
|
let types = this.#types.get(id);
|
|
1187
1216
|
|
|
1188
1217
|
if (types === undefined) {
|
|
1189
|
-
types = infer_particle_graph_types(this.effect[id], {
|
|
1218
|
+
types = infer_particle_graph_types(this.effect[id], {
|
|
1219
|
+
layout: this.#layoutOrNothing(),
|
|
1220
|
+
emitter_layout: this.#emitterLayoutOrNothing(),
|
|
1221
|
+
global_layout: this.#globalLayoutOrNothing(),
|
|
1222
|
+
});
|
|
1190
1223
|
|
|
1191
1224
|
this.#types.set(id, types);
|
|
1192
1225
|
}
|
|
@@ -2,7 +2,8 @@ export class ParticleNodeParametersView extends View {
|
|
|
2
2
|
/**
|
|
3
3
|
* @param {object} options
|
|
4
4
|
* @param {import("../../../particles/effect/ParticleEffectDocument.js").ParticleEffectDocument} options.effect
|
|
5
|
-
* the effect document being edited; read for
|
|
5
|
+
* the effect document being edited; read for its field declarations, and watched for
|
|
6
|
+
* changes to them
|
|
6
7
|
* @param {NodeInstance} options.node
|
|
7
8
|
* @param {function(string, *)} options.commit called with a parameter name and its new value
|
|
8
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParticleNodeParametersView.d.ts","sourceRoot":"","sources":["../../../../../editor/view/particles/effect/ParticleNodeParametersView.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ParticleNodeParametersView.d.ts","sourceRoot":"","sources":["../../../../../editor/view/particles/effect/ParticleNodeParametersView.js"],"names":[],"mappings":"AAsCA;IAOI;;;;;;;OAOG;IACH;QANyG,MAAM,EAApG,OAAO,qDAAqD,EAAE,sBAAsB;QAG9D,IAAI;QACG,MAAM,SAA1B,MAAM;OA6BzB;IAxBG,mBAAuC;IAIvC;;OAEG;IACH,mBAAgB;;CA+bvB;iBAzfgB,8BAA8B"}
|