@woosh/meep-engine 3.18.0 → 3.20.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 (228) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -1
  4. package/editor/view/particles/effect/ParticleCurveEditorView.js +303 -120
  5. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -1
  6. package/editor/view/particles/effect/ParticleGradientEditorView.js +108 -63
  7. package/editor/view/particles/effect/ParticleGraphEditorView.js +2 -2
  8. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  9. package/editor/view/particles/effect/ParticleNodeParametersView.js +7 -46
  10. package/editor/view/particles/effect/particle-editor.css +60 -30
  11. package/package.json +1 -2
  12. package/samples/engine/README.md +1 -1
  13. package/src/core/binary/compression/decompress_bytes.d.ts +13 -0
  14. package/src/core/binary/compression/decompress_bytes.d.ts.map +1 -0
  15. package/src/core/binary/compression/decompress_bytes.js +28 -0
  16. package/src/core/collection/array/array_group_by.d.ts.map +1 -1
  17. package/src/core/collection/array/array_group_by.js +2 -11
  18. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
  19. package/src/core/geom/3d/shape/HeightMapShape3D.js +4 -9
  20. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +67 -22
  21. package/src/core/model/object/optional_clone.d.ts +7 -0
  22. package/src/core/model/object/optional_clone.d.ts.map +1 -0
  23. package/src/core/model/object/optional_equality.d.ts +10 -0
  24. package/src/core/model/object/optional_equality.d.ts.map +1 -0
  25. package/src/{shade/descriptor/util → core/model/object}/optional_equality.js +2 -2
  26. package/src/core/model/object/optional_hash.d.ts +9 -0
  27. package/src/core/model/object/optional_hash.d.ts.map +1 -0
  28. package/src/{shade/descriptor/util → core/model/object}/optional_hash.js +3 -3
  29. package/src/engine/asset/Asset.d.ts +1 -1
  30. package/src/engine/asset/Asset.d.ts.map +1 -1
  31. package/src/engine/asset/Asset.js +3 -1
  32. package/src/engine/asset/loaders/image/ImageDecoderWorker.js +12 -27
  33. package/src/engine/asset/loaders/image/prototypePNG.js +8 -7
  34. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.d.ts.map +1 -1
  35. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +9 -10
  36. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  37. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
  38. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +266 -0
  39. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -0
  40. package/src/engine/graphics/ecs/particles/ParticleEffect.js +439 -0
  41. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +58 -0
  42. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -0
  43. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +219 -0
  44. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +178 -25
  45. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  46. package/src/engine/graphics3/GPUParticleEmitterSystem.js +809 -310
  47. package/src/format/image/png/PNGReader.d.ts +7 -6
  48. package/src/format/image/png/PNGReader.d.ts.map +1 -1
  49. package/src/format/image/png/PNGReader.js +13 -12
  50. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts +3 -2
  51. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
  52. package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +5 -4
  53. package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts +3 -2
  54. package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +1 -1
  55. package/src/format/image/png/chunk/png_chunk_decode_zTXt.js +5 -4
  56. package/src/format/image/png/png_inflate.d.ts +3 -3
  57. package/src/format/image/png/png_inflate.d.ts.map +1 -1
  58. package/src/format/image/png/png_inflate.js +29 -39
  59. package/src/format/texture/ktx2/ktx2_read.d.ts +4 -4
  60. package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
  61. package/src/format/texture/ktx2/ktx2_read.js +18 -21
  62. package/src/shade/descriptor/binding/BindGroupLayoutDescriptor.js +1 -1
  63. package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +3 -3
  64. package/src/shade/descriptor/pipeline/PipelineDescriptorBase.js +1 -1
  65. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +1 -1
  66. package/src/shade/descriptor/pipeline/render/ColorTargetState.js +3 -3
  67. package/src/shade/descriptor/pipeline/render/FragmentState.js +1 -1
  68. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +3 -3
  69. package/src/shade/playground/particle_ecs/README.md +203 -0
  70. package/src/shade/playground/particle_ecs/bonfire_editor.d.ts +39 -0
  71. package/src/shade/playground/particle_ecs/bonfire_editor.d.ts.map +1 -0
  72. package/src/shade/playground/particle_ecs/bonfire_editor.js +315 -0
  73. package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +145 -0
  74. package/src/shade/playground/particle_ecs/bonfire_effects.d.ts.map +1 -0
  75. package/src/shade/playground/particle_ecs/bonfire_effects.js +202 -0
  76. package/src/shade/playground/particle_ecs/bonfire_sprites.d.ts +23 -0
  77. package/src/shade/playground/particle_ecs/bonfire_sprites.d.ts.map +1 -0
  78. package/src/shade/playground/particle_ecs/bonfire_sprites.js +315 -0
  79. package/src/shade/playground/particle_ecs/bonfire_world.d.ts +86 -0
  80. package/src/shade/playground/particle_ecs/bonfire_world.d.ts.map +1 -0
  81. package/src/shade/playground/particle_ecs/bonfire_world.js +303 -0
  82. package/src/shade/playground/particle_ecs/effects/embers.json +1634 -0
  83. package/src/shade/playground/particle_ecs/effects/flame.json +1882 -0
  84. package/src/shade/playground/particle_ecs/effects/smoke.json +1860 -0
  85. package/src/shade/playground/particle_ecs/effects/soot.json +1606 -0
  86. package/src/shade/playground/particle_ecs/index.html +330 -0
  87. package/src/shade/playground/particle_ecs/main.d.ts +2 -0
  88. package/src/shade/playground/particle_ecs/main.d.ts.map +1 -0
  89. package/src/shade/playground/particle_ecs/main.js +566 -0
  90. package/src/shade/playground/particle_ecs/moonlit_environment.d.ts +16 -0
  91. package/src/shade/playground/particle_ecs/moonlit_environment.d.ts.map +1 -0
  92. package/src/shade/playground/particle_ecs/moonlit_environment.js +144 -0
  93. package/src/shade/playground/particle_editor/README.md +5 -4
  94. package/src/shade/playground/particle_system/particle_prototype.d.ts +7 -9
  95. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  96. package/src/shade/playground/particle_system/particle_prototype.js +7 -9
  97. package/src/shade/playground/profile_hotkey.d.ts +58 -0
  98. package/src/shade/playground/profile_hotkey.d.ts.map +1 -0
  99. package/src/shade/playground/profile_hotkey.js +325 -0
  100. package/src/shade/playground/ssr_motion/README.md +22 -0
  101. package/src/shade/playground/ssr_motion/index.html +18 -0
  102. package/src/shade/playground/ssr_motion/main.d.ts +2 -0
  103. package/src/shade/playground/ssr_motion/main.d.ts.map +1 -0
  104. package/src/shade/playground/ssr_motion/main.js +149 -0
  105. package/src/shade/playground/ssr_variance/README.md +105 -0
  106. package/src/shade/playground/ssr_variance/capture.d.ts +16 -0
  107. package/src/shade/playground/ssr_variance/capture.d.ts.map +1 -0
  108. package/src/shade/playground/ssr_variance/capture.js +96 -0
  109. package/src/shade/playground/ssr_variance/index.html +23 -0
  110. package/src/shade/playground/ssr_variance/main.d.ts +2 -0
  111. package/src/shade/playground/ssr_variance/main.d.ts.map +1 -0
  112. package/src/shade/playground/ssr_variance/main.js +246 -0
  113. package/src/shade/playground/ssr_variance/reference.d.ts +18 -0
  114. package/src/shade/playground/ssr_variance/reference.d.ts.map +1 -0
  115. package/src/shade/playground/ssr_variance/reference.js +78 -0
  116. package/src/shade/playground/ssr_variance/scene.d.ts +11 -0
  117. package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -0
  118. package/src/shade/playground/ssr_variance/scene.js +61 -0
  119. package/src/shade/playground/ssr_variance/statistics.d.ts +44 -0
  120. package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -0
  121. package/src/shade/playground/ssr_variance/statistics.js +51 -0
  122. package/src/shade/renderer/geometry/Geometry.d.ts.map +1 -1
  123. package/src/shade/renderer/geometry/Geometry.js +4 -7
  124. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts.map +1 -1
  125. package/src/shade/renderer/loader/gltf/tiny-gltf.js +9 -3
  126. package/src/shade/renderer/loader/usd/usd_decode_image.d.ts +4 -4
  127. package/src/shade/renderer/loader/usd/usd_decode_image.d.ts.map +1 -1
  128. package/src/shade/renderer/loader/usd/usd_decode_image.js +4 -4
  129. package/src/shade/renderer/material/StandardShadeMaterial.js +2 -2
  130. package/src/shade/renderer/particles/DESIGN.md +745 -702
  131. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  132. package/src/shade/renderer/particles/GPUParticleSystem.js +3 -1
  133. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +1 -1
  134. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +1 -1
  135. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  136. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +9 -15
  137. package/src/shade/renderer/particles/graph/particle_group_library.d.ts.map +1 -1
  138. package/src/shade/renderer/particles/graph/particle_group_library.js +8 -3
  139. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +0 -2
  140. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
  141. package/src/shade/renderer/particles/graph/particle_node_parameters.js +0 -9
  142. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
  143. package/src/shade/renderer/particles/graph/particle_node_presentation.js +0 -10
  144. package/src/shade/renderer/particles/graph/particle_ramp.d.ts +2 -8
  145. package/src/shade/renderer/particles/graph/particle_ramp.d.ts.map +1 -1
  146. package/src/shade/renderer/particles/graph/particle_ramp.js +2 -8
  147. package/src/shade/renderer/particles/graph/validate_particle_graph.js +0 -6
  148. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  149. package/src/shade/renderer/particles/graph_particles_avboit.js +13 -4
  150. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +1 -12
  151. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/isa/InstructionStream.js +1 -12
  153. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +54 -60
  154. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  155. package/src/shade/renderer/particles/isa/ParticleVMISA.js +9 -17
  156. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +0 -1
  157. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
  158. package/src/shade/renderer/particles/isa/particle_assembly.js +2 -16
  159. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts +1 -1
  160. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js +1 -1
  161. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +0 -14
  162. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +3 -17
  163. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
  164. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +15 -36
  165. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
  166. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +1 -5
  167. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -1
  168. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +1 -8
  169. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +2 -11
  170. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  171. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +2 -11
  172. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +11 -4
  173. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  174. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +431 -424
  175. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts.map +1 -1
  176. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.js +13 -0
  177. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts +3 -6
  178. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  179. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +49 -17
  180. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  181. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +0 -2
  182. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -1
  183. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +0 -2
  184. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  185. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +1 -5
  186. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -1
  187. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +0 -2
  188. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +1 -3
  189. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  190. package/src/shade/renderer/particles/vm/ParticleVMReference.js +4 -20
  191. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  192. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +2 -5
  193. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.d.ts.map +1 -1
  194. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.js +0 -2
  195. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.d.ts.map +1 -1
  196. package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.js +0 -2
  197. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  198. package/src/shade/renderer/postprocess/ssr/SSR.js +2 -1
  199. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.d.ts.map +1 -1
  200. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.js +20 -5
  201. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts.map +1 -1
  202. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.js +19 -5
  203. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts +4 -0
  204. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -0
  205. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +137 -0
  206. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +0 -8
  207. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +18 -114
  209. package/src/shade/renderer/scene/Mesh.js +1 -1
  210. package/src/shade/renderer/texture/ShadeTexture.js +1 -1
  211. package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts +2 -2
  212. package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts.map +1 -1
  213. package/src/shade/renderer/texture/source/texel_data_from_ktx2.js +3 -3
  214. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts +0 -19
  215. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts.map +0 -1
  216. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.js +0 -30
  217. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts +0 -11
  218. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts.map +0 -1
  219. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.js +0 -13
  220. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts +0 -20
  221. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts.map +0 -1
  222. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +0 -14
  223. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +0 -1
  224. package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts +0 -50
  225. package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts.map +0 -1
  226. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +0 -17
  227. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +0 -1
  228. /package/src/{shade/descriptor/util → core/model/object}/optional_clone.js +0 -0
@@ -2,6 +2,8 @@ import { hash_mix3 } from "../../../math/hash/hash_mix3.js";
2
2
  import { hash_mix2 } from "../../../math/hash/hash_mix2.js";
3
3
  import { assert } from "../../../assert.js";
4
4
  import { clamp } from "../../../math/clamp.js";
5
+ import { optional_equality } from "../../../model/object/optional_equality.js";
6
+ import { optional_hash } from "../../../model/object/optional_hash.js";
5
7
  import { v3_length } from "../../vec3/v3_length.js";
6
8
  import { Vector3 } from "../../Vector3.js";
7
9
  import { AbstractShape3D } from "./AbstractShape3D.js";
@@ -442,20 +444,13 @@ export class HeightMapShape3D extends AbstractShape3D {
442
444
  if (!this.size.equals(other.size)) return false;
443
445
  if (this.tessellation !== other.tessellation) return false;
444
446
 
445
- // strict identity is enough for sampler equality in the common case;
446
- // fall through to value equality so two shapes built from independent
447
- // but identical sampler instances still compare equal
448
- if (this.sampler === other.sampler) return true;
449
-
450
- if (this.sampler === null || other.sampler === null) return false;
451
-
452
- return this.sampler.equals(other.sampler);
447
+ return optional_equality(this.sampler, other.sampler);
453
448
  }
454
449
 
455
450
  hash() {
456
451
  const a = this.orientation.hash();
457
452
  const b = this.size.hash();
458
- const c = this.sampler !== null ? this.sampler.hash() : 0;
453
+ const c = optional_hash(this.sampler);
459
454
 
460
455
  return hash_mix2(hash_mix3(a, b, c), this.tessellation);
461
456
  }
@@ -347,11 +347,13 @@ function align(graph, layer_count, order, rank, layer_start, neighbours, marked,
347
347
  * Push the blocks of one pass as far towards the top as the boxes below them allow, and read off a
348
348
  * coordinate for every box.
349
349
  *
350
- * Blocks are placed by longest path through the constraints between neighbours in a column, which
351
- * is what makes the arrangement as tight as the ordering permits. Blocks that turn out not to
352
- * constrain each other at all form separate classes, and a class is then shifted up until it meets
353
- * whatever is above it — without that, a block hanging off the bottom of the drawing pins every
354
- * class that follows it down there too.
350
+ * First place blocks relative to the sink of their class, then solve the separation constraints
351
+ * between classes. A class above another must carry that neighbour's final shift: treating a
352
+ * relative shift as absolute can move the lower class into the upper one. These constraints form
353
+ * a DAG, so a topological pass propagates every shift before the classes depending on it are placed.
354
+ * Both stages take linear time and preserve the port offsets within each block.
355
+ *
356
+ * @see https://arxiv.org/abs/2008.01252 — Brandes, Walter, Zink, correction to shift accumulation
355
357
  *
356
358
  * @param {LayoutBoxGraph} graph
357
359
  * @param {Int32Array} order
@@ -428,13 +430,7 @@ function compact(graph, order, rank, layer_start, block, options) {
428
430
  if (place[u] + need > place[v]) {
429
431
  place[v] = place[u] + need;
430
432
  }
431
- } else {
432
- const slack = place[v] - place[u] - need;
433
-
434
- if (slack < shift[sink[u]]) {
435
- shift[sink[u]] = slack;
436
- }
437
- }
433
+ }
438
434
  }
439
435
 
440
436
  w = next[w];
@@ -450,15 +446,62 @@ function compact(graph, order, rank, layer_start, block, options) {
450
446
  const y = new Float64Array(box_count);
451
447
 
452
448
  for (let box = 0; box < box_count; box++) {
453
- const r = root[box];
454
-
455
- y[box] = place[r] + offset[box];
456
-
457
- const carried = shift[sink[r]];
458
-
459
- if (carried < Infinity) {
460
- y[box] += carried;
461
- }
449
+ const r = root[box];
450
+
451
+ y[box] = place[r] + offset[box];
452
+ }
453
+
454
+ // Record every boundary between classes, directed from the lower class to the upper one.
455
+ // Use the position of the lower box in `order` as the edge index; its predecessor is `at - 1`.
456
+ // Parallel boundaries matter: different box heights and ports can make either one tighter.
457
+ const first_boundary = new Int32Array(box_count).fill(-1);
458
+ const next_boundary = new Int32Array(box_count);
459
+ const pending = new Int32Array(box_count);
460
+
461
+ for (let layer = 0; layer + 1 < layer_start.length; layer++) {
462
+ for (let at = layer_start[layer] + 1; at < layer_start[layer + 1]; at++) {
463
+ const upper = sink[root[order[at - 1]]];
464
+ const lower = sink[root[order[at]]];
465
+
466
+ if (upper !== lower) {
467
+ next_boundary[at] = first_boundary[lower];
468
+ first_boundary[lower] = at;
469
+ pending[upper]++;
470
+ }
471
+ }
472
+ }
473
+
474
+ const ready = new Int32Array(box_count);
475
+ let end = 0;
476
+
477
+ for (let box = 0; box < box_count; box++) {
478
+ if (root[box] === box && sink[box] === box && pending[box] === 0) {
479
+ shift[box] = 0;
480
+ ready[end++] = box;
481
+ }
482
+ }
483
+
484
+ for (let cursor = 0; cursor < end; cursor++) {
485
+ const lower = ready[cursor];
486
+
487
+ for (let at = first_boundary[lower]; at !== -1; at = next_boundary[at]) {
488
+ const above = order[at - 1];
489
+ const below = order[at];
490
+ const upper = sink[root[above]];
491
+
492
+ // y[above] + shift[upper] + separation <= y[below] + shift[lower]
493
+ const limit = shift[lower] + y[below] - y[above] - separation(above, below);
494
+
495
+ shift[upper] = Math.min(shift[upper], limit);
496
+
497
+ if (--pending[upper] === 0) {
498
+ ready[end++] = upper;
499
+ }
500
+ }
501
+ }
502
+
503
+ for (let box = 0; box < box_count; box++) {
504
+ y[box] += shift[sink[root[box]]];
462
505
  }
463
506
 
464
507
  return y;
@@ -471,7 +514,9 @@ function compact(graph, order, rank, layer_start, block, options) {
471
514
  * top edge, the ones biased towards the bottom by their bottom edge — against whichever of them
472
515
  * came out shortest. Only then can they be compared box by box, and each box takes the average of
473
516
  * the middle two of its four candidates: an average of all four is pulled about by whichever single
474
- * pass went furthest astray, and the middle two are the ones the passes agree on.
517
+ * pass went furthest astray, and the middle two are the ones the passes agree on.
518
+ * Each candidate must already satisfy every separation constraint. Taking the same order
519
+ * statistics for both ends of an inequality preserves it; balancing cannot repair an invalid pass.
475
520
  *
476
521
  * @param {LayoutBoxGraph} graph mutated: `box_y` is written
477
522
  * @param {Float64Array[]} candidates
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @template T
3
+ * @param {T} obj
4
+ * @return {T}
5
+ */
6
+ export function optional_clone<T>(obj: T): T;
7
+ //# sourceMappingURL=optional_clone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional_clone.d.ts","sourceRoot":"","sources":["../../../../../src/core/model/object/optional_clone.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,6CAcC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @template {{equals(T):boolean}} T
3
+ * @param {undefined|null|T} a
4
+ * @param {undefined|null|T} b
5
+ * @return {boolean}
6
+ */
7
+ export function optional_equality<T extends {
8
+ equals(T: any): boolean;
9
+ }>(a: T, b: T): boolean;
10
+ //# sourceMappingURL=optional_equality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional_equality.d.ts","sourceRoot":"","sources":["../../../../../src/core/model/object/optional_equality.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH;oBALyB,OAAO;gBAGpB,OAAO,CAsBlB"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @template {{equals(T):boolean}} T
3
- * @param {undefined|T} a
4
- * @param {undefined|T} b
3
+ * @param {undefined|null|T} a
4
+ * @param {undefined|null|T} b
5
5
  * @return {boolean}
6
6
  */
7
7
  export function optional_equality(a, b) {
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @template {{hash():number}} T
3
+ * @param {T|null|undefined} thing
4
+ * @return {number}
5
+ */
6
+ export function optional_hash<T extends {
7
+ hash(): number;
8
+ }>(thing: T): number;
9
+ //# sourceMappingURL=optional_hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional_hash.d.ts","sourceRoot":"","sources":["../../../../../src/core/model/object/optional_hash.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH;YAJsB,MAAM;cAEhB,MAAM,CAYjB"}
@@ -1,12 +1,12 @@
1
- import { assert } from "../../../core/assert.js";
1
+ import { assert } from "../../assert.js";
2
2
 
3
3
  /**
4
4
  * @template {{hash():number}} T
5
- * @param {T|undefined} thing
5
+ * @param {T|null|undefined} thing
6
6
  * @return {number}
7
7
  */
8
8
  export function optional_hash(thing) {
9
- if (thing === undefined) {
9
+ if (thing === undefined || thing === null) {
10
10
  return 0;
11
11
  }
12
12
 
@@ -37,7 +37,7 @@ export class Asset<T> {
37
37
  * @returns {boolean}
38
38
  */
39
39
  equals(other: Asset<any>): boolean;
40
- hash(): any;
40
+ hash(): number;
41
41
  /**
42
42
  *
43
43
  * @returns {T}
@@ -1 +1 @@
1
- {"version":3,"file":"Asset.d.ts","sourceRoot":"","sources":["../../../../src/engine/asset/Asset.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH;IAcI;;;;;OAKG;IACH,4CAHW,MAAM,EAehB;IA/BD;;;;OAIG;IACH,cAFU,uBAAuB,CAEf;IAElB;;;OAGG;IACH,8BAAmB;IASf;;;OAGG;IACH,mBAAsB;IAEtB;;;OAGG;IACH,UAFU,MAAM,CAEQ;IAG5B;;;;OAIG;IACH,2BAFa,OAAO,CAgBnB;IAED,YAEC;IAED;;;OAGG;IACH,UAFa,CAAC,CAIb;CACJ"}
1
+ {"version":3,"file":"Asset.d.ts","sourceRoot":"","sources":["../../../../src/engine/asset/Asset.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH;IAcI;;;;;OAKG;IACH,4CAHW,MAAM,EAehB;IA/BD;;;;OAIG;IACH,cAFU,uBAAuB,CAEf;IAElB;;;OAGG;IACH,8BAAmB;IASf;;;OAGG;IACH,mBAAsB;IAEtB;;;OAGG;IACH,UAFU,MAAM,CAEQ;IAG5B;;;;OAIG;IACH,2BAFa,OAAO,CAgBnB;IAED,eAEC;IAED;;;OAGG;IACH,UAFa,CAAC,CAIb;CACJ"}
@@ -1,3 +1,5 @@
1
+ import { optional_hash } from "../../core/model/object/optional_hash.js";
2
+
1
3
  /**
2
4
  * @template T
3
5
  *
@@ -58,7 +60,7 @@ export class Asset {
58
60
  }
59
61
 
60
62
  hash() {
61
- return this.description === null ? 0 : this.description.hash();
63
+ return optional_hash(this.description);
62
64
  }
63
65
 
64
66
  /**
@@ -1,32 +1,17 @@
1
1
  import { PNGReader } from "../../../../format/image/png/PNGReader.js";
2
2
 
3
- async function decode_png(png_bytes) {
4
- return new Promise((resolve, reject) => {
5
-
6
- const reader = new PNGReader(png_bytes);
7
-
8
- // console.time('decode');
9
- // console.profile('decode');
10
-
11
- const png = reader.parse();
12
-
13
- const uint_channels = png.getUint8Data();
14
-
15
- const width = png.getWidth();
16
- const height = png.getHeight();
17
-
18
- // console.timeEnd('decode');
19
- // console.profileEnd('decode');
20
-
21
- resolve({
22
- data: uint_channels.data.buffer,
23
- width,
24
- height,
25
- itemSize: uint_channels.itemSize,
26
- bitDepth: png.getBitDepth()
27
- });
28
- });
29
- }
3
+ async function decode_png(png_bytes) {
4
+ const png = await new PNGReader(png_bytes).parse();
5
+ const uint_channels = png.getUint8Data();
6
+
7
+ return {
8
+ data: uint_channels.data.buffer,
9
+ width: png.getWidth(),
10
+ height: png.getHeight(),
11
+ itemSize: uint_channels.itemSize,
12
+ bitDepth: png.getBitDepth()
13
+ };
14
+ }
30
15
 
31
16
  /**
32
17
  *
@@ -16,22 +16,23 @@ const array_loader = new ArrayBufferLoader();
16
16
  // const path = 'data/textures/utility/vt/uv_map_reference/5-21-14.png';
17
17
  const path = 'data/textures/utility/vt/uv_map_reference/6-39-33.png';
18
18
 
19
- array_loader.load(new AssetRequestScope(), path, (asset) => {
19
+ array_loader.load(new AssetRequestScope(), path, (asset) => {
20
20
 
21
21
  const array = asset.create();
22
22
 
23
23
  const reader = new PNGReader(array);
24
24
 
25
- const png = reader.parse();
25
+ reader.parse().then(png => {
26
26
 
27
- console.log(png);
27
+ console.log(png);
28
28
 
29
- const uint8Data = png.getUint8Data();
29
+ const uint8Data = png.getUint8Data();
30
30
 
31
- const sampler = new Sampler2D(uint8Data.data, uint8Data.itemSize, png.getWidth(), png.getHeight());
31
+ const sampler = new Sampler2D(uint8Data.data, uint8Data.itemSize, png.getWidth(), png.getHeight());
32
32
 
33
- const canvas = sampler2D2Canvas(sampler, 1, 0);
33
+ const canvas = sampler2D2Canvas(sampler, 1, 0);
34
34
 
35
- document.body.appendChild(canvas);
35
+ document.body.appendChild(canvas);
36
+ }).catch(error => console.error('Failed to decode PNG', error));
36
37
 
37
38
  });
@@ -1 +1 @@
1
- {"version":3,"file":"HeadsUpDisplaySystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js"],"names":[],"mappings":";AAsBA;;;;;GAKG;AACH;IASI;;;OAGG;IACH,4CAmBC;IA/BD,wCAAgC;IAGhC,2HAGE;IAaE,yBAA8B;IAM9B;;;;OAIG;IACH,+BAAiD;IAGrD,iCAGC;IAED,gCAIC;IAED;;;;;;;;;OASG;IACH,sCAkJC;IAED,6BAsBC;CACJ;uBAxPsB,iBAAiB;2BAIb,qBAAqB;uBAFzB,kBAAkB;4CAJG,uDAAuD;6BAKtE,iCAAiC"}
1
+ {"version":3,"file":"HeadsUpDisplaySystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js"],"names":[],"mappings":";AAsBA;;;;;GAKG;AACH;IASI;;;OAGG;IACH,4CAmBC;IA/BD,wCAAgC;IAGhC,2HAGE;IAaE,yBAA8B;IAM9B;;;;OAIG;IACH,+BAAiD;IAGrD,iCAGC;IAED,gCAIC;IAED;;;;;;;;;OASG;IACH,sCAiJC;IAED,6BAsBC;CACJ;uBAvPsB,iBAAiB;2BAIb,qBAAqB;uBAFzB,kBAAkB;4CAJG,uDAAuD;6BAKtE,iCAAiC"}
@@ -95,9 +95,10 @@ class HeadsUpDisplaySystem extends System {
95
95
  y *= transform.scale_y;
96
96
  z *= transform.scale_z;
97
97
 
98
- const q = transform.rotation;
99
-
100
- v3_quaternion_apply(scratch_rotated_offset, 0, x, y, z, q[0], q[1], q[2], q[3]);
98
+ v3_quaternion_apply(
99
+ scratch_rotated_offset, 0, x, y, z,
100
+ transform.rotation_x, transform.rotation_y, transform.rotation_z, transform.rotation_w
101
+ );
101
102
 
102
103
  x = scratch_rotated_offset[0];
103
104
  y = scratch_rotated_offset[1];
@@ -105,11 +106,9 @@ class HeadsUpDisplaySystem extends System {
105
106
  }
106
107
 
107
108
  // add transform position to get final world position
108
- const position = transform.translation;
109
-
110
- x += position[0];
111
- y += position[1];
112
- z += position[2];
109
+ x += transform.translation_x;
110
+ y += transform.translation_y;
111
+ z += transform.translation_z;
113
112
 
114
113
  const worldPositionX = x;
115
114
  const worldPositionY = y;
@@ -187,8 +186,8 @@ class HeadsUpDisplaySystem extends System {
187
186
  ndcY = 0.5 + dy;
188
187
  }
189
188
 
190
- vp.position[0] = ndcX;
191
- position[1] = ndcY;
189
+ // Notify ViewportPositionSystem so it updates the label's placement and visibility.
190
+ vp.position.set(ndcX, ndcY);
192
191
 
193
192
  const visible = (!trackedPositionOutOfBounds || vp.stickToScreenEdge) && this.__visibility_predicate.test(worldPositionX, worldPositionY, worldPositionZ);
194
193
 
@@ -1 +1 @@
1
- {"version":3,"file":"populateEngineSerializationRegistry.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/storage/populateEngineSerializationRegistry.js"],"names":[],"mappings":"AAmLA;;;;;;;;GAQG;AACH,iGA2GC"}
1
+ {"version":3,"file":"populateEngineSerializationRegistry.d.ts","sourceRoot":"","sources":["../../../../../src/engine/ecs/storage/populateEngineSerializationRegistry.js"],"names":[],"mappings":"AAsLA;;;;;;;;GAQG;AACH,iGA4GC"}
@@ -45,6 +45,9 @@ import {
45
45
  } from "../../graphics3/VolumetricLightMapSerializationAdapter.js";
46
46
  import { Transform } from "../transform/Transform.js";
47
47
  import { Transform64SerializationAdapter } from "../transform/Transform64SerializationAdapter.js";
48
+ import {
49
+ ParticleEffectSerializationAdapter
50
+ } from "../../graphics/ecs/particles/ParticleEffectSerializationAdapter.js";
48
51
  import { TransformSerializationAdapter } from "../transform/TransformSerializationAdapter.js";
49
52
  import { TransformSerializationUpgrader_0_1 } from "../transform/TransformSerializationUpgrader_0_1.js";
50
53
  import {
@@ -206,6 +209,7 @@ export function populateEngineSerializationRegistry(registry) {
206
209
  new PathSerializationAdapter(),
207
210
  new TagSerializationAdapter(),
208
211
  new ParticleEmitterSerializationAdapter(),
212
+ new ParticleEffectSerializationAdapter(),
209
213
  new SoundEmitterSerializationAdapter(),
210
214
  new SoundControllerSerializationAdapter(),
211
215
  new SoundListenerSerializationAdapter(),