]> git.lizzy.rs Git - minetest.git/blobdiff - src/clientobject.cpp
Add clouds API
[minetest.git] / src / clientobject.cpp
index 61ceefbe37849c67507187b72a2a2c023a775dc0..89a0474a40b1781dfd199e5f8efff8f7fbf1f2a7 100644 (file)
@@ -1,18 +1,18 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
+You should have received a copy of the GNU Lesser General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
@@ -20,144 +20,47 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "clientobject.h"
 #include "debug.h"
 #include "porting.h"
-#include "constants.h"
-#include "utility.h"
-
-ClientActiveObject::ClientActiveObject(u16 id):
-       ActiveObject(id)
-{
-}
-
-ClientActiveObject::~ClientActiveObject()
-{
-       removeFromScene();
-}
-
-ClientActiveObject* ClientActiveObject::create(u8 type)
-{
-       if(type == ACTIVEOBJECT_TYPE_INVALID)
-       {
-               dstream<<"ClientActiveObject::create(): passed "
-                               <<"ACTIVEOBJECT_TYPE_INVALID"<<std::endl;
-               return NULL;
-       }
-       else if(type == ACTIVEOBJECT_TYPE_TEST)
-       {
-               dstream<<"ClientActiveObject::create(): passed "
-                               <<"ACTIVEOBJECT_TYPE_TEST"<<std::endl;
-               return new TestCAO(0);
-       }
-       else
-       {
-               dstream<<"ClientActiveObject::create(): passed "
-                               <<"unknown type="<<type<<std::endl;
-               return NULL;
-       }
-}
 
 /*
-       TestCAO
+       ClientActiveObject
 */
 
-TestCAO::TestCAO(u16 id):
-       ClientActiveObject(id),
-       m_node(NULL),
-       m_position(v3f(0,10*BS,0))
-{
-}
-
-TestCAO::~TestCAO()
-{
-}
-
-void TestCAO::addToScene(scene::ISceneManager *smgr)
+ClientActiveObject::ClientActiveObject(u16 id, Client *client,
+               ClientEnvironment *env):
+       ActiveObject(id),
+       m_client(client),
+       m_env(env)
 {
-       if(m_node != NULL)
-               return;
-       
-       video::IVideoDriver* driver = smgr->getVideoDriver();
-       
-       scene::SMesh *mesh = new scene::SMesh();
-       scene::IMeshBuffer *buf = new scene::SMeshBuffer();
-       video::SColor c(255,255,255,255);
-       video::S3DVertex vertices[4] =
-       {
-               video::S3DVertex(-BS/2,-BS/4,0, 0,0,0, c, 0,1),
-               video::S3DVertex(BS/2,-BS/4,0, 0,0,0, c, 1,1),
-               video::S3DVertex(BS/2,BS/4,0, 0,0,0, c, 1,0),
-               video::S3DVertex(-BS/2,BS/4,0, 0,0,0, c, 0,0),
-       };
-       u16 indices[] = {0,1,2,2,3,0};
-       buf->append(vertices, 4, indices, 6);
-       // Set material
-       buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
-       buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
-       buf->getMaterial().setTexture
-                       (0, driver->getTexture(porting::getDataPath("rat.png").c_str()));
-       buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
-       buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
-       buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
-       // Add to mesh
-       mesh->addMeshBuffer(buf);
-       buf->drop();
-       m_node = smgr->addMeshSceneNode(mesh, NULL);
-       mesh->drop();
-       updateNodePos();
 }
 
-void TestCAO::removeFromScene()
+ClientActiveObject::~ClientActiveObject()
 {
-       if(m_node == NULL)
-               return;
-
-       m_node->remove();
-       m_node = NULL;
+       removeFromScene(true);
 }
 
-void TestCAO::updateLight(u8 light_at_pos)
+ClientActiveObject* ClientActiveObject::create(ActiveObjectType type,
+               Client *client, ClientEnvironment *env)
 {
-}
+       // Find factory function
+       UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type);
+       if(n == m_types.end()) {
+               // If factory is not found, just return.
+               warningstream << "ClientActiveObject: No factory for type="
+                               << (int)type << std::endl;
+               return NULL;
+       }
 
-v3s16 TestCAO::getLightPosition()
-{
-       return floatToInt(m_position, BS);
+       Factory f = n->second;
+       ClientActiveObject *object = (*f)(client, env);
+       return object;
 }
 
-void TestCAO::updateNodePos()
+void ClientActiveObject::registerType(u16 type, Factory f)
 {
-       if(m_node == NULL)
+       UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type);
+       if(n != m_types.end())
                return;
-
-       m_node->setPosition(m_position);
-       //m_node->setRotation(v3f(0, 45, 0));
-}
-
-void TestCAO::step(float dtime)
-{
-       if(m_node)
-       {
-               v3f rot = m_node->getRotation();
-               //dstream<<"dtime="<<dtime<<", rot.Y="<<rot.Y<<std::endl;
-               rot.Y += dtime * 180;
-               m_node->setRotation(rot);
-       }
-}
-
-void TestCAO::processMessage(const std::string &data)
-{
-       dstream<<"TestCAO: Got data: "<<data<<std::endl;
-       std::istringstream is(data, std::ios::binary);
-       u16 cmd;
-       is>>cmd;
-       if(cmd == 0)
-       {
-               v3f newpos;
-               is>>newpos.X;
-               is>>newpos.Y;
-               is>>newpos.Z;
-               m_position = newpos;
-               updateNodePos();
-       }
+       m_types[type] = f;
 }