mirror of
https://github.com/minetest/minetest.git
synced 2024-12-23 22:52:25 +01:00
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.
This commit is contained in:
parent
6e30dd05f4
commit
1475c1b1c8
@ -318,6 +318,15 @@ Example:
|
||||
|
||||
default_sandstone.png^[opacity:127
|
||||
|
||||
#### `[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.
|
||||
|
||||
Example:
|
||||
|
||||
default_apple.png^[invert:rgb
|
||||
|
||||
#### `[brighten`
|
||||
Brightens the texture.
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user