X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapgen.h;h=b0758ba417ba809d0e0f4b724a3f382a302d8ae9;hb=0a0378fecef5c6b4be6d034d8bced2a1568dde81;hp=c3c209ad155b7c7dbea6b84799d0721d8e78fa66;hpb=b9d8e59bbf727fcc1a073bbf27e5d1703b9490ef;p=minetest.git diff --git a/src/mapgen.h b/src/mapgen.h index c3c209ad1..b0758ba41 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -20,74 +20,176 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef MAPGEN_HEADER #define MAPGEN_HEADER -#include "irrlichttypes_extrabloated.h" -#include "util/container.h" // UniqueQueue -#include "gamedef.h" -#include "mapnode.h" #include "noise.h" -#include "settings.h" -//#include "emerge.h" -#include +#include "nodedef.h" +#include "mapnode.h" +#include "util/string.h" +#include "util/container.h" + +#define DEFAULT_MAPGEN "v6" /////////////////// Mapgen flags #define MG_TREES 0x01 #define MG_CAVES 0x02 #define MG_DUNGEONS 0x04 -#define MGV6_FORESTS 0x08 -#define MGV6_BIOME_BLEND 0x10 -#define MG_FLAT 0x20 +#define MG_FLAT 0x08 +#define MG_LIGHT 0x10 + +class Settings; +class MMVManip; +class INodeDefManager; extern FlagDesc flagdesc_mapgen[]; +extern FlagDesc flagdesc_gennotify[]; -class BiomeDefManager; class Biome; class EmergeManager; class MapBlock; -class ManualMapVoxelManipulator; class VoxelManipulator; -class INodeDefManager; -class BlockMakeData; +struct BlockMakeData; +class VoxelArea; +class Map; + +enum MapgenObject { + MGOBJ_VMANIP, + MGOBJ_HEIGHTMAP, + MGOBJ_BIOMEMAP, + MGOBJ_HEATMAP, + MGOBJ_HUMIDMAP, + MGOBJ_GENNOTIFY +}; + +enum GenNotifyType { + GENNOTIFY_DUNGEON, + GENNOTIFY_TEMPLE, + GENNOTIFY_CAVE_BEGIN, + GENNOTIFY_CAVE_END, + GENNOTIFY_LARGECAVE_BEGIN, + GENNOTIFY_LARGECAVE_END, + GENNOTIFY_DECORATION, + NUM_GENNOTIFY_TYPES +}; + +// TODO(hmmmm/paramat): make stone type selection dynamic +enum MgStoneType { + STONE, + DESERT_STONE, + SANDSTONE, +}; + +struct GenNotifyEvent { + GenNotifyType type; + v3s16 pos; + u32 id; +}; + +class GenerateNotifier { +public: + GenerateNotifier(); + GenerateNotifier(u32 notify_on, std::set *notify_on_deco_ids); + + void setNotifyOn(u32 notify_on); + void setNotifyOnDecoIds(std::set *notify_on_deco_ids); + + bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0); + void getEvents(std::map > &event_map, + bool peek_events=false); + +private: + u32 m_notify_on; + std::set *m_notify_on_deco_ids; + std::list m_notify_events; +}; + +struct MapgenSpecificParams { + virtual void readParams(const Settings *settings) = 0; + virtual void writeParams(Settings *settings) const = 0; + virtual ~MapgenSpecificParams() {} +}; struct MapgenParams { std::string mg_name; - int chunksize; + s16 chunksize; u64 seed; - int water_level; + s16 water_level; u32 flags; - MapgenParams() { - mg_name = "v6"; - seed = 0; - water_level = 1; - chunksize = 5; - flags = MG_TREES | MG_CAVES | MGV6_BIOME_BLEND; - } - - virtual bool readParams(Settings *settings) = 0; - virtual void writeParams(Settings *settings) {}; + NoiseParams np_biome_heat; + NoiseParams np_biome_heat_blend; + NoiseParams np_biome_humidity; + NoiseParams np_biome_humidity_blend; + + MapgenSpecificParams *sparams; + + 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(1000.0, 1000.0, 1000.0), 5349, 3, 0.5, 2.0)), + np_biome_heat_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 13, 2, 1.0, 2.0)), + np_biome_humidity(NoiseParams(50, 50, v3f(1000.0, 1000.0, 1000.0), 842, 3, 0.5, 2.0)), + np_biome_humidity_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 90003, 2, 1.0, 2.0)), + sparams(NULL) + {} + + void load(const Settings &settings); + void save(Settings &settings) const; }; class Mapgen { public: int seed; int water_level; + u32 flags; bool generating; int id; - virtual void makeChunk(BlockMakeData *data) {}; - virtual int getGroundLevelAtPoint(v2s16 p) = 0; + MMVManip *vm; + INodeDefManager *ndef; + + u32 blockseed; + s16 *heightmap; + u8 *biomemap; + float *heatmap; + float *humidmap; + v3s16 csize; - //Legacy functions for Farmesh (pending removal) - static bool get_have_beach(u64 seed, v2s16 p2d); - static double tree_amount_2d(u64 seed, v2s16 p); - static s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); + GenerateNotifier gennotify; + + 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(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) {} + virtual int getGroundLevelAtPoint(v2s16 p) { return 0; } }; struct MapgenFactory { virtual Mapgen *createMapgen(int mgid, MapgenParams *params, - EmergeManager *emerge) = 0; - virtual MapgenParams *createMapgenParams() = 0; + EmergeManager *emerge) = 0; + virtual MapgenSpecificParams *createMapgenParams() = 0; + virtual ~MapgenFactory() {} }; #endif -