summaryrefslogtreecommitdiff
path: root/src/minimap.h
diff options
context:
space:
mode:
authorRealBadAngel <maciej.kasatkin@o2.pl>2015-06-22 04:34:56 +0200
committerest31 <MTest31@outlook.com>2015-06-27 03:42:01 +0200
commitffd16e3feca90c356c55898de2b9f3f5c6bc5c98 (patch)
tree8fb350ba1d2afaa39b9d333290e16a68168a4ddd /src/minimap.h
parent3376d2e114767eef06b87645edefcd2d42696919 (diff)
downloadminetest-ffd16e3feca90c356c55898de2b9f3f5c6bc5c98.tar.gz
minetest-ffd16e3feca90c356c55898de2b9f3f5c6bc5c98.tar.bz2
minetest-ffd16e3feca90c356c55898de2b9f3f5c6bc5c98.zip
Add minimap feature
Diffstat (limited to 'src/minimap.h')
-rw-r--r--src/minimap.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/minimap.h b/src/minimap.h
new file mode 100644
index 000000000..ebb74c4fb
--- /dev/null
+++ b/src/minimap.h
@@ -0,0 +1,168 @@
+/*
+Minetest
+Copyright (C) 2010-2015 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef MINIMAP_HEADER
+#define MINIMAP_HEADER
+
+#include "irrlichttypes_extrabloated.h"
+#include "client.h"
+#include "voxel.h"
+#include "jthread/jmutex.h"
+#include <map>
+#include <string>
+#include <vector>
+
+enum MinimapMode {
+ MINIMAP_MODE_OFF,
+ MINIMAP_MODE_SURFACEx1,
+ MINIMAP_MODE_SURFACEx2,
+ MINIMAP_MODE_SURFACEx4,
+ MINIMAP_MODE_RADARx1,
+ MINIMAP_MODE_RADARx2,
+ MINIMAP_MODE_RADARx4
+};
+
+struct MinimapPixel
+{
+ u16 id;
+ u16 height;
+ u16 air_count;
+ u16 light;
+};
+
+struct MinimapMapblock
+{
+ MinimapPixel data[MAP_BLOCKSIZE * MAP_BLOCKSIZE];
+};
+
+struct MinimapData
+{
+ bool radar;
+ MinimapMode mode;
+ v3s16 pos;
+ v3s16 old_pos;
+ u16 scan_height;
+ u16 map_size;
+ MinimapPixel minimap_scan[512 * 512];
+ bool map_invalidated;
+ bool minimap_shape_round;
+ video::IImage *minimap_image;
+ video::IImage *heightmap_image;
+ video::IImage *minimap_mask_round;
+ video::IImage *minimap_mask_square;
+ video::ITexture *texture;
+ video::ITexture *heightmap_texture;
+ video::ITexture *minimap_overlay_round;
+ video::ITexture *minimap_overlay_square;
+ video::ITexture *player_marker;
+};
+
+struct QueuedMinimapUpdate
+{
+ v3s16 pos;
+ MinimapMapblock *data;
+
+ QueuedMinimapUpdate();
+ ~QueuedMinimapUpdate();
+};
+
+/*
+ A thread-safe queue of minimap mapblocks update tasks
+*/
+
+class MinimapUpdateQueue
+{
+public:
+ MinimapUpdateQueue();
+
+ ~MinimapUpdateQueue();
+
+ void addBlock(v3s16 pos, MinimapMapblock *data);
+
+ QueuedMinimapUpdate *pop();
+
+ u32 size()
+ {
+ JMutexAutoLock lock(m_mutex);
+ return m_queue.size();
+ }
+
+private:
+ std::vector<QueuedMinimapUpdate*> m_queue;
+ JMutex m_mutex;
+};
+
+class MinimapUpdateThread : public JThread
+{
+private:
+
+public:
+ MinimapUpdateThread(IrrlichtDevice *device, Client *client)
+ {
+ this->device = device;
+ this->client = client;
+ this->driver = device->getVideoDriver();
+ this->tsrc = client->getTextureSource();
+ }
+ 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);
+ IrrlichtDevice *device;
+ Client *client;
+ video::IVideoDriver *driver;
+ ITextureSource *tsrc;
+ void *Thread();
+ MinimapData *data;
+ MinimapUpdateQueue m_queue;
+ std::map<v3s16, MinimapMapblock *> m_blocks_cache;
+};
+
+class Mapper
+{
+private:
+ MinimapUpdateThread *m_minimap_update_thread;
+ video::ITexture *minimap_texture;
+ scene::SMeshBuffer *m_meshbuffer;
+ bool m_enable_shaders;
+ JMutex m_mutex;
+
+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 setMinimapMode(MinimapMode mode);
+ void toggleMinimapShape();
+ scene::SMeshBuffer *getMinimapMeshBuffer();
+ void drawMinimap();
+ IrrlichtDevice *device;
+ Client *client;
+ video::IVideoDriver *driver;
+ LocalPlayer *player;
+ ITextureSource *tsrc;
+ IShaderSource *shdrsrc;
+ MinimapData *data;
+};
+
+#endif