@woosh/meep-engine 3.14.6 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1089) 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 +396 -0
  12. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -0
  13. package/editor/particles/effect/ParticleEffectDocument.js +989 -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/NodeGraphEditorView.d.ts +143 -2
  47. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  48. package/editor/view/node-graph/NodeGraphEditorView.js +358 -6
  49. package/editor/view/node-graph/NodeGraphMinimapView.d.ts +120 -0
  50. package/editor/view/node-graph/NodeGraphMinimapView.d.ts.map +1 -0
  51. package/editor/view/node-graph/NodeGraphMinimapView.js +859 -0
  52. package/editor/view/node-graph/NodeGraphPaletteView.d.ts +112 -0
  53. package/editor/view/node-graph/NodeGraphPaletteView.d.ts.map +1 -0
  54. package/editor/view/node-graph/NodeGraphPaletteView.js +352 -0
  55. package/editor/view/node-graph/NodeGraphSearchMenuView.d.ts +76 -0
  56. package/editor/view/node-graph/NodeGraphSearchMenuView.d.ts.map +1 -0
  57. package/editor/view/node-graph/NodeGraphSearchMenuView.js +247 -0
  58. package/editor/view/node-graph/NodeGraphView.d.ts +147 -5
  59. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  60. package/editor/view/node-graph/NodeGraphView.js +809 -76
  61. package/editor/view/node-graph/NodeIconView.d.ts +33 -0
  62. package/editor/view/node-graph/NodeIconView.d.ts.map +1 -0
  63. package/editor/view/node-graph/NodeIconView.js +54 -0
  64. package/editor/view/node-graph/NodeView.d.ts +71 -1
  65. package/editor/view/node-graph/NodeView.d.ts.map +1 -1
  66. package/editor/view/node-graph/NodeView.js +318 -17
  67. package/editor/view/node-graph/PortView.d.ts +41 -1
  68. package/editor/view/node-graph/PortView.d.ts.map +1 -1
  69. package/editor/view/node-graph/PortView.js +121 -69
  70. package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts +16 -3
  71. package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
  72. package/editor/view/node-graph/actions/ConnectionDeleteAction.js +29 -3
  73. package/editor/view/node-graph/actions/NodeCreateAction.d.ts +65 -0
  74. package/editor/view/node-graph/actions/NodeCreateAction.d.ts.map +1 -0
  75. package/editor/view/node-graph/actions/NodeCreateAction.js +108 -0
  76. package/editor/view/node-graph/actions/NodeDeleteAction.d.ts +6 -0
  77. package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
  78. package/editor/view/node-graph/actions/NodeDeleteAction.js +24 -2
  79. package/editor/view/node-graph/connection_wire_geometry.d.ts +34 -0
  80. package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
  81. package/editor/view/node-graph/connection_wire_geometry.js +79 -3
  82. package/editor/view/node-graph/node-graph.css +678 -0
  83. package/editor/view/particles/effect/ParticleCodeEditorView.d.ts +37 -0
  84. package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -0
  85. package/editor/view/particles/effect/ParticleCodeEditorView.js +479 -0
  86. package/editor/view/particles/effect/ParticleEffectEditorView.d.ts +61 -0
  87. package/editor/view/particles/effect/ParticleEffectEditorView.d.ts.map +1 -0
  88. package/editor/view/particles/effect/ParticleEffectEditorView.js +223 -0
  89. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +25 -0
  90. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -0
  91. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +606 -0
  92. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +156 -0
  93. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -0
  94. package/editor/view/particles/effect/ParticleGraphEditorView.js +1636 -0
  95. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +22 -0
  96. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -0
  97. package/editor/view/particles/effect/ParticleNodeParametersView.js +520 -0
  98. package/editor/view/particles/effect/ParticlePreviewView.d.ts +52 -0
  99. package/editor/view/particles/effect/ParticlePreviewView.d.ts.map +1 -0
  100. package/editor/view/particles/effect/ParticlePreviewView.js +533 -0
  101. package/editor/view/particles/effect/particle-editor.css +556 -0
  102. package/editor/view/prepareMeshLibrary.d.ts.map +1 -1
  103. package/editor/view/prepareMeshLibrary.js +8 -4
  104. package/package.json +1 -1
  105. package/samples/engine/first-scene/main.js +152 -152
  106. package/samples/generation/generators/mir_generator_place_bases.js +3 -3
  107. package/src/core/assert.d.ts +28 -24
  108. package/src/core/assert.d.ts.map +1 -1
  109. package/src/core/assert.js +34 -26
  110. package/src/core/geom/3d/shape/PosedShape3D.d.ts +17 -0
  111. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  112. package/src/core/geom/3d/shape/PosedShape3D.js +34 -2
  113. package/src/core/graph/format/graphviz/graphviz_escape_html_label.d.ts +17 -0
  114. package/src/core/graph/format/graphviz/graphviz_escape_html_label.d.ts.map +1 -0
  115. package/src/core/graph/format/graphviz/graphviz_escape_html_label.js +25 -0
  116. package/src/core/graph/format/graphviz/graphviz_escape_quoted.d.ts +16 -0
  117. package/src/core/graph/format/graphviz/graphviz_escape_quoted.d.ts.map +1 -0
  118. package/src/core/graph/format/graphviz/graphviz_escape_quoted.js +24 -0
  119. package/src/core/model/node-graph/NodeGraph.d.ts +12 -0
  120. package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
  121. package/src/core/model/node-graph/NodeGraph.js +21 -6
  122. package/src/core/model/node-graph/node/NodeDescription.d.ts +36 -0
  123. package/src/core/model/node-graph/node/NodeDescription.d.ts.map +1 -1
  124. package/src/core/model/node-graph/node/NodeDescription.js +41 -0
  125. package/src/core/model/node-graph/visual/ConnectionVisualData.d.ts +119 -0
  126. package/src/core/model/node-graph/visual/ConnectionVisualData.d.ts.map +1 -0
  127. package/src/core/model/node-graph/visual/ConnectionVisualData.js +317 -0
  128. package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.d.ts +4 -0
  129. package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.d.ts.map +1 -1
  130. package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.js +125 -22
  131. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +91 -2
  132. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  133. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +164 -113
  134. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts +162 -0
  135. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +1 -0
  136. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.js +288 -0
  137. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +109 -0
  138. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -0
  139. package/src/core/model/node-graph/visual/layout/LayoutProblem.js +141 -0
  140. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +149 -0
  141. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -0
  142. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +175 -0
  143. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +137 -0
  144. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -0
  145. package/src/core/model/node-graph/visual/layout/RouteGrid.js +242 -0
  146. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +114 -0
  147. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -0
  148. package/src/core/model/node-graph/visual/layout/RouteSearch.js +300 -0
  149. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +86 -0
  150. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -0
  151. package/src/core/model/node-graph/visual/layout/RouteSet.js +168 -0
  152. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts +48 -0
  153. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +1 -0
  154. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +555 -0
  155. package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts +34 -0
  156. package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +1 -0
  157. package/src/core/model/node-graph/visual/layout/layout_assign_layers.js +202 -0
  158. package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts +34 -0
  159. package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +1 -0
  160. package/src/core/model/node-graph/visual/layout/layout_break_cycles.js +254 -0
  161. package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts +29 -0
  162. package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -0
  163. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +184 -0
  164. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +29 -0
  165. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -0
  166. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +95 -0
  167. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +56 -0
  168. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -0
  169. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +131 -0
  170. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +36 -0
  171. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -0
  172. package/src/core/model/node-graph/visual/layout/layout_order_layers.js +415 -0
  173. package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts +21 -0
  174. package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +1 -0
  175. package/src/core/model/node-graph/visual/layout/layout_orient_links.js +49 -0
  176. package/src/core/model/node-graph/visual/layout/route_connections.d.ts +41 -0
  177. package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -0
  178. package/src/core/model/node-graph/visual/layout/route_connections.js +309 -0
  179. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +33 -0
  180. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -0
  181. package/src/core/model/node-graph/visual/layout/route_grid_build.js +237 -0
  182. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +25 -0
  183. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -0
  184. package/src/core/model/node-graph/visual/layout/route_nudge.js +220 -0
  185. package/src/core/model/node-graph/visual/layout/route_to_spline.d.ts +29 -0
  186. package/src/core/model/node-graph/visual/layout/route_to_spline.d.ts.map +1 -0
  187. package/src/core/model/node-graph/visual/layout/route_to_spline.js +120 -0
  188. package/src/engine/EngineHarness.d.ts.map +1 -1
  189. package/src/engine/EngineHarness.js +593 -586
  190. package/src/engine/EntityCreator.js +116 -116
  191. package/src/engine/achievements/AchievementManager.js +437 -437
  192. package/src/engine/animation/AnimatedActions.js +111 -111
  193. package/src/engine/animation/AnimationUtils.d.ts.map +1 -1
  194. package/src/engine/animation/AnimationUtils.js +246 -234
  195. package/src/engine/animation/Animations.d.ts +1 -0
  196. package/src/engine/animation/Animations.d.ts.map +1 -1
  197. package/src/engine/animation/Animations.js +13 -5
  198. package/src/engine/animation/clip/bind_property_writer.d.ts.map +1 -1
  199. package/src/engine/animation/clip/bind_property_writer.js +12 -5
  200. package/src/engine/animation/curve/binding/BoundTransform64Writer.d.ts +29 -0
  201. package/src/engine/animation/curve/binding/BoundTransform64Writer.d.ts.map +1 -0
  202. package/src/engine/animation/curve/binding/BoundTransform64Writer.js +80 -0
  203. package/src/engine/animation/removeEntityWithMeshParticlesEffect.js +4 -4
  204. package/src/engine/asset/loaders/gltf_test_fixtures.d.ts.map +1 -1
  205. package/src/engine/asset/loaders/gltf_test_fixtures.js +5 -4
  206. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +12 -12
  207. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  208. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +77 -44
  209. package/src/engine/control/first-person/abilities/LedgeGrab.js +1 -1
  210. package/src/engine/control/first-person/abilities/Mantle.js +1 -1
  211. package/src/engine/control/first-person/abilities/Slide.js +1 -1
  212. package/src/engine/control/first-person/collision/KinematicMover.d.ts +5 -9
  213. package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
  214. package/src/engine/control/first-person/collision/KinematicMover.js +59 -29
  215. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +2 -2
  216. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
  217. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +7 -7
  218. package/src/engine/ecs/EventType.d.ts +1 -0
  219. package/src/engine/ecs/EventType.js +35 -10
  220. package/src/engine/ecs/dynamic_actions/actions/definition/SendRequestActionDescription.d.ts.map +1 -1
  221. package/src/engine/ecs/dynamic_actions/actions/definition/SendRequestActionDescription.js +12 -4
  222. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +4 -4
  223. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  224. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +10 -11
  225. package/src/engine/ecs/grid/pick.js +1 -1
  226. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.d.ts +1 -1
  227. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +13 -13
  228. package/src/engine/ecs/gui/hud/testHudEdgeStick.js +3 -3
  229. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +10 -10
  230. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
  231. package/src/engine/ecs/ik/InverseKinematicsSystem.js +8 -8
  232. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +1 -1
  233. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +120 -97
  234. package/src/engine/ecs/ik/ik_bone_chain.d.ts +16 -5
  235. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
  236. package/src/engine/ecs/ik/ik_bone_chain.js +16 -4
  237. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +7 -3
  238. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +1 -1
  239. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +20 -16
  240. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +18 -0
  241. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -0
  242. package/src/engine/ecs/ik/ik_write_local_rotation.js +30 -0
  243. package/src/engine/ecs/parent/EntityNode.d.ts +24 -6
  244. package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
  245. package/src/engine/ecs/parent/EntityNode.js +54 -42
  246. package/src/engine/ecs/parent/EntityNodeFlags.d.ts +0 -1
  247. package/src/engine/ecs/parent/EntityNodeFlags.js +7 -8
  248. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  249. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  250. package/src/engine/ecs/speaker/VoiceSystem.js +4 -4
  251. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  252. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +2 -0
  253. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +5 -2
  254. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  255. package/src/engine/ecs/terrain/ecs/Terrain.js +7 -4
  256. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +3 -3
  257. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +7 -7
  258. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  259. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +84 -36
  260. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +513 -0
  261. package/src/engine/ecs/transform/Transform64.d.ts +48 -11
  262. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  263. package/src/engine/ecs/transform/Transform64.js +54 -15
  264. package/src/engine/ecs/transform/Transform64SerializationAdapter.d.ts +37 -0
  265. package/src/engine/ecs/transform/Transform64SerializationAdapter.d.ts.map +1 -0
  266. package/src/engine/ecs/transform/Transform64SerializationAdapter.js +75 -0
  267. package/src/engine/ecs/transform/__probe.d.ts +4 -0
  268. package/src/engine/ecs/transform/__probe.d.ts.map +1 -0
  269. package/src/engine/ecs/transform/t64_allocation_probe.d.ts +31 -0
  270. package/src/engine/ecs/transform/t64_allocation_probe.d.ts.map +1 -0
  271. package/src/engine/ecs/transform/t64_allocation_probe.js +78 -0
  272. package/src/engine/ecs/transform/t64_announce_change.d.ts +33 -0
  273. package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -0
  274. package/src/engine/ecs/transform/t64_announce_change.js +39 -0
  275. package/src/engine/ecs/transform/t64_equals_components.d.ts +30 -0
  276. package/src/engine/ecs/transform/t64_equals_components.d.ts.map +1 -0
  277. package/src/engine/ecs/transform/t64_equals_components.js +59 -0
  278. package/src/engine/ecs/transform/t64_read_rotation.d.ts +13 -0
  279. package/src/engine/ecs/transform/t64_read_rotation.d.ts.map +1 -0
  280. package/src/engine/ecs/transform/t64_read_rotation.js +16 -0
  281. package/src/engine/ecs/transform/t64_read_translation.d.ts +14 -0
  282. package/src/engine/ecs/transform/t64_read_translation.d.ts.map +1 -0
  283. package/src/engine/ecs/transform/t64_read_translation.js +17 -0
  284. package/src/engine/ecs/transform-attachment/TransformAttachment.d.ts +5 -5
  285. package/src/engine/ecs/transform-attachment/TransformAttachment.d.ts.map +1 -1
  286. package/src/engine/ecs/transform-attachment/TransformAttachment.js +4 -4
  287. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +10 -10
  288. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  289. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +71 -20
  290. package/src/engine/graphics/debug/createDebugLabel.js +3 -3
  291. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.d.ts.map +1 -1
  292. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +5 -4
  293. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  294. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +8 -3
  295. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +6 -6
  296. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  297. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +25 -13
  298. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraLanderSystem.js +1 -1
  299. package/src/engine/graphics/ecs/mesh/setMesh.js +2 -2
  300. package/src/engine/graphics/ecs/path/entity/EntityPath.d.ts.map +1 -1
  301. package/src/engine/graphics/ecs/path/entity/EntityPath.js +21 -7
  302. package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.d.ts +4 -4
  303. package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.d.ts.map +1 -1
  304. package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.js +4 -4
  305. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts +2 -2
  306. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  307. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +145 -135
  308. package/src/engine/graphics/geometry/MikkT/Build4RuleGroups.js +2 -2
  309. package/src/engine/graphics/geometry/MikkT/DegenEpilogue.js +1 -1
  310. package/src/engine/graphics/geometry/MikkT/DegenPrologue.js +1 -1
  311. package/src/engine/graphics/geometry/MikkT/EvalTspace.js +1 -1
  312. package/src/engine/graphics/geometry/MikkT/GenerateTSpaces.js +3 -3
  313. package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +659 -0
  314. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +21 -5
  315. package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts +45 -0
  316. package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts.map +1 -1
  317. package/src/engine/graphics/render/frame_graph/FrameGraph.js +282 -60
  318. package/src/engine/graphics/render/frame_graph/FramePassBuilder.d.ts.map +1 -1
  319. package/src/engine/graphics/render/frame_graph/FramePassBuilder.js +20 -9
  320. package/src/engine/graphics/render/frame_graph/FramePassNode.d.ts +12 -0
  321. package/src/engine/graphics/render/frame_graph/FramePassNode.d.ts.map +1 -1
  322. package/src/engine/graphics/render/frame_graph/FramePassNode.js +13 -0
  323. package/src/engine/graphics/render/frame_graph/FramePassResources.d.ts.map +1 -1
  324. package/src/engine/graphics/render/frame_graph/FramePassResources.js +5 -0
  325. package/src/engine/graphics/render/frame_graph/ResourceEntry.d.ts +19 -1
  326. package/src/engine/graphics/render/frame_graph/ResourceEntry.d.ts.map +1 -1
  327. package/src/engine/graphics/render/frame_graph/ResourceEntry.js +23 -1
  328. package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.d.ts +15 -1
  329. package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.d.ts.map +1 -1
  330. package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.js +33 -16
  331. package/src/engine/graphics/render/frame_graph/resource/RenderResourceManager.d.ts.map +1 -1
  332. package/src/engine/graphics/render/frame_graph/resource/RenderResourceManager.js +19 -1
  333. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +6 -6
  334. package/src/engine/graphics3/CameraSystem.d.ts +6 -6
  335. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -1
  336. package/src/engine/graphics3/CameraSystem.js +170 -170
  337. package/src/engine/graphics3/DecalSystem.d.ts +6 -6
  338. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  339. package/src/engine/graphics3/DecalSystem.js +449 -449
  340. package/src/engine/graphics3/LightSystem.d.ts +6 -6
  341. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  342. package/src/engine/graphics3/LightSystem.js +234 -221
  343. package/src/engine/graphics3/MeshSystem.d.ts +6 -6
  344. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  345. package/src/engine/graphics3/MeshSystem.js +53 -22
  346. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +20 -15
  347. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -1
  348. package/src/engine/graphics3/ParticipatingMediaSystem.js +198 -184
  349. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +6 -6
  350. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
  351. package/src/engine/graphics3/ParticleEmitterSystem.js +310 -289
  352. package/src/engine/graphics3/PickingSystem.d.ts +6 -6
  353. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
  354. package/src/engine/graphics3/PickingSystem.js +273 -273
  355. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -6
  356. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  357. package/src/engine/graphics3/ShadedGeometrySystem.js +180 -169
  358. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
  359. package/src/engine/graphics3/TerrainSystem.js +565 -566
  360. package/src/engine/graphics3/Trail3DSystem.d.ts +6 -6
  361. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  362. package/src/engine/graphics3/Trail3DSystem.js +221 -221
  363. package/src/engine/graphics3/camera_sync_from_transform.d.ts +2 -2
  364. package/src/engine/graphics3/camera_sync_from_transform.d.ts.map +1 -1
  365. package/src/engine/graphics3/camera_sync_from_transform.js +2 -1
  366. package/src/engine/graphics3/debug/gizmo_view_from_camera.js +4 -4
  367. package/src/engine/graphics3/particles/GPUParticularRenderer.d.ts +6 -0
  368. package/src/engine/graphics3/particles/GPUParticularRenderer.d.ts.map +1 -1
  369. package/src/engine/graphics3/particles/GPUParticularRenderer.js +82 -53
  370. package/src/engine/graphics3/particles/particle_gpu_records.d.ts +12 -8
  371. package/src/engine/graphics3/particles/particle_gpu_records.d.ts.map +1 -1
  372. package/src/engine/graphics3/particles/particle_gpu_records.js +53 -45
  373. package/src/engine/graphics3/preview/make_model_preview_scene.js +1 -1
  374. package/src/engine/graphics3/shade_camera_projection_ray.js +4 -4
  375. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts.map +1 -1
  376. package/src/engine/graphics3/shade_node_to_entity_composition.js +88 -84
  377. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +7 -7
  378. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  379. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +8 -8
  380. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +9 -8
  381. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
  382. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +29 -8
  383. package/src/engine/input/ecs/controllers/KeyboardCameraController.js +2 -2
  384. package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.d.ts.map +1 -1
  385. package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +35 -21
  386. package/src/engine/intelligence/behavior/util/RotationBehavior.js +5 -5
  387. package/src/engine/intelligence/mcts/StateNode.js +1 -1
  388. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +7 -7
  389. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
  390. package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -15
  391. package/src/engine/interpolation/pose_interpoland.d.ts +2 -2
  392. package/src/engine/interpolation/pose_interpoland.js +4 -4
  393. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts +4 -4
  394. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  395. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +39 -14
  396. package/src/engine/network/adapters/TransformReplicationAdapter.d.ts +7 -7
  397. package/src/engine/network/adapters/TransformReplicationAdapter.d.ts.map +1 -1
  398. package/src/engine/network/adapters/TransformReplicationAdapter.js +19 -20
  399. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +48 -0
  400. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  401. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +246 -3
  402. package/src/engine/network/replication/Replicator.d.ts +5 -3
  403. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  404. package/src/engine/network/replication/Replicator.js +65 -16
  405. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -3
  406. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  407. package/src/engine/physics/ccd/linear_sweep.js +9 -3
  408. package/src/engine/physics/constraint/solve_constraints.js +10 -10
  409. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +8 -8
  410. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -1
  411. package/src/engine/physics/ecs/ColliderObserverSystem.js +6 -6
  412. package/src/engine/physics/ecs/PhysicsSystem.d.ts +22 -32
  413. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  414. package/src/engine/physics/ecs/PhysicsSystem.js +2337 -2310
  415. package/src/engine/physics/ecs/find_non_finite_physics_state.js +6 -6
  416. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +7 -7
  417. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  418. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +16 -8
  419. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +4 -4
  420. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -1
  421. package/src/engine/physics/fluid/ecs/FluidSystem.js +6 -6
  422. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts +2 -2
  423. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts.map +1 -1
  424. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.js +4 -4
  425. package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +7 -7
  426. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +4 -4
  427. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +7 -7
  428. package/src/engine/physics/inertia/world_inverse_inertia.js +1 -1
  429. package/src/engine/physics/integration/integrate_position.d.ts.map +1 -1
  430. package/src/engine/physics/integration/integrate_position.js +13 -12
  431. package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.d.ts.map +1 -1
  432. package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.js +23 -5
  433. package/src/engine/physics/narrowphase/compute_penetration.js +18 -14
  434. package/src/engine/physics/narrowphase/convex_convex_manifold.js +2 -2
  435. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +9 -9
  436. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  437. package/src/engine/physics/narrowphase/narrowphase_step.js +95 -68
  438. package/src/engine/physics/narrowphase/refine_ray_concave.js +1 -1
  439. package/src/engine/physics/narrowphase/refine_ray_hit.js +3 -3
  440. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
  441. package/src/engine/physics/queries/overlap_shape.js +19 -7
  442. package/src/engine/physics/queries/raycast.js +3 -3
  443. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
  444. package/src/engine/physics/queries/shape_cast.js +628 -620
  445. package/src/engine/physics/solver/solve_contacts.js +10 -10
  446. package/src/engine/physics/vehicle/RaycastVehicle.d.ts +6 -5
  447. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  448. package/src/engine/physics/vehicle/RaycastVehicle.js +10 -5
  449. package/src/engine/sound/ecs/SoundListenerSystem.d.ts +16 -4
  450. package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
  451. package/src/engine/sound/ecs/SoundListenerSystem.js +70 -11
  452. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +7 -7
  453. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
  454. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +343 -338
  455. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +2 -2
  456. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  457. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +356 -345
  458. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +23 -2
  459. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -1
  460. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +174 -140
  461. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts +6 -6
  462. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
  463. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +185 -184
  464. package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.js +1 -1
  465. package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts +2 -1
  466. package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts.map +1 -1
  467. package/src/engine/sound/simulation/core/AcousticRegionIndex.js +4 -3
  468. package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts +3 -2
  469. package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts.map +1 -1
  470. package/src/engine/sound/simulation/core/AcousticVolumeRegion.js +6 -4
  471. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +10 -6
  472. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
  473. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +32 -7
  474. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts +7 -7
  475. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts.map +1 -1
  476. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +6 -6
  477. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  478. package/src/engine/sound/sopra/runtime/EventInstance.js +8 -2
  479. package/src/format/scene/gltf/gltf_component_type.d.ts.map +1 -1
  480. package/src/format/scene/gltf/gltf_component_type.js +3 -1
  481. package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
  482. package/src/format/texture/ktx2/ktx2_read.js +2 -1
  483. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
  484. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +8 -1
  485. package/src/generation/markers/GridCellActionPlaceMarker.d.ts +4 -4
  486. package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
  487. package/src/generation/markers/GridCellActionPlaceMarker.js +16 -6
  488. package/src/generation/markers/MarkerNode.d.ts +3 -3
  489. package/src/generation/markers/MarkerNode.d.ts.map +1 -1
  490. package/src/generation/markers/MarkerNode.js +3 -3
  491. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts +4 -4
  492. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts.map +1 -1
  493. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +7 -7
  494. package/src/generation/markers/actions/MarkerNodeActionImaginary.d.ts.map +1 -1
  495. package/src/generation/markers/actions/MarkerNodeActionImaginary.js +20 -2
  496. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
  497. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
  498. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +13 -3
  499. package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.d.ts.map +1 -1
  500. package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.js +11 -1
  501. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
  502. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +8 -4
  503. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
  504. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +13 -5
  505. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
  506. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +8 -2
  507. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
  508. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +16 -2
  509. package/src/shade/RENDERER_CONTRACT.md +584 -580
  510. package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
  511. package/src/shade/device/graph/BufferResourceDescriptor.js +193 -184
  512. package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
  513. package/src/shade/device/graph/TextureResourceDescriptor.js +12 -0
  514. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  515. package/src/shade/device/mock/SoftwareGPUDevice.js +8 -0
  516. package/src/shade/playground/avboit/README.md +117 -0
  517. package/src/shade/playground/avboit/index.html +215 -0
  518. package/src/shade/playground/avboit/main.d.ts +2 -0
  519. package/src/shade/playground/avboit/main.d.ts.map +1 -0
  520. package/src/shade/playground/avboit/main.js +875 -0
  521. package/src/shade/playground/basis_textures/main.js +1 -1
  522. package/src/shade/playground/ground_seam/main.js +1 -1
  523. package/src/shade/playground/particle_editor/README.md +175 -0
  524. package/src/shade/playground/particle_editor/index.html +76 -0
  525. package/src/shade/playground/particle_editor/main.d.ts +2 -0
  526. package/src/shade/playground/particle_editor/main.d.ts.map +1 -0
  527. package/src/shade/playground/particle_editor/main.js +139 -0
  528. package/src/shade/playground/particle_system/README.md +92 -62
  529. package/src/shade/playground/particle_system/index.html +67 -21
  530. package/src/shade/playground/particle_system/main.js +247 -102
  531. package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.d.ts +21 -18
  532. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -0
  533. package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.js +197 -181
  534. package/src/shade/playground/particle_system/particle_scene.d.ts +136 -20
  535. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  536. package/src/shade/playground/particle_system/particle_scene.js +487 -670
  537. package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -2
  538. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
  539. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +2 -1
  540. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  541. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +2 -1
  542. package/src/shade/playground/sponza_path_trace/main.js +1 -1
  543. package/src/shade/playground/volumetrics_froxel/main.js +917 -917
  544. package/src/shade/playground/volumetrics_froxel/measure.js +559 -559
  545. package/src/shade/renderer/Renderer.d.ts +44 -0
  546. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  547. package/src/shade/renderer/Renderer.js +169 -36
  548. package/src/shade/renderer/ShadeTransparencyMode.d.ts +13 -0
  549. package/src/shade/renderer/ShadeTransparencyMode.d.ts.map +1 -0
  550. package/src/shade/renderer/ShadeTransparencyMode.js +30 -0
  551. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  552. package/src/shade/renderer/atmosphere/GPUSky.js +4 -2
  553. package/src/shade/renderer/buffer/graph_read_buffer.d.ts.map +1 -1
  554. package/src/shade/renderer/buffer/graph_read_buffer.js +8 -1
  555. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  556. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +30 -0
  557. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  558. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +84 -0
  559. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +27 -0
  560. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +1 -0
  561. package/src/shade/renderer/buffer/table/gpu_database_words.d.ts +24 -0
  562. package/src/shade/renderer/buffer/table/gpu_database_words.d.ts.map +1 -0
  563. package/src/shade/renderer/buffer/table/gpu_database_words.js +92 -0
  564. package/src/shade/renderer/camera/Camera.d.ts +2 -2
  565. package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
  566. package/src/shade/renderer/camera/Camera.js +11 -5
  567. package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
  568. package/src/shade/renderer/camera/GPUCameraContext.js +2 -1
  569. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +3 -3
  570. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  571. package/src/shade/renderer/camera/OrbitalCameraController.js +31 -16
  572. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +2 -2
  573. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  574. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +4 -3
  575. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +10 -5
  576. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  577. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +8 -4
  578. package/src/shade/renderer/extension/FrameContext.d.ts.map +1 -1
  579. package/src/shade/renderer/extension/FrameContext.js +5 -0
  580. package/src/shade/renderer/extension/FrameRecord.d.ts +16 -0
  581. package/src/shade/renderer/extension/FrameRecord.d.ts.map +1 -1
  582. package/src/shade/renderer/extension/FrameRecord.js +31 -0
  583. package/src/shade/renderer/extension/GBufferTextures.d.ts +11 -0
  584. package/src/shade/renderer/extension/GBufferTextures.d.ts.map +1 -1
  585. package/src/shade/renderer/extension/GBufferTextures.js +14 -0
  586. package/src/shade/renderer/geometry/attribute/gpu_vertex_buffer_layout_from_spec.js +1 -1
  587. package/src/shade/renderer/geometry/util/geometry_stripify.js +6 -6
  588. package/src/shade/renderer/geometry/virtual/format/prototypeVGEOFormatViewer.js +8 -8
  589. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  590. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +14 -5
  591. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
  592. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +17 -9
  593. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts +2 -1
  594. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts.map +1 -1
  595. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.js +4 -1
  596. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts +2 -1
  597. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  598. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +11 -1
  599. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts +1 -1
  600. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts.map +1 -1
  601. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.js +4 -2
  602. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  603. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +5 -1
  604. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  605. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +35 -11
  606. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  607. package/src/shade/renderer/particles/DESIGN.md +271 -112
  608. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +251 -86
  609. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  610. package/src/shade/renderer/particles/GPUParticleSystem.js +822 -146
  611. package/src/shade/renderer/particles/ParticleConstants.d.ts +96 -3
  612. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  613. package/src/shade/renderer/particles/ParticleConstants.js +103 -4
  614. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +5 -4
  615. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  616. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +11 -15
  617. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +2 -2
  618. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -1
  619. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +20 -15
  620. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +7 -8
  621. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  622. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +7 -17
  623. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +56 -0
  624. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -0
  625. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +68 -0
  626. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts +39 -0
  627. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts.map +1 -0
  628. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.js +52 -0
  629. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +83 -0
  630. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -0
  631. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +166 -0
  632. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts +21 -5
  633. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  634. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +44 -85
  635. package/src/shade/renderer/particles/data/particle_header.d.ts +62 -0
  636. package/src/shade/renderer/particles/data/particle_header.d.ts.map +1 -0
  637. package/src/shade/renderer/particles/data/particle_header.js +103 -0
  638. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +179 -0
  639. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts.map +1 -0
  640. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -0
  641. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +120 -1
  642. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  643. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +90 -1
  644. package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts +283 -0
  645. package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts.map +1 -0
  646. package/src/shade/renderer/particles/graph/ParticleNodeGroup.js +419 -0
  647. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +44 -2
  648. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  649. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +476 -40
  650. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +188 -0
  651. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts.map +1 -0
  652. package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -0
  653. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +16 -9
  654. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  655. package/src/shade/renderer/particles/graph/compile_particle_graph.js +464 -205
  656. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts +11 -0
  657. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -0
  658. package/src/shade/renderer/particles/graph/flatten_particle_graph.js +213 -0
  659. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts +27 -0
  660. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -0
  661. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +75 -0
  662. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +83 -0
  663. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -0
  664. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +319 -0
  665. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts +22 -0
  666. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -0
  667. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +517 -0
  668. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts +70 -0
  669. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts.map +1 -0
  670. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.js +161 -0
  671. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts +8 -0
  672. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -0
  673. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +159 -0
  674. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +88 -0
  675. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -0
  676. package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +234 -0
  677. package/src/shade/renderer/particles/graph/make_particle_group.d.ts +98 -0
  678. package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -0
  679. package/src/shade/renderer/particles/graph/make_particle_group.js +427 -0
  680. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +11 -4
  681. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
  682. package/src/shade/renderer/particles/graph/particle_graph_authoring.js +121 -108
  683. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +38 -0
  684. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -0
  685. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +25 -0
  686. package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts +29 -0
  687. package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts.map +1 -0
  688. package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -0
  689. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +87 -0
  690. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -0
  691. package/src/shade/renderer/particles/graph/particle_graph_json.js +196 -0
  692. package/src/shade/renderer/particles/graph/particle_group_json.d.ts +86 -0
  693. package/src/shade/renderer/particles/graph/particle_group_json.d.ts.map +1 -0
  694. package/src/shade/renderer/particles/graph/particle_group_json.js +182 -0
  695. package/src/shade/renderer/particles/graph/particle_group_library.d.ts +33 -0
  696. package/src/shade/renderer/particles/graph/particle_group_library.d.ts.map +1 -0
  697. package/src/shade/renderer/particles/graph/particle_group_library.js +75 -0
  698. package/src/shade/renderer/particles/graph/particle_node_library.d.ts +37 -0
  699. package/src/shade/renderer/particles/graph/particle_node_library.d.ts.map +1 -0
  700. package/src/shade/renderer/particles/graph/particle_node_library.js +64 -0
  701. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +146 -0
  702. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -0
  703. package/src/shade/renderer/particles/graph/particle_node_parameters.js +234 -0
  704. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts +30 -0
  705. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -0
  706. package/src/shade/renderer/particles/graph/particle_node_presentation.js +286 -0
  707. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +66 -0
  708. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -0
  709. package/src/shade/renderer/particles/graph/validate_particle_graph.js +439 -0
  710. package/src/shade/renderer/particles/graph_particles.d.ts +143 -68
  711. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  712. package/src/shade/renderer/particles/graph_particles.js +424 -71
  713. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +107 -0
  714. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -0
  715. package/src/shade/renderer/particles/graph_particles_avboit.js +312 -0
  716. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +41 -8
  717. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  718. package/src/shade/renderer/particles/isa/InstructionStream.js +111 -33
  719. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +13 -10
  720. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
  721. package/src/shade/renderer/particles/isa/ParticleAssembler.js +30 -26
  722. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +27 -15
  723. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  724. package/src/shade/renderer/particles/isa/ParticleProgram.js +139 -34
  725. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +117 -9
  726. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  727. package/src/shade/renderer/particles/isa/ParticleVMISA.js +296 -37
  728. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +149 -0
  729. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -0
  730. package/src/shade/renderer/particles/isa/particle_assembly.js +999 -0
  731. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +25 -3
  732. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  733. package/src/shade/renderer/particles/layout/ParticleLayout.js +33 -5
  734. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +160 -0
  735. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -0
  736. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +478 -0
  737. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +291 -0
  738. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -0
  739. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +647 -0
  740. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +95 -0
  741. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -0
  742. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +213 -0
  743. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +16 -0
  744. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -0
  745. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +223 -0
  746. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +121 -0
  747. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -0
  748. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +206 -0
  749. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +11 -0
  750. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -0
  751. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +197 -0
  752. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts +4 -0
  753. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -0
  754. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -0
  755. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +4 -0
  756. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -0
  757. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +561 -0
  758. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts +4 -0
  759. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -0
  760. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +72 -0
  761. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts +4 -0
  762. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -0
  763. package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +86 -0
  764. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts +4 -0
  765. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -0
  766. package/src/shade/renderer/particles/optimizer/pass_peephole.js +271 -0
  767. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts +4 -0
  768. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -0
  769. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +268 -0
  770. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts +4 -0
  771. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -0
  772. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +151 -0
  773. package/src/shade/renderer/particles/particle_test_fixtures.d.ts +131 -0
  774. package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -0
  775. package/src/shade/renderer/particles/particle_test_fixtures.js +203 -0
  776. package/src/shade/renderer/particles/runtime/Emitter.d.ts +219 -0
  777. package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +1 -0
  778. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +128 -60
  779. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  780. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +286 -117
  781. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +264 -0
  782. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -0
  783. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +404 -0
  784. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +49 -15
  785. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +1 -1
  786. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +51 -18
  787. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  788. package/src/shade/renderer/particles/runtime/ProgramArena.js +72 -32
  789. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +4 -4
  790. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  791. package/src/shade/renderer/particles/runtime/create_particle_effect.js +4 -4
  792. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +15 -0
  793. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +1 -0
  794. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts +17 -0
  795. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts.map +1 -0
  796. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.js +75 -0
  797. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts +20 -0
  798. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -0
  799. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +94 -0
  800. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +15 -5
  801. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +1 -1
  802. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts +1 -2
  803. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts.map +1 -1
  804. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.js +1 -2
  805. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts +11 -0
  806. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts.map +1 -0
  807. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.js +13 -0
  808. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts +17 -0
  809. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts.map +1 -0
  810. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.js +22 -0
  811. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +14 -0
  812. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +1 -0
  813. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.js +23 -0
  814. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
  815. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts +18 -0
  816. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts.map +1 -0
  817. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.js +24 -0
  818. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +26 -0
  819. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -0
  820. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +59 -0
  821. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts +14 -0
  822. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -0
  823. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +153 -0
  824. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts +3 -0
  825. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -0
  826. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +124 -0
  827. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts +19 -0
  828. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -0
  829. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +147 -0
  830. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -8
  831. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  832. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +72 -37
  833. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts +5 -0
  834. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts.map +1 -0
  835. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.js +216 -0
  836. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  837. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +7 -3
  838. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  839. package/src/shade/renderer/particles/shaders/shader_particle_render.js +132 -197
  840. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  841. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +78 -24
  842. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts +26 -0
  843. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts.map +1 -0
  844. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.js +66 -0
  845. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +1 -1
  846. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  847. package/src/shade/renderer/particles/sort/shader_particle_sort.js +21 -36
  848. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +2 -2
  849. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  850. package/src/shade/renderer/particles/vm/ParticleVMReference.js +100 -90
  851. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  852. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +270 -138
  853. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts +9 -0
  854. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  855. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +26 -0
  856. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts +1 -2
  857. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts.map +1 -1
  858. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +0 -3
  859. package/src/shade/renderer/postprocess/dof/gather/DepthOfFieldU.js +1 -1
  860. package/src/shade/renderer/postprocess/dof/raymarch/DepthOfField.js +1 -1
  861. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  862. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  863. package/src/shade/renderer/postprocess/nss/NSS.js +3 -2
  864. package/src/shade/renderer/postprocess/nss/generate_NSS_WEIGHTS_ACTUAL.js +3 -2
  865. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts +7 -2
  866. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  867. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -1
  868. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +1 -1
  869. package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts +3 -0
  870. package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +1 -0
  871. package/src/shade/renderer/rasterize/{native/oit → forward}/FORWARD_VERTEX_SHADER_STRUCT.js +4 -4
  872. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts +3 -0
  873. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +1 -0
  874. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.js +17 -0
  875. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.d.ts +1 -1
  876. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -0
  877. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.js +16 -16
  878. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.d.ts +1 -1
  879. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -0
  880. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.js +17 -17
  881. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.d.ts +1 -1
  882. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +1 -0
  883. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.js +2 -2
  884. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts +3 -0
  885. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -0
  886. package/src/shade/renderer/rasterize/{native/oit → forward}/vertex_shader_chunk.js +4 -4
  887. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts +27 -0
  888. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts.map +1 -0
  889. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.js +27 -0
  890. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +87 -0
  891. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -0
  892. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +61 -0
  893. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts +107 -0
  894. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -0
  895. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +120 -0
  896. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +642 -0
  897. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +534 -0
  898. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts +15 -0
  899. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts.map +1 -0
  900. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.js +33 -0
  901. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts +20 -0
  902. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts.map +1 -0
  903. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.js +38 -0
  904. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +45 -0
  905. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -0
  906. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +139 -0
  907. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts +37 -0
  908. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts.map +1 -0
  909. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.js +73 -0
  910. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts +9 -0
  911. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts.map +1 -0
  912. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.js +17 -0
  913. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts +11 -0
  914. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts.map +1 -0
  915. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.js +18 -0
  916. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts +9 -0
  917. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts.map +1 -0
  918. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.js +17 -0
  919. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts +9 -0
  920. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts.map +1 -0
  921. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.js +17 -0
  922. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts +15 -0
  923. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts.map +1 -0
  924. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.js +25 -0
  925. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts +17 -0
  926. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts.map +1 -0
  927. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.js +35 -0
  928. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts +11 -0
  929. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts.map +1 -0
  930. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.js +21 -0
  931. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts +9 -0
  932. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts.map +1 -0
  933. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.js +26 -0
  934. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts +11 -0
  935. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts.map +1 -0
  936. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.js +22 -0
  937. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts +10 -0
  938. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts.map +1 -0
  939. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.js +21 -0
  940. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts +10 -0
  941. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts.map +1 -0
  942. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.js +32 -0
  943. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts +18 -0
  944. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -0
  945. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +58 -0
  946. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts +20 -0
  947. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts.map +1 -0
  948. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.js +27 -0
  949. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts +10 -0
  950. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts.map +1 -0
  951. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.js +18 -0
  952. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts +9 -0
  953. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts.map +1 -0
  954. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.js +21 -0
  955. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts +9 -0
  956. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts.map +1 -0
  957. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.js +23 -0
  958. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts +13 -0
  959. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts.map +1 -0
  960. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js +27 -0
  961. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts +22 -0
  962. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts.map +1 -0
  963. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.js +38 -0
  964. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +141 -0
  965. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -0
  966. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +994 -0
  967. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts +8 -0
  968. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts.map +1 -0
  969. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.js +135 -0
  970. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts +3 -0
  971. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -0
  972. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +101 -0
  973. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts +3 -0
  974. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -0
  975. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +96 -0
  976. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts +3 -0
  977. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -0
  978. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +83 -0
  979. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts +9 -0
  980. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts.map +1 -0
  981. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.js +119 -0
  982. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts +3 -0
  983. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -0
  984. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +87 -0
  985. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +15 -0
  986. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -0
  987. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +202 -0
  988. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts +22 -0
  989. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts.map +1 -0
  990. package/src/shade/renderer/rasterize/native/material_draw_indirect.js +69 -0
  991. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  992. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +665 -722
  993. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +3 -3
  994. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -4
  995. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -4
  996. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +7 -2
  997. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  998. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +16 -2
  999. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +3 -3
  1000. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
  1001. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +29 -23
  1002. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts +2 -2
  1003. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts.map +1 -1
  1004. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.js +3 -3
  1005. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +4 -4
  1006. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
  1007. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +2 -2
  1008. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts +2 -2
  1009. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts.map +1 -1
  1010. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +2 -2
  1011. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts +7 -7
  1012. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts.map +1 -1
  1013. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +79 -71
  1014. package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.d.ts.map +1 -1
  1015. package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.js +3 -1
  1016. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts +13 -3
  1017. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts.map +1 -1
  1018. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.js +15 -5
  1019. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts +8 -0
  1020. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts.map +1 -1
  1021. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.js +15 -5
  1022. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts +7 -0
  1023. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts.map +1 -1
  1024. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.js +17 -7
  1025. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts +17 -0
  1026. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts.map +1 -0
  1027. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.js +26 -0
  1028. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts +15 -0
  1029. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts.map +1 -0
  1030. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.js +26 -0
  1031. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  1032. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +8 -2
  1033. package/src/shade/renderer/shadow/map/PointLightShadowmap.d.ts.map +1 -1
  1034. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +7 -2
  1035. package/src/shade/renderer/shadow/map/SpotLightShadowmap.d.ts.map +1 -1
  1036. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +3 -15
  1037. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.d.ts.map +1 -1
  1038. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +10 -4
  1039. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +1 -1
  1040. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +7 -2
  1041. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +2 -2
  1042. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +3 -3
  1043. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  1044. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +3 -3
  1045. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  1046. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +66 -5
  1047. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  1048. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +35 -4
  1049. package/src/view/minimap/Minimap.d.ts.map +1 -1
  1050. package/src/view/minimap/Minimap.js +227 -225
  1051. package/src/view/minimap/MinimapCanvasView.js +3 -3
  1052. package/src/view/minimap/MinimapMarker.d.ts +45 -0
  1053. package/src/view/minimap/MinimapMarker.d.ts.map +1 -0
  1054. package/src/view/minimap/MinimapMarker.js +80 -0
  1055. package/src/view/minimap/MinimapMarkerCollection.d.ts +6 -5
  1056. package/src/view/minimap/MinimapMarkerCollection.d.ts.map +1 -1
  1057. package/src/view/minimap/MinimapMarkerCollection.js +6 -6
  1058. package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts +19 -0
  1059. package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts.map +1 -0
  1060. package/src/view/minimap/MinimapMarkerSerializationAdapter.js +42 -0
  1061. package/src/view/minimap/dom/MinimapCameraView.d.ts +1 -1
  1062. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  1063. package/src/view/minimap/dom/MinimapCameraView.js +23 -4
  1064. package/src/view/minimap/dom/MinimapMarkerView.js +3 -3
  1065. package/src/view/minimap/gl/MarkerGL.js +3 -3
  1066. package/src/view/util/DomLayoutFrame.d.ts +53 -0
  1067. package/src/view/util/DomLayoutFrame.d.ts.map +1 -0
  1068. package/src/view/util/DomLayoutFrame.js +122 -0
  1069. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.js +0 -19
  1070. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.js +0 -241
  1071. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.js +0 -40
  1072. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.js +0 -28
  1073. package/src/engine/ecs/util/hideEntityGracefully.js +0 -196
  1074. package/src/shade/renderer/particles/cull/chunk_particle_cull.js +0 -38
  1075. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +0 -214
  1076. package/src/shade/renderer/particles/particle_prototype.d.ts.map +0 -1
  1077. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.js +0 -86
  1078. package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +0 -52
  1079. package/src/shade/renderer/particles/shaders/chunk_particle_context.js +0 -58
  1080. package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts +0 -3
  1081. package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +0 -1
  1082. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts +0 -3
  1083. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +0 -1
  1084. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.js +0 -17
  1085. package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_brick4.d.ts.map +0 -1
  1086. package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_ibl.d.ts.map +0 -1
  1087. package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.d.ts.map +0 -1
  1088. package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts +0 -3
  1089. package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts.map +0 -1
@@ -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";
@@ -16,7 +17,14 @@ import { ConnectionCreateAction } from "./actions/ConnectionCreateAction.js";
16
17
  import { NodeParameterSetAction } from "./actions/NodeParameterSetAction.js";
17
18
  import { NodesMoveAction } from "./actions/NodesMoveAction.js";
18
19
  import { SelectionSetAction } from "./actions/SelectionSetAction.js";
19
- import { wire_bounds, wire_distance_to_point, wire_to_bezier } from "./connection_wire_geometry.js";
20
+ import Signal from "../../../src/core/events/signal/Signal.js";
21
+ import { wire_build_direct, wire_resolve_path } from "./connection_wire_geometry.js";
22
+ import { ConnectionVisualData } from "../../../src/core/model/node-graph/visual/ConnectionVisualData.js";
23
+ import AABB2 from "../../../src/core/geom/2d/aabb/AABB2.js";
24
+ import { aabb2_contains } from "../../../src/core/geom/2d/aabb/aabb2_contains.js";
25
+ import { aabb2_intersects_aabb2 } from "../../../src/core/geom/2d/aabb/aabb2_intersects_aabb2.js";
26
+ import { min2 } from "../../../src/core/math/min2.js";
27
+ import EmptyView from "../../../src/view/elements/EmptyView.js";
20
28
 
