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);
181 on_process_message(self, data)
182 on_initialize(self, data)
184 string on_get_info_text(self)
185 on_block_removed_near({X=,Y=,Z=}, node)
186 on_block_placed_near({X=,Y=,Z=}, node)
190 object_set_position(self, p)
192 static int lf_object_set_position(lua_State *L)
195 assert(lua_istable(L, -1));
196 lua_pushstring(L, "X");
198 lua_Number x = lua_tonumber(L, -1);
200 lua_pushstring(L, "Y");
202 lua_Number y = lua_tonumber(L, -1);
204 lua_pushstring(L, "Z");
206 lua_Number z = lua_tonumber(L, -1);
210 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
215 self->setPosition(v3f(x*BS,y*BS,z*BS));
217 return 0; // Number of return values
221 object_set_rotation(self, p)
223 static int lf_object_set_rotation(lua_State *L)
226 assert(lua_istable(L, -1));
227 lua_pushstring(L, "X");
229 lua_Number x = lua_tonumber(L, -1);
231 lua_pushstring(L, "Y");
233 lua_Number y = lua_tonumber(L, -1);
235 lua_pushstring(L, "Z");
237 lua_Number z = lua_tonumber(L, -1);
241 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
246 self->setRotation(v3f(x,y,z));
248 return 0; // Number of return values
252 object_add_to_mesh(self, image, corners, backface_culling)
253 corners is an array like this:
254 {{x,y,z},{x,y,z},{x,y,z},{x,y,z}}
256 static int lf_object_add_to_mesh(lua_State *L)
258 // 4: backface_culling
259 bool backface_culling = lua_toboolean(L, -1);
262 if(lua_istable(L, -1) == false)
264 dstream<<"ERROR: object_add_to_mesh(): parameter 3 not a table"
270 for(int i=0; i<4; i++)
273 lua_pushinteger(L, i+1);
275 if(lua_istable(L, -1) == false)
277 dstream<<"ERROR: object_add_to_mesh(): parameter 3 not a"
278 " table of tables"<<std::endl;
282 // Get x, y and z from the child table
284 lua_pushinteger(L, 1);
286 corners[i].X = lua_tonumber(L, -1) * BS;
289 lua_pushinteger(L, 2);
291 corners[i].Y = lua_tonumber(L, -1) * BS;
294 lua_pushinteger(L, 3);
296 corners[i].Z = lua_tonumber(L, -1) * BS;
304 const char *image = lua_tostring(L, -1);
307 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
312 self->addToMesh(image, corners, backface_culling);
314 return 0; // Number of return values
318 object_clear_mesh(self)
320 static int lf_object_clear_mesh(lua_State *L)
323 LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1);
333 LuaCAO::LuaCAO(u16 id):
334 ClientActiveObject(id),
339 m_position(v3f(0,10*BS,0))
341 dstream<<"LuaCAO::LuaCAO(): id="<<id<<std::endl;
351 // Disable some stuff
352 const char *to_disable[] = {
363 const char **td = to_disable;
366 lua_setglobal(L, *td);
370 //lua_pushlightuserdata(L, this);
371 //lua_setglobal(L, "self");
373 // Register functions
374 lua_register(L, "object_set_position", lf_object_set_position);
375 lua_register(L, "object_set_rotation", lf_object_set_rotation);
376 lua_register(L, "object_add_to_mesh", lf_object_add_to_mesh);
377 lua_register(L, "object_clear_mesh", lf_object_clear_mesh);
385 void LuaCAO::step(float dtime)
388 Call step(self, dtime) from lua
391 const char *funcname = "on_step";
392 lua_getglobal(L, funcname);
393 if(!lua_isfunction(L,-1))
396 dstream<<"WARNING: LuaCAO: Function not found: "
397 <<funcname<<std::endl;
403 lua_pushlightuserdata(L, this);
405 lua_pushnumber(L, dtime);
407 // Call (2 parameters, 0 result)
408 if(lua_pcall(L, 2, 0, 0))
410 dstream<<"WARNING: LuaCAO: Error running function "
412 <<lua_tostring(L,-1)<<std::endl;
417 void LuaCAO::processMessage(const std::string &data)
420 Call process_message(self, data) from lua
423 const char *funcname = "on_process_message";
424 lua_getglobal(L, funcname);
425 if(!lua_isfunction(L,-1))
428 dstream<<"WARNING: LuaCAO: Function not found: "
429 <<funcname<<std::endl;
435 lua_pushlightuserdata(L, this);
437 lua_pushlstring(L, data.c_str(), data.size());
439 // Call (2 parameters, 0 results)
440 if(lua_pcall(L, 2, 1, 0))
442 dstream<<"WARNING: LuaCAO: Error running function "
444 <<lua_tostring(L,-1)<<std::endl;
449 void LuaCAO::initialize(const std::string &data)
451 dstream<<"LuaCAO::initialize(): id="<<getId()<<std::endl;
453 std::istringstream is(data, std::ios::binary);
454 std::string script = deSerializeLongString(is);
455 std::string other = deSerializeLongString(is);
457 /*dstream<<"=== script (size="<<script.size()<<")"<<std::endl
459 <<"==="<<std::endl;*/
460 dstream<<"LuaCAO::initialize(): script size="<<script.size()<<std::endl;
462 /*dstream<<"other.size()="<<other.size()<<std::endl;
463 dstream<<"other=\""<<other<<"\""<<std::endl;*/
465 // Load the script to lua
469 Call initialize(self, data) in the script
472 const char *funcname = "on_initialize";
473 lua_getglobal(L, funcname);
474 if(!lua_isfunction(L,-1))
477 dstream<<"WARNING: LuaCAO: Function not found: "
478 <<funcname<<std::endl;
484 lua_pushlightuserdata(L, this);
486 lua_pushlstring(L, other.c_str(), other.size());
488 // Call (2 parameters, 0 result)
489 if(lua_pcall(L, 2, 0, 0))
491 dstream<<"WARNING: LuaCAO: Error running function "
493 <<lua_tostring(L,-1)<<std::endl;
499 void LuaCAO::loadScript(const std::string script)
502 ret = luaL_loadstring(L, script.c_str());
505 const char *message = lua_tostring(L, -1);
507 dstream<<"LuaCAO::loadScript(): lua_loadstring failed: "
508 <<message<<std::endl;
512 ret = lua_pcall(L, 0, 0, 0);
515 const char *message = lua_tostring(L, -1);
517 dstream<<"LuaCAO::loadScript(): lua_pcall failed: "
518 <<message<<std::endl;
524 void LuaCAO::addToScene(scene::ISceneManager *smgr)
528 dstream<<"WARNING: LuaCAO::addToScene() called more than once"
535 dstream<<"WARNING: LuaCAO::addToScene(): m_node != NULL"
544 m_mesh = new scene::SMesh();
545 m_node = smgr->addMeshSceneNode(m_mesh, NULL);
553 addToMesh("rat.png", corners, false);*/
557 dstream<<"WARNING: LuaCAO::addToScene(): m_mesh != NULL"
565 void LuaCAO::addToMesh(const char *image, v3f *corners, bool backface_culling)
567 dstream<<"INFO: addToMesh called"<<std::endl;
569 video::IVideoDriver* driver = m_smgr->getVideoDriver();
573 scene::IMeshBuffer *buf = new scene::SMeshBuffer();
574 video::SColor c(255,255,255,255);
575 video::S3DVertex vertices[4] =
577 video::S3DVertex(corners[0], v3f(0,0,0), c, v2f(0,1)),
578 video::S3DVertex(corners[1], v3f(0,0,0), c, v2f(1,1)),
579 video::S3DVertex(corners[2], v3f(0,0,0), c, v2f(1,0)),
580 video::S3DVertex(corners[3], v3f(0,0,0), c, v2f(0,0)),
581 /*video::S3DVertex(-BS/2,-BS/4,0, 0,0,0, c, 0,1),
582 video::S3DVertex(BS/2,-BS/4,0, 0,0,0, c, 1,1),
583 video::S3DVertex(BS/2,BS/4,0, 0,0,0, c, 1,0),
584 video::S3DVertex(-BS/2,BS/4,0, 0,0,0, c, 0,0),*/
586 u16 indices[] = {0,1,2,2,3,0};
587 buf->append(vertices, 4, indices, 6);
589 buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
590 buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, backface_culling);
591 buf->getMaterial().setTexture
592 (0, driver->getTexture(porting::getDataPath(image).c_str()));
593 buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
594 buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
595 buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
597 m_mesh->addMeshBuffer(buf);
601 m_node->setMesh(m_mesh);
604 void LuaCAO::clearMesh()
608 m_node->setMesh(NULL);
618 void LuaCAO::removeFromScene()
637 void LuaCAO::updateLight(u8 light_at_pos)
641 v3s16 LuaCAO::getLightPosition()
643 return floatToInt(m_position, BS);
646 void LuaCAO::updateNodePos()
651 m_node->setPosition(m_position);
652 m_node->setRotation(-m_rotation);
655 void LuaCAO::setPosition(v3f pos)
661 v3f LuaCAO::getPosition()
666 void LuaCAO::setRotation(v3f rot)
672 v3f LuaCAO::getRotation()