From 81e08fc890886d8df11684896c0cf5ea5a9f3fab Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sun, 10 Aug 2025 16:14:58 +0200 Subject: [PATCH] Handle overlay tiles for minimap color fixes #16285 --- src/client/minimap.cpp | 19 ++++++++++++------- src/nodedef.cpp | 12 ++++++++++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/client/minimap.cpp b/src/client/minimap.cpp index fbba80e6c..f4a2afe76 100644 --- a/src/client/minimap.cpp +++ b/src/client/minimap.cpp @@ -396,21 +396,26 @@ void Minimap::blitMinimapPixelsToImageRadar(video::IImage *map_image) void Minimap::blitMinimapPixelsToImageSurface( video::IImage *map_image, video::IImage *heightmap_image) { - // This variable creation/destruction has a 1% cost on rendering minimap + assert(map_image && heightmap_image); video::SColor tilecolor; for (s16 x = 0; x < data->mode.map_size; x++) for (s16 z = 0; z < data->mode.map_size; z++) { MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->mode.map_size]; const ContentFeatures &f = m_ndef->get(mmpixel->n); - const TileDef *tile = &f.tiledef[0]; + const auto &tile = f.tiledef[0], &overlay = f.tiledef_overlay[0]; - // Color of the 0th tile (mostly this is the topmost) - if(tile->has_color) - tilecolor = tile->color; - else + // Figure out the color of the top of the node + // Note that this is very simplified. The overlay and normal tile can be + // colored independently and the overlay might only cover half or less. + if (!overlay.name.empty() && overlay.has_color) { + tilecolor = overlay.color; + } else if (overlay.name.empty() && tile.has_color) { + tilecolor = tile.color; + } else { mmpixel->n.getColor(f, &tilecolor); - + } + // Multiply with pre-generated "color of texture" tilecolor.setRed(tilecolor.getRed() * f.minimap_color.getRed() / 255); tilecolor.setGreen(tilecolor.getGreen() * f.minimap_color.getGreen() / 255); tilecolor.setBlue(tilecolor.getBlue() * f.minimap_color.getBlue() / 255); diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 9d54c3957..86bc47238 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -907,8 +907,16 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc u32 overlay_shader = shdsrc->getShader("nodes_shader", overlay_material, drawtype); // minimap pixel color = average color of top tile - if (tsettings.enable_minimap && !tdef[0].name.empty() && drawtype != NDT_AIRLIKE) - minimap_color = tsrc->getTextureAverageColor(tdef[0].name); + if (tsettings.enable_minimap && drawtype != NDT_AIRLIKE && !tdef[0].name.empty()) + { + if (!tdef_overlay[0].name.empty()) { + // Merge overlay and base texture + std::string combined = tdef[0].name + "^(" + tdef_overlay[0].name + ")"; + minimap_color = tsrc->getTextureAverageColor(combined); + } else { + minimap_color = tsrc->getTextureAverageColor(tdef[0].name); + } + } // Tiles (fill in f->tiles[]) bool any_polygon_offset = false;