Improve glass
[oweals/minetest.git] / src / content_cao.cpp
index e007c5f377b68f018293131295fbdf15ae880d65..3238368324d38d8380c1fec1be0ba55ba6b05624 100644 (file)
@@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "environment.h"
 #include "settings.h"
 #include <ICameraSceneNode.h>
+#include "serialization.h" // For decompressZlib
+#include "gamedef.h"
 
 core::map<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
 
@@ -30,10 +32,10 @@ core::map<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
 */
 
 // Prototype
-TestCAO proto_TestCAO;
+TestCAO proto_TestCAO(NULL);
 
-TestCAO::TestCAO():
-       ClientActiveObject(0),
+TestCAO::TestCAO(IGameDef *gamedef):
+       ClientActiveObject(0, gamedef),
        m_node(NULL),
        m_position(v3f(0,10*BS,0))
 {
@@ -44,17 +46,17 @@ TestCAO::~TestCAO()
 {
 }
 
-ClientActiveObject* TestCAO::create()
+ClientActiveObject* TestCAO::create(IGameDef *gamedef)
 {
-       return new TestCAO();
+       return new TestCAO(gamedef);
 }
 
-void TestCAO::addToScene(scene::ISceneManager *smgr)
+void TestCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc)
 {
        if(m_node != NULL)
                return;
        
-       video::IVideoDriver* driver = smgr->getVideoDriver();
+       //video::IVideoDriver* driver = smgr->getVideoDriver();
        
        scene::SMesh *mesh = new scene::SMesh();
        scene::IMeshBuffer *buf = new scene::SMeshBuffer();
@@ -71,8 +73,7 @@ void TestCAO::addToScene(scene::ISceneManager *smgr)
        // Set material
        buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
        buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
-       buf->getMaterial().setTexture
-                       (0, driver->getTexture(getTexturePath("rat.png").c_str()));
+       buf->getMaterial().setTexture(0, tsrc->getTextureRaw("rat.png"));
        buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
        buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
        buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -146,10 +147,10 @@ void TestCAO::processMessage(const std::string &data)
 #include "inventory.h"
 
 // Prototype
-ItemCAO proto_ItemCAO;
+ItemCAO proto_ItemCAO(NULL);
 
-ItemCAO::ItemCAO():
-       ClientActiveObject(0),
+ItemCAO::ItemCAO(IGameDef *gamedef):
+       ClientActiveObject(0, gamedef),
        m_selection_box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.),
        m_node(NULL),
        m_position(v3f(0,10*BS,0))
@@ -161,17 +162,17 @@ ItemCAO::~ItemCAO()
 {
 }
 
-ClientActiveObject* ItemCAO::create()
+ClientActiveObject* ItemCAO::create(IGameDef *gamedef)
 {
-       return new ItemCAO();
+       return new ItemCAO(gamedef);
 }
 
