From 34b185e95511983d0eb9f3e9b5c651f1eacf4561 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Fri, 22 Mar 2013 19:16:51 +0200 Subject: [PATCH] Add singlenode mapgen; generates solely the node 'mapgen_singlenode', defaults to air --- minetest.conf.example | 2 +- src/CMakeLists.txt | 1 + src/emerge.cpp | 2 + src/mapgen_singlenode.cpp | 96 +++++++++++++++++++++++++++++++++++++++ src/mapgen_singlenode.h | 53 +++++++++++++++++++++ 5 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 src/mapgen_singlenode.cpp create mode 100644 src/mapgen_singlenode.h diff --git a/minetest.conf.example b/minetest.conf.example index 331d3c23..5401f6aa 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -311,7 +311,7 @@ # Mapgen stuff # -# Name of map generator to be used. Currently v6 and indev are supported. +# Name of map generator to be used. Currently v6, indev and singlenode are supported. #mg_name = v6 # Water level of map. #water_level = 1 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d91248cb..8c2890f7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -227,6 +227,7 @@ set(common_SRCS mapgen.cpp mapgen_v6.cpp mapgen_indev.cpp + mapgen_singlenode.cpp treegen.cpp dungeongen.cpp content_nodemeta.cpp diff --git a/src/emerge.cpp b/src/emerge.cpp index 5311c121..e4bd997c 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -40,6 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "emerge.h" #include "mapgen_v6.h" #include "mapgen_indev.h" +#include "mapgen_singlenode.h" /////////////////////////////// Emerge Manager //////////////////////////////// @@ -48,6 +49,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) { //register built-in mapgens registerMapgen("v6", new MapgenFactoryV6()); registerMapgen("indev", new MapgenFactoryIndev()); + registerMapgen("singlenode", new MapgenFactorySinglenode()); this->biomedef = bdef ? bdef : new BiomeDefManager(gamedef); this->params = NULL; diff --git a/src/mapgen_singlenode.cpp b/src/mapgen_singlenode.cpp new file mode 100644 index 00000000..04bf02bd --- /dev/null +++ b/src/mapgen_singlenode.cpp @@ -0,0 +1,96 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola + +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. +*/ + +#include "mapgen_singlenode.h" +#include "voxel.h" +#include "mapblock.h" +#include "mapnode.h" +#include "map.h" +#include "nodedef.h" +#include "voxelalgorithms.h" +#include "profiler.h" +#include "settings.h" // For g_settings +#include "main.h" // For g_profiler +#include "emerge.h" + +//////////////////////// Mapgen Singlenode parameter read/write + +bool MapgenSinglenodeParams::readParams(Settings *settings) { + return true; +} + + +void MapgenSinglenodeParams::writeParams(Settings *settings) { +} + +/////////////////////////////////////////////////////////////////////////////// + +MapgenSinglenode::MapgenSinglenode(int mapgenid, MapgenSinglenodeParams *params) { +} + + +MapgenSinglenode::~MapgenSinglenode() { +} + +//////////////////////// Map generator + +void MapgenSinglenode::makeChunk(BlockMakeData *data) { + assert(data->vmanip); + assert(data->nodedef); + assert(data->blockpos_requested.X >= data->blockpos_min.X && + data->blockpos_requested.Y >= data->blockpos_min.Y && + data->blockpos_requested.Z >= data->blockpos_min.Z); + assert(data->blockpos_requested.X <= data->blockpos_max.X && + data->blockpos_requested.Y <= data->blockpos_max.Y && + data->blockpos_requested.Z <= data->blockpos_max.Z); + + this->generating = true; + this->vm = data->vmanip; + this->ndef = data->nodedef; + + v3s16 blockpos_min = data->blockpos_min; + v3s16 blockpos_max = data->blockpos_max; + + // Area of central chunk + v3s16 node_min = blockpos_min*MAP_BLOCKSIZE; + v3s16 node_max = (blockpos_max+v3s16(1,1,1))*MAP_BLOCKSIZE-v3s16(1,1,1); + + content_t c_node = ndef->getId("mapgen_singlenode"); + if(c_node == CONTENT_IGNORE) + c_node = CONTENT_AIR; + for(s16 z=node_min.Z; z<=node_max.Z; z++) + for(s16 y=node_min.Y; y<=node_max.Y; y++) + for(s16 x=node_min.X; x<=node_max.X; x++) + { + data->vmanip->setNode(v3s16(x,y,z), MapNode(c_node)); + } + + // Add top and bottom side of water to transforming_liquid queue + updateLiquid(&data->transforming_liquid, node_min, node_max); + + // Calculate lighting + calcLighting(node_min, node_max); + + this->generating = false; +} + +int MapgenSinglenode::getGroundLevelAtPoint(v2s16 p) { + return 0; +} + diff --git a/src/mapgen_singlenode.h b/src/mapgen_singlenode.h new file mode 100644 index 00000000..b86c9a77 --- /dev/null +++ b/src/mapgen_singlenode.h @@ -0,0 +1,53 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola + +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 MAPGEN_SINGLENODE_HEADER +#define MAPGEN_SINGLENODE_HEADER + +#include "mapgen.h" + +struct MapgenSinglenodeParams : public MapgenParams { + + MapgenSinglenodeParams() { + } + + bool readParams(Settings *settings); + void writeParams(Settings *settings); +}; + +class MapgenSinglenode : public Mapgen { +public: + MapgenSinglenode(int mapgenid, MapgenSinglenodeParams *params); + ~MapgenSinglenode(); + + void makeChunk(BlockMakeData *data); + int getGroundLevelAtPoint(v2s16 p); +}; + +struct MapgenFactorySinglenode : public MapgenFactory { + Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) { + return new MapgenSinglenode(mgid, (MapgenSinglenodeParams *)params); + }; + + MapgenParams *createMapgenParams() { + return new MapgenSinglenodeParams(); + }; +}; + +#endif -- 2.30.2