]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/mesh.cpp
Add wielded (and CAOs) shader
[dragonfireclient.git] / src / mesh.cpp
index 4f70b7fa270de8b63d2ce50a26e0c6e02a5edca1..dab1575f38b8a42d65cbc0e42ca1fa92bd596405 100644 (file)
@@ -33,6 +33,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define MY_ETLM_READ_ONLY video::ETLM_READ_ONLY
 #endif
 
+static void applyFacesShading(video::SColor& color, float factor)
+{
+       color.setRed(core::clamp(core::round32(color.getRed()*factor), 0, 255));
+       color.setGreen(core::clamp(core::round32(color.getGreen()*factor), 0, 255));
+       color.setBlue(core::clamp(core::round32(color.getBlue()*factor), 0, 255));
+}
+
 scene::IAnimatedMesh* createCubeMesh(v3f scale)
 {
        video::SColor c(255,255,255,255);
@@ -165,6 +172,35 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color)
        }
 }
 
+void shadeMeshFaces(scene::IMesh *mesh)
+{
+       if (mesh == NULL)
+               return;
+
+       u32 mc = mesh->getMeshBufferCount();
+       for (u32 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);
+                       video::SColor &vc = vertex->Color;
+                       if (vertex->Normal.Y < -0.5) {
+                               applyFacesShading (vc, 0.447213);
+                       } else if (vertex->Normal.Z > 0.5) {
+                               applyFacesShading (vc, 0.670820);
+                       } else if (vertex->Normal.Z < -0.5) {
+                               applyFacesShading (vc, 0.670820);
+                       } else if (vertex->Normal.X > 0.5) {
+                               applyFacesShading (vc, 0.836660);
+                       } else if (vertex->Normal.X < -0.5) {
+                               applyFacesShading (vc, 0.836660);
+                       }
+               }
+       }
+}
+
 void setMeshColorByNormalXYZ(scene::IMesh *mesh,
                const video::SColor &colorX,
                const video::SColor &colorY,