-void ItemCAO::addToScene(scene::ISceneManager *smgr)
+void ItemCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc)
 {
        if(m_node != NULL)
                return;
        
-       video::IVideoDriver* driver = smgr->getVideoDriver();
+       //video::IVideoDriver* driver = smgr->getVideoDriver();
        
        scene::SMesh *mesh = new scene::SMesh();
        scene::IMeshBuffer *buf = new scene::SMeshBuffer();
@@ -194,8 +195,7 @@ void ItemCAO::addToScene(scene::ISceneManager *smgr)
        buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
        //buf->getMaterial().setTexture(0, NULL);
        // Initialize with the stick texture
-       buf->getMaterial().setTexture
-                       (0, driver->getTexture(getTexturePath("stick.png").c_str()));
+       buf->getMaterial().setTexture(0, tsrc->getTextureRaw("stick.png"));
        buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
        buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
        buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -218,13 +218,13 @@ void ItemCAO::addToScene(scene::ISceneManager *smgr)
        video::ITexture *texture = NULL;
        try{
                InventoryItem *item = NULL;
-               item = InventoryItem::deSerialize(is);
+               item = InventoryItem::deSerialize(is, m_gamedef);
                infostream<<__FUNCTION_NAME<<": m_inventorystring=\""
                                <<m_inventorystring<<"\" -> item="<<item
                                <<std::endl;
                if(item)
                {
-                       texture = item->getImage();
+                       texture = item->getImage(tsrc);
                        delete item;
                }
        }
@@ -327,10 +327,10 @@ void ItemCAO::initialize(const std::string &data)
 #include "inventory.h"
 
 // Prototype
-RatCAO proto_RatCAO;
+RatCAO proto_RatCAO(NULL);
 
-RatCAO::RatCAO():
-       ClientActiveObject(0),
+RatCAO::RatCAO(IGameDef *gamedef):
+       ClientActiveObject(0, gamedef),
        m_selection_box(-BS/3.,0.0,-BS/3., BS/3.,BS/2.,BS/3.),
        m_node(NULL),
        m_position(v3f(0,10*BS,0)),
@@ -343,17 +343,17 @@ RatCAO::~RatCAO()
 {
 }
 
-ClientActiveObject* RatCAO::create()
+ClientActiveObject* RatCAO::create(IGameDef *gamedef)
 {
-       return new RatCAO();
+       return new RatCAO(gamedef);
 }
 
-void RatCAO::addToScene(scene::ISceneManager *smgr)
+void RatCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc)
 {
        if(m_node != NULL)
                return;
        
-       video::IVideoDriver* driver = smgr->getVideoDriver();
+       //video::IVideoDriver* driver = smgr->getVideoDriver();
        
        scene::SMesh *mesh = new scene::SMesh();
        scene::IMeshBuffer *buf = new scene::SMeshBuffer();
@@ -371,8 +371,7 @@ void RatCAO::addToScene(scene::ISceneManager *smgr)
        buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
        buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
        //buf->getMaterial().setTexture(0, NULL);
-       buf->getMaterial().setTexture
-                       (0, driver->getTexture(getTexturePath("rat.png").c_str()));
+       buf->getMaterial().setTexture(0, tsrc->getTextureRaw("rat.png"));
        buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
        buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
        buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -473,10 +472,10 @@ void RatCAO::initialize(const std::string &data)
 #include "inventory.h"
 
 // Prototype
-Oerkki1CAO proto_Oerkki1CAO;
+Oerkki1CAO proto_Oerkki1CAO(NULL);
 
-Oerkki1CAO::Oerkki1CAO():
-       ClientActiveObject(0),
+Oerkki1CAO::Oerkki1CAO(IGameDef *gamedef):
+       ClientActiveObject(0, gamedef),
        m_selection_box(-BS/3.,0.0,-BS/3., BS/3.,BS*2.,BS/3.),
        m_node(NULL),
        m_position(v3f(0,10*BS,0)),
@@ -491,17 +490,17 @@ Oerkki1CAO::~Oerkki1CAO()
 {
 }
 
-ClientActiveObject* Oerkki1CAO::create()
+ClientActiveObject* Oerkki1CAO::create(IGameDef *gamedef)
 {
-       return new Oerkki1CAO();
+       return new Oerkki1CAO(gamedef);
 }
 
-void Oerkki1CAO::addToScene(scene::ISceneManager *smgr)
+void Oerkki1CAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc)
 {
        if(m_node != NULL)
                return;
        
-       video::IVideoDriver* driver = smgr->getVideoDriver();
+       //video::IVideoDriver* driver = smgr->getVideoDriver();
        
        scene::SMesh *mesh = new scene::SMesh();
        scene::IMeshBuffer *buf = new scene::SMeshBuffer();
@@ -519,8 +518,7 @@ void Oerkki1CAO::addToScene(scene::ISceneManager *smgr)
        buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
        buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
        //buf->getMaterial().setTexture(0, NULL);
-       buf->getMaterial().setTexture
-                       (0, driver->getTexture(getTexturePath("oerkki1.png").c_str()));
+       buf->getMaterial().setTexture(0, tsrc->getTextureRaw("oerkki1.png"));
        buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
        buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
        buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -582,6 +580,8 @@ void Oerkki1CAO::updateNodePos()
 
 void Oerkki1CAO::step(float dtime, ClientEnvironment *env)
 {
+       ITextureSource *tsrc = m_gamedef->tsrc();
+
        pos_translator.translate(dtime);
        updateNodePos();
 
@@ -608,8 +608,8 @@ void Oerkki1CAO::step(float dtime, ClientEnvironment *env)
                        // Enable damage texture
                        if(m_node)
                        {
-                               video::IVideoDriver* driver =
-                                       m_node->getSceneManager()->getVideoDriver();
+                               /*video::IVideoDriver* driver =
+                                       m_node->getSceneManager()->getVideoDriver();*/
                                
                                scene::IMesh *mesh = m_node->getMesh();
                                if(mesh == NULL)
@@ -619,8 +619,8 @@ void Oerkki1CAO::step(float dtime, ClientEnvironment *env)
                                for(u16 j=0; j<mc; j++)
                                {
                                        scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
-                                       buf->getMaterial().setTexture(0, driver->getTexture(
-                                                       getTexturePath("oerkki1_damaged.png").c_str()));
+                                       buf->getMaterial().setTexture(0,
+                                                       tsrc->getTextureRaw("oerkki1_damaged.png"));
                                }
                        }
                        m_damage_texture_enabled = true;
@@ -634,8 +634,8 @@ void Oerkki1CAO::step(float dtime, ClientEnvironment *env)
                        // Disable damage texture
                        if(m_node)
                        {
-                               video::IVideoDriver* driver =
-                                       m_node->getSceneManager()->getVideoDriver();
+                               /*video::IVideoDriver* driver =
+                                       m_node->getSceneManager()->getVideoDriver();*/
                                
                                scene::IMesh *mesh = m_node->getMesh();
                                if(mesh == NULL)
@@ -645,8 +645,8 @@ void Oerkki1CAO::step(float dtime, ClientEnvironment *env)
                                for(u16 j=0; j<mc; j++)
                                {
                                        scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
-                                       buf->getMaterial().setTexture(0, driver->getTexture(
-                                                       getTexturePath("oerkki1.png").c_str()));
+                                       buf->getMaterial().setTexture(0,
+                                                       tsrc->getTextureRaw("oerkki1.png"));
                                }
                        }
                        m_damage_texture_enabled = false;
@@ -712,10 +712,10 @@ bool Oerkki1CAO::directReportPunch(const std::string &toolname, v3f dir)
 */
 
 // Prototype
-FireflyCAO proto_FireflyCAO;
+FireflyCAO proto_FireflyCAO(NULL);
 
-FireflyCAO::FireflyCAO():
-       ClientActiveObject(0),
+FireflyCAO::FireflyCAO(IGameDef *gamedef):
+       ClientActiveObject(0, gamedef),
        m_selection_box(-BS/3.,0.0,-BS/3., BS/3.,BS/2.,BS/3.),
        m_node(NULL),
        m_position(v3f(0,10*BS,0)),
@@ -728,17 +728,17 @@ FireflyCAO::~FireflyCAO()
 {
 }
 
-ClientActiveObject* FireflyCAO::create()
+ClientActiveObject* FireflyCAO::create(IGameDef *gamedef)
 {
-       return new FireflyCAO();
+       return new FireflyCAO(gamedef);
 }
 
-void FireflyCAO::addToScene(scene::ISceneManager *smgr)
+void FireflyCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc)
 {
        if(m_node != NULL)
                return;
        
-       video::IVideoDriver* driver = smgr->getVideoDriver();
+       //video::IVideoDriver* driver = smgr->getVideoDriver();
        
        scene::SMesh *mesh = new scene::SMesh();
        scene::IMeshBuffer *buf = new scene::SMeshBuffer();
@@ -756,8 +756,7 @@ void FireflyCAO::addToScene(scene::ISceneManager *smgr)
        buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
        buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
        //buf->getMaterial().setTexture(0, NULL);
-       buf->getMaterial().setTexture
-                       (0, driver->getTexture(getTexturePath("firefly.png").c_str()));
+       buf->getMaterial().setTexture(0, tsrc->getTextureRaw("firefly.png"));
        buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
        buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
        buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -856,10 +855,10 @@ void FireflyCAO::initialize(const std::string &data)
 */
 
 // Prototype
-MobV2CAO proto_MobV2CAO;
+MobV2CAO proto_MobV2CAO(NULL);
 
-MobV2CAO::MobV2CAO():
-       ClientActiveObject(0),
+MobV2CAO::MobV2CAO(IGameDef *gamedef):
+       ClientActiveObject(0, gamedef),
        m_selection_box(-0.4*BS,-0.4*BS,-0.4*BS, 0.4*BS,0.8*BS,0.4*BS),
        m_node(NULL),
        m_position(v3f(0,10*BS,0)),
@@ -888,12 +887,12 @@ MobV2CAO::~MobV2CAO()
        delete m_properties;
 }
 
-ClientActiveObject* MobV2CAO::create()
+ClientActiveObject* MobV2CAO::create(IGameDef *gamedef)
 {
-       return new MobV2CAO();
+       return new MobV2CAO(gamedef);
 }
 
-void MobV2CAO::addToScene(scene::ISceneManager *smgr)
+void MobV2CAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc)
 {
        if(m_node != NULL)
                return;
@@ -905,7 +904,7 @@ void MobV2CAO::addToScene(scene::ISceneManager *smgr)
        
        scene::MyBillboardSceneNode *bill = new scene::MyBillboardSceneNode(
                        smgr->getRootSceneNode(), smgr, -1, v3f(0,0,0), v2f(1,1));
-       bill->setMaterialTexture(0, g_texturesource->getTextureRaw(texture_string));
+       bill->setMaterialTexture(0, tsrc->getTextureRaw(texture_string));
        bill->setMaterialFlag(video::EMF_LIGHTING, false);
        bill->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
        bill->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
@@ -1271,10 +1270,10 @@ void MobV2CAO::setLooks(const std::string &looks)
 #include "luaentity_common.h"
 
 // Prototype
-LuaEntityCAO proto_LuaEntityCAO;
+LuaEntityCAO proto_LuaEntityCAO(NULL);
 
-LuaEntityCAO::LuaEntityCAO():
-       ClientActiveObject(0),
+LuaEntityCAO::LuaEntityCAO(IGameDef *gamedef):
+       ClientActiveObject(0, gamedef),
        m_selection_box(-BS/3.,-BS/3.,-BS/3., BS/3.,BS/3.,BS/3.),
        m_meshnode(NULL),
        m_spritenode(NULL),
@@ -1290,12 +1289,12 @@ LuaEntityCAO::~LuaEntityCAO()
        delete m_prop;
 }
 
