@woosh/meep-engine 3.14.4 → 3.14.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/editor/Editor.d.ts +162 -0
- package/editor/Editor.d.ts.map +1 -0
- package/editor/EditorCameraNavigation.d.ts +22 -0
- package/editor/EditorCameraNavigation.d.ts.map +1 -0
- package/editor/EditorKeyMap.d.ts +28 -0
- package/editor/EditorKeyMap.d.ts.map +1 -0
- package/editor/SelectionVisualizer.d.ts +37 -0
- package/editor/SelectionVisualizer.d.ts.map +1 -0
- package/editor/actions/concrete/ActionInvalidateSampler.d.ts +18 -0
- package/editor/actions/concrete/ActionInvalidateSampler.d.ts.map +1 -0
- package/editor/actions/concrete/ActionUpdateTexture.d.ts +12 -0
- package/editor/actions/concrete/ActionUpdateTexture.d.ts.map +1 -0
- package/editor/actions/concrete/ActionUpdateTexture.js +1 -1
- package/editor/actions/concrete/ArrayCopyAction.d.ts +20 -0
- package/editor/actions/concrete/ArrayCopyAction.d.ts.map +1 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts +15 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts +11 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts +18 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts +11 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts +47 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts.map +1 -0
- package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts +38 -0
- package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts.map +1 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts +23 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts.map +1 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +32 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionAddAction.d.ts +19 -0
- package/editor/actions/concrete/SelectionAddAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionClearAction.d.ts +9 -0
- package/editor/actions/concrete/SelectionClearAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionRemoveAction.d.ts +10 -0
- package/editor/actions/concrete/SelectionRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts +17 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -0
- package/editor/actions/concrete/WriteGridValueAction.d.ts +14 -0
- package/editor/actions/concrete/WriteGridValueAction.d.ts.map +1 -0
- package/editor/camera/camera_framing.d.ts +33 -0
- package/editor/camera/camera_framing.d.ts.map +1 -0
- package/editor/clipboard.d.ts +19 -0
- package/editor/clipboard.d.ts.map +1 -0
- package/editor/ecs/EditorEntity.d.ts +16 -0
- package/editor/ecs/EditorEntity.d.ts.map +1 -0
- package/editor/ecs/EditorEntitySystem.d.ts +8 -0
- package/editor/ecs/EditorEntitySystem.d.ts.map +1 -0
- package/editor/ecs/component/TypeEditor.d.ts +7 -1
- package/editor/ecs/component/TypeEditor.d.ts.map +1 -1
- package/editor/ecs/component/TypeEditor.js +5 -0
- package/editor/ecs/component/editors/ColorEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ColorEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/HTMLElementEditor.d.ts +7 -0
- package/editor/ecs/component/editors/HTMLElementEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ImagePathEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ImagePathEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/LargeStringEditor.d.ts +16 -0
- package/editor/ecs/component/editors/LargeStringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.d.ts +7 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedStringEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedStringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/Sampler2DEditor.d.ts +7 -0
- package/editor/ecs/component/editors/Sampler2DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/collection/ListEditor.d.ts +8 -0
- package/editor/ecs/component/editors/collection/ListEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts +12 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/EnumEditor.d.ts +8 -0
- package/editor/ecs/component/editors/common/EnumEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/makeV3_editor.d.ts +15 -0
- package/editor/ecs/component/editors/common/makeV3_editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/noEditor.d.ts +3 -0
- package/editor/ecs/component/editors/common/noEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/two_way_sync.d.ts +22 -0
- package/editor/ecs/component/editors/common/two_way_sync.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts +14 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts +12 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts +14 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts +52 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts +47 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts +21 -0
- package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts +26 -0
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts +16 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts +15 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +42 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts +8 -0
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts +19 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts +27 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts +16 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts +19 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts +18 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.d.ts +7 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts +8 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.d.ts +8 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/StringEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/StringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts +28 -0
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts +29 -0
- package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts +28 -0
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts +41 -0
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts +31 -0
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts.map +1 -0
- package/editor/ecs/component/prototypeObjectEditor.d.ts +2 -0
- package/editor/ecs/component/prototypeObjectEditor.d.ts.map +1 -0
- package/editor/ecs/component/registerBasicTypeEditors.d.ts +11 -0
- package/editor/ecs/component/registerBasicTypeEditors.d.ts.map +1 -0
- package/editor/ecs/component/registerEngineComponentEditors.d.ts +8 -0
- package/editor/ecs/component/registerEngineComponentEditors.d.ts.map +1 -0
- package/editor/enableEditor.d.ts +14 -0
- package/editor/enableEditor.d.ts.map +1 -0
- package/editor/entity_world_bounds.d.ts +17 -0
- package/editor/entity_world_bounds.d.ts.map +1 -0
- package/editor/library/MeshLibrary.d.ts +13 -0
- package/editor/library/MeshLibrary.d.ts.map +1 -0
- package/editor/particles/lut_ops.d.ts +34 -0
- package/editor/particles/lut_ops.d.ts.map +1 -0
- package/editor/particles/particleEditEvents.d.ts +11 -0
- package/editor/particles/particleEditEvents.d.ts.map +1 -0
- package/editor/particles/rebuildParticleEmitter.d.ts +11 -0
- package/editor/particles/rebuildParticleEmitter.d.ts.map +1 -0
- package/editor/persistence/EditorLayoutStore.d.ts +30 -0
- package/editor/persistence/EditorLayoutStore.d.ts.map +1 -0
- package/editor/persistence/SceneMetadata.d.ts +38 -0
- package/editor/persistence/SceneMetadata.d.ts.map +1 -0
- package/editor/persistence/SceneSlotManager.d.ts +40 -0
- package/editor/persistence/SceneSlotManager.d.ts.map +1 -0
- package/editor/persistence/buildNewSceneDataset.d.ts +10 -0
- package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -0
- package/editor/persistence/files.d.ts +24 -0
- package/editor/persistence/files.d.ts.map +1 -0
- package/editor/persistence/scene_import.d.ts +45 -0
- package/editor/persistence/scene_import.d.ts.map +1 -0
- package/editor/persistence/scene_serialization.d.ts +36 -0
- package/editor/persistence/scene_serialization.d.ts.map +1 -0
- package/editor/persistence/string_buffer_codec.d.ts +20 -0
- package/editor/persistence/string_buffer_codec.d.ts.map +1 -0
- package/editor/process/DisableGameUIProcess.d.ts +8 -0
- package/editor/process/DisableGameUIProcess.d.ts.map +1 -0
- package/editor/process/EditorProcess.d.ts +19 -0
- package/editor/process/EditorProcess.d.ts.map +1 -0
- package/editor/process/GridDisplayProcess.d.ts +35 -0
- package/editor/process/GridDisplayProcess.d.ts.map +1 -0
- package/editor/process/ObstacleGridDisplayProcess.d.ts +13 -0
- package/editor/process/ObstacleGridDisplayProcess.d.ts.map +1 -0
- package/editor/process/ParticleEmitterRebuildProcess.d.ts +66 -0
- package/editor/process/ParticleEmitterRebuildProcess.d.ts.map +1 -0
- package/editor/process/ProcessEngine.d.ts +30 -0
- package/editor/process/ProcessEngine.d.ts.map +1 -0
- package/editor/process/SymbolicDisplayProcess.d.ts +23 -0
- package/editor/process/SymbolicDisplayProcess.d.ts.map +1 -0
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts +17 -0
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/CameraSymbolicDisplay.d.ts +25 -0
- package/editor/process/symbolic/CameraSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts +19 -0
- package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/LightSymbolicDisplay.d.ts +19 -0
- package/editor/process/symbolic/LightSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts +18 -0
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/PathSymbolicDisplay.d.ts +20 -0
- package/editor/process/symbolic/PathSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts +25 -0
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/SymbolicDisplay.d.ts +48 -0
- package/editor/process/symbolic/SymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts +13 -0
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts.map +1 -0
- package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts +18 -0
- package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts.map +1 -0
- package/editor/prototypeEditorShell.d.ts +13 -0
- package/editor/prototypeEditorShell.d.ts.map +1 -0
- package/editor/selection/editor_pick.d.ts +43 -0
- package/editor/selection/editor_pick.d.ts.map +1 -0
- package/editor/selection/screen_rect_frustum.d.ts +32 -0
- package/editor/selection/screen_rect_frustum.d.ts.map +1 -0
- package/editor/templates/entity_templates.d.ts +19 -0
- package/editor/templates/entity_templates.d.ts.map +1 -0
- package/editor/tools/GridPaintTool.d.ts +18 -0
- package/editor/tools/GridPaintTool.d.ts.map +1 -0
- package/editor/tools/SelectionTool.d.ts +38 -0
- package/editor/tools/SelectionTool.d.ts.map +1 -0
- package/editor/tools/SelectionTool.js +2 -2
- package/editor/tools/TransformToolV2.d.ts +70 -0
- package/editor/tools/TransformToolV2.d.ts.map +1 -0
- package/editor/tools/engine/Tool.d.ts +88 -0
- package/editor/tools/engine/Tool.d.ts.map +1 -0
- package/editor/tools/engine/ToolEngine.d.ts +22 -0
- package/editor/tools/engine/ToolEngine.d.ts.map +1 -0
- package/editor/tools/engine/ToolState.d.ts +7 -0
- package/editor/tools/engine/ToolState.d.ts.map +1 -0
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts +18 -0
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -0
- package/editor/tools/paint/TerrainPaintTool.d.ts +82 -0
- package/editor/tools/paint/TerrainPaintTool.d.ts.map +1 -0
- package/editor/tools/paint/TerrainTexturePaintTool.d.ts +19 -0
- package/editor/tools/paint/TerrainTexturePaintTool.d.ts.map +1 -0
- package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts +139 -0
- package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts.map +1 -0
- package/editor/tools/v2/GizmoNode.d.ts +21 -0
- package/editor/tools/v2/GizmoNode.d.ts.map +1 -0
- package/editor/tools/v2/TransformControls.d.ts +219 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -0
- package/editor/tools/v2/TransformMode.d.ts +7 -0
- package/editor/tools/v2/TransformMode.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts +37 -0
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_draw.d.ts +14 -0
- package/editor/tools/v2/handle/gizmo_draw.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_handles.d.ts +160 -0
- package/editor/tools/v2/handle/gizmo_handles.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts +103 -0
- package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts.map +1 -0
- package/editor/view/GridPickCoordinateView.d.ts +22 -0
- package/editor/view/GridPickCoordinateView.d.ts.map +1 -0
- package/editor/view/ecs/ComponentControlView.d.ts +24 -0
- package/editor/view/ecs/ComponentControlView.d.ts.map +1 -0
- package/editor/view/ecs/EntityEditor.d.ts +25 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -0
- package/editor/view/ecs/EntityList.d.ts +22 -0
- package/editor/view/ecs/EntityList.d.ts.map +1 -0
- package/editor/view/ecs/HierarchicalEntityListView.d.ts +25 -0
- package/editor/view/ecs/HierarchicalEntityListView.d.ts.map +1 -0
- package/editor/view/ecs/components/DatGuiController.d.ts +2 -0
- package/editor/view/ecs/components/DatGuiController.d.ts.map +1 -0
- package/editor/view/ecs/components/color/GaugeView.d.ts +9 -5
- package/editor/view/ecs/components/color/GaugeView.d.ts.map +1 -1
- package/editor/view/ecs/components/color/GaugeView.js +4 -4
- package/editor/view/ecs/components/common/NumberController.d.ts +9 -5
- package/editor/view/ecs/components/common/NumberController.d.ts.map +1 -1
- package/editor/view/ecs/components/common/NumberController.js +4 -4
- package/editor/view/ecs/components/common/NumericIntervalController.d.ts +10 -0
- package/editor/view/ecs/components/common/NumericIntervalController.d.ts.map +1 -0
- package/editor/view/ecs/components/common/TextController.d.ts.map +1 -1
- package/editor/view/library/MeshLibraryView.d.ts +16 -0
- package/editor/view/library/MeshLibraryView.d.ts.map +1 -0
- package/editor/view/library/mesh_library_drag.d.ts +21 -0
- package/editor/view/library/mesh_library_drag.d.ts.map +1 -0
- package/editor/view/library/model_thumbnail_source.d.ts +12 -0
- package/editor/view/library/model_thumbnail_source.d.ts.map +1 -0
- package/editor/view/makeEntityDecorators.d.ts +6 -0
- package/editor/view/makeEntityDecorators.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphCamera.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphSelection.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeView.d.ts.map +1 -1
- package/editor/view/node-graph/PortView.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionCreateAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeParameterSetAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodesMoveAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/SelectionSetAction.d.ts.map +1 -1
- package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
- package/editor/view/particles/ColorLutGradientView.d.ts +19 -0
- package/editor/view/particles/ColorLutGradientView.d.ts.map +1 -0
- package/editor/view/particles/ScalarLutCurveView.d.ts +19 -0
- package/editor/view/particles/ScalarLutCurveView.d.ts.map +1 -0
- package/editor/view/prepareMeshLibrary.d.ts +7 -0
- package/editor/view/prepareMeshLibrary.d.ts.map +1 -0
- package/editor/view/process/ProcessView.d.ts +14 -0
- package/editor/view/process/ProcessView.d.ts.map +1 -0
- package/editor/view/shell/EditorShellView.d.ts +18 -0
- package/editor/view/shell/EditorShellView.d.ts.map +1 -0
- package/editor/view/shell/SceneTreePanelView.d.ts +17 -0
- package/editor/view/shell/SceneTreePanelView.d.ts.map +1 -0
- package/editor/view/shell/ViewportPanelView.d.ts +18 -0
- package/editor/view/shell/ViewportPanelView.d.ts.map +1 -0
- package/editor/view/tools/ToolSettingsView.d.ts +22 -0
- package/editor/view/tools/ToolSettingsView.d.ts.map +1 -0
- package/editor/view/tools/ToolView.d.ts +13 -0
- package/editor/view/tools/ToolView.d.ts.map +1 -0
- package/editor/view/v2/SplitView.d.ts +2 -0
- package/editor/view/v2/SplitView.d.ts.map +1 -0
- package/package.json +9 -11
- package/samples/engine/README.md +113 -0
- package/samples/engine/first-scene/index.html +32 -0
- package/samples/engine/first-scene/main.js +152 -0
- package/src/core/assert.d.ts +2 -2
- package/src/core/binary/BitSet.d.ts +2 -2
- package/src/core/binary/BitSet.d.ts.map +1 -1
- package/src/core/binary/BitSet.js +1 -1
- package/src/core/bvh2/bvh3/BVH.d.ts +4 -0
- package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BVH.js +4 -0
- package/src/core/bvh2/bvh3/BvhClient.d.ts +4 -0
- package/src/core/bvh2/bvh3/BvhClient.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BvhClient.js +4 -0
- package/src/core/collection/array/array_sort_quick.d.ts +1 -1
- package/src/core/collection/list/List.d.ts +7 -3
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +6 -2
- package/src/core/collection/table/RowFirstTableSpec.d.ts.map +1 -1
- package/src/core/collection/table/RowFirstTableSpec.js +0 -4
- package/src/core/color/Color.d.ts +1 -0
- package/src/core/color/Color.d.ts.map +1 -1
- package/src/core/color/Color.js +4 -0
- package/src/core/events/signal/SignalBinding.d.ts +4 -0
- package/src/core/events/signal/SignalBinding.d.ts.map +1 -1
- package/src/core/events/signal/SignalBinding.js +4 -0
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts +5 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +4 -0
- package/src/core/geom/3d/SurfacePoint3.d.ts +2 -2
- package/src/core/geom/3d/SurfacePoint3.d.ts.map +1 -1
- package/src/core/geom/3d/SurfacePoint3.js +1 -1
- package/src/core/geom/3d/aabb/AABB3.d.ts +63 -7
- package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/AABB3.js +17 -3
- package/src/core/geom/3d/mat4/m4_rigidity_defect.d.ts +30 -0
- package/src/core/geom/3d/mat4/m4_rigidity_defect.d.ts.map +1 -0
- package/src/core/geom/3d/mat4/m4_rigidity_defect.js +71 -0
- 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/NetworkPeer.d.ts +56 -8
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +263 -67
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +6 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +6 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +13 -7
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +103 -138
- package/src/engine/network/replication/Replicator.d.ts +47 -6
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +362 -107
- package/src/engine/network/sim/ActionLog.d.ts +2 -0
- package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
- package/src/engine/network/sim/ActionLog.js +2 -0
- package/src/engine/network/sim/ActionRecordCursor.d.ts +82 -0
- package/src/engine/network/sim/ActionRecordCursor.d.ts.map +1 -0
- package/src/engine/network/sim/ActionRecordCursor.js +120 -0
- package/src/engine/network/sim/RewindEngine.d.ts.map +1 -1
- package/src/engine/network/sim/RewindEngine.js +13 -29
- package/src/engine/network/sim/SimActionExecutor.d.ts +2 -3
- package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
- package/src/engine/network/sim/SimActionExecutor.js +10 -11
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/SoundEngine.d.ts +24 -0
- package/src/engine/sound/SoundEngine.d.ts.map +1 -1
- package/src/engine/sound/SoundEngine.js +29 -11
- package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
- package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
- package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
- package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
- package/src/shade/playground/particle_system/README.md +14 -3
- package/src/shade/playground/particle_system/index.html +1 -0
- package/src/shade/playground/particle_system/main.js +15 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +164 -46
- package/src/shade/playground/skinned_mesh_soup/README.md +39 -18
- package/src/shade/playground/skinned_mesh_soup/index.html +9 -6
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +16 -13
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +8 -2
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +23 -4
- package/src/shade/renderer/GraphicsContext.d.ts +1 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +4 -0
- package/src/shade/renderer/Renderer.d.ts +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +1958 -1796
- package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +357 -0
- package/src/shade/renderer/animation/skin_bind_transform.d.ts +25 -0
- package/src/shade/renderer/animation/skin_bind_transform.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_bind_transform.js +33 -0
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +67 -0
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +199 -0
- package/src/shade/renderer/animation/skin_frame_defect.d.ts +34 -0
- package/src/shade/renderer/animation/skin_frame_defect.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_frame_defect.js +132 -0
- package/src/shade/renderer/animation/skin_joint_matrix.d.ts +24 -0
- package/src/shade/renderer/animation/skin_joint_matrix.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_joint_matrix.js +46 -0
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts +70 -0
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +216 -0
- package/src/shade/renderer/animation/skin_test_fixtures.d.ts +86 -0
- package/src/shade/renderer/animation/skin_test_fixtures.d.ts.map +1 -0
- package/src/shade/renderer/animation/skin_test_fixtures.js +250 -0
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +18 -4
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +18 -4
- 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 +71 -20
- 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/ParticleNodeDescription.d.ts +43 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +44 -0
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +33 -59
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +185 -118
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +15 -10
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +205 -170
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +44 -0
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_graph_authoring.js +108 -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/particle_prototype.d.ts.map +1 -1
- package/src/shade/renderer/particles/particle_prototype.js +181 -180
- 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/runtime/create_particle_effect.d.ts +4 -4
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +19 -19
- 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/particles/vm/chunk_particle_vm.js +1 -1
- package/src/shade/renderer/scene/SkinnedMesh.d.ts +11 -0
- package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/SkinnedMesh.js +11 -0
- package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.d.ts +33 -3
- package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.js +58 -37
- 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/particles/graph/ParticleGraph.d.ts +0 -54
- package/src/shade/renderer/particles/graph/ParticleGraph.d.ts.map +0 -1
- package/src/shade/renderer/particles/graph/ParticleGraph.js +0 -99
|
@@ -3,9 +3,27 @@
|
|
|
3
3
|
* to fill an existing instance (e.g. a subclass of `MeshletGeometry`)
|
|
4
4
|
* in place; otherwise a fresh instance is created and returned.
|
|
5
5
|
*
|
|
6
|
+
* **This is synchronous, single-threaded, and it is not cheap — so at load time it belongs
|
|
7
|
+
* OFFLINE, not on the frame loop.** Measured converting one level's meshes: 3.3k triangles across
|
|
8
|
+
* 23 meshes took 53 ms, 7.5k across 30 took 74 ms, and **199k across 45 took 1,246 ms** — an
|
|
9
|
+
* unbroken second and a quarter of main thread, scaling linearly, on a level that is small.
|
|
10
|
+
* Reported from a port as GAP-008.
|
|
11
|
+
*
|
|
12
|
+
* **The offline route already exists and is the intended pipeline.**
|
|
13
|
+
* {@link MeshletGeometrySerializationAdapter} round-trips a `MeshletGeometry` to and from a
|
|
14
|
+
* `BinaryBuffer` losslessly, so an asset build can call this once, serialize the result beside the
|
|
15
|
+
* source mesh, and leave the runtime with a deserialize and an upload. Nothing about this function
|
|
16
|
+
* needs to run in a browser. If you are calling it from a level loader, that is the thing to change
|
|
17
|
+
* first — before reaching for a worker, which only moves the cost.
|
|
18
|
+
*
|
|
19
|
+
* A pooled worker-backed geometry service, with meshlet construction as one of the things it
|
|
20
|
+
* serves, is where this is going; it is not here yet, and it would not remove the reason to build
|
|
21
|
+
* offline.
|
|
22
|
+
*
|
|
6
23
|
* @param {Geometry} geometry
|
|
7
24
|
* @param {MeshletGeometry} [out]
|
|
8
25
|
* @returns {MeshletGeometry}
|
|
26
|
+
* @see MeshletGeometrySerializationAdapter for the offline format
|
|
9
27
|
*/
|
|
10
28
|
export function meshlet_geometry_build_from_geometry(geometry: Geometry, out?: MeshletGeometry): MeshletGeometry;
|
|
11
29
|
import { MeshletGeometry } from "./MeshletGeometry.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshlet_geometry_build_from_geometry.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"meshlet_geometry_build_from_geometry.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,+EAJW,eAAe,GACb,eAAe,CAqC3B;gCA/D+B,sBAAsB"}
|
|
@@ -7,9 +7,27 @@ import { MeshletGeometry } from "./MeshletGeometry.js";
|
|
|
7
7
|
* to fill an existing instance (e.g. a subclass of `MeshletGeometry`)
|
|
8
8
|
* in place; otherwise a fresh instance is created and returned.
|
|
9
9
|
*
|
|
10
|
+
* **This is synchronous, single-threaded, and it is not cheap — so at load time it belongs
|
|
11
|
+
* OFFLINE, not on the frame loop.** Measured converting one level's meshes: 3.3k triangles across
|
|
12
|
+
* 23 meshes took 53 ms, 7.5k across 30 took 74 ms, and **199k across 45 took 1,246 ms** — an
|
|
13
|
+
* unbroken second and a quarter of main thread, scaling linearly, on a level that is small.
|
|
14
|
+
* Reported from a port as GAP-008.
|
|
15
|
+
*
|
|
16
|
+
* **The offline route already exists and is the intended pipeline.**
|
|
17
|
+
* {@link MeshletGeometrySerializationAdapter} round-trips a `MeshletGeometry` to and from a
|
|
18
|
+
* `BinaryBuffer` losslessly, so an asset build can call this once, serialize the result beside the
|
|
19
|
+
* source mesh, and leave the runtime with a deserialize and an upload. Nothing about this function
|
|
20
|
+
* needs to run in a browser. If you are calling it from a level loader, that is the thing to change
|
|
21
|
+
* first — before reaching for a worker, which only moves the cost.
|
|
22
|
+
*
|
|
23
|
+
* A pooled worker-backed geometry service, with meshlet construction as one of the things it
|
|
24
|
+
* serves, is where this is going; it is not here yet, and it would not remove the reason to build
|
|
25
|
+
* offline.
|
|
26
|
+
*
|
|
10
27
|
* @param {Geometry} geometry
|
|
11
28
|
* @param {MeshletGeometry} [out]
|
|
12
29
|
* @returns {MeshletGeometry}
|
|
30
|
+
* @see MeshletGeometrySerializationAdapter for the offline format
|
|
13
31
|
*/
|
|
14
32
|
export function meshlet_geometry_build_from_geometry(geometry, out = new MeshletGeometry()) {
|
|
15
33
|
assert.defined(geometry, 'geometry');
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("../../../../core/geom/3d/aabb/AABB3.js").AABB3} AABB3
|
|
3
|
+
*/
|
|
1
4
|
export class LightProbeVolume {
|
|
2
5
|
/**
|
|
3
6
|
*
|
|
@@ -51,5 +54,6 @@ export class LightProbeVolume {
|
|
|
51
54
|
}): void;
|
|
52
55
|
#private;
|
|
53
56
|
}
|
|
57
|
+
export type AABB3 = import("../../../../core/geom/3d/aabb/AABB3.js").AABB3;
|
|
54
58
|
import { TetrahedralMesh } from "../../../../core/geom/3d/tetrahedra/TetrahedralMesh.js";
|
|
55
59
|
//# sourceMappingURL=LightProbeVolume.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightProbeVolume.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/lpv/LightProbeVolume.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LightProbeVolume.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/lpv/LightProbeVolume.js"],"names":[],"mappings":"AAUA;;GAEG;AACH;IASI;;;OAGG;IACH,iCAEC;IAKD;;;OAGG;IACH,4BAEC;IAUD,iCAMC;IAdD;;;OAGG;IACH,8BAEC;IAUD;;;OAGG;IACH,0BAEC;IAID;;;OAGG;IACH,sBAEC;IAED,eAEC;IAED;;;;;OAKG;IACH,aAJW,MAAM,KACN,MAAM,KACN,MAAM,UAehB;IAED;;;OAGG;IACH,oBAFW,MAAM,QAiBhB;IAuBD,mBAUC;IAED;;;;OAIG;IACH,mBAHW,KAAK,cACL,UAAQ;QAAC,CAAC,EAAC,MAAM,CAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAC,CAAC,EAAC,MAAM,CAAA;KAAC,QAchD;;CACJ;oBAjKY,OAAO,wCAAwC,EAAE,KAAK;gCAJnC,wDAAwD"}
|
|
@@ -7,6 +7,10 @@ import {
|
|
|
7
7
|
} from "../../../../core/geom/3d/tetrahedra/delaunay/grid/tetrahedral_mesh_build_from_grid.js";
|
|
8
8
|
import { TetrahedralMesh } from "../../../../core/geom/3d/tetrahedra/TetrahedralMesh.js";
|
|
9
9
|
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {import("../../../../core/geom/3d/aabb/AABB3.js").AABB3} AABB3
|
|
13
|
+
*/
|
|
10
14
|
export class LightProbeVolume {
|
|
11
15
|
#mesh = new TetrahedralMesh();
|
|
12
16
|
#positions = new Float32Array(0);
|
|
@@ -4,6 +4,18 @@
|
|
|
4
4
|
* @type {number}
|
|
5
5
|
*/
|
|
6
6
|
export const PREFIX_SCAN_CSDLDF_PARTITION_SIZE: number;
|
|
7
|
+
/**
|
|
8
|
+
* `u32` words of header that sit in front of the scanned elements.
|
|
9
|
+
*
|
|
10
|
+
* The scan reads its element count from word 0 and its `elements` member is `@align(16)`, so the
|
|
11
|
+
* first element lands at word 4 and words 1..3 are padding the scan never reads. A caller that
|
|
12
|
+
* binds the same buffer flat as an `array<u32>` — every producer of a histogram this scan consumes
|
|
13
|
+
* does — has to step over the header by hand, and this is the number to step by. Derived from the
|
|
14
|
+
* struct so the two cannot drift apart.
|
|
15
|
+
*
|
|
16
|
+
* @type {number}
|
|
17
|
+
*/
|
|
18
|
+
export const PREFIX_SCAN_CSDLDF_HEADER_WORDS: number;
|
|
7
19
|
/**
|
|
8
20
|
* Chained Scan with Decoupled Lookback Decoupled Fallback
|
|
9
21
|
* @see https://escholarship.org/content/qt0bk9z4bt/qt0bk9z4bt.pdf
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_prefix_scan_csdldf.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js"],"names":[],"mappings":"AASA;;;;GAIG;AACH,gDAFU,MAAM,CAEsC;
|
|
1
|
+
{"version":3,"file":"shader_prefix_scan_csdldf.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js"],"names":[],"mappings":"AASA;;;;GAIG;AACH,gDAFU,MAAM,CAEsC;AAOtD;;;;;;;;;;GAUG;AACH,8CAFU,MAAM,CAE6E;AA0S7F;;;;;GAKG;AACH,wCAFU,aAAa,CAMpB;8BA9U2B,kCAAkC"}
|
|
@@ -19,6 +19,19 @@ const DATA_STRUCT = WebGPUStruct.from({
|
|
|
19
19
|
elements: WebGPUArray.from(vec4u),
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
+
/**
|
|
23
|
+
* `u32` words of header that sit in front of the scanned elements.
|
|
24
|
+
*
|
|
25
|
+
* The scan reads its element count from word 0 and its `elements` member is `@align(16)`, so the
|
|
26
|
+
* first element lands at word 4 and words 1..3 are padding the scan never reads. A caller that
|
|
27
|
+
* binds the same buffer flat as an `array<u32>` — every producer of a histogram this scan consumes
|
|
28
|
+
* does — has to step over the header by hand, and this is the number to step by. Derived from the
|
|
29
|
+
* struct so the two cannot drift apart.
|
|
30
|
+
*
|
|
31
|
+
* @type {number}
|
|
32
|
+
*/
|
|
33
|
+
export const PREFIX_SCAN_CSDLDF_HEADER_WORDS = DATA_STRUCT.get("elements").offset / u32.size;
|
|
34
|
+
|
|
22
35
|
const resources = new ShaderResourceSetDescriptor();
|
|
23
36
|
resources.createGroup()
|
|
24
37
|
.addStorageBuffer("scan_in", DATA_STRUCT, true)
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
export function parse_rgbe(buffer: ArrayBuffer, type?: BinaryDataType.Float16 | BinaryDataType.Float32): {
|
|
9
9
|
width: number;
|
|
10
10
|
height: number;
|
|
11
|
-
data:
|
|
11
|
+
data: Float32Array | Uint16Array;
|
|
12
12
|
header: string;
|
|
13
13
|
gamma: number;
|
|
14
14
|
exposure: number;
|
|
@@ -13,7 +13,7 @@ export class TinyGltf {
|
|
|
13
13
|
* @readonly
|
|
14
14
|
* @type {TextureFormat}
|
|
15
15
|
*/
|
|
16
|
-
static readonly "__#
|
|
16
|
+
static readonly "__#222@#UNCOMPRESSED_TARGET": TextureFormat;
|
|
17
17
|
/**
|
|
18
18
|
* @param {AssetManager} assetManager
|
|
19
19
|
* @param {AssetRequestScope} [scope]
|
|
@@ -25,7 +25,7 @@ node graphs and lowered to that bytecode by a testable JS compiler.
|
|
|
25
25
|
## Layered architecture
|
|
26
26
|
|
|
27
27
|
```
|
|
28
|
-
authoring:
|
|
28
|
+
authoring: NodeGraph (nodes+ports) ──compile──▶ Program (bytecode)
|
|
29
29
|
standard node library │
|
|
30
30
|
▼
|
|
31
31
|
runtime CPU: EmitterDefinition ── GPUDatabase(emitters) ─┤ ProgramArena (packed u32 buffer)
|
|
@@ -35,6 +35,7 @@ runtime GPU: particle pool (array<u32>, uniform stride) + alive/dead lists + cou
|
|
|
35
35
|
┌─ resolve emitter transforms (bone attach)
|
|
36
36
|
├─ emit (VM SPAWN program) ── pop dead → init → append alive_new
|
|
37
37
|
├─ simulate (VM UPDATE program) ── update → (kill→dead | keep→alive_new + depth key)
|
|
38
|
+
├─ bucket (histogram → csdldf scan → scatter) ── alive → program-coherent sim list
|
|
38
39
|
├─ compact/indirect-args
|
|
39
40
|
├─ sort (radix: histogram → csdldf scan → scatter) [transparent]
|
|
40
41
|
└─ render (instanced billboard quads, forward + optional lighting + soft depth)
|
|
@@ -52,14 +53,16 @@ Lifecycle uses the canonical GPU dead-list / alive-list ping-pong:
|
|
|
52
53
|
- `alive_list[2]`: ping-pong compact lists of live slot indices (+ counts).
|
|
53
54
|
- `counters`: atomics {alive_count, dead_count, spawn cursor…} + derived indirect dispatch/draw args.
|
|
54
55
|
|
|
55
|
-
Emit: pop dead → run SPAWN → append `alive_new`. Simulate: read
|
|
56
|
-
kill pushes to `dead`, survival appends to
|
|
57
|
-
frame.
|
|
56
|
+
Emit: pop dead → run SPAWN → append `alive_new`. Simulate: read the **coherence list** last frame's
|
|
57
|
+
bucketing pass built from `alive_current` → run UPDATE → kill pushes to `dead`, survival appends to
|
|
58
|
+
`alive_new` and writes a depth sort key. Swap lists each frame.
|
|
58
59
|
|
|
59
|
-
**The loop is strictly GPU-driven.** The build-indirect pass snapshots the
|
|
60
|
-
into `counters[ALIVE_IN]` and writes the indirect dispatch args next frame's simulate
|
|
61
|
-
(`dispatchWorkgroupsIndirect`) plus the indirect draw args this frame's render consumes
|
|
62
|
-
(`drawIndirect
|
|
60
|
+
**The loop is strictly GPU-driven.** The build-indirect pass snapshots the padded length of the
|
|
61
|
+
coherence list into `counters[ALIVE_IN]` and writes the indirect dispatch args next frame's simulate
|
|
62
|
+
consumes (`dispatchWorkgroupsIndirect`) plus the indirect draw args this frame's render consumes
|
|
63
|
+
(`drawIndirect`, sized by the *unpadded* alive count); simulate bound-checks against the ALIVE_IN
|
|
64
|
+
snapshot. Because both come from one value and a padded length is a whole number of workgroups, the
|
|
65
|
+
dispatch's thread count and the shader's bound agree exactly. Sizing any of this from a CPU
|
|
63
66
|
readback is a correctness bug, not a shortcut: the readback is inevitably stale, so a growing
|
|
64
67
|
population orphans the tail of the alive list (slots leak into limbo) and a shrinking one
|
|
65
68
|
re-simulates stale entries — double-freeing slots so two live particles later share one record. The
|
|
@@ -90,7 +93,7 @@ executors cover every opcode in the ISA table.
|
|
|
90
93
|
|
|
91
94
|
### Node graph → bytecode
|
|
92
95
|
|
|
93
|
-
`
|
|
96
|
+
A core `NodeGraph` holds particle nodes (ports + parameters) for SPAWN and UPDATE. `compile()`:
|
|
94
97
|
1. topologically orders reachable nodes,
|
|
95
98
|
2. lowers each node to VM ops (nodes emit via a small builder that allocates result registers),
|
|
96
99
|
3. linear-scan register allocation with liveness,
|
|
@@ -117,11 +120,45 @@ time; on wake, spawn-count is caught up (bounded steps, like meep's `ParticularE
|
|
|
117
120
|
attached to a bone read `node.global` from the scene transforms table (GPU-side) each frame to derive
|
|
118
121
|
their world transform, after `graph_scene_update_transform_hierarchy` has run.
|
|
119
122
|
|
|
120
|
-
###
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
### Two orderings, and why they are separate
|
|
124
|
+
|
|
125
|
+
There are two independent permutations of the live particles each frame. They are produced by
|
|
126
|
+
different passes into different buffers and must not be conflated or derived from one another.
|
|
127
|
+
|
|
128
|
+
**Simulation order** (`coherence/`) — camera-independent, changes only when emitters or their
|
|
129
|
+
programs change. The alive list comes out of compaction (`atomicAdd(&counters[ALIVE])`), so its
|
|
130
|
+
order says nothing about which emitter a particle belongs to and a wave routinely holds particles
|
|
131
|
+
running different VM programs. That costs twice: the interpreter's ~40-case opcode `switch`
|
|
132
|
+
diverges, so a wave serially executes the union of the opcodes its lanes want; and `vm_reg[dst]` /
|
|
133
|
+
`vm_reg[s0]` index a VGPR-resident register file dynamically, which AMD reaches with
|
|
134
|
+
`v_movrels`/`v_movreld` behind a waterfall loop whose trip count is the number of *distinct*
|
|
135
|
+
register indices live in the wave. Grouping the wave by program collapses both at once.
|
|
136
|
+
|
|
137
|
+
The bucket key is the **program**, not the emitter: `ProgramArena` deduplicates by content and hands
|
|
138
|
+
back a dense `program_id` the emitter record carries, so emitters compiled from the same graph share
|
|
139
|
+
one bucket. Each bucket is padded out to `PARTICLE_SIMULATE_WORKGROUP_SIZE` (64 — a multiple of both
|
|
140
|
+
plausible subgroup widths, so no shader needs to query `subgroup_size`), which is what makes the
|
|
141
|
+
grouping hold at wave granularity: an unpadded boundary lands mid-wave and that wave spans two
|
|
142
|
+
programs again. Padding entries carry `PARTICLE_SIM_PAD_SLOT` and the simulate shader drops them
|
|
143
|
+
*before* the compaction atomics, so they never enter the alive or dead list.
|
|
144
|
+
|
|
145
|
+
It is an **indirection** list. Particle records never move: slots are referenced by the dead list and
|
|
146
|
+
across frames, so relocating a record would leave both pointing at the wrong particle.
|
|
147
|
+
|
|
148
|
+
The three-phase shape is the depth sort's, with the padding added: histogram (atomic per bucket) →
|
|
149
|
+
round each bin up to a whole workgroup → `graph_prefix_scan_csdldf` (reused as-is — the one scan here
|
|
150
|
+
whose only cross-workgroup wait is CSDLDF's bounded spin-then-fallback) → scatter → fill the tails
|
|
151
|
+
with the sentinel. Nothing reads back to the CPU; the only host-supplied number is the bucket count,
|
|
152
|
+
which is static topology.
|
|
153
|
+
|
|
154
|
+
**Render order** (`sort/`) — per-frame, transparent emitters' particles sorted back-to-front by view
|
|
155
|
+
depth so premultiplied transparency composites correctly. LSD radix sort on a 32-bit key (quantized
|
|
156
|
+
view depth): per digit — build histogram, `graph_prefix_scan_csdldf` the bin counts to offsets,
|
|
157
|
+
scatter (index payload). Sorted index list feeds the instanced draw.
|
|
158
|
+
|
|
159
|
+
Reordering the render list for program coherence would break transparency; depth-sorting the
|
|
160
|
+
simulation list would destroy the coherence. They share no buffer and no counter slot —
|
|
161
|
+
`PARTICLE_COUNTER.SORTED` belongs to the render order, `SIM_PADDED` to the simulation order.
|
|
125
162
|
|
|
126
163
|
### Rendering
|
|
127
164
|
|
|
@@ -143,12 +180,15 @@ src/webgpu/renderer/particles/
|
|
|
143
180
|
isa/ParticleAssembler.js tiny assembler (build programs in tests/library)
|
|
144
181
|
vm/ParticleVMReference.js JS reference executor
|
|
145
182
|
vm/chunk_particle_vm.js WGSL interpreter CodeChunk (parity target)
|
|
146
|
-
graph/
|
|
147
|
-
graph/
|
|
148
|
-
graph/
|
|
183
|
+
graph/ParticleNodeDescription.js node type base (ports + lowering)
|
|
184
|
+
graph/ParticleNodeRegistry.js standard node library (a NodeRegistry)
|
|
185
|
+
graph/particle_graph_authoring.js authoring sugar over core/model/node-graph
|
|
149
186
|
graph/compile_particle_graph.js graph → Program (register alloc, const intern)
|
|
150
187
|
layout/ParticleLayout.js attribute schema ↔ record word offsets
|
|
151
188
|
data/*_STRUCT.js EMITTER_STRUCT, counters, render binding, sort key
|
|
189
|
+
coherence/particle_program_buckets.js CPU reference for the simulation-order bucketing
|
|
190
|
+
coherence/shader_particle_bucket.js reset / histogram / pad / scatter / fill
|
|
191
|
+
coherence/graph_particle_bucket.js frame-graph wiring, around graph_prefix_scan_csdldf
|
|
152
192
|
runtime/ParticlePool.js pool + alive/dead lists + counters (buffers)
|
|
153
193
|
runtime/ProgramArena.js packed program+const buffer
|
|
154
194
|
runtime/ParticleAtlas.js sprite atlas texture + region table
|
|
@@ -186,6 +226,13 @@ Built and tested (80 tests, 16 files):
|
|
|
186
226
|
- **Runtime** — ProgramArena, EmitterRegistry, ParticleSpawnScheduler (sleep-when-culled), the
|
|
187
227
|
GPUParticleSystem CPU model (bone-attach transform patching, free list, ping-pong).
|
|
188
228
|
- **Sort** — counting sort reference + histogram/scatter shaders bracketing `graph_prefix_scan_csdldf`.
|
|
229
|
+
- **Coherence** — CPU reference plus the five bucketing shaders, on the emulator and validated as
|
|
230
|
+
WGSL; the whole chain is run end to end against the reference, pinning that bucket boundaries land
|
|
231
|
+
on multiples of 64, that no workgroup of the result spans two programs, and that every input slot
|
|
232
|
+
survives exactly once. Orchestration is pinned twice on `SoftwareGPUDevice`: `graph_particles.spec`
|
|
233
|
+
records the real frame graph (pass order, indirect sizing, the two orderings in separate buffers,
|
|
234
|
+
and every persistent buffer imported exactly once — two imports of one buffer are two resource
|
|
235
|
+
entries the graph cannot tell apart), and the playground spec covers the hand-encoded equivalent.
|
|
189
236
|
- **Render math** — billboard modes, atlas/flipbook UV, soft fade, premultiplied blend.
|
|
190
237
|
- **Finalize** — reset + build-indirect passes.
|
|
191
238
|
- **Culling** — frustum sphere test.
|
|
@@ -197,11 +244,15 @@ the **prototype** effects.
|
|
|
197
244
|
|
|
198
245
|
### Emulator caveats discovered (all correct on real hardware)
|
|
199
246
|
|
|
200
|
-
The in-repo WGSL emulator (unit-test tool, not GPU parity) has
|
|
247
|
+
The in-repo WGSL emulator (unit-test tool, not GPU parity) has four limitations the shaders are
|
|
201
248
|
written around, documented in the memory note: `switch` case bodies are dropped (use if/else);
|
|
202
249
|
repeated read-modify-write of one location across a loop is corrupted (RNG is verified in isolation,
|
|
203
|
-
not through the interpreter loop);
|
|
204
|
-
checked through it)
|
|
250
|
+
not through the interpreter loop); u32 multiply is imprecise for large operands (PCG can't be
|
|
251
|
+
checked through it); and `/` is FLOAT division, so integer division only truncates where the result
|
|
252
|
+
is stored straight into a typed array — `(n + 63u) / 64u * 64u` reads as 66 there and 64 on a
|
|
253
|
+
device. The coherence pass's round-up is a mask (`(n + 63u) & 0xffffffc0u`) for exactly that reason,
|
|
254
|
+
and the fill pass splits its thread id with `>>` and `&` rather than `/` and `%`.
|
|
255
|
+
`array<atomic<u32>>` bindings are modeled as `{value}` objects in tests.
|
|
205
256
|
|
|
206
257
|
### Renderer integration (remaining hook-up)
|
|
207
258
|
|
|
@@ -12,11 +12,18 @@
|
|
|
12
12
|
* 1. reset counters (snapshot the previous alive count as this frame's simulate input, zero the new
|
|
13
13
|
* alive count)
|
|
14
14
|
* 2. emit — run SPAWN for each scheduled spawn request (pop dead -> init -> append alive)
|
|
15
|
-
* 3. simulate — one dispatch runs every emitter's UPDATE over the
|
|
16
|
-
* survivors into the new alive list and freed slots into the dead list
|
|
17
|
-
* 4.
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* 3. simulate — one dispatch runs every emitter's UPDATE over the coherence list built last frame,
|
|
16
|
+
* compacting survivors into the new alive list and freed slots into the dead list
|
|
17
|
+
* 4. bucket — regroup the new alive list by VM program, padded to whole workgroups, into the list
|
|
18
|
+
* NEXT frame's simulate consumes (`coherence/`)
|
|
19
|
+
* 5. build indirect — derive next frame's simulate dispatch from the padded list length and this
|
|
20
|
+
* frame's render draw instance count from the alive count
|
|
21
|
+
* 6. sort (optional) — histogram -> csdldf scan -> scatter to a back-to-front index list
|
|
22
|
+
* 7. render — one instanced billboard draw over the sorted list
|
|
23
|
+
*
|
|
24
|
+
* Steps 4 and 6 are two different orderings of the same particles and share nothing: the
|
|
25
|
+
* simulation order is program-coherent and camera-independent, the render order is back-to-front
|
|
26
|
+
* and changes with the camera. Separate buffers, separate passes, separate counter slots.
|
|
20
27
|
*
|
|
21
28
|
* The alive lists ping-pong by frame parity, exactly like the ReSTIR reservoirs.
|
|
22
29
|
*
|
|
@@ -49,6 +56,13 @@ export class GPUParticleSystem {
|
|
|
49
56
|
/** CPU shadow of the packed emitter buffer (for in-place transform patching) */
|
|
50
57
|
emitter_cpu: Uint32Array;
|
|
51
58
|
emitters_dirty: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Distinct compiled programs across the emitter set — the number of buckets the coherence
|
|
61
|
+
* pass sorts into. Known only after {@link buildEmitterData}; until then the emitter count
|
|
62
|
+
* is a safe upper bound (programs can be shared, never invented).
|
|
63
|
+
* @type {number|undefined}
|
|
64
|
+
*/
|
|
65
|
+
program_count: number | undefined;
|
|
52
66
|
/**
|
|
53
67
|
* Register an emitter.
|
|
54
68
|
* @param {object} config see {@link EmitterRegistry#add}
|
|
@@ -82,6 +96,16 @@ export class GPUParticleSystem {
|
|
|
82
96
|
program: Uint32Array;
|
|
83
97
|
constants: Uint32Array;
|
|
84
98
|
};
|
|
99
|
+
/**
|
|
100
|
+
* Number of simulation-order buckets — one per distinct compiled program.
|
|
101
|
+
*
|
|
102
|
+
* This is the coherence pass's only host-provided number, and it is static topology rather than
|
|
103
|
+
* per-frame state: it changes when the emitter set changes, not as particles are born and die.
|
|
104
|
+
* Everything the pass measures per frame stays on the GPU.
|
|
105
|
+
*
|
|
106
|
+
* @returns {number}
|
|
107
|
+
*/
|
|
108
|
+
bucketCount(): number;
|
|
85
109
|
/**
|
|
86
110
|
* Sizes of the persistent buffers, in bytes. Exposed for tests and allocation.
|
|
87
111
|
* @returns {object}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUParticleSystem.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/GPUParticleSystem.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUParticleSystem.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/GPUParticleSystem.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH;IACI;;;;OAIG;IACH,sBAJW,MAAM;QAEW,QAAQ,GAAzB,MAAM;OA8BhB;IAxBG,cAAwB;IACxB,iBAAwB;IAExB,0BAAqC;IACrC,kCAA6C;IAE7C,gEAAgE;IAChE,aADW,IAAI,MAAM,EAAE,MAAM,CAAC,CACF;IAE5B,qBAAqB;IACrB,OADW,MAAM,CACH;IAEd,mCAAmC;IACnC,aAAwB;IACxB,gFAAgF;IAChF,yBAA4B;IAC5B,wBAA0B;IAC1B;;;;;OAKG;IACH,eAFU,MAAM,GAAC,SAAS,CAEI;IAGlC;;;;OAIG;IACH,mBAHW,MAAM,GACJ,MAAM,CAMlB;IAED;;;;;OAKG;IACH,4BAHW,MAAM,QACN,MAAM,QAIhB;IAED;;;;;;;OAOG;IACH,WALW,MAAM;oCAES,MAAM,KAAK,OAAO;QAC/B,WAAW,CAiBvB;IAED;;;OAGG;IACH,oBAFa;QAAC,QAAQ,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,WAAW,CAAA;KAAC,CAQjF;IAED;;;;;;;;OAQG;IACH,eAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,eAFa,MAAM,CA+BlB;IAED;;;OAGG;IACH;cAFoB,WAAW;kBAAY,WAAW;MAUrD;IAED;;;OAGG;IACH;cAFoB,MAAM;eAAS,MAAM;MAKxC;CACJ;gCA3M+B,8BAA8B;uCACvB,qCAAqC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import { PARTICLE_RECORD_WORD_COUNT } from "./ParticleConstants.js";
|
|
2
|
+
import { PARTICLE_RECORD_WORD_COUNT, PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./ParticleConstants.js";
|
|
3
|
+
import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
|
|
3
4
|
import { EMITTER_STRIDE, write_emitter_transform } from "./data/PARTICLE_EMITTER_LAYOUT.js";
|
|
4
5
|
import { PARTICLE_COUNTER, PARTICLE_COUNTER_COUNT } from "./data/PARTICLE_COUNTERS.js";
|
|
5
6
|
import { EmitterRegistry } from "./runtime/EmitterRegistry.js";
|
|
@@ -19,11 +20,18 @@ import { ParticleSpawnScheduler } from "./runtime/ParticleSpawnScheduler.js";
|
|
|
19
20
|
* 1. reset counters (snapshot the previous alive count as this frame's simulate input, zero the new
|
|
20
21
|
* alive count)
|
|
21
22
|
* 2. emit — run SPAWN for each scheduled spawn request (pop dead -> init -> append alive)
|
|
22
|
-
* 3. simulate — one dispatch runs every emitter's UPDATE over the
|
|
23
|
-
* survivors into the new alive list and freed slots into the dead list
|
|
24
|
-
* 4.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* 3. simulate — one dispatch runs every emitter's UPDATE over the coherence list built last frame,
|
|
24
|
+
* compacting survivors into the new alive list and freed slots into the dead list
|
|
25
|
+
* 4. bucket — regroup the new alive list by VM program, padded to whole workgroups, into the list
|
|
26
|
+
* NEXT frame's simulate consumes (`coherence/`)
|
|
27
|
+
* 5. build indirect — derive next frame's simulate dispatch from the padded list length and this
|
|
28
|
+
* frame's render draw instance count from the alive count
|
|
29
|
+
* 6. sort (optional) — histogram -> csdldf scan -> scatter to a back-to-front index list
|
|
30
|
+
* 7. render — one instanced billboard draw over the sorted list
|
|
31
|
+
*
|
|
32
|
+
* Steps 4 and 6 are two different orderings of the same particles and share nothing: the
|
|
33
|
+
* simulation order is program-coherent and camera-independent, the render order is back-to-front
|
|
34
|
+
* and changes with the camera. Separate buffers, separate passes, separate counter slots.
|
|
27
35
|
*
|
|
28
36
|
* The alive lists ping-pong by frame parity, exactly like the ReSTIR reservoirs.
|
|
29
37
|
*
|
|
@@ -61,6 +69,13 @@ export class GPUParticleSystem {
|
|
|
61
69
|
/** CPU shadow of the packed emitter buffer (for in-place transform patching) */
|
|
62
70
|
this.emitter_cpu = undefined;
|
|
63
71
|
this.emitters_dirty = true;
|
|
72
|
+
/**
|
|
73
|
+
* Distinct compiled programs across the emitter set — the number of buckets the coherence
|
|
74
|
+
* pass sorts into. Known only after {@link buildEmitterData}; until then the emitter count
|
|
75
|
+
* is a safe upper bound (programs can be shared, never invented).
|
|
76
|
+
* @type {number|undefined}
|
|
77
|
+
*/
|
|
78
|
+
this.program_count = undefined;
|
|
64
79
|
}
|
|
65
80
|
|
|
66
81
|
/**
|
|
@@ -116,24 +131,56 @@ export class GPUParticleSystem {
|
|
|
116
131
|
buildEmitterData() {
|
|
117
132
|
const built = this.registry.build();
|
|
118
133
|
this.emitter_cpu = built.emitters;
|
|
134
|
+
this.program_count = built.program_count;
|
|
119
135
|
this.emitters_dirty = false;
|
|
120
136
|
return built;
|
|
121
137
|
}
|
|
122
138
|
|
|
139
|
+
/**
|
|
140
|
+
* Number of simulation-order buckets — one per distinct compiled program.
|
|
141
|
+
*
|
|
142
|
+
* This is the coherence pass's only host-provided number, and it is static topology rather than
|
|
143
|
+
* per-frame state: it changes when the emitter set changes, not as particles are born and die.
|
|
144
|
+
* Everything the pass measures per frame stays on the GPU.
|
|
145
|
+
*
|
|
146
|
+
* @returns {number}
|
|
147
|
+
*/
|
|
148
|
+
bucketCount() {
|
|
149
|
+
return Math.max(1, this.program_count ?? this.registry.count);
|
|
150
|
+
}
|
|
151
|
+
|
|
123
152
|
/**
|
|
124
153
|
* Sizes of the persistent buffers, in bytes. Exposed for tests and allocation.
|
|
125
154
|
* @returns {object}
|
|
126
155
|
*/
|
|
127
156
|
bufferSizes() {
|
|
128
157
|
const u32 = 4;
|
|
158
|
+
const buckets = this.bucketCount();
|
|
159
|
+
|
|
129
160
|
return {
|
|
130
161
|
pool: this.capacity * PARTICLE_RECORD_WORD_COUNT * u32,
|
|
131
162
|
alive_list: this.capacity * u32,
|
|
132
163
|
dead_list: this.capacity * u32,
|
|
133
164
|
counters: PARTICLE_COUNTER_COUNT * u32,
|
|
165
|
+
// render order (sort/)
|
|
134
166
|
sorted: this.capacity * u32,
|
|
135
167
|
keys: this.capacity * u32,
|
|
136
168
|
emitter_record: EMITTER_STRIDE * u32,
|
|
169
|
+
|
|
170
|
+
// simulation order (coherence/) — a separate set of buffers on purpose; sharing any of
|
|
171
|
+
// them with the render order would couple a camera-driven ordering to a program-driven
|
|
172
|
+
// one.
|
|
173
|
+
//
|
|
174
|
+
// Padding rounds each bucket up to a whole workgroup, so it can add at most
|
|
175
|
+
// `workgroup - 1` entries per bucket; one whole workgroup per bucket is the bound.
|
|
176
|
+
sim_list: (this.capacity + buckets * PARTICLE_SIMULATE_WORKGROUP_SIZE) * u32,
|
|
177
|
+
sim_keys: this.capacity * u32,
|
|
178
|
+
// `{count, elements}` for the CSDLDF scan; the scan reads whole vec4s, so the bins are
|
|
179
|
+
// rounded up to a multiple of four.
|
|
180
|
+
sim_histogram: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + round_up_4(buckets)) * u32,
|
|
181
|
+
sim_bucket_counts: buckets * u32,
|
|
182
|
+
sim_cursor: buckets * u32,
|
|
183
|
+
sim_dispatch_args: 3 * u32,
|
|
137
184
|
};
|
|
138
185
|
}
|
|
139
186
|
|
|
@@ -160,3 +207,11 @@ export class GPUParticleSystem {
|
|
|
160
207
|
return { read, write: 1 - read };
|
|
161
208
|
}
|
|
162
209
|
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* @param {number} value
|
|
213
|
+
* @returns {number} `value` rounded up to a multiple of four
|
|
214
|
+
*/
|
|
215
|
+
function round_up_4(value) {
|
|
216
|
+
return (value + 3) & ~3;
|
|
217
|
+
}
|
|
@@ -42,4 +42,35 @@ export const PARTICLE_VM_INSTRUCTION_WORDS: number;
|
|
|
42
42
|
* @type {number}
|
|
43
43
|
*/
|
|
44
44
|
export const PARTICLE_VM_MAX_INSTRUCTIONS: number;
|
|
45
|
+
/**
|
|
46
|
+
* Threads per workgroup in the simulate dispatch — and therefore the granularity the simulate input
|
|
47
|
+
* list is bucketed to (see `coherence/`).
|
|
48
|
+
*
|
|
49
|
+
* 64 is a multiple of both subgroup widths a WebGPU implementation plausibly reports (32 on NVIDIA
|
|
50
|
+
* and RDNA wave32, 64 on GCN wave64), so aligning a bucket to it aligns it to a wave without the
|
|
51
|
+
* shader ever having to query `subgroup_size`. It is also a power of two, which is what lets the
|
|
52
|
+
* round-up be a mask rather than a divide — the WGSL emulator's `/` is float division, so an
|
|
53
|
+
* integer-truncating round-up would read differently there than on a device.
|
|
54
|
+
*
|
|
55
|
+
* Lives here rather than in the simulate shader because the bucketing passes, the CPU reference and
|
|
56
|
+
* the indirect-args pass all have to agree on it; `shaders/shader_particle_simulate.js` re-exports
|
|
57
|
+
* it for callers that think of it as that pass's property.
|
|
58
|
+
*
|
|
59
|
+
* @type {number}
|
|
60
|
+
*/
|
|
61
|
+
export const PARTICLE_SIMULATE_WORKGROUP_SIZE: number;
|
|
62
|
+
/**
|
|
63
|
+
* Slot value carried by a padding entry in the simulate input list.
|
|
64
|
+
*
|
|
65
|
+
* Bucketing pads each program's run out to {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} so no wave ever
|
|
66
|
+
* spans two VM programs; the entries that padding adds name no particle. The simulate shader must
|
|
67
|
+
* recognise this and return BEFORE the compaction atomics, so a padding lane never appends to the
|
|
68
|
+
* alive list and never pushes a slot onto the dead (free) list.
|
|
69
|
+
*
|
|
70
|
+
* `0xffffffff` is not a reachable slot index: a slot index addresses `pool` at
|
|
71
|
+
* `slot * PARTICLE_RECORD_WORD_COUNT`, so a pool with 2^32-1 slots would need 512 GiB.
|
|
72
|
+
*
|
|
73
|
+
* @type {number}
|
|
74
|
+
*/
|
|
75
|
+
export const PARTICLE_SIM_PAD_SLOT: number;
|
|
45
76
|
//# sourceMappingURL=ParticleConstants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParticleConstants.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/ParticleConstants.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,6CAFU,MAAM,CAEgC;AAEhD;;;GAGG;AACH,8CAFU,MAAM,CAEiC;AAEjD;;;GAGG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;;GAIG;AACH,2CAFU,MAAM,CAEgC"}
|
|
1
|
+
{"version":3,"file":"ParticleConstants.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/ParticleConstants.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,6CAFU,MAAM,CAEgC;AAEhD;;;GAGG;AACH,8CAFU,MAAM,CAEiC;AAEjD;;;GAGG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;;GAIG;AACH,2CAFU,MAAM,CAEgC;AAEhD;;;;;;;;;;;;;;;GAeG;AACH,+CAFU,MAAM,CAEmC;AAEnD;;;;;;;;;;;;GAYG;AACH,oCAFU,MAAM,CAEgC"}
|
|
@@ -48,3 +48,36 @@ export const PARTICLE_VM_INSTRUCTION_WORDS = 5;
|
|
|
48
48
|
* @type {number}
|
|
49
49
|
*/
|
|
50
50
|
export const PARTICLE_VM_MAX_INSTRUCTIONS = 256;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Threads per workgroup in the simulate dispatch — and therefore the granularity the simulate input
|
|
54
|
+
* list is bucketed to (see `coherence/`).
|
|
55
|
+
*
|
|
56
|
+
* 64 is a multiple of both subgroup widths a WebGPU implementation plausibly reports (32 on NVIDIA
|
|
57
|
+
* and RDNA wave32, 64 on GCN wave64), so aligning a bucket to it aligns it to a wave without the
|
|
58
|
+
* shader ever having to query `subgroup_size`. It is also a power of two, which is what lets the
|
|
59
|
+
* round-up be a mask rather than a divide — the WGSL emulator's `/` is float division, so an
|
|
60
|
+
* integer-truncating round-up would read differently there than on a device.
|
|
61
|
+
*
|
|
62
|
+
* Lives here rather than in the simulate shader because the bucketing passes, the CPU reference and
|
|
63
|
+
* the indirect-args pass all have to agree on it; `shaders/shader_particle_simulate.js` re-exports
|
|
64
|
+
* it for callers that think of it as that pass's property.
|
|
65
|
+
*
|
|
66
|
+
* @type {number}
|
|
67
|
+
*/
|
|
68
|
+
export const PARTICLE_SIMULATE_WORKGROUP_SIZE = 64;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Slot value carried by a padding entry in the simulate input list.
|
|
72
|
+
*
|
|
73
|
+
* Bucketing pads each program's run out to {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} so no wave ever
|
|
74
|
+
* spans two VM programs; the entries that padding adds name no particle. The simulate shader must
|
|
75
|
+
* recognise this and return BEFORE the compaction atomics, so a padding lane never appends to the
|
|
76
|
+
* alive list and never pushes a slot onto the dead (free) list.
|
|
77
|
+
*
|
|
78
|
+
* `0xffffffff` is not a reachable slot index: a slot index addresses `pool` at
|
|
79
|
+
* `slot * PARTICLE_RECORD_WORD_COUNT`, so a pool with 2^32-1 slots would need 512 GiB.
|
|
80
|
+
*
|
|
81
|
+
* @type {number}
|
|
82
|
+
*/
|
|
83
|
+
export const PARTICLE_SIM_PAD_SLOT = 0xffffffff;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame-graph wiring for the simulation-order bucketing: turns the frame's freshly compacted alive
|
|
3
|
+
* list into the program-coherent, workgroup-padded list NEXT frame's simulate consumes.
|
|
4
|
+
*
|
|
5
|
+
* Runs at the end of the frame, after emit and simulate have both finished appending to the alive
|
|
6
|
+
* list and before the build-indirect pass, which reads the padded length this produces
|
|
7
|
+
* ({@link PARTICLE_COUNTER.SIM_PADDED}) and turns it into next frame's dispatch args and bound.
|
|
8
|
+
*
|
|
9
|
+
* Six passes, the middle one being `graph_prefix_scan_csdldf` reused unchanged — the same scan the
|
|
10
|
+
* radix sort runs its spine through. Reusing it is deliberate: it is the one prefix scan in this
|
|
11
|
+
* codebase whose only cross-workgroup wait is CSDLDF's own bounded-spin-then-fallback, so the pass
|
|
12
|
+
* makes progress on a scheduler that offers no fairness guarantee. A hand-rolled scan here would be
|
|
13
|
+
* a second place to get that wrong.
|
|
14
|
+
*
|
|
15
|
+
* Nothing on this path reads back to the CPU. The only host-supplied number is `bucket_count`, and
|
|
16
|
+
* that is static topology — it changes when the emitter set does, never as particles are born and
|
|
17
|
+
* die. The per-frame quantities (the alive count, the bin sizes, the padded total) are produced and
|
|
18
|
+
* consumed entirely on the GPU, including the dispatch size of the two per-particle passes, which
|
|
19
|
+
* the reset pass writes into `sim_dispatch_args` from the GPU's own alive count.
|
|
20
|
+
*
|
|
21
|
+
* @param {object} params
|
|
22
|
+
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
23
|
+
* @param {object} params.gpu persistent buffers owned by the feature (GPUBuffer instances)
|
|
24
|
+
* @param {GPUBuffer} params.gpu.sim_list the padded, program-coherent index list this produces
|
|
25
|
+
* @param {GPUBuffer} params.gpu.sim_keys per-alive-entry program id
|
|
26
|
+
* @param {GPUBuffer} params.gpu.sim_histogram `{count, elements}` bins for the CSDLDF scan
|
|
27
|
+
* @param {GPUBuffer} params.gpu.sim_bucket_counts raw (unpadded) per-bucket counts
|
|
28
|
+
* @param {GPUBuffer} params.gpu.sim_cursor per-bucket scatter cursor
|
|
29
|
+
* @param {GPUBuffer} params.gpu.sim_dispatch_args indirect args for the two per-particle passes
|
|
30
|
+
* @param {number} params.emitters graph handle of the packed emitter records
|
|
31
|
+
* @param {number} params.pool graph handle of the particle pool
|
|
32
|
+
* @param {number} params.alive graph handle of this frame's compacted alive list
|
|
33
|
+
* @param {number} params.counters graph handle of the atomic counters
|
|
34
|
+
* @param {number} params.sim_list graph handle of the list this rewrites. Passed in rather than
|
|
35
|
+
* imported here because the simulate pass reads it earlier in the same frame: importing the same
|
|
36
|
+
* GPUBuffer twice makes two resource entries the graph cannot see are the same memory, so the read
|
|
37
|
+
* and the write end up on separate dependency chains
|
|
38
|
+
* @param {number} params.bucket_count number of distinct compiled programs
|
|
39
|
+
* @returns {{counters: number, sim_list: number}} the threaded handles downstream passes must read
|
|
40
|
+
*/
|
|
41
|
+
export function graph_particle_bucket({ graph, gpu, emitters, pool, alive, counters, sim_list, bucket_count }: {
|
|
42
|
+
graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
43
|
+
gpu: {
|
|
44
|
+
sim_list: GPUBuffer;
|
|
45
|
+
sim_keys: GPUBuffer;
|
|
46
|
+
sim_histogram: GPUBuffer;
|
|
47
|
+
sim_bucket_counts: GPUBuffer;
|
|
48
|
+
sim_cursor: GPUBuffer;
|
|
49
|
+
sim_dispatch_args: GPUBuffer;
|
|
50
|
+
};
|
|
51
|
+
emitters: number;
|
|
52
|
+
pool: number;
|
|
53
|
+
alive: number;
|
|
54
|
+
counters: number;
|
|
55
|
+
sim_list: number;
|
|
56
|
+
bucket_count: number;
|
|
57
|
+
}): {
|
|
58
|
+
counters: number;
|
|
59
|
+
sim_list: number;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=graph_particle_bucket.d.ts.map
|