Fix texture distortion for flowing liquids (#9561)

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.
This commit is contained in:
Elias Åström 2020-04-02 19:24:35 +02:00 committed by GitHub
parent d7825bca1b
commit 3d6b55d3e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

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