@woosh/meep-engine 3.14.5 → 3.15.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/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/orchestrator/ServerAuthoritativeClient.d.ts +48 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +246 -3
- 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/RENDERER_CONTRACT.md +584 -580
- package/src/shade/playground/avboit/README.md +117 -0
- package/src/shade/playground/avboit/index.html +215 -0
- package/src/shade/playground/avboit/main.d.ts +2 -0
- package/src/shade/playground/avboit/main.d.ts.map +1 -0
- package/src/shade/playground/avboit/main.js +875 -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 +17 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +29 -28
- package/src/shade/renderer/ShadeTransparencyMode.d.ts +13 -0
- package/src/shade/renderer/ShadeTransparencyMode.d.ts.map +1 -0
- package/src/shade/renderer/ShadeTransparencyMode.js +30 -0
- 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/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts +9 -0
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +26 -0
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts +7 -2
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -1
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +1 -1
- package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts +3 -0
- package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/FORWARD_VERTEX_SHADER_STRUCT.js +4 -4
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts +3 -0
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.js +17 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.d.ts +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.js +16 -16
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.d.ts +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.js +17 -17
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.d.ts +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.js +2 -2
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts +3 -0
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/vertex_shader_chunk.js +4 -4
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts +27 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.js +27 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts +107 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +120 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +463 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +509 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts +15 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.js +33 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts +20 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.js +38 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +38 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +130 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts +37 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.js +73 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.js +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts +11 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.js +18 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.js +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.js +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts +15 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.js +25 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.js +35 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts +11 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.js +21 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.js +26 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts +11 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.js +22 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts +10 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.js +21 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts +10 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.js +32 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts +20 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.js +27 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts +10 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.js +18 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.js +21 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.js +23 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts +13 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js +27 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts +22 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.js +38 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +117 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +935 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts +8 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.js +135 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts +3 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +101 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts +3 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +96 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts +3 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +83 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.js +119 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts +3 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +81 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +15 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +237 -0
- package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts +22 -0
- package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/material_draw_indirect.js +69 -0
- 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 +665 -722
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +3 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -4
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -4
- 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
- package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts +0 -3
- package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts +0 -3
- package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.js +0 -17
- package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_brick4.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_ibl.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts +0 -3
- package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts.map +0 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { graph_compute_indirect_pass } from "../shader/graph/compute/graph_compute_indirect_pass.js";
|
|
2
2
|
import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
|
|
3
3
|
import { graph_import_buffer } from "../shader/graph/graph_import_buffer.js";
|
|
4
|
+
import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./ParticleConstants.js";
|
|
5
|
+
import { graph_particle_bucket } from "./coherence/graph_particle_bucket.js";
|
|
4
6
|
import { PARTICLE_EMIT_WORKGROUP_SIZE, shader_particle_emit } from "./shaders/shader_particle_emit.js";
|
|
5
7
|
import {
|
|
6
|
-
PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
7
8
|
shader_particle_build_indirect,
|
|
8
9
|
shader_particle_reset_counters,
|
|
9
10
|
} from "./shaders/shader_particle_finalize.js";
|
|
@@ -16,20 +17,32 @@ import { shader_particle_simulate } from "./shaders/shader_particle_simulate.js"
|
|
|
16
17
|
*
|
|
17
18
|
* The passes run in dependency order:
|
|
18
19
|
*
|
|
19
|
-
* reset counters
|
|
20
|
+
* reset counters -> emit (spawn) -> simulate (advance + compact) -> bucket -> build indirect args
|
|
20
21
|
*
|
|
21
22
|
* with the depth sort + billboard render appended by the caller (the render pass needs the frame's
|
|
22
23
|
* colour + depth attachments, which live in the caller's graph). Alive lists ping-pong by frame
|
|
23
|
-
* parity: `
|
|
24
|
-
*
|
|
24
|
+
* parity: `alive_write` receives this frame's survivors + newborns.
|
|
25
|
+
*
|
|
26
|
+
* ## Two orderings, kept apart
|
|
27
|
+
*
|
|
28
|
+
* Simulate does NOT read the alive list. It reads `sim_list`, the program-coherent indirection list
|
|
29
|
+
* the bucketing pass (`coherence/`) built from last frame's alive list: the same pool slots
|
|
30
|
+
* regrouped so each wave runs one VM program, with every run padded out to a whole workgroup. That
|
|
31
|
+
* ordering is camera-independent and changes only when emitters or their programs change.
|
|
32
|
+
*
|
|
33
|
+
* The RENDER ordering — back-to-front by view depth, from `sort/` — is a different list in a
|
|
34
|
+
* different buffer, produced by different passes, and the billboard draw is what consumes it.
|
|
35
|
+
* Reordering the render list for coherence would break premultiplied transparency; depth-sorting the
|
|
36
|
+
* simulation list would destroy the coherence. They share no buffer and no counter slot.
|
|
25
37
|
*
|
|
26
38
|
* The simulate pass is fully GPU-driven: its workgroup count comes from `dispatch_args` (written by
|
|
27
39
|
* LAST frame's build-indirect pass) via `dispatchWorkgroupsIndirect`, and its element bound comes
|
|
28
|
-
* from the `ALIVE_IN` counter snapshot — never from a CPU count.
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
40
|
+
* from the `ALIVE_IN` counter snapshot — never from a CPU count. Both are derived from one value,
|
|
41
|
+
* the padded list length, so the thread count and the bound agree by construction. A CPU count is
|
|
42
|
+
* inevitably stale and corrupts the pool (orphaned slots when the population grows, double-freed
|
|
43
|
+
* slots when it shrinks). Only the spawn count is CPU-provided, because the CPU authored the
|
|
44
|
+
* spawn-request list and knows its exact length. The caller renders with `drawIndirect(draw_args)`,
|
|
45
|
+
* which build-indirect writes THIS frame, so the instance count is exact too.
|
|
33
46
|
*
|
|
34
47
|
* All persistent buffers are imported (owned by the feature, not the graph). Writing an imported
|
|
35
48
|
* buffer marks the pass a side-effect so it always executes, and returns a renamed handle downstream
|
|
@@ -45,25 +58,34 @@ import { shader_particle_simulate } from "./shaders/shader_particle_simulate.js"
|
|
|
45
58
|
* @param {GPUBuffer} params.gpu.program
|
|
46
59
|
* @param {GPUBuffer} params.gpu.constants
|
|
47
60
|
* @param {GPUBuffer} params.gpu.pool
|
|
48
|
-
* @param {GPUBuffer} params.gpu.alive_read
|
|
49
|
-
*
|
|
61
|
+
* @param {GPUBuffer} params.gpu.alive_read the other half of the ping-pong. These passes no longer
|
|
62
|
+
* read it — simulate's input is `sim_list` — but the caller keeps swapping the two so this frame's
|
|
63
|
+
* render is not read-after-written by next frame's emit, which would serialise them
|
|
64
|
+
* @param {GPUBuffer} params.gpu.alive_write this-frame alive list: survivors + newborns
|
|
50
65
|
* @param {GPUBuffer} params.gpu.dead free-list stack
|
|
51
66
|
* @param {GPUBuffer} params.gpu.counters atomic counters
|
|
52
67
|
* @param {GPUBuffer} params.gpu.spawn_requests
|
|
53
68
|
* @param {GPUBuffer} params.gpu.dispatch_args indirect simulate dispatch (usage must include INDIRECT)
|
|
54
69
|
* @param {GPUBuffer} params.gpu.draw_args indirect billboard draw (usage must include INDIRECT)
|
|
70
|
+
* @param {GPUBuffer} params.gpu.sim_list program-coherent simulate input, rebuilt here for next frame
|
|
71
|
+
* @param {GPUBuffer} params.gpu.sim_keys see {@link graph_particle_bucket}
|
|
72
|
+
* @param {GPUBuffer} params.gpu.sim_histogram see {@link graph_particle_bucket}
|
|
73
|
+
* @param {GPUBuffer} params.gpu.sim_bucket_counts see {@link graph_particle_bucket}
|
|
74
|
+
* @param {GPUBuffer} params.gpu.sim_cursor see {@link graph_particle_bucket}
|
|
75
|
+
* @param {GPUBuffer} params.gpu.sim_dispatch_args see {@link graph_particle_bucket} (usage must include INDIRECT)
|
|
55
76
|
* @param {number} params.capacity pool capacity in particles (bounds the emit pass's free-list pops)
|
|
77
|
+
* @param {number} params.bucket_count distinct compiled programs — `GPUParticleSystem#bucketCount()`
|
|
56
78
|
* @param {object} params.frame per-frame scalars
|
|
57
79
|
* @param {number} params.frame.dt
|
|
58
80
|
* @param {number} params.frame.time
|
|
59
81
|
* @param {number} params.frame.index
|
|
60
82
|
* @param {number} params.frame.spawn_count number of spawn requests this frame (CPU-authored, exact)
|
|
61
83
|
*/
|
|
62
|
-
export function graph_particles({ graph, gpu, capacity, frame }) {
|
|
84
|
+
export function graph_particles({ graph, gpu, capacity, bucket_count, frame }) {
|
|
63
85
|
const gr_emitters = graph_import_buffer(graph, gpu.emitters, "particles/emitters");
|
|
64
86
|
const gr_program = graph_import_buffer(graph, gpu.program, "particles/program");
|
|
65
87
|
const gr_constants = graph_import_buffer(graph, gpu.constants, "particles/constants");
|
|
66
|
-
const
|
|
88
|
+
const gr_sim_list = graph_import_buffer(graph, gpu.sim_list, "particles/sim_list");
|
|
67
89
|
const gr_spawn = graph_import_buffer(graph, gpu.spawn_requests, "particles/spawn_requests");
|
|
68
90
|
const gr_dispatch = graph_import_buffer(graph, gpu.dispatch_args, "particles/dispatch_args");
|
|
69
91
|
const gr_draw = graph_import_buffer(graph, gpu.draw_args, "particles/draw_args");
|
|
@@ -76,7 +98,7 @@ export function graph_particles({ graph, gpu, capacity, frame }) {
|
|
|
76
98
|
let alive_write = graph_import_buffer(graph, gpu.alive_write, "particles/alive_write");
|
|
77
99
|
let dead = graph_import_buffer(graph, gpu.dead, "particles/dead");
|
|
78
100
|
|
|
79
|
-
// 1. Reset the alive/spawn/sorted counters (
|
|
101
|
+
// 1. Reset the alive/spawn/sorted/sim-padded counters (dead count + ALIVE_IN snapshot persist).
|
|
80
102
|
counters = graph_compute_pass({
|
|
81
103
|
graph,
|
|
82
104
|
shader: shader_particle_reset_counters,
|
|
@@ -102,17 +124,18 @@ export function graph_particles({ graph, gpu, capacity, frame }) {
|
|
|
102
124
|
pool = out.pool; alive_write = out.alive_out; dead = out.dead; counters = out.counters;
|
|
103
125
|
}
|
|
104
126
|
|
|
105
|
-
// 3. Simulate — one indirect dispatch runs every emitter's UPDATE over the
|
|
106
|
-
// compacting survivors into the new alive list and freed
|
|
107
|
-
// workgroup count comes from
|
|
108
|
-
//
|
|
127
|
+
// 3. Simulate — one indirect dispatch runs every emitter's UPDATE over the program-coherent list
|
|
128
|
+
// the bucketing pass built LAST frame, compacting survivors into the new alive list and freed
|
|
129
|
+
// slots into the dead list. The workgroup count comes from last frame's dispatch_args and the
|
|
130
|
+
// list itself from last frame's sim_list — both read here and re-written in steps 4 and 5,
|
|
131
|
+
// with insertion order keeping the read before the write.
|
|
109
132
|
{
|
|
110
133
|
const out = graph_compute_indirect_pass({
|
|
111
134
|
graph,
|
|
112
135
|
shader: shader_particle_simulate,
|
|
113
136
|
bindings: {
|
|
114
137
|
emitters: gr_emitters, program: gr_program, vm_constants: gr_constants,
|
|
115
|
-
pool,
|
|
138
|
+
pool, sim_list: gr_sim_list, alive_out: alive_write, dead, counters,
|
|
116
139
|
settings: { u_dt: frame.dt, u_time: frame.time, u_frame: frame.index },
|
|
117
140
|
},
|
|
118
141
|
command: gr_dispatch,
|
|
@@ -120,7 +143,24 @@ export function graph_particles({ graph, gpu, capacity, frame }) {
|
|
|
120
143
|
pool = out.pool; alive_write = out.alive_out; dead = out.dead; counters = out.counters;
|
|
121
144
|
}
|
|
122
145
|
|
|
123
|
-
// 4.
|
|
146
|
+
// 4. Bucket — regroup the frame's alive list by VM program, padded to whole workgroups, into the
|
|
147
|
+
// list NEXT frame's simulate consumes. Must follow BOTH emit and simulate, since both append
|
|
148
|
+
// to the alive list.
|
|
149
|
+
// `gr_sim_list` is handed over rather than re-imported: two imports of one GPUBuffer are two
|
|
150
|
+
// resource entries the graph cannot tell apart, which would put simulate's read of the list
|
|
151
|
+
// and this pass's rewrite of it on unrelated dependency chains.
|
|
152
|
+
counters = graph_particle_bucket({
|
|
153
|
+
graph,
|
|
154
|
+
gpu,
|
|
155
|
+
emitters: gr_emitters,
|
|
156
|
+
pool,
|
|
157
|
+
alive: alive_write,
|
|
158
|
+
counters,
|
|
159
|
+
sim_list: gr_sim_list,
|
|
160
|
+
bucket_count,
|
|
161
|
+
}).counters;
|
|
162
|
+
|
|
163
|
+
// 5. Snapshot the padded list length (next frame's simulate input length) and build the indirect
|
|
124
164
|
// dispatch args for next frame + the indirect draw args for this frame's render.
|
|
125
165
|
const indirect = graph_compute_pass({
|
|
126
166
|
graph,
|
|
@@ -50,12 +50,19 @@ export class EmitterRegistry {
|
|
|
50
50
|
}): number;
|
|
51
51
|
/**
|
|
52
52
|
* Pack all emitters + their programs into upload-ready buffers.
|
|
53
|
-
*
|
|
53
|
+
*
|
|
54
|
+
* `program_count` is the number of DISTINCT programs across the emitter set — the bucket count
|
|
55
|
+
* the simulation-order coherence pass histograms into. It is CPU-known and low-churn (it only
|
|
56
|
+
* changes when the emitter set does), which is why that pass can size its histogram, its cursor
|
|
57
|
+
* and its padding dispatch on the host without any of the per-frame counts ever leaving the GPU.
|
|
58
|
+
*
|
|
59
|
+
* @returns {{ emitters: Uint32Array, program: Uint32Array, constants: Uint32Array, program_count: number }}
|
|
54
60
|
*/
|
|
55
61
|
build(): {
|
|
56
62
|
emitters: Uint32Array;
|
|
57
63
|
program: Uint32Array;
|
|
58
64
|
constants: Uint32Array;
|
|
65
|
+
program_count: number;
|
|
59
66
|
};
|
|
60
67
|
/**
|
|
61
68
|
* The scene-node row an emitter is attached to (for bone attachment), or the "none" sentinel.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmitterRegistry.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/EmitterRegistry.js"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH;IAEQ,uBAAuB;IACvB,UADW,MAAM,EAAE,CACD;IAGtB,sDAAsD;IACtD,oBAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH;QAZqD,MAAM,EAAhD;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC;QACf,SAAS,GAA3B,MAAM,EAAE;QACQ,IAAI,GAApB,MAAM;QACU,UAAU,GAA1B,MAAM;QACU,KAAK,GAArB,MAAM;QACwC,MAAM,GAApD;YAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAC;QACL,MAAM;gBAA9B,MAAM,GAAC,MAAM;;QACF,YAAY,GAA9B,MAAM,EAAE;QACU,QAAQ,GAA1B,MAAM,EAAE;QACQ,UAAU,GAA1B,MAAM;QACJ,MAAM,CASlB;IAED
|
|
1
|
+
{"version":3,"file":"EmitterRegistry.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/EmitterRegistry.js"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH;IAEQ,uBAAuB;IACvB,UADW,MAAM,EAAE,CACD;IAGtB,sDAAsD;IACtD,oBAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH;QAZqD,MAAM,EAAhD;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC;QACf,SAAS,GAA3B,MAAM,EAAE;QACQ,IAAI,GAApB,MAAM;QACU,UAAU,GAA1B,MAAM;QACU,KAAK,GAArB,MAAM;QACwC,MAAM,GAApD;YAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAC;QACL,MAAM;gBAA9B,MAAM,GAAC,MAAM;;QACF,YAAY,GAA9B,MAAM,EAAE;QACU,QAAQ,GAA1B,MAAM,EAAE;QACQ,UAAU,GAA1B,MAAM;QACJ,MAAM,CASlB;IAED;;;;;;;;;OASG;IACH;kBAFyB,WAAW;iBAAW,WAAW;mBAAa,WAAW;uBAAiB,MAAM;MAyCxG;IAED;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAIlB;CACJ"}
|
|
@@ -57,7 +57,13 @@ export class EmitterRegistry {
|
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* Pack all emitters + their programs into upload-ready buffers.
|
|
60
|
-
*
|
|
60
|
+
*
|
|
61
|
+
* `program_count` is the number of DISTINCT programs across the emitter set — the bucket count
|
|
62
|
+
* the simulation-order coherence pass histograms into. It is CPU-known and low-churn (it only
|
|
63
|
+
* changes when the emitter set does), which is why that pass can size its histogram, its cursor
|
|
64
|
+
* and its padding dispatch on the host without any of the per-frame counts ever leaving the GPU.
|
|
65
|
+
*
|
|
66
|
+
* @returns {{ emitters: Uint32Array, program: Uint32Array, constants: Uint32Array, program_count: number }}
|
|
61
67
|
*/
|
|
62
68
|
build() {
|
|
63
69
|
const arena = new ProgramArena();
|
|
@@ -96,6 +102,7 @@ export class EmitterRegistry {
|
|
|
96
102
|
emitters,
|
|
97
103
|
program: arena.build_instruction_buffer(),
|
|
98
104
|
constants: arena.build_constant_buffer(),
|
|
105
|
+
program_count: Math.max(1, arena.program_count),
|
|
99
106
|
};
|
|
100
107
|
}
|
|
101
108
|
|
|
@@ -15,10 +15,29 @@ export class ProgramArena {
|
|
|
15
15
|
instruction_count: number;
|
|
16
16
|
/** @type {number} running vec4 constant index */
|
|
17
17
|
constant_count: number;
|
|
18
|
+
/** @type {Map<string, object>} content key -> the placement the first identical program got */
|
|
19
|
+
programs: Map<string, object>;
|
|
18
20
|
/**
|
|
19
|
-
*
|
|
21
|
+
* Number of distinct programs in the arena — and therefore the number of buckets the
|
|
22
|
+
* simulation-order pass histograms into. Program ids are dense in `[0, program_count)`.
|
|
23
|
+
* @returns {number}
|
|
24
|
+
*/
|
|
25
|
+
get program_count(): number;
|
|
26
|
+
/**
|
|
27
|
+
* Append a program, or hand back the placement an identical one already has.
|
|
28
|
+
*
|
|
29
|
+
* Deduplication is by CONTENT, not object identity: two emitters that authored the same graph
|
|
30
|
+
* separately compile to distinct {@link ParticleProgram} objects holding the same bytecode, and
|
|
31
|
+
* they should still land in one simulation bucket. Emitters are few and long-lived, so hashing
|
|
32
|
+
* the words is not a cost worth avoiding.
|
|
33
|
+
*
|
|
34
|
+
* The `program_id` it returns is what the emitter record carries and what the coherence pass
|
|
35
|
+
* buckets on. Keying on the emitter index instead would be simpler but strictly worse: N
|
|
36
|
+
* emitters running one shared effect would become N buckets, each padded to a whole workgroup,
|
|
37
|
+
* which both wastes lanes and splits a run that was already program-coherent.
|
|
38
|
+
*
|
|
20
39
|
* @param {import("../isa/ParticleProgram.js").ParticleProgram} program
|
|
21
|
-
* @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number}}
|
|
40
|
+
* @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
|
|
22
41
|
*/
|
|
23
42
|
add(program: import("../isa/ParticleProgram.js").ParticleProgram): {
|
|
24
43
|
spawn_offset: number;
|
|
@@ -26,6 +45,7 @@ export class ProgramArena {
|
|
|
26
45
|
update_offset: number;
|
|
27
46
|
update_count: number;
|
|
28
47
|
constant_offset: number;
|
|
48
|
+
program_id: number;
|
|
29
49
|
};
|
|
30
50
|
/** @returns {Uint32Array} the packed instruction buffer (at least length 1) */
|
|
31
51
|
build_instruction_buffer(): Uint32Array;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgramArena.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ProgramArena.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH;IAEQ,8CAA8C;IAC9C,mBADW,MAAM,EAAE,CACQ;IAC3B,8DAA8D;IAC9D,gBADW,MAAM,EAAE,CACK;IACxB,yFAAyF;IACzF,mBADW,MAAM,CACS;IAC1B,iDAAiD;IACjD,gBADW,MAAM,CACM;
|
|
1
|
+
{"version":3,"file":"ProgramArena.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ProgramArena.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH;IAEQ,8CAA8C;IAC9C,mBADW,MAAM,EAAE,CACQ;IAC3B,8DAA8D;IAC9D,gBADW,MAAM,EAAE,CACK;IACxB,yFAAyF;IACzF,mBADW,MAAM,CACS;IAC1B,iDAAiD;IACjD,gBADW,MAAM,CACM;IACvB,+FAA+F;IAC/F,UADW,IAAI,MAAM,EAAE,MAAM,CAAC,CACL;IAG7B;;;;OAIG;IACH,4BAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH,aAHW,OAAO,2BAA2B,EAAE,eAAe;sBAClC,MAAM;qBAAe,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;yBAAmB,MAAM;oBAAc,MAAM;MAgChJ;IAUD,+EAA+E;IAC/E,4BADc,WAAW,CAGxB;IAED,yFAAyF;IACzF,yBADc,WAAW,CAGxB;;CACJ"}
|
|
@@ -18,14 +18,43 @@ export class ProgramArena {
|
|
|
18
18
|
this.instruction_count = 0;
|
|
19
19
|
/** @type {number} running vec4 constant index */
|
|
20
20
|
this.constant_count = 0;
|
|
21
|
+
/** @type {Map<string, object>} content key -> the placement the first identical program got */
|
|
22
|
+
this.programs = new Map();
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
/**
|
|
24
|
-
*
|
|
26
|
+
* Number of distinct programs in the arena — and therefore the number of buckets the
|
|
27
|
+
* simulation-order pass histograms into. Program ids are dense in `[0, program_count)`.
|
|
28
|
+
* @returns {number}
|
|
29
|
+
*/
|
|
30
|
+
get program_count() {
|
|
31
|
+
return this.programs.size;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Append a program, or hand back the placement an identical one already has.
|
|
36
|
+
*
|
|
37
|
+
* Deduplication is by CONTENT, not object identity: two emitters that authored the same graph
|
|
38
|
+
* separately compile to distinct {@link ParticleProgram} objects holding the same bytecode, and
|
|
39
|
+
* they should still land in one simulation bucket. Emitters are few and long-lived, so hashing
|
|
40
|
+
* the words is not a cost worth avoiding.
|
|
41
|
+
*
|
|
42
|
+
* The `program_id` it returns is what the emitter record carries and what the coherence pass
|
|
43
|
+
* buckets on. Keying on the emitter index instead would be simpler but strictly worse: N
|
|
44
|
+
* emitters running one shared effect would become N buckets, each padded to a whole workgroup,
|
|
45
|
+
* which both wastes lanes and splits a run that was already program-coherent.
|
|
46
|
+
*
|
|
25
47
|
* @param {import("../isa/ParticleProgram.js").ParticleProgram} program
|
|
26
|
-
* @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number}}
|
|
48
|
+
* @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
|
|
27
49
|
*/
|
|
28
50
|
add(program) {
|
|
51
|
+
const key = program_content_key(program);
|
|
52
|
+
|
|
53
|
+
const existing = this.programs.get(key);
|
|
54
|
+
if (existing !== undefined) {
|
|
55
|
+
return existing;
|
|
56
|
+
}
|
|
57
|
+
|
|
29
58
|
const spawn_offset = this.instruction_count;
|
|
30
59
|
this.#append_instructions(program.spawn);
|
|
31
60
|
const spawn_count = program.spawn_instruction_count;
|
|
@@ -41,7 +70,13 @@ export class ProgramArena {
|
|
|
41
70
|
}
|
|
42
71
|
this.constant_count += program.constant_count;
|
|
43
72
|
|
|
44
|
-
|
|
73
|
+
const placement = {
|
|
74
|
+
spawn_offset, spawn_count, update_offset, update_count, constant_offset,
|
|
75
|
+
program_id: this.programs.size,
|
|
76
|
+
};
|
|
77
|
+
this.programs.set(key, placement);
|
|
78
|
+
|
|
79
|
+
return placement;
|
|
45
80
|
}
|
|
46
81
|
|
|
47
82
|
/** @param {Uint32Array} words */
|
|
@@ -62,3 +97,19 @@ export class ProgramArena {
|
|
|
62
97
|
return new Uint32Array(this.constant_words.length > 0 ? this.constant_words : [0, 0, 0, 0]);
|
|
63
98
|
}
|
|
64
99
|
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* A key that is equal exactly when two programs would execute identically.
|
|
103
|
+
*
|
|
104
|
+
* Constants are keyed by their `u32` bit patterns rather than their float values, so `-0` and `0`
|
|
105
|
+
* — which stringify the same but differ in the buffer the shader reads — stay distinct.
|
|
106
|
+
*
|
|
107
|
+
* @param {import("../isa/ParticleProgram.js").ParticleProgram} program
|
|
108
|
+
* @returns {string}
|
|
109
|
+
*/
|
|
110
|
+
function program_content_key(program) {
|
|
111
|
+
const constants = program.constants;
|
|
112
|
+
const constant_u32 = new Uint32Array(constants.buffer, constants.byteOffset, constants.length);
|
|
113
|
+
|
|
114
|
+
return `${program.register_count}|${program.spawn.join(",")}|${program.update.join(",")}|${constant_u32.join(",")}`;
|
|
115
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_particle_finalize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_finalize.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_particle_finalize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_finalize.js"],"names":[],"mappings":"AAoCA,2DAaG;AAaH,2DAmCG;;8BA/F2B,+BAA+B;iDAIZ,+BAA+B"}
|
|
@@ -9,16 +9,24 @@ import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./shader_particle_simulate.js"
|
|
|
9
9
|
/**
|
|
10
10
|
* Small housekeeping passes that keep the pipeline GPU-driven:
|
|
11
11
|
*
|
|
12
|
-
* - {@link shader_particle_reset_counters} — zero the alive / spawn / sorted
|
|
13
|
-
* the frame (the dead count and the ALIVE_IN snapshot persist across frames).
|
|
14
|
-
* - {@link shader_particle_build_indirect} —
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* args
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
12
|
+
* - {@link shader_particle_reset_counters} — zero the alive / spawn / sorted / sim-padded counters
|
|
13
|
+
* at the top of the frame (the dead count and the ALIVE_IN snapshot persist across frames).
|
|
14
|
+
* - {@link shader_particle_build_indirect} — turn the frame's two final counts into next frame's
|
|
15
|
+
* input contract: (a) snapshot the coherence pass's padded list length into
|
|
16
|
+
* {@link PARTICLE_COUNTER.ALIVE_IN} — the exact input length for NEXT frame's simulate, (b) write
|
|
17
|
+
* the indirect dispatch args next frame's simulate consumes, from that SAME value, and (c) write
|
|
18
|
+
* the indirect draw args for THIS frame's billboard render, from the alive count. Nothing
|
|
19
|
+
* round-trips to the CPU. Sizing the dispatch or draw from a stale CPU readback instead is a
|
|
20
|
+
* correctness bug: when the alive count grows the tail of the list is never simulated (slots leak
|
|
21
|
+
* into limbo), and when it shrinks stale entries beyond the written range get re-simulated — a
|
|
22
|
+
* dead slot is pushed to the free list twice and later popped twice, leaving two live particles
|
|
23
|
+
* sharing one record.
|
|
24
|
+
*
|
|
25
|
+
* The two lengths are deliberately different quantities and must not be conflated. Simulate consumes
|
|
26
|
+
* the SIMULATION order: the program-coherent list from `../coherence/`, padded so no wave spans two
|
|
27
|
+
* VM programs, and therefore longer than the alive count and always a whole number of workgroups.
|
|
28
|
+
* The billboard draw consumes the RENDER order: one instance per live particle, unpadded — a
|
|
29
|
+
* padding entry drawn as an instance would read a garbage record.
|
|
22
30
|
*/
|
|
23
31
|
|
|
24
32
|
// --- reset ---
|
|
@@ -36,6 +44,7 @@ fn main() {
|
|
|
36
44
|
atomicStore(&counters[${PARTICLE_COUNTER.ALIVE}u], 0u);
|
|
37
45
|
atomicStore(&counters[${PARTICLE_COUNTER.SPAWN}u], 0u);
|
|
38
46
|
atomicStore(&counters[${PARTICLE_COUNTER.SORTED}u], 0u);
|
|
47
|
+
atomicStore(&counters[${PARTICLE_COUNTER.SIM_PADDED}u], 0u);
|
|
39
48
|
}
|
|
40
49
|
`),
|
|
41
50
|
});
|
|
@@ -61,16 +70,25 @@ export const shader_particle_build_indirect = ComputeShader.from({
|
|
|
61
70
|
fn main() {
|
|
62
71
|
let alive = atomicLoad(&counters[${PARTICLE_COUNTER.ALIVE}u]);
|
|
63
72
|
|
|
64
|
-
//
|
|
65
|
-
|
|
73
|
+
// The length of the padded, program-coherent list the coherence pass just built — NOT the alive
|
|
74
|
+
// count. Padding makes it longer, and a whole number of workgroups.
|
|
75
|
+
let sim_length = atomicLoad(&counters[${PARTICLE_COUNTER.SIM_PADDED}u]);
|
|
76
|
+
|
|
77
|
+
// Snapshot: that list is next frame's simulate input, and this is its exact length.
|
|
78
|
+
atomicStore(&counters[${PARTICLE_COUNTER.ALIVE_IN}u], sim_length);
|
|
66
79
|
|
|
67
|
-
// Simulate dispatch (consumed NEXT frame): one thread per
|
|
68
|
-
|
|
80
|
+
// Simulate dispatch (consumed NEXT frame): one thread per entry of that same list. Derived from
|
|
81
|
+
// the same value as the bound above, so thread count and bound agree by construction — and
|
|
82
|
+
// because a padded length is a whole number of workgroups, they agree exactly: every thread the
|
|
83
|
+
// dispatch launches has an entry, real or sentinel.
|
|
84
|
+
let groups = (sim_length + u_workgroup_size - 1u) / max(u_workgroup_size, 1u);
|
|
69
85
|
dispatch_args[0] = groups;
|
|
70
86
|
dispatch_args[1] = 1u;
|
|
71
87
|
dispatch_args[2] = 1u;
|
|
72
88
|
|
|
73
89
|
// Instanced billboard draw (consumed THIS frame): 6 verts per particle, one instance per alive.
|
|
90
|
+
// The render list is the unpadded one — an instance per padding entry would read a garbage
|
|
91
|
+
// record.
|
|
74
92
|
draw_args[0] = 6u;
|
|
75
93
|
draw_args[1] = alive;
|
|
76
94
|
draw_args[2] = 0u;
|
|
@@ -1,26 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
* The particle simulate pass — Destiny-style single execution shader.
|
|
3
|
-
*
|
|
4
|
-
* One dispatch processes the entire alive list across every emitter. Per particle: read its owning
|
|
5
|
-
* emitter, set up the VM context + RNG, run that emitter's compiled UPDATE program over the record,
|
|
6
|
-
* then compact — killed particles are pushed back to the dead (free) list, survivors are appended to
|
|
7
|
-
* the new alive list. There is exactly one pipeline regardless of how many distinct effects exist,
|
|
8
|
-
* because behaviour is data (the bytecode program), not code.
|
|
9
|
-
*
|
|
10
|
-
* The input length is read from `counters[ALIVE_IN]` — the previous frame's final alive count,
|
|
11
|
-
* snapshotted on the GPU by the build-indirect pass — NOT from a CPU uniform. A CPU-provided count
|
|
12
|
-
* is inevitably stale (readback latency) and corrupts the pool: under-counting orphans the tail of
|
|
13
|
-
* the alive list (slots leak into limbo), over-counting re-simulates stale entries and double-frees
|
|
14
|
-
* their slots. Dispatch this shader with `dispatchWorkgroupsIndirect` using the args the
|
|
15
|
-
* build-indirect pass wrote last frame, so thread count and bound agree by construction.
|
|
16
|
-
*
|
|
17
|
-
* All structured reads go through `array<u32>` for emulator-testability. Curve sampling uses the
|
|
18
|
-
* pluggable `particle_vm_sample_curve` — here the no-op provider; the feature swaps in the
|
|
19
|
-
* animation-database-backed one.
|
|
20
|
-
*
|
|
21
|
-
* @type {ComputeShader}
|
|
22
|
-
*/
|
|
23
|
-
export const PARTICLE_SIMULATE_WORKGROUP_SIZE: ComputeShader;
|
|
1
|
+
export { PARTICLE_SIMULATE_WORKGROUP_SIZE };
|
|
24
2
|
export const shader_particle_simulate: ComputeShader;
|
|
3
|
+
import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "../ParticleConstants.js";
|
|
25
4
|
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
26
5
|
//# sourceMappingURL=shader_particle_simulate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":";AAyIA,qDAIG;iDAjII,yBAAyB;8BATF,+BAA+B"}
|
|
@@ -7,6 +7,8 @@ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourc
|
|
|
7
7
|
import {
|
|
8
8
|
PARTICLE_RECORD_HEADER_EMITTER,
|
|
9
9
|
PARTICLE_RECORD_WORD_COUNT,
|
|
10
|
+
PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
11
|
+
PARTICLE_SIM_PAD_SLOT,
|
|
10
12
|
PARTICLE_VM_INSTRUCTION_WORDS,
|
|
11
13
|
} from "../ParticleConstants.js";
|
|
12
14
|
import { PARTICLE_COUNTER } from "../data/PARTICLE_COUNTERS.js";
|
|
@@ -15,18 +17,37 @@ import { chunk_particle_context, chunk_particle_curve_disabled } from "./chunk_p
|
|
|
15
17
|
/**
|
|
16
18
|
* The particle simulate pass — Destiny-style single execution shader.
|
|
17
19
|
*
|
|
18
|
-
* One dispatch processes
|
|
20
|
+
* One dispatch processes every live particle across every emitter. Per particle: read its owning
|
|
19
21
|
* emitter, set up the VM context + RNG, run that emitter's compiled UPDATE program over the record,
|
|
20
22
|
* then compact — killed particles are pushed back to the dead (free) list, survivors are appended to
|
|
21
23
|
* the new alive list. There is exactly one pipeline regardless of how many distinct effects exist,
|
|
22
24
|
* because behaviour is data (the bytecode program), not code.
|
|
23
25
|
*
|
|
24
|
-
* The input
|
|
25
|
-
*
|
|
26
|
-
* is
|
|
27
|
-
* the
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* ## The input list
|
|
27
|
+
*
|
|
28
|
+
* `sim_list` is NOT the raw alive list. It is the program-coherent indirection list the coherence
|
|
29
|
+
* pass (`../coherence/`) built at the end of last frame: the same pool slots, reordered so that
|
|
30
|
+
* particles running one VM program sit together, each run padded out to a whole workgroup. That is
|
|
31
|
+
* what keeps a wave from spanning two programs, which would make the interpreter's opcode `switch`
|
|
32
|
+
* diverge and multiply the register file's `v_movrels` waterfall by the number of distinct register
|
|
33
|
+
* indices in the wave.
|
|
34
|
+
*
|
|
35
|
+
* Padding entries carry {@link PARTICLE_SIM_PAD_SLOT} and are dropped BEFORE the compaction
|
|
36
|
+
* atomics, so a padding lane never appends to the alive list and never pushes a slot onto the free
|
|
37
|
+
* list — pushing the sentinel would put `0xffffffff` on the free list for a later emit to hand out
|
|
38
|
+
* as a record base. Returning early is safe for the lanes that remain: padding only ever appears in
|
|
39
|
+
* the tail of a bucket, and every real lane in that wave belongs to that one bucket, so the `switch`
|
|
40
|
+
* the survivors execute is uniform regardless.
|
|
41
|
+
*
|
|
42
|
+
* ## Sizing
|
|
43
|
+
*
|
|
44
|
+
* The input length is read from `counters[ALIVE_IN]` — the padded length of that list, snapshotted
|
|
45
|
+
* on the GPU by the build-indirect pass — NOT from a CPU uniform. A CPU-provided count is inevitably
|
|
46
|
+
* stale (readback latency) and corrupts the pool: under-counting orphans the tail of the list (slots
|
|
47
|
+
* leak into limbo), over-counting re-simulates stale entries and double-frees their slots. Dispatch
|
|
48
|
+
* this shader with `dispatchWorkgroupsIndirect` using the args the build-indirect pass wrote last
|
|
49
|
+
* frame from that same value, so thread count and bound agree by construction — and, because the
|
|
50
|
+
* padded length is a whole number of workgroups, agree exactly.
|
|
30
51
|
*
|
|
31
52
|
* All structured reads go through `array<u32>` for emulator-testability. Curve sampling uses the
|
|
32
53
|
* pluggable `particle_vm_sample_curve` — here the no-op provider; the feature swaps in the
|
|
@@ -35,7 +56,7 @@ import { chunk_particle_context, chunk_particle_curve_disabled } from "./chunk_p
|
|
|
35
56
|
* @type {ComputeShader}
|
|
36
57
|
*/
|
|
37
58
|
|
|
38
|
-
export
|
|
59
|
+
export { PARTICLE_SIMULATE_WORKGROUP_SIZE };
|
|
39
60
|
|
|
40
61
|
/**
|
|
41
62
|
* Per-dispatch, 12 bytes, read-only — see shader_particle_emit for why the three travel
|
|
@@ -58,7 +79,7 @@ resources.createGroup()
|
|
|
58
79
|
.addStorageBuffer("program", WebGPUArray.u32, false)
|
|
59
80
|
.addStorageBuffer("vm_constants", WebGPUArray.u32, false)
|
|
60
81
|
.addStorageBuffer("pool", WebGPUArray.u32, true)
|
|
61
|
-
.addStorageBuffer("
|
|
82
|
+
.addStorageBuffer("sim_list", WebGPUArray.u32, false)
|
|
62
83
|
.addStorageBuffer("alive_out", WebGPUArray.u32, true)
|
|
63
84
|
.addStorageBuffer("dead", WebGPUArray.u32, true)
|
|
64
85
|
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
@@ -71,14 +92,22 @@ const PARTICLE_INSTRUCTION_WORDS : u32 = ${PARTICLE_VM_INSTRUCTION_WORDS}u;
|
|
|
71
92
|
const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
|
|
72
93
|
const COUNTER_DEAD : u32 = ${PARTICLE_COUNTER.DEAD}u;
|
|
73
94
|
const COUNTER_ALIVE_IN : u32 = ${PARTICLE_COUNTER.ALIVE_IN}u;
|
|
95
|
+
const PARTICLE_SIM_PAD_SLOT : u32 = ${PARTICLE_SIM_PAD_SLOT}u;
|
|
74
96
|
|
|
75
97
|
@compute @workgroup_size(${PARTICLE_SIMULATE_WORKGROUP_SIZE}, 1, 1)
|
|
76
98
|
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
77
99
|
let i = gid.x;
|
|
78
|
-
// The exact
|
|
100
|
+
// The exact input length, snapshotted on-GPU last frame — never a stale CPU value.
|
|
79
101
|
if (i >= atomicLoad(&counters[COUNTER_ALIVE_IN])) { return; }
|
|
80
102
|
|
|
81
|
-
let slot =
|
|
103
|
+
let slot = sim_list[i];
|
|
104
|
+
|
|
105
|
+
// A lane the coherence pass padded the bucket out with. Leave BEFORE the compaction atomics
|
|
106
|
+
// below: appending here would put the sentinel on the alive or the free list, and the free list
|
|
107
|
+
// would then hand 0xffffffff to an emit as a record base. The lanes that stay all belong to the
|
|
108
|
+
// one bucket this wave covers, so their program — and the interpreter's switch — is uniform.
|
|
109
|
+
if (slot == PARTICLE_SIM_PAD_SLOT) { return; }
|
|
110
|
+
|
|
82
111
|
let record_base = slot * PARTICLE_RECORD_WORDS;
|
|
83
112
|
let emitter_index = pool[record_base + PARTICLE_HEADER_EMITTER];
|
|
84
113
|
|
|
@@ -1,23 +1,12 @@
|
|
|
1
|
+
export const PARTICLE_SORT_WORKGROUP_SIZE: 64;
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the scatter cursor. Without this the scan consumes garbage counts and the scatter compounds
|
|
7
|
-
* last frame's ranks — the buffers are only zeroed by WebGPU on CREATION, not per frame.
|
|
8
|
-
* 1. {@link shader_particle_sort_histogram} — per alive particle, project its render position into
|
|
9
|
-
* view space, quantise the depth into a back-to-front bucket (far first), store the bucket in
|
|
10
|
-
* `keys`, and atomically bump the per-bucket `histogram`.
|
|
11
|
-
* 2. graph_prefix_scan_csdldf turns the histogram into inclusive prefix sums.
|
|
12
|
-
* 3. {@link shader_particle_sort_scatter} — per particle, read its bucket, take the exclusive
|
|
13
|
-
* offset from the scanned histogram and an atomic per-bucket rank, and write the particle's slot
|
|
14
|
-
* into `sorted` at that position.
|
|
3
|
+
* Dispatch this over `PREFIX_SCAN_CSDLDF_HEADER_WORDS + round_up_4(bucket_count)` threads, not over
|
|
4
|
+
* `bucket_count`: its widest loop is the scan header plus the bins rounded up to the whole vec4 the
|
|
5
|
+
* last bin lands in. Under-dispatching leaves the tail of that vec4 holding last frame's counts,
|
|
6
|
+
* and the scan adds them in.
|
|
15
7
|
*
|
|
16
|
-
*
|
|
17
|
-
* and scatter passes are, and the CPU reference {@link ./particle_counting_sort.js} pins the
|
|
18
|
-
* algorithm.
|
|
8
|
+
* @type {ComputeShader}
|
|
19
9
|
*/
|
|
20
|
-
export const PARTICLE_SORT_WORKGROUP_SIZE: 64;
|
|
21
10
|
export const shader_particle_sort_reset: ComputeShader;
|
|
22
11
|
export const shader_particle_sort_histogram: ComputeShader;
|
|
23
12
|
export const shader_particle_sort_scatter: ComputeShader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_particle_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/sort/shader_particle_sort.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_particle_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/sort/shader_particle_sort.js"],"names":[],"mappings":"AAsDA,8CAA+C;AAgD/C;;;;;;;GAOG;AACH,yCAFU,aAAa,CAMpB;AA0EH,2DAIG;AAyCH,yDAIG;8BA1O2B,+BAA+B"}
|