mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-11 05:51:51 +00:00
add frustum culling to clouds segments
This commit is contained in:
parent
f0e5b54164
commit
7f98dcf919
2 changed files with 13 additions and 3 deletions
|
|
@ -15,6 +15,7 @@
|
||||||
#include "util/timeutil.hpp"
|
#include "util/timeutil.hpp"
|
||||||
#include "window/Camera.hpp"
|
#include "window/Camera.hpp"
|
||||||
#include "world/Weather.hpp"
|
#include "world/Weather.hpp"
|
||||||
|
#include "maths/FrustumCulling.hpp"
|
||||||
|
|
||||||
#include <glm/ext.hpp>
|
#include <glm/ext.hpp>
|
||||||
#include <glm/gtx/norm.hpp>
|
#include <glm/gtx/norm.hpp>
|
||||||
|
|
@ -240,8 +241,9 @@ CloudsRenderer::CloudsRenderer() {
|
||||||
CloudsRenderer::~CloudsRenderer() = default;
|
CloudsRenderer::~CloudsRenderer() = default;
|
||||||
|
|
||||||
void CloudsRenderer::draw(
|
void CloudsRenderer::draw(
|
||||||
Shader& shader,
|
|
||||||
Layer& layer,
|
Layer& layer,
|
||||||
|
Frustum& frustum,
|
||||||
|
Shader& shader,
|
||||||
const Camera& camera,
|
const Camera& camera,
|
||||||
float timer,
|
float timer,
|
||||||
int layerId
|
int layerId
|
||||||
|
|
@ -278,6 +280,9 @@ void CloudsRenderer::draw(
|
||||||
) > 4e6) {
|
) > 4e6) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!frustum.isBoxVisible(position, position + glm::vec3(layer.segmentSize * scale))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
auto matrix = glm::mat4(1.0f);
|
auto matrix = glm::mat4(1.0f);
|
||||||
matrix = glm::translate(matrix, position);
|
matrix = glm::translate(matrix, position);
|
||||||
matrix = glm::scale(matrix, glm::vec3(scale, scale, scale));
|
matrix = glm::scale(matrix, glm::vec3(scale, scale, scale));
|
||||||
|
|
@ -301,11 +306,14 @@ void CloudsRenderer::draw(
|
||||||
const Camera& camera,
|
const Camera& camera,
|
||||||
int quality
|
int quality
|
||||||
) {
|
) {
|
||||||
|
Frustum frustum;
|
||||||
|
frustum.update(camera.getProjView());
|
||||||
|
|
||||||
shader.uniform4f("u_tint", glm::vec4(weather.cloudsTint(), 1.0f));
|
shader.uniform4f("u_tint", glm::vec4(weather.cloudsTint(), 1.0f));
|
||||||
shader.uniform1f("u_fogFactor", fogFactor * 0.03f);
|
shader.uniform1f("u_fogFactor", fogFactor * 0.03f);
|
||||||
shader.uniform1f("u_fogCurve", 0.7f - 0.3f);
|
shader.uniform1f("u_fogCurve", 0.7f - 0.3f);
|
||||||
|
|
||||||
for (int i = 0; i < std::min<int>(quality, layers.size()); i++) {
|
for (int i = 0; i < std::min<int>(quality, layers.size()); i++) {
|
||||||
draw(shader, layers[i], camera, timer, i);
|
draw(layers[i], frustum, shader, camera, timer, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
class Camera;
|
class Camera;
|
||||||
class Shader;
|
class Shader;
|
||||||
struct Weather;
|
struct Weather;
|
||||||
|
class Frustum;
|
||||||
|
|
||||||
class CloudsRenderer final {
|
class CloudsRenderer final {
|
||||||
public:
|
public:
|
||||||
|
|
@ -33,8 +34,9 @@ private:
|
||||||
std::array<Layer, 2> layers;
|
std::array<Layer, 2> layers;
|
||||||
|
|
||||||
void draw(
|
void draw(
|
||||||
Shader& shader,
|
|
||||||
Layer& layer,
|
Layer& layer,
|
||||||
|
Frustum& frustum,
|
||||||
|
Shader& shader,
|
||||||
const Camera& camera,
|
const Camera& camera,
|
||||||
float timer,
|
float timer,
|
||||||
int layerId
|
int layerId
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue