- if (!data->map_invalidated) {
- // create minimap and heightmap image
- core::dimension2d<u32> dim(data->map_size,data->map_size);
- video::IImage *map_image = driver->createImage(video::ECF_A8R8G8B8, dim);
- video::IImage *heightmap_image = driver->createImage(video::ECF_A8R8G8B8, dim);
- video::IImage *minimap_image = driver->createImage(video::ECF_A8R8G8B8,
- core::dimension2d<u32>(512, 512));
-
- video::SColor c;
- if (!data->radar) {
- // surface mode
- for (s16 x = 0; x < data->map_size; x++) {
- for (s16 z = 0; z < data->map_size; z++) {
- MinimapPixel* minimap_pixel = &data->minimap_scan[x + z * data->map_size];
- const ContentFeatures &f = client->getNodeDefManager()->get(minimap_pixel->id);
- c = f.minimap_color;
- c.setAlpha(240);
- map_image->setPixel(x, data->map_size - z -1, c);
- u32 h = minimap_pixel->height;
- heightmap_image->setPixel(x,data->map_size -z -1,
- video::SColor(255, h, h, h));
- }
- }
- } else {
- // radar mode
- c = video::SColor (240, 0 , 0, 0);
- for (s16 x = 0; x < data->map_size; x++) {
- for (s16 z = 0; z < data->map_size; z++) {
- MinimapPixel* minimap_pixel = &data->minimap_scan[x + z * data->map_size];
- if (minimap_pixel->air_count > 0) {
- c.setGreen(core::clamp(core::round32(32 + minimap_pixel->air_count * 8), 0, 255));
- } else {
- c.setGreen(0);
- }
- map_image->setPixel(x, data->map_size - z -1, c);
- }
- }
+ if (data->map_invalidated)
+ return data->texture;
+
+ // create minimap and heightmap images in memory
+ core::dimension2d<u32> dim(data->map_size, data->map_size);
+ video::IImage *map_image = driver->createImage(video::ECF_A8R8G8B8, dim);
+ video::IImage *heightmap_image = driver->createImage(video::ECF_A8R8G8B8, dim);
+ video::IImage *minimap_image = driver->createImage(video::ECF_A8R8G8B8,
+ core::dimension2d<u32>(MINIMAP_MAX_SX, MINIMAP_MAX_SY));
+
+ // Blit MinimapPixels to images
+ if (data->is_radar)
+ blitMinimapPixelsToImageRadar(map_image);
+ else
+ blitMinimapPixelsToImageSurface(map_image, heightmap_image);
+
+ map_image->copyToScaling(minimap_image);
+ map_image->drop();
+
+ video::IImage *minimap_mask = data->minimap_shape_round ?
+ data->minimap_mask_round : data->minimap_mask_square;
+
+ if (minimap_mask) {
+ for (s16 y = 0; y < MINIMAP_MAX_SY; y++)
+ for (s16 x = 0; x < MINIMAP_MAX_SX; x++) {
+ const video::SColor &mask_col = minimap_mask->getPixel(x, y);
+ if (!mask_col.getAlpha())
+ minimap_image->setPixel(x, y, video::SColor(0,0,0,0));