@woosh/meep-engine 3.29.0 → 3.30.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 (226) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +1 -1
  4. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  5. package/src/core/binary/BinaryBuffer.js +14 -2
  6. package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
  7. package/src/core/bvh2/bvh3/BVH.js +14 -1
  8. package/src/core/cache/FrequencySketch.d.ts +3 -1
  9. package/src/core/cache/FrequencySketch.d.ts.map +1 -1
  10. package/src/core/cache/FrequencySketch.js +10 -4
  11. package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts.map +1 -1
  12. package/src/core/cache/wtinylfu/CacheWTinylfu.js +24 -2
  13. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts +20 -0
  14. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  15. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +69 -4
  16. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +48 -18
  17. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  18. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +262 -70
  19. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts +25 -0
  20. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts.map +1 -0
  21. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.js +228 -0
  22. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts +13 -0
  23. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts.map +1 -1
  24. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.js +10 -128
  25. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.d.ts.map +1 -1
  26. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js +11 -1
  27. package/src/core/graph/mn_graph_collapse_weighted_edge.js +6 -6
  28. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
  29. package/src/core/math/lookup/ParameterLookupTable.js +10 -5
  30. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  31. package/src/core/math/noise/sdnoise.js +16 -10
  32. package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
  33. package/src/core/model/object/ImmutableObjectPool.js +17 -7
  34. package/src/core/process/executor/ConcurrentExecutor.d.ts +1 -5
  35. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  36. package/src/core/process/executor/ConcurrentExecutor.js +95 -1
  37. package/src/core/process/task/task_find_dependency_cycle.d.ts +17 -0
  38. package/src/core/process/task/task_find_dependency_cycle.d.ts.map +1 -0
  39. package/src/core/process/task/task_find_dependency_cycle.js +81 -0
  40. package/src/core/wfc/WFCCellChoice.d.ts +17 -0
  41. package/src/core/wfc/WFCCellChoice.d.ts.map +1 -0
  42. package/src/core/wfc/WFCCellChoice.js +36 -0
  43. package/src/core/wfc/WFCLattice.d.ts +105 -0
  44. package/src/core/wfc/WFCLattice.d.ts.map +1 -0
  45. package/src/core/wfc/WFCLattice.js +235 -0
  46. package/src/core/wfc/WFCRuleTable.d.ts +172 -0
  47. package/src/core/wfc/WFCRuleTable.d.ts.map +1 -0
  48. package/src/core/wfc/WFCRuleTable.js +334 -0
  49. package/src/core/wfc/WFCState.d.ts +273 -0
  50. package/src/core/wfc/WFCState.d.ts.map +1 -0
  51. package/src/core/wfc/WFCState.js +552 -0
  52. package/src/core/wfc/WFCStatus.d.ts +11 -0
  53. package/src/core/wfc/WFCStatus.d.ts.map +1 -0
  54. package/src/core/wfc/WFCStatus.js +28 -0
  55. package/src/core/wfc/WFCTileWeights.d.ts +48 -0
  56. package/src/core/wfc/WFCTileWeights.d.ts.map +1 -0
  57. package/src/core/wfc/WFCTileWeights.js +86 -0
  58. package/src/core/wfc/WFC_UNRESOLVED.d.ts +12 -0
  59. package/src/core/wfc/WFC_UNRESOLVED.d.ts.map +1 -0
  60. package/src/core/wfc/WFC_UNRESOLVED.js +11 -0
  61. package/src/core/wfc/wfc_estimate_bytes.d.ts +24 -0
  62. package/src/core/wfc/wfc_estimate_bytes.d.ts.map +1 -0
  63. package/src/core/wfc/wfc_estimate_bytes.js +47 -0
  64. package/src/core/wfc/wfc_rule_table_tile_components.d.ts +27 -0
  65. package/src/core/wfc/wfc_rule_table_tile_components.d.ts.map +1 -0
  66. package/src/core/wfc/wfc_rule_table_tile_components.js +80 -0
  67. package/src/core/wfc/wfc_solve.d.ts +21 -0
  68. package/src/core/wfc/wfc_solve.d.ts.map +1 -0
  69. package/src/core/wfc/wfc_solve.js +154 -0
  70. package/src/core/wfc/wfc_state_apply_boundary.d.ts +18 -0
  71. package/src/core/wfc/wfc_state_apply_boundary.d.ts.map +1 -0
  72. package/src/core/wfc/wfc_state_apply_boundary.js +61 -0
  73. package/src/core/wfc/wfc_state_assign.d.ts +11 -0
  74. package/src/core/wfc/wfc_state_assign.d.ts.map +1 -0
  75. package/src/core/wfc/wfc_state_assign.js +36 -0
  76. package/src/core/wfc/wfc_state_ban_bits.d.ts +17 -0
  77. package/src/core/wfc/wfc_state_ban_bits.d.ts.map +1 -0
  78. package/src/core/wfc/wfc_state_ban_bits.js +81 -0
  79. package/src/core/wfc/wfc_state_collapse.d.ts +12 -0
  80. package/src/core/wfc/wfc_state_collapse.d.ts.map +1 -0
  81. package/src/core/wfc/wfc_state_collapse.js +73 -0
  82. package/src/core/wfc/wfc_state_flush_dirty.d.ts +12 -0
  83. package/src/core/wfc/wfc_state_flush_dirty.d.ts.map +1 -0
  84. package/src/core/wfc/wfc_state_flush_dirty.js +39 -0
  85. package/src/core/wfc/wfc_state_propagate.d.ts +14 -0
  86. package/src/core/wfc/wfc_state_propagate.d.ts.map +1 -0
  87. package/src/core/wfc/wfc_state_propagate.js +155 -0
  88. package/src/core/wfc/wfc_state_read.d.ts +11 -0
  89. package/src/core/wfc/wfc_state_read.d.ts.map +1 -0
  90. package/src/core/wfc/wfc_state_read.js +38 -0
  91. package/src/core/wfc/wfc_state_restrict.d.ts +18 -0
  92. package/src/core/wfc/wfc_state_restrict.d.ts.map +1 -0
  93. package/src/core/wfc/wfc_state_restrict.js +39 -0
  94. package/src/core/wfc/wfc_state_set_eligible.d.ts +24 -0
  95. package/src/core/wfc/wfc_state_set_eligible.d.ts.map +1 -0
  96. package/src/core/wfc/wfc_state_set_eligible.js +49 -0
  97. package/src/core/wfc/wfc_state_undo_to.d.ts +13 -0
  98. package/src/core/wfc/wfc_state_undo_to.d.ts.map +1 -0
  99. package/src/core/wfc/wfc_state_undo_to.js +84 -0
  100. package/src/core/wfc/wfc_words_per_cell.d.ts +11 -0
  101. package/src/core/wfc/wfc_words_per_cell.d.ts.map +1 -0
  102. package/src/core/wfc/wfc_words_per_cell.js +16 -0
  103. package/src/engine/ecs/EntityComponentDataset.d.ts +8 -0
  104. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  105. package/src/engine/ecs/EntityComponentDataset.js +37 -14
  106. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +8 -1
  107. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  108. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +37 -2
  109. package/src/engine/ecs/guid/UUID.d.ts.map +1 -1
  110. package/src/engine/ecs/guid/UUID.js +45 -17
  111. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +1 -1
  112. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +3 -1
  113. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  114. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +366 -360
  115. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.d.ts.map +1 -1
  116. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.js +24 -10
  117. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  118. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +24 -5
  119. package/src/engine/interpolation/Interpoland.d.ts +7 -1
  120. package/src/engine/interpolation/Interpoland.d.ts.map +1 -1
  121. package/src/engine/interpolation/Interpoland.js +8 -1
  122. package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
  123. package/src/engine/interpolation/InterpolationSystem.js +3 -0
  124. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +5 -3
  125. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
  126. package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -3
  127. package/src/engine/interpolation/pose_interpoland.d.ts.map +1 -1
  128. package/src/engine/interpolation/pose_interpoland.js +2 -0
  129. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  130. package/src/engine/network/orchestrator/NetworkPeer.js +15 -10
  131. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  132. package/src/engine/physics/cloth/ecs/ClothWorld.js +17 -0
  133. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  134. package/src/engine/physics/mls-mpm/MLS_MPM.js +14 -0
  135. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +2 -1
  136. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -1
  137. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +1 -1
  138. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +1 -0
  139. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
  140. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +1 -0
  141. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
  142. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +2 -1
  143. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
  144. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +12 -3
  145. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +1 -0
  146. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -1
  147. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -0
  148. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  149. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  150. package/src/engine/sound/sopra/runtime/EventInstance.js +4 -1
  151. package/src/format/image/avif/av1/decode/decode_coefficients.d.ts.map +1 -1
  152. package/src/format/image/avif/av1/decode/decode_coefficients.js +248 -259
  153. package/src/format/image/avif/av1/decode/read_golomb.d.ts +21 -0
  154. package/src/format/image/avif/av1/decode/read_golomb.d.ts.map +1 -0
  155. package/src/format/image/avif/av1/decode/read_golomb.js +49 -0
  156. package/src/format/image/avif/av1/filter/loop_restoration.js +461 -451
  157. package/src/format/image/avif/av1/util/round2.d.ts +19 -2
  158. package/src/format/image/avif/av1/util/round2.d.ts.map +1 -1
  159. package/src/format/image/avif/av1/util/round2.js +51 -27
  160. package/src/format/image/avif/heif/parse_avif_file.js +24 -0
  161. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  162. package/src/shade/renderer/buffer/table/GPUTypedTable.js +14 -0
  163. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +46 -3
  164. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +91 -1
  165. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +0 -13
  166. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  167. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +0 -15
  168. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +5 -5
  169. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +11 -1
  170. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -1
  171. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +11 -1
  172. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +18 -9
  173. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
  174. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +20 -26
  175. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +1 -3
  176. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
  177. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +2 -5
  178. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +1 -1
  179. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -1
  180. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +14 -1
  181. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
  182. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +12 -3
  183. package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.d.ts.map +1 -1
  184. package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.js +7 -1
  185. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  186. package/src/shade/renderer/lightmap/GPULightMap.js +349 -336
  187. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  188. package/src/shade/renderer/loader/gltf/load_gltf.js +1137 -1128
  189. package/src/shade/renderer/particles/DESIGN.md +14 -5
  190. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +25 -10
  191. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  192. package/src/shade/renderer/particles/GPUParticleSystem.js +182 -38
  193. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
  194. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +16 -10
  195. package/src/shade/renderer/particles/graph_particles.d.ts +4 -2
  196. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  197. package/src/shade/renderer/particles/graph_particles.js +8 -2
  198. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  199. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +8 -2
  200. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  201. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +10 -4
  202. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +31 -0
  203. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +1 -0
  204. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.js +62 -0
  205. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +13 -0
  206. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  207. package/src/shade/renderer/particles/vm/ParticleVMReference.js +95 -17
  208. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts +21 -0
  209. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts.map +1 -0
  210. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.js +28 -0
  211. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  212. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +19 -2
  213. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  214. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +19 -2
  215. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  216. package/src/shade/renderer/shader/type/WebGPUStruct.js +12 -0
  217. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts +8 -2
  218. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts.map +1 -1
  219. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +41 -6
  220. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +2383 -2356
  221. package/src/view/tooltip/DomTooltipManager.d.ts +7 -0
  222. package/src/view/tooltip/DomTooltipManager.d.ts.map +1 -1
  223. package/src/view/tooltip/DomTooltipManager.js +22 -0
  224. package/src/view/tooltip/DomTooltipObserver.d.ts.map +1 -1
  225. package/src/view/tooltip/DomTooltipObserver.js +13 -3
  226. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +0 -45
