-#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 if(type == ACTIVEOBJECT_TYPE_LUA)
- {
- dstream<<"ClientActiveObject::create(): passed "
- <<"ACTIVEOBJECT_TYPE_LUA"<<std::endl;
- return new LuaCAO(0);
- }
- else
- {
- dstream<<"ClientActiveObject::create(): passed "
- <<"unknown type="<<type<<std::endl;
- return NULL;
- }
-}
-
-/*
- TestCAO
-*/
-
-TestCAO::TestCAO(u16 id):
- ClientActiveObject(id),
- m_node(NULL),
- m_position(v3f(0,10*BS,0))
-{
-}
-
-TestCAO::~TestCAO()
-{
-}
-
-void TestCAO::addToScene(scene::ISceneManager *smgr)
-{
- 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()
-{
- if(m_node == NULL)
- return;
-
- m_node->remove();
- m_node = NULL;
-}
-
-void TestCAO::updateLight(u8 light_at_pos)
-{
-}
-
-v3s16 TestCAO::getLightPosition()
-{
- return floatToInt(m_position, BS);
-}
-
-void TestCAO::updateNodePos()
-{
- if(m_node == NULL)
- 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();
- }
-}
-
-/*
- LuaCAO
-*/
-
-extern "C"{
-#include "lstring.h"
-}
-
-/*
- Functions for calling from script:
-
- object_set_position(self, x, y, z)
- object_set_rotation(self, x, y, z)
- object_add_to_mesh(self, image, corners, backface_culling)
- object_clear_mesh(self)
-
- Callbacks in script:
-
- step(self, dtime)
- process_message(self, data)
- initialize(self, data)
- TODO:
- string status_text(self)
-*/
-
-/*
- object_set_position(self, x, y, z)
-*/
-static int lf_object_set_position(lua_State *L)
-{
- // 4: z
- lua_Number z = lua_tonumber(L, -1);
- lua_pop(L, 1);
- // 3: y
- lua_Number y = lua_tonumber(L, -1);
- lua_pop(L, 1);
- // 2: x
- lua_Number x = lua_tonumber(L, -1);
- lua_pop(L, 1);
- // 1: self
- LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
- lua_pop(L, 1);
-
- assert(self);
-
- self->setPosition(v3f(x*BS,y*BS,z*BS));
-
- return 0; // Number of return values
-}
-
-/*
- object_set_rotation(self, x, y, z)
-*/
-static int lf_object_set_rotation(lua_State *L)
-{
- // 4: z
- lua_Number z = lua_tonumber(L, -1);
- lua_pop(L, 1);
- // 3: y
- lua_Number y = lua_tonumber(L, -1);
- lua_pop(L, 1);
- // 2: x
- lua_Number x = lua_tonumber(L, -1);
- lua_pop(L, 1);
- // 1: self
- LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
- lua_pop(L, 1);
-
- assert(self);
-
- self->setRotation(v3f(x,y,z));
-
- return 0; // Number of return values
-}
-
-/*
- object_add_to_mesh(self, image, corners, backface_culling)
- corners is an array like this:
- {{x,y,z},{x,y,z},{x,y,z},{x,y,z}}
-*/
-static int lf_object_add_to_mesh(lua_State *L)
-{
- // 4: backface_culling
- bool backface_culling = lua_toboolean(L, -1);
- lua_pop(L, 1);
- // 3: corners
- if(lua_istable(L, -1) == false)
- {
- dstream<<"ERROR: object_add_to_mesh(): parameter 3 not a table"
- <<std::endl;
- return 0;
- }
- v3f corners[4];
- // Loop table
- for(int i=0; i<4; i++)
- {
- // Get child table
- lua_pushinteger(L, i+1);
- lua_gettable(L, -2);
- if(lua_istable(L, -1) == false)
- {
- dstream<<"ERROR: object_add_to_mesh(): parameter 3 not a"
- " table of tables"<<std::endl;
- return 0;
- }
-
- // Get x, y and z from the child table
-
- lua_pushinteger(L, 1);
- lua_gettable(L, -2);
- corners[i].X = lua_tonumber(L, -1) * BS;
- lua_pop(L, 1);
-
- lua_pushinteger(L, 2);
- lua_gettable(L, -2);
- corners[i].Y = lua_tonumber(L, -1) * BS;
- lua_pop(L, 1);
-
- lua_pushinteger(L, 3);
- lua_gettable(L, -2);
- corners[i].Z = lua_tonumber(L, -1) * BS;
- lua_pop(L, 1);
-
- // Pop child table
- lua_pop(L, 1);
- }
- lua_pop(L, 1);
- // 2: image
- const char *image = lua_tostring(L, -1);
- lua_pop(L, 1);
- // 1: self
- LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
- lua_pop(L, 1);
-
- assert(self);
-
- self->addToMesh(image, corners, backface_culling);
-
- return 0; // Number of return values
-}