#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"); ISceneManager* smgr = device->getSceneManager(); ICameraSceneNode* cam = smgr->addCameraSceneNodeMaya(); printf("cam is %p",cam); lua_newtable(L);//{} lua_pushlightuserdata(L,cam); lua_setfield(L,-2,"node"); //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; } // ifpscamera.new() static int newiscenefpscamera(lua_State* L){// ISceneManager* smgr = device->getSceneManager(); ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS(); lua_newtable(L);//{} lua_pushlightuserdata(L,cam);//{},ud_cam lua_setfield(L,-2,"node"); //LISceneNode* lcam = (LISceneNode*)lua_newuserdata(L, sizeof(LISceneNode));//userdata_scenenode //Set it's metatable luaL_getmetatable(L, "scene.ifpscamera");//userdata_scenenode,scene.ifpscamera lua_setmetatable(L, -2);//userdata_scenenode //Create the struct //lcam->n = cam; //lcam->funcmap = hashmap_new(); //lcam->type = "iscenefpscamera"; 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 if(nargs >= 6){ 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_m[] = { {"getpos", iscenegetpos}, {"setpos", iscenesetpos}, {"getangle", iscenegetangle}, {"setangle", iscenesetangle}, {0, 0}, }; static const luaL_reg imayacamera_m[] = { {0,0}, }; static const luaL_reg ifpscamera_m[] = { {0,0}, }; void icamera_register(lua_State* L){ luaL_newmetatable(L, "scene.icamera");//scene.icamera lua_newtable(L);//scene.icamera, {} luaL_register(L,NULL,icamera_m);//scene.icamera, {} lua_setfield(L,-2,"__index");//scene.icamera lua_pop(L,1);// luaL_newmetatable(L, "scene.imayacamera");//scene.imayacamera lua_newtable(L);//scene.imayascamera,{} luaL_register(L,NULL,imayacamera_m);//scene.imayascamera,{} luaL_register(L,NULL,icamera_m);//scene.imayascamera,{} lua_setfield(L,-2,"__index");//scene.imayascamera lua_pop(L,1);// luaL_newmetatable(L,"scene.ifpscamera");//scene.ifpscamera lua_newtable(L);//scene.ifpscamera, {} luaL_register(L,NULL,ifpscamera_m);//scene.ifpscamera,{} luaL_register(L,NULL,icamera_m);//scene.ifpscamera,{} lua_setfield(L,-2,"__index");//scene.ifpscamera lua_pop(L,1);// lua_getglobal(L,"scene");//{} lua_pushcfunction(L,newiscenecamera);//{},newiscenecamera() lua_setfield(L,-2,"newcamera");//{} lua_pushcfunction(L,newiscenefpscamera);//{},newiscenefpscamera() lua_setfield(L,-2,"newfpscamera");//{} lua_pushcfunction(L,newiscenemayacamera);//{},newiscenemayacamera() lua_setfield(L,-2,"newmayacamera");//{} printf("\"scene\" was set!\n"); lua_pop(L,1);// }