Fix fast leaves with texture_clean_transparent enabled.
parent
400c6087b6
commit
1fb3d1156c
|
@ -224,10 +224,6 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply the "clean transparent" filter, if configured.
|
|
||||||
if (g_settings->getBool("texture_clean_transparent"))
|
|
||||||
imageCleanTransparent(toadd, 127);
|
|
||||||
|
|
||||||
if (need_to_grab)
|
if (need_to_grab)
|
||||||
toadd->grab();
|
toadd->grab();
|
||||||
m_images[name] = toadd;
|
m_images[name] = toadd;
|
||||||
|
@ -676,7 +672,7 @@ video::ITexture* TextureSource::getTexture(const std::string &name, u32 *id)
|
||||||
|
|
||||||
video::ITexture* TextureSource::getTextureForMesh(const std::string &name, u32 *id)
|
video::ITexture* TextureSource::getTextureForMesh(const std::string &name, u32 *id)
|
||||||
{
|
{
|
||||||
return getTexture(name + "^[autoupscaleformesh", id);
|
return getTexture(name + "^[applyfiltersformesh", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureSource::processQueue()
|
void TextureSource::processQueue()
|
||||||
|
@ -1191,7 +1187,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
Adds a cracking texture
|
Adds a cracking texture
|
||||||
N = animation frame count, P = crack progression
|
N = animation frame count, P = crack progression
|
||||||
*/
|
*/
|
||||||
if (part_of_name.substr(0,6) == "[crack")
|
if (str_starts_with(part_of_name, "[crack"))
|
||||||
{
|
{
|
||||||
if (baseimg == NULL) {
|
if (baseimg == NULL) {
|
||||||
errorstream<<"generateImagePart(): baseimg == NULL "
|
errorstream<<"generateImagePart(): baseimg == NULL "
|
||||||
|
@ -1228,7 +1224,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
[combine:WxH:X,Y=filename:X,Y=filename2
|
[combine:WxH:X,Y=filename:X,Y=filename2
|
||||||
Creates a bigger texture from an amount of smaller ones
|
Creates a bigger texture from an amount of smaller ones
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,8) == "[combine")
|
else if (str_starts_with(part_of_name, "[combine"))
|
||||||
{
|
{
|
||||||
Strfnd sf(part_of_name);
|
Strfnd sf(part_of_name);
|
||||||
sf.next(":");
|
sf.next(":");
|
||||||
|
@ -1272,7 +1268,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
/*
|
/*
|
||||||
"[brighten"
|
"[brighten"
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,9) == "[brighten")
|
else if (str_starts_with(part_of_name, "[brighten"))
|
||||||
{
|
{
|
||||||
if (baseimg == NULL) {
|
if (baseimg == NULL) {
|
||||||
errorstream<<"generateImagePart(): baseimg==NULL "
|
errorstream<<"generateImagePart(): baseimg==NULL "
|
||||||
|
@ -1290,7 +1286,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
that the transparent parts don't look completely black
|
that the transparent parts don't look completely black
|
||||||
when simple alpha channel is used for rendering.
|
when simple alpha channel is used for rendering.
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,8) == "[noalpha")
|
else if (str_starts_with(part_of_name, "[noalpha"))
|
||||||
{
|
{
|
||||||
if (baseimg == NULL){
|
if (baseimg == NULL){
|
||||||
errorstream<<"generateImagePart(): baseimg==NULL "
|
errorstream<<"generateImagePart(): baseimg==NULL "
|
||||||
|
@ -1314,7 +1310,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
"[makealpha:R,G,B"
|
"[makealpha:R,G,B"
|
||||||
Convert one color to transparent.
|
Convert one color to transparent.
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,11) == "[makealpha:")
|
else if (str_starts_with(part_of_name, "[makealpha:"))
|
||||||
{
|
{
|
||||||
if (baseimg == NULL) {
|
if (baseimg == NULL) {
|
||||||
errorstream<<"generateImagePart(): baseimg == NULL "
|
errorstream<<"generateImagePart(): baseimg == NULL "
|
||||||
|
@ -1370,7 +1366,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
The resulting transform will be equivalent to one of the
|
The resulting transform will be equivalent to one of the
|
||||||
eight existing ones, though (see: dihedral group).
|
eight existing ones, though (see: dihedral group).
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,10) == "[transform")
|
else if (str_starts_with(part_of_name, "[transform"))
|
||||||
{
|
{
|
||||||
if (baseimg == NULL) {
|
if (baseimg == NULL) {
|
||||||
errorstream<<"generateImagePart(): baseimg == NULL "
|
errorstream<<"generateImagePart(): baseimg == NULL "
|
||||||
|
@ -1397,7 +1393,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
Example (a grass block (not actually used in game):
|
Example (a grass block (not actually used in game):
|
||||||
"[inventorycube{grass.png{mud.png&grass_side.png{mud.png&grass_side.png"
|
"[inventorycube{grass.png{mud.png&grass_side.png{mud.png&grass_side.png"
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,14) == "[inventorycube")
|
else if (str_starts_with(part_of_name, "[inventorycube"))
|
||||||
{
|
{
|
||||||
if (baseimg != NULL){
|
if (baseimg != NULL){
|
||||||
errorstream<<"generateImagePart(): baseimg != NULL "
|
errorstream<<"generateImagePart(): baseimg != NULL "
|
||||||
|
@ -1514,7 +1510,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
[lowpart:percent:filename
|
[lowpart:percent:filename
|
||||||
Adds the lower part of a texture
|
Adds the lower part of a texture
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,9) == "[lowpart:")
|
else if (str_starts_with(part_of_name, "[lowpart:"))
|
||||||
{
|
{
|
||||||
Strfnd sf(part_of_name);
|
Strfnd sf(part_of_name);
|
||||||
sf.next(":");
|
sf.next(":");
|
||||||
|
@ -1550,7 +1546,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
Crops a frame of a vertical animation.
|
Crops a frame of a vertical animation.
|
||||||
N = frame count, I = frame index
|
N = frame count, I = frame index
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,15) == "[verticalframe:")
|
else if (str_starts_with(part_of_name, "[verticalframe:"))
|
||||||
{
|
{
|
||||||
Strfnd sf(part_of_name);
|
Strfnd sf(part_of_name);
|
||||||
sf.next(":");
|
sf.next(":");
|
||||||
|
@ -1594,7 +1590,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
[mask:filename
|
[mask:filename
|
||||||
Applies a mask to an image
|
Applies a mask to an image
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,6) == "[mask:")
|
else if (str_starts_with(part_of_name, "[mask:"))
|
||||||
{
|
{
|
||||||
if (baseimg == NULL) {
|
if (baseimg == NULL) {
|
||||||
errorstream << "generateImage(): baseimg == NULL "
|
errorstream << "generateImage(): baseimg == NULL "
|
||||||
|
@ -1620,7 +1616,8 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
Overlays image with given color
|
Overlays image with given color
|
||||||
color = color as ColorString
|
color = color as ColorString
|
||||||
*/
|
*/
|
||||||
else if (part_of_name.substr(0,10) == "[colorize:") {
|
else if (str_starts_with(part_of_name, "[colorize:"))
|
||||||
|
{
|
||||||
Strfnd sf(part_of_name);
|
Strfnd sf(part_of_name);
|
||||||
sf.next(":");
|
sf.next(":");
|
||||||
std::string color_str = sf.next(":");
|
std::string color_str = sf.next(":");
|
||||||
|
@ -1657,7 +1654,12 @@ bool TextureSource::generateImagePart(std::string part_of_name,
|
||||||
blit_with_interpolate_overlay(img, baseimg, v2s32(0,0), v2s32(0,0), dim, ratio);
|
blit_with_interpolate_overlay(img, baseimg, v2s32(0,0), v2s32(0,0), dim, ratio);
|
||||||
img->drop();
|
img->drop();
|
||||||
}
|
}
|
||||||
else if (part_of_name.substr(0,19) == "[autoupscaleformesh") {
|
else if (str_starts_with(part_of_name, "[applyfiltersformesh"))
|
||||||
|
{
|
||||||
|
// Apply the "clean transparent" filter, if configured.
|
||||||
|
if (g_settings->getBool("texture_clean_transparent"))
|
||||||
|
imageCleanTransparent(baseimg, 127);
|
||||||
|
|
||||||
/* Upscale textures to user's requested minimum size. This is a trick to make
|
/* Upscale textures to user's requested minimum size. This is a trick to make
|
||||||
* filters look as good on low-res textures as on high-res ones, by making
|
* filters look as good on low-res textures as on high-res ones, by making
|
||||||
* low-res textures BECOME high-res ones. This is helpful for worlds that
|
* low-res textures BECOME high-res ones. This is helpful for worlds that
|
||||||
|
|
|
@ -151,6 +151,24 @@ inline bool str_starts_with(const std::basic_string<T> &str,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether \p str begins with the string prefix. If \p case_insensitive
|
||||||
|
* is true then the check is case insensitve (default is false; i.e. case is
|
||||||
|
* significant).
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @param prefix
|
||||||
|
* @param case_insensitive
|
||||||
|
* @return true if the str begins with prefix
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
inline bool str_starts_with(const std::basic_string<T> &str,
|
||||||
|
const T *prefix,
|
||||||
|
bool case_insensitive = false)
|
||||||
|
{
|
||||||
|
return str_starts_with(str, std::basic_string<T>(prefix),
|
||||||
|
case_insensitive);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Splits a string into its component parts separated by the character
|
* Splits a string into its component parts separated by the character
|
||||||
|
|
Loading…
Reference in New Issue