#include #include #include #include #include #include extern "C" { #include #include #include } #include #include "../gameparts.hpp" #include "ilight.hpp" #include "igeneric.hpp" using namespace irr; using namespace scene; using namespace core; extern IrrlichtDevice* device; static LISceneNode* checkiscenelight(lua_State* L, int index){ void* ud = luaL_checkudata(L,index,"scene.ilight"); luaL_argcheck(L,ud != NULL, index, "'scene.ilight' expected"); return (LISceneNode*) ud; } static LISceneNode* checkilight(lua_State* L){ return checkiscenelight(L,1); } //iscenelight.new(Vector position, parrent = nil) static int newiscenelight(lua_State* L){ printf("Createing light!\n"); int nargs = lua_gettop(L); //lua_pop(L,1); // float radius = 100; // if(nargs == 2){ // radius = luaL_optnumber(L,2,100); // } float radius = lua_tonumber(L,-1); printf("radius was %f\n" ,radius); lua_pop(L,1); //The position of the light lua_pushnumber(L,1); lua_gettable(L,-2); float x = lua_tonumber(L,-1); printf("got x: %f\n",x); lua_pop(L,1); lua_pushnumber(L,2); lua_gettable(L,-2); float y = lua_tonumber(L,-1); lua_pop(L,1); lua_pushnumber(L,3); lua_gettable(L,-2); float z = lua_tonumber(L,-1); lua_pop(L,1); printf("Found position for light: %f %f %f\n",x,y,z); //Create the mesh ISceneManager* smgr = device->getSceneManager(); ILightSceneNode* light = smgr->addLightSceneNode(0,vector3df(x,y,z),video::SColor(1.0f,1.0f,1.0f,1.0f),(f32)radius,(s32)-1); printf("Registered the light!\n"); //Register it's callback //registerguicallback(llabel,EGET_ELEMENT_HOVERED,iguilabelevent); //Create it's lua representation LISceneNode* lnode = (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); lnode->n = light; lnode->funcmap = hashmap_new(); lnode->type = "ilight"; //Put it on top and return it lua_rawgeti(L,LUA_REGISTRYINDEX,tref); return 1; } static const luaL_reg icamera_f[] = { {"new", newiscenelight}, // {"gethandeler", guigethandeler}, // {"sethandeler", guisethandeler}, {0,0}, }; static const luaL_reg icamera_m[] = { {"getpos", iscenegetpos}, {"setpos", iscenesetpos}, // {"move", moveiguielement}, // {"settext", setiguitext}, // {"remove", removeiguielement}, {0, 0}, }; int ilight_register(lua_State* L, IrrlichtDevice* d){ device = d; printf("icamera registered\n"); luaL_newmetatable(L, "scene.ilight"); luaL_register(L,"ilight",icamera_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, icamera_m); return 1; }