Add unit tests for distance fog and advanced rendering composer passes
This commit is contained in:
@@ -150,6 +150,11 @@ import {
|
||||
createAdvancedRenderingComposer,
|
||||
resolveBoxVolumeRenderPaths
|
||||
} from "../../src/rendering/advanced-rendering";
|
||||
import {
|
||||
applyAdvancedRenderingPerspectiveCameraFar,
|
||||
resolveAdvancedRenderingPerspectiveCameraFar,
|
||||
resolveDistanceFogParameters
|
||||
} from "../../src/rendering/distance-fog-pass";
|
||||
import { resolveDynamicGlobalIlluminationParameters } from "../../src/rendering/screen-space-global-illumination";
|
||||
import {
|
||||
ALL_RENDER_LAYER_MASK,
|
||||
@@ -238,6 +243,64 @@ describe("resolveDynamicGlobalIlluminationParameters", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("distance fog parameters", () => {
|
||||
it("keeps the pass disabled by default", () => {
|
||||
const settings = createDefaultWorldSettings().advancedRendering;
|
||||
|
||||
expect(resolveDistanceFogParameters(settings.distanceFog)).toMatchObject({
|
||||
enabled: false
|
||||
});
|
||||
expect(
|
||||
resolveAdvancedRenderingPerspectiveCameraFar(settings, 1000, 0.1)
|
||||
).toBe(1000);
|
||||
});
|
||||
|
||||
it("resolves a bounded fog range and perspective render-distance clamp", () => {
|
||||
const settings = createDefaultWorldSettings().advancedRendering;
|
||||
settings.enabled = true;
|
||||
settings.distanceFog = {
|
||||
enabled: true,
|
||||
colorHex: "#aabbcc",
|
||||
nearDistance: 40,
|
||||
farDistance: 400,
|
||||
strength: 2,
|
||||
renderDistance: 180
|
||||
};
|
||||
|
||||
expect(resolveDistanceFogParameters(settings.distanceFog)).toMatchObject({
|
||||
enabled: true,
|
||||
colorHex: "#aabbcc",
|
||||
nearDistance: 40,
|
||||
farDistance: 180,
|
||||
strength: 1,
|
||||
renderDistance: 180
|
||||
});
|
||||
expect(
|
||||
resolveAdvancedRenderingPerspectiveCameraFar(settings, 1000, 0.1)
|
||||
).toBe(180);
|
||||
});
|
||||
|
||||
it("applies and resets the perspective camera far clamp", () => {
|
||||
const settings = createDefaultWorldSettings().advancedRendering;
|
||||
const camera = new PerspectiveCamera(60, 1, 0.1, 1000);
|
||||
settings.enabled = true;
|
||||
settings.distanceFog.enabled = true;
|
||||
settings.distanceFog.renderDistance = 125;
|
||||
|
||||
expect(
|
||||
applyAdvancedRenderingPerspectiveCameraFar(camera, settings, 1000)
|
||||
).toBe(true);
|
||||
expect(camera.far).toBe(125);
|
||||
|
||||
settings.distanceFog.enabled = false;
|
||||
|
||||
expect(
|
||||
applyAdvancedRenderingPerspectiveCameraFar(camera, settings, 1000)
|
||||
).toBe(true);
|
||||
expect(camera.far).toBe(1000);
|
||||
});
|
||||
});
|
||||
|
||||
describe("createAdvancedRenderingComposer", () => {
|
||||
it("keeps depth buffering enabled when the post stack only uses color effects", () => {
|
||||
postprocessingState.composerOptions.length = 0;
|
||||
@@ -278,6 +341,56 @@ describe("createAdvancedRenderingComposer", () => {
|
||||
expect(postprocessingState.ssaoCalls).toHaveLength(0);
|
||||
});
|
||||
|
||||
it("adds distance fog before post-world overlay layers", () => {
|
||||
postprocessingState.composerOptions.length = 0;
|
||||
postprocessingState.composerPasses.length = 0;
|
||||
postprocessingState.normalPassTextures.length = 0;
|
||||
postprocessingState.ssaoCalls.length = 0;
|
||||
|
||||
const settings = createDefaultWorldSettings().advancedRendering;
|
||||
settings.enabled = true;
|
||||
settings.distanceFog.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",
|
||||
"DistanceFogPass",
|
||||
"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("adds the dynamic GI pass only when dynamic GI is enabled", () => {
|
||||
postprocessingState.composerOptions.length = 0;
|
||||
postprocessingState.composerPasses.length = 0;
|
||||
|
||||
Reference in New Issue
Block a user