@woosh/meep-engine 3.14.5 → 3.14.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/editor/Editor.d.ts +162 -0
- package/editor/Editor.d.ts.map +1 -0
- package/editor/EditorCameraNavigation.d.ts +22 -0
- package/editor/EditorCameraNavigation.d.ts.map +1 -0
- package/editor/EditorKeyMap.d.ts +28 -0
- package/editor/EditorKeyMap.d.ts.map +1 -0
- package/editor/SelectionVisualizer.d.ts +37 -0
- package/editor/SelectionVisualizer.d.ts.map +1 -0
- package/editor/actions/concrete/ActionInvalidateSampler.d.ts +18 -0
- package/editor/actions/concrete/ActionInvalidateSampler.d.ts.map +1 -0
- package/editor/actions/concrete/ActionUpdateTexture.d.ts +12 -0
- package/editor/actions/concrete/ActionUpdateTexture.d.ts.map +1 -0
- package/editor/actions/concrete/ActionUpdateTexture.js +1 -1
- package/editor/actions/concrete/ArrayCopyAction.d.ts +20 -0
- package/editor/actions/concrete/ArrayCopyAction.d.ts.map +1 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts +15 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts +11 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts +18 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts +11 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts +47 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts.map +1 -0
- package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts +38 -0
- package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts.map +1 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts +23 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts.map +1 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +32 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionAddAction.d.ts +19 -0
- package/editor/actions/concrete/SelectionAddAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionClearAction.d.ts +9 -0
- package/editor/actions/concrete/SelectionClearAction.d.ts.map +1 -0
- package/editor/actions/concrete/SelectionRemoveAction.d.ts +10 -0
- package/editor/actions/concrete/SelectionRemoveAction.d.ts.map +1 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts +17 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -0
- package/editor/actions/concrete/WriteGridValueAction.d.ts +14 -0
- package/editor/actions/concrete/WriteGridValueAction.d.ts.map +1 -0
- package/editor/camera/camera_framing.d.ts +33 -0
- package/editor/camera/camera_framing.d.ts.map +1 -0
- package/editor/clipboard.d.ts +19 -0
- package/editor/clipboard.d.ts.map +1 -0
- package/editor/ecs/EditorEntity.d.ts +16 -0
- package/editor/ecs/EditorEntity.d.ts.map +1 -0
- package/editor/ecs/EditorEntitySystem.d.ts +8 -0
- package/editor/ecs/EditorEntitySystem.d.ts.map +1 -0
- package/editor/ecs/component/TypeEditor.d.ts +7 -1
- package/editor/ecs/component/TypeEditor.d.ts.map +1 -1
- package/editor/ecs/component/TypeEditor.js +5 -0
- package/editor/ecs/component/editors/ColorEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ColorEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/HTMLElementEditor.d.ts +7 -0
- package/editor/ecs/component/editors/HTMLElementEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ImagePathEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ImagePathEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/LargeStringEditor.d.ts +16 -0
- package/editor/ecs/component/editors/LargeStringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.d.ts +7 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ObservedStringEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ObservedStringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/Sampler2DEditor.d.ts +7 -0
- package/editor/ecs/component/editors/Sampler2DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/collection/ListEditor.d.ts +8 -0
- package/editor/ecs/component/editors/collection/ListEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts +12 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/EnumEditor.d.ts +8 -0
- package/editor/ecs/component/editors/common/EnumEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/makeV3_editor.d.ts +15 -0
- package/editor/ecs/component/editors/common/makeV3_editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/noEditor.d.ts +3 -0
- package/editor/ecs/component/editors/common/noEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/common/two_way_sync.d.ts +22 -0
- package/editor/ecs/component/editors/common/two_way_sync.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts +7 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts +14 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts +12 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts +14 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts +52 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts +47 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts +21 -0
- package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts +26 -0
- package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts +16 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts +15 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +42 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts +8 -0
- package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts +19 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts +27 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts +16 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts +19 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts +18 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.d.ts +7 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.d.ts +6 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts +8 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.d.ts +8 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/primitive/StringEditor.d.ts +7 -0
- package/editor/ecs/component/editors/primitive/StringEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts +28 -0
- package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts +29 -0
- package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts +28 -0
- package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts +41 -0
- package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts.map +1 -0
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts +31 -0
- package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts.map +1 -0
- package/editor/ecs/component/prototypeObjectEditor.d.ts +2 -0
- package/editor/ecs/component/prototypeObjectEditor.d.ts.map +1 -0
- package/editor/ecs/component/registerBasicTypeEditors.d.ts +11 -0
- package/editor/ecs/component/registerBasicTypeEditors.d.ts.map +1 -0
- package/editor/ecs/component/registerEngineComponentEditors.d.ts +8 -0
- package/editor/ecs/component/registerEngineComponentEditors.d.ts.map +1 -0
- package/editor/enableEditor.d.ts +14 -0
- package/editor/enableEditor.d.ts.map +1 -0
- package/editor/entity_world_bounds.d.ts +17 -0
- package/editor/entity_world_bounds.d.ts.map +1 -0
- package/editor/library/MeshLibrary.d.ts +13 -0
- package/editor/library/MeshLibrary.d.ts.map +1 -0
- package/editor/particles/lut_ops.d.ts +34 -0
- package/editor/particles/lut_ops.d.ts.map +1 -0
- package/editor/particles/particleEditEvents.d.ts +11 -0
- package/editor/particles/particleEditEvents.d.ts.map +1 -0
- package/editor/particles/rebuildParticleEmitter.d.ts +11 -0
- package/editor/particles/rebuildParticleEmitter.d.ts.map +1 -0
- package/editor/persistence/EditorLayoutStore.d.ts +30 -0
- package/editor/persistence/EditorLayoutStore.d.ts.map +1 -0
- package/editor/persistence/SceneMetadata.d.ts +38 -0
- package/editor/persistence/SceneMetadata.d.ts.map +1 -0
- package/editor/persistence/SceneSlotManager.d.ts +40 -0
- package/editor/persistence/SceneSlotManager.d.ts.map +1 -0
- package/editor/persistence/buildNewSceneDataset.d.ts +10 -0
- package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -0
- package/editor/persistence/files.d.ts +24 -0
- package/editor/persistence/files.d.ts.map +1 -0
- package/editor/persistence/scene_import.d.ts +45 -0
- package/editor/persistence/scene_import.d.ts.map +1 -0
- package/editor/persistence/scene_serialization.d.ts +36 -0
- package/editor/persistence/scene_serialization.d.ts.map +1 -0
- package/editor/persistence/string_buffer_codec.d.ts +20 -0
- package/editor/persistence/string_buffer_codec.d.ts.map +1 -0
- package/editor/process/DisableGameUIProcess.d.ts +8 -0
- package/editor/process/DisableGameUIProcess.d.ts.map +1 -0
- package/editor/process/EditorProcess.d.ts +19 -0
- package/editor/process/EditorProcess.d.ts.map +1 -0
- package/editor/process/GridDisplayProcess.d.ts +35 -0
- package/editor/process/GridDisplayProcess.d.ts.map +1 -0
- package/editor/process/ObstacleGridDisplayProcess.d.ts +13 -0
- package/editor/process/ObstacleGridDisplayProcess.d.ts.map +1 -0
- package/editor/process/ParticleEmitterRebuildProcess.d.ts +66 -0
- package/editor/process/ParticleEmitterRebuildProcess.d.ts.map +1 -0
- package/editor/process/ProcessEngine.d.ts +30 -0
- package/editor/process/ProcessEngine.d.ts.map +1 -0
- package/editor/process/SymbolicDisplayProcess.d.ts +23 -0
- package/editor/process/SymbolicDisplayProcess.d.ts.map +1 -0
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts +17 -0
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/CameraSymbolicDisplay.d.ts +25 -0
- package/editor/process/symbolic/CameraSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts +19 -0
- package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/LightSymbolicDisplay.d.ts +19 -0
- package/editor/process/symbolic/LightSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts +18 -0
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/PathSymbolicDisplay.d.ts +20 -0
- package/editor/process/symbolic/PathSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts +25 -0
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/SymbolicDisplay.d.ts +48 -0
- package/editor/process/symbolic/SymbolicDisplay.d.ts.map +1 -0
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts +13 -0
- package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts.map +1 -0
- package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts +18 -0
- package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts.map +1 -0
- package/editor/prototypeEditorShell.d.ts +13 -0
- package/editor/prototypeEditorShell.d.ts.map +1 -0
- package/editor/selection/editor_pick.d.ts +43 -0
- package/editor/selection/editor_pick.d.ts.map +1 -0
- package/editor/selection/screen_rect_frustum.d.ts +32 -0
- package/editor/selection/screen_rect_frustum.d.ts.map +1 -0
- package/editor/templates/entity_templates.d.ts +19 -0
- package/editor/templates/entity_templates.d.ts.map +1 -0
- package/editor/tools/GridPaintTool.d.ts +18 -0
- package/editor/tools/GridPaintTool.d.ts.map +1 -0
- package/editor/tools/SelectionTool.d.ts +38 -0
- package/editor/tools/SelectionTool.d.ts.map +1 -0
- package/editor/tools/SelectionTool.js +2 -2
- package/editor/tools/TransformToolV2.d.ts +70 -0
- package/editor/tools/TransformToolV2.d.ts.map +1 -0
- package/editor/tools/engine/Tool.d.ts +88 -0
- package/editor/tools/engine/Tool.d.ts.map +1 -0
- package/editor/tools/engine/ToolEngine.d.ts +22 -0
- package/editor/tools/engine/ToolEngine.d.ts.map +1 -0
- package/editor/tools/engine/ToolState.d.ts +7 -0
- package/editor/tools/engine/ToolState.d.ts.map +1 -0
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts +18 -0
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -0
- package/editor/tools/paint/TerrainPaintTool.d.ts +82 -0
- package/editor/tools/paint/TerrainPaintTool.d.ts.map +1 -0
- package/editor/tools/paint/TerrainTexturePaintTool.d.ts +19 -0
- package/editor/tools/paint/TerrainTexturePaintTool.d.ts.map +1 -0
- package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts +139 -0
- package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts.map +1 -0
- package/editor/tools/v2/GizmoNode.d.ts +21 -0
- package/editor/tools/v2/GizmoNode.d.ts.map +1 -0
- package/editor/tools/v2/TransformControls.d.ts +219 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -0
- package/editor/tools/v2/TransformMode.d.ts +7 -0
- package/editor/tools/v2/TransformMode.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts +37 -0
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_draw.d.ts +14 -0
- package/editor/tools/v2/handle/gizmo_draw.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_handles.d.ts +160 -0
- package/editor/tools/v2/handle/gizmo_handles.d.ts.map +1 -0
- package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts +103 -0
- package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts.map +1 -0
- package/editor/view/GridPickCoordinateView.d.ts +22 -0
- package/editor/view/GridPickCoordinateView.d.ts.map +1 -0
- package/editor/view/ecs/ComponentControlView.d.ts +24 -0
- package/editor/view/ecs/ComponentControlView.d.ts.map +1 -0
- package/editor/view/ecs/EntityEditor.d.ts +25 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -0
- package/editor/view/ecs/EntityList.d.ts +22 -0
- package/editor/view/ecs/EntityList.d.ts.map +1 -0
- package/editor/view/ecs/HierarchicalEntityListView.d.ts +25 -0
- package/editor/view/ecs/HierarchicalEntityListView.d.ts.map +1 -0
- package/editor/view/ecs/components/DatGuiController.d.ts +2 -0
- package/editor/view/ecs/components/DatGuiController.d.ts.map +1 -0
- package/editor/view/ecs/components/color/GaugeView.d.ts +9 -5
- package/editor/view/ecs/components/color/GaugeView.d.ts.map +1 -1
- package/editor/view/ecs/components/color/GaugeView.js +4 -4
- package/editor/view/ecs/components/common/NumberController.d.ts +9 -5
- package/editor/view/ecs/components/common/NumberController.d.ts.map +1 -1
- package/editor/view/ecs/components/common/NumberController.js +4 -4
- package/editor/view/ecs/components/common/NumericIntervalController.d.ts +10 -0
- package/editor/view/ecs/components/common/NumericIntervalController.d.ts.map +1 -0
- package/editor/view/ecs/components/common/TextController.d.ts.map +1 -1
- package/editor/view/library/MeshLibraryView.d.ts +16 -0
- package/editor/view/library/MeshLibraryView.d.ts.map +1 -0
- package/editor/view/library/mesh_library_drag.d.ts +21 -0
- package/editor/view/library/mesh_library_drag.d.ts.map +1 -0
- package/editor/view/library/model_thumbnail_source.d.ts +12 -0
- package/editor/view/library/model_thumbnail_source.d.ts.map +1 -0
- package/editor/view/makeEntityDecorators.d.ts +6 -0
- package/editor/view/makeEntityDecorators.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphCamera.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphSelection.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeView.d.ts.map +1 -1
- package/editor/view/node-graph/PortView.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionCreateAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeParameterSetAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodesMoveAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/SelectionSetAction.d.ts.map +1 -1
- package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
- package/editor/view/particles/ColorLutGradientView.d.ts +19 -0
- package/editor/view/particles/ColorLutGradientView.d.ts.map +1 -0
- package/editor/view/particles/ScalarLutCurveView.d.ts +19 -0
- package/editor/view/particles/ScalarLutCurveView.d.ts.map +1 -0
- package/editor/view/prepareMeshLibrary.d.ts +7 -0
- package/editor/view/prepareMeshLibrary.d.ts.map +1 -0
- package/editor/view/process/ProcessView.d.ts +14 -0
- package/editor/view/process/ProcessView.d.ts.map +1 -0
- package/editor/view/shell/EditorShellView.d.ts +18 -0
- package/editor/view/shell/EditorShellView.d.ts.map +1 -0
- package/editor/view/shell/SceneTreePanelView.d.ts +17 -0
- package/editor/view/shell/SceneTreePanelView.d.ts.map +1 -0
- package/editor/view/shell/ViewportPanelView.d.ts +18 -0
- package/editor/view/shell/ViewportPanelView.d.ts.map +1 -0
- package/editor/view/tools/ToolSettingsView.d.ts +22 -0
- package/editor/view/tools/ToolSettingsView.d.ts.map +1 -0
- package/editor/view/tools/ToolView.d.ts +13 -0
- package/editor/view/tools/ToolView.d.ts.map +1 -0
- package/editor/view/v2/SplitView.d.ts +2 -0
- package/editor/view/v2/SplitView.d.ts.map +1 -0
- package/package.json +9 -11
- package/samples/engine/README.md +113 -0
- package/samples/engine/first-scene/index.html +32 -0
- package/samples/engine/first-scene/main.js +152 -0
- package/src/core/assert.d.ts +2 -2
- package/src/core/binary/BitSet.d.ts +2 -2
- package/src/core/binary/BitSet.d.ts.map +1 -1
- package/src/core/binary/BitSet.js +1 -1
- package/src/core/bvh2/bvh3/BVH.d.ts +4 -0
- package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BVH.js +4 -0
- package/src/core/bvh2/bvh3/BvhClient.d.ts +4 -0
- package/src/core/bvh2/bvh3/BvhClient.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BvhClient.js +4 -0
- package/src/core/collection/array/array_sort_quick.d.ts +1 -1
- package/src/core/collection/list/List.d.ts +7 -3
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +6 -2
- package/src/core/collection/table/RowFirstTableSpec.d.ts.map +1 -1
- package/src/core/collection/table/RowFirstTableSpec.js +0 -4
- package/src/core/color/Color.d.ts +1 -0
- package/src/core/color/Color.d.ts.map +1 -1
- package/src/core/color/Color.js +4 -0
- package/src/core/events/signal/SignalBinding.d.ts +4 -0
- package/src/core/events/signal/SignalBinding.d.ts.map +1 -1
- package/src/core/events/signal/SignalBinding.js +4 -0
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts +5 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
- package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +4 -0
- package/src/core/geom/3d/SurfacePoint3.d.ts +2 -2
- package/src/core/geom/3d/SurfacePoint3.d.ts.map +1 -1
- package/src/core/geom/3d/SurfacePoint3.js +1 -1
- package/src/core/geom/3d/aabb/AABB3.d.ts +63 -7
- package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/AABB3.js +17 -3
- package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +2 -2
- package/src/core/geom/3d/ray/Ray3.d.ts +4 -4
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts +10 -3
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/AbstractShape3D.js +9 -2
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts +2 -2
- package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +1 -1
- package/src/core/geom/Vector1.d.ts +4 -0
- package/src/core/geom/Vector1.d.ts.map +1 -1
- package/src/core/geom/Vector1.js +4 -0
- package/src/core/geom/Vector2.d.ts +4 -0
- package/src/core/geom/Vector2.d.ts.map +1 -1
- package/src/core/geom/Vector2.js +4 -0
- package/src/core/geom/Vector3.d.ts +4 -0
- package/src/core/geom/Vector3.d.ts.map +1 -1
- package/src/core/geom/Vector3.js +4 -0
- package/src/core/geom/Vector4.d.ts +4 -0
- package/src/core/geom/Vector4.d.ts.map +1 -1
- package/src/core/geom/Vector4.js +4 -0
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts +6 -2
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts.map +1 -1
- package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +4 -0
- package/src/core/geom/packing/miniball/Subspan.d.ts +4 -4
- package/src/core/geom/packing/miniball/Subspan.d.ts.map +1 -1
- package/src/core/geom/packing/miniball/Subspan.js +2 -2
- package/src/core/math/interval/NumericInterval.d.ts +4 -0
- package/src/core/math/interval/NumericInterval.d.ts.map +1 -1
- package/src/core/math/interval/NumericInterval.js +4 -0
- package/src/core/math/random/roundFair.d.ts +2 -2
- package/src/core/math/random/roundFair.d.ts.map +1 -1
- package/src/core/math/random/roundFair.js +1 -1
- package/src/core/model/BoundedValue.d.ts +4 -0
- package/src/core/model/BoundedValue.d.ts.map +1 -1
- package/src/core/model/BoundedValue.js +4 -0
- package/src/core/model/ObservedBoolean.d.ts +4 -0
- package/src/core/model/ObservedBoolean.d.ts.map +1 -1
- package/src/core/model/ObservedBoolean.js +4 -0
- package/src/core/model/ObservedInteger.d.ts +4 -0
- package/src/core/model/ObservedInteger.d.ts.map +1 -1
- package/src/core/model/ObservedInteger.js +4 -0
- package/src/core/model/ObservedString.d.ts +4 -0
- package/src/core/model/ObservedString.d.ts.map +1 -1
- package/src/core/model/ObservedString.js +4 -0
- package/src/core/model/stat/Stat.d.ts +7 -3
- package/src/core/model/stat/Stat.d.ts.map +1 -1
- package/src/core/model/stat/Stat.js +4 -0
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +65 -0
- package/src/engine/EngineHarness.d.ts +8 -1
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +10 -14
- package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts +2 -2
- package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
- package/src/engine/animation/clip/ecd_bind_animation_curve.js +4 -4
- package/src/engine/asset/loaders/async_traverse_three_object.d.ts +2 -2
- package/src/engine/asset/loaders/async_traverse_three_object.d.ts.map +1 -1
- package/src/engine/asset/loaders/async_traverse_three_object.js +1 -1
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +7 -3
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
- package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +33 -3
- package/src/engine/control/first-person/DESIGN.md +20 -2
- package/src/engine/control/first-person/DESIGN_COLLISION.md +17 -0
- package/src/engine/control/first-person/collision/KinematicMover.d.ts +58 -11
- package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.js +97 -20
- package/src/engine/ecs/Entity.js +1 -1
- package/src/engine/ecs/EntityComponentDataset.d.ts +2 -2
- package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
- package/src/engine/ecs/EntityComponentDataset.js +1 -1
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +27 -3
- package/src/engine/ecs/animation/Animation.d.ts +17 -3
- package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
- package/src/engine/ecs/animation/Animation.js +26 -6
- package/src/engine/ecs/terrain/TerrainPreview.d.ts +4 -0
- package/src/engine/ecs/terrain/TerrainPreview.d.ts.map +1 -1
- package/src/engine/ecs/terrain/TerrainPreview.js +4 -0
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +4 -4
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +2 -2
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts +3 -2
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.js +25 -2
- package/src/engine/ecs/transform/Transform64.d.ts +4 -4
- package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform64.js +2 -2
- package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +26 -0
- package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
- package/src/engine/graphics/ecs/decal/v2/Decal.js +26 -0
- package/src/engine/graphics/ecs/light/Light.d.ts +38 -1
- package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/Light.js +51 -1
- package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +3 -3
- package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh/copyToVector3.js +2 -2
- package/src/engine/graphics/ecs/mesh/setMesh.d.ts +2 -2
- package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh/setMesh.js +1 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +3 -3
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +2 -2
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +1 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +2 -2
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +1 -1
- package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts +2 -2
- package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts.map +1 -1
- package/src/engine/graphics/geometry/compute_geometry_polycount.js +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +3 -3
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +2 -2
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +4 -4
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +3 -3
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +3 -3
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +2 -2
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +4 -4
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +1 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +3 -3
- package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts +2 -2
- package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts.map +1 -1
- package/src/engine/graphics/geometry/scaleGeometryToBox.js +1 -1
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts +2 -2
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts.map +1 -1
- package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.js +1 -1
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts +2 -2
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts.map +1 -1
- package/src/engine/graphics/impostors/octahedral/ImpostorDescription.js +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +4 -12
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +2 -2
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts +5 -20
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +24 -24
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +16 -16
- package/src/engine/graphics/render/layers/RenderLayer.d.ts +4 -4
- package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
- package/src/engine/graphics/render/layers/RenderLayer.js +2 -2
- package/src/engine/graphics/render/make_bvh_visibility_builder.js +1 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +1 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.js +1 -1
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts +2 -2
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
- package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +1 -1
- package/src/engine/graphics3/DecalSystem.d.ts +8 -0
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +8 -0
- package/src/engine/graphics3/GraphicsEngine.d.ts +19 -8
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +22 -11
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +11 -1
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts +4 -0
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts.map +1 -1
- package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +4 -0
- package/src/engine/navigation/mesh/NavigationMesh.d.ts +90 -9
- package/src/engine/navigation/mesh/NavigationMesh.d.ts.map +1 -1
- package/src/engine/navigation/mesh/NavigationMesh.js +80 -8
- package/src/engine/network/NetworkSession.d.ts +60 -0
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +141 -1
- package/src/engine/network/replication/Replicator.d.ts +18 -0
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +98 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/SoundEngine.d.ts +24 -0
- package/src/engine/sound/SoundEngine.d.ts.map +1 -1
- package/src/engine/sound/SoundEngine.js +29 -11
- package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
- package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
- package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
- package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
- package/src/shade/playground/particle_system/README.md +14 -3
- package/src/shade/playground/particle_system/index.html +1 -0
- package/src/shade/playground/particle_system/main.js +15 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +126 -9
- package/src/shade/renderer/GraphicsContext.d.ts +1 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +4 -0
- package/src/shade/renderer/Renderer.d.ts +1 -1
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/DESIGN.md +66 -15
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
- package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +33 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
- package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
- package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +60 -20
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
- package/src/view/DOM.d.ts +69 -0
- package/src/view/DOM.d.ts.map +1 -0
- package/src/view/DOM.js +2 -1
- package/src/view/common/LocalizedLabelView.d.ts +50 -0
- package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
- package/src/view/controller/controls/GuiControl.d.ts +19 -0
- package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
- package/src/view/elements/FrameRateView.d.ts +45 -0
- package/src/view/elements/FrameRateView.d.ts.map +1 -0
- package/src/view/elements/FrameRateView.js +131 -0
- package/src/view/elements/SliderView.d.ts +37 -0
- package/src/view/elements/SliderView.d.ts.map +1 -0
- package/src/view/elements/SliderView.js +71 -0
- package/src/view/elements/navigation/ViewStack.d.ts +1 -1
- package/src/view/elements/navigation/ViewStack.js +1 -1
- package/src/view/elements/notify/NotificationView.d.ts +22 -0
- package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
- package/src/view/tooltip/TooltipView.d.ts +5 -1
- package/src/view/tooltip/TooltipView.d.ts.map +1 -1
- package/src/view/tooltip/TooltipView.js +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"particle_scene.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_system/particle_scene.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"particle_scene.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_system/particle_scene.js"],"names":[],"mappings":"AA4FA;;;;;;;;;;GAUG;AAEH;;;;;;;;GAQG;AACH;IAJqC,YAAY;IACrB,QAAQ,GAAzB,MAAM;IACJ,MAAM,CAiUlB;AAjWD;;;;GAIG;AACH,0CAA2C;AAE3C,wGAAwG;AACxG,sCAAuC;;;;;WAOzB,MAAM;;;;UACN,MAAM;;;;;cACN,MAAM;;;;;gBAEN,MAAM;;;;cAEN,MAAM,EAAE;;;;UACR,MAAM,EAAE"}
|
|
@@ -4,7 +4,23 @@ import { m4_look_at } from "../../../core/geom/3d/mat4/m4_look_at.js";
|
|
|
4
4
|
import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
|
|
5
5
|
import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
|
|
6
6
|
import { CAMERA_UNIFORM_STRUCT } from "../../renderer/camera/CAMERA_UNIFORM_STRUCT.js";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
PARTICLE_RECORD_WORD_COUNT,
|
|
9
|
+
PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
10
|
+
} from "../../renderer/particles/ParticleConstants.js";
|
|
11
|
+
import {
|
|
12
|
+
PREFIX_SCAN_CSDLDF_HEADER_WORDS,
|
|
13
|
+
PREFIX_SCAN_CSDLDF_PARTITION_SIZE,
|
|
14
|
+
shader_prefix_scan_csdldf,
|
|
15
|
+
} from "../../renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
|
|
16
|
+
import { build_indirect_compute_dispatch_command } from "../../renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
|
|
17
|
+
import {
|
|
18
|
+
shader_particle_bucket_fill,
|
|
19
|
+
shader_particle_bucket_histogram,
|
|
20
|
+
shader_particle_bucket_pad,
|
|
21
|
+
shader_particle_bucket_reset,
|
|
22
|
+
shader_particle_bucket_scatter,
|
|
23
|
+
} from "../../renderer/particles/coherence/shader_particle_bucket.js";
|
|
8
24
|
import { PARTICLE_COUNTER_COUNT } from "../../renderer/particles/data/PARTICLE_COUNTERS.js";
|
|
9
25
|
import { EMITTER_BLEND, EMITTER_PROJECTION } from "../../renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js";
|
|
10
26
|
import { NodeGraph } from "../../../core/model/node-graph/NodeGraph.js";
|
|
@@ -23,10 +39,7 @@ import {
|
|
|
23
39
|
shader_particle_build_indirect,
|
|
24
40
|
shader_particle_reset_counters,
|
|
25
41
|
} from "../../renderer/particles/shaders/shader_particle_finalize.js";
|
|
26
|
-
import {
|
|
27
|
-
PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
28
|
-
shader_particle_simulate,
|
|
29
|
-
} from "../../renderer/particles/shaders/shader_particle_simulate.js";
|
|
42
|
+
import { shader_particle_simulate } from "../../renderer/particles/shaders/shader_particle_simulate.js";
|
|
30
43
|
|
|
31
44
|
/**
|
|
32
45
|
* The scene the particle playground draws, with every reference to the page removed: it takes a
|
|
@@ -50,6 +63,12 @@ import {
|
|
|
50
63
|
* billboard draw via `drawIndirect`, both from args the build-indirect pass writes on the GPU. No
|
|
51
64
|
* CPU readback participates in sizing anything — a stale CPU count would orphan alive-list entries
|
|
52
65
|
* when the population grows and double-free slots when it shrinks.
|
|
66
|
+
*
|
|
67
|
+
* The four emitters run four distinct compiled programs, so this is also where the simulation-order
|
|
68
|
+
* bucketing has something to do: without it a simulate wave holds fire, smoke, spark and dust
|
|
69
|
+
* particles side by side, each wanting different opcodes out of the interpreter's switch. The
|
|
70
|
+
* bucketing passes are encoded directly here rather than through `graph_particles`, which is the
|
|
71
|
+
* frame-graph wiring of the same sequence.
|
|
53
72
|
*/
|
|
54
73
|
|
|
55
74
|
/** Maximum simultaneous particles across every emitter — they share one pool. */
|
|
@@ -75,7 +94,10 @@ const STATS_OFFSET_DRAW_ARGS = 48;
|
|
|
75
94
|
* @typedef {object} ParticleSceneStats
|
|
76
95
|
* @property {number} alive particles alive at the end of the captured frame
|
|
77
96
|
* @property {number} dead free slots left in the pool
|
|
78
|
-
* @property {number} alive_in the snapshot next frame's simulate reads as its input length
|
|
97
|
+
* @property {number} alive_in the snapshot next frame's simulate reads as its input length — the
|
|
98
|
+
* PADDED length of the coherence list, so it is `sim_padded` from the captured frame, not `alive`
|
|
99
|
+
* @property {number} sim_padded length of the program-coherent list the coherence pass built this
|
|
100
|
+
* frame; the gap to `alive` is the lanes padding costs to keep each wave on one VM program
|
|
79
101
|
* @property {number[]} dispatch simulate's indirect dispatch args, `[x, y, z]` workgroups
|
|
80
102
|
* @property {number[]} draw the billboard draw's indirect args, `[vertices, instances]`
|
|
81
103
|
*/
|
|
@@ -148,6 +170,37 @@ export function create_particle_scene(graphics, { color_format, capacity = PARTI
|
|
|
148
170
|
const dispatch_args = device.createBuffer({ label: "particles/dispatch_args", size: 3 * 4, usage: args_usage });
|
|
149
171
|
const draw_args = device.createBuffer({ label: "particles/draw_args", size: 4 * 4, usage: args_usage });
|
|
150
172
|
|
|
173
|
+
// --- simulation-order (coherence) buffers -------------------------------------------------
|
|
174
|
+
//
|
|
175
|
+
// A separate set from the render-order sort's, on purpose: one list is grouped by VM program and
|
|
176
|
+
// camera-independent, the other is back-to-front by view depth. Sharing a buffer between them
|
|
177
|
+
// would couple a camera-driven ordering to a program-driven one.
|
|
178
|
+
const sizes = system.bufferSizes();
|
|
179
|
+
const buckets = system.bucketCount();
|
|
180
|
+
const sim_list = device.createBuffer({ label: "particles/sim_list", size: sizes.sim_list, usage: storage });
|
|
181
|
+
const sim_keys = device.createBuffer({ label: "particles/sim_keys", size: sizes.sim_keys, usage: storage });
|
|
182
|
+
const sim_histogram = device.createBuffer({ label: "particles/sim_histogram", size: sizes.sim_histogram, usage: storage });
|
|
183
|
+
const sim_bucket_counts = device.createBuffer({ label: "particles/sim_bucket_counts", size: sizes.sim_bucket_counts, usage: storage });
|
|
184
|
+
const sim_cursor = device.createBuffer({ label: "particles/sim_cursor", size: sizes.sim_cursor, usage: storage });
|
|
185
|
+
const sim_dispatch_args = device.createBuffer({ label: "particles/sim_dispatch_args", size: sizes.sim_dispatch_args, usage: args_usage });
|
|
186
|
+
|
|
187
|
+
// Scratch the reused CSDLDF scan needs: the indirect command it is dispatched with, and its
|
|
188
|
+
// decoupled-lookback spine. One partition covers every plausible bucket count.
|
|
189
|
+
const scan_command = device.createBuffer({
|
|
190
|
+
label: "particles/sim_scan_command",
|
|
191
|
+
size: 3 * 4,
|
|
192
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT,
|
|
193
|
+
});
|
|
194
|
+
// Cleared at the top of every frame, not just on creation: the spine carries per-partition
|
|
195
|
+
// flags, and a stale FLAG_INCLUSIVE left over from last frame is read as this frame's answer.
|
|
196
|
+
// The frame-graph wiring gets this for free from `BufferResourceDescriptor.empty`; encoding by
|
|
197
|
+
// hand has to ask. Rounded to a 256-byte allocation rather than the 8 bytes one partition needs.
|
|
198
|
+
const scan_spine = device.createBuffer({
|
|
199
|
+
label: "particles/sim_scan_spine",
|
|
200
|
+
size: Math.max(256, Math.ceil(buckets / PREFIX_SCAN_CSDLDF_PARTITION_SIZE) * 2 * 4),
|
|
201
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
202
|
+
});
|
|
203
|
+
|
|
151
204
|
const initial = system.initialFreeList();
|
|
152
205
|
device.queue.writeBuffer(dead, 0, initial.dead);
|
|
153
206
|
device.queue.writeBuffer(counters, 0, initial.counters);
|
|
@@ -205,7 +258,12 @@ export function create_particle_scene(graphics, { color_format, capacity = PARTI
|
|
|
205
258
|
capacity,
|
|
206
259
|
|
|
207
260
|
/** Buffers a harness may inspect. Not for the frame loop, which never reads them back. */
|
|
208
|
-
buffers: {
|
|
261
|
+
buffers: {
|
|
262
|
+
pool, alive_a, alive_b, dead, counters, spawn_requests, emitters, program, constants,
|
|
263
|
+
dispatch_args, draw_args,
|
|
264
|
+
sim_list, sim_keys, sim_histogram, sim_bucket_counts, sim_cursor, sim_dispatch_args,
|
|
265
|
+
sim_scan_command: scan_command, sim_scan_spine: scan_spine,
|
|
266
|
+
},
|
|
209
267
|
|
|
210
268
|
/**
|
|
211
269
|
* Encode one whole frame: geometry, then emit + simulate + build-indirect, then the
|
|
@@ -259,13 +317,59 @@ export function create_particle_scene(graphics, { color_format, capacity = PARTI
|
|
|
259
317
|
encoder: cmd,
|
|
260
318
|
bindings: {
|
|
261
319
|
emitters, program, vm_constants: constants, pool,
|
|
262
|
-
|
|
320
|
+
sim_list, alive_out: alive_write, dead, counters,
|
|
263
321
|
settings: { u_dt: dt, u_time: time, u_frame: system.frame },
|
|
264
322
|
},
|
|
265
323
|
command: dispatch_args,
|
|
266
324
|
});
|
|
267
325
|
|
|
268
|
-
//
|
|
326
|
+
// --- coherence: regroup the finished alive list by VM program for NEXT frame's simulate ---
|
|
327
|
+
//
|
|
328
|
+
// Reads the list emit and simulate have both finished appending to, and rewrites
|
|
329
|
+
// `sim_list` — the buffer simulate read a few lines above. Consecutive dispatches are
|
|
330
|
+
// ordered, so the read is complete before the write lands.
|
|
331
|
+
shader_particle_bucket_reset.dispatchThreads({
|
|
332
|
+
encoder: cmd,
|
|
333
|
+
bindings: { counters, histogram: sim_histogram, cursor: sim_cursor, sim_dispatch_args, u_bucket_count: buckets },
|
|
334
|
+
thread_count_x: bucket_reset_thread_count(buckets),
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
shader_particle_bucket_histogram.dispatchIndirect({
|
|
338
|
+
encoder: cmd,
|
|
339
|
+
bindings: { emitters, pool, alive: alive_write, keys: sim_keys, histogram: sim_histogram, counters },
|
|
340
|
+
command: sim_dispatch_args,
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
shader_particle_bucket_pad.dispatchThreads({
|
|
344
|
+
encoder: cmd,
|
|
345
|
+
bindings: { histogram: sim_histogram, bucket_counts: sim_bucket_counts, u_bucket_count: buckets },
|
|
346
|
+
thread_count_x: buckets,
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// The same scan the radix sort runs its spine through, reused unmodified.
|
|
350
|
+
cmd.clearBuffer(scan_spine, 0, scan_spine.size);
|
|
351
|
+
build_indirect_compute_dispatch_command(
|
|
352
|
+
PREFIX_SCAN_CSDLDF_PARTITION_SIZE, cmd, sim_histogram, 0, scan_command, 0,
|
|
353
|
+
);
|
|
354
|
+
shader_prefix_scan_csdldf.dispatchIndirect({
|
|
355
|
+
encoder: cmd,
|
|
356
|
+
command: scan_command,
|
|
357
|
+
bindings: { scan_in: sim_histogram, spine: scan_spine },
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
shader_particle_bucket_scatter.dispatchIndirect({
|
|
361
|
+
encoder: cmd,
|
|
362
|
+
bindings: { keys: sim_keys, alive: alive_write, scanned: sim_histogram, cursor: sim_cursor, sim_list, counters },
|
|
363
|
+
command: sim_dispatch_args,
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
shader_particle_bucket_fill.dispatchThreads({
|
|
367
|
+
encoder: cmd,
|
|
368
|
+
bindings: { bucket_counts: sim_bucket_counts, scanned: sim_histogram, sim_list, counters, u_bucket_count: buckets },
|
|
369
|
+
thread_count_x: buckets * PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
// Snapshot the padded list length (next frame's simulate input) + write this frame's draw args.
|
|
269
373
|
shader_particle_build_indirect.dispatch({
|
|
270
374
|
encoder: cmd,
|
|
271
375
|
bindings: { counters, dispatch_args, draw_args, u_workgroup_size: PARTICLE_SIMULATE_WORKGROUP_SIZE },
|
|
@@ -320,6 +424,7 @@ export function create_particle_scene(graphics, { color_format, capacity = PARTI
|
|
|
320
424
|
alive: words[0],
|
|
321
425
|
dead: words[1],
|
|
322
426
|
alive_in: words[4],
|
|
427
|
+
sim_padded: words[5],
|
|
323
428
|
dispatch: [words[dispatch_base], words[dispatch_base + 1], words[dispatch_base + 2]],
|
|
324
429
|
draw: [words[draw_base], words[draw_base + 1]],
|
|
325
430
|
};
|
|
@@ -529,6 +634,18 @@ function translation(x, y, z) {
|
|
|
529
634
|
return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1];
|
|
530
635
|
}
|
|
531
636
|
|
|
637
|
+
/**
|
|
638
|
+
* Threads the bucket reset pass needs: enough to cover the scan's header plus its bins, rounded up
|
|
639
|
+
* to the whole `vec4` the last bin lands in (the scan reads whole `vec4`s, so the tail has to be
|
|
640
|
+
* cleared too or garbage joins the sums).
|
|
641
|
+
*
|
|
642
|
+
* @param {number} bucket_count
|
|
643
|
+
* @returns {number}
|
|
644
|
+
*/
|
|
645
|
+
function bucket_reset_thread_count(bucket_count) {
|
|
646
|
+
return PREFIX_SCAN_CSDLDF_HEADER_WORDS + ((bucket_count + 3) & ~3);
|
|
647
|
+
}
|
|
648
|
+
|
|
532
649
|
function data_buffer(device, label, data, usage) {
|
|
533
650
|
const buffer = device.createBuffer({ label, size: Math.max(data.byteLength, 4), usage });
|
|
534
651
|
device.queue.writeBuffer(buffer, 0, data);
|
|
@@ -118,6 +118,7 @@ export class GraphicsContext {
|
|
|
118
118
|
readonly isGraphicsContext: boolean;
|
|
119
119
|
#private;
|
|
120
120
|
}
|
|
121
|
+
export type BinaryBuffer = import("../../core/binary/BinaryBuffer.js").BinaryBuffer;
|
|
121
122
|
import { GPUGeometryManager } from "./geometry/GPUGeometryManager.js";
|
|
122
123
|
import { GPUMaterialManager } from "./material/GPUMaterialManager.js";
|
|
123
124
|
import { GPUSamplerManager } from "./GPUSamplerManager.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphicsContext.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/GraphicsContext.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GraphicsContext.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/GraphicsContext.js"],"names":[],"mappings":"AA4BA;IAoJI,yBA8BC;IAjLD;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAOV;;OAEG;IACH,UAFU,iBAAiB,CAElB;IAET;;;OAGG;IACH,qDAOC;IAOD;;;OAGG;IACH,6CAEC;IAED;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,mBAFU,sBAAsB,CAEd;IAGlB;;OAEG;IACH,gBAFU,oBAAoB,CAEf;IAEf;;OAEG;IACH,UAFU,cAAc,CAEf;IAET;;;;OAIG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,aAFU,gBAAgB,CAEd;IAQZ;;;OAGG;IACH,uBAFU,kBAAkB,CAEN;IAEtB;;;;OAIG;IACH,yBAFU,wBAAwB,CAEV;IAExB;;;OAGG;IACH,0BAFU,yBAAyB,CAEV;IAEzB;;;OAGG;IACH,oBAFU,mBAAmB,CAEV;IAUnB;;;OAGG;IACH,8BAEC;IAED,uBAMC;IAED;;;OAGG;IACH,wBAEC;IAkCD;;;;;;;;OAQG;IACH,gGALW,oBAAoB,EAAE,cACtB;QAAC,MAAM,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,QAmE9D;IAED;;;;OAIG;IACH,mDAFa,gBAAgB,CAI5B;IAED;;OAEG;IACH,+BAcC;IAED,4BAEC;IAED,eAmBC;IAED,gBAcC;IAGL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;2BAtUY,OAAO,mCAAmC,EAAE,YAAY;mCAZlC,kCAAkC;mCAGlC,kCAAkC;kCADnC,wBAAwB;2CAEf,mDAAmD;oCAH1D,2CAA2C;sCAXzC,6CAA6C;sCAC7C,6CAA6C;uCAF5C,8CAA8C;qCAIhD,0CAA0C;+BAchD,6BAA6B;sCACtB,4CAA4C;iCAbjD,+BAA+B;mCAC7B,gCAAgC;yCAC1B,sCAAsC;0CAErC,uCAAuC;oCAO7C,kCAAkC;iCARtB,8BAA8B"}
|
|
@@ -20,6 +20,10 @@ import { GPUTextureAllocator } from "./texture/GPUTextureAllocator.js";
|
|
|
20
20
|
import { TextureManager } from "./texture/TextureManager.js";
|
|
21
21
|
import { VirtualTextureManager } from "./texture/virtual/VirtualTextureManager.js";
|
|
22
22
|
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {import("../../core/binary/BinaryBuffer.js").BinaryBuffer} BinaryBuffer
|
|
26
|
+
*/
|
|
23
27
|
const DEBUG_LOGGING = false;
|
|
24
28
|
|
|
25
29
|
export class GraphicsContext {
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Round-trips a {@link MeshletGeometry} through a `BinaryBuffer`.
|
|
3
|
+
*
|
|
4
|
+
* **This is the offline meshlet format**, and saying so is the point of this docblock: nothing
|
|
5
|
+
* documented it as the intended pipeline, so a consumer reasonably assumed
|
|
6
|
+
* {@link meshlet_geometry_build_from_geometry} was the only route from a `Geometry` to something
|
|
7
|
+
* the renderer draws — and paid 1.25 seconds of unbroken main thread per 200k-triangle level for
|
|
8
|
+
* it, at load, synchronously (GAP-008).
|
|
9
|
+
*
|
|
10
|
+
* The pipeline this supports: build the meshlets once in the asset build, serialize here, ship the
|
|
11
|
+
* bytes, and let the runtime deserialize and upload. `serialize_bvh` decides whether the BLAS
|
|
12
|
+
* travels with them or is rebuilt on load — carrying it costs bytes and saves the rebuild.
|
|
13
|
+
*/
|
|
1
14
|
export class MeshletGeometrySerializationAdapter extends BinaryClassSerializationAdapter<any> {
|
|
2
15
|
constructor();
|
|
3
16
|
klass: typeof MeshletGeometry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeshletGeometrySerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js"],"names":[],"mappings":"AAMA;;IAGI,8BAAwB;IAGxB,uBAAqB;IAErB;;;OAGG;IACH,8BAFW,eAAe,QA6BzB;IAED;;;OAGG;IACH,gCAFW,eAAe,QAyCzB;CACJ;
|
|
1
|
+
{"version":3,"file":"MeshletGeometrySerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AACH;;IAGI,8BAAwB;IAGxB,uBAAqB;IAErB;;;OAGG;IACH,8BAFW,eAAe,QA6BzB;IAED;;;OAGG;IACH,gCAFW,eAAe,QAyCzB;CACJ;gDAtGM,uEAAuE;gCAE9C,sBAAsB"}
|
|
@@ -4,6 +4,19 @@ import {
|
|
|
4
4
|
import { blas_from_meshlets } from "./blas_from_meshlets.js";
|
|
5
5
|
import { MeshletGeometry } from "./MeshletGeometry.js";
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Round-trips a {@link MeshletGeometry} through a `BinaryBuffer`.
|
|
9
|
+
*
|
|
10
|
+
* **This is the offline meshlet format**, and saying so is the point of this docblock: nothing
|
|
11
|
+
* documented it as the intended pipeline, so a consumer reasonably assumed
|
|
12
|
+
* {@link meshlet_geometry_build_from_geometry} was the only route from a `Geometry` to something
|
|
13
|
+
* the renderer draws — and paid 1.25 seconds of unbroken main thread per 200k-triangle level for
|
|
14
|
+
* it, at load, synchronously (GAP-008).
|
|
15
|
+
*
|
|
16
|
+
* The pipeline this supports: build the meshlets once in the asset build, serialize here, ship the
|
|
17
|
+
* bytes, and let the runtime deserialize and upload. `serialize_bvh` decides whether the BLAS
|
|
18
|
+
* travels with them or is rebuilt on load — carrying it costs bytes and saves the rebuild.
|
|
19
|
+
*/
|
|
7
20
|
export class MeshletGeometrySerializationAdapter extends BinaryClassSerializationAdapter {
|
|
8
21
|
|
|
9
22
|
version = 0
|
|
@@ -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]
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -149,6 +186,9 @@ src/webgpu/renderer/particles/
|
|
|
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
|
|