Add texture modifier [brighten and modify [toalpha to modify existing texture, not...
authorPerttu Ahola <celeron55@gmail.com>
Tue, 22 Nov 2011 22:27:12 +0000 (00:27 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Tue, 29 Nov 2011 17:13:50 +0000 (19:13 +0200)
src/nodedef.cpp
src/tile.cpp

index 0e48c8c07aaa99ba84b6f23ba4ee916e497135ea..a32851974af823a2e81338a51a44b7fdb177717a 100644 (file)
@@ -529,8 +529,8 @@ public:
                                        f->drawtype = NDT_NORMAL;
                                        f->solidness = 1;
                                        for(u32 i=0; i<6; i++){
-                                               f->tname_tiles[i] = std::string("[noalpha:")
-                                                               + f->tname_tiles[i];
+                                               f->tname_tiles[i] = f->tname_tiles[i]
+                                                               + std::string("^[noalpha");
                                        }
                                }
                                break;
index 230580124659cb699e65ef848221e1810460b7cd..f18086f41139033c2c4499d515079dd30e697d8d 100644 (file)
@@ -460,6 +460,8 @@ u32 TextureSource::getTextureId(const std::string &name)
 
 // Draw a progress bar on the image
 void make_progressbar(float value, video::IImage *image);
+// Brighten image
+void brighten(video::IImage *image);
 
 /*
        Generate image based on a string like "stone.png" or "[crack0".
@@ -1306,53 +1308,46 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
                        make_progressbar(value, baseimg);
                }
                /*
-                       "[noalpha:filename.png"
-                       Use an image without it's alpha channel.
+                       "[brighten"
+               */
+               else if(part_of_name.substr(0,9) == "[brighten")
+               {
+                       if(baseimg == NULL)
+                       {
+                               errorstream<<"generate_image(): baseimg==NULL "
+                                               <<"for part_of_name=\""<<part_of_name
+                                               <<"\", cancelling."<<std::endl;
+                               return false;
+                       }
+
+                       brighten(baseimg);
+               }
+               /*
+                       "[noalpha"
+                       Make image completely opaque.
                        Used for the leaves texture when in old leaves mode, so
                        that the transparent parts don't look completely black 
                        when simple alpha channel is used for rendering.
                */
                else if(part_of_name.substr(0,8) == "[noalpha")
                {
-                       if(baseimg != NULL)
+                       if(baseimg == NULL)
                        {
-                               errorstream<<"generate_image(): baseimg!=NULL "
+                               errorstream<<"generate_image(): baseimg==NULL "
                                                <<"for part_of_name=\""<<part_of_name
                                                <<"\", cancelling."<<std::endl;
                                return false;
                        }
 
-                       std::string filename = part_of_name.substr(9);
-
-                       std::string path = getTexturePath(filename.c_str());
-
-                       /*infostream<<"generate_image(): Loading file \""<<filename
-                                       <<"\""<<std::endl;*/
+                       core::dimension2d<u32> dim = baseimg->getDimension();
                        
-                       video::IImage *image = sourcecache->getOrLoad(filename, device);
-                       
-                       if(image == NULL)
+                       // Set alpha to full
+                       for(u32 y=0; y<dim.Height; y++)
+                       for(u32 x=0; x<dim.Width; x++)
                        {
-                               infostream<<"generate_image(): Loading path \""
-                                               <<path<<"\" failed"<<std::endl;
-                       }
-                       else
-                       {
-                               core::dimension2d<u32> dim = image->getDimension();
-                               baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
-                               
-                               // Set alpha to full
-                               for(u32 y=0; y<dim.Height; y++)
-                               for(u32 x=0; x<dim.Width; x++)
-                               {
-                                       video::SColor c = image->getPixel(x,y);
-                                       c.setAlpha(255);
-                                       image->setPixel(x,y,c);
-                               }
-                               // Blit
-                               image->copyTo(baseimg);
-
-                               image->drop();
+                               video::SColor c = baseimg->getPixel(x,y);
+                               c.setAlpha(255);
+                               baseimg->setPixel(x,y,c);
                        }
                }
                /*
@@ -1650,3 +1645,21 @@ void make_progressbar(float value, video::IImage *image)
        }
 }
 
+void brighten(video::IImage *image)
+{
+       if(image == NULL)
+               return;
+       
+       core::dimension2d<u32> dim = image->getDimension();
+
+       for(u32 y=0; y<dim.Height; y++)
+       for(u32 x=0; x<dim.Width; x++)
+       {
+               video::SColor c = image->getPixel(x,y);
+               c.setRed(0.5 * 255 + 0.5 * (float)c.getRed());
+               c.setGreen(0.5 * 255 + 0.5 * (float)c.getGreen());
+               c.setBlue(0.5 * 255 + 0.5 * (float)c.getBlue());
+               image->setPixel(x,y,c);
+       }
+}
+