@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
@@ -1,3 +1,4 @@
1
+ import { frameThrottle } from "../../../src/core/function/frameThrottle.js";
1
2
  import { clamp } from "../../../src/core/math/clamp.js";
2
3
  import { max2 } from "../../../src/core/math/max2.js";
3
4
  import View from "../../../src/view/View.js";
@@ -12,11 +13,19 @@ import { NodeInstancePortReference } from "../../../src/core/model/node-graph/no
12
13
  import { ActionProcessor } from "../../../src/core/process/undo/ActionProcessor.js";
13
14
  import { NodeGraphCamera } from "./NodeGraphCamera.js";
14
15
  import { NodeGraphSelection } from "./NodeGraphSelection.js";
15
- import { ConnectionCreateAction } from "./actions/ConnectionCreateAction.js";
16
+ import { connection_bind_actions } from "./actions/connection_bind_actions.js";
17
+ import { ConnectionDeleteAction } from "./actions/ConnectionDeleteAction.js";
16
18
  import { NodeParameterSetAction } from "./actions/NodeParameterSetAction.js";
17
19
  import { NodesMoveAction } from "./actions/NodesMoveAction.js";
18
20
  import { SelectionSetAction } from "./actions/SelectionSetAction.js";
19
- import { wire_bounds, wire_distance_to_point, wire_to_bezier } from "./connection_wire_geometry.js";
21
+ import Signal from "../../../src/core/events/signal/Signal.js";
22
+ import { wire_build_direct, wire_resolve_path } from "./connection_wire_geometry.js";
23
+ import { ConnectionVisualData } from "../../../src/core/model/node-graph/visual/ConnectionVisualData.js";
24
+ import AABB2 from "../../../src/core/geom/2d/aabb/AABB2.js";
25
+ import { aabb2_contains } from "../../../src/core/geom/2d/aabb/aabb2_contains.js";
26
+ import { aabb2_intersects_aabb2 } from "../../../src/core/geom/2d/aabb/aabb2_intersects_aabb2.js";
27
+ import { min2 } from "../../../src/core/math/min2.js";
28
+ import EmptyView from "../../../src/view/elements/EmptyView.js";
20
29
 
21
30
  export { NodeGraphCamera } from "./NodeGraphCamera.js";
22
31
 
@@ -25,9 +34,20 @@ const v2_pointer = new Vector2();
25
34
  const v2_hit_source = new Vector2();
26
35
  const v2_hit_target = new Vector2();
27
36
 
28
- const wire_aabb = new Float64Array(4);
37
+ const wire_aabb = new AABB2();
29
38
  const wire_bezier = new Float64Array(8);
30
39
 
40
+ /**
41
+ * Path of a wire that has no route of its own — one being dragged out of a port, one whose node has
42
+ * been moved since the graph was last laid out, or every wire in a graph that never has been.
43
+ *
44
+ * One instance, refilled per wire: it is used and finished with inside a single draw or hit test.
45
+ *
46
+ * @type {ConnectionVisualData}
47
+ */
48
+ const direct_wire = new ConnectionVisualData();
49
+
50
+
31
51
  const CONNECTION_WIDTH = 3;
32
52
 
33
53
  /**
@@ -36,6 +56,39 @@ const CONNECTION_WIDTH = 3;
36
56
  */
37
57
  const CONNECTION_HIT_TOLERANCE_PX = 6;
38
58
 
