From c8be58a65ce5f06bc23353b41caf9495e3b9d484 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 28 Feb 2011 02:01:40 +0200 Subject: A third try on terrain generation. No trees yet. --- src/map.cpp | 881 +++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 691 insertions(+), 190 deletions(-) (limited to 'src/map.cpp') diff --git a/src/map.cpp b/src/map.cpp index 8e71212b0..7b16834e2 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1422,6 +1422,9 @@ void Map::transformLiquids(core::map & modified_blocks) while(m_transforming_liquid.size() != 0) { + try + { + /* Get a queued transforming liquid node */ @@ -1680,9 +1683,12 @@ void Map::transformLiquids(core::map & modified_blocks) } loopcount++; - //if(loopcount >= 100000) - if(loopcount >= initial_size * 1) + if(loopcount >= initial_size * 1 || loopcount >= 1000) break; + + }catch(InvalidPositionException &e) + { + } } //dstream<<"Map::transformLiquids(): loopcount="<0, 0->1, 1->0 +double contour(double v) { - // The base ground level - double base = (double)WATER_LEVEL - (double)AVERAGE_MUD_AMOUNT - + 25. * noise2d_perlin( + v = fabs(v); + if(v >= 1.0) + return 0.0; + return (1.0-v); +} + +// -1->0, -r->1, 0->1, r->1, 1->0 +double contour_flat_top(double v, double r) +{ + v = fabs(v); + if(v >= 1.0) + return 0.0; + double rmax = 0.999; + if(r >= rmax) + r = rmax; + if(v <= r) + return 1.0; + v -= r; + return ((1.0-r)-v) / (1.0-r); + //return easeCurve(((1.0-r)-v) / (1.0-r)); +} + +double base_rock_level_2d(u64 seed, v2f p) +{ + // The ground level (return value) + double h = WATER_LEVEL; + + // Raises from 0 when parameter is -1...1 + /*double m2 = contour_flat_top(-0.8 + 2.0 * noise2d_perlin( + 0.0+(float)p.X/1500., 0.0+(float)p.Y/1500., + (seed>>32)+34758, 5, 0.55), 0.10);*/ + /*double m2 = 1.0; + if(m2 > 0.0001) + { + // HUGE mountains + double m1 = 200.0 + 300.0 * noise2d_perlin( + 0.0+(float)p.X/1000., 0.0+(float)p.Y/1000., + (seed>>32)+98525, 8, 0.5); + h += m1 * m2; + //h += 30 * m2; + }*/ + + // Huge mountains + double m3 = 150.0 - 800.0 * noise2d_perlin_abs( + 0.5+(float)p.X/2000., 0.5+(float)p.Y/2000., + (seed>>32)+985251, 9, 0.5); + if(m3 > h) + h = m3; + + /*double tm2 = contour_flat_top(-1.0 + 3.0 * noise2d_perlin( + 0.0+(float)p.X/300., 0.0+(float)p.Y/300., + (seed>>32)+78593, 5, 0.55), 0.15); + h += 30 * tm2;*/ + +#if 1 + { + double a1 = 30 - 100. * noise2d_perlin_abs( + 0.5+(float)p.X/250., 0.5+(float)p.Y/250., + seed+850342, 5, 0.63); + double d = 15; + if(a1 > d) + a1 = d + sqrt(a1-d); + if(a1 > h) + h = a1; + } +#endif + +#if 1 + double base = 35. * noise2d_perlin( 0.5+(float)p.X/500., 0.5+(float)p.Y/500., - (seed>>32)+654879876, 6, 0.6); + (seed>>32)+653876, 7, 0.55); +#else + double base = 0; +#endif - /*// A bit hillier one - double base2 = WATER_LEVEL - 4.0 + 40. * noise2d_perlin( - 0.5+(float)p.X/250., 0.5+(float)p.Y/250., - (seed>>27)+90340, 6, 0.69); - if(base2 > base) - base = base2;*/ #if 1 - // Higher ground level - double higher = (double)WATER_LEVEL + 25. + 45. * noise2d_perlin( + double higher = 50. * noise2d_perlin( 0.5+(float)p.X/250., 0.5+(float)p.Y/250., - seed+85039, 5, 0.69); - //higher = 30; // For debugging - - // Limit higher to at least base - if(higher < base) - higher = base; - - // Steepness factor of cliffs - double b = 1.0 + 1.0 * noise2d_perlin( + seed+39292, 6, 0.63); + /*double higher = 50. * noise2d_perlin_abs( 0.5+(float)p.X/250., 0.5+(float)p.Y/250., - seed-932, 7, 0.7); - b = rangelim(b, 0.0, 1000.0); - b = pow(b, 5); - b *= 7; - b = rangelim(b, 3.0, 1000.0); - //dstream<<"b="< base) + { + // Steepness factor of cliffs + double b = 1.0 + 1.0 * noise2d_perlin( + 0.5+(float)p.X/250., 0.5+(float)p.Y/250., + seed-932, 7, 0.7); + b = rangelim(b, 0.0, 1000.0); + b = pow(b, 5); + b *= 7; + b = rangelim(b, 3.0, 1000.0); + //dstream<<"b="< 0.0) + vmanip.m_data[i].d = CONTENT_STONE; + else + vmanip.m_data[i].d = CONTENT_AIR; +#endif +#if 0 + /*double v1 = 5 * noise3d_perlin( + 0.5+(float)p2df.X/200, + 0.5+(float)y/200, + 0.5+(float)p2df.Y/200, + m_seed+293, 6, 0.55); + + double v2 = 5 * noise3d_perlin( + 0.5+(float)p2df.X/200, + 0.5+(float)y/200, + 0.5+(float)p2df.Y/200, + m_seed+293, 6, 0.55);*/ + + double v1 = 0; + double v2 = 0; + + float surface_y_f = base_rock_level_2d(m_seed, p2df+v2f(v1,v2)); + + if(y <= surface_y_f) + vmanip.m_data[i].d = CONTENT_STONE; + else + vmanip.m_data[i].d = CONTENT_AIR; +#endif + + vmanip.m_area.add_y(em, i, 1); + } + } + +#if 0 + // Node position + v2s16 p2d = sectorpos_bigbase*MAP_BLOCKSIZE + v2s16(x,z); + + /* + Skip if already generated */ { v3s16 p(p2d.X, y_nodes_min, p2d.Y); @@ -2214,6 +2525,7 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, vmanip.m_area.add_y(em, i, 1); } } +#endif } }//timer1 @@ -2235,8 +2547,8 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, /* Loop this part, it will make stuff look older and newer nicely */ - //for(u32 i_age=0; i_age<1; i_age++) - for(u32 i_age=0; i_age<2; i_age++) + u32 age_count = 2; + for(u32 i_age=0; i_age=y_nodes_min; y--) - { - MapNode *n = &vmanip.m_data[i]; - - if(light_propagates_content(n->d) == false) - { - light = 0; - } - else if(light != LIGHT_SUN - || sunlight_propagates_content(n->d) == false) - { - if(light > 0) - light--; - } - - n->setLight(LIGHTBANK_DAY, light); - n->setLight(LIGHTBANK_NIGHT, 0); - - // This doesn't take much time - if(light != 0) - { - // Insert light source - light_sources.insert(v3s16(p2d.X, y, p2d.Y), true); - } - - // Increment index by y - vmanip.m_area.add_y(em, i, -1); - } - } - } -#endif - }//timer1 // Spread light around @@ -3533,6 +3792,7 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, } } +#endif /* Create chunk metadata @@ -3581,6 +3841,9 @@ MapChunk* ServerMap::generateChunk(v2s16 chunkpos1, <<"("<= surface_y_max + d_up + && block_low_y_f > WATER_LEVEL + d_up) + { + //dstream<<"BT_SKY"<