Add test for star rotation based on sun orbit
This commit is contained in:
@@ -5,7 +5,8 @@ import { createDefaultWorldSettings } from "../../src/document/world-settings";
|
|||||||
import {
|
import {
|
||||||
createWorldShaderSkyEnvironmentCacheKey,
|
createWorldShaderSkyEnvironmentCacheKey,
|
||||||
resolveWorldShaderSkyEnvironmentPhaseStates,
|
resolveWorldShaderSkyEnvironmentPhaseStates,
|
||||||
resolveWorldShaderSkyRenderState
|
resolveWorldShaderSkyRenderState,
|
||||||
|
resolveWorldShaderSkyStarRotation
|
||||||
} from "../../src/rendering/world-shader-sky";
|
} from "../../src/rendering/world-shader-sky";
|
||||||
import {
|
import {
|
||||||
resolveRuntimeDayNightWorldState,
|
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", () => {
|
it("offsets shader-rendered celestial positions when the horizon height changes", () => {
|
||||||
const world = createDefaultWorldSettings();
|
const world = createDefaultWorldSettings();
|
||||||
const time = createDefaultProjectTimeSettings();
|
const time = createDefaultProjectTimeSettings();
|
||||||
|
|||||||
Reference in New Issue
Block a user