]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/map.h
Occlusion: Check for light_propagates and do mapblock bounds checks
[dragonfireclient.git] / src / map.h
index 377e75ed0c9485de2f562bb9e2ffcf6cc18eb751..232a25ac72fb9a10a08c6d5b91b296d8a8dae68c 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -17,8 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef MAP_HEADER
-#define MAP_HEADER
+#pragma once
 
 #include <iostream>
 #include <sstream>
@@ -34,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/container.h"
 #include "nodetimer.h"
 #include "map_settings_manager.h"
+#include "debug.h"
 
 class Settings;
 class MapDatabase;
@@ -63,8 +63,7 @@ enum MapEditEventType{
        MEET_REMOVENODE,
        // Node swapped (changed without metadata change)
        MEET_SWAPNODE,
-       // Node metadata of block changed (not knowing which node exactly)
-       // p stores block coordinate
+       // Node metadata changed
        MEET_BLOCK_NODE_METADATA_CHANGED,
        // Anything else (modified_blocks are set unsent)
        MEET_OTHER
@@ -76,9 +75,9 @@ struct MapEditEvent
        v3s16 p;
        MapNode n = CONTENT_AIR;
        std::set<v3s16> modified_blocks;
-       u16 already_known_by_peer = 0;
+       bool is_private_change = false;
 
-       MapEditEvent() {}
+       MapEditEvent() = default;
 
        MapEditEvent * clone()
        {
@@ -87,6 +86,7 @@ struct MapEditEvent
                event->p = p;
                event->n = n;
                event->modified_blocks = modified_blocks;
+               event->is_private_change = is_private_change;
                return event;
        }
 
@@ -108,11 +108,7 @@ struct MapEditEvent
                case MEET_OTHER:
                {
                        VoxelArea a;
-                       for(std::set<v3s16>::iterator
-                                       i = modified_blocks.begin();
-                                       i != modified_blocks.end(); ++i)
-                       {
-                               v3s16 p = *i;
+                       for (v3s16 p : modified_blocks) {
                                v3s16 np1 = p*MAP_BLOCKSIZE;
                                v3s16 np2 = np1 + v3s16(1,1,1)*MAP_BLOCKSIZE - v3s16(1,1,1);
                                a.addPoint(np1);
@@ -159,10 +155,8 @@ class Map /*: public NodeContainer*/
        void dispatchEvent(MapEditEvent *event);
 
        // On failure returns NULL
-       MapSector * getSectorNoGenerateNoExNoLock(v2s16 p2d);
+       MapSector * getSectorNoGenerateNoLock(v2s16 p2d);
        // Same as the above (there exists no lock anymore)
-       MapSector * getSectorNoGenerateNoEx(v2s16 p2d);
-       // On failure throws InvalidPositionException
        MapSector * getSectorNoGenerate(v2s16 p2d);
        // Gets an existing sector or creates an empty one
        //MapSector * getSectorCreate(v2s16 p2d);
@@ -172,8 +166,6 @@ class Map /*: public NodeContainer*/
                their differing fetch methods.
        */
        virtual MapSector * emergeSector(v2s16 p){ return NULL; }
-       virtual MapSector * emergeSector(v2s16 p,
-                       std::map<v3s16, MapBlock*> &changed_blocks){ return NULL; }
 
        // Returns InvalidPositionException if not found
        MapBlock * getBlockNoCreate(v3s16 p);
@@ -184,7 +176,7 @@ class Map /*: public NodeContainer*/
        virtual MapBlock * emergeBlock(v3s16 p, bool create_blank=true)
        { return getBlockNoCreateNoEx(p); }
 
-       inline INodeDefManager * getNodeDefManager() { return m_nodedef; }
+       inline const NodeDefManager * getNodeDefManager() { return m_nodedef; }
 
        // Returns InvalidPositionException if not found
        bool isNodeUnderground(v3s16 p);
@@ -197,7 +189,7 @@ class Map /*: public NodeContainer*/
        // Returns a CONTENT_IGNORE node if not found
        // If is_valid_position is not NULL then this will be set to true if the
        // position is valid, otherwise false
-       MapNode getNodeNoEx(v3s16 p, bool *is_valid_position = NULL);
+       MapNode getNode(v3s16 p, bool *is_valid_position = NULL);
 
        /*
                These handle lighting but not faces.
@@ -216,18 +208,9 @@ class Map /*: public NodeContainer*/
        bool addNodeWithEvent(v3s16 p, MapNode n, bool remove_metadata = true);
        bool removeNodeWithEvent(v3s16 p);
 
-       /*
-               Takes the blocks at the edges into account
-       */
-       bool getDayNightDiff(v3s16 blockpos);
-
-       //core::aabbox3d<s16> getDisplayedBlockArea();
-
-       //bool updateChangedVisibleArea();
-
        // Call these before and after saving of many blocks
-       virtual void beginSave() { return; }
-       virtual void endSave() { return; }
+       virtual void beginSave() {}
+       virtual void endSave() {}
 
        virtual void save(ModifiedState save_level) { FATAL_ERROR("FIXME"); }
 
@@ -304,7 +287,6 @@ class Map /*: public NodeContainer*/
        */
 
        void transforming_liquid_add(v3s16 p);
-       s32 transforming_liquid_size();
 
        bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes);
 protected:
@@ -326,10 +308,11 @@ class Map /*: public NodeContainer*/
        UniqueQueue<v3s16> m_transforming_liquid;
 
        // This stores the properties of the nodes on the map.
-       INodeDefManager *m_nodedef;
+       const NodeDefManager *m_nodedef;
 
-       bool isOccluded(v3s16 p0, v3s16 p1, float step, float stepfac,
-                       float start_off, float end_off, u32 needed_count);
+       bool isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target,
+               const core::aabbox3d<s16> &block_bounds, float step, float stepfac,
+               float offset, u32 needed_count);
 
 private:
        f32 m_transforming_liquid_loop_count_multiplier = 1.0f;
@@ -364,9 +347,7 @@ class ServerMap : public Map
                - Check disk (doesn't load blocks)
                - Create blank one
        */
-       ServerMapSector *createSector(v2s16 p);
-
-       bool saoPositionOverLimit(const v3f &p);
+       MapSector *createSector(v2s16 p);
 
        /*
                Blocks are generated by using these and makeBlock().
@@ -407,7 +388,7 @@ class ServerMap : public Map
                Misc. helper functions for fiddling with directory and file
                names when saving
        */
-       void createDirs(std::string path);
+       void createDirs(const std::string &path);
        // returns something like "map/sectors/xxxxxxxx"
        std::string getSectorDir(v2s16 pos, int layout = 2);
        // dirname: final directory name
@@ -433,18 +414,6 @@ class ServerMap : public Map
 
        MapgenParams *getMapgenParams();
 
-       /*void saveChunkMeta();
-       void loadChunkMeta();*/
-
-       // The sector mutex should be locked when calling most of these
-
-       // This only saves sector-specific data such as the heightmap
-       // (no MapBlocks)
-       // DEPRECATED? Sectors have no metadata anymore.
-       void saveSectorMeta(ServerMapSector *sector);
-       MapSector* loadSectorMeta(std::string dirname, bool save_after_load);
-       bool loadSectorMeta(v2s16 p2d);
-
        bool saveBlock(MapBlock *block);
        static bool saveBlock(MapBlock *block, MapDatabase *db);
        // This will generate a sector with getSector if not found.
@@ -499,6 +468,7 @@ class ServerMap : public Map
        */
        bool m_map_metadata_changed = true;
        MapDatabase *dbase = nullptr;
+       MapDatabase *dbase_ro = nullptr;
 };
 
 
@@ -509,7 +479,7 @@ class MMVManip : public VoxelManipulator
 {
 public:
        MMVManip(Map *map);
-       virtual ~MMVManip();
+       virtual ~MMVManip() = default;
 
        virtual void clear()
        {
@@ -534,5 +504,3 @@ class MMVManip : public VoxelManipulator
        */
        std::map<v3s16, u8> m_loaded_blocks;
 };
-
-#endif