Halo: Highlight selected face
This is a slightly modified and cleaned up version of #3774 by RealBadAngel. By sofar: Remove color change (just make it lighter) and some minor cleanups.master
parent
8a1a9fdc24
commit
68f5b877c7
|
@ -362,6 +362,7 @@ PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_positio
|
||||||
|
|
||||||
min_distance = (selected_object->getPosition() - camera_position).getLength();
|
min_distance = (selected_object->getPosition() - camera_position).getLength();
|
||||||
|
|
||||||
|
hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0));
|
||||||
result.type = POINTEDTHING_OBJECT;
|
result.type = POINTEDTHING_OBJECT;
|
||||||
result.object_id = selected_object->getId();
|
result.object_id = selected_object->getId();
|
||||||
}
|
}
|
||||||
|
@ -473,6 +474,7 @@ PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_positio
|
||||||
if (!facebox.intersectsWithLine(shootline))
|
if (!facebox.intersectsWithLine(shootline))
|
||||||
continue;
|
continue;
|
||||||
result.node_abovesurface = pointed_pos + facedir;
|
result.node_abovesurface = pointed_pos + facedir;
|
||||||
|
hud->setSelectedFaceNormal(v3f(facedir.X, facedir.Y, facedir.Z));
|
||||||
face_min_distance = distance;
|
face_min_distance = distance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -544,6 +544,12 @@ void Hud::drawSelectionMesh()
|
||||||
video::SMaterial oldmaterial = driver->getMaterial2D();
|
video::SMaterial oldmaterial = driver->getMaterial2D();
|
||||||
driver->setMaterial(m_selection_material);
|
driver->setMaterial(m_selection_material);
|
||||||
setMeshColor(m_selection_mesh, m_selection_mesh_color);
|
setMeshColor(m_selection_mesh, m_selection_mesh_color);
|
||||||
|
video::SColor face_color(0,
|
||||||
|
MYMIN(255, m_selection_mesh_color.getRed() * 1.5),
|
||||||
|
MYMIN(255, m_selection_mesh_color.getGreen() * 1.5),
|
||||||
|
MYMIN(255, m_selection_mesh_color.getBlue() * 1.5));
|
||||||
|
setMeshColorByNormal(m_selection_mesh, m_selected_face_normal,
|
||||||
|
face_color);
|
||||||
scene::IMesh* mesh = cloneMesh(m_selection_mesh);
|
scene::IMesh* mesh = cloneMesh(m_selection_mesh);
|
||||||
translateMesh(mesh, m_selection_pos_with_offset);
|
translateMesh(mesh, m_selection_pos_with_offset);
|
||||||
u32 mc = m_selection_mesh->getMeshBufferCount();
|
u32 mc = m_selection_mesh->getMeshBufferCount();
|
||||||
|
|
|
@ -139,8 +139,11 @@ public:
|
||||||
v3f getSelectionPos() const
|
v3f getSelectionPos() const
|
||||||
{ return m_selection_pos; }
|
{ return m_selection_pos; }
|
||||||
|
|
||||||
void setSelectionMeshColor(const video::SColor &c)
|
void setSelectionMeshColor(const video::SColor &color)
|
||||||
{ m_selection_mesh_color = c; }
|
{ m_selection_mesh_color = color; }
|
||||||
|
|
||||||
|
void setSelectedFaceNormal(const v3f &face_normal)
|
||||||
|
{ m_selected_face_normal = face_normal; }
|
||||||
|
|
||||||
void drawLuaElements(const v3s16 &camera_offset);
|
void drawLuaElements(const v3s16 &camera_offset);
|
||||||
|
|
||||||
|
@ -169,6 +172,8 @@ private:
|
||||||
|
|
||||||
scene::IMesh* m_selection_mesh;
|
scene::IMesh* m_selection_mesh;
|
||||||
video::SColor m_selection_mesh_color;
|
video::SColor m_selection_mesh_color;
|
||||||
|
v3f m_selected_face_normal;
|
||||||
|
|
||||||
video::SMaterial m_selection_material;
|
video::SMaterial m_selection_material;
|
||||||
bool m_use_selection_mesh;
|
bool m_use_selection_mesh;
|
||||||
};
|
};
|
||||||
|
|
20
src/mesh.cpp
20
src/mesh.cpp
|
@ -226,7 +226,27 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
|
||||||
vertex->Color = colorY;
|
vertex->Color = colorY;
|
||||||
else
|
else
|
||||||
vertex->Color = colorZ;
|
vertex->Color = colorZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
|
||||||
|
const video::SColor &color)
|
||||||
|
{
|
||||||
|
if (!mesh)
|
||||||
|
return;
|
||||||
|
|
||||||
|
u16 mc = mesh->getMeshBufferCount();
|
||||||
|
for (u16 j = 0; j < mc; j++) {
|
||||||
|
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
|
||||||
|
const u32 stride = getVertexPitchFromType(buf->getVertexType());
|
||||||
|
u32 vertex_count = buf->getVertexCount();
|
||||||
|
u8 *vertices = (u8 *)buf->getVertices();
|
||||||
|
for (u32 i = 0; i < vertex_count; i++) {
|
||||||
|
video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
|
||||||
|
if (normal == vertex->Normal) {
|
||||||
|
vertex->Color = color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,10 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
|
||||||
const video::SColor &colorX,
|
const video::SColor &colorX,
|
||||||
const video::SColor &colorY,
|
const video::SColor &colorY,
|
||||||
const video::SColor &colorZ);
|
const video::SColor &colorZ);
|
||||||
|
|
||||||
|
void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
|
||||||
|
const video::SColor &color);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Rotate the mesh by 6d facedir value.
|
Rotate the mesh by 6d facedir value.
|
||||||
Method only for meshnodes, not suitable for entities.
|
Method only for meshnodes, not suitable for entities.
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 144 B After Width: | Height: | Size: 144 B |
Loading…
Reference in New Issue