diff options
| -rw-r--r-- | Makefile | 13 | ||||
| -rw-r--r-- | src/client/callbackhandeler.cpp | 10 | ||||
| -rw-r--r-- | src/client/callbackhandeler.hpp | 2 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguibutton.cpp | 3 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguilabel.cpp | 3 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguiskin.cpp | 64 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguiskin.hpp | 8 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguiutil.cpp | 61 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguiutil.hpp | 15 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguiwindow.cpp | 167 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguiwindow.hpp | 11 | ||||
| -rw-r--r-- | src/client/lua_api/load_gui.cpp | 8 | ||||
| -rw-r--r-- | src/client/lua_api/phys/bphysbuffer.cpp | 306 | ||||
| -rw-r--r-- | src/client/lua_api/phys/bphysbuffer.hpp | 11 | ||||
| -rw-r--r-- | src/client/lua_api/phys/bphysmodel.cpp | 2 | ||||
| -rw-r--r-- | src/client/lua_api/scene/icamera.cpp | 38 |
16 files changed, 708 insertions, 14 deletions
@@ -31,7 +31,7 @@ LDFLAGS=-mwindows all : $(CLIENT_PATH) $(CLIENT_PATH) : $(CLIENT_BUILD)main.o $(CLIENT_BUILD)initdevice.o $(CLIENT_BUILD)menuhandeler.o $(CLIENT_BUILD)load_gui.o $(CLIENT_BUILD)callbackhandeler.o $(CLIENT_BUILD)load_game.o $(CLIENT_BUILD)load_core.o $(CLIENT_BUILD)load_phys.o - $(CC) -o $(CLIENT_PATH) $(CFLAGS) $(CLIENT_BUILD)main.o $(CLIENT_BUILD)initdevice.o $(CLIENT_BUILD)menuhandeler.o $(CLIENT_BUILD)load_gui.o $(CLIENT_BUILD)load_core.o $(CLIENT_BUILD)iguibutton.o $(CLIENT_BUILD)iguilabel.o $(CLIENT_BUILD)iguigeneric.o $(CLIENT_BUILD)iguielement.o $(CLIENT_BUILD)icamera.o $(CLIENT_BUILD)imesh.o $(CLIENT_BUILD)bphysbox.o $(CLIENT_BUILD)igeneric.o $(CLIENT_BUILD)callbackhandeler.o $(CLIENT_BUILD)hashmap.o $(CLIENT_BUILD)load_game.o $(CLIENT_BUILD)load_phys.o $(CLIENT_BUILD)ilight.o $(CLIENT_BUILD)bphysmodel.o $(LIBS) + $(CC) -o $(CLIENT_PATH) $(CFLAGS) $(CLIENT_BUILD)*.o $(LIBS) #Compile the client $(CLIENT_BUILD)main.o : $(CLIENT_SRC)main.cpp @@ -46,9 +46,15 @@ $(CLIENT_BUILD)menuhandeler.o : $(CLIENT_SRC)menuhandeler.cpp $(CLIENT_SRC)menuh $(CLIENT_BUILD)load_game.o : $(CLIENT_SRC)lua_api/load_game.cpp $(CLIENT_SRC)lua_api/load_game.hpp $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_game.o $(CLIENT_SRC)lua_api/load_game.cpp -$(CLIENT_BUILD)load_gui.o : $(CLIENT_BUILD)iguibutton.o $(CLIENT_BUILD)iguilabel.o $(CLIENT_BUILD)iguielement.o $(CLIENT_BUILD)iguigeneric.o +$(CLIENT_BUILD)load_gui.o : $(CLIENT_BUILD)iguibutton.o $(CLIENT_BUILD)iguilabel.o $(CLIENT_BUILD)iguielement.o $(CLIENT_BUILD)iguigeneric.o $(CLIENT_BUILD)iguiwindow.o $(CLIENT_BUILD)iguiskin.o $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_gui.o $(CLIENT_SRC)lua_api/load_gui.cpp +$(CLIENT_BUILD)iguiwindow.o : $(CLIENT_BUILD)iguiutil.o $(CLIENT_SRC)lua_api/gui/iguiwindow.cpp $(CLIENT_SRC)lua_api/gui/iguiwindow.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)iguiwindow.o $(CLIENT_SRC)lua_api/gui/iguiwindow.cpp + +$(CLIENT_BUILD)iguiutil.o : $(CLIENT_SRC)lua_api/gui/iguiutil.cpp $(CLIENT_SRC)lua_api/gui/iguiutil.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)iguiutil.o $(CLIENT_SRC)lua_api/gui/iguiutil.cpp + $(CLIENT_BUILD)load_phys.o : $(CLIENT_BUILD)bphysbox.o $(CLIENT_BUILD)bphysmodel.o $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_phys.o $(CLIENT_SRC)lua_api/load_phys.cpp @@ -70,6 +76,9 @@ $(CLIENT_BUILD)iguielement.o : $(CLIENT_BUILD)hashmap.o $(CLIENT_SRC)lua_api/gui $(CLIENT_BUILD)iguigeneric.o : $(CLIENT_SRC)lua_api/gui/iguigeneric.cpp $(CLIENT_SRC)lua_api/gui/iguigeneric.hpp $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)iguigeneric.o $(CLIENT_SRC)lua_api/gui/iguigeneric.cpp +$(CLIENT_BUILD)iguiskin.o : $(CLIENT_SRC)lua_api/gui/iguiskin.cpp $(CLIENT_SRC)lua_api/gui/iguiskin.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)iguiskin.o $(CLIENT_SRC)lua_api/gui/iguiskin.cpp + $(CLIENT_BUILD)icamera.o : $(CLIENT_BUILD)igeneric.o $(CLIENT_SRC)lua_api/scene/icamera.cpp $(CLIENT_SRC)lua_api/scene/icamera.hpp $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)icamera.o $(CLIENT_SRC)lua_api/scene/icamera.cpp diff --git a/src/client/callbackhandeler.cpp b/src/client/callbackhandeler.cpp index 5e5e407..59b5bee 100644 --- a/src/client/callbackhandeler.cpp +++ b/src/client/callbackhandeler.cpp @@ -17,10 +17,10 @@ using namespace std; extern lua_State* L; -std::map<IGUIElement*,std::map<EGUI_EVENT_TYPE, void(*)(irr::SEvent)> > guifuncs; +std::map<IGUIElement*,std::map<EGUI_EVENT_TYPE, bool(*)(irr::SEvent)> > guifuncs; //IrrlichtDevice* device; -void registerguicallback(IGUIElement* element, EGUI_EVENT_TYPE event, void (*func)(irr::SEvent)){ +void registerguicallback(IGUIElement* element, EGUI_EVENT_TYPE event, bool (*func)(irr::SEvent)){ printf("Callback registered\n"); guifuncs[element][event] = func; } @@ -35,13 +35,11 @@ bool GlobalEventReceiver::OnEvent(const SEvent& e){ case EET_GUI_EVENT:{ IGUIElement* caller = e.GUIEvent.Caller; EGUI_EVENT_TYPE get = e.GUIEvent.EventType; - printf("detected gui event...\n"); + printf("detected gui event: %d\n",get); bool callerregistered = guifuncs.find(caller) != guifuncs.end(); bool callerhasfunc = guifuncs[caller].find(get) != guifuncs[caller].end(); if (callerregistered && callerhasfunc){ - guifuncs[caller][get](e); - printf("sucessfully called a gui event\n"); - return true; + return guifuncs[caller][get](e); } return false; break; diff --git a/src/client/callbackhandeler.hpp b/src/client/callbackhandeler.hpp index 31c04f8..7bed591 100644 --- a/src/client/callbackhandeler.hpp +++ b/src/client/callbackhandeler.hpp @@ -11,7 +11,7 @@ extern "C" { using namespace irr; using namespace gui; -void registerguicallback(IGUIElement* element, EGUI_EVENT_TYPE event, void (*func)(irr::SEvent)); +void registerguicallback(IGUIElement* element, EGUI_EVENT_TYPE event, bool (*func)(irr::SEvent)); class GlobalEventReceiver : public irr::IEventReceiver{ diff --git a/src/client/lua_api/gui/iguibutton.cpp b/src/client/lua_api/gui/iguibutton.cpp index 88aa48e..494e9f9 100644 --- a/src/client/lua_api/gui/iguibutton.cpp +++ b/src/client/lua_api/gui/iguibutton.cpp @@ -33,7 +33,7 @@ static LIGUIElement* checkiguibutton(lua_State* L){ } //The callback even for all gui buttons -static void iguibuttonevent(irr::SEvent e){ +static bool iguibuttonevent(irr::SEvent e){ IGUIElement* caller = (IGUIElement*)e.GUIEvent.Caller; printf("Some gui something somewhere was pressed\n"); if(iguielements.find(caller) != iguielements.end()){ @@ -65,6 +65,7 @@ static void iguibuttonevent(irr::SEvent e){ } } } + return false; } static int newiguibutton(lua_State* L){ diff --git a/src/client/lua_api/gui/iguilabel.cpp b/src/client/lua_api/gui/iguilabel.cpp index 3754ac6..7c00e84 100644 --- a/src/client/lua_api/gui/iguilabel.cpp +++ b/src/client/lua_api/gui/iguilabel.cpp @@ -30,8 +30,9 @@ static LIGUIElement* checkiguilabel(lua_State* L){ return checkiguilabel(L,1); } -static void iguilabelevent(irr::SEvent e){ +static bool iguilabelevent(irr::SEvent e){ printf("Oh no! an iguilabel generated an event!"); + return false; } static int newiguilabel(lua_State* L){ diff --git a/src/client/lua_api/gui/iguiskin.cpp b/src/client/lua_api/gui/iguiskin.cpp new file mode 100644 index 0000000..edc994b --- /dev/null +++ b/src/client/lua_api/gui/iguiskin.cpp @@ -0,0 +1,64 @@ +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <irrlicht.h> +#include <string> +#include <stdio.h> + +#include "iguiutil.hpp" + +using namespace irr; +using namespace gui; + +extern IrrlichtDevice* device; + +#define register(l,n) lua_pushnumber(l,n);\ +lua_setglobal(l,#n); + +static int setskincolor(lua_State* L){ + irr::gui::EGUI_DEFAULT_COLOR which = (irr::gui::EGUI_DEFAULT_COLOR)luaL_optint(L,1,0); + + video::SColor c = video::SColor(0,0,0,0); + lua_popscolor(L,2,&c); + printf("Setting color %d to (%d, %d, %d, %d)\n",which,c.getRed(),c.getBlue(),c.getGreen(),c.getAlpha()); + IGUIEnvironment* env = device->getGUIEnvironment(); + env->getSkin()->setColor(which,c); + + printf("Color is now %d\n",env->getSkin()->getColor(which).getAlpha()); + + return 0; +} + +int register_skin(lua_State* L){ + register(L,EGDC_3D_DARK_SHADOW); + register(L,EGDC_3D_SHADOW); + register(L,EGDC_3D_FACE); + register(L,EGDC_3D_HIGH_LIGHT); + register(L,EGDC_ACTIVE_BORDER); + register(L,EGDC_ACTIVE_CAPTION); + register(L,EGDC_APP_WORKSPACE); + register(L,EGDC_BUTTON_TEXT); + register(L,EGDC_GRAY_TEXT); + register(L,EGDC_HIGH_LIGHT); + register(L,EGDC_HIGH_LIGHT_TEXT); + register(L,EGDC_INACTIVE_BORDER); + register(L,EGDC_INACTIVE_CAPTION); + register(L,EGDC_TOOLTIP); + register(L,EGDC_TOOLTIP_BACKGROUND); + register(L,EGDC_SCROLLBAR); + register(L,EGDC_WINDOW); + register(L,EGDC_WINDOW_SYMBOL); + register(L,EGDC_ICON); + register(L,EGDC_ICON_HIGH_LIGHT); + register(L,EGDC_GRAY_WINDOW_SYMBOL); + register(L,EGDC_EDITABLE); + register(L,EGDC_GRAY_EDITABLE); + register(L,EGDC_FOCUSED_EDITABLE); + + lua_pushcfunction(L,setskincolor); + lua_setglobal(L,"setskincolor"); + + return 0; +} diff --git a/src/client/lua_api/gui/iguiskin.hpp b/src/client/lua_api/gui/iguiskin.hpp new file mode 100644 index 0000000..fe445d5 --- /dev/null +++ b/src/client/lua_api/gui/iguiskin.hpp @@ -0,0 +1,8 @@ +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <irrlicht.h> + +int register_skin(lua_State* L); diff --git a/src/client/lua_api/gui/iguiutil.cpp b/src/client/lua_api/gui/iguiutil.cpp new file mode 100644 index 0000000..0e8d179 --- /dev/null +++ b/src/client/lua_api/gui/iguiutil.cpp @@ -0,0 +1,61 @@ +#include <stdio.h> + +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} + +#include <btBulletDynamicsCommon.h> + +#include <irrlicht.h> +#include "iguiutil.hpp" + +int lua_popvector2(lua_State* L,int pos, float* x,float* y){ + float p[2]; + + for(int i = 0; i < 2; i++){ + lua_pushnumber(L,i+1); + lua_gettable(L,pos); + p[i] = (float) lua_tonumber(L,-1); + lua_pop(L,1); + } + + printf("Found vector (%f,%f)\n",p[0],p[1]); + *x = p[0]; + *y = p[1]; + return 0; +} + +int lua_popvector2i(lua_State* L,int pos, int* x,int* y){ + int p[2]; + + for(int i = 0; i < 2; i++){ + lua_pushnumber(L,i+1); + lua_gettable(L,pos); + p[i] = (int) lua_tonumber(L,-1); + lua_pop(L,1); + } + + printf("Found vector (%d,%d)\n",p[0],p[1]); + *x = p[0]; + *y = p[1]; + return 0; +} + +int lua_popscolor(lua_State* L, int pos, irr::video::SColor* c){ + int p[4]; + + for(int i = 0; i < 4; i++){ + lua_pushnumber(L,i+1); + lua_gettable(L,pos); + p[i] = (int) lua_tonumber(L,-1); + lua_pop(L,1); + } + c->setRed(p[0]); + c->setBlue(p[1]); + c->setGreen(p[2]); + c->setAlpha(p[3]); + + return 0; +} diff --git a/src/client/lua_api/gui/iguiutil.hpp b/src/client/lua_api/gui/iguiutil.hpp new file mode 100644 index 0000000..f8b4b92 --- /dev/null +++ b/src/client/lua_api/gui/iguiutil.hpp @@ -0,0 +1,15 @@ +#ifndef __IGUIUTIL_H__ +#define __IGUIUTIL_H__ +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <irrlicht.h> + +int lua_popvector2(lua_State* L,int pos, float* x, float* y); + +int lua_popvector2i(lua_State* L,int pos, int* x, int* y); + +int lua_popscolor(lua_State* L, int pos, irr::video::SColor* c); +#endif diff --git a/src/client/lua_api/gui/iguiwindow.cpp b/src/client/lua_api/gui/iguiwindow.cpp new file mode 100644 index 0000000..34b6cfa --- /dev/null +++ b/src/client/lua_api/gui/iguiwindow.cpp @@ -0,0 +1,167 @@ +#include <stdio.h> +#include <stdlib.h> +#include <vector> +#include <memory> +#include <map> +#include <functional> +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <irrlicht.h> +#include "../guiparts.hpp" +#include "iguielement.hpp" +#include "iguiwindow.hpp" +#include "iguiutil.hpp" +#include "../../callbackhandeler.hpp" + +using namespace irr; +using namespace gui; + +//IrrlichtDevice* guidevice; + +static LIGUIElement* checkiguiwindow(lua_State* L, int index){ + void* ud = luaL_checkudata(L,index,"gui.iguiwindow"); + luaL_argcheck(L,ud != NULL, index, "'gui.iguiwindow' expected"); + return (LIGUIElement*) ud; +} + +static LIGUIElement* checkiguiwindow(lua_State* L){ + return checkiguiwindow(L,1); +} + +static bool iguiwindowevent(irr::SEvent e){ + IGUIElement* caller = (IGUIElement*)e.GUIEvent.Caller; + int ref = iguielements[caller]; + EGUI_EVENT_TYPE etype = e.GUIEvent.EventType; + printf("Detected window event\n"); + if(etype == EGET_ELEMENT_CLOSED){ + lua_rawgeti(tL,LUA_REGISTRYINDEX,ref); + printf("getting raw, the thing on the top of stack is a %s\n",luaL_typename(tL,-1)); + LIGUIElement* tbut = checkiguiwindow(tL,-1); + int hashmapresponse; + char* hashkey = (char*)"onclose"; + int terror = hashmap_get(tbut->funcmap,hashkey,(void**)&hashmapresponse); + if(terror == MAP_OK){ //Only call if we actually have that function. + printf("Looks like we have an onclose function, calling!\n"); + lua_rawgeti(tL,LUA_REGISTRYINDEX,hashmapresponse); //push the function + lua_rawgeti(tL,LUA_REGISTRYINDEX,ref); //push the referance to iguielement + lua_call(tL,1,1); + //int b = lua_isnoneornil(tL,1); + int a = lua_toboolean(tL,-1); + printf("a:%d\n",a); + return a; + } + } + printf("Oh no! an iguiwindow generated an event!"); + return false; +} + +static int newiguiwindow(lua_State* L){ + printf("Createing label!\n"); + int nargs = lua_gettop(L); + //The position of the text + + //Frame position + int x,y; + lua_popvector2i(L,1,&x,&y); + + printf("got xy\n"); + + //Frame size + int w,h; + lua_popvector2i(L,2,&w,&h); + + printf("I want to make a frame at (%d,%d) size (%d,%d)\n",x,y,w,h); + + // int startx = luaL_optint(L,1,0); + // int starty = luaL_optint(L,2,0); + // int endx = luaL_optint(L,3,startx+100); + // int endy = luaL_optint(L,4,starty+100); + + //Label + wchar_t* label; + const char* labelopt = luaL_optstring(L,3,"Label"); + int bls = strlen(labelopt); + label = (wchar_t*)calloc(sizeof(wchar_t),(bls)); + mbstowcs(label,labelopt,bls); + printf("Got the string option\n"); + // + //If the element has a parrent + int parent = luaL_optint(L,4,0); + // + // + // //Create the button + IGUIEnvironment* env = guidevice->getGUIEnvironment(); + IGUIWindow* wi = env->addWindow( + core::rect<s32>(x,y,x+w,y+h), + false, + label, + guielements[parent], + -1 + ); + // /Create the label + // IGUIStaticText* llabel = (IGUIStaticText*) env->addStaticText(label,core::rect<s32>(startx,starty,endx,endy),false,false, guielements[parent], gui_elenum++, false); + // printf("Created the button\n"); + // + // /Register it's callback + registerguicallback(wi,EGET_ELEMENT_CLOSED,iguiwindowevent); + // + //Create it's lua representation + LIGUIElement* lwindow = (LIGUIElement*)lua_newuserdata(L, sizeof(LIGUIElement)); + int tref = luaL_ref(L,LUA_REGISTRYINDEX); + iguielements[wi] = 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, "gui.iguiwindow"); + lua_setmetatable(L, -2); + // + //Create the struct + lwindow->e = wi; + lwindow->funcmap = hashmap_new(); + lwindow->type = "iguiwindow"; + // + // /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 iguiwindow_f[] = { + {"new", newiguiwindow}, + {"gethandeler", guigethandeler}, + {"sethandeler", guisethandeler}, + {0,0}, +}; + +static const luaL_reg iguiwindow_m[] = { + {"move", moveiguielement}, + {"settext", setiguitext}, + {"remove", removeiguielement}, + {0, 0}, +}; + +int iguiwindow_register(lua_State* L, IrrlichtDevice* d){ + + luaL_newmetatable(L, "gui.iguiwindow"); + + luaL_register(L,"iguiwindow",iguiwindow_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, iguiwindow_m); + + return 1; +} diff --git a/src/client/lua_api/gui/iguiwindow.hpp b/src/client/lua_api/gui/iguiwindow.hpp new file mode 100644 index 0000000..afc5e7a --- /dev/null +++ b/src/client/lua_api/gui/iguiwindow.hpp @@ -0,0 +1,11 @@ + +#include <stdio.h> +#include <stdlib.h> +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <irrlicht.h> + +int iguiwindow_register(lua_State* L, irr::IrrlichtDevice* d); diff --git a/src/client/lua_api/load_gui.cpp b/src/client/lua_api/load_gui.cpp index e1a6c99..a282d34 100644 --- a/src/client/lua_api/load_gui.cpp +++ b/src/client/lua_api/load_gui.cpp @@ -12,6 +12,8 @@ extern "C" { #include "gui/iguibutton.hpp" #include "gui/iguilabel.hpp" #include "gui/iguigeneric.hpp" +#include "gui/iguiwindow.hpp" +#include "gui/iguiskin.hpp" #include "../callbackhandeler.hpp" #include "guiparts.hpp" @@ -40,11 +42,13 @@ void load_guifuncs(lua_State* L){ iguibutton_register(L,device); iguilabel_register(L,device); iguigeneric_register(L,device); + iguiwindow_register(L,device); lua_pop(L, 1); + + //Various enums + register_skin(L); lua_newtable(L); - //lua_pushcfunction(L,createiguibutton); - //lua_setfield(L,-2,"createButton"); lua_setglobal(L,"gui"); lua_pushcfunction(L,screenwidth); diff --git a/src/client/lua_api/phys/bphysbuffer.cpp b/src/client/lua_api/phys/bphysbuffer.cpp new file mode 100644 index 0000000..367aa37 --- /dev/null +++ b/src/client/lua_api/phys/bphysbuffer.cpp @@ -0,0 +1,306 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <vector> +#include <memory> +#include <map> +#include <functional> +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <btBulletDynamicsCommon.h> +#include <irrlicht.h> +#include "../gameparts.hpp" +#include "bphysbox.hpp" +#include "bphysmodel.hpp" +#include "../scene/igeneric.hpp" + +using namespace irr; +using namespace scene; +using namespace core; +using namespace video; + +extern IrrlichtDevice* device; + +extern btDiscreteDynamicsWorld* World; +extern core::list<btRigidBody*> Objects; + +static LBPhysNode* checkisbphysmodel(lua_State* L, int index){ + void* ud = luaL_checkudata(L,index,"phys.physmodel"); + luaL_argcheck(L,ud != NULL, index, "'phys.physmodel' expected"); + return (LBPhysNode*) ud; +} + +/* +static LISceneNode* checkismesh(lua_State* L){ + return checkismesh(L,1); +} +*/ + +//iscenecamera.new(Vector position, Vector lookat, parrent) +// {} {} 0 1 +static int newbphysmodel(lua_State* L){ + printf("Createing bphysbox!\n"); + int nargs = lua_gettop(L); + if(nargs != 3){ + printf("Incorrect # of args to create a physmodel!"); + } + //The model for the mesh + //const char* modelpath = luaL_optstring(L,1,"error"); + + //Find the vector position + lua_pushnumber(L,1); + lua_gettable(L,-4); + float x = lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pushnumber(L,2); + lua_gettable(L,-4); + float y = lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pushnumber(L,3); + lua_gettable(L,-4); + float z = lua_tonumber(L,-1); + lua_pop(L,1); + printf("Found position for phys model: %f %f %f\n",x,y,z); + + //Find the vector scale + lua_pushnumber(L,1); + lua_gettable(L,-3); + float sx = lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pushnumber(L,2); + lua_gettable(L,-3); + float sy = lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pushnumber(L,3); + lua_gettable(L,-3); + float sz = lua_tonumber(L,-1); + lua_pop(L,1); + + printf("Found scale for phys model: %f %f %f\n",sx,sy,sz); + + //find the model path + const char* mpath = luaL_optstring(L,3,"error.obj"); + + printf("I want to use model %s\n", mpath); + + ISceneManager* smgr = device->getSceneManager(); + IMesh* amesh = smgr->getMesh(mpath); + IMeshBuffer* bf = amesh->getMeshBuffer(0); + u32 ni = bf->getIndexCount(); + + btTriangleMesh* trimesh = new btTriangleMesh(); + for(u32 i = 0; i < ni; i+=3){ + vector3df p1 = bf->getPosition(i + 0); + vector3df p2 = bf->getPosition(i + 1); + vector3df p3 = bf->getPosition(i + 2); + btVector3 b1 = btVector3(p1.X,p1.Y,p1.Z); + btVector3 b2 = btVector3(p2.X,p2.Y,p2.Z); + btVector3 b3 = btVector3(p3.X,p3.Y,p3.Z); + trimesh->addTriangle(b1,b2,b3); + } + btCollisionShape* shape = new btConvexTriangleMeshShape(trimesh,true); + core::vector3df scale = core::vector3df(sx,sy,sz); + btVector3 pos = btVector3(x,y,z); + core::vector3df ipos = core::vector3df(x,y,z); + shape->setLocalScaling(btVector3(sx,sy,sz)); + //Find the mass + float mass = luaL_optint(L,4,0); + printf("Found mass for physbox:%f\n",mass); + + + + // Create an Irrlicht cube + scene::ISceneNode* Node = smgr->addMeshSceneNode( + amesh, + (ISceneNode*)0, + (s32)-1, + ipos, + vector3df(0,0,0), + scale + ); + //Node->setScale(scale); + + printf("Added cube scene node and set it's scale\n"); + + //Node->setMaterialFlag(video::EMF_WIREFRAME,true) + //Node->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); + Node->setMaterialFlag(video::EMF_LIGHTING,true); + //Node->setMaterialTexture(0, device->getVideoDriver()->getTexture("../data/wall.jpg")); + + printf("Set node's lighting stuff...\n"); + + // Set the initial position of the object + btTransform Transform; + Transform.setIdentity(); + Transform.setOrigin(pos); + + printf("Created transform at pos...\n"); + + // Give it a default MotionState + btDefaultMotionState *MotionState = new btDefaultMotionState(Transform); + + // Create the shape + // btVector3 HalfExtents(sx * 0.5f, sy * 0.5f, sz * 0.5f); + // btCollisionShape *Shape = new btBoxShape(HalfExtents); + + printf("Created collision shape..."); + + // Add mass + btVector3 LocalInertia; + shape->calculateLocalInertia(mass, LocalInertia); + + // Create the rigid body object + btRigidBody *RigidBody = new btRigidBody(mass, MotionState, shape, LocalInertia); + + printf("Created rigidboxy..."); + + // Store a pointer to the irrlicht node so we can update it later + RigidBody->setUserPointer((void *)(Node)); + + printf("Set user pointer"); + + // Add it to the world + World->addRigidBody(RigidBody); + printf("Added to world"); + Objects.push_back(RigidBody); + + //Register it's callback + printf("Everything created, makeing the lua representation\n"); + + //Create it's lua representation + LBPhysNode* pnode = (LBPhysNode*)lua_newuserdata(L, sizeof(LBPhysNode)); + 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, "phys.physmodel"); + lua_setmetatable(L, -2); + + //Create the struct + pnode->n = Node; + pnode->r = RigidBody; + pnode->funcmap = hashmap_new(); + pnode->type = "bphysbox"; + + printf("Done createing lua representation!\n"); + //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 delbphysmodel(lua_State* L){ + LBPhysNode* pnode = checkisbphysmodel(L,-1); + + //delete pnode->r->getMotionState(); + delete pnode->r->getCollisionShape(); + delete pnode->r; + + return 0; +} + +static int bphyssetpos(lua_State *L){ + LBPhysNode* i = checkisbphysmodel(L,1); + btTransform bt = i->r->getWorldTransform(); + + lua_pushnumber(L,1); + lua_gettable(L,-2); + f32 x = (f32)lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pushnumber(L,2); + lua_gettable(L,-2); + f32 y = (f32)lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pushnumber(L,3); + lua_gettable(L,-2); + f32 z = (f32)lua_tonumber(L,-1); + lua_pop(L,1); + + btVector3 to = btVector3(x,y,z); + printf("managed to set phys origin\n"); + bt.setOrigin(to); + printf("managed to set phys transform\n"); + i->r->setWorldTransform(bt); + i->r->activate(); + printf("sucess! returning from call\n"); + return 0; +} + +static int bphysgetpos(lua_State *L){ + LBPhysNode* i = checkisbphysmodel(L,1); + btTransform bt = i->r->getWorldTransform(); + btVector3 bv = bt.getOrigin(); + + lua_createtable(L,3,0); + + lua_pushnumber(L,1); + lua_pushnumber(L,bv.x()); + lua_settable(L,-3); + + lua_pushnumber(L,2); + lua_pushnumber(L,bv.y()); + lua_settable(L,-3); + + lua_pushnumber(L,3); + lua_pushnumber(L,bv.z()); + lua_settable(L,-3); + + return 1; +} + +static const luaL_reg bphysmodel_f[] = { + {"new", newbphysbuffer}, +// {"gethandeler", guigethandeler}, +// {"sethandeler", guisethandeler}, + {0,0}, +}; + +static const luaL_reg bphysmodel_m[] = { + {"setmaterial", iscenesetmaterial}, + {"getpos", bphysgetpos}, + {"setpos", bphyssetpos}, +// {"settext", setiguitext}, +// {"remove", removeiguielement}, + {0, 0}, +}; + +int bphysmodel_register(lua_State* L, IrrlichtDevice* d){ + + device = d; + + printf("bphysmodel registered\n"); + + luaL_newmetatable(L, "phys.physmodel"); + + luaL_register(L,"physmodel",bphysmodel_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); + + lua_pushstring(L,"__gc"); + lua_pushcfunction(L,delbphysmodel); + lua_settable(L,-4); + + luaL_register(L, NULL, bphysmodel_m); + + return 1; +} diff --git a/src/client/lua_api/phys/bphysbuffer.hpp b/src/client/lua_api/phys/bphysbuffer.hpp new file mode 100644 index 0000000..a59c451 --- /dev/null +++ b/src/client/lua_api/phys/bphysbuffer.hpp @@ -0,0 +1,11 @@ + +#include <stdio.h> +#include <stdlib.h> +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <irrlicht.h> + +int bphysmodel_register(lua_State* L, irr::IrrlichtDevice* d); diff --git a/src/client/lua_api/phys/bphysmodel.cpp b/src/client/lua_api/phys/bphysmodel.cpp index 08ec599..7bdc483 100644 --- a/src/client/lua_api/phys/bphysmodel.cpp +++ b/src/client/lua_api/phys/bphysmodel.cpp @@ -106,10 +106,10 @@ static int newbphysmodel(lua_State* L){ trimesh->addTriangle(b1,b2,b3); } btCollisionShape* shape = new btConvexTriangleMeshShape(trimesh,true); - core::vector3df scale = core::vector3df(sx,sy,sz); btVector3 pos = btVector3(x,y,z); core::vector3df ipos = core::vector3df(x,y,z); + shape->setLocalScaling(btVector3(sx,sy,sz)); //Find the mass float mass = luaL_optint(L,4,0); printf("Found mass for physbox:%f\n",mass); diff --git a/src/client/lua_api/scene/icamera.cpp b/src/client/lua_api/scene/icamera.cpp index 5a4e3a2..e53de83 100644 --- a/src/client/lua_api/scene/icamera.cpp +++ b/src/client/lua_api/scene/icamera.cpp @@ -67,6 +67,32 @@ static int newiscenemayacamera(lua_State* L){ 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"); @@ -155,6 +181,15 @@ 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; @@ -180,6 +215,9 @@ int icamera_register(lua_State* L, IrrlichtDevice* d){ //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; } |
