diff --git a/src/graphics/render/CloudsRenderer.cpp b/src/graphics/render/CloudsRenderer.cpp index 749986ae5..a999b24e4 100755 --- a/src/graphics/render/CloudsRenderer.cpp +++ b/src/graphics/render/CloudsRenderer.cpp @@ -15,6 +15,7 @@ #include "util/timeutil.hpp" #include "window/Camera.hpp" #include "world/Weather.hpp" +#include "maths/FrustumCulling.hpp" #include #include @@ -240,8 +241,9 @@ CloudsRenderer::CloudsRenderer() { CloudsRenderer::~CloudsRenderer() = default; void CloudsRenderer::draw( - Shader& shader, Layer& layer, + Frustum& frustum, + Shader& shader, const Camera& camera, float timer, int layerId @@ -278,6 +280,9 @@ void CloudsRenderer::draw( ) > 4e6) { continue; } + if (!frustum.isBoxVisible(position, position + glm::vec3(layer.segmentSize * scale))) { + continue; + } auto matrix = glm::mat4(1.0f); matrix = glm::translate(matrix, position); matrix = glm::scale(matrix, glm::vec3(scale, scale, scale)); @@ -301,11 +306,14 @@ void CloudsRenderer::draw( const Camera& camera, int quality ) { + Frustum frustum; + frustum.update(camera.getProjView()); + shader.uniform4f("u_tint", glm::vec4(weather.cloudsTint(), 1.0f)); shader.uniform1f("u_fogFactor", fogFactor * 0.03f); shader.uniform1f("u_fogCurve", 0.7f - 0.3f); for (int i = 0; i < std::min(quality, layers.size()); i++) { - draw(shader, layers[i], camera, timer, i); + draw(layers[i], frustum, shader, camera, timer, i); } } diff --git a/src/graphics/render/CloudsRenderer.hpp b/src/graphics/render/CloudsRenderer.hpp index 22ea73185..cb2ee50bd 100755 --- a/src/graphics/render/CloudsRenderer.hpp +++ b/src/graphics/render/CloudsRenderer.hpp @@ -9,6 +9,7 @@ class Camera; class Shader; struct Weather; +class Frustum; class CloudsRenderer final { public: @@ -33,8 +34,9 @@ private: std::array layers; void draw( - Shader& shader, Layer& layer, + Frustum& frustum, + Shader& shader, const Camera& camera, float timer, int layerId