#include #include #include #include #include #include extern "C" { #include #include #include } #include #include "../gameparts.hpp" #include "icamera.hpp" #include "igeneric.hpp" using namespace irr; using namespace scene; using namespace core; extern IrrlichtDevice* device; static LISceneNode* checkiscenecamera(lua_State* L, int index){ void* ud = luaL_checkudata(L,index,"scene.iscenecamera"); luaL_argcheck(L,ud != NULL, index, "'scene.iscenecamera' expected"); return (LISceneNode*) ud; } static LISceneNode* checkiscenecamera(lua_State* L){ return checkiscenecamera(L,1); } static LISceneNode* checkismayacamera(lua_State* L, int index){ void* ud = luaL_checkudata(L,index,"scene.iscenemayacamera"); luaL_argcheck(L,ud != NULL, index, "'scene.iscenemayacamera' expected"); return (LISceneNode*) ud; } static LISceneNode* checkismayacamera(lua_State* L){ return checkismayacamera(L,1); } static int newiscenemayacamera(lua_State* L){ printf("createing maya camera!\n"); int nargs = lua_gettop(L); ISceneManager* smgr = device->getSceneManager(); ICameraSceneNode* cam = smgr->addCameraSceneNodeMaya(); printf("cam is %p",cam); LISceneNode* lcam = (LISceneNode*)lua_newuserdata(L, sizeof(LISceneNode)); int tref = luaL_ref(L,LUA_REGISTRYINDEX); //Set it's metatable luaL_getmetatable(L, "scene.iscenemayacamera"); lua_setmetatable(L, -2); //Create the struct lcam->n = cam; lcam->funcmap = hashmap_new(); lcam->type = "iscenemayacamera"; //Free up anything made in this function //free(label); //Put it on top and return it lua_rawgeti(L,LUA_REGISTRYINDEX,tref); return 1; } static int newiscenefpscamera(lua_State* L){ printf("createing fps camera!\n"); int nargs = lua_gettop(L); ISceneManager* smgr = device->getSceneManager(); ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS(); printf("cam is %p",cam); LISceneNode* lcam = (LISceneNode*)lua_newuserdata(L, sizeof(LISceneNode)); int tref = luaL_ref(L,LUA_REGISTRYINDEX); //Set it's metatable luaL_getmetatable(L, "scene.iscenefpscamera"); lua_setmetatable(L, -2); //Create the struct lcam->n = cam; lcam->funcmap = hashmap_new(); lcam->type = "iscenefpscamera"; //Free up anything made in this function //free(label); //Put it on top and return it lua_rawgeti(L,LUA_REGISTRYINDEX,tref); return 1; } //iscenecamera.new(Vector position, Vector lookat, parrent) static int newiscenecamera(lua_State* L){ printf("Createing camera!\n"); int nargs = lua_gettop(L); //The position of the camera int startx = luaL_optint(L,1,0); int starty = luaL_optint(L,2,0); int startz = luaL_optint(L,3,0); int endx = luaL_optint(L,4,startx+100); int endy = luaL_optint(L,5,starty+100); int endz = luaL_optint(L,6,startz+100); //Label and tooltip wchar_t* label; const char* labelopt = luaL_optstring(L,5,"Label"); int bls = strlen(labelopt); label = (wchar_t*)malloc(sizeof(wchar_t)*(bls)); mbstowcs(label,labelopt,bls); printf("Got the string option\n"); //If the element has a parrent int parent = -1; if(nargs >= 6){ parent = luaL_optint(L,7,0); printf("got the parrent\n"); } //Create the camera ISceneManager* smgr = device->getSceneManager(); //IGUIEnvironment* env = device->getGUIEnvironment(); //printf("Createing button with data %d %d %d %d, %p, %d, %s, %s\n", startx,starty,endx,endy,guielements[parent],gui_elenum,button_label,button_tooltip); //Create the label //IGUIStaticText* llabel = (IGUIStaticText*) env->addStaticText(label,core::rect(startx,starty,endx,endy),false,false, guielements[parent], gui_elenum++, false); ICameraSceneNode* cam = smgr->addCameraSceneNode(0, vector3df(startx,starty,startz), vector3df(endx,endy,endz)); printf("Registered the camera!\n"); //Register it's callback //registerguicallback(llabel,EGET_ELEMENT_HOVERED,iguilabelevent); //Create it's lua representation LISceneNode* lcam = (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.iscenecamera"); lua_setmetatable(L, -2); //Create the struct lcam->n = cam; lcam->funcmap = hashmap_new(); lcam->type = "iscenecamera"; //Free up anything made in this function //free(label); //Put it on top and return it lua_rawgeti(L,LUA_REGISTRYINDEX,tref); return 1; } static const luaL_reg icamera_f[] = { {"new", newiscenecamera}, // {"gethandeler", guigethandeler}, // {"sethandeler", guisethandeler}, {0,0}, }; static const luaL_reg icamera_m[] = { {"getpos", iscenegetpos}, {"setpos", iscenesetpos}, // {"move", moveiguielement}, // {"settext", setiguitext}, // {"remove", removeiguielement}, {0, 0}, }; static const luaL_reg imayacamera_f[] = { {"new", newiscenemayacamera}, {0,0}, }; static const luaL_reg imayacamera_m[] = { {0,0}, }; static const luaL_reg ifpscamera_f[] = { {"new", newiscenefpscamera}, {0,0}, }; static const luaL_reg ifpscamera_m[] = { {0,0}, }; int icamera_register(lua_State* L, IrrlichtDevice* d){ device = d; printf("icamera registered\n"); luaL_newmetatable(L, "scene.icamera"); luaL_register(L,"icamera",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); //End of camera //Start of maya camera luaL_newmetatable(L,"scene.imayacamera"); luaL_register(L,"imayacamera",imayacamera_f); luaL_newmetatable(L,"scene.ifpscamera"); luaL_register(L,"ifpscamera",ifpscamera_f); return 1; }