@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
|
@@ -26,17 +26,26 @@ import {
|
|
|
26
26
|
} from "../../../src/shade/renderer/particles/isa/particle_assembly.js";
|
|
27
27
|
import { PARTICLE_TYPE_COLOR } from "../../../src/shade/renderer/particles/graph/ParticleValueType.js";
|
|
28
28
|
import { ParticleLayout } from "../../../src/shade/renderer/particles/layout/ParticleLayout.js";
|
|
29
|
+
import {
|
|
30
|
+
PARTICLE_VM_INSTRUCTION_WORDS,
|
|
31
|
+
VM_BUILTIN_FIELD_INDEX_MASK,
|
|
32
|
+
VM_OP,
|
|
33
|
+
VM_OP_MASK,
|
|
34
|
+
VM_WIDTH_MASK,
|
|
35
|
+
VM_WIDTH_SHIFT,
|
|
36
|
+
vm_builtin_is_emitter_field,
|
|
37
|
+
} from "../../../src/shade/renderer/particles/isa/ParticleVMISA.js";
|
|
29
38
|
import { optimize_particle_program_vector } from "../../../src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js";
|
|
30
39
|
import { EMITTER_RENDER_CHANNELS } from "../../../src/shade/renderer/particles/runtime/ParticleEmitter.js";
|
|
31
40
|
|
|
32
41
|
/**
|
|
33
42
|
* One particle effect being edited: the thing both layers of the editor point at.
|
|
34
43
|
*
|
|
35
|
-
* An effect is
|
|
36
|
-
* the emitter settings that say how the result is drawn. The graph editor edits the
|
|
37
|
-
* code editor edits what they compile to, the emitter inspector edits the
|
|
38
|
-
* watches all of it. Putting them in one object with one change signal is
|
|
39
|
-
* independent views rather than four copies of the same state.
|
|
44
|
+
* An effect is its field declarations — particle, emitter and global — an INIT graph, an UPDATE
|
|
45
|
+
* graph, and the emitter settings that say how the result is drawn. The graph editor edits the
|
|
46
|
+
* graphs, the code editor edits what they compile to, the emitter inspector edits the fields and the
|
|
47
|
+
* settings, and the preview watches all of it. Putting them in one object with one change signal is
|
|
48
|
+
* what lets those be four independent views rather than four copies of the same state.
|
|
40
49
|
*
|
|
41
50
|
* ## Which layer is in charge
|
|
42
51
|
*
|
|
@@ -87,8 +96,16 @@ export const PARTICLE_EFFECT_SOURCE = Object.freeze({
|
|
|
87
96
|
* @typedef {object} ParticleEffectCompilation
|
|
88
97
|
* @property {import("../../../src/shade/renderer/particles/isa/ParticleProgram.js").ParticleProgram|null} program
|
|
89
98
|
* null when anything went wrong
|
|
90
|
-
* @property {ParticleLayout|null} layout the
|
|
91
|
-
* null when the declarations themselves are not a valid layout
|
|
99
|
+
* @property {ParticleLayout|null} layout the particle field schema the program was compiled
|
|
100
|
+
* against; null when the declarations themselves are not a valid layout
|
|
101
|
+
* @property {ParticleLayout|null} emitter_layout the emitter field schema the program was compiled
|
|
102
|
+
* against; null for an effect that declares no emitter fields, or whose declarations are invalid
|
|
103
|
+
* @property {Uint32Array} emitter_fields the declared values of those fields, as f32 bit patterns
|
|
104
|
+
* laid out by `emitter_layout` — what every emitter of the effect starts from
|
|
105
|
+
* @property {ParticleLayout|null} global_layout the global fields the effect imports; null for one
|
|
106
|
+
* that imports none
|
|
107
|
+
* @property {Uint32Array} global_fields their preview values, as f32 bit patterns laid out by
|
|
108
|
+
* `global_layout` — what the editor's preview reads; a scene sets its own
|
|
92
109
|
* @property {import("../../../src/shade/renderer/particles/isa/ParticleProgram.js").ParticleProgram|null} unoptimized
|
|
93
110
|
* what `program` was built from, before the optimizer. The same object as `program` when
|
|
94
111
|
* {@link ParticleEffectDocument#optimize} is off, so a caller wanting the comparison can always
|
|
@@ -98,6 +115,87 @@ export const PARTICLE_EFFECT_SOURCE = Object.freeze({
|
|
|
98
115
|
* `line` is a 1-based assembly line or 0
|
|
99
116
|
*/
|
|
100
117
|
|
|
118
|
+
/**
|
|
119
|
+
* The empty schema a graph is checked against when the effect declares no emitter fields, or imports
|
|
120
|
+
* no global ones.
|
|
121
|
+
* @type {ParticleLayout}
|
|
122
|
+
*/
|
|
123
|
+
const NO_EMITTER_FIELDS = ParticleLayout.emitter([]);
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* What is wrong with an assembled program's field reads against the effect's declarations.
|
|
127
|
+
*
|
|
128
|
+
* @param {import("../../../src/shade/renderer/particles/isa/ParticleProgram.js").ParticleProgram|null} program
|
|
129
|
+
* @param {ParticleLayout|null} emitter_layout
|
|
130
|
+
* @param {ParticleLayout|null} global_layout
|
|
131
|
+
* @returns {string[]}
|
|
132
|
+
*/
|
|
133
|
+
function assembly_field_problems(program, emitter_layout, global_layout) {
|
|
134
|
+
if (program === null) {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const problems = [];
|
|
139
|
+
|
|
140
|
+
for (const entry of program.global_imports) {
|
|
141
|
+
if (global_layout === null || !global_layout.has(entry.name)) {
|
|
142
|
+
problems.push(`The program imports the global field '${entry.name}', which the effect does not import.`);
|
|
143
|
+
} else if (global_layout.componentsOf(entry.name) !== entry.components) {
|
|
144
|
+
problems.push(
|
|
145
|
+
`The program imports '${entry.name}' with ${entry.components} components and the effect `
|
|
146
|
+
+ `declares it with ${global_layout.componentsOf(entry.name)}.`
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const block_words = emitter_layout === null ? 0 : emitter_layout.word_count;
|
|
152
|
+
|
|
153
|
+
for (const words of [program.init, program.update]) {
|
|
154
|
+
for (let k = 0; k < words.length; k += PARTICLE_VM_INSTRUCTION_WORDS) {
|
|
155
|
+
if ((words[k] & VM_OP_MASK) !== VM_OP.LOAD_BUILTIN || !vm_builtin_is_emitter_field(words[k + 1])) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const offset = words[k + 1] & VM_BUILTIN_FIELD_INDEX_MASK;
|
|
160
|
+
const width = (words[k] >>> VM_WIDTH_SHIFT) & VM_WIDTH_MASK;
|
|
161
|
+
|
|
162
|
+
if (offset + width > block_words) {
|
|
163
|
+
problems.push(
|
|
164
|
+
`A read of emitter_field:${offset} at ${width} lanes runs past the ${block_words} words `
|
|
165
|
+
+ `the effect's emitter fields take.`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return problems;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Declared field values, laid out by `layout` as f32 bit patterns.
|
|
176
|
+
*
|
|
177
|
+
* @param {ParticleLayout|null} layout
|
|
178
|
+
* @param {Array<{name: string, value: number[]}>} declarations
|
|
179
|
+
* @returns {Uint32Array}
|
|
180
|
+
*/
|
|
181
|
+
function field_values(layout, declarations) {
|
|
182
|
+
if (layout === null) {
|
|
183
|
+
return new Uint32Array(0);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const values = new Float32Array(layout.word_count);
|
|
187
|
+
|
|
188
|
+
for (const declaration of declarations) {
|
|
189
|
+
const field = layout.get(declaration.name);
|
|
190
|
+
|
|
191
|
+
for (let i = 0; i < field.components; i++) {
|
|
192
|
+
values[field.offset + i] = declaration.value?.[i] ?? 0;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return new Uint32Array(values.buffer);
|
|
197
|
+
}
|
|
198
|
+
|
|
101
199
|
export class ParticleEffectDocument {
|
|
102
200
|
|
|
103
201
|
/**
|
|
@@ -106,7 +204,7 @@ export class ParticleEffectDocument {
|
|
|
106
204
|
name = "effect";
|
|
107
205
|
|
|
108
206
|
/**
|
|
109
|
-
* The
|
|
207
|
+
* The particle field declarations, in the order they are packed into a record.
|
|
110
208
|
*
|
|
111
209
|
* `type` is optional and says what the words are for rather than how many there are — see
|
|
112
210
|
* {@link ../../../src/shade/renderer/particles/layout/ParticleLayout.js ParticleLayout}. It is
|
|
@@ -114,7 +212,7 @@ export class ParticleEffectDocument {
|
|
|
114
212
|
*
|
|
115
213
|
* @type {Array<{name: string, components: number, type?: string}>}
|
|
116
214
|
*/
|
|
117
|
-
|
|
215
|
+
particle_fields = [
|
|
118
216
|
{ name: "position", components: 3 },
|
|
119
217
|
{ name: "velocity", components: 3 },
|
|
120
218
|
{ name: "age", components: 1 },
|
|
@@ -123,6 +221,28 @@ export class ParticleEffectDocument {
|
|
|
123
221
|
{ name: "color", components: 4, type: PARTICLE_TYPE_COLOR.name },
|
|
124
222
|
];
|
|
125
223
|
|
|
224
|
+
/**
|
|
225
|
+
* The emitter field declarations, in the order they are packed into an emitter's block, each
|
|
226
|
+
* with the value an emitter of this effect starts from.
|
|
227
|
+
*
|
|
228
|
+
* An emitter field is to the emitter what a particle field is to the particle: a member the
|
|
229
|
+
* effect declares and every instance carries for itself. The program reads it; gameplay writes
|
|
230
|
+
* it, per entity, on the component.
|
|
231
|
+
*
|
|
232
|
+
* @type {Array<{name: string, components: number, type?: string, value: number[]}>}
|
|
233
|
+
*/
|
|
234
|
+
emitter_fields = [];
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* The global fields the effect imports — members of the scene, shared by every effect that reads
|
|
238
|
+
* them by name — each with the value the editor's preview gives it. A scene sets the real values;
|
|
239
|
+
* the program carries only the names and widths, and is linked to the scene's layout when it is
|
|
240
|
+
* placed.
|
|
241
|
+
*
|
|
242
|
+
* @type {Array<{name: string, components: number, type?: string, value: number[]}>}
|
|
243
|
+
*/
|
|
244
|
+
global_fields = [];
|
|
245
|
+
|
|
126
246
|
/**
|
|
127
247
|
* The node groups this document carries of its own — the ones an author made in it.
|
|
128
248
|
*
|
|
@@ -174,7 +294,7 @@ export class ParticleEffectDocument {
|
|
|
174
294
|
/** image to draw with, by URL; null draws against the default atlas, a white texel */
|
|
175
295
|
texture: null,
|
|
176
296
|
flipbook: [1, 1],
|
|
177
|
-
/** render channel ->
|
|
297
|
+
/** render channel -> particle field name; a channel absent here is not bound */
|
|
178
298
|
render: {
|
|
179
299
|
position: "position",
|
|
180
300
|
size: "size",
|
|
@@ -285,6 +405,20 @@ export class ParticleEffectDocument {
|
|
|
285
405
|
*/
|
|
286
406
|
#lowering = null;
|
|
287
407
|
|
|
408
|
+
/**
|
|
409
|
+
* The last {@link #emitterLayout}, against the version it was built for.
|
|
410
|
+
*
|
|
411
|
+
* @type {{version: number, layout: ParticleLayout|null}|null}
|
|
412
|
+
*/
|
|
413
|
+
#emitter_layout = null;
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* The last {@link #globalLayout}, against the version it was built for.
|
|
417
|
+
*
|
|
418
|
+
* @type {{version: number, layout: ParticleLayout|null}|null}
|
|
419
|
+
*/
|
|
420
|
+
#global_layout = null;
|
|
421
|
+
|
|
288
422
|
constructor() {
|
|
289
423
|
// A graph edited through the editor's action timeline never passes through this object, so
|
|
290
424
|
// without this the document would be the last to hear about a change to its own contents —
|
|
@@ -330,7 +464,7 @@ export class ParticleEffectDocument {
|
|
|
330
464
|
}
|
|
331
465
|
|
|
332
466
|
/**
|
|
333
|
-
* Announce a change. Every edit path — a graph action,
|
|
467
|
+
* Announce a change. Every edit path — a graph action, a particle field added, a parameter set,
|
|
334
468
|
* assembly typed — ends here, and every view that shows the effect is downstream of it.
|
|
335
469
|
*
|
|
336
470
|
* Inside a {@link batch} the announcement is held until the batch ends, and however many changes
|
|
@@ -463,16 +597,72 @@ export class ParticleEffectDocument {
|
|
|
463
597
|
}
|
|
464
598
|
|
|
465
599
|
/**
|
|
466
|
-
* The
|
|
600
|
+
* The particle field schema as the compiler and the runtime want it.
|
|
467
601
|
*
|
|
468
|
-
* Rebuilt on demand rather than held, because {@link
|
|
469
|
-
* cached layout would be one edit behind. Building one is a walk over a handful of
|
|
602
|
+
* Rebuilt on demand rather than held, because {@link particle_fields} is what an author edits
|
|
603
|
+
* and a cached layout would be one edit behind. Building one is a walk over a handful of
|
|
604
|
+
* declarations.
|
|
470
605
|
*
|
|
471
606
|
* @returns {ParticleLayout}
|
|
472
607
|
* @throws if the declarations are not a valid layout (duplicate name, too many words)
|
|
473
608
|
*/
|
|
474
609
|
buildLayout() {
|
|
475
|
-
return new ParticleLayout(this.
|
|
610
|
+
return new ParticleLayout(this.particle_fields);
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* The emitter field schema, built fresh from the declarations; `null` for an effect that
|
|
615
|
+
* declares none.
|
|
616
|
+
*
|
|
617
|
+
* @returns {ParticleLayout|null}
|
|
618
|
+
* @throws if the declarations are not a valid layout (a duplicate name)
|
|
619
|
+
*/
|
|
620
|
+
buildEmitterLayout() {
|
|
621
|
+
if (this.emitter_fields.length === 0) {
|
|
622
|
+
return null;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
return ParticleLayout.emitter(this.emitter_fields.map(({ name, components, type }) => (
|
|
626
|
+
type === undefined ? { name, components } : { name, components, type }
|
|
627
|
+
)));
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* The global fields the effect imports, laid out for the preview; `null` for an effect that
|
|
632
|
+
* imports none. Only the names, widths and tags reach the program — the offsets here are the
|
|
633
|
+
* preview's, never a scene's.
|
|
634
|
+
*
|
|
635
|
+
* @returns {ParticleLayout|null}
|
|
636
|
+
* @throws if the declarations are not a valid layout (a duplicate name)
|
|
637
|
+
*/
|
|
638
|
+
buildGlobalLayout() {
|
|
639
|
+
if (this.global_fields.length === 0) {
|
|
640
|
+
return null;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
return ParticleLayout.emitter(this.global_fields.map(({ name, components, type }) => (
|
|
644
|
+
type === undefined ? { name, components } : { name, components, type }
|
|
645
|
+
)));
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* The declared values of the emitter fields, laid out by `layout` as f32 bit patterns.
|
|
650
|
+
*
|
|
651
|
+
* @param {ParticleLayout|null} layout what {@link buildEmitterLayout} built
|
|
652
|
+
* @returns {Uint32Array}
|
|
653
|
+
*/
|
|
654
|
+
emitterFieldValues(layout) {
|
|
655
|
+
return field_values(layout, this.emitter_fields);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* The preview values of the global fields, laid out by `layout` as f32 bit patterns.
|
|
660
|
+
*
|
|
661
|
+
* @param {ParticleLayout|null} layout what {@link buildGlobalLayout} built
|
|
662
|
+
* @returns {Uint32Array}
|
|
663
|
+
*/
|
|
664
|
+
globalFieldValues(layout) {
|
|
665
|
+
return field_values(layout, this.global_fields);
|
|
476
666
|
}
|
|
477
667
|
|
|
478
668
|
/**
|
|
@@ -510,18 +700,30 @@ export class ParticleEffectDocument {
|
|
|
510
700
|
const diagnostics = [];
|
|
511
701
|
|
|
512
702
|
let layout;
|
|
703
|
+
let emitter_layout;
|
|
704
|
+
let global_layout;
|
|
513
705
|
|
|
514
706
|
try {
|
|
515
707
|
layout = this.#layout();
|
|
708
|
+
emitter_layout = this.#emitterLayout();
|
|
709
|
+
global_layout = this.#globalLayout();
|
|
516
710
|
} catch (e) {
|
|
517
711
|
return {
|
|
518
712
|
program: null,
|
|
519
713
|
unoptimized: null,
|
|
520
714
|
layout: null,
|
|
715
|
+
emitter_layout: null,
|
|
716
|
+
emitter_fields: new Uint32Array(0),
|
|
717
|
+
global_layout: null,
|
|
718
|
+
global_fields: new Uint32Array(0),
|
|
521
719
|
diagnostics: [{ scope: "effect", node: -1, line: 0, message: e.message, severity: PARTICLE_GRAPH_ERROR }],
|
|
522
720
|
};
|
|
523
721
|
}
|
|
524
722
|
|
|
723
|
+
const emitter_fields = this.emitterFieldValues(emitter_layout);
|
|
724
|
+
const global_fields = this.globalFieldValues(global_layout);
|
|
725
|
+
const fields = { layout, emitter_layout, emitter_fields, global_layout, global_fields };
|
|
726
|
+
|
|
525
727
|
if (this.source === PARTICLE_EFFECT_SOURCE.ASSEMBLY) {
|
|
526
728
|
const { program, diagnostics: assembly_diagnostics } = parse_particle_assembly(this.assembly);
|
|
527
729
|
|
|
@@ -535,14 +737,25 @@ export class ParticleEffectDocument {
|
|
|
535
737
|
});
|
|
536
738
|
}
|
|
537
739
|
|
|
538
|
-
|
|
740
|
+
// What the validator checks a graph for, text is checked for here: an import the effect
|
|
741
|
+
// does not declare, or declares at another width, and an emitter field read past the
|
|
742
|
+
// block, which reads a neighbouring emitter's fields.
|
|
743
|
+
for (const message of assembly_field_problems(program, emitter_layout, global_layout)) {
|
|
744
|
+
diagnostics.push({ scope: "assembly", node: -1, line: 0, message, severity: PARTICLE_GRAPH_ERROR });
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
if (diagnostics.length > 0) {
|
|
748
|
+
return { program: null, unoptimized: null, ...fields, diagnostics };
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
return { ...this.#optimized(program, diagnostics), ...fields, diagnostics };
|
|
539
752
|
}
|
|
540
753
|
|
|
541
754
|
const lowering = this.#lowerGraphs(layout);
|
|
542
755
|
|
|
543
756
|
diagnostics.push(...lowering.diagnostics);
|
|
544
757
|
|
|
545
|
-
return { ...this.#optimized(lowering.program, diagnostics),
|
|
758
|
+
return { ...this.#optimized(lowering.program, diagnostics), ...fields, diagnostics };
|
|
546
759
|
}
|
|
547
760
|
|
|
548
761
|
/**
|
|
@@ -604,6 +817,43 @@ export class ParticleEffectDocument {
|
|
|
604
817
|
return layout;
|
|
605
818
|
}
|
|
606
819
|
|
|
820
|
+
/**
|
|
821
|
+
* The emitter field schema, built once per {@link version} for the same reason {@link #layout}
|
|
822
|
+
* is.
|
|
823
|
+
*
|
|
824
|
+
* @returns {ParticleLayout|null}
|
|
825
|
+
* @throws as {@link buildEmitterLayout}
|
|
826
|
+
*/
|
|
827
|
+
#emitterLayout() {
|
|
828
|
+
if (this.#emitter_layout !== null && this.#emitter_layout.version === this.version) {
|
|
829
|
+
return this.#emitter_layout.layout;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
const layout = this.buildEmitterLayout();
|
|
833
|
+
|
|
834
|
+
this.#emitter_layout = { version: this.version, layout };
|
|
835
|
+
|
|
836
|
+
return layout;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* The global field imports, built once per {@link version}.
|
|
841
|
+
*
|
|
842
|
+
* @returns {ParticleLayout|null}
|
|
843
|
+
* @throws as {@link buildGlobalLayout}
|
|
844
|
+
*/
|
|
845
|
+
#globalLayout() {
|
|
846
|
+
if (this.#global_layout !== null && this.#global_layout.version === this.version) {
|
|
847
|
+
return this.#global_layout.layout;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
const layout = this.buildGlobalLayout();
|
|
851
|
+
|
|
852
|
+
this.#global_layout = { version: this.version, layout };
|
|
853
|
+
|
|
854
|
+
return layout;
|
|
855
|
+
}
|
|
856
|
+
|
|
607
857
|
/**
|
|
608
858
|
* Check the graphs and, if they hold up, lower them.
|
|
609
859
|
*
|
|
@@ -640,11 +890,33 @@ export class ParticleEffectDocument {
|
|
|
640
890
|
#lowerGraphsUncached(layout) {
|
|
641
891
|
const diagnostics = [];
|
|
642
892
|
|
|
893
|
+
let emitter_layout;
|
|
894
|
+
let global_layout;
|
|
895
|
+
|
|
896
|
+
try {
|
|
897
|
+
emitter_layout = this.#emitterLayout();
|
|
898
|
+
global_layout = this.#globalLayout();
|
|
899
|
+
} catch (e) {
|
|
900
|
+
return {
|
|
901
|
+
program: null,
|
|
902
|
+
diagnostics: [{ scope: "effect", node: -1, line: 0, message: e.message, severity: PARTICLE_GRAPH_ERROR }],
|
|
903
|
+
};
|
|
904
|
+
}
|
|
905
|
+
|
|
643
906
|
for (const scope of Object.values(PARTICLE_GRAPH_PHASE)) {
|
|
644
907
|
// The validator is told which phase it is looking at: some of what is wrong with a
|
|
645
908
|
// graph depends on which of the two it is, and deciding that is its business rather
|
|
646
909
|
// than this document's.
|
|
647
|
-
|
|
910
|
+
// An effect that declares no emitter fields is checked against the empty schema, not
|
|
911
|
+
// left unchecked: a node reading one is wrong either way.
|
|
912
|
+
const checked = {
|
|
913
|
+
layout,
|
|
914
|
+
emitter_layout: emitter_layout ?? NO_EMITTER_FIELDS,
|
|
915
|
+
global_layout: global_layout ?? NO_EMITTER_FIELDS,
|
|
916
|
+
phase: scope,
|
|
917
|
+
};
|
|
918
|
+
|
|
919
|
+
for (const diagnostic of validate_particle_graph(this[scope], checked)) {
|
|
648
920
|
diagnostics.push({
|
|
649
921
|
scope,
|
|
650
922
|
node: diagnostic.node,
|
|
@@ -661,7 +933,13 @@ export class ParticleEffectDocument {
|
|
|
661
933
|
|
|
662
934
|
try {
|
|
663
935
|
return {
|
|
664
|
-
program: compile_particle_effect({
|
|
936
|
+
program: compile_particle_effect({
|
|
937
|
+
init: this.init,
|
|
938
|
+
update: this.update,
|
|
939
|
+
layout,
|
|
940
|
+
emitter_layout: emitter_layout ?? undefined,
|
|
941
|
+
global_layout: global_layout ?? undefined,
|
|
942
|
+
}),
|
|
665
943
|
diagnostics,
|
|
666
944
|
};
|
|
667
945
|
} catch (e) {
|
|
@@ -686,8 +964,8 @@ export class ParticleEffectDocument {
|
|
|
686
964
|
* the preview shows, not whether a dangling input in front of the author is worth saying — so
|
|
687
965
|
* this is separate from {@link compile}, which reports on the thing that runs.
|
|
688
966
|
*
|
|
689
|
-
* @param {ParticleLayout} [layout] the schema to check
|
|
690
|
-
* the document when not supplied, and skipped when it cannot be built
|
|
967
|
+
* @param {ParticleLayout} [layout] the schema to check particle field references against; built
|
|
968
|
+
* from the document when not supplied, and skipped when it cannot be built
|
|
691
969
|
* @returns {ParticleEffectCompilation['diagnostics']}
|
|
692
970
|
*/
|
|
693
971
|
graphDiagnostics(layout) {
|
|
@@ -805,43 +1083,165 @@ export class ParticleEffectDocument {
|
|
|
805
1083
|
}
|
|
806
1084
|
|
|
807
1085
|
/**
|
|
808
|
-
* Add
|
|
1086
|
+
* Add a particle field to the per-particle record.
|
|
809
1087
|
*
|
|
810
1088
|
* @param {string} name
|
|
811
1089
|
* @param {number} components 1..4
|
|
812
|
-
* @param {string} [type] what the words are for, see {@link
|
|
1090
|
+
* @param {string} [type] what the words are for, see {@link particle_fields}; omitted, they are
|
|
813
1091
|
* whatever `components` of them means and nothing more
|
|
814
1092
|
* @throws if the name is taken or the record has no room left
|
|
815
1093
|
*/
|
|
816
|
-
|
|
817
|
-
const candidate = this.
|
|
1094
|
+
addParticleField(name, components, type = undefined) {
|
|
1095
|
+
const candidate = this.particle_fields.concat([{ name, components, type }]);
|
|
818
1096
|
|
|
819
1097
|
// built rather than assumed: ParticleLayout is where the record's capacity and the
|
|
820
1098
|
// duplicate-name rule live, and a layout that throws must not become the document's
|
|
821
1099
|
new ParticleLayout(candidate);
|
|
822
1100
|
|
|
823
|
-
this.
|
|
1101
|
+
this.particle_fields = candidate;
|
|
1102
|
+
|
|
1103
|
+
this.touch();
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
/**
|
|
1107
|
+
* Declare an emitter field: a member every emitter of this effect carries for itself, starting
|
|
1108
|
+
* from `value`.
|
|
1109
|
+
*
|
|
1110
|
+
* @param {string} name
|
|
1111
|
+
* @param {number} components 1..4
|
|
1112
|
+
* @param {string} [type] what the words are for, as for a particle field
|
|
1113
|
+
* @param {number[]} [value] what an emitter starts with; zero where left out
|
|
1114
|
+
* @throws if the name is taken
|
|
1115
|
+
*/
|
|
1116
|
+
addEmitterField(name, components, type = undefined, value = []) {
|
|
1117
|
+
const candidate = this.emitter_fields.concat([{ name, components, type, value: Array.from(value) }]);
|
|
1118
|
+
|
|
1119
|
+
// built rather than assumed, as for a particle field: the duplicate-name rule lives there
|
|
1120
|
+
ParticleLayout.emitter(candidate);
|
|
1121
|
+
|
|
1122
|
+
this.emitter_fields = candidate;
|
|
1123
|
+
|
|
1124
|
+
this.touch();
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
/**
|
|
1128
|
+
* Change the value an emitter of this effect starts with.
|
|
1129
|
+
*
|
|
1130
|
+
* @param {string} name
|
|
1131
|
+
* @param {number[]} value
|
|
1132
|
+
* @returns {boolean} false when there is no such emitter field
|
|
1133
|
+
*/
|
|
1134
|
+
setEmitterFieldValue(name, value) {
|
|
1135
|
+
const declaration = this.emitter_fields.find(field => field.name === name);
|
|
1136
|
+
|
|
1137
|
+
if (declaration === undefined) {
|
|
1138
|
+
return false;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
declaration.value = Array.from(value);
|
|
824
1142
|
|
|
825
1143
|
this.touch();
|
|
1144
|
+
|
|
1145
|
+
return true;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
/**
|
|
1149
|
+
* Remove an emitter field. Nodes naming it are left alone and reported, as for a particle field.
|
|
1150
|
+
*
|
|
1151
|
+
* @param {string} name
|
|
1152
|
+
* @returns {boolean} false when there was no such emitter field
|
|
1153
|
+
*/
|
|
1154
|
+
removeEmitterField(name) {
|
|
1155
|
+
const remaining = this.emitter_fields.filter(field => field.name !== name);
|
|
1156
|
+
|
|
1157
|
+
if (remaining.length === this.emitter_fields.length) {
|
|
1158
|
+
return false;
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
this.emitter_fields = remaining;
|
|
1162
|
+
|
|
1163
|
+
this.touch();
|
|
1164
|
+
|
|
1165
|
+
return true;
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
/**
|
|
1169
|
+
* Import a global field: a static member of whatever scene the effect runs in, read by name.
|
|
1170
|
+
*
|
|
1171
|
+
* @param {string} name
|
|
1172
|
+
* @param {number} components 1..4
|
|
1173
|
+
* @param {string} [type] what the words are for
|
|
1174
|
+
* @param {number[]} [value] what the editor's preview gives it; zero where left out
|
|
1175
|
+
* @throws if the name is taken
|
|
1176
|
+
*/
|
|
1177
|
+
addGlobalField(name, components, type = undefined, value = []) {
|
|
1178
|
+
const candidate = this.global_fields.concat([{ name, components, type, value: Array.from(value) }]);
|
|
1179
|
+
|
|
1180
|
+
ParticleLayout.emitter(candidate);
|
|
1181
|
+
|
|
1182
|
+
this.global_fields = candidate;
|
|
1183
|
+
|
|
1184
|
+
this.touch();
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
/**
|
|
1188
|
+
* Change the value the editor's preview gives a global field.
|
|
1189
|
+
*
|
|
1190
|
+
* @param {string} name
|
|
1191
|
+
* @param {number[]} value
|
|
1192
|
+
* @returns {boolean} false when the effect imports no such global field
|
|
1193
|
+
*/
|
|
1194
|
+
setGlobalFieldValue(name, value) {
|
|
1195
|
+
const declaration = this.global_fields.find(field => field.name === name);
|
|
1196
|
+
|
|
1197
|
+
if (declaration === undefined) {
|
|
1198
|
+
return false;
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
declaration.value = Array.from(value);
|
|
1202
|
+
|
|
1203
|
+
this.touch();
|
|
1204
|
+
|
|
1205
|
+
return true;
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
/**
|
|
1209
|
+
* Stop importing a global field. Nodes naming it are left alone and reported.
|
|
1210
|
+
*
|
|
1211
|
+
* @param {string} name
|
|
1212
|
+
* @returns {boolean} false when there was no such import
|
|
1213
|
+
*/
|
|
1214
|
+
removeGlobalField(name) {
|
|
1215
|
+
const remaining = this.global_fields.filter(field => field.name !== name);
|
|
1216
|
+
|
|
1217
|
+
if (remaining.length === this.global_fields.length) {
|
|
1218
|
+
return false;
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
this.global_fields = remaining;
|
|
1222
|
+
|
|
1223
|
+
this.touch();
|
|
1224
|
+
|
|
1225
|
+
return true;
|
|
826
1226
|
}
|
|
827
1227
|
|
|
828
1228
|
/**
|
|
829
|
-
* Remove
|
|
1229
|
+
* Remove a particle field, and unbind any render channel that pointed at it.
|
|
830
1230
|
*
|
|
831
1231
|
* Nodes naming it are left alone: they become invalid, which the validator reports against the
|
|
832
1232
|
* node, and that is a better outcome than silently rewriting an author's graph.
|
|
833
1233
|
*
|
|
834
1234
|
* @param {string} name
|
|
835
|
-
* @returns {boolean} false when there was no such
|
|
1235
|
+
* @returns {boolean} false when there was no such particle field
|
|
836
1236
|
*/
|
|
837
|
-
|
|
838
|
-
const remaining = this.
|
|
1237
|
+
removeParticleField(name) {
|
|
1238
|
+
const remaining = this.particle_fields.filter(particle_field => particle_field.name !== name);
|
|
839
1239
|
|
|
840
|
-
if (remaining.length === this.
|
|
1240
|
+
if (remaining.length === this.particle_fields.length) {
|
|
841
1241
|
return false;
|
|
842
1242
|
}
|
|
843
1243
|
|
|
844
|
-
this.
|
|
1244
|
+
this.particle_fields = remaining;
|
|
845
1245
|
|
|
846
1246
|
for (const channel of EMITTER_RENDER_CHANNELS) {
|
|
847
1247
|
if (this.emitter.render[channel] === name) {
|
|
@@ -857,28 +1257,30 @@ export class ParticleEffectDocument {
|
|
|
857
1257
|
/**
|
|
858
1258
|
* The emitter settings as {@link ParticleEmitter.from} takes them, with the compiled effect.
|
|
859
1259
|
*
|
|
860
|
-
* Render channels naming
|
|
861
|
-
* on, because `bind_render` throws on one — and an effect that fails to build over a
|
|
862
|
-
* binding is a worse thing to hand an author than one that draws without a colour.
|
|
1260
|
+
* Render channels naming a particle field the layout no longer has are dropped rather than
|
|
1261
|
+
* passed on, because `bind_render` throws on one — and an effect that fails to build over a
|
|
1262
|
+
* stale binding is a worse thing to hand an author than one that draws without a colour.
|
|
863
1263
|
*
|
|
864
|
-
* @param {{layout: ParticleLayout, program: object
|
|
865
|
-
* packaged the way `create_particle_effect` does
|
|
1264
|
+
* @param {{layout: ParticleLayout, program: object, emitter_layout?: ParticleLayout|null, emitter_fields?: Uint32Array}} compiled
|
|
1265
|
+
* what {@link compile} produced, packaged the way `create_particle_effect` does
|
|
866
1266
|
* @returns {object}
|
|
867
1267
|
*/
|
|
868
|
-
emitterConfig({ layout, program }) {
|
|
1268
|
+
emitterConfig({ layout, program, emitter_layout = null, emitter_fields = new Uint32Array(0) }) {
|
|
869
1269
|
const render = {};
|
|
870
1270
|
|
|
871
1271
|
for (const channel of EMITTER_RENDER_CHANNELS) {
|
|
872
|
-
const
|
|
1272
|
+
const particle_field = this.emitter.render[channel];
|
|
873
1273
|
|
|
874
|
-
if (
|
|
875
|
-
render[channel] =
|
|
1274
|
+
if (particle_field !== undefined && layout.has(particle_field)) {
|
|
1275
|
+
render[channel] = particle_field;
|
|
876
1276
|
}
|
|
877
1277
|
}
|
|
878
1278
|
|
|
879
1279
|
return {
|
|
880
1280
|
layout,
|
|
881
1281
|
program,
|
|
1282
|
+
emitter_layout,
|
|
1283
|
+
emitter_fields,
|
|
882
1284
|
name: this.name,
|
|
883
1285
|
spawn_rate: this.emitter.spawn_rate,
|
|
884
1286
|
prewarm: this.emitter.prewarm,
|
|
@@ -915,7 +1317,9 @@ export class ParticleEffectDocument {
|
|
|
915
1317
|
toJSON() {
|
|
916
1318
|
return {
|
|
917
1319
|
name: this.name,
|
|
918
|
-
|
|
1320
|
+
particle_fields: this.particle_fields.map(particle_field => ({ ...particle_field })),
|
|
1321
|
+
emitter_fields: this.emitter_fields.map(field => ({ ...field, value: Array.from(field.value) })),
|
|
1322
|
+
global_fields: this.global_fields.map(field => ({ ...field, value: Array.from(field.value) })),
|
|
919
1323
|
groups: this.groups.map(serialize_particle_group),
|
|
920
1324
|
init: serialize_particle_graph({ graph: this.init, visual: this.init_visual }),
|
|
921
1325
|
update: serialize_particle_graph({ graph: this.update, visual: this.update_visual }),
|
|
@@ -946,7 +1350,10 @@ export class ParticleEffectDocument {
|
|
|
946
1350
|
*/
|
|
947
1351
|
#load(json, visualRegistry) {
|
|
948
1352
|
this.name = json.name ?? "effect";
|
|
949
|
-
|
|
1353
|
+
// older documents carry the particle fields as `attributes`
|
|
1354
|
+
this.particle_fields = (json.particle_fields ?? json.attributes ?? []).map(particle_field => ({ ...particle_field }));
|
|
1355
|
+
this.emitter_fields = (json.emitter_fields ?? []).map(field => ({ ...field, value: Array.from(field.value ?? []) }));
|
|
1356
|
+
this.global_fields = (json.global_fields ?? []).map(field => ({ ...field, value: Array.from(field.value ?? []) }));
|
|
950
1357
|
|
|
951
1358
|
// `NodeGraph.reset` drops its nodes without announcing them, so the watch list is cleared
|
|
952
1359
|
// here rather than being left holding a graph that no longer exists
|