@@ -1 +1 @@
1
- {"version":3,"file":"sampler2d_scale_down_linear.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,uFAsEC"}
1
+ {"version":3,"file":"sampler2d_scale_down_linear.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,uFAoFC"}
@@ -31,15 +31,26 @@ export function sampler2d_scale_down_linear(input, output) {
31
31
 
32
32
  const sample = new Float64Array(itemSize);
33
33
 
34
- const sampleSize = sW * sH;
35
- const sampleSizeInv = 1 / sampleSize;
36
-
37
34
  const input_data = input.data;
38
35
  const output_data = output.data;
39
36
 
40
37
  for (let y = 0; y < oH; y++) {
41
38
 
42
- const sampleOffsetY = y * sH;
39
+ /**
40
+ * The source window is derived with integer arithmetic, and the divisor is the number of
41
+ * texels it actually covers.
42
+ *
43
+ * The ratios themselves used to serve as both loop bound and texel offset, which only works
44
+ * while they are whole: at 25 -> 12 `sampleOffsetX = x * 2.0833...` is fractional, the flat
45
+ * address is fractional, and every typed-array read comes back `undefined`, so the output is
46
+ * NaN. Silently — the one guard, `assert.ok(sW >= 1)`, rejects upscaling and nothing else,
47
+ * and the consumer strips asserts. An odd dimension above 2 is enough to reach it: both mip
48
+ * callers halve with a floor, so a 50x50 source goes 25 -> 12 and NaNs the rest of its chain.
49
+ *
50
+ * For a whole ratio the window is exactly the old one, texel for texel.
51
+ */
52
+ const y0 = Math.floor(y * sH);
53
+ const y1 = Math.max(y0 + 1, Math.min(iH, Math.floor((y + 1) * sH)));
43
54
 
44
55
  const row_address = y * oW * itemSize;
45
56
 
@@ -47,15 +58,18 @@ export function sampler2d_scale_down_linear(input, output) {
47
58
 
48
59
  const output_texel_address = row_address + x * itemSize;
49
60
 
50
- const sampleOffsetX = x * sW;
61
+ const x0 = Math.floor(x * sW);
62
+ const x1 = Math.max(x0 + 1, Math.min(iW, Math.floor((x + 1) * sW)));
63
+
64
+ const sampleSizeInv = 1 / ((y1 - y0) * (x1 - x0));
51
65
 
52
66
  // accumulate sample
53
- for (let j = 0; j < sH; j++) {
54
- const row_index = (sampleOffsetY + j) * iW;
55
- const texel_offset = row_index + sampleOffsetX;
56
- let input_texel_address = texel_offset * itemSize;
67
+ for (let j = y0; j < y1; j++) {
68
+ const row_index = j * iW;
69
+
70
+ let input_texel_address = (row_index + x0) * itemSize;
57
71
 
58
- for (let i = sW; i > 0; i--) {
72
+ for (let i = x0; i < x1; i++) {
59
73
 
60
74
  for (let k = 0; k < itemSize; k++) {
61
75
  sample[k] += input_data[k + input_texel_address];
@@ -1 +1 @@
1
- {"version":3,"file":"GridPosition2TransformSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/grid/grid2transform/GridPosition2TransformSystem.js"],"names":[],"mappings":"AAWA;IAOI,cASC;IAfD,2FAAmE;IACnE,mEAEE;IACF,YAAU;IAKN,4CAKC;IAGL;;;;;;OAMG;IACH,gBALW,sBAAsB,MACtB,YAAY,aACZ,WAAW,UACX,MAAM,QAgChB;IAED;;;;;;OAMG;IACH,kBALW,sBAAsB,MACtB,YAAY,aACZ,WAAW,UACX,MAAM,QAQhB;IAED,cAeC;CACJ;uBAhGsB,qBAAqB;4BAEhB,oCAAoC;uCAEzB,6BAA6B;yBAD3C,6BAA6B;4CAJV,oDAAoD"}
1
+ {"version":3,"file":"GridPosition2TransformSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/grid/grid2transform/GridPosition2TransformSystem.js"],"names":[],"mappings":"AAYA;IAOI,cASC;IAfD,2FAAmE;IACnE,mEAEE;IACF,YAAU;IAKN,4CAKC;IAGL;;;;;;OAMG;IACH,gBALW,sBAAsB,MACtB,YAAY,aACZ,WAAW,UACX,MAAM,QAiChB;IAED;;;;;;OAMG;IACH,kBALW,sBAAsB,MACtB,YAAY,aACZ,WAAW,UACX,MAAM,QAQhB;IAED,cAeC;CACJ;uBAlGsB,qBAAqB;4BAEhB,oCAAoC;uCAGzB,6BAA6B;yBAD3C,6BAA6B;4CALV,oDAAoD"}
@@ -4,6 +4,7 @@ import { ResourceAccessSpecification } from "../../../core/model/ResourceAccessS
4
4
  import { System } from '../../ecs/System.js';
5
5
  import { obtainTerrain } from "../../ecs/terrain/util/obtainTerrain.js";
6
6
  import { Transform64 } from '../../ecs/transform/Transform64.js';
7
+ import { t64_announce_change } from '../../ecs/transform/t64_announce_change.js';
7
8
  import GridPosition from '../position/GridPosition.js';
8
9
  import { GridPosition2Transform } from './GridPosition2Transform.js';
9
10
  import { GridPosition2TransformFlags } from "./GridPosition2TransformFlags.js";
@@ -36,6 +37,7 @@ export class GridPosition2TransformSystem extends System {
36
37
  */
37
38
  link(component, gp, transform, entity) {
38
39
  const mapPoint = this.mapPoint;
40
+ const em = this.entityManager;
39
41
 
40
42
  function sync() {
41
43
  const transformOffset = component.offset;
@@ -46,7 +48,7 @@ export class GridPosition2TransformSystem extends System {
46
48
  const centerX = x + transformOffset.x;
47
49
  const centerY = y + transformOffset.y;
48
50
 
49
- setTransformFromGrid(mapPoint, centerX, centerY, transform);
51
+ setTransformFromGrid(mapPoint, centerX, centerY, transform, em.dataset, entity);
50
52
  }
51
53
 
52
54
  sync.clear = function () {
@@ -107,12 +109,29 @@ const v3 = new Vector3();
107
109
  * @param {number} x
108
110
  * @param {number} y
109
111
  * @param {Transform64} transform
112
+ * @param {EntityComponentDataset} ecd
113
+ * @param {number} entity
110
114
  */
111
- function setTransformFromGrid(mapPointGrid2world, x, y, transform) {
115
+ function setTransformFromGrid(mapPointGrid2world, x, y, transform, ecd, entity) {
112
116
  mapPointGrid2world(x, y, v3);
113
- const transformPosition = transform.translation;
117
+
114
118
  //check if positions are different
115
- if (v3.x !== transformPosition[0] || v3.z !== transformPosition[2]) {
116
- transformPosition.setXZ(v3.x, v3.z);
119
+ if (v3.x === transform.translation_x && v3.z === transform.translation_z) {
120
+ return;
117
121
  }
122
+
123
+ /**
124
+ * `setTranslation`, not `translation.setXZ`: `translation` is a Float64Array view over the
125
+ * transform's own buffer — freshly allocated on every access — and `setXZ` is a Vector3 method
126
+ * that exists nowhere else, so the write used to throw. The exception was swallowed by the
127
+ * signal dispatch on the `gp.onChanged` path, which left the transform silently never moving.
128
+ */
129
+ transform.setTranslation(v3.x, transform.translation_y, v3.z);
130
+
131
+ /**
132
+ * A Transform64 carries no signals, so the write is invisible until it is announced — without
133
+ * this the render placement, the parent/child sync and the spatial audio refit all keep the old
134
+ * position. Translation-only, so no `updateMatrix` is owed: it is a column of the matrix.
135
+ */
136
+ t64_announce_change(ecd, entity);
118
137
  }
@@ -29,8 +29,12 @@ export class Interpoland {
29
29
  * decodes the live component to / from a snapshot
30
30
  * @param {BinaryInterpolationAdapter} interpolation_adapter blends two
31
31
  * snapshots
32
+ * @param {(dataset: EntityComponentDataset, entity: number) => void} [announce]
33
+ * called after the blended snapshot has been written into the live component. A component
34
+ * that carries no signals of its own — {@link Transform64} is the reason this exists — is
35
+ * invisible to everything downstream until someone says it changed, and the writer owes that.
32
36
  */
33
- constructor(type_id: number, component_class: Function, serialization_adapter: BinaryClassSerializationAdapter, interpolation_adapter: BinaryInterpolationAdapter);
37
+ constructor(type_id: number, component_class: Function, serialization_adapter: BinaryClassSerializationAdapter, interpolation_adapter: BinaryInterpolationAdapter, announce?: (dataset: EntityComponentDataset, entity: number) => void);
34
38
  /** @type {number} */
35
39
  type_id: number;
36
40
  /** @type {Function} */
@@ -39,6 +43,8 @@ export class Interpoland {
39
43
  serialization_adapter: BinaryClassSerializationAdapter;
40
44
  /** @type {BinaryInterpolationAdapter} */
41
45
  interpolation_adapter: BinaryInterpolationAdapter;
46
+ /** @type {(dataset: EntityComponentDataset, entity: number) => void} */
47
+ announce: (dataset: EntityComponentDataset, entity: number) => void;
42
48
  /**
43
49
  * @readonly
44
50
  * @type {boolean}
@@ -1 +1 @@
1
- {"version":3,"file":"Interpoland.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/Interpoland.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IACI;;;;;;;OAOG;IACH,qBAPW,MAAM,wIAgBhB;IARG,qBAAqB;IACrB,SADW,MAAM,CACK;IACtB,uBAAuB;IACvB,0BAAsC;IACtC,8CAA8C;IAC9C,uDAAkD;IAClD,yCAAyC;IACzC,kDAAkD;IAI1D;;;OAGG;IACH,wBAFU,OAAO,CAEkB;CANlC"}
1
+ {"version":3,"file":"Interpoland.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/Interpoland.js"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IACI;;;;;;;;;;;OAWG;IACH,qBAXW,MAAM,mJAMN,CAAC,OAAO,wBAAwB,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EAgBnE;IAVG,qBAAqB;IACrB,SADW,MAAM,CACK;IACtB,uBAAuB;IACvB,0BAAsC;IACtC,8CAA8C;IAC9C,uDAAkD;IAClD,yCAAyC;IACzC,kDAAkD;IAClD,wEAAwE;IACxE,UADW,CAAC,OAAO,wBAAwB,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAC5C;IAIhC;;;OAGG;IACH,wBAFU,OAAO,CAEkB;CANlC"}
@@ -1,3 +1,4 @@
1
+ import { noop } from "../../core/function/noop.js";
1
2
  /**
2
3
  * Descriptor for ONE thing the interpolation system blends for an entity.
3
4
  *
@@ -29,8 +30,12 @@ export class Interpoland {
29
30
  * decodes the live component to / from a snapshot
30
31
  * @param {BinaryInterpolationAdapter} interpolation_adapter blends two
31
32
  * snapshots
33
+ * @param {(dataset: EntityComponentDataset, entity: number) => void} [announce]
34
+ * called after the blended snapshot has been written into the live component. A component
35
+ * that carries no signals of its own — {@link Transform64} is the reason this exists — is
36
+ * invisible to everything downstream until someone says it changed, and the writer owes that.
32
37
  */
33
- constructor(type_id, component_class, serialization_adapter, interpolation_adapter) {
38
+ constructor(type_id, component_class, serialization_adapter, interpolation_adapter, announce = noop) {
34
39
  /** @type {number} */
35
40
  this.type_id = type_id;
36
41
  /** @type {Function} */
@@ -39,6 +44,8 @@ export class Interpoland {
39
44
  this.serialization_adapter = serialization_adapter;
40
45
  /** @type {BinaryInterpolationAdapter} */
41
46
  this.interpolation_adapter = interpolation_adapter;
47
+ /** @type {(dataset: EntityComponentDataset, entity: number) => void} */
48
+ this.announce = announce;
42
49
  }
43
50
  }
44
51
 
@@ -1 +1 @@
1
- {"version":3,"file":"InterpolationSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/InterpolationSystem.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;IAOI;;OAEG;IACH,0DAFW;QAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,EA6CvE;IAnDD,sCAA8B;IAC9B,oEAEE;IAQE;;;;OAIG;IACH,KAFU,gBAAgB,CAEkD;IAE5E;;;;;OAKG;IACH,mBAA2B;IAE3B;;;;OAIG;IACH,kBAAmC;IAGnC;;;;;;;OAOG;IACH,kBAA0B;IAE1B;;;;;OAKG;IACH,yBAAiC;IAGrC;;;;;;;;;;;OAWG;IACH,yBAJW,MAAM,OACN,gBAAgB,UAChB,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,QAI7D;IAED;;;;;OAKG;IACH,2BAHW,MAAM,GACJ,OAAO,CAInB;IAED;;OAEG;IACH,qDAEC;IAED;;;OAGG;IACH,mBAHW,YAAY,UACZ,MAAM,QAShB;IAED;;;OAGG;IACH,qBAHW,YAAY,UACZ,MAAM,QAIhB;IAED,sBA0FC;IAGL;;;OAGG;IACH,gCAFU,OAAO,CAEkC;CANlD;uBAxOsB,kBAAkB;6BAEyC,mBAAmB;4CAHzD,iDAAiD;iCAE5D,uBAAuB"}
1
+ {"version":3,"file":"InterpolationSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/InterpolationSystem.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;IAOI;;OAEG;IACH,0DAFW;QAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,EA6CvE;IAnDD,sCAA8B;IAC9B,oEAEE;IAQE;;;;OAIG;IACH,KAFU,gBAAgB,CAEkD;IAE5E;;;;;OAKG;IACH,mBAA2B;IAE3B;;;;OAIG;IACH,kBAAmC;IAGnC;;;;;;;OAOG;IACH,kBAA0B;IAE1B;;;;;OAKG;IACH,yBAAiC;IAGrC;;;;;;;;;;;OAWG;IACH,yBAJW,MAAM,OACN,gBAAgB,UAChB,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,QAI7D;IAED;;;;;OAKG;IACH,2BAHW,MAAM,GACJ,OAAO,CAInB;IAED;;OAEG;IACH,qDAEC;IAED;;;OAGG;IACH,mBAHW,YAAY,UACZ,MAAM,QAShB;IAED;;;OAGG;IACH,qBAHW,YAAY,UACZ,MAAM,QAIhB;IAED,sBA6FC;IAGL;;;OAGG;IACH,gCAFU,OAAO,CAEkC;CANlD;uBA3OsB,kBAAkB;6BAEyC,mBAAmB;4CAHzD,iDAAiD;iCAE5D,uBAAuB"}
@@ -230,6 +230,9 @@ export class InterpolationSystem extends System {
230
230
 
231
231
  scratch.position = 0;
232
232
  interpoland.serialization_adapter.deserialize(scratch, target);
233
+
234
+ // the write is invisible to everything downstream until it is announced
235
+ interpoland.announce(dataset, entity);
233
236
  }
234
237
  }
235
238
  }
@@ -8,9 +8,11 @@
8
8
  * fidelity in a massive world needs the full mantissa far from the origin, and
9
9
  * the interpolation log is local memory, not wire bytes.
10
10
  *
11
- * `deserialize` writes through `position.set` / `rotation.set` so the
12
- * Transform's onChanged subscribers (render, culling, particles, trails,
13
- * attachments) all observe the interpolated pose.
11
+ * `deserialize` writes the pose and recomposes the matrix, because a
12
+ * {@link Transform64} does not maintain it. Telling the rest of the engine that
13
+ * the row changed is the caller's half: a Transform64 carries no signals either,
14
+ * so {@link InterpolationSystem} announces through the interpoland once the write
15
+ * has landed.
14
16
  *
15
17
  * @author Alex Goldring
16
18
  * @copyright Company Named Limited (c) 2026
@@ -1 +1 @@
1
- {"version":3,"file":"TransformPoseSerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/TransformPoseSerializationAdapter.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH;;IAEI,0BAAoB;IAGpB;;;OAGG;IACH,2CAFW,WAAW,QAWrB;IAED;;;OAGG;IACH,6CAFW,WAAW,QAYrB;CACJ;gDAvD+C,0DAA0D;4BAC9E,iCAAiC"}
1
+ {"version":3,"file":"TransformPoseSerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/TransformPoseSerializationAdapter.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AACH;;IAEI,0BAAoB;IAGpB;;;OAGG;IACH,2CAFW,WAAW,QAWrB;IAED;;;OAGG;IACH,6CAFW,WAAW,QAqBrB;CACJ;gDAlE+C,0DAA0D;4BAC9E,iCAAiC"}
@@ -11,9 +11,11 @@ import { Transform64 } from "../ecs/transform/Transform64.js";
11
11
  * fidelity in a massive world needs the full mantissa far from the origin, and
12
12
  * the interpolation log is local memory, not wire bytes.
13
13
  *
14
- * `deserialize` writes through `position.set` / `rotation.set` so the
15
- * Transform's onChanged subscribers (render, culling, particles, trails,
16
- * attachments) all observe the interpolated pose.
14
+ * `deserialize` writes the pose and recomposes the matrix, because a
15
+ * {@link Transform64} does not maintain it. Telling the rest of the engine that
16
+ * the row changed is the caller's half: a Transform64 carries no signals either,
17
+ * so {@link InterpolationSystem} announces through the interpoland once the write
18
+ * has landed.
17
19
  *
18
20
  * @author Alex Goldring
19
21
  * @copyright Company Named Limited (c) 2026
@@ -52,5 +54,14 @@ export class TransformPoseSerializationAdapter extends BinaryClassSerializationA
52
54
  const rw = buffer.readFloat64();
53
55
  transform.setTranslation(px, py, pz);
54
56
  transform.setRotation(rx, ry, rz, rw);
57
+
58
+ /**
59
+ * `setRotation` does not touch the matrix — it says so — and the matrix is what render
60
+ * placement, culling and attachments read. Without this the rotation half of every
61
+ * interpolated pose was written into slots nothing looks at, and the object rendered at
62
+ * whatever pose was last composed. The translation half escaped only because the translation
63
+ * *is* the matrix's fourth column.
64
+ */
65
+ transform.updateMatrix();
55
66
  }
56
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pose_interpoland.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/pose_interpoland.js"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,2BAFU,MAAM,CAEc;AAE9B;;;;;GAKG;AACH,+BAFU,WAAW,CAOnB;4BAzB0B,kBAAkB"}
1
+ {"version":3,"file":"pose_interpoland.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/pose_interpoland.js"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,2BAFU,MAAM,CAEc;AAE9B;;;;;GAKG;AACH,+BAFU,WAAW,CAQnB;4BA1B0B,kBAAkB"}
@@ -1,4 +1,5 @@
1
1
  import { Transform64 } from "../ecs/transform/Transform64.js";
2
+ import { t64_announce_change } from "../ecs/transform/t64_announce_change.js";
2
3
  import { Interpoland } from "./Interpoland.js";
3
4
  import { PoseInterpolationAdapter } from "./PoseInterpolationAdapter.js";
4
5
  import { TransformPoseSerializationAdapter } from "./TransformPoseSerializationAdapter.js";
@@ -24,4 +25,5 @@ export const POSE_INTERPOLAND = new Interpoland(
24
25
  Transform64,
25
26
  new TransformPoseSerializationAdapter(),
26
27
  new PoseInterpolationAdapter(),
28
+ t64_announce_change,
27
29
  );
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkPeer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/network/orchestrator/NetworkPeer.js"],"names":[],"mappings":";;;;;gCAgDU,MAAM;;;;;;;;;;;;;;;;;;;iCA2HI,MAAM;AAF1B;;;GAGG;AACH;;;;;IAKI;;;;;OAKG;;IAEH;;;;;;;;OAQG;;GAEJ;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH;IAgDI;;;;;;;;;;;;;OAaG;IACH,gMAbW;QACV,KAAS,yBAAyB;QAClC,eAAmB,8BAA8B;QACjD,qBAAyB,EAAE,UAAU,CAAC;QACtC,cAAkB,EAAE,UAAU,CAAC;QAC/B,YAAgB,CAAC,EAAE;YAAE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;QACxF,cAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,eAAmB,CAAC,EAAE,cAAc,GAAC,IAAI,CAAC;QAC1C,oBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,oBAAwB,CAAC,EAAE,MAAM,CAAC;KAC/B,EAuPH;IAnOG,qCAAqC;IACrC,8BAAkB;IAElB,0CAA0C;IAC1C,oBADW,2BAA2B,CACoC;IAK1E,gCAAgC;IAChC,iBADW,iBAAiB,CACkB;IAK9C,mCAAmC;IACnC,YADW,oBAAoB,CACa;IAE5C,wBAAwB;IACxB,YADW,SAAS,CACoD;IAExE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,sBAFU,MAAM,CAEgC;IAEhD;;;;;;;;OAQG;IACH,iBAFU,cAAc,GAAC,IAAI,CAES;IAatC,gCAAgC;IAChC,UADW,iBAAiB,CAQ1B;IAEF,yBAAyB;IACzB,YADW,UAAU,CAOnB;IAEF,uBAAuB;IACvB,UADW,QAAQ,CACW;IAgC9B;;;;;;OAMG;IACH,mBAFU,MAAM,CAEqB;IAErC;;;;;;OAMG;IACH,mBAFU,MAAM,CAEqB;IAErC;;;;;;;;OAQG;IACH,cAFU,MAAM,CAEgB;IAEhC;;;;;;;;OAQG;IACH,aAFU,MAAM,CAEe;IAE/B;;;;OAIG;IACH,wBAFU,MAAM,CAE0B;IAE1C;;;;;;OAMG;IACH,eAFU,MAAM,CAEiB;IAEjC;;;;;;;;;OASG;IACH,eAFU,MAAM,CAEiB;IAEjC;;;;OAIG;IACH,gBAFU,MAAM,CAEkB;IAElC;;;;OAIG;IACH,gBAFU,MAAM,CAEkB;IAElC;;;;;OAKG;IACH,oBAFU,MAAM,CAEsB;IAEtC;;;;;;;;;;;;;OAaG;IACH,mBAFU,MAAM,CAEqB;IAGzC;;;;;;;OAOG;IACH,sBAHW,MAAM,aACN;QAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,GAAG,CAAA;KAAE,QAuS3E;IAED;;;OAGG;IACH,yBAFW,MAAM,QAgChB;IAED;;;;OAIG;IACH,sBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;OAIG;IACH,6BAFa,MAAM,CAIlB;IAED;;;;;;;;OAQG;IACH,uBAHW,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;;;OASG;IACH,2BAHW,MAAM,GACJ,MAAM,CAKlB;IAED;;;;OAIG;IACH,qBAHW,MAAM,GACJ,OAAO,GAAC,SAAS,CAK7B;IAED;;;;;;;OAOG;IACH,yBAFW,MAAM,QAYhB;IAED;;;;;;;;OAQG;IACH,iBAkBC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,8BAFW,MAAM,QA6JhB;IAiGD;;;;;;;;;;;;OAYG;IACH,+BAJW,MAAM,cACN,MAAM,YACN,MAAM,QAchB;IAED;;;;;;;;;;;;;OAaG;IACH,oCAJW,MAAM,cACN,MAAM,YACN,MAAM,QA8ChB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,yBALW,MAAM,gBACN,MAAM,cACN,MAAM,mBACG,YAAY,KAAG,IAAI,QAgBtC;IAED;;;;;;;;;OASG;IACH,2BALW,MAAM,iBACN,UAAU,gBACV,MAAM,mBACG,YAAY,KAAG,IAAI,QAiBtC;IAED;;;;;;;;;;OAUG;IACH,2BARW,MAAM,iBACN,MAAM,oBACN,MAAM,aACN,OAAO,iBAGP,UAAU,QAmBpB;IAED;;;OAGG;IACH,4BAFW,MAAM,QAUhB;IAED;;;;OAIG;IACH,4BAHW,MAAM,eACN,MAAM,QAYhB;IAED;;;;;;OAMG;IACH,yBAHW,MAAM,iBACN,MAAM,QAgBhB;IAED;;;;;;;OAOG;IACH,qCAHW,MAAM,gBACN,MAAM,QAgBhB;IAED;;;;;;;;;;;;;;OAcG;IACH,+BALW,MAAM,WACN,UAAU,UACV,MAAM,GACJ,MAAM,CAUlB;;CACJ;;;;;;;;;;;;;;;;;yBA3zCY;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAC;4CA7M7D,uCAAuC;kCAEjD,6BAA6B;qCAK1B,kCAAkC;0BAR7C,qBAAqB;+BAOhB,4BAA4B;kCALZ,6BAA6B;2BAJjD,8BAA8B;yBAOhC,sBAAsB;mBAV5B,uCAAuC;wBAclC,yBAAyB;6BAfpB,sCAAsC"}
1
+ {"version":3,"file":"NetworkPeer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/network/orchestrator/NetworkPeer.js"],"names":[],"mappings":"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"}
@@ -988,16 +988,6 @@ export class NetworkPeer {
988
988
  this.#tick_open = false;
989
989
 
990
990
  this.flush_outbound(this.#current_frame);
991
-
992
- // Per-tick fragment maintenance: age out sender-side retention
993
- // and drive NACK emission for any incomplete inbound messages.
994
- // Runs AFTER the action-stream send loop so the shared
995
- // __send_buffer is free for the on_nack closure to reuse.
996
- const now_ms = performance.now();
997
- for (const [, conn] of this.#peers) {
998
- conn.fragment_retention.service(now_ms);
999
- conn.fragment_assembler.service(now_ms, conn.on_nack);
1000
- }
1001
991
  }
1002
992
 
1003
993
  /**
@@ -1174,6 +1164,21 @@ export class NetworkPeer {
1174
1164
  // Reset the per-tick changed-entity set so the next tick starts clean.
1175
1165
  // (begin_tick also clears it; the dual call is harmless.)
1176
1166
  if (this.#changed_entities !== null) this.#changed_entities.clear();
1167
+
1168
+ // Per-tick fragment maintenance: age out sender-side retention and drive NACK emission for
1169
+ // any incomplete inbound messages. Runs AFTER the action-stream send loop so the shared
1170
+ // #send_buffer is free for the on_nack closure to reuse.
1171
+ //
1172
+ // Here and not in `end_tick`: a host never calls `end_tick`. ServerAuthoritativeServer
1173
+ // bypasses it and drives `flush_outbound` directly because it manages action_log frames
1174
+ // itself across the rollback replay, so with these two calls one level up, NACK recovery and
1175
+ // retention age-out were inoperative in the client -> host direction — the direction that
1176
+ // carries player input.
1177
+ const now_ms = performance.now();
1178
+ for (const [, conn] of this.#peers) {
1179
+ conn.fragment_retention.service(now_ms);
1180
+ conn.fragment_assembler.service(now_ms, conn.on_nack);
1181
+ }
1177
1182
  }
1178
1183
 
1179
1184
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ClothWorld.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/ecs/ClothWorld.js"],"names":[],"mappings":"AA2DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFG;AACH;IAEI;;;OAGG;IACH,SAFU,YAAY,CAEoB;IAE1C;;;;;;;;;;;;OAYG;IACH,WAFU,aAAa,EAAE,CAEV;IAEf;;;;;;;;;;;;;;;OAeG;IACH,QAFU;QAAC,WAAW,SAAW,MAAM,KAAG,CAAC,iBAAe,IAAI,CAAC,CAAA;KAAC,GAAC,IAAI,CAEvD;IAEd;;OAEG;IACH,eAFU,gBAAc,IAAI,CAEP;IAErB;;OAEG;IACH,aAFU,yBAAyB,GAAC,IAAI,CAErB;IAEnB;;;;;;OAMG;IACH,WAFU,mBAAmB,GAAC,IAAI,CAEjB;IAEjB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAFU,oBAAkB,IAAI,CAEpB;IAEZ;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAFU,MAAM,CAEP;IAET;;;;;OAKG;IACH,uBAAmB;IAEnB;;;;;OAKG;IACH,cAFU,OAAO,CAEI;IAErB;;;OAGG;IACH,oBAAwB;IAExB;;;;;;;;;;;;;;;;OAgBG;IACH,uBAKE;IAEF;;;;;OAKG;IACH,2CAiBC;IAED;;;;;OAKG;IACH,YALW,KAAK,kCAEL,MAAM,GACJ,aAAa,CAczB;IAED;;;;;;;;OAQG;IACH,iDAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,iDAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,eAHW,MAAM,GACJ,aAAa,GAAC,SAAS,CA0BnC;IA+CD;;;;;;;;;;;OAWG;IACH,eAHW,MAAM,GACJ,aAAa,GAAC,SAAS,CAanC;IAED;;;;;;;OAOG;IACH,aAHW,MAAM,GACJ,IAAI,CAShB;IAED;;;OAGG;IACH,mBAHW,MAAM,GACJ,aAAa,GAAC,SAAS,CAInC;IAED;;;;;OAKG;IACH,uCAFW,MAAM,QAgBhB;IAED;;;;;;;;;OASG;IACH,wBANW,aAAa,mCAEb,MAAM,GACJ,OAAO,CA8BnB;IAED;;;;;;;OAOG;IACH,iBAJW,aAAa,gCAEX,IAAI,CA2BhB;IAwFD;;;;;;;;;;;OAWG;IACH,kBAPW,aAAa,MACb,MAAM,UACN,YAAY,UACZ,MAAM,GACJ,OAAO,CAgPnB;;CA8EJ;8BAl8B6B,oBAAoB;0CAjB3C,gEAAgE;oCAcnC,0BAA0B;sBA4BxC,YAAY"}
1
+ {"version":3,"file":"ClothWorld.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/ecs/ClothWorld.js"],"names":[],"mappings":"AA2DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFG;AACH;IAEI;;;OAGG;IACH,SAFU,YAAY,CAEoB;IAE1C;;;;;;;;;;;;OAYG;IACH,WAFU,aAAa,EAAE,CAEV;IAEf;;;;;;;;;;;;;;;OAeG;IACH,QAFU;QAAC,WAAW,SAAW,MAAM,KAAG,CAAC,iBAAe,IAAI,CAAC,CAAA;KAAC,GAAC,IAAI,CAEvD;IAEd;;OAEG;IACH,eAFU,gBAAc,IAAI,CAEP;IAErB;;OAEG;IACH,aAFU,yBAAyB,GAAC,IAAI,CAErB;IAEnB;;;;;;OAMG;IACH,WAFU,mBAAmB,GAAC,IAAI,CAEjB;IAEjB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAFU,oBAAkB,IAAI,CAEpB;IAEZ;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAFU,MAAM,CAEP;IAET;;;;;OAKG;IACH,uBAAmB;IAEnB;;;;;OAKG;IACH,cAFU,OAAO,CAEI;IAErB;;;OAGG;IACH,oBAAwB;IAExB;;;;;;;;;;;;;;;;OAgBG;IACH,uBAKE;IAEF;;;;;OAKG;IACH,2CAiBC;IAED;;;;;OAKG;IACH,YALW,KAAK,kCAEL,MAAM,GACJ,aAAa,CAczB;IAED;;;;;;;;OAQG;IACH,iDAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,iDAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,eAHW,MAAM,GACJ,aAAa,GAAC,SAAS,CA0BnC;IA+CD;;;;;;;;;;;OAWG;IACH,eAHW,MAAM,GACJ,aAAa,GAAC,SAAS,CAanC;IAED;;;;;;;OAOG;IACH,aAHW,MAAM,GACJ,IAAI,CAShB;IAED;;;OAGG;IACH,mBAHW,MAAM,GACJ,aAAa,GAAC,SAAS,CAInC;IAED;;;;;OAKG;IACH,uCAFW,MAAM,QAgBhB;IAED;;;;;;;;;OASG;IACH,wBANW,aAAa,mCAEb,MAAM,GACJ,OAAO,CA8BnB;IAED;;;;;;;OAOG;IACH,iBAJW,aAAa,gCAEX,IAAI,CA4ChB;IAwFD;;;;;;;;;;;OAWG;IACH,kBAPW,aAAa,MACb,MAAM,UACN,YAAY,UACZ,MAAM,GACJ,OAAO,CAgPnB;;CA8EJ;8BAn9B6B,oBAAoB;0CAjB3C,gEAAgE;oCAcnC,0BAA0B;sBA4BxC,YAAY"}
@@ -549,6 +549,23 @@ export class ClothWorld {
549
549
  * @returns {void}
550
550
  */
551
551
  finish(instance, ecd) {
552
+ if (!instance.seeded) {
553
+ /**
554
+ * The seeding this step ran against is gone. `#rig_removed` nulls `instance.rig` from an
555
+ * observer callback while every rig-path array is still in place, and `cloth_seed_rig`
556
+ * leaves the entity-path arrays empty on purpose so a stale write-back cannot reach a
557
+ * previous seeding's entities — so between the removal and the next `#seed` the writer
558
+ * this method picks and the arrays it would read disagree.
559
+ *
560
+ * Under `ClothSystem` that window never opens: step and finish are one block. Under
561
+ * `WorkerClothSystem` a whole frame sits between dispatch and join, so taking a cape off
562
+ * landed the join on `cloth_write_back` reading an `undefined` transform, inside the
563
+ * fixed pass. `seeded` is the flag that actually tracks the arrays, so it is what this
564
+ * follows; the result is discarded and the next step re-seeds and steps again.
565
+ */
566
+ return;
567
+ }
568
+
552
569
  const result = instance.state.result;
553
570
 
554
571
  instance.contact_count = result[ClothStepResult.CONTACT_COUNT];
@@ -1 +1 @@
1
- {"version":3,"file":"MLS_MPM.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/mls-mpm/MLS_MPM.js"],"names":[],"mappings":"AAcA;IACI,iBAAe;IAIX;;;;;OAKG;IACH,MAFU,YAAY,CAEiB;IAG3C;;;OAGG;IACH,YAFW,MAAM,QAyVhB;IAED;;;;;;;;;;;OAWG;IACH,uBALW,MAAM,EAAE,KACR,MAAM,gBACK,MAAM,UACjB,MAAM,QAgBhB;CACJ"}
1
+ {"version":3,"file":"MLS_MPM.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/mls-mpm/MLS_MPM.js"],"names":[],"mappings":"AAcA;IACI,iBAAe;IAIX;;;;;OAKG;IACH,MAFU,YAAY,CAEiB;IAG3C;;;OAGG;IACH,YAFW,MAAM,QAuWhB;IAED;;;;;;;;;;;OAWG;IACH,uBALW,MAAM,EAAE,KACR,MAAM,gBACK,MAAM,UACjB,MAAM,QAgBhB;CACJ"}
@@ -316,6 +316,16 @@ export class MLS_MPMSolver {
316
316
 
317
317
  const grid_y = base_coordinate_y + j;
318
318
 
319
+ // Same guard as the scatter above, which this loop was missing entirely. The stencil
320
+ // reaches `base + 2` and the base reaches the last cell, so a particle near the far
321
+ // corner indexed past the end of the flat grid, read `undefined`, and turned itself
322
+ // into NaN for the rest of the simulation - the hardening `Math.exp` and the polar
323
+ // decomposition both propagate it, and its next scatter poisons whatever node
324
+ // `(NaN | 0)` maps to, which is the corner of the domain.
325
+ if (grid_y < 0 || grid_y >= n) {
326
+ continue;
327
+ }
328
+
319
329
  for (let i = 0; i < 3; i++) {
320
330
 
321
331
  const i2 = i * 2;
@@ -323,6 +333,10 @@ export class MLS_MPMSolver {
323
333
 
324
334
  const grid_x = base_coordinate_x + i;
325
335
 
336
+ if (grid_x < 0 || grid_x >= n) {
337
+ continue;
338
+ }
339
+
326
340
  const cell_index = grid_x + grid_width * grid_y;
327
341
 
328
342
  const cell_address = cell_index * 3;
@@ -55,7 +55,7 @@ export class AbstractAudioClip {
55
55
  * @param {number} [gainDb] accumulated gain offset (dB); start with the event's master gain
56
56
  * @param {number} [pitchCents] accumulated pitch offset (cents)
57
57
  * @param {number} [offset] start time of this clip relative to the timeline origin (seconds)
58
- * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number}[], duration: number}}
58
+ * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number, duration: number}[], duration: number}}
59
59
  */
60
60
  planTimeline(env: {
61
61
  durationOf: (arg0: SampleAudioClip) => number;
@@ -67,6 +67,7 @@ export class AbstractAudioClip {
67
67
  offset: number;
68
68
  gainDb: number;
69
69
  pitchCents: number;
70
+ duration: number;
70
71
  }[];
71
72
  duration: number;
72
73
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/AbstractAudioClip.js"],"names":[],"mappings":"AAGA;;;GAGG;AAEH;;;;;;;;;;GAUG;AACH;IAEI;;;OAGG;IACH,MAFU,MAAM,CAEP;IAET;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,8BAFW,iBAAiB,QAK3B;IAED;;;;;OAKG;IACH,cAHW,iBAAiB,GACf,OAAO,CAKnB;IAED;;;;OAIG;IACH,QAFa,MAAM,CAOlB;IAED;;;;;;;;;;;;;;OAcG;IACH,kBATW;QAAC,UAAU,SAAW,eAAe,KAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,oBAAoB,CAAC;QAAC,YAAY,SAAW,MAAM,KAAE,CAAC,MAAM,GAAC,SAAS,CAAC,CAAA;KAAC,WAIjI,MAAM,eACN,MAAM,WACN,MAAM,GACJ;QAAC,KAAK,EAAE;YAAC,IAAI,EAAE,eAAe,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAC,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,CAIpH;IAED;;;;;;;;OAQG;IACH,yBAHW,eAAe,EAAE,GACf,eAAe,EAAE,CAI7B;IAED;;;;;;OAMG;IACH,SAFa,OAAO,CAInB;IAGL;;;OAGG;IACH,sBAFU,OAAO,CAEsB;CANtC;mCAvGY,OAAO,uCAAuC,EAAE,oBAAoB;8BACpE,OAAO,sBAAsB,EAAE,eAAe"}
1
+ {"version":3,"file":"AbstractAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/AbstractAudioClip.js"],"names":[],"mappings":"AAGA;;;GAGG;AAEH;;;;;;;;;;GAUG;AACH;IAEI;;;OAGG;IACH,MAFU,MAAM,CAEP;IAET;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,8BAFW,iBAAiB,QAK3B;IAED;;;;;OAKG;IACH,cAHW,iBAAiB,GACf,OAAO,CAKnB;IAED;;;;OAIG;IACH,QAFa,MAAM,CAOlB;IAED;;;;;;;;;;;;;;OAcG;IACH,kBATW;QAAC,UAAU,SAAW,eAAe,KAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,oBAAoB,CAAC;QAAC,YAAY,SAAW,MAAM,KAAE,CAAC,MAAM,GAAC,SAAS,CAAC,CAAA;KAAC,WAIjI,MAAM,eACN,MAAM,WACN,MAAM,GACJ;QAAC,KAAK,EAAE;YAAC,IAAI,EAAE,eAAe,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,CAItI;IAED;;;;;;;;OAQG;IACH,yBAHW,eAAe,EAAE,GACf,eAAe,EAAE,CAI7B;IAED;;;;;;OAMG;IACH,SAFa,OAAO,CAInB;IAGL;;;OAGG;IACH,sBAFU,OAAO,CAEsB;CANtC;mCAvGY,OAAO,uCAAuC,EAAE,oBAAoB;8BACpE,OAAO,sBAAsB,EAAE,eAAe"}
@@ -76,7 +76,7 @@ export class AbstractAudioClip {
76
76
  * @param {number} [gainDb] accumulated gain offset (dB); start with the event's master gain
77
77
  * @param {number} [pitchCents] accumulated pitch offset (cents)
78
78
  * @param {number} [offset] start time of this clip relative to the timeline origin (seconds)
79
- * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number}[], duration: number}}
79
+ * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number, duration: number}[], duration: number}}
80
80
  */
81
81
  planTimeline(env, gainDb = 0, pitchCents = 0, offset = 0) {
82
82
  throw new Error('Implementation must override planTimeline()');
@@ -40,6 +40,7 @@ export class BlendContainerAudioClip extends ContainerAudioClip {
40
40
  offset: number;
41
41
  gainDb: number;
42
42
  pitchCents: number;
43
+ duration: number;
43
44
  }[];
44
45
  duration: number;
45
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BlendContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH;IAqBI;;;;OAIG;IACH,uBAJW,mBAAmB,wCACnB;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAC;QAAC,MAAM,CAAC,EAAC,cAAc,EAAE,CAAA;KAAC,GACjE,uBAAuB,CAWnC;IAjCD;;;OAGG;IACH,WAFU,MAAM,CAED;IAEf;;;OAGG;IACH,cAFU,MAAM,CAEC;IAEjB;;;;OAIG;IACH,QAFU,cAAc,EAAE,CAEd;IAkCZ;;;;;;;;MA+BC;IAED;;;OAGG;IACH,cAHW,uBAAuB,GACrB,OAAO,CAkBnB;IAqBD,iCAaC;IAED;;;;;;;;;;;;MASC;IAED;;;;;;;aAWC;;CACJ;;;;mCAjLkC,yBAAyB;+BAF7B,+CAA+C"}
1
+ {"version":3,"file":"BlendContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH;IAqBI;;;;OAIG;IACH,uBAJW,mBAAmB,wCACnB;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAC;QAAC,MAAM,CAAC,EAAC,cAAc,EAAE,CAAA;KAAC,GACjE,uBAAuB,CAWnC;IAjCD;;;OAGG;IACH,WAFU,MAAM,CAED;IAEf;;;OAGG;IACH,cAFU,MAAM,CAEC;IAEjB;;;;OAIG;IACH,QAFU,cAAc,EAAE,CAEd;IAkCZ;;;;;;;;;MA+BC;IAED;;;OAGG;IACH,cAHW,uBAAuB,GACrB,OAAO,CAkBnB;IAqBD,iCAaC;IAED;;;;;;;;;;;;MASC;IAED;;;;;;;aAWC;;CACJ;;;;mCAjLkC,yBAAyB;+BAF7B,+CAA+C"}
@@ -90,6 +90,7 @@ export class RandomContainerAudioClip extends ContainerAudioClip {
90
90
  offset: number;
91
91
  gainDb: number;
92
92
  pitchCents: number;
93
+ duration: number;
93
94
  }[];
94
95
  duration: number;
95
96
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RandomContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH;IAqEI;;;;;;OAMG;IACH,uBALW,mBAAmB,oCACnB;QAAC,kBAAkB,CAAC,EAAC,MAAM,CAAC;QAAC,OAAO,CAAC,EAAC,MAAM,EAAE,CAAA;KAAC,GAE7C,wBAAwB,CAapC;IArFD;;;OAGG;IACH,sBAFU,MAAM,CAES;IAEzB;;;;;;;;;;;;OAYG;IACH,SAFU,MAAM,EAAE,CAEL;IAEb;;;;;OAKG;IACH,4CAFa,IAAI,CAQhB;IAWD;;;;;;OAMG;IACH,oBAHW,MAAM,EAAE,GACN,IAAI,CAgBhB;IAsBD;;;;OAIG;IACH,cAHW,wBAAwB,GACtB,OAAO,CAuBnB;IAcD,kCAaC;IAED;;;;;;;;;MAQC;IAED;;;;;;aAQC;IAED;;;;;;;;OAQG;IACH,gDAFa,MAAM,CA6BlB;IAED;;;;;;;;MAQC;CACJ;;;;mCA5NkC,yBAAyB"}
1
+ {"version":3,"file":"RandomContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH;IAqEI;;;;;;OAMG;IACH,uBALW,mBAAmB,oCACnB;QAAC,kBAAkB,CAAC,EAAC,MAAM,CAAC;QAAC,OAAO,CAAC,EAAC,MAAM,EAAE,CAAA;KAAC,GAE7C,wBAAwB,CAapC;IArFD;;;OAGG;IACH,sBAFU,MAAM,CAES;IAEzB;;;;;;;;;;;;OAYG;IACH,SAFU,MAAM,EAAE,CAEL;IAEb;;;;;OAKG;IACH,4CAFa,IAAI,CAQhB;IAWD;;;;;;OAMG;IACH,oBAHW,MAAM,EAAE,GACN,IAAI,CAgBhB;IAsBD;;;;OAIG;IACH,cAHW,wBAAwB,GACtB,OAAO,CAuBnB;IAcD,kCAaC;IAED;;;;;;;;;MAQC;IAED;;;;;;aAQC;IAED;;;;;;;;OAQG;IACH,gDAFa,MAAM,CA6BlB;IAED;;;;;;;;;MAQC;CACJ;;;;mCA5NkC,yBAAyB"}
@@ -91,7 +91,7 @@ export class SampleAudioClip extends AbstractAudioClip {
91
91
  * @param {number} [gainDb]
92
92
  * @param {number} [pitchCents]
93
93
  * @param {number} [offset]
94
- * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number}[], duration: number}}
94
+ * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number, duration: number}[], duration: number}}
95
95
  */
