summaryrefslogtreecommitdiff
path: root/src/mapblock_mesh.cpp
diff options
context:
space:
mode:
authorRealBadAngel <maciej.kasatkin@o2.pl>2014-09-16 12:38:37 +0200
committerRealBadAngel <maciej.kasatkin@o2.pl>2014-09-17 22:06:13 +0200
commit58e6d25e033c76dc91aaac18fdeda92ac23fe0e1 (patch)
treeb2691cefc6d239acaef8128861f387234688d183 /src/mapblock_mesh.cpp
parent206f0764225de4eeb3b2cef119e22df8005e5d60 (diff)
downloadminetest-58e6d25e033c76dc91aaac18fdeda92ac23fe0e1.tar.gz
minetest-58e6d25e033c76dc91aaac18fdeda92ac23fe0e1.tar.bz2
minetest-58e6d25e033c76dc91aaac18fdeda92ac23fe0e1.zip
Node highlighting.
Diffstat (limited to 'src/mapblock_mesh.cpp')
-rw-r--r--src/mapblock_mesh.cpp82
1 files changed, 57 insertions, 25 deletions
diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp
index d3f7c2f39..d75d3e148 100644
--- a/src/mapblock_mesh.cpp
+++ b/src/mapblock_mesh.cpp
@@ -46,6 +46,7 @@ MeshMakeData::MeshMakeData(IGameDef *gamedef):
m_vmanip(),
m_blockpos(-1337,-1337,-1337),
m_crack_pos_relative(-1337, -1337, -1337),
+ m_highlighted_pos_relative(-1337, -1337, -1337),
m_smooth_lighting(false),
m_gamedef(gamedef)
{}
@@ -132,6 +133,12 @@ void MeshMakeData::setCrack(int crack_level, v3s16 crack_pos)
m_crack_pos_relative = crack_pos - m_blockpos*MAP_BLOCKSIZE;
}
+void MeshMakeData::setHighlighted(v3s16 highlighted_pos, bool show_hud)
+{
+ m_show_hud = show_hud;
+ m_highlighted_pos_relative = highlighted_pos - m_blockpos*MAP_BLOCKSIZE;
+}
+
void MeshMakeData::setSmoothLighting(bool smooth_lighting)
{
m_smooth_lighting = smooth_lighting;
@@ -651,10 +658,8 @@ TileSpec getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data)
INodeDefManager *ndef = data->m_gamedef->ndef();
TileSpec spec = ndef->get(mn).tiles[tileindex];
// Apply temporary crack
- if(p == data->m_crack_pos_relative)
- {
+ if (p == data->m_crack_pos_relative)
spec.material_flags |= MATERIAL_FLAG_CRACK;
- }
return spec;
}
@@ -1008,9 +1013,13 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
m_animation_force_timer(0), // force initial animation
m_last_crack(-1),
m_crack_materials(),
+ m_highlighted_materials(),
m_last_daynight_ratio((u32) -1),
m_daynight_diffs()
{
+ m_enable_shaders = g_settings->getBool("enable_shaders");
+ m_enable_highlighting = g_settings->getBool("enable_node_highlighting");
+
// 4-21ms for MAP_BLOCKSIZE=16 (NOTE: probably outdated)
// 24-155ms for MAP_BLOCKSIZE=32 (NOTE: probably outdated)
//TimeTaker timer1("MapBlockMesh()");
@@ -1077,6 +1086,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
mapblock_mesh_generate_special(data, collector);
+ m_highlight_mesh_color = data->m_highlight_mesh_color;
/*
Convert MeshCollector to SMesh
@@ -1084,14 +1094,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
ITextureSource *tsrc = m_gamedef->tsrc();
IShaderSource *shdrsrc = m_gamedef->getShaderSource();
- bool enable_shaders = g_settings->getBool("enable_shaders");
-
for(u32 i = 0; i < collector.prebuffers.size(); i++)
{
PreMeshBuffer &p = collector.prebuffers[i];
- /*dstream<<"p.vertices.size()="<<p.vertices.size()
- <<", p.indices.size()="<<p.indices.size()
- <<std::endl;*/
// Generate animation data
// - Cracks
@@ -1129,6 +1134,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
p.tile.texture = animation_frame.texture;
}
+ if(m_enable_highlighting && p.tile.material_flags & MATERIAL_FLAG_HIGHLIGHTED)
+ m_highlighted_materials.push_back(i);
+
for(u32 j = 0; j < p.vertices.size(); j++)
{
// Note applyFacesShading second parameter is precalculated sqrt
@@ -1153,8 +1161,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
u8 day = vc.getRed();
u8 night = vc.getGreen();
finalColorBlend(vc, day, night, 1000);
- if(day != night)
- m_daynight_diffs[i][j] = std::make_pair(day, night);
+ m_daynight_diffs[i][j] = std::make_pair(day, night);
}
// Create material
@@ -1163,22 +1170,23 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
material.setFlag(video::EMF_BACK_FACE_CULLING, true);
material.setFlag(video::EMF_BILINEAR_FILTER, false);
material.setFlag(video::EMF_FOG_ENABLE, true);
- //material.setFlag(video::EMF_ANTI_ALIASING, video::EAAM_OFF);
- //material.setFlag(video::EMF_ANTI_ALIASING, video::EAAM_SIMPLE);
- //material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
material.setTexture(0, p.tile.texture);
- if (enable_shaders) {
- material.MaterialType = shdrsrc->getShaderInfo(p.tile.shader_id).material;
- p.tile.applyMaterialOptionsWithShaders(material);
- if (p.tile.normal_texture) {
- material.setTexture(1, p.tile.normal_texture);
- material.setTexture(2, tsrc->getTexture("enable_img.png"));
+ if (p.tile.material_flags & MATERIAL_FLAG_HIGHLIGHTED) {
+ material.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
+ } else {
+ if (m_enable_shaders) {
+ material.MaterialType = shdrsrc->getShaderInfo(p.tile.shader_id).material;
+ p.tile.applyMaterialOptionsWithShaders(material);
+ if (p.tile.normal_texture) {
+ material.setTexture(1, p.tile.normal_texture);
+ material.setTexture(2, tsrc->getTexture("enable_img.png"));
+ } else {
+ material.setTexture(2, tsrc->getTexture("disable_img.png"));
+ }
} else {
- material.setTexture(2, tsrc->getTexture("disable_img.png"));
+ p.tile.applyMaterialOptions(material);
}
- } else {
- p.tile.applyMaterialOptions(material);
}
// Create meshbuffer
@@ -1229,7 +1237,8 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
m_has_animation =
!m_crack_materials.empty() ||
!m_daynight_diffs.empty() ||
- !m_animation_tiles.empty();
+ !m_animation_tiles.empty() ||
+ !m_highlighted_materials.empty();
}
MapBlockMesh::~MapBlockMesh()
@@ -1240,7 +1249,6 @@ MapBlockMesh::~MapBlockMesh()
bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_ratio)
{
- bool enable_shaders = g_settings->getBool("enable_shaders");
if(!m_has_animation)
{
@@ -1306,7 +1314,7 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
FrameSpec animation_frame = tile.frames.find(frame)->second;
buf->getMaterial().setTexture(0, animation_frame.texture);
- if (enable_shaders) {
+ if (m_enable_shaders) {
if (animation_frame.normal_texture) {
buf->getMaterial().setTexture(1, animation_frame.normal_texture);
buf->getMaterial().setTexture(2, tsrc->getTexture("enable_img.png"));
@@ -1339,6 +1347,30 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
m_last_daynight_ratio = daynight_ratio;
}
+ // Node highlighting
+ if (m_enable_highlighting) {
+ u8 day = m_highlight_mesh_color.getRed();
+ 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);
+ float sin_g = 0.07 * sin(1.5 * time + irr::core::PI * 0.5);
+ float sin_b = 0.07 * sin(1.5 * time + irr::core::PI);
+ hc.setRed(core::clamp(core::round32(hc.getRed() * (0.8 + sin_r)), 0, 255));
+ hc.setGreen(core::clamp(core::round32(hc.getGreen() * (0.8 + sin_g)), 0, 255));
+ hc.setBlue(core::clamp(core::round32(hc.getBlue() * (0.8 + sin_b)), 0, 255));
+
+ for(std::list<u32>::iterator
+ i = m_highlighted_materials.begin();
+ i != m_highlighted_materials.end(); i++)
+ {
+ scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(*i);
+ video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices();
+ for (u32 j = 0; j < buf->getVertexCount() ;j++)
+ vertices[j].Color = hc;
+ }
+ }
+
return true;
}