From 5f4ed94d90668af58a3e677e7401f0028871acce Mon Sep 17 00:00:00 2001
From: RealBadAngel <maciej.kasatkin@o2.pl>
Date: Thu, 18 Feb 2016 17:17:17 +0100
Subject: [PATCH] Minimap: show player markers

---
 src/camera.h                             |   3 +
 src/minimap.cpp                          |  69 +++++++++++++++++++++++
 src/minimap.h                            |   6 ++
 textures/base/pack/object_marker_red.png | Bin 0 -> 663 bytes
 4 files changed, 78 insertions(+)
 create mode 100644 textures/base/pack/object_marker_red.png

diff --git a/src/camera.h b/src/camera.h
index 2df7da2b8..36fc72f1a 100644
--- a/src/camera.h
+++ b/src/camera.h
@@ -172,6 +172,9 @@ class Camera
 
 	void removeNametag(Nametag *nametag);
 
+	std::list<Nametag *> *getNametags()
+	{ return &m_nametags; }
+
 	void drawNametags();
 
 private:
diff --git a/src/minimap.cpp b/src/minimap.cpp
index ded8470c5..8cd0a7beb 100644
--- a/src/minimap.cpp
+++ b/src/minimap.cpp
@@ -211,6 +211,7 @@ void MinimapUpdateThread::getMap(v3s16 pos, s16 size, s16 height, bool is_radar)
 
 Mapper::Mapper(IrrlichtDevice *device, Client *client)
 {
+	this->client    = client;
 	this->driver    = device->getVideoDriver();
 	this->m_tsrc    = client->getTextureSource();
 	this->m_shdrsrc = client->getShaderSource();
@@ -250,6 +251,8 @@ Mapper::Mapper(IrrlichtDevice *device, Client *client)
 
 	// Create player marker texture
 	data->player_marker = m_tsrc->getTexture("player_marker.png");
+	// Create object marker texture
+	data->object_marker_red = m_tsrc->getTexture("object_marker_red.png");
 
 	// Create mesh buffer for minimap
 	m_meshbuffer = getMinimapMeshBuffer();
@@ -274,6 +277,7 @@ Mapper::~Mapper()
 	driver->removeTexture(data->heightmap_texture);
 	driver->removeTexture(data->minimap_overlay_round);
 	driver->removeTexture(data->minimap_overlay_square);
+	driver->removeTexture(data->object_marker_red);
 
 	delete data;
 	delete m_minimap_update_thread;
@@ -468,6 +472,7 @@ void Mapper::drawMinimap()
 	if (!minimap_texture)
 		return;
 
+	updateActiveMarkers();
 	v2u32 screensize = porting::getWindowSize();
 	const u32 size = 0.25 * screensize.Y;
 
@@ -527,6 +532,70 @@ void Mapper::drawMinimap()
 	driver->setTransform(video::ETS_VIEW, oldViewMat);
 	driver->setTransform(video::ETS_PROJECTION, oldProjMat);
 	driver->setViewPort(oldViewPort);
+
+	// Draw player markers
+	v2s32 s_pos(screensize.X - size - 10, 10);
+	core::dimension2di imgsize(data->object_marker_red->getOriginalSize());
+	core::rect<s32> img_rect(0, 0, imgsize.Width, imgsize.Height);
+	static const video::SColor col(255, 255, 255, 255);
+	static const video::SColor c[4] = {col, col, col, col};
+	f32 sin_angle = sin(m_angle * core::DEGTORAD);
+	f32 cos_angle = cos(m_angle * core::DEGTORAD);
+	s32 marker_size2 =  0.025 * (float)size;
+	for (std::list<v2f>::const_iterator
+			i = m_active_markers.begin();
+			i != m_active_markers.end(); ++i) {
+		v2f posf = *i;
+		if (data->minimap_shape_round) {
+			f32 t1 = posf.X * cos_angle - posf.Y * sin_angle;
+			f32 t2 = posf.X * sin_angle + posf.Y * cos_angle;
+			posf.X = t1;
+			posf.Y = t2;
+		}
+		posf.X = (posf.X + 0.5) * (float)size;
+		posf.Y = (posf.Y + 0.5) * (float)size;
+		core::rect<s32> dest_rect(
+			s_pos.X + posf.X - marker_size2,
+			s_pos.Y + posf.Y - marker_size2,
+			s_pos.X + posf.X + marker_size2,
+			s_pos.Y + posf.Y + marker_size2);
+		driver->draw2DImage(data->object_marker_red, dest_rect,
+			img_rect, &dest_rect, &c[0], true);
+	}
+}
+
+void Mapper::updateActiveMarkers ()
+{
+	video::IImage *minimap_mask = data->minimap_shape_round ?
+		data->minimap_mask_round : data->minimap_mask_square;
+
+	std::list<Nametag *> *nametags = client->getCamera()->getNametags();
+
+	m_active_markers.clear();
+
+	for (std::list<Nametag *>::const_iterator
+			i = nametags->begin();
+			i != nametags->end(); ++i) {
+		Nametag *nametag = *i;
+		v3s16 pos = floatToInt(nametag->parent_node->getPosition() +
+			intToFloat(client->getCamera()->getOffset(), BS), BS);
+		pos -= data->pos - v3s16(data->map_size / 2,
+				data->scan_height / 2,
+				data->map_size / 2);
+		if (pos.X < 0 || pos.X > data->map_size ||
+				pos.Y < 0 || pos.Y > data->scan_height ||
+				pos.Z < 0 || pos.Z > data->map_size) {
+			continue;
+		}
+		pos.X = ((float)pos.X / data->map_size) * MINIMAP_MAX_SX;
+		pos.Z = ((float)pos.Z / data->map_size) * MINIMAP_MAX_SY;
+		video::SColor mask_col = minimap_mask->getPixel(pos.X, pos.Z);
+		if (!mask_col.getAlpha()) {
+			continue;
+		}
+		m_active_markers.push_back(v2f(((float)pos.X / (float)MINIMAP_MAX_SX) - 0.5,
+			(1.0 - (float)pos.Z / (float)MINIMAP_MAX_SY) - 0.5));
+	}
 }
 
 ////
