optimise light calculations a bit

This commit is contained in:
darkrose 2015-06-01 05:03:50 +10:00
parent d201b5b0a5
commit 8442b20744
3 changed files with 22 additions and 17 deletions

View File

@ -732,7 +732,6 @@ static void meshgen_build_nodebox(MeshMakeData *data, v3s16 p, MapNode &n, bool
}
}
/* TODO: calculate faces better, or pass faces as argument */
static void meshgen_rooftri(MeshMakeData *data, MapNode &n, v3s16 p, v3f corners[3], v3f pos, TileSpec &tile, bool selected, s16 rot, v3s16 face)
{
// vertices for top and bottom tri
@ -807,7 +806,6 @@ static void meshgen_rooftri(MeshMakeData *data, MapNode &n, v3s16 p, v3f corners
}
}
/* TODO: calculate faces better, or pass faces as argument */
static void meshgen_leaftri(MeshMakeData *data, MapNode &n, v3s16 p, v3f corners[3], v3f pos, TileSpec &tile, bool selected, s16 rot)
{
// vertices
@ -848,13 +846,9 @@ static void meshgen_leaftri(MeshMakeData *data, MapNode &n, v3s16 p, v3f corners
void meshgen_preset_smooth_lights(MeshMakeData *data, v3s16 p)
{
u8 dl;
u8 nl;
v3s16 pos = data->m_blockpos_nodes+p;
for (u16 i=0; i<8; i++) {
dl = getSmoothLight(pos,corners[i],data->m_vmanip,LIGHTBANK_DAY);
nl = getSmoothLight(pos,corners[i],data->m_vmanip,LIGHTBANK_NIGHT);
smooth_lights[i] = ((nl<<4)&0xF0)|(dl&0x0F);
smooth_lights[i] = getSmoothLight(pos,corners[i],data->m_vmanip);
}
}

View File

@ -299,10 +299,11 @@ v3s16 dirs8[8] = {
};
// Calculate lighting at the given corner of p
u8 getSmoothLight(v3s16 p, v3s16 corner, VoxelManipulator &vmanip, LightBank bank)
u8 getSmoothLight(v3s16 p, v3s16 corner, VoxelManipulator &vmanip)
{
float ambient_occlusion = 0;
float light = 0;
float dl = 0;
float nl = 0;
u16 light_count = 0;
if (corner.X == 1)
@ -317,7 +318,8 @@ u8 getSmoothLight(v3s16 p, v3s16 corner, VoxelManipulator &vmanip, LightBank ban
if (
content_features(n).param_type == CPT_LIGHT
) {
light += n.getLight(bank);
dl += n.getLight(LIGHTBANK_DAY);
nl += n.getLight(LIGHTBANK_NIGHT);
light_count++;
}else if (content_features(n).draw_type == CDT_CUBELIKE) {
ambient_occlusion += 1.0;
@ -329,17 +331,26 @@ u8 getSmoothLight(v3s16 p, v3s16 corner, VoxelManipulator &vmanip, LightBank ban
if (light_count == 0)
return 0;
light /= light_count;
dl /= light_count;
nl /= light_count;
if (ambient_occlusion > 4) {
ambient_occlusion -= 4;
light = light / (ambient_occlusion * 0.4 + 1.0);
ambient_occlusion = (ambient_occlusion-4) * 0.4 + 1.0;
dl /= ambient_occlusion;
nl /= ambient_occlusion;
}
if (light >= LIGHT_SUN)
return LIGHT_SUN;
u8 idl;
u8 inl;
return ceilf(light);
if (dl >= LIGHT_SUN) {
idl = LIGHT_SUN;
}else{
idl = ceilf(dl);
}
inl = ceilf(nl);
return ((inl<<4)&0xF0)|(idl&0x0F);;
}
MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):

View File

@ -38,7 +38,7 @@
// Helper functions
TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 face_dir, NodeModMap &temp_mods, NodeMetadata *meta = NULL);
TileSpec getMetaTile(MapNode mn, v3s16 p, v3s16 face_dir, NodeModMap &temp_mods);
u8 getSmoothLight(v3s16 p, v3s16 corner, VoxelManipulator &vmanip, LightBank bank);
u8 getSmoothLight(v3s16 p, v3s16 corner, VoxelManipulator &vmanip);
class MapBlock;
class Environment;