From 10eedbc1d233da36c244de67fcec555bcea87d5f Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 10 Apr 2011 20:18:34 +0300 Subject: Map generation is now properly threaded and doesn't block block placement and other stuff. --- src/map.cpp | 118 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 64 insertions(+), 54 deletions(-) (limited to 'src/map.cpp') diff --git a/src/map.cpp b/src/map.cpp index 334de40de..8d79ae366 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2170,23 +2170,6 @@ void addRandomObjects(MapBlock *block) This is the main map generation method */ -struct ChunkMakeData -{ - ManualMapVoxelManipulator vmanip; - u64 seed; - s16 y_blocks_min; - s16 y_blocks_max; - v2s16 sectorpos_base; - s16 sectorpos_base_size; - v2s16 sectorpos_bigbase; - s16 sectorpos_bigbase_size; - s16 max_spread_amount; - - ChunkMakeData(): - vmanip(NULL) - {} -}; - void makeChunk(ChunkMakeData *data) { s16 y_nodes_min = data->y_blocks_min * MAP_BLOCKSIZE; @@ -2235,11 +2218,11 @@ void makeChunk(ChunkMakeData *data) /* Skip of already generated */ - { + /*{ v3s16 p(p2d.X, y_nodes_min, p2d.Y); if(data->vmanip.m_data[data->vmanip.m_area.index(p)].d != CONTENT_AIR) continue; - } + }*/ // Ground height at this point float surface_y_f = 0.0; @@ -2270,6 +2253,13 @@ void makeChunk(ChunkMakeData *data) u32 i = data->vmanip.m_area.index(v3s16(p2d.X, y_nodes_min, p2d.Y)); for(s16 y=y_nodes_min; yvmanip.m_data[i].d != CONTENT_AIR) + break; + data->vmanip.m_data[i].d = CONTENT_STONE; data->vmanip.m_area.add_y(em, i, 1); @@ -3426,33 +3416,8 @@ void makeChunk(ChunkMakeData *data) //################################################################### //################################################################### -MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, - core::map &changed_blocks, - bool force) +void ServerMap::initChunkMake(ChunkMakeData &data, v2s16 chunkpos) { - DSTACK(__FUNCTION_NAME); - - /* - Don't generate if already fully generated - */ - if(force == false) - { - MapChunk *chunk = getChunk(chunkpos); - if(chunk != NULL && chunk->getGenLevel() == GENERATED_FULLY) - { - dstream<<"generateChunkRaw(): Chunk " - <<"("< &changed_blocks) +{ /* Blit generated stuff to map */ @@ -3569,14 +3536,14 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, Add random objects to blocks */ { - for(s16 x=0; xsetIsVolatile(false); @@ -3618,6 +3585,48 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, Save changed parts of map */ save(true); + + return chunk; +} + +// NOTE: Deprecated +MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, + core::map &changed_blocks, + bool force) +{ + DSTACK(__FUNCTION_NAME); + + /* + Don't generate if already fully generated + */ + if(force == false) + { + MapChunk *chunk = getChunk(chunkpos); + if(chunk != NULL && chunk->getGenLevel() == GENERATED_FULLY) + { + dstream<<"generateChunkRaw(): Chunk " + <<"("< &changed_blocks) { -- cgit v1.2.3