From 01958a7d893d4b4ab10831fc1ab4821a9415db67 Mon Sep 17 00:00:00 2001 From: T1ti <40864460+T1ti@users.noreply.github.com> Date: Sat, 31 Aug 2024 00:05:48 +0200 Subject: [PATCH] adspartan : liquid updates https://github.com/wowdev/noggit3/commit/b656636a7877ac30da22cb7f624ccde1a55d5b01 --- src/noggit/ChunkWater.cpp | 12 +++++++++++- src/noggit/ChunkWater.hpp | 3 +++ src/noggit/TileWater.hpp | 2 ++ src/noggit/liquid_layer.cpp | 35 ++++++++++++++++++++++++++++++++--- src/noggit/liquid_layer.hpp | 1 + 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/noggit/ChunkWater.cpp b/src/noggit/ChunkWater.cpp index 087a7340..3585bc7a 100755 --- a/src/noggit/ChunkWater.cpp +++ b/src/noggit/ChunkWater.cpp @@ -173,6 +173,14 @@ void ChunkWater::autoGen(MapChunk *chunk, float factor) update_layers(); } +void ChunkWater::update_underground_vertices_depth(MapChunk* chunk) +{ + for (liquid_layer& layer : _layers) + { + layer.update_underground_vertices_depth(chunk); + } +} + void ChunkWater::CropWater(MapChunk* chunkTerrain) { @@ -282,11 +290,13 @@ void ChunkWater::update_layers() _water_tile->tagExtents(true); vcenter = (vmin + vmax) * 0.5f; + + _layer_count = _layers.size(); } bool ChunkWater::hasData(size_t layer) const { - return _layers.size() > layer; + return _layer_count > layer; } diff --git a/src/noggit/ChunkWater.hpp b/src/noggit/ChunkWater.hpp index 2b86cfce..8838b79c 100755 --- a/src/noggit/ChunkWater.hpp +++ b/src/noggit/ChunkWater.hpp @@ -40,6 +40,7 @@ public: ) const; void autoGen(MapChunk* chunk, float factor); + void update_underground_vertices_depth(MapChunk* chunk); void CropWater(MapChunk* chunkTerrain); void setType(int type, size_t layer); @@ -91,6 +92,8 @@ private: void update_attributes(); std::vector _layers; + int _layer_count = 0; + MapChunk* _chunk; TileWater* _water_tile; diff --git a/src/noggit/TileWater.hpp b/src/noggit/TileWater.hpp index e95b5651..398e922f 100755 --- a/src/noggit/TileWater.hpp +++ b/src/noggit/TileWater.hpp @@ -57,6 +57,8 @@ public: void autoGen(float factor); + void update_underground_vertices_depth(); + void setType(int type, size_t layer); int getType(size_t layer); diff --git a/src/noggit/liquid_layer.cpp b/src/noggit/liquid_layer.cpp index f4d135fe..ca286182 100755 --- a/src/noggit/liquid_layer.cpp +++ b/src/noggit/liquid_layer.cpp @@ -34,6 +34,7 @@ liquid_layer::liquid_layer(ChunkWater* chunk, glm::vec3 const& base, float heigh changeLiquidID(_liquid_id); + update_min_max(); } liquid_layer::liquid_layer(ChunkWater* chunk, glm::vec3 const& base, mclq& liquid, int liquid_id) @@ -85,7 +86,7 @@ liquid_layer::liquid_layer(ChunkWater* chunk, glm::vec3 const& base, mclq& liqui _vertices[v_index] = lv; } } - + update_min_max(); } liquid_layer::liquid_layer(ChunkWater* chunk @@ -170,8 +171,7 @@ liquid_layer::liquid_layer(ChunkWater* chunk changeLiquidID(_liquid_id); // to update the liquid type - if (check_fatigue()) - _fatigue_enabled = true; + update_min_max(); } liquid_layer::liquid_layer(liquid_layer&& other) @@ -456,6 +456,35 @@ void liquid_layer::update_opacity(MapChunk* chunk, float factor) } } +void liquid_layer::update_underground_vertices_depth(MapChunk* chunk) +{ + // set depth = 0 to liquid verts under ground. This is for LODs. + { + for (int z = 0; z < 9; ++z) + { + for (int x = 0; x < 9; ++x) + { + float diff = _vertices[z * 9 + x].position.y - chunk->mVertices[z * 17 + x].y; + + if (diff < 0.f) + { + _vertices[z * 9 + x].depth = 0.f; + } + else + { + if (x < 8 && z < 8 && !hasSubchunk(x, z)) + { + _vertices[z * 9 + x].depth = 0.f; + _vertices[z * 9 + x + 1].depth = 0.f; + _vertices[(z + 1) * 9 + x].depth = 0.f; + _vertices[(z + 1) * 9 + (x + 1)].depth = 0.f; + } + } + } + } + } +} + bool liquid_layer::hasSubchunk(int x, int z, int size) const { for (int pz = z; pz < z + size; ++pz) diff --git a/src/noggit/liquid_layer.hpp b/src/noggit/liquid_layer.hpp index aafc1437..a60dadf0 100755 --- a/src/noggit/liquid_layer.hpp +++ b/src/noggit/liquid_layer.hpp @@ -66,6 +66,7 @@ public: void crop(MapChunk* chunk); void update_opacity(MapChunk* chunk, float factor); + void update_underground_vertices_depth(MapChunk* chunk); std::array& getVertices() { return _vertices; }; // std::array& getDepth() { return _depth; };