From 69dbc046eb5a82b38c6d5c3302e9b3b0b3c1bcf1 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 21 Feb 2011 16:10:36 +0200 Subject: preliminary lua scripting framework for objects --- src/clientobject.cpp | 488 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 486 insertions(+), 2 deletions(-) (limited to 'src/clientobject.cpp') diff --git a/src/clientobject.cpp b/src/clientobject.cpp index 46db389cd..e6646eff1 100644 --- a/src/clientobject.cpp +++ b/src/clientobject.cpp @@ -51,7 +51,7 @@ ClientActiveObject* ClientActiveObject::create(u8 type) { dstream<<"ClientActiveObject::create(): passed " <<"ACTIVEOBJECT_TYPE_LUA"<>cmd; @@ -166,4 +166,488 @@ void TestCAO::processMessage(const std::string &data) } } +/* + LuaCAO +*/ + +extern "C"{ +#include "lstring.h" +} + +/* + 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" + <addToMesh(image, corners, backface_culling); + + return 0; // Number of return values +} + +/* + object_clear_mesh(self) +*/ +static int lf_object_clear_mesh(lua_State *L) +{ + // 1: self + LuaCAO *self = (LuaCAO*)lua_touserdata(L, -1); + lua_pop(L, 1); + + assert(self); + + self->clearMesh(); + + return 0; +} + +LuaCAO::LuaCAO(u16 id): + ClientActiveObject(id), + L(NULL), + m_smgr(NULL), + m_node(NULL), + m_mesh(NULL), + m_position(v3f(0,10*BS,0)) +{ + dstream<<"LuaCAO::LuaCAO(): id="<addMeshSceneNode(m_mesh, NULL); + + /*v3f corners[4] = { + v3f(-BS/2,-BS/4,0), + v3f(BS/2,-BS/4,0), + v3f(BS/2,BS/4,0), + v3f(-BS/2,BS/4,0), + }; + addToMesh("rat.png", corners, false);*/ + } + else + { + dstream<<"WARNING: LuaCAO::addToScene(): m_mesh != NULL" + <getVideoDriver(); + + assert(m_mesh); + + scene::IMeshBuffer *buf = new scene::SMeshBuffer(); + video::SColor c(255,255,255,255); + video::S3DVertex vertices[4] = + { + video::S3DVertex(corners[0], v3f(0,0,0), c, v2f(0,1)), + video::S3DVertex(corners[1], v3f(0,0,0), c, v2f(1,1)), + video::S3DVertex(corners[2], v3f(0,0,0), c, v2f(1,0)), + video::S3DVertex(corners[3], v3f(0,0,0), c, v2f(0,0)), + /*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, backface_culling); + buf->getMaterial().setTexture + (0, driver->getTexture(porting::getDataPath(image).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 + m_mesh->addMeshBuffer(buf); + buf->drop(); + // Reset mesh + if(m_node) + m_node->setMesh(m_mesh); +} + +void LuaCAO::clearMesh() +{ + if(m_node) + { + m_node->setMesh(NULL); + } + + if(m_mesh) + { + m_mesh->drop(); + m_mesh = NULL; + } +} + +void LuaCAO::removeFromScene() +{ + if(m_node == NULL) + return; + + if(m_node) + { + m_node->remove(); + m_node = NULL; + } + if(m_mesh) + { + m_mesh->drop(); + m_mesh = NULL; + } + + m_smgr = NULL; +} + +void LuaCAO::updateLight(u8 light_at_pos) +{ +} + +v3s16 LuaCAO::getLightPosition() +{ + return floatToInt(m_position, BS); +} + +void LuaCAO::updateNodePos() +{ + if(m_node == NULL) + return; + + m_node->setPosition(m_position); + m_node->setRotation(-m_rotation); +} + +void LuaCAO::setPosition(v3f pos) +{ + m_position = pos; + updateNodePos(); +} + +v3f LuaCAO::getPosition() +{ + return m_position; +} + +void LuaCAO::setRotation(v3f rot) +{ + m_rotation = rot; + updateNodePos(); +} + +v3f LuaCAO::getRotation() +{ + return m_rotation; +} + -- cgit v1.2.3