diff --git a/res/content/base/preload.json b/res/content/base/preload.json index 760ad2c9..24d54a42 100644 --- a/res/content/base/preload.json +++ b/res/content/base/preload.json @@ -14,6 +14,7 @@ ], "textures": [ "misc/moon", + "misc/moon_flare", "misc/sun", "gui/crosshair" ] diff --git a/res/textures/misc/moon_flare.png b/res/textures/misc/moon_flare.png new file mode 100644 index 00000000..57304f3b Binary files /dev/null and b/res/textures/misc/moon_flare.png differ diff --git a/src/graphics/render/Skybox.cpp b/src/graphics/render/Skybox.cpp index bf6eedc1..2687dc20 100644 --- a/src/graphics/render/Skybox.cpp +++ b/src/graphics/render/Skybox.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #ifndef M_PI @@ -46,18 +47,28 @@ Skybox::Skybox(uint size, Shader& shader) mesh = std::make_unique>(vertices, 6); - sprites.push_back(skysprite { - "misc/moon", - glm::pi()*0.5f, - 4.0f, - false + sprites.push_back(SkySprite { + "misc/moon_flare", + glm::pi() * 0.5f, + 0.5f, + false, + glm::pi() * 0.25f, }); - sprites.push_back(skysprite { - "misc/sun", - glm::pi()*1.5f, + sprites.push_back(SkySprite { + "misc/moon", + glm::pi() * 0.5f, 4.0f, - true + false, + glm::pi() * 0.25f, + }); + + sprites.push_back(SkySprite { + "misc/sun", + glm::pi() * 1.5f, + 4.0f, + true, + glm::pi() * 0.25f, }); } @@ -124,16 +135,19 @@ void Skybox::draw( for (auto& sprite : sprites) { batch3d->texture(assets.get(sprite.texture)); - float sangle = daytime * glm::pi()*2.0 + sprite.phase; + float sangle = daytime * glm::pi() * 2.0 + sprite.phase; float distance = sprite.distance; - glm::vec3 pos(-std::cos(sangle)*distance, std::sin(sangle)*distance, 0); - glm::vec3 up(-std::sin(-sangle), std::cos(-sangle), 0.0f); + glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), -sangle + glm::pi() * 0.5f, glm::vec3(0, 0, -1)); + rotation = glm::rotate(rotation, sprite.altitude, glm::vec3(1, 0, 0)); + glm::vec3 pos = glm::vec4(0, distance, 0, 1) * rotation; + glm::vec3 up = glm::vec4(1, 0, 0, 1) * rotation; + glm::vec3 right = glm::vec4(0, 0, 1, 1) * rotation; glm::vec4 tint (1,1,1, opacity); if (!sprite.emissive) { tint *= 0.6f+std::cos(angle)*0.4; } - batch3d->sprite(pos, glm::vec3(0, 0, 1), + batch3d->sprite(pos, right, up, 1, 1, UVRegion(), tint); } batch3d->flush(); diff --git a/src/graphics/render/Skybox.hpp b/src/graphics/render/Skybox.hpp index f469b155..c1184a14 100644 --- a/src/graphics/render/Skybox.hpp +++ b/src/graphics/render/Skybox.hpp @@ -25,11 +25,12 @@ struct SkyboxVertex { {{}, 0}}; }; -struct skysprite { +struct SkySprite { std::string texture; float phase; float distance; bool emissive; + float altitude; }; class Skybox { @@ -42,7 +43,7 @@ class Skybox { std::unique_ptr> mesh; std::unique_ptr batch3d; - std::vector sprites; + std::vector sprites; int frameid = 0; float prevMie = -1.0f; diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index fe6b0fcc..e2b3dbef 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -384,10 +384,11 @@ void WorldRenderer::generateShadowsMap( 90.0f - ((static_cast(t / sunCycleStep)) * sunCycleStep + 0.25f) * 360.0f ); + float sunAltitude = glm::pi() * 0.25f; shadowCamera.rotate( - sunAngle, - glm::radians(-45.0f), - glm::radians(-0.0f) + -glm::cos(sunAngle + glm::pi() * 0.5f) * sunAltitude, + sunAngle - glm::pi() * 0.5f, + glm::radians(0.0f) ); shadowCamera.updateVectors();