-ClientActiveObject* LuaEntityCAO::create()
+ClientActiveObject* LuaEntityCAO::create(IGameDef *gamedef)
 {
-       return new LuaEntityCAO();
+       return new LuaEntityCAO(gamedef);
 }
 
-void LuaEntityCAO::addToScene(scene::ISceneManager *smgr)
+void LuaEntityCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc)
 {
        if(m_meshnode != NULL || m_spritenode != NULL)
                return;
@@ -1310,7 +1309,7 @@ void LuaEntityCAO::addToScene(scene::ISceneManager *smgr)
                if(m_prop->textures.size() >= 1)
                        texturestring = m_prop->textures[0];
                m_spritenode->setMaterialTexture(0,
-                               g_texturesource->getTextureRaw(texturestring));
+                               tsrc->getTextureRaw(texturestring));
                m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false);
                m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
                m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
@@ -1389,7 +1388,7 @@ void LuaEntityCAO::addToScene(scene::ISceneManager *smgr)
                        std::string texturestring = "unknown_block.png";
                        if(m_prop->textures.size() > i)
                                texturestring = m_prop->textures[i];
-                       AtlasPointer ap = g_texturesource->getTexture(texturestring);
+                       AtlasPointer ap = tsrc->getTexture(texturestring);
 
                        // Get the tile texture and atlas transformation
                        video::ITexture* atlas = ap.atlas;