Halo: Highlight selected face
authorRealBadAngel <maciej.kasatkin@o2.pl>
Sun, 21 Feb 2016 05:50:41 +0000 (06:50 +0100)
committerparamat <mat.gregory@virginmedia.com>
Sat, 12 Nov 2016 06:41:04 +0000 (06:41 +0000)
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.

src/game.cpp
src/hud.cpp
src/hud.h
src/mesh.cpp
src/mesh.h
textures/base/pack/halo.png

index 33795abc531504118fd84a1f533dce37009c9c14..e0ffa1be5bb4a7560081536a4248a26ad6912b1d 100644 (file)
@@ -362,6 +362,7 @@ PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_positio
 
                        min_distance = (selected_object->getPosition() - camera_position).getLength();
 
+                       hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0));
                        result.type = POINTEDTHING_OBJECT;
                        result.object_id = selected_object->getId();
                }
@@ -473,6 +474,7 @@ PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_positio
                                if (!facebox.intersectsWithLine(shootline))
                                        continue;
                                result.node_abovesurface = pointed_pos + facedir;
+                               hud->setSelectedFaceNormal(v3f(facedir.X, facedir.Y, facedir.Z));
                                face_min_distance = distance;
                        }
                }
index 19feaef7b57dfa54b347550dba83f8ffd5fdaf4e..43d9573801c2f22ba15450e487943703edab858c 100644 (file)
@@ -544,6 +544,12 @@ void Hud::drawSelectionMesh()
                video::SMaterial oldmaterial = driver->getMaterial2D();
                driver->setMaterial(m_selection_material);
                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);
                translateMesh(mesh, m_selection_pos_with_offset);
                u32 mc = m_selection_mesh->getMeshBufferCount();
index 7f0fbe7b38ec5837c4da6f9d193fc64a3933b5a3..a4d7990e9975f064c5424bd1f0d8cd289a970df2 100644 (file)
--- a/src/hud.h
+++ b/src/hud.h
@@ -139,8 +139,11 @@ public:
        v3f getSelectionPos() const
        { return m_selection_pos; }
 
-       void setSelectionMeshColor(const video::SColor &c)
-       { m_selection_mesh_color = c; }
+       void setSelectionMeshColor(const video::SColor &color)
+       { m_selection_mesh_color = color; }
+
+       void setSelectedFaceNormal(const v3f &face_normal)
+       { m_selected_face_normal = face_normal; }
 
        void drawLuaElements(const v3s16 &camera_offset);
 
@@ -169,6 +172,8 @@ private:
 
        scene::IMesh* m_selection_mesh;
        video::SColor m_selection_mesh_color;
+       v3f m_selected_face_normal;
+
        video::SMaterial m_selection_material;
        bool m_use_selection_mesh;
 };
index b5bf8660a308845478f6bd8e1e2af1b1938c3642..b68862d22ef3ff3738a91907abe73a117070737f 100644 (file)
@@ -226,7 +226,27 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
                                vertex->Color = colorY;
                        else
                                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;
+                       }
                }
        }
 }
index 8e189377393e0f7baf4dd3c8ee9599eef88b7854..10df97015e52064051db6dc32bca50cf975ff589 100644 (file)
@@ -64,6 +64,10 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
                const video::SColor &colorX,
                const video::SColor &colorY,
                const video::SColor &colorZ);
+
+void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
+               const video::SColor &color);
+
 /*
        Rotate the mesh by 6d facedir value.
        Method only for meshnodes, not suitable for entities.
index eaea782da6480cd7996367a1a10785db6f5933cb..ed3ff9d8c856f3fb8758f75f665b4e04a42d6605 100644 (file)
Binary files a/textures/base/pack/halo.png and b/textures/base/pack/halo.png differ