mirror of
https://github.com/minetest/minetest.git
synced 2024-12-24 15:12:23 +01:00
parent
24c1c2fd0f
commit
0780ee51c5
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user