Fix use of uninit data in Sky and (potentially) GUIChatConsole constructors
authorKahrl <kahrl@gmx.net>
Sat, 17 Jan 2015 19:05:45 +0000 (20:05 +0100)
committerKahrl <kahrl@gmx.net>
Sun, 18 Jan 2015 12:16:01 +0000 (13:16 +0100)
Clean up nearby code a bit

As a small side effect, it is now possible to add a background texture
to the chat console by simply providing background_chat.jpg, it is no
longer necessary to also add "console_color =" to minetest.conf.

src/game.cpp
src/guiChatConsole.cpp
src/sky.cpp
src/sky.h

index 10ed61c5b247b1ed9440c5707247fd22a2b1400a..cedaabb1b0720c07141573924f71803d3d35388a 100644 (file)
@@ -1984,7 +1984,7 @@ bool Game::createClient(const std::string &playername,
 
        /* Skybox
         */
-       sky = new Sky(smgr->getRootSceneNode(), smgr, -1);
+       sky = new Sky(smgr->getRootSceneNode(), smgr, -1, texture_src);
        skybox = NULL;  // This is used/set later on in the main run loop
 
        local_inventory = new Inventory(itemdef_manager);
index 918f9528bab083ae05b9ae40ebc1c4271dd3d5a8..19d9e3007e8a116cc3d266a52b0275296d00a815 100644 (file)
@@ -72,25 +72,22 @@ GUIChatConsole::GUIChatConsole(
        m_animate_time_old = getTimeMs();
 
        // load background settings
-       bool console_color_set = !g_settings->get("console_color").empty();
        s32 console_alpha = g_settings->getS32("console_alpha");
+       m_background_color.setAlpha(clamp_u8(console_alpha));
 
        // load the background texture depending on settings
-       m_background_color.setAlpha(clamp_u8(console_alpha));
-       if (console_color_set)
-       {
+       ITextureSource *tsrc = client->getTextureSource();
+       if (tsrc->isKnownSourceImage("background_chat.jpg")) {
+               m_background = tsrc->getTexture("background_chat.jpg");
+               m_background_color.setRed(255);
+               m_background_color.setGreen(255);
+               m_background_color.setBlue(255);
+       } else {
                v3f console_color = g_settings->getV3F("console_color");
                m_background_color.setRed(clamp_u8(myround(console_color.X)));
                m_background_color.setGreen(clamp_u8(myround(console_color.Y)));
                m_background_color.setBlue(clamp_u8(myround(console_color.Z)));
        }
-       else
-       {
-               m_background = env->getVideoDriver()->getTexture(getTexturePath("background_chat.jpg").c_str());
-               m_background_color.setRed(255);
-               m_background_color.setGreen(255);
-               m_background_color.setBlue(255);
-       }
 
        m_font = g_fontengine->getFont(FONT_SIZE_UNSPECIFIED, FM_Mono);
 
index 00072f17f37b27125a7db395a84d1c2130398152..664ed694b397b6d894514118301422def46a328c 100644 (file)
@@ -3,7 +3,7 @@
 #include "ISceneManager.h"
 #include "ICameraSceneNode.h"
 #include "S3DVertex.h"
-#include "tile.h" // getTexturePath
+#include "tile.h"
 #include "noise.h" // easeCurve
 #include "main.h" // g_profiler
 #include "profiler.h"
@@ -13,7 +13,8 @@
 #include "camera.h" // CameraModes
 
 //! constructor
-Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id):
+Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
+               ITextureSource *tsrc):
                scene::ISceneNode(parent, mgr, id),
                m_visible(true),
                m_fallback_bg_color(255,255,255,255),
@@ -46,19 +47,18 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id):
        m_materials[1].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
 
        m_materials[2] = mat;
-       m_materials[2].setTexture(0, mgr->getVideoDriver()->getTexture(
-                       getTexturePath("sunrisebg.png").c_str()));
+       m_materials[2].setTexture(0, tsrc->getTexture("sunrisebg.png"));
        m_materials[2].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
        //m_materials[2].MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
 
-       m_sun_texture = mgr->getVideoDriver()->getTexture(
-                       getTexturePath("sun.png").c_str());
-       m_moon_texture = mgr->getVideoDriver()->getTexture(
-                       getTexturePath("moon.png").c_str());
-       m_sun_tonemap = mgr->getVideoDriver()->getTexture(
-                       getTexturePath("sun_tonemap.png").c_str());
-       m_moon_tonemap = mgr->getVideoDriver()->getTexture(
-                       getTexturePath("moon_tonemap.png").c_str());
+       m_sun_texture = tsrc->isKnownSourceImage("sun.png") ?
+               tsrc->getTexture("sun.png") : NULL;
+       m_moon_texture = tsrc->isKnownSourceImage("moon.png") ?
+               tsrc->getTexture("moon.png") : NULL;
+       m_sun_tonemap = tsrc->isKnownSourceImage("sun_tonemap.png") ?
+               tsrc->getTexture("sun_tonemap.png") : NULL;
+       m_moon_tonemap = tsrc->isKnownSourceImage("moon_tonemap.png") ?
+               tsrc->getTexture("moon_tonemap.png") : NULL;
 
        if (m_sun_texture){
                m_materials[3] = mat;
index 4af6be0246bbfaeb5f1d3b847d398915e47a8948..5023cc68264581fac36cb021abfc93fe4b1afd12 100644 (file)
--- a/src/sky.h
+++ b/src/sky.h
@@ -27,12 +27,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define SKY_MATERIAL_COUNT 5
 #define SKY_STAR_COUNT 200
 
+class ITextureSource;
+
 // Skybox, rendered with zbuffer turned off, before all other nodes.
 class Sky : public scene::ISceneNode
 {
 public:
        //! constructor
-       Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id);
+       Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
+                       ITextureSource *tsrc);
 
        virtual void OnRegisterSceneNode();