From bf7a91326f851da375bce2b3f6ecf745d63d3be7 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 19 May 2026 21:13:25 +0200 Subject: [PATCH] Add tests for advanced rendering features, including lens flare logic --- tests/domain/advanced-rendering.test.ts | 96 +++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/tests/domain/advanced-rendering.test.ts b/tests/domain/advanced-rendering.test.ts index 0fb79aaf..e0260c92 100644 --- a/tests/domain/advanced-rendering.test.ts +++ b/tests/domain/advanced-rendering.test.ts @@ -796,6 +796,102 @@ describe("createAdvancedRenderingComposer", () => { ).toBe(ALL_RENDER_LAYER_MASK); }); + it("adds lens flare before post-world overlay layers when a sun source is available", () => { + postprocessingState.composerOptions.length = 0; + postprocessingState.composerPasses.length = 0; + postprocessingState.normalPassTextures.length = 0; + postprocessingState.ssaoCalls.length = 0; + + const settings = createDefaultWorldSettings().advancedRendering; + const lightSource = createScreenSpaceLensFlareLightSource(); + settings.enabled = true; + settings.lensFlare.enabled = true; + syncScreenSpaceLensFlareLightSource(lightSource, { + colorHex: "#fff1cc", + intensity: 1, + direction: { + x: 0, + y: 0.25, + z: -1 + } + }); + + createAdvancedRenderingComposer( + { + capabilities: { + isWebGL2: true + } + } as unknown as never, + new Scene(), + new PerspectiveCamera(), + settings, + null, + null, + null, + lightSource + ); + + expect( + postprocessingState.composerPasses.map( + (pass) => (pass as { name: string }).name + ) + ).toEqual([ + "RenderPass", + "ScreenSpaceLensFlarePass", + "RenderPass", + "RenderPass", + "EffectPass" + ]); + expect( + (postprocessingState.composerPasses[0] as { renderLayerMask?: number }) + .renderLayerMask + ).toBe(AO_WORLD_RENDER_LAYER_MASK); + expect( + (postprocessingState.composerPasses[1] as { needsDepthTexture?: boolean }) + .needsDepthTexture + ).toBe(true); + expect( + (postprocessingState.composerPasses[2] as { renderLayerMask?: number }) + .renderLayerMask + ).toBe(POST_AO_TRANSPARENT_RENDER_LAYER_MASK); + expect( + (postprocessingState.composerPasses[3] as { renderLayerMask?: number }) + .renderLayerMask + ).toBe(OVERLAY_RENDER_LAYER_MASK); + }); + + it("does not add lens flare when the feature is enabled without a light source", () => { + postprocessingState.composerOptions.length = 0; + postprocessingState.composerPasses.length = 0; + postprocessingState.normalPassTextures.length = 0; + postprocessingState.ssaoCalls.length = 0; + + const settings = createDefaultWorldSettings().advancedRendering; + settings.enabled = true; + settings.lensFlare.enabled = true; + + createAdvancedRenderingComposer( + { + capabilities: { + isWebGL2: true + } + } as unknown as never, + new Scene(), + new PerspectiveCamera(), + settings + ); + + expect( + postprocessingState.composerPasses.map( + (pass) => (pass as { name: string }).name + ) + ).toEqual(["RenderPass", "EffectPass"]); + expect( + (postprocessingState.composerPasses[0] as { renderLayerMask?: number }) + .renderLayerMask + ).toBe(ALL_RENDER_LAYER_MASK); + }); + it("adds the dynamic GI pass only when dynamic GI is enabled", () => { postprocessingState.composerOptions.length = 0; postprocessingState.composerPasses.length = 0;