3 Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "clientobject.h"
23 #include "constants.h"
26 ClientActiveObject::ClientActiveObject(u16 id):
31 ClientActiveObject::~ClientActiveObject()
36 ClientActiveObject* ClientActiveObject::create(u8 type)
38 if(type == ACTIVEOBJECT_TYPE_INVALID)
40 dstream<<"ClientActiveObject::create(): passed "
41 <<"ACTIVEOBJECT_TYPE_INVALID"<<std::endl;
44 else if(type == ACTIVEOBJECT_TYPE_TEST)
46 dstream<<"ClientActiveObject::create(): passed "
47 <<"ACTIVEOBJECT_TYPE_TEST"<<std::endl;
48 return new TestCAO(0);
50 else if(type == ACTIVEOBJECT_TYPE_LUA)
52 dstream<<"ClientActiveObject::create(): passed "
53 <<"ACTIVEOBJECT_TYPE_LUA"<<std::endl;
58 dstream<<"ClientActiveObject::create(): passed "
59 <<"unknown type="<<type<<std::endl;
68 TestCAO::TestCAO(u16 id):
69 ClientActiveObject(id),
71 m_position(v3f(0,10*BS,0))
79 void TestCAO::addToScene(scene::ISceneManager *smgr)
84 video::IVideoDriver* driver = smgr->getVideoDriver();
86 scene::SMesh *mesh = new scene::SMesh();
87 scene::IMeshBuffer *buf = new scene::SMeshBuffer();
88 video::SColor c(255,255,255,255);
89 video::S3DVertex vertices[4] =
91 video::S3DVertex(-BS/2,-BS/4,0, 0,0,0, c, 0,1),
92 video::S3DVertex(BS/2,-BS/4,0, 0,0,0, c, 1,1),
93 video::S3DVertex(BS/2,BS/4,0, 0,0,0, c, 1,0),
94 video::S3DVertex(-BS/2,BS/4,0, 0,0,0, c, 0,0),
96 u16 indices[] = {0,1,2,2,3,0};
97 buf->append(vertices, 4, indices, 6);
99 buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
100 buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
101 buf->getMaterial().setTexture
102 (0, driver->getTexture(porting::getDataPath("rat.png").c_str()));
103 buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
104 buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
105 buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
107 mesh->addMeshBuffer(buf);
109 m_node = smgr->addMeshSceneNode(mesh, NULL);
114 void TestCAO::removeFromScene()
123 void TestCAO::updateLight(u8 light_at_pos)
127 v3s16 TestCAO::getLightPosition()
129 return floatToInt(m_position, BS);
132 void TestCAO::updateNodePos()
137 m_node->setPosition(m_position);
138 //m_node->setRotation(v3f(0, 45, 0));
141 void TestCAO::step(float dtime)
145 v3f rot = m_node->getRotation();
146 //dstream<<"dtime="<<dtime<<", rot.Y="<<rot.Y<<std::endl;
147 rot.Y += dtime * 180;
148 m_node->setRotation(rot);
152 void TestCAO::processMessage(const std::string &data)
154 dstream<<"TestCAO: Got data: "<<data<<std::endl;
155 std::istringstream is(data, std::ios::binary);
178 object_set_position(self, x, y, z)
180 static int lf_object_set_position(lua_State *L)
183 lua_Number z = lua_tonumber(L, -1);
186 lua_Number y = lua_tonumber(L, -1);
189 lua_Number x = lua_tonumber(L, -1);
192 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
197 self->setPosition(v3f(x*BS,y*BS,z*BS));
199 return 0; // Number of return values
203 object_set_rotation(self, x, y, z)
205 static int lf_object_set_rotation(lua_State *L)
208 lua_Number z = lua_tonumber(L, -1);
211 lua_Number y = lua_tonumber(L, -1);
214 lua_Number x = lua_tonumber(L, -1);
217 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
222 self->setRotation(v3f(x,y,z));
224 return 0; // Number of return values
228 object_add_to_mesh(self, image, corners, backface_culling)
229 corners is an array like this:
230 {{x,y,z},{x,y,z},{x,y,z},{x,y,z}}
232 static int lf_object_add_to_mesh(lua_State *L)
234 // 4: backface_culling
235 bool backface_culling = lua_toboolean(L, -1);
238 if(lua_istable(L, -1) == false)
240 dstream<<"ERROR: object_add_to_mesh(): parameter 3 not a table"
246 for(int i=0; i<4; i++)
249 lua_pushinteger(L, i+1);
251 if(lua_istable(L, -1) == false)
253 dstream<<"ERROR: object_add_to_mesh(): parameter 3 not a"
254 " table of tables"<<std::endl;
258 // Get x, y and z from the child table
260 lua_pushinteger(L, 1);
262 corners[i].X = lua_tonumber(L, -1) * BS;
265 lua_pushinteger(L, 2);
267 corners[i].Y = lua_tonumber(L, -1) * BS;
270 lua_pushinteger(L, 3);
272 corners[i].Z = lua_tonumber(L, -1) * BS;
280 const char *image = lua_tostring(L, -1);
283 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
288 self->addToMesh(image, corners, backface_culling);
290 return 0; // Number of return values
294 object_clear_mesh(self)
296 static int lf_object_clear_mesh(lua_State *L)
299 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
309 LuaCAO::LuaCAO(u16 id):
310 ClientActiveObject(id),
315 m_position(v3f(0,10*BS,0))
317 dstream<<"LuaCAO::LuaCAO(): id="<<id<<std::endl;
327 // Disable some stuff
328 const char *to_disable[] = {
339 const char **td = to_disable;
342 lua_setglobal(L, *td);
346 //lua_pushlightuserdata(L, this);
347 //lua_setglobal(L, "self");
349 // Register functions
350 lua_register(L, "object_set_position", lf_object_set_position);
351 lua_register(L, "object_set_rotation", lf_object_set_rotation);
352 lua_register(L, "object_add_to_mesh", lf_object_add_to_mesh);
353 lua_register(L, "object_clear_mesh", lf_object_clear_mesh);
361 void LuaCAO::step(float dtime)
364 Call step(self, dtime) from lua
367 const char *funcname = "step";
368 lua_getglobal(L, funcname);
369 if(!lua_isfunction(L,-1))
372 dstream<<"WARNING: LuaCAO: Function not found: "
373 <<funcname<<std::endl;
379 lua_pushlightuserdata(L, this);
381 lua_pushnumber(L, dtime);
383 // Call (2 parameters, 0 result)
384 if(lua_pcall(L, 2, 0, 0))
386 dstream<<"WARNING: LuaCAO: Error running function "
388 <<lua_tostring(L,-1)<<std::endl;
393 void LuaCAO::processMessage(const std::string &data)
396 Call process_message(self, data) from lua
399 const char *funcname = "process_message";
400 lua_getglobal(L, funcname);
401 if(!lua_isfunction(L,-1))
404 dstream<<"WARNING: LuaCAO: Function not found: "
405 <<funcname<<std::endl;
411 lua_pushlightuserdata(L, this);
413 lua_pushlstring(L, data.c_str(), data.size());
415 // Call (2 parameters, 0 results)
416 if(lua_pcall(L, 2, 1, 0))
418 dstream<<"WARNING: LuaCAO: Error running function "
420 <<lua_tostring(L,-1)<<std::endl;
425 void LuaCAO::initialize(const std::string &data)
427 dstream<<"LuaCAO::initialize(): id="<<getId()<<std::endl;
429 std::istringstream is(data, std::ios::binary);
430 std::string script = deSerializeLongString(is);
431 std::string other = deSerializeLongString(is);
433 /*dstream<<"=== script (size="<<script.size()<<")"<<std::endl
435 <<"==="<<std::endl;*/
436 dstream<<"LuaCAO::initialize(): script size="<<script.size()<<std::endl;
438 /*dstream<<"other.size()="<<other.size()<<std::endl;
439 dstream<<"other=\""<<other<<"\""<<std::endl;*/
441 // Load the script to lua
445 Call initialize(self, data) in the script
448 const char *funcname = "initialize";
449 lua_getglobal(L, funcname);
450 if(!lua_isfunction(L,-1))
453 dstream<<"WARNING: LuaCAO: Function not found: "
454 <<funcname<<std::endl;
460 lua_pushlightuserdata(L, this);
462 lua_pushlstring(L, other.c_str(), other.size());
464 // Call (2 parameters, 0 result)
465 if(lua_pcall(L, 2, 0, 0))
467 dstream<<"WARNING: LuaCAO: Error running function "
469 <<lua_tostring(L,-1)<<std::endl;
475 void LuaCAO::loadScript(const std::string script)
478 ret = luaL_loadstring(L, script.c_str());
481 const char *message = lua_tostring(L, -1);
483 dstream<<"LuaCAO::loadScript(): lua_loadstring failed: "
484 <<message<<std::endl;
488 ret = lua_pcall(L, 0, 0, 0);
491 const char *message = lua_tostring(L, -1);
493 dstream<<"LuaCAO::loadScript(): lua_pcall failed: "
494 <<message<<std::endl;
500 void LuaCAO::addToScene(scene::ISceneManager *smgr)
504 dstream<<"WARNING: LuaCAO::addToScene() called more than once"
511 dstream<<"WARNING: LuaCAO::addToScene(): m_node != NULL"
520 m_mesh = new scene::SMesh();
521 m_node = smgr->addMeshSceneNode(m_mesh, NULL);
529 addToMesh("rat.png", corners, false);*/
533 dstream<<"WARNING: LuaCAO::addToScene(): m_mesh != NULL"
541 void LuaCAO::addToMesh(const char *image, v3f *corners, bool backface_culling)
543 dstream<<"INFO: addToMesh called"<<std::endl;
545 video::IVideoDriver* driver = m_smgr->getVideoDriver();
549 scene::IMeshBuffer *buf = new scene::SMeshBuffer();
550 video::SColor c(255,255,255,255);
551 video::S3DVertex vertices[4] =
553 video::S3DVertex(corners[0], v3f(0,0,0), c, v2f(0,1)),
554 video::S3DVertex(corners[1], v3f(0,0,0), c, v2f(1,1)),
555 video::S3DVertex(corners[2], v3f(0,0,0), c, v2f(1,0)),
556 video::S3DVertex(corners[3], v3f(0,0,0), c, v2f(0,0)),
557 /*video::S3DVertex(-BS/2,-BS/4,0, 0,0,0, c, 0,1),
558 video::S3DVertex(BS/2,-BS/4,0, 0,0,0, c, 1,1),
559 video::S3DVertex(BS/2,BS/4,0, 0,0,0, c, 1,0),
560 video::S3DVertex(-BS/2,BS/4,0, 0,0,0, c, 0,0),*/
562 u16 indices[] = {0,1,2,2,3,0};
563 buf->append(vertices, 4, indices, 6);
565 buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
566 buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, backface_culling);
567 buf->getMaterial().setTexture
568 (0, driver->getTexture(porting::getDataPath(image).c_str()));
569 buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
570 buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
571 buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
573 m_mesh->addMeshBuffer(buf);
577 m_node->setMesh(m_mesh);
580 void LuaCAO::clearMesh()
584 m_node->setMesh(NULL);
594 void LuaCAO::removeFromScene()
613 void LuaCAO::updateLight(u8 light_at_pos)
617 v3s16 LuaCAO::getLightPosition()
619 return floatToInt(m_position, BS);
622 void LuaCAO::updateNodePos()
627 m_node->setPosition(m_position);
628 m_node->setRotation(-m_rotation);
631 void LuaCAO::setPosition(v3f pos)
637 v3f LuaCAO::getPosition()
642 void LuaCAO::setRotation(v3f rot)
648 v3f LuaCAO::getRotation()