Skip to content

Commit

Permalink
Resolve some quirks with (wield) item meshes for nodes (#15654)
Browse files Browse the repository at this point in the history
  • Loading branch information
sfan5 authored Jan 13, 2025
1 parent 464cc92 commit 636a734
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 176 deletions.
8 changes: 0 additions & 8 deletions src/client/content_mapblock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1781,11 +1781,3 @@ void MapblockMeshGenerator::generate()
drawNode();
}
}

void MapblockMeshGenerator::renderSingle(content_t node, u8 param2)
{
cur_node.p = {0, 0, 0};
cur_node.n = MapNode(node, 0xff, param2);
cur_node.f = &nodedef->get(cur_node.n);
drawNode();
}
1 change: 0 additions & 1 deletion src/client/content_mapblock.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ class MapblockMeshGenerator
public:
MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output);
void generate();
void renderSingle(content_t node, u8 param2 = 0x00);

private:
MeshMakeData *const data;
Expand Down
38 changes: 30 additions & 8 deletions src/client/mapblock_mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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)
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -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++) {
Expand Down
5 changes: 5 additions & 0 deletions src/client/mapblock_mesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ struct MeshMakeData
void fillBlockDataBegin(const v3s16 &blockpos);
void fillBlockData(const v3s16 &bp, MapNode *data);

/*
Prepare block data for rendering a single node located at (0,0,0).
*/
void fillSingleNode(MapNode data, MapNode padding = MapNode(CONTENT_AIR));

/*
Set the (node) position of a crack
*/
Expand Down
Loading

0 comments on commit 636a734

Please sign in to comment.