Add test for star rotation based on sun orbit

This commit is contained in:
2026-04-25 15:43:04 +02:00
parent b2e271c383
commit 5f74e091c3

View File

@@ -5,7 +5,8 @@ import { createDefaultWorldSettings } from "../../src/document/world-settings";
import {
createWorldShaderSkyEnvironmentCacheKey,
resolveWorldShaderSkyEnvironmentPhaseStates,
resolveWorldShaderSkyRenderState
resolveWorldShaderSkyRenderState,
resolveWorldShaderSkyStarRotation
} from "../../src/rendering/world-shader-sky";
import {
resolveRuntimeDayNightWorldState,
@@ -249,6 +250,73 @@ describe("resolveWorldShaderSkyRenderState", () => {
);
});
it("rotates shader stars linearly around the authored sun orbit axis", () => {
const world = createDefaultWorldSettings();
const time = createDefaultProjectTimeSettings();
world.background = {
mode: "shader"
};
world.celestialOrbits.sun = {
azimuthDegrees: 35,
peakAltitudeDegrees: 38
};
const resolveSkyAtHour = (timeOfDayHours: number) => {
const resolvedTime = resolveRuntimeTimeState(time, {
timeOfDayHours,
dayCount: 0,
dayLengthMinutes: 24
});
const resolvedWorld = resolveRuntimeDayNightWorldState(
world,
time,
{
timeOfDayHours,
dayCount: 0,
dayLengthMinutes: 24
},
resolvedTime
);
return resolveWorldShaderSkyRenderState(
world,
resolvedWorld,
resolvedTime,
time
);
};
const midnightSky = resolveSkyAtHour(0);
const morningSky = resolveSkyAtHour(6);
const noonSky = resolveSkyAtHour(12);
const expectedMorningRotation = resolveWorldShaderSkyStarRotation(
6,
world.celestialOrbits.sun
);
const axis = morningSky?.stars.rotationAxis ?? { x: 0, y: 0, z: 0 };
const axisLength = Math.hypot(axis.x, axis.y, axis.z);
expect(midnightSky).not.toBeNull();
expect(morningSky).not.toBeNull();
expect(noonSky).not.toBeNull();
expect(
(morningSky?.stars.rotationRadians ?? 0) -
(midnightSky?.stars.rotationRadians ?? 0)
).toBeCloseTo(Math.PI / 2);
expect(
(noonSky?.stars.rotationRadians ?? 0) -
(morningSky?.stars.rotationRadians ?? 0)
).toBeCloseTo(Math.PI / 2);
expect(morningSky?.stars.rotationRadians).toBeCloseTo(
expectedMorningRotation.rotationRadians
);
expect(axis.x).toBeCloseTo(expectedMorningRotation.rotationAxis.x);
expect(axis.y).toBeCloseTo(expectedMorningRotation.rotationAxis.y);
expect(axis.z).toBeCloseTo(expectedMorningRotation.rotationAxis.z);
expect(axisLength).toBeCloseTo(1);
expect(Math.abs(axis.x) + Math.abs(axis.z)).toBeGreaterThan(0.1);
});
it("offsets shader-rendered celestial positions when the horizon height changes", () => {
const world = createDefaultWorldSettings();
const time = createDefaultProjectTimeSettings();