diff --git a/tests/domain/advanced-rendering.test.ts b/tests/domain/advanced-rendering.test.ts index e088d115..b91c2e35 100644 --- a/tests/domain/advanced-rendering.test.ts +++ b/tests/domain/advanced-rendering.test.ts @@ -1,4 +1,4 @@ -import { PerspectiveCamera, Scene, UnsignedByteType } from "three"; +import { MeshStandardMaterial, PerspectiveCamera, Scene, UnsignedByteType } from "three"; import { describe, expect, it, vi } from "vitest"; const postprocessingState = vi.hoisted(() => ({ @@ -85,6 +85,10 @@ vi.mock("postprocessing", () => { import { createDefaultWorldSettings } from "../../src/document/world-settings"; import { createAdvancedRenderingComposer, resolveBoxVolumeRenderPaths } from "../../src/rendering/advanced-rendering"; +import { + applyWhiteboxBevelToMaterial, + shouldApplyWhiteboxBevel +} from "../../src/rendering/whitebox-bevel-material"; describe("resolveBoxVolumeRenderPaths", () => { it("uses authored fog and water paths when advanced rendering is enabled", () => { @@ -193,3 +197,39 @@ describe("createAdvancedRenderingComposer", () => { expect(postprocessingState.ssaoCalls[1].options.radius).toBeCloseTo(0.07, 6); }); }); + +describe("whitebox bevel materials", () => { + it("only applies when advanced rendering and the effect are both enabled", () => { + const settings = createDefaultWorldSettings().advancedRendering; + + expect(shouldApplyWhiteboxBevel(settings)).toBe(false); + + settings.enabled = true; + settings.whiteboxBevel.enabled = true; + + expect(shouldApplyWhiteboxBevel(settings)).toBe(true); + }); + + it("injects face-space bevel shading into standard materials", () => { + const material = new MeshStandardMaterial(); + + applyWhiteboxBevelToMaterial(material, { + enabled: true, + edgeWidth: 0.18, + normalStrength: 0.9 + }); + + const shader = { + vertexShader: "#include \n#include \n", + fragmentShader: "#include \n#include \n" + }; + + material.onBeforeCompile(shader as never); + + expect(shader.vertexShader).toContain("attribute vec2 faceUv;"); + expect(shader.vertexShader).toContain("vWhiteboxFaceUv = faceUv;"); + expect(shader.fragmentShader).toContain("varying vec2 vWhiteboxFaceUv;"); + expect(shader.fragmentShader).toContain("whiteboxBevelMask"); + expect(material.customProgramCacheKey?.()).toContain("whitebox-bevel:"); + }); +});