summaryrefslogtreecommitdiff
path: root/src/minimap.h
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2015-07-08 00:45:24 -0400
committerkwolekr <kwolekr@minetest.net>2015-07-08 01:50:31 -0400
commite234d8b3786d5adfbdf3d1a2123c3e8d91c21880 (patch)
tree2775448749ab7616a9b1e69b4bb4988aa0253539 /src/minimap.h
parentba15c98e4d5d7f4bc515e351d6af1a084d46092e (diff)
downloadminetest-e234d8b3786d5adfbdf3d1a2123c3e8d91c21880.tar.gz
minetest-e234d8b3786d5adfbdf3d1a2123c3e8d91c21880.tar.bz2
minetest-e234d8b3786d5adfbdf3d1a2123c3e8d91c21880.zip
Clean-up Minimap code
- Fixed race conditions - Fixed null dereference - Fixed out-of-bounds array access - MinimapMapblock is now allocated and added to update queue only when enabled - Removed dependency on LocalPlayer - Fixed code style - Simplified expressions and program logic - Cleaned minimap object interfaces
Diffstat (limited to 'src/minimap.h')
-rw-r--r--src/minimap.h142
1 files changed, 63 insertions, 79 deletions
diff --git a/src/minimap.h b/src/minimap.h
index 4ca0451b7..edb491717 100644
--- a/src/minimap.h
+++ b/src/minimap.h
@@ -20,14 +20,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef MINIMAP_HEADER
#define MINIMAP_HEADER
+#include <map>
+#include <string>
+#include <vector>
#include "irrlichttypes_extrabloated.h"
#include "client.h"
#include "voxel.h"
#include "jthread/jmutex.h"
#include "jthread/jsemaphore.h"
-#include <map>
-#include <string>
-#include <vector>
+
+#define MINIMAP_MAX_SX 512
+#define MINIMAP_MAX_SY 512
enum MinimapMode {
MINIMAP_MODE_OFF,
@@ -36,31 +39,37 @@ enum MinimapMode {
MINIMAP_MODE_SURFACEx4,
MINIMAP_MODE_RADARx1,
MINIMAP_MODE_RADARx2,
- MINIMAP_MODE_RADARx4
+ MINIMAP_MODE_RADARx4,
+ MINIMAP_MODE_COUNT,
};
-struct MinimapPixel
-{
+struct MinimapModeDef {
+ bool is_radar;
+ u16 scan_height;
+ u16 map_size;
+};
+
+struct MinimapPixel {
u16 id;
u16 height;
u16 air_count;
u16 light;
};
-struct MinimapMapblock
-{
+struct MinimapMapblock {
+ void getMinimapNodes(VoxelManipulator *vmanip, v3s16 pos);
+
MinimapPixel data[MAP_BLOCKSIZE * MAP_BLOCKSIZE];
};
-struct MinimapData
-{
- bool radar;
+struct MinimapData {
+ bool is_radar;
MinimapMode mode;
v3s16 pos;
v3s16 old_pos;
u16 scan_height;
u16 map_size;
- MinimapPixel minimap_scan[512 * 512];
+ MinimapPixel minimap_scan[MINIMAP_MAX_SX * MINIMAP_MAX_SY];
bool map_invalidated;
bool minimap_shape_round;
video::IImage *minimap_image;
@@ -74,104 +83,79 @@ struct MinimapData
video::ITexture *player_marker;
};
-struct QueuedMinimapUpdate
-{
+struct QueuedMinimapUpdate {
v3s16 pos;
MinimapMapblock *data;
-
- QueuedMinimapUpdate();
- ~QueuedMinimapUpdate();
};
-/*
- A thread-safe queue of minimap mapblocks update tasks
-*/
-
-class MinimapUpdateQueue
-{
+class MinimapUpdateThread : public UpdateThread {
public:
- MinimapUpdateQueue();
-
- ~MinimapUpdateQueue();
+ virtual ~MinimapUpdateThread();
- bool addBlock(v3s16 pos, MinimapMapblock *data);
+ void getMap(v3s16 pos, s16 size, s16 height, bool radar);
+ MinimapPixel *getMinimapPixel(v3s16 pos, s16 height, s16 *pixel_height);
+ s16 getAirCount(v3s16 pos, s16 height);
+ video::SColor getColorFromId(u16 id);
- QueuedMinimapUpdate *pop();
+ void enqueueBlock(v3s16 pos, MinimapMapblock *data);
- u32 size()
- {
- JMutexAutoLock lock(m_mutex);
- return m_queue.size();
- }
-
-private:
- std::list<QueuedMinimapUpdate*> m_queue;
- JMutex m_mutex;
-};
+ bool pushBlockUpdate(v3s16 pos, MinimapMapblock *data);
+ bool popBlockUpdate(QueuedMinimapUpdate *update);
-class MinimapUpdateThread : public UpdateThread
-{
-private:
- MinimapUpdateQueue m_queue;
- std::map<v3s16, MinimapMapblock *> m_blocks_cache;
+ MinimapData *data;
protected:
const char *getName()
- { return "MinimapUpdateThread"; }
- virtual void doUpdate();
-
-public:
- MinimapUpdateThread(IrrlichtDevice *device, Client *client)
{
- this->device = device;
- this->client = client;
- this->driver = device->getVideoDriver();
- this->tsrc = client->getTextureSource();
+ return "MinimapUpdateThread";
}
- ~MinimapUpdateThread();
- void getMap (v3s16 pos, s16 size, s16 height, bool radar);
- MinimapPixel *getMinimapPixel (v3s16 pos, s16 height, s16 &pixel_height);
- s16 getAirCount (v3s16 pos, s16 height);
- video::SColor getColorFromId(u16 id);
- void enqueue_Block(v3s16 pos, MinimapMapblock *data);
- IrrlichtDevice *device;
- Client *client;
- video::IVideoDriver *driver;
- ITextureSource *tsrc;
- MinimapData *data;
-};
+ virtual void doUpdate();
-class Mapper
-{
private:
- MinimapUpdateThread *m_minimap_update_thread;
- video::ITexture *minimap_texture;
- scene::SMeshBuffer *m_meshbuffer;
- bool m_enable_shaders;
- u16 m_surface_mode_scan_height;
- JMutex m_mutex;
+ JMutex m_queue_mutex;
+ std::deque<QueuedMinimapUpdate> m_update_queue;
+ std::map<v3s16, MinimapMapblock *> m_blocks_cache;
+};
+class Mapper {
public:
Mapper(IrrlichtDevice *device, Client *client);
~Mapper();
void addBlock(v3s16 pos, MinimapMapblock *data);
- void setPos(v3s16 pos);
- video::ITexture* getMinimapTexture();
+
v3f getYawVec();
MinimapMode getMinimapMode();
+
+ void setPos(v3s16 pos);
+ void setAngle(f32 angle);
void setMinimapMode(MinimapMode mode);
void toggleMinimapShape();
+
+
+ video::ITexture *getMinimapTexture();
+
+ void blitMinimapPixelsToImageRadar(video::IImage *map_image);
+ void blitMinimapPixelsToImageSurface(video::IImage *map_image,
+ video::IImage *heightmap_image);
+
scene::SMeshBuffer *getMinimapMeshBuffer();
void drawMinimap();
- IrrlichtDevice *device;
- Client *client;
+
video::IVideoDriver *driver;
- LocalPlayer *player;
- ITextureSource *tsrc;
- IShaderSource *shdrsrc;
MinimapData *data;
+
+private:
+ ITextureSource *m_tsrc;
+ IShaderSource *m_shdrsrc;
+ INodeDefManager *m_ndef;
+ MinimapUpdateThread *m_minimap_update_thread;
+ scene::SMeshBuffer *m_meshbuffer;
+ bool m_enable_shaders;
+ u16 m_surface_mode_scan_height;
+ f32 m_angle;
+ JMutex m_mutex;
};
#endif