MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
m_mesh(new scene::SMesh()),
- m_minimap_mapblock(new MinimapMapblock),
+ m_minimap_mapblock(NULL),
m_gamedef(data->m_gamedef),
m_tsrc(m_gamedef->getTextureSource()),
m_shdrsrc(m_gamedef->getShaderSource()),
m_enable_highlighting = g_settings->getBool("enable_node_highlighting");
if (g_settings->getBool("enable_minimap")) {
- v3s16 blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE;
- for(s16 x = 0; x < MAP_BLOCKSIZE; x++) {
- for(s16 z = 0; z < MAP_BLOCKSIZE; z++) {
- s16 air_count = 0;
- bool surface_found = false;
- MinimapPixel* minimap_pixel = &m_minimap_mapblock->data[x + z * MAP_BLOCKSIZE];
- for(s16 y = MAP_BLOCKSIZE -1; y > -1; y--) {
- v3s16 p(x, y, z);
- MapNode n = data->m_vmanip.getNodeNoEx(blockpos_nodes + p);
- if (!surface_found && n.getContent() != CONTENT_AIR) {
- minimap_pixel->height = y;
- minimap_pixel->id = n.getContent();
- surface_found = true;
- } else if (n.getContent() == CONTENT_AIR) {
- air_count++;
- }
- }
- if (!surface_found) {
- minimap_pixel->id = CONTENT_AIR;
- }
- minimap_pixel->air_count = air_count;
- }
- }
+ m_minimap_mapblock = new MinimapMapblock;
+ m_minimap_mapblock->getMinimapNodes(
+ &data->m_vmanip, data->m_blockpos * MAP_BLOCKSIZE);
}
// 4-21ms for MAP_BLOCKSIZE=16 (NOTE: probably outdated)
}
if(m_enable_highlighting && p.tile.material_flags & MATERIAL_FLAG_HIGHLIGHTED)
- m_highlighted_materials.push_back(i);
+ m_highlighted_materials.push_back(i);
for(u32 j = 0; j < p.vertices.size(); j++)
{
p.tile.applyMaterialOptionsWithShaders(material);
if (p.tile.normal_texture) {
material.setTexture(1, p.tile.normal_texture);
- material.setTexture(2, m_tsrc->getTextureForMesh("enable_img.png"));
- } else {
- material.setTexture(2, m_tsrc->getTextureForMesh("disable_img.png"));
}
+ material.setTexture(2, p.tile.flags_texture);
} else {
p.tile.applyMaterialOptions(material);
}
{
m_mesh->drop();
m_mesh = NULL;
+ delete m_minimap_mapblock;
}
bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_ratio)
{
for(std::map<u32, std::string>::iterator
i = m_crack_materials.begin();
- i != m_crack_materials.end(); i++)
+ i != m_crack_materials.end(); ++i)
{
scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first);
std::string basename = i->second;
// Texture animation
for(std::map<u32, TileSpec>::iterator
i = m_animation_tiles.begin();
- i != m_animation_tiles.end(); i++)
+ i != m_animation_tiles.end(); ++i)
{
const TileSpec &tile = i->second;
// Figure out current frame
if (m_enable_shaders) {
if (animation_frame.normal_texture) {
buf->getMaterial().setTexture(1, animation_frame.normal_texture);
- buf->getMaterial().setTexture(2, m_tsrc->getTextureForMesh("enable_img.png"));
- } else {
- buf->getMaterial().setTexture(2, m_tsrc->getTextureForMesh("disable_img.png"));
}
+ buf->getMaterial().setTexture(2, animation_frame.flags_texture);
}
}
{
for(std::map<u32, std::map<u32, std::pair<u8, u8> > >::iterator
i = m_daynight_diffs.begin();
- i != m_daynight_diffs.end(); i++)
+ i != m_daynight_diffs.end(); ++i)
{
scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first);
video::S3DVertexTangents *vertices = (video::S3DVertexTangents *)buf->getVertices();
for(std::map<u32, std::pair<u8, u8 > >::iterator
j = i->second.begin();
- j != i->second.end(); j++)
+ j != i->second.end(); ++j)
{
u8 day = j->second.first;
u8 night = j->second.second;
// Node highlighting
if (m_enable_highlighting) {
u8 day = m_highlight_mesh_color.getRed();
- u8 night = m_highlight_mesh_color.getGreen();
+ u8 night = m_highlight_mesh_color.getGreen();
video::SColor hc;
finalColorBlend(hc, day, night, daynight_ratio);
float sin_r = 0.07 * sin(1.5 * time);
for(std::list<u32>::iterator
i = m_highlighted_materials.begin();
- i != m_highlighted_materials.end(); i++)
+ i != m_highlighted_materials.end(); ++i)
{
scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(*i);
video::S3DVertexTangents *vertices = (video::S3DVertexTangents*)buf->getVertices();