@woosh/meep-engine 3.15.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/editor/Editor.js +7 -7
- package/editor/actions/concrete/TransformModifyAction.d.ts +4 -4
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
- package/editor/actions/concrete/TransformModifyAction.js +4 -4
- package/editor/camera/camera_framing.js +7 -7
- package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Transform64Editor.js +70 -0
- package/editor/ecs/component/prototypeObjectEditor.js +2 -2
- package/editor/ecs/component/registerEngineComponentEditors.js +3 -3
- package/editor/particles/effect/ParticleEffectDocument.d.ts +396 -0
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -0
- package/editor/particles/effect/ParticleEffectDocument.js +989 -0
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts +113 -0
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -0
- package/editor/particles/effect/ParticleReferenceSimulation.js +377 -0
- package/editor/particles/effect/actions/ParticleGroupDefineAction.d.ts +35 -0
- package/editor/particles/effect/actions/ParticleGroupDefineAction.d.ts.map +1 -0
- package/editor/particles/effect/actions/ParticleGroupDefineAction.js +45 -0
- package/editor/particles/effect/make_starter_particle_effect.d.ts +23 -0
- package/editor/particles/effect/make_starter_particle_effect.d.ts.map +1 -0
- package/editor/particles/effect/make_starter_particle_effect.js +177 -0
- package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -1
- package/editor/persistence/buildNewSceneDataset.js +10 -8
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.js +67 -67
- package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
- package/editor/process/symbolic/GridPositionSymbolicDisplay.js +6 -6
- package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -1
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.js +6 -3
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.js +6 -6
- package/editor/selection/editor_pick.js +130 -130
- package/editor/templates/entity_templates.js +7 -7
- package/editor/tools/TransformToolV2.d.ts +3 -3
- package/editor/tools/TransformToolV2.d.ts.map +1 -1
- package/editor/tools/TransformToolV2.js +58 -25
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -1
- package/editor/tools/paint/TerrainHeightPaintTool.js +11 -9
- package/editor/tools/v2/GizmoNode.js +2 -2
- package/editor/tools/v2/TransformControls.d.ts +3 -3
- package/editor/tools/v2/TransformControls.d.ts.map +1 -1
- package/editor/tools/v2/TransformControls.js +1003 -971
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -1
- package/editor/tools/v2/handle/gizmo_drag_plane.js +6 -1
- package/editor/view/ecs/components/common/AutoCanvasView.js +17 -0
- package/editor/view/node-graph/NodeGraphEditorView.d.ts +143 -2
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.js +358 -6
- package/editor/view/node-graph/NodeGraphMinimapView.d.ts +120 -0
- package/editor/view/node-graph/NodeGraphMinimapView.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphMinimapView.js +859 -0
- package/editor/view/node-graph/NodeGraphPaletteView.d.ts +112 -0
- package/editor/view/node-graph/NodeGraphPaletteView.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphPaletteView.js +352 -0
- package/editor/view/node-graph/NodeGraphSearchMenuView.d.ts +76 -0
- package/editor/view/node-graph/NodeGraphSearchMenuView.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphSearchMenuView.js +247 -0
- package/editor/view/node-graph/NodeGraphView.d.ts +147 -5
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +809 -76
- package/editor/view/node-graph/NodeIconView.d.ts +33 -0
- package/editor/view/node-graph/NodeIconView.d.ts.map +1 -0
- package/editor/view/node-graph/NodeIconView.js +54 -0
- package/editor/view/node-graph/NodeView.d.ts +71 -1
- package/editor/view/node-graph/NodeView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeView.js +318 -17
- package/editor/view/node-graph/PortView.d.ts +41 -1
- package/editor/view/node-graph/PortView.d.ts.map +1 -1
- package/editor/view/node-graph/PortView.js +121 -69
- package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts +16 -3
- package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionDeleteAction.js +29 -3
- package/editor/view/node-graph/actions/NodeCreateAction.d.ts +65 -0
- package/editor/view/node-graph/actions/NodeCreateAction.d.ts.map +1 -0
- package/editor/view/node-graph/actions/NodeCreateAction.js +108 -0
- package/editor/view/node-graph/actions/NodeDeleteAction.d.ts +6 -0
- package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeDeleteAction.js +24 -2
- package/editor/view/node-graph/connection_wire_geometry.d.ts +34 -0
- package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
- package/editor/view/node-graph/connection_wire_geometry.js +79 -3
- package/editor/view/node-graph/node-graph.css +678 -0
- package/editor/view/particles/effect/ParticleCodeEditorView.d.ts +37 -0
- package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleCodeEditorView.js +479 -0
- package/editor/view/particles/effect/ParticleEffectEditorView.d.ts +61 -0
- package/editor/view/particles/effect/ParticleEffectEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleEffectEditorView.js +223 -0
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +25 -0
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +606 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +156 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.js +1636 -0
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +22 -0
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleNodeParametersView.js +520 -0
- package/editor/view/particles/effect/ParticlePreviewView.d.ts +52 -0
- package/editor/view/particles/effect/ParticlePreviewView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticlePreviewView.js +533 -0
- package/editor/view/particles/effect/particle-editor.css +556 -0
- package/editor/view/prepareMeshLibrary.d.ts.map +1 -1
- package/editor/view/prepareMeshLibrary.js +8 -4
- package/package.json +1 -1
- package/samples/engine/first-scene/main.js +152 -152
- package/samples/generation/generators/mir_generator_place_bases.js +3 -3
- package/src/core/assert.d.ts +28 -24
- package/src/core/assert.d.ts.map +1 -1
- package/src/core/assert.js +34 -26
- package/src/core/geom/3d/shape/PosedShape3D.d.ts +17 -0
- package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PosedShape3D.js +34 -2
- package/src/core/graph/format/graphviz/graphviz_escape_html_label.d.ts +17 -0
- package/src/core/graph/format/graphviz/graphviz_escape_html_label.d.ts.map +1 -0
- package/src/core/graph/format/graphviz/graphviz_escape_html_label.js +25 -0
- package/src/core/graph/format/graphviz/graphviz_escape_quoted.d.ts +16 -0
- package/src/core/graph/format/graphviz/graphviz_escape_quoted.d.ts.map +1 -0
- package/src/core/graph/format/graphviz/graphviz_escape_quoted.js +24 -0
- package/src/core/model/node-graph/NodeGraph.d.ts +12 -0
- package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
- package/src/core/model/node-graph/NodeGraph.js +21 -6
- package/src/core/model/node-graph/node/NodeDescription.d.ts +36 -0
- package/src/core/model/node-graph/node/NodeDescription.d.ts.map +1 -1
- package/src/core/model/node-graph/node/NodeDescription.js +41 -0
- package/src/core/model/node-graph/visual/ConnectionVisualData.d.ts +119 -0
- package/src/core/model/node-graph/visual/ConnectionVisualData.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/ConnectionVisualData.js +317 -0
- package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.d.ts +4 -0
- package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.js +125 -22
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +91 -2
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/NodeGraphVisualData.js +164 -113
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts +162 -0
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.js +288 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +109 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.js +141 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +149 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +175 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +137 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.js +242 -0
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +114 -0
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/RouteSearch.js +300 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +86 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.js +168 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts +48 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +555 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts +34 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.js +202 -0
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts +34 -0
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.js +254 -0
- package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +184 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +95 -0
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +56 -0
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +131 -0
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +36 -0
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_order_layers.js +415 -0
- package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts +21 -0
- package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_orient_links.js +49 -0
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts +41 -0
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/route_connections.js +309 -0
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +33 -0
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +237 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +25 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.js +220 -0
- package/src/core/model/node-graph/visual/layout/route_to_spline.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/route_to_spline.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/route_to_spline.js +120 -0
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +593 -586
- package/src/engine/EntityCreator.js +116 -116
- package/src/engine/achievements/AchievementManager.js +437 -437
- package/src/engine/animation/AnimatedActions.js +111 -111
- package/src/engine/animation/AnimationUtils.d.ts.map +1 -1
- package/src/engine/animation/AnimationUtils.js +246 -234
- package/src/engine/animation/Animations.d.ts +1 -0
- package/src/engine/animation/Animations.d.ts.map +1 -1
- package/src/engine/animation/Animations.js +13 -5
- package/src/engine/animation/clip/bind_property_writer.d.ts.map +1 -1
- package/src/engine/animation/clip/bind_property_writer.js +12 -5
- package/src/engine/animation/curve/binding/BoundTransform64Writer.d.ts +29 -0
- package/src/engine/animation/curve/binding/BoundTransform64Writer.d.ts.map +1 -0
- package/src/engine/animation/curve/binding/BoundTransform64Writer.js +80 -0
- package/src/engine/animation/removeEntityWithMeshParticlesEffect.js +4 -4
- package/src/engine/asset/loaders/gltf_test_fixtures.d.ts.map +1 -1
- package/src/engine/asset/loaders/gltf_test_fixtures.js +5 -4
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +12 -12
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +77 -44
- package/src/engine/control/first-person/abilities/LedgeGrab.js +1 -1
- package/src/engine/control/first-person/abilities/Mantle.js +1 -1
- package/src/engine/control/first-person/abilities/Slide.js +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.d.ts +5 -9
- package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.js +59 -29
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +2 -2
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +7 -7
- package/src/engine/ecs/EventType.d.ts +1 -0
- package/src/engine/ecs/EventType.js +35 -10
- package/src/engine/ecs/dynamic_actions/actions/definition/SendRequestActionDescription.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/actions/definition/SendRequestActionDescription.js +12 -4
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +4 -4
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +10 -11
- package/src/engine/ecs/grid/pick.js +1 -1
- package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.d.ts +1 -1
- package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +13 -13
- package/src/engine/ecs/gui/hud/testHudEdgeStick.js +3 -3
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +10 -10
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +8 -8
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +1 -1
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +120 -97
- package/src/engine/ecs/ik/ik_bone_chain.d.ts +16 -5
- package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_bone_chain.js +16 -4
- package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +7 -3
- package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_probe_terrain_contact.js +20 -16
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +18 -0
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -0
- package/src/engine/ecs/ik/ik_write_local_rotation.js +30 -0
- package/src/engine/ecs/parent/EntityNode.d.ts +24 -6
- package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
- package/src/engine/ecs/parent/EntityNode.js +54 -42
- package/src/engine/ecs/parent/EntityNodeFlags.d.ts +0 -1
- package/src/engine/ecs/parent/EntityNodeFlags.js +7 -8
- package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +4 -4
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +2 -0
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts +5 -2
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/Terrain.js +7 -4
- package/src/engine/ecs/terrain/ecs/TerrainSystem.js +3 -3
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +7 -7
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +84 -36
- package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +513 -0
- package/src/engine/ecs/transform/Transform64.d.ts +48 -11
- package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform64.js +54 -15
- package/src/engine/ecs/transform/Transform64SerializationAdapter.d.ts +37 -0
- package/src/engine/ecs/transform/Transform64SerializationAdapter.d.ts.map +1 -0
- package/src/engine/ecs/transform/Transform64SerializationAdapter.js +75 -0
- package/src/engine/ecs/transform/__probe.d.ts +4 -0
- package/src/engine/ecs/transform/__probe.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_allocation_probe.d.ts +31 -0
- package/src/engine/ecs/transform/t64_allocation_probe.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_allocation_probe.js +78 -0
- package/src/engine/ecs/transform/t64_announce_change.d.ts +33 -0
- package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_announce_change.js +39 -0
- package/src/engine/ecs/transform/t64_equals_components.d.ts +30 -0
- package/src/engine/ecs/transform/t64_equals_components.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_equals_components.js +59 -0
- package/src/engine/ecs/transform/t64_read_rotation.d.ts +13 -0
- package/src/engine/ecs/transform/t64_read_rotation.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_read_rotation.js +16 -0
- package/src/engine/ecs/transform/t64_read_translation.d.ts +14 -0
- package/src/engine/ecs/transform/t64_read_translation.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_read_translation.js +17 -0
- package/src/engine/ecs/transform-attachment/TransformAttachment.d.ts +5 -5
- package/src/engine/ecs/transform-attachment/TransformAttachment.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachment.js +4 -4
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +10 -10
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +71 -20
- package/src/engine/graphics/debug/createDebugLabel.js +3 -3
- package/src/engine/graphics/ecs/camera/pp/PerfectPanner.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +5 -4
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +8 -3
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +6 -6
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +25 -13
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraLanderSystem.js +1 -1
- package/src/engine/graphics/ecs/mesh/setMesh.js +2 -2
- package/src/engine/graphics/ecs/path/entity/EntityPath.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/entity/EntityPath.js +21 -7
- package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.d.ts +4 -4
- package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.js +4 -4
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts +2 -2
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +145 -135
- package/src/engine/graphics/geometry/MikkT/Build4RuleGroups.js +2 -2
- package/src/engine/graphics/geometry/MikkT/DegenEpilogue.js +1 -1
- package/src/engine/graphics/geometry/MikkT/DegenPrologue.js +1 -1
- package/src/engine/graphics/geometry/MikkT/EvalTspace.js +1 -1
- package/src/engine/graphics/geometry/MikkT/GenerateTSpaces.js +3 -3
- package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +659 -0
- package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +21 -5
- package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts +45 -0
- package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/FrameGraph.js +282 -60
- package/src/engine/graphics/render/frame_graph/FramePassBuilder.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/FramePassBuilder.js +20 -9
- package/src/engine/graphics/render/frame_graph/FramePassNode.d.ts +12 -0
- package/src/engine/graphics/render/frame_graph/FramePassNode.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/FramePassNode.js +13 -0
- package/src/engine/graphics/render/frame_graph/FramePassResources.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/FramePassResources.js +5 -0
- package/src/engine/graphics/render/frame_graph/ResourceEntry.d.ts +19 -1
- package/src/engine/graphics/render/frame_graph/ResourceEntry.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/ResourceEntry.js +23 -1
- package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.d.ts +15 -1
- package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.js +33 -16
- package/src/engine/graphics/render/frame_graph/resource/RenderResourceManager.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/resource/RenderResourceManager.js +19 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +6 -6
- package/src/engine/graphics3/CameraSystem.d.ts +6 -6
- package/src/engine/graphics3/CameraSystem.d.ts.map +1 -1
- package/src/engine/graphics3/CameraSystem.js +170 -170
- package/src/engine/graphics3/DecalSystem.d.ts +6 -6
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +449 -449
- package/src/engine/graphics3/LightSystem.d.ts +6 -6
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +234 -221
- package/src/engine/graphics3/MeshSystem.d.ts +6 -6
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +53 -22
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +20 -15
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSystem.js +198 -184
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts +6 -6
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem.js +310 -289
- package/src/engine/graphics3/PickingSystem.d.ts +6 -6
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem.js +273 -273
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -6
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +180 -169
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem.js +565 -566
- package/src/engine/graphics3/Trail3DSystem.d.ts +6 -6
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +221 -221
- package/src/engine/graphics3/camera_sync_from_transform.d.ts +2 -2
- package/src/engine/graphics3/camera_sync_from_transform.d.ts.map +1 -1
- package/src/engine/graphics3/camera_sync_from_transform.js +2 -1
- package/src/engine/graphics3/debug/gizmo_view_from_camera.js +4 -4
- package/src/engine/graphics3/particles/GPUParticularRenderer.d.ts +6 -0
- package/src/engine/graphics3/particles/GPUParticularRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/particles/GPUParticularRenderer.js +82 -53
- package/src/engine/graphics3/particles/particle_gpu_records.d.ts +12 -8
- package/src/engine/graphics3/particles/particle_gpu_records.d.ts.map +1 -1
- package/src/engine/graphics3/particles/particle_gpu_records.js +53 -45
- package/src/engine/graphics3/preview/make_model_preview_scene.js +1 -1
- package/src/engine/graphics3/shade_camera_projection_ray.js +4 -4
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts.map +1 -1
- package/src/engine/graphics3/shade_node_to_entity_composition.js +88 -84
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +7 -7
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +8 -8
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +9 -8
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +29 -8
- package/src/engine/input/ecs/controllers/KeyboardCameraController.js +2 -2
- package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +35 -21
- package/src/engine/intelligence/behavior/util/RotationBehavior.js +5 -5
- package/src/engine/intelligence/mcts/StateNode.js +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +7 -7
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -15
- package/src/engine/interpolation/pose_interpoland.d.ts +2 -2
- package/src/engine/interpolation/pose_interpoland.js +4 -4
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts +4 -4
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +39 -14
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts +7 -7
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts.map +1 -1
- package/src/engine/network/adapters/TransformReplicationAdapter.js +19 -20
- package/src/engine/network/replication/Replicator.d.ts +5 -3
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +65 -16
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -3
- package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
- package/src/engine/physics/ccd/linear_sweep.js +9 -3
- package/src/engine/physics/constraint/solve_constraints.js +10 -10
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +8 -8
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/ColliderObserverSystem.js +6 -6
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +22 -32
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +2337 -2310
- package/src/engine/physics/ecs/find_non_finite_physics_state.js +6 -6
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +7 -7
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +16 -8
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +4 -4
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidSystem.js +6 -6
- package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts +2 -2
- package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/WorkerFluidSystem.js +4 -4
- package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +7 -7
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +4 -4
- package/src/engine/physics/fluid/effector/WakeFluidEffector.js +7 -7
- package/src/engine/physics/inertia/world_inverse_inertia.js +1 -1
- package/src/engine/physics/integration/integrate_position.d.ts.map +1 -1
- package/src/engine/physics/integration/integrate_position.js +13 -12
- package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.d.ts.map +1 -1
- package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.js +23 -5
- package/src/engine/physics/narrowphase/compute_penetration.js +18 -14
- package/src/engine/physics/narrowphase/convex_convex_manifold.js +2 -2
- package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +9 -9
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/narrowphase_step.js +95 -68
- package/src/engine/physics/narrowphase/refine_ray_concave.js +1 -1
- package/src/engine/physics/narrowphase/refine_ray_hit.js +3 -3
- package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
- package/src/engine/physics/queries/overlap_shape.js +19 -7
- package/src/engine/physics/queries/raycast.js +3 -3
- package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
- package/src/engine/physics/queries/shape_cast.js +628 -620
- package/src/engine/physics/solver/solve_contacts.js +10 -10
- package/src/engine/physics/vehicle/RaycastVehicle.d.ts +6 -5
- package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
- package/src/engine/physics/vehicle/RaycastVehicle.js +10 -5
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts +16 -4
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/SoundListenerSystem.js +70 -11
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +7 -7
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +343 -338
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +2 -2
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/LiveEmitterSet.js +356 -345
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +23 -2
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +174 -140
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts +6 -6
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +185 -184
- package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.js +1 -1
- package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts +2 -1
- package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts.map +1 -1
- package/src/engine/sound/simulation/core/AcousticRegionIndex.js +4 -3
- package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts +3 -2
- package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts.map +1 -1
- package/src/engine/sound/simulation/core/AcousticVolumeRegion.js +6 -4
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +10 -6
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +32 -7
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts +7 -7
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +6 -6
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.js +8 -2
- package/src/format/scene/gltf/gltf_component_type.d.ts.map +1 -1
- package/src/format/scene/gltf/gltf_component_type.js +3 -1
- package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
- package/src/format/texture/ktx2/ktx2_read.js +2 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +8 -1
- package/src/generation/markers/GridCellActionPlaceMarker.d.ts +4 -4
- package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
- package/src/generation/markers/GridCellActionPlaceMarker.js +16 -6
- package/src/generation/markers/MarkerNode.d.ts +3 -3
- package/src/generation/markers/MarkerNode.d.ts.map +1 -1
- package/src/generation/markers/MarkerNode.js +3 -3
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts +4 -4
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts.map +1 -1
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +7 -7
- package/src/generation/markers/actions/MarkerNodeActionImaginary.d.ts.map +1 -1
- package/src/generation/markers/actions/MarkerNodeActionImaginary.js +20 -2
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +13 -3
- package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.js +11 -1
- package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +8 -4
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +13 -5
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +8 -2
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +16 -2
- package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
- package/src/shade/device/graph/BufferResourceDescriptor.js +193 -184
- package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
- package/src/shade/device/graph/TextureResourceDescriptor.js +12 -0
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +8 -0
- package/src/shade/playground/avboit/main.js +3 -3
- package/src/shade/playground/basis_textures/main.js +1 -1
- package/src/shade/playground/ground_seam/main.js +1 -1
- package/src/shade/playground/particle_editor/README.md +175 -0
- package/src/shade/playground/particle_editor/index.html +76 -0
- package/src/shade/playground/particle_editor/main.d.ts +2 -0
- package/src/shade/playground/particle_editor/main.d.ts.map +1 -0
- package/src/shade/playground/particle_editor/main.js +139 -0
- package/src/shade/playground/particle_system/README.md +92 -62
- package/src/shade/playground/particle_system/index.html +67 -21
- package/src/shade/playground/particle_system/main.js +247 -102
- package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.d.ts +21 -18
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -0
- package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.js +197 -181
- package/src/shade/playground/particle_system/particle_scene.d.ts +136 -20
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +487 -670
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -2
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +2 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +2 -1
- package/src/shade/playground/sponza_path_trace/main.js +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +917 -917
- package/src/shade/playground/volumetrics_froxel/measure.js +559 -559
- package/src/shade/renderer/Renderer.d.ts +28 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +140 -8
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +4 -2
- package/src/shade/renderer/buffer/graph_read_buffer.d.ts.map +1 -1
- package/src/shade/renderer/buffer/graph_read_buffer.js +8 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +30 -0
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +84 -0
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +27 -0
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_database_words.d.ts +24 -0
- package/src/shade/renderer/buffer/table/gpu_database_words.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_database_words.js +92 -0
- package/src/shade/renderer/camera/Camera.d.ts +2 -2
- package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
- package/src/shade/renderer/camera/Camera.js +11 -5
- package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
- package/src/shade/renderer/camera/GPUCameraContext.js +2 -1
- package/src/shade/renderer/camera/OrbitalCameraController.d.ts +3 -3
- package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
- package/src/shade/renderer/camera/OrbitalCameraController.js +31 -16
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +2 -2
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +4 -3
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +10 -5
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +8 -4
- package/src/shade/renderer/extension/FrameContext.d.ts.map +1 -1
- package/src/shade/renderer/extension/FrameContext.js +5 -0
- package/src/shade/renderer/extension/FrameRecord.d.ts +16 -0
- package/src/shade/renderer/extension/FrameRecord.d.ts.map +1 -1
- package/src/shade/renderer/extension/FrameRecord.js +31 -0
- package/src/shade/renderer/extension/GBufferTextures.d.ts +11 -0
- package/src/shade/renderer/extension/GBufferTextures.d.ts.map +1 -1
- package/src/shade/renderer/extension/GBufferTextures.js +14 -0
- package/src/shade/renderer/geometry/attribute/gpu_vertex_buffer_layout_from_spec.js +1 -1
- package/src/shade/renderer/geometry/util/geometry_stripify.js +6 -6
- package/src/shade/renderer/geometry/virtual/format/prototypeVGEOFormatViewer.js +8 -8
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +14 -5
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +17 -9
- package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.js +4 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +11 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.js +4 -2
- package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +5 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +35 -11
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/DESIGN.md +271 -112
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +251 -86
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +822 -146
- package/src/shade/renderer/particles/ParticleConstants.d.ts +96 -3
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +103 -4
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +5 -4
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +11 -15
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +2 -2
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -1
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +20 -15
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +7 -8
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +7 -17
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +56 -0
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +68 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts +39 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.js +52 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +83 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +166 -0
- package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts +21 -5
- package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/chunk_particle_emitter.js +44 -85
- package/src/shade/renderer/particles/data/particle_header.d.ts +62 -0
- package/src/shade/renderer/particles/data/particle_header.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/particle_header.js +103 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +179 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +120 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +90 -1
- package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts +283 -0
- package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/ParticleNodeGroup.js +419 -0
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +44 -2
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +476 -40
- package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +188 -0
- package/src/shade/renderer/particles/graph/ParticleValueType.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -0
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +16 -9
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +464 -205
- package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts +11 -0
- package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/flatten_particle_graph.js +213 -0
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts +27 -0
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +75 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +83 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +319 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts +22 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +517 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts +70 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_utility.js +161 -0
- package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts +8 -0
- package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/simplex_reference.js +159 -0
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +88 -0
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +234 -0
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts +98 -0
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/make_particle_group.js +427 -0
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +11 -4
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_authoring.js +121 -108
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +38 -0
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +25 -0
- package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts +29 -0
- package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -0
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +87 -0
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_graph_json.js +196 -0
- package/src/shade/renderer/particles/graph/particle_group_json.d.ts +86 -0
- package/src/shade/renderer/particles/graph/particle_group_json.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_group_json.js +182 -0
- package/src/shade/renderer/particles/graph/particle_group_library.d.ts +33 -0
- package/src/shade/renderer/particles/graph/particle_group_library.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_group_library.js +75 -0
- package/src/shade/renderer/particles/graph/particle_node_library.d.ts +37 -0
- package/src/shade/renderer/particles/graph/particle_node_library.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_node_library.js +64 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +146 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.js +234 -0
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts +30 -0
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_node_presentation.js +286 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +66 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.js +439 -0
- package/src/shade/renderer/particles/graph_particles.d.ts +143 -68
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +424 -71
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts +107 -0
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph_particles_avboit.js +312 -0
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts +41 -8
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +111 -33
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +13 -10
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleAssembler.js +30 -26
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +27 -15
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +139 -34
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +117 -9
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +296 -37
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +149 -0
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/particle_assembly.js +999 -0
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +25 -3
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +33 -5
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +160 -0
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +478 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +291 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +647 -0
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +95 -0
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +213 -0
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +16 -0
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +223 -0
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +121 -0
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +206 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +11 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +197 -0
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +561 -0
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +72 -0
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +86 -0
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_peephole.js +271 -0
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +268 -0
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +151 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts +131 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -0
- package/src/shade/renderer/particles/particle_test_fixtures.js +203 -0
- package/src/shade/renderer/particles/runtime/Emitter.d.ts +219 -0
- package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +128 -60
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +286 -117
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +264 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +404 -0
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +49 -15
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +51 -18
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.js +72 -32
- 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 +4 -4
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +15 -0
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts +17 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.js +75 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts +20 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +94 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +15 -5
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts +1 -2
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.js +1 -2
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts +11 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.js +13 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts +17 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.js +22 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +14 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.js +23 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts +18 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.js +24 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +26 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +59 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts +14 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +153 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts +3 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +124 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts +19 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +147 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -8
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +72 -37
- package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts +5 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.js +216 -0
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +7 -3
- package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_render.js +132 -197
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +78 -24
- package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts +26 -0
- package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.js +66 -0
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +21 -36
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +2 -2
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +100 -90
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +270 -138
- package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts +1 -2
- package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +0 -3
- package/src/shade/renderer/postprocess/dof/gather/DepthOfFieldU.js +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/DepthOfField.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.js +3 -2
- package/src/shade/renderer/postprocess/nss/generate_NSS_WEIGHTS_ACTUAL.js +3 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +87 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +61 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +179 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +27 -2
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +9 -2
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +12 -3
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts +18 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +58 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +25 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +69 -10
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +10 -4
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +4 -39
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +7 -2
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +16 -2
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +3 -3
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +29 -23
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.js +3 -3
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +4 -4
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts +7 -7
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +79 -71
- package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.js +3 -1
- package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts +13 -3
- package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.js +15 -5
- package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts +8 -0
- package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/random/chunk_random_uint.js +15 -5
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.js +17 -7
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.js +26 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.js +26 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +8 -2
- package/src/shade/renderer/shadow/map/PointLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/PointLightShadowmap.js +7 -2
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +3 -15
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +10 -4
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +7 -2
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +2 -2
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +3 -3
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +3 -3
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +66 -5
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +35 -4
- package/src/view/minimap/Minimap.d.ts.map +1 -1
- package/src/view/minimap/Minimap.js +227 -225
- package/src/view/minimap/MinimapCanvasView.js +3 -3
- package/src/view/minimap/MinimapMarker.d.ts +45 -0
- package/src/view/minimap/MinimapMarker.d.ts.map +1 -0
- package/src/view/minimap/MinimapMarker.js +80 -0
- package/src/view/minimap/MinimapMarkerCollection.d.ts +6 -5
- package/src/view/minimap/MinimapMarkerCollection.d.ts.map +1 -1
- package/src/view/minimap/MinimapMarkerCollection.js +6 -6
- package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts +19 -0
- package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts.map +1 -0
- package/src/view/minimap/MinimapMarkerSerializationAdapter.js +42 -0
- package/src/view/minimap/dom/MinimapCameraView.d.ts +1 -1
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +23 -4
- package/src/view/minimap/dom/MinimapMarkerView.js +3 -3
- package/src/view/minimap/gl/MarkerGL.js +3 -3
- package/src/view/util/DomLayoutFrame.d.ts +53 -0
- package/src/view/util/DomLayoutFrame.d.ts.map +1 -0
- package/src/view/util/DomLayoutFrame.js +122 -0
- package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.js +0 -19
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.js +0 -241
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.js +0 -40
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.js +0 -28
- package/src/engine/ecs/util/hideEntityGracefully.js +0 -196
- package/src/shade/renderer/particles/cull/chunk_particle_cull.js +0 -38
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +0 -214
- package/src/shade/renderer/particles/particle_prototype.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.js +0 -86
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +0 -52
- package/src/shade/renderer/particles/shaders/chunk_particle_context.js +0 -58
|
@@ -0,0 +1,999 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PARTICLE_RECORD_WORD_COUNT,
|
|
3
|
+
PARTICLE_VM_INSTRUCTION_WORDS,
|
|
4
|
+
PARTICLE_VM_MAX_INSTRUCTIONS,
|
|
5
|
+
PARTICLE_VM_REGISTER_SLOTS,
|
|
6
|
+
} from "../ParticleConstants.js";
|
|
7
|
+
import { ParticleProgram } from "./ParticleProgram.js";
|
|
8
|
+
import {
|
|
9
|
+
VM_BUILTIN,
|
|
10
|
+
VM_ISA,
|
|
11
|
+
VM_MAX_WIDTH,
|
|
12
|
+
VM_OP,
|
|
13
|
+
VM_OPERAND,
|
|
14
|
+
VM_WIDTH,
|
|
15
|
+
vm_decode_op,
|
|
16
|
+
vm_decode_width,
|
|
17
|
+
vm_encode_word0,
|
|
18
|
+
vm_operation_width,
|
|
19
|
+
vm_visit_register_operands,
|
|
20
|
+
} from "./ParticleVMISA.js";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The textual form of a {@link ParticleProgram} — the particle VM's assembly language.
|
|
24
|
+
*
|
|
25
|
+
* A compiled effect is otherwise two opaque `Uint32Array`s. This module gives them a syntax that
|
|
26
|
+
* reads back exactly what {@link ./ParticleVMISA.js} defines, so a program can be looked at, edited
|
|
27
|
+
* by hand, diffed, and pasted between sessions. It is the level below the node graph: the graph
|
|
28
|
+
* compiler lowers to instructions, and this is what those instructions look like.
|
|
29
|
+
*
|
|
30
|
+
* Encode and decode live in one file on purpose. They are one language, and a divergence between
|
|
31
|
+
* them is the failure mode that matters — {@link ./particle_assembly.spec.js} pins the round trip in
|
|
32
|
+
* both directions.
|
|
33
|
+
*
|
|
34
|
+
* ## Syntax
|
|
35
|
+
*
|
|
36
|
+
* ```
|
|
37
|
+
* ; a comment, or // a comment
|
|
38
|
+
* .registers 6 ; register file size in slots, optional (derived from use when absent)
|
|
39
|
+
* .const c0 0 ; one word of the constant pool; indices must be dense from 0
|
|
40
|
+
* .const c1 2
|
|
41
|
+
*
|
|
42
|
+
* .init ; section — everything until the next section directive
|
|
43
|
+
* LOAD_BUILTIN.3 r0, EMITTER_POSITION
|
|
44
|
+
* RANDOM.2 r1
|
|
45
|
+
* SCALE.2 r1, r1, r2
|
|
46
|
+
* STORE_ATTR r1, @1, 3 ; store r1 into the 3-component attribute at record word 1
|
|
47
|
+
*
|
|
48
|
+
* .update
|
|
49
|
+
* LOAD_ATTR.1 r0, @7, 1
|
|
50
|
+
* CMP_GE.1 r0, r0, r1
|
|
51
|
+
* KILL r0
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* The `.n` on a mnemonic is the lane count the instruction spans — `ADD.3` adds three lanes. It is
|
|
55
|
+
* written for every opcode that reads the width field, which is all of them bar the handful whose
|
|
56
|
+
* lane count is fixed (`HALT`, `NOP`, `KILL`, `CROSS`) and `STORE_ATTR`, whose width is by
|
|
57
|
+
* definition the component count it already spells as an operand. Left off, it falls back to the
|
|
58
|
+
* opcode's natural width, so text typed by hand need not carry one.
|
|
59
|
+
*
|
|
60
|
+
* Operand spelling follows the slot's role in {@link VM_ISA}, so every token is unambiguous where it
|
|
61
|
+
* stands:
|
|
62
|
+
*
|
|
63
|
+
* | role | spelling | example |
|
|
64
|
+
* |---|---|---|
|
|
65
|
+
* | register / destination | `r<slot>` | `r3` |
|
|
66
|
+
* | constant-pool word | `c<word>` | `c0` |
|
|
67
|
+
* | attribute word offset | `@<word>` | `@7` |
|
|
68
|
+
* | attribute component count | a bare integer `1..4` | `3` |
|
|
69
|
+
* | builtin | a {@link VM_BUILTIN} name | `EMITTER_POSITION` |
|
|
70
|
+
* | curve handle | `k<handle>` | `k2` |
|
|
71
|
+
* | swizzle pattern | `.<four of xyzw>` | `.xxyz` |
|
|
72
|
+
*
|
|
73
|
+
* `STORE_ATTR` and `KILL` carry a *source* register in the destination slot — the ISA's own
|
|
74
|
+
* encoding, spelled here the way it is encoded rather than reordered to read like a store.
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
/** Section directive introducing the INIT stream. @type {string} */
|
|
78
|
+
export const PARTICLE_ASSEMBLY_SECTION_INIT = ".init";
|
|
79
|
+
|
|
80
|
+
/** Section directive introducing the UPDATE stream. @type {string} */
|
|
81
|
+
export const PARTICLE_ASSEMBLY_SECTION_UPDATE = ".update";
|
|
82
|
+
|
|
83
|
+
/** Directive pinning the register-file size. @type {string} */
|
|
84
|
+
export const PARTICLE_ASSEMBLY_DIRECTIVE_REGISTERS = ".registers";
|
|
85
|
+
|
|
86
|
+
/** Directive declaring one constant-pool entry. @type {string} */
|
|
87
|
+
export const PARTICLE_ASSEMBLY_DIRECTIVE_CONST = ".const";
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Separates a mnemonic from the lane count it spans: `ADD.3`.
|
|
91
|
+
*
|
|
92
|
+
* The same character opens a directive and a swizzle pattern, but never in this position — a line
|
|
93
|
+
* starts with either a directive or a mnemonic, and a swizzle is an operand.
|
|
94
|
+
*
|
|
95
|
+
* @type {string}
|
|
96
|
+
*/
|
|
97
|
+
export const PARTICLE_ASSEMBLY_WIDTH_SEPARATOR = ".";
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Largest constant-pool word index this will read.
|
|
101
|
+
*
|
|
102
|
+
* The pool is dense, so a declaration at index N implies a pool of N + 1 words — and this text is
|
|
103
|
+
* being typed into a live editor, where `c900000000` is one slipped keystroke away from `c9`. Without
|
|
104
|
+
* a bound the parser tries to allocate that pool and takes the page with it, which is a worse answer
|
|
105
|
+
* to a typo than a marker on the line.
|
|
106
|
+
*
|
|
107
|
+
* Generous against any real program: an effect's constants are its literals, and the whole
|
|
108
|
+
* instruction budget is {@link PARTICLE_VM_MAX_INSTRUCTIONS} per section.
|
|
109
|
+
*
|
|
110
|
+
* @type {number}
|
|
111
|
+
*/
|
|
112
|
+
export const PARTICLE_ASSEMBLY_MAX_CONSTANTS = 4096;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Lane selector characters, indexed by the 2-bit selector value the `SWIZZLE` opcode packs.
|
|
116
|
+
* @type {string}
|
|
117
|
+
*/
|
|
118
|
+
const SWIZZLE_LANES = "xyzw";
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Mnemonic -> opcode, derived from {@link VM_ISA} so the two cannot drift.
|
|
122
|
+
* @type {Map<string, number>}
|
|
123
|
+
*/
|
|
124
|
+
const OPCODE_BY_NAME = new Map();
|
|
125
|
+
|
|
126
|
+
for (const [opcode, meta] of VM_ISA) {
|
|
127
|
+
OPCODE_BY_NAME.set(meta.name, opcode);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Invert a numeric enum for name lookup by value.
|
|
132
|
+
* @param {Object<string, number>} enumeration
|
|
133
|
+
* @returns {Map<number, string>}
|
|
134
|
+
*/
|
|
135
|
+
function invert(enumeration) {
|
|
136
|
+
const result = new Map();
|
|
137
|
+
|
|
138
|
+
for (const name of Object.keys(enumeration)) {
|
|
139
|
+
result.set(enumeration[name], name);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const BUILTIN_NAME_BY_ID = invert(VM_BUILTIN);
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* One problem found while reading assembly text. Carries the source line so an editor can put a
|
|
149
|
+
* marker on it; `line` is 1-based, and 0 for a problem that belongs to the program as a whole
|
|
150
|
+
* rather than to any one line.
|
|
151
|
+
*
|
|
152
|
+
* @typedef {object} ParticleAssemblyDiagnostic
|
|
153
|
+
* @property {number} line 1-based source line, or 0
|
|
154
|
+
* @property {string} message
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Render a compiled program as assembly text.
|
|
159
|
+
*
|
|
160
|
+
* The output is exactly what {@link parse_particle_assembly} reads back: a program disassembled and
|
|
161
|
+
* reassembled is the same program, word for word, including a register count larger than the
|
|
162
|
+
* instructions themselves imply.
|
|
163
|
+
*
|
|
164
|
+
* @param {ParticleProgram} program
|
|
165
|
+
* @param {object} [options]
|
|
166
|
+
* @param {string} [options.indent] leading whitespace for instruction lines
|
|
167
|
+
* @returns {string}
|
|
168
|
+
*/
|
|
169
|
+
export function disassemble_particle_program(program, { indent = " " } = {}) {
|
|
170
|
+
const lines = [];
|
|
171
|
+
|
|
172
|
+
lines.push(`${PARTICLE_ASSEMBLY_DIRECTIVE_REGISTERS} ${program.register_count}`);
|
|
173
|
+
|
|
174
|
+
const constants = program.constants;
|
|
175
|
+
|
|
176
|
+
// The pool is a flat run of words that instructions index into at whatever width they read, so
|
|
177
|
+
// there are no "entries" to print — one word per line, named by its index, is the only rendering
|
|
178
|
+
// that survives a round trip whatever widths the program reads it at.
|
|
179
|
+
if (constants.length > 0) {
|
|
180
|
+
lines.push("");
|
|
181
|
+
|
|
182
|
+
for (let i = 0; i < constants.length; i++) {
|
|
183
|
+
lines.push(`${PARTICLE_ASSEMBLY_DIRECTIVE_CONST} c${i} ${format_float(constants[i])}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
for (const section of [
|
|
188
|
+
{ directive: PARTICLE_ASSEMBLY_SECTION_INIT, words: program.init },
|
|
189
|
+
{ directive: PARTICLE_ASSEMBLY_SECTION_UPDATE, words: program.update },
|
|
190
|
+
]) {
|
|
191
|
+
lines.push("");
|
|
192
|
+
lines.push(section.directive);
|
|
193
|
+
|
|
194
|
+
const instruction_count = section.words.length / PARTICLE_VM_INSTRUCTION_WORDS;
|
|
195
|
+
|
|
196
|
+
for (let i = 0; i < instruction_count; i++) {
|
|
197
|
+
lines.push(indent + disassemble_instruction(section.words, i * PARTICLE_VM_INSTRUCTION_WORDS));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return lines.join("\n") + "\n";
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Render one instruction.
|
|
206
|
+
* @param {Uint32Array} words
|
|
207
|
+
* @param {number} base word index of the instruction
|
|
208
|
+
* @returns {string}
|
|
209
|
+
*/
|
|
210
|
+
function disassemble_instruction(words, base) {
|
|
211
|
+
const word0 = words[base];
|
|
212
|
+
const op = vm_decode_op(word0);
|
|
213
|
+
const width = vm_decode_width(word0);
|
|
214
|
+
const meta = VM_ISA.get(op);
|
|
215
|
+
|
|
216
|
+
if (meta === undefined) {
|
|
217
|
+
// Not reachable from a validated program, but a disassembler that throws is useless for
|
|
218
|
+
// looking at the thing that went wrong.
|
|
219
|
+
return `; unknown opcode ${op} [${words[base + 1]}, ${words[base + 2]}, ${words[base + 3]}, ${words[base + 4]}]`;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const operands = [];
|
|
223
|
+
|
|
224
|
+
if (meta.dst) {
|
|
225
|
+
operands.push(`r${words[base + 1]}`);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
for (let slot = 0; slot < 3; slot++) {
|
|
229
|
+
const role = meta.operands[slot];
|
|
230
|
+
|
|
231
|
+
if (role === VM_OPERAND.NONE) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
operands.push(format_operand(role, words[base + 2 + slot]));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const mnemonic = meta.name + format_width_suffix(op, meta, width);
|
|
239
|
+
|
|
240
|
+
return operands.length === 0 ? mnemonic : `${mnemonic} ${operands.join(", ")}`;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* The `.n` a mnemonic wears to say how many lanes it spans.
|
|
245
|
+
*
|
|
246
|
+
* Only the opcodes that actually read the width field get one. `STORE_ATTR` is the exception among
|
|
247
|
+
* those: its width is defined to be its component count, which is already written as an operand, so
|
|
248
|
+
* a suffix there would be a second copy of one number and a chance to write them contradicting each
|
|
249
|
+
* other.
|
|
250
|
+
*
|
|
251
|
+
* @param {number} op
|
|
252
|
+
* @param {object} meta the opcode's {@link VM_ISA} entry
|
|
253
|
+
* @param {number} width
|
|
254
|
+
* @returns {string}
|
|
255
|
+
*/
|
|
256
|
+
function format_width_suffix(op, meta, width) {
|
|
257
|
+
if (meta.width !== VM_WIDTH.VARIABLE || op === VM_OP.STORE_ATTR) {
|
|
258
|
+
return "";
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return `${PARTICLE_ASSEMBLY_WIDTH_SEPARATOR}${width}`;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* @param {string} role a {@link VM_OPERAND} value
|
|
266
|
+
* @param {number} value
|
|
267
|
+
* @returns {string}
|
|
268
|
+
*/
|
|
269
|
+
function format_operand(role, value) {
|
|
270
|
+
switch (role) {
|
|
271
|
+
case VM_OPERAND.REG:
|
|
272
|
+
case VM_OPERAND.DST:
|
|
273
|
+
return `r${value}`;
|
|
274
|
+
case VM_OPERAND.CONST:
|
|
275
|
+
return `c${value}`;
|
|
276
|
+
case VM_OPERAND.ATTR_OFFSET:
|
|
277
|
+
return `@${value}`;
|
|
278
|
+
case VM_OPERAND.COMP:
|
|
279
|
+
return String(value);
|
|
280
|
+
case VM_OPERAND.BUILTIN:
|
|
281
|
+
return BUILTIN_NAME_BY_ID.get(value) ?? String(value);
|
|
282
|
+
case VM_OPERAND.CURVE:
|
|
283
|
+
return `k${value}`;
|
|
284
|
+
case VM_OPERAND.SWIZZLE:
|
|
285
|
+
return format_swizzle(value);
|
|
286
|
+
default:
|
|
287
|
+
return String(value);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* @param {number} packed four 2-bit lane selectors
|
|
293
|
+
* @returns {string} `.xyzw` form
|
|
294
|
+
*/
|
|
295
|
+
function format_swizzle(packed) {
|
|
296
|
+
let result = ".";
|
|
297
|
+
|
|
298
|
+
for (let lane = 0; lane < 4; lane++) {
|
|
299
|
+
result += SWIZZLE_LANES.charAt((packed >>> (lane * 2)) & 3);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* A float spelled so it reads back as itself.
|
|
307
|
+
*
|
|
308
|
+
* `Number.prototype.toString` round-trips an `f64` exactly, and these values came out of a
|
|
309
|
+
* `Float32Array`, so what it prints parses back to the same `f32`. It is often not pretty —
|
|
310
|
+
* `2.200000047683716` is what an author's `2.2` became on its way through the pool — but that is the
|
|
311
|
+
* number the program holds, and rounding it for the page would make the text a different program
|
|
312
|
+
* from the one it claims to be.
|
|
313
|
+
*
|
|
314
|
+
* @param {number} value
|
|
315
|
+
* @returns {string}
|
|
316
|
+
*/
|
|
317
|
+
function format_float(value) {
|
|
318
|
+
if (Number.isNaN(value)) {
|
|
319
|
+
return "nan";
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (value === Infinity) {
|
|
323
|
+
return "inf";
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (value === -Infinity) {
|
|
327
|
+
return "-inf";
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (Object.is(value, -0)) {
|
|
331
|
+
// String(-0) is "0", and a pool holding -0 is not element-wise equal to one holding +0
|
|
332
|
+
return "-0";
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return String(value);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Read assembly text into a program, reporting every problem rather than stopping at the first.
|
|
340
|
+
*
|
|
341
|
+
* An editor wants all of them at once — one marker per bad line, not a single exception — so this
|
|
342
|
+
* is the form both the tool and {@link assemble_particle_program} are built on.
|
|
343
|
+
*
|
|
344
|
+
* `program` is `null` when anything was wrong. It is never a partially-formed program: a caller
|
|
345
|
+
* that gets one back can hand it straight to the runtime.
|
|
346
|
+
*
|
|
347
|
+
* @param {string} text
|
|
348
|
+
* @returns {{program: ParticleProgram|null, diagnostics: ParticleAssemblyDiagnostic[]}}
|
|
349
|
+
*/
|
|
350
|
+
export function parse_particle_assembly(text) {
|
|
351
|
+
/** @type {ParticleAssemblyDiagnostic[]} */
|
|
352
|
+
const diagnostics = [];
|
|
353
|
+
|
|
354
|
+
const report = (line, message) => diagnostics.push({ line, message });
|
|
355
|
+
|
|
356
|
+
/** @type {number[]} flat constant pool, 4 floats per entry */
|
|
357
|
+
const constants = [];
|
|
358
|
+
/** @type {Set<number>} constant indices a `.const` directive has already claimed */
|
|
359
|
+
const declared_constants = new Set();
|
|
360
|
+
|
|
361
|
+
/** @type {{words: number[], lines: number[]}} */
|
|
362
|
+
const sections = {
|
|
363
|
+
init: { words: [], lines: [] },
|
|
364
|
+
update: { words: [], lines: [] },
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
/** @type {{words: number[], lines: number[]}|null} */
|
|
368
|
+
let section = null;
|
|
369
|
+
|
|
370
|
+
/** @type {number} explicit `.registers`, or -1 when it should be derived from use */
|
|
371
|
+
let declared_register_count = -1;
|
|
372
|
+
|
|
373
|
+
/** end of the furthest-reaching register operand any instruction writes down */
|
|
374
|
+
let register_high_water = 0;
|
|
375
|
+
|
|
376
|
+
const source_lines = String(text).split(/\r\n|\r|\n/);
|
|
377
|
+
|
|
378
|
+
for (let i = 0; i < source_lines.length; i++) {
|
|
379
|
+
const line_number = i + 1;
|
|
380
|
+
const line = strip_comment(source_lines[i]).trim();
|
|
381
|
+
|
|
382
|
+
if (line === "") {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (line.startsWith(".")) {
|
|
387
|
+
const directive = parse_directive(line, line_number, report);
|
|
388
|
+
|
|
389
|
+
if (directive === null) {
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
if (directive.kind === "section") {
|
|
394
|
+
section = sections[directive.section];
|
|
395
|
+
} else if (directive.kind === "registers") {
|
|
396
|
+
if (declared_register_count !== -1) {
|
|
397
|
+
report(line_number, `Duplicate ${PARTICLE_ASSEMBLY_DIRECTIVE_REGISTERS} directive`);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
declared_register_count = directive.count;
|
|
401
|
+
} else if (directive.kind === "const") {
|
|
402
|
+
if (directive.index >= PARTICLE_ASSEMBLY_MAX_CONSTANTS) {
|
|
403
|
+
// checked before anything is sized off it — see PARTICLE_ASSEMBLY_MAX_CONSTANTS
|
|
404
|
+
report(
|
|
405
|
+
line_number,
|
|
406
|
+
`Constant c${directive.index} is beyond the largest pool this reads `
|
|
407
|
+
+ `(${PARTICLE_ASSEMBLY_MAX_CONSTANTS} entries)`
|
|
408
|
+
);
|
|
409
|
+
} else if (declared_constants.has(directive.index)) {
|
|
410
|
+
report(line_number, `Constant c${directive.index} is declared more than once`);
|
|
411
|
+
} else {
|
|
412
|
+
declared_constants.add(directive.index);
|
|
413
|
+
|
|
414
|
+
// sparse declarations are caught below; the gaps read as zero until then
|
|
415
|
+
while (constants.length < directive.index + 1) {
|
|
416
|
+
constants.push(0);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
constants[directive.index] = directive.value;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
if (section === null) {
|
|
427
|
+
report(
|
|
428
|
+
line_number,
|
|
429
|
+
`Instruction outside a section — open one with ${PARTICLE_ASSEMBLY_SECTION_INIT} or ${PARTICLE_ASSEMBLY_SECTION_UPDATE}`
|
|
430
|
+
);
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const instruction = parse_instruction(line, line_number, report);
|
|
435
|
+
|
|
436
|
+
if (instruction === null) {
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (instruction.register_reach > register_high_water) {
|
|
441
|
+
register_high_water = instruction.register_reach;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
section.words.push(...instruction.words);
|
|
445
|
+
section.lines.push(line_number);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// dense constant indices: c0..cN-1 with nothing missing, so a pool index means the same thing
|
|
449
|
+
// here as it does in the arena
|
|
450
|
+
for (let i = 0; i < constants.length; i++) {
|
|
451
|
+
if (!declared_constants.has(i)) {
|
|
452
|
+
report(0, `Constant c${i} is referenced by the pool's length but never declared`);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const register_count = declared_register_count === -1 ? register_high_water : declared_register_count;
|
|
457
|
+
|
|
458
|
+
if (register_count > PARTICLE_VM_REGISTER_SLOTS) {
|
|
459
|
+
report(0, `Register file is ${PARTICLE_VM_REGISTER_SLOTS} slots, the program asks for ${register_count}`);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const constant_word_count = constants.length;
|
|
463
|
+
|
|
464
|
+
for (const [name, stream] of [["init", sections.init], ["update", sections.update]]) {
|
|
465
|
+
const instruction_count = stream.words.length / PARTICLE_VM_INSTRUCTION_WORDS;
|
|
466
|
+
|
|
467
|
+
if (instruction_count > PARTICLE_VM_MAX_INSTRUCTIONS) {
|
|
468
|
+
report(
|
|
469
|
+
0,
|
|
470
|
+
`${name} has ${instruction_count} instructions, the budget is ${PARTICLE_VM_MAX_INSTRUCTIONS}`
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
check_stream_references(stream, register_count, constant_word_count, report);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
if (diagnostics.length > 0) {
|
|
478
|
+
return { program: null, diagnostics };
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
return {
|
|
482
|
+
program: new ParticleProgram({
|
|
483
|
+
init: new Uint32Array(sections.init.words),
|
|
484
|
+
update: new Uint32Array(sections.update.words),
|
|
485
|
+
constants: new Float32Array(constants),
|
|
486
|
+
register_count,
|
|
487
|
+
}),
|
|
488
|
+
diagnostics,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Read assembly text into a program, throwing on the first problem.
|
|
494
|
+
*
|
|
495
|
+
* The convenience form for tests and tooling that has no way to show a list of markers.
|
|
496
|
+
*
|
|
497
|
+
* @param {string} text
|
|
498
|
+
* @returns {ParticleProgram}
|
|
499
|
+
* @throws {Error} carrying every diagnostic, `.diagnostics` holding them individually
|
|
500
|
+
*/
|
|
501
|
+
export function assemble_particle_program(text) {
|
|
502
|
+
const { program, diagnostics } = parse_particle_assembly(text);
|
|
503
|
+
|
|
504
|
+
if (program === null) {
|
|
505
|
+
const error = new Error(
|
|
506
|
+
"Particle assembly failed:\n"
|
|
507
|
+
+ diagnostics.map(d => (d.line > 0 ? ` line ${d.line}: ${d.message}` : ` ${d.message}`)).join("\n")
|
|
508
|
+
);
|
|
509
|
+
|
|
510
|
+
error.diagnostics = diagnostics;
|
|
511
|
+
|
|
512
|
+
throw error;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
return program;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Cross-check every operand against the pool and register file the program declares. Done as a pass
|
|
520
|
+
* over the parsed stream rather than per line so a `.registers` directive below the code it governs
|
|
521
|
+
* still applies to it.
|
|
522
|
+
*
|
|
523
|
+
* @param {{words: number[], lines: number[]}} stream
|
|
524
|
+
* @param {number} register_count
|
|
525
|
+
* @param {number} constant_word_count
|
|
526
|
+
* @param {function(number, string):void} report
|
|
527
|
+
*/
|
|
528
|
+
function check_stream_references(stream, register_count, constant_word_count, report) {
|
|
529
|
+
const words = stream.words;
|
|
530
|
+
const instruction_count = words.length / PARTICLE_VM_INSTRUCTION_WORDS;
|
|
531
|
+
|
|
532
|
+
for (let i = 0; i < instruction_count; i++) {
|
|
533
|
+
const base = i * PARTICLE_VM_INSTRUCTION_WORDS;
|
|
534
|
+
const line = stream.lines[i];
|
|
535
|
+
const meta = VM_ISA.get(vm_decode_op(words[base]));
|
|
536
|
+
|
|
537
|
+
// An operand of width w occupies w consecutive slots, so it is the END of the run that has
|
|
538
|
+
// to be inside the file: `MOV.4 r30` starts inside a 32-slot file and finishes outside one.
|
|
539
|
+
vm_visit_register_operands(words, base, (index, span) => {
|
|
540
|
+
if (index + span <= register_count) {
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
report(
|
|
545
|
+
line,
|
|
546
|
+
span === 1
|
|
547
|
+
? `r${index} is outside the ${register_count}-register file this program declares`
|
|
548
|
+
: `r${index} spans ${span} slots [${index}, ${index + span}), past the end of the `
|
|
549
|
+
+ `${register_count}-register file this program declares`
|
|
550
|
+
);
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
for (let slot = 0; slot < 3; slot++) {
|
|
554
|
+
const role = meta.operands[slot];
|
|
555
|
+
const value = words[base + 2 + slot];
|
|
556
|
+
|
|
557
|
+
if (role === VM_OPERAND.CONST) {
|
|
558
|
+
// The load reads one word per lane, so the whole run has to be inside the pool.
|
|
559
|
+
const span = vm_operation_width(vm_decode_op(words[base]), vm_decode_width(words[base]));
|
|
560
|
+
|
|
561
|
+
if (value + span > constant_word_count) {
|
|
562
|
+
report(
|
|
563
|
+
line,
|
|
564
|
+
`c${value} reads ${span} word${span === 1 ? "" : "s"}, past the end of the `
|
|
565
|
+
+ `${constant_word_count}-word constant pool`
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// An attribute access past the end of a record is not caught by GPU robustness: the address
|
|
572
|
+
// still lands inside the pool buffer, and reads or corrupts the NEXT particle's record.
|
|
573
|
+
if (meta.operands[0] === VM_OPERAND.ATTR_OFFSET) {
|
|
574
|
+
const offset = words[base + 2];
|
|
575
|
+
const components = words[base + 3];
|
|
576
|
+
|
|
577
|
+
if (offset + components > PARTICLE_RECORD_WORD_COUNT) {
|
|
578
|
+
report(
|
|
579
|
+
line,
|
|
580
|
+
`attribute access [${offset}, ${offset + components}) runs past the ${PARTICLE_RECORD_WORD_COUNT}-word particle record`
|
|
581
|
+
);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* @param {string} line
|
|
589
|
+
* @returns {string} the line with any trailing comment removed
|
|
590
|
+
*/
|
|
591
|
+
function strip_comment(line) {
|
|
592
|
+
const semicolon = line.indexOf(";");
|
|
593
|
+
const slashes = line.indexOf("//");
|
|
594
|
+
|
|
595
|
+
let cut = -1;
|
|
596
|
+
|
|
597
|
+
if (semicolon !== -1) {
|
|
598
|
+
cut = semicolon;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
if (slashes !== -1 && (cut === -1 || slashes < cut)) {
|
|
602
|
+
cut = slashes;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
return cut === -1 ? line : line.slice(0, cut);
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/**
|
|
609
|
+
* @param {string} line already stripped of comments and trimmed, starting with `.`
|
|
610
|
+
* @param {number} line_number
|
|
611
|
+
* @param {function(number, string):void} report
|
|
612
|
+
* @returns {{kind: string, [key: string]: *}|null}
|
|
613
|
+
*/
|
|
614
|
+
function parse_directive(line, line_number, report) {
|
|
615
|
+
const tokens = line.split(/[\s,]+/).filter(t => t !== "");
|
|
616
|
+
const head = tokens[0].toLowerCase();
|
|
617
|
+
|
|
618
|
+
if (head === PARTICLE_ASSEMBLY_SECTION_INIT || head === PARTICLE_ASSEMBLY_SECTION_UPDATE) {
|
|
619
|
+
if (tokens.length > 1) {
|
|
620
|
+
report(line_number, `${head} takes no arguments`);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
return { kind: "section", section: head === PARTICLE_ASSEMBLY_SECTION_INIT ? "init" : "update" };
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
if (head === PARTICLE_ASSEMBLY_DIRECTIVE_REGISTERS) {
|
|
627
|
+
const count = parse_unsigned(tokens[1]);
|
|
628
|
+
|
|
629
|
+
if (count === null) {
|
|
630
|
+
report(line_number, `${PARTICLE_ASSEMBLY_DIRECTIVE_REGISTERS} needs a register count, got '${tokens[1] ?? ""}'`);
|
|
631
|
+
return null;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return { kind: "registers", count };
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
if (head === PARTICLE_ASSEMBLY_DIRECTIVE_CONST) {
|
|
638
|
+
const index = parse_prefixed(tokens[1], "c");
|
|
639
|
+
|
|
640
|
+
if (index === null) {
|
|
641
|
+
report(line_number, `${PARTICLE_ASSEMBLY_DIRECTIVE_CONST} needs a pool index like 'c0', got '${tokens[1] ?? ""}'`);
|
|
642
|
+
return null;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
// One word per directive. The pool is indexed by word and read at whatever width the
|
|
646
|
+
// instruction asks for, so a "constant" has no width of its own to declare.
|
|
647
|
+
const token = tokens[2];
|
|
648
|
+
|
|
649
|
+
if (token === undefined) {
|
|
650
|
+
report(line_number, `${PARTICLE_ASSEMBLY_DIRECTIVE_CONST} needs a value`);
|
|
651
|
+
return null;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
const value = parse_float(token);
|
|
655
|
+
|
|
656
|
+
if (value === null) {
|
|
657
|
+
report(line_number, `'${token}' is not a number`);
|
|
658
|
+
return null;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
if (tokens.length > 3) {
|
|
662
|
+
report(line_number, `${PARTICLE_ASSEMBLY_DIRECTIVE_CONST} declares one word; give each its own index`);
|
|
663
|
+
return null;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
return { kind: "const", index, value };
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
report(line_number, `Unknown directive '${tokens[0]}'`);
|
|
670
|
+
|
|
671
|
+
return null;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* @param {string} line already stripped of comments and trimmed
|
|
676
|
+
* @param {number} line_number
|
|
677
|
+
* @param {function(number, string):void} report
|
|
678
|
+
* @returns {{words: number[], register_reach: number}|null} `register_reach` is one past the last
|
|
679
|
+
* slot the instruction touches — what a register file has to hold for it
|
|
680
|
+
*/
|
|
681
|
+
function parse_instruction(line, line_number, report) {
|
|
682
|
+
const space = line.search(/\s/);
|
|
683
|
+
const head = (space === -1 ? line : line.slice(0, space)).toUpperCase();
|
|
684
|
+
const rest = space === -1 ? "" : line.slice(space);
|
|
685
|
+
|
|
686
|
+
// `ADD.3` — mnemonic, then the lane count it spans.
|
|
687
|
+
const separator = head.indexOf(PARTICLE_ASSEMBLY_WIDTH_SEPARATOR);
|
|
688
|
+
const mnemonic = separator === -1 ? head : head.slice(0, separator);
|
|
689
|
+
const width_text = separator === -1 ? "" : head.slice(separator + 1);
|
|
690
|
+
|
|
691
|
+
const opcode = OPCODE_BY_NAME.get(mnemonic);
|
|
692
|
+
|
|
693
|
+
if (opcode === undefined) {
|
|
694
|
+
report(line_number, `Unknown instruction '${mnemonic}'`);
|
|
695
|
+
return null;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
const meta = VM_ISA.get(opcode);
|
|
699
|
+
|
|
700
|
+
let width = meta.default_width;
|
|
701
|
+
|
|
702
|
+
if (width_text !== "") {
|
|
703
|
+
if (meta.width !== VM_WIDTH.VARIABLE) {
|
|
704
|
+
report(
|
|
705
|
+
line_number,
|
|
706
|
+
`${meta.name} has a fixed width of ${meta.default_width} and cannot be given one`
|
|
707
|
+
);
|
|
708
|
+
return null;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
if (!/^[1-4]$/.test(width_text)) {
|
|
712
|
+
report(line_number, `'${width_text}' is not a width; widths run from 1 to ${VM_MAX_WIDTH}`);
|
|
713
|
+
return null;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
width = Number(width_text);
|
|
717
|
+
|
|
718
|
+
if (width < meta.min_width) {
|
|
719
|
+
report(line_number, `${meta.name} width must be >= ${meta.min_width}, got ${width}`);
|
|
720
|
+
return null;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
const tokens = rest.split(",").map(t => t.trim()).filter(t => t !== "");
|
|
725
|
+
|
|
726
|
+
/** roles the operands fill, in the order they are written */
|
|
727
|
+
const roles = [];
|
|
728
|
+
|
|
729
|
+
if (meta.dst) {
|
|
730
|
+
roles.push(VM_OPERAND.DST);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
for (let slot = 0; slot < 3; slot++) {
|
|
734
|
+
if (meta.operands[slot] !== VM_OPERAND.NONE) {
|
|
735
|
+
roles.push(meta.operands[slot]);
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
if (tokens.length !== roles.length) {
|
|
740
|
+
report(
|
|
741
|
+
line_number,
|
|
742
|
+
`${meta.name} takes ${roles.length} operand${roles.length === 1 ? "" : "s"}` +
|
|
743
|
+
` (${roles.join(", ")}), got ${tokens.length}`
|
|
744
|
+
);
|
|
745
|
+
return null;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// Word 0 is filled in at the end, once the operands are known: the attribute ops take their
|
|
749
|
+
// width from their component count.
|
|
750
|
+
const words = [0, 0, 0, 0, 0];
|
|
751
|
+
|
|
752
|
+
let slot_cursor = 0;
|
|
753
|
+
|
|
754
|
+
for (let i = 0; i < roles.length; i++) {
|
|
755
|
+
const role = roles[i];
|
|
756
|
+
const value = parse_operand(role, tokens[i], line_number, report);
|
|
757
|
+
|
|
758
|
+
if (value === null) {
|
|
759
|
+
return null;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
if (i === 0 && meta.dst) {
|
|
763
|
+
words[1] = value;
|
|
764
|
+
} else {
|
|
765
|
+
// source slots are written in ISA order, skipping the ones marked NONE
|
|
766
|
+
while (meta.operands[slot_cursor] === VM_OPERAND.NONE) {
|
|
767
|
+
slot_cursor++;
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
words[2 + slot_cursor] = value;
|
|
771
|
+
slot_cursor++;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
// The attribute ops measure themselves in components unless the text says otherwise: a load may
|
|
776
|
+
// be widened past its attribute (the lanes beyond read zero), a store may not — it writes one
|
|
777
|
+
// record word per lane, so its width IS the component count.
|
|
778
|
+
if (opcode === VM_OP.LOAD_ATTR && width_text === "") {
|
|
779
|
+
width = words[3];
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
if (opcode === VM_OP.STORE_ATTR) {
|
|
783
|
+
if (width_text !== "" && width !== words[3]) {
|
|
784
|
+
report(line_number, `STORE_ATTR width ${width} must equal its component count ${words[3]}`);
|
|
785
|
+
return null;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
width = words[3];
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
words[0] = vm_encode_word0(opcode, width);
|
|
792
|
+
|
|
793
|
+
// Registers are scalar slots, so what the file has to hold is where the widest operand ENDS.
|
|
794
|
+
// Sizing it by the largest index written down leaves a `RANDOM.3 r0` writing r1 and r2 outside
|
|
795
|
+
// the file it derived, which the interpreter reads back as zero and the reference as nothing.
|
|
796
|
+
let register_reach = 0;
|
|
797
|
+
|
|
798
|
+
vm_visit_register_operands(words, 0, (slot, span) => {
|
|
799
|
+
if (slot + span > register_reach) {
|
|
800
|
+
register_reach = slot + span;
|
|
801
|
+
}
|
|
802
|
+
});
|
|
803
|
+
|
|
804
|
+
return { words, register_reach };
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
/**
|
|
808
|
+
* @param {string} role
|
|
809
|
+
* @param {string} token
|
|
810
|
+
* @param {number} line_number
|
|
811
|
+
* @param {function(number, string):void} report
|
|
812
|
+
* @returns {number|null}
|
|
813
|
+
*/
|
|
814
|
+
function parse_operand(role, token, line_number, report) {
|
|
815
|
+
switch (role) {
|
|
816
|
+
case VM_OPERAND.DST:
|
|
817
|
+
case VM_OPERAND.REG: {
|
|
818
|
+
const index = parse_prefixed(token, "r");
|
|
819
|
+
|
|
820
|
+
if (index === null) {
|
|
821
|
+
report(line_number, `Expected a register like 'r0', got '${token}'`);
|
|
822
|
+
return null;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
return index;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
case VM_OPERAND.CONST: {
|
|
829
|
+
const index = parse_prefixed(token, "c");
|
|
830
|
+
|
|
831
|
+
if (index === null) {
|
|
832
|
+
report(line_number, `Expected a constant like 'c0', got '${token}'`);
|
|
833
|
+
return null;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
return index;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
case VM_OPERAND.ATTR_OFFSET: {
|
|
840
|
+
if (!token.startsWith("@")) {
|
|
841
|
+
report(line_number, `Expected an attribute offset like '@1', got '${token}'`);
|
|
842
|
+
return null;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
const offset = parse_unsigned(token.slice(1));
|
|
846
|
+
|
|
847
|
+
if (offset === null) {
|
|
848
|
+
report(line_number, `Expected an attribute offset like '@1', got '${token}'`);
|
|
849
|
+
return null;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
return offset;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
case VM_OPERAND.COMP: {
|
|
856
|
+
const components = parse_unsigned(token);
|
|
857
|
+
|
|
858
|
+
if (components === null || components < 1 || components > 4) {
|
|
859
|
+
report(line_number, `Component count must be 1, 2, 3 or 4, got '${token}'`);
|
|
860
|
+
return null;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
return components;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
case VM_OPERAND.BUILTIN:
|
|
867
|
+
return parse_enum_operand(token, VM_BUILTIN, "builtin", line_number, report);
|
|
868
|
+
|
|
869
|
+
case VM_OPERAND.CURVE: {
|
|
870
|
+
const handle = parse_prefixed(token, "k");
|
|
871
|
+
|
|
872
|
+
if (handle === null) {
|
|
873
|
+
report(line_number, `Expected a curve handle like 'k0', got '${token}'`);
|
|
874
|
+
return null;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
return handle;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
case VM_OPERAND.SWIZZLE: {
|
|
881
|
+
const packed = parse_swizzle(token);
|
|
882
|
+
|
|
883
|
+
if (packed === null) {
|
|
884
|
+
report(line_number, `Expected a swizzle like '.xyzw', got '${token}'`);
|
|
885
|
+
return null;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
return packed;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
default:
|
|
892
|
+
report(line_number, `Unsupported operand role '${role}'`);
|
|
893
|
+
return null;
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
/**
|
|
898
|
+
* Accept either the name of an enum member or its raw numeric value — the second so a program using
|
|
899
|
+
* an id this build has no name for still round-trips.
|
|
900
|
+
*
|
|
901
|
+
* @param {string} token
|
|
902
|
+
* @param {Object<string, number>} enumeration
|
|
903
|
+
* @param {string} label
|
|
904
|
+
* @param {number} line_number
|
|
905
|
+
* @param {function(number, string):void} report
|
|
906
|
+
* @returns {number|null}
|
|
907
|
+
*/
|
|
908
|
+
function parse_enum_operand(token, enumeration, label, line_number, report) {
|
|
909
|
+
const upper = token.toUpperCase();
|
|
910
|
+
|
|
911
|
+
if (Object.hasOwn(enumeration, upper)) {
|
|
912
|
+
return enumeration[upper];
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
const numeric = parse_unsigned(token);
|
|
916
|
+
|
|
917
|
+
if (numeric !== null) {
|
|
918
|
+
return numeric;
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
report(line_number, `Unknown ${label} '${token}', expected one of ${Object.keys(enumeration).join(", ")}`);
|
|
922
|
+
|
|
923
|
+
return null;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/**
|
|
927
|
+
* @param {string} token
|
|
928
|
+
* @returns {number|null} the packed 8-bit pattern
|
|
929
|
+
*/
|
|
930
|
+
function parse_swizzle(token) {
|
|
931
|
+
if (token.length !== 5 || !token.startsWith(".")) {
|
|
932
|
+
return null;
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
let packed = 0;
|
|
936
|
+
|
|
937
|
+
for (let lane = 0; lane < 4; lane++) {
|
|
938
|
+
const selector = SWIZZLE_LANES.indexOf(token.charAt(1 + lane).toLowerCase());
|
|
939
|
+
|
|
940
|
+
if (selector === -1) {
|
|
941
|
+
return null;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
packed |= selector << (lane * 2);
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
return packed;
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
/**
|
|
951
|
+
* @param {string|undefined} token
|
|
952
|
+
* @param {string} prefix single character
|
|
953
|
+
* @returns {number|null}
|
|
954
|
+
*/
|
|
955
|
+
function parse_prefixed(token, prefix) {
|
|
956
|
+
if (token === undefined || token.length < 2 || token.charAt(0).toLowerCase() !== prefix) {
|
|
957
|
+
return null;
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
return parse_unsigned(token.slice(1));
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* @param {string|undefined} token
|
|
965
|
+
* @returns {number|null}
|
|
966
|
+
*/
|
|
967
|
+
function parse_unsigned(token) {
|
|
968
|
+
if (token === undefined || !/^\d+$/.test(token)) {
|
|
969
|
+
return null;
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
return Number.parseInt(token, 10);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/**
|
|
976
|
+
* @param {string} token
|
|
977
|
+
* @returns {number|null}
|
|
978
|
+
*/
|
|
979
|
+
function parse_float(token) {
|
|
980
|
+
const lower = token.toLowerCase();
|
|
981
|
+
|
|
982
|
+
if (lower === "nan") {
|
|
983
|
+
return Number.NaN;
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
if (lower === "inf" || lower === "+inf") {
|
|
987
|
+
return Infinity;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
if (lower === "-inf") {
|
|
991
|
+
return -Infinity;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
if (!/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(token)) {
|
|
995
|
+
return null;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
return Number.parseFloat(token);
|
|
999
|
+
}
|