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 Functions for calling from script:
180 object_set_position(self, x, y, z)
181 object_set_rotation(self, x, y, z)
182 object_add_to_mesh(self, image, corners, backface_culling)
183 object_clear_mesh(self)
188 process_message(self, data)
189 initialize(self, data)
191 string status_text(self)
195 object_set_position(self, x, y, z)
197 static int lf_object_set_position(lua_State *L)
200 lua_Number z = lua_tonumber(L, -1);
203 lua_Number y = lua_tonumber(L, -1);
206 lua_Number x = lua_tonumber(L, -1);
209 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
214 self->setPosition(v3f(x*BS,y*BS,z*BS));
216 return 0; // Number of return values
220 object_set_rotation(self, x, y, z)
222 static int lf_object_set_rotation(lua_State *L)
225 lua_Number z = lua_tonumber(L, -1);
228 lua_Number y = lua_tonumber(L, -1);
231 lua_Number x = lua_tonumber(L, -1);
234 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
239 self->setRotation(v3f(x,y,z));
241 return 0; // Number of return values
245 object_add_to_mesh(self, image, corners, backface_culling)
246 corners is an array like this:
247 {{x,y,z},{x,y,z},{x,y,z},{x,y,z}}
249 static int lf_object_add_to_mesh(lua_State *L)
251 // 4: backface_culling
252 bool backface_culling = lua_toboolean(L, -1);
255 if(lua_istable(L, -1) == false)
257 dstream<<"ERROR: object_add_to_mesh(): parameter 3 not a table"
263 for(int i=0; i<4; i++)
266 lua_pushinteger(L, i+1);
268 if(lua_istable(L, -1) == false)
270 dstream<<"ERROR: object_add_to_mesh(): parameter 3 not a"
271 " table of tables"<<std::endl;
275 // Get x, y and z from the child table
277 lua_pushinteger(L, 1);
279 corners[i].X = lua_tonumber(L, -1) * BS;
282 lua_pushinteger(L, 2);
284 corners[i].Y = lua_tonumber(L, -1) * BS;
287 lua_pushinteger(L, 3);
289 corners[i].Z = lua_tonumber(L, -1) * BS;
297 const char *image = lua_tostring(L, -1);
300 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
305 self->addToMesh(image, corners, backface_culling);
307 return 0; // Number of return values
311 object_clear_mesh(self)
313 static int lf_object_clear_mesh(lua_State *L)
316 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
326 LuaCAO::LuaCAO(u16 id):
327 ClientActiveObject(id),
332 m_position(v3f(0,10*BS,0))
334 dstream<<"LuaCAO::LuaCAO(): id="<<id<<std::endl;
344 // Disable some stuff
345 const char *to_disable[] = {
356 const char **td = to_disable;
359 lua_setglobal(L, *td);
363 //lua_pushlightuserdata(L, this);
364 //lua_setglobal(L, "self");
366 // Register functions
367 lua_register(L, "object_set_position", lf_object_set_position);
368 lua_register(L, "object_set_rotation", lf_object_set_rotation);
369 lua_register(L, "object_add_to_mesh", lf_object_add_to_mesh);
370 lua_register(L, "object_clear_mesh", lf_object_clear_mesh);
378 void LuaCAO::step(float dtime)
381 Call step(self, dtime) from lua
384 const char *funcname = "step";
385 lua_getglobal(L, funcname);
386 if(!lua_isfunction(L,-1))
389 dstream<<"WARNING: LuaCAO: Function not found: "
390 <<funcname<<std::endl;
396 lua_pushlightuserdata(L, this);
398 lua_pushnumber(L, dtime);
400 // Call (2 parameters, 0 result)
401 if(lua_pcall(L, 2, 0, 0))
403 dstream<<"WARNING: LuaCAO: Error running function "
405 <<lua_tostring(L,-1)<<std::endl;
410 void LuaCAO::processMessage(const std::string &data)
413 Call process_message(self, data) from lua
416 const char *funcname = "process_message";
417 lua_getglobal(L, funcname);
418 if(!lua_isfunction(L,-1))
421 dstream<<"WARNING: LuaCAO: Function not found: "
422 <<funcname<<std::endl;
428 lua_pushlightuserdata(L, this);
430 lua_pushlstring(L, data.c_str(), data.size());
432 // Call (2 parameters, 0 results)
433 if(lua_pcall(L, 2, 1, 0))
435 dstream<<"WARNING: LuaCAO: Error running function "
437 <<lua_tostring(L,-1)<<std::endl;
442 void LuaCAO::initialize(const std::string &data)
444 dstream<<"LuaCAO::initialize(): id="<<getId()<<std::endl;
446 std::istringstream is(data, std::ios::binary);
447 std::string script = deSerializeLongString(is);
448 std::string other = deSerializeLongString(is);
450 /*dstream<<"=== script (size="<<script.size()<<")"<<std::endl
452 <<"==="<<std::endl;*/
453 dstream<<"LuaCAO::initialize(): script size="<<script.size()<<std::endl;
455 /*dstream<<"other.size()="<<other.size()<<std::endl;
456 dstream<<"other=\""<<other<<"\""<<std::endl;*/
458 // Load the script to lua
462 Call initialize(self, data) in the script
465 const char *funcname = "initialize";
466 lua_getglobal(L, funcname);
467 if(!lua_isfunction(L,-1))
470 dstream<<"WARNING: LuaCAO: Function not found: "
471 <<funcname<<std::endl;
477 lua_pushlightuserdata(L, this);
479 lua_pushlstring(L, other.c_str(), other.size());
481 // Call (2 parameters, 0 result)
482 if(lua_pcall(L, 2, 0, 0))
484 dstream<<"WARNING: LuaCAO: Error running function "
486 <<lua_tostring(L,-1)<<std::endl;
492 void LuaCAO::loadScript(const std::string script)
495 ret = luaL_loadstring(L, script.c_str());
498 const char *message = lua_tostring(L, -1);
500 dstream<<"LuaCAO::loadScript(): lua_loadstring failed: "
501 <<message<<std::endl;
505 ret = lua_pcall(L, 0, 0, 0);
508 const char *message = lua_tostring(L, -1);
510 dstream<<"LuaCAO::loadScript(): lua_pcall failed: "
511 <<message<<std::endl;
517 void LuaCAO::addToScene(scene::ISceneManager *smgr)
521 dstream<<"WARNING: LuaCAO::addToScene() called more than once"
528 dstream<<"WARNING: LuaCAO::addToScene(): m_node != NULL"
537 m_mesh = new scene::SMesh();
538 m_node = smgr->addMeshSceneNode(m_mesh, NULL);
546 addToMesh("rat.png", corners, false);*/
550 dstream<<"WARNING: LuaCAO::addToScene(): m_mesh != NULL"
558 void LuaCAO::addToMesh(const char *image, v3f *corners, bool backface_culling)
560 dstream<<"INFO: addToMesh called"<<std::endl;
562 video::IVideoDriver* driver = m_smgr->getVideoDriver();
566 scene::IMeshBuffer *buf = new scene::SMeshBuffer();
567 video::SColor c(255,255,255,255);
568 video::S3DVertex vertices[4] =
570 video::S3DVertex(corners[0], v3f(0,0,0), c, v2f(0,1)),
571 video::S3DVertex(corners[1], v3f(0,0,0), c, v2f(1,1)),
572 video::S3DVertex(corners[2], v3f(0,0,0), c, v2f(1,0)),
573 video::S3DVertex(corners[3], v3f(0,0,0), c, v2f(0,0)),
574 /*video::S3DVertex(-BS/2,-BS/4,0, 0,0,0, c, 0,1),
575 video::S3DVertex(BS/2,-BS/4,0, 0,0,0, c, 1,1),
576 video::S3DVertex(BS/2,BS/4,0, 0,0,0, c, 1,0),
577 video::S3DVertex(-BS/2,BS/4,0, 0,0,0, c, 0,0),*/
579 u16 indices[] = {0,1,2,2,3,0};
580 buf->append(vertices, 4, indices, 6);
582 buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
583 buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, backface_culling);
584 buf->getMaterial().setTexture
585 (0, driver->getTexture(porting::getDataPath(image).c_str()));
586 buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
587 buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
588 buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
590 m_mesh->addMeshBuffer(buf);
594 m_node->setMesh(m_mesh);
597 void LuaCAO::clearMesh()
601 m_node->setMesh(NULL);
611 void LuaCAO::removeFromScene()
630 void LuaCAO::updateLight(u8 light_at_pos)
634 v3s16 LuaCAO::getLightPosition()
636 return floatToInt(m_position, BS);
639 void LuaCAO::updateNodePos()
644 m_node->setPosition(m_position);
645 m_node->setRotation(-m_rotation);
648 void LuaCAO::setPosition(v3f pos)
654 v3f LuaCAO::getPosition()
659 void LuaCAO::setRotation(v3f rot)
665 v3f LuaCAO::getRotation()