Files
Leonid Pershin 96e19c7c61 Lighting: directional sun shadows from the day/night sun angle
DayNight.SunShadow returns a cell offset opposite the sun's east-west position, longest near sunrise/sunset (low sun) and zero at noon/night, tilted slightly south so shadows fall in front of occluders. LightmapBuilder gains a directional shadow pass (MaxShadowCells length cap, SunShadowStrength darkening); LightmapSystem feeds it the current sun shadow each rebuild. Tests cover SunShadow's day-arc behaviour and the builder's directional darkening.
2026-06-14 07:04:11 +03:00

75 lines
2.3 KiB
C#

using Microsoft.Xna.Framework;
using MrGameEng.Core;
using MrGameEng.Lighting;
using Xunit;
namespace MrGameEng.Lighting.Tests;
public class DayNightTests
{
private static (GameClock Clock, DayNight DayNight) Make()
{
var clock = new GameClock();
var calendar = new Calendar(clock, secondsPerDay: 24f); // 1 second = 1 in-game hour
return (clock, new DayNight(calendar, DayNightSettings.Default));
}
[Fact]
public void Daylight_ZeroAtMidnight_OneAtNoon()
{
var (clock, dayNight) = Make();
Assert.Equal(0f, dayNight.Daylight, 3); // 00:00
clock.Advance(12f); // 12:00
Assert.Equal(1f, dayNight.Daylight, 3);
}
[Fact]
public void Daylight_RisesFromDawnToNoon()
{
var (clock, dayNight) = Make();
clock.Advance(6f); // 06:00
var dawn = dayNight.Daylight;
clock.Advance(3f); // 09:00
var mid = dayNight.Daylight;
clock.Advance(3f); // 12:00
var noon = dayNight.Daylight;
Assert.True(dawn < mid && mid < noon, "daylight should rise from dawn to noon");
}
[Fact]
public void SunShadow_ZeroAtNight_PointsWestInMorning_EastInAfternoon_ShortAtNoon()
{
var (clock, dayNight) = Make(); // 1s = 1 in-game hour
Assert.Equal(Vector2.Zero, dayNight.SunShadow(8f)); // 00:00 — night, no sun
clock.Advance(7f); // 07:00 — low morning sun in the east
var morning = dayNight.SunShadow(8f);
Assert.True(morning.X < 0f, "morning shadow points west");
Assert.True(morning.Length() > 2f, "low sun casts a long shadow");
clock.Advance(5f); // 12:00 — sun overhead
Assert.True(dayNight.SunShadow(8f).Length() < 1f, "noon sun casts almost no shadow");
clock.Advance(5f); // 17:00 — afternoon sun in the west
Assert.True(dayNight.SunShadow(8f).X > 0f, "afternoon shadow points east");
}
[Fact]
public void Ambient_DarkerAtNightThanAtNoon()
{
var (clock, dayNight) = Make();
var night = dayNight.Ambient; // 00:00
clock.Advance(12f); // 12:00
var noon = dayNight.Ambient;
Assert.True(night.R < noon.R && night.G < noon.G && night.B < noon.B);
Assert.Equal(255, noon.R); // day color is white at noon
}
}