aboutsummaryrefslogtreecommitdiff
path: root/src/content_mapblock.cpp
diff options
context:
space:
mode:
authorVitaliy <silverunicorn2011@yandex.ru>2017-11-18 12:57:22 +0300
committerLoïc Blot <nerzhul@users.noreply.github.com>2017-11-18 10:57:22 +0100
commit0780ee51c50235a462e47f4a4385cefcf1b48330 (patch)
tree04d64e51eca6b879c8e1c772101adc87f6069c8c /src/content_mapblock.cpp
parent24c1c2fd0fa51a8e0e15a1c749c725e598f27834 (diff)
downloadminetest-0780ee51c50235a462e47f4a4385cefcf1b48330.tar.gz
minetest-0780ee51c50235a462e47f4a4385cefcf1b48330.tar.bz2
minetest-0780ee51c50235a462e47f4a4385cefcf1b48330.zip
Fix dark liquids (#6621)
* Update light storage format
Diffstat (limited to 'src/content_mapblock.cpp')
-rw-r--r--src/content_mapblock.cpp34
1 files changed, 16 insertions, 18 deletions
diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index 2b0948b3e..8edccf3de 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -103,7 +103,7 @@ void MapblockMeshGenerator::getTile(v3s16 direction, TileSpec *tile)
void MapblockMeshGenerator::getSpecialTile(int index, TileSpec *tile, bool apply_crack)
{
*tile = f->special_tiles[index];
- TileLayer *top_layer = NULL;
+ TileLayer *top_layer = nullptr;
for (auto &layernum : tile->layers) {
TileLayer *layer = &layernum;
@@ -151,7 +151,7 @@ void MapblockMeshGenerator::drawQuad(v3f *coords, const v3s16 &normal,
// the faces in the list is up-down-right-left-back-front
// (compatible with ContentFeatures).
void MapblockMeshGenerator::drawCuboid(const aabb3f &box,
- TileSpec *tiles, int tilecount, const u16 *lights, const f32 *txc)
+ TileSpec *tiles, int tilecount, const LightPair *lights, const f32 *txc)
{
assert(tilecount >= 1 && tilecount <= 6); // pre-condition
@@ -281,15 +281,15 @@ void MapblockMeshGenerator::drawCuboid(const aabb3f &box,
void MapblockMeshGenerator::getSmoothLightFrame()
{
for (int k = 0; k < 8; ++k) {
- u16 light = getSmoothLightTransparent(blockpos_nodes + p, light_dirs[k], data);
- frame.lightsA[k] = light & 0xff;
- frame.lightsB[k] = light >> 8;
+ LightPair light(getSmoothLightTransparent(blockpos_nodes + p, light_dirs[k], data));
+ frame.lightsA[k] = light.lightA;
+ frame.lightsB[k] = light.lightB;
}
}
// Calculates vertex light level
// vertex_pos - vertex position in the node (coordinates are clamped to [0.0, 1.0] or so)
-u16 MapblockMeshGenerator::blendLight(const v3f &vertex_pos)
+LightPair MapblockMeshGenerator::blendLight(const v3f &vertex_pos)
{
f32 x = core::clamp(vertex_pos.X / BS + 0.5, 0.0 - SMOOTH_LIGHTING_OVERSIZE, 1.0 + SMOOTH_LIGHTING_OVERSIZE);
f32 y = core::clamp(vertex_pos.Y / BS + 0.5, 0.0 - SMOOTH_LIGHTING_OVERSIZE, 1.0 + SMOOTH_LIGHTING_OVERSIZE);
@@ -303,9 +303,7 @@ u16 MapblockMeshGenerator::blendLight(const v3f &vertex_pos)
lightA += dx * dy * dz * frame.lightsA[k];
lightB += dx * dy * dz * frame.lightsB[k];
}
- return
- core::clamp(core::round32(lightA), 0, 255) |
- core::clamp(core::round32(lightB), 0, 255) << 8;
+ return LightPair(lightA, lightB);
}
// Calculates vertex color to be used in mapblock mesh
@@ -313,7 +311,7 @@ u16 MapblockMeshGenerator::blendLight(const v3f &vertex_pos)
// tile_color - node's tile color
video::SColor MapblockMeshGenerator::blendLightColor(const v3f &vertex_pos)
{
- u16 light = blendLight(vertex_pos);
+ LightPair light = blendLight(vertex_pos);
return encode_light(light, f->light_source);
}
@@ -367,7 +365,7 @@ void MapblockMeshGenerator::drawAutoLightedCuboid(aabb3f box, const f32 *txc,
tile_count = 1;
}
if (data->m_smooth_lighting) {
- u16 lights[8];
+ LightPair lights[8];
for (int j = 0; j < 8; ++j) {
v3f d;
d.X = (j & 4) ? dx2 : dx1;
@@ -377,7 +375,7 @@ void MapblockMeshGenerator::drawAutoLightedCuboid(aabb3f box, const f32 *txc,
}
drawCuboid(box, tiles, tile_count, lights, txc);
} else {
- drawCuboid(box, tiles, tile_count, NULL, txc);
+ drawCuboid(box, tiles, tile_count, nullptr, txc);
}
}
@@ -397,11 +395,11 @@ void MapblockMeshGenerator::prepareLiquidNodeDrawing()
if (f->light_source != 0) {
// If this liquid emits light and doesn't contain light, draw
// it at what it emits, for an increased effect
- light = decode_light(f->light_source);
- light = light | (light << 8);
+ u8 e = decode_light(f->light_source);
+ light = LightPair(std::max(e, light.lightA), std::max(e, light.lightB));
} else if (nodedef->get(ntop).param_type == CPT_LIGHT) {
// Otherwise, use the light of the node on top if possible
- light = getInteriorLight(ntop, 0, nodedef);
+ light = LightPair(getInteriorLight(ntop, 0, nodedef));
}
color_liquid_top = encode_light(light, f->light_source);
@@ -960,7 +958,7 @@ void MapblockMeshGenerator::drawPlantlikeRootedNode()
getSmoothLightFrame();
} else {
MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + p);
- light = getInteriorLight(ntop, 1, nodedef);
+ light = LightPair(getInteriorLight(ntop, 1, nodedef));
}
drawPlantlike();
p.Y--;
@@ -1244,7 +1242,7 @@ void MapblockMeshGenerator::drawNodeboxNode()
std::vector<aabb3f> boxes;
n.getNodeBoxes(nodedef, &boxes, neighbors_set);
for (const auto &box : boxes)
- drawAutoLightedCuboid(box, NULL, tiles, 6);
+ drawAutoLightedCuboid(box, nullptr, tiles, 6);
}
void MapblockMeshGenerator::drawMeshNode()
@@ -1330,7 +1328,7 @@ void MapblockMeshGenerator::drawNode()
if (data->m_smooth_lighting)
getSmoothLightFrame();
else
- light = getInteriorLight(n, 1, nodedef);
+ light = LightPair(getInteriorLight(n, 1, nodedef));
switch (f->drawtype) {
case NDT_FLOWINGLIQUID: drawLiquidNode(); break;
case NDT_GLASSLIKE: drawGlasslikeNode(); break;