Skip to content
Permalink
Browse files

Fix persistent ^[brighten after damage again (#5739)

The old texture modifier is restored by passing `m_previous_texture_modifier`.
Either copy it manually or let the function parameter do that.

Victims so far:
8e0b80a Apr 2018
eb2bda7 May 2019
  • Loading branch information...
SmallJoker committed May 26, 2019
1 parent 40dadec commit a1459a9eac4eeb35a6c578a8b8f96393f87ed53d
Showing with 6 additions and 15 deletions.
  1. +3 −14 src/client/content_cao.cpp
  2. +3 −1 src/client/content_cao.h
@@ -1062,7 +1062,8 @@ void GenericCAO::updateTexturePos()
}
}

void GenericCAO::updateTextures(const std::string &modref)
// Do not pass by reference, see header.
void GenericCAO::updateTextures(std::string mod)
{
ITextureSource *tsrc = m_client->tsrc();

@@ -1071,21 +1072,9 @@ void GenericCAO::updateTextures(const std::string &modref)
bool use_anisotropic_filter = g_settings->getBool("anisotropic_filter");

m_previous_texture_modifier = m_current_texture_modifier;
m_current_texture_modifier = modref;
m_current_texture_modifier = mod;
m_glow = m_prop.glow;

// Create a reference to the copy of "modref" just created. The
// following code will then use this reference instead of the
// original parameter which was passed by reference. This is
// necessary as "modref" can be a class member and there is a swap on
// those class members which can get triggered by the rest of the
// code of this method. This is faster than passing the "mod" by
// value because it reuses the copy made by the assignment to
// m_current_texture_modifier for the "mod" instead of having two
// copies, one for "mod" and another one (created from "mod") for
// the m_current_texture_modifier class member.
const std::string &mod = m_current_texture_modifier;

video::E_MATERIAL_TYPE material_type = (m_prop.use_texture_alpha) ?
video::EMT_TRANSPARENT_ALPHA_CHANNEL : video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;

@@ -225,7 +225,9 @@ class GenericCAO : public ClientActiveObject

void updateTexturePos();

void updateTextures(const std::string &modref);
// ffs this HAS TO BE a string copy! See #5739 if you think otherwise
// Reason: updateTextures(m_previous_texture_modifier);
void updateTextures(std::string mod);

void updateAnimation();

0 comments on commit a1459a9

Please sign in to comment.
You can’t perform that action at this time.