diff options
author | x2048 <codeforsmile@gmail.com> | 2022-08-17 16:30:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-17 16:30:05 +0200 |
commit | 8c29c4f620a45385ac4e906c1f50d1df7d1edba9 (patch) | |
tree | b0e3373136418f6159201cecc0fd7450fe29fc67 /src/client/sky.cpp | |
parent | 3f67215df9dbc16f3bfe1ffc5c2582a308532914 (diff) | |
download | minetest-8c29c4f620a45385ac4e906c1f50d1df7d1edba9.tar.xz |
Use Sky class to obtain directional light source position for shadows (#12662)
* Also remove unused Sky::getSkyBodyOrbitTilt method
Fixes misalignment of sun position and shadow direction at high tilt values.
Diffstat (limited to 'src/client/sky.cpp')
-rw-r--r-- | src/client/sky.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/client/sky.cpp b/src/client/sky.cpp index ca56889b4..5541b16aa 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -554,6 +554,25 @@ void Sky::update(float time_of_day, float time_brightness, } } +static v3f getSkyBodyPosition(float horizon_position, float day_position, float orbit_tilt) +{ + v3f result = v3f(0, 0, -1); + result.rotateXZBy(horizon_position); + result.rotateXYBy(day_position); + result.rotateYZBy(orbit_tilt); + return result; +} + +v3f Sky::getSunDirection() +{ + return getSkyBodyPosition(90, getWickedTimeOfDay(m_time_of_day) * 360 - 90, m_sky_body_orbit_tilt); +} + +v3f Sky::getMoonDirection() +{ + return getSkyBodyPosition(270, getWickedTimeOfDay(m_time_of_day) * 360 - 90, m_sky_body_orbit_tilt); +} + void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SColor &suncolor, const video::SColor &suncolor2, float wicked_time_of_day) /* Draw sun in the sky. @@ -703,15 +722,13 @@ void Sky::place_sky_body( * day_position: turn the body around the Z axis, to place it depending of the time of the day */ { - v3f centrum(0, 0, -1); - centrum.rotateXZBy(horizon_position); - centrum.rotateXYBy(day_position); - centrum.rotateYZBy(m_sky_body_orbit_tilt); + v3f centrum = getSkyBodyPosition(horizon_position, day_position, m_sky_body_orbit_tilt); + v3f untilted_centrum = getSkyBodyPosition(horizon_position, day_position, 0.f); for (video::S3DVertex &vertex : vertices) { // Body is directed to -Z (south) by default vertex.Pos.rotateXZBy(horizon_position); vertex.Pos.rotateXYBy(day_position); - vertex.Pos.Z += centrum.Z; + vertex.Pos += centrum - untilted_centrum; } } |