1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Resolve some quirks with (wield) item meshes for nodes (#15654)

This commit is contained in:
sfan5 2025-01-13 09:39:06 +01:00 committed by GitHub
parent 464cc92521
commit 636a734d78
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 78 additions and 178 deletions

View file

@ -31,7 +31,9 @@ MeshMakeData::MeshMakeData(const NodeDefManager *ndef,
m_side_length(side_length),
m_mesh_grid(mesh_grid),
m_nodedef(ndef)
{}
{
assert(m_side_length > 0);
}
void MeshMakeData::fillBlockDataBegin(const v3s16 &blockpos)
{
@ -55,6 +57,24 @@ void MeshMakeData::fillBlockData(const v3s16 &bp, MapNode *data)
m_vmanip.copyFrom(data, data_area, v3s16(0,0,0), blockpos_nodes, data_size);
}
void MeshMakeData::fillSingleNode(MapNode data, MapNode padding)
{
m_blockpos = {0, 0, 0};
m_vmanip.clear();
// area around 0,0,0 so that this positon has neighbors
const s16 sz = 3;
m_vmanip.addArea({v3s16(-sz), v3s16(sz)});
u32 count = m_vmanip.m_area.getVolume();
for (u32 i = 0; i < count; i++) {
m_vmanip.m_data[i] = padding;
m_vmanip.m_flags[i] &= ~VOXELFLAG_NO_DATA;
}
m_vmanip.setNodeNoEmerge({0, 0, 0}, data);
}
void MeshMakeData::setCrack(int crack_level, v3s16 crack_pos)
{
if (crack_level >= 0)
@ -628,6 +648,7 @@ MapBlockMesh::MapBlockMesh(Client *client, MeshMakeData *data, v3s16 camera_offs
MeshCollector collector(m_bounding_sphere_center, offset);
{
// Generate everything
MapblockMeshGenerator(data, &collector).generate();
}
@ -940,21 +961,22 @@ video::SColor encode_light(u16 light, u8 emissive_light)
u8 get_solid_sides(MeshMakeData *data)
{
std::unordered_map<v3s16, u8> results;
v3s16 blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE;
const NodeDefManager *ndef = data->m_nodedef;
u8 result = 0x3F; // all sides solid;
const u16 side = data->m_side_length;
assert(data->m_vmanip.m_area.contains(blockpos_nodes + v3s16(side - 1)));
for (s16 i = 0; i < data->m_side_length && result != 0; i++)
for (s16 j = 0; j < data->m_side_length && result != 0; j++) {
u8 result = 0x3F; // all sides solid
for (s16 i = 0; i < side && result != 0; i++)
for (s16 j = 0; j < side && result != 0; j++) {
v3s16 positions[6] = {
v3s16(0, i, j),
v3s16(data->m_side_length - 1, i, j),
v3s16(side - 1, i, j),
v3s16(i, 0, j),
v3s16(i, data->m_side_length - 1, j),
v3s16(i, side - 1, j),
v3s16(i, j, 0),
v3s16(i, j, data->m_side_length - 1)
v3s16(i, j, side - 1)
};
for (u8 k = 0; k < 6; k++) {