Minetest  5.4.0
minimap.h
Go to the documentation of this file.
1 /*
2 Minetest
3 Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com>
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 
20 #pragma once
21 
22 #include "../hud.h"
24 #include "util/thread.h"
25 #include "voxel.h"
26 #include <map>
27 #include <string>
28 #include <vector>
29 
30 class Client;
31 class ITextureSource;
32 class IShaderSource;
33 
34 #define MINIMAP_MAX_SX 512
35 #define MINIMAP_MAX_SY 512
36 
40 };
41 
44  std::string label;
46  u16 map_size;
47  std::string texture;
48  u16 scale;
49 };
50 
51 struct MinimapMarker {
52  MinimapMarker(scene::ISceneNode *parent_node):
54  {
55  }
56  scene::ISceneNode *parent_node;
57 };
58 struct MinimapPixel {
61  u16 height;
62  u16 air_count;
63 };
64 
66  void getMinimapNodes(VoxelManipulator *vmanip, const v3s16 &pos);
67 
69 };
70 
71 struct MinimapData {
78  video::IImage *minimap_mask_round = nullptr;
79  video::IImage *minimap_mask_square = nullptr;
80  video::ITexture *texture = nullptr;
81  video::ITexture *heightmap_texture = nullptr;
82  video::ITexture *minimap_overlay_round = nullptr;
83  video::ITexture *minimap_overlay_square = nullptr;
84  video::ITexture *player_marker = nullptr;
85  video::ITexture *object_marker_red = nullptr;
86 };
87 
90  MinimapMapblock *data = nullptr;
91 };
92 
94 public:
96  virtual ~MinimapUpdateThread();
97 
98  void getMap(v3s16 pos, s16 size, s16 height);
101  bool popBlockUpdate(QueuedMinimapUpdate *update);
102 
103  MinimapData *data = nullptr;
104 
105 protected:
106  virtual void doUpdate();
107 
108 private:
109  std::mutex m_queue_mutex;
110  std::deque<QueuedMinimapUpdate> m_update_queue;
111  std::map<v3s16, MinimapMapblock *> m_blocks_cache;
112 };
113 
114 class Minimap {
115 public:
117  ~Minimap();
118 
119  void addBlock(v3s16 pos, MinimapMapblock *data);
120 
121  v3f getYawVec();
122 
123  void setPos(v3s16 pos);
124  v3s16 getPos() const { return data->pos; }
125  void setAngle(f32 angle);
126  f32 getAngle() const { return m_angle; }
127  void toggleMinimapShape();
128  void setMinimapShape(MinimapShape shape);
130 
131  void clearModes() { m_modes.clear(); };
132  void addMode(MinimapModeDef mode);
133  void addMode(MinimapType type, u16 size = 0, std::string label = "",
134  std::string texture = "", u16 scale = 1);
135 
136  void setModeIndex(size_t index);
137  size_t getModeIndex() const { return m_current_mode_index; };
138  size_t getMaxModeIndex() const { return m_modes.size() - 1; };
139  void nextMode();
140 
141  MinimapModeDef getModeDef() const { return data->mode; }
142 
143  video::ITexture *getMinimapTexture();
144 
145  void blitMinimapPixelsToImageRadar(video::IImage *map_image);
146  void blitMinimapPixelsToImageSurface(video::IImage *map_image,
147  video::IImage *heightmap_image);
148 
149  scene::SMeshBuffer *getMinimapMeshBuffer();
150 
151  MinimapMarker* addMarker(scene::ISceneNode *parent_node);
152  void removeMarker(MinimapMarker **marker);
153 
154  void updateActiveMarkers();
155  void drawMinimap();
156  void drawMinimap(core::rect<s32> rect);
157 
158  video::IVideoDriver *driver;
161 
162 private:
167  scene::SMeshBuffer *m_meshbuffer;
169  std::vector<MinimapModeDef> m_modes;
172  f32 m_angle;
173  std::mutex m_mutex;
174  std::list<MinimapMarker*> m_markers;
175  std::list<v2f> m_active_markers;
176 };
Definition: client.h:109
Definition: shader.h:126
Definition: tile.h:86
Definition: minimap.h:93
void enqueueBlock(v3s16 pos, MinimapMapblock *data)
Definition: minimap.cpp:81
virtual void doUpdate()
Definition: minimap.cpp:88
virtual ~MinimapUpdateThread()
Definition: minimap.cpp:34
bool popBlockUpdate(QueuedMinimapUpdate *update)
Definition: minimap.cpp:68
std::deque< QueuedMinimapUpdate > m_update_queue
Definition: minimap.h:110
MinimapData * data
Definition: minimap.h:103
std::mutex m_queue_mutex
Definition: minimap.h:109
bool pushBlockUpdate(v3s16 pos, MinimapMapblock *data)
Definition: minimap.cpp:45
std::map< v3s16, MinimapMapblock * > m_blocks_cache
Definition: minimap.h:111
void getMap(v3s16 pos, s16 size, s16 height)
Definition: minimap.cpp:120
MinimapUpdateThread()
Definition: minimap.h:95
Definition: minimap.h:114
ITextureSource * m_tsrc
Definition: minimap.h:163
Client * client
Definition: minimap.h:159
std::list< MinimapMarker * > m_markers
Definition: minimap.h:174
size_t getModeIndex() const
Definition: minimap.h:137
std::mutex m_mutex
Definition: minimap.h:173
MinimapUpdateThread * m_minimap_update_thread
Definition: minimap.h:166
video::IVideoDriver * driver
Definition: minimap.h:158
bool m_enable_shaders
Definition: minimap.h:168
void addBlock(v3s16 pos, MinimapMapblock *data)
Definition: minimap.cpp:263
void setMinimapShape(MinimapShape shape)
Definition: minimap.cpp:277
void blitMinimapPixelsToImageRadar(video::IImage *map_image)
Definition: minimap.cpp:420
void setModeIndex(size_t index)
Definition: minimap.cpp:299
~Minimap()
Definition: minimap.cpp:239
void addMode(MinimapModeDef mode)
Definition: minimap.cpp:317
size_t m_current_mode_index
Definition: minimap.h:170
scene::SMeshBuffer * m_meshbuffer
Definition: minimap.h:167
v3s16 getPos() const
Definition: minimap.h:124
MinimapShape getMinimapShape()
Definition: minimap.cpp:290
video::ITexture * getMinimapTexture()
Definition: minimap.cpp:467
void setPos(v3s16 pos)
Definition: minimap.cpp:397
void removeMarker(MinimapMarker **marker)
Definition: minimap.cpp:693
IShaderSource * m_shdrsrc
Definition: minimap.h:164
MinimapMarker * addMarker(scene::ISceneNode *parent_node)
Definition: minimap.cpp:686
size_t getMaxModeIndex() const
Definition: minimap.h:138
v3f getYawVec()
Definition: minimap.cpp:542
const NodeDefManager * m_ndef
Definition: minimap.h:165
std::vector< MinimapModeDef > m_modes
Definition: minimap.h:169
f32 getAngle() const
Definition: minimap.h:126
MinimapData * data
Definition: minimap.h:160
Minimap(Client *client)
Definition: minimap.cpp:178
scene::SMeshBuffer * getMinimapMeshBuffer()
Definition: minimap.cpp:554
void nextMode()
Definition: minimap.cpp:386
void blitMinimapPixelsToImageSurface(video::IImage *map_image, video::IImage *heightmap_image)
Definition: minimap.cpp:436
f32 m_angle
Definition: minimap.h:172
void toggleMinimapShape()
Definition: minimap.cpp:268
void drawMinimap()
Definition: minimap.cpp:576
void setAngle(f32 angle)
Definition: minimap.cpp:415
MinimapModeDef getModeDef() const
Definition: minimap.h:141
void clearModes()
Definition: minimap.h:131
u16 m_surface_mode_scan_height
Definition: minimap.h:171
std::list< v2f > m_active_markers
Definition: minimap.h:175
void updateActiveMarkers()
Definition: minimap.cpp:700
This class is for getting the actual properties of nodes from their content ID.
Definition: nodedef.h:510
Definition: thread.h:189
Definition: voxel.h:356
#define MAP_BLOCKSIZE
Definition: constants.h:77
MinimapType
Definition: hud.h:113
core::vector3d< s16 > v3s16
Definition: irr_v3d.h:28
core::vector3df v3f
Definition: irr_v3d.h:26
MinimapShape
Definition: minimap.h:37
@ MINIMAP_SHAPE_SQUARE
Definition: minimap.h:38
@ MINIMAP_SHAPE_ROUND
Definition: minimap.h:39
#define MINIMAP_MAX_SY
Definition: minimap.h:35
#define MINIMAP_MAX_SX
Definition: minimap.h:34
Definition: activeobjectmgr.cpp:25
Definition: mapnode.h:118
Definition: minimap.h:71
MinimapPixel minimap_scan[MINIMAP_MAX_SX *MINIMAP_MAX_SY]
Definition: minimap.h:75
video::ITexture * minimap_overlay_square
Definition: minimap.h:83
video::IImage * minimap_mask_square
Definition: minimap.h:79
v3s16 old_pos
Definition: minimap.h:74
video::ITexture * minimap_overlay_round
Definition: minimap.h:82
video::ITexture * object_marker_red
Definition: minimap.h:85
MinimapModeDef mode
Definition: minimap.h:72
video::ITexture * texture
Definition: minimap.h:80
video::ITexture * heightmap_texture
Definition: minimap.h:81
video::ITexture * player_marker
Definition: minimap.h:84
video::IImage * minimap_mask_round
Definition: minimap.h:78
bool map_invalidated
Definition: minimap.h:76
v3s16 pos
Definition: minimap.h:73
bool minimap_shape_round
Definition: minimap.h:77
Definition: minimap.h:65
void getMinimapNodes(VoxelManipulator *vmanip, const v3s16 &pos)
Definition: minimap.cpp:735
MinimapPixel data[MAP_BLOCKSIZE *MAP_BLOCKSIZE]
Definition: minimap.h:68
Definition: minimap.h:51
scene::ISceneNode * parent_node
Definition: minimap.h:56
MinimapMarker(scene::ISceneNode *parent_node)
Definition: minimap.h:52
Definition: minimap.h:42
MinimapType type
Definition: minimap.h:43
u16 scale
Definition: minimap.h:48
std::string label
Definition: minimap.h:44
u16 map_size
Definition: minimap.h:46
std::string texture
Definition: minimap.h:47
u16 scan_height
Definition: minimap.h:45
Definition: minimap.h:58
u16 height
Definition: minimap.h:61
u16 air_count
Definition: minimap.h:62
MapNode n
The topmost node that the minimap displays.
Definition: minimap.h:60
Definition: minimap.h:88
v3s16 pos
Definition: minimap.h:89
MinimapMapblock * data
Definition: minimap.h:90