@woosh/meep-engine 3.18.0 → 3.19.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 (120) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -1
  3. package/editor/view/particles/effect/ParticleCurveEditorView.js +303 -120
  4. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -1
  5. package/editor/view/particles/effect/ParticleGradientEditorView.js +108 -63
  6. package/editor/view/particles/effect/ParticleGraphEditorView.js +1 -1
  7. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  8. package/editor/view/particles/effect/ParticleNodeParametersView.js +3 -1
  9. package/editor/view/particles/effect/particle-editor.css +60 -30
  10. package/package.json +1 -2
  11. package/samples/engine/README.md +1 -1
  12. package/src/core/binary/compression/decompress_bytes.d.ts +13 -0
  13. package/src/core/binary/compression/decompress_bytes.d.ts.map +1 -0
  14. package/src/core/binary/compression/decompress_bytes.js +28 -0
  15. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +67 -22
  16. package/src/engine/asset/loaders/image/ImageDecoderWorker.js +12 -27
  17. package/src/engine/asset/loaders/image/prototypePNG.js +8 -7
  18. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  19. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
  20. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +266 -0
  21. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -0
  22. package/src/engine/graphics/ecs/particles/ParticleEffect.js +455 -0
  23. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +58 -0
  24. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -0
  25. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +219 -0
  26. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +178 -25
  27. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  28. package/src/engine/graphics3/GPUParticleEmitterSystem.js +809 -310
  29. package/src/format/image/png/PNGReader.d.ts +7 -6
  30. package/src/format/image/png/PNGReader.d.ts.map +1 -1
  31. package/src/format/image/png/PNGReader.js +13 -12
  32. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts +3 -2
  33. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
  34. package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +5 -4
  35. package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts +3 -2
  36. package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +1 -1
  37. package/src/format/image/png/chunk/png_chunk_decode_zTXt.js +5 -4
  38. package/src/format/image/png/png_inflate.d.ts +3 -3
  39. package/src/format/image/png/png_inflate.d.ts.map +1 -1
  40. package/src/format/image/png/png_inflate.js +29 -39
  41. package/src/format/texture/ktx2/ktx2_read.d.ts +4 -4
  42. package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
  43. package/src/format/texture/ktx2/ktx2_read.js +18 -21
  44. package/src/shade/playground/particle_ecs/README.md +203 -0
  45. package/src/shade/playground/particle_ecs/bonfire_editor.d.ts +39 -0
  46. package/src/shade/playground/particle_ecs/bonfire_editor.d.ts.map +1 -0
  47. package/src/shade/playground/particle_ecs/bonfire_editor.js +315 -0
  48. package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +145 -0
  49. package/src/shade/playground/particle_ecs/bonfire_effects.d.ts.map +1 -0
  50. package/src/shade/playground/particle_ecs/bonfire_effects.js +202 -0
  51. package/src/shade/playground/particle_ecs/bonfire_sprites.d.ts +23 -0
  52. package/src/shade/playground/particle_ecs/bonfire_sprites.d.ts.map +1 -0
  53. package/src/shade/playground/particle_ecs/bonfire_sprites.js +315 -0
  54. package/src/shade/playground/particle_ecs/bonfire_world.d.ts +86 -0
  55. package/src/shade/playground/particle_ecs/bonfire_world.d.ts.map +1 -0
  56. package/src/shade/playground/particle_ecs/bonfire_world.js +303 -0
  57. package/src/shade/playground/particle_ecs/effects/embers.json +1634 -0
  58. package/src/shade/playground/particle_ecs/effects/flame.json +1882 -0
  59. package/src/shade/playground/particle_ecs/effects/smoke.json +1860 -0
  60. package/src/shade/playground/particle_ecs/effects/soot.json +1606 -0
  61. package/src/shade/playground/particle_ecs/index.html +330 -0
  62. package/src/shade/playground/particle_ecs/main.d.ts +2 -0
  63. package/src/shade/playground/particle_ecs/main.d.ts.map +1 -0
  64. package/src/shade/playground/particle_ecs/main.js +566 -0
  65. package/src/shade/playground/particle_ecs/moonlit_environment.d.ts +16 -0
  66. package/src/shade/playground/particle_ecs/moonlit_environment.d.ts.map +1 -0
  67. package/src/shade/playground/particle_ecs/moonlit_environment.js +144 -0
  68. package/src/shade/playground/particle_editor/README.md +5 -4
  69. package/src/shade/playground/profile_hotkey.d.ts +58 -0
  70. package/src/shade/playground/profile_hotkey.d.ts.map +1 -0
  71. package/src/shade/playground/profile_hotkey.js +325 -0
  72. package/src/shade/playground/ssr_variance/README.md +105 -0
  73. package/src/shade/playground/ssr_variance/capture.d.ts +16 -0
  74. package/src/shade/playground/ssr_variance/capture.d.ts.map +1 -0
  75. package/src/shade/playground/ssr_variance/capture.js +96 -0
  76. package/src/shade/playground/ssr_variance/index.html +22 -0
  77. package/src/shade/playground/ssr_variance/main.d.ts +2 -0
  78. package/src/shade/playground/ssr_variance/main.d.ts.map +1 -0
  79. package/src/shade/playground/ssr_variance/main.js +246 -0
  80. package/src/shade/playground/ssr_variance/reference.d.ts +18 -0
  81. package/src/shade/playground/ssr_variance/reference.d.ts.map +1 -0
  82. package/src/shade/playground/ssr_variance/reference.js +78 -0
  83. package/src/shade/playground/ssr_variance/scene.d.ts +11 -0
  84. package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -0
  85. package/src/shade/playground/ssr_variance/scene.js +61 -0
  86. package/src/shade/playground/ssr_variance/statistics.d.ts +44 -0
  87. package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -0
  88. package/src/shade/playground/ssr_variance/statistics.js +51 -0
  89. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts.map +1 -1
  90. package/src/shade/renderer/loader/gltf/tiny-gltf.js +9 -3
  91. package/src/shade/renderer/loader/usd/usd_decode_image.d.ts +4 -4
  92. package/src/shade/renderer/loader/usd/usd_decode_image.d.ts.map +1 -1
  93. package/src/shade/renderer/loader/usd/usd_decode_image.js +4 -4
  94. package/src/shade/renderer/particles/DESIGN.md +748 -703
  95. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +11 -4
  96. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  97. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +431 -424
  98. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  99. package/src/shade/renderer/postprocess/ssr/SSR.js +2 -1
  100. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.d.ts.map +1 -1
  101. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.js +0 -6
  102. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts.map +1 -1
  103. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.js +19 -5
  104. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts +4 -0
  105. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -0
  106. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +133 -0
  107. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +0 -8
  108. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  109. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +16 -113
  110. package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts +2 -2
  111. package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts.map +1 -1
  112. package/src/shade/renderer/texture/source/texel_data_from_ktx2.js +3 -3
  113. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts +0 -20
  114. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts.map +0 -1
  115. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +0 -14
  116. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +0 -1
  117. package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts +0 -50
  118. package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts.map +0 -1
  119. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +0 -17
  120. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +0 -1