diff --git a/src/minimap.h b/src/minimap.h
index dd1397d54..743b2bff2 100644
--- a/src/minimap.h
+++ b/src/minimap.h
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <map>
 #include <string>
 #include <vector>
+#include "camera.h"
 
 #define MINIMAP_MAX_SX 512
 #define MINIMAP_MAX_SY 512
@@ -82,6 +83,7 @@ struct MinimapData {
 	video::ITexture *minimap_overlay_round;
 	video::ITexture *minimap_overlay_square;
 	video::ITexture *player_marker;
+	video::ITexture *object_marker_red;
 };
 
 struct QueuedMinimapUpdate {
@@ -138,9 +140,12 @@ class Mapper {
 		video::IImage *heightmap_image);
 
 	scene::SMeshBuffer *getMinimapMeshBuffer();
+
+	void updateActiveMarkers();
 	void drawMinimap();
 
 	video::IVideoDriver *driver;
+	Client* client;
 	MinimapData *data;
 
 private:
@@ -153,6 +158,7 @@ class Mapper {
 	u16 m_surface_mode_scan_height;
 	f32 m_angle;
 	Mutex m_mutex;
+	std::list<v2f> m_active_markers;
 };
 
 #endif
diff --git a/textures/base/pack/object_marker_red.png b/textures/base/pack/object_marker_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..552a546e3e225942b9c8c47ca84adb6573ea369d
GIT binary patch
literal 663
zcmV;I0%-k-P)<h;3K|Lk000e1NJLTq000jF000jN1^@s6JJyv-00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~tl~IVLfrDf<8b02y>e
zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00I9=L_t(2&wbOqi(W+($MMgZ
zx%YXNeQ`Arvg?WgH-#>QEiE*XLa>QwX<=ny>7O8irC=#o*hfgLg=}FF5UmUtkf<TV
z>{}8GUs#@(d+%86JgAKa4(H4azxkc{!tmc%6|P9Wh~ywB5soESg*UMRLY$U=;>F0`
zKa*VEW@CHMjC)JdY<4%B{W5s;+hDI0pDKRPh=urtruFf~@am<`%7sDRtTrb&!kwht
z%ua4`qo4Z_w=z~D`(QVD<E^>Xmy5JRoWnYv#xpoqSSv<<WakgVur~NM3$LHe-n-J<
zc%?|s6Bz?K6pZi`v5LQF55wBy;vh>tx|r-<?k(>Ssfy<4tGFOzj2Z4F?S5Epf=k<j
zcB48h9J|`5O0}!!TZOG++!il22AfOFS1Y-`iWa%p%V@BSac>lCB+2n4o1avN^gmfD
z{Ylmh$-`9m`ffHmtnX>7!=f(w(J6<r9~>r=F8L-IT>W|Q_)g-85*5rsFsf@fCT<7!
zizA&cv+!WTg;}=q1f%7`(!ZSJbfU6Pe3#hEW<M3z){D<_o%a5t<hkFI^M8hRUg=Ko
z5Vu3zOx(z(Kk`-A`DDtysFxS)YP`F}YtOQ|RgA~I@idzqB-3Auqy1t}?{j=_wD=e8
xX|u)|;ceOVHhIv}HOYa-b-c6AlVBvy;%~P8uZXZwPRRfO002ovPDHLkV1l8aH~Rnp

literal 0
HcmV?d00001

-- 
GitLab