@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.
- package/build/bundle-worker-image-decoder.js +1 -1
- package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleCurveEditorView.js +303 -120
- package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleGradientEditorView.js +108 -63
- package/editor/view/particles/effect/ParticleGraphEditorView.js +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.js +3 -1
- package/editor/view/particles/effect/particle-editor.css +60 -30
- package/package.json +1 -2
- package/samples/engine/README.md +1 -1
- package/src/core/binary/compression/decompress_bytes.d.ts +13 -0
- package/src/core/binary/compression/decompress_bytes.d.ts.map +1 -0
- package/src/core/binary/compression/decompress_bytes.js +28 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +67 -22
- package/src/engine/asset/loaders/image/ImageDecoderWorker.js +12 -27
- package/src/engine/asset/loaders/image/prototypePNG.js +8 -7
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +266 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +455 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +58 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +219 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +178 -25
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +809 -310
- package/src/format/image/png/PNGReader.d.ts +7 -6
- package/src/format/image/png/PNGReader.d.ts.map +1 -1
- package/src/format/image/png/PNGReader.js +13 -12
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts +3 -2
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +5 -4
- package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts +3 -2
- package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_zTXt.js +5 -4
- package/src/format/image/png/png_inflate.d.ts +3 -3
- package/src/format/image/png/png_inflate.d.ts.map +1 -1
- package/src/format/image/png/png_inflate.js +29 -39
- package/src/format/texture/ktx2/ktx2_read.d.ts +4 -4
- package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
- package/src/format/texture/ktx2/ktx2_read.js +18 -21
- package/src/shade/playground/particle_ecs/README.md +203 -0
- package/src/shade/playground/particle_ecs/bonfire_editor.d.ts +39 -0
- package/src/shade/playground/particle_ecs/bonfire_editor.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/bonfire_editor.js +315 -0
- package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +145 -0
- package/src/shade/playground/particle_ecs/bonfire_effects.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/bonfire_effects.js +202 -0
- package/src/shade/playground/particle_ecs/bonfire_sprites.d.ts +23 -0
- package/src/shade/playground/particle_ecs/bonfire_sprites.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/bonfire_sprites.js +315 -0
- package/src/shade/playground/particle_ecs/bonfire_world.d.ts +86 -0
- package/src/shade/playground/particle_ecs/bonfire_world.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/bonfire_world.js +303 -0
- package/src/shade/playground/particle_ecs/effects/embers.json +1634 -0
- package/src/shade/playground/particle_ecs/effects/flame.json +1882 -0
- package/src/shade/playground/particle_ecs/effects/smoke.json +1860 -0
- package/src/shade/playground/particle_ecs/effects/soot.json +1606 -0
- package/src/shade/playground/particle_ecs/index.html +330 -0
- package/src/shade/playground/particle_ecs/main.d.ts +2 -0
- package/src/shade/playground/particle_ecs/main.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/main.js +566 -0
- package/src/shade/playground/particle_ecs/moonlit_environment.d.ts +16 -0
- package/src/shade/playground/particle_ecs/moonlit_environment.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/moonlit_environment.js +144 -0
- package/src/shade/playground/particle_editor/README.md +5 -4
- package/src/shade/playground/profile_hotkey.d.ts +58 -0
- package/src/shade/playground/profile_hotkey.d.ts.map +1 -0
- package/src/shade/playground/profile_hotkey.js +325 -0
- package/src/shade/playground/ssr_variance/README.md +105 -0
- package/src/shade/playground/ssr_variance/capture.d.ts +16 -0
- package/src/shade/playground/ssr_variance/capture.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/capture.js +96 -0
- package/src/shade/playground/ssr_variance/index.html +22 -0
- package/src/shade/playground/ssr_variance/main.d.ts +2 -0
- package/src/shade/playground/ssr_variance/main.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/main.js +246 -0
- package/src/shade/playground/ssr_variance/reference.d.ts +18 -0
- package/src/shade/playground/ssr_variance/reference.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/reference.js +78 -0
- package/src/shade/playground/ssr_variance/scene.d.ts +11 -0
- package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/scene.js +61 -0
- package/src/shade/playground/ssr_variance/statistics.d.ts +44 -0
- package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/statistics.js +51 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.js +9 -3
- package/src/shade/renderer/loader/usd/usd_decode_image.d.ts +4 -4
- package/src/shade/renderer/loader/usd/usd_decode_image.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/usd_decode_image.js +4 -4
- package/src/shade/renderer/particles/DESIGN.md +748 -703
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +11 -4
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +431 -424
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +2 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.js +0 -6
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.js +19 -5
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts +4 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +133 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +0 -8
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +16 -113
- package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts +2 -2
- package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts.map +1 -1
- package/src/shade/renderer/texture/source/texel_data_from_ktx2.js +3 -3
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts +0 -20
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts.map +0 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +0 -14
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +0 -1
- package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts +0 -50
- package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts.map +0 -1
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +0 -17
- 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,
|
|
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
|
-
|
|
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 =
|
|
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)
|
|
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;
|
|
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)
|
|
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();
|