Fix dark liquids (#6621)

* Update light storage format
This commit is contained in:
Vitaliy 2017-11-18 12:57:22 +03:00 committed by Loïc Blot
parent 24c1c2fd0f
commit 0780ee51c5
2 changed files with 33 additions and 23 deletions

@ -103,7 +103,7 @@ void MapblockMeshGenerator::getTile(v3s16 direction, TileSpec *tile)
void MapblockMeshGenerator::getSpecialTile(int index, TileSpec *tile, bool apply_crack) void MapblockMeshGenerator::getSpecialTile(int index, TileSpec *tile, bool apply_crack)
{ {
*tile = f->special_tiles[index]; *tile = f->special_tiles[index];
TileLayer *top_layer = NULL; TileLayer *top_layer = nullptr;
for (auto &layernum : tile->layers) { for (auto &layernum : tile->layers) {
TileLayer *layer = &layernum; 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 // the faces in the list is up-down-right-left-back-front
// (compatible with ContentFeatures). // (compatible with ContentFeatures).
void MapblockMeshGenerator::drawCuboid(const aabb3f &box, 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 assert(tilecount >= 1 && tilecount <= 6); // pre-condition
@ -281,15 +281,15 @@ void MapblockMeshGenerator::drawCuboid(const aabb3f &box,
void MapblockMeshGenerator::getSmoothLightFrame() void MapblockMeshGenerator::getSmoothLightFrame()
{ {
for (int k = 0; k < 8; ++k) { for (int k = 0; k < 8; ++k) {
u16 light = getSmoothLightTransparent(blockpos_nodes + p, light_dirs[k], data); LightPair light(getSmoothLightTransparent(blockpos_nodes + p, light_dirs[k], data));
frame.lightsA[k] = light & 0xff; frame.lightsA[k] = light.lightA;
frame.lightsB[k] = light >> 8; frame.lightsB[k] = light.lightB;
} }
} }
// Calculates vertex light level // Calculates vertex light level
// vertex_pos - vertex position in the node (coordinates are clamped to [0.0, 1.0] or so) // 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 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); 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]; lightA += dx * dy * dz * frame.lightsA[k];
lightB += dx * dy * dz * frame.lightsB[k]; lightB += dx * dy * dz * frame.lightsB[k];
} }
return return LightPair(lightA, lightB);
core::clamp(core::round32(lightA), 0, 255) |
core::clamp(core::round32(lightB), 0, 255) << 8;
} }
// Calculates vertex color to be used in mapblock mesh // 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 // tile_color - node's tile color
video::SColor MapblockMeshGenerator::blendLightColor(const v3f &vertex_pos) 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); return encode_light(light, f->light_source);
} }
@ -367,7 +365,7 @@ void MapblockMeshGenerator::drawAutoLightedCuboid(aabb3f box, const f32 *txc,
tile_count = 1; tile_count = 1;
} }
if (data->m_smooth_lighting) { if (data->m_smooth_lighting) {
u16 lights[8]; LightPair lights[8];
for (int j = 0; j < 8; ++j) { for (int j = 0; j < 8; ++j) {
v3f d; v3f d;
d.X = (j & 4) ? dx2 : dx1; 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); drawCuboid(box, tiles, tile_count, lights, txc);
} else { } 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 (f->light_source != 0) {
// If this liquid emits light and doesn't contain light, draw // If this liquid emits light and doesn't contain light, draw
// it at what it emits, for an increased effect // it at what it emits, for an increased effect
light = decode_light(f->light_source); u8 e = decode_light(f->light_source);
light = light | (light << 8); light = LightPair(std::max(e, light.lightA), std::max(e, light.lightB));
} else if (nodedef->get(ntop).param_type == CPT_LIGHT) { } else if (nodedef->get(ntop).param_type == CPT_LIGHT) {
// Otherwise, use the light of the node on top if possible // 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); color_liquid_top = encode_light(light, f->light_source);
@ -960,7 +958,7 @@ void MapblockMeshGenerator::drawPlantlikeRootedNode()
getSmoothLightFrame(); getSmoothLightFrame();
} else { } else {
MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + p); MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + p);
light = getInteriorLight(ntop, 1, nodedef); light = LightPair(getInteriorLight(ntop, 1, nodedef));
} }
drawPlantlike(); drawPlantlike();
p.Y--; p.Y--;
@ -1244,7 +1242,7 @@ void MapblockMeshGenerator::drawNodeboxNode()
std::vector<aabb3f> boxes; std::vector<aabb3f> boxes;
n.getNodeBoxes(nodedef, &boxes, neighbors_set); n.getNodeBoxes(nodedef, &boxes, neighbors_set);
for (const auto &box : boxes) for (const auto &box : boxes)
drawAutoLightedCuboid(box, NULL, tiles, 6); drawAutoLightedCuboid(box, nullptr, tiles, 6);
} }
void MapblockMeshGenerator::drawMeshNode() void MapblockMeshGenerator::drawMeshNode()
@ -1330,7 +1328,7 @@ void MapblockMeshGenerator::drawNode()
if (data->m_smooth_lighting) if (data->m_smooth_lighting)
getSmoothLightFrame(); getSmoothLightFrame();
else else
light = getInteriorLight(n, 1, nodedef); light = LightPair(getInteriorLight(n, 1, nodedef));
switch (f->drawtype) { switch (f->drawtype) {
case NDT_FLOWINGLIQUID: drawLiquidNode(); break; case NDT_FLOWINGLIQUID: drawLiquidNode(); break;
case NDT_GLASSLIKE: drawGlasslikeNode(); break; case NDT_GLASSLIKE: drawGlasslikeNode(); break;

@ -25,8 +25,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
struct MeshMakeData; struct MeshMakeData;
struct MeshCollector; struct MeshCollector;
struct LightFrame struct LightPair {
{ u8 lightA;
u8 lightB;
LightPair() = default;
explicit LightPair(u16 value) : lightA(value & 0xff), lightB(value >> 8) {}
LightPair(u8 valueA, u8 valueB) : lightA(valueA), lightB(valueB) {}
LightPair(float valueA, float valueB) :
lightA(core::clamp(core::round32(valueA), 0, 255)),
lightB(core::clamp(core::round32(valueB), 0, 255)) {}
operator u16() const { return lightA | lightB << 8; }
};
struct LightFrame {
f32 lightsA[8]; f32 lightsA[8];
f32 lightsB[8]; f32 lightsB[8];
}; };
@ -49,7 +61,7 @@ public:
v3f origin; v3f origin;
MapNode n; MapNode n;
const ContentFeatures *f; const ContentFeatures *f;
u16 light; LightPair light;
LightFrame frame; LightFrame frame;
video::SColor color; video::SColor color;
TileSpec tile; TileSpec tile;
@ -57,7 +69,7 @@ public:
// lighting // lighting
void getSmoothLightFrame(); void getSmoothLightFrame();
u16 blendLight(const v3f &vertex_pos); LightPair blendLight(const v3f &vertex_pos);
video::SColor blendLightColor(const v3f &vertex_pos); video::SColor blendLightColor(const v3f &vertex_pos);
video::SColor blendLightColor(const v3f &vertex_pos, const v3f &vertex_normal); video::SColor blendLightColor(const v3f &vertex_pos, const v3f &vertex_normal);
@ -73,7 +85,7 @@ public:
// cuboid drawing! // cuboid drawing!
void drawCuboid(const aabb3f &box, TileSpec *tiles, int tilecount, void drawCuboid(const aabb3f &box, TileSpec *tiles, int tilecount,
const u16 *lights , const f32 *txc); const LightPair *lights , const f32 *txc);
void generateCuboidTextureCoords(aabb3f const &box, f32 *coords); void generateCuboidTextureCoords(aabb3f const &box, f32 *coords);
void drawAutoLightedCuboid(aabb3f box, const f32 *txc = NULL, void drawAutoLightedCuboid(aabb3f box, const f32 *txc = NULL,
TileSpec *tiles = NULL, int tile_count = 0); TileSpec *tiles = NULL, int tile_count = 0);