@@ -0,0 +1,51 @@
1
+ /** Per-pixel temporal moments of linear Rec.709 luminance. No spatial pooling before variance. */
2
+ export function measure_variance(samples, mask, width, height) {
3
+ if (samples.length < 2) { throw new Error('At least two samples are required'); }
4
+ const pixels = width * height;
5
+ if (mask.length !== pixels * 4 || samples.some(s => s.length !== pixels * 4)) {
6
+ throw new Error('Capture dimensions do not match');
7
+ }
8
+ const mean = new Float64Array(pixels), m2 = new Float64Array(pixels);
9
+ const minimum = new Float64Array(pixels).fill(Infinity), maximum = new Float64Array(pixels).fill(-Infinity);
10
+ for (let n = 0; n < samples.length; n++) {
11
+ const sample = samples[n];
12
+ for (let p = 0; p < pixels; p++) {
13
+ const i = p * 4;
14
+ if (![sample[i], sample[i + 1], sample[i + 2], sample[i + 3]].every(Number.isFinite)) {
15
+ throw new Error(`Non-finite capture at sample ${n}, pixel ${p}`);
16
+ }
17
+ const y = sample[i] * 0.2126 + sample[i + 1] * 0.7152 + sample[i + 2] * 0.0722;
18
+ const delta = y - mean[p];
19
+ mean[p] += delta / (n + 1);
20
+ m2[p] += delta * (y - mean[p]);
21
+ minimum[p] = Math.min(minimum[p], y); maximum[p] = Math.max(maximum[p], y);
22
+ }
23
+ }
24
+ const variance = Float32Array.from(m2, v => v / samples.length);
25
+ const summarize = predicate => {
26
+ const sigmas = [];
27
+ let variance_sum = 0, mean_sum = 0, range_sum = 0, max_range = 0;
28
+ for (let p = 0; p < pixels; p++) {
29
+ if (!predicate(p)) { continue; }
30
+ sigmas.push(Math.sqrt(variance[p])); variance_sum += variance[p]; mean_sum += mean[p];
31
+ const range = maximum[p] - minimum[p]; range_sum += range; max_range = Math.max(max_range, range);
32
+ }
33
+ sigmas.sort((a, b) => a - b);
34
+ const count = sigmas.length;
35
+ if (!count) { throw new Error('Empty measurement region'); }
36
+ return { pixels: count, mean_luminance: mean_sum / count,
37
+ mean_population_variance: variance_sum / count,
38
+ mean_sample_variance: variance_sum / count * samples.length / (samples.length - 1),
39
+ rms_temporal_sigma: Math.sqrt(variance_sum / count),
40
+ p95_temporal_sigma: sigmas[Math.ceil(count * 0.95) - 1],
41
+ mean_peak_to_peak: range_sum / count, max_peak_to_peak: max_range };
42
+ };
43
+ // Fixed screen rectangle shared by every stage/control, intersected with ground normals.
44
+ const roi = { x: Math.floor(width * 0.25), y: Math.floor(height * 0.50),
45
+ width: Math.floor(width * 0.5), height: Math.floor(height * 0.42) };
46
+ const ground = p => mask[p * 4] > 0.5;
47
+ return { mean: Float32Array.from(mean), variance, roi,
48
+ summary: { all: summarize(() => true), ground: summarize(ground),
49
+ reflection: summarize(p => ground(p) && p % width >= roi.x && p % width < roi.x + roi.width
50
+ && Math.floor(p / width) >= roi.y && Math.floor(p / width) < roi.y + roi.height) } };
51
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"tiny-gltf.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/loader/gltf/tiny-gltf.js"],"names":[],"mappings":"AA4UA;IAoEI;;;;;;;;;;;;;OAaG;IACH,+CAFU,aAAa,CAEgC;IA3BvD;;;;OAIG;IACH,qFAFW,qBAAqB,EAQ/B;IAjED,oBAA2B;IAE3B;;;;;;;;OAQG;IACH,iDAAmD;IAEnD;;;;;;;;;OASG;IACH,SAFU,IAAI,MAAM,EAAE,IAAI,GAAC,IAAI,GAAC,WAAW,CAAC,GAAC,SAAS,CAElC;IAqKpB;;;OAGG;IACH,iBAHW,MAAM,GACJ,QAAQ,QAAQ,CAAC,CAgB7B;IAED;;;;;;OAMG;IACH,4BAJW,WAAW,WACX,MAAM,GACL,QAAQ;QAAC,KAAK,CAAA;KAAC,MAAE,CAAC,CAM7B;IAED;;;;;;OAMG;IACH;;;mBALwC,EAAE;eAAO,EAAE;mBAAW,EAAE;iBAAS,EAAE;mBAAW,EAAE;kBAAW,EAAE;gBAAS,EAAE;gBAAQ,EAAE;gBAC/G,MAAM,gBACN,UAAU,GACT,QAAQ;QAAC,KAAK,CAAA;KAAC,MAAE,CAAC,CAiR7B;;CAGJ;8BAtyB6B,qDAAqD"}
1
+ {"version":3,"file":"tiny-gltf.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/loader/gltf/tiny-gltf.js"],"names":[],"mappings":"AA4UA;IAoEI;;;;;;;;;;;;;OAaG;IACH,+CAFU,aAAa,CAEgC;IA3BvD;;;;OAIG;IACH,qFAFW,qBAAqB,EAQ/B;IAjED,oBAA2B;IAE3B;;;;;;;;OAQG;IACH,iDAAmD;IAEnD;;;;;;;;;OASG;IACH,SAFU,IAAI,MAAM,EAAE,IAAI,GAAC,IAAI,GAAC,WAAW,CAAC,GAAC,SAAS,CAElC;IAqKpB;;;OAGG;IACH,iBAHW,MAAM,GACJ,QAAQ,QAAQ,CAAC,CAgB7B;IAED;;;;;;OAMG;IACH,4BAJW,WAAW,WACX,MAAM,GACL,QAAQ;QAAC,KAAK,CAAA;KAAC,MAAE,CAAC,CAM7B;IAED;;;;;;OAMG;IACH;;;mBALwC,EAAE;eAAO,EAAE;mBAAW,EAAE;iBAAS,EAAE;mBAAW,EAAE;kBAAW,EAAE;gBAAS,EAAE;gBAAQ,EAAE;gBAC/G,MAAM,gBACN,UAAU,GACT,QAAQ;QAAC,KAAK,CAAA;KAAC,MAAE,CAAC,CAuR7B;;CAGJ;8BA5yB6B,qDAAqD"}
@@ -498,7 +498,7 @@ export class TinyGltf {
498
498
  * Read a KTX2 image into texels, transcoding it where its payload is Basis.
499
499
  *
500
500
  * @param {ArrayBuffer|Uint8Array} bytes the whole file
501
- * @returns {ShadeTexelData}
501
+ * @returns {Promise<ShadeTexelData>}
502
502
  * @param {TextureRole} [role] what the image is for, which orders the candidate targets
503
503
  * @throws {Error} naming the feature, for a container this reader does not read
504
504
  */
@@ -811,7 +811,13 @@ export class TinyGltf {
811
811
  place_nodes(json);
812
812
 
813
813
  // Replace the resolved resources in the JSON structure.
814
- const buffers = await Promise.all(pendingBuffers);
814
+ // Observe image failures while buffers are still loading. Native decompression can reject
815
+ // during another resource's I/O; deferring its handler until all buffers finish would leave
816
+ // that rejection unhandled (and could leave the load waiting indefinitely).
817
+ const [buffers, images] = await Promise.all([
818
+ Promise.all(pendingBuffers),
819
+ Promise.all(pendingImages),
820
+ ]);
815
821
 
816
822
  /*
817
823
  Views that some extension produces the bytes for become ordinary ones here, over decoded
@@ -827,7 +833,7 @@ export class TinyGltf {
827
833
  );
828
834
 
829
835
  json.buffers = buffers;
830
- json.images = await Promise.all(pendingImages);
836
+ json.images = images;
831
837
 
832
838
  return json;
833
839
  }
@@ -13,17 +13,17 @@ export function decode_data_url(url: string): {
13
13
  *
14
14
  * Accepts anything `PNGReader` accepts; see the module comment for what that covers and how
15
15
  * other layouts are brought to RGBA8. Errors from the reader (bad signature, truncated stream,
16
- * corrupt deflate payload) propagate as thrown.
16
+ * corrupt deflate payload) reject the returned promise.
17
17
  *
18
18
  * @param {Uint8Array|ArrayBuffer} png_bytes
19
- * @returns {{ width: number, height: number, channels: number, pixels: Uint8Array }}
19
+ * @returns {Promise<{ width: number, height: number, channels: number, pixels: Uint8Array }>}
20
20
  */
21
- export function decode_png(png_bytes: Uint8Array | ArrayBuffer): {
21
+ export function decode_png(png_bytes: Uint8Array | ArrayBuffer): Promise<{
22
22
  width: number;
23
23
  height: number;
24
24
  channels: number;
25
25
  pixels: Uint8Array;
26
- };
26
+ }>;
27
27
  /**
28
28
  * Create a ShadeTexture from decoded image data.
29
29
  *
@@ -1 +1 @@
1
- {"version":3,"file":"usd_decode_image.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/loader/usd/usd_decode_image.js"],"names":[],"mappings":"AA4BA;;;;;GAKG;AACH,qCAHW,MAAM;cACQ,MAAM;UAAQ,UAAU;EAgChD;AAGD;;;;;;;;;GASG;AACH,sCAHW,UAAU,GAAC,WAAW;WACX,MAAM;YAAU,MAAM;cAAY,MAAM;YAAU,UAAU;EA0DjF;AAGD;;;;;GAKG;AACH,2DAHW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACrE,YAAY,CAexB;6BAnI4B,+BAA+B"}
1
+ {"version":3,"file":"usd_decode_image.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/loader/usd/usd_decode_image.js"],"names":[],"mappings":"AA4BA;;;;;GAKG;AACH,qCAHW,MAAM;cACQ,MAAM;UAAQ,UAAU;EAgChD;AAGD;;;;;;;;;GASG;AACH,sCAHW,UAAU,GAAC,WAAW;WACH,MAAM;YAAU,MAAM;cAAY,MAAM;YAAU,UAAU;GA0DzF;AAGD;;;;;GAKG;AACH,2DAHW;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACrE,YAAY,CAexB;6BAnI4B,+BAA+B"}
@@ -70,14 +70,14 @@ export function decode_data_url(url) {
70
70
  *
71
71
  * Accepts anything `PNGReader` accepts; see the module comment for what that covers and how
72
72
  * other layouts are brought to RGBA8. Errors from the reader (bad signature, truncated stream,
73
- * corrupt deflate payload) propagate as thrown.
73
+ * corrupt deflate payload) reject the returned promise.
74
74
  *
75
75
  * @param {Uint8Array|ArrayBuffer} png_bytes
76
- * @returns {{ width: number, height: number, channels: number, pixels: Uint8Array }}
76
+ * @returns {Promise<{ width: number, height: number, channels: number, pixels: Uint8Array }>}
77
77
  */
78
- export function decode_png(png_bytes) {
78
+ export async function decode_png(png_bytes) {
79
79
 
80
- const png = new PNGReader(to_array_buffer(png_bytes)).parse();
80
+ const png = await new PNGReader(to_array_buffer(png_bytes)).parse();
81
81
 
82
82
  const width = png.getWidth();
83
83
  const height = png.getHeight();