@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,620 +1,628 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { bvh_query_user_data_intersects_aabb } from "../../../core/bvh2/bvh3/query/bvh_query_user_data_intersects_aabb.js";
3
- import { returnTrue } from "../../../core/function/returnTrue.js";
4
- import { aabb3_transform_oriented } from "../../../core/geom/3d/aabb/aabb3_transform_oriented.js";
5
- import { body_id_index } from "../body/BodyStorage.js";
6
- import { gjk } from "../../../core/geom/3d/gjk/gjk.js";
7
- import { mpr } from "../../../core/geom/3d/gjk/mpr.js";
8
- import { PosedShape3D } from "../../../core/geom/3d/shape/PosedShape3D.js";
9
-
10
- /**
11
- * Bisection halts when the search interval is below this fraction of
12
- * the sweep length. With `MAX_BISECTION = 32` and a unit-length sweep
13
- * the achieved precision is ≈ 1 / 2³² (well below any practical
14
- * world-scale tolerance), but we cap on relative tolerance so a
15
- * 10 m sweep doesn't insist on sub-micron precision.
16
- * @type {number}
17
- */
18
- const TOI_TOLERANCE = 1e-4;
19
-
20
- /**
21
- * Maximum bisection iterations. `log2(1 / TOI_TOLERANCE)` is enough
22
- * for any practical sweep; this is the hard upper bound to prevent
23
- * pathological inputs (NaN ray, etc.) from hanging the query.
24
- * @type {number}
25
- */
26
- const MAX_BISECTION = 32;
27
-
28
- /**
29
- * Coarse linear-search resolution for finding *any* overlap moment
30
- * along the per-candidate AABB-overlap interval (NOT the full sweep —
31
- * see `aabb_overlap_interval` for the analytical narrowing that runs
32
- * upstream). 32 substeps over the AABB-overlap window is dense enough
33
- * for any sweep where the shape's smallest extent is on the order of
34
- * its AABB's extent (true for spheres / boxes / capsules); the slab
35
- * intersection keeps that interval small even for kilometre-scale
36
- * sweeps, so this isn't the limit it would otherwise be.
37
- * @type {number}
38
- */
39
- const COARSE_STEPS = 32;
40
-
41
- const swept_aabb = new Float64Array(6);
42
- const local_aabb = new Float64Array(6);
43
- const initial_aabb = new Float64Array(6);
44
- const target_local_aabb = new Float64Array(6);
45
- const target_world_aabb = new Float64Array(6);
46
-
47
- // GJK simplex buffer (used to detect overlap during the bisection).
48
- const simplex_buf = new Float64Array(12);
49
-
50
- // Scratch for MPR's MTV output — same vec3 convention as EPA: direction
51
- // is "A's interior into B" with the magnitude being the depth. We use
52
- // MPR for the contact-normal recovery at the kiss point because it
53
- // converges reliably on smooth-vs-smooth supports where EPA hits its
54
- // iteration cap before tightening (sphere-vs-sphere shallow overlap).
55
- const mpr_result = new Float64Array(3);
56
-
57
- /**
58
- * Long-lived PosedShape3D adapters for the swept shape and the
59
- * candidate's collider. Both are re-bound per query — the swept one
60
- * also gets its position field re-written every bisection step
61
- * without re-running `setup()`, since shape and rotation are
62
- * constant through the sweep.
63
- */
64
- const swept_posed = new PosedShape3D();
65
- const candidate_posed = new PosedShape3D();
66
-
67
- /**
68
- * Buffer for the union of static-BVH and dynamic-BVH candidates that
69
- * overlap the swept AABB. Grows by doubling on the rare overflow.
70
- * @type {Uint32Array}
71
- */
72
- let scratch_candidates = new Uint32Array(64);
73
-
74
- /**
75
- * Depths at or below this are not a contact. A kissing pair is not always
76
- * numerically exact — MPR returns a few microns of "overlap" for a sphere
77
- * resting on a plane where a box-on-box kiss returns a clean zero — so the
78
- * tangency test needs the same tolerance the narrowphase already applies
79
- * (`compute_penetration`'s CONTACT_EPSILON, same value and same reasoning).
80
- * Well below any real overlap a caller would be asked to depenetrate from,
81
- * and far below the skin widths character controllers work at.
82
- * @type {number}
83
- */
84
- const CONTACT_EPSILON = 1e-4;
85
-
86
- /**
87
- * How far from parallel a sweep must be before it counts as driving INTO a
88
- * tangent contact rather than sliding along it — a sine, both inputs being
89
- * unit vectors, so this is ~0.006°. Comfortably above the angular noise in an
90
- * MPR-recovered normal and far below any inclination that would move a body
91
- * meaningfully into a surface over one sweep.
92
- * @type {number}
93
- */
94
- const GRAZING_SINE_EPSILON = 1e-4;
95
-
96
- /**
97
- * Distance past the reported TOI at which the contact normal is sampled.
98
- * Bisection stops on the just-SEPARATING side, so MPR needs the pair
99
- * nudged into genuine overlap before it has an MTV to report.
100
- * @type {number}
101
- */
102
- const NORMAL_PROBE_OFFSET = 0.01;
103
-
104
- /**
105
- * Unit contact normal recovered by {@link probe_contact_normal}.
106
- * @type {Float64Array}
107
- */
108
- const probe_normal = new Float64Array(3);
109
-
110
- /**
111
- * Recover the target's outward surface normal by running MPR on
112
- * `swept_posed` displaced to `(px, py, pz)` against `candidate_posed`
113
- * (both must already be bound by the caller).
114
- *
115
- * Returns `false` — leaving `out` untouched — when MPR reports no depth worth
116
- * the name (at or below {@link CONTACT_EPSILON}). That is not an MPR failure
117
- * so much as the honest answer for a pair that is TANGENT at the probe pose:
118
- * a kiss carries no direction, so there is no normal to read off it. Callers
119
- * use that verdict both ways — as "no normal here" and as "this is a touch,
120
- * not an overlap".
121
- *
122
- * Sign-validation: MPR's polytope can settle on either side of the origin
123
- * for highly symmetric configurations, so we dot against the body-centre
124
- * axis and flip if needed (same pattern as `narrowphase_step`'s EPA path).
125
- * The stored normal is the target's outward surface normal — `B → A`
126
- * direction — i.e. the negated (validated) MTV.
127
- *
128
- * @param {Float64Array} out receives the unit normal on success
129
- * @param {number} px swept shape's probe centre
130
- * @param {number} py
131
- * @param {number} pz
132
- * @param {Transform} target_tr the target body's transform (centre for the
133
- * sign check)
134
- * @returns {boolean}
135
- */
136
- function probe_contact_normal(out, px, py, pz, target_tr) {
137
- swept_posed.px = px;
138
- swept_posed.py = py;
139
- swept_posed.pz = pz;
140
-
141
- if (!mpr(mpr_result, 0, swept_posed, candidate_posed)) return false;
142
-
143
- let ex = mpr_result[0], ey = mpr_result[1], ez = mpr_result[2];
144
- const depth = Math.sqrt(ex * ex + ey * ey + ez * ez);
145
- if (!(depth > CONTACT_EPSILON) || !Number.isFinite(depth)) return false;
146
-
147
- const ab_x = target_tr.position.x - px;
148
- const ab_y = target_tr.position.y - py;
149
- const ab_z = target_tr.position.z - pz;
150
- if (ex * ab_x + ey * ab_y + ez * ab_z < 0) {
151
- ex = -ex; ey = -ey; ez = -ez;
152
- }
153
-
154
- const inv = 1 / depth;
155
- out[0] = -ex * inv;
156
- out[1] = -ey * inv;
157
- out[2] = -ez * inv;
158
- return true;
159
- }
160
-
161
- /**
162
- * Recover the target's outward surface normal for a contact whose pose is
163
- * `(cx, cy, cz)` — the swept shape's centre AT the contact — sweeping along
164
- * unit `(dx, dy, dz)`. `swept_posed` (shape + rotation) and `candidate_posed`
165
- * must already be bound by the caller; on success the unit normal is written
166
- * to `out`.
167
- *
168
- * MPR needs genuine overlap before it has an MTV to report, and bisection
169
- * stops on the just-SEPARATING side, so neither the contact pose itself nor
170
- * the reported `t` is a usable sample point. Two probes displace it:
171
- *
172
- * Probe 1 steps `NORMAL_PROBE_OFFSET` ALONG the sweep. That is the whole
173
- * answer wherever the sweep runs INTO the surface.
174
- *
175
- * Probe 2 covers what probe 1 structurally cannot. A GRAZING contact — a body
176
- * merely touching geometry it is sliding past, level brushes flush against a
177
- * character, a seam between coplanar faces — has the sweep running PARALLEL to
178
- * the contact plane, so advancing along it leaves the pair exactly tangent
179
- * however far it goes. A sweep pointing AWAY from the surface is worse still:
180
- * probe 1 separates them further. Either way MPR reports zero depth, and zero
181
- * depth carries no direction.
182
- *
183
- * So probe 2 displaces toward the target's CENTRE, which is interior to it
184
- * (MPR's own precondition) and so closes on it from any contact orientation.
185
- * It starts from the CONTACT pose rather than probe 1's — anchoring it at
186
- * probe 1's pose lets a sweep directly away from the surface cancel the two
187
- * displacements against each other and land back on the tangency it was trying
188
- * to escape.
189
- *
190
- * The distance DOUBLES until the overlap is measurable, because one fixed
191
- * offset cannot serve both ends of the range. Only the component along the
192
- * (unknown) contact normal deepens the overlap, and that component shrinks
193
- * with the target's size: 1 cm toward the centre of a 1 m brush sinks ~1 cm,
194
- * but toward the centre of a 1 km floor 400 m away it sinks 30 µm — under
195
- * {@link CONTACT_EPSILON}, and the normal would be lost on exactly the large
196
- * flat geometry a character spends its life on. Growing from the smallest
197
- * offset keeps the displacement as shallow as it can be, which is what stops a
198
- * target thinner than the probe from reporting its FAR face.
199
- *
200
- * Getting this right matters more than precision: the alternative is the
201
- * `-ray.direction` fallback, which opposes the sweep BY CONSTRUCTION. A caller
202
- * testing `direction · normal < 0` to ask "is this surface in my way?" is then
203
- * told yes for every direction it could possibly sweep, including straight
204
- * down a wall it is only brushing — a kinematic character in that state has no
205
- * escape (see `KinematicMover._slide`).
206
- *
207
- * @param {Float64Array} out receives the unit normal on success
208
- * @param {number} cx swept shape's centre at the contact
209
- * @param {number} cy
210
- * @param {number} cz
211
- * @param {number} dx unit sweep direction
212
- * @param {number} dy
213
- * @param {number} dz
214
- * @param {Transform} target_tr the target body's transform
215
- * @returns {boolean} false when every probe degenerates — `out` is untouched
216
- */
217
- function recover_contact_normal(out, cx, cy, cz, dx, dy, dz, target_tr) {
218
- if (probe_contact_normal(
219
- out,
220
- cx + dx * NORMAL_PROBE_OFFSET,
221
- cy + dy * NORMAL_PROBE_OFFSET,
222
- cz + dz * NORMAL_PROBE_OFFSET,
223
- target_tr,
224
- )) return true;
225
-
226
- const ab_x = target_tr.position.x - cx;
227
- const ab_y = target_tr.position.y - cy;
228
- const ab_z = target_tr.position.z - cz;
229
- const ab_len = Math.sqrt(ab_x * ab_x + ab_y * ab_y + ab_z * ab_z);
230
- // Coincident centres leave no direction to close along, and the shapes are
231
- // then as overlapped as they get — probe 1 already had its answer. The
232
- // finite check also bounds the loop below against a degenerate pose.
233
- if (!(ab_len > 0) || !Number.isFinite(ab_len)) return false;
234
-
235
- const ux = ab_x / ab_len, uy = ab_y / ab_len, uz = ab_z / ab_len;
236
- // Bounded by construction — doubling from a fixed offset reaches `ab_len`
237
- // in log2(ab_len / NORMAL_PROBE_OFFSET) steps. Stopping there keeps the
238
- // probe on the near side of the target's centre.
239
- for (let d = NORMAL_PROBE_OFFSET; d < ab_len; d *= 2) {
240
- if (probe_contact_normal(out, cx + ux * d, cy + uy * d, cz + uz * d, target_tr)) return true;
241
- }
242
- return false;
243
- }
244
-
245
- /**
246
- * Sweep a convex shape along a ray and find the first body it would
247
- * hit. Used by character controllers (sweep a capsule along intended
248
- * movement to find blockers), high-speed projectile movement (avoid
249
- * tunnelling without paying for full per-body CCD), and any kinematic
250
- * "where would this body end up if I tried to move it?" query.
251
- *
252
- * Pipeline:
253
- * 1. Build the swept AABB: the shape's local-frame AABB rotated
254
- * into world by `rotation`, translated to `ray.origin`, then
255
- * stretched along `ray.direction * ray.tMax`.
256
- * 2. Query both broadphase BVHs (static + dynamic) for leaves whose
257
- * AABB overlaps the swept volume.
258
- * 3. For each candidate, bisect the [0, best_t] interval for the
259
- * smallest `t` at which the swept shape overlaps the candidate's
260
- * collider. GJK on each midpoint.
261
- *
262
- * Picking `best_t` (rather than always running the full [0, tMax]
263
- * bisection) is the early-termination optimisation: once we have a
264
- * hit at some t, no later candidate can produce a smaller TOI by
265
- * being checked at its full [0, tMax] interval.
266
- *
267
- * Output on hit:
268
- * - `result.t` — sweep distance to impact (in the same units as
269
- * `ray.direction`'s magnitude; for a unit-direction ray, this is
270
- * metres).
271
- * - `result.position` — `ray.origin + t * ray.direction`, i.e. the
272
- * centre of the swept shape at the moment of first contact. NOT
273
- * a point on the target's surface; that would need narrowphase
274
- * refinement which the broadphase-only architecture doesn't have
275
- * wired up yet.
276
- * - `result.normal` — target surface's outward normal at the kiss
277
- * point (unit length), recovered by running MPR against the
278
- * just-overlapping configuration at the TOI. A pair that is exactly
279
- * tangent there carries no MTV to read, so a second probe nudged
280
- * toward the target's centre supplies one; `-ray.direction` remains
281
- * the last-resort fallback if both degenerate. See the
282
- * contact-normal recovery block near the end of the function.
283
- * - `result.entity` / `result.body_id` — the hit body.
284
- *
285
- * Output on miss: untouched; same convention as `raycast`.
286
- *
287
- * @param {PhysicsSystem} system
288
- * @param {Ray3|{origin_x:number,origin_y:number,origin_z:number,direction_x:number,direction_y:number,direction_z:number,tMax:number}} ray
289
- * origin + unit direction + `tMax`. Only the named accessors are read, so a
290
- * plain double-precision ray-like works — `Ray3` is Float32Array-backed and
291
- * quantises large-coordinate sweeps (the CCD pass passes a f64 ray-like)
292
- * @param {AbstractShape3D} shape shape being swept, in its local frame
293
- * @param {{x:number,y:number,z:number,w:number}} rotation fixed orientation
294
- * @param {PhysicsSurfacePoint} result populated on hit; untouched on miss
295
- * @param {(entity:number, collider:Collider, body_id:number)=>boolean} [filter]
296
- * mandatory in contract; defaults to {@link returnTrue}. Receives the
297
- * candidate body's entity, primary collider, and packed body id (the id
298
- * distinguishes bodies when colliders live on child entities)
299
- * @param {boolean} [skip_initial_overlaps=false] how a candidate ALREADY
300
- * overlapping the swept shape at `t = 0` is treated. `false` (kinematic
301
- * "can I move?" semantics): targets are solid, so the cast is blocked where
302
- * it stands — report a hit at `t = 0`. The one exception is a convex target
303
- * the shape merely TOUCHES (no depth beyond {@link CONTACT_EPSILON}): a
304
- * tangency blocks only a sweep driving into it, and otherwise steps aside so
305
- * the scan can reach real blockers. `true` (CCD semantics): such a candidate
306
- * is a resting / sliding contact the discrete solver already owns, NOT a
307
- * tunnelling threat — skip it and keep scanning the remaining candidates for
308
- * real blockers along the sweep. Either way, one contact at the start of the
309
- * sweep must never blind the cast to every other obstacle.
310
- * @returns {boolean}
311
- */
312
- export function shape_cast(system, ray, shape, rotation, result, filter = returnTrue, skip_initial_overlaps = false) {
313
- const ox = ray.origin_x;
314
- const oy = ray.origin_y;
315
- const oz = ray.origin_z;
316
- const dx = ray.direction_x;
317
- const dy = ray.direction_y;
318
- const dz = ray.direction_z;
319
- const tMax = ray.tMax;
320
- // A fresh Ray3 defaults tMax to Infinity, which a sweep cannot use (the
321
- // swept AABB and the bisection interval would be unbounded). Loud in dev
322
- // — silently returning false for the DEFAULT ray construction reads as
323
- // "nothing there" and is a debugging trap; prod degrades to a miss.
324
- assert.ok(Number.isFinite(tMax) && tMax > 0,
325
- `shape_cast: ray.tMax must be a positive finite sweep length, got ${tMax}`);
326
- if (!(tMax > 0) || !Number.isFinite(tMax)) return false;
327
-
328
- const rx = rotation.x, ry = rotation.y, rz = rotation.z, rw = rotation.w;
329
-
330
- // ── 1. Swept AABB ──────────────────────────────────────────────
331
- shape.compute_bounding_box(local_aabb);
332
- // Rotation around ray.origin gives the shape's initial AABB in
333
- // world space.
334
- aabb3_transform_oriented(
335
- initial_aabb, 0,
336
- local_aabb[0], local_aabb[1], local_aabb[2],
337
- local_aabb[3], local_aabb[4], local_aabb[5],
338
- ox, oy, oz,
339
- rx, ry, rz, rw
340
- );
341
- // Stretch by the sweep displacement. Positive direction components
342
- // push the +face out; negative components push the −face out.
343
- swept_aabb[0] = initial_aabb[0];
344
- swept_aabb[1] = initial_aabb[1];
345
- swept_aabb[2] = initial_aabb[2];
346
- swept_aabb[3] = initial_aabb[3];
347
- swept_aabb[4] = initial_aabb[4];
348
- swept_aabb[5] = initial_aabb[5];
349
- if (dx > 0) swept_aabb[3] += dx * tMax; else swept_aabb[0] += dx * tMax;
350
- if (dy > 0) swept_aabb[4] += dy * tMax; else swept_aabb[1] += dy * tMax;
351
- if (dz > 0) swept_aabb[5] += dz * tMax; else swept_aabb[2] += dz * tMax;
352
-
353
- // ── 2. Broadphase: gather candidates from both trees ───────────
354
- // The BVH query returns the TRUE overlap count and silently drops writes past
355
- // the buffer end. An undersized buffer would make the narrowphase loop read
356
- // `undefined` candidates and silently MISS the true nearest hit (tunnelling on
357
- // a long sweep through a dense scene). Grow by doubling and re-query until
358
- // both fit (deterministic queries → converges in one resize).
359
- let n_static, n_dynamic, n_total;
360
- for (;;) {
361
- n_static = bvh_query_user_data_intersects_aabb(scratch_candidates, 0, system.staticBvh, swept_aabb);
362
- n_dynamic = bvh_query_user_data_intersects_aabb(scratch_candidates, n_static, system.dynamicBvh, swept_aabb);
363
- n_total = n_static + n_dynamic;
364
- if (n_total <= scratch_candidates.length) break;
365
- scratch_candidates = new Uint32Array(Math.max(n_total, scratch_candidates.length * 2));
366
- }
367
- if (n_total === 0) return false;
368
-
369
- // ── 3. Narrowphase: per-candidate bisection ────────────────────
370
- //
371
- // Re-bind the swept shape's PosedShape3D once for shape + rotation;
372
- // we update `px/py/pz` per bisection midpoint without rerunning
373
- // setup (px/py/pz are public fields by contract).
374
- swept_posed.shape = shape;
375
- swept_posed.qx = rx; swept_posed.qy = ry; swept_posed.qz = rz; swept_posed.qw = rw;
376
-
377
- let best_t = tMax;
378
- let best_body_id = -1;
379
- let best_entity = -1;
380
-
381
- for (let i = 0; i < n_total; i++) {
382
- const body_id = scratch_candidates[i];
383
- const body_idx = body_id_index(body_id);
384
- const entity = system.entityOf(body_id);
385
- if (entity < 0) continue;
386
-
387
- const collider = system.__primary_collider(body_idx);
388
- if (collider === null) continue;
389
- if (!filter(entity, collider, body_id)) continue;
390
-
391
- const target_tr = system.__transforms[body_idx];
392
- candidate_posed.setup(collider.shape, target_tr.position, target_tr.rotation);
393
-
394
- // Already overlapping at t = 0? The bisection's "no overlap at lo,
395
- // overlap at hi" invariant doesn't hold for this candidate. Under CCD
396
- // semantics it is a resting contact to step over — skip THIS candidate
397
- // only, and keep scanning for real blockers.
398
- //
399
- // Under kinematic semantics targets are SOLID: a shape that starts
400
- // genuinely inside one is blocked where it stands, `t = 0`, whatever
401
- // direction it is trying to sweep. Nothing can beat that, so stop
402
- // scanning. Getting out is depenetration's job, not the sweep's.
403
- //
404
- // Exact TANGENCY is the exception, and it needs one. A zero-depth
405
- // touch is not "inside" anything the shape is resting against a
406
- // face, or flush with a brush seam, and is free to slide along it or
407
- // leave. It also survives depenetration, which has no depth to push
408
- // out of, so it persists frame after frame.
409
- //
410
- // Reporting it as a `t = 0` hit ends the scan, and that is the whole
411
- // problem: the caller is handed a contact it correctly judges harmless
412
- // for this direction and concludes the sweep is clear, while the body
413
- // it was actually about to hit was never tested. A character flush
414
- // against a wall falls through the floor that way. So a tangency
415
- // blocks only when the sweep drives INTO it, and otherwise steps aside
416
- // and lets the scan continue.
417
- //
418
- // MPR's depth at the START pose is what separates the two: positive
419
- // means genuine overlap, none means tangency. Tangency is also exactly
420
- // where the normal is hardest to recover, hence the second probe; if
421
- // even that degenerates there is no normal to judge with and the
422
- // contact blocks, stopping short being the safe failure.
423
- swept_posed.px = ox; swept_posed.py = oy; swept_posed.pz = oz;
424
- if (gjk(simplex_buf, swept_posed, candidate_posed)) {
425
- if (skip_initial_overlaps) continue;
426
-
427
- // The tangency exception reads MPR's depth and normal, both of
428
- // which assume a convex target. This query has never supported
429
- // concave ones (`overlap_shape` decomposes them per-triangle;
430
- // nothing here does), so rather than extend a convex-only
431
- // inference to geometry the module cannot see properly, leave
432
- // those on the unconditional "solid, blocked at t = 0" path.
433
- const convex_target = collider.shape.is_convex !== false;
434
- if (convex_target && !probe_contact_normal(probe_normal, ox, oy, oz, target_tr)) {
435
- const known = recover_contact_normal(
436
- probe_normal, ox, oy, oz, dx, dy, dz, target_tr,
437
- );
438
- if (known) {
439
- // Both vectors are unit, so this is the sine of the angle
440
- // between the sweep and the contact plane. Zero means
441
- // exactly parallel — sliding along the face — and positive
442
- // means leaving it; neither blocks. The tolerance matters
443
- // because the parallel case sits right on the sign change,
444
- // and an MPR-recovered normal carries ~1e-6 of angular
445
- // noise: without it a sweep ALONG a face flips to
446
- // "head-on" on solver noise alone.
447
- const into = dx * probe_normal[0] + dy * probe_normal[1] + dz * probe_normal[2];
448
- if (into > -GRAZING_SINE_EPSILON) continue;
449
- }
450
- }
451
-
452
- best_t = 0;
453
- best_body_id = body_id;
454
- best_entity = entity;
455
- break;
456
- }
457
-
458
- // ── Slab intersection: narrow the search interval analytically ─
459
- //
460
- // Compute the body's tight world AABB and intersect it with the
461
- // swept shape's AABB sliding along the sweep direction. The
462
- // result is the t-interval `[t_aabb_enter, t_aabb_exit]` during
463
- // which the two AABBs overlap. Outside this interval the actual
464
- // shapes can't overlap either (AABB is a superset of the
465
- // shape), so we get to skip all of [0, t_aabb_enter) and
466
- // (t_aabb_exit, best_t] without testing.
467
- //
468
- // This is the key to making `shapeCast` scale to long sweeps:
469
- // a 1 km cast of a 1 m sphere against another 1 m sphere has an
470
- // AABB-overlap window of ≈ 2 m (the sum of diameters along the
471
- // sweep axis), reducing the coarse-step grid from a 30 m
472
- // resolution (1000/32) to 6 cm (2/32).
473
- collider.shape.compute_bounding_box(target_local_aabb);
474
- aabb3_transform_oriented(
475
- target_world_aabb, 0,
476
- target_local_aabb[0], target_local_aabb[1], target_local_aabb[2],
477
- target_local_aabb[3], target_local_aabb[4], target_local_aabb[5],
478
- target_tr.position.x, target_tr.position.y, target_tr.position.z,
479
- target_tr.rotation.x, target_tr.rotation.y, target_tr.rotation.z, target_tr.rotation.w
480
- );
481
-
482
- let t_aabb_enter = -Infinity;
483
- let t_aabb_exit = Infinity;
484
- let skip_candidate = false;
485
- for (let ax = 0; ax < 3; ax++) {
486
- const init_min = initial_aabb[ax];
487
- const init_max = initial_aabb[ax + 3];
488
- const body_min = target_world_aabb[ax];
489
- const body_max = target_world_aabb[ax + 3];
490
- const d_ax = ax === 0 ? dx : (ax === 1 ? dy : dz);
491
- if (d_ax === 0) {
492
- // Static along this axis: AABBs must overlap in their
493
- // initial position or this candidate is unreachable.
494
- if (init_max < body_min || init_min > body_max) {
495
- skip_candidate = true;
496
- break;
497
- }
498
- continue;
499
- }
500
- // swept_min(t) = init_min + d·t, swept_max(t) = init_max + d·t.
501
- // Slab-enter: swept_max(t) = body_min → t = (body_min − init_max) / d
502
- // Slab-exit: swept_min(t) = body_max → t = (body_max − init_min) / d
503
- const t1 = (body_min - init_max) / d_ax;
504
- const t2 = (body_max - init_min) / d_ax;
505
- const lo = t1 < t2 ? t1 : t2;
506
- const hi = t1 < t2 ? t2 : t1;
507
- if (lo > t_aabb_enter) t_aabb_enter = lo;
508
- if (hi < t_aabb_exit) t_aabb_exit = hi;
509
- }
510
- if (skip_candidate) continue;
511
- if (t_aabb_enter > t_aabb_exit) continue;
512
-
513
- // Clamp to the relevant t-window: [0, best_t]. Anything beyond
514
- // best_t can't tighten the answer.
515
- const t_start = t_aabb_enter > 0 ? t_aabb_enter : 0;
516
- const t_end = t_aabb_exit < best_t ? t_aabb_exit : best_t;
517
- if (t_start >= t_end) continue;
518
-
519
- // Coarse-search within the narrowed interval to find any t for
520
- // which the shapes overlap (their AABBs do by construction; the
521
- // shapes themselves may not, e.g. two spheres passing alongside).
522
- const step_dt = (t_end - t_start) / COARSE_STEPS;
523
- let t_prev = t_start;
524
- let t_hi = -1;
525
- for (let s = 1; s <= COARSE_STEPS; s++) {
526
- const t = t_start + s * step_dt;
527
- swept_posed.px = ox + dx * t;
528
- swept_posed.py = oy + dy * t;
529
- swept_posed.pz = oz + dz * t;
530
- if (gjk(simplex_buf, swept_posed, candidate_posed)) {
531
- t_hi = t;
532
- break;
533
- }
534
- t_prev = t;
535
- }
536
- if (t_hi < 0) continue;
537
-
538
- // Bisect [t_prev, t_hi]: invariant is `gjk(t_lo) === false` and
539
- // `gjk(t_hi) === true`.
540
- let t_lo = t_prev;
541
- const stop_width = TOI_TOLERANCE * tMax;
542
- for (let bi = 0; bi < MAX_BISECTION && (t_hi - t_lo) > stop_width; bi++) {
543
- const t_mid = (t_lo + t_hi) * 0.5;
544
- swept_posed.px = ox + dx * t_mid;
545
- swept_posed.py = oy + dy * t_mid;
546
- swept_posed.pz = oz + dz * t_mid;
547
- if (gjk(simplex_buf, swept_posed, candidate_posed)) {
548
- t_hi = t_mid;
549
- } else {
550
- t_lo = t_mid;
551
- }
552
- }
553
-
554
- // Use t_lo (the just-SEPARATING side of the bisection) rather
555
- // than t_hi (just-overlapping). With the fixed GJK that no
556
- // longer flags 5 mm-clear gaps as overlap, the bisection is
557
- // tight; reporting t_lo gives kinematic callers a conservative
558
- // TOI the swept shape at the reported moment is provably NOT
559
- // overlapping the target. The normal-probe below steps a few
560
- // mm past best_t to get a valid simplex for MPR.
561
- if (t_lo < best_t) {
562
- best_t = t_lo;
563
- best_body_id = body_id;
564
- best_entity = entity;
565
- }
566
- }
567
-
568
- if (best_body_id === -1) return false;
569
-
570
- const rp = result.position;
571
- const rn = result.normal;
572
-
573
- const swept_x = ox + dx * best_t;
574
- const swept_y = oy + dy * best_t;
575
- const swept_z = oz + dz * best_t;
576
-
577
- rp[0] = swept_x;
578
- rp[1] = swept_y;
579
- rp[2] = swept_z;
580
-
581
- // ── Contact-normal recovery via MPR ────────────────────────────
582
- //
583
- // Bisection converges with `swept_posed` somewhere within
584
- // `stop_width = TOI_TOLERANCE * tMax` of the true contact. At
585
- // exactly `best_t` the overlap depth is therefore sub-millimetre
586
- // on practical sweeps. EPA on smooth-vs-smooth supports at this
587
- // overlap can't tighten before its iteration cap and returns a
588
- // direction off by ~30° from truth. MPR is the better tool here:
589
- // it converges in 5-15 iterations on smooth surfaces, same MTV
590
- // output convention as EPA (direction = A's interior into B,
591
- // magnitude = depth).
592
- //
593
- // The probe pose is `NORMAL_PROBE_OFFSET` past `best_t` along the sweep
594
- // (a few mm into the target) bisection stops on the just-SEPARATING
595
- // side, so there is no MTV to read exactly at `best_t`. The reported
596
- // `result.t` stays at `best_t`; only the normal probe moves.
597
- // `recover_contact_normal` handles the grazing case, where advancing
598
- // along the sweep never produces overlap at all.
599
- const contact_x = ox + dx * best_t;
600
- const contact_y = oy + dy * best_t;
601
- const contact_z = oz + dz * best_t;
602
- const best_body_idx = body_id_index(best_body_id);
603
- const best_collider = system.__primary_collider(best_body_idx);
604
- let normal_x = -dx, normal_y = -dy, normal_z = -dz;
605
- if (best_collider !== null) {
606
- const best_tr = system.__transforms[best_body_idx];
607
- candidate_posed.setup(best_collider.shape, best_tr.position, best_tr.rotation);
608
- if (recover_contact_normal(probe_normal, contact_x, contact_y, contact_z, dx, dy, dz, best_tr)) {
609
- normal_x = probe_normal[0];
610
- normal_y = probe_normal[1];
611
- normal_z = probe_normal[2];
612
- }
613
- }
614
-
615
- rn[0] = normal_x; rn[1] = normal_y; rn[2] = normal_z;
616
- result.t = best_t;
617
- result.entity = best_entity;
618
- result.body_id = best_body_id;
619
- return true;
620
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { bvh_query_user_data_intersects_aabb } from "../../../core/bvh2/bvh3/query/bvh_query_user_data_intersects_aabb.js";
3
+ import { returnTrue } from "../../../core/function/returnTrue.js";
4
+ import { aabb3_transform_oriented } from "../../../core/geom/3d/aabb/aabb3_transform_oriented.js";
5
+ import { body_id_index } from "../body/BodyStorage.js";
6
+ import { gjk } from "../../../core/geom/3d/gjk/gjk.js";
7
+ import { mpr } from "../../../core/geom/3d/gjk/mpr.js";
8
+ import { PosedShape3D } from "../../../core/geom/3d/shape/PosedShape3D.js";
9
+
10
+ /**
11
+ * Bisection halts when the search interval is below this fraction of
12
+ * the sweep length. With `MAX_BISECTION = 32` and a unit-length sweep
13
+ * the achieved precision is ≈ 1 / 2³² (well below any practical
14
+ * world-scale tolerance), but we cap on relative tolerance so a
15
+ * 10 m sweep doesn't insist on sub-micron precision.
16
+ * @type {number}
17
+ */
18
+ const TOI_TOLERANCE = 1e-4;
19
+
20
+ /**
21
+ * Maximum bisection iterations. `log2(1 / TOI_TOLERANCE)` is enough
22
+ * for any practical sweep; this is the hard upper bound to prevent
23
+ * pathological inputs (NaN ray, etc.) from hanging the query.
24
+ * @type {number}
25
+ */
26
+ const MAX_BISECTION = 32;
27
+
28
+ /**
29
+ * Coarse linear-search resolution for finding *any* overlap moment
30
+ * along the per-candidate AABB-overlap interval (NOT the full sweep —
31
+ * see `aabb_overlap_interval` for the analytical narrowing that runs
32
+ * upstream). 32 substeps over the AABB-overlap window is dense enough
33
+ * for any sweep where the shape's smallest extent is on the order of
34
+ * its AABB's extent (true for spheres / boxes / capsules); the slab
35
+ * intersection keeps that interval small even for kilometre-scale
36
+ * sweeps, so this isn't the limit it would otherwise be.
37
+ * @type {number}
38
+ */
39
+ const COARSE_STEPS = 32;
40
+
41
+ const swept_aabb = new Float64Array(6);
42
+ const local_aabb = new Float64Array(6);
43
+ const initial_aabb = new Float64Array(6);
44
+ const target_local_aabb = new Float64Array(6);
45
+ const target_world_aabb = new Float64Array(6);
46
+
47
+ // GJK simplex buffer (used to detect overlap during the bisection).
48
+ const simplex_buf = new Float64Array(12);
49
+
50
+ // Scratch for MPR's MTV output — same vec3 convention as EPA: direction
51
+ // is "A's interior into B" with the magnitude being the depth. We use
52
+ // MPR for the contact-normal recovery at the kiss point because it
53
+ // converges reliably on smooth-vs-smooth supports where EPA hits its
54
+ // iteration cap before tightening (sphere-vs-sphere shallow overlap).
55
+ const mpr_result = new Float64Array(3);
56
+
57
+ /**
58
+ * Long-lived PosedShape3D adapters for the swept shape and the
59
+ * candidate's collider. Both are re-bound per query — the swept one
60
+ * also gets its position field re-written every bisection step
61
+ * without re-running `setup()`, since shape and rotation are
62
+ * constant through the sweep.
63
+ */
64
+ const swept_posed = new PosedShape3D();
65
+ const candidate_posed = new PosedShape3D();
66
+
67
+ /**
68
+ * Buffer for the union of static-BVH and dynamic-BVH candidates that
69
+ * overlap the swept AABB. Grows by doubling on the rare overflow.
70
+ * @type {Uint32Array}
71
+ */
72
+ let scratch_candidates = new Uint32Array(64);
73
+
74
+ /**
75
+ * Depths at or below this are not a contact. A kissing pair is not always
76
+ * numerically exact — MPR returns a few microns of "overlap" for a sphere
77
+ * resting on a plane where a box-on-box kiss returns a clean zero — so the
78
+ * tangency test needs the same tolerance the narrowphase already applies
79
+ * (`compute_penetration`'s CONTACT_EPSILON, same value and same reasoning).
80
+ * Well below any real overlap a caller would be asked to depenetrate from,
81
+ * and far below the skin widths character controllers work at.
82
+ * @type {number}
83
+ */
84
+ const CONTACT_EPSILON = 1e-4;
85
+
86
+ /**
87
+ * How far from parallel a sweep must be before it counts as driving INTO a
88
+ * tangent contact rather than sliding along it — a sine, both inputs being
89
+ * unit vectors, so this is ~0.006°. Comfortably above the angular noise in an
90
+ * MPR-recovered normal and far below any inclination that would move a body
91
+ * meaningfully into a surface over one sweep.
92
+ * @type {number}
93
+ */
94
+ const GRAZING_SINE_EPSILON = 1e-4;
95
+
96
+ /**
97
+ * Distance past the reported TOI at which the contact normal is sampled.
98
+ * Bisection stops on the just-SEPARATING side, so MPR needs the pair
99
+ * nudged into genuine overlap before it has an MTV to report.
100
+ * @type {number}
101
+ */
102
+ const NORMAL_PROBE_OFFSET = 0.01;
103
+
104
+ /**
105
+ * Unit contact normal recovered by {@link probe_contact_normal}.
106
+ * @type {Float64Array}
107
+ */
108
+ const probe_normal = new Float64Array(3);
109
+
110
+ /**
111
+ * Recover the target's outward surface normal by running MPR on
112
+ * `swept_posed` displaced to `(px, py, pz)` against `candidate_posed`
113
+ * (both must already be bound by the caller).
114
+ *
115
+ * Returns `false` — leaving `out` untouched — when MPR reports no depth worth
116
+ * the name (at or below {@link CONTACT_EPSILON}). That is not an MPR failure
117
+ * so much as the honest answer for a pair that is TANGENT at the probe pose:
118
+ * a kiss carries no direction, so there is no normal to read off it. Callers
119
+ * use that verdict both ways — as "no normal here" and as "this is a touch,
120
+ * not an overlap".
121
+ *
122
+ * Sign-validation: MPR's polytope can settle on either side of the origin
123
+ * for highly symmetric configurations, so we dot against the body-centre
124
+ * axis and flip if needed (same pattern as `narrowphase_step`'s EPA path).
125
+ * The stored normal is the target's outward surface normal — `B → A`
126
+ * direction — i.e. the negated (validated) MTV.
127
+ *
128
+ * @param {Float64Array} out receives the unit normal on success
129
+ * @param {number} px swept shape's probe centre
130
+ * @param {number} py
131
+ * @param {number} pz
132
+ * @param {Transform} target_tr the target body's transform (centre for the
133
+ * sign check)
134
+ * @returns {boolean}
135
+ */
136
+ function probe_contact_normal(out, px, py, pz, target_tr) {
137
+ swept_posed.px = px;
138
+ swept_posed.py = py;
139
+ swept_posed.pz = pz;
140
+
141
+ if (!mpr(mpr_result, 0, swept_posed, candidate_posed)) return false;
142
+
143
+ let ex = mpr_result[0], ey = mpr_result[1], ez = mpr_result[2];
144
+ const depth = Math.sqrt(ex * ex + ey * ey + ez * ez);
145
+ if (!(depth > CONTACT_EPSILON) || !Number.isFinite(depth)) return false;
146
+
147
+ const ab_x = target_tr.translation_x - px;
148
+ const ab_y = target_tr.translation_y - py;
149
+ const ab_z = target_tr.translation_z - pz;
150
+ if (ex * ab_x + ey * ab_y + ez * ab_z < 0) {
151
+ ex = -ex; ey = -ey; ez = -ez;
152
+ }
153
+
154
+ const inv = 1 / depth;
155
+ out[0] = -ex * inv;
156
+ out[1] = -ey * inv;
157
+ out[2] = -ez * inv;
158
+ return true;
159
+ }
160
+
161
+ /**
162
+ * Recover the target's outward surface normal for a contact whose pose is
163
+ * `(cx, cy, cz)` — the swept shape's centre AT the contact — sweeping along
164
+ * unit `(dx, dy, dz)`. `swept_posed` (shape + rotation) and `candidate_posed`
165
+ * must already be bound by the caller; on success the unit normal is written
166
+ * to `out`.
167
+ *
168
+ * MPR needs genuine overlap before it has an MTV to report, and bisection
169
+ * stops on the just-SEPARATING side, so neither the contact pose itself nor
170
+ * the reported `t` is a usable sample point. Two probes displace it:
171
+ *
172
+ * Probe 1 steps `NORMAL_PROBE_OFFSET` ALONG the sweep. That is the whole
173
+ * answer wherever the sweep runs INTO the surface.
174
+ *
175
+ * Probe 2 covers what probe 1 structurally cannot. A GRAZING contact — a body
176
+ * merely touching geometry it is sliding past, level brushes flush against a
177
+ * character, a seam between coplanar faces — has the sweep running PARALLEL to
178
+ * the contact plane, so advancing along it leaves the pair exactly tangent
179
+ * however far it goes. A sweep pointing AWAY from the surface is worse still:
180
+ * probe 1 separates them further. Either way MPR reports zero depth, and zero
181
+ * depth carries no direction.
182
+ *
183
+ * So probe 2 displaces toward the target's CENTRE, which is interior to it
184
+ * (MPR's own precondition) and so closes on it from any contact orientation.
185
+ * It starts from the CONTACT pose rather than probe 1's — anchoring it at
186
+ * probe 1's pose lets a sweep directly away from the surface cancel the two
187
+ * displacements against each other and land back on the tangency it was trying
188
+ * to escape.
189
+ *
190
+ * The distance DOUBLES until the overlap is measurable, because one fixed
191
+ * offset cannot serve both ends of the range. Only the component along the
192
+ * (unknown) contact normal deepens the overlap, and that component shrinks
193
+ * with the target's size: 1 cm toward the centre of a 1 m brush sinks ~1 cm,
194
+ * but toward the centre of a 1 km floor 400 m away it sinks 30 µm — under
195
+ * {@link CONTACT_EPSILON}, and the normal would be lost on exactly the large
196
+ * flat geometry a character spends its life on. Growing from the smallest
197
+ * offset keeps the displacement as shallow as it can be, which is what stops a
198
+ * target thinner than the probe from reporting its FAR face.
199
+ *
200
+ * Getting this right matters more than precision: the alternative is the
201
+ * `-ray.direction` fallback, which opposes the sweep BY CONSTRUCTION. A caller
202
+ * testing `direction · normal < 0` to ask "is this surface in my way?" is then
203
+ * told yes for every direction it could possibly sweep, including straight
204
+ * down a wall it is only brushing — a kinematic character in that state has no
205
+ * escape (see `KinematicMover._slide`).
206
+ *
207
+ * @param {Float64Array} out receives the unit normal on success
208
+ * @param {number} cx swept shape's centre at the contact
209
+ * @param {number} cy
210
+ * @param {number} cz
211
+ * @param {number} dx unit sweep direction
212
+ * @param {number} dy
213
+ * @param {number} dz
214
+ * @param {Transform} target_tr the target body's transform
215
+ * @returns {boolean} false when every probe degenerates — `out` is untouched
216
+ */
217
+ function recover_contact_normal(out, cx, cy, cz, dx, dy, dz, target_tr) {
218
+ if (probe_contact_normal(
219
+ out,
220
+ cx + dx * NORMAL_PROBE_OFFSET,
221
+ cy + dy * NORMAL_PROBE_OFFSET,
222
+ cz + dz * NORMAL_PROBE_OFFSET,
223
+ target_tr,
224
+ )) return true;
225
+
226
+ const ab_x = target_tr.translation_x - cx;
227
+ const ab_y = target_tr.translation_y - cy;
228
+ const ab_z = target_tr.translation_z - cz;
229
+ const ab_len = Math.sqrt(ab_x * ab_x + ab_y * ab_y + ab_z * ab_z);
230
+ // Coincident centres leave no direction to close along, and the shapes are
231
+ // then as overlapped as they get — probe 1 already had its answer. The
232
+ // finite check also bounds the loop below against a degenerate pose.
233
+ if (!(ab_len > 0) || !Number.isFinite(ab_len)) return false;
234
+
235
+ const ux = ab_x / ab_len, uy = ab_y / ab_len, uz = ab_z / ab_len;
236
+ // Bounded by construction — doubling from a fixed offset reaches `ab_len`
237
+ // in log2(ab_len / NORMAL_PROBE_OFFSET) steps. Stopping there keeps the
238
+ // probe on the near side of the target's centre.
239
+ for (let d = NORMAL_PROBE_OFFSET; d < ab_len; d *= 2) {
240
+ if (probe_contact_normal(out, cx + ux * d, cy + uy * d, cz + uz * d, target_tr)) return true;
241
+ }
242
+ return false;
243
+ }
244
+
245
+ /**
246
+ * Sweep a convex shape along a ray and find the first body it would
247
+ * hit. Used by character controllers (sweep a capsule along intended
248
+ * movement to find blockers), high-speed projectile movement (avoid
249
+ * tunnelling without paying for full per-body CCD), and any kinematic
250
+ * "where would this body end up if I tried to move it?" query.
251
+ *
252
+ * Pipeline:
253
+ * 1. Build the swept AABB: the shape's local-frame AABB rotated
254
+ * into world by `rotation`, translated to `ray.origin`, then
255
+ * stretched along `ray.direction * ray.tMax`.
256
+ * 2. Query both broadphase BVHs (static + dynamic) for leaves whose
257
+ * AABB overlaps the swept volume.
258
+ * 3. For each candidate, bisect the [0, best_t] interval for the
259
+ * smallest `t` at which the swept shape overlaps the candidate's
260
+ * collider. GJK on each midpoint.
261
+ *
262
+ * Picking `best_t` (rather than always running the full [0, tMax]
263
+ * bisection) is the early-termination optimisation: once we have a
264
+ * hit at some t, no later candidate can produce a smaller TOI by
265
+ * being checked at its full [0, tMax] interval.
266
+ *
267
+ * Output on hit:
268
+ * - `result.t` — sweep distance to impact (in the same units as
269
+ * `ray.direction`'s magnitude; for a unit-direction ray, this is
270
+ * metres).
271
+ * - `result.position` — `ray.origin + t * ray.direction`, i.e. the
272
+ * centre of the swept shape at the moment of first contact. NOT
273
+ * a point on the target's surface; that would need narrowphase
274
+ * refinement which the broadphase-only architecture doesn't have
275
+ * wired up yet.
276
+ * - `result.normal` — target surface's outward normal at the kiss
277
+ * point (unit length), recovered by running MPR against the
278
+ * just-overlapping configuration at the TOI. A pair that is exactly
279
+ * tangent there carries no MTV to read, so a second probe nudged
280
+ * toward the target's centre supplies one; `-ray.direction` remains
281
+ * the last-resort fallback if both degenerate. See the
282
+ * contact-normal recovery block near the end of the function.
283
+ * - `result.entity` / `result.body_id` — the hit body.
284
+ *
285
+ * Output on miss: untouched; same convention as `raycast`.
286
+ *
287
+ * @param {PhysicsSystem} system
288
+ * @param {Ray3|{origin_x:number,origin_y:number,origin_z:number,direction_x:number,direction_y:number,direction_z:number,tMax:number}} ray
289
+ * origin + unit direction + `tMax`. Only the named accessors are read, so a
290
+ * plain double-precision ray-like works — `Ray3` is Float32Array-backed and
291
+ * quantises large-coordinate sweeps (the CCD pass passes a f64 ray-like)
292
+ * @param {AbstractShape3D} shape shape being swept, in its local frame
293
+ * @param {{x:number,y:number,z:number,w:number}} rotation fixed orientation
294
+ * @param {PhysicsSurfacePoint} result populated on hit; untouched on miss
295
+ * @param {(entity:number, collider:Collider, body_id:number)=>boolean} [filter]
296
+ * mandatory in contract; defaults to {@link returnTrue}. Receives the
297
+ * candidate body's entity, primary collider, and packed body id (the id
298
+ * distinguishes bodies when colliders live on child entities)
299
+ * @param {boolean} [skip_initial_overlaps=false] how a candidate ALREADY
300
+ * overlapping the swept shape at `t = 0` is treated. `false` (kinematic
301
+ * "can I move?" semantics): targets are solid, so the cast is blocked where
302
+ * it stands — report a hit at `t = 0`. The one exception is a convex target
303
+ * the shape merely TOUCHES (no depth beyond {@link CONTACT_EPSILON}): a
304
+ * tangency blocks only a sweep driving into it, and otherwise steps aside so
305
+ * the scan can reach real blockers. `true` (CCD semantics): such a candidate
306
+ * is a resting / sliding contact the discrete solver already owns, NOT a
307
+ * tunnelling threat — skip it and keep scanning the remaining candidates for
308
+ * real blockers along the sweep. Either way, one contact at the start of the
309
+ * sweep must never blind the cast to every other obstacle.
310
+ * @returns {boolean}
311
+ */
312
+ export function shape_cast(system, ray, shape, rotation, result, filter = returnTrue, skip_initial_overlaps = false) {
313
+ const ox = ray.origin_x;
314
+ const oy = ray.origin_y;
315
+ const oz = ray.origin_z;
316
+ const dx = ray.direction_x;
317
+ const dy = ray.direction_y;
318
+ const dz = ray.direction_z;
319
+ const tMax = ray.tMax;
320
+ // A fresh Ray3 defaults tMax to Infinity, which a sweep cannot use (the
321
+ // swept AABB and the bisection interval would be unbounded). Loud in dev
322
+ // — silently returning false for the DEFAULT ray construction reads as
323
+ // "nothing there" and is a debugging trap; prod degrades to a miss.
324
+ assert.ok(Number.isFinite(tMax) && tMax > 0,
325
+ `shape_cast: ray.tMax must be a positive finite sweep length, got ${tMax}`);
326
+ if (!(tMax > 0) || !Number.isFinite(tMax)) return false;
327
+
328
+ const rx = rotation[0], ry = rotation[1], rz = rotation[2], rw = rotation[3];
329
+
330
+ // ── 1. Swept AABB ──────────────────────────────────────────────
331
+ shape.compute_bounding_box(local_aabb);
332
+ // Rotation around ray.origin gives the shape's initial AABB in
333
+ // world space.
334
+ aabb3_transform_oriented(
335
+ initial_aabb, 0,
336
+ local_aabb[0], local_aabb[1], local_aabb[2],
337
+ local_aabb[3], local_aabb[4], local_aabb[5],
338
+ ox, oy, oz,
339
+ rx, ry, rz, rw
340
+ );
341
+ // Stretch by the sweep displacement. Positive direction components
342
+ // push the +face out; negative components push the −face out.
343
+ swept_aabb[0] = initial_aabb[0];
344
+ swept_aabb[1] = initial_aabb[1];
345
+ swept_aabb[2] = initial_aabb[2];
346
+ swept_aabb[3] = initial_aabb[3];
347
+ swept_aabb[4] = initial_aabb[4];
348
+ swept_aabb[5] = initial_aabb[5];
349
+ if (dx > 0) swept_aabb[3] += dx * tMax; else swept_aabb[0] += dx * tMax;
350
+ if (dy > 0) swept_aabb[4] += dy * tMax; else swept_aabb[1] += dy * tMax;
351
+ if (dz > 0) swept_aabb[5] += dz * tMax; else swept_aabb[2] += dz * tMax;
352
+
353
+ // ── 2. Broadphase: gather candidates from both trees ───────────
354
+ // The BVH query returns the TRUE overlap count and silently drops writes past
355
+ // the buffer end. An undersized buffer would make the narrowphase loop read
356
+ // `undefined` candidates and silently MISS the true nearest hit (tunnelling on
357
+ // a long sweep through a dense scene). Grow by doubling and re-query until
358
+ // both fit (deterministic queries → converges in one resize).
359
+ let n_static, n_dynamic, n_total;
360
+ for (;;) {
361
+ n_static = bvh_query_user_data_intersects_aabb(scratch_candidates, 0, system.staticBvh, swept_aabb);
362
+ n_dynamic = bvh_query_user_data_intersects_aabb(scratch_candidates, n_static, system.dynamicBvh, swept_aabb);
363
+ n_total = n_static + n_dynamic;
364
+ if (n_total <= scratch_candidates.length) break;
365
+ scratch_candidates = new Uint32Array(Math.max(n_total, scratch_candidates.length * 2));
366
+ }
367
+ if (n_total === 0) return false;
368
+
369
+ // ── 3. Narrowphase: per-candidate bisection ────────────────────
370
+ //
371
+ // Re-bind the swept shape's PosedShape3D once for shape + rotation;
372
+ // we update `px/py/pz` per bisection midpoint without rerunning
373
+ // setup (px/py/pz are public fields by contract).
374
+ swept_posed.shape = shape;
375
+ swept_posed.qx = rx; swept_posed.qy = ry; swept_posed.qz = rz; swept_posed.qw = rw;
376
+
377
+ let best_t = tMax;
378
+ let best_body_id = -1;
379
+ let best_entity = -1;
380
+
381
+ for (let i = 0; i < n_total; i++) {
382
+ const body_id = scratch_candidates[i];
383
+ const body_idx = body_id_index(body_id);
384
+ const entity = system.entityOf(body_id);
385
+ if (entity < 0) continue;
386
+
387
+ const collider = system.__primary_collider(body_idx);
388
+ if (collider === null) continue;
389
+ if (!filter(entity, collider, body_id)) continue;
390
+
391
+ const target_tr = system.__transforms[body_idx];
392
+ candidate_posed.setup_components(
393
+ collider.shape,
394
+ target_tr.translation_x, target_tr.translation_y, target_tr.translation_z,
395
+ target_tr.rotation_x, target_tr.rotation_y, target_tr.rotation_z, target_tr.rotation_w
396
+ );
397
+
398
+ // Already overlapping at t = 0? The bisection's "no overlap at lo,
399
+ // overlap at hi" invariant doesn't hold for this candidate. Under CCD
400
+ // semantics it is a resting contact to step over skip THIS candidate
401
+ // only, and keep scanning for real blockers.
402
+ //
403
+ // Under kinematic semantics targets are SOLID: a shape that starts
404
+ // genuinely inside one is blocked where it stands, `t = 0`, whatever
405
+ // direction it is trying to sweep. Nothing can beat that, so stop
406
+ // scanning. Getting out is depenetration's job, not the sweep's.
407
+ //
408
+ // Exact TANGENCY is the exception, and it needs one. A zero-depth
409
+ // touch is not "inside" anything — the shape is resting against a
410
+ // face, or flush with a brush seam, and is free to slide along it or
411
+ // leave. It also survives depenetration, which has no depth to push
412
+ // out of, so it persists frame after frame.
413
+ //
414
+ // Reporting it as a `t = 0` hit ends the scan, and that is the whole
415
+ // problem: the caller is handed a contact it correctly judges harmless
416
+ // for this direction and concludes the sweep is clear, while the body
417
+ // it was actually about to hit was never tested. A character flush
418
+ // against a wall falls through the floor that way. So a tangency
419
+ // blocks only when the sweep drives INTO it, and otherwise steps aside
420
+ // and lets the scan continue.
421
+ //
422
+ // MPR's depth at the START pose is what separates the two: positive
423
+ // means genuine overlap, none means tangency. Tangency is also exactly
424
+ // where the normal is hardest to recover, hence the second probe; if
425
+ // even that degenerates there is no normal to judge with and the
426
+ // contact blocks, stopping short being the safe failure.
427
+ swept_posed.px = ox; swept_posed.py = oy; swept_posed.pz = oz;
428
+ if (gjk(simplex_buf, swept_posed, candidate_posed)) {
429
+ if (skip_initial_overlaps) continue;
430
+
431
+ // The tangency exception reads MPR's depth and normal, both of
432
+ // which assume a convex target. This query has never supported
433
+ // concave ones (`overlap_shape` decomposes them per-triangle;
434
+ // nothing here does), so rather than extend a convex-only
435
+ // inference to geometry the module cannot see properly, leave
436
+ // those on the unconditional "solid, blocked at t = 0" path.
437
+ const convex_target = collider.shape.is_convex !== false;
438
+ if (convex_target && !probe_contact_normal(probe_normal, ox, oy, oz, target_tr)) {
439
+ const known = recover_contact_normal(
440
+ probe_normal, ox, oy, oz, dx, dy, dz, target_tr,
441
+ );
442
+ if (known) {
443
+ // Both vectors are unit, so this is the sine of the angle
444
+ // between the sweep and the contact plane. Zero means
445
+ // exactly parallel sliding along the face and positive
446
+ // means leaving it; neither blocks. The tolerance matters
447
+ // because the parallel case sits right on the sign change,
448
+ // and an MPR-recovered normal carries ~1e-6 of angular
449
+ // noise: without it a sweep ALONG a face flips to
450
+ // "head-on" on solver noise alone.
451
+ const into = dx * probe_normal[0] + dy * probe_normal[1] + dz * probe_normal[2];
452
+ if (into > -GRAZING_SINE_EPSILON) continue;
453
+ }
454
+ }
455
+
456
+ best_t = 0;
457
+ best_body_id = body_id;
458
+ best_entity = entity;
459
+ break;
460
+ }
461
+
462
+ // ── Slab intersection: narrow the search interval analytically
463
+ //
464
+ // Compute the body's tight world AABB and intersect it with the
465
+ // swept shape's AABB sliding along the sweep direction. The
466
+ // result is the t-interval `[t_aabb_enter, t_aabb_exit]` during
467
+ // which the two AABBs overlap. Outside this interval the actual
468
+ // shapes can't overlap either (AABB is a superset of the
469
+ // shape), so we get to skip all of [0, t_aabb_enter) and
470
+ // (t_aabb_exit, best_t] without testing.
471
+ //
472
+ // This is the key to making `shapeCast` scale to long sweeps:
473
+ // a 1 km cast of a 1 m sphere against another 1 m sphere has an
474
+ // AABB-overlap window of ≈ 2 m (the sum of diameters along the
475
+ // sweep axis), reducing the coarse-step grid from a 30 m
476
+ // resolution (1000/32) to 6 cm (2/32).
477
+ collider.shape.compute_bounding_box(target_local_aabb);
478
+ aabb3_transform_oriented(
479
+ target_world_aabb, 0,
480
+ target_local_aabb[0], target_local_aabb[1], target_local_aabb[2],
481
+ target_local_aabb[3], target_local_aabb[4], target_local_aabb[5],
482
+ target_tr.translation_x, target_tr.translation_y, target_tr.translation_z,
483
+ target_tr.rotation_x, target_tr.rotation_y, target_tr.rotation_z, target_tr.rotation_w
484
+ );
485
+
486
+ let t_aabb_enter = -Infinity;
487
+ let t_aabb_exit = Infinity;
488
+ let skip_candidate = false;
489
+ for (let ax = 0; ax < 3; ax++) {
490
+ const init_min = initial_aabb[ax];
491
+ const init_max = initial_aabb[ax + 3];
492
+ const body_min = target_world_aabb[ax];
493
+ const body_max = target_world_aabb[ax + 3];
494
+ const d_ax = ax === 0 ? dx : (ax === 1 ? dy : dz);
495
+ if (d_ax === 0) {
496
+ // Static along this axis: AABBs must overlap in their
497
+ // initial position or this candidate is unreachable.
498
+ if (init_max < body_min || init_min > body_max) {
499
+ skip_candidate = true;
500
+ break;
501
+ }
502
+ continue;
503
+ }
504
+ // swept_min(t) = init_min + d·t, swept_max(t) = init_max + d·t.
505
+ // Slab-enter: swept_max(t) = body_min → t = (body_min init_max) / d
506
+ // Slab-exit: swept_min(t) = body_max → t = (body_max init_min) / d
507
+ const t1 = (body_min - init_max) / d_ax;
508
+ const t2 = (body_max - init_min) / d_ax;
509
+ const lo = t1 < t2 ? t1 : t2;
510
+ const hi = t1 < t2 ? t2 : t1;
511
+ if (lo > t_aabb_enter) t_aabb_enter = lo;
512
+ if (hi < t_aabb_exit) t_aabb_exit = hi;
513
+ }
514
+ if (skip_candidate) continue;
515
+ if (t_aabb_enter > t_aabb_exit) continue;
516
+
517
+ // Clamp to the relevant t-window: [0, best_t]. Anything beyond
518
+ // best_t can't tighten the answer.
519
+ const t_start = t_aabb_enter > 0 ? t_aabb_enter : 0;
520
+ const t_end = t_aabb_exit < best_t ? t_aabb_exit : best_t;
521
+ if (t_start >= t_end) continue;
522
+
523
+ // Coarse-search within the narrowed interval to find any t for
524
+ // which the shapes overlap (their AABBs do by construction; the
525
+ // shapes themselves may not, e.g. two spheres passing alongside).
526
+ const step_dt = (t_end - t_start) / COARSE_STEPS;
527
+ let t_prev = t_start;
528
+ let t_hi = -1;
529
+ for (let s = 1; s <= COARSE_STEPS; s++) {
530
+ const t = t_start + s * step_dt;
531
+ swept_posed.px = ox + dx * t;
532
+ swept_posed.py = oy + dy * t;
533
+ swept_posed.pz = oz + dz * t;
534
+ if (gjk(simplex_buf, swept_posed, candidate_posed)) {
535
+ t_hi = t;
536
+ break;
537
+ }
538
+ t_prev = t;
539
+ }
540
+ if (t_hi < 0) continue;
541
+
542
+ // Bisect [t_prev, t_hi]: invariant is `gjk(t_lo) === false` and
543
+ // `gjk(t_hi) === true`.
544
+ let t_lo = t_prev;
545
+ const stop_width = TOI_TOLERANCE * tMax;
546
+ for (let bi = 0; bi < MAX_BISECTION && (t_hi - t_lo) > stop_width; bi++) {
547
+ const t_mid = (t_lo + t_hi) * 0.5;
548
+ swept_posed.px = ox + dx * t_mid;
549
+ swept_posed.py = oy + dy * t_mid;
550
+ swept_posed.pz = oz + dz * t_mid;
551
+ if (gjk(simplex_buf, swept_posed, candidate_posed)) {
552
+ t_hi = t_mid;
553
+ } else {
554
+ t_lo = t_mid;
555
+ }
556
+ }
557
+
558
+ // Use t_lo (the just-SEPARATING side of the bisection) rather
559
+ // than t_hi (just-overlapping). With the fixed GJK that no
560
+ // longer flags 5 mm-clear gaps as overlap, the bisection is
561
+ // tight; reporting t_lo gives kinematic callers a conservative
562
+ // TOI — the swept shape at the reported moment is provably NOT
563
+ // overlapping the target. The normal-probe below steps a few
564
+ // mm past best_t to get a valid simplex for MPR.
565
+ if (t_lo < best_t) {
566
+ best_t = t_lo;
567
+ best_body_id = body_id;
568
+ best_entity = entity;
569
+ }
570
+ }
571
+
572
+ if (best_body_id === -1) return false;
573
+
574
+ const rp = result.position;
575
+ const rn = result.normal;
576
+
577
+ const swept_x = ox + dx * best_t;
578
+ const swept_y = oy + dy * best_t;
579
+ const swept_z = oz + dz * best_t;
580
+
581
+ rp[0] = swept_x;
582
+ rp[1] = swept_y;
583
+ rp[2] = swept_z;
584
+
585
+ // ── Contact-normal recovery via MPR ────────────────────────────
586
+ //
587
+ // Bisection converges with `swept_posed` somewhere within
588
+ // `stop_width = TOI_TOLERANCE * tMax` of the true contact. At
589
+ // exactly `best_t` the overlap depth is therefore sub-millimetre
590
+ // on practical sweeps. EPA on smooth-vs-smooth supports at this
591
+ // overlap can't tighten before its iteration cap and returns a
592
+ // direction off by ~30° from truth. MPR is the better tool here:
593
+ // it converges in 5-15 iterations on smooth surfaces, same MTV
594
+ // output convention as EPA (direction = A's interior into B,
595
+ // magnitude = depth).
596
+ //
597
+ // The probe pose is `NORMAL_PROBE_OFFSET` past `best_t` along the sweep
598
+ // (a few mm into the target) bisection stops on the just-SEPARATING
599
+ // side, so there is no MTV to read exactly at `best_t`. The reported
600
+ // `result.t` stays at `best_t`; only the normal probe moves.
601
+ // `recover_contact_normal` handles the grazing case, where advancing
602
+ // along the sweep never produces overlap at all.
603
+ const contact_x = ox + dx * best_t;
604
+ const contact_y = oy + dy * best_t;
605
+ const contact_z = oz + dz * best_t;
606
+ const best_body_idx = body_id_index(best_body_id);
607
+ const best_collider = system.__primary_collider(best_body_idx);
608
+ let normal_x = -dx, normal_y = -dy, normal_z = -dz;
609
+ if (best_collider !== null) {
610
+ const best_tr = system.__transforms[best_body_idx];
611
+ candidate_posed.setup_components(
612
+ best_collider.shape,
613
+ best_tr.translation_x, best_tr.translation_y, best_tr.translation_z,
614
+ best_tr.rotation_x, best_tr.rotation_y, best_tr.rotation_z, best_tr.rotation_w
615
+ );
616
+ if (recover_contact_normal(probe_normal, contact_x, contact_y, contact_z, dx, dy, dz, best_tr)) {
617
+ normal_x = probe_normal[0];
618
+ normal_y = probe_normal[1];
619
+ normal_z = probe_normal[2];
620
+ }
621
+ }
622
+
623
+ rn[0] = normal_x; rn[1] = normal_y; rn[2] = normal_z;
624
+ result.t = best_t;
625
+ result.entity = best_entity;
626
+ result.body_id = best_body_id;
627
+ return true;
628
+ }