Fix persistent ^[brighten after damage again (#5739)
authorSmallJoker <mk939@ymail.com>
Sun, 26 May 2019 07:54:23 +0000 (09:54 +0200)
committerSmallJoker <mk939@ymail.com>
Sun, 26 May 2019 07:54:26 +0000 (09:54 +0200)
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

src/client/content_cao.cpp
src/client/content_cao.h

index cf22aa0ed53447265b9cdd5d322e55e7a00b88c2..388a71873d8010740b445df235c443cb580a1c46 100644 (file)
@@ -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;
 
index 320607061dc2fd0320674d12ee9dad0cb399b4f5..ca1518fb22ccc99fddbb9ad74fb774922281c65f 100644 (file)
@@ -225,7 +225,9 @@ public:
 
        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();