X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapgen.h;h=ee7e8227e98162727cb3d80e025d37e99dea9626;hb=972d17baea81ffe6d508b291ef97207a4822e1da;hp=07202f9a227cca2f7d2dd42d66e484383fe6656c;hpb=b67f37f27ea7d89b2098fa9fcc2533fa1091e695;p=minetest.git diff --git a/src/mapgen.h b/src/mapgen.h index 07202f9a2..ee7e8227e 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -36,7 +36,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MG_LIGHT 0x10 class Settings; -class ManualMapVoxelManipulator; +class MMVManip; class INodeDefManager; extern FlagDesc flagdesc_mapgen[]; @@ -45,7 +45,6 @@ extern FlagDesc flagdesc_gennotify[]; class Biome; class EmergeManager; class MapBlock; -class ManualMapVoxelManipulator; class VoxelManipulator; struct BlockMakeData; class VoxelArea; @@ -96,8 +95,8 @@ class GenerateNotifier { }; struct MapgenSpecificParams { - virtual void readParams(Settings *settings) = 0; - virtual void writeParams(Settings *settings) = 0; + virtual void readParams(const Settings *settings) = 0; + virtual void writeParams(Settings *settings) const = 0; virtual ~MapgenSpecificParams() {} }; @@ -113,17 +112,19 @@ struct MapgenParams { MapgenSpecificParams *sparams; - MapgenParams() - { - mg_name = DEFAULT_MAPGEN; - seed = 0; - water_level = 1; - chunksize = 5; - flags = MG_TREES | MG_CAVES | MG_LIGHT; - sparams = NULL; - np_biome_heat = NoiseParams(50, 50, v3f(500.0, 500.0, 500.0), 5349, 3, 0.5, 2.0); - np_biome_humidity = NoiseParams(50, 50, v3f(500.0, 500.0, 500.0), 842, 3, 0.5, 2.0); - } + MapgenParams() : + mg_name(DEFAULT_MAPGEN), + chunksize(5), + seed(0), + water_level(1), + flags(MG_TREES | MG_CAVES | MG_LIGHT), + np_biome_heat(NoiseParams(50, 50, v3f(500.0, 500.0, 500.0), 5349, 3, 0.5, 2.0)), + np_biome_humidity(NoiseParams(50, 50, v3f(500.0, 500.0, 500.0), 842, 3, 0.5, 2.0)), + sparams(NULL) + {} + + void load(const Settings &settings); + void save(Settings &settings) const; }; class Mapgen { @@ -133,9 +134,11 @@ class Mapgen { u32 flags; bool generating; int id; - ManualMapVoxelManipulator *vm; + + MMVManip *vm; INodeDefManager *ndef; + u32 blockseed; s16 *heightmap; u8 *biomemap; v3s16 csize; @@ -146,13 +149,23 @@ class Mapgen { Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge); virtual ~Mapgen(); + static u32 getBlockSeed(v3s16 p, int seed); + static u32 getBlockSeed2(v3s16 p, int seed); s16 findGroundLevelFull(v2s16 p2d); s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax); void updateHeightmap(v3s16 nmin, v3s16 nmax); void updateLiquid(UniqueQueue *trans_liquid, v3s16 nmin, v3s16 nmax); - void setLighting(v3s16 nmin, v3s16 nmax, u8 light); + + void setLighting(u8 light, v3s16 nmin, v3s16 nmax); void lightSpread(VoxelArea &a, v3s16 p, u8 light); + void calcLighting(v3s16 nmin, v3s16 nmax); + void calcLighting(v3s16 nmin, v3s16 nmax, + v3s16 full_nmin, v3s16 full_nmax); + + void propagateSunlight(v3s16 nmin, v3s16 nmax); + void spreadLight(v3s16 nmin, v3s16 nmax); + void calcLightingOld(v3s16 nmin, v3s16 nmax); virtual void makeChunk(BlockMakeData *data) {} @@ -166,34 +179,69 @@ struct MapgenFactory { virtual ~MapgenFactory() {} }; -class GenElement { +typedef std::map StringMap; +typedef u32 ObjDefHandle; + +#define OBJDEF_INVALID_INDEX ((u32)(-1)) +#define OBJDEF_INVALID_HANDLE 0 +#define OBJDEF_HANDLE_SALT 0x00585e6fu +#define OBJDEF_MAX_ITEMS (1 << 18) +#define OBJDEF_UID_MASK ((1 << 7) - 1) + +enum ObjDefType { + OBJDEF_GENERIC, + OBJDEF_BIOME, + OBJDEF_ORE, + OBJDEF_DECORATION, + OBJDEF_SCHEMATIC, +}; + +class ObjDef { public: - virtual ~GenElement() {} - u32 id; + virtual ~ObjDef() {} + + u32 index; + u32 uid; + ObjDefHandle handle; std::string name; }; -class GenElementManager { +class ObjDefManager { public: - static const char *ELEMENT_TITLE; - static const size_t ELEMENT_LIMIT = -1; + ObjDefManager(IGameDef *gamedef, ObjDefType type); + virtual ~ObjDefManager(); - GenElementManager(IGameDef *gamedef); - virtual ~GenElementManager(); + virtual const char *getObjectTitle() const = 0; - virtual GenElement *create(int type) = 0; - - virtual u32 add(GenElement *elem); - virtual GenElement *get(u32 id); - virtual GenElement *update(u32 id, GenElement *elem); - virtual GenElement *remove(u32 id); virtual void clear(); + virtual ObjDef *getByName(const std::string &name) const; + + //// Add new/get/set object definitions by handle + virtual ObjDefHandle add(ObjDef *obj); + virtual ObjDef *get(ObjDefHandle handle) const; + virtual ObjDef *set(ObjDefHandle handle, ObjDef *obj); + + //// Raw variants that work on indexes + virtual u32 addRaw(ObjDef *obj); + + // It is generally assumed that getRaw() will always return a valid object + // This won't be true if people do odd things such as call setRaw() with NULL + virtual ObjDef *getRaw(u32 index) const; + virtual ObjDef *setRaw(u32 index, ObjDef *obj); + + size_t getNumObjects() const { return m_objects.size(); } + ObjDefType getType() const { return m_objtype; } + INodeDefManager *getNodeDef() const { return m_ndef; } - virtual GenElement *getByName(const std::string &name); + u32 validateHandle(ObjDefHandle handle) const; + static ObjDefHandle createHandle(u32 index, ObjDefType type, u32 uid); + static bool decodeHandle(ObjDefHandle handle, u32 *index, + ObjDefType *type, u32 *uid); protected: INodeDefManager *m_ndef; - std::vector m_elements; + std::vector m_objects; + ObjDefType m_objtype; }; #endif