From 6a1670dbc31cc0e44178bbd9ad34ff0d5981a060 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 20 Dec 2012 21:19:49 +0400 Subject: Migrate to STL containers/algorithms. --- src/map.cpp | 314 +++++++++++++++++++++++++++--------------------------------- 1 file changed, 141 insertions(+), 173 deletions(-) (limited to 'src/map.cpp') diff --git a/src/map.cpp b/src/map.cpp index 4be094326..2439c7091 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -73,34 +73,30 @@ Map::~Map() /* Free all MapSectors */ - core::map::Iterator i = m_sectors.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map::iterator i = m_sectors.begin(); + i != m_sectors.end(); ++i) { - MapSector *sector = i.getNode()->getValue(); - delete sector; + delete i->second; } } void Map::addEventReceiver(MapEventReceiver *event_receiver) { - m_event_receivers.insert(event_receiver, false); + m_event_receivers.insert(event_receiver); } void Map::removeEventReceiver(MapEventReceiver *event_receiver) { - if(m_event_receivers.find(event_receiver) == NULL) - return; - m_event_receivers.remove(event_receiver); + m_event_receivers.erase(event_receiver); } void Map::dispatchEvent(MapEditEvent *event) { - for(core::map::Iterator - i = m_event_receivers.getIterator(); - i.atEnd()==false; i++) + for(std::set::iterator + i = m_event_receivers.begin(); + i != m_event_receivers.end(); ++i) { - MapEventReceiver* event_receiver = i.getNode()->getKey(); - event_receiver->onMapEditEvent(event); + (*i)->onMapEditEvent(event); } } @@ -111,12 +107,12 @@ MapSector * Map::getSectorNoGenerateNoExNoLock(v2s16 p) return sector; } - core::map::Node *n = m_sectors.find(p); + std::map::iterator n = m_sectors.find(p); - if(n == NULL) + if(n == m_sectors.end()) return NULL; - MapSector *sector = n->getValue(); + MapSector *sector = n->second; // Cache the last result m_sector_cache_p = p; @@ -236,9 +232,9 @@ void Map::setNode(v3s16 p, MapNode & n) values of from_nodes are lighting values. */ void Map::unspreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & light_sources, - core::map & modified_blocks) + std::map & from_nodes, + std::set & light_sources, + std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -256,9 +252,7 @@ void Map::unspreadLight(enum LightBank bank, u32 blockchangecount = 0; - core::map unlighted_nodes; - core::map::Iterator j; - j = from_nodes.getIterator(); + std::map unlighted_nodes; /* Initialize block cache @@ -268,9 +262,10 @@ void Map::unspreadLight(enum LightBank bank, // Cache this a bit, too bool block_checked_in_modified = false; - for(; j.atEnd() == false; j++) + for(std::map::iterator j = from_nodes.begin(); + j != from_nodes.end(); ++j) { - v3s16 pos = j.getNode()->getKey(); + v3s16 pos = j->first; v3s16 blockpos = getNodeBlockPos(pos); // Only fetch a new block if the block position has changed @@ -297,7 +292,7 @@ void Map::unspreadLight(enum LightBank bank, // Get node straight from the block MapNode n = block->getNode(relpos); - u8 oldlight = j.getNode()->getValue(); + u8 oldlight = j->second; // Loop through 6 neighbors for(u16 i=0; i<6; i++) @@ -354,7 +349,7 @@ void Map::unspreadLight(enum LightBank bank, n2.setLight(bank, 0, nodemgr); block->setNode(relpos, n2); - unlighted_nodes.insert(n2pos, current_light); + unlighted_nodes[n2pos] = current_light; changed = true; /* @@ -373,16 +368,16 @@ void Map::unspreadLight(enum LightBank bank, light_sources.remove(n2pos);*/ } else{ - light_sources.insert(n2pos, true); + light_sources.insert(n2pos); } // Add to modified_blocks if(changed == true && block_checked_in_modified == false) { // If the block is not found in modified_blocks, add. - if(modified_blocks.find(blockpos) == NULL) + if(modified_blocks.find(blockpos) == modified_blocks.end()) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } block_checked_in_modified = true; } @@ -408,11 +403,11 @@ void Map::unspreadLight(enum LightBank bank, */ void Map::unLightNeighbors(enum LightBank bank, v3s16 pos, u8 lightwas, - core::map & light_sources, - core::map & modified_blocks) + std::set & light_sources, + std::map & modified_blocks) { - core::map from_nodes; - from_nodes.insert(pos, lightwas); + std::map from_nodes; + from_nodes[pos] = lightwas; unspreadLight(bank, from_nodes, light_sources, modified_blocks); } @@ -422,8 +417,8 @@ void Map::unLightNeighbors(enum LightBank bank, goes on recursively. */ void Map::spreadLight(enum LightBank bank, - core::map & from_nodes, - core::map & modified_blocks) + std::set & from_nodes, + std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -441,9 +436,7 @@ void Map::spreadLight(enum LightBank bank, u32 blockchangecount = 0; - core::map lighted_nodes; - core::map::Iterator j; - j = from_nodes.getIterator(); + std::set lighted_nodes; /* Initialize block cache @@ -453,12 +446,10 @@ void Map::spreadLight(enum LightBank bank, // Cache this a bit, too bool block_checked_in_modified = false; - for(; j.atEnd() == false; j++) - //for(; j != from_nodes.end(); j++) + for(std::set::iterator j = from_nodes.begin(); + j != from_nodes.end(); ++j) { - v3s16 pos = j.getNode()->getKey(); - //v3s16 pos = *j; - //infostream<<"pos=("< undiminish_light(oldlight)) { - lighted_nodes.insert(n2pos, true); - //lighted_nodes.push_back(n2pos); + lighted_nodes.insert(n2pos); changed = true; } /* @@ -539,8 +529,7 @@ void Map::spreadLight(enum LightBank bank, { n2.setLight(bank, newlight, nodemgr); block->setNode(relpos, n2); - lighted_nodes.insert(n2pos, true); - //lighted_nodes.push_back(n2pos); + lighted_nodes.insert(n2pos); changed = true; } } @@ -549,9 +538,9 @@ void Map::spreadLight(enum LightBank bank, if(changed == true && block_checked_in_modified == false) { // If the block is not found in modified_blocks, add. - if(modified_blocks.find(blockpos) == NULL) + if(modified_blocks.find(blockpos) == modified_blocks.end()) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } block_checked_in_modified = true; } @@ -577,10 +566,10 @@ void Map::spreadLight(enum LightBank bank, */ void Map::lightNeighbors(enum LightBank bank, v3s16 pos, - core::map & modified_blocks) + std::map & modified_blocks) { - core::map from_nodes; - from_nodes.insert(pos, true); + std::set from_nodes; + from_nodes.insert(pos); spreadLight(bank, from_nodes, modified_blocks); } @@ -635,7 +624,7 @@ v3s16 Map::getBrightestNeighbour(enum LightBank bank, v3s16 p) Mud is turned into grass in where the sunlight stops. */ s16 Map::propagateSunlight(v3s16 start, - core::map & modified_blocks) + std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -662,7 +651,7 @@ s16 Map::propagateSunlight(v3s16 start, n.setLight(LIGHTBANK_DAY, LIGHT_SUN, nodemgr); block->setNode(relpos, n); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } else { @@ -674,8 +663,8 @@ s16 Map::propagateSunlight(v3s16 start, } void Map::updateLighting(enum LightBank bank, - core::map & a_blocks, - core::map & modified_blocks) + std::map & a_blocks, + std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -688,22 +677,21 @@ void Map::updateLighting(enum LightBank bank, //bool debug=true; //u32 count_was = modified_blocks.size(); - core::map blocks_to_update; + std::map blocks_to_update; - core::map light_sources; + std::set light_sources; - core::map unlight_from; + std::map unlight_from; int num_bottom_invalid = 0; { //TimeTaker t("first stuff"); - core::map::Iterator i; - i = a_blocks.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map::iterator i = a_blocks.begin(); + i != a_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; for(;;) { @@ -713,9 +701,8 @@ void Map::updateLighting(enum LightBank bank, v3s16 pos = block->getPos(); v3s16 posnodes = block->getPosRelative(); - modified_blocks.insert(pos, block); - - blocks_to_update.insert(pos, block); + modified_blocks[pos] = block; + blocks_to_update[pos] = block; /* Clear all light from block @@ -735,7 +722,7 @@ void Map::updateLighting(enum LightBank bank, // If node sources light, add to list u8 source = nodemgr->get(n).light_source; if(source != 0) - light_sources[p + posnodes] = true; + light_sources.insert(p + posnodes); // Collect borders for unlighting if((x==0 || x == MAP_BLOCKSIZE-1 @@ -744,7 +731,7 @@ void Map::updateLighting(enum LightBank bank, && oldlight != 0) { v3s16 p_map = p + posnodes; - unlight_from.insert(p_map, oldlight); + unlight_from[p_map] = oldlight; } } catch(InvalidPositionException &e) @@ -912,8 +899,8 @@ void Map::updateLighting(enum LightBank bank, //m_dout<<"Done ("< & a_blocks, - core::map & modified_blocks) +void Map::updateLighting(std::map & a_blocks, + std::map & modified_blocks) { updateLighting(LIGHTBANK_DAY, a_blocks, modified_blocks); updateLighting(LIGHTBANK_NIGHT, a_blocks, modified_blocks); @@ -921,11 +908,11 @@ void Map::updateLighting(core::map & a_blocks, /* Update information about whether day and night light differ */ - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; block->expireDayNightDiff(); } } @@ -933,7 +920,7 @@ void Map::updateLighting(core::map & a_blocks, /* */ void Map::addNodeAndUpdate(v3s16 p, MapNode n, - core::map &modified_blocks) + std::map &modified_blocks) { INodeDefManager *ndef = m_gamedef->ndef(); @@ -952,7 +939,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, v3s16 bottompos = p + v3s16(0,-1,0); bool node_under_sunlight = true; - core::map light_sources; + std::set light_sources; /* Collect old node for rollback @@ -994,7 +981,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, v3s16 blockpos = getNodeBlockPos(p); MapBlock * block = getBlockNoCreate(blockpos); assert(block != NULL); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; assert(isValidPosition(p)); @@ -1078,12 +1065,11 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, /* Update information about whether day and night light differ */ - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); - block->expireDayNightDiff(); + i->second->expireDayNightDiff(); } /* @@ -1132,7 +1118,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, /* */ void Map::removeNodeAndUpdate(v3s16 p, - core::map &modified_blocks) + std::map &modified_blocks) { INodeDefManager *ndef = m_gamedef->ndef(); @@ -1166,7 +1152,7 @@ void Map::removeNodeAndUpdate(v3s16 p, { } - core::map light_sources; + std::set light_sources; enum LightBank banks[] = { @@ -1214,7 +1200,7 @@ void Map::removeNodeAndUpdate(v3s16 p, v3s16 blockpos = getNodeBlockPos(p); MapBlock * block = getBlockNoCreate(blockpos); assert(block != NULL); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; /* If the removed node was under sunlight, propagate the @@ -1270,12 +1256,11 @@ void Map::removeNodeAndUpdate(v3s16 p, /* Update information about whether day and night light differ */ - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); - block->expireDayNightDiff(); + i->second->expireDayNightDiff(); } /* @@ -1330,15 +1315,15 @@ bool Map::addNodeWithEvent(v3s16 p, MapNode n) bool succeeded = true; try{ - core::map modified_blocks; + std::map modified_blocks; addNodeAndUpdate(p, n, modified_blocks); // Copy modified_blocks to event - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.erase(i->first); } } catch(InvalidPositionException &e){ @@ -1358,15 +1343,15 @@ bool Map::removeNodeWithEvent(v3s16 p) bool succeeded = true; try{ - core::map modified_blocks; + std::map modified_blocks; removeNodeAndUpdate(p, modified_blocks); // Copy modified_blocks to event - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.erase(i->first); } } catch(InvalidPositionException &e){ @@ -1439,33 +1424,31 @@ bool Map::getDayNightDiff(v3s16 blockpos) Updates usage timers */ void Map::timerUpdate(float dtime, float unload_timeout, - core::list *unloaded_blocks) + std::list *unloaded_blocks) { bool save_before_unloading = (mapType() == MAPTYPE_SERVER); // Profile modified reasons Profiler modprofiler; - core::list sector_deletion_queue; + std::list sector_deletion_queue; u32 deleted_blocks_count = 0; u32 saved_blocks_count = 0; u32 block_count_all = 0; - core::map::Iterator si; - beginSave(); - si = m_sectors.getIterator(); - for(; si.atEnd() == false; si++) + for(std::map::iterator si = m_sectors.begin(); + si != m_sectors.end(); ++si) { - MapSector *sector = si.getNode()->getValue(); + MapSector *sector = si->second; bool all_blocks_deleted = true; - core::list blocks; + std::list blocks; sector->getBlocks(blocks); - for(core::list::Iterator i = blocks.begin(); - i != blocks.end(); i++) + for(std::list::iterator i = blocks.begin(); + i != blocks.end(); ++i) { MapBlock *block = (*i); @@ -1501,7 +1484,7 @@ void Map::timerUpdate(float dtime, float unload_timeout, if(all_blocks_deleted) { - sector_deletion_queue.push_back(si.getNode()->getKey()); + sector_deletion_queue.push_back(si->first); } } endSave(); @@ -1526,17 +1509,17 @@ void Map::timerUpdate(float dtime, float unload_timeout, } } -void Map::deleteSectors(core::list &list) +void Map::deleteSectors(std::list &list) { - core::list::Iterator j; - for(j=list.begin(); j!=list.end(); j++) + for(std::list::iterator j = list.begin(); + j != list.end(); ++j) { MapSector *sector = m_sectors[*j]; // If sector is in sector cache, remove it from there if(m_sector_cache == sector) m_sector_cache = NULL; // Remove from map and delete - m_sectors.remove(*j); + m_sectors.erase(*j); delete sector; } } @@ -1642,7 +1625,7 @@ const v3s16 g_7dirs[7] = #define D_TOP 6 #define D_SELF 1 -void Map::transformLiquidsFinite(core::map & modified_blocks) +void Map::transformLiquidsFinite(std::map & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -1663,7 +1646,7 @@ void Map::transformLiquidsFinite(core::map & modified_blocks) UniqueQueue must_reflow, must_reflow_second; // List of MapBlocks that will require a lighting update (due to lava) - core::map lighting_modified_blocks; + std::map lighting_modified_blocks; while(m_transforming_liquid.size() > 0) { @@ -1904,7 +1887,7 @@ void Map::transformLiquidsFinite(core::map & modified_blocks) v3s16 blockpos = getNodeBlockPos(p0); MapBlock *block = getBlockNoCreateNoEx(blockpos); if(block != NULL) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; // If node emits light, MapBlock requires lighting update if(nodemgr->get(n0).light_source != 0) lighting_modified_blocks[block->getPos()] = block; @@ -1925,11 +1908,11 @@ void Map::transformLiquidsFinite(core::map & modified_blocks) updateLighting(lighting_modified_blocks, modified_blocks); } -void Map::transformLiquids(core::map & modified_blocks) +void Map::transformLiquids(std::map & modified_blocks) { if (g_settings->getBool("liquid_finite")) return Map::transformLiquidsFinite(modified_blocks); - + INodeDefManager *nodemgr = m_gamedef->ndef(); DSTACK(__FUNCTION_NAME); @@ -1945,7 +1928,7 @@ void Map::transformLiquids(core::map & modified_blocks) UniqueQueue must_reflow; // List of MapBlocks that will require a lighting update (due to lava) - core::map lighting_modified_blocks; + std::map lighting_modified_blocks; while(m_transforming_liquid.size() != 0) { @@ -2165,7 +2148,7 @@ void Map::transformLiquids(core::map & modified_blocks) v3s16 blockpos = getNodeBlockPos(p0); MapBlock *block = getBlockNoCreateNoEx(blockpos); if(block != NULL) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; // If node emits light, MapBlock requires lighting update if(nodemgr->get(n0).light_source != 0) lighting_modified_blocks[block->getPos()] = block; @@ -2571,7 +2554,7 @@ bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos) } MapBlock* ServerMap::finishBlockMake(BlockMakeData *data, - core::map &changed_blocks) + std::map &changed_blocks) { v3s16 blockpos_min = data->blockpos_min; v3s16 blockpos_max = data->blockpos_max; @@ -2676,10 +2659,10 @@ MapBlock* ServerMap::finishBlockMake(BlockMakeData *data, /* Go through changed blocks */ - for(core::map::Iterator i = changed_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator i = changed_blocks.begin(); + i != changed_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; assert(block); /* Update day/night difference cache of the MapBlocks @@ -2797,7 +2780,7 @@ ServerMapSector * ServerMap::createSector(v2s16 p2d) /* Insert to container */ - m_sectors.insert(p2d, sector); + m_sectors[p2d] = sector; return sector; } @@ -2808,7 +2791,7 @@ ServerMapSector * ServerMap::createSector(v2s16 p2d) */ MapBlock * ServerMap::generateBlock( v3s16 p, - core::map &modified_blocks + std::map &modified_blocks ) { DSTACKF("%s: p=(%d,%d,%d)", __FUNCTION_NAME, p.X, p.Y, p.Z); @@ -3008,7 +2991,7 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) } /*if(allow_generate) { - core::map modified_blocks; + std::map modified_blocks; MapBlock *block = generateBlock(p, modified_blocks); if(block) { @@ -3017,11 +3000,11 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) event.p = p; // Copy modified_blocks to event - for(core::map::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.erase(i->first); } // Queue event @@ -3262,10 +3245,10 @@ void ServerMap::save(ModifiedState save_level) // Don't do anything with sqlite unless something is really saved bool save_started = false; - core::map::Iterator i = m_sectors.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map::iterator i = m_sectors.begin(); + i != m_sectors.end(); ++i) { - ServerMapSector *sector = (ServerMapSector*)i.getNode()->getValue(); + ServerMapSector *sector = (ServerMapSector*)i->second; assert(sector->getId() == MAPSECTOR_SERVER); if(sector->differs_from_disk || save_level == MOD_STATE_CLEAN) @@ -3273,11 +3256,11 @@ void ServerMap::save(ModifiedState save_level) saveSectorMeta(sector); sector_meta_count++; } - core::list blocks; + std::list blocks; sector->getBlocks(blocks); - core::list::Iterator j; - for(j=blocks.begin(); j!=blocks.end(); j++) + for(std::list::iterator j = blocks.begin(); + j != blocks.end(); ++j) { MapBlock *block = *j; @@ -3350,7 +3333,7 @@ v3s16 ServerMap::getIntegerAsBlock(sqlite3_int64 i) return v3s16(x,y,z); } -void ServerMap::listAllLoadableBlocks(core::list &dst) +void ServerMap::listAllLoadableBlocks(std::list &dst) { if(loadFromFolders()){ errorstream<<"Map::listAllLoadableBlocks(): Result will be missing " @@ -3487,7 +3470,7 @@ MapSector* ServerMap::loadSectorMeta(std::string sectordir, bool save_after_load <<" Continuing with a sector with no metadata." <::Node *n; + std::map::iterator n; n = m_loaded_blocks.find(p); - if(n != NULL) + if(n != m_loaded_blocks.end()) continue; bool block_data_inexistent = false; @@ -4017,7 +4000,7 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) if(block_data_inexistent) { flags |= VMANIP_BLOCK_DATA_INEXIST; - + VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); // Fill with VOXELFLAG_INEXISTENT for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) @@ -4033,7 +4016,7 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) flags |= VMANIP_BLOCK_CONTAINS_CIGNORE; }*/ - m_loaded_blocks.insert(p, flags); + m_loaded_blocks[p] = flags; } //infostream<<"emerge done"< & modified_blocks) + (std::map & modified_blocks) { if(m_area.getExtent() == v3s16(0,0,0)) return; @@ -4156,9 +4139,9 @@ void ManualMapVoxelManipulator::initialEmerge( u8 flags = 0; MapBlock *block; v3s16 p(x,y,z); - core::map::Node *n; + std::map::iterator n; n = m_loaded_blocks.find(p); - if(n != NULL) + if(n != m_loaded_blocks.end()) continue; bool block_data_inexistent = false; @@ -4199,12 +4182,12 @@ void ManualMapVoxelManipulator::initialEmerge( flags |= VMANIP_BLOCK_CONTAINS_CIGNORE; }*/ - m_loaded_blocks.insert(p, flags); + m_loaded_blocks[p] = flags; } } void ManualMapVoxelManipulator::blitBackAll( - core::map * modified_blocks) + std::map * modified_blocks) { if(m_area.getExtent() == v3s16(0,0,0)) return; @@ -4212,37 +4195,22 @@ void ManualMapVoxelManipulator::blitBackAll( /* Copy data of all blocks */ - for(core::map::Iterator - i = m_loaded_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_loaded_blocks.begin(); + i != m_loaded_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - u8 flags = i.getNode()->getValue(); - - bool existed = !(flags & VMANIP_BLOCK_DATA_INEXIST); - if(existed == false) - { - // The Great Bug was found using this - /*infostream<<"ManualMapVoxelManipulator::blitBackAll: " - <<"Inexistent ("<first; MapBlock *block = m_map->getBlockNoCreateNoEx(p); - if(block == NULL) + bool existed = !(i->second & VMANIP_BLOCK_DATA_INEXIST); + if(existed == false) { - infostream<<"WARNING: "<<__FUNCTION_NAME - <<": got NULL block " - <<"("<copyFrom(*this); - + if(modified_blocks) - modified_blocks->insert(p, block); + (*modified_blocks)[p] = block; } } -- cgit v1.2.3 From f5ab056b388b856a70bca7a028b58a258532716f Mon Sep 17 00:00:00 2001 From: proller Date: Wed, 13 Mar 2013 01:18:45 +0400 Subject: Liquid fine tuning --- games/minimal/mods/default/mapgen.lua | 23 +++--- minetest.conf.example | 6 +- src/content_mapblock.cpp | 2 +- src/defaultsettings.cpp | 7 +- src/map.cpp | 127 ++++++++++++++++++++++++---------- 5 files changed, 112 insertions(+), 53 deletions(-) (limited to 'src/map.cpp') diff --git a/games/minimal/mods/default/mapgen.lua b/games/minimal/mods/default/mapgen.lua index 115bb1458..74fc398b2 100644 --- a/games/minimal/mods/default/mapgen.lua +++ b/games/minimal/mods/default/mapgen.lua @@ -69,10 +69,19 @@ local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, end minetest.register_on_generated(function(minp, maxp, seed) - generate_ore("default:stone_with_coal", "default:stone", minp, maxp, seed, 1/8/8/8, 5, -31000, 64) - generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+1, 1/16/16/16, 5, -5, 7) - generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+2, 1/12/12/12, 5, -16, -5) - generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+3, 1/9/9/9, 5, -31000, -17) + generate_ore("default:stone_with_coal", "default:stone", minp, maxp, seed, 1/8/8/8, 5, -31000, 64 ) + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+1, 1/16/16/16, 5, -5, 7 ) + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+2, 1/12/12/12, 5, -16, -5 ) + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+3, 1/9/9/9, 5, -31000, -17 ) + + if minetest.setting_getbool("underground_springs") then + generate_ore("default:water_source", "default:stone", minp, maxp, seed+4, 1/24/24/24, 12, -100, -11, 128) + generate_ore("default:water_source", "default:stone", minp, maxp, seed+5, 1/28/28/28, 8, -10000, -101, 128) + generate_ore("default:lava_source", "default:stone", minp, maxp, seed+6, 1/38/38/38, 6, -500, -101, 128) + generate_ore("default:lava_source", "default:stone", minp, maxp, seed+7, 1/30/30/30, 16, -5000, -501, 128) + generate_ore("default:lava_source", "default:stone", minp, maxp, seed+8, 1/24/24/24, 20, -31000, -5001, 128) + end + -- Generate clay if maxp.y >= 2 and minp.y <= 0 then -- Assume X and Z lengths are equal @@ -110,11 +119,5 @@ minetest.register_on_generated(function(minp, maxp, seed) end end end - if minetest.setting_get("liquid_finite") then - generate_ore("default:water_source", "default:stone", minp, maxp, seed+42, 1/24/24/24, 4, -100, -10, 128) - generate_ore("default:water_source", "default:stone", minp, maxp, seed+42, 1/28/28/28, 3, -10000, -101, 128) - generate_ore("default:lava_source", "default:stone", minp, maxp, seed+43, 1/38/38/38, 2, -500, -100, 128) - generate_ore("default:lava_source", "default:stone", minp, maxp, seed+43, 1/30/30/30, 4, -31000, -501, 128) - end end) diff --git a/minetest.conf.example b/minetest.conf.example index daca1616d..41a691b1a 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -95,9 +95,11 @@ # Update liquids every .. recommend for finite: 0.2 #liquid_update = 1.0 # When finite liquid: relax flowing blocks to source if level near max and N nearby source blocks, more realistic, but not true constant. values: 0,1,2,3,4 : 0 - disable, 1 - most aggresive -#liquid_relax = 1 -# optimization: faster cave flood (and not true constant) +#liquid_relax = 2 +# Optimization: faster cave flood (and not true constant) #liquid_fast_flood = 1 +# Underground water and lava springs, its infnity sources if liquid_finite enabled +#underground_springs = 1 # Enable nice leaves; disable for speed #new_style_leaves = true # Enable smooth lighting with simple ambient occlusion; diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 3b001510e..ef447da6b 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -324,7 +324,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, } } if(air_count >= 2) - cornerlevel = -0.5*BS+0.1; + cornerlevel = -0.5*BS+0.2; else if(valid_count > 0) cornerlevel /= valid_count; corner_levels[i] = cornerlevel; diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 3ec0ad9fc..8f878648a 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -203,16 +203,17 @@ void set_default_settings(Settings *settings) settings->setDefault("movement_liquid_fluidity_smooth", "0.5"); settings->setDefault("movement_liquid_sink", "10"); settings->setDefault("movement_gravity", "9.81"); - + //liquid stuff settings->setDefault("liquid_finite", "false"); settings->setDefault("liquid_update", "1.0"); - settings->setDefault("liquid_relax", "1"); + settings->setDefault("liquid_relax", "2"); settings->setDefault("liquid_fast_flood", "1"); + settings->setDefault("underground_springs", "1"); //mapgen stuff settings->setDefault("mg_name", "v6"); - settings->setDefault("water_level", "1"); + settings->setDefault("water_level", "1"); settings->setDefault("chunksize", "5"); settings->setDefault("mg_flags", "trees, caves, v6_biome_blend"); settings->setDefault("mgv6_freq_desert", "0.45"); diff --git a/src/map.cpp b/src/map.cpp index 2439c7091..6103b9017 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1639,19 +1639,16 @@ void Map::transformLiquidsFinite(std::map & modified_blocks) bool fast_flood = g_settings->getS16("liquid_fast_flood"); int water_level = g_settings->getS16("water_level"); - /*if(initial_size != 0) - infostream<<"transformLiquids(): initial_size="< must_reflow, must_reflow_second; // List of MapBlocks that will require a lighting update (due to lava) std::map lighting_modified_blocks; - while(m_transforming_liquid.size() > 0) + while (m_transforming_liquid.size() > 0) { // This should be done here so that it is done when continue is used - if(loopcount >= initial_size || loopcount >= 1000) + if (loopcount >= initial_size || loopcount >= 1000) break; loopcount++; /* @@ -1659,9 +1656,12 @@ void Map::transformLiquidsFinite(std::map & modified_blocks) */ v3s16 p0 = m_transforming_liquid.pop_front(); u16 total_level = 0; - NodeNeighbor neighbors[7]; // surrounding flowing liquid nodes - s8 liquid_levels[7] = {-1, -1, -1, -1, -1, -1, -1}; // current level of every block - s8 liquid_levels_want[7] = {-1, -1, -1, -1, -1, -1, -1}; // target levels + // surrounding flowing liquid nodes + NodeNeighbor neighbors[7]; + // current level of every block + s8 liquid_levels[7] = {-1, -1, -1, -1, -1, -1, -1}; + // target levels + s8 liquid_levels_want[7] = {-1, -1, -1, -1, -1, -1, -1}; s8 can_liquid_same_level = 0; content_t liquid_kind = CONTENT_IGNORE; content_t liquid_kind_flowing = CONTENT_IGNORE; @@ -1696,9 +1696,11 @@ void Map::transformLiquidsFinite(std::map & modified_blocks) } break; case LIQUID_SOURCE: - // if this node is not (yet) of a liquid type, choose the first liquid type we encounter + // if this node is not (yet) of a liquid type, + // choose the first liquid type we encounter if (liquid_kind_flowing == CONTENT_IGNORE) - liquid_kind_flowing = nodemgr->getId(nodemgr->get(nb.n).liquid_alternative_flowing); + liquid_kind_flowing = nodemgr->getId( + nodemgr->get(nb.n).liquid_alternative_flowing); if (liquid_kind == CONTENT_IGNORE) liquid_kind = nb.n.getContent(); if (nb.n.getContent() == liquid_kind) { @@ -1708,37 +1710,55 @@ void Map::transformLiquidsFinite(std::map & modified_blocks) } break; case LIQUID_FLOWING: - // if this node is not (yet) of a liquid type, choose the first liquid type we encounter + // if this node is not (yet) of a liquid type, + // choose the first liquid type we encounter if (liquid_kind_flowing == CONTENT_IGNORE) liquid_kind_flowing = nb.n.getContent(); if (liquid_kind == CONTENT_IGNORE) - liquid_kind = nodemgr->getId(nodemgr->get(nb.n).liquid_alternative_source); + liquid_kind = nodemgr->getId( + nodemgr->get(nb.n).liquid_alternative_source); if (nb.n.getContent() == liquid_kind_flowing) { liquid_levels[i] = (nb.n.param2 & LIQUID_LEVEL_MASK); nb.l = 1; } break; } - if (nb.l && nb.t == NEIGHBOR_SAME_LEVEL) ++can_liquid_same_level; - if (liquid_levels[i] > 0) total_level += liquid_levels[i]; + + if (nb.l && nb.t == NEIGHBOR_SAME_LEVEL) + ++can_liquid_same_level; + if (liquid_levels[i] > 0) + total_level += liquid_levels[i]; /* - infostream << "get node i=" <<(int)i<<" " << PP(npos) << " c="<getBool("liquid_finite")) + return Map::transformLiquidsFinite(modified_blocks); INodeDefManager *nodemgr = m_gamedef->ndef(); -- cgit v1.2.3 From 165498cecfc11f3471d84855f4d019be9b353621 Mon Sep 17 00:00:00 2001 From: proller Date: Wed, 13 Mar 2013 00:41:14 +0400 Subject: initial mapgen indev version with farscale feature and huge caves --- minetest.conf.example | 8 +- src/CMakeLists.txt | 1 + src/defaultsettings.cpp | 6 ++ src/emerge.cpp | 2 + src/map.cpp | 1 + src/mapgen_indev.cpp | 246 ++++++++++++++++++++++++++++++++++++++++++++++++ src/mapgen_indev.h | 135 ++++++++++++++++++++++++++ src/mapgen_v6.cpp | 72 +++++++------- src/mapgen_v6.h | 21 ++++- src/noise.cpp | 1 + src/noise.h | 2 +- src/settings.h | 2 +- 12 files changed, 456 insertions(+), 41 deletions(-) create mode 100644 src/mapgen_indev.cpp create mode 100644 src/mapgen_indev.h (limited to 'src/map.cpp') diff --git a/minetest.conf.example b/minetest.conf.example index 649717ee8..6a227487a 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -308,7 +308,7 @@ # Mapgen stuff # -# Name of map generator to be used. Currently only v6 is supported. +# Name of map generator to be used. Currently v6 and indev are supported. #mg_name = v6 # Water level of map. #water_level = 1 @@ -337,3 +337,9 @@ #mgv7_np_bgroup = 0.5, 0.3125, (350, 350, 350), 5923, 2, 0.6 #mgv7_np_heat = 25, 50, (500, 500, 500), 35293, 1, 0 #mgv7_np_humidity = 50, 31.25, (750, 750, 750), 12094, 2, 0.6 + +# Offset, scale, spread factor, seed offset, number of octaves, persistence, farscale +#mgindev_np_terrain_base = -4, 20, (250.0, 250, 250), 82341, 5, 0.6, 10 +#mgindev_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6, 10 +#mgindev_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 10 +#mgindev_np_mud = 4, 2, (200, 200, 200), 91013, 3, 0.55, 1 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 60e2b1d88..0f8396c02 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -225,6 +225,7 @@ set(common_SRCS emerge.cpp mapgen.cpp mapgen_v6.cpp + mapgen_indev.cpp treegen.cpp dungeongen.cpp content_nodemeta.cpp diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index f7724fa11..b0ae271ce 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -235,5 +235,11 @@ void set_default_settings(Settings *settings) settings->setDefault("mgv7_np_bgroup", "0.5, 0.3125, (350, 350, 350), 5923, 2, 0.6"); settings->setDefault("mgv7_np_heat", "25, 50, (500, 500, 500), 35293, 1, 0"); settings->setDefault("mgv7_np_humidity", "50, 31.25, (750, 750, 750), 12094, 2, 0.6"); + + settings->setDefault("mgindev_np_terrain_base", "-4, 20, (250.0, 250, 250), 82341, 5, 0.6, 10"); + settings->setDefault("mgindev_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6, 10"); + settings->setDefault("mgindev_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 10"); + settings->setDefault("mgindev_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55, 1"); + } diff --git a/src/emerge.cpp b/src/emerge.cpp index 8a060d107..5311c1210 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -39,6 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "biome.h" #include "emerge.h" #include "mapgen_v6.h" +#include "mapgen_indev.h" /////////////////////////////// Emerge Manager //////////////////////////////// @@ -46,6 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc., EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) { //register built-in mapgens registerMapgen("v6", new MapgenFactoryV6()); + registerMapgen("indev", new MapgenFactoryIndev()); this->biomedef = bdef ? bdef : new BiomeDefManager(gamedef); this->params = NULL; diff --git a/src/map.cpp b/src/map.cpp index 6103b9017..3d36675a8 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "rollback_interface.h" #include "emerge.h" #include "mapgen_v6.h" +#include "mapgen_indev.h" #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" diff --git a/src/mapgen_indev.cpp b/src/mapgen_indev.cpp new file mode 100644 index 000000000..e9ab36ae9 --- /dev/null +++ b/src/mapgen_indev.cpp @@ -0,0 +1,246 @@ +/* +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_indev.h" +#include "constants.h" +#include "log.h" + +/////////////////// Mapgen Indev perlin noise default values + +NoiseIndevParams nparams_indev_def_terrain_base + (-AVERAGE_MUD_AMOUNT, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_terrain_higher + (20.0, 16.0, v3f(500.0, 500.0, 500.0), 85039, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_steepness + (0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7, 1); +NoiseIndevParams nparams_indev_def_mud + (AVERAGE_MUD_AMOUNT, 2.0, v3f(200.0, 200.0, 200.0), 91013, 3, 0.55, 1); + +/////////////////////////////////////////////////////////////////////////////// + +void NoiseIndev::init(NoiseIndevParams *np, int seed, int sx, int sy, int sz) { + Noise::init((NoiseParams*)np, seed, sx, sy, sz); + this->npindev = np; +} + + +NoiseIndev::NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy) : Noise(np, seed, sx, sy) { + init(np, seed, sx, sy, 1); +} + + +NoiseIndev::NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy, int sz) : Noise(np, seed, sx, sy, sz) { + init(np, seed, sx, sy, sz); +} + + +float farscale(float scale, float x, float y, float z) { + return ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 3 - (fabs(x) + fabs(y) + fabs(z)) ) / (MAP_GENERATION_LIMIT * 3) ) * (scale - 1) ); +} + +void NoiseIndev::transformNoiseMapFarScale(float xx, float yy, float zz) { + // more correct use distantion from 0,0,0 via pow, but + is faster + //float farscale = ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 3 - (fabs(xx) + fabs(yy) + fabs(zz)) ) / (MAP_GENERATION_LIMIT * 3) ) * ((npindev)->farscale - 1) ); + // dstream << "TNM rs=" << farscale << " from=" << (npindev)->farscale << " x=" << xx << " y=" << yy <<" z=" << zz << std::endl; + int i = 0; + for (int z = 0; z != sz; z++) { + for (int y = 0; y != sy; y++) { + for (int x = 0; x != sx; x++) { + //result[i] = result[i] * npindev->scale * farscale + npindev->offset; + result[i] = result[i] * npindev->scale * farscale(npindev->farscale,xx,yy,zz) + npindev->offset; + i++; + } + } + } +} + +MapgenIndev::MapgenIndev(int mapgenid, MapgenIndevParams *params) : MapgenV6(mapgenid, params) { + noiseindev_terrain_base = new NoiseIndev(params->npindev_terrain_base, seed, csize.X, csize.Y); + noiseindev_terrain_higher = new NoiseIndev(params->npindev_terrain_higher, seed, csize.X, csize.Y); + noiseindev_steepness = new NoiseIndev(params->npindev_steepness, seed, csize.X, csize.Y); +// noise_height_select = new Noise(params->np_height_select, seed, csize.X, csize.Y); +// noise_trees = new Noise(params->np_trees, seed, csize.X, csize.Y); + noiseindev_mud = new NoiseIndev(params->npindev_mud, seed, csize.X, csize.Y); +// noise_beach = new Noise(params->np_beach, seed, csize.X, csize.Y); +// noise_biome = new Noise(params->np_biome, seed, csize.X, csize.Y); +} + +MapgenIndev::~MapgenIndev() { + delete noiseindev_terrain_base; + delete noiseindev_terrain_higher; + delete noiseindev_steepness; + //delete noise_height_select; + //delete noise_trees; + delete noiseindev_mud; + //delete noise_beach; + //delete noise_biome; +} + + +void MapgenIndev::calculateNoise() { + int x = node_min.X; + int y = node_min.Y; + int z = node_min.Z; + // Need to adjust for the original implementation's +.5 offset... + if (!(flags & MG_FLAT)) { + noiseindev_terrain_base->perlinMap2D( + x + 0.5 * noiseindev_terrain_base->npindev->spread.X, + z + 0.5 * noiseindev_terrain_base->npindev->spread.Z); + noiseindev_terrain_base->transformNoiseMapFarScale(x, y, z); + //noise_terrain_base->transformNoiseMap(); + + noiseindev_terrain_higher->perlinMap2D( + x + 0.5 * noiseindev_terrain_higher->npindev->spread.X, + z + 0.5 * noiseindev_terrain_higher->npindev->spread.Z); + noiseindev_terrain_higher->transformNoiseMapFarScale(x, y, z); + //noise_terrain_higher->transformNoiseMap(); + + noiseindev_steepness->perlinMap2D( + x + 0.5 * noiseindev_steepness->npindev->spread.X, + z + 0.5 * noiseindev_steepness->npindev->spread.Z); + noiseindev_steepness->transformNoiseMapFarScale(x, y, z); + + noise_height_select->perlinMap2D( + x + 0.5 * noise_height_select->np->spread.X, + z + 0.5 * noise_height_select->np->spread.Z); + } + + if (!(flags & MG_FLAT)) { + noiseindev_mud->perlinMap2D( + x + 0.5 * noiseindev_mud->npindev->spread.X, + z + 0.5 * noiseindev_mud->npindev->spread.Z); + noiseindev_mud->transformNoiseMapFarScale(x, y, z); + } + noise_beach->perlinMap2D( + x + 0.2 * noise_beach->np->spread.X, + z + 0.7 * noise_beach->np->spread.Z); + + noise_biome->perlinMap2D( + x + 0.6 * noise_biome->np->spread.X, + z + 0.2 * noise_biome->np->spread.Z); +} + +bool MapgenIndevParams::readParams(Settings *settings) { + freq_desert = settings->getFloat("mgv6_freq_desert"); + freq_beach = settings->getFloat("mgv6_freq_beach"); + + npindev_terrain_base = settings->getNoiseIndevParams("mgindev_np_terrain_base"); + npindev_terrain_higher = settings->getNoiseIndevParams("mgindev_np_terrain_higher"); + npindev_steepness = settings->getNoiseIndevParams("mgindev_np_steepness"); + np_height_select = settings->getNoiseParams("mgv6_np_height_select"); + np_trees = settings->getNoiseParams("mgv6_np_trees"); + npindev_mud = settings->getNoiseIndevParams("mgindev_np_mud"); + np_beach = settings->getNoiseParams("mgv6_np_beach"); + np_biome = settings->getNoiseParams("mgv6_np_biome"); + np_cave = settings->getNoiseParams("mgv6_np_cave"); + + bool success = + npindev_terrain_base && npindev_terrain_higher && npindev_steepness && + np_height_select && np_trees && npindev_mud && + np_beach && np_biome && np_cave; + return success; +} + + +void MapgenIndevParams::writeParams(Settings *settings) { + settings->setFloat("mgv6_freq_desert", freq_desert); + settings->setFloat("mgv6_freq_beach", freq_beach); + + settings->setNoiseIndevParams("mgindev_np_terrain_base", npindev_terrain_base); + settings->setNoiseIndevParams("mgindev_np_terrain_higher", npindev_terrain_higher); + settings->setNoiseIndevParams("mgindev_np_steepness", npindev_steepness); + settings->setNoiseParams("mgv6_np_height_select", np_height_select); + settings->setNoiseParams("mgv6_np_trees", np_trees); + settings->setNoiseIndevParams("mgindev_np_mud", npindev_mud); + settings->setNoiseParams("mgv6_np_beach", np_beach); + settings->setNoiseParams("mgv6_np_biome", np_biome); + settings->setNoiseParams("mgv6_np_cave", np_cave); +} + + +float MapgenIndev::baseTerrainLevelFromNoise(v2s16 p) { + if (flags & MG_FLAT) + return water_level; + + float terrain_base = NoisePerlin2DPosOffset(noiseindev_terrain_base->npindev, + p.X, 0.5, p.Y, 0.5, seed); + float terrain_higher = NoisePerlin2DPosOffset(noiseindev_terrain_higher->npindev, + p.X, 0.5, p.Y, 0.5, seed); + float steepness = NoisePerlin2DPosOffset(noiseindev_steepness->npindev, + p.X, 0.5, p.Y, 0.5, seed); + float height_select = NoisePerlin2DNoTxfmPosOffset(noise_height_select->np, + p.X, 0.5, p.Y, 0.5, seed); + + return baseTerrainLevel(terrain_base, terrain_higher, + steepness, height_select); +} + +float MapgenIndev::baseTerrainLevelFromMap(int index) { + if (flags & MG_FLAT) + return water_level; + + float terrain_base = noiseindev_terrain_base->result[index]; + float terrain_higher = noiseindev_terrain_higher->result[index]; + float steepness = noiseindev_steepness->result[index]; + float height_select = noise_height_select->result[index]; + + return baseTerrainLevel(terrain_base, terrain_higher, + steepness, height_select); +} + +float MapgenIndev::getMudAmount(int index) +{ + if (flags & MG_FLAT) + return AVERAGE_MUD_AMOUNT; + + /*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin( + 0.5+(float)p.X/200, 0.5+(float)p.Y/200, + seed+91013, 3, 0.55));*/ + + return noiseindev_mud->result[index]; +} + +void MapgenIndev::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { + cave.min_tunnel_diameter = 2; + cave.max_tunnel_diameter = ps.range(2,6); + cave.dswitchint = ps.range(1,14); + //cave.tunnel_routepoints = 0; + //cave.part_max_length_rs = 0; + cave.flooded = large_cave && ps.range(0,4); + if(large_cave){ + cave.part_max_length_rs = ps.range(2,4); +//dstream<<"try:"< + +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 MAPGENINDEV_HEADER +#define MAPGENINDEV_HEADER + +#include "mapgen.h" +#include "mapgen_v6.h" + +float farscale(float scale, float x, float y, float z); + +struct NoiseIndevParams : public NoiseParams { + float farscale; + + NoiseIndevParams(){} + NoiseIndevParams(float offset_, float scale_, v3f spread_, int seed_, int octaves_, float persist_, float farscale_) + //:NoiseParams(offset_, scale_, spread_, seed_, octaves_, persist_) + { + //NoiseParams(float offset_, float scale_, v3f spread_, int seed_, int octaves_, float persist_) { + offset = offset_; + scale = scale_; + spread = spread_; + seed = seed_; + octaves = octaves_; + persist = persist_; + //} + farscale = farscale_; + } + +}; + +#define getNoiseIndevParams(x) getStruct((x), "f,f,v3,s32,s32,f,f") +#define setNoiseIndevParams(x, y) setStruct((x), "f,f,v3,s32,s32,f,f", (y)) + +class NoiseIndev : public Noise { + public: + NoiseIndevParams *npindev; + + //NoiseIndev() {}; + NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy); + NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy, int sz); + void init(NoiseIndevParams *np, int seed, int sx, int sy, int sz); + void transformNoiseMapFarScale(float xx = 0, float yy = 0, float zz = 0); +}; + +extern NoiseIndevParams nparams_indev_def_terrain_base; +extern NoiseIndevParams nparams_indev_def_terrain_higher; +extern NoiseIndevParams nparams_indev_def_steepness; +//extern NoiseIndevParams nparams_indev_def_height_select; +//extern NoiseIndevParams nparams_indev_def_trees; +extern NoiseIndevParams nparams_indev_def_mud; +//extern NoiseIndevParams nparams_indev_def_beach; +//extern NoiseIndevParams nparams_indev_def_biome; +//extern NoiseIndevParams nparams_indev_def_cave; + + +struct MapgenIndevParams : public MapgenV6Params { + NoiseIndevParams *npindev_terrain_base; + NoiseIndevParams *npindev_terrain_higher; + NoiseIndevParams *npindev_steepness; + //NoiseParams *np_height_select; + //NoiseParams *np_trees; + NoiseIndevParams *npindev_mud; + //NoiseParams *np_beach; + //NoiseParams *np_biome; + //NoiseParams *np_cave; + + MapgenIndevParams() { + //freq_desert = 0.45; + //freq_beach = 0.15; + npindev_terrain_base = &nparams_indev_def_terrain_base; + npindev_terrain_higher = &nparams_indev_def_terrain_higher; + npindev_steepness = &nparams_indev_def_steepness; + //np_height_select = &nparams_v6_def_height_select; + //np_trees = &nparams_v6_def_trees; + npindev_mud = &nparams_indev_def_mud; + //np_beach = &nparams_v6_def_beach; + //np_biome = &nparams_v6_def_biome; + //np_cave = &nparams_v6_def_cave; + } + + bool readParams(Settings *settings); + void writeParams(Settings *settings); +}; + +class MapgenIndev : public MapgenV6 { + public: + NoiseIndev *noiseindev_terrain_base; + NoiseIndev *noiseindev_terrain_higher; + NoiseIndev *noiseindev_steepness; + //NoiseIndev *noise_height_select; + //NoiseIndev *noise_trees; + NoiseIndev *noiseindev_mud; + //NoiseIndev *noise_beach; + //NoiseIndev *noise_biome; + //NoiseIndevParams *np_cave; + + MapgenIndev(int mapgenid, MapgenIndevParams *params); + ~MapgenIndev(); + void calculateNoise(); + + float baseTerrainLevelFromNoise(v2s16 p); + float baseTerrainLevelFromMap(int index); + float getMudAmount(int index); + void defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave); +}; + +struct MapgenFactoryIndev : public MapgenFactoryV6 { + Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) { + return new MapgenIndev(mgid, (MapgenIndevParams *)params); + }; + + MapgenParams *createMapgenParams() { + return new MapgenIndevParams(); + }; +}; + + +#endif diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index dca4e5353..91947df84 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -878,6 +878,24 @@ void MapgenV6::growGrass() { } } +void MapgenV6::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { + cave.min_tunnel_diameter = 2; + cave.max_tunnel_diameter = ps.range(2,6); + cave.dswitchint = ps.range(1,14); + //cave.tunnel_routepoints = 0; + //cave.part_max_length_rs = 0; + cave.flooded = large_cave && ps.range(0,4); + if(large_cave){ + cave.part_max_length_rs = ps.range(2,4); + cave.tunnel_routepoints = ps.range(5, ps.range(15,30)); + cave.min_tunnel_diameter = 5; + cave.max_tunnel_diameter = ps.range(7, ps.range(8,24)); + } else { + cave.part_max_length_rs = ps.range(2,9); + cave.tunnel_routepoints = ps.range(10, ps.range(15,30)); + } + cave.large_cave_is_flat = (ps.range(0,1) == 0); +}; void MapgenV6::generateCaves(int max_stone_y) { // 24ms @cs=8 @@ -911,21 +929,9 @@ void MapgenV6::generateCaves(int max_stone_y) { break;*/ bool large_cave = (jj >= caves_count); - s16 min_tunnel_diameter = 2; - s16 max_tunnel_diameter = ps.range(2,6); - int dswitchint = ps.range(1,14); - u16 tunnel_routepoints = 0; - int part_max_length_rs = 0; - if(large_cave){ - part_max_length_rs = ps.range(2,4); - tunnel_routepoints = ps.range(5, ps.range(15,30)); - min_tunnel_diameter = 5; - max_tunnel_diameter = ps.range(7, ps.range(8,24)); - } else { - part_max_length_rs = ps.range(2,9); - tunnel_routepoints = ps.range(10, ps.range(15,30)); - } - bool large_cave_is_flat = (ps.range(0,1) == 0); + + Cave cave; + defineCave(cave, ps, node_min, large_cave); v3f main_direction(0,0,0); @@ -938,13 +944,13 @@ void MapgenV6::generateCaves(int max_stone_y) { // Allow a bit more //(this should be more than the maximum radius of the tunnel) s16 insure = 10; - s16 more = max_spread_amount - max_tunnel_diameter / 2 - insure; + s16 more = max_spread_amount - cave.max_tunnel_diameter / 2 - insure; ar += v3s16(1,0,1) * more * 2; of -= v3s16(1,0,1) * more; s16 route_y_min = 0; // Allow half a diameter + 7 over stone surface - s16 route_y_max = -of.Y + max_stone_y + max_tunnel_diameter/2 + 7; + s16 route_y_max = -of.Y + max_stone_y + cave.max_tunnel_diameter/2 + 7; // Limit maximum to area route_y_max = rangelim(route_y_max, 0, ar.Y-1); @@ -954,10 +960,10 @@ void MapgenV6::generateCaves(int max_stone_y) { s16 min = 0; if(node_min.Y < water_level && node_max.Y > water_level) { - min = water_level - max_tunnel_diameter/3 - of.Y; - route_y_max = water_level + max_tunnel_diameter/3 - of.Y; + min = water_level - cave.max_tunnel_diameter/3 - of.Y; + route_y_max = water_level + cave.max_tunnel_diameter/3 - of.Y; } - route_y_min = ps.range(min, min + max_tunnel_diameter); + route_y_min = ps.range(min, min + cave.max_tunnel_diameter); route_y_min = rangelim(route_y_min, 0, route_y_max); } @@ -985,9 +991,9 @@ void MapgenV6::generateCaves(int max_stone_y) { Generate some tunnel starting from orp */ - for(u16 j=0; j 7 && abs(y0) >= rs/3) continue; @@ -1109,13 +1115,13 @@ void MapgenV6::generateCaves(int max_stone_y) { u32 i = vm->m_area.index(p); if(large_cave) { - if (full_node_min.Y < water_level && + if (cave.flooded && full_node_min.Y < water_level && full_node_max.Y > water_level) { if (p.Y <= water_level) vm->m_data[i] = waternode; else vm->m_data[i] = airnode; - } else if (full_node_max.Y < water_level) { + } else if (cave.flooded && full_node_max.Y < water_level) { if (p.Y < startp.Y - 2) vm->m_data[i] = lavanode; else diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 89d72300a..34de7c0ed 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -43,6 +43,16 @@ extern NoiseParams nparams_v6_def_humidity; extern NoiseParams nparams_v6_def_trees; extern NoiseParams nparams_v6_def_apple_trees; +struct Cave { + s16 min_tunnel_diameter; + s16 max_tunnel_diameter; + int dswitchint; + u16 tunnel_routepoints; + int part_max_length_rs; + bool large_cave_is_flat; + bool flooded; +}; + struct MapgenV6Params : public MapgenParams { float freq_desert; float freq_beach; @@ -126,9 +136,9 @@ public: float baseTerrainLevel(float terrain_base, float terrain_higher, float steepness, float height_select); - float baseTerrainLevelFromNoise(v2s16 p); - float baseTerrainLevelFromMap(v2s16 p); - float baseTerrainLevelFromMap(int index); + virtual float baseTerrainLevelFromNoise(v2s16 p); + virtual float baseTerrainLevelFromMap(v2s16 p); + virtual float baseTerrainLevelFromMap(int index); s16 find_ground_level(v2s16 p2d); s16 find_stone_level(v2s16 p2d); @@ -139,7 +149,7 @@ public: float getTreeAmount(v2s16 p); bool getHaveAppleTree(v2s16 p); float getMudAmount(v2s16 p); - float getMudAmount(int index); + virtual float getMudAmount(int index); bool getHaveBeach(v2s16 p); bool getHaveBeach(int index); BiomeType getBiome(v2s16 p); @@ -148,13 +158,14 @@ public: u32 get_blockseed(u64 seed, v3s16 p); - void calculateNoise(); + virtual void calculateNoise(); int generateGround(); void addMud(); void flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos); void addDirtGravelBlobs(); void growGrass(); void placeTrees(); + virtual void defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave); void generateCaves(int max_stone_y); }; diff --git a/src/noise.cpp b/src/noise.cpp index 49b5f7e58..ba7c30574 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -524,6 +524,7 @@ float *Noise::perlinMap2D(float x, float y) { for (j = 0; j != sy; j++) { for (i = 0; i != sx; i++) { result[index] += g * buf[index]; +//dstream << "pm2d i="< Date: Sun, 17 Mar 2013 21:09:05 +0400 Subject: Don't erase modified_blocks --- src/map.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/map.cpp') diff --git a/src/map.cpp b/src/map.cpp index 3d36675a8..8d8ce0d28 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1324,7 +1324,7 @@ bool Map::addNodeWithEvent(v3s16 p, MapNode n) i = modified_blocks.begin(); i != modified_blocks.end(); ++i) { - event.modified_blocks.erase(i->first); + event.modified_blocks.insert(i->first); } } catch(InvalidPositionException &e){ @@ -1352,7 +1352,7 @@ bool Map::removeNodeWithEvent(v3s16 p) i = modified_blocks.begin(); i != modified_blocks.end(); ++i) { - event.modified_blocks.erase(i->first); + event.modified_blocks.insert(i->first); } } catch(InvalidPositionException &e){ @@ -3058,7 +3058,7 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) i = modified_blocks.begin(); i != modified_blocks.end(); ++i) { - event.modified_blocks.erase(i->first); + event.modified_blocks.insert(i->first); } // Queue event -- cgit v1.2.3 From 8f0d29f9316b3044c395ab03755273579f746400 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Mon, 18 Mar 2013 22:18:42 -0400 Subject: Fix Map::initBlockMake to actually use chunksize setting --- src/map.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'src/map.cpp') diff --git a/src/map.cpp b/src/map.cpp index 8d8ce0d28..5d6b79fb0 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2497,19 +2497,15 @@ bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos) bool enable_mapgen_debug_info = m_emerge->mapgen_debug_info; EMERGE_DBG_OUT("initBlockMake(): " PP(blockpos) " - " PP(blockpos)); - //s16 chunksize = 3; - //v3s16 chunk_offset(-1,-1,-1); - //s16 chunksize = 4; - //v3s16 chunk_offset(-1,-1,-1); - s16 chunksize = 5; - v3s16 chunk_offset(-2,-2,-2); + s16 chunksize = m_mgparams->chunksize; + s16 coffset = -chunksize / 2; + v3s16 chunk_offset(coffset, coffset, coffset); v3s16 blockpos_div = getContainerPos(blockpos - chunk_offset, chunksize); v3s16 blockpos_min = blockpos_div * chunksize; v3s16 blockpos_max = blockpos_div * chunksize + v3s16(1,1,1)*(chunksize-1); blockpos_min += chunk_offset; blockpos_max += chunk_offset; - //v3s16 extra_borders(1,1,1); v3s16 extra_borders(1,1,1); // Do nothing if not inside limits (+-1 because of neighbors) -- cgit v1.2.3