mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-11 17:51:04 +00:00
Cleanup selection mesh code, add shaders for halo and selection boxes
This commit is contained in:
parent
430195381d
commit
b44da4916a
21 changed files with 336 additions and 304 deletions
|
@ -47,10 +47,8 @@ MeshMakeData::MeshMakeData(IGameDef *gamedef, bool use_shaders):
|
|||
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_show_hud(false),
|
||||
m_highlight_mesh_color(255, 255, 255, 255),
|
||||
m_gamedef(gamedef),
|
||||
m_use_shaders(use_shaders)
|
||||
{}
|
||||
|
@ -138,12 +136,6 @@ 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;
|
||||
|
@ -1036,12 +1028,10 @@ 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 = data->m_use_shaders;
|
||||
m_enable_highlighting = g_settings->getBool("enable_node_highlighting");
|
||||
|
||||
if (g_settings->getBool("enable_minimap")) {
|
||||
m_minimap_mapblock = new MinimapMapblock;
|
||||
|
@ -1116,8 +1106,6 @@ 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
|
||||
*/
|
||||
|
@ -1162,9 +1150,6 @@ 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++)
|
||||
{
|
||||
video::S3DVertex *vertex = &p.vertices[j];
|
||||
|
@ -1205,19 +1190,15 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
|||
material.setFlag(video::EMF_FOG_ENABLE, true);
|
||||
material.setTexture(0, p.tile.texture);
|
||||
|
||||
if (p.tile.material_flags & MATERIAL_FLAG_HIGHLIGHTED) {
|
||||
material.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
|
||||
} else {
|
||||
if (m_enable_shaders) {
|
||||
material.MaterialType = m_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, p.tile.flags_texture);
|
||||
} else {
|
||||
p.tile.applyMaterialOptions(material);
|
||||
if (m_enable_shaders) {
|
||||
material.MaterialType = m_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, p.tile.flags_texture);
|
||||
} else {
|
||||
p.tile.applyMaterialOptions(material);
|
||||
}
|
||||
|
||||
// Create meshbuffer
|
||||
|
@ -1273,8 +1254,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
|||
m_has_animation =
|
||||
!m_crack_materials.empty() ||
|
||||
!m_daynight_diffs.empty() ||
|
||||
!m_animation_tiles.empty() ||
|
||||
!m_highlighted_materials.empty();
|
||||
!m_animation_tiles.empty();
|
||||
}
|
||||
|
||||
MapBlockMesh::~MapBlockMesh()
|
||||
|
@ -1377,30 +1357,6 @@ 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue