Expand Up
@@ -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)
{}
Expand Down
Expand Up
@@ -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;
Expand Down
Expand Up
@@ -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;
}
Expand Down
Expand Up
@@ -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()");
Expand Down
Expand Up
@@ -1077,21 +1086,17 @@ 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
*/
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
Expand Down
Expand Up
@@ -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
Expand All
@@ -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
Expand All
@@ -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
Expand Down
Expand Up
@@ -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 ()
Expand All
@@ -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)
{
Expand Down
Expand Up
@@ -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" ));
Expand Down
Expand Up
@@ -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 ;
}
Expand Down