summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-22 00:44:00 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-22 00:44:00 +0800
commite9d3e224e802ec41b9f565f5e8ed7eec8470a310 (patch)
tree98247fe11fbf22141e0baaf188ddf29a38e0d9b9 /src/LivingVillage.Desktop.Tests
parenta5c3400412fbab11d4f4b83a5d0294292eee5f08 (diff)
downloadliving-village-e9d3e224e802ec41b9f565f5e8ed7eec8470a310.tar.gz
feat(desktop): P17 清晨/黄昏光照精修(暖色天际 + 过渡窗口参数化,分数小时平滑)
Diffstat (limited to 'src/LivingVillage.Desktop.Tests')
-rw-r--r--src/LivingVillage.Desktop.Tests/PrototypeTests.fs44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/LivingVillage.Desktop.Tests/PrototypeTests.fs b/src/LivingVillage.Desktop.Tests/PrototypeTests.fs
index b8f23a0..5a153b1 100644
--- a/src/LivingVillage.Desktop.Tests/PrototypeTests.fs
+++ b/src/LivingVillage.Desktop.Tests/PrototypeTests.fs
@@ -858,21 +858,35 @@ type PrototypeTests () =
Assert.AreEqual<float32>(1.0f, (atHour 0).Blend)
Assert.AreEqual<float32>(1.0f, (atHour 2).Blend)
- // Dawn ramp: 4:00 -> 6:00 goes night -> day, monotonic.
- let dawnStart = (atHour 4).Blend
- let dawnMid = (M6Presentation.lightingAtTick (int64 5 * ticksPerHour)).Blend
- let dawnEnd = (atHour 6).Blend
- Assert.AreEqual<float32>(1.0f, dawnStart)
- Assert.AreEqual<float32>(0.5f, dawnMid)
- Assert.AreEqual<float32>(0.0f, dawnEnd)
-
- // Dusk ramp 20:00 -> 22:00 goes day -> night monotonically.
- let duskStart = (atHour 20).Blend
- let duskMid = (M6Presentation.lightingAtTick (int64 21 * ticksPerHour)).Blend
- let duskEnd = (atHour 22).Blend
- Assert.AreEqual<float32>(0.0f, duskStart)
- Assert.AreEqual<float32>(0.5f, duskMid)
- Assert.AreEqual<float32>(1.0f, duskEnd)
+ // P17 window: dawn 4:00 -> 6:30 goes night -> day, monotonic (fractional hours).
+ let dawnMidTick = int64 5 * ticksPerHour + ticksPerHour / 4L // 5:15
+ let dawnEndTick = int64 6 * ticksPerHour + ticksPerHour / 2L // 6:30
+ Assert.AreEqual<float32>(1.0f, (atHour 4).Blend)
+ Assert.AreEqual<float32>(0.5f, (M6Presentation.lightingAtTick dawnMidTick).Blend)
+ Assert.AreEqual<float32>(0.0f, (M6Presentation.lightingAtTick dawnEndTick).Blend)
+
+ // Dusk ramp 19:30 -> 22:00 goes day -> night monotonically.
+ let duskStartTick = int64 19 * ticksPerHour + ticksPerHour / 2L // 19:30
+ let duskMidTick = int64 20 * ticksPerHour + ticksPerHour * 3L / 4L // 20:45
+ Assert.AreEqual<float32>(0.0f, (M6Presentation.lightingAtTick duskStartTick).Blend)
+ Assert.AreEqual<float32>(0.5f, (M6Presentation.lightingAtTick duskMidTick).Blend)
+ Assert.AreEqual<float32>(1.0f, (atHour 22).Blend)
+
+ // Blue hour: the transition lingers past 6:00 and starts before 20:00.
+ Assert.IsTrue((atHour 6).Blend > 0.0f && (atHour 6).Blend < 0.5f)
+ Assert.IsTrue((atHour 20).Blend > 0.0f && (atHour 20).Blend < 0.5f)
+
+ // Golden-hour warmth peaks mid-dawn/mid-dusk and vanishes at noon/midnight.
+ Assert.AreEqual<float32>(0.0f, (atHour 12).SkyWarmth)
+ Assert.AreEqual<float32>(0.0f, (atHour 0).SkyWarmth)
+ Assert.AreEqual<float32>(1.0f, (M6Presentation.lightingAtTick dawnMidTick).SkyWarmth)
+ Assert.AreEqual<float32>(1.0f, (M6Presentation.lightingAtTick duskMidTick).SkyWarmth)
+ Assert.IsTrue((atHour 5).SkyWarmth > 0.5f)
+ Assert.IsTrue((atHour 21).SkyWarmth > 0.5f)
+ // The warm shift pushes the sky redder and less blue than the plain blend.
+ let warmDawn = atHour 5
+ Assert.IsTrue(warmDawn.Background.R > (M6Presentation.backgroundAtBlend warmDawn.Blend).R)
+ Assert.IsTrue(warmDawn.Background.B < (M6Presentation.backgroundAtBlend warmDawn.Blend).B)
// Determinism without randomness.
let once = atHour 13