59
+ /**
60
+ * Mouse buttons, as {@link MouseEvent#button} numbers them.
61
+ * @enum {number}
62
+ */
63
+ const MOUSE_BUTTON = {
64
+ LEFT: 0,
65
+ MIDDLE: 1,
66
+ RIGHT: 2
67
+ };
68
+
69
+ /**
70
+ * How far the pointer may travel between a press and its release for the gesture to still count as
71
+ * a click rather than a drag, in canvas pixels.
72
+ *
73
+ * One number answers it for every button, and that is what keeps the canvas's background gestures
74
+ * out of each other's way: a press that stays put is a click — select, or ask for the menu — and one
75
+ * that moves is a drag — pan, or pull a selection box. Neither happens by accident, because a hand
76
+ * steady enough to have clicked never travels this far.
77
+ *
78
+ * @type {number}
79
+ */
80
+ const CANVAS_CLICK_TOLERANCE_PX = 5;
81
+
82
+ /**
83
+ * What a drag over the canvas background is doing.
84
+ * @enum {number}
85
+ */
86
+ const CanvasDrag = {
87
+ None: 0,
88
+ Pan: 1,
89
+ Marquee: 2
90
+ };
91
+
39
92
  /**
40
93
  *
41
94
  * @param {number[]} array
@@ -54,6 +107,111 @@ function array_toggle(array, value) {
54
107
  export class NodeGraphView extends View {
55
108
  el = document.createElement('div');
56
109
 
110
+ /**
111
+ * The view of each node currently on the canvas, by node id.
112
+ *
113
+ * A host that wants to decorate a node — mark it as carrying an error, flash it, badge it —
114
+ * needs to find its view, and reaching into the child list to do it depends on how this view
115
+ * happens to be assembled. Kept in step with the node list rather than rebuilt on demand.
116
+ *
117
+ * @readonly
118
+ * @type {Map<number, NodeView>}
119
+ */
120
+ nodeViews = new Map();
121
+
122
+ /**
123
+ * Nodes whose view has not yet recorded its drawn geometry — see {@link NodeView#measure}.
124
+ *
125
+ * Until this is empty, what the visual data holds for those nodes is the registry's estimate of
126
+ * how big they are, which is no basis for arranging a graph.
127
+ *
128
+ * @type {Set<number>}
129
+ */
130
+ #unmeasured = new Set();
131
+
132
+ /**
133
+ * Ask for the wires to be drawn again, at most once a frame. Set up in the constructor, where
134
+ * the canvas it repaints is; see the note there.
135
+ * @type {function()}
136
+ */
137
+ #requestRedraw;
138
+
139
+ /**
140
+ * The type a port carries on a particular node instance. See the constructor.
141
+ * @type {function(NodeInstancePortReference):DataType}
142
+ */
143
+ portDataType;
144
+
145
+ /**
146
+ * @readonly
147
+ */
148
+ on = {
149
+ ...this.on,
150
+
151
+ /**
152
+ * A node's view has been built and is in {@link nodeViews}. Carries `(NodeInstance, NodeView)`.
153
+ *
154
+ * A host that decorates node views cannot do it off the graph's own `nodeAdded`: a view's
155
+ * own bindings are linked before its children's, so a host bound to that signal runs before
156
+ * this view's list has built anything. This one fires when the view exists, by construction.
157
+ *
158
+ * @readonly
159
+ * @type {Signal<NodeInstance, NodeView>}
160
+ */
161
+ nodeViewAdded: new Signal(),
162
+
163
+ /**
164
+ * Every node on the canvas has recorded its drawn geometry, so the visual data describes
165
+ * the graph as it actually looks rather than as the registry guessed it would.
166
+ *
167
+ * What an automatic layout waits for: see {@link NodeGraphEditorView#layout}.
168
+ *
169
+ * @readonly
170
+ * @type {Signal}
171
+ */
172
+ measured: new Signal(),
173
+
174
+ /**
175
+ * The canvas itself was right-clicked — not a node, not a port. Carries the point, in this
176
+ * view's own pixels and in graph space, and the release that ended the gesture.
177
+ *
178
+ * Raised when a right press is released without having travelled, rather than off the DOM's
179
+ * own `contextmenu`: browsers disagree about when that one fires — on the press on some
180
+ * platforms, on the release on others — and a canvas that pans with the right button cannot
181
+ * have half of them opening a menu in the middle of the pan. The browser's own menu is
182
+ * suppressed either way, by this element's pointer device.
183
+ *
184
+ * The gesture a host turns into "add a node here": see
185
+ * {@link NodeGraphEditorView}'s search menu. Announced rather than acted on because what a
186
+ * canvas offers is the host's business, and this view has no library to offer.
187
+ *
188
+ * @readonly
189
+ * @type {Signal<{x: number, y: number, graph_x: number, graph_y: number, event: MouseEvent}>}
190
+ */
191
+ canvasContextMenu: new Signal(),
192
+
193
+ /**
194
+ * A wire being dragged out of a port was let go over open canvas rather than over another
195
+ * port. Carries the port it came from and where it was dropped.
196
+ *
197
+ * The other half of the same idea: a wire that reaches nothing is an author saying what they
198
+ * want next and where it goes, and a host that can finish the thought — by offering the types
199
+ * that could take the wire and connecting the one that is picked — turns a failed gesture
200
+ * into two steps of authoring at once.
201
+ *
202
+ * @readonly
203
+ * @type {Signal<{endpoint: NodeInstancePortReference, x: number, y: number, graph_x: number, graph_y: number}>}
204
+ */
205
+ connectionDropped: new Signal()
206
+ };
207
+
208
+ /**
209
+ * Whether the graph can be edited through this view. See the constructor.
210
+ * @readonly
211
+ * @type {boolean}
212
+ */
213
+ readOnly = false;
214
+
57
215
  /**
58
216
  *
59
217
  * @param {NodeGraph} graph
@@ -62,6 +220,17 @@ export class NodeGraphView extends View {
62
220
  * @param {NodeDescriptionVisualRegistry} nodeVisualRegistry
63
221
  * @param {ActionProcessor} [actionProcessor] timeline that all graph edits are routed through
64
222
  * @param {NodeGraphSelection} [selection]
223
+ * @param {function({node: NodeInstance, commit: function(string, *)}):View|null} [parameterViewFactory]
224
+ * see {@link NodeView}; passed through unchanged, so a host's controls reach every node
225
+ * @param {function(NodeInstancePortReference):DataType} [portDataType]
226
+ * the type a port carries on a particular node instance, which is what its marker is
227
+ * coloured by and what a wire out of it is drawn in. The declared type by default. A
228
+ * host whose ports are typed by what is wired into them — where an `add` is as wide as
229
+ * its inputs — supplies one, and calls {@link #refreshPortTypes} when its answers change.
230
+ * @param {boolean} [readOnly] show the graph without offering to change it: no wiring, no
231
+ * dragging, no parameter edits. What a host drilling into a graph it does not own — a
232
+ * locked node group — shows. Selection and the camera still work, because looking around
233
+ * is not editing.
65
234
  */
66
235
  constructor({
67
236
  graph,
@@ -69,7 +238,10 @@ export class NodeGraphView extends View {
69
238
  camera,
70
239
  nodeVisualRegistry,
71
240
  actionProcessor = new ActionProcessor({}),
72
- selection = new NodeGraphSelection()
241
+ selection = new NodeGraphSelection(),
242
+ parameterViewFactory = undefined,
243
+ portDataType = endpoint => endpoint.port.dataType,
244
+ readOnly = false
73
245
  }) {
74
246
  super();
75
247
 
@@ -79,6 +251,10 @@ export class NodeGraphView extends View {
79
251
  */
80
252
  this.actionProcessor = actionProcessor;
81
253
 
254
+ this.readOnly = readOnly;
255
+
256
+ this.portDataType = portDataType;
257
+
82
258
  /**
83
259
  *
84
260
  * @type {NodeGraphCamera}
@@ -105,12 +281,39 @@ export class NodeGraphView extends View {
105
281
 
106
282
  this.addClass('ui-node-graph-view');
107
283
 
284
+ this.setClass('read-only', readOnly);
285
+
108
286
  const self = this;
109
287
 
110
288
  const tempConnection = {
111
289
  enabled: false,
112
290
  anchor: new Vector2(),
113
- endpoint: null
291
+ endpoint: null,
292
+
293
+ /**
294
+ * Whether some port has already dealt with the drop that is ending this drag.
295
+ *
296
+ * A port's own pointer-up runs while the wire is still live and before the drag's, both
297
+ * being listeners for the same event on the way from the port to the window — so by the
298
+ * time the drag ends, this says whether the wire found a home. Without it there is no
299
+ * telling a wire dropped on open canvas from one dropped onto a port that refused it.
300
+ *
301
+ * @type {boolean}
302
+ */
303
+ consumed: false,
304
+
305
+ /**
306
+ * The wire this gesture picked up, when it began on an input that already had one.
307
+ *
308
+ * Dragging out of a bound input is that wire being moved rather than a second one being
309
+ * made, so the gesture continues from the source it came from and this is what is on
310
+ * the end of it. It is not taken off the graph until the drop says where it is going —
311
+ * a gesture that ends on a port that refuses it, or on the port it started from, has to
312
+ * leave the graph as it found it — so while the drag runs it is only hidden.
313
+ *
314
+ * @type {Connection|null}
315
+ */
316
+ detached: null
114
317
  };
115
318
 
116
319
  const vBlockCanvas = new ListView(graph.nodes, {
@@ -130,27 +333,95 @@ export class NodeGraphView extends View {
130
333
  // dragging is editor behavior: managed here so moves land on the action timeline
131
334
  enableDrag: false,
132
335
  parameterSetCallback(n, parameterId, value) {
336
+ if (readOnly) {
337
+ // the controls are drawn — a locked graph is still worth reading — but
338
+ // nothing an author does in one reaches the model
339
+ return;
340
+ }
341
+
133
342
  actionProcessor.mark('set parameter');
134
343
  actionProcessor.do(new NodeParameterSetAction(n, parameterId, value));
135
344
  },
345
+ parameterViewFactory,
136
346
  portCreationCallback(portView, port) {
347
+ // what this port carries on this node, where that is not what it declares
348
+ portView.setDataType(self.portDataType(node.getEndpoint(port.id)));
137
349
 
138
350
  const draggableAspect = new DraggableAspect({
139
351
  el: portView.el,
140
- dragStart(p) {
352
+ dragStart(p, event) {
353
+ if (self.readOnly) {
354
+ return;
355
+ }
356
+
357
+ // An input holds one wire, so a drag out of a bound one is that
358
+ // wire being taken hold of: what is on the end of the gesture is
359
+ // its source, and where it is let go decides what it feeds — or
360
+ // whether it feeds anything, which is how one is pulled off.
361
+ const held = port.direction === PortDirection.In
362
+ ? node.getEndpoint(port.id).inConnections[0] ?? null
363
+ : null;
141
364
 
142
365
  const endpoint = new NodeInstancePortReference();
143
366
 
144
- endpoint.set(node, port);
367
+ if (held === null) {
368
+ endpoint.set(node, port);
369
+ } else {
370
+ endpoint.set(held.source.instance, held.source.port);
371
+ }
145
372
 
146
373
  tempConnection.enabled = true;
374
+ tempConnection.consumed = false;
375
+ tempConnection.detached = held;
147
376
  tempConnection.endpoint = endpoint;
148
377
 
378
+ // The wire is drawn from here to the anchor, and a gesture that ends
379
+ // before the first move would otherwise be drawn to — and dropped
380
+ // at — wherever the previous one finished.
381
+ readPositionFromMouseEvent(v2_pointer, event, self.el);
382
+
383
+ self.transformPointCanvas2Graph(v2_pointer, tempConnection.anchor);
149
384
  },
150
385
  dragEnd() {
386
+ if (!tempConnection.enabled) {
387
+ return;
388
+ }
389
+
390
+ const endpoint = tempConnection.endpoint;
391
+ const consumed = tempConnection.consumed;
392
+ const detached = tempConnection.detached;
393
+
151
394
  tempConnection.enabled = false;
395
+ tempConnection.detached = null;
396
+
397
+ requestRedraw();
398
+
399
+ if (consumed) {
400
+ // some port took the drop, and has already made or refused the
401
+ // connection; there is nothing left of the gesture to report
402
+ return;
403
+ }
404
+
405
+ if (detached !== null) {
406
+ // A wire taken off an input and let go over nothing is a wire
407
+ // removed. Its own step: what the host makes of the drop below
408
+ // — a menu that may be dismissed — is a separate decision, and
409
+ // the removal stands whichever way that goes.
410
+ actionProcessor.mark('disconnect');
411
+ actionProcessor.do(new ConnectionDeleteAction(graph, detached, visual));
412
+ }
152
413
 
153
- vConnectionCanvas.render();
414
+ const anchor = tempConnection.anchor;
415
+
416
+ self.transformPointGraph2Canvas(anchor, v2_pointer);
417
+
418
+ self.on.connectionDropped.send1({
419
+ endpoint,
420
+ x: v2_pointer.x,
421
+ y: v2_pointer.y,
422
+ graph_x: anchor.x,
423
+ graph_y: anchor.y,
424
+ });
154
425
  },
155
426
  drag(p, o, delta, event) {
156
427
  // the anchor lives in graph space, derive it from the cursor position over this view
@@ -158,7 +429,7 @@ export class NodeGraphView extends View {
158
429
 
159
430
  self.transformPointCanvas2Graph(v2_pointer, tempConnection.anchor);
160
431
 
161
- vConnectionCanvas.render();
432
+ requestRedraw();
162
433
  }
163
434
  });
164
435
 
@@ -166,6 +437,10 @@ export class NodeGraphView extends View {
166
437
  //pointer released above the port
167
438
 
168
439
  if (tempConnection.enabled) {
440
+ // whatever happens below, the wire has met a port and its fate is
441
+ // decided here rather than on open canvas
442
+ tempConnection.consumed = true;
443
+
169
444
  /**
170
445
  *
171
446
  * @type {NodeInstancePortReference}
@@ -206,19 +481,46 @@ export class NodeGraphView extends View {
206
481
  const source_ref = graph.getConnectionEndpoint(source_node, source_port);
207
482
  const target_ref = graph.getConnectionEndpoint(target_node, target_port);
208
483
 
484
+ const detached = tempConnection.detached;
485
+
486
+ if (
487
+ detached !== null
488
+ && detached.source === source_ref
489
+ && detached.target === target_ref
490
+ ) {
491
+ // a wire picked up and put back where it came from: the
492
+ // gesture did nothing, and leaving it alone is what makes
493
+ // that true — nothing reaches the timeline
494
+ return;
495
+ }
496
+
209
497
  const duplicate = source_ref.connections.some(
210
498
  c => c.source === source_ref && c.target === target_ref
211
499
  );
212
500
 
213
- if (!duplicate) {
214
- actionProcessor.mark('create connection');
215
- actionProcessor.do(new ConnectionCreateAction(
501
+ const actions = duplicate
502
+ ? []
503
+ : connection_bind_actions(
216
504
  graph,
217
505
  source_node, source_port,
218
- target_node, target_port
219
- ));
506
+ target_node, target_port,
507
+ visual
508
+ );
509
+
510
+ if (detached !== null) {
511
+ // the wire this gesture is holding now feeds somewhere
512
+ // else, so it comes off where it was — one step, because
513
+ // it was one gesture
514
+ actions.unshift(new ConnectionDeleteAction(graph, detached, visual));
220
515
  }
221
516
 
517
+ if (actions.length > 0) {
518
+ actionProcessor.mark(detached === null
519
+ ? 'create connection'
520
+ : 'move connection');
521
+
522
+ actionProcessor.doMany(actions);
523
+ }
222
524
  }
223
525
  }
224
526
  });
@@ -229,7 +531,20 @@ export class NodeGraphView extends View {
229
531
  }
230
532
  });
231
533
 
232
- nodeView.bindSignal(nodeView.position.onChanged, vConnectionCanvas.render, vConnectionCanvas);
534
+ nodeView.bindSignal(nodeView.position.onChanged, requestRedraw);
535
+
536
+ // A node reports where the browser put its ports, and the wires are drawn to those
537
+ // points — so a node that has just been measured, or re-measured because its
538
+ // content changed, is a node whose wires no longer meet it.
539
+ self.#unmeasured.add(node.id);
540
+
541
+ nodeView.bindSignal(nodeView.on.measured, changed => {
542
+ if (changed) {
543
+ requestRedraw();
544
+ }
545
+
546
+ self.#markMeasured(node.id);
547
+ });
233
548
 
234
549
  // selection state is reflected as a CSS class
235
550
  function updateSelectionClass() {
@@ -253,6 +568,13 @@ export class NodeGraphView extends View {
253
568
  dragStart() {
254
569
  dragEntries = [];
255
570
 
571
+ if (readOnly) {
572
+ // an empty entry list makes the rest of the gesture a no-op, and the
573
+ // aspect still exists so a node keeps swallowing pointer gestures the
574
+ // canvas underneath would otherwise read as a pan
575
+ return;
576
+ }
577
+
256
578
  if (selection.containsNode(node.id)) {
257
579
  // dragging a selected node moves the entire selection
258
580
  selection.nodes.forEach(id => {
@@ -307,6 +629,10 @@ export class NodeGraphView extends View {
307
629
  nodeView.on.linked.add(nodeDrag.start, nodeDrag);
308
630
  nodeView.on.unlinked.add(nodeDrag.stop, nodeDrag);
309
631
 
632
+ self.nodeViews.set(node.id, nodeView);
633
+
634
+ self.on.nodeViewAdded.send2(node, nodeView);
635
+
310
636
  return nodeView;
311
637
  }
312
638
  });
@@ -322,7 +648,6 @@ export class NodeGraphView extends View {
322
648
  });
323
649
 
324
650
  const v2_source = new Vector2();
325
- const v2_target = new Vector2();
326
651
 
327
652
  /**
328
653
  *
@@ -335,17 +660,22 @@ export class NodeGraphView extends View {
335
660
 
336
661
  ctx.lineCap = 'round';
337
662
 
338
- //draw connections
663
+ //draw connections: a wire carries what comes out of its source
339
664
  graph.connections.forEach(connection => {
340
665
 
341
- const source = connection.source;
342
- const target = connection.target;
343
-
344
- this.getEndpointGraphPosition(source, v2_source);
345
-
346
- this.getEndpointGraphPosition(target, v2_target);
666
+ if (connection === tempConnection.detached) {
667
+ // in hand rather than on the graph: it is drawn below, running to the cursor.
668
+ // Still on the graph because where it ends up is the drop's to decide, and one
669
+ // that lands back where it started has to leave no trace.
670
+ return;
671
+ }
347
672
 
348
- this.drawConnection(ctx, v2_source, v2_target, source.port.dataType, selection.containsConnection(connection.id));
673
+ this.drawConnection(
674
+ ctx,
675
+ this.resolveConnectionPath(connection),
676
+ this.portDataType(connection.source),
677
+ selection.containsConnection(connection.id)
678
+ );
349
679
 
350
680
  });
351
681
 
@@ -359,17 +689,38 @@ export class NodeGraphView extends View {
359
689
  const endpoint = tempConnection.endpoint;
360
690
 
361
691
  this.getEndpointGraphPosition(endpoint, v2_source);
362
- const dataType = endpoint.port.dataType;
692
+
693
+ const dataType = this.portDataType(endpoint);
694
+
695
+ const anchor = tempConnection.anchor;
696
+
363
697
  if (endpoint.port.direction === PortDirection.Out) {
364
- this.drawConnection(ctx, v2_source, tempConnection.anchor, dataType);
698
+ wire_build_direct(direct_wire, v2_source.x, v2_source.y, anchor.x, anchor.y);
365
699
  } else {
366
- this.drawConnection(ctx, tempConnection.anchor, v2_source, dataType);
700
+ wire_build_direct(direct_wire, anchor.x, anchor.y, v2_source.x, v2_source.y);
367
701
  }
702
+
703
+ this.drawConnection(ctx, direct_wire, dataType);
368
704
  }
369
705
  };
370
706
 
371
707
  this.addChild(vConnectionCanvas);
372
708
 
709
+ /**
710
+ * Ask for the wires to be drawn again.
711
+ *
712
+ * At most once a frame, because one gesture is many changes. Dragging a selection of forty
713
+ * nodes moves forty positions per pointer event, and each of those is a wire repaint that
714
+ * the thirty-nine after it make obsolete — forty full canvases where the screen can only
715
+ * show one. Everything that repaints the wires goes through here rather than calling the
716
+ * canvas, so there is one answer to how often that happens.
717
+ *
718
+ * @type {function()}
719
+ */
720
+ const requestRedraw = frameThrottle(vConnectionCanvas.render, vConnectionCanvas);
721
+
722
+ this.#requestRedraw = requestRedraw;
723
+
373
724
  this.size.onChanged.add((x, y) => {
374
725
  vConnectionCanvas.size.set(x, y);
375
726
  });
@@ -381,66 +732,485 @@ export class NodeGraphView extends View {
381
732
  vBlockCanvas.scale.setScalar(scale);
382
733
  vBlockCanvas.position.set(-p.x * scale, -p.y * scale);
383
734
 
384
- vConnectionCanvas.render();
735
+ requestRedraw();
385
736
  }
386
737
 
387
738
  this.initializeNavigationControls();
388
739
 
740
+ // A node view cannot measure itself when it is linked: the view framework links a child
741
+ // before putting its element in the document (see View#addChild), so at that moment the
742
+ // node has no layout box to read. By the time this fires every one of them is in place.
743
+ //
744
+ // Nodes added later — from a palette, from an undo — are in that same position and are
745
+ // caught by their own resize observer instead, on the browser's next rendering step.
746
+ this.on.linked.add(this.measureNodes, this);
747
+
389
748
  this.on.linked.add(onCameraChange);
390
749
  this.bindSignal(camera.position.onChanged, onCameraChange);
391
750
  this.bindSignal(camera.scale.onChanged, onCameraChange);
392
751
 
752
+ // node ids are pooled, so a view left behind by a deleted node would be handed out for an
753
+ // unrelated future one
754
+ this.bindSignal(graph.on.nodeRemoved, node => {
755
+ this.nodeViews.delete(node.id);
756
+
757
+ // a node nobody will ever draw again is not one the canvas is still waiting on
758
+ this.#markMeasured(node.id);
759
+ });
760
+
393
761
  // wires are drawn from graph state, repaint when the structure changes
394
- this.bindSignal(graph.on.connectionAdded, vConnectionCanvas.render, vConnectionCanvas);
395
- this.bindSignal(graph.on.connectionRemoved, vConnectionCanvas.render, vConnectionCanvas);
762
+ this.bindSignal(graph.on.connectionAdded, requestRedraw);
763
+ this.bindSignal(graph.on.connectionRemoved, requestRedraw);
764
+
765
+ // connection ids are pooled the way node ids are, so a wire that is gone must not leave its
766
+ // selection behind for an unrelated future one to be handed
767
+ this.bindSignal(graph.on.connectionRemoved, connection => selection.connections.removeOneOf(connection.id));
396
768
 
397
769
  // selected wires are drawn highlighted
398
- this.bindSignal(selection.connections.on.added, vConnectionCanvas.render, vConnectionCanvas);
399
- this.bindSignal(selection.connections.on.removed, vConnectionCanvas.render, vConnectionCanvas);
770
+ this.bindSignal(selection.connections.on.added, requestRedraw);
771
+ this.bindSignal(selection.connections.on.removed, requestRedraw);
400
772
  }
401
773
 
774
+ /**
775
+ * Ask every port what it carries now, and draw the wires again in the answer's colours.
776
+ *
777
+ * For a host that resolves port types per node instance (see `portDataType` in the
778
+ * constructor): a graph whose types follow its wiring changes its mind about ports far from the
779
+ * edit — a literal made narrower retypes everything downstream of it — so the host says when,
780
+ * and every port is asked rather than the ones it can think of.
781
+ *
782
+ * @returns {void}
783
+ */
784
+ refreshPortTypes() {
785
+ for (const node of this.graph.getNodes()) {
786
+ const nodeView = this.nodeViews.get(node.id);
787
+
788
+ if (nodeView === undefined) {
789
+ continue;
790
+ }
791
+
792
+ for (const portView of nodeView.portViews.values()) {
793
+ portView.setDataType(this.portDataType(node.getEndpoint(portView.port.id)));
794
+ }
795
+ }
796
+
797
+ this.#requestRedraw();
798
+ }
799
+
800
+ /**
801
+ * Have every node on the canvas record where the browser has put it.
802
+ *
803
+ * The nodes measure themselves as their content changes, so this is not the usual path — it is
804
+ * how the canvas gets its first measurement, at the one moment it is known that every node is
805
+ * in the document and none of them has been asked yet.
806
+ *
807
+ * @returns {void}
808
+ */
809
+ measureNodes() {
810
+ for (const nodeView of this.nodeViews.values()) {
811
+ nodeView.measure();
812
+ }
813
+ }
814
+
815
+ /**
816
+ * Whether the visual data describes the graph as drawn, rather than as the visual registry
817
+ * estimated it.
818
+ *
819
+ * False while the canvas is not on screen at all: an unlinked view has drawn nothing, and a
820
+ * node's size is not knowable without drawing it.
821
+ *
822
+ * @returns {boolean}
823
+ */
824
+ isMeasured() {
825
+ return this.isLinked && this.#unmeasured.size === 0;
826
+ }
827
+
828
+ /**
829
+ * @param {number} node_id
830
+ */
831
+ #markMeasured(node_id) {
832
+ if (!this.#unmeasured.delete(node_id)) {
833
+ //already accounted for
834
+ return;
835
+ }
836
+
837
+ if (this.#unmeasured.size === 0) {
838
+ this.on.measured.send0();
839
+ }
840
+ }
841
+
842
+ /**
843
+ * Wire up what the canvas background does with the pointer.
844
+ *
845
+ * Three gestures want that background — moving the view, pulling a selection box across it, and
846
+ * asking for the add-node menu — and a canvas that guessed between them would keep getting it
847
+ * wrong. They are told apart by which button began the gesture, the way graph editors of this
848
+ * kind have long settled it (Unreal's Blueprint canvas among them):
849
+ *
850
+ * | gesture | what it does |
851
+ * |--------------------------|-------------------------------------------------------|
852
+ * | drag with the left | pull a selection box; SHIFT adds, CTRL toggles |
853
+ * | drag with right, middle | pan |
854
+ * | click with the left | select what is under the cursor, or clear the selection |
855
+ * | click with the right | ask the host for the add-node menu |
856
+ * | wheel | zoom about the cursor |
857
+ *
858
+ * A click and a drag are the same two events with a different amount of travel in between, so
859
+ * one tolerance decides which a gesture was — see {@link CANVAS_CLICK_TOLERANCE_PX}. That is how
860
+ * the right button both pans and opens a menu without ever doing one when the other was meant.
861
+ *
862
+ * A press over a node or a port never arrives here: those run pointer devices of their own and
863
+ * stop it where it is raised, so everything below is about open canvas.
864
+ *
865
+ * @returns {void}
866
+ */
402
867
  initializeNavigationControls() {
403
- const cameraPosition = new Vector2();
404
868
  const camera = this.camera;
405
869
 
870
+ const cameraPosition = new Vector2();
871
+
872
+ /**
873
+ * The selection box, while one is being pulled.
874
+ *
875
+ * An element of its own rather than something drawn on the wire canvas: that canvas is under
876
+ * the nodes, and a box whose far edge vanishes behind one is not showing what it is about to
877
+ * select.
878
+ *
879
+ * @type {EmptyView}
880
+ */
881
+ const vMarquee = new EmptyView({ classList: ['marquee'] });
882
+
883
+ vMarquee.visible = false;
884
+
885
+ this.addChild(vMarquee);
886
+
887
+ /**
888
+ * The canvas gesture in flight.
889
+ */
890
+ const gesture = {
891
+ /**
892
+ * Which button began it, as {@link MOUSE_BUTTON} numbers them, or -1 between gestures.
893
+ *
894
+ * A press that a node or a port swallowed never sets this, so a gesture that was never
895
+ * the canvas's own is one the canvas stays out of — including the release that ends it,
896
+ * which does reach here on its way up the tree.
897
+ *
898
+ * @type {number}
899
+ */
900
+ button: -1,
901
+ /** where it began, in canvas pixels */
902
+ origin: new Vector2(),
903
+ /** whether it has travelled beyond {@link CANVAS_CLICK_TOLERANCE_PX} */
904
+ travelled: false,
905
+ /** what its drag is doing, once it has become one */
906
+ drag: CanvasDrag.None
907
+ };
908
+
909
+ /** graph-space corner the box was pulled from */
910
+ const marquee_anchor = new Vector2();
911
+
912
+ /** graph-space corner the cursor is at */
913
+ const marquee_head = new Vector2();
914
+
915
+ const marquee_region = new AABB2();
916
+
917
+ const v2_corner_a = new Vector2();
918
+ const v2_corner_b = new Vector2();
919
+
920
+ const cursor = new Vector2();
921
+
922
+ /**
923
+ * Put the box on screen across its two graph-space corners, and say what letting go of it
924
+ * there would do.
925
+ *
926
+ * @param {MouseEvent} event source of modifier key state
927
+ */
928
+ const drawMarquee = (event) => {
929
+ this.transformPointGraph2Canvas(marquee_anchor, v2_corner_a);
930
+ this.transformPointGraph2Canvas(marquee_head, v2_corner_b);
931
+
932
+ const x0 = min2(v2_corner_a.x, v2_corner_b.x);
933
+ const y0 = min2(v2_corner_a.y, v2_corner_b.y);
934
+
935
+ vMarquee.position.set(x0, y0);
936
+ vMarquee.size.set(
937
+ max2(v2_corner_a.x, v2_corner_b.x) - x0,
938
+ max2(v2_corner_a.y, v2_corner_b.y) - y0
939
+ );
940
+
941
+ // which of the three this is, before it is let go: the modifier that decides is held
942
+ // where the thing it changes cannot show it
943
+ vMarquee.setClass('additive', event.shiftKey && !event.ctrlKey);
944
+ vMarquee.setClass('toggle', event.ctrlKey);
945
+ };
946
+
406
947
  const draggableAspect = new DraggableAspect({
407
948
  el: this.el,
408
- dragStart() {
409
- cameraPosition.copy(camera.position)
949
+ dragStart: (position) => {
950
+ if (gesture.button === MOUSE_BUTTON.LEFT) {
951
+ gesture.drag = CanvasDrag.Marquee;
952
+
953
+ // anchored in graph space, so the box stays over the graph it was drawn across
954
+ this.transformPointCanvas2Graph(position, marquee_anchor);
955
+
956
+ marquee_head.copy(marquee_anchor);
957
+ } else if (
958
+ gesture.button === MOUSE_BUTTON.RIGHT
959
+ || gesture.button === MOUSE_BUTTON.MIDDLE
960
+ ) {
961
+ gesture.drag = CanvasDrag.Pan;
962
+
963
+ cameraPosition.copy(camera.position);
964
+ } else {
965
+ gesture.drag = CanvasDrag.None;
966
+ }
410
967
  },
411
- drag(p, o) {
412
- const d = o.clone();
968
+ drag: (position, origin, delta, event) => {
969
+ if (!gesture.travelled && position.distanceTo(origin) > CANVAS_CLICK_TOLERANCE_PX) {
970
+ gesture.travelled = true;
971
+ }
972
+
973
+ if (gesture.drag === CanvasDrag.Pan) {
974
+ const d = origin.clone();
975
+
976
+ d.sub(position);
977
+ d.multiplyScalar(1 / camera.scale.getValue());
978
+
979
+ d.add(cameraPosition);
980
+
981
+ camera.position.copy(d);
982
+ } else if (gesture.drag === CanvasDrag.Marquee) {
983
+ this.transformPointCanvas2Graph(position, marquee_head);
984
+
985
+ // nothing is shown until the gesture is a drag, or every click would flash a box
986
+ vMarquee.visible = gesture.travelled;
413
987
 
414
- d.sub(p);
415
- d.multiplyScalar(1 / camera.scale.getValue());
988
+ drawMarquee(event);
989
+ }
990
+ },
991
+ dragEnd: (position, origin, event) => {
992
+ const drag = gesture.drag;
993
+
994
+ gesture.drag = CanvasDrag.None;
995
+
996
+ if (drag !== CanvasDrag.Marquee) {
997
+ return;
998
+ }
416
999
 
417
- d.add(cameraPosition);
1000
+ vMarquee.visible = false;
418
1001
 
419
- camera.position.copy(d);
1002
+ if (!gesture.travelled) {
1003
+ // a click made with an unsteady hand; the release deals with it as one
1004
+ return;
1005
+ }
1006
+
1007
+ marquee_region.setBoundsUnordered(
1008
+ marquee_anchor.x, marquee_anchor.y,
1009
+ marquee_head.x, marquee_head.y
1010
+ );
1011
+
1012
+ this.applySelectionRegion(marquee_region, event);
420
1013
  }
421
1014
  });
422
1015
 
423
- draggableAspect.getPointer().on.wheel.add((delta, position) => {
424
- const oldScale = camera.scale.getValue();
1016
+ const pointer = draggableAspect.getPointer();
425
1017
 
426
- camera.zoomAt(position, (1 - delta.y / 20) * oldScale);
1018
+ pointer.on.down.add((position, event) => {
1019
+ if (gesture.button !== -1) {
1020
+ // a second button pressed during a gesture; the one that began it keeps it
1021
+ return;
1022
+ }
1023
+
1024
+ gesture.button = event.button;
1025
+ gesture.origin.copy(position);
1026
+ gesture.travelled = false;
1027
+
1028
+ if (event.button === MOUSE_BUTTON.MIDDLE) {
1029
+ // otherwise the browser answers a middle press with a scroll gesture of its own
1030
+ event.preventDefault();
1031
+ }
427
1032
  });
428
1033
 
429
- // clicks over the background select wires, or clear the selection
430
- // node and port elements stop pointer propagation, so taps here mean open canvas
431
- const tapPoint = new Vector2();
1034
+ // A release, and with it the two gestures that are made of not having moved. Both are the
1035
+ // canvas's only if the press was: a release over the canvas ends node drags and port drags
1036
+ // too, and those are already spoken for.
1037
+ pointer.on.up.add((position, event) => {
1038
+ if (event.button !== gesture.button || gesture.travelled) {
1039
+ return;
1040
+ }
1041
+
1042
+ if (event.button === MOUSE_BUTTON.LEFT) {
1043
+ // clicks over the background select wires, or clear the selection
1044
+ this.transformPointCanvas2Graph(position, cursor);
1045
+
1046
+ const connection = this.findConnectionAt(cursor);
432
1047
 
433
- draggableAspect.getPointer().on.tap.add((position, event) => {
434
- this.transformPointCanvas2Graph(position, tapPoint);
1048
+ this.applySelectionClick(null, connection !== null ? connection.id : null, event);
1049
+ } else if (event.button === MOUSE_BUTTON.RIGHT) {
1050
+ this.transformPointCanvas2Graph(position, cursor);
435
1051
 
436
- const connection = this.findConnectionAt(tapPoint);
1052
+ this.on.canvasContextMenu.send1({
1053
+ x: position.x,
1054
+ y: position.y,
1055
+ graph_x: cursor.x,
1056
+ graph_y: cursor.y,
1057
+ event
1058
+ });
1059
+ }
1060
+ });
437
1061
 
438
- this.applySelectionClick(null, connection !== null ? connection.id : null, event);
1062
+ // the release that closes the gesture, wherever on the page it happens
1063
+ pointer.on.globalUp.add((position, event) => {
1064
+ if (event.button === gesture.button) {
1065
+ gesture.button = -1;
1066
+ }
1067
+ });
1068
+
1069
+ pointer.on.wheel.add((delta, position) => {
1070
+ const oldScale = camera.scale.getValue();
1071
+
1072
+ camera.zoomAt(position, (1 - delta.y / 20) * oldScale);
439
1073
  });
440
1074
 
1075
+ // A canvas taken off screen mid-gesture never sees the release that would have ended it, and
1076
+ // one that came back still believing a button was down would ignore the next press.
1077
+ const abandonGesture = () => {
1078
+ gesture.button = -1;
1079
+ gesture.drag = CanvasDrag.None;
1080
+ gesture.travelled = false;
1081
+
1082
+ vMarquee.visible = false;
1083
+ };
1084
+
441
1085
  this.on.linked.add(draggableAspect.start, draggableAspect);
442
1086
  this.on.unlinked.add(draggableAspect.stop, draggableAspect);
1087
+ this.on.unlinked.add(abandonGesture);
1088
+ }
1089
+
1090
+ /**
1091
+ * The nodes a graph-space box touches.
1092
+ *
1093
+ * Touches rather than encloses: a box that has to go around whole nodes is a box drawn wider
1094
+ * than the graph, and every editor that offers the gesture takes overlap for that reason.
1095
+ *
1096
+ * @param {AABB2} region graph-space box
1097
+ * @returns {number[]} node ids
1098
+ */
1099
+ findNodesInRegion(region) {
1100
+ const result = [];
1101
+
1102
+ for (const node of this.graph.getNodes()) {
1103
+ const nodeVisual = this.visual.getNode(node.id);
443
1104
 
1105
+ if (nodeVisual === undefined) {
1106
+ // nothing has been drawn for it, so there is nothing the box could have gone around
1107
+ continue;
1108
+ }
1109
+
1110
+ const box = nodeVisual.dimensions;
1111
+
1112
+ if (aabb2_intersects_aabb2(
1113
+ region.x0, region.y0, region.x1, region.y1,
1114
+ box.x0, box.y0, box.x1, box.y1
1115
+ )) {
1116
+ result.push(node.id);
1117
+ }
1118
+ }
1119
+
1120
+ return result;
1121
+ }
1122
+
1123
+ /**
1124
+ * The wires a graph-space box holds whole.
1125
+ *
1126
+ * Whole, unlike the nodes, and for the same reason they are not: a box around a few nodes cuts
1127
+ * across every wire leaving them for elsewhere, and taking those would turn a gesture aimed at
1128
+ * four nodes into half the graph highlighted. A wire the box holds is one whose ports are both
1129
+ * inside it — so its nodes are in the selection too, and the box selects what it looks like it
1130
+ * selects.
1131
+ *
1132
+ * @param {AABB2} region graph-space box
1133
+ * @returns {number[]} connection ids
1134
+ */
1135
+ findConnectionsInRegion(region) {
1136
+ const result = [];
1137
+
1138
+ const connections = this.graph.connections;
1139
+ const n = connections.length;
1140
+
1141
+ for (let i = 0; i < n; i++) {
1142
+ const connection = connections.get(i);
1143
+
1144
+ this.resolveConnectionPath(connection).computeBounds(wire_aabb);
1145
+
1146
+ if (aabb2_contains(
1147
+ region.x0, region.y0, region.x1, region.y1,
1148
+ wire_aabb.x0, wire_aabb.y0, wire_aabb.x1, wire_aabb.y1
1149
+ )) {
1150
+ result.push(connection.id);
1151
+ }
1152
+ }
1153
+
1154
+ return result;
1155
+ }
1156
+
1157
+ /**
1158
+ * Apply a rubber-band gesture: what the box went around, met with the selection already there
1159
+ * the way the modifier keys ask — plain replaces, SHIFT adds, CTRL toggles.
1160
+ *
1161
+ * The same three {@link #applySelectionClick} offers, because they are one question asked of
1162
+ * more than one element at a time.
1163
+ *
1164
+ * @param {AABB2} region graph-space box
1165
+ * @param {MouseEvent|PointerEvent} event source of modifier key state
1166
+ * @returns {void}
1167
+ */
1168
+ applySelectionRegion(region, event) {
1169
+ const selection = this.selection;
1170
+
1171
+ const boxed_nodes = this.findNodesInRegion(region);
1172
+ const boxed_connections = this.findConnectionsInRegion(region);
1173
+
1174
+ let nodes, connections;
1175
+
1176
+ if (event.ctrlKey || event.shiftKey) {
1177
+
1178
+ nodes = selection.nodes.asArray().slice();
1179
+ connections = selection.connections.asArray().slice();
1180
+
1181
+ if (event.ctrlKey) {
1182
+
1183
+ boxed_nodes.forEach(id => array_toggle(nodes, id));
1184
+ boxed_connections.forEach(id => array_toggle(connections, id));
1185
+
1186
+ } else {
1187
+
1188
+ boxed_nodes.forEach(id => {
1189
+ if (!nodes.includes(id)) {
1190
+ nodes.push(id);
1191
+ }
1192
+ });
1193
+
1194
+ boxed_connections.forEach(id => {
1195
+ if (!connections.includes(id)) {
1196
+ connections.push(id);
1197
+ }
1198
+ });
1199
+
1200
+ }
1201
+
1202
+ } else {
1203
+ nodes = boxed_nodes;
1204
+ connections = boxed_connections;
1205
+ }
1206
+
1207
+ if (selection.matches(nodes, connections)) {
1208
+ // no change, keep the timeline clean
1209
+ return;
1210
+ }
1211
+
1212
+ this.actionProcessor.mark('select');
1213
+ this.actionProcessor.do(new SelectionSetAction(selection, nodes, connections));
444
1214
  }
445
1215
 
446
1216
  /**
@@ -458,24 +1228,19 @@ export class NodeGraphView extends View {
458
1228
  for (let i = 0; i < n; i++) {
459
1229
  const connection = connections.get(i);
460
1230
 
461
- this.getEndpointGraphPosition(connection.source, v2_hit_source);
462
- this.getEndpointGraphPosition(connection.target, v2_hit_target);
1231
+ const path = this.resolveConnectionPath(connection);
463
1232
 
464
- wire_bounds(wire_aabb, v2_hit_source.x, v2_hit_source.y, v2_hit_target.x, v2_hit_target.y);
1233
+ path.computeBounds(wire_aabb);
465
1234
 
466
1235
  if (
467
- point.x < wire_aabb[0] - best_distance || point.x > wire_aabb[2] + best_distance
468
- || point.y < wire_aabb[1] - best_distance || point.y > wire_aabb[3] + best_distance
1236
+ point.x < wire_aabb.x0 - best_distance || point.x > wire_aabb.x1 + best_distance
1237
+ || point.y < wire_aabb.y0 - best_distance || point.y > wire_aabb.y1 + best_distance
469
1238
  ) {
470
1239
  //outside the inflated bounds, can't beat the current best
471
1240
  continue;
472
1241
  }
473
1242
 
474
- const distance = wire_distance_to_point(
475
- point.x, point.y,
476
- v2_hit_source.x, v2_hit_source.y,
477
- v2_hit_target.x, v2_hit_target.y
478
- );
1243
+ const distance = path.distanceToPoint(point.x, point.y);
479
1244
 
480
1245
  if (distance < best_distance) {
481
1246
  best_distance = distance;
@@ -563,24 +1328,51 @@ export class NodeGraphView extends View {
563
1328
  return _x0 < this.size.x && _x1 > 0 && _y0 < this.size.y && _y1 > 0;
564
1329
  }
565
1330
 
1331
+ /**
1332
+ * The path a connection is drawn along — its route while that route still meets its ports, and
1333
+ * a plain curve between them otherwise. See {@link wire_resolve_path}.
1334
+ *
1335
+ * The fallback is a shared scratch object, so the result is only valid until this is called
1336
+ * again.
1337
+ *
1338
+ * @param {Connection} connection
1339
+ * @returns {ConnectionVisualData}
1340
+ */
1341
+ resolveConnectionPath(connection) {
1342
+ this.getEndpointGraphPosition(connection.source, v2_hit_source);
1343
+ this.getEndpointGraphPosition(connection.target, v2_hit_target);
1344
+
1345
+ return wire_resolve_path(
1346
+ this.visual.getConnection(connection.id),
1347
+ v2_hit_source.x, v2_hit_source.y,
1348
+ v2_hit_target.x, v2_hit_target.y,
1349
+ direct_wire
1350
+ );
1351
+ }
1352
+
566
1353
  /**
567
1354
  *
568
1355
  * @param {CanvasRenderingContext2D} ctx
569
- * @param {Vector2} source
570
- * @param {Vector2} target
1356
+ * @param {ConnectionVisualData} path
571
1357
  * @param {DataType} dataType
572
1358
  * @param {boolean} [selected] selected wires are drawn with a highlight halo
573
1359
  */
574
- drawConnection(ctx, source, target, dataType, selected = false) {
575
- wire_bounds(wire_aabb, source.x, source.y, target.x, target.y);
1360
+ drawConnection(ctx, path, dataType, selected = false) {
1361
+ const segments = path.segment_count;
1362
+
1363
+ if (segments === 0) {
1364
+ return;
1365
+ }
1366
+
1367
+ path.computeBounds(wire_aabb);
576
1368
 
577
1369
  const cw_2 = (CONNECTION_WIDTH / 2);
578
1370
 
579
1371
  if (!this.isGraphAABBVisible(
580
- wire_aabb[0] - cw_2,
581
- wire_aabb[1] - cw_2,
582
- wire_aabb[2] + cw_2,
583
- wire_aabb[3] + cw_2
1372
+ wire_aabb.x0 - cw_2,
1373
+ wire_aabb.y0 - cw_2,
1374
+ wire_aabb.x1 + cw_2,
1375
+ wire_aabb.y1 + cw_2
584
1376
  )) {
585
1377
  //connection is not visible, don't draw
586
1378
  return;
@@ -591,23 +1383,27 @@ export class NodeGraphView extends View {
591
1383
 
592
1384
  const alpha = clamp(cameraScale * CONNECTION_WIDTH, 0, 1);
593
1385
 
594
- wire_to_bezier(wire_bezier, source.x, source.y, target.x, target.y);
1386
+ ctx.beginPath();
595
1387
 
596
- //the graph->canvas transform is affine, transforming the control polygon transforms the curve
597
- for (let i = 0; i < 8; i += 2) {
598
- wire_bezier[i] = (wire_bezier[i] - cameraPosition.x) * cameraScale;
599
- wire_bezier[i + 1] = (wire_bezier[i + 1] - cameraPosition.y) * cameraScale;
600
- }
1388
+ for (let segment = 0; segment < segments; segment++) {
1389
+ path.write_segment_bezier(wire_bezier, 0, segment);
601
1390
 
602
- ctx.beginPath();
1391
+ //the graph->canvas transform is affine, transforming the control polygon transforms the curve
1392
+ for (let i = 0; i < 8; i += 2) {
1393
+ wire_bezier[i] = (wire_bezier[i] - cameraPosition.x) * cameraScale;
1394
+ wire_bezier[i + 1] = (wire_bezier[i + 1] - cameraPosition.y) * cameraScale;
1395
+ }
603
1396
 
604
- ctx.moveTo(wire_bezier[0], wire_bezier[1]);
1397
+ if (segment === 0) {
1398
+ ctx.moveTo(wire_bezier[0], wire_bezier[1]);
1399
+ }
605
1400
 
606
- ctx.bezierCurveTo(
607
- wire_bezier[2], wire_bezier[3],
608
- wire_bezier[4], wire_bezier[5],
609
- wire_bezier[6], wire_bezier[7]
610
- );
1401
+ ctx.bezierCurveTo(
1402
+ wire_bezier[2], wire_bezier[3],
1403
+ wire_bezier[4], wire_bezier[5],
1404
+ wire_bezier[6], wire_bezier[7]
1405
+ );
1406
+ }
611
1407
 
612
1408
  if (selected) {
613
1409
  ctx.lineWidth = max2(1, (CONNECTION_WIDTH + 4) * cameraScale);
@@ -646,6 +1442,19 @@ export class NodeGraphView extends View {
646
1442
  output.set(x, y);
647
1443
  }
648
1444
 
1445
+ unlink() {
1446
+ // The list drops every node view on unlink and rebuilds them on link, so keeping the map
1447
+ // across that would leave entries for views that no longer exist — and for nodes deleted
1448
+ // while unlinked, entries that nothing will ever replace.
1449
+ this.nodeViews.clear();
1450
+
1451
+ // and with them go the measurements they were going to make; the views built on the next
1452
+ // link have to make their own
1453
+ this.#unmeasured.clear();
1454
+
1455
+ super.unlink();
1456
+ }
1457
+
649
1458
  /**
650
1459
  * Convert point from Graph coordinate space to Canvas coordinate space
651
1460
  * @param {Vector2} input