Skip to content

Commit

Permalink
Optimise MapBlockMesh related functions
Browse files Browse the repository at this point in the history
Directely or indirectly optimises the following functions:

* MapBlockMesh::MapBlockMesh
* MapBlockMesh::getTileInfo
* MapBlockMesh::makeFastFace
* MapBlockMesh::getSmoothLightCombined
  • Loading branch information
gregorycu authored and Zeno- committed Feb 23, 2015
1 parent 3b6480c commit 577701c
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 12 deletions.
26 changes: 17 additions & 9 deletions src/mapblock_mesh.cpp
Expand Up @@ -248,7 +248,7 @@ static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data)

for (u32 i = 0; i < 8; i++)
{
MapNode n = data->m_vmanip.getNodeNoEx(p - dirs8[i]);
const MapNode &n = data->m_vmanip.getNodeRefUnsafeCheckFlags(p - dirs8[i]);

// if it's CONTENT_IGNORE we can't do any light calculations
if (n.getContent() == CONTENT_IGNORE) {
Expand Down Expand Up @@ -438,8 +438,6 @@ struct FastFace
static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
v3f p, v3s16 dir, v3f scale, u8 light_source, std::vector<FastFace> &dest)
{
FastFace face;

// Position is at the center of the cube.
v3f pos = p * BS;

Expand Down Expand Up @@ -590,6 +588,10 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,

u8 alpha = tile.alpha;

dest.push_back(FastFace());

FastFace& face = *dest.rbegin();

face.vertices[0] = video::S3DVertex(vertex_pos[0], normal,
MapBlock_LightColor(alpha, li0, light_source),
core::vector2d<f32>(x0+w*abs_scale, y0+h));
Expand All @@ -604,7 +606,6 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3,
core::vector2d<f32>(x0+w*abs_scale, y0));

face.tile = tile;
dest.push_back(face);
}

/*
Expand Down Expand Up @@ -745,8 +746,8 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data)
static void getTileInfo(
// Input:
MeshMakeData *data,
v3s16 p,
v3s16 face_dir,
const v3s16 &p,
const v3s16 &face_dir,
// Output:
bool &makes_face,
v3s16 &p_corrected,
Expand All @@ -760,14 +761,20 @@ static void getTileInfo(
INodeDefManager *ndef = data->m_gamedef->ndef();
v3s16 blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE;

MapNode n0 = vmanip.getNodeNoEx(blockpos_nodes + p);
MapNode &n0 = vmanip.getNodeRefUnsafe(blockpos_nodes + p);

// Don't even try to get n1 if n0 is already CONTENT_IGNORE
if (n0.getContent() == CONTENT_IGNORE ) {
if (n0.getContent() == CONTENT_IGNORE) {
makes_face = false;
return;
}

const MapNode &n1 = vmanip.getNodeRefUnsafeCheckFlags(blockpos_nodes + p + face_dir);

if (n1.getContent() == CONTENT_IGNORE) {
makes_face = false;
return;
}
MapNode n1 = vmanip.getNodeNoEx(blockpos_nodes + p + face_dir);

// This is hackish
bool equivalent = false;
Expand Down Expand Up @@ -1037,6 +1044,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
//TimeTaker timer1("MapBlockMesh()");

std::vector<FastFace> fastfaces_new;
fastfaces_new.reserve(512);

/*
We are including the faces of the trailing edges of the block.
Expand Down
2 changes: 1 addition & 1 deletion src/mapnode.cpp
Expand Up @@ -104,7 +104,7 @@ u8 MapNode::getLight(enum LightBank bank, INodeDefManager *nodemgr) const
return MYMAX(f.light_source, light);
}

u8 MapNode::getLightNoChecks(enum LightBank bank, const ContentFeatures *f)
u8 MapNode::getLightNoChecks(enum LightBank bank, const ContentFeatures *f) const
{
return MYMAX(f->light_source,
bank == LIGHTBANK_DAY ? param1 & 0x0f : (param1 >> 4) & 0x0f);
Expand Down
2 changes: 1 addition & 1 deletion src/mapnode.h
Expand Up @@ -217,7 +217,7 @@ struct MapNode
* @pre f != NULL
* @pre f->param_type == CPT_LIGHT
*/
u8 getLightNoChecks(LightBank bank, const ContentFeatures *f);
u8 getLightNoChecks(LightBank bank, const ContentFeatures *f) const;

bool getLightBanks(u8 &lightday, u8 &lightnight, INodeDefManager *nodemgr) const;

Expand Down
2 changes: 2 additions & 0 deletions src/voxel.cpp
Expand Up @@ -621,6 +621,8 @@ void VoxelManipulator::spreadLight(enum LightBank bank,
}
#endif

const MapNode VoxelManipulator::ContentIgnoreNode = MapNode(CONTENT_IGNORE);

#if 1
/*
Lights neighbors of from_nodes, collects all them and then
Expand Down
15 changes: 14 additions & 1 deletion src/voxel.h
Expand Up @@ -413,10 +413,21 @@ class VoxelManipulator /*: public NodeContainer*/
}
// Stuff explodes if non-emerged area is touched with this.
// Emerge first, and check VOXELFLAG_NO_DATA if appropriate.
MapNode & getNodeRefUnsafe(v3s16 p)
MapNode & getNodeRefUnsafe(const v3s16 &p)
{
return m_data[m_area.index(p)];
}

const MapNode & getNodeRefUnsafeCheckFlags(const v3s16 &p)
{
s32 index = m_area.index(p);

if (m_flags[index] & VOXELFLAG_NO_DATA)
return ContentIgnoreNode;

return m_data[index];
}

u8 & getFlagsRefUnsafe(v3s16 p)
{
return m_flags[m_area.index(p)];
Expand Down Expand Up @@ -569,6 +580,8 @@ class VoxelManipulator /*: public NodeContainer*/
*/
u8 *m_flags;

static const MapNode ContentIgnoreNode;

//TODO: Use these or remove them
//TODO: Would these make any speed improvement?
//bool m_pressure_route_valid;
Expand Down

0 comments on commit 577701c

Please sign in to comment.