#include #include #include #include #include #include extern "C" { #include #include #include } #include #include "../gameparts.hpp" #include "imesh.hpp" #include "igeneric.hpp" using namespace irr; using namespace scene; using namespace core; using namespace video; extern IrrlichtDevice* device; static LISceneNode* checkismesh(lua_State* L, int index){ void* ud = luaL_checkudata(L,index,"scene.imesh"); luaL_argcheck(L,ud != NULL, index, "'scene.imesh' expected"); return (LISceneNode*) ud; } /* static LISceneNode* checkismesh(lua_State* L){ return checkismesh(L,1); } */ //iscenecamera.new(Vector position, Vector lookat, parrent) static int newiscenemesh(lua_State* L){ printf("Createing mesh!\n"); int nargs = lua_gettop(L); if(nargs != 1){ printf("Incorrect # of args to create a mesh!"); } //The model for the mesh const char* modelpath = luaL_optstring(L,1,"error"); //Create the mesh ISceneManager* smgr = device->getSceneManager(); IAnimatedMesh* amesh = smgr->getMesh(modelpath); IAnimatedMeshSceneNode* mesh = smgr->addAnimatedMeshSceneNode( amesh ); printf("Registered the mesh!\n"); //Register it's callback //registerguicallback(llabel,EGET_ELEMENT_HOVERED,iguilabelevent); //Create it's lua representation LISceneNode* lmesh = (LISceneNode*)lua_newuserdata(L, sizeof(LISceneNode)); int tref = luaL_ref(L,LUA_REGISTRYINDEX); //iguielements[lcam] = tref; lua_rawgeti(L,LUA_REGISTRYINDEX,tref);//Put it back on the stack since luaL_ref pops the object. //Set it's metatable luaL_getmetatable(L, "scene.imesh"); lua_setmetatable(L, -2); //Create the struct lmesh->n = mesh; lmesh->funcmap = hashmap_new(); lmesh->type = "imesh"; //Free up anything made in this function //free(label); //Put it on top and return it lua_rawgeti(L,LUA_REGISTRYINDEX,tref); return 1; } /*mesh:setmaterial("string",layernum=0)*/ static int setmaterial(lua_State* L){ LISceneNode* n = checkismesh(L,1); //u32 layernum = luaL_optint(L,3,0); const char* matfile = luaL_optstring(L,2,"error.png"); printf("Setting material on a %s",n->type); IVideoDriver* driver = device->getVideoDriver(); n->n->setMaterialTexture( 0, driver->getTexture(matfile) ); return 0; } static const luaL_reg imesh_f[] = { {"new", newiscenemesh}, // {"gethandeler", guigethandeler}, // {"sethandeler", guisethandeler}, {0,0}, }; static const luaL_reg imesh_m[] = { {"setMaterial", setmaterial}, {"getpos", iscenegetpos}, {"setpos", iscenesetpos}, // {"settext", setiguitext}, // {"remove", removeiguielement}, {0, 0}, }; int imesh_register(lua_State* L, IrrlichtDevice* d){ device = d; printf("imesh registered\n"); luaL_newmetatable(L, "scene.imesh"); luaL_register(L,"imesh",imesh_f); lua_pushstring(L,"__index"); lua_pushstring(L,"gethandeler"); lua_gettable(L,-3); lua_settable(L,-4); lua_pushstring(L,"__newindex"); lua_pushstring(L,"sethandeler"); lua_gettable(L,-3); lua_settable(L,-4); luaL_register(L, NULL, imesh_m); return 1; }