better grass generation (integration to sunlight propagation algorithms)

master
Perttu Ahola 2010-12-26 14:34:34 +02:00
parent c32da52104
commit 847a4227b8
3 changed files with 90 additions and 29 deletions

View File

@ -570,6 +570,8 @@ v3s16 Map::getBrightestNeighbour(enum LightBank bank, v3s16 p)
Starting point gets sunlight. Starting point gets sunlight.
Returns the lowest y value of where the sunlight went. Returns the lowest y value of where the sunlight went.
Mud is turned into grass in where the sunlight stops.
*/ */
s16 Map::propagateSunlight(v3s16 start, s16 Map::propagateSunlight(v3s16 start,
core::map<v3s16, MapBlock*> & modified_blocks) core::map<v3s16, MapBlock*> & modified_blocks)
@ -599,7 +601,17 @@ s16 Map::propagateSunlight(v3s16 start,
modified_blocks.insert(blockpos, block); modified_blocks.insert(blockpos, block);
} }
else{ else
{
// Turn mud into grass
if(n.d == CONTENT_MUD)
{
n.d = CONTENT_GRASS;
block->setNode(relpos, n);
modified_blocks.insert(blockpos, block);
}
// Sunlight goes no further
break; break;
} }
} }
@ -1912,10 +1924,6 @@ continue_generating:
} }
} }
// This is the basic material of what the visible flat ground
// will consist of
u8 material = CONTENT_GRASS;
u8 water_material = CONTENT_WATER; u8 water_material = CONTENT_WATER;
if(g_settings.getBool("endless_water")) if(g_settings.getBool("endless_water"))
water_material = CONTENT_OCEAN; water_material = CONTENT_OCEAN;
@ -1981,7 +1989,66 @@ continue_generating:
Calculate material Calculate material
*/ */
// If node is over heightmap y, it's air or water
if(real_y > surface_y)
{
// If under water level, it's water
if(real_y < WATER_LEVEL)
{
n.d = water_material;
n.setLight(LIGHTBANK_DAY,
diminish_light(LIGHT_SUN, WATER_LEVEL-real_y+1));
}
// else air
else
n.d = CONTENT_AIR;
}
// Else it's ground or dungeons (air)
else
{
// Create dungeons
if(underground_emptiness[
ued*ued*(z0*ued/MAP_BLOCKSIZE)
+ued*(y0*ued/MAP_BLOCKSIZE)
+(x0*ued/MAP_BLOCKSIZE)])
{
n.d = CONTENT_AIR;
}
else
{
// If it's surface_depth under ground, it's stone
if(real_y <= surface_y - surface_depth) if(real_y <= surface_y - surface_depth)
{
n.d = CONTENT_STONE;
}
else
{
// It is mud if it is under the first ground
// level or under water
if(real_y < WATER_LEVEL || real_y <= surface_y - 1)
{
n.d = CONTENT_MUD;
}
else
{
n.d = CONTENT_GRASS;
}
//n.d = CONTENT_MUD;
/*// If under water level, it's mud
if(real_y < WATER_LEVEL)
n.d = CONTENT_MUD;
// Only the topmost node is grass
else if(real_y <= surface_y - 1)
n.d = CONTENT_MUD;
else
n.d = CONTENT_GRASS;*/
}
}
}
#if 0
else if(real_y <= surface_y - surface_depth)
{ {
// Create dungeons // Create dungeons
if(underground_emptiness[ if(underground_emptiness[
@ -2009,19 +2076,7 @@ continue_generating:
else else
n.d = material; n.d = material;
} }
// If node is over heightmap y #endif
else{
// If under water level, it's water
if(real_y < WATER_LEVEL)
{
n.d = water_material;
n.setLight(LIGHTBANK_DAY,
diminish_light(LIGHT_SUN, WATER_LEVEL-real_y+1));
}
// else air
else
n.d = CONTENT_AIR;
}
block->setNode(v3s16(x0,y0,z0), n); block->setNode(v3s16(x0,y0,z0), n);
} }
} }

View File

@ -860,7 +860,9 @@ void MapBlock::updateMesh(u32 daynight_ratio)
is_underground is set. is_underground is set.
At the moment, all sunlighted nodes are added to light_sources. At the moment, all sunlighted nodes are added to light_sources.
TODO: This could be optimized. - SUGG: This could be optimized
Turns sunglighted mud into grass.
*/ */
bool MapBlock::propagateSunlight(core::map<v3s16, bool> & light_sources) bool MapBlock::propagateSunlight(core::map<v3s16, bool> & light_sources)
{ {
@ -880,10 +882,6 @@ bool MapBlock::propagateSunlight(core::map<v3s16, bool> & light_sources)
MapNode n = getNodeParent(v3s16(x, MAP_BLOCKSIZE, z)); MapNode n = getNodeParent(v3s16(x, MAP_BLOCKSIZE, z));
if(n.getLight(LIGHTBANK_DAY) != LIGHT_SUN) if(n.getLight(LIGHTBANK_DAY) != LIGHT_SUN)
{ {
/*if(is_underground)
{
no_sunlight = true;
}*/
no_sunlight = true; no_sunlight = true;
} }
} }
@ -891,15 +889,14 @@ bool MapBlock::propagateSunlight(core::map<v3s16, bool> & light_sources)
{ {
no_top_block = true; no_top_block = true;
// TODO: This makes over-ground roofed places sunlighted // NOTE: This makes over-ground roofed places sunlighted
// Assume sunlight, unless is_underground==true // Assume sunlight, unless is_underground==true
if(is_underground) if(is_underground)
{ {
no_sunlight = true; no_sunlight = true;
} }
// TODO: There has to be some way to allow this behaviour // NOTE: As of now, it just would make everything dark.
// As of now, it just makes everything dark.
// No sunlight here // No sunlight here
//no_sunlight = true; //no_sunlight = true;
} }
@ -928,7 +925,15 @@ bool MapBlock::propagateSunlight(core::map<v3s16, bool> & light_sources)
light_sources.insert(pos_relative + pos, true); light_sources.insert(pos_relative + pos, true);
} }
else{ else
{
// Turn mud into grass
if(n.d == CONTENT_MUD)
{
n.d = CONTENT_GRASS;
}
// Sunlight goes no further
break; break;
} }
} }

View File

@ -311,6 +311,7 @@ public:
void updateMeshes(s32 first_i=0);*/ void updateMeshes(s32 first_i=0);*/
#endif // !SERVER #endif // !SERVER
// See comments in mapblock.cpp
bool propagateSunlight(core::map<v3s16, bool> & light_sources); bool propagateSunlight(core::map<v3s16, bool> & light_sources);
// Copies data to VoxelManipulator to getPosRelative() // Copies data to VoxelManipulator to getPosRelative()