@forgeax/engine-render 0.1.19 → 0.1.20
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/dist/.tsbuildinfo +1 -1
- package/dist/assembly/factory.d.ts +16 -5
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/{chunk-RJRUS55L.mjs → chunk-4XINDLAY.mjs} +267 -186
- package/dist/chunk-4XINDLAY.mjs.map +1 -0
- package/dist/{chunk-YTQ5C7YQ.mjs → chunk-CDTWTHZR.mjs} +176 -8
- package/dist/chunk-CDTWTHZR.mjs.map +1 -0
- package/dist/{chunk-IPXCABEP.mjs → chunk-M2MP4ZOU.mjs} +2 -2
- package/dist/chunk-M2MP4ZOU.mjs.map +1 -0
- package/dist/{chunk-LOSO4CTV.mjs → chunk-TBQJOK2L.mjs} +67 -3
- package/dist/chunk-TBQJOK2L.mjs.map +1 -0
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/spot-light.d.ts +12 -0
- package/dist/components/spot-light.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +2281 -164
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +19 -2
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/errors/render.d.ts +69 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/gpu-usage.d.ts +2 -0
- package/dist/gpu-usage.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/internal.mjs +1 -1
- package/dist/light-buffer-layout.d.ts +20 -12
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +6 -3
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-profile.d.ts +13 -0
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/record/frame-lighting.d.ts +2 -0
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +37 -1
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +3 -2
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-timing.d.ts +32 -0
- package/dist/record/gpu-timing.d.ts.map +1 -0
- package/dist/record/main-pass-material.d.ts +1 -1
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +5 -1
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +11 -3
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/render-contract.d.ts +66 -1
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-data.d.ts +10 -6
- package/dist/render-data.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +36 -0
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +55 -3
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +7 -1
- package/dist/render-system.d.ts.map +1 -1
- package/dist/renderer-inspect.d.ts +29 -0
- package/dist/renderer-inspect.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/temporal/frame.d.ts +44 -0
- package/dist/temporal/frame.d.ts.map +1 -0
- package/dist/temporal/index.mjs +3 -3
- package/dist/typed-render-graph-primitives.d.ts +6 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-atlas.d.ts +10 -0
- package/dist/typed-shadow-atlas.d.ts.map +1 -0
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/capability.d.ts +57 -0
- package/dist/volume/capability.d.ts.map +1 -0
- package/dist/volume/component.d.ts +61 -0
- package/dist/volume/component.d.ts.map +1 -0
- package/dist/volume/extract.d.ts +11 -0
- package/dist/volume/extract.d.ts.map +1 -0
- package/dist/volume/inspection.d.ts +38 -0
- package/dist/volume/inspection.d.ts.map +1 -0
- package/dist/volume/passes.d.ts +38 -0
- package/dist/volume/passes.d.ts.map +1 -0
- package/dist/volume/recovery.d.ts +38 -0
- package/dist/volume/recovery.d.ts.map +1 -0
- package/dist/volume/resources.d.ts +57 -0
- package/dist/volume/resources.d.ts.map +1 -0
- package/dist/volume/temporal.d.ts +35 -0
- package/dist/volume/temporal.d.ts.map +1 -0
- package/package.json +20 -20
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
- package/src/__tests__/render-error-code-owner.test-d.ts +5 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +28 -0
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +1 -1
- package/src/__tests__/skinned-shadow-caster.test.ts +21 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +7 -5
- package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
- package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
- package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
- package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
- package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
- package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
- package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
- package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
- package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
- package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
- package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
- package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
- package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
- package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
- package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
- package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
- package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
- package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
- package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
- package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
- package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
- package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
- package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
- package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
- package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
- package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
- package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
- package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
- package/src/assembly/factory.ts +271 -15
- package/src/components/light-helpers.ts +4 -0
- package/src/components/spot-light.ts +22 -3
- package/src/device/gpu-residency.ts +168 -58
- package/src/errors/render.ts +119 -1
- package/src/gpu-usage.ts +2 -0
- package/src/index.ts +38 -1
- package/src/light-buffer-layout.ts +59 -26
- package/src/pbr-pipeline.ts +33 -10
- package/src/pipeline/standard-forward-lane.ts +20 -0
- package/src/pipeline/standard-pipeline.ts +20 -0
- package/src/pipeline/standard-profile.ts +23 -0
- package/src/record/frame-lighting.ts +103 -89
- package/src/record/frame-snapshot.ts +41 -1
- package/src/record/frame-targets.ts +6 -2
- package/src/record/frame.ts +908 -5
- package/src/record/gpu-timing.ts +224 -0
- package/src/record/main-pass-material.ts +6 -2
- package/src/record/render-context.ts +5 -0
- package/src/record/shadow-pass.ts +87 -38
- package/src/record/typed-frame-graph.ts +143 -8
- package/src/render-contract.ts +72 -0
- package/src/render-data.ts +50 -22
- package/src/render-pipeline.ts +44 -0
- package/src/render-system-extract.ts +329 -3
- package/src/render-system.ts +79 -0
- package/src/renderer-inspect.ts +66 -0
- package/src/scene/render-scene.ts +2 -0
- package/src/temporal/frame.ts +128 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +2 -3
- package/src/typed-render-graph-primitives.ts +32 -2
- package/src/typed-shadow-atlas.ts +17 -0
- package/src/typed-shadow-passes.ts +6 -5
- package/src/volume/capability.ts +173 -0
- package/src/volume/component.ts +110 -0
- package/src/volume/extract.ts +21 -0
- package/src/volume/inspection.ts +78 -0
- package/src/volume/passes.ts +680 -0
- package/src/volume/recovery.ts +86 -0
- package/src/volume/resources.ts +236 -0
- package/src/volume/temporal.ts +89 -0
- package/dist/chunk-IPXCABEP.mjs.map +0 -1
- package/dist/chunk-LOSO4CTV.mjs.map +0 -1
- package/dist/chunk-RJRUS55L.mjs.map +0 -1
- package/dist/chunk-YTQ5C7YQ.mjs.map +0 -1
|
@@ -61,10 +61,12 @@ describe('Standard profile oracle', () => {
|
|
|
61
61
|
]);
|
|
62
62
|
});
|
|
63
63
|
|
|
64
|
-
it('
|
|
65
|
-
expect(DEFAULT_STANDARD_PROFILE).
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
it('keeps current-main post-processing defaults in the Standard profile', () => {
|
|
65
|
+
expect(DEFAULT_STANDARD_PROFILE).toMatchObject({
|
|
66
|
+
tone: 'aces-filmic',
|
|
67
|
+
antialias: 'fxaa',
|
|
68
|
+
bloom: true,
|
|
69
|
+
sky: true,
|
|
70
|
+
});
|
|
69
71
|
});
|
|
70
72
|
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
|
|
5
|
+
const integrateShader = readFileSync(
|
|
6
|
+
fileURLToPath(new URL('../../../shader/src/volume/volume-integrate.wgsl', import.meta.url)),
|
|
7
|
+
'utf8',
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
const EPSILON = 1e-6;
|
|
11
|
+
|
|
12
|
+
function clampExponent(value: number): number {
|
|
13
|
+
return Math.min(Math.max(value, -80), 80);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function beerLambert(extinction: number, distance: number, density: number): number {
|
|
17
|
+
const opticalDepth = Math.max(extinction * Math.max(distance, 0) * Math.max(density, 0), 0);
|
|
18
|
+
return Math.exp(-Math.min(opticalDepth, 80));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function henyeyGreenstein(cosTheta: number, anisotropy: number): number {
|
|
22
|
+
const g = Math.min(Math.max(anisotropy, -0.999), 0.999);
|
|
23
|
+
const denominator = Math.max(1 + g * g - 2 * g * cosTheta, EPSILON);
|
|
24
|
+
return (1 - g * g) / (4 * Math.PI * denominator ** 1.5);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe('volumetric optics CPU oracle', () => {
|
|
28
|
+
it('requires the true volume integration shader owner', () => {
|
|
29
|
+
expect(integrateShader).toContain('fn hg');
|
|
30
|
+
expect(integrateShader).toContain('FOUR_PI');
|
|
31
|
+
expect(integrateShader).toContain('textureStore(resolved');
|
|
32
|
+
expect(integrateShader).not.toContain('apply_fog');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('does not apply density twice to single-scatter radiance', () => {
|
|
36
|
+
expect(integrateShader).not.toContain('phase * sample.g * sample.r * (1.0 - transmittance)');
|
|
37
|
+
expect(integrateShader).toContain(
|
|
38
|
+
'let local_scatter = radiance * volume_params.albedo.xyz * phase *',
|
|
39
|
+
);
|
|
40
|
+
expect(integrateShader).toContain('VOLUME_LIGHT_PHASE_SCALE * (1.0 - local_transmittance) +');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('converts the shared integrated-light basis once before normalized HG', () => {
|
|
44
|
+
expect(integrateShader).toContain('const VOLUME_LIGHT_PHASE_SCALE : f32 = FOUR_PI;');
|
|
45
|
+
expect(integrateShader).toContain('phase *\n VOLUME_LIGHT_PHASE_SCALE *');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('keeps empty density at identity transmittance', () => {
|
|
49
|
+
expect(beerLambert(2, 100, 0)).toBeCloseTo(1, 6);
|
|
50
|
+
expect(beerLambert(0, 100, 4)).toBeCloseTo(1, 6);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('makes transmittance monotonic for increasing density', () => {
|
|
54
|
+
const samples = [0, 0.1, 0.5, 1, 4].map((density) => beerLambert(1.2, 3, density));
|
|
55
|
+
for (let index = 1; index < samples.length; index += 1) {
|
|
56
|
+
expect(samples[index]).toBeLessThanOrEqual((samples[index - 1] ?? 0) + EPSILON);
|
|
57
|
+
}
|
|
58
|
+
expect(samples.every(Number.isFinite)).toBe(true);
|
|
59
|
+
expect(samples.every((value) => value >= 0 && value <= 1)).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('keeps phase finite and distinguishes forward and backward scattering', () => {
|
|
63
|
+
const isotropic = henyeyGreenstein(0, 0);
|
|
64
|
+
const forward = henyeyGreenstein(1, 0.7);
|
|
65
|
+
const backward = henyeyGreenstein(-1, 0.7);
|
|
66
|
+
expect(isotropic).toBeCloseTo(1 / (4 * Math.PI), 6);
|
|
67
|
+
expect(forward).toBeGreaterThan(backward);
|
|
68
|
+
expect([isotropic, forward, backward].every(Number.isFinite)).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('clamps exponent input without producing NaN or Infinity', () => {
|
|
72
|
+
const values = [-Infinity, -120, 0, 120, Infinity].map((value) =>
|
|
73
|
+
Math.exp(clampExponent(value)),
|
|
74
|
+
);
|
|
75
|
+
expect(values.every(Number.isFinite)).toBe(true);
|
|
76
|
+
expect(values.every((value) => value > 0)).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('cuts integration at the nearer depth or authored distance', () => {
|
|
80
|
+
const depthDistance = 4;
|
|
81
|
+
const maxDistance = 2;
|
|
82
|
+
expect(Math.min(depthDistance, maxDistance)).toBe(2);
|
|
83
|
+
expect(beerLambert(1, Math.min(depthDistance, maxDistance), 1)).toBeCloseTo(Math.exp(-2), 6);
|
|
84
|
+
});
|
|
85
|
+
});
|