@woosh/meep-engine 3.14.5 → 3.14.6
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/README.md +6 -0
- package/editor/Editor.d.ts +162 -0
- package/editor/Editor.d.ts.map +1 -0
- package/editor/EditorCameraNavigation.d.ts +22 -0
- package/editor/EditorCameraNavigation.d.ts.map +1 -0
- package/editor/EditorKeyMap.d.ts +28 -0
- package/editor/EditorKeyMap.d.ts.map +1 -0
- package/editor/SelectionVisualizer.d.ts +37 -0
- package/editor/SelectionVisualizer.d.ts.map +1 -0
- package/editor/actions/concrete/ActionInvalidateSampler.d.ts +18 -0
- package/editor/actions/concrete/ActionInvalidateSampler.d.ts.map +1 -0
- package/editor/actions/concrete/ActionUpdateTexture.d.ts +12 -0
- package/editor/actions/concrete/ActionUpdateTexture.d.ts.map +1 -0
- package/editor/actions/concrete/ActionUpdateTexture.js +1 -1
- package/editor/actions/concrete/ArrayCopyAction.d.ts +20 -0
- package/editor/actions/concrete/ArrayCopyAction.d.ts.map +1 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts +15 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts +11 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts +18 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts +11 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts +47 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts.map +1 -0
- package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts +38 -0
- package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts.map +1 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts +23 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts.map +1 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +32 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionAddAction.d.ts +19 -0
- package/editor/actions/concrete/SelectionAddAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionClearAction.d.ts +9 -0
- package/editor/actions/concrete/SelectionClearAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionRemoveAction.d.ts +10 -0
- package/editor/actions/concrete/SelectionRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts +17 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -0
- package/editor/actions/concrete/WriteGridValueAction.d.ts +14 -0
- package/editor/actions/concrete/WriteGridValueAction.d.ts.map +1 -0
- package/editor/camera/camera_framing.d.ts +33 -0
- package/editor/camera/camera_framing.d.ts.map +1 -0
- package/editor/clipboard.d.ts +19 -0
- package/editor/clipboard.d.ts.map +1 -0
- package/editor/ecs/EditorEntity.d.ts +16 -0
- package/editor/ecs/EditorEntity.d.ts.map +1 -0
- package/editor/ecs/EditorEntitySystem.d.ts +8 -0
- package/editor/ecs/EditorEntitySystem.d.ts.map +1 -0
- package/editor/ecs/component/TypeEditor.d.ts +7 -1
- package/editor/ecs/component/TypeEditor.d.ts.map +1 -1
- package/editor/ecs/component/TypeEditor.js +5 -0
- package/editor/ecs/component/editors/ColorEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ColorEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/HTMLElementEditor.d.ts +7 -0
- package/editor/ecs/component/editors/HTMLElementEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ImagePathEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ImagePathEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/LargeStringEditor.d.ts +16 -0
- package/editor/ecs/component/editors/LargeStringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.d.ts +7 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedStringEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedStringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/Sampler2DEditor.d.ts +7 -0
- package/editor/ecs/component/editors/Sampler2DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/collection/ListEditor.d.ts +8 -0
- package/editor/ecs/component/editors/collection/ListEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts +12 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/EnumEditor.d.ts +8 -0
- package/editor/ecs/component/editors/common/EnumEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/makeV3_editor.d.ts +15 -0
- package/editor/ecs/component/editors/common/makeV3_editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/noEditor.d.ts +3 -0
- package/editor/ecs/component/editors/common/noEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/two_way_sync.d.ts +22 -0
- package/editor/ecs/component/editors/common/two_way_sync.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts +14 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts +12 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts +14 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts +52 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts +47 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts +21 -0
- package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts +26 -0
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts +16 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts +15 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +42 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts +8 -0
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts +19 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts +27 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts +16 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts +19 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts +18 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.d.ts +7 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts +8 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.d.ts +8 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/StringEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/StringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts +28 -0
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts +29 -0
- package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts +28 -0
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts +41 -0
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts +31 -0
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts.map +1 -0
- package/editor/ecs/component/prototypeObjectEditor.d.ts +2 -0
- package/editor/ecs/component/prototypeObjectEditor.d.ts.map +1 -0
- package/editor/ecs/component/registerBasicTypeEditors.d.ts +11 -0
- package/editor/ecs/component/registerBasicTypeEditors.d.ts.map +1 -0
- package/editor/ecs/component/registerEngineComponentEditors.d.ts +8 -0
- package/editor/ecs/component/registerEngineComponentEditors.d.ts.map +1 -0
- package/editor/enableEditor.d.ts +14 -0
- package/editor/enableEditor.d.ts.map +1 -0
- package/editor/entity_world_bounds.d.ts +17 -0
- package/editor/entity_world_bounds.d.ts.map +1 -0
- package/editor/library/MeshLibrary.d.ts +13 -0
- package/editor/library/MeshLibrary.d.ts.map +1 -0
- package/editor/particles/lut_ops.d.ts +34 -0
- package/editor/particles/lut_ops.d.ts.map +1 -0
- package/editor/particles/particleEditEvents.d.ts +11 -0
- package/editor/particles/particleEditEvents.d.ts.map +1 -0
- package/editor/particles/rebuildParticleEmitter.d.ts +11 -0
- package/editor/particles/rebuildParticleEmitter.d.ts.map +1 -0
- package/editor/persistence/EditorLayoutStore.d.ts +30 -0
- package/editor/persistence/EditorLayoutStore.d.ts.map +1 -0
- package/editor/persistence/SceneMetadata.d.ts +38 -0
- package/editor/persistence/SceneMetadata.d.ts.map +1 -0
- package/editor/persistence/SceneSlotManager.d.ts +40 -0
- package/editor/persistence/SceneSlotManager.d.ts.map +1 -0
- package/editor/persistence/buildNewSceneDataset.d.ts +10 -0
- package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -0
- package/editor/persistence/files.d.ts +24 -0
- package/editor/persistence/files.d.ts.map +1 -0
- package/editor/persistence/scene_import.d.ts +45 -0
- package/editor/persistence/scene_import.d.ts.map +1 -0
- package/editor/persistence/scene_serialization.d.ts +36 -0
- package/editor/persistence/scene_serialization.d.ts.map +1 -0
- package/editor/persistence/string_buffer_codec.d.ts +20 -0
- package/editor/persistence/string_buffer_codec.d.ts.map +1 -0
- package/editor/process/DisableGameUIProcess.d.ts +8 -0
- package/editor/process/DisableGameUIProcess.d.ts.map +1 -0
- package/editor/process/EditorProcess.d.ts +19 -0
- package/editor/process/EditorProcess.d.ts.map +1 -0
- package/editor/process/GridDisplayProcess.d.ts +35 -0
- package/editor/process/GridDisplayProcess.d.ts.map +1 -0
- package/editor/process/ObstacleGridDisplayProcess.d.ts +13 -0
- package/editor/process/ObstacleGridDisplayProcess.d.ts.map +1 -0
- package/editor/process/ParticleEmitterRebuildProcess.d.ts +66 -0
- package/editor/process/ParticleEmitterRebuildProcess.d.ts.map +1 -0
- package/editor/process/ProcessEngine.d.ts +30 -0
- package/editor/process/ProcessEngine.d.ts.map +1 -0
- package/editor/process/SymbolicDisplayProcess.d.ts +23 -0
- package/editor/process/SymbolicDisplayProcess.d.ts.map +1 -0
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts +17 -0
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/CameraSymbolicDisplay.d.ts +25 -0
- package/editor/process/symbolic/CameraSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts +19 -0
- package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/LightSymbolicDisplay.d.ts +19 -0
- package/editor/process/symbolic/LightSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts +18 -0
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/PathSymbolicDisplay.d.ts +20 -0
- package/editor/process/symbolic/PathSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts +25 -0
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/SymbolicDisplay.d.ts +48 -0
- package/editor/process/symbolic/SymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts +13 -0
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts.map +1 -0
- package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts +18 -0
- package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts.map +1 -0
- package/editor/prototypeEditorShell.d.ts +13 -0
- package/editor/prototypeEditorShell.d.ts.map +1 -0
- package/editor/selection/editor_pick.d.ts +43 -0
- package/editor/selection/editor_pick.d.ts.map +1 -0
- package/editor/selection/screen_rect_frustum.d.ts +32 -0
- package/editor/selection/screen_rect_frustum.d.ts.map +1 -0
- package/editor/templates/entity_templates.d.ts +19 -0
- package/editor/templates/entity_templates.d.ts.map +1 -0
- package/editor/tools/GridPaintTool.d.ts +18 -0
- package/editor/tools/GridPaintTool.d.ts.map +1 -0
- package/editor/tools/SelectionTool.d.ts +38 -0
- package/editor/tools/SelectionTool.d.ts.map +1 -0
- package/editor/tools/SelectionTool.js +2 -2
- package/editor/tools/TransformToolV2.d.ts +70 -0
- package/editor/tools/TransformToolV2.d.ts.map +1 -0
- package/editor/tools/engine/Tool.d.ts +88 -0
- package/editor/tools/engine/Tool.d.ts.map +1 -0
- package/editor/tools/engine/ToolEngine.d.ts +22 -0
- package/editor/tools/engine/ToolEngine.d.ts.map +1 -0
- package/editor/tools/engine/ToolState.d.ts +7 -0
- package/editor/tools/engine/ToolState.d.ts.map +1 -0
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts +18 -0
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -0
- package/editor/tools/paint/TerrainPaintTool.d.ts +82 -0
- package/editor/tools/paint/TerrainPaintTool.d.ts.map +1 -0
- package/editor/tools/paint/TerrainTexturePaintTool.d.ts +19 -0
- package/editor/tools/paint/TerrainTexturePaintTool.d.ts.map +1 -0
- package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts +139 -0
- package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts.map +1 -0
- package/editor/tools/v2/GizmoNode.d.ts +21 -0
- package/editor/tools/v2/GizmoNode.d.ts.map +1 -0
- package/editor/tools/v2/TransformControls.d.ts +219 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -0
- package/editor/tools/v2/TransformMode.d.ts +7 -0
- package/editor/tools/v2/TransformMode.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts +37 -0
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_draw.d.ts +14 -0
- package/editor/tools/v2/handle/gizmo_draw.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_handles.d.ts +160 -0
- package/editor/tools/v2/handle/gizmo_handles.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts +103 -0
- package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts.map +1 -0
- package/editor/view/GridPickCoordinateView.d.ts +22 -0
- package/editor/view/GridPickCoordinateView.d.ts.map +1 -0
- package/editor/view/ecs/ComponentControlView.d.ts +24 -0
- package/editor/view/ecs/ComponentControlView.d.ts.map +1 -0
- package/editor/view/ecs/EntityEditor.d.ts +25 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -0
- package/editor/view/ecs/EntityList.d.ts +22 -0
- package/editor/view/ecs/EntityList.d.ts.map +1 -0
- package/editor/view/ecs/HierarchicalEntityListView.d.ts +25 -0
- package/editor/view/ecs/HierarchicalEntityListView.d.ts.map +1 -0
- package/editor/view/ecs/components/DatGuiController.d.ts +2 -0
- package/editor/view/ecs/components/DatGuiController.d.ts.map +1 -0
- package/editor/view/ecs/components/color/GaugeView.d.ts +9 -5
- package/editor/view/ecs/components/color/GaugeView.d.ts.map +1 -1
- package/editor/view/ecs/components/color/GaugeView.js +4 -4
- package/editor/view/ecs/components/common/NumberController.d.ts +9 -5
- package/editor/view/ecs/components/common/NumberController.d.ts.map +1 -1
- package/editor/view/ecs/components/common/NumberController.js +4 -4
- package/editor/view/ecs/components/common/NumericIntervalController.d.ts +10 -0
- package/editor/view/ecs/components/common/NumericIntervalController.d.ts.map +1 -0
- package/editor/view/ecs/components/common/TextController.d.ts.map +1 -1
- package/editor/view/library/MeshLibraryView.d.ts +16 -0
- package/editor/view/library/MeshLibraryView.d.ts.map +1 -0
- package/editor/view/library/mesh_library_drag.d.ts +21 -0
- package/editor/view/library/mesh_library_drag.d.ts.map +1 -0
- package/editor/view/library/model_thumbnail_source.d.ts +12 -0
- package/editor/view/library/model_thumbnail_source.d.ts.map +1 -0
- package/editor/view/makeEntityDecorators.d.ts +6 -0
- package/editor/view/makeEntityDecorators.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphCamera.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphSelection.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeView.d.ts.map +1 -1
- package/editor/view/node-graph/PortView.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionCreateAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeParameterSetAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodesMoveAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/SelectionSetAction.d.ts.map +1 -1
- package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
- package/editor/view/particles/ColorLutGradientView.d.ts +19 -0
- package/editor/view/particles/ColorLutGradientView.d.ts.map +1 -0
- package/editor/view/particles/ScalarLutCurveView.d.ts +19 -0
- package/editor/view/particles/ScalarLutCurveView.d.ts.map +1 -0
- package/editor/view/prepareMeshLibrary.d.ts +7 -0
- package/editor/view/prepareMeshLibrary.d.ts.map +1 -0
- package/editor/view/process/ProcessView.d.ts +14 -0
- package/editor/view/process/ProcessView.d.ts.map +1 -0
- package/editor/view/shell/EditorShellView.d.ts +18 -0
- package/editor/view/shell/EditorShellView.d.ts.map +1 -0
- package/editor/view/shell/SceneTreePanelView.d.ts +17 -0
- package/editor/view/shell/SceneTreePanelView.d.ts.map +1 -0
- package/editor/view/shell/ViewportPanelView.d.ts +18 -0
- package/editor/view/shell/ViewportPanelView.d.ts.map +1 -0
- package/editor/view/tools/ToolSettingsView.d.ts +22 -0
- package/editor/view/tools/ToolSettingsView.d.ts.map +1 -0
- package/editor/view/tools/ToolView.d.ts +13 -0
- package/editor/view/tools/ToolView.d.ts.map +1 -0
- package/editor/view/v2/SplitView.d.ts +2 -0
- package/editor/view/v2/SplitView.d.ts.map +1 -0
- package/package.json +9 -11
- package/samples/engine/README.md +113 -0
- package/samples/engine/first-scene/index.html +32 -0
- package/samples/engine/first-scene/main.js +152 -0
- package/src/core/assert.d.ts +2 -2
- package/src/core/binary/BitSet.d.ts +2 -2
- package/src/core/binary/BitSet.d.ts.map +1 -1
- package/src/core/binary/BitSet.js +1 -1
- package/src/core/bvh2/bvh3/BVH.d.ts +4 -0
- package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BVH.js +4 -0
- package/src/core/bvh2/bvh3/BvhClient.d.ts +4 -0
- package/src/core/bvh2/bvh3/BvhClient.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BvhClient.js +4 -0
- package/src/core/collection/array/array_sort_quick.d.ts +1 -1
- package/src/core/collection/list/List.d.ts +7 -3
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +6 -2
- package/src/core/collection/table/RowFirstTableSpec.d.ts.map +1 -1
- package/src/core/collection/table/RowFirstTableSpec.js +0 -4
- package/src/core/color/Color.d.ts +1 -0
- package/src/core/color/Color.d.ts.map +1 -1
- package/src/core/color/Color.js +4 -0
- package/src/core/events/signal/SignalBinding.d.ts +4 -0
- package/src/core/events/signal/SignalBinding.d.ts.map +1 -1
- package/src/core/events/signal/SignalBinding.js +4 -0
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts +5 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +4 -0
- package/src/core/geom/3d/SurfacePoint3.d.ts +2 -2
- package/src/core/geom/3d/SurfacePoint3.d.ts.map +1 -1
- package/src/core/geom/3d/SurfacePoint3.js +1 -1
- package/src/core/geom/3d/aabb/AABB3.d.ts +63 -7
- package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/AABB3.js +17 -3
- package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +2 -2
- package/src/core/geom/3d/ray/Ray3.d.ts +4 -4
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts +10 -3
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/AbstractShape3D.js +9 -2
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts +2 -2
- package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +1 -1
- package/src/core/geom/Vector1.d.ts +4 -0
- package/src/core/geom/Vector1.d.ts.map +1 -1
- package/src/core/geom/Vector1.js +4 -0
- package/src/core/geom/Vector2.d.ts +4 -0
- package/src/core/geom/Vector2.d.ts.map +1 -1
- package/src/core/geom/Vector2.js +4 -0
- package/src/core/geom/Vector3.d.ts +4 -0
- package/src/core/geom/Vector3.d.ts.map +1 -1
- package/src/core/geom/Vector3.js +4 -0
- package/src/core/geom/Vector4.d.ts +4 -0
- package/src/core/geom/Vector4.d.ts.map +1 -1
- package/src/core/geom/Vector4.js +4 -0
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts +6 -2
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts.map +1 -1
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +4 -0
- package/src/core/geom/packing/miniball/Subspan.d.ts +4 -4
- package/src/core/geom/packing/miniball/Subspan.d.ts.map +1 -1
- package/src/core/geom/packing/miniball/Subspan.js +2 -2
- package/src/core/math/interval/NumericInterval.d.ts +4 -0
- package/src/core/math/interval/NumericInterval.d.ts.map +1 -1
- package/src/core/math/interval/NumericInterval.js +4 -0
- package/src/core/math/random/roundFair.d.ts +2 -2
- package/src/core/math/random/roundFair.d.ts.map +1 -1
- package/src/core/math/random/roundFair.js +1 -1
- package/src/core/model/BoundedValue.d.ts +4 -0
- package/src/core/model/BoundedValue.d.ts.map +1 -1
- package/src/core/model/BoundedValue.js +4 -0
- package/src/core/model/ObservedBoolean.d.ts +4 -0
- package/src/core/model/ObservedBoolean.d.ts.map +1 -1
- package/src/core/model/ObservedBoolean.js +4 -0
- package/src/core/model/ObservedInteger.d.ts +4 -0
- package/src/core/model/ObservedInteger.d.ts.map +1 -1
- package/src/core/model/ObservedInteger.js +4 -0
- package/src/core/model/ObservedString.d.ts +4 -0
- package/src/core/model/ObservedString.d.ts.map +1 -1
- package/src/core/model/ObservedString.js +4 -0
- package/src/core/model/stat/Stat.d.ts +7 -3
- package/src/core/model/stat/Stat.d.ts.map +1 -1
- package/src/core/model/stat/Stat.js +4 -0
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +65 -0
- package/src/engine/EngineHarness.d.ts +8 -1
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +10 -14
- package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts +2 -2
- package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
- package/src/engine/animation/clip/ecd_bind_animation_curve.js +4 -4
- package/src/engine/asset/loaders/async_traverse_three_object.d.ts +2 -2
- package/src/engine/asset/loaders/async_traverse_three_object.d.ts.map +1 -1
- package/src/engine/asset/loaders/async_traverse_three_object.js +1 -1
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +7 -3
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +33 -3
- package/src/engine/control/first-person/DESIGN.md +20 -2
- package/src/engine/control/first-person/DESIGN_COLLISION.md +17 -0
- package/src/engine/control/first-person/collision/KinematicMover.d.ts +58 -11
- package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.js +97 -20
- package/src/engine/ecs/Entity.js +1 -1
- package/src/engine/ecs/EntityComponentDataset.d.ts +2 -2
- package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
- package/src/engine/ecs/EntityComponentDataset.js +1 -1
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +27 -3
- package/src/engine/ecs/animation/Animation.d.ts +17 -3
- package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
- package/src/engine/ecs/animation/Animation.js +26 -6
- package/src/engine/ecs/terrain/TerrainPreview.d.ts +4 -0
- package/src/engine/ecs/terrain/TerrainPreview.d.ts.map +1 -1
- package/src/engine/ecs/terrain/TerrainPreview.js +4 -0
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +4 -4
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +2 -2
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts +3 -2
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.js +25 -2
- package/src/engine/ecs/transform/Transform64.d.ts +4 -4
- package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform64.js +2 -2
- package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +26 -0
- package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
- package/src/engine/graphics/ecs/decal/v2/Decal.js +26 -0
- package/src/engine/graphics/ecs/light/Light.d.ts +38 -1
- package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/Light.js +51 -1
- package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +3 -3
- package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh/copyToVector3.js +2 -2
- package/src/engine/graphics/ecs/mesh/setMesh.d.ts +2 -2
- package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh/setMesh.js +1 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +3 -3
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +2 -2
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +1 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +1 -1
- package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts +2 -2
- package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts.map +1 -1
- package/src/engine/graphics/geometry/compute_geometry_polycount.js +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +3 -3
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +2 -2
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +4 -4
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +3 -3
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +3 -3
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +2 -2
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +4 -4
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +3 -3
- package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts +2 -2
- package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts.map +1 -1
- package/src/engine/graphics/geometry/scaleGeometryToBox.js +1 -1
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts +2 -2
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts.map +1 -1
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.js +1 -1
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts +2 -2
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts.map +1 -1
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.js +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +4 -12
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +2 -2
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts +5 -20
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +24 -24
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +16 -16
- package/src/engine/graphics/render/layers/RenderLayer.d.ts +4 -4
- package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
- package/src/engine/graphics/render/layers/RenderLayer.js +2 -2
- package/src/engine/graphics/render/make_bvh_visibility_builder.js +1 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +1 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.js +1 -1
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts +2 -2
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +1 -1
- package/src/engine/graphics3/DecalSystem.d.ts +8 -0
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +8 -0
- package/src/engine/graphics3/GraphicsEngine.d.ts +19 -8
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +22 -11
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +11 -1
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts +4 -0
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts.map +1 -1
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +4 -0
- package/src/engine/navigation/mesh/NavigationMesh.d.ts +90 -9
- package/src/engine/navigation/mesh/NavigationMesh.d.ts.map +1 -1
- package/src/engine/navigation/mesh/NavigationMesh.js +80 -8
- package/src/engine/network/NetworkSession.d.ts +60 -0
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +141 -1
- package/src/engine/network/replication/Replicator.d.ts +18 -0
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +98 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/SoundEngine.d.ts +24 -0
- package/src/engine/sound/SoundEngine.d.ts.map +1 -1
- package/src/engine/sound/SoundEngine.js +29 -11
- package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
- package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
- package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
- package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
- package/src/shade/playground/particle_system/README.md +14 -3
- package/src/shade/playground/particle_system/index.html +1 -0
- package/src/shade/playground/particle_system/main.js +15 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +126 -9
- package/src/shade/renderer/GraphicsContext.d.ts +1 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +4 -0
- package/src/shade/renderer/Renderer.d.ts +1 -1
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/DESIGN.md +66 -15
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
- package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +33 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
- package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
- package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +60 -20
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
- package/src/view/DOM.d.ts +69 -0
- package/src/view/DOM.d.ts.map +1 -0
- package/src/view/DOM.js +2 -1
- package/src/view/common/LocalizedLabelView.d.ts +50 -0
- package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
- package/src/view/controller/controls/GuiControl.d.ts +19 -0
- package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
- package/src/view/elements/FrameRateView.d.ts +45 -0
- package/src/view/elements/FrameRateView.d.ts.map +1 -0
- package/src/view/elements/FrameRateView.js +131 -0
- package/src/view/elements/SliderView.d.ts +37 -0
- package/src/view/elements/SliderView.d.ts.map +1 -0
- package/src/view/elements/SliderView.js +71 -0
- package/src/view/elements/navigation/ViewStack.d.ts +1 -1
- package/src/view/elements/navigation/ViewStack.js +1 -1
- package/src/view/elements/notify/NotificationView.d.ts +22 -0
- package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
- package/src/view/tooltip/TooltipView.d.ts +5 -1
- package/src/view/tooltip/TooltipView.d.ts.map +1 -1
- package/src/view/tooltip/TooltipView.js +4 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { PARTICLE_SIMULATE_WORKGROUP_SIZE, PARTICLE_SIM_PAD_SLOT } from "../ParticleConstants.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CPU reference for the simulation-order bucketing — the readable statement of the answer the GPU
|
|
5
|
+
* passes in {@link ./shader_particle_bucket.js} have to produce, the same role
|
|
6
|
+
* {@link ../sort/particle_counting_sort.js} plays for the render-order depth sort.
|
|
7
|
+
*
|
|
8
|
+
* ## What it is for
|
|
9
|
+
*
|
|
10
|
+
* The simulate pass is one dispatch interpreting every emitter's compiled UPDATE bytecode over the
|
|
11
|
+
* whole alive list. The alive list comes out of compaction — survivors are appended with
|
|
12
|
+
* `atomicAdd(&counters[ALIVE])` — so its order says nothing about which emitter a particle belongs
|
|
13
|
+
* to, and a single wave routinely holds particles running different programs. That costs twice
|
|
14
|
+
* over: the interpreter's opcode `switch` diverges, so the wave serially executes the union of the
|
|
15
|
+
* opcodes its lanes want; and the VM register file is dynamically indexed, which on AMD compiles to
|
|
16
|
+
* a `v_movrels`/`v_movreld` waterfall whose trip count is the number of *distinct* register indices
|
|
17
|
+
* live in the wave.
|
|
18
|
+
*
|
|
19
|
+
* Grouping the list by program collapses both. Padding each group out to
|
|
20
|
+
* {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} is what makes the grouping actually hold at wave
|
|
21
|
+
* granularity: an unpadded boundary lands mid-wave and that wave spans two programs again.
|
|
22
|
+
*
|
|
23
|
+
* ## What it is NOT
|
|
24
|
+
*
|
|
25
|
+
* This is the *simulation* order: camera-independent, changing only when emitters and their
|
|
26
|
+
* programs change. It is a different ordering from the *render* order in `../sort/`, which is
|
|
27
|
+
* back-to-front by view depth and exists so premultiplied transparency composites correctly. The
|
|
28
|
+
* two must stay in separate buffers and separate passes — reordering the render list for coherence
|
|
29
|
+
* breaks transparency, and depth-sorting the simulation list destroys the coherence.
|
|
30
|
+
*
|
|
31
|
+
* ## Indirection only
|
|
32
|
+
*
|
|
33
|
+
* Everything here permutes *indices into the pool*. Particle records never move: a slot is
|
|
34
|
+
* referenced by the dead (free) list and by the alive list across frames, so relocating a record
|
|
35
|
+
* would leave both pointing at the wrong particle.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/** @type {number} bucket granularity — one whole simulate workgroup, and so at least one whole wave */
|
|
39
|
+
const WG = PARTICLE_SIMULATE_WORKGROUP_SIZE;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Round `value` up to a multiple of {@link PARTICLE_SIMULATE_WORKGROUP_SIZE}.
|
|
43
|
+
*
|
|
44
|
+
* Mirrors the WGSL, which does this with a mask rather than a divide — see
|
|
45
|
+
* {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} for why.
|
|
46
|
+
*
|
|
47
|
+
* @param {number} value
|
|
48
|
+
* @returns {number}
|
|
49
|
+
*/
|
|
50
|
+
export function particle_bucket_round_up(value) {
|
|
51
|
+
return (value + (WG - 1)) & ~(WG - 1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @typedef {object} ParticleProgramBucketLayout
|
|
56
|
+
* @property {number[]} counts particles per program, before padding
|
|
57
|
+
* @property {number[]} padded_counts each count rounded up to a whole workgroup
|
|
58
|
+
* @property {number[]} offsets first index of each program's run in the padded list
|
|
59
|
+
* @property {number} total length of the padded list — what sizes the simulate dispatch
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Bucket sizes and start offsets, exactly as the GPU derives them: an atomic histogram, a round-up
|
|
64
|
+
* of each bin to a whole workgroup, and an exclusive prefix sum of the *padded* bins (the GPU takes
|
|
65
|
+
* that sum from `graph_prefix_scan_csdldf`, the same scan the radix sort runs its spine through).
|
|
66
|
+
*
|
|
67
|
+
* A program with no particles contributes nothing: `round_up(0)` is 0, so empty buckets neither
|
|
68
|
+
* consume a workgroup nor shift the offsets of the buckets after them.
|
|
69
|
+
*
|
|
70
|
+
* @param {ArrayLike<number>} programs program id of each alive entry
|
|
71
|
+
* @param {number} program_count number of distinct programs (the bucket count)
|
|
72
|
+
* @returns {ParticleProgramBucketLayout}
|
|
73
|
+
*/
|
|
74
|
+
export function particle_program_bucket_layout(programs, program_count) {
|
|
75
|
+
const counts = new Array(program_count).fill(0);
|
|
76
|
+
for (let i = 0; i < programs.length; i++) {
|
|
77
|
+
counts[programs[i]]++;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const padded_counts = counts.map(particle_bucket_round_up);
|
|
81
|
+
|
|
82
|
+
const offsets = new Array(program_count);
|
|
83
|
+
let total = 0;
|
|
84
|
+
for (let b = 0; b < program_count; b++) {
|
|
85
|
+
offsets[b] = total;
|
|
86
|
+
total += padded_counts[b];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return { counts, padded_counts, offsets, total };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The simulate pass's input list: pool slot indices grouped by program, each group padded out to a
|
|
94
|
+
* workgroup boundary with {@link PARTICLE_SIM_PAD_SLOT}.
|
|
95
|
+
*
|
|
96
|
+
* Order within a bucket is arrival order here and arbitrary on the GPU (the scatter takes its rank
|
|
97
|
+
* from an atomic), which is fine — nothing downstream depends on the order of particles running the
|
|
98
|
+
* same program.
|
|
99
|
+
*
|
|
100
|
+
* @param {ArrayLike<number>} slots pool slot index of each alive entry
|
|
101
|
+
* @param {ArrayLike<number>} programs program id of each alive entry, parallel to `slots`
|
|
102
|
+
* @param {number} program_count number of distinct programs (the bucket count)
|
|
103
|
+
* @returns {number[]} the padded, program-coherent indirection list
|
|
104
|
+
*/
|
|
105
|
+
export function particle_program_bucket_list(slots, programs, program_count) {
|
|
106
|
+
const layout = particle_program_bucket_layout(programs, program_count);
|
|
107
|
+
|
|
108
|
+
const list = new Array(layout.total).fill(PARTICLE_SIM_PAD_SLOT);
|
|
109
|
+
|
|
110
|
+
const cursor = layout.offsets.slice();
|
|
111
|
+
for (let i = 0; i < slots.length; i++) {
|
|
112
|
+
list[cursor[programs[i]]++] = slots[i];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return list;
|
|
116
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-frame reset, and the only place the bucketing decides how big it is.
|
|
3
|
+
*
|
|
4
|
+
* WebGPU zero-fills a buffer on CREATION only, so without this the scan would consume last frame's
|
|
5
|
+
* bins and the scatter would compound last frame's ranks.
|
|
6
|
+
*
|
|
7
|
+
* @type {ComputeShader}
|
|
8
|
+
*/
|
|
9
|
+
export const shader_particle_bucket_reset: ComputeShader;
|
|
10
|
+
/**
|
|
11
|
+
* One bin per PROGRAM, not per emitter: emitters compiled from the same graph share a program id
|
|
12
|
+
* (see {@link ../runtime/ProgramArena.js}) and belong in one wave-coherent run. Keying on the
|
|
13
|
+
* emitter index would split a run that was already coherent into one padded bucket per emitter.
|
|
14
|
+
*
|
|
15
|
+
* The emitter's program id is read by direct indexing rather than through
|
|
16
|
+
* `particle_emitter_read` — decoding a whole 41-word record, transform matrix included, to reach one
|
|
17
|
+
* word would be pure waste in a pass that touches every live particle.
|
|
18
|
+
*
|
|
19
|
+
* @type {ComputeShader}
|
|
20
|
+
*/
|
|
21
|
+
export const shader_particle_bucket_histogram: ComputeShader;
|
|
22
|
+
/**
|
|
23
|
+
* Round every bin up to a whole workgroup, keeping the raw count in `bucket_counts` for the fill
|
|
24
|
+
* pass (which needs to know where the real entries stop and the padding starts).
|
|
25
|
+
*
|
|
26
|
+
* This is THE step that makes the bucketing worth doing. Scanning the raw counts would put a
|
|
27
|
+
* bucket boundary at an arbitrary index, and the wave straddling it would span two programs again —
|
|
28
|
+
* the exact divergence the pass exists to remove. An empty bin rounds up to zero, so a program with
|
|
29
|
+
* no live particles costs no lanes and shifts nothing.
|
|
30
|
+
*
|
|
31
|
+
* @type {ComputeShader}
|
|
32
|
+
*/
|
|
33
|
+
export const shader_particle_bucket_pad: ComputeShader;
|
|
34
|
+
/**
|
|
35
|
+
* Place each alive entry's pool slot at its bucket's exclusive offset plus an atomic rank.
|
|
36
|
+
*
|
|
37
|
+
* Order within a bucket is therefore arbitrary, which is exactly as much order as the simulation
|
|
38
|
+
* needs: every lane in the bucket runs the same program, so which of them runs where changes
|
|
39
|
+
* nothing.
|
|
40
|
+
*
|
|
41
|
+
* @type {ComputeShader}
|
|
42
|
+
*/
|
|
43
|
+
export const shader_particle_bucket_scatter: ComputeShader;
|
|
44
|
+
/**
|
|
45
|
+
* Stamp the padding sentinel into the tail of every bucket, and publish the padded total.
|
|
46
|
+
*
|
|
47
|
+
* Dispatched over one workgroup per bucket — a bucket's padding is at most `BUCKET_ALIGNMENT - 1`
|
|
48
|
+
* entries, so a workgroup always covers it. It cannot ride along with the scatter, which has no
|
|
49
|
+
* thread at all for a bucket whose particles all died.
|
|
50
|
+
*
|
|
51
|
+
* The padded total is the last bucket's inclusive scan value. It, and not the alive count, is what
|
|
52
|
+
* sizes next frame's simulate dispatch — the build-indirect pass reads it out of
|
|
53
|
+
* {@link PARTICLE_COUNTER.SIM_PADDED}.
|
|
54
|
+
*
|
|
55
|
+
* @type {ComputeShader}
|
|
56
|
+
*/
|
|
57
|
+
export const shader_particle_bucket_fill: ComputeShader;
|
|
58
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
59
|
+
//# sourceMappingURL=shader_particle_bucket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_particle_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/coherence/shader_particle_bucket.js"],"names":[],"mappings":"AAwGA;;;;;;;GAOG;AACH,2CAFU,aAAa,CAyCpB;AAcH;;;;;;;;;;GAUG;AACH,+CAFU,aAAa,CAyBpB;AAYH;;;;;;;;;;GAUG;AACH,yCAFU,aAAa,CAmBpB;AAeH;;;;;;;;GAQG;AACH,6CAFU,aAAa,CAwBpB;AAcH;;;;;;;;;;;;GAYG;AACH,0CAFU,aAAa,CAiCpB;8BArV2B,+BAA+B"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { atomic_u32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
3
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
4
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
5
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
6
|
+
import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
|
|
7
|
+
import {
|
|
8
|
+
PARTICLE_RECORD_HEADER_EMITTER,
|
|
9
|
+
PARTICLE_RECORD_WORD_COUNT,
|
|
10
|
+
PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
11
|
+
PARTICLE_SIM_PAD_SLOT,
|
|
12
|
+
} from "../ParticleConstants.js";
|
|
13
|
+
import { PARTICLE_COUNTER } from "../data/PARTICLE_COUNTERS.js";
|
|
14
|
+
import { EMITTER_FIELD, EMITTER_STRIDE } from "../data/PARTICLE_EMITTER_LAYOUT.js";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Simulation-order bucketing — the passes that make each simulate wave run ONE VM program.
|
|
18
|
+
*
|
|
19
|
+
* ## Why
|
|
20
|
+
*
|
|
21
|
+
* The alive list is produced by compaction (`atomicAdd(&counters[ALIVE])`), so its order is
|
|
22
|
+
* arbitrary with respect to emitters and a single wave routinely holds particles running different
|
|
23
|
+
* programs. That costs twice: the interpreter's ~40-case opcode `switch` diverges, so the wave
|
|
24
|
+
* serially executes the union of the opcodes its lanes want; and `vm_reg[dst]` / `vm_reg[s0]` index
|
|
25
|
+
* a VGPR-resident register file dynamically, which AMD reaches with `v_movrels`/`v_movreld` behind
|
|
26
|
+
* a waterfall loop whose trip count is the number of DISTINCT register indices live in the wave.
|
|
27
|
+
* Grouping the wave by program collapses both at once.
|
|
28
|
+
*
|
|
29
|
+
* ## Shape
|
|
30
|
+
*
|
|
31
|
+
* The same three-phase shape the depth sort uses, with two small passes added for the padding:
|
|
32
|
+
*
|
|
33
|
+
* reset -> histogram -> pad -> graph_prefix_scan_csdldf -> scatter -> fill
|
|
34
|
+
*
|
|
35
|
+
* 0. {@link shader_particle_bucket_reset} — write the `{count}` header the scan sizes itself from,
|
|
36
|
+
* clear the bins and the scatter cursors, and build the indirect args the next two passes are
|
|
37
|
+
* dispatched with (one thread per alive particle, from the GPU's own alive count).
|
|
38
|
+
* 1. {@link shader_particle_bucket_histogram} — per alive entry, look up the owning emitter's
|
|
39
|
+
* program id and bump that bin.
|
|
40
|
+
* 2. {@link shader_particle_bucket_pad} — round every bin up to a whole simulate workgroup, keeping
|
|
41
|
+
* the raw count aside. Rounding BEFORE the scan is what puts every bucket boundary on a wave
|
|
42
|
+
* boundary; rounding after would leave the offsets unpadded and each boundary back mid-wave.
|
|
43
|
+
* 3. `graph_prefix_scan_csdldf`, reused as-is — inclusive prefix sums of the padded bins, so every
|
|
44
|
+
* bucket's start offset is a multiple of the workgroup size.
|
|
45
|
+
* 4. {@link shader_particle_bucket_scatter} — per alive entry, exclusive offset plus an atomic rank
|
|
46
|
+
* within the bucket, then write the pool slot there.
|
|
47
|
+
* 5. {@link shader_particle_bucket_fill} — write the padding sentinel into the tail of each bucket
|
|
48
|
+
* and publish the padded total, which sizes next frame's simulate dispatch.
|
|
49
|
+
*
|
|
50
|
+
* ## Invariants this file rests on
|
|
51
|
+
*
|
|
52
|
+
* - **Indirection only.** Everything here permutes indices into `pool`. Records never move: slots
|
|
53
|
+
* are referenced by the dead (free) list and across frames, and relocating one would leave both
|
|
54
|
+
* pointing at the wrong particle.
|
|
55
|
+
* - **No CPU readback.** Only the bucket COUNT is host-known, and that is static topology (it
|
|
56
|
+
* changes when the emitter set does, not per frame). Every per-frame quantity — the alive count,
|
|
57
|
+
* the bin sizes, the padded total — is produced and consumed on the GPU.
|
|
58
|
+
* - **This is not the render order.** `../sort/` produces the camera-dependent back-to-front list
|
|
59
|
+
* the billboard draw consumes. Separate buffers, separate passes, separate counter slots.
|
|
60
|
+
*
|
|
61
|
+
* @see ./particle_program_buckets.js for the CPU statement of the same answer.
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
/** @type {number} words of `{count, elements}` header in front of the scan's bins */
|
|
65
|
+
const HEADER = PREFIX_SCAN_CSDLDF_HEADER_WORDS;
|
|
66
|
+
|
|
67
|
+
const WG = PARTICLE_SIMULATE_WORKGROUP_SIZE;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Mask that rounds a count down to a whole workgroup; `(n + WG - 1) & PAD_MASK` rounds up.
|
|
71
|
+
*
|
|
72
|
+
* A mask rather than `(n + WG - 1u) / WG * WG` because the WGSL emulator's `/` is float division —
|
|
73
|
+
* the divide form would read differently there than on a device, and the round-up is exactly the
|
|
74
|
+
* property the specs have to pin. Correct only because {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} is
|
|
75
|
+
* a power of two.
|
|
76
|
+
*
|
|
77
|
+
* @type {number}
|
|
78
|
+
*/
|
|
79
|
+
const PAD_MASK = (~(WG - 1)) >>> 0;
|
|
80
|
+
|
|
81
|
+
/** log2 of the workgroup size — the fill pass splits its thread id into (bucket, lane) with it. */
|
|
82
|
+
const WG_LOG = Math.log2(WG);
|
|
83
|
+
|
|
84
|
+
/** Constants every pass in this file interpolates. */
|
|
85
|
+
const COMMON = /* wgsl */ `
|
|
86
|
+
const BUCKET_HEADER_WORDS : u32 = ${HEADER}u;
|
|
87
|
+
const BUCKET_ALIGNMENT : u32 = ${WG}u;
|
|
88
|
+
const BUCKET_PAD_MASK : u32 = ${PAD_MASK}u;
|
|
89
|
+
const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
|
|
90
|
+
const COUNTER_SIM_PADDED : u32 = ${PARTICLE_COUNTER.SIM_PADDED}u;
|
|
91
|
+
`;
|
|
92
|
+
|
|
93
|
+
// --- 0. reset ---------------------------------------------------------------------------------
|
|
94
|
+
|
|
95
|
+
const reset_resources = new ShaderResourceSetDescriptor();
|
|
96
|
+
|
|
97
|
+
// per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
|
|
98
|
+
reset_resources.setImmediate("u_bucket_count", u32);
|
|
99
|
+
reset_resources.createGroup()
|
|
100
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true) // atomics need read_write even for atomicLoad
|
|
101
|
+
.addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
|
|
102
|
+
.addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
|
|
103
|
+
.addStorageBuffer("sim_dispatch_args", WebGPUArray.u32, true); // {x,y,z}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Per-frame reset, and the only place the bucketing decides how big it is.
|
|
107
|
+
*
|
|
108
|
+
* WebGPU zero-fills a buffer on CREATION only, so without this the scan would consume last frame's
|
|
109
|
+
* bins and the scatter would compound last frame's ranks.
|
|
110
|
+
*
|
|
111
|
+
* @type {ComputeShader}
|
|
112
|
+
*/
|
|
113
|
+
export const shader_particle_bucket_reset = ComputeShader.from({
|
|
114
|
+
label: "Particle Bucket Reset",
|
|
115
|
+
resources: reset_resources,
|
|
116
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
117
|
+
${COMMON}
|
|
118
|
+
|
|
119
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
120
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
121
|
+
let i = gid.x;
|
|
122
|
+
|
|
123
|
+
if (i == 0u) {
|
|
124
|
+
// The {count, elements} header the csdldf scan sizes itself from.
|
|
125
|
+
atomicStore(&histogram[0], u_bucket_count);
|
|
126
|
+
|
|
127
|
+
// One thread per alive particle for the histogram and the scatter. The alive count exists
|
|
128
|
+
// only on the GPU — the host's copy is a frame stale at best — so the dispatch that
|
|
129
|
+
// consumes it is built here rather than passed in.
|
|
130
|
+
let alive = atomicLoad(&counters[COUNTER_ALIVE]);
|
|
131
|
+
sim_dispatch_args[0] = (alive + BUCKET_ALIGNMENT - 1u) / BUCKET_ALIGNMENT;
|
|
132
|
+
sim_dispatch_args[1] = 1u;
|
|
133
|
+
sim_dispatch_args[2] = 1u;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Header padding: never read by the scan, but it shares the buffer and the pool may have left
|
|
137
|
+
// something in it.
|
|
138
|
+
if (i > 0u && i < BUCKET_HEADER_WORDS) {
|
|
139
|
+
atomicStore(&histogram[i], 0u);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// The scan reads whole vec4s, so the bins are cleared up to the vec4 the last one lands in.
|
|
143
|
+
if (i < ((u_bucket_count + 3u) & 0xfffffffcu)) {
|
|
144
|
+
atomicStore(&histogram[BUCKET_HEADER_WORDS + i], 0u);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (i < u_bucket_count) {
|
|
148
|
+
atomicStore(&cursor[i], 0u);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
`),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// --- 1. histogram -----------------------------------------------------------------------------
|
|
155
|
+
|
|
156
|
+
const histogram_resources = new ShaderResourceSetDescriptor();
|
|
157
|
+
|
|
158
|
+
histogram_resources.createGroup()
|
|
159
|
+
.addStorageBuffer("emitters", WebGPUArray.u32, false)
|
|
160
|
+
.addStorageBuffer("pool", WebGPUArray.u32, false)
|
|
161
|
+
.addStorageBuffer("alive", WebGPUArray.u32, false)
|
|
162
|
+
.addStorageBuffer("keys", WebGPUArray.u32, true)
|
|
163
|
+
.addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
|
|
164
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* One bin per PROGRAM, not per emitter: emitters compiled from the same graph share a program id
|
|
168
|
+
* (see {@link ../runtime/ProgramArena.js}) and belong in one wave-coherent run. Keying on the
|
|
169
|
+
* emitter index would split a run that was already coherent into one padded bucket per emitter.
|
|
170
|
+
*
|
|
171
|
+
* The emitter's program id is read by direct indexing rather than through
|
|
172
|
+
* `particle_emitter_read` — decoding a whole 41-word record, transform matrix included, to reach one
|
|
173
|
+
* word would be pure waste in a pass that touches every live particle.
|
|
174
|
+
*
|
|
175
|
+
* @type {ComputeShader}
|
|
176
|
+
*/
|
|
177
|
+
export const shader_particle_bucket_histogram = ComputeShader.from({
|
|
178
|
+
label: "Particle Bucket Histogram",
|
|
179
|
+
resources: histogram_resources,
|
|
180
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
181
|
+
${COMMON}
|
|
182
|
+
const PARTICLE_RECORD_WORDS : u32 = ${PARTICLE_RECORD_WORD_COUNT}u;
|
|
183
|
+
const PARTICLE_HEADER_EMITTER : u32 = ${PARTICLE_RECORD_HEADER_EMITTER}u;
|
|
184
|
+
const PARTICLE_EMITTER_RECORD_WORDS : u32 = ${EMITTER_STRIDE}u;
|
|
185
|
+
const EMITTER_WORD_PROGRAM_ID : u32 = ${EMITTER_FIELD.PROGRAM_ID}u;
|
|
186
|
+
|
|
187
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
188
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
189
|
+
let i = gid.x;
|
|
190
|
+
if (i >= atomicLoad(&counters[COUNTER_ALIVE])) { return; }
|
|
191
|
+
|
|
192
|
+
let slot = alive[i];
|
|
193
|
+
let emitter_index = pool[slot * PARTICLE_RECORD_WORDS + PARTICLE_HEADER_EMITTER];
|
|
194
|
+
let program = emitters[emitter_index * PARTICLE_EMITTER_RECORD_WORDS + EMITTER_WORD_PROGRAM_ID];
|
|
195
|
+
|
|
196
|
+
keys[i] = program;
|
|
197
|
+
atomicAdd(&histogram[BUCKET_HEADER_WORDS + program], 1u);
|
|
198
|
+
}
|
|
199
|
+
`),
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// --- 2. pad -----------------------------------------------------------------------------------
|
|
203
|
+
|
|
204
|
+
const pad_resources = new ShaderResourceSetDescriptor();
|
|
205
|
+
|
|
206
|
+
// per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
|
|
207
|
+
pad_resources.setImmediate("u_bucket_count", u32);
|
|
208
|
+
pad_resources.createGroup()
|
|
209
|
+
.addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
|
|
210
|
+
.addStorageBuffer("bucket_counts", WebGPUArray.u32, true);
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Round every bin up to a whole workgroup, keeping the raw count in `bucket_counts` for the fill
|
|
214
|
+
* pass (which needs to know where the real entries stop and the padding starts).
|
|
215
|
+
*
|
|
216
|
+
* This is THE step that makes the bucketing worth doing. Scanning the raw counts would put a
|
|
217
|
+
* bucket boundary at an arbitrary index, and the wave straddling it would span two programs again —
|
|
218
|
+
* the exact divergence the pass exists to remove. An empty bin rounds up to zero, so a program with
|
|
219
|
+
* no live particles costs no lanes and shifts nothing.
|
|
220
|
+
*
|
|
221
|
+
* @type {ComputeShader}
|
|
222
|
+
*/
|
|
223
|
+
export const shader_particle_bucket_pad = ComputeShader.from({
|
|
224
|
+
label: "Particle Bucket Pad",
|
|
225
|
+
resources: pad_resources,
|
|
226
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
227
|
+
${COMMON}
|
|
228
|
+
|
|
229
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
230
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
231
|
+
let b = gid.x;
|
|
232
|
+
if (b >= u_bucket_count) { return; }
|
|
233
|
+
|
|
234
|
+
let raw = atomicLoad(&histogram[BUCKET_HEADER_WORDS + b]);
|
|
235
|
+
|
|
236
|
+
bucket_counts[b] = raw;
|
|
237
|
+
atomicStore(&histogram[BUCKET_HEADER_WORDS + b], (raw + BUCKET_ALIGNMENT - 1u) & BUCKET_PAD_MASK);
|
|
238
|
+
}
|
|
239
|
+
`),
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// --- 3. (graph_prefix_scan_csdldf) ------------------------------------------------------------
|
|
243
|
+
// --- 4. scatter -------------------------------------------------------------------------------
|
|
244
|
+
|
|
245
|
+
const scatter_resources = new ShaderResourceSetDescriptor();
|
|
246
|
+
|
|
247
|
+
scatter_resources.createGroup()
|
|
248
|
+
.addStorageBuffer("keys", WebGPUArray.u32, false)
|
|
249
|
+
.addStorageBuffer("alive", WebGPUArray.u32, false)
|
|
250
|
+
.addStorageBuffer("scanned", WebGPUArray.u32, false)
|
|
251
|
+
.addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
|
|
252
|
+
.addStorageBuffer("sim_list", WebGPUArray.u32, true)
|
|
253
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Place each alive entry's pool slot at its bucket's exclusive offset plus an atomic rank.
|
|
257
|
+
*
|
|
258
|
+
* Order within a bucket is therefore arbitrary, which is exactly as much order as the simulation
|
|
259
|
+
* needs: every lane in the bucket runs the same program, so which of them runs where changes
|
|
260
|
+
* nothing.
|
|
261
|
+
*
|
|
262
|
+
* @type {ComputeShader}
|
|
263
|
+
*/
|
|
264
|
+
export const shader_particle_bucket_scatter = ComputeShader.from({
|
|
265
|
+
label: "Particle Bucket Scatter",
|
|
266
|
+
resources: scatter_resources,
|
|
267
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
268
|
+
${COMMON}
|
|
269
|
+
|
|
270
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
271
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
272
|
+
let i = gid.x;
|
|
273
|
+
if (i >= atomicLoad(&counters[COUNTER_ALIVE])) { return; }
|
|
274
|
+
|
|
275
|
+
let bucket = keys[i];
|
|
276
|
+
|
|
277
|
+
// The scan is inclusive, so bucket b's exclusive offset is bucket b-1's inclusive value, one
|
|
278
|
+
// word earlier. For bucket 0 the index lands on the last header word — in bounds, and unused,
|
|
279
|
+
// because select() takes the 0 branch there.
|
|
280
|
+
let exclusive = select(0u, scanned[BUCKET_HEADER_WORDS + bucket - 1u], bucket > 0u);
|
|
281
|
+
let rank = atomicAdd(&cursor[bucket], 1u);
|
|
282
|
+
|
|
283
|
+
sim_list[exclusive + rank] = alive[i];
|
|
284
|
+
}
|
|
285
|
+
`),
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// --- 5. fill ----------------------------------------------------------------------------------
|
|
289
|
+
|
|
290
|
+
const fill_resources = new ShaderResourceSetDescriptor();
|
|
291
|
+
|
|
292
|
+
// per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
|
|
293
|
+
fill_resources.setImmediate("u_bucket_count", u32);
|
|
294
|
+
fill_resources.createGroup()
|
|
295
|
+
.addStorageBuffer("bucket_counts", WebGPUArray.u32, false)
|
|
296
|
+
.addStorageBuffer("scanned", WebGPUArray.u32, false)
|
|
297
|
+
.addStorageBuffer("sim_list", WebGPUArray.u32, true)
|
|
298
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Stamp the padding sentinel into the tail of every bucket, and publish the padded total.
|
|
302
|
+
*
|
|
303
|
+
* Dispatched over one workgroup per bucket — a bucket's padding is at most `BUCKET_ALIGNMENT - 1`
|
|
304
|
+
* entries, so a workgroup always covers it. It cannot ride along with the scatter, which has no
|
|
305
|
+
* thread at all for a bucket whose particles all died.
|
|
306
|
+
*
|
|
307
|
+
* The padded total is the last bucket's inclusive scan value. It, and not the alive count, is what
|
|
308
|
+
* sizes next frame's simulate dispatch — the build-indirect pass reads it out of
|
|
309
|
+
* {@link PARTICLE_COUNTER.SIM_PADDED}.
|
|
310
|
+
*
|
|
311
|
+
* @type {ComputeShader}
|
|
312
|
+
*/
|
|
313
|
+
export const shader_particle_bucket_fill = ComputeShader.from({
|
|
314
|
+
label: "Particle Bucket Fill",
|
|
315
|
+
resources: fill_resources,
|
|
316
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
317
|
+
${COMMON}
|
|
318
|
+
const PARTICLE_SIM_PAD_SLOT : u32 = ${PARTICLE_SIM_PAD_SLOT}u;
|
|
319
|
+
|
|
320
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
321
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
322
|
+
// One workgroup per bucket. Shift and mask rather than / and %: the emulator's / is float
|
|
323
|
+
// division, and BUCKET_ALIGNMENT is a power of two anyway.
|
|
324
|
+
let bucket = gid.x >> ${WG_LOG}u;
|
|
325
|
+
let lane = gid.x & (BUCKET_ALIGNMENT - 1u);
|
|
326
|
+
|
|
327
|
+
if (gid.x == 0u) {
|
|
328
|
+
// Inclusive scan, so the last bucket's value is the whole padded length.
|
|
329
|
+
atomicStore(&counters[COUNTER_SIM_PADDED], scanned[BUCKET_HEADER_WORDS + u_bucket_count - 1u]);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if (bucket >= u_bucket_count) { return; }
|
|
333
|
+
|
|
334
|
+
let raw = bucket_counts[bucket];
|
|
335
|
+
let padded = (raw + BUCKET_ALIGNMENT - 1u) & BUCKET_PAD_MASK;
|
|
336
|
+
// The scan is inclusive, so subtracting this bucket's own (padded) size gives its start.
|
|
337
|
+
let start = scanned[BUCKET_HEADER_WORDS + bucket] - padded;
|
|
338
|
+
|
|
339
|
+
if (lane < padded - raw) {
|
|
340
|
+
sim_list[start + raw + lane] = PARTICLE_SIM_PAD_SLOT;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
`),
|
|
344
|
+
});
|
|
@@ -10,15 +10,37 @@ export const PARTICLE_COUNTER: Readonly<{
|
|
|
10
10
|
DEAD: 1;
|
|
11
11
|
/** number of particles requested to spawn this frame */
|
|
12
12
|
SPAWN: 2;
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Length of the depth-sorted index list — the RENDER order (`../sort/`), back-to-front by view
|
|
15
|
+
* depth so premultiplied transparency composites correctly. Belongs to the camera-dependent
|
|
16
|
+
* ordering and to nothing else; the simulation order has its own slot, {@link SIM_PADDED}.
|
|
17
|
+
* Sharing one slot between the two would silently couple a camera-driven ordering to a
|
|
18
|
+
* program-driven one.
|
|
19
|
+
*/
|
|
14
20
|
SORTED: 3;
|
|
15
21
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
22
|
+
* The exact length of the index list the simulate pass consumes this frame — the padded,
|
|
23
|
+
* program-coherent list the coherence pass built at the end of last frame, so this is
|
|
24
|
+
* {@link SIM_PADDED}'s value from then, NOT the alive count (padding makes it larger, and a
|
|
25
|
+
* multiple of the simulate workgroup size).
|
|
26
|
+
*
|
|
27
|
+
* Written by the build-indirect pass at the end of each frame, from the same value it derives
|
|
28
|
+
* the indirect dispatch args from — which is what makes the dispatch's thread count and the
|
|
29
|
+
* shader's bound agree by construction. NOT zeroed by the reset pass, so the loop stays fully
|
|
30
|
+
* GPU-driven (no CPU readback can be trusted for dispatch sizing: a stale count orphans or
|
|
31
|
+
* double-simulates slots).
|
|
20
32
|
*/
|
|
21
33
|
ALIVE_IN: 4;
|
|
34
|
+
/**
|
|
35
|
+
* Length of the padded, program-coherent simulate input list the coherence pass (`../coherence/`)
|
|
36
|
+
* produced this frame — the SIMULATION order. Camera-independent; it changes only when the
|
|
37
|
+
* emitter/program set does. Read by the build-indirect pass, which turns it into next frame's
|
|
38
|
+
* {@link ALIVE_IN} and dispatch args.
|
|
39
|
+
*
|
|
40
|
+
* Zeroed by the reset pass: if the coherence passes are ever left out of a frame, simulate then
|
|
41
|
+
* reads a length of zero and does nothing, rather than re-running last frame's stale list.
|
|
42
|
+
*/
|
|
43
|
+
SIM_PADDED: 5;
|
|
22
44
|
}>;
|
|
23
45
|
/** Number of `u32` atomic slots in the counters buffer. */
|
|
24
46
|
export const PARTICLE_COUNTER_COUNT: 8;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PARTICLE_COUNTERS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_COUNTERS.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACI,mDAAmD;;IAEnD,qCAAqC;;IAErC,wDAAwD;;IAExD
|
|
1
|
+
{"version":3,"file":"PARTICLE_COUNTERS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_COUNTERS.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACI,mDAAmD;;IAEnD,qCAAqC;;IAErC,wDAAwD;;IAExD;;;;;;OAMG;;IAEH;;;;;;;;;;;OAWG;;IAEH;;;;;;;;OAQG;;GAEJ;AAEH,2DAA2D;AAC3D,uCAAwC;AAExC;;;GAGG;AACH,0CAFU,YAAY,CAQG;6BA5DI,mCAAmC"}
|
|
@@ -13,15 +13,37 @@ export const PARTICLE_COUNTER = Object.freeze({
|
|
|
13
13
|
DEAD: 1,
|
|
14
14
|
/** number of particles requested to spawn this frame */
|
|
15
15
|
SPAWN: 2,
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Length of the depth-sorted index list — the RENDER order (`../sort/`), back-to-front by view
|
|
18
|
+
* depth so premultiplied transparency composites correctly. Belongs to the camera-dependent
|
|
19
|
+
* ordering and to nothing else; the simulation order has its own slot, {@link SIM_PADDED}.
|
|
20
|
+
* Sharing one slot between the two would silently couple a camera-driven ordering to a
|
|
21
|
+
* program-driven one.
|
|
22
|
+
*/
|
|
17
23
|
SORTED: 3,
|
|
18
24
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
25
|
+
* The exact length of the index list the simulate pass consumes this frame — the padded,
|
|
26
|
+
* program-coherent list the coherence pass built at the end of last frame, so this is
|
|
27
|
+
* {@link SIM_PADDED}'s value from then, NOT the alive count (padding makes it larger, and a
|
|
28
|
+
* multiple of the simulate workgroup size).
|
|
29
|
+
*
|
|
30
|
+
* Written by the build-indirect pass at the end of each frame, from the same value it derives
|
|
31
|
+
* the indirect dispatch args from — which is what makes the dispatch's thread count and the
|
|
32
|
+
* shader's bound agree by construction. NOT zeroed by the reset pass, so the loop stays fully
|
|
33
|
+
* GPU-driven (no CPU readback can be trusted for dispatch sizing: a stale count orphans or
|
|
34
|
+
* double-simulates slots).
|
|
23
35
|
*/
|
|
24
36
|
ALIVE_IN: 4,
|
|
37
|
+
/**
|
|
38
|
+
* Length of the padded, program-coherent simulate input list the coherence pass (`../coherence/`)
|
|
39
|
+
* produced this frame — the SIMULATION order. Camera-independent; it changes only when the
|
|
40
|
+
* emitter/program set does. Read by the build-indirect pass, which turns it into next frame's
|
|
41
|
+
* {@link ALIVE_IN} and dispatch args.
|
|
42
|
+
*
|
|
43
|
+
* Zeroed by the reset pass: if the coherence passes are ever left out of a frame, simulate then
|
|
44
|
+
* reads a length of zero and does nothing, rather than re-running last frame's stale list.
|
|
45
|
+
*/
|
|
46
|
+
SIM_PADDED: 5,
|
|
25
47
|
});
|
|
26
48
|
|
|
27
49
|
/** Number of `u32` atomic slots in the counters buffer. */
|
|
@@ -42,6 +42,7 @@ export function emitter_flags_projection(flags: number): number;
|
|
|
42
42
|
* @param {object} [def.render] { position, size, color, rotation, frame } attribute word offsets
|
|
43
43
|
* @param {number[]} [def.atlas_region] length-4 [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
|
|
44
44
|
* @param {number[]} [def.flipbook] length-2 [cols, rows]
|
|
45
|
+
* @param {number} [def.program_id] dense program id, the simulation-order bucket key
|
|
45
46
|
*/
|
|
46
47
|
export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number, def: {
|
|
47
48
|
spawn_offset: number;
|
|
@@ -58,6 +59,7 @@ export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number,
|
|
|
58
59
|
render?: object;
|
|
59
60
|
atlas_region?: number[];
|
|
60
61
|
flipbook?: number[];
|
|
62
|
+
program_id?: number;
|
|
61
63
|
}): void;
|
|
62
64
|
/**
|
|
63
65
|
* Overwrite just an emitter's world transform in a packed buffer.
|
|
@@ -104,9 +106,19 @@ export const EMITTER_FIELD: Readonly<{
|
|
|
104
106
|
ATLAS_REGION: 33;
|
|
105
107
|
FLIPBOOK: 37;
|
|
106
108
|
RENDER_VELOCITY: 39;
|
|
109
|
+
/**
|
|
110
|
+
* u32 — dense id of the compiled program this emitter runs, assigned by
|
|
111
|
+
* {@link ../runtime/ProgramArena.js}. Emitters sharing a program share an id.
|
|
112
|
+
*
|
|
113
|
+
* The simulation-order bucketing (`coherence/`) histograms on this: it needs a small dense
|
|
114
|
+
* integer to index a bin with, which neither the emitter index (one bucket per emitter, even
|
|
115
|
+
* when they run the same code) nor `UPDATE_OFFSET` (an arena word offset, arbitrarily large
|
|
116
|
+
* and sparse) gives it.
|
|
117
|
+
*/
|
|
118
|
+
PROGRAM_ID: 40;
|
|
107
119
|
}>;
|
|
108
120
|
/** Number of `u32` words per emitter record. */
|
|
109
|
-
export const EMITTER_STRIDE:
|
|
121
|
+
export const EMITTER_STRIDE: 41;
|
|
110
122
|
/** Sentinel for an absent render-attribute binding. */
|
|
111
123
|
export const EMITTER_ATTRIBUTE_ABSENT: 4294967295;
|
|
112
124
|
/** Sentinel for "not attached to a scene node". */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"AA4FA;;;;;;;;;;GAUG;AACH;IAR6B,QAAQ,GAA1B,OAAO;IACW,UAAU,GAA5B,OAAO;IACW,IAAI,GAAtB,OAAO;IACW,IAAI,GAAtB,OAAO;IACU,KAAK,GAAtB,MAAM;IACW,UAAU,GAA3B,MAAM;IACJ,MAAM,CAWlB;AAED,6DAA6D;AAC7D,2CADY,MAAM,GAAkB,MAAM,CAGzC;AAED,kEAAkE;AAClE,gDADY,MAAM,GAAkB,MAAM,CAGzC;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,kCApBW,WAAW,OACX,YAAY,SACZ,MAAM;IAEM,YAAY,EAAxB,MAAM;IACM,WAAW,EAAvB,MAAM;IACM,aAAa,EAAzB,MAAM;IACM,YAAY,EAAxB,MAAM;IACM,eAAe,EAA3B,MAAM;IACM,IAAI,EAAhB,MAAM;IACM,KAAK,EAAjB,MAAM;IACM,UAAU,EAAtB,MAAM;IACQ,SAAS,EAAvB,MAAM,EAAE;IACO,aAAa,GAA5B,MAAM,EAAE;IACK,aAAa,GAA1B,MAAM;IACO,MAAM,GAAnB,MAAM;IACS,YAAY,GAA3B,MAAM,EAAE;IACO,QAAQ,GAAvB,MAAM,EAAE;IACK,UAAU,GAAvB,MAAM;SA0ChB;AAED;;;;;;;;;;;GAWG;AACH,6CAJW,YAAY,SACZ,MAAM,UACN,UAAU,MAAM,CAAC,QAO3B;AAnND;;;;;;;;;;GAUG;AAEH,6CAA6C;AAC7C;;;;;;;;;;;;;;;;;;;;IA0BI;;;;;;;;OAQG;;GAEJ;AAEH,gDAAgD;AAChD,gCAAiC;AAEjC,uDAAuD;AACvD,kDAAmD;AAEnD,mDAAmD;AACnD,6CAA8C;AAE9C;;GAEG;AACH;;;;;GAKG;AAEH,kGAAkG;AAClG;;;;GAIG;AAKH,kEAAkE;AAClE;;;;;;GAMG;AAqCH,uEAAuE;AACvE;;;;;GAEG"}
|