Fix texture distortion for flowing liquids (#9561)
authorElias Åström <eliast.croc@gmail.com>
Thu, 2 Apr 2020 17:24:35 +0000 (19:24 +0200)
committerGitHub <noreply@github.com>
Thu, 2 Apr 2020 17:24:35 +0000 (19:24 +0200)
Previously textures of the side faces on flowing liquid nodes would
become distorted on different axis depending on the liquid level.  This
is because the nodes always had the same texture coordinates, even when
the generated face could have different sizes.  This solves that problem
by adjusting the texture coordinates for the vertices making up the top
of the faces, so the textures will not look compressed for smaller
faces.

src/client/content_mapblock.cpp

index 5be0caf19cee14967d07653d752fc0934c6ce581..9b4fd221e86b044c227ebcd62ba31bc95bab73e2 100644 (file)
@@ -556,17 +556,24 @@ void MapblockMeshGenerator::drawLiquidSides()
                for (int j = 0; j < 4; j++) {
                        const UV &vertex = base_vertices[j];
                        const v3s16 &base = face.p[vertex.u];
+                       float v = vertex.v;
+
                        v3f pos;
-                       pos.X = (base.X - 0.5) * BS;
-                       pos.Z = (base.Z - 0.5) * BS;
-                       if (vertex.v)
-                               pos.Y = neighbor.is_same_liquid ? corner_levels[base.Z][base.X] : -0.5 * BS;
-                       else
-                               pos.Y =     !top_is_same_liquid ? corner_levels[base.Z][base.X] :  0.5 * BS;
+                       pos.X = (base.X - 0.5f) * BS;
+                       pos.Z = (base.Z - 0.5f) * BS;
+                       if (vertex.v) {
+                               pos.Y = neighbor.is_same_liquid ? corner_levels[base.Z][base.X] : -0.5f * BS;
+                       } else if (top_is_same_liquid) {
+                               pos.Y = 0.5f * BS;
+                       } else {
+                               pos.Y = corner_levels[base.Z][base.X];
+                               v += (0.5f * BS - corner_levels[base.Z][base.X]) / BS;
+                       }
+
                        if (data->m_smooth_lighting)
                                color = blendLightColor(pos);
                        pos += origin;
-                       vertices[j] = video::S3DVertex(pos.X, pos.Y, pos.Z, 0, 0, 0, color, vertex.u, vertex.v);
+                       vertices[j] = video::S3DVertex(pos.X, pos.Y, pos.Z, 0, 0, 0, color, vertex.u, v);
                };
                collector->append(tile_liquid, vertices, 4, quad_indices, 6);
        }