aboutsummaryrefslogtreecommitdiff
path: root/src/client/clouds.cpp
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2020-11-04 16:19:54 +0100
committerElias Fleckenstein <eliasfleckenstein@web.de>2020-11-04 16:19:54 +0100
commitad148587dcf5244c2d2011dba339786c765c54c4 (patch)
treebdd914121cd326da2ed26679838878e3edffc841 /src/client/clouds.cpp
parent1145b05ea0bda87dc0827821385810eced08f774 (diff)
downloaddragonfireclient-ad148587dcf5244c2d2011dba339786c765c54c4.tar.xz
Make Lint Happy
Diffstat (limited to 'src/client/clouds.cpp')
-rw-r--r--src/client/clouds.cpp375
1 files changed, 187 insertions, 188 deletions
diff --git a/src/client/clouds.cpp b/src/client/clouds.cpp
index 887a62f25..e59eb8b4d 100644
--- a/src/client/clouds.cpp
+++ b/src/client/clouds.cpp
@@ -26,7 +26,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "settings.h"
#include <cmath>
-
// Menu clouds are created later
class Clouds;
Clouds *g_menuclouds = NULL;
@@ -40,48 +39,43 @@ static void cloud_3d_setting_changed(const std::string &settingname, void *data)
((Clouds *)data)->readSettings();
}
-Clouds::Clouds(scene::ISceneManager* mgr,
- s32 id,
- u32 seed
-):
- scene::ISceneNode(mgr->getRootSceneNode(), mgr, id),
- m_seed(seed)
+Clouds::Clouds(scene::ISceneManager *mgr, s32 id, u32 seed) :
+ scene::ISceneNode(mgr->getRootSceneNode(), mgr, id), m_seed(seed)
{
m_material.setFlag(video::EMF_LIGHTING, false);
- //m_material.setFlag(video::EMF_BACK_FACE_CULLING, false);
+ // m_material.setFlag(video::EMF_BACK_FACE_CULLING, false);
m_material.setFlag(video::EMF_BACK_FACE_CULLING, true);
m_material.setFlag(video::EMF_BILINEAR_FILTER, false);
m_material.setFlag(video::EMF_FOG_ENABLE, true);
m_material.setFlag(video::EMF_ANTI_ALIASING, true);
- //m_material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
+ // m_material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
m_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
- m_params.height = 120;
- m_params.density = 0.4f;
- m_params.thickness = 16.0f;
- m_params.color_bright = video::SColor(229, 240, 240, 255);
+ m_params.height = 120;
+ m_params.density = 0.4f;
+ m_params.thickness = 16.0f;
+ m_params.color_bright = video::SColor(229, 240, 240, 255);
m_params.color_ambient = video::SColor(255, 0, 0, 0);
- m_params.speed = v2f(0.0f, -2.0f);
+ m_params.speed = v2f(0.0f, -2.0f);
readSettings();
- g_settings->registerChangedCallback("enable_3d_clouds",
- &cloud_3d_setting_changed, this);
+ g_settings->registerChangedCallback(
+ "enable_3d_clouds", &cloud_3d_setting_changed, this);
updateBox();
}
Clouds::~Clouds()
{
- g_settings->deregisterChangedCallback("enable_3d_clouds",
- &cloud_3d_setting_changed, this);
+ g_settings->deregisterChangedCallback(
+ "enable_3d_clouds", &cloud_3d_setting_changed, this);
}
void Clouds::OnRegisterSceneNode()
{
- if(IsVisible)
- {
+ if (IsVisible) {
SceneManager->registerNodeForRendering(this, scene::ESNRP_TRANSPARENT);
- //SceneManager->registerNodeForRendering(this, scene::ESNRP_SOLID);
+ // SceneManager->registerNodeForRendering(this, scene::ESNRP_SOLID);
}
ISceneNode::OnRegisterSceneNode();
@@ -93,10 +87,10 @@ void Clouds::render()
if (m_params.density <= 0.0f)
return; // no need to do anything
- video::IVideoDriver* driver = SceneManager->getVideoDriver();
+ video::IVideoDriver *driver = SceneManager->getVideoDriver();
- if(SceneManager->getSceneNodeRenderPass() != scene::ESNRP_TRANSPARENT)
- //if(SceneManager->getSceneNodeRenderPass() != scene::ESNRP_SOLID)
+ if (SceneManager->getSceneNodeRenderPass() != scene::ESNRP_TRANSPARENT)
+ // if(SceneManager->getSceneNodeRenderPass() != scene::ESNRP_SOLID)
return;
ScopeProfiler sp(g_profiler, "Clouds::render()", SPT_AVG);
@@ -121,15 +115,14 @@ void Clouds::render()
v2f center_of_drawing_in_noise_f = -cloud_origin_from_camera_f;
// The integer center point of drawing in the noise
v2s16 center_of_drawing_in_noise_i(
- std::floor(center_of_drawing_in_noise_f.X / cloud_size),
- std::floor(center_of_drawing_in_noise_f.Y / cloud_size)
- );
+ std::floor(center_of_drawing_in_noise_f.X / cloud_size),
+ std::floor(center_of_drawing_in_noise_f.Y / cloud_size));
// The world position of the integer center point of drawing in the noise
- v2f world_center_of_drawing_in_noise_f = v2f(
- center_of_drawing_in_noise_i.X * cloud_size,
- center_of_drawing_in_noise_i.Y * cloud_size
- ) + m_origin;
+ v2f world_center_of_drawing_in_noise_f =
+ v2f(center_of_drawing_in_noise_i.X * cloud_size,
+ center_of_drawing_in_noise_i.Y * cloud_size) +
+ m_origin;
/*video::SColor c_top(128,b*240,b*240,b*255);
video::SColor c_side_1(128,b*230,b*230,b*255);
@@ -154,185 +147,185 @@ void Clouds::render()
video::SColor c_bottom = c_bottom_f.toSColor();
// Get fog parameters for setting them back later
- video::SColor fog_color(0,0,0,0);
+ video::SColor fog_color(0, 0, 0, 0);
video::E_FOG_TYPE fog_type = video::EFT_FOG_LINEAR;
f32 fog_start = 0;
f32 fog_end = 0;
f32 fog_density = 0;
bool fog_pixelfog = false;
bool fog_rangefog = false;
- driver->getFog(fog_color, fog_type, fog_start, fog_end, fog_density,
- fog_pixelfog, fog_rangefog);
+ driver->getFog(fog_color, fog_type, fog_start, fog_end, fog_density, fog_pixelfog,
+ fog_rangefog);
// Set our own fog
driver->setFog(fog_color, fog_type, cloud_full_radius * 0.5,
- cloud_full_radius*1.2, fog_density, fog_pixelfog, fog_rangefog);
+ cloud_full_radius * 1.2, fog_density, fog_pixelfog, fog_rangefog);
// Read noise
bool *grid = new bool[m_cloud_radius_i * 2 * m_cloud_radius_i * 2];
-
- for(s16 zi = -m_cloud_radius_i; zi < m_cloud_radius_i; zi++) {
- u32 si = (zi + m_cloud_radius_i) * m_cloud_radius_i * 2 + m_cloud_radius_i;
+ for (s16 zi = -m_cloud_radius_i; zi < m_cloud_radius_i; zi++) {
+ u32 si = (zi + m_cloud_radius_i) * m_cloud_radius_i * 2 +
+ m_cloud_radius_i;
for (s16 xi = -m_cloud_radius_i; xi < m_cloud_radius_i; xi++) {
u32 i = si + xi;
- grid[i] = gridFilled(
- xi + center_of_drawing_in_noise_i.X,
- zi + center_of_drawing_in_noise_i.Y
- );
+ grid[i] = gridFilled(xi + center_of_drawing_in_noise_i.X,
+ zi + center_of_drawing_in_noise_i.Y);
}
}
-#define GETINDEX(x, z, radius) (((z)+(radius))*(radius)*2 + (x)+(radius))
-#define INAREA(x, z, radius) \
+#define GETINDEX(x, z, radius) (((z) + (radius)) * (radius)*2 + (x) + (radius))
+#define INAREA(x, z, radius) \
((x) >= -(radius) && (x) < (radius) && (z) >= -(radius) && (z) < (radius))
- for (s16 zi0= -m_cloud_radius_i; zi0 < m_cloud_radius_i; zi0++)
- for (s16 xi0= -m_cloud_radius_i; xi0 < m_cloud_radius_i; xi0++)
- {
- s16 zi = zi0;
- s16 xi = xi0;
- // Draw from front to back (needed for transparency)
- /*if(zi <= 0)
- zi = -m_cloud_radius_i - zi;
- if(xi <= 0)
- xi = -m_cloud_radius_i - xi;*/
- // Draw from back to front
- if(zi >= 0)
- zi = m_cloud_radius_i - zi - 1;
- if(xi >= 0)
- xi = m_cloud_radius_i - xi - 1;
-
- u32 i = GETINDEX(xi, zi, m_cloud_radius_i);
-
- if (!grid[i])
- continue;
-
- v2f p0 = v2f(xi,zi)*cloud_size + world_center_of_drawing_in_noise_f;
-
- video::S3DVertex v[4] = {
- video::S3DVertex(0,0,0, 0,0,0, c_top, 0, 1),
- video::S3DVertex(0,0,0, 0,0,0, c_top, 1, 1),
- video::S3DVertex(0,0,0, 0,0,0, c_top, 1, 0),
- video::S3DVertex(0,0,0, 0,0,0, c_top, 0, 0)
- };
-
- /*if(zi <= 0 && xi <= 0){
- v[0].Color.setBlue(255);
- v[1].Color.setBlue(255);
- v[2].Color.setBlue(255);
- v[3].Color.setBlue(255);
- }*/
-
- f32 rx = cloud_size / 2.0f;
- // if clouds are flat, the top layer should be at the given height
- f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f;
- f32 rz = cloud_size / 2;
-
- for(int i=0; i<num_faces_to_draw; i++)
- {
- switch(i)
- {
- case 0: // top
- for (video::S3DVertex &vertex : v) {
- vertex.Normal.set(0,1,0);
- }
- v[0].Pos.set(-rx, ry,-rz);
- v[1].Pos.set(-rx, ry, rz);
- v[2].Pos.set( rx, ry, rz);
- v[3].Pos.set( rx, ry,-rz);
- break;
- case 1: // back
- if (INAREA(xi, zi - 1, m_cloud_radius_i)) {
- u32 j = GETINDEX(xi, zi - 1, m_cloud_radius_i);
- if(grid[j])
- continue;
- }
- for (video::S3DVertex &vertex : v) {
- vertex.Color = c_side_1;
- vertex.Normal.set(0,0,-1);
- }
- v[0].Pos.set(-rx, ry,-rz);
- v[1].Pos.set( rx, ry,-rz);
- v[2].Pos.set( rx, 0,-rz);
- v[3].Pos.set(-rx, 0,-rz);
- break;
- case 2: //right
- if (INAREA(xi + 1, zi, m_cloud_radius_i)) {
- u32 j = GETINDEX(xi+1, zi, m_cloud_radius_i);
- if(grid[j])
- continue;
- }
- for (video::S3DVertex &vertex : v) {
- vertex.Color = c_side_2;
- vertex.Normal.set(1,0,0);
- }
- v[0].Pos.set( rx, ry,-rz);
- v[1].Pos.set( rx, ry, rz);
- v[2].Pos.set( rx, 0, rz);
- v[3].Pos.set( rx, 0,-rz);
- break;
- case 3: // front
- if (INAREA(xi, zi + 1, m_cloud_radius_i)) {
- u32 j = GETINDEX(xi, zi + 1, m_cloud_radius_i);
- if(grid[j])
- continue;
+ for (s16 zi0 = -m_cloud_radius_i; zi0 < m_cloud_radius_i; zi0++)
+ for (s16 xi0 = -m_cloud_radius_i; xi0 < m_cloud_radius_i; xi0++) {
+ s16 zi = zi0;
+ s16 xi = xi0;
+ // Draw from front to back (needed for transparency)
+ /*if(zi <= 0)
+ zi = -m_cloud_radius_i - zi;
+ if(xi <= 0)
+ xi = -m_cloud_radius_i - xi;*/
+ // Draw from back to front
+ if (zi >= 0)
+ zi = m_cloud_radius_i - zi - 1;
+ if (xi >= 0)
+ xi = m_cloud_radius_i - xi - 1;
+
+ u32 i = GETINDEX(xi, zi, m_cloud_radius_i);
+
+ if (!grid[i])
+ continue;
+
+ v2f p0 = v2f(xi, zi) * cloud_size +
+ world_center_of_drawing_in_noise_f;
+
+ video::S3DVertex v[4] = {
+ video::S3DVertex(0, 0, 0, 0, 0, 0, c_top, 0, 1),
+ video::S3DVertex(0, 0, 0, 0, 0, 0, c_top, 1, 1),
+ video::S3DVertex(0, 0, 0, 0, 0, 0, c_top, 1, 0),
+ video::S3DVertex(0, 0, 0, 0, 0, 0, c_top, 0, 0)};
+
+ /*if(zi <= 0 && xi <= 0){
+ v[0].Color.setBlue(255);
+ v[1].Color.setBlue(255);
+ v[2].Color.setBlue(255);
+ v[3].Color.setBlue(255);
+ }*/
+
+ f32 rx = cloud_size / 2.0f;
+ // if clouds are flat, the top layer should be at the given height
+ f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f;
+ f32 rz = cloud_size / 2;
+
+ for (int i = 0; i < num_faces_to_draw; i++) {
+ switch (i) {
+ case 0: // top
+ for (video::S3DVertex &vertex : v) {
+ vertex.Normal.set(0, 1, 0);
+ }
+ v[0].Pos.set(-rx, ry, -rz);
+ v[1].Pos.set(-rx, ry, rz);
+ v[2].Pos.set(rx, ry, rz);
+ v[3].Pos.set(rx, ry, -rz);
+ break;
+ case 1: // back
+ if (INAREA(xi, zi - 1, m_cloud_radius_i)) {
+ u32 j = GETINDEX(xi, zi - 1,
+ m_cloud_radius_i);
+ if (grid[j])
+ continue;
+ }
+ for (video::S3DVertex &vertex : v) {
+ vertex.Color = c_side_1;
+ vertex.Normal.set(0, 0, -1);
+ }
+ v[0].Pos.set(-rx, ry, -rz);
+ v[1].Pos.set(rx, ry, -rz);
+ v[2].Pos.set(rx, 0, -rz);
+ v[3].Pos.set(-rx, 0, -rz);
+ break;
+ case 2: // right
+ if (INAREA(xi + 1, zi, m_cloud_radius_i)) {
+ u32 j = GETINDEX(xi + 1, zi,
+ m_cloud_radius_i);
+ if (grid[j])
+ continue;
+ }
+ for (video::S3DVertex &vertex : v) {
+ vertex.Color = c_side_2;
+ vertex.Normal.set(1, 0, 0);
+ }
+ v[0].Pos.set(rx, ry, -rz);
+ v[1].Pos.set(rx, ry, rz);
+ v[2].Pos.set(rx, 0, rz);
+ v[3].Pos.set(rx, 0, -rz);
+ break;
+ case 3: // front
+ if (INAREA(xi, zi + 1, m_cloud_radius_i)) {
+ u32 j = GETINDEX(xi, zi + 1,
+ m_cloud_radius_i);
+ if (grid[j])
+ continue;
+ }
+ for (video::S3DVertex &vertex : v) {
+ vertex.Color = c_side_1;
+ vertex.Normal.set(0, 0, -1);
+ }
+ v[0].Pos.set(rx, ry, rz);
+ v[1].Pos.set(-rx, ry, rz);
+ v[2].Pos.set(-rx, 0, rz);
+ v[3].Pos.set(rx, 0, rz);
+ break;
+ case 4: // left
+ if (INAREA(xi - 1, zi, m_cloud_radius_i)) {
+ u32 j = GETINDEX(xi - 1, zi,
+ m_cloud_radius_i);
+ if (grid[j])
+ continue;
+ }
+ for (video::S3DVertex &vertex : v) {
+ vertex.Color = c_side_2;
+ vertex.Normal.set(-1, 0, 0);
+ }
+ v[0].Pos.set(-rx, ry, rz);
+ v[1].Pos.set(-rx, ry, -rz);
+ v[2].Pos.set(-rx, 0, -rz);
+ v[3].Pos.set(-rx, 0, rz);
+ break;
+ case 5: // bottom
+ for (video::S3DVertex &vertex : v) {
+ vertex.Color = c_bottom;
+ vertex.Normal.set(0, -1, 0);
+ }
+ v[0].Pos.set(rx, 0, rz);
+ v[1].Pos.set(-rx, 0, rz);
+ v[2].Pos.set(-rx, 0, -rz);
+ v[3].Pos.set(rx, 0, -rz);
+ break;
}
- for (video::S3DVertex &vertex : v) {
- vertex.Color = c_side_1;
- vertex.Normal.set(0,0,-1);
- }
- v[0].Pos.set( rx, ry, rz);
- v[1].Pos.set(-rx, ry, rz);
- v[2].Pos.set(-rx, 0, rz);
- v[3].Pos.set( rx, 0, rz);
- break;
- case 4: // left
- if (INAREA(xi-1, zi, m_cloud_radius_i)) {
- u32 j = GETINDEX(xi-1, zi, m_cloud_radius_i);
- if(grid[j])
- continue;
- }
- for (video::S3DVertex &vertex : v) {
- vertex.Color = c_side_2;
- vertex.Normal.set(-1,0,0);
- }
- v[0].Pos.set(-rx, ry, rz);
- v[1].Pos.set(-rx, ry,-rz);
- v[2].Pos.set(-rx, 0,-rz);
- v[3].Pos.set(-rx, 0, rz);
- break;
- case 5: // bottom
- for (video::S3DVertex &vertex : v) {
- vertex.Color = c_bottom;
- vertex.Normal.set(0,-1,0);
- }
- v[0].Pos.set( rx, 0, rz);
- v[1].Pos.set(-rx, 0, rz);
- v[2].Pos.set(-rx, 0,-rz);
- v[3].Pos.set( rx, 0,-rz);
- break;
- }
- v3f pos(p0.X, m_params.height * BS, p0.Y);
- pos -= intToFloat(m_camera_offset, BS);
+ v3f pos(p0.X, m_params.height * BS, p0.Y);
+ pos -= intToFloat(m_camera_offset, BS);
- for (video::S3DVertex &vertex : v)
- vertex.Pos += pos;
- u16 indices[] = {0,1,2,2,3,0};
- driver->drawVertexPrimitiveList(v, 4, indices, 2,
- video::EVT_STANDARD, scene::EPT_TRIANGLES, video::EIT_16BIT);
+ for (video::S3DVertex &vertex : v)
+ vertex.Pos += pos;
+ u16 indices[] = {0, 1, 2, 2, 3, 0};
+ driver->drawVertexPrimitiveList(v, 4, indices, 2,
+ video::EVT_STANDARD, scene::EPT_TRIANGLES,
+ video::EIT_16BIT);
+ }
}
- }
delete[] grid;
// Restore fog settings
- driver->setFog(fog_color, fog_type, fog_start, fog_end, fog_density,
- fog_pixelfog, fog_rangefog);
+ driver->setFog(fog_color, fog_type, fog_start, fog_end, fog_density, fog_pixelfog,
+ fog_rangefog);
}
void Clouds::step(float dtime)
@@ -344,11 +337,17 @@ void Clouds::update(const v3f &camera_p, const video::SColorf &color_diffuse)
{
m_camera_pos = camera_p;
m_color.r = MYMIN(MYMAX(color_diffuse.r * m_params.color_bright.getRed(),
- m_params.color_ambient.getRed()), 255) / 255.0f;
+ m_params.color_ambient.getRed()),
+ 255) /
+ 255.0f;
m_color.g = MYMIN(MYMAX(color_diffuse.g * m_params.color_bright.getGreen(),
- m_params.color_ambient.getGreen()), 255) / 255.0f;
+ m_params.color_ambient.getGreen()),
+ 255) /
+ 255.0f;
m_color.b = MYMIN(MYMAX(color_diffuse.b * m_params.color_bright.getBlue(),
- m_params.color_ambient.getBlue()), 255) / 255.0f;
+ m_params.color_ambient.getBlue()),
+ 255) /
+ 255.0f;
m_color.a = m_params.color_bright.getAlpha() / 255.0f;
// is the camera inside the cloud mesh?
@@ -358,8 +357,10 @@ void Clouds::update(const v3f &camera_p, const video::SColorf &color_diffuse)
if (camera_height >= m_box.MinEdge.Y &&
camera_height <= m_box.MaxEdge.Y) {
v2f camera_in_noise;
- camera_in_noise.X = floor((camera_p.X - m_origin.X) / cloud_size + 0.5);
- camera_in_noise.Y = floor((camera_p.Z - m_origin.Y) / cloud_size + 0.5);
+ camera_in_noise.X = floor(
+ (camera_p.X - m_origin.X) / cloud_size + 0.5);
+ camera_in_noise.Y = floor(
+ (camera_p.Z - m_origin.Y) / cloud_size + 0.5);
bool filled = gridFilled(camera_in_noise.X, camera_in_noise.Y);
m_camera_inside_cloud = filled;
}
@@ -375,10 +376,8 @@ void Clouds::readSettings()
bool Clouds::gridFilled(int x, int y) const
{
float cloud_size_noise = cloud_size / (BS * 200.f);
- float noise = noise2d_perlin(
- (float)x * cloud_size_noise,
- (float)y * cloud_size_noise,
- m_seed, 3, 0.5);
+ float noise = noise2d_perlin((float)x * cloud_size_noise,
+ (float)y * cloud_size_noise, m_seed, 3, 0.5);
// normalize to 0..1 (given 3 octaves)
static constexpr const float noise_bound = 1.0f + 0.5f + 0.25f;
float density = noise / noise_bound * 0.5f + 0.5f;