@woosh/meep-engine 3.15.0 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (952) 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/replication/Replicator.d.ts +5 -3
  400. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  401. package/src/engine/network/replication/Replicator.js +65 -16
  402. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -3
  403. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  404. package/src/engine/physics/ccd/linear_sweep.js +9 -3
  405. package/src/engine/physics/constraint/solve_constraints.js +10 -10
  406. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +8 -8
  407. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -1
  408. package/src/engine/physics/ecs/ColliderObserverSystem.js +6 -6
  409. package/src/engine/physics/ecs/PhysicsSystem.d.ts +22 -32
  410. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  411. package/src/engine/physics/ecs/PhysicsSystem.js +2337 -2310
  412. package/src/engine/physics/ecs/find_non_finite_physics_state.js +6 -6
  413. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +7 -7
  414. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  415. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +16 -8
  416. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +4 -4
  417. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -1
  418. package/src/engine/physics/fluid/ecs/FluidSystem.js +6 -6
  419. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts +2 -2
  420. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts.map +1 -1
  421. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.js +4 -4
  422. package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +7 -7
  423. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +4 -4
  424. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +7 -7
  425. package/src/engine/physics/inertia/world_inverse_inertia.js +1 -1
  426. package/src/engine/physics/integration/integrate_position.d.ts.map +1 -1
  427. package/src/engine/physics/integration/integrate_position.js +13 -12
  428. package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.d.ts.map +1 -1
  429. package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.js +23 -5
  430. package/src/engine/physics/narrowphase/compute_penetration.js +18 -14
  431. package/src/engine/physics/narrowphase/convex_convex_manifold.js +2 -2
  432. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +9 -9
  433. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  434. package/src/engine/physics/narrowphase/narrowphase_step.js +95 -68
  435. package/src/engine/physics/narrowphase/refine_ray_concave.js +1 -1
  436. package/src/engine/physics/narrowphase/refine_ray_hit.js +3 -3
  437. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
  438. package/src/engine/physics/queries/overlap_shape.js +19 -7
  439. package/src/engine/physics/queries/raycast.js +3 -3
  440. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
  441. package/src/engine/physics/queries/shape_cast.js +628 -620
  442. package/src/engine/physics/solver/solve_contacts.js +10 -10
  443. package/src/engine/physics/vehicle/RaycastVehicle.d.ts +6 -5
  444. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  445. package/src/engine/physics/vehicle/RaycastVehicle.js +10 -5
  446. package/src/engine/sound/ecs/SoundListenerSystem.d.ts +16 -4
  447. package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
  448. package/src/engine/sound/ecs/SoundListenerSystem.js +70 -11
  449. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +7 -7
  450. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
  451. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +343 -338
  452. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +2 -2
  453. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  454. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +356 -345
  455. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +23 -2
  456. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -1
  457. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +174 -140
  458. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts +6 -6
  459. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
  460. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +185 -184
  461. package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.js +1 -1
  462. package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts +2 -1
  463. package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts.map +1 -1
  464. package/src/engine/sound/simulation/core/AcousticRegionIndex.js +4 -3
  465. package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts +3 -2
  466. package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts.map +1 -1
  467. package/src/engine/sound/simulation/core/AcousticVolumeRegion.js +6 -4
  468. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +10 -6
  469. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
  470. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +32 -7
  471. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts +7 -7
  472. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts.map +1 -1
  473. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +6 -6
  474. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  475. package/src/engine/sound/sopra/runtime/EventInstance.js +8 -2
  476. package/src/format/scene/gltf/gltf_component_type.d.ts.map +1 -1
  477. package/src/format/scene/gltf/gltf_component_type.js +3 -1
  478. package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
  479. package/src/format/texture/ktx2/ktx2_read.js +2 -1
  480. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
  481. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +8 -1
  482. package/src/generation/markers/GridCellActionPlaceMarker.d.ts +4 -4
  483. package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
  484. package/src/generation/markers/GridCellActionPlaceMarker.js +16 -6
  485. package/src/generation/markers/MarkerNode.d.ts +3 -3
  486. package/src/generation/markers/MarkerNode.d.ts.map +1 -1
  487. package/src/generation/markers/MarkerNode.js +3 -3
  488. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts +4 -4
  489. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts.map +1 -1
  490. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +7 -7
  491. package/src/generation/markers/actions/MarkerNodeActionImaginary.d.ts.map +1 -1
  492. package/src/generation/markers/actions/MarkerNodeActionImaginary.js +20 -2
  493. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
  494. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
  495. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +13 -3
  496. package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.d.ts.map +1 -1
  497. package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.js +11 -1
  498. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
  499. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +8 -4
  500. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
  501. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +13 -5
  502. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
  503. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +8 -2
  504. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
  505. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +16 -2
  506. package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
  507. package/src/shade/device/graph/BufferResourceDescriptor.js +193 -184
  508. package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
  509. package/src/shade/device/graph/TextureResourceDescriptor.js +12 -0
  510. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  511. package/src/shade/device/mock/SoftwareGPUDevice.js +8 -0
  512. package/src/shade/playground/avboit/main.js +3 -3
  513. package/src/shade/playground/basis_textures/main.js +1 -1
  514. package/src/shade/playground/ground_seam/main.js +1 -1
  515. package/src/shade/playground/particle_editor/README.md +175 -0
  516. package/src/shade/playground/particle_editor/index.html +76 -0
  517. package/src/shade/playground/particle_editor/main.d.ts +2 -0
  518. package/src/shade/playground/particle_editor/main.d.ts.map +1 -0
  519. package/src/shade/playground/particle_editor/main.js +139 -0
  520. package/src/shade/playground/particle_system/README.md +92 -62
  521. package/src/shade/playground/particle_system/index.html +67 -21
  522. package/src/shade/playground/particle_system/main.js +247 -102
  523. package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.d.ts +21 -18
  524. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -0
  525. package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.js +197 -181
  526. package/src/shade/playground/particle_system/particle_scene.d.ts +136 -20
  527. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  528. package/src/shade/playground/particle_system/particle_scene.js +487 -670
  529. package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -2
  530. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
  531. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +2 -1
  532. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  533. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +2 -1
  534. package/src/shade/playground/sponza_path_trace/main.js +1 -1
  535. package/src/shade/playground/volumetrics_froxel/main.js +917 -917
  536. package/src/shade/playground/volumetrics_froxel/measure.js +559 -559
  537. package/src/shade/renderer/Renderer.d.ts +28 -0
  538. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  539. package/src/shade/renderer/Renderer.js +140 -8
  540. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  541. package/src/shade/renderer/atmosphere/GPUSky.js +4 -2
  542. package/src/shade/renderer/buffer/graph_read_buffer.d.ts.map +1 -1
  543. package/src/shade/renderer/buffer/graph_read_buffer.js +8 -1
  544. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  545. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +30 -0
  546. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  547. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +84 -0
  548. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +27 -0
  549. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +1 -0
  550. package/src/shade/renderer/buffer/table/gpu_database_words.d.ts +24 -0
  551. package/src/shade/renderer/buffer/table/gpu_database_words.d.ts.map +1 -0
  552. package/src/shade/renderer/buffer/table/gpu_database_words.js +92 -0
  553. package/src/shade/renderer/camera/Camera.d.ts +2 -2
  554. package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
  555. package/src/shade/renderer/camera/Camera.js +11 -5
  556. package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
  557. package/src/shade/renderer/camera/GPUCameraContext.js +2 -1
  558. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +3 -3
  559. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  560. package/src/shade/renderer/camera/OrbitalCameraController.js +31 -16
  561. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +2 -2
  562. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  563. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +4 -3
  564. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +10 -5
  565. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  566. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +8 -4
  567. package/src/shade/renderer/extension/FrameContext.d.ts.map +1 -1
  568. package/src/shade/renderer/extension/FrameContext.js +5 -0
  569. package/src/shade/renderer/extension/FrameRecord.d.ts +16 -0
  570. package/src/shade/renderer/extension/FrameRecord.d.ts.map +1 -1
  571. package/src/shade/renderer/extension/FrameRecord.js +31 -0
  572. package/src/shade/renderer/extension/GBufferTextures.d.ts +11 -0
  573. package/src/shade/renderer/extension/GBufferTextures.d.ts.map +1 -1
  574. package/src/shade/renderer/extension/GBufferTextures.js +14 -0
  575. package/src/shade/renderer/geometry/attribute/gpu_vertex_buffer_layout_from_spec.js +1 -1
  576. package/src/shade/renderer/geometry/util/geometry_stripify.js +6 -6
  577. package/src/shade/renderer/geometry/virtual/format/prototypeVGEOFormatViewer.js +8 -8
  578. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  579. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +14 -5
  580. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
  581. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +17 -9
  582. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts +2 -1
  583. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts.map +1 -1
  584. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.js +4 -1
  585. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts +2 -1
  586. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  587. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +11 -1
  588. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts +1 -1
  589. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts.map +1 -1
  590. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.js +4 -2
  591. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  592. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +5 -1
  593. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  594. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +35 -11
  595. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  596. package/src/shade/renderer/particles/DESIGN.md +271 -112
  597. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +251 -86
  598. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  599. package/src/shade/renderer/particles/GPUParticleSystem.js +822 -146
  600. package/src/shade/renderer/particles/ParticleConstants.d.ts +96 -3
  601. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  602. package/src/shade/renderer/particles/ParticleConstants.js +103 -4
  603. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +5 -4
  604. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  605. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +11 -15
  606. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +2 -2
  607. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -1
  608. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +20 -15
  609. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +7 -8
  610. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  611. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +7 -17
  612. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +56 -0
  613. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -0
  614. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +68 -0
  615. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts +39 -0
  616. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts.map +1 -0
  617. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.js +52 -0
  618. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +83 -0
  619. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -0
  620. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +166 -0
  621. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts +21 -5
  622. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  623. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +44 -85
  624. package/src/shade/renderer/particles/data/particle_header.d.ts +62 -0
  625. package/src/shade/renderer/particles/data/particle_header.d.ts.map +1 -0
  626. package/src/shade/renderer/particles/data/particle_header.js +103 -0
  627. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +179 -0
  628. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts.map +1 -0
  629. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -0
  630. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +120 -1
  631. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  632. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +90 -1
  633. package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts +283 -0
  634. package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts.map +1 -0
  635. package/src/shade/renderer/particles/graph/ParticleNodeGroup.js +419 -0
  636. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +44 -2
  637. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  638. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +476 -40
  639. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +188 -0
  640. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts.map +1 -0
  641. package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -0
  642. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +16 -9
  643. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  644. package/src/shade/renderer/particles/graph/compile_particle_graph.js +464 -205
  645. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts +11 -0
  646. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -0
  647. package/src/shade/renderer/particles/graph/flatten_particle_graph.js +213 -0
  648. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts +27 -0
  649. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -0
  650. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +75 -0
  651. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +83 -0
  652. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -0
  653. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +319 -0
  654. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts +22 -0
  655. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -0
  656. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +517 -0
  657. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts +70 -0
  658. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts.map +1 -0
  659. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.js +161 -0
  660. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts +8 -0
  661. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -0
  662. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +159 -0
  663. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +88 -0
  664. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -0
  665. package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +234 -0
  666. package/src/shade/renderer/particles/graph/make_particle_group.d.ts +98 -0
  667. package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -0
  668. package/src/shade/renderer/particles/graph/make_particle_group.js +427 -0
  669. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +11 -4
  670. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
  671. package/src/shade/renderer/particles/graph/particle_graph_authoring.js +121 -108
  672. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +38 -0
  673. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -0
  674. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +25 -0
  675. package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts +29 -0
  676. package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts.map +1 -0
  677. package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -0
  678. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +87 -0
  679. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -0
  680. package/src/shade/renderer/particles/graph/particle_graph_json.js +196 -0
  681. package/src/shade/renderer/particles/graph/particle_group_json.d.ts +86 -0
  682. package/src/shade/renderer/particles/graph/particle_group_json.d.ts.map +1 -0
  683. package/src/shade/renderer/particles/graph/particle_group_json.js +182 -0
  684. package/src/shade/renderer/particles/graph/particle_group_library.d.ts +33 -0
  685. package/src/shade/renderer/particles/graph/particle_group_library.d.ts.map +1 -0
  686. package/src/shade/renderer/particles/graph/particle_group_library.js +75 -0
  687. package/src/shade/renderer/particles/graph/particle_node_library.d.ts +37 -0
  688. package/src/shade/renderer/particles/graph/particle_node_library.d.ts.map +1 -0
  689. package/src/shade/renderer/particles/graph/particle_node_library.js +64 -0
  690. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +146 -0
  691. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -0
  692. package/src/shade/renderer/particles/graph/particle_node_parameters.js +234 -0
  693. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts +30 -0
  694. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -0
  695. package/src/shade/renderer/particles/graph/particle_node_presentation.js +286 -0
  696. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +66 -0
  697. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -0
  698. package/src/shade/renderer/particles/graph/validate_particle_graph.js +439 -0
  699. package/src/shade/renderer/particles/graph_particles.d.ts +143 -68
  700. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  701. package/src/shade/renderer/particles/graph_particles.js +424 -71
  702. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +107 -0
  703. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -0
  704. package/src/shade/renderer/particles/graph_particles_avboit.js +312 -0
  705. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +41 -8
  706. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  707. package/src/shade/renderer/particles/isa/InstructionStream.js +111 -33
  708. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +13 -10
  709. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
  710. package/src/shade/renderer/particles/isa/ParticleAssembler.js +30 -26
  711. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +27 -15
  712. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  713. package/src/shade/renderer/particles/isa/ParticleProgram.js +139 -34
  714. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +117 -9
  715. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  716. package/src/shade/renderer/particles/isa/ParticleVMISA.js +296 -37
  717. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +149 -0
  718. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -0
  719. package/src/shade/renderer/particles/isa/particle_assembly.js +999 -0
  720. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +25 -3
  721. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  722. package/src/shade/renderer/particles/layout/ParticleLayout.js +33 -5
  723. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +160 -0
  724. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -0
  725. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +478 -0
  726. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +291 -0
  727. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -0
  728. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +647 -0
  729. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +95 -0
  730. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -0
  731. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +213 -0
  732. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +16 -0
  733. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -0
  734. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +223 -0
  735. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +121 -0
  736. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -0
  737. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +206 -0
  738. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +11 -0
  739. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -0
  740. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +197 -0
  741. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts +4 -0
  742. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -0
  743. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -0
  744. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +4 -0
  745. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -0
  746. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +561 -0
  747. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts +4 -0
  748. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -0
  749. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +72 -0
  750. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts +4 -0
  751. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -0
  752. package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +86 -0
  753. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts +4 -0
  754. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -0
  755. package/src/shade/renderer/particles/optimizer/pass_peephole.js +271 -0
  756. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts +4 -0
  757. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -0
  758. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +268 -0
  759. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts +4 -0
  760. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -0
  761. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +151 -0
  762. package/src/shade/renderer/particles/particle_test_fixtures.d.ts +131 -0
  763. package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -0
  764. package/src/shade/renderer/particles/particle_test_fixtures.js +203 -0
  765. package/src/shade/renderer/particles/runtime/Emitter.d.ts +219 -0
  766. package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +1 -0
  767. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +128 -60
  768. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  769. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +286 -117
  770. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +264 -0
  771. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -0
  772. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +404 -0
  773. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +49 -15
  774. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +1 -1
  775. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +51 -18
  776. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  777. package/src/shade/renderer/particles/runtime/ProgramArena.js +72 -32
  778. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +4 -4
  779. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  780. package/src/shade/renderer/particles/runtime/create_particle_effect.js +4 -4
  781. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +15 -0
  782. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +1 -0
  783. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts +17 -0
  784. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts.map +1 -0
  785. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.js +75 -0
  786. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts +20 -0
  787. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -0
  788. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +94 -0
  789. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +15 -5
  790. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +1 -1
  791. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts +1 -2
  792. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts.map +1 -1
  793. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.js +1 -2
  794. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts +11 -0
  795. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts.map +1 -0
  796. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.js +13 -0
  797. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts +17 -0
  798. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts.map +1 -0
  799. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.js +22 -0
  800. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +14 -0
  801. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +1 -0
  802. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.js +23 -0
  803. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
  804. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts +18 -0
  805. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts.map +1 -0
  806. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.js +24 -0
  807. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +26 -0
  808. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -0
  809. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +59 -0
  810. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts +14 -0
  811. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -0
  812. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +153 -0
  813. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts +3 -0
  814. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -0
  815. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +124 -0
  816. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts +19 -0
  817. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -0
  818. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +147 -0
  819. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -8
  820. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  821. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +72 -37
  822. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts +5 -0
  823. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts.map +1 -0
  824. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.js +216 -0
  825. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  826. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +7 -3
  827. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  828. package/src/shade/renderer/particles/shaders/shader_particle_render.js +132 -197
  829. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  830. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +78 -24
  831. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts +26 -0
  832. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts.map +1 -0
  833. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.js +66 -0
  834. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +1 -1
  835. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  836. package/src/shade/renderer/particles/sort/shader_particle_sort.js +21 -36
  837. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +2 -2
  838. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  839. package/src/shade/renderer/particles/vm/ParticleVMReference.js +100 -90
  840. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  841. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +270 -138
  842. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts +1 -2
  843. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts.map +1 -1
  844. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +0 -3
  845. package/src/shade/renderer/postprocess/dof/gather/DepthOfFieldU.js +1 -1
  846. package/src/shade/renderer/postprocess/dof/raymarch/DepthOfField.js +1 -1
  847. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  848. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  849. package/src/shade/renderer/postprocess/nss/NSS.js +3 -2
  850. package/src/shade/renderer/postprocess/nss/generate_NSS_WEIGHTS_ACTUAL.js +3 -2
  851. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +87 -0
  852. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -0
  853. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +61 -0
  854. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +179 -0
  855. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +27 -2
  856. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +9 -2
  857. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
  858. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +12 -3
  859. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts +18 -0
  860. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -0
  861. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +58 -0
  862. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +25 -1
  863. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  864. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +69 -10
  865. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -1
  866. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +10 -4
  867. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
  868. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +4 -39
  869. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +7 -2
  870. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  871. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +16 -2
  872. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +3 -3
  873. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
  874. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +29 -23
  875. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts +2 -2
  876. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts.map +1 -1
  877. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.js +3 -3
  878. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +4 -4
  879. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
  880. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +2 -2
  881. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts +2 -2
  882. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts.map +1 -1
  883. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +2 -2
  884. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts +7 -7
  885. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts.map +1 -1
  886. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +79 -71
  887. package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.d.ts.map +1 -1
  888. package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.js +3 -1
  889. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts +13 -3
  890. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts.map +1 -1
  891. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.js +15 -5
  892. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts +8 -0
  893. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts.map +1 -1
  894. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.js +15 -5
  895. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts +7 -0
  896. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts.map +1 -1
  897. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.js +17 -7
  898. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts +17 -0
  899. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts.map +1 -0
  900. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.js +26 -0
  901. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts +15 -0
  902. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts.map +1 -0
  903. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.js +26 -0
  904. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  905. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +8 -2
  906. package/src/shade/renderer/shadow/map/PointLightShadowmap.d.ts.map +1 -1
  907. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +7 -2
  908. package/src/shade/renderer/shadow/map/SpotLightShadowmap.d.ts.map +1 -1
  909. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +3 -15
  910. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.d.ts.map +1 -1
  911. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +10 -4
  912. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +1 -1
  913. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +7 -2
  914. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +2 -2
  915. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +3 -3
  916. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  917. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +3 -3
  918. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  919. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +66 -5
  920. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  921. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +35 -4
  922. package/src/view/minimap/Minimap.d.ts.map +1 -1
  923. package/src/view/minimap/Minimap.js +227 -225
  924. package/src/view/minimap/MinimapCanvasView.js +3 -3
  925. package/src/view/minimap/MinimapMarker.d.ts +45 -0
  926. package/src/view/minimap/MinimapMarker.d.ts.map +1 -0
  927. package/src/view/minimap/MinimapMarker.js +80 -0
  928. package/src/view/minimap/MinimapMarkerCollection.d.ts +6 -5
  929. package/src/view/minimap/MinimapMarkerCollection.d.ts.map +1 -1
  930. package/src/view/minimap/MinimapMarkerCollection.js +6 -6
  931. package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts +19 -0
  932. package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts.map +1 -0
  933. package/src/view/minimap/MinimapMarkerSerializationAdapter.js +42 -0
  934. package/src/view/minimap/dom/MinimapCameraView.d.ts +1 -1
  935. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  936. package/src/view/minimap/dom/MinimapCameraView.js +23 -4
  937. package/src/view/minimap/dom/MinimapMarkerView.js +3 -3
  938. package/src/view/minimap/gl/MarkerGL.js +3 -3
  939. package/src/view/util/DomLayoutFrame.d.ts +53 -0
  940. package/src/view/util/DomLayoutFrame.d.ts.map +1 -0
  941. package/src/view/util/DomLayoutFrame.js +122 -0
  942. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.js +0 -19
  943. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.js +0 -241
  944. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.js +0 -40
  945. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.js +0 -28
  946. package/src/engine/ecs/util/hideEntityGracefully.js +0 -196
  947. package/src/shade/renderer/particles/cull/chunk_particle_cull.js +0 -38
  948. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +0 -214
  949. package/src/shade/renderer/particles/particle_prototype.d.ts.map +0 -1
  950. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.js +0 -86
  951. package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +0 -52
  952. package/src/shade/renderer/particles/shaders/chunk_particle_context.js +0 -58
@@ -1,566 +1,565 @@
1
- import { assert } from "../../core/assert.js";
2
- import {
3
- bvh_query_user_data_intersects_frustum
4
- } from "../../core/bvh2/bvh3/query/bvh_query_user_data_intersects_frustum.js";
5
- import { SignalBinding } from "../../core/events/signal/SignalBinding.js";
6
- import { noop } from "../../core/function/noop.js";
7
- import { m4_invert } from "../../core/geom/3d/mat4/m4_invert.js";
8
- import { GameAssetType } from "../asset/GameAssetType.js";
9
- import { ImageRGBADataLoader } from "../asset/loaders/image/ImageRGBADataLoader.js";
10
- import { System } from "../ecs/System.js";
11
- import Terrain from "../ecs/terrain/ecs/Terrain.js";
12
- import { TerrainFlags } from "../ecs/terrain/ecs/TerrainFlags.js";
13
- import { tile_geometry_to_meshlets } from "../ecs/terrain/tiles/tile_geometry_to_meshlets.js";
14
- import { Transform } from "../ecs/transform/Transform.js";
15
- import { t64_copy_from_transform } from "../ecs/transform/t64_copy_from_transform.js";
16
- import { t64_equals_transform } from "../ecs/transform/t64_equals_transform.js";
17
- import { sampler2d_ensure_uint8_RGBA } from "../graphics/texture/sampler/sampler2d_ensure_uint8_RGBA.js";
18
- import { Sampler2D } from "../graphics/texture/sampler/Sampler2D.js";
19
- import { WHITE_PIXEL_DATA_URL } from "../graphics/WHITE_PIXEL_DATA_URL.js";
20
- import { FramePhase } from "../../shade/renderer/extension/FramePhase.js";
21
- import { RenderExtension } from "../../shade/renderer/extension/RenderExtension.js";
22
- import { StandardShadeMaterial } from "../../shade/renderer/material/StandardShadeMaterial.js";
23
- import { Mesh } from "../../shade/renderer/scene/Mesh.js";
24
- import { GPUTerrainSplatRenderer } from "./terrain/GPUTerrainSplatRenderer.js";
25
- import { pack_terrain_row_table } from "./terrain/pack_terrain_row_table.js";
26
-
27
- /**
28
- * Tile indices a frustum query answers with. Module-static because the query runs every frame and
29
- * every terrain shares one shape of answer.
30
- *
31
- * @type {number[]}
32
- */
33
- const SCRATCH_TILE_INDICES = [];
34
-
35
- /**
36
- * What the overlay's sprite is until an authored one loads the same white pixel the component's
37
- * own default URL names, held as pixels so nothing has to decode a data URL to draw a grid.
38
- *
39
- * @type {Sampler2D}
40
- */
41
- const WHITE_SPRITE = Sampler2D.uint8(4, 1, 1);
42
- WHITE_SPRITE.data.fill(255);
43
-
44
- /**
45
- * Draws terrain under Shade: each built tile becomes one meshlet-encoded mesh in the scene, and a
46
- * pass after the opaque geometry textures the lot.
47
- *
48
- * **The tile is the unit, not the terrain.** Tiles are built on demand as the camera sees them and
49
- * destroyed as it leaves, which is the streaming the tile manager already does; this system follows
50
- * that with scene membership rather than deciding anything about it.
51
- *
52
- * **Tile vertices are already in terrain space**the height-field builder positions each tile
53
- * within the whole grid rather than at its own origin so every tile mesh carries the terrain
54
- * entity's transform and nothing else. That is also why the tile's own raycast inverts the same
55
- * matrix.
56
- *
57
- * **Texturing is a full-screen pass, not a material** (U3b, D40): the tiles draw with one flat
58
- * material, and at {@link FramePhase.AfterGBuffer} the splat mix and grid overlay are painted over
59
- * every pixel the visibility buffer attributes to a tile the architecture decals built (D23),
60
- * keyed on mesh rows rather than froxels. Registered before `DecalSystem` in the profile, which
61
- * is what puts scorch marks on top of the textured ground rather than under it.
62
- *
63
- * **It does not call `Terrain.link`.** That method binds a three `ShaderMaterial` through
64
- * `graphics.getMaterialManager()`, which `GraphicsEngine` does not have and will not; the parts of
65
- * linking that are not about three — starting the tile build service — are done here directly.
66
- */
67
- export class TerrainSystem extends System {
68
- dependencies = [Terrain];
69
-
70
- /**
71
- * @type {GraphicsEngine}
72
- */
73
- #graphics;
74
-
75
- /**
76
- * @type {RenderExtension|null}
77
- */
78
- #extension = null;
79
-
80
- /**
81
- * The scene this system writes into, received rather than created so terrain, meshes and lights
82
- * all land in the one the facade draws.
83
- *
84
- * @type {Scene}
85
- */
86
- #scene;
87
-
88
- /**
89
- * @type {AssetManager}
90
- */
91
- #assetManager;
92
-
93
- /**
94
- * What each terrain entity has in the scene.
95
- *
96
- * @type {Map<number, {terrain: Terrain, material: StandardShadeMaterial, meshes: Map<TerrainTile, Mesh>, bindings: SignalBinding[]}>}
97
- */
98
- #entries = new Map();
99
-
100
- /**
101
- * @param {GraphicsEngine} graphics
102
- * @param {Scene} scene
103
- * @param {AssetManager} assetManager
104
- */
105
- constructor(graphics, scene, assetManager) {
106
- super();
107
-
108
- assert.defined(graphics, 'graphics');
109
- assert.defined(scene, 'scene');
110
- assert.defined(assetManager, 'assetManager');
111
-
112
- this.#graphics = graphics;
113
- this.#scene = scene;
114
- this.#assetManager = assetManager;
115
- }
116
-
117
- async startup(entityManager) {
118
- this.entityManager = entityManager;
119
-
120
- this.#extension = this.#graphics.add_extension(new TerrainExtension(this));
121
-
122
- // the terrain's own layer loading decodes images; the decoder is renderer-neutral and the
123
- // legacy system registers the same one
124
- await this.#assetManager.tryRegisterLoader(GameAssetType.Image, new ImageRGBADataLoader());
125
- }
126
-
127
- async shutdown(entityManager) {
128
- if (this.#extension !== null) {
129
- this.#graphics.remove_extension(this.#extension);
130
-
131
- this.#extension = null;
132
- }
133
-
134
- for (const entity of Array.from(this.#entries.keys())) {
135
- this.#drop(entity);
136
- }
137
- }
138
-
139
- /**
140
- * @param {Terrain} terrain
141
- * @param {number} entity
142
- */
143
- link(terrain, entity) {
144
- if (!terrain.getFlag(TerrainFlags.Built)) {
145
- terrain.build(this.#assetManager);
146
- }
147
-
148
- const entry = {
149
- terrain,
150
- /*
151
- One material for the whole terrain, and a flat one on purpose: the splat pass rewrites
152
- the albedo after the G-buffer is drawn (U3b), so what the material contributes is the
153
- other three channels — roughness 1 and metalness 0, which is exactly what the legacy
154
- splat shader forced.
155
- */
156
- material: new StandardShadeMaterial(),
157
- meshes: new Map(),
158
- bindings: [],
159
- renderer: new GPUTerrainSplatRenderer(),
160
- /**
161
- * The pass's per-frame tables and settings, reused between frames.
162
- */
163
- rows: new Uint32Array(0),
164
- scales: new Float32Array(0),
165
- world_to_terrain: new Float32Array(16),
166
- inv_world_size: new Float32Array(2),
167
- grid_transform: new Float32Array(4),
168
- grid_resolution: new Float32Array(2),
169
- sprite: WHITE_SPRITE
170
- };
171
-
172
- entry.material.name = 'terrain';
173
- entry.material.roughness_factor = 1;
174
- entry.material.metallic_factor = 0;
175
-
176
- this.#entries.set(entity, entry);
177
-
178
- const manager = terrain.tiles;
179
-
180
- const built = new SignalBinding(manager.on.tileBuilt, tile => this.#add_tile(entity, tile));
181
- const destroyed = new SignalBinding(manager.on.tileDestroyed, tile => this.#remove_tile(entity, tile));
182
- const sprite = new SignalBinding(terrain.overlay.tileImage.onChanged, () => this.#load_sprite(entity, terrain));
183
-
184
- built.link();
185
- destroyed.link();
186
- sprite.link();
187
-
188
- entry.bindings.push(built, destroyed, sprite);
189
-
190
- this.#load_sprite(entity, terrain);
191
-
192
- terrain.startBuildService();
193
-
194
- // tiles that were already standing before this system saw the entity
195
- for (const tile of manager.tiles) {
196
- if (tile.isBuilt) {
197
- this.#add_tile(entity, tile);
198
- }
199
- }
200
- }
201
-
202
- /**
203
- * @param {Terrain} terrain
204
- * @param {number} entity
205
- */
206
- unlink(terrain, entity) {
207
- terrain.stopBuildService();
208
-
209
- this.#drop(entity);
210
- }
211
-
212
- update(timeDelta) {
213
- const em = this.entityManager;
214
-
215
- if (em === null) {
216
- return;
217
- }
218
-
219
- const ecd = em.dataset;
220
-
221
- if (ecd === null) {
222
- return;
223
- }
224
-
225
- ecd.traverseComponents(Terrain, (terrain, entity) => {
226
- const transform = ecd.getComponent(entity, Transform);
227
-
228
- if (transform !== undefined) {
229
- // the raycast inverts this to bring a ray into terrain space, so it has to track
230
- // the entity whether or not anything is drawn
231
- terrain.transform = transform.matrix;
232
- }
233
-
234
- this.#place(entity, transform);
235
-
236
- this.#build_visible_tiles(terrain);
237
- });
238
- }
239
-
240
- /**
241
- * Ask for the tiles the camera can see. The manager owns what that costs — a tile already built
242
- * or already building is not requested again.
243
- *
244
- * @param {Terrain} terrain
245
- */
246
- #build_visible_tiles(terrain) {
247
- const camera = this.#graphics.camera.camera;
248
-
249
- const manager = terrain.tiles;
250
-
251
- const hit_count = bvh_query_user_data_intersects_frustum(
252
- SCRATCH_TILE_INDICES, 0,
253
- manager.bvh, camera.frustum
254
- );
255
-
256
- for (let i = 0; i < hit_count; i++) {
257
- const tile = manager.tiles[SCRATCH_TILE_INDICES[i]];
258
-
259
- if (tile.isBuilt || tile.isBuildInProgress) {
260
- continue;
261
- }
262
-
263
- const position = tile.gridPosition;
264
-
265
- manager.build(position.x, position.y, noop, noop);
266
- }
267
- }
268
-
269
- /**
270
- * @param {number} entity
271
- * @param {TerrainTile} tile
272
- */
273
- #add_tile(entity, tile) {
274
- const entry = this.#entries.get(entity);
275
-
276
- if (entry === undefined) {
277
- return;
278
- }
279
-
280
- if (entry.meshes.has(tile)) {
281
- // a rebuilt tile replaces what it had rather than accumulating
282
- this.#remove_tile(entity, tile);
283
- }
284
-
285
- const geometry = tile_geometry_to_meshlets({
286
- vertices: tile.vertices,
287
- normals: tile.normals,
288
- uvs: tile.uvs,
289
- indices: tile.indices
290
- }, `terrain tile ${tile.gridPosition.x},${tile.gridPosition.y}`);
291
-
292
- const mesh = Mesh.from(geometry, entry.material);
293
-
294
- entry.meshes.set(tile, mesh);
295
-
296
- this.#scene.add(mesh);
297
-
298
- const ecd = this.entityManager === null ? null : this.entityManager.dataset;
299
-
300
- if (ecd !== null) {
301
- this.#place(entity, ecd.getComponent(entity, Transform));
302
- }
303
- }
304
-
305
- /**
306
- * @param {number} entity
307
- * @param {TerrainTile} tile
308
- */
309
- #remove_tile(entity, tile) {
310
- const entry = this.#entries.get(entity);
311
-
312
- if (entry === undefined) {
313
- return;
314
- }
315
-
316
- const mesh = entry.meshes.get(tile);
317
-
318
- if (mesh === undefined) {
319
- return;
320
- }
321
-
322
- this.#scene.remove(mesh);
323
-
324
- entry.meshes.delete(tile);
325
- }
326
-
327
- /**
328
- * @param {number} entity
329
- * @param {Transform|undefined} transform
330
- */
331
- #place(entity, transform) {
332
- if (transform === undefined) {
333
- return;
334
- }
335
-
336
- const entry = this.#entries.get(entity);
337
-
338
- if (entry === undefined) {
339
- return;
340
- }
341
-
342
- for (const mesh of entry.meshes.values()) {
343
- /*
344
- A tile already standing where it belongs is left alone, and it is the common case:
345
- {@link update} places on a poll rather than on the entity's transform signals, because a
346
- terrain may be linked before it has a `Transform` at all. `updateMatrices` bumps a
347
- version whether or not anything moved, and downstream that version is what makes the
348
- scene database upload a row and the top-level acceleration structure rebuild itself
349
- a whole-tree treelet optimisation and a fresh GPU buffer, once a frame, for a ground
350
- that has not moved since the level loaded (E19).
351
- */
352
- if (t64_equals_transform(mesh.transform_local, transform)) {
353
- continue;
354
- }
355
-
356
- t64_copy_from_transform(mesh.transform_local, transform);
357
-
358
- mesh.updateMatrices();
359
- }
360
- }
361
-
362
- /**
363
- * @param {number} entity
364
- */
365
- #drop(entity) {
366
- const entry = this.#entries.get(entity);
367
-
368
- if (entry === undefined) {
369
- return;
370
- }
371
-
372
- for (let i = 0; i < entry.bindings.length; i++) {
373
- entry.bindings[i].unlink();
374
- }
375
-
376
- for (const mesh of entry.meshes.values()) {
377
- this.#scene.remove(mesh);
378
- }
379
-
380
- entry.renderer.destroy();
381
-
382
- this.#entries.delete(entity);
383
- }
384
-
385
- /**
386
- * Fetch the overlay's cell sprite. The default is the white pixel the component names by data
387
- * URL, held here as pixels — a grid with no authored sprite is the cell colours themselves,
388
- * and nothing decodes a data URL to get there.
389
- *
390
- * @param {number} entity
391
- * @param {Terrain} terrain
392
- */
393
- #load_sprite(entity, terrain) {
394
- const entry = this.#entries.get(entity);
395
-
396
- if (entry === undefined) {
397
- return;
398
- }
399
-
400
- const url = terrain.overlay.baseTileImage;
401
-
402
- if (url === WHITE_PIXEL_DATA_URL) {
403
- entry.sprite = WHITE_SPRITE;
404
-
405
- return;
406
- }
407
-
408
- this.#assetManager.promise(url, GameAssetType.Image).then(asset => {
409
- if (this.#entries.get(entity) !== entry || terrain.overlay.baseTileImage !== url) {
410
- // unlinked, or re-authored while the image was in flight
411
- return;
412
- }
413
-
414
- entry.sprite = sampler2d_ensure_uint8_RGBA(asset.create());
415
- });
416
- }
417
-
418
- /**
419
- * Everything the splat pass draws one terrain from, assembled against the scene that will be
420
- * asked for the rows. What the pass consumes and what a gate inspects are deliberately the
421
- * same object — the same reason `DecalSystem` exposes its packed records.
422
- *
423
- * @param {number} entity
424
- * @param {GPUSceneContext} scene
425
- * @returns {object|null} `null` when this terrain has nothing on screen to texture — no tiles
426
- * built, or none of them in the scene database yet
427
- */
428
- splat_frame(entity, scene) {
429
- const entry = this.#entries.get(entity);
430
-
431
- if (entry === undefined || entry.meshes.size === 0) {
432
- return null;
433
- }
434
-
435
- const packed = pack_terrain_row_table({ meshes: entry.meshes, scene, table: entry.rows });
436
-
437
- entry.rows = packed.table;
438
-
439
- if (packed.size === 0) {
440
- return null;
441
- }
442
-
443
- const terrain = entry.terrain;
444
-
445
- const invertible = m4_invert(entry.world_to_terrain, terrain.transform);
446
-
447
- assert.equal(invertible, true, 'terrain transform is not invertible');
448
-
449
- const world_x = terrain.size.x * terrain.gridScale;
450
- const world_y = terrain.size.y * terrain.gridScale;
451
-
452
- entry.inv_world_size[0] = 1 / world_x;
453
- entry.inv_world_size[1] = 1 / world_y;
454
-
455
- const grid_transform = terrain.gridTransform;
456
-
457
- entry.grid_transform[0] = grid_transform.scale_x;
458
- entry.grid_transform[1] = grid_transform.scale_y;
459
- entry.grid_transform[2] = grid_transform.offset_x;
460
- entry.grid_transform[3] = grid_transform.offset_y;
461
-
462
- entry.grid_resolution[0] = terrain.size.x;
463
- entry.grid_resolution[1] = terrain.size.y;
464
-
465
- const layers = terrain.layers;
466
- const layer_count = layers.count();
467
-
468
- if (entry.scales.length < layer_count * 2) {
469
- entry.scales = new Float32Array(layer_count * 2);
470
- }
471
-
472
- // the legacy `updateLayerScales`, computed at the source instead of read off a texture
473
- for (let i = 0; i < layer_count; i++) {
474
- const layer = layers.get(i);
475
-
476
- entry.scales[i * 2] = world_x / layer.size.x;
477
- entry.scales[i * 2 + 1] = world_y / layer.size.y;
478
- }
479
-
480
- const splat = terrain.splat;
481
- const layer_image = layers.sampler;
482
-
483
- if (layer_count > 0) {
484
- // `Terrain.build` and `addLayer` keep all three in step; a mismatch is an upstream bug
485
- // that would draw the wrong layer, silently
486
- assert.equal(splat.depth, layer_count, 'splat weight layers disagree with the layer list');
487
- assert.equal(layer_image.depth, layer_count, 'layer texture depth disagrees with the layer list');
488
- }
489
-
490
- return {
491
- rows: entry.rows,
492
- row_count: packed.size,
493
- scales: entry.scales,
494
- layer_count,
495
- world_to_terrain: entry.world_to_terrain,
496
- inv_world_size: entry.inv_world_size,
497
- grid_transform: entry.grid_transform,
498
- grid_resolution: entry.grid_resolution,
499
- weights: {
500
- data: splat.weightData,
501
- width: splat.size.x,
502
- height: splat.size.y,
503
- depth: splat.depth,
504
- version: splat.weights.version
505
- },
506
- layer_image: {
507
- data: layer_image.data,
508
- width: layer_image.width,
509
- height: layer_image.height,
510
- depth: layer_image.depth,
511
- version: layer_image.version
512
- },
513
- overlay: terrain.overlay.sampler,
514
- sprite: entry.sprite
515
- };
516
- }
517
-
518
- /**
519
- * @param {FrameContext} frame
520
- */
521
- record(frame) {
522
- for (const entity of this.#entries.keys()) {
523
- const splat = this.splat_frame(entity, frame.view.scene);
524
-
525
- if (splat === null) {
526
- // nothing of this terrain on screen; the frame keeps the albedo it already had
527
- continue;
528
- }
529
-
530
- splat.frame = frame;
531
-
532
- this.#entries.get(entity).renderer.graph_draw(splat);
533
- }
534
- }
535
- }
536
-
537
- /**
538
- * The splat and the grid overlay are a full-screen pass writing a replacement albedo, so this is
539
- * {@link FramePhase.AfterGBuffer} — the one phase where the G-buffer may be published into.
540
- *
541
- * Everything that paints on top of the ground declares itself after this rather than being
542
- * registered after it; {@link DecalExtension} is the one that does.
543
- */
544
- export class TerrainExtension extends RenderExtension {
545
- name = "terrain";
546
-
547
- phase = FramePhase.AfterGBuffer;
548
-
549
- /**
550
- * @type {TerrainSystem}
551
- */
552
- #system;
553
-
554
- /**
555
- * @param {TerrainSystem} system
556
- */
557
- constructor(system) {
558
- super();
559
-
560
- this.#system = system;
561
- }
562
-
563
- record(frame) {
564
- this.#system.record(frame);
565
- }
566
- }
1
+ import { assert } from "../../core/assert.js";
2
+ import {
3
+ bvh_query_user_data_intersects_frustum
4
+ } from "../../core/bvh2/bvh3/query/bvh_query_user_data_intersects_frustum.js";
5
+ import { SignalBinding } from "../../core/events/signal/SignalBinding.js";
6
+ import { noop } from "../../core/function/noop.js";
7
+ import { m4_invert } from "../../core/geom/3d/mat4/m4_invert.js";
8
+ import { GameAssetType } from "../asset/GameAssetType.js";
9
+ import { ImageRGBADataLoader } from "../asset/loaders/image/ImageRGBADataLoader.js";
10
+ import { System } from "../ecs/System.js";
11
+ import Terrain from "../ecs/terrain/ecs/Terrain.js";
12
+ import { TerrainFlags } from "../ecs/terrain/ecs/TerrainFlags.js";
13
+ import { tile_geometry_to_meshlets } from "../ecs/terrain/tiles/tile_geometry_to_meshlets.js";
14
+ import { Transform64 } from "../ecs/transform/Transform64.js";
15
+ import { t64_equals_components } from "../ecs/transform/t64_equals_components.js";
16
+ import { sampler2d_ensure_uint8_RGBA } from "../graphics/texture/sampler/sampler2d_ensure_uint8_RGBA.js";
17
+ import { Sampler2D } from "../graphics/texture/sampler/Sampler2D.js";
18
+ import { WHITE_PIXEL_DATA_URL } from "../graphics/WHITE_PIXEL_DATA_URL.js";
19
+ import { FramePhase } from "../../shade/renderer/extension/FramePhase.js";
20
+ import { RenderExtension } from "../../shade/renderer/extension/RenderExtension.js";
21
+ import { StandardShadeMaterial } from "../../shade/renderer/material/StandardShadeMaterial.js";
22
+ import { Mesh } from "../../shade/renderer/scene/Mesh.js";
23
+ import { GPUTerrainSplatRenderer } from "./terrain/GPUTerrainSplatRenderer.js";
24
+ import { pack_terrain_row_table } from "./terrain/pack_terrain_row_table.js";
25
+
26
+ /**
27
+ * Tile indices a frustum query answers with. Module-static because the query runs every frame and
28
+ * every terrain shares one shape of answer.
29
+ *
30
+ * @type {number[]}
31
+ */
32
+ const SCRATCH_TILE_INDICES = [];
33
+
34
+ /**
35
+ * What the overlay's sprite is until an authored one loads — the same white pixel the component's
36
+ * own default URL names, held as pixels so nothing has to decode a data URL to draw a grid.
37
+ *
38
+ * @type {Sampler2D}
39
+ */
40
+ const WHITE_SPRITE = Sampler2D.uint8(4, 1, 1);
41
+ WHITE_SPRITE.data.fill(255);
42
+
43
+ /**
44
+ * Draws terrain under Shade: each built tile becomes one meshlet-encoded mesh in the scene, and a
45
+ * pass after the opaque geometry textures the lot.
46
+ *
47
+ * **The tile is the unit, not the terrain.** Tiles are built on demand as the camera sees them and
48
+ * destroyed as it leaves, which is the streaming the tile manager already does; this system follows
49
+ * that with scene membership rather than deciding anything about it.
50
+ *
51
+ * **Tile vertices are already in terrain space** — the height-field builder positions each tile
52
+ * within the whole grid rather than at its own origin so every tile mesh carries the terrain
53
+ * entity's transform and nothing else. That is also why the tile's own raycast inverts the same
54
+ * matrix.
55
+ *
56
+ * **Texturing is a full-screen pass, not a material** (U3b, D40): the tiles draw with one flat
57
+ * material, and at {@link FramePhase.AfterGBuffer} the splat mix and grid overlay are painted over
58
+ * every pixel the visibility buffer attributes to a tile the architecture decals built (D23),
59
+ * keyed on mesh rows rather than froxels. Registered before `DecalSystem` in the profile, which
60
+ * is what puts scorch marks on top of the textured ground rather than under it.
61
+ *
62
+ * **It does not call `Terrain.link`.** That method binds a three `ShaderMaterial` through
63
+ * `graphics.getMaterialManager()`, which `GraphicsEngine` does not have and will not; the parts of
64
+ * linking that are not about three starting the tile build service — are done here directly.
65
+ */
66
+ export class TerrainSystem extends System {
67
+ dependencies = [Terrain];
68
+
69
+ /**
70
+ * @type {GraphicsEngine}
71
+ */
72
+ #graphics;
73
+
74
+ /**
75
+ * @type {RenderExtension|null}
76
+ */
77
+ #extension = null;
78
+
79
+ /**
80
+ * The scene this system writes into, received rather than created so terrain, meshes and lights
81
+ * all land in the one the facade draws.
82
+ *
83
+ * @type {Scene}
84
+ */
85
+ #scene;
86
+
87
+ /**
88
+ * @type {AssetManager}
89
+ */
90
+ #assetManager;
91
+
92
+ /**
93
+ * What each terrain entity has in the scene.
94
+ *
95
+ * @type {Map<number, {terrain: Terrain, material: StandardShadeMaterial, meshes: Map<TerrainTile, Mesh>, bindings: SignalBinding[]}>}
96
+ */
97
+ #entries = new Map();
98
+
99
+ /**
100
+ * @param {GraphicsEngine} graphics
101
+ * @param {Scene} scene
102
+ * @param {AssetManager} assetManager
103
+ */
104
+ constructor(graphics, scene, assetManager) {
105
+ super();
106
+
107
+ assert.defined(graphics, 'graphics');
108
+ assert.defined(scene, 'scene');
109
+ assert.defined(assetManager, 'assetManager');
110
+
111
+ this.#graphics = graphics;
112
+ this.#scene = scene;
113
+ this.#assetManager = assetManager;
114
+ }
115
+
116
+ async startup(entityManager) {
117
+ this.entityManager = entityManager;
118
+
119
+ this.#extension = this.#graphics.add_extension(new TerrainExtension(this));
120
+
121
+ // the terrain's own layer loading decodes images; the decoder is renderer-neutral and the
122
+ // legacy system registers the same one
123
+ await this.#assetManager.tryRegisterLoader(GameAssetType.Image, new ImageRGBADataLoader());
124
+ }
125
+
126
+ async shutdown(entityManager) {
127
+ if (this.#extension !== null) {
128
+ this.#graphics.remove_extension(this.#extension);
129
+
130
+ this.#extension = null;
131
+ }
132
+
133
+ for (const entity of Array.from(this.#entries.keys())) {
134
+ this.#drop(entity);
135
+ }
136
+ }
137
+
138
+ /**
139
+ * @param {Terrain} terrain
140
+ * @param {number} entity
141
+ */
142
+ link(terrain, entity) {
143
+ if (!terrain.getFlag(TerrainFlags.Built)) {
144
+ terrain.build(this.#assetManager);
145
+ }
146
+
147
+ const entry = {
148
+ terrain,
149
+ /*
150
+ One material for the whole terrain, and a flat one on purpose: the splat pass rewrites
151
+ the albedo after the G-buffer is drawn (U3b), so what the material contributes is the
152
+ other three channels roughness 1 and metalness 0, which is exactly what the legacy
153
+ splat shader forced.
154
+ */
155
+ material: new StandardShadeMaterial(),
156
+ meshes: new Map(),
157
+ bindings: [],
158
+ renderer: new GPUTerrainSplatRenderer(),
159
+ /**
160
+ * The pass's per-frame tables and settings, reused between frames.
161
+ */
162
+ rows: new Uint32Array(0),
163
+ scales: new Float32Array(0),
164
+ world_to_terrain: new Float32Array(16),
165
+ inv_world_size: new Float32Array(2),
166
+ grid_transform: new Float32Array(4),
167
+ grid_resolution: new Float32Array(2),
168
+ sprite: WHITE_SPRITE
169
+ };
170
+
171
+ entry.material.name = 'terrain';
172
+ entry.material.roughness_factor = 1;
173
+ entry.material.metallic_factor = 0;
174
+
175
+ this.#entries.set(entity, entry);
176
+
177
+ const manager = terrain.tiles;
178
+
179
+ const built = new SignalBinding(manager.on.tileBuilt, tile => this.#add_tile(entity, tile));
180
+ const destroyed = new SignalBinding(manager.on.tileDestroyed, tile => this.#remove_tile(entity, tile));
181
+ const sprite = new SignalBinding(terrain.overlay.tileImage.onChanged, () => this.#load_sprite(entity, terrain));
182
+
183
+ built.link();
184
+ destroyed.link();
185
+ sprite.link();
186
+
187
+ entry.bindings.push(built, destroyed, sprite);
188
+
189
+ this.#load_sprite(entity, terrain);
190
+
191
+ terrain.startBuildService();
192
+
193
+ // tiles that were already standing before this system saw the entity
194
+ for (const tile of manager.tiles) {
195
+ if (tile.isBuilt) {
196
+ this.#add_tile(entity, tile);
197
+ }
198
+ }
199
+ }
200
+
201
+ /**
202
+ * @param {Terrain} terrain
203
+ * @param {number} entity
204
+ */
205
+ unlink(terrain, entity) {
206
+ terrain.stopBuildService();
207
+
208
+ this.#drop(entity);
209
+ }
210
+
211
+ update(timeDelta) {
212
+ const em = this.entityManager;
213
+
214
+ if (em === null) {
215
+ return;
216
+ }
217
+
218
+ const ecd = em.dataset;
219
+
220
+ if (ecd === null) {
221
+ return;
222
+ }
223
+
224
+ ecd.traverseComponents(Terrain, (terrain, entity) => {
225
+ const transform = ecd.getComponent(entity, Transform64);
226
+
227
+ if (transform !== undefined) {
228
+ // the raycast inverts this to bring a ray into terrain space, so it has to track
229
+ // the entity whether or not anything is drawn
230
+ terrain.transform = transform.matrix;
231
+ }
232
+
233
+ this.#place(entity, transform);
234
+
235
+ this.#build_visible_tiles(terrain);
236
+ });
237
+ }
238
+
239
+ /**
240
+ * Ask for the tiles the camera can see. The manager owns what that costs — a tile already built
241
+ * or already building is not requested again.
242
+ *
243
+ * @param {Terrain} terrain
244
+ */
245
+ #build_visible_tiles(terrain) {
246
+ const camera = this.#graphics.camera.camera;
247
+
248
+ const manager = terrain.tiles;
249
+
250
+ const hit_count = bvh_query_user_data_intersects_frustum(
251
+ SCRATCH_TILE_INDICES, 0,
252
+ manager.bvh, camera.frustum
253
+ );
254
+
255
+ for (let i = 0; i < hit_count; i++) {
256
+ const tile = manager.tiles[SCRATCH_TILE_INDICES[i]];
257
+
258
+ if (tile.isBuilt || tile.isBuildInProgress) {
259
+ continue;
260
+ }
261
+
262
+ const position = tile.gridPosition;
263
+
264
+ manager.build(position.x, position.y, noop, noop);
265
+ }
266
+ }
267
+
268
+ /**
269
+ * @param {number} entity
270
+ * @param {TerrainTile} tile
271
+ */
272
+ #add_tile(entity, tile) {
273
+ const entry = this.#entries.get(entity);
274
+
275
+ if (entry === undefined) {
276
+ return;
277
+ }
278
+
279
+ if (entry.meshes.has(tile)) {
280
+ // a rebuilt tile replaces what it had rather than accumulating
281
+ this.#remove_tile(entity, tile);
282
+ }
283
+
284
+ const geometry = tile_geometry_to_meshlets({
285
+ vertices: tile.vertices,
286
+ normals: tile.normals,
287
+ uvs: tile.uvs,
288
+ indices: tile.indices
289
+ }, `terrain tile ${tile.gridPosition.x},${tile.gridPosition.y}`);
290
+
291
+ const mesh = Mesh.from(geometry, entry.material);
292
+
293
+ entry.meshes.set(tile, mesh);
294
+
295
+ this.#scene.add(mesh);
296
+
297
+ const ecd = this.entityManager === null ? null : this.entityManager.dataset;
298
+
299
+ if (ecd !== null) {
300
+ this.#place(entity, ecd.getComponent(entity, Transform64));
301
+ }
302
+ }
303
+
304
+ /**
305
+ * @param {number} entity
306
+ * @param {TerrainTile} tile
307
+ */
308
+ #remove_tile(entity, tile) {
309
+ const entry = this.#entries.get(entity);
310
+
311
+ if (entry === undefined) {
312
+ return;
313
+ }
314
+
315
+ const mesh = entry.meshes.get(tile);
316
+
317
+ if (mesh === undefined) {
318
+ return;
319
+ }
320
+
321
+ this.#scene.remove(mesh);
322
+
323
+ entry.meshes.delete(tile);
324
+ }
325
+
326
+ /**
327
+ * @param {number} entity
328
+ * @param {Transform64|undefined} transform
329
+ */
330
+ #place(entity, transform) {
331
+ if (transform === undefined) {
332
+ return;
333
+ }
334
+
335
+ const entry = this.#entries.get(entity);
336
+
337
+ if (entry === undefined) {
338
+ return;
339
+ }
340
+
341
+ for (const mesh of entry.meshes.values()) {
342
+ /*
343
+ A tile already standing where it belongs is left alone, and it is the common case:
344
+ {@link update} places on a poll rather than on the entity's transform signals, because a
345
+ terrain may be linked before it has a `Transform` at all. `updateMatrices` bumps a
346
+ version whether or not anything moved, and downstream that version is what makes the
347
+ scene database upload a row and the top-level acceleration structure rebuild itself
348
+ a whole-tree treelet optimisation and a fresh GPU buffer, once a frame, for a ground
349
+ that has not moved since the level loaded (E19).
350
+ */
351
+ if (t64_equals_components(mesh.transform_local, transform)) {
352
+ continue;
353
+ }
354
+
355
+ mesh.transform_local.copy(transform);
356
+
357
+ mesh.updateMatrices();
358
+ }
359
+ }
360
+
361
+ /**
362
+ * @param {number} entity
363
+ */
364
+ #drop(entity) {
365
+ const entry = this.#entries.get(entity);
366
+
367
+ if (entry === undefined) {
368
+ return;
369
+ }
370
+
371
+ for (let i = 0; i < entry.bindings.length; i++) {
372
+ entry.bindings[i].unlink();
373
+ }
374
+
375
+ for (const mesh of entry.meshes.values()) {
376
+ this.#scene.remove(mesh);
377
+ }
378
+
379
+ entry.renderer.destroy();
380
+
381
+ this.#entries.delete(entity);
382
+ }
383
+
384
+ /**
385
+ * Fetch the overlay's cell sprite. The default is the white pixel the component names by data
386
+ * URL, held here as pixels a grid with no authored sprite is the cell colours themselves,
387
+ * and nothing decodes a data URL to get there.
388
+ *
389
+ * @param {number} entity
390
+ * @param {Terrain} terrain
391
+ */
392
+ #load_sprite(entity, terrain) {
393
+ const entry = this.#entries.get(entity);
394
+
395
+ if (entry === undefined) {
396
+ return;
397
+ }
398
+
399
+ const url = terrain.overlay.baseTileImage;
400
+
401
+ if (url === WHITE_PIXEL_DATA_URL) {
402
+ entry.sprite = WHITE_SPRITE;
403
+
404
+ return;
405
+ }
406
+
407
+ this.#assetManager.promise(url, GameAssetType.Image).then(asset => {
408
+ if (this.#entries.get(entity) !== entry || terrain.overlay.baseTileImage !== url) {
409
+ // unlinked, or re-authored while the image was in flight
410
+ return;
411
+ }
412
+
413
+ entry.sprite = sampler2d_ensure_uint8_RGBA(asset.create());
414
+ });
415
+ }
416
+
417
+ /**
418
+ * Everything the splat pass draws one terrain from, assembled against the scene that will be
419
+ * asked for the rows. What the pass consumes and what a gate inspects are deliberately the
420
+ * same object the same reason `DecalSystem` exposes its packed records.
421
+ *
422
+ * @param {number} entity
423
+ * @param {GPUSceneContext} scene
424
+ * @returns {object|null} `null` when this terrain has nothing on screen to texture — no tiles
425
+ * built, or none of them in the scene database yet
426
+ */
427
+ splat_frame(entity, scene) {
428
+ const entry = this.#entries.get(entity);
429
+
430
+ if (entry === undefined || entry.meshes.size === 0) {
431
+ return null;
432
+ }
433
+
434
+ const packed = pack_terrain_row_table({ meshes: entry.meshes, scene, table: entry.rows });
435
+
436
+ entry.rows = packed.table;
437
+
438
+ if (packed.size === 0) {
439
+ return null;
440
+ }
441
+
442
+ const terrain = entry.terrain;
443
+
444
+ const invertible = m4_invert(entry.world_to_terrain, terrain.transform);
445
+
446
+ assert.equal(invertible, true, 'terrain transform is not invertible');
447
+
448
+ const world_x = terrain.size.x * terrain.gridScale;
449
+ const world_y = terrain.size.y * terrain.gridScale;
450
+
451
+ entry.inv_world_size[0] = 1 / world_x;
452
+ entry.inv_world_size[1] = 1 / world_y;
453
+
454
+ const grid_transform = terrain.gridTransform;
455
+
456
+ entry.grid_transform[0] = grid_transform.scale_x;
457
+ entry.grid_transform[1] = grid_transform.scale_y;
458
+ entry.grid_transform[2] = grid_transform.offset_x;
459
+ entry.grid_transform[3] = grid_transform.offset_y;
460
+
461
+ entry.grid_resolution[0] = terrain.size.x;
462
+ entry.grid_resolution[1] = terrain.size.y;
463
+
464
+ const layers = terrain.layers;
465
+ const layer_count = layers.count();
466
+
467
+ if (entry.scales.length < layer_count * 2) {
468
+ entry.scales = new Float32Array(layer_count * 2);
469
+ }
470
+
471
+ // the legacy `updateLayerScales`, computed at the source instead of read off a texture
472
+ for (let i = 0; i < layer_count; i++) {
473
+ const layer = layers.get(i);
474
+
475
+ entry.scales[i * 2] = world_x / layer.size.x;
476
+ entry.scales[i * 2 + 1] = world_y / layer.size.y;
477
+ }
478
+
479
+ const splat = terrain.splat;
480
+ const layer_image = layers.sampler;
481
+
482
+ if (layer_count > 0) {
483
+ // `Terrain.build` and `addLayer` keep all three in step; a mismatch is an upstream bug
484
+ // that would draw the wrong layer, silently
485
+ assert.equal(splat.depth, layer_count, 'splat weight layers disagree with the layer list');
486
+ assert.equal(layer_image.depth, layer_count, 'layer texture depth disagrees with the layer list');
487
+ }
488
+
489
+ return {
490
+ rows: entry.rows,
491
+ row_count: packed.size,
492
+ scales: entry.scales,
493
+ layer_count,
494
+ world_to_terrain: entry.world_to_terrain,
495
+ inv_world_size: entry.inv_world_size,
496
+ grid_transform: entry.grid_transform,
497
+ grid_resolution: entry.grid_resolution,
498
+ weights: {
499
+ data: splat.weightData,
500
+ width: splat.size.x,
501
+ height: splat.size.y,
502
+ depth: splat.depth,
503
+ version: splat.weights.version
504
+ },
505
+ layer_image: {
506
+ data: layer_image.data,
507
+ width: layer_image.width,
508
+ height: layer_image.height,
509
+ depth: layer_image.depth,
510
+ version: layer_image.version
511
+ },
512
+ overlay: terrain.overlay.sampler,
513
+ sprite: entry.sprite
514
+ };
515
+ }
516
+
517
+ /**
518
+ * @param {FrameContext} frame
519
+ */
520
+ record(frame) {
521
+ for (const entity of this.#entries.keys()) {
522
+ const splat = this.splat_frame(entity, frame.view.scene);
523
+
524
+ if (splat === null) {
525
+ // nothing of this terrain on screen; the frame keeps the albedo it already had
526
+ continue;
527
+ }
528
+
529
+ splat.frame = frame;
530
+
531
+ this.#entries.get(entity).renderer.graph_draw(splat);
532
+ }
533
+ }
534
+ }
535
+
536
+ /**
537
+ * The splat and the grid overlay are a full-screen pass writing a replacement albedo, so this is
538
+ * {@link FramePhase.AfterGBuffer} the one phase where the G-buffer may be published into.
539
+ *
540
+ * Everything that paints on top of the ground declares itself after this rather than being
541
+ * registered after it; {@link DecalExtension} is the one that does.
542
+ */
543
+ export class TerrainExtension extends RenderExtension {
544
+ name = "terrain";
545
+
546
+ phase = FramePhase.AfterGBuffer;
547
+
548
+ /**
549
+ * @type {TerrainSystem}
550
+ */
551
+ #system;
552
+
553
+ /**
554
+ * @param {TerrainSystem} system
555
+ */
556
+ constructor(system) {
557
+ super();
558
+
559
+ this.#system = system;
560
+ }
561
+
562
+ record(frame) {
563
+ this.#system.record(frame);
564
+ }
565
+ }