summaryrefslogtreecommitdiff
path: root/game
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2026-03-26 20:52:52 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2026-03-26 20:52:52 +0000
commit2e2d7d2a124ae912ee486f1fc11b578f93ba0dee (patch)
tree79deaf7736918b86472ddc2ac1e09c6270613e80 /game
parentImprove light approximations in LightDirection (diff)
downloadilt-2e2d7d2a124ae912ee486f1fc11b578f93ba0dee.tar.bz2
ilt-2e2d7d2a124ae912ee486f1fc11b578f93ba0dee.tar.xz
ilt-2e2d7d2a124ae912ee486f1fc11b578f93ba0dee.zip
Improve calculations of the amount and colour of ambient and directional sun light
Diffstat (limited to 'game')
-rw-r--r--game/environment.cpp24
-rw-r--r--game/environment.h6
2 files changed, 21 insertions, 9 deletions
diff --git a/game/environment.cpp b/game/environment.cpp
index 9ae3b14..f8da316 100644
--- a/game/environment.cpp
+++ b/game/environment.cpp
@@ -3,7 +3,9 @@
#include <chronology.h>
#include <gfx/gl/sceneRenderer.h>
-Environment::Environment() : worldTime {"2024-01-01T12:00:00"_time_t} { }
+constexpr Direction2D DONCASTER = {-1.1_degrees, 53.5_degrees};
+
+Environment::Environment() : worldTime {"2026-06-01T12:00:00"_time_t}, earthPos {DONCASTER} { }
void
Environment::tick(TickDuration)
@@ -11,21 +13,29 @@ Environment::tick(TickDuration)
worldTime += 50;
}
+time_t
+Environment::getWorldTime() const
+{
+ return worldTime;
+}
+
Direction2D
Environment::getSunPos() const
{
- return getSunPos({}, worldTime);
+ return getSunPos(earthPos, worldTime);
}
void
Environment::render(const SceneRenderer & renderer, const SceneProvider & scene) const
{
- constexpr RGB baseAmbient {0.1F}, baseDirectional {0.0F};
- constexpr RGB relativeAmbient {0.3F, 0.3F, 0.4F}, relativeDirectional {0.6F, 0.6F, 0.5F};
+ constexpr RGB SUN_LIGHT {1, 1, .878F};
+ constexpr RGB SKY_BLUE {.529F, .808F, .922F};
+ constexpr RGB BASE_AMBIENT_LIGHT {0.1F};
- const LightDirection sunPos = getSunPos();
- const auto ambient = baseAmbient + relativeAmbient * sunPos.ambient();
- const auto directional = baseDirectional + relativeDirectional * sunPos.directional();
+ const LightDirection sunPos {getSunPos()};
+ const auto scattered = SKY_BLUE * sunPos.atmosphericScattering() * sunPos.ambient();
+ const auto ambient = BASE_AMBIENT_LIGHT + scattered;
+ const auto directional = (SUN_LIGHT - BASE_AMBIENT_LIGHT - scattered) * sunPos.directional();
renderer.setAmbientLight(ambient);
renderer.setDirectionalLight(directional, sunPos, scene);
diff --git a/game/environment.h b/game/environment.h
index 6a2e1ad..271792f 100644
--- a/game/environment.h
+++ b/game/environment.h
@@ -11,9 +11,11 @@ public:
Environment();
void tick(TickDuration elapsed) override;
void render(const SceneRenderer &, const SceneProvider &) const;
- Direction2D getSunPos() const;
- static Direction2D getSunPos(const Direction2D position, const time_t time);
+ [[nodiscard]] Direction2D getSunPos() const;
+ [[nodiscard]] time_t getWorldTime() const;
+ [[nodiscard]] static Direction2D getSunPos(Direction2D position, time_t time);
private:
time_t worldTime;
+ glm::vec<2, Angle> earthPos;
};