93 lines
2.5 KiB
TypeScript
93 lines
2.5 KiB
TypeScript
|
|
import { describe, expect, it } from "vitest";
|
||
|
|
|
||
|
|
import { deriveBoxLightVolumePointLights } from "../../src/runtime-three/light-volume-utils";
|
||
|
|
|
||
|
|
describe("deriveBoxLightVolumePointLights", () => {
|
||
|
|
it("derives a bounded four-light cluster from the dominant box axes", () => {
|
||
|
|
const lights = deriveBoxLightVolumePointLights({
|
||
|
|
size: {
|
||
|
|
x: 8,
|
||
|
|
y: 4,
|
||
|
|
z: 2
|
||
|
|
},
|
||
|
|
intensity: 2,
|
||
|
|
padding: 0.25,
|
||
|
|
falloff: "linear"
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(lights).toHaveLength(4);
|
||
|
|
expect(new Set(lights.map((light) => light.localPosition.z))).toEqual(
|
||
|
|
new Set([0])
|
||
|
|
);
|
||
|
|
expect(lights.every((light) => light.intensity === 1)).toBe(true);
|
||
|
|
expect(lights.every((light) => light.distance > 0.75)).toBe(true);
|
||
|
|
expect(lights.every((light) => light.decay === 1.4)).toBe(true);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("shrinks the light cluster inward and reduces reach as padding increases", () => {
|
||
|
|
const withoutPadding = deriveBoxLightVolumePointLights({
|
||
|
|
size: {
|
||
|
|
x: 6,
|
||
|
|
y: 6,
|
||
|
|
z: 3
|
||
|
|
},
|
||
|
|
intensity: 1.5,
|
||
|
|
padding: 0,
|
||
|
|
falloff: "smoothstep"
|
||
|
|
});
|
||
|
|
const withPadding = deriveBoxLightVolumePointLights({
|
||
|
|
size: {
|
||
|
|
x: 6,
|
||
|
|
y: 6,
|
||
|
|
z: 3
|
||
|
|
},
|
||
|
|
intensity: 1.5,
|
||
|
|
padding: 1,
|
||
|
|
falloff: "smoothstep"
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(withPadding).toHaveLength(withoutPadding.length);
|
||
|
|
expect(
|
||
|
|
Math.abs(withPadding[0]?.localPosition.x ?? 0)
|
||
|
|
).toBeLessThan(Math.abs(withoutPadding[0]?.localPosition.x ?? 0));
|
||
|
|
expect(
|
||
|
|
Math.abs(withPadding[0]?.localPosition.y ?? 0)
|
||
|
|
).toBeLessThan(Math.abs(withoutPadding[0]?.localPosition.y ?? 0));
|
||
|
|
expect((withPadding[0]?.distance ?? 0)).toBeLessThan(
|
||
|
|
withoutPadding[0]?.distance ?? 0
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("uses a softer smoothstep layout than linear falloff", () => {
|
||
|
|
const linear = deriveBoxLightVolumePointLights({
|
||
|
|
size: {
|
||
|
|
x: 5,
|
||
|
|
y: 5,
|
||
|
|
z: 2
|
||
|
|
},
|
||
|
|
intensity: 1.25,
|
||
|
|
padding: 0.4,
|
||
|
|
falloff: "linear"
|
||
|
|
});
|
||
|
|
const smoothstep = deriveBoxLightVolumePointLights({
|
||
|
|
size: {
|
||
|
|
x: 5,
|
||
|
|
y: 5,
|
||
|
|
z: 2
|
||
|
|
},
|
||
|
|
intensity: 1.25,
|
||
|
|
padding: 0.4,
|
||
|
|
falloff: "smoothstep"
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(Math.abs(smoothstep[0]?.localPosition.x ?? 0)).toBeGreaterThan(
|
||
|
|
Math.abs(linear[0]?.localPosition.x ?? 0)
|
||
|
|
);
|
||
|
|
expect(Math.abs(smoothstep[0]?.localPosition.y ?? 0)).toBeGreaterThan(
|
||
|
|
Math.abs(linear[0]?.localPosition.y ?? 0)
|
||
|
|
);
|
||
|
|
expect(smoothstep[0]?.decay).toBe(2);
|
||
|
|
expect(linear[0]?.decay).toBe(1.4);
|
||
|
|
});
|
||
|
|
});
|