Do not shade inventory items with textures (#5869)
authorDániel Juhász <juhdanad@gmail.com>
Thu, 1 Jun 2017 21:18:55 +0000 (23:18 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Thu, 1 Jun 2017 21:18:55 +0000 (23:18 +0200)
This commit restores the old behavior: if an inventory item has an own
inventory texture, it will not be shaded.

src/hud.cpp
src/mesh.cpp
src/mesh.h
src/wieldmesh.cpp
src/wieldmesh.h

index 72145b4da78ba8690996990a778900c477601fa2..a2f031b4c4a7ca0974f820c674587495c7a05912 100644 (file)
@@ -698,7 +698,10 @@ void drawItemStack(video::IVideoDriver *driver,
                                if (p->override_base)
                                        c = p->color;
                        }
-                       colorizeMeshBuffer(buf, &c);
+                       if (imesh->needs_shading)
+                               colorizeMeshBuffer(buf, &c);
+                       else
+                               setMeshBufferColor(buf, c);
                        video::SMaterial &material = buf->getMaterial();
                        material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
                        material.Lighting = false;
index 824d6891bdc1113d4917aa33c4c747e2cbb2ee49..3ab67510a258893808fbd9c96a70a75896927506 100644 (file)
@@ -175,6 +175,14 @@ void translateMesh(scene::IMesh *mesh, v3f vec)
        mesh->setBoundingBox(bbox);
 }
 
+void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color)
+{
+       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 *) (vertices + i * stride))->Color = color;
+}
 
 void setMeshColor(scene::IMesh *mesh, const video::SColor &color)
 {
@@ -182,14 +190,8 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color)
                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 *)(vertices + i * stride))->Color = color;
-       }
+       for (u32 j = 0; j < mc; j++)
+               setMeshBufferColor(mesh->getMeshBuffer(j), color);
 }
 
 void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor)
index adaf0c83634967ae37ee6cf3d116930fd4931041..423e43aee484ab3e06caa3b9b2e7372d517f1e9e 100644 (file)
@@ -49,11 +49,20 @@ void scaleMesh(scene::IMesh *mesh, v3f scale);
 */
 void translateMesh(scene::IMesh *mesh, v3f vec);
 
+/*!
+ * Sets a constant color for all vertices in the mesh buffer.
+ */
+void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color);
+
 /*
        Set a constant color for all vertices in the mesh
 */
 void setMeshColor(scene::IMesh *mesh, const video::SColor &color);
 
+/*!
+ * Overwrites the color of a mesh buffer.
+ * The color is darkened based on the normal vector of the vertices.
+ */
 void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor);
 
 /*
index 8b1477bb7da9a830f1c631d498a6e6afffa1fc79..7736ec2a251169165608d89626d78e3658d24501 100644 (file)
@@ -440,10 +440,15 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result)
 
        scene::SMesh *mesh = NULL;
 
+       // Shading is on by default
+       result->needs_shading = true;
+
        // If inventory_image is defined, it overrides everything else
        if (def.inventory_image != "") {
                mesh = getExtrudedMesh(tsrc, def.inventory_image);
                result->buffer_colors.push_back(ItemPartColor());
+               // Items with inventory images do not need shading
+               result->needs_shading = false;
        } else if (def.type == ITEM_NODE) {
                if (f.mesh_ptr[0]) {
                        mesh = cloneMesh(f.mesh_ptr[0]);
index ef164c11f0053548e0877ae9ca0c09578a6e351a..faedce484ab300d29c244d7d45cac2dd0880bc92 100644 (file)
@@ -59,8 +59,13 @@ struct ItemMesh
         * Stores the color of each mesh buffer.
         */
        std::vector<ItemPartColor> buffer_colors;
+       /*!
+        * If false, all faces of the item should have the same brightness.
+        * Disables shading based on normal vectors.
+        */
+       bool needs_shading;
 
-       ItemMesh() : mesh(NULL), buffer_colors() {}
+       ItemMesh() : mesh(NULL), buffer_colors(), needs_shading(true) {}
 };
 
 /*