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