96
96
  planTimeline(env: any, gainDb?: number, pitchCents?: number, offset?: number): {
97
97
  plays: {
@@ -99,6 +99,7 @@ export class SampleAudioClip extends AbstractAudioClip {
99
99
  offset: number;
100
100
  gainDb: number;
101
101
  pitchCents: number;
102
+ duration: number;
102
103
  }[];
103
104
  duration: number;
104
105
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SampleAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/SampleAudioClip.js"],"names":[],"mappings":"AAKA;;;;GAIG;AACH;IA2CI;;;;;OAKG;IACH,iBAJW,MAAM,mFACN;QAAC,UAAU,CAAC,EAAC,OAAO,CAAC;QAAC,IAAI,CAAC,EAAC,OAAO,CAAC;QAAC,IAAI,CAAC,EAAC,MAAM,CAAC;QAAC,KAAK,CAAC,EAAC,MAAM,CAAC;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,OAAO,CAAC,EAAC,MAAM,CAAC;QAAC,WAAW,CAAC,EAAC,MAAM,CAAC;QAAC,UAAU,CAAC,EAAC,MAAM,CAAA;KAAC,GAC5I,eAAe,CAyB3B;IAtED;;;OAGG;IACH,KAFU,MAAM,CAEP;IAET;;;OAGG;IACH,YAFU,OAAO,CAEE;IAEnB;;OAEG;IACH,MAFU,OAAO,CAEJ;IAEb;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,SAFU,MAAM,CAEJ;IAEZ;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,YAFU,MAAM,CAED;IAiCf;;;;OAIG;IACH,cAHW,eAAe,GACb,OAAO,CAWnB;IAkBD;;OAEG;IACH,SAFa,eAAe,CAe3B;IAED;;;;;;;;;;MAYC;IAED;;;;;;;;;;aAUC;IAED;;;;;;OAMG;IACH,gCALW,MAAM,eACN,MAAM,WACN,MAAM,GACJ;QAAC,KAAK,EAAE;YAAC,IAAI,EAAE,eAAe,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAC,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,CAoBpH;IAED,uCAGC;CAKJ;;;;kCAhMiC,wBAAwB"}
1
+ {"version":3,"file":"SampleAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/SampleAudioClip.js"],"names":[],"mappings":"AAKA;;;;GAIG;AACH;IA2CI;;;;;OAKG;IACH,iBAJW,MAAM,mFACN;QAAC,UAAU,CAAC,EAAC,OAAO,CAAC;QAAC,IAAI,CAAC,EAAC,OAAO,CAAC;QAAC,IAAI,CAAC,EAAC,MAAM,CAAC;QAAC,KAAK,CAAC,EAAC,MAAM,CAAC;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,OAAO,CAAC,EAAC,MAAM,CAAC;QAAC,WAAW,CAAC,EAAC,MAAM,CAAC;QAAC,UAAU,CAAC,EAAC,MAAM,CAAA;KAAC,GAC5I,eAAe,CAyB3B;IAtED;;;OAGG;IACH,KAFU,MAAM,CAEP;IAET;;;OAGG;IACH,YAFU,OAAO,CAEE;IAEnB;;OAEG;IACH,MAFU,OAAO,CAEJ;IAEb;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,SAFU,MAAM,CAEJ;IAEZ;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,YAFU,MAAM,CAED;IAiCf;;;;OAIG;IACH,cAHW,eAAe,GACb,OAAO,CAWnB;IAkBD;;OAEG;IACH,SAFa,eAAe,CAe3B;IAED;;;;;;;;;;MAYC;IAED;;;;;;;;;;aAUC;IAED;;;;;;OAMG;IACH,gCALW,MAAM,eACN,MAAM,WACN,MAAM,GACJ;QAAC,KAAK,EAAE;YAAC,IAAI,EAAE,eAAe,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,CA6BtI;IAED,uCAGC;CAKJ;;;;kCAzMiC,wBAAwB"}
@@ -163,7 +163,7 @@ export class SampleAudioClip extends AbstractAudioClip {
163
163
  * @param {number} [gainDb]
164
164
  * @param {number} [pitchCents]
165
165
  * @param {number} [offset]
166
- * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number}[], duration: number}}
166
+ * @returns {{plays: {clip: SampleAudioClip, offset: number, gainDb: number, pitchCents: number, duration: number}[], duration: number}}
167
167
  */