21
29
  export { NodeGraphCamera } from "./NodeGraphCamera.js";
22
30
 
@@ -25,9 +33,20 @@ const v2_pointer = new Vector2();
25
33
  const v2_hit_source = new Vector2();
26
34
  const v2_hit_target = new Vector2();
27
35
 
28
- const wire_aabb = new Float64Array(4);
36
+ const wire_aabb = new AABB2();
29
37
  const wire_bezier = new Float64Array(8);
30
38
 
39
+ /**
40
+ * Path of a wire that has no route of its own — one being dragged out of a port, one whose node has
41
+ * been moved since the graph was last laid out, or every wire in a graph that never has been.
42
+ *
43
+ * One instance, refilled per wire: it is used and finished with inside a single draw or hit test.
44
+ *
45
+ * @type {ConnectionVisualData}
46
+ */
47
+ const direct_wire = new ConnectionVisualData();
48
+
49
+
31
50
  const CONNECTION_WIDTH = 3;
32
51
 
33
52
  /**
@@ -36,6 +55,39 @@ const CONNECTION_WIDTH = 3;
36
55
  */
37
56
  const CONNECTION_HIT_TOLERANCE_PX = 6;
38
57
 
58
+ /**
59
+ * Mouse buttons, as {@link MouseEvent#button} numbers them.
60
+ * @enum {number}
61
+ */
62
+ const MOUSE_BUTTON = {
63
+ LEFT: 0,
64
+ MIDDLE: 1,
65
+ RIGHT: 2
66
+ };
67
+
68
+ /**
69
+ * How far the pointer may travel between a press and its release for the gesture to still count as
70
+ * a click rather than a drag, in canvas pixels.
71
+ *
72
+ * One number answers it for every button, and that is what keeps the canvas's background gestures
73
+ * out of each other's way: a press that stays put is a click — select, or ask for the menu — and one
74
+ * that moves is a drag — pan, or pull a selection box. Neither happens by accident, because a hand
75
+ * steady enough to have clicked never travels this far.
76
+ *
77
+ * @type {number}
78
+ */
79
+ const CANVAS_CLICK_TOLERANCE_PX = 5;
80
+
81
+ /**
82
+ * What a drag over the canvas background is doing.
83
+ * @enum {number}
84
+ */
85
+ const CanvasDrag = {
86
+ None: 0,
87
+ Pan: 1,
88
+ Marquee: 2
89
+ };
90
+
39
91
  /**
40
92
  *
41
93
  * @param {number[]} array
@@ -54,6 +106,111 @@ function array_toggle(array, value) {
54
106
  export class NodeGraphView extends View {
55
107
  el = document.createElement('div');
56
108
 
109
+ /**
110
+ * The view of each node currently on the canvas, by node id.
111
+ *
112
+ * A host that wants to decorate a node — mark it as carrying an error, flash it, badge it —
113
+ * needs to find its view, and reaching into the child list to do it depends on how this view
114
+ * happens to be assembled. Kept in step with the node list rather than rebuilt on demand.
115
+ *
116
+ * @readonly
117
+ * @type {Map<number, NodeView>}
118
+ */
119
+ nodeViews = new Map();
120
+
121
+ /**
122
+ * Nodes whose view has not yet recorded its drawn geometry — see {@link NodeView#measure}.
123
+ *
124
+ * Until this is empty, what the visual data holds for those nodes is the registry's estimate of
125
+ * how big they are, which is no basis for arranging a graph.
126
+ *
127
+ * @type {Set<number>}
128
+ */
129
+ #unmeasured = new Set();
130
+
131
+ /**
132
+ * Ask for the wires to be drawn again, at most once a frame. Set up in the constructor, where
133
+ * the canvas it repaints is; see the note there.
134
+ * @type {function()}
135
+ */
136
+ #requestRedraw;
137
+
138
+ /**
139
+ * The type a port carries on a particular node instance. See the constructor.
140
+ * @type {function(NodeInstancePortReference):DataType}
141
+ */
142
+ portDataType;
143
+
144
+ /**
145
+ * @readonly
146
+ */
147
+ on = {
148
+ ...this.on,
149
+
150
+ /**
151
+ * A node's view has been built and is in {@link nodeViews}. Carries `(NodeInstance, NodeView)`.
152
+ *
153
+ * A host that decorates node views cannot do it off the graph's own `nodeAdded`: a view's
154
+ * own bindings are linked before its children's, so a host bound to that signal runs before
155
+ * this view's list has built anything. This one fires when the view exists, by construction.
156
+ *
157
+ * @readonly
158
+ * @type {Signal<NodeInstance, NodeView>}
159
+ */
160
+ nodeViewAdded: new Signal(),
161
+
162
+ /**
163
+ * Every node on the canvas has recorded its drawn geometry, so the visual data describes
164
+ * the graph as it actually looks rather than as the registry guessed it would.
165
+ *
166
+ * What an automatic layout waits for: see {@link NodeGraphEditorView#layout}.
167
+ *
168
+ * @readonly
169
+ * @type {Signal}
170
+ */
171
+ measured: new Signal(),
172
+
173
+ /**
174
+ * The canvas itself was right-clicked — not a node, not a port. Carries the point, in this
175
+ * view's own pixels and in graph space, and the release that ended the gesture.
176
+ *
177
+ * Raised when a right press is released without having travelled, rather than off the DOM's
178
+ * own `contextmenu`: browsers disagree about when that one fires — on the press on some
179
+ * platforms, on the release on others — and a canvas that pans with the right button cannot
180
+ * have half of them opening a menu in the middle of the pan. The browser's own menu is
181
+ * suppressed either way, by this element's pointer device.
182
+ *
183
+ * The gesture a host turns into "add a node here": see
184
+ * {@link NodeGraphEditorView}'s search menu. Announced rather than acted on because what a
185
+ * canvas offers is the host's business, and this view has no library to offer.
186
+ *
187
+ * @readonly
188
+ * @type {Signal<{x: number, y: number, graph_x: number, graph_y: number, event: MouseEvent}>}
189
+ */
190
+ canvasContextMenu: new Signal(),
191
+
192
+ /**
193
+ * A wire being dragged out of a port was let go over open canvas rather than over another
194
+ * port. Carries the port it came from and where it was dropped.
195
+ *
196
+ * The other half of the same idea: a wire that reaches nothing is an author saying what they
197
+ * want next and where it goes, and a host that can finish the thought — by offering the types
198
+ * that could take the wire and connecting the one that is picked — turns a failed gesture
199
+ * into two steps of authoring at once.
200
+ *
201
+ * @readonly
202
+ * @type {Signal<{endpoint: NodeInstancePortReference, x: number, y: number, graph_x: number, graph_y: number}>}
203
+ */
204
+ connectionDropped: new Signal()
205
+ };
206
+
207
+ /**
208
+ * Whether the graph can be edited through this view. See the constructor.
209
+ * @readonly
210
+ * @type {boolean}
211
+ */
212
+ readOnly = false;
213
+
57
214
  /**
58
215
  *
59
216
  * @param {NodeGraph} graph
@@ -62,6 +219,17 @@ export class NodeGraphView extends View {
62
219
  * @param {NodeDescriptionVisualRegistry} nodeVisualRegistry
63
220
  * @param {ActionProcessor} [actionProcessor] timeline that all graph edits are routed through
64
221
  * @param {NodeGraphSelection} [selection]
222
+ * @param {function({node: NodeInstance, commit: function(string, *)}):View|null} [parameterViewFactory]
223
+ * see {@link NodeView}; passed through unchanged, so a host's controls reach every node
224
+ * @param {function(NodeInstancePortReference):DataType} [portDataType]
225
+ * the type a port carries on a particular node instance, which is what its marker is
226
+ * coloured by and what a wire out of it is drawn in. The declared type by default. A
227
+ * host whose ports are typed by what is wired into them — where an `add` is as wide as
228
+ * its inputs — supplies one, and calls {@link #refreshPortTypes} when its answers change.
229
+ * @param {boolean} [readOnly] show the graph without offering to change it: no wiring, no
230
+ * dragging, no parameter edits. What a host drilling into a graph it does not own — a
231
+ * locked node group — shows. Selection and the camera still work, because looking around
232
+ * is not editing.
65
233
  */
66
234
  constructor({
67
235
  graph,
@@ -69,7 +237,10 @@ export class NodeGraphView extends View {
69
237
  camera,
70
238
  nodeVisualRegistry,
71
239
  actionProcessor = new ActionProcessor({}),
72
- selection = new NodeGraphSelection()
240
+ selection = new NodeGraphSelection(),
241
+ parameterViewFactory = undefined,
242
+ portDataType = endpoint => endpoint.port.dataType,
243
+ readOnly = false
73
244
  }) {
74
245
  super();
75
246
 
@@ -79,6 +250,10 @@ export class NodeGraphView extends View {
79
250
  */
80
251
  this.actionProcessor = actionProcessor;
81
252
 
253
+ this.readOnly = readOnly;
254
+
255
+ this.portDataType = portDataType;
256
+
82
257
  /**
83
258
  *
84
259
  * @type {NodeGraphCamera}
@@ -105,12 +280,26 @@ export class NodeGraphView extends View {
105
280
 
106
281
  this.addClass('ui-node-graph-view');
107
282
 
283
+ this.setClass('read-only', readOnly);
284
+
108
285
  const self = this;
109
286
 
110
287
  const tempConnection = {
111
288
  enabled: false,
112
289
  anchor: new Vector2(),
113
- endpoint: null
290
+ endpoint: null,
291
+
292
+ /**
293
+ * Whether some port has already dealt with the drop that is ending this drag.
294
+ *
295
+ * A port's own pointer-up runs while the wire is still live and before the drag's, both
296
+ * being listeners for the same event on the way from the port to the window — so by the
297
+ * time the drag ends, this says whether the wire found a home. Without it there is no
298
+ * telling a wire dropped on open canvas from one dropped onto a port that refused it.
299
+ *
300
+ * @type {boolean}
301
+ */
302
+ consumed: false
114
303
  };
115
304
 
116
305
  const vBlockCanvas = new ListView(graph.nodes, {
@@ -130,27 +319,71 @@ export class NodeGraphView extends View {
130
319
  // dragging is editor behavior: managed here so moves land on the action timeline
131
320
  enableDrag: false,
132
321
  parameterSetCallback(n, parameterId, value) {
322
+ if (readOnly) {
323
+ // the controls are drawn — a locked graph is still worth reading — but
324
+ // nothing an author does in one reaches the model
325
+ return;
326
+ }
327
+
133
328
  actionProcessor.mark('set parameter');
134
329
  actionProcessor.do(new NodeParameterSetAction(n, parameterId, value));
135
330
  },
331
+ parameterViewFactory,
136
332
  portCreationCallback(portView, port) {
333
+ // what this port carries on this node, where that is not what it declares
334
+ portView.setDataType(self.portDataType(node.getEndpoint(port.id)));
137
335
 
138
336
  const draggableAspect = new DraggableAspect({
139
337
  el: portView.el,
140
- dragStart(p) {
338
+ dragStart(p, event) {
339
+ if (self.readOnly) {
340
+ return;
341
+ }
141
342
 
142
343
  const endpoint = new NodeInstancePortReference();
143
344
 
144
345
  endpoint.set(node, port);
145
346
 
146
347
  tempConnection.enabled = true;
348
+ tempConnection.consumed = false;
147
349
  tempConnection.endpoint = endpoint;
148
350
 
351
+ // The wire is drawn from here to the anchor, and a gesture that ends
352
+ // before the first move would otherwise be drawn to — and dropped
353
+ // at — wherever the previous one finished.
354
+ readPositionFromMouseEvent(v2_pointer, event, self.el);
355
+
356
+ self.transformPointCanvas2Graph(v2_pointer, tempConnection.anchor);
149
357
  },
150
358
  dragEnd() {
359
+ if (!tempConnection.enabled) {
360
+ return;
361
+ }
362
+
363
+ const endpoint = tempConnection.endpoint;
364
+ const consumed = tempConnection.consumed;
365
+
151
366
  tempConnection.enabled = false;
152
367
 
153
- vConnectionCanvas.render();
368
+ requestRedraw();
369
+
370
+ if (consumed) {
371
+ // some port took the drop, and has already made or refused the
372
+ // connection; there is nothing left of the gesture to report
373
+ return;
374
+ }
375
+
376
+ const anchor = tempConnection.anchor;
377
+
378
+ self.transformPointGraph2Canvas(anchor, v2_pointer);
379
+
380
+ self.on.connectionDropped.send1({
381
+ endpoint,
382
+ x: v2_pointer.x,
383
+ y: v2_pointer.y,
384
+ graph_x: anchor.x,
385
+ graph_y: anchor.y,
386
+ });
154
387
  },
155
388
  drag(p, o, delta, event) {
156
389
  // the anchor lives in graph space, derive it from the cursor position over this view
@@ -158,7 +391,7 @@ export class NodeGraphView extends View {
158
391
 
159
392
  self.transformPointCanvas2Graph(v2_pointer, tempConnection.anchor);
160
393
 
161
- vConnectionCanvas.render();
394
+ requestRedraw();
162
395
  }
163
396
  });
164
397
 
@@ -166,6 +399,10 @@ export class NodeGraphView extends View {
166
399
  //pointer released above the port
167
400
 
168
401
  if (tempConnection.enabled) {
402
+ // whatever happens below, the wire has met a port and its fate is
403
+ // decided here rather than on open canvas
404
+ tempConnection.consumed = true;
405
+
169
406
  /**
170
407
  *
171
408
  * @type {NodeInstancePortReference}
@@ -229,7 +466,20 @@ export class NodeGraphView extends View {
229
466
  }
230
467
  });
231
468
 
232
- nodeView.bindSignal(nodeView.position.onChanged, vConnectionCanvas.render, vConnectionCanvas);
469
+ nodeView.bindSignal(nodeView.position.onChanged, requestRedraw);
470
+
471
+ // A node reports where the browser put its ports, and the wires are drawn to those
472
+ // points — so a node that has just been measured, or re-measured because its
473
+ // content changed, is a node whose wires no longer meet it.
474
+ self.#unmeasured.add(node.id);
475
+
476
+ nodeView.bindSignal(nodeView.on.measured, changed => {
477
+ if (changed) {
478
+ requestRedraw();
479
+ }
480
+
481
+ self.#markMeasured(node.id);
482
+ });
233
483
 
234
484
  // selection state is reflected as a CSS class
235
485
  function updateSelectionClass() {
@@ -253,6 +503,13 @@ export class NodeGraphView extends View {
253
503
  dragStart() {
254
504
  dragEntries = [];
255
505
 
506
+ if (readOnly) {
507
+ // an empty entry list makes the rest of the gesture a no-op, and the
508
+ // aspect still exists so a node keeps swallowing pointer gestures the
509
+ // canvas underneath would otherwise read as a pan
510
+ return;
511
+ }
512
+
256
513
  if (selection.containsNode(node.id)) {
257
514
  // dragging a selected node moves the entire selection
258
515
  selection.nodes.forEach(id => {
@@ -307,6 +564,10 @@ export class NodeGraphView extends View {
307
564
  nodeView.on.linked.add(nodeDrag.start, nodeDrag);
308
565
  nodeView.on.unlinked.add(nodeDrag.stop, nodeDrag);
309
566
 
567
+ self.nodeViews.set(node.id, nodeView);
568
+
569
+ self.on.nodeViewAdded.send2(node, nodeView);
570
+
310
571
  return nodeView;
311
572
  }
312
573
  });
@@ -322,7 +583,6 @@ export class NodeGraphView extends View {
322
583
  });
323
584
 
324
585
  const v2_source = new Vector2();
325
- const v2_target = new Vector2();
326
586
 
327
587
  /**
328
588
  *
@@ -335,17 +595,15 @@ export class NodeGraphView extends View {
335
595
 
336
596
  ctx.lineCap = 'round';
337
597
 
338
- //draw connections
598
+ //draw connections: a wire carries what comes out of its source
339
599
  graph.connections.forEach(connection => {
340
600
 
341
- const source = connection.source;
342
- const target = connection.target;
343
-
344
- this.getEndpointGraphPosition(source, v2_source);
345
-
346
- this.getEndpointGraphPosition(target, v2_target);
347
-
348
- this.drawConnection(ctx, v2_source, v2_target, source.port.dataType, selection.containsConnection(connection.id));
601
+ this.drawConnection(
602
+ ctx,
603
+ this.resolveConnectionPath(connection),
604
+ this.portDataType(connection.source),
605
+ selection.containsConnection(connection.id)
606
+ );
349
607
 
350
608
  });
351
609
 
@@ -359,17 +617,38 @@ export class NodeGraphView extends View {
359
617
  const endpoint = tempConnection.endpoint;
360
618
 
361
619
  this.getEndpointGraphPosition(endpoint, v2_source);
362
- const dataType = endpoint.port.dataType;
620
+
621
+ const dataType = this.portDataType(endpoint);
622
+
623
+ const anchor = tempConnection.anchor;
624
+
363
625
  if (endpoint.port.direction === PortDirection.Out) {
364
- this.drawConnection(ctx, v2_source, tempConnection.anchor, dataType);
626
+ wire_build_direct(direct_wire, v2_source.x, v2_source.y, anchor.x, anchor.y);
365
627
  } else {
366
- this.drawConnection(ctx, tempConnection.anchor, v2_source, dataType);
628
+ wire_build_direct(direct_wire, anchor.x, anchor.y, v2_source.x, v2_source.y);
367
629
  }
630
+
631
+ this.drawConnection(ctx, direct_wire, dataType);
368
632
  }
369
633
  };
370
634
 
371
635
  this.addChild(vConnectionCanvas);
372
636
 
637
+ /**
638
+ * Ask for the wires to be drawn again.
639
+ *
640
+ * At most once a frame, because one gesture is many changes. Dragging a selection of forty
641
+ * nodes moves forty positions per pointer event, and each of those is a wire repaint that
642
+ * the thirty-nine after it make obsolete — forty full canvases where the screen can only
643
+ * show one. Everything that repaints the wires goes through here rather than calling the
644
+ * canvas, so there is one answer to how often that happens.
645
+ *
646
+ * @type {function()}
647
+ */
648
+ const requestRedraw = frameThrottle(vConnectionCanvas.render, vConnectionCanvas);
649
+
650
+ this.#requestRedraw = requestRedraw;
651
+
373
652
  this.size.onChanged.add((x, y) => {
374
653
  vConnectionCanvas.size.set(x, y);
375
654
  });
@@ -381,66 +660,481 @@ export class NodeGraphView extends View {
381
660
  vBlockCanvas.scale.setScalar(scale);
382
661
  vBlockCanvas.position.set(-p.x * scale, -p.y * scale);
383
662
 
384
- vConnectionCanvas.render();
663
+ requestRedraw();
385
664
  }
386
665
 
387
666
  this.initializeNavigationControls();
388
667
 
668
+ // A node view cannot measure itself when it is linked: the view framework links a child
669
+ // before putting its element in the document (see View#addChild), so at that moment the
670
+ // node has no layout box to read. By the time this fires every one of them is in place.
671
+ //
672
+ // Nodes added later — from a palette, from an undo — are in that same position and are
673
+ // caught by their own resize observer instead, on the browser's next rendering step.
674
+ this.on.linked.add(this.measureNodes, this);
675
+
389
676
  this.on.linked.add(onCameraChange);
390
677
  this.bindSignal(camera.position.onChanged, onCameraChange);
391
678
  this.bindSignal(camera.scale.onChanged, onCameraChange);
392
679
 
680
+ // node ids are pooled, so a view left behind by a deleted node would be handed out for an
681
+ // unrelated future one
682
+ this.bindSignal(graph.on.nodeRemoved, node => {
683
+ this.nodeViews.delete(node.id);
684
+
685
+ // a node nobody will ever draw again is not one the canvas is still waiting on
686
+ this.#markMeasured(node.id);
687
+ });
688
+
393
689
  // 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);
690
+ this.bindSignal(graph.on.connectionAdded, requestRedraw);
691
+ this.bindSignal(graph.on.connectionRemoved, requestRedraw);
396
692
 
397
693
  // 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);
694
+ this.bindSignal(selection.connections.on.added, requestRedraw);
695
+ this.bindSignal(selection.connections.on.removed, requestRedraw);
696
+ }
697
+
698
+ /**
699
+ * Ask every port what it carries now, and draw the wires again in the answer's colours.
700
+ *
701
+ * For a host that resolves port types per node instance (see `portDataType` in the
702
+ * constructor): a graph whose types follow its wiring changes its mind about ports far from the
703
+ * edit — a literal made narrower retypes everything downstream of it — so the host says when,
704
+ * and every port is asked rather than the ones it can think of.
705
+ *
706
+ * @returns {void}
707
+ */
708
+ refreshPortTypes() {
709
+ for (const node of this.graph.getNodes()) {
710
+ const nodeView = this.nodeViews.get(node.id);
711
+
712
+ if (nodeView === undefined) {
713
+ continue;
714
+ }
715
+
716
+ for (const portView of nodeView.portViews.values()) {
717
+ portView.setDataType(this.portDataType(node.getEndpoint(portView.port.id)));
718
+ }
719
+ }
720
+
721
+ this.#requestRedraw();
722
+ }
723
+
724
+ /**
725
+ * Have every node on the canvas record where the browser has put it.
726
+ *
727
+ * The nodes measure themselves as their content changes, so this is not the usual path — it is
728
+ * how the canvas gets its first measurement, at the one moment it is known that every node is
729
+ * in the document and none of them has been asked yet.
730
+ *
731
+ * @returns {void}
732
+ */
733
+ measureNodes() {
734
+ for (const nodeView of this.nodeViews.values()) {
735
+ nodeView.measure();
736
+ }
737
+ }
738
+
739
+ /**
740
+ * Whether the visual data describes the graph as drawn, rather than as the visual registry
741
+ * estimated it.
742
+ *
743
+ * False while the canvas is not on screen at all: an unlinked view has drawn nothing, and a
744
+ * node's size is not knowable without drawing it.
745
+ *
746
+ * @returns {boolean}
747
+ */
748
+ isMeasured() {
749
+ return this.isLinked && this.#unmeasured.size === 0;
750
+ }
751
+
752
+ /**
753
+ * @param {number} node_id
754
+ */
755
+ #markMeasured(node_id) {
756
+ if (!this.#unmeasured.delete(node_id)) {
757
+ //already accounted for
758
+ return;
759
+ }
760
+
761
+ if (this.#unmeasured.size === 0) {
762
+ this.on.measured.send0();
763
+ }
400
764
  }
401
765
 
766
+ /**
767
+ * Wire up what the canvas background does with the pointer.
768
+ *
769
+ * Three gestures want that background — moving the view, pulling a selection box across it, and
770
+ * asking for the add-node menu — and a canvas that guessed between them would keep getting it
771
+ * wrong. They are told apart by which button began the gesture, the way graph editors of this
772
+ * kind have long settled it (Unreal's Blueprint canvas among them):
773
+ *
774
+ * | gesture | what it does |
775
+ * |--------------------------|-------------------------------------------------------|
776
+ * | drag with the left | pull a selection box; SHIFT adds, CTRL toggles |
777
+ * | drag with right, middle | pan |
778
+ * | click with the left | select what is under the cursor, or clear the selection |
779
+ * | click with the right | ask the host for the add-node menu |
780
+ * | wheel | zoom about the cursor |
781
+ *
782
+ * A click and a drag are the same two events with a different amount of travel in between, so
783
+ * one tolerance decides which a gesture was — see {@link CANVAS_CLICK_TOLERANCE_PX}. That is how
784
+ * the right button both pans and opens a menu without ever doing one when the other was meant.
785
+ *
786
+ * A press over a node or a port never arrives here: those run pointer devices of their own and
787
+ * stop it where it is raised, so everything below is about open canvas.
788
+ *
789
+ * @returns {void}
790
+ */
402
791
  initializeNavigationControls() {
403
- const cameraPosition = new Vector2();
404
792
  const camera = this.camera;
405
793
 
794
+ const cameraPosition = new Vector2();
795
+
796
+ /**
797
+ * The selection box, while one is being pulled.
798
+ *
799
+ * An element of its own rather than something drawn on the wire canvas: that canvas is under
800
+ * the nodes, and a box whose far edge vanishes behind one is not showing what it is about to
801
+ * select.
802
+ *
803
+ * @type {EmptyView}
804
+ */
805
+ const vMarquee = new EmptyView({ classList: ['marquee'] });
806
+
807
+ vMarquee.visible = false;
808
+
809
+ this.addChild(vMarquee);
810
+
811
+ /**
812
+ * The canvas gesture in flight.
813
+ */
814
+ const gesture = {
815
+ /**
816
+ * Which button began it, as {@link MOUSE_BUTTON} numbers them, or -1 between gestures.
817
+ *
818
+ * A press that a node or a port swallowed never sets this, so a gesture that was never
819
+ * the canvas's own is one the canvas stays out of — including the release that ends it,
820
+ * which does reach here on its way up the tree.
821
+ *
822
+ * @type {number}
823
+ */
824
+ button: -1,
825
+ /** where it began, in canvas pixels */
826
+ origin: new Vector2(),
827
+ /** whether it has travelled beyond {@link CANVAS_CLICK_TOLERANCE_PX} */
828
+ travelled: false,
829
+ /** what its drag is doing, once it has become one */
830
+ drag: CanvasDrag.None
831
+ };
832
+
833
+ /** graph-space corner the box was pulled from */
834
+ const marquee_anchor = new Vector2();
835
+
836
+ /** graph-space corner the cursor is at */
837
+ const marquee_head = new Vector2();
838
+
839
+ const marquee_region = new AABB2();
840
+
841
+ const v2_corner_a = new Vector2();
842
+ const v2_corner_b = new Vector2();
843
+
844
+ const cursor = new Vector2();
845
+
846
+ /**
847
+ * Put the box on screen across its two graph-space corners, and say what letting go of it
848
+ * there would do.
849
+ *
850
+ * @param {MouseEvent} event source of modifier key state
851
+ */
852
+ const drawMarquee = (event) => {
853
+ this.transformPointGraph2Canvas(marquee_anchor, v2_corner_a);
854
+ this.transformPointGraph2Canvas(marquee_head, v2_corner_b);
855
+
856
+ const x0 = min2(v2_corner_a.x, v2_corner_b.x);
857
+ const y0 = min2(v2_corner_a.y, v2_corner_b.y);
858
+
859
+ vMarquee.position.set(x0, y0);
860
+ vMarquee.size.set(
861
+ max2(v2_corner_a.x, v2_corner_b.x) - x0,
862
+ max2(v2_corner_a.y, v2_corner_b.y) - y0
863
+ );
864
+
865
+ // which of the three this is, before it is let go: the modifier that decides is held
866
+ // where the thing it changes cannot show it
867
+ vMarquee.setClass('additive', event.shiftKey && !event.ctrlKey);
868
+ vMarquee.setClass('toggle', event.ctrlKey);
869
+ };
870
+
406
871
  const draggableAspect = new DraggableAspect({
407
872
  el: this.el,
408
- dragStart() {
409
- cameraPosition.copy(camera.position)
873
+ dragStart: (position) => {
874
+ if (gesture.button === MOUSE_BUTTON.LEFT) {
875
+ gesture.drag = CanvasDrag.Marquee;
876
+
877
+ // anchored in graph space, so the box stays over the graph it was drawn across
878
+ this.transformPointCanvas2Graph(position, marquee_anchor);
879
+
880
+ marquee_head.copy(marquee_anchor);
881
+ } else if (
882
+ gesture.button === MOUSE_BUTTON.RIGHT
883
+ || gesture.button === MOUSE_BUTTON.MIDDLE
884
+ ) {
885
+ gesture.drag = CanvasDrag.Pan;
886
+
887
+ cameraPosition.copy(camera.position);
888
+ } else {
889
+ gesture.drag = CanvasDrag.None;
890
+ }
891
+ },
892
+ drag: (position, origin, delta, event) => {
893
+ if (!gesture.travelled && position.distanceTo(origin) > CANVAS_CLICK_TOLERANCE_PX) {
894
+ gesture.travelled = true;
895
+ }
896
+
897
+ if (gesture.drag === CanvasDrag.Pan) {
898
+ const d = origin.clone();
899
+
900
+ d.sub(position);
901
+ d.multiplyScalar(1 / camera.scale.getValue());
902
+
903
+ d.add(cameraPosition);
904
+
905
+ camera.position.copy(d);
906
+ } else if (gesture.drag === CanvasDrag.Marquee) {
907
+ this.transformPointCanvas2Graph(position, marquee_head);
908
+
909
+ // nothing is shown until the gesture is a drag, or every click would flash a box
910
+ vMarquee.visible = gesture.travelled;
911
+
912
+ drawMarquee(event);
913
+ }
410
914
  },
411
- drag(p, o) {
412
- const d = o.clone();
915
+ dragEnd: (position, origin, event) => {
916
+ const drag = gesture.drag;
917
+
918
+ gesture.drag = CanvasDrag.None;
413
919
 
414
- d.sub(p);
415
- d.multiplyScalar(1 / camera.scale.getValue());
920
+ if (drag !== CanvasDrag.Marquee) {
921
+ return;
922
+ }
923
+
924
+ vMarquee.visible = false;
416
925
 
417
- d.add(cameraPosition);
926
+ if (!gesture.travelled) {
927
+ // a click made with an unsteady hand; the release deals with it as one
928
+ return;
929
+ }
418
930
 
419
- camera.position.copy(d);
931
+ marquee_region.setBoundsUnordered(
932
+ marquee_anchor.x, marquee_anchor.y,
933
+ marquee_head.x, marquee_head.y
934
+ );
935
+
936
+ this.applySelectionRegion(marquee_region, event);
420
937
  }
421
938
  });
422
939
 
423
- draggableAspect.getPointer().on.wheel.add((delta, position) => {
424
- const oldScale = camera.scale.getValue();
940
+ const pointer = draggableAspect.getPointer();
425
941
 
426
- camera.zoomAt(position, (1 - delta.y / 20) * oldScale);
942
+ pointer.on.down.add((position, event) => {
943
+ if (gesture.button !== -1) {
944
+ // a second button pressed during a gesture; the one that began it keeps it
945
+ return;
946
+ }
947
+
948
+ gesture.button = event.button;
949
+ gesture.origin.copy(position);
950
+ gesture.travelled = false;
951
+
952
+ if (event.button === MOUSE_BUTTON.MIDDLE) {
953
+ // otherwise the browser answers a middle press with a scroll gesture of its own
954
+ event.preventDefault();
955
+ }
427
956
  });
428
957
 
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();
958
+ // A release, and with it the two gestures that are made of not having moved. Both are the
959
+ // canvas's only if the press was: a release over the canvas ends node drags and port drags
960
+ // too, and those are already spoken for.
961
+ pointer.on.up.add((position, event) => {
962
+ if (event.button !== gesture.button || gesture.travelled) {
963
+ return;
964
+ }
965
+
966
+ if (event.button === MOUSE_BUTTON.LEFT) {
967
+ // clicks over the background select wires, or clear the selection
968
+ this.transformPointCanvas2Graph(position, cursor);
969
+
970
+ const connection = this.findConnectionAt(cursor);
971
+
972
+ this.applySelectionClick(null, connection !== null ? connection.id : null, event);
973
+ } else if (event.button === MOUSE_BUTTON.RIGHT) {
974
+ this.transformPointCanvas2Graph(position, cursor);
975
+
976
+ this.on.canvasContextMenu.send1({
977
+ x: position.x,
978
+ y: position.y,
979
+ graph_x: cursor.x,
980
+ graph_y: cursor.y,
981
+ event
982
+ });
983
+ }
984
+ });
432
985
 
433
- draggableAspect.getPointer().on.tap.add((position, event) => {
434
- this.transformPointCanvas2Graph(position, tapPoint);
986
+ // the release that closes the gesture, wherever on the page it happens
987
+ pointer.on.globalUp.add((position, event) => {
988
+ if (event.button === gesture.button) {
989
+ gesture.button = -1;
990
+ }
991
+ });
435
992
 
436
- const connection = this.findConnectionAt(tapPoint);
993
+ pointer.on.wheel.add((delta, position) => {
994
+ const oldScale = camera.scale.getValue();
437
995
 
438
- this.applySelectionClick(null, connection !== null ? connection.id : null, event);
996
+ camera.zoomAt(position, (1 - delta.y / 20) * oldScale);
439
997
  });
440
998
 
999
+ // A canvas taken off screen mid-gesture never sees the release that would have ended it, and
1000
+ // one that came back still believing a button was down would ignore the next press.
1001
+ const abandonGesture = () => {
1002
+ gesture.button = -1;
1003
+ gesture.drag = CanvasDrag.None;
1004
+ gesture.travelled = false;
1005
+
1006
+ vMarquee.visible = false;
1007
+ };
1008
+
441
1009
  this.on.linked.add(draggableAspect.start, draggableAspect);
442
1010
  this.on.unlinked.add(draggableAspect.stop, draggableAspect);
1011
+ this.on.unlinked.add(abandonGesture);
1012
+ }
1013
+
1014
+ /**
1015
+ * The nodes a graph-space box touches.
1016
+ *
1017
+ * Touches rather than encloses: a box that has to go around whole nodes is a box drawn wider
1018
+ * than the graph, and every editor that offers the gesture takes overlap for that reason.
1019
+ *
1020
+ * @param {AABB2} region graph-space box
1021
+ * @returns {number[]} node ids
1022
+ */
1023
+ findNodesInRegion(region) {
1024
+ const result = [];
1025
+
1026
+ for (const node of this.graph.getNodes()) {
1027
+ const nodeVisual = this.visual.getNode(node.id);
1028
+
1029
+ if (nodeVisual === undefined) {
1030
+ // nothing has been drawn for it, so there is nothing the box could have gone around
1031
+ continue;
1032
+ }
443
1033
 
1034
+ const box = nodeVisual.dimensions;
1035
+
1036
+ if (aabb2_intersects_aabb2(
1037
+ region.x0, region.y0, region.x1, region.y1,
1038
+ box.x0, box.y0, box.x1, box.y1
1039
+ )) {
1040
+ result.push(node.id);
1041
+ }
1042
+ }
1043
+
1044
+ return result;
1045
+ }
1046
+
1047
+ /**
1048
+ * The wires a graph-space box holds whole.
1049
+ *
1050
+ * Whole, unlike the nodes, and for the same reason they are not: a box around a few nodes cuts
1051
+ * across every wire leaving them for elsewhere, and taking those would turn a gesture aimed at
1052
+ * four nodes into half the graph highlighted. A wire the box holds is one whose ports are both
1053
+ * inside it — so its nodes are in the selection too, and the box selects what it looks like it
1054
+ * selects.
1055
+ *
1056
+ * @param {AABB2} region graph-space box
1057
+ * @returns {number[]} connection ids
1058
+ */
1059
+ findConnectionsInRegion(region) {
1060
+ const result = [];
1061
+
1062
+ const connections = this.graph.connections;
1063
+ const n = connections.length;
1064
+
1065
+ for (let i = 0; i < n; i++) {
1066
+ const connection = connections.get(i);
1067
+
1068
+ this.resolveConnectionPath(connection).computeBounds(wire_aabb);
1069
+
1070
+ if (aabb2_contains(
1071
+ region.x0, region.y0, region.x1, region.y1,
1072
+ wire_aabb.x0, wire_aabb.y0, wire_aabb.x1, wire_aabb.y1
1073
+ )) {
1074
+ result.push(connection.id);
1075
+ }
1076
+ }
1077
+
1078
+ return result;
1079
+ }
1080
+
1081
+ /**
1082
+ * Apply a rubber-band gesture: what the box went around, met with the selection already there
1083
+ * the way the modifier keys ask — plain replaces, SHIFT adds, CTRL toggles.
1084
+ *
1085
+ * The same three {@link #applySelectionClick} offers, because they are one question asked of
1086
+ * more than one element at a time.
1087
+ *
1088
+ * @param {AABB2} region graph-space box
1089
+ * @param {MouseEvent|PointerEvent} event source of modifier key state
1090
+ * @returns {void}
1091
+ */
1092
+ applySelectionRegion(region, event) {
1093
+ const selection = this.selection;
1094
+
1095
+ const boxed_nodes = this.findNodesInRegion(region);
1096
+ const boxed_connections = this.findConnectionsInRegion(region);
1097
+
1098
+ let nodes, connections;
1099
+
1100
+ if (event.ctrlKey || event.shiftKey) {
1101
+
1102
+ nodes = selection.nodes.asArray().slice();
1103
+ connections = selection.connections.asArray().slice();
1104
+
1105
+ if (event.ctrlKey) {
1106
+
1107
+ boxed_nodes.forEach(id => array_toggle(nodes, id));
1108
+ boxed_connections.forEach(id => array_toggle(connections, id));
1109
+
1110
+ } else {
1111
+
1112
+ boxed_nodes.forEach(id => {
1113
+ if (!nodes.includes(id)) {
1114
+ nodes.push(id);
1115
+ }
1116
+ });
1117
+
1118
+ boxed_connections.forEach(id => {
1119
+ if (!connections.includes(id)) {
1120
+ connections.push(id);
1121
+ }
1122
+ });
1123
+
1124
+ }
1125
+
1126
+ } else {
1127
+ nodes = boxed_nodes;
1128
+ connections = boxed_connections;
1129
+ }
1130
+
1131
+ if (selection.matches(nodes, connections)) {
1132
+ // no change, keep the timeline clean
1133
+ return;
1134
+ }
1135
+
1136
+ this.actionProcessor.mark('select');
1137
+ this.actionProcessor.do(new SelectionSetAction(selection, nodes, connections));
444
1138
  }
445
1139
 
446
1140
  /**
@@ -458,24 +1152,19 @@ export class NodeGraphView extends View {
458
1152
  for (let i = 0; i < n; i++) {
459
1153
  const connection = connections.get(i);
460
1154
 
461
- this.getEndpointGraphPosition(connection.source, v2_hit_source);
462
- this.getEndpointGraphPosition(connection.target, v2_hit_target);
1155
+ const path = this.resolveConnectionPath(connection);
463
1156
 
464
- wire_bounds(wire_aabb, v2_hit_source.x, v2_hit_source.y, v2_hit_target.x, v2_hit_target.y);
1157
+ path.computeBounds(wire_aabb);
465
1158
 
466
1159
  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
1160
+ point.x < wire_aabb.x0 - best_distance || point.x > wire_aabb.x1 + best_distance
1161
+ || point.y < wire_aabb.y0 - best_distance || point.y > wire_aabb.y1 + best_distance
469
1162
  ) {
470
1163
  //outside the inflated bounds, can't beat the current best
471
1164
  continue;
472
1165
  }
473
1166
 
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
- );
1167
+ const distance = path.distanceToPoint(point.x, point.y);
479
1168
 
480
1169
  if (distance < best_distance) {
481
1170
  best_distance = distance;
@@ -563,24 +1252,51 @@ export class NodeGraphView extends View {
563
1252
  return _x0 < this.size.x && _x1 > 0 && _y0 < this.size.y && _y1 > 0;
564
1253
  }
565
1254
 
1255
+ /**
1256
+ * The path a connection is drawn along — its route while that route still meets its ports, and
1257
+ * a plain curve between them otherwise. See {@link wire_resolve_path}.
1258
+ *
1259
+ * The fallback is a shared scratch object, so the result is only valid until this is called
1260
+ * again.
1261
+ *
1262
+ * @param {Connection} connection
1263
+ * @returns {ConnectionVisualData}
1264
+ */
1265
+ resolveConnectionPath(connection) {
1266
+ this.getEndpointGraphPosition(connection.source, v2_hit_source);
1267
+ this.getEndpointGraphPosition(connection.target, v2_hit_target);
1268
+
1269
+ return wire_resolve_path(
1270
+ this.visual.getConnection(connection.id),
1271
+ v2_hit_source.x, v2_hit_source.y,
1272
+ v2_hit_target.x, v2_hit_target.y,
1273
+ direct_wire
1274
+ );
1275
+ }
1276
+
566
1277
  /**
567
1278
  *
568
1279
  * @param {CanvasRenderingContext2D} ctx
569
- * @param {Vector2} source
570
- * @param {Vector2} target
1280
+ * @param {ConnectionVisualData} path
571
1281
  * @param {DataType} dataType
572
1282
  * @param {boolean} [selected] selected wires are drawn with a highlight halo
573
1283
  */
574
- drawConnection(ctx, source, target, dataType, selected = false) {
575
- wire_bounds(wire_aabb, source.x, source.y, target.x, target.y);
1284
+ drawConnection(ctx, path, dataType, selected = false) {
1285
+ const segments = path.segment_count;
1286
+
1287
+ if (segments === 0) {
1288
+ return;
1289
+ }
1290
+
1291
+ path.computeBounds(wire_aabb);
576
1292
 
577
1293
  const cw_2 = (CONNECTION_WIDTH / 2);
578
1294
 
579
1295
  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
1296
+ wire_aabb.x0 - cw_2,
1297
+ wire_aabb.y0 - cw_2,
1298
+ wire_aabb.x1 + cw_2,
1299
+ wire_aabb.y1 + cw_2
584
1300
  )) {
585
1301
  //connection is not visible, don't draw
586
1302
  return;
@@ -591,23 +1307,27 @@ export class NodeGraphView extends View {
591
1307
 
592
1308
  const alpha = clamp(cameraScale * CONNECTION_WIDTH, 0, 1);
593
1309
 
594
- wire_to_bezier(wire_bezier, source.x, source.y, target.x, target.y);
1310
+ ctx.beginPath();
595
1311
 
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
- }
1312
+ for (let segment = 0; segment < segments; segment++) {
1313
+ path.write_segment_bezier(wire_bezier, 0, segment);
601
1314
 
602
- ctx.beginPath();
1315
+ //the graph->canvas transform is affine, transforming the control polygon transforms the curve
1316
+ for (let i = 0; i < 8; i += 2) {
1317
+ wire_bezier[i] = (wire_bezier[i] - cameraPosition.x) * cameraScale;
1318
+ wire_bezier[i + 1] = (wire_bezier[i + 1] - cameraPosition.y) * cameraScale;
1319
+ }
603
1320
 
604
- ctx.moveTo(wire_bezier[0], wire_bezier[1]);
1321
+ if (segment === 0) {
1322
+ ctx.moveTo(wire_bezier[0], wire_bezier[1]);
1323
+ }
605
1324
 
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
- );
1325
+ ctx.bezierCurveTo(
1326
+ wire_bezier[2], wire_bezier[3],
1327
+ wire_bezier[4], wire_bezier[5],
1328
+ wire_bezier[6], wire_bezier[7]
1329
+ );
1330
+ }
611
1331
 
612
1332
  if (selected) {
613
1333
  ctx.lineWidth = max2(1, (CONNECTION_WIDTH + 4) * cameraScale);
@@ -646,6 +1366,19 @@ export class NodeGraphView extends View {
646
1366
  output.set(x, y);
647
1367
  }
648
1368
 
1369
+ unlink() {
1370
+ // The list drops every node view on unlink and rebuilds them on link, so keeping the map
1371
+ // across that would leave entries for views that no longer exist — and for nodes deleted
1372
+ // while unlinked, entries that nothing will ever replace.
1373
+ this.nodeViews.clear();
1374
+
1375
+ // and with them go the measurements they were going to make; the views built on the next
1376
+ // link have to make their own
1377
+ this.#unmeasured.clear();
1378
+
1379
+ super.unlink();
1380
+ }
1381
+
649
1382
  /**
650
1383
  * Convert point from Graph coordinate space to Canvas coordinate space
651
1384
  * @param {Vector2} input