diff options
author | Thomas--S <Thomas--S@users.noreply.github.com> | 2016-08-12 17:56:31 +0200 |
---|---|---|
committer | paramat <mat.gregory@virginmedia.com> | 2016-09-15 05:25:38 +0100 |
commit | 1475c1b1c8bb1a2a2812d485d3590e1f817f7c7b (patch) | |
tree | c8070441d0af48cc0a8a2daddd6b30a9a360be89 /src | |
parent | 6e30dd05f40a97106752d724d176443b184eaf27 (diff) | |
download | minetest-1475c1b1c8bb1a2a2812d485d3590e1f817f7c7b.tar.gz minetest-1475c1b1c8bb1a2a2812d485d3590e1f817f7c7b.tar.bz2 minetest-1475c1b1c8bb1a2a2812d485d3590e1f817f7c7b.zip |
Add an [invert:<mode> texture modifier
Inverts the given channels of the base image.
Mode may contain the characters "r", "g", "b", "a".
Only the channels that are mentioned in the mode string will be inverted.
Diffstat (limited to 'src')
-rw-r--r-- | src/client/tile.cpp | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 67d5d8d1a..8f0c39465 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -1783,9 +1783,48 @@ bool TextureSource::generateImagePart(std::string part_of_name, for (u32 y = 0; y < dim.Height; y++) for (u32 x = 0; x < dim.Width; x++) { - video::SColor c = baseimg->getPixel(x,y); + video::SColor c = baseimg->getPixel(x, y); c.setAlpha(floor((c.getAlpha() * ratio) / 255 + 0.5)); - baseimg->setPixel(x,y,c); + baseimg->setPixel(x, y, c); + } + } + /* + [invert:mode + Inverts the given channels of the base image. + Mode may contain the characters "r", "g", "b", "a". + Only the channels that are mentioned in the mode string + will be inverted. + */ + else if (str_starts_with(part_of_name, "[invert:")) { + if (baseimg == NULL) { + errorstream << "generateImagePart(): baseimg == NULL " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + Strfnd sf(part_of_name); + sf.next(":"); + + std::string mode = sf.next(""); + u32 mask = 0; + if (mode.find("a") != std::string::npos) + mask |= 0xff000000UL; + if (mode.find("r") != std::string::npos) + mask |= 0x00ff0000UL; + if (mode.find("g") != std::string::npos) + mask |= 0x0000ff00UL; + if (mode.find("b") != std::string::npos) + mask |= 0x000000ffUL; + + core::dimension2d<u32> dim = baseimg->getDimension(); + + for (u32 y = 0; y < dim.Height; y++) + for (u32 x = 0; x < dim.Width; x++) + { + video::SColor c = baseimg->getPixel(x, y); + c.color ^= mask; + baseimg->setPixel(x, y, c); } } else |