168
168
  planTimeline(env, gainDb = 0, pitchCents = 0, offset = 0) {
169
169
  let g = gainDb + this.gain;
@@ -177,10 +177,19 @@ export class SampleAudioClip extends AbstractAudioClip {
177
177
  p += (env.playback.random() * 2 - 1) * this.pitchRandom;
178
178
  }
179
179
 
180
- const duration = this.loop ? Infinity : env.durationOf(this);
180
+ /**
181
+ * At the pitch just resolved, not the raw buffer seconds. `pitchCents` reaches the voice as
182
+ * `source.detune`, which changes playback RATE — a leaf an octave down plays at half speed
183
+ * and lasts twice its buffer. Every duration here used to be the unscaled value, so a
184
+ * detuned leaf was retired mid-sound with a hard stop and every sequence holding it advanced
185
+ * early; `pitchRandom` made it a different amount on every trigger.
186
+ */
187
+ const rate = 2 ** (p / 1200);
188
+
189
+ const duration = this.loop ? Infinity : env.durationOf(this) / rate;
181
190
 
182
191
  return {
183
- plays: [{ clip: this, offset, gainDb: g, pitchCents: p }],
192
+ plays: [{ clip: this, offset, gainDb: g, pitchCents: p, duration }],
184
193
  duration
185
194
  };
186
195
  }
@@ -29,6 +29,7 @@ export class SequenceContainerAudioClip extends ContainerAudioClip {
29
29
  offset: number;
30
30
  gainDb: number;
31
31
  pitchCents: number;
32
+ duration: number;
32
33
  }[];
33
34
  duration: number;
34
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SequenceContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH;IAEI;;;;OAIG;IACH,uBAHW,mBAAmB,GACjB,0BAA0B,CAQtC;IAID,oCAUC;IAED;;;;;;;MAMC;IAED;;;;aAIC;IAED;;;;;;;;MAyBC;CACJ;;;;mCA5EkC,yBAAyB"}
1
+ {"version":3,"file":"SequenceContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH;IAEI;;;;OAIG;IACH,uBAHW,mBAAmB,GACjB,0BAA0B,CAQtC;IAID,oCAUC;IAED;;;;;;;MAMC;IAED;;;;aAIC;IAED;;;;;;;;;MAyBC;CACJ;;;;mCA5EkC,yBAAyB"}
@@ -30,6 +30,7 @@ export class SwitchContainerAudioClip extends ContainerAudioClip {
30
30
  offset: number;
31
31
  gainDb: number;
32
32
  pitchCents: number;
33
+ duration: number;
33
34
  }[];
34
35
  duration: number;
35
36
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH;IAcI;;;;OAIG;IACH,uBAJW,mBAAmB,gCACnB;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAA;KAAC,GACvC,wBAAwB,CAUpC;IAzBD;;;OAGG;IACH,WAFU,MAAM,CAED;IAEf;;;OAGG;IACH,cAFU,MAAM,CAEC;IAmCjB;;;;;;;;MAWC;IAED;;;OAGG;IACH,cAHW,wBAAwB,GACtB,OAAO,CAMnB;IAWD,kCAYC;IAED;;;;;;;YA/EA;;;;eAIG;;;MAmFF;IAED;;;;;;aAMC;;CACJ;;;;mCAvHkC,yBAAyB"}
1
+ {"version":3,"file":"SwitchContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH;IAcI;;;;OAIG;IACH,uBAJW,mBAAmB,gCACnB;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAA;KAAC,GACvC,wBAAwB,CAUpC;IAzBD;;;OAGG;IACH,WAFU,MAAM,CAED;IAEf;;;OAGG;IACH,cAFU,MAAM,CAEC;IAmCjB;;;;;;;;;MAWC;IAED;;;OAGG;IACH,cAHW,wBAAwB,GACtB,OAAO,CAMnB;IAWD,kCAYC;IAED;;;;;;;YA/EA;;;;eAIG;;;MAmFF;IAED;;;;;;aAMC;;CACJ;;;;mCAvHkC,yBAAyB"}
@@ -1 +1 @@
1
- {"version":3,"file":"EventInstance.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/sopra/runtime/EventInstance.js"],"names":[],"mappings":";;;iCAqBU,MAAM;;;;;;AAoFhB;;;;;;;;;GASG;AACH;IAqII;;;;OAIG;IACH,oBAJW,WAAW,eACX,gBAAgB,qIAChB;QAAC,KAAK,CAAC,EAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;QAAC,OAAO,CAAC,EAAC,OAAO,CAAC;QAAC,WAAW,CAAC,EAAC,MAAM,CAAC;QAAC,eAAe,CAAC,EAAC,oBAAoB,CAAC;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;QAAC,OAAO,CAAC,EAAC,OAAO,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAC;QAAC,WAAW,CAAC,EAAC,UAAU,CAAC;QAAC,WAAW,CAAC,EAAC,mBAAmB,CAAA;KAAC,EA0EnQ;IAhND;;OAEG;IACH,WAFU,MAAM,CAEF;IAEd;;OAEG;IACH,OAFU,kBAAkB,GAAC,MAAM,CAEA;IAEnC;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,cAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,aAAuB;IAyHnB;;OAEG;IACH,QAFU,WAAW,CAED;IAEpB;;OAEG;IACH,aAFU,gBAAgB,CAEI;IAE9B;;OAEG;IACH,OAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,UAFU,OAAO,GAAC,IAAI,CAEE;IAExB;;;;;OAKG;IACH,aAFU,UAAU,GAAC,IAAI,CAEK;IAE9B;;;;;OAKG;IACH,aAFU,mBAAmB,GAAC,IAAI,CAEJ;IAE9B;;OAEG;IACH,SAFU,OAAO,CAEK;IAEtB;;OAEG;IACH,oBAFU,MAAM,CAEqB;IAErC;;OAEG;IACH,iBAFU,oBAAoB,CAEQ;IAW1C;;;OAGG;IACH,uBAEC;IAED;;;OAGG;IACH,2CAeC;IAED;;;OAGG;IACH,WAFW,MAAM,QAyChB;IAiID;;;OAGG;IACH,qBAEC;IAED;;;OAGG;IACH,wBAEC;IAED;;;OAGG;IACH,cAFW,MAAM,QAQhB;IAED;;;;;;;;;;;OAWG;IACH,sBAFW,gBAAgB,QA8C1B;IAED;;;;;OAKG;IACH,uBAJW,MAAM,YACN,MAAM,eACN,MAAM,QAQhB;IAED;;;;;OAKG;IACH,yBAHW,MAAM,eACN,MAAM,QAYhB;IAED;;;;OAIG;IACH,cAFW,MAAM,QAehB;IAED;;OAEG;IACH,gBAEC;IAED;;;;;OAKG;IACH,YAHW,MAAM,oBACN,OAAO,GAAC,IAAI,QAkDtB;IAmGD;;OAEG;IACH,aAsCC;;CACJ;yBA31BY,OAAO,qCAAqC,EAAE,UAAU;sBACxD,OAAO,kCAAkC,EAAE,OAAO;+BAClD,OAAO,2CAA2C,EAAE,gBAAgB;kCACpE,OAAO,oDAAoD,EAAE,mBAAmB;0BAChF,OAAO,mBAAmB,EAAE,WAAW;+BACvC,OAAO,mCAAmC,EAAE,gBAAgB;mCAC5D,OAAO,2BAA2B,EAAE,oBAAoB;oBACxD,OAAO,YAAY,EAAE,KAAK"}
1
+ {"version":3,"file":"EventInstance.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/sopra/runtime/EventInstance.js"],"names":[],"mappings":";;;iCAqBU,MAAM;;;;;;AAoFhB;;;;;;;;;GASG;AACH;IAqII;;;;OAIG;IACH,oBAJW,WAAW,eACX,gBAAgB,qIAChB;QAAC,KAAK,CAAC,EAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;QAAC,OAAO,CAAC,EAAC,OAAO,CAAC;QAAC,WAAW,CAAC,EAAC,MAAM,CAAC;QAAC,eAAe,CAAC,EAAC,oBAAoB,CAAC;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;QAAC,OAAO,CAAC,EAAC,OAAO,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAC;QAAC,WAAW,CAAC,EAAC,UAAU,CAAC;QAAC,WAAW,CAAC,EAAC,mBAAmB,CAAA;KAAC,EA0EnQ;IAhND;;OAEG;IACH,WAFU,MAAM,CAEF;IAEd;;OAEG;IACH,OAFU,kBAAkB,GAAC,MAAM,CAEA;IAEnC;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,cAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,aAAuB;IAyHnB;;OAEG;IACH,QAFU,WAAW,CAED;IAEpB;;OAEG;IACH,aAFU,gBAAgB,CAEI;IAE9B;;OAEG;IACH,OAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,UAFU,OAAO,GAAC,IAAI,CAEE;IAExB;;;;;OAKG;IACH,aAFU,UAAU,GAAC,IAAI,CAEK;IAE9B;;;;;OAKG;IACH,aAFU,mBAAmB,GAAC,IAAI,CAEJ;IAE9B;;OAEG;IACH,SAFU,OAAO,CAEK;IAEtB;;OAEG;IACH,oBAFU,MAAM,CAEqB;IAErC;;OAEG;IACH,iBAFU,oBAAoB,CAEQ;IAW1C;;;OAGG;IACH,uBAEC;IAED;;;OAGG;IACH,2CAeC;IAED;;;OAGG;IACH,WAFW,MAAM,QAyChB;IAoID;;;OAGG;IACH,qBAEC;IAED;;;OAGG;IACH,wBAEC;IAED;;;OAGG;IACH,cAFW,MAAM,QAQhB;IAED;;;;;;;;;;;OAWG;IACH,sBAFW,gBAAgB,QA8C1B;IAED;;;;;OAKG;IACH,uBAJW,MAAM,YACN,MAAM,eACN,MAAM,QAQhB;IAED;;;;;OAKG;IACH,yBAHW,MAAM,eACN,MAAM,QAYhB;IAED;;;;OAIG;IACH,cAFW,MAAM,QAehB;IAED;;OAEG;IACH,gBAEC;IAED;;;;;OAKG;IACH,YAHW,MAAM,oBACN,OAAO,GAAC,IAAI,QAkDtB;IAmGD;;OAEG;IACH,aAsCC;;CACJ;yBA91BY,OAAO,qCAAqC,EAAE,UAAU;sBACxD,OAAO,kCAAkC,EAAE,OAAO;+BAClD,OAAO,2CAA2C,EAAE,gBAAgB;kCACpE,OAAO,oDAAoD,EAAE,mBAAmB;0BAChF,OAAO,mBAAmB,EAAE,WAAW;+BACvC,OAAO,mCAAmC,EAAE,gBAAgB;mCAC5D,OAAO,2BAA2B,EAAE,oBAAoB;oBACxD,OAAO,YAAY,EAAE,KAAK"}
@@ -423,7 +423,10 @@ export class EventInstance {
423
423
  offset: p.offset,
424
424
  gainDb: p.gainDb,
425
425
  pitchCents: p.pitchCents,
426
- duration: p.clip.loop ? Infinity : bufferMap.get(p.clip).duration,
426
+ // what the plan decided, not the raw buffer: `pitchCents` is playback rate, so a
427
+ // detuned leaf's real duration is its buffer scaled by 2 ** (-cents / 1200), and
428
+ // re-reading `buffer.duration` here threw that away again
429
+ duration: p.duration,
427
430
  voice: null
428
431
  });
429
432
  }
@@ -1 +1 @@
1
- {"version":3,"file":"decode_coefficients.d.ts","sourceRoot":"","sources":["../../../../../../../src/format/image/avif/av1/decode/decode_coefficients.js"],"names":[],"mappings":"AA+BA;;;;;;;;;;;;;;;;;GAiBG;AACH,iEAVW,MAAM,WACN,MAAM,WACN,MAAM,WACN,MAAM,GACJ,MAAM,CAuNlB"}
1
+ {"version":3,"file":"decode_coefficients.d.ts","sourceRoot":"","sources":["../../../../../../../src/format/image/avif/av1/decode/decode_coefficients.js"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;;;;;GAiBG;AACH,iEAVW,MAAM,WACN,MAAM,WACN,MAAM,WACN,MAAM,GACJ,MAAM,CA2MlB"}