@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
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { atomic_u32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
3
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
4
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
5
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
6
|
+
import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
|
|
7
|
+
import {
|
|
8
|
+
PARTICLE_RECORD_HEADER_EMITTER,
|
|
9
|
+
PARTICLE_RECORD_WORD_COUNT,
|
|
10
|
+
PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
11
|
+
PARTICLE_SIM_PAD_SLOT,
|
|
12
|
+
} from "../ParticleConstants.js";
|
|
13
|
+
import { PARTICLE_COUNTER } from "../data/PARTICLE_COUNTERS.js";
|
|
14
|
+
import { EMITTER_FIELD, EMITTER_STRIDE } from "../data/PARTICLE_EMITTER_LAYOUT.js";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Simulation-order bucketing — the passes that make each simulate wave run ONE VM program.
|
|
18
|
+
*
|
|
19
|
+
* ## Why
|
|
20
|
+
*
|
|
21
|
+
* The alive list is produced by compaction (`atomicAdd(&counters[ALIVE])`), so its order is
|
|
22
|
+
* arbitrary with respect to emitters and a single wave routinely holds particles running different
|
|
23
|
+
* programs. That costs twice: the interpreter's ~40-case opcode `switch` diverges, so the wave
|
|
24
|
+
* serially executes the union of the opcodes its lanes want; and `vm_reg[dst]` / `vm_reg[s0]` index
|
|
25
|
+
* a VGPR-resident register file dynamically, which AMD reaches with `v_movrels`/`v_movreld` behind
|
|
26
|
+
* a waterfall loop whose trip count is the number of DISTINCT register indices live in the wave.
|
|
27
|
+
* Grouping the wave by program collapses both at once.
|
|
28
|
+
*
|
|
29
|
+
* ## Shape
|
|
30
|
+
*
|
|
31
|
+
* The same three-phase shape the depth sort uses, with two small passes added for the padding:
|
|
32
|
+
*
|
|
33
|
+
* reset -> histogram -> pad -> graph_prefix_scan_csdldf -> scatter -> fill
|
|
34
|
+
*
|
|
35
|
+
* 0. {@link shader_particle_bucket_reset} — write the `{count}` header the scan sizes itself from,
|
|
36
|
+
* clear the bins and the scatter cursors, and build the indirect args the next two passes are
|
|
37
|
+
* dispatched with (one thread per alive particle, from the GPU's own alive count).
|
|
38
|
+
* 1. {@link shader_particle_bucket_histogram} — per alive entry, look up the owning emitter's
|
|
39
|
+
* program id and bump that bin.
|
|
40
|
+
* 2. {@link shader_particle_bucket_pad} — round every bin up to a whole simulate workgroup, keeping
|
|
41
|
+
* the raw count aside. Rounding BEFORE the scan is what puts every bucket boundary on a wave
|
|
42
|
+
* boundary; rounding after would leave the offsets unpadded and each boundary back mid-wave.
|
|
43
|
+
* 3. `graph_prefix_scan_csdldf`, reused as-is — inclusive prefix sums of the padded bins, so every
|
|
44
|
+
* bucket's start offset is a multiple of the workgroup size.
|
|
45
|
+
* 4. {@link shader_particle_bucket_scatter} — per alive entry, exclusive offset plus an atomic rank
|
|
46
|
+
* within the bucket, then write the pool slot there.
|
|
47
|
+
* 5. {@link shader_particle_bucket_fill} — write the padding sentinel into the tail of each bucket
|
|
48
|
+
* and publish the padded total, which sizes next frame's simulate dispatch.
|
|
49
|
+
*
|
|
50
|
+
* ## Invariants this file rests on
|
|
51
|
+
*
|
|
52
|
+
* - **Indirection only.** Everything here permutes indices into `pool`. Records never move: slots
|
|
53
|
+
* are referenced by the dead (free) list and across frames, and relocating one would leave both
|
|
54
|
+
* pointing at the wrong particle.
|
|
55
|
+
* - **No CPU readback.** Only the bucket COUNT is host-known, and that is static topology (it
|
|
56
|
+
* changes when the emitter set does, not per frame). Every per-frame quantity — the alive count,
|
|
57
|
+
* the bin sizes, the padded total — is produced and consumed on the GPU.
|
|
58
|
+
* - **This is not the render order.** `../sort/` produces the camera-dependent back-to-front list
|
|
59
|
+
* the billboard draw consumes. Separate buffers, separate passes, separate counter slots.
|
|
60
|
+
*
|
|
61
|
+
* @see ./particle_program_buckets.js for the CPU statement of the same answer.
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
/** @type {number} words of `{count, elements}` header in front of the scan's bins */
|
|
65
|
+
const HEADER = PREFIX_SCAN_CSDLDF_HEADER_WORDS;
|
|
66
|
+
|
|
67
|
+
const WG = PARTICLE_SIMULATE_WORKGROUP_SIZE;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Mask that rounds a count down to a whole workgroup; `(n + WG - 1) & PAD_MASK` rounds up.
|
|
71
|
+
*
|
|
72
|
+
* A mask rather than `(n + WG - 1u) / WG * WG` because the WGSL emulator's `/` is float division —
|
|
73
|
+
* the divide form would read differently there than on a device, and the round-up is exactly the
|
|
74
|
+
* property the specs have to pin. Correct only because {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} is
|
|
75
|
+
* a power of two.
|
|
76
|
+
*
|
|
77
|
+
* @type {number}
|
|
78
|
+
*/
|
|
79
|
+
const PAD_MASK = (~(WG - 1)) >>> 0;
|
|
80
|
+
|
|
81
|
+
/** log2 of the workgroup size — the fill pass splits its thread id into (bucket, lane) with it. */
|
|
82
|
+
const WG_LOG = Math.log2(WG);
|
|
83
|
+
|
|
84
|
+
/** Constants every pass in this file interpolates. */
|
|
85
|
+
const COMMON = /* wgsl */ `
|
|
86
|
+
const BUCKET_HEADER_WORDS : u32 = ${HEADER}u;
|
|
87
|
+
const BUCKET_ALIGNMENT : u32 = ${WG}u;
|
|
88
|
+
const BUCKET_PAD_MASK : u32 = ${PAD_MASK}u;
|
|
89
|
+
const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
|
|
90
|
+
const COUNTER_SIM_PADDED : u32 = ${PARTICLE_COUNTER.SIM_PADDED}u;
|
|
91
|
+
`;
|
|
92
|
+
|
|
93
|
+
// --- 0. reset ---------------------------------------------------------------------------------
|
|
94
|
+
|
|
95
|
+
const reset_resources = new ShaderResourceSetDescriptor();
|
|
96
|
+
|
|
97
|
+
// per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
|
|
98
|
+
reset_resources.setImmediate("u_bucket_count", u32);
|
|
99
|
+
reset_resources.createGroup()
|
|
100
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true) // atomics need read_write even for atomicLoad
|
|
101
|
+
.addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
|
|
102
|
+
.addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
|
|
103
|
+
.addStorageBuffer("sim_dispatch_args", WebGPUArray.u32, true); // {x,y,z}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Per-frame reset, and the only place the bucketing decides how big it is.
|
|
107
|
+
*
|
|
108
|
+
* WebGPU zero-fills a buffer on CREATION only, so without this the scan would consume last frame's
|
|
109
|
+
* bins and the scatter would compound last frame's ranks.
|
|
110
|
+
*
|
|
111
|
+
* @type {ComputeShader}
|
|
112
|
+
*/
|
|
113
|
+
export const shader_particle_bucket_reset = ComputeShader.from({
|
|
114
|
+
label: "Particle Bucket Reset",
|
|
115
|
+
resources: reset_resources,
|
|
116
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
117
|
+
${COMMON}
|
|
118
|
+
|
|
119
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
120
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
121
|
+
let i = gid.x;
|
|
122
|
+
|
|
123
|
+
if (i == 0u) {
|
|
124
|
+
// The {count, elements} header the csdldf scan sizes itself from.
|
|
125
|
+
atomicStore(&histogram[0], u_bucket_count);
|
|
126
|
+
|
|
127
|
+
// One thread per alive particle for the histogram and the scatter. The alive count exists
|
|
128
|
+
// only on the GPU — the host's copy is a frame stale at best — so the dispatch that
|
|
129
|
+
// consumes it is built here rather than passed in.
|
|
130
|
+
let alive = atomicLoad(&counters[COUNTER_ALIVE]);
|
|
131
|
+
sim_dispatch_args[0] = (alive + BUCKET_ALIGNMENT - 1u) / BUCKET_ALIGNMENT;
|
|
132
|
+
sim_dispatch_args[1] = 1u;
|
|
133
|
+
sim_dispatch_args[2] = 1u;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Header padding: never read by the scan, but it shares the buffer and the pool may have left
|
|
137
|
+
// something in it.
|
|
138
|
+
if (i > 0u && i < BUCKET_HEADER_WORDS) {
|
|
139
|
+
atomicStore(&histogram[i], 0u);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// The scan reads whole vec4s, so the bins are cleared up to the vec4 the last one lands in.
|
|
143
|
+
if (i < ((u_bucket_count + 3u) & 0xfffffffcu)) {
|
|
144
|
+
atomicStore(&histogram[BUCKET_HEADER_WORDS + i], 0u);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (i < u_bucket_count) {
|
|
148
|
+
atomicStore(&cursor[i], 0u);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
`),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// --- 1. histogram -----------------------------------------------------------------------------
|
|
155
|
+
|
|
156
|
+
const histogram_resources = new ShaderResourceSetDescriptor();
|
|
157
|
+
|
|
158
|
+
histogram_resources.createGroup()
|
|
159
|
+
.addStorageBuffer("emitters", WebGPUArray.u32, false)
|
|
160
|
+
.addStorageBuffer("pool", WebGPUArray.u32, false)
|
|
161
|
+
.addStorageBuffer("alive", WebGPUArray.u32, false)
|
|
162
|
+
.addStorageBuffer("keys", WebGPUArray.u32, true)
|
|
163
|
+
.addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
|
|
164
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* One bin per PROGRAM, not per emitter: emitters compiled from the same graph share a program id
|
|
168
|
+
* (see {@link ../runtime/ProgramArena.js}) and belong in one wave-coherent run. Keying on the
|
|
169
|
+
* emitter index would split a run that was already coherent into one padded bucket per emitter.
|
|
170
|
+
*
|
|
171
|
+
* The emitter's program id is read by direct indexing rather than through
|
|
172
|
+
* `particle_emitter_read` — decoding a whole 41-word record, transform matrix included, to reach one
|
|
173
|
+
* word would be pure waste in a pass that touches every live particle.
|
|
174
|
+
*
|
|
175
|
+
* @type {ComputeShader}
|
|
176
|
+
*/
|
|
177
|
+
export const shader_particle_bucket_histogram = ComputeShader.from({
|
|
178
|
+
label: "Particle Bucket Histogram",
|
|
179
|
+
resources: histogram_resources,
|
|
180
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
181
|
+
${COMMON}
|
|
182
|
+
const PARTICLE_RECORD_WORDS : u32 = ${PARTICLE_RECORD_WORD_COUNT}u;
|
|
183
|
+
const PARTICLE_HEADER_EMITTER : u32 = ${PARTICLE_RECORD_HEADER_EMITTER}u;
|
|
184
|
+
const PARTICLE_EMITTER_RECORD_WORDS : u32 = ${EMITTER_STRIDE}u;
|
|
185
|
+
const EMITTER_WORD_PROGRAM_ID : u32 = ${EMITTER_FIELD.PROGRAM_ID}u;
|
|
186
|
+
|
|
187
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
188
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
189
|
+
let i = gid.x;
|
|
190
|
+
if (i >= atomicLoad(&counters[COUNTER_ALIVE])) { return; }
|
|
191
|
+
|
|
192
|
+
let slot = alive[i];
|
|
193
|
+
let emitter_index = pool[slot * PARTICLE_RECORD_WORDS + PARTICLE_HEADER_EMITTER];
|
|
194
|
+
let program = emitters[emitter_index * PARTICLE_EMITTER_RECORD_WORDS + EMITTER_WORD_PROGRAM_ID];
|
|
195
|
+
|
|
196
|
+
keys[i] = program;
|
|
197
|
+
atomicAdd(&histogram[BUCKET_HEADER_WORDS + program], 1u);
|
|
198
|
+
}
|
|
199
|
+
`),
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// --- 2. pad -----------------------------------------------------------------------------------
|
|
203
|
+
|
|
204
|
+
const pad_resources = new ShaderResourceSetDescriptor();
|
|
205
|
+
|
|
206
|
+
// per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
|
|
207
|
+
pad_resources.setImmediate("u_bucket_count", u32);
|
|
208
|
+
pad_resources.createGroup()
|
|
209
|
+
.addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
|
|
210
|
+
.addStorageBuffer("bucket_counts", WebGPUArray.u32, true);
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Round every bin up to a whole workgroup, keeping the raw count in `bucket_counts` for the fill
|
|
214
|
+
* pass (which needs to know where the real entries stop and the padding starts).
|
|
215
|
+
*
|
|
216
|
+
* This is THE step that makes the bucketing worth doing. Scanning the raw counts would put a
|
|
217
|
+
* bucket boundary at an arbitrary index, and the wave straddling it would span two programs again —
|
|
218
|
+
* the exact divergence the pass exists to remove. An empty bin rounds up to zero, so a program with
|
|
219
|
+
* no live particles costs no lanes and shifts nothing.
|
|
220
|
+
*
|
|
221
|
+
* @type {ComputeShader}
|
|
222
|
+
*/
|
|
223
|
+
export const shader_particle_bucket_pad = ComputeShader.from({
|
|
224
|
+
label: "Particle Bucket Pad",
|
|
225
|
+
resources: pad_resources,
|
|
226
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
227
|
+
${COMMON}
|
|
228
|
+
|
|
229
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
230
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
231
|
+
let b = gid.x;
|
|
232
|
+
if (b >= u_bucket_count) { return; }
|
|
233
|
+
|
|
234
|
+
let raw = atomicLoad(&histogram[BUCKET_HEADER_WORDS + b]);
|
|
235
|
+
|
|
236
|
+
bucket_counts[b] = raw;
|
|
237
|
+
atomicStore(&histogram[BUCKET_HEADER_WORDS + b], (raw + BUCKET_ALIGNMENT - 1u) & BUCKET_PAD_MASK);
|
|
238
|
+
}
|
|
239
|
+
`),
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// --- 3. (graph_prefix_scan_csdldf) ------------------------------------------------------------
|
|
243
|
+
// --- 4. scatter -------------------------------------------------------------------------------
|
|
244
|
+
|
|
245
|
+
const scatter_resources = new ShaderResourceSetDescriptor();
|
|
246
|
+
|
|
247
|
+
scatter_resources.createGroup()
|
|
248
|
+
.addStorageBuffer("keys", WebGPUArray.u32, false)
|
|
249
|
+
.addStorageBuffer("alive", WebGPUArray.u32, false)
|
|
250
|
+
.addStorageBuffer("scanned", WebGPUArray.u32, false)
|
|
251
|
+
.addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
|
|
252
|
+
.addStorageBuffer("sim_list", WebGPUArray.u32, true)
|
|
253
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Place each alive entry's pool slot at its bucket's exclusive offset plus an atomic rank.
|
|
257
|
+
*
|
|
258
|
+
* Order within a bucket is therefore arbitrary, which is exactly as much order as the simulation
|
|
259
|
+
* needs: every lane in the bucket runs the same program, so which of them runs where changes
|
|
260
|
+
* nothing.
|
|
261
|
+
*
|
|
262
|
+
* @type {ComputeShader}
|
|
263
|
+
*/
|
|
264
|
+
export const shader_particle_bucket_scatter = ComputeShader.from({
|
|
265
|
+
label: "Particle Bucket Scatter",
|
|
266
|
+
resources: scatter_resources,
|
|
267
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
268
|
+
${COMMON}
|
|
269
|
+
|
|
270
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
271
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
272
|
+
let i = gid.x;
|
|
273
|
+
if (i >= atomicLoad(&counters[COUNTER_ALIVE])) { return; }
|
|
274
|
+
|
|
275
|
+
let bucket = keys[i];
|
|
276
|
+
|
|
277
|
+
// The scan is inclusive, so bucket b's exclusive offset is bucket b-1's inclusive value, one
|
|
278
|
+
// word earlier. For bucket 0 the index lands on the last header word — in bounds, and unused,
|
|
279
|
+
// because select() takes the 0 branch there.
|
|
280
|
+
let exclusive = select(0u, scanned[BUCKET_HEADER_WORDS + bucket - 1u], bucket > 0u);
|
|
281
|
+
let rank = atomicAdd(&cursor[bucket], 1u);
|
|
282
|
+
|
|
283
|
+
sim_list[exclusive + rank] = alive[i];
|
|
284
|
+
}
|
|
285
|
+
`),
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// --- 5. fill ----------------------------------------------------------------------------------
|
|
289
|
+
|
|
290
|
+
const fill_resources = new ShaderResourceSetDescriptor();
|
|
291
|
+
|
|
292
|
+
// per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
|
|
293
|
+
fill_resources.setImmediate("u_bucket_count", u32);
|
|
294
|
+
fill_resources.createGroup()
|
|
295
|
+
.addStorageBuffer("bucket_counts", WebGPUArray.u32, false)
|
|
296
|
+
.addStorageBuffer("scanned", WebGPUArray.u32, false)
|
|
297
|
+
.addStorageBuffer("sim_list", WebGPUArray.u32, true)
|
|
298
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Stamp the padding sentinel into the tail of every bucket, and publish the padded total.
|
|
302
|
+
*
|
|
303
|
+
* Dispatched over one workgroup per bucket — a bucket's padding is at most `BUCKET_ALIGNMENT - 1`
|
|
304
|
+
* entries, so a workgroup always covers it. It cannot ride along with the scatter, which has no
|
|
305
|
+
* thread at all for a bucket whose particles all died.
|
|
306
|
+
*
|
|
307
|
+
* The padded total is the last bucket's inclusive scan value. It, and not the alive count, is what
|
|
308
|
+
* sizes next frame's simulate dispatch — the build-indirect pass reads it out of
|
|
309
|
+
* {@link PARTICLE_COUNTER.SIM_PADDED}.
|
|
310
|
+
*
|
|
311
|
+
* @type {ComputeShader}
|
|
312
|
+
*/
|
|
313
|
+
export const shader_particle_bucket_fill = ComputeShader.from({
|
|
314
|
+
label: "Particle Bucket Fill",
|
|
315
|
+
resources: fill_resources,
|
|
316
|
+
body: CodeChunk.from(/* wgsl */ `
|
|
317
|
+
${COMMON}
|
|
318
|
+
const PARTICLE_SIM_PAD_SLOT : u32 = ${PARTICLE_SIM_PAD_SLOT}u;
|
|
319
|
+
|
|
320
|
+
@compute @workgroup_size(${WG}, 1, 1)
|
|
321
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
322
|
+
// One workgroup per bucket. Shift and mask rather than / and %: the emulator's / is float
|
|
323
|
+
// division, and BUCKET_ALIGNMENT is a power of two anyway.
|
|
324
|
+
let bucket = gid.x >> ${WG_LOG}u;
|
|
325
|
+
let lane = gid.x & (BUCKET_ALIGNMENT - 1u);
|
|
326
|
+
|
|
327
|
+
if (gid.x == 0u) {
|
|
328
|
+
// Inclusive scan, so the last bucket's value is the whole padded length.
|
|
329
|
+
atomicStore(&counters[COUNTER_SIM_PADDED], scanned[BUCKET_HEADER_WORDS + u_bucket_count - 1u]);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if (bucket >= u_bucket_count) { return; }
|
|
333
|
+
|
|
334
|
+
let raw = bucket_counts[bucket];
|
|
335
|
+
let padded = (raw + BUCKET_ALIGNMENT - 1u) & BUCKET_PAD_MASK;
|
|
336
|
+
// The scan is inclusive, so subtracting this bucket's own (padded) size gives its start.
|
|
337
|
+
let start = scanned[BUCKET_HEADER_WORDS + bucket] - padded;
|
|
338
|
+
|
|
339
|
+
if (lane < padded - raw) {
|
|
340
|
+
sim_list[start + raw + lane] = PARTICLE_SIM_PAD_SLOT;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
`),
|
|
344
|
+
});
|
|
@@ -10,15 +10,37 @@ export const PARTICLE_COUNTER: Readonly<{
|
|
|
10
10
|
DEAD: 1;
|
|
11
11
|
/** number of particles requested to spawn this frame */
|
|
12
12
|
SPAWN: 2;
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Length of the depth-sorted index list — the RENDER order (`../sort/`), back-to-front by view
|
|
15
|
+
* depth so premultiplied transparency composites correctly. Belongs to the camera-dependent
|
|
16
|
+
* ordering and to nothing else; the simulation order has its own slot, {@link SIM_PADDED}.
|
|
17
|
+
* Sharing one slot between the two would silently couple a camera-driven ordering to a
|
|
18
|
+
* program-driven one.
|
|
19
|
+
*/
|
|
14
20
|
SORTED: 3;
|
|
15
21
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
22
|
+
* The exact length of the index list the simulate pass consumes this frame — the padded,
|
|
23
|
+
* program-coherent list the coherence pass built at the end of last frame, so this is
|
|
24
|
+
* {@link SIM_PADDED}'s value from then, NOT the alive count (padding makes it larger, and a
|
|
25
|
+
* multiple of the simulate workgroup size).
|
|
26
|
+
*
|
|
27
|
+
* Written by the build-indirect pass at the end of each frame, from the same value it derives
|
|
28
|
+
* the indirect dispatch args from — which is what makes the dispatch's thread count and the
|
|
29
|
+
* shader's bound agree by construction. NOT zeroed by the reset pass, so the loop stays fully
|
|
30
|
+
* GPU-driven (no CPU readback can be trusted for dispatch sizing: a stale count orphans or
|
|
31
|
+
* double-simulates slots).
|
|
20
32
|
*/
|
|
21
33
|
ALIVE_IN: 4;
|
|
34
|
+
/**
|
|
35
|
+
* Length of the padded, program-coherent simulate input list the coherence pass (`../coherence/`)
|
|
36
|
+
* produced this frame — the SIMULATION order. Camera-independent; it changes only when the
|
|
37
|
+
* emitter/program set does. Read by the build-indirect pass, which turns it into next frame's
|
|
38
|
+
* {@link ALIVE_IN} and dispatch args.
|
|
39
|
+
*
|
|
40
|
+
* Zeroed by the reset pass: if the coherence passes are ever left out of a frame, simulate then
|
|
41
|
+
* reads a length of zero and does nothing, rather than re-running last frame's stale list.
|
|
42
|
+
*/
|
|
43
|
+
SIM_PADDED: 5;
|
|
22
44
|
}>;
|
|
23
45
|
/** Number of `u32` atomic slots in the counters buffer. */
|
|
24
46
|
export const PARTICLE_COUNTER_COUNT: 8;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PARTICLE_COUNTERS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_COUNTERS.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACI,mDAAmD;;IAEnD,qCAAqC;;IAErC,wDAAwD;;IAExD
|
|
1
|
+
{"version":3,"file":"PARTICLE_COUNTERS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_COUNTERS.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACI,mDAAmD;;IAEnD,qCAAqC;;IAErC,wDAAwD;;IAExD;;;;;;OAMG;;IAEH;;;;;;;;;;;OAWG;;IAEH;;;;;;;;OAQG;;GAEJ;AAEH,2DAA2D;AAC3D,uCAAwC;AAExC;;;GAGG;AACH,0CAFU,YAAY,CAQG;6BA5DI,mCAAmC"}
|
|
@@ -13,15 +13,37 @@ export const PARTICLE_COUNTER = Object.freeze({
|
|
|
13
13
|
DEAD: 1,
|
|
14
14
|
/** number of particles requested to spawn this frame */
|
|
15
15
|
SPAWN: 2,
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Length of the depth-sorted index list — the RENDER order (`../sort/`), back-to-front by view
|
|
18
|
+
* depth so premultiplied transparency composites correctly. Belongs to the camera-dependent
|
|
19
|
+
* ordering and to nothing else; the simulation order has its own slot, {@link SIM_PADDED}.
|
|
20
|
+
* Sharing one slot between the two would silently couple a camera-driven ordering to a
|
|
21
|
+
* program-driven one.
|
|
22
|
+
*/
|
|
17
23
|
SORTED: 3,
|
|
18
24
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
25
|
+
* The exact length of the index list the simulate pass consumes this frame — the padded,
|
|
26
|
+
* program-coherent list the coherence pass built at the end of last frame, so this is
|
|
27
|
+
* {@link SIM_PADDED}'s value from then, NOT the alive count (padding makes it larger, and a
|
|
28
|
+
* multiple of the simulate workgroup size).
|
|
29
|
+
*
|
|
30
|
+
* Written by the build-indirect pass at the end of each frame, from the same value it derives
|
|
31
|
+
* the indirect dispatch args from — which is what makes the dispatch's thread count and the
|
|
32
|
+
* shader's bound agree by construction. NOT zeroed by the reset pass, so the loop stays fully
|
|
33
|
+
* GPU-driven (no CPU readback can be trusted for dispatch sizing: a stale count orphans or
|
|
34
|
+
* double-simulates slots).
|
|
23
35
|
*/
|
|
24
36
|
ALIVE_IN: 4,
|
|
37
|
+
/**
|
|
38
|
+
* Length of the padded, program-coherent simulate input list the coherence pass (`../coherence/`)
|
|
39
|
+
* produced this frame — the SIMULATION order. Camera-independent; it changes only when the
|
|
40
|
+
* emitter/program set does. Read by the build-indirect pass, which turns it into next frame's
|
|
41
|
+
* {@link ALIVE_IN} and dispatch args.
|
|
42
|
+
*
|
|
43
|
+
* Zeroed by the reset pass: if the coherence passes are ever left out of a frame, simulate then
|
|
44
|
+
* reads a length of zero and does nothing, rather than re-running last frame's stale list.
|
|
45
|
+
*/
|
|
46
|
+
SIM_PADDED: 5,
|
|
25
47
|
});
|
|
26
48
|
|
|
27
49
|
/** Number of `u32` atomic slots in the counters buffer. */
|
|
@@ -42,6 +42,7 @@ export function emitter_flags_projection(flags: number): number;
|
|
|
42
42
|
* @param {object} [def.render] { position, size, color, rotation, frame } attribute word offsets
|
|
43
43
|
* @param {number[]} [def.atlas_region] length-4 [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
|
|
44
44
|
* @param {number[]} [def.flipbook] length-2 [cols, rows]
|
|
45
|
+
* @param {number} [def.program_id] dense program id, the simulation-order bucket key
|
|
45
46
|
*/
|
|
46
47
|
export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number, def: {
|
|
47
48
|
spawn_offset: number;
|
|
@@ -58,6 +59,7 @@ export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number,
|
|
|
58
59
|
render?: object;
|
|
59
60
|
atlas_region?: number[];
|
|
60
61
|
flipbook?: number[];
|
|
62
|
+
program_id?: number;
|
|
61
63
|
}): void;
|
|
62
64
|
/**
|
|
63
65
|
* Overwrite just an emitter's world transform in a packed buffer.
|
|
@@ -104,9 +106,19 @@ export const EMITTER_FIELD: Readonly<{
|
|
|
104
106
|
ATLAS_REGION: 33;
|
|
105
107
|
FLIPBOOK: 37;
|
|
106
108
|
RENDER_VELOCITY: 39;
|
|
109
|
+
/**
|
|
110
|
+
* u32 — dense id of the compiled program this emitter runs, assigned by
|
|
111
|
+
* {@link ../runtime/ProgramArena.js}. Emitters sharing a program share an id.
|
|
112
|
+
*
|
|
113
|
+
* The simulation-order bucketing (`coherence/`) histograms on this: it needs a small dense
|
|
114
|
+
* integer to index a bin with, which neither the emitter index (one bucket per emitter, even
|
|
115
|
+
* when they run the same code) nor `UPDATE_OFFSET` (an arena word offset, arbitrarily large
|
|
116
|
+
* and sparse) gives it.
|
|
117
|
+
*/
|
|
118
|
+
PROGRAM_ID: 40;
|
|
107
119
|
}>;
|
|
108
120
|
/** Number of `u32` words per emitter record. */
|
|
109
|
-
export const EMITTER_STRIDE:
|
|
121
|
+
export const EMITTER_STRIDE: 41;
|
|
110
122
|
/** Sentinel for an absent render-attribute binding. */
|
|
111
123
|
export const EMITTER_ATTRIBUTE_ABSENT: 4294967295;
|
|
112
124
|
/** Sentinel for "not attached to a scene node". */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"AA4FA;;;;;;;;;;GAUG;AACH;IAR6B,QAAQ,GAA1B,OAAO;IACW,UAAU,GAA5B,OAAO;IACW,IAAI,GAAtB,OAAO;IACW,IAAI,GAAtB,OAAO;IACU,KAAK,GAAtB,MAAM;IACW,UAAU,GAA3B,MAAM;IACJ,MAAM,CAWlB;AAED,6DAA6D;AAC7D,2CADY,MAAM,GAAkB,MAAM,CAGzC;AAED,kEAAkE;AAClE,gDADY,MAAM,GAAkB,MAAM,CAGzC;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,kCApBW,WAAW,OACX,YAAY,SACZ,MAAM;IAEM,YAAY,EAAxB,MAAM;IACM,WAAW,EAAvB,MAAM;IACM,aAAa,EAAzB,MAAM;IACM,YAAY,EAAxB,MAAM;IACM,eAAe,EAA3B,MAAM;IACM,IAAI,EAAhB,MAAM;IACM,KAAK,EAAjB,MAAM;IACM,UAAU,EAAtB,MAAM;IACQ,SAAS,EAAvB,MAAM,EAAE;IACO,aAAa,GAA5B,MAAM,EAAE;IACK,aAAa,GAA1B,MAAM;IACO,MAAM,GAAnB,MAAM;IACS,YAAY,GAA3B,MAAM,EAAE;IACO,QAAQ,GAAvB,MAAM,EAAE;IACK,UAAU,GAAvB,MAAM;SA0ChB;AAED;;;;;;;;;;;GAWG;AACH,6CAJW,YAAY,SACZ,MAAM,UACN,UAAU,MAAM,CAAC,QAO3B;AAnND;;;;;;;;;;GAUG;AAEH,6CAA6C;AAC7C;;;;;;;;;;;;;;;;;;;;IA0BI;;;;;;;;OAQG;;GAEJ;AAEH,gDAAgD;AAChD,gCAAiC;AAEjC,uDAAuD;AACvD,kDAAmD;AAEnD,mDAAmD;AACnD,6CAA8C;AAE9C;;GAEG;AACH;;;;;GAKG;AAEH,kGAAkG;AAClG;;;;GAIG;AAKH,kEAAkE;AAClE;;;;;;GAMG;AAqCH,uEAAuE;AACvE;;;;;GAEG"}
|
|
@@ -36,10 +36,21 @@ export const EMITTER_FIELD = Object.freeze({
|
|
|
36
36
|
FLIPBOOK: 37, // vec2<f32> — grid columns, rows (37..38)
|
|
37
37
|
|
|
38
38
|
RENDER_VELOCITY: 39, // u32 — attribute word offset of velocity (STRETCHED projection; or ABSENT)
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* u32 — dense id of the compiled program this emitter runs, assigned by
|
|
42
|
+
* {@link ../runtime/ProgramArena.js}. Emitters sharing a program share an id.
|
|
43
|
+
*
|
|
44
|
+
* The simulation-order bucketing (`coherence/`) histograms on this: it needs a small dense
|
|
45
|
+
* integer to index a bin with, which neither the emitter index (one bucket per emitter, even
|
|
46
|
+
* when they run the same code) nor `UPDATE_OFFSET` (an arena word offset, arbitrarily large
|
|
47
|
+
* and sparse) gives it.
|
|
48
|
+
*/
|
|
49
|
+
PROGRAM_ID: 40,
|
|
39
50
|
});
|
|
40
51
|
|
|
41
52
|
/** Number of `u32` words per emitter record. */
|
|
42
|
-
export const EMITTER_STRIDE =
|
|
53
|
+
export const EMITTER_STRIDE = 41;
|
|
43
54
|
|
|
44
55
|
/** Sentinel for an absent render-attribute binding. */
|
|
45
56
|
export const EMITTER_ATTRIBUTE_ABSENT = 0xffffffff;
|
|
@@ -137,6 +148,7 @@ export const EMITTER_FLAG_ENCODING = Object.freeze({
|
|
|
137
148
|
* @param {object} [def.render] { position, size, color, rotation, frame } attribute word offsets
|
|
138
149
|
* @param {number[]} [def.atlas_region] length-4 [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
|
|
139
150
|
* @param {number[]} [def.flipbook] length-2 [cols, rows]
|
|
151
|
+
* @param {number} [def.program_id] dense program id, the simulation-order bucket key
|
|
140
152
|
*/
|
|
141
153
|
export function pack_emitter(u32, f32, index, def) {
|
|
142
154
|
const base = index * EMITTER_STRIDE;
|
|
@@ -176,6 +188,8 @@ export function pack_emitter(u32, f32, index, def) {
|
|
|
176
188
|
const flipbook = def.flipbook ?? [1, 1];
|
|
177
189
|
f32[base + EMITTER_FIELD.FLIPBOOK] = flipbook[0];
|
|
178
190
|
f32[base + EMITTER_FIELD.FLIPBOOK + 1] = flipbook[1];
|
|
191
|
+
|
|
192
|
+
u32[base + EMITTER_FIELD.PROGRAM_ID] = (def.program_id ?? 0) >>> 0;
|
|
179
193
|
}
|
|
180
194
|
|
|
181
195
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_particle_emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/chunk_particle_emitter.js"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,qCAFU,SAAS,
|
|
1
|
+
{"version":3,"file":"chunk_particle_emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/chunk_particle_emitter.js"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,qCAFU,SAAS,CAuEhB;0BApFuB,oCAAoC"}
|
|
@@ -40,6 +40,7 @@ struct ParticleEmitter {
|
|
|
40
40
|
render_velocity : u32,
|
|
41
41
|
atlas_region : vec4<f32>,
|
|
42
42
|
flipbook : vec2<f32>,
|
|
43
|
+
program_id : u32,
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
fn particle_emitter_read(e : ptr<storage, array<u32>, read>, index : u32) -> ParticleEmitter {
|
|
@@ -74,6 +75,8 @@ fn particle_emitter_read(e : ptr<storage, array<u32>, read>, index : u32) -> Par
|
|
|
74
75
|
|
|
75
76
|
r.atlas_region = vec4<f32>(bitcast<f32>((*e)[b + ${F.ATLAS_REGION}u]), bitcast<f32>((*e)[b + ${F.ATLAS_REGION + 1}u]), bitcast<f32>((*e)[b + ${F.ATLAS_REGION + 2}u]), bitcast<f32>((*e)[b + ${F.ATLAS_REGION + 3}u]));
|
|
76
77
|
r.flipbook = vec2<f32>(bitcast<f32>((*e)[b + ${F.FLIPBOOK}u]), bitcast<f32>((*e)[b + ${F.FLIPBOOK + 1}u]));
|
|
78
|
+
|
|
79
|
+
r.program_id = (*e)[b + ${F.PROGRAM_ID}u];
|
|
77
80
|
return r;
|
|
78
81
|
}
|
|
79
82
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A particle node type: a {@link NodeDescription} that additionally knows how to lower an instance
|
|
3
|
+
* of itself into VM instructions.
|
|
4
|
+
*
|
|
5
|
+
* Ports carry all the structure the compiler needs — input ports name the operands, the presence of
|
|
6
|
+
* an output port says whether the node produces a value — so nothing about the graph's shape is
|
|
7
|
+
* duplicated outside the description.
|
|
8
|
+
*/
|
|
9
|
+
export class ParticleNodeDescription extends NodeDescription {
|
|
10
|
+
/**
|
|
11
|
+
* Lower one instance of this node into the target instruction stream.
|
|
12
|
+
*
|
|
13
|
+
* `context` provides:
|
|
14
|
+
* - `context.in(port_name)` → the register holding that input's value (resolved by the compiler),
|
|
15
|
+
* - `context.out` → the output register (value-producing nodes only, `undefined` for sinks),
|
|
16
|
+
* - `context.parameters` → the {@link NodeInstance}'s parameters,
|
|
17
|
+
* - `context.layout` → the {@link ../layout/ParticleLayout.js} for attribute offsets,
|
|
18
|
+
* - `context.asm` → the {@link ../isa/ParticleAssembler.js} for interning constants.
|
|
19
|
+
*
|
|
20
|
+
* @type {function(InstructionStream, {in: function(string):number, out: number|undefined, parameters: object, layout: ParticleLayout, asm: ParticleAssembler}):void}
|
|
21
|
+
*/
|
|
22
|
+
emit: (arg0: InstructionStream, arg1: {
|
|
23
|
+
in: (arg0: string) => number;
|
|
24
|
+
out: number | undefined;
|
|
25
|
+
parameters: object;
|
|
26
|
+
layout: ParticleLayout;
|
|
27
|
+
asm: ParticleAssembler;
|
|
28
|
+
}) => void;
|
|
29
|
+
/**
|
|
30
|
+
* A node with no output ports produces no value, so nothing can consume it; the only reason to
|
|
31
|
+
* emit it is its side effect (an attribute write, a kill). Such nodes are the roots the compiler
|
|
32
|
+
* traverses from.
|
|
33
|
+
* @returns {boolean}
|
|
34
|
+
*/
|
|
35
|
+
get is_sink(): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* @readonly
|
|
38
|
+
* @type {boolean}
|
|
39
|
+
*/
|
|
40
|
+
readonly isParticleNodeDescription: boolean;
|
|
41
|
+
}
|
|
42
|
+
import { NodeDescription } from "../../../../core/model/node-graph/node/NodeDescription.js";
|
|
43
|
+
//# sourceMappingURL=ParticleNodeDescription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParticleNodeDescription.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/graph/ParticleNodeDescription.js"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH;IAEI;;;;;;;;;;;OAWG;IACH,sCAFsC;QAAC,EAAE,SAAW,MAAM,KAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,GAAC,SAAS,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,iBAAiB;QAAC,GAAG,oBAAmB;KAAC,KAAE,IAAI,CAExJ;IAEZ;;;;;OAKG;IACH,uBAEC;IAGL;;;OAGG;IACH,oCAFU,OAAO,CAE0C;CAN1D;gCApC+B,2DAA2D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { noop } from "../../../../core/function/noop.js";
|
|
2
|
+
import { NodeDescription } from "../../../../core/model/node-graph/node/NodeDescription.js";
|
|
3
|
+
import { PortDirection } from "../../../../core/model/node-graph/node/PortDirection.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A particle node type: a {@link NodeDescription} that additionally knows how to lower an instance
|
|
7
|
+
* of itself into VM instructions.
|
|
8
|
+
*
|
|
9
|
+
* Ports carry all the structure the compiler needs — input ports name the operands, the presence of
|
|
10
|
+
* an output port says whether the node produces a value — so nothing about the graph's shape is
|
|
11
|
+
* duplicated outside the description.
|
|
12
|
+
*/
|
|
13
|
+
export class ParticleNodeDescription extends NodeDescription {
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Lower one instance of this node into the target instruction stream.
|
|
17
|
+
*
|
|
18
|
+
* `context` provides:
|
|
19
|
+
* - `context.in(port_name)` → the register holding that input's value (resolved by the compiler),
|
|
20
|
+
* - `context.out` → the output register (value-producing nodes only, `undefined` for sinks),
|
|
21
|
+
* - `context.parameters` → the {@link NodeInstance}'s parameters,
|
|
22
|
+
* - `context.layout` → the {@link ../layout/ParticleLayout.js} for attribute offsets,
|
|
23
|
+
* - `context.asm` → the {@link ../isa/ParticleAssembler.js} for interning constants.
|
|
24
|
+
*
|
|
25
|
+
* @type {function(InstructionStream, {in: function(string):number, out: number|undefined, parameters: object, layout: ParticleLayout, asm: ParticleAssembler}):void}
|
|
26
|
+
*/
|
|
27
|
+
emit = noop;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A node with no output ports produces no value, so nothing can consume it; the only reason to
|
|
31
|
+
* emit it is its side effect (an attribute write, a kill). Such nodes are the roots the compiler
|
|
32
|
+
* traverses from.
|
|
33
|
+
* @returns {boolean}
|
|
34
|
+
*/
|
|
35
|
+
get is_sink() {
|
|
36
|
+
return !this.hasPortsByDirection(PortDirection.Out);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @readonly
|
|
42
|
+
* @type {boolean}
|
|
43
|
+
*/
|
|
44
|
+
ParticleNodeDescription.prototype.isParticleNodeDescription = true;
|