diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-11-23 00:27:12 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-11-29 19:13:50 +0200 |
commit | e8a9578774d1777e45cfad0c17ae16122f919dd4 (patch) | |
tree | ab2f0d9a7fe7f06a1e8638f86090828e33b16368 /src | |
parent | 0bf3a15886ec881e77d7753d02e9ac76e401bdd9 (diff) | |
download | minetest-e8a9578774d1777e45cfad0c17ae16122f919dd4.tar.gz minetest-e8a9578774d1777e45cfad0c17ae16122f919dd4.tar.bz2 minetest-e8a9578774d1777e45cfad0c17ae16122f919dd4.zip |
Add texture modifier [brighten and modify [toalpha to modify existing texture, not read a new base
Diffstat (limited to 'src')
-rw-r--r-- | src/nodedef.cpp | 4 | ||||
-rw-r--r-- | src/tile.cpp | 79 |
2 files changed, 48 insertions, 35 deletions
diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 0e48c8c07..a32851974 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -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; diff --git a/src/tile.cpp b/src/tile.cpp index 230580124..f18086f41 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -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); + } +} + |