@woosh/meep-engine 3.14.4 → 3.14.6

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 (717) hide show
  1. package/README.md +6 -0
  2. package/editor/Editor.d.ts +162 -0
  3. package/editor/Editor.d.ts.map +1 -0
  4. package/editor/EditorCameraNavigation.d.ts +22 -0
  5. package/editor/EditorCameraNavigation.d.ts.map +1 -0
  6. package/editor/EditorKeyMap.d.ts +28 -0
  7. package/editor/EditorKeyMap.d.ts.map +1 -0
  8. package/editor/SelectionVisualizer.d.ts +37 -0
  9. package/editor/SelectionVisualizer.d.ts.map +1 -0
  10. package/editor/actions/concrete/ActionInvalidateSampler.d.ts +18 -0
  11. package/editor/actions/concrete/ActionInvalidateSampler.d.ts.map +1 -0
  12. package/editor/actions/concrete/ActionUpdateTexture.d.ts +12 -0
  13. package/editor/actions/concrete/ActionUpdateTexture.d.ts.map +1 -0
  14. package/editor/actions/concrete/ActionUpdateTexture.js +1 -1
  15. package/editor/actions/concrete/ArrayCopyAction.d.ts +20 -0
  16. package/editor/actions/concrete/ArrayCopyAction.d.ts.map +1 -0
  17. package/editor/actions/concrete/ComponentAddAction.d.ts +15 -0
  18. package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -0
  19. package/editor/actions/concrete/ComponentRemoveAction.d.ts +11 -0
  20. package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -0
  21. package/editor/actions/concrete/EntityCreateAction.d.ts +18 -0
  22. package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -0
  23. package/editor/actions/concrete/EntityRemoveAction.d.ts +11 -0
  24. package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -0
  25. package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts +47 -0
  26. package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts.map +1 -0
  27. package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts +38 -0
  28. package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts.map +1 -0
  29. package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts +23 -0
  30. package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts.map +1 -0
  31. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +32 -0
  32. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -0
  33. package/editor/actions/concrete/SelectionAddAction.d.ts +19 -0
  34. package/editor/actions/concrete/SelectionAddAction.d.ts.map +1 -0
  35. package/editor/actions/concrete/SelectionClearAction.d.ts +9 -0
  36. package/editor/actions/concrete/SelectionClearAction.d.ts.map +1 -0
  37. package/editor/actions/concrete/SelectionRemoveAction.d.ts +10 -0
  38. package/editor/actions/concrete/SelectionRemoveAction.d.ts.map +1 -0
  39. package/editor/actions/concrete/TransformModifyAction.d.ts +17 -0
  40. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -0
  41. package/editor/actions/concrete/WriteGridValueAction.d.ts +14 -0
  42. package/editor/actions/concrete/WriteGridValueAction.d.ts.map +1 -0
  43. package/editor/camera/camera_framing.d.ts +33 -0
  44. package/editor/camera/camera_framing.d.ts.map +1 -0
  45. package/editor/clipboard.d.ts +19 -0
  46. package/editor/clipboard.d.ts.map +1 -0
  47. package/editor/ecs/EditorEntity.d.ts +16 -0
  48. package/editor/ecs/EditorEntity.d.ts.map +1 -0
  49. package/editor/ecs/EditorEntitySystem.d.ts +8 -0
  50. package/editor/ecs/EditorEntitySystem.d.ts.map +1 -0
  51. package/editor/ecs/component/TypeEditor.d.ts +7 -1
  52. package/editor/ecs/component/TypeEditor.d.ts.map +1 -1
  53. package/editor/ecs/component/TypeEditor.js +5 -0
  54. package/editor/ecs/component/editors/ColorEditor.d.ts +7 -0
  55. package/editor/ecs/component/editors/ColorEditor.d.ts.map +1 -0
  56. package/editor/ecs/component/editors/HTMLElementEditor.d.ts +7 -0
  57. package/editor/ecs/component/editors/HTMLElementEditor.d.ts.map +1 -0
  58. package/editor/ecs/component/editors/ImagePathEditor.d.ts +7 -0
  59. package/editor/ecs/component/editors/ImagePathEditor.d.ts.map +1 -0
  60. package/editor/ecs/component/editors/LargeStringEditor.d.ts +16 -0
  61. package/editor/ecs/component/editors/LargeStringEditor.d.ts.map +1 -0
  62. package/editor/ecs/component/editors/NumericIntervalEditor.d.ts +7 -0
  63. package/editor/ecs/component/editors/NumericIntervalEditor.d.ts.map +1 -0
  64. package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts +7 -0
  65. package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts.map +1 -0
  66. package/editor/ecs/component/editors/ObservedEnumEditor.d.ts +7 -0
  67. package/editor/ecs/component/editors/ObservedEnumEditor.d.ts.map +1 -0
  68. package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts +7 -0
  69. package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts.map +1 -0
  70. package/editor/ecs/component/editors/ObservedStringEditor.d.ts +7 -0
  71. package/editor/ecs/component/editors/ObservedStringEditor.d.ts.map +1 -0
  72. package/editor/ecs/component/editors/Sampler2DEditor.d.ts +7 -0
  73. package/editor/ecs/component/editors/Sampler2DEditor.d.ts.map +1 -0
  74. package/editor/ecs/component/editors/collection/ListEditor.d.ts +8 -0
  75. package/editor/ecs/component/editors/collection/ListEditor.d.ts.map +1 -0
  76. package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts +12 -0
  77. package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts.map +1 -0
  78. package/editor/ecs/component/editors/common/EnumEditor.d.ts +8 -0
  79. package/editor/ecs/component/editors/common/EnumEditor.d.ts.map +1 -0
  80. package/editor/ecs/component/editors/common/makeV3_editor.d.ts +15 -0
  81. package/editor/ecs/component/editors/common/makeV3_editor.d.ts.map +1 -0
  82. package/editor/ecs/component/editors/common/noEditor.d.ts +3 -0
  83. package/editor/ecs/component/editors/common/noEditor.d.ts.map +1 -0
  84. package/editor/ecs/component/editors/common/two_way_sync.d.ts +22 -0
  85. package/editor/ecs/component/editors/common/two_way_sync.d.ts.map +1 -0
  86. package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts +7 -0
  87. package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts.map +1 -0
  88. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts +14 -0
  89. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts.map +1 -0
  90. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts +20 -0
  91. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts.map +1 -0
  92. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts +12 -0
  93. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts.map +1 -0
  94. package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts +14 -0
  95. package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts.map +1 -0
  96. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts +52 -0
  97. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts.map +1 -0
  98. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts +47 -0
  99. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts.map +1 -0
  100. package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts +21 -0
  101. package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts.map +1 -0
  102. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts +26 -0
  103. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts.map +1 -0
  104. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts +16 -0
  105. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts.map +1 -0
  106. package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts +15 -0
  107. package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts.map +1 -0
  108. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +42 -0
  109. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -0
  110. package/editor/ecs/component/editors/ecs/TransformEditor.d.ts +20 -0
  111. package/editor/ecs/component/editors/ecs/TransformEditor.d.ts.map +1 -0
  112. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts +8 -0
  113. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts.map +1 -0
  114. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts +19 -0
  115. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts.map +1 -0
  116. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts +27 -0
  117. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts.map +1 -0
  118. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts +16 -0
  119. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts.map +1 -0
  120. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts +19 -0
  121. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts.map +1 -0
  122. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts +18 -0
  123. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts.map +1 -0
  124. package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts +6 -0
  125. package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts.map +1 -0
  126. package/editor/ecs/component/editors/geom/Vector1Editor.d.ts +7 -0
  127. package/editor/ecs/component/editors/geom/Vector1Editor.d.ts.map +1 -0
  128. package/editor/ecs/component/editors/geom/Vector2Editor.d.ts +6 -0
  129. package/editor/ecs/component/editors/geom/Vector2Editor.d.ts.map +1 -0
  130. package/editor/ecs/component/editors/geom/Vector3Editor.d.ts +6 -0
  131. package/editor/ecs/component/editors/geom/Vector3Editor.d.ts.map +1 -0
  132. package/editor/ecs/component/editors/geom/Vector4Editor.d.ts +6 -0
  133. package/editor/ecs/component/editors/geom/Vector4Editor.d.ts.map +1 -0
  134. package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts +8 -0
  135. package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts.map +1 -0
  136. package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts +7 -0
  137. package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts.map +1 -0
  138. package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts +7 -0
  139. package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts.map +1 -0
  140. package/editor/ecs/component/editors/primitive/NumberEditor.d.ts +8 -0
  141. package/editor/ecs/component/editors/primitive/NumberEditor.d.ts.map +1 -0
  142. package/editor/ecs/component/editors/primitive/StringEditor.d.ts +7 -0
  143. package/editor/ecs/component/editors/primitive/StringEditor.d.ts.map +1 -0
  144. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts +28 -0
  145. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts.map +1 -0
  146. package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts +29 -0
  147. package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts.map +1 -0
  148. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts +28 -0
  149. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts.map +1 -0
  150. package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts +41 -0
  151. package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts.map +1 -0
  152. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts +31 -0
  153. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts.map +1 -0
  154. package/editor/ecs/component/prototypeObjectEditor.d.ts +2 -0
  155. package/editor/ecs/component/prototypeObjectEditor.d.ts.map +1 -0
  156. package/editor/ecs/component/registerBasicTypeEditors.d.ts +11 -0
  157. package/editor/ecs/component/registerBasicTypeEditors.d.ts.map +1 -0
  158. package/editor/ecs/component/registerEngineComponentEditors.d.ts +8 -0
  159. package/editor/ecs/component/registerEngineComponentEditors.d.ts.map +1 -0
  160. package/editor/enableEditor.d.ts +14 -0
  161. package/editor/enableEditor.d.ts.map +1 -0
  162. package/editor/entity_world_bounds.d.ts +17 -0
  163. package/editor/entity_world_bounds.d.ts.map +1 -0
  164. package/editor/library/MeshLibrary.d.ts +13 -0
  165. package/editor/library/MeshLibrary.d.ts.map +1 -0
  166. package/editor/particles/lut_ops.d.ts +34 -0
  167. package/editor/particles/lut_ops.d.ts.map +1 -0
  168. package/editor/particles/particleEditEvents.d.ts +11 -0
  169. package/editor/particles/particleEditEvents.d.ts.map +1 -0
  170. package/editor/particles/rebuildParticleEmitter.d.ts +11 -0
  171. package/editor/particles/rebuildParticleEmitter.d.ts.map +1 -0
  172. package/editor/persistence/EditorLayoutStore.d.ts +30 -0
  173. package/editor/persistence/EditorLayoutStore.d.ts.map +1 -0
  174. package/editor/persistence/SceneMetadata.d.ts +38 -0
  175. package/editor/persistence/SceneMetadata.d.ts.map +1 -0
  176. package/editor/persistence/SceneSlotManager.d.ts +40 -0
  177. package/editor/persistence/SceneSlotManager.d.ts.map +1 -0
  178. package/editor/persistence/buildNewSceneDataset.d.ts +10 -0
  179. package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -0
  180. package/editor/persistence/files.d.ts +24 -0
  181. package/editor/persistence/files.d.ts.map +1 -0
  182. package/editor/persistence/scene_import.d.ts +45 -0
  183. package/editor/persistence/scene_import.d.ts.map +1 -0
  184. package/editor/persistence/scene_serialization.d.ts +36 -0
  185. package/editor/persistence/scene_serialization.d.ts.map +1 -0
  186. package/editor/persistence/string_buffer_codec.d.ts +20 -0
  187. package/editor/persistence/string_buffer_codec.d.ts.map +1 -0
  188. package/editor/process/DisableGameUIProcess.d.ts +8 -0
  189. package/editor/process/DisableGameUIProcess.d.ts.map +1 -0
  190. package/editor/process/EditorProcess.d.ts +19 -0
  191. package/editor/process/EditorProcess.d.ts.map +1 -0
  192. package/editor/process/GridDisplayProcess.d.ts +35 -0
  193. package/editor/process/GridDisplayProcess.d.ts.map +1 -0
  194. package/editor/process/ObstacleGridDisplayProcess.d.ts +13 -0
  195. package/editor/process/ObstacleGridDisplayProcess.d.ts.map +1 -0
  196. package/editor/process/ParticleEmitterRebuildProcess.d.ts +66 -0
  197. package/editor/process/ParticleEmitterRebuildProcess.d.ts.map +1 -0
  198. package/editor/process/ProcessEngine.d.ts +30 -0
  199. package/editor/process/ProcessEngine.d.ts.map +1 -0
  200. package/editor/process/SymbolicDisplayProcess.d.ts +23 -0
  201. package/editor/process/SymbolicDisplayProcess.d.ts.map +1 -0
  202. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts +17 -0
  203. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts.map +1 -0
  204. package/editor/process/symbolic/CameraSymbolicDisplay.d.ts +25 -0
  205. package/editor/process/symbolic/CameraSymbolicDisplay.d.ts.map +1 -0
  206. package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts +19 -0
  207. package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts.map +1 -0
  208. package/editor/process/symbolic/LightSymbolicDisplay.d.ts +19 -0
  209. package/editor/process/symbolic/LightSymbolicDisplay.d.ts.map +1 -0
  210. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts +18 -0
  211. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -0
  212. package/editor/process/symbolic/PathSymbolicDisplay.d.ts +20 -0
  213. package/editor/process/symbolic/PathSymbolicDisplay.d.ts.map +1 -0
  214. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts +25 -0
  215. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts.map +1 -0
  216. package/editor/process/symbolic/SymbolicDisplay.d.ts +48 -0
  217. package/editor/process/symbolic/SymbolicDisplay.d.ts.map +1 -0
  218. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts +13 -0
  219. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts.map +1 -0
  220. package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts +18 -0
  221. package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts.map +1 -0
  222. package/editor/prototypeEditorShell.d.ts +13 -0
  223. package/editor/prototypeEditorShell.d.ts.map +1 -0
  224. package/editor/selection/editor_pick.d.ts +43 -0
  225. package/editor/selection/editor_pick.d.ts.map +1 -0
  226. package/editor/selection/screen_rect_frustum.d.ts +32 -0
  227. package/editor/selection/screen_rect_frustum.d.ts.map +1 -0
  228. package/editor/templates/entity_templates.d.ts +19 -0
  229. package/editor/templates/entity_templates.d.ts.map +1 -0
  230. package/editor/tools/GridPaintTool.d.ts +18 -0
  231. package/editor/tools/GridPaintTool.d.ts.map +1 -0
  232. package/editor/tools/SelectionTool.d.ts +38 -0
  233. package/editor/tools/SelectionTool.d.ts.map +1 -0
  234. package/editor/tools/SelectionTool.js +2 -2
  235. package/editor/tools/TransformToolV2.d.ts +70 -0
  236. package/editor/tools/TransformToolV2.d.ts.map +1 -0
  237. package/editor/tools/engine/Tool.d.ts +88 -0
  238. package/editor/tools/engine/Tool.d.ts.map +1 -0
  239. package/editor/tools/engine/ToolEngine.d.ts +22 -0
  240. package/editor/tools/engine/ToolEngine.d.ts.map +1 -0
  241. package/editor/tools/engine/ToolState.d.ts +7 -0
  242. package/editor/tools/engine/ToolState.d.ts.map +1 -0
  243. package/editor/tools/paint/TerrainHeightPaintTool.d.ts +18 -0
  244. package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -0
  245. package/editor/tools/paint/TerrainPaintTool.d.ts +82 -0
  246. package/editor/tools/paint/TerrainPaintTool.d.ts.map +1 -0
  247. package/editor/tools/paint/TerrainTexturePaintTool.d.ts +19 -0
  248. package/editor/tools/paint/TerrainTexturePaintTool.d.ts.map +1 -0
  249. package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts +139 -0
  250. package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts.map +1 -0
  251. package/editor/tools/v2/GizmoNode.d.ts +21 -0
  252. package/editor/tools/v2/GizmoNode.d.ts.map +1 -0
  253. package/editor/tools/v2/TransformControls.d.ts +219 -0
  254. package/editor/tools/v2/TransformControls.d.ts.map +1 -0
  255. package/editor/tools/v2/TransformMode.d.ts +7 -0
  256. package/editor/tools/v2/TransformMode.d.ts.map +1 -0
  257. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts +37 -0
  258. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -0
  259. package/editor/tools/v2/handle/gizmo_draw.d.ts +14 -0
  260. package/editor/tools/v2/handle/gizmo_draw.d.ts.map +1 -0
  261. package/editor/tools/v2/handle/gizmo_handles.d.ts +160 -0
  262. package/editor/tools/v2/handle/gizmo_handles.d.ts.map +1 -0
  263. package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts +103 -0
  264. package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts.map +1 -0
  265. package/editor/view/GridPickCoordinateView.d.ts +22 -0
  266. package/editor/view/GridPickCoordinateView.d.ts.map +1 -0
  267. package/editor/view/ecs/ComponentControlView.d.ts +24 -0
  268. package/editor/view/ecs/ComponentControlView.d.ts.map +1 -0
  269. package/editor/view/ecs/EntityEditor.d.ts +25 -0
  270. package/editor/view/ecs/EntityEditor.d.ts.map +1 -0
  271. package/editor/view/ecs/EntityList.d.ts +22 -0
  272. package/editor/view/ecs/EntityList.d.ts.map +1 -0
  273. package/editor/view/ecs/HierarchicalEntityListView.d.ts +25 -0
  274. package/editor/view/ecs/HierarchicalEntityListView.d.ts.map +1 -0
  275. package/editor/view/ecs/components/DatGuiController.d.ts +2 -0
  276. package/editor/view/ecs/components/DatGuiController.d.ts.map +1 -0
  277. package/editor/view/ecs/components/color/GaugeView.d.ts +9 -5
  278. package/editor/view/ecs/components/color/GaugeView.d.ts.map +1 -1
  279. package/editor/view/ecs/components/color/GaugeView.js +4 -4
  280. package/editor/view/ecs/components/common/NumberController.d.ts +9 -5
  281. package/editor/view/ecs/components/common/NumberController.d.ts.map +1 -1
  282. package/editor/view/ecs/components/common/NumberController.js +4 -4
  283. package/editor/view/ecs/components/common/NumericIntervalController.d.ts +10 -0
  284. package/editor/view/ecs/components/common/NumericIntervalController.d.ts.map +1 -0
  285. package/editor/view/ecs/components/common/TextController.d.ts.map +1 -1
  286. package/editor/view/library/MeshLibraryView.d.ts +16 -0
  287. package/editor/view/library/MeshLibraryView.d.ts.map +1 -0
  288. package/editor/view/library/mesh_library_drag.d.ts +21 -0
  289. package/editor/view/library/mesh_library_drag.d.ts.map +1 -0
  290. package/editor/view/library/model_thumbnail_source.d.ts +12 -0
  291. package/editor/view/library/model_thumbnail_source.d.ts.map +1 -0
  292. package/editor/view/makeEntityDecorators.d.ts +6 -0
  293. package/editor/view/makeEntityDecorators.d.ts.map +1 -0
  294. package/editor/view/node-graph/NodeGraphCamera.d.ts.map +1 -1
  295. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  296. package/editor/view/node-graph/NodeGraphSelection.d.ts.map +1 -1
  297. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  298. package/editor/view/node-graph/NodeView.d.ts.map +1 -1
  299. package/editor/view/node-graph/PortView.d.ts.map +1 -1
  300. package/editor/view/node-graph/actions/ConnectionCreateAction.d.ts.map +1 -1
  301. package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
  302. package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
  303. package/editor/view/node-graph/actions/NodeParameterSetAction.d.ts.map +1 -1
  304. package/editor/view/node-graph/actions/NodesMoveAction.d.ts.map +1 -1
  305. package/editor/view/node-graph/actions/SelectionSetAction.d.ts.map +1 -1
  306. package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
  307. package/editor/view/particles/ColorLutGradientView.d.ts +19 -0
  308. package/editor/view/particles/ColorLutGradientView.d.ts.map +1 -0
  309. package/editor/view/particles/ScalarLutCurveView.d.ts +19 -0
  310. package/editor/view/particles/ScalarLutCurveView.d.ts.map +1 -0
  311. package/editor/view/prepareMeshLibrary.d.ts +7 -0
  312. package/editor/view/prepareMeshLibrary.d.ts.map +1 -0
  313. package/editor/view/process/ProcessView.d.ts +14 -0
  314. package/editor/view/process/ProcessView.d.ts.map +1 -0
  315. package/editor/view/shell/EditorShellView.d.ts +18 -0
  316. package/editor/view/shell/EditorShellView.d.ts.map +1 -0
  317. package/editor/view/shell/SceneTreePanelView.d.ts +17 -0
  318. package/editor/view/shell/SceneTreePanelView.d.ts.map +1 -0
  319. package/editor/view/shell/ViewportPanelView.d.ts +18 -0
  320. package/editor/view/shell/ViewportPanelView.d.ts.map +1 -0
  321. package/editor/view/tools/ToolSettingsView.d.ts +22 -0
  322. package/editor/view/tools/ToolSettingsView.d.ts.map +1 -0
  323. package/editor/view/tools/ToolView.d.ts +13 -0
  324. package/editor/view/tools/ToolView.d.ts.map +1 -0
  325. package/editor/view/v2/SplitView.d.ts +2 -0
  326. package/editor/view/v2/SplitView.d.ts.map +1 -0
  327. package/package.json +9 -11
  328. package/samples/engine/README.md +113 -0
  329. package/samples/engine/first-scene/index.html +32 -0
  330. package/samples/engine/first-scene/main.js +152 -0
  331. package/src/core/assert.d.ts +2 -2
  332. package/src/core/binary/BitSet.d.ts +2 -2
  333. package/src/core/binary/BitSet.d.ts.map +1 -1
  334. package/src/core/binary/BitSet.js +1 -1
  335. package/src/core/bvh2/bvh3/BVH.d.ts +4 -0
  336. package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
  337. package/src/core/bvh2/bvh3/BVH.js +4 -0
  338. package/src/core/bvh2/bvh3/BvhClient.d.ts +4 -0
  339. package/src/core/bvh2/bvh3/BvhClient.d.ts.map +1 -1
  340. package/src/core/bvh2/bvh3/BvhClient.js +4 -0
  341. package/src/core/collection/array/array_sort_quick.d.ts +1 -1
  342. package/src/core/collection/list/List.d.ts +7 -3
  343. package/src/core/collection/list/List.d.ts.map +1 -1
  344. package/src/core/collection/list/List.js +6 -2
  345. package/src/core/collection/table/RowFirstTableSpec.d.ts.map +1 -1
  346. package/src/core/collection/table/RowFirstTableSpec.js +0 -4
  347. package/src/core/color/Color.d.ts +1 -0
  348. package/src/core/color/Color.d.ts.map +1 -1
  349. package/src/core/color/Color.js +4 -0
  350. package/src/core/events/signal/SignalBinding.d.ts +4 -0
  351. package/src/core/events/signal/SignalBinding.d.ts.map +1 -1
  352. package/src/core/events/signal/SignalBinding.js +4 -0
  353. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts +5 -1
  354. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
  355. package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +4 -0
  356. package/src/core/geom/3d/SurfacePoint3.d.ts +2 -2
  357. package/src/core/geom/3d/SurfacePoint3.d.ts.map +1 -1
  358. package/src/core/geom/3d/SurfacePoint3.js +1 -1
  359. package/src/core/geom/3d/aabb/AABB3.d.ts +63 -7
  360. package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
  361. package/src/core/geom/3d/aabb/AABB3.js +17 -3
  362. package/src/core/geom/3d/mat4/m4_rigidity_defect.d.ts +30 -0
  363. package/src/core/geom/3d/mat4/m4_rigidity_defect.d.ts.map +1 -0
  364. package/src/core/geom/3d/mat4/m4_rigidity_defect.js +71 -0
  365. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +2 -2
  366. package/src/core/geom/3d/ray/Ray3.d.ts +4 -4
  367. package/src/core/geom/3d/shape/AbstractShape3D.d.ts +10 -3
  368. package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
  369. package/src/core/geom/3d/shape/AbstractShape3D.js +9 -2
  370. package/src/core/geom/3d/shape/TransformedShape3D.d.ts +2 -2
  371. package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +1 -1
  372. package/src/core/geom/Vector1.d.ts +4 -0
  373. package/src/core/geom/Vector1.d.ts.map +1 -1
  374. package/src/core/geom/Vector1.js +4 -0
  375. package/src/core/geom/Vector2.d.ts +4 -0
  376. package/src/core/geom/Vector2.d.ts.map +1 -1
  377. package/src/core/geom/Vector2.js +4 -0
  378. package/src/core/geom/Vector3.d.ts +4 -0
  379. package/src/core/geom/Vector3.d.ts.map +1 -1
  380. package/src/core/geom/Vector3.js +4 -0
  381. package/src/core/geom/Vector4.d.ts +4 -0
  382. package/src/core/geom/Vector4.d.ts.map +1 -1
  383. package/src/core/geom/Vector4.js +4 -0
  384. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts +6 -2
  385. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts.map +1 -1
  386. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +4 -0
  387. package/src/core/geom/packing/miniball/Subspan.d.ts +4 -4
  388. package/src/core/geom/packing/miniball/Subspan.d.ts.map +1 -1
  389. package/src/core/geom/packing/miniball/Subspan.js +2 -2
  390. package/src/core/math/interval/NumericInterval.d.ts +4 -0
  391. package/src/core/math/interval/NumericInterval.d.ts.map +1 -1
  392. package/src/core/math/interval/NumericInterval.js +4 -0
  393. package/src/core/math/random/roundFair.d.ts +2 -2
  394. package/src/core/math/random/roundFair.d.ts.map +1 -1
  395. package/src/core/math/random/roundFair.js +1 -1
  396. package/src/core/model/BoundedValue.d.ts +4 -0
  397. package/src/core/model/BoundedValue.d.ts.map +1 -1
  398. package/src/core/model/BoundedValue.js +4 -0
  399. package/src/core/model/ObservedBoolean.d.ts +4 -0
  400. package/src/core/model/ObservedBoolean.d.ts.map +1 -1
  401. package/src/core/model/ObservedBoolean.js +4 -0
  402. package/src/core/model/ObservedInteger.d.ts +4 -0
  403. package/src/core/model/ObservedInteger.d.ts.map +1 -1
  404. package/src/core/model/ObservedInteger.js +4 -0
  405. package/src/core/model/ObservedString.d.ts +4 -0
  406. package/src/core/model/ObservedString.d.ts.map +1 -1
  407. package/src/core/model/ObservedString.js +4 -0
  408. package/src/core/model/stat/Stat.d.ts +7 -3
  409. package/src/core/model/stat/Stat.d.ts.map +1 -1
  410. package/src/core/model/stat/Stat.js +4 -0
  411. package/src/engine/Engine.d.ts.map +1 -1
  412. package/src/engine/Engine.js +65 -0
  413. package/src/engine/EngineHarness.d.ts +8 -1
  414. package/src/engine/EngineHarness.d.ts.map +1 -1
  415. package/src/engine/EngineHarness.js +10 -14
  416. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts +2 -2
  417. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
  418. package/src/engine/animation/clip/ecd_bind_animation_curve.js +4 -4
  419. package/src/engine/asset/loaders/async_traverse_three_object.d.ts +2 -2
  420. package/src/engine/asset/loaders/async_traverse_three_object.d.ts.map +1 -1
  421. package/src/engine/asset/loaders/async_traverse_three_object.js +1 -1
  422. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +7 -3
  423. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
  424. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +33 -3
  425. package/src/engine/control/first-person/DESIGN.md +20 -2
  426. package/src/engine/control/first-person/DESIGN_COLLISION.md +17 -0
  427. package/src/engine/control/first-person/collision/KinematicMover.d.ts +58 -11
  428. package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
  429. package/src/engine/control/first-person/collision/KinematicMover.js +97 -20
  430. package/src/engine/ecs/Entity.js +1 -1
  431. package/src/engine/ecs/EntityComponentDataset.d.ts +2 -2
  432. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  433. package/src/engine/ecs/EntityComponentDataset.js +1 -1
  434. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  435. package/src/engine/ecs/EntityManager.js +27 -3
  436. package/src/engine/ecs/animation/Animation.d.ts +17 -3
  437. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  438. package/src/engine/ecs/animation/Animation.js +26 -6
  439. package/src/engine/ecs/terrain/TerrainPreview.d.ts +4 -0
  440. package/src/engine/ecs/terrain/TerrainPreview.d.ts.map +1 -1
  441. package/src/engine/ecs/terrain/TerrainPreview.js +4 -0
  442. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +4 -4
  443. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  444. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +2 -2
  445. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts +3 -2
  446. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts.map +1 -1
  447. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.js +25 -2
  448. package/src/engine/ecs/transform/Transform64.d.ts +4 -4
  449. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  450. package/src/engine/ecs/transform/Transform64.js +2 -2
  451. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +26 -0
  452. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  453. package/src/engine/graphics/ecs/decal/v2/Decal.js +26 -0
  454. package/src/engine/graphics/ecs/light/Light.d.ts +38 -1
  455. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  456. package/src/engine/graphics/ecs/light/Light.js +51 -1
  457. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +3 -3
  458. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +1 -1
  459. package/src/engine/graphics/ecs/mesh/copyToVector3.js +2 -2
  460. package/src/engine/graphics/ecs/mesh/setMesh.d.ts +2 -2
  461. package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +1 -1
  462. package/src/engine/graphics/ecs/mesh/setMesh.js +1 -1
  463. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +2 -2
  464. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +1 -1
  465. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
  466. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +3 -3
  467. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +1 -1
  468. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +2 -2
  469. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +2 -2
  470. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +1 -1
  471. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +1 -1
  472. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +2 -2
  473. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +1 -1
  474. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +1 -1
  475. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts +2 -2
  476. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts.map +1 -1
  477. package/src/engine/graphics/geometry/compute_geometry_polycount.js +1 -1
  478. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +3 -3
  479. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +1 -1
  480. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +2 -2
  481. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +4 -4
  482. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +1 -1
  483. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +3 -3
  484. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +3 -3
  485. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +1 -1
  486. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +2 -2
  487. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +4 -4
  488. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +1 -1
  489. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +3 -3
  490. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts +2 -2
  491. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts.map +1 -1
  492. package/src/engine/graphics/geometry/scaleGeometryToBox.js +1 -1
  493. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts +2 -2
  494. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts.map +1 -1
  495. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.js +1 -1
  496. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts +2 -2
  497. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts.map +1 -1
  498. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.js +1 -1
  499. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +4 -12
  500. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  501. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +2 -2
  502. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts +5 -20
  503. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts.map +1 -1
  504. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +24 -24
  505. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
  506. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +16 -16
  507. package/src/engine/graphics/render/layers/RenderLayer.d.ts +4 -4
  508. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
  509. package/src/engine/graphics/render/layers/RenderLayer.js +2 -2
  510. package/src/engine/graphics/render/make_bvh_visibility_builder.js +1 -1
  511. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +1 -1
  512. package/src/engine/graphics/render/visibility/VisibilityComputer.js +1 -1
  513. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts +2 -2
  514. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
  515. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +1 -1
  516. package/src/engine/graphics3/DecalSystem.d.ts +8 -0
  517. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  518. package/src/engine/graphics3/DecalSystem.js +8 -0
  519. package/src/engine/graphics3/GraphicsEngine.d.ts +19 -8
  520. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  521. package/src/engine/graphics3/GraphicsEngine.js +22 -11
  522. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  523. package/src/engine/graphics3/LightSystem.js +11 -1
  524. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts +4 -0
  525. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts.map +1 -1
  526. package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +4 -0
  527. package/src/engine/navigation/mesh/NavigationMesh.d.ts +90 -9
  528. package/src/engine/navigation/mesh/NavigationMesh.d.ts.map +1 -1
  529. package/src/engine/navigation/mesh/NavigationMesh.js +80 -8
  530. package/src/engine/network/NetworkSession.d.ts +60 -0
  531. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  532. package/src/engine/network/NetworkSession.js +141 -1
  533. package/src/engine/network/orchestrator/NetworkPeer.d.ts +56 -8
  534. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  535. package/src/engine/network/orchestrator/NetworkPeer.js +263 -67
  536. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +6 -1
  537. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  538. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +6 -0
  539. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +13 -7
  540. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  541. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +103 -138
  542. package/src/engine/network/replication/Replicator.d.ts +47 -6
  543. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  544. package/src/engine/network/replication/Replicator.js +362 -107
  545. package/src/engine/network/sim/ActionLog.d.ts +2 -0
  546. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  547. package/src/engine/network/sim/ActionLog.js +2 -0
  548. package/src/engine/network/sim/ActionRecordCursor.d.ts +82 -0
  549. package/src/engine/network/sim/ActionRecordCursor.d.ts.map +1 -0
  550. package/src/engine/network/sim/ActionRecordCursor.js +120 -0
  551. package/src/engine/network/sim/RewindEngine.d.ts.map +1 -1
  552. package/src/engine/network/sim/RewindEngine.js +13 -29
  553. package/src/engine/network/sim/SimActionExecutor.d.ts +2 -3
  554. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  555. package/src/engine/network/sim/SimActionExecutor.js +10 -11
  556. package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
  557. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  558. package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
  559. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  560. package/src/engine/sound/SoundEngine.d.ts +24 -0
  561. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  562. package/src/engine/sound/SoundEngine.js +29 -11
  563. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
  564. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
  565. package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
  566. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
  567. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
  568. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
  569. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
  570. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
  571. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
  572. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  573. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
  574. package/src/shade/playground/particle_system/README.md +14 -3
  575. package/src/shade/playground/particle_system/index.html +1 -0
  576. package/src/shade/playground/particle_system/main.js +15 -2
  577. package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
  578. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  579. package/src/shade/playground/particle_system/particle_scene.js +164 -46
  580. package/src/shade/playground/skinned_mesh_soup/README.md +39 -18
  581. package/src/shade/playground/skinned_mesh_soup/index.html +9 -6
  582. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  583. package/src/shade/playground/skinned_mesh_soup/main.js +16 -13
  584. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +8 -2
  585. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  586. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +23 -4
  587. package/src/shade/renderer/GraphicsContext.d.ts +1 -0
  588. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  589. package/src/shade/renderer/GraphicsContext.js +4 -0
  590. package/src/shade/renderer/Renderer.d.ts +1 -1
  591. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  592. package/src/shade/renderer/animation/GPUAnimationManager.js +1958 -1796
  593. package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +357 -0
  594. package/src/shade/renderer/animation/skin_bind_transform.d.ts +25 -0
  595. package/src/shade/renderer/animation/skin_bind_transform.d.ts.map +1 -0
  596. package/src/shade/renderer/animation/skin_bind_transform.js +33 -0
  597. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +67 -0
  598. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -0
  599. package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +199 -0
  600. package/src/shade/renderer/animation/skin_frame_defect.d.ts +34 -0
  601. package/src/shade/renderer/animation/skin_frame_defect.d.ts.map +1 -0
  602. package/src/shade/renderer/animation/skin_frame_defect.js +132 -0
  603. package/src/shade/renderer/animation/skin_joint_matrix.d.ts +24 -0
  604. package/src/shade/renderer/animation/skin_joint_matrix.d.ts.map +1 -0
  605. package/src/shade/renderer/animation/skin_joint_matrix.js +46 -0
  606. package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts +70 -0
  607. package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts.map +1 -0
  608. package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +216 -0
  609. package/src/shade/renderer/animation/skin_test_fixtures.d.ts +86 -0
  610. package/src/shade/renderer/animation/skin_test_fixtures.d.ts.map +1 -0
  611. package/src/shade/renderer/animation/skin_test_fixtures.js +250 -0
  612. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +18 -4
  613. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts.map +1 -1
  614. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +18 -4
  615. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
  616. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  617. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
  618. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
  619. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
  620. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
  621. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
  622. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
  623. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
  624. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
  625. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  626. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
  627. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  628. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  629. package/src/shade/renderer/particles/DESIGN.md +71 -20
  630. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
  631. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  632. package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
  633. package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
  634. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  635. package/src/shade/renderer/particles/ParticleConstants.js +33 -0
  636. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
  637. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
  638. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
  639. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
  640. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
  641. package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
  642. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
  643. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
  644. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
  645. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
  646. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  647. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
  648. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
  649. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
  650. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
  651. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  652. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
  653. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +43 -0
  654. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -0
  655. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +44 -0
  656. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +33 -59
  657. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  658. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +185 -118
  659. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +15 -10
  660. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  661. package/src/shade/renderer/particles/graph/compile_particle_graph.js +205 -170
  662. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +44 -0
  663. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -0
  664. package/src/shade/renderer/particles/graph/particle_graph_authoring.js +108 -0
  665. package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
  666. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  667. package/src/shade/renderer/particles/graph_particles.js +60 -20
  668. package/src/shade/renderer/particles/particle_prototype.d.ts.map +1 -1
  669. package/src/shade/renderer/particles/particle_prototype.js +181 -180
  670. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
  671. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  672. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
  673. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
  674. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  675. package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
  676. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +4 -4
  677. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  678. package/src/shade/renderer/particles/runtime/create_particle_effect.js +19 -19
  679. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  680. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
  681. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
  682. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  683. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
  684. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
  685. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  686. package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
  687. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +1 -1
  688. package/src/shade/renderer/scene/SkinnedMesh.d.ts +11 -0
  689. package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
  690. package/src/shade/renderer/scene/SkinnedMesh.js +11 -0
  691. package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.d.ts +33 -3
  692. package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.d.ts.map +1 -1
  693. package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.js +58 -37
  694. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
  695. package/src/view/DOM.d.ts +69 -0
  696. package/src/view/DOM.d.ts.map +1 -0
  697. package/src/view/DOM.js +2 -1
  698. package/src/view/common/LocalizedLabelView.d.ts +50 -0
  699. package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
  700. package/src/view/controller/controls/GuiControl.d.ts +19 -0
  701. package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
  702. package/src/view/elements/FrameRateView.d.ts +45 -0
  703. package/src/view/elements/FrameRateView.d.ts.map +1 -0
  704. package/src/view/elements/FrameRateView.js +131 -0
  705. package/src/view/elements/SliderView.d.ts +37 -0
  706. package/src/view/elements/SliderView.d.ts.map +1 -0
  707. package/src/view/elements/SliderView.js +71 -0
  708. package/src/view/elements/navigation/ViewStack.d.ts +1 -1
  709. package/src/view/elements/navigation/ViewStack.js +1 -1
  710. package/src/view/elements/notify/NotificationView.d.ts +22 -0
  711. package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
  712. package/src/view/tooltip/TooltipView.d.ts +5 -1
  713. package/src/view/tooltip/TooltipView.d.ts.map +1 -1
  714. package/src/view/tooltip/TooltipView.js +4 -0
  715. package/src/shade/renderer/particles/graph/ParticleGraph.d.ts +0 -54
  716. package/src/shade/renderer/particles/graph/ParticleGraph.d.ts.map +0 -1
  717. package/src/shade/renderer/particles/graph/ParticleGraph.js +0 -99
@@ -1,11 +1,24 @@
1
1
  import { assert } from "../../../core/assert.js";
2
+ import { BinaryBuffer } from "../../../core/binary/BinaryBuffer.js";
2
3
  import Signal from "../../../core/events/signal/Signal.js";
3
4
  import { MalformedPacketError } from "../core/MalformedPacketError.js";
5
+ import { ActionRecordCursor } from "../sim/ActionRecordCursor.js";
4
6
 
5
7
  // Bytes of fixed per-action framing that always precede the variable payload:
6
8
  // uint8 action_type_id + uint32 action_payload_len.
7
9
  const ACTION_HEADER_BYTES = 5;
8
10
 
11
+ /**
12
+ * Most slices {@link Replicator#unpack_from_peer} holds per peer while waiting
13
+ * for an earlier slice to land. A sender bursts at most `max_packets_per_tick`
14
+ * slices a tick and re-sends the missing one every tick, so a legitimate
15
+ * backlog is a burst or two; this is a backstop against a sender that never
16
+ * fills the gap. Beyond it the farthest slice is dropped — those frames were
17
+ * acked at the channel level, so the sender will credit them and not re-send
18
+ * them, which is a loss, and the reason the cap is generous.
19
+ */
20
+ const MAX_HELD_SLICES = 256;
21
+
9
22
  /**
10
23
  * Forwards action records between peers.
11
24
  *
@@ -33,33 +46,126 @@ const ACTION_HEADER_BYTES = 5;
33
46
  * uint32: action_payload_len
34
47
  * bytes: action_payload
35
48
  * ```
49
+ * {@link NetworkPeer} prefixes each packet of this with a slice header — the
50
+ * frame range the packet covers and whether it is the first of the sender's
51
+ * tick — which it parses itself and hands to {@link unpack_from_peer} as
52
+ * `slice`, so the receiver can apply the sender's packets in frame order.
36
53
  *
37
54
  * @author Alex Goldring
38
55
  * @copyright Company Named Limited (c) 2026
39
56
  */
40
57
  export class Replicator {
41
58
  /**
42
- * Pre-allocated scratch for record positions in the current pack pass.
43
- * Each slot holds (record_start, record_end) interleaved.
44
- * Grown on demand.
59
+ * Pre-allocated scratch for the in-scope actions of the current pack
60
+ * pass: `(action_type_id, payload_start, payload_len)` per action,
61
+ * interleaved. Grown on demand.
45
62
  * @type {Int32Array}
46
63
  * @private
47
64
  */
48
- #record_bounds = new Int32Array(64 * 2);
65
+ #in_scope_actions = new Int32Array(64 * 3);
49
66
  /**
50
- * Per-peer high-watermark of the highest frame number already applied
51
- * via {@link unpack_from_peer}'s execute-on-arrival path. The action
52
- * stream re-sends every unacked frame each tick (back-fill for loss
53
- * tolerance), so the same frame arrives multiple times before its ack
54
- * round-trips. Re-running a frame would recycle its action-log slot and
55
- * re-capture prior state from the already-mutated world corrupting the
56
- * rewind baseline. Skipping frames at or below the watermark keeps each
57
- * frame applied exactly once. Only used by the execute-on-arrival path;
58
- * the deferred path ({@link on_pending_action}) dedups downstream.
59
- * @type {Map<number, number>}
67
+ * Per-peer state of {@link unpack_from_peer}'s execute-on-arrival path:
68
+ * `next_frame`, the frame after the newest applied, and `held`, later
69
+ * slices of a sender's tick waiting for an earlier slice still in flight,
70
+ * sorted by `frame_start`.
71
+ *
72
+ * `next_frame` is what keeps each frame applied exactly once. The action
73
+ * stream re-sends every unconfirmed frame each tick (back-fill for loss
74
+ * tolerance), so a frame arrives several times before its ack round-trips,
75
+ * and re-running it would recycle its action-log slot and re-capture prior
76
+ * state from the already-mutated world — corrupting the rewind baseline.
77
+ * Frames below `next_frame` are skipped.
78
+ *
79
+ * One watermark is sound only because frames are applied in order. The
80
+ * sender may split a tick's owed range across several packets
81
+ * ({@link NetworkPeer#flush_outbound}), and when the first is lost the
82
+ * later ones land first. Applied on arrival they would put their frames
83
+ * ahead of the re-sent earlier ones — an absolute-state action from the
84
+ * older frame would then overwrite the newer, a despawn could precede its
85
+ * spawn — and the watermark would take them as proof of everything before,
86
+ * so the re-send would be skipped for good while the sender, seeing it
87
+ * acked, credited those frames as delivered. So a later slice is held
88
+ * until the slices before it have landed. Only the execute-on-arrival path
89
+ * keeps this; the deferred path ({@link on_pending_action}) orders and
90
+ * dedups downstream.
91
+ * @type {Map<number, {next_frame: number, held: Array<{frame_start: number, frame_end: number, buffer: BinaryBuffer, length: number}>}>}
92
+ * @private
93
+ */
94
+ #inbound = new Map();
95
+
96
+ /**
97
+ * Frames that arrived and were never applied, per peer, and the ones that were.
98
+ *
99
+ * **A skipped frame is not the same thing as a lost one, and until now neither was counted.**
100
+ * The action stream re-sends every unconfirmed frame each tick, so a frame arrives several
101
+ * times before its ack round-trips and every arrival after the first is skipped — correctly,
102
+ * and constantly. That is the normal case and it must not be counted as loss.
103
+ *
104
+ * What must be counted is the other one: a slice that arrives *after* a newer slice has raised
105
+ * the watermark past it, whose frames were therefore never applied and never will be, because
106
+ * its channel-level ack tells the sender they were delivered and nothing re-sends them. That is
107
+ * the failure `fb116d3a4` fixed for the default configuration and which
108
+ * `max_packets_per_tick: 1` still reproduces exactly — and the thing that made it expensive to
109
+ * find is that it is *silent*: a missing explosion looks like a rendering bug and nothing
110
+ * anywhere reports a shortfall.
111
+ *
112
+ * Telling the two apart needs one bit per frame in the window. `applied` is a ring of frame
113
+ * numbers indexed by `frame % capacity`, holding the frame that last wrote each slot, so a
114
+ * skipped frame can ask "was I ever applied?" in constant time and constant memory. A frame
115
+ * older than the window answers "no", which is right: it is beyond recovery either way.
116
+ *
117
+ * @type {Map<number, {applied: Int32Array, skipped_unapplied: number, skipped_duplicate: number}>}
60
118
  * @private
61
119
  */
62
- #applied_through = new Map();
120
+ #delivery = new Map();
121
+
122
+ /**
123
+ * Per-peer delivery accounting. Read it, log it, put it on a HUD, fail a test on it.
124
+ *
125
+ * `skipped_unapplied` is the one that matters: frames that reached this receiver and were
126
+ * dropped below the watermark without ever being applied. It should be zero. It is not zero
127
+ * when slices reorder on a sender pinned to the ring floor, which is what
128
+ * `max_packets_per_tick: 1` produces under jitter.
129
+ *
130
+ * `skipped_duplicate` is the healthy counterpart — the action stream's own redundancy arriving
131
+ * and being correctly ignored — and is expected to be large.
132
+ *
133
+ * @param {number} peer_id
134
+ * @returns {{skipped_unapplied: number, skipped_duplicate: number}}
135
+ */
136
+ delivery_stats(peer_id) {
137
+ const d = this.#delivery.get(peer_id);
138
+
139
+ if (d === undefined) {
140
+ return { skipped_unapplied: 0, skipped_duplicate: 0 };
141
+ }
142
+
143
+ return { skipped_unapplied: d.skipped_unapplied, skipped_duplicate: d.skipped_duplicate };
144
+ }
145
+
146
+ /**
147
+ * @param {number} peer_id
148
+ * @returns {{applied: Int32Array, skipped_unapplied: number, skipped_duplicate: number}}
149
+ * @private
150
+ */
151
+ #delivery_state(peer_id) {
152
+ let d = this.#delivery.get(peer_id);
153
+
154
+ if (d === undefined) {
155
+ const capacity = this.action_log.frame_capacity;
156
+
157
+ d = {
158
+ // -1 is "no frame has occupied this slot"; frame numbers are non-negative
159
+ applied: new Int32Array(capacity).fill(-1),
160
+ skipped_unapplied: 0,
161
+ skipped_duplicate: 0
162
+ };
163
+
164
+ this.#delivery.set(peer_id, d);
165
+ }
166
+
167
+ return d;
168
+ }
63
169
 
64
170
  /**
65
171
  * Fired after each per-frame action group is fully applied via
@@ -69,8 +175,9 @@ export class Replicator {
69
175
  * or anything else that needs to know "frame N from peer P has just
70
176
  * been applied to the local world."
71
177
  *
72
- * Fires in frame-ascending order within a single packet (the order
73
- * the wire format encodes them in).
178
+ * Fires in frame order within a packet, which encodes its frames
179
+ * ascending, and across packets, because a later slice of a sender's tick
180
+ * is held until the slices before it have landed.
74
181
  *
75
182
  * @type {Signal}
76
183
  */
@@ -96,6 +203,13 @@ export class Replicator {
96
203
  */
97
204
  on_pending_action = null;
98
205
 
206
+ /**
207
+ * Walks a frame's records for {@link pack_for_peer}.
208
+ * @type {ActionRecordCursor}
209
+ * @private
210
+ */
211
+ #cursor = new ActionRecordCursor();
212
+
99
213
  /**
100
214
  * @param {{
101
215
  * action_log: ActionLog,
@@ -175,24 +289,20 @@ export class Replicator {
175
289
  continue;
176
290
  }
177
291
 
178
- const buffer = this.action_log.buffer_for(frame);
179
- const end = this.action_log.write_end_for(frame);
180
-
181
- // First pass: walk records, capture (start, end) for those in scope.
292
+ // First pass: walk the records, remembering where the action of
293
+ // each in-scope one sits.
294
+ const cursor = this.#cursor;
295
+ cursor.open(this.action_log, frame);
182
296
  let in_scope_count = 0;
183
- while (buffer.position < end) {
184
- const record_start = buffer.position;
185
- const in_scope = this.#scan_record_in_scope(buffer, peer_id);
186
- const record_end = buffer.position;
187
-
188
- if (in_scope) {
189
- if ((in_scope_count + 1) * 2 > this.#record_bounds.length) {
190
- this.#grow_record_bounds();
191
- }
192
- this.#record_bounds[in_scope_count * 2] = record_start;
193
- this.#record_bounds[in_scope_count * 2 + 1] = record_end;
194
- in_scope_count++;
297
+ while (cursor.next()) {
298
+ if (!this.#record_in_scope(cursor, peer_id)) continue;
299
+ if ((in_scope_count + 1) * 3 > this.#in_scope_actions.length) {
300
+ this.#grow_in_scope_actions();
195
301
  }
302
+ this.#in_scope_actions[in_scope_count * 3] = cursor.action_type_id;
303
+ this.#in_scope_actions[in_scope_count * 3 + 1] = cursor.payload_start;
304
+ this.#in_scope_actions[in_scope_count * 3 + 2] = cursor.payload_len;
305
+ in_scope_count++;
196
306
  }
197
307
 
198
308
  if (in_scope_count === 0) {
@@ -207,10 +317,17 @@ export class Replicator {
207
317
  out_buffer.writeUintVar(frame);
208
318
  out_buffer.writeUintVar(in_scope_count);
209
319
 
320
+ // Wire format per action is (type_id, len, payload). The record's
321
+ // local-only sender_id byte is NOT copied: the receiver derives the
322
+ // sender from the packet's peer_id, and carrying it on the wire
323
+ // would let a hostile peer impersonate other peers' actions.
324
+ const raw_bytes = cursor.buffer.raw_bytes;
210
325
  for (let i = 0; i < in_scope_count; i++) {
211
- const rs = this.#record_bounds[i * 2];
212
- buffer.position = rs;
213
- this.#copy_action_to(buffer, out_buffer);
326
+ const payload_start = this.#in_scope_actions[i * 3 + 1];
327
+ const payload_len = this.#in_scope_actions[i * 3 + 2];
328
+ out_buffer.writeUint8(this.#in_scope_actions[i * 3]);
329
+ out_buffer.writeUint32(payload_len);
330
+ out_buffer.writeBytes(raw_bytes, payload_start, payload_len);
214
331
  }
215
332
 
216
333
  if (wrote_any_group && out_buffer.position > budget_end) {
@@ -234,11 +351,23 @@ export class Replicator {
234
351
  * sender's frame number, ensuring the rewind/replay machinery sees consistent
235
352
  * frame indexing across peers.
236
353
  *
354
+ * `slice` is the sender's description of the packet, from the
355
+ * {@link NetworkPeer} slice header: the frame range it covers and whether
356
+ * it is the first packet of the sender's tick. Frames are applied in frame
357
+ * order. A slice that starts past the frames applied so far and is not a
358
+ * head is a later slice of a burst whose earlier slice has not landed; it
359
+ * is held and applied once the gap before it fills. A head is applied as
360
+ * soon as it arrives, because nothing the sender can still send lies
361
+ * before it — that is also how the receiver moves past frames lost for
362
+ * good. Without `slice` (callers that pack and unpack directly) the packet
363
+ * is taken as a head covering the frames it carries.
364
+ *
237
365
  * @param {number} peer_id
238
366
  * @param {BinaryBuffer} in_buffer
239
367
  * @param {number} in_buffer_end byte position to stop reading at
368
+ * @param {{frame_start: number, frame_end: number, head: boolean}|null} [slice]
240
369
  */
241
- unpack_from_peer(peer_id, in_buffer, in_buffer_end) {
370
+ unpack_from_peer(peer_id, in_buffer, in_buffer_end, slice = null) {
242
371
  assert.isNonNegativeInteger(peer_id, 'peer_id');
243
372
  assert.isNonNegativeInteger(in_buffer_end, 'in_buffer_end');
244
373
 
@@ -275,19 +404,91 @@ export class Replicator {
275
404
  return;
276
405
  }
277
406
 
278
- const registry = this.action_registry;
407
+ let state = this.#inbound.get(peer_id);
408
+ if (state === undefined) {
409
+ state = { next_frame: 0, held: [] };
410
+ this.#inbound.set(peer_id, state);
411
+ }
412
+
413
+ if (slice !== null && !slice.head && slice.frame_start > state.next_frame) {
414
+ this.#hold_slice(peer_id, state, slice, in_buffer, in_buffer_end);
415
+ return;
416
+ }
417
+
418
+ if (slice !== null && slice.head) {
419
+ // Nothing before a head will be sent again. Whatever was held from
420
+ // before it is as complete as it will ever be, so apply it first,
421
+ // in order, rather than letting the head jump past it.
422
+ this.#apply_held_before(peer_id, state, slice.frame_start);
423
+ }
424
+
425
+ const last_frame = this.#apply_groups(
426
+ peer_id, in_buffer, in_buffer_end, state.next_frame,
427
+ slice !== null ? slice.frame_start : 0,
428
+ slice !== null ? slice.frame_end : Infinity,
429
+ );
430
+ const covered_through = slice !== null ? slice.frame_end : last_frame;
431
+ if (covered_through + 1 > state.next_frame) {
432
+ state.next_frame = covered_through + 1;
433
+ }
434
+ this.#apply_held_contiguous(peer_id, state);
435
+ }
279
436
 
280
- const applied_through = this.#applied_through.get(peer_id);
437
+ /**
438
+ * Apply the frame groups in `[in_buffer.position, in_buffer_end)`, skipping
439
+ * any frame below `min_frame` — already applied, or, when `min_frame` is
440
+ * `Infinity`, every frame, which is how a packet is validated before it is
441
+ * held. A skipped group is still walked, so a malformed one throws here
442
+ * rather than later. A group outside `[frame_start, frame_end]`, the range
443
+ * the slice header declared, is malformed too: the watermark is raised to
444
+ * the header's end, so a frame beyond it would be applied again by the
445
+ * slice that genuinely carries it.
446
+ *
447
+ * @param {number} peer_id
448
+ * @param {BinaryBuffer} in_buffer
449
+ * @param {number} in_buffer_end
450
+ * @param {number} min_frame
451
+ * @param {number} frame_start
452
+ * @param {number} frame_end
453
+ * @returns {number} the highest frame number the packet carries, or -1 if none
454
+ * @private
455
+ */
456
+ #apply_groups(peer_id, in_buffer, in_buffer_end, min_frame, frame_start, frame_end) {
457
+ const registry = this.action_registry;
458
+ let last_frame = -1;
281
459
 
282
460
  while (in_buffer.position < in_buffer_end) {
283
461
  const frame_number = in_buffer.readUintVar();
284
462
  const action_count = in_buffer.readUintVar();
463
+ if (frame_number < frame_start || frame_number > frame_end) {
464
+ throw new MalformedPacketError(`Replicator.unpack_from_peer: frame ${frame_number} lies outside the slice [${frame_start}, ${frame_end}]`);
465
+ }
466
+ if (frame_number > last_frame) last_frame = frame_number;
285
467
 
286
468
  // Skip frames already applied from this peer — the action stream
287
- // re-sends every unacked frame each tick, and re-applying would
288
- // corrupt the action-log prior-state capture (see #applied_through).
469
+ // re-sends every unconfirmed frame each tick, and re-applying would
470
+ // corrupt the action-log prior-state capture (see #inbound).
289
471
  // The read cursor must still advance past this frame's actions.
290
- if (applied_through !== undefined && frame_number <= applied_through) {
472
+ if (frame_number < min_frame) {
473
+ /*
474
+ Was this one already applied, or is it being lost right now?
475
+
476
+ Both look identical here — a frame below the watermark, walked past to keep the
477
+ read cursor aligned — and the difference is the whole of GAP-043's residual. The
478
+ ring says which: a slot still holding this frame number means it was applied and
479
+ this is the action stream's own redundancy doing its job; anything else means the
480
+ watermark moved past a frame that never ran, and nothing will re-send it because
481
+ its channel-level ack already told the sender it arrived.
482
+ */
483
+ const delivery = this.#delivery_state(peer_id);
484
+ const slot = frame_number % delivery.applied.length;
485
+
486
+ if (delivery.applied[slot] === frame_number) {
487
+ delivery.skipped_duplicate++;
488
+ } else {
489
+ delivery.skipped_unapplied++;
490
+ }
491
+
291
492
  for (let i = 0; i < action_count; i++) {
292
493
  if (in_buffer.position + ACTION_HEADER_BYTES > in_buffer_end) {
293
494
  throw new MalformedPacketError(`Replicator.unpack_from_peer: action header overruns packet (skip; frame ${frame_number}, action ${i}/${action_count})`);
@@ -335,44 +536,140 @@ export class Replicator {
335
536
  this.action_log.end_frame();
336
537
  }
337
538
 
338
- // Advance the per-peer watermark so subsequent back-fill resends of
339
- // this frame are skipped. Frames within a packet are strictly
340
- // ascending, so this only ever moves forward.
341
- this.#applied_through.set(peer_id, frame_number);
539
+ // Record that it ran, so a later arrival of the same frame is counted as the action
540
+ // stream's redundancy rather than as a loss. See #delivery.
541
+ const delivery = this.#delivery_state(peer_id);
542
+ delivery.applied[frame_number % delivery.applied.length] = frame_number;
342
543
 
343
544
  // Fire AFTER end_frame so handlers see consistent state and can
344
545
  // safely query the action log for the just-applied frame.
345
546
  this.onFrameApplied.send2(peer_id, frame_number);
346
547
  }
548
+
549
+ return last_frame;
347
550
  }
348
551
 
349
552
  /**
350
- * Forget the per-peer apply watermark. Call when a peer disconnects so a
351
- * later peer reusing the same id (or the same peer resuming a session whose
352
- * frame numbering restarts) is not wrongly deduped against stale state.
553
+ * Keep a slice that arrived ahead of the slices before it, to be applied
554
+ * once they land. The bytes are copied the inbound buffer is shared
555
+ * scratch after a validation walk, so a malformed slice is rejected now,
556
+ * by the packet that carried it, and not during a later drain inside some
557
+ * other packet's handling.
558
+ *
559
+ * @param {number} peer_id
560
+ * @param {{next_frame: number, held: Array<{frame_start: number, frame_end: number, buffer: BinaryBuffer, length: number}>}} state
561
+ * @param {{frame_start: number, frame_end: number}} slice
562
+ * @param {BinaryBuffer} in_buffer
563
+ * @param {number} in_buffer_end
564
+ * @private
565
+ */
566
+ #hold_slice(peer_id, state, slice, in_buffer, in_buffer_end) {
567
+ const start = in_buffer.position;
568
+ this.#apply_groups(peer_id, in_buffer, in_buffer_end, Infinity, slice.frame_start, slice.frame_end);
569
+
570
+ const held = state.held;
571
+ let i = 0;
572
+ while (i < held.length && held[i].frame_start < slice.frame_start) i++;
573
+
574
+ // Slice boundaries move between ticks: the last slice of a burst grows
575
+ // by a frame a tick until it fills a packet, a frame that packs to
576
+ // nothing lets the next one in, a rollback that grows a frame pushes
577
+ // the next one out. So a re-send with the same start is not the same
578
+ // slice. Every copy was acked, and the sender credits every frame any
579
+ // copy covered, so a frame only one copy covers is never sent again:
580
+ // keep the copy that reaches further, and between equals the newer,
581
+ // which carries the sender's latest content for those frames.
582
+ const same_start = i < held.length && held[i].frame_start === slice.frame_start;
583
+ if (same_start && held[i].frame_end > slice.frame_end) return;
584
+ if (!same_start && held.length >= MAX_HELD_SLICES) {
585
+ // Keep the slices nearest the gap — the ones the next head is most
586
+ // likely to release — and drop the farthest.
587
+ if (i === held.length) return;
588
+ held.pop();
589
+ }
590
+
591
+ const length = in_buffer_end - start;
592
+ const buffer = new BinaryBuffer();
593
+ buffer.setCapacity(length);
594
+ buffer.writeBytes(in_buffer.raw_bytes, start, length);
595
+ const entry = { frame_start: slice.frame_start, frame_end: slice.frame_end, buffer, length };
596
+ if (same_start) {
597
+ held[i] = entry;
598
+ } else {
599
+ held.splice(i, 0, entry);
600
+ }
601
+ }
602
+
603
+ /**
604
+ * Apply, in order, every held slice that starts before `frame` — the start
605
+ * of a head, before which nothing will be sent again.
606
+ * @private
607
+ */
608
+ #apply_held_before(peer_id, state, frame) {
609
+ const held = state.held;
610
+ while (held.length > 0 && held[0].frame_start < frame) {
611
+ const h = held.shift();
612
+ if (h.frame_end >= state.next_frame) this.#apply_held(peer_id, state, h);
613
+ }
614
+ }
615
+
616
+ /**
617
+ * Apply held slices for as long as the next one starts at or before the
618
+ * watermark, dropping any the watermark has already passed.
619
+ * @private
620
+ */
621
+ #apply_held_contiguous(peer_id, state) {
622
+ const held = state.held;
623
+ while (held.length > 0) {
624
+ const h = held[0];
625
+ if (h.frame_end < state.next_frame) {
626
+ held.shift();
627
+ continue;
628
+ }
629
+ if (h.frame_start > state.next_frame) break;
630
+ held.shift();
631
+ this.#apply_held(peer_id, state, h);
632
+ }
633
+ }
634
+
635
+ /** @private */
636
+ #apply_held(peer_id, state, h) {
637
+ h.buffer.position = 0;
638
+ this.#apply_groups(peer_id, h.buffer, h.length, state.next_frame, h.frame_start, h.frame_end);
639
+ if (h.frame_end + 1 > state.next_frame) {
640
+ state.next_frame = h.frame_end + 1;
641
+ }
642
+ }
643
+
644
+ /**
645
+ * Forget a peer's inbound state — its apply watermark and any slices held
646
+ * for it. Call when a peer disconnects so a later peer reusing the same id
647
+ * (or the same peer resuming a session whose frame numbering restarts) is
648
+ * not wrongly deduped against stale state.
353
649
  *
354
650
  * @param {number} peer_id
355
651
  */
356
652
  forget_peer(peer_id) {
357
653
  assert.isNonNegativeInteger(peer_id, 'peer_id');
358
- this.#applied_through.delete(peer_id);
654
+ this.#inbound.delete(peer_id);
359
655
  }
360
656
 
361
657
  /**
362
- * Walk a single record from the buffer's current position, advancing past it.
363
- * Returns true if any of the record's affected entities is in scope for `peer_id`,
364
- * or if the record has no affected entities (event-style action always sent).
658
+ * Is the record under `cursor` in scope for `peer_id` does it touch an
659
+ * entity the peer should see? A record with no affected components (an
660
+ * event-style action) is always in scope.
365
661
  *
366
- * @param {BinaryBuffer} buffer
662
+ * @param {ActionRecordCursor} cursor
367
663
  * @param {number} peer_id
368
664
  * @returns {boolean}
369
665
  * @private
370
666
  */
371
- #scan_record_in_scope(buffer, peer_id) {
372
- const prior_count = buffer.readUintVar();
667
+ #record_in_scope(cursor, peer_id) {
668
+ if (cursor.prior_count === 0) return true;
373
669
 
374
- let any_in_scope = false;
375
- for (let i = 0; i < prior_count; i++) {
670
+ const buffer = cursor.buffer;
671
+ buffer.position = cursor.prior_start;
672
+ for (let i = 0; i < cursor.prior_count; i++) {
376
673
  const entity_id = buffer.readUintVar();
377
674
  // Translate local entity_id to network_id for the scope filter, which
378
675
  // operates on peer-shared identifiers. If `network_for` returns -1,
@@ -383,64 +680,22 @@ export class Replicator {
383
680
  // safely apply.
384
681
  const network_id = this.slot_table.network_for(entity_id);
385
682
  if (network_id >= 0 && this.scope_filter.is_entity_in_scope(peer_id, network_id)) {
386
- any_in_scope = true;
683
+ return true;
387
684
  }
388
685
  buffer.readUint8(); // component_type_id
389
- const payload_len = buffer.readUint32();
390
- buffer.position += payload_len; // skip prior payload
391
- }
392
-
393
- // Skip the action payload too.
394
- buffer.readUint8(); // action_type_id
395
- buffer.readUint8(); // sender_id (local-only metadata, not sent)
396
- const action_payload_len = buffer.readUint32();
397
- buffer.position += action_payload_len;
398
-
399
- // Event-style actions (no affected components) are always in scope.
400
- return prior_count === 0 ? true : any_in_scope;
401
- }
402
-
403
- /**
404
- * Buffer's current position is the start of an action record. Skip the
405
- * prior_state section, then copy the action portion (type_id + len + payload)
406
- * to `out_buffer`. Buffer position advances to the end of the record.
407
- *
408
- * @param {BinaryBuffer} buffer source action-log frame
409
- * @param {BinaryBuffer} out_buffer destination packet
410
- * @private
411
- */
412
- #copy_action_to(buffer, out_buffer) {
413
- // Skip prior_state.
414
- const prior_count = buffer.readUintVar();
415
- for (let i = 0; i < prior_count; i++) {
416
- buffer.readUintVar(); // entity_id
417
- buffer.readUint8(); // component_type_id
418
- const len = buffer.readUint32();
419
- buffer.position += len; // skip prior payload
686
+ const prior_len = buffer.readUint32();
687
+ buffer.position += prior_len; // skip prior payload
420
688
  }
421
-
422
- // Copy action portion: type_id + len + payload. The local-only
423
- // sender_id byte is STRIPPED here — over-the-wire format stays
424
- // (type_id, len, payload) and the receiver derives sender from
425
- // the packet's peer_id. Including sender_id on the wire would
426
- // let a hostile peer impersonate other peers' actions.
427
- const action_type_id = buffer.readUint8();
428
- buffer.readUint8(); // sender_id — discarded, not sent on the wire
429
- const action_payload_len = buffer.readUint32();
430
-
431
- out_buffer.writeUint8(action_type_id);
432
- out_buffer.writeUint32(action_payload_len);
433
- out_buffer.writeBytes(buffer.raw_bytes, buffer.position, action_payload_len);
434
- buffer.position += action_payload_len;
689
+ return false;
435
690
  }
436
691
 
437
692
  /**
438
693
  * @private
439
694
  */
440
- #grow_record_bounds() {
441
- const old = this.#record_bounds;
695
+ #grow_in_scope_actions() {
696
+ const old = this.#in_scope_actions;
442
697
  const next = new Int32Array(old.length * 2);
443
698
  next.set(old);
444
- this.#record_bounds = next;
699
+ this.#in_scope_actions = next;
445
700
  }
446
701
  }
@@ -21,6 +21,8 @@
21
21
  * Self-describing: records can be skipped without consulting the action registry,
22
22
  * which means rewind code can walk records forward to find boundaries, then
23
23
  * iterate backward to apply prior states — no need to instantiate any actions.
24
+ * {@link ActionRecordCursor} is that walk; readers use it rather than parsing
25
+ * the layout themselves.
24
26
  *
25
27
  * `sender_id` says where the record came from, which is what a rollback replay
26
28
  * needs in order to decide what to do with it:
@@ -1 +1 @@
1
- {"version":3,"file":"ActionLog.d.ts","sourceRoot":"","sources":["../../../../../src/engine/network/sim/ActionLog.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH;IAoBI;;OAEG;IACH,qDAFW;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,EAIlE;IAED;;;;OAIG;IACH,sCAEC;IAED;;;;OAIG;IACH,mBAFW,MAAM,QAShB;IAED;;OAEG;IACH,kBASC;IAED;;;;;;OAMG;IACH,kBAFa,OAAO,CAInB;IAED;;;;OAIG;IACH,+BAMC;IAED;;;;;OAKG;IACH,iBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;;;;;;OAWG;IACH,kBAHW,MAAM,gBAKhB;IAED;;;;OAIG;IACH,qBAHW,MAAM,GACJ,MAAM,CAIlB;;CACJ"}
1
+ {"version":3,"file":"ActionLog.d.ts","sourceRoot":"","sources":["../../../../../src/engine/network/sim/ActionLog.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH;IAoBI;;OAEG;IACH,qDAFW;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,EAIlE;IAED;;;;OAIG;IACH,sCAEC;IAED;;;;OAIG;IACH,mBAFW,MAAM,QAShB;IAED;;OAEG;IACH,kBASC;IAED;;;;;;OAMG;IACH,kBAFa,OAAO,CAInB;IAED;;;;OAIG;IACH,+BAMC;IAED;;;;;OAKG;IACH,iBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;;;;;;OAWG;IACH,kBAHW,MAAM,gBAKhB;IAED;;;;OAIG;IACH,qBAHW,MAAM,GACJ,MAAM,CAIlB;;CACJ"}
@@ -23,6 +23,8 @@ import { FrameBufferRing } from "../state/FrameBufferRing.js";
23
23
  * Self-describing: records can be skipped without consulting the action registry,
24
24
  * which means rewind code can walk records forward to find boundaries, then
25
25
  * iterate backward to apply prior states — no need to instantiate any actions.
26
+ * {@link ActionRecordCursor} is that walk; readers use it rather than parsing
27
+ * the layout themselves.
26
28
  *
27
29
  * `sender_id` says where the record came from, which is what a rollback replay
28
30
  * needs in order to decide what to do with it: