diff options
22 files changed, 661 insertions, 487 deletions
@@ -11,12 +11,16 @@ SERVER_BUILD=build/server/ SHARED_SRC=src/shared/ +TEST_PATH=bin/test/ +TEST_SRC=src/test/ + MASTER_EXE=borkmaster.exe CC=g++ MKDIR=mkdir #Change this on linux RM=rm -f +ECHO=printf #Include directories ILUADIR=./lib/luajit/lua-5.1.5/src @@ -44,9 +48,11 @@ CFLAGS=-Wall -g $(INCLUDES) $(LIBRARIES) LDFLAGS=-mwindows all : $(CLIENT_PATH) $(SERVER_PATH) +client : $(CLIENT_PATH) +server : $(SERVER_PATH) #Compile the client -$(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 $(CLIENT_BUILD)common.o $(CLIENT_BUILD)load_net.o $(CLIENT_BUILD)physcommon.o $(SLIBS) +$(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_scene.o $(CLIENT_BUILD)load_phys.o $(CLIENT_BUILD)common.o $(CLIENT_BUILD)load_net.o $(CLIENT_BUILD)physcommon.o $(SLIBS) $(CC) -static -o $(CLIENT_PATH) $(CFLAGS) $(LIBS) $(CLIENT_BUILD)*.o $(SLIBS) $(CLIENT_BUILD)main.o : $(CLIENT_SRC)main.cpp @@ -55,9 +61,12 @@ $(CLIENT_BUILD)main.o : $(CLIENT_SRC)main.cpp $(CLIENT_BUILD)physcommon.o : $(SHARED_SRC)phys/physcommon.cpp $(SHARED_SRC)phys/physcommon.hpp $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)physcommon.o $(SHARED_SRC)phys/physcommon.cpp -$(CLIENT_BUILD)load_net.o : $(SHARED_SRC)lua_api/load_net.cpp $(SHARED_SRC)lua_api/load_net.hpp +$(CLIENT_BUILD)load_net.o : $(SHARED_SRC)lua_api/load_net.cpp $(SHARED_SRC)lua_api/load_net.hpp $(CLIENT_BUILD)stream.o $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_net.o $(SHARED_SRC)lua_api/load_net.cpp +$(CLIENT_BUILD)stream.o : $(SHARED_SRC)lua_api/stream.cpp $(SHARED_SRC)lua_api/stream.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)stream.o $(SHARED_SRC)lua_api/stream.cpp + $(CLIENT_BUILD)common.o : $(SHARED_SRC)lua_api/common.c $(SHARED_SRC)lua_api/common.h $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)common.o $(SHARED_SRC)lua_api/common.c @@ -79,11 +88,11 @@ $(CLIENT_BUILD)iguiwindow.o : $(CLIENT_BUILD)iguiutil.o $(CLIENT_SRC)lua_api/gui $(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 +$(CLIENT_BUILD)load_phys.o : $(CLIENT_BUILD)cbphysbox.o $(CLIENT_BUILD)bphysmodel.o $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_phys.o $(CLIENT_SRC)lua_api/load_phys.cpp -$(CLIENT_BUILD)load_core.o : $(CLIENT_BUILD)icamera.o $(CLIENT_BUILD)imesh.o $(CLIENT_BUILD)bphysbox.o $(CLIENT_BUILD)ilight.o $(CLIENT_BUILD)bphysmodel.o - $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_core.o $(CLIENT_SRC)lua_api/load_scene.cpp +$(CLIENT_BUILD)load_scene.o : $(CLIENT_BUILD)icamera.o $(CLIENT_BUILD)ilight.o $(CLIENT_BUILD)imesh.o $(CLIENT_BUILD)cbphysbox.o + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_scene.o $(CLIENT_SRC)lua_api/load_scene.cpp $(CLIENT_BUILD)ilight.o : $(CLIENT_SRC)lua_api/scene/ilight.cpp $(CLIENT_SRC)lua_api/scene/ilight.hpp $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)ilight.o $(CLIENT_SRC)lua_api/scene/ilight.cpp @@ -112,10 +121,13 @@ $(CLIENT_BUILD)imesh.o : $(CLIENT_SRC)lua_api/scene/imesh.cpp $(CLIENT_SRC)lua_a $(CLIENT_BUILD)igeneric.o: $(CLIENT_SRC)lua_api/scene/igeneric.cpp $(CLIENT_SRC)lua_api/scene/igeneric.hpp $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)igeneric.o $(CLIENT_SRC)lua_api/scene/igeneric.cpp -$(CLIENT_BUILD)bphysbox.o: $(CLIENT_SRC)lua_api/phys/bphysbox.cpp $(CLIENT_SRC)lua_api/phys/bphysbox.hpp $(CLIENT_SRC)lua_api/scene/igeneric.cpp - $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)bphysbox.o $(CLIENT_SRC)lua_api/phys/bphysbox.cpp +$(CLIENT_BUILD)cbphysbox.o: $(CLIENT_SRC)lua_api/phys/cbphysbox.cpp $(CLIENT_SRC)lua_api/phys/cbphysbox.hpp $(CLIENT_SRC)lua_api/scene/igeneric.cpp $(CLIENT_BUILD)bphysbox.o + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)cbphysbox.o $(CLIENT_SRC)lua_api/phys/cbphysbox.cpp -$(CLIENT_BUILD)bphysmodel.o: $(CLIENT_SRC)lua_api/phys/bphysmodel.cpp $(CLIENT_SRC)lua_api/phys/bphysmodel.hpp $(CLIENT_SRC)lua_api/scene/igeneric.cpp $(CLIENT_SRC)lua_api/phys/bphysbox.cpp +$(CLIENT_BUILD)bphysbox.o: $(SHARED_SRC)lua_api/phys/bphysbox.cpp $(SHARED_SRC)lua_api/phys/bphysbox.hpp $(CLIENT_BUILD)common.o + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)bphysbox.o $(SHARED_SRC)lua_api/phys/bphysbox.cpp + +$(CLIENT_BUILD)bphysmodel.o: $(CLIENT_SRC)lua_api/phys/bphysmodel.cpp $(CLIENT_SRC)lua_api/phys/bphysmodel.hpp $(CLIENT_SRC)lua_api/scene/igeneric.cpp $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)bphysmodel.o $(CLIENT_SRC)lua_api/phys/bphysmodel.cpp $(CLIENT_BUILD)callbackhandeler.o : $(CLIENT_SRC)callbackhandeler.cpp $(CLIENT_SRC)callbackhandeler.hpp @@ -142,12 +154,22 @@ $(SERVER_BUILD)hashmap.o : $(SHARED_SRC)util/hashmap.c $(SHARED_SRC)util/hashmap $(SERVER_BUILD)common.o : $(SHARED_SRC)lua_api/common.c $(SHARED_SRC)lua_api/common.h $(CC) $(CFLAGS) -c -o $(SERVER_BUILD)common.o $(SHARED_SRC)lua_api/common.c -$(SERVER_BUILD)load_net.o : $(SHARED_SRC)lua_api/load_net.cpp $(SHARED_SRC)lua_api/load_net.hpp +$(SERVER_BUILD)load_net.o : $(SHARED_SRC)lua_api/load_net.cpp $(SHARED_SRC)lua_api/load_net.hpp $(SERVER_BUILD)stream.o $(CC) $(CFLAGS) -c -o $(SERVER_BUILD)load_net.o $(SHARED_SRC)lua_api/load_net.cpp +$(SERVER_BUILD)stream.o : $(SHARED_SRC)lua_api/stream.cpp $(SHARED_SRC)lua_api/stream.hpp + $(CC) $(CFLAGS) -c -o $(SERVER_BUILD)stream.o $(SHARED_SRC)lua_api/stream.cpp + #end compile server +#compile & run tests +test: $(TEST_PATH)test_stream + @$(ECHO) "Testing stream : " + @./$(TEST_PATH)test_stream +$(TEST_PATH)test_stream : $(TEST_SRC)test_streams.cpp $(SHARED_SRC)/lua_api/stream.cpp $(SHARED_SRC)/lua_api/stream.hpp + @$(CC) $(CFLAGS) -o $(TEST_PATH)test_stream $(TEST_SRC)test_streams.cpp $(SHARED_SRC)/lua_api/stream.cpp $(SHARED_SRC)/lua_api/stream.hpp +#end tests clean : $(RM) $(SERVER_PATH) diff --git a/src/client/initdevice.cpp b/src/client/initdevice.cpp index e288863..e3af44c 100644 --- a/src/client/initdevice.cpp +++ b/src/client/initdevice.cpp @@ -148,13 +148,10 @@ void parseSetting(const char* settingname, lua_State* L, settings* set){ void settingsFromTable(lua_State *L, SIrrlichtCreationParameters* p){ lua_pushnil(L); settings* set = (settings*)malloc(sizeof(settings)); + printf("Loading settings:"); while(lua_next(L,-2) != 0){ - printf("%s - %s\n", - lua_typename(L, lua_type(L, -2)), - lua_typename(L, lua_type(L, -1))); if(lua_isstring(L,-2)){ const char* setstr = lua_tostring(L,-2); - printf("\tFound setting %s\n",setstr); parseSetting(setstr,L,set); }else{ printf("\tFound a non-string setting key! Key is a %s\n",luaL_typename(L,-1)); @@ -173,7 +170,7 @@ void settingsFromTable(lua_State *L, SIrrlichtCreationParameters* p){ p->WindowSize = set->windowsize; p->ZBufferBits = set->zbuffer; free(set); - printf("Settings loaded"); + printf("[OK]\n"); } IrrlichtDevice* spawnIrrDevice(lua_State* L){ diff --git a/src/client/lua_api/load_scene.cpp b/src/client/lua_api/load_scene.cpp index 285cba0..6d02a2d 100644 --- a/src/client/lua_api/load_scene.cpp +++ b/src/client/lua_api/load_scene.cpp @@ -11,7 +11,7 @@ extern "C" { #include "scene/icamera.hpp" #include "scene/imesh.hpp" #include "scene/ilight.hpp" -#include "phys/bphysbox.hpp" +#include "phys/cbphysbox.hpp" #include "phys/bphysmodel.hpp" using namespace irr; @@ -19,13 +19,16 @@ using namespace irr; extern IrrlichtDevice* device; void load_scenefuncs(lua_State* L){ + lua_newtable(L);//{} + lua_setglobal(L,"scene");// icamera_register(L,device); + imesh_register(L,device); ilight_register(L,device); - bphysbox_register(L,device); + lua_newtable(L); + lua_setglobal(L,"phys"); + cbphysbox_register(L); bphysmodel_register(L,device); - lua_pop(L, 1); + //lua_pop(L, 1); - lua_newtable(L); - lua_setglobal(L,"scene"); } diff --git a/src/client/lua_api/phys/bphysbox.cpp b/src/client/lua_api/phys/bphysbox.cpp index a03b488..c15646f 100644 --- a/src/client/lua_api/phys/bphysbox.cpp +++ b/src/client/lua_api/phys/bphysbox.cpp @@ -1,21 +1,17 @@ #include <stdio.h> #include <stdlib.h> -#include <vector> -#include <memory> -#include <map> -#include <functional> #include <list> extern "C" { #include <lua.h> #include <lauxlib.h> #include <lualib.h> } + #include <btBulletDynamicsCommon.h> #include <irrlicht.h> -#include "../gameparts.hpp" #include "bphysbox.hpp" -#include "../scene/igeneric.hpp" +#include "../../../shared/lua_api/phys/bphysbox.hpp" using namespace irr; using namespace scene; @@ -26,12 +22,13 @@ extern IrrlichtDevice* device; extern btDiscreteDynamicsWorld* World; extern std::list<btRigidBody*> Objects; - +/* static LBPhysNode* checkisbphysbox(lua_State* L, int index){ void* ud = luaL_checkudata(L,index,"phys.physbox"); luaL_argcheck(L,ud != NULL, index, "'phys.physbox' expected"); return (LBPhysNode*) ud; } +*/ /* static LISceneNode* checkismesh(lua_State* L){ @@ -39,252 +36,14 @@ static LISceneNode* checkismesh(lua_State* L){ } */ -//iscenecamera.new(Vector position, Vector lookat, parrent) -// {} {} 0 1 -static int newbphysbox(lua_State* L){ - printf("Createing bphysbox!\n"); - int nargs = lua_gettop(L); - if(nargs != 3){ - printf("Incorrect # of args to create a physbox!"); - } - //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 box: %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 box: %f %f %f\n",sx,sy,sz); - - core::vector3df scale = core::vector3df(sx,sy,sz); - btVector3 pos = btVector3(x,y,z); - core::vector3df ipos = core::vector3df(x,y,z); - //Find the mass - float mass = luaL_optint(L,3,0); - printf("Found mass for physbox:%f\n",mass); - - // Create an Irrlicht cube - scene::ISceneNode* Node = device->getSceneManager()->addCubeSceneNode( - ((f32) 1.0f), - ((ISceneNode*) 0), - ((s32)-1), - ipos, - core::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.physbox"); - 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 delbphysbox(lua_State* L){ - LBPhysNode* pnode = checkisbphysbox(L,-1); - - //delete pnode->r->getMotionState(); - delete pnode->r->getCollisionShape(); - delete pnode->r; - - return 0; -} - -/*mesh:setmaterial("string",layernum=0)*/ +//phys.newphysbox({vector3 size},{vector3 origin},mass) /* -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 int newcbphysbox(lua_State* L){// + newbphysbox(L);//{phys.physbox} + LBPhysNode } */ -static int bphyssetpos(lua_State *L){ - LBPhysNode* i = checkisbphysbox(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 = checkisbphysbox(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 bphysbox_f[] = { - {"new", newbphysbox}, -// {"gethandeler", guigethandeler}, -// {"sethandeler", guisethandeler}, - {0,0}, -}; - -static const luaL_reg bphysbox_m[] = { - {"setmaterial", iscenesetmaterial}, - {"getpos", bphysgetpos}, - {"setpos", bphyssetpos}, -// {"settext", setiguitext}, -// {"remove", removeiguielement}, - {0, 0}, -}; - -int bphysbox_register(lua_State* L, IrrlichtDevice* d){ - - device = d; - - printf("bphysbox registered\n"); - - luaL_newmetatable(L, "phys.physbox"); - - luaL_register(L,"physbox",bphysbox_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,delbphysbox); - lua_settable(L,-4); - - luaL_register(L, NULL, bphysbox_m); - - return 1; +void cbphysbox_register(lua_State* L){ + bphysbox_register(L); } diff --git a/src/client/lua_api/phys/bphysmodel.cpp b/src/client/lua_api/phys/bphysmodel.cpp index b76b336..424fdf8 100644 --- a/src/client/lua_api/phys/bphysmodel.cpp +++ b/src/client/lua_api/phys/bphysmodel.cpp @@ -14,7 +14,7 @@ extern "C" { #include <btBulletDynamicsCommon.h> #include <irrlicht.h> #include "../gameparts.hpp" -#include "bphysbox.hpp" +#include "cbphysbox.hpp" #include "bphysmodel.hpp" #include "../scene/igeneric.hpp" diff --git a/src/client/lua_api/phys/cbphysbox.cpp b/src/client/lua_api/phys/cbphysbox.cpp new file mode 100644 index 0000000..0da9939 --- /dev/null +++ b/src/client/lua_api/phys/cbphysbox.cpp @@ -0,0 +1,49 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <list> +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} + +#include <btBulletDynamicsCommon.h> +#include <irrlicht.h> +#include "cbphysbox.hpp" +#include "../../../shared/lua_api/phys/bphysbox.hpp" + +using namespace irr; +using namespace scene; +using namespace core; +using namespace video; + +extern IrrlichtDevice* device; + +extern btDiscreteDynamicsWorld* World; +extern std::list<btRigidBody*> Objects; +/* +static LBPhysNode* checkisbphysbox(lua_State* L, int index){ + void* ud = luaL_checkudata(L,index,"phys.physbox"); + luaL_argcheck(L,ud != NULL, index, "'phys.physbox' expected"); + return (LBPhysNode*) ud; +} +*/ + +/* +static LISceneNode* checkismesh(lua_State* L){ + return checkismesh(L,1); +} +*/ + +//phys.newphysbox({vector3 size},{vector3 origin},mass) +/* +static int newcbphysbox(lua_State* L){// + newbphysbox(L);//{phys.physbox} + LBPhysNode +} +*/ + +void cbphysbox_register(lua_State* L){ + bphysbox_register(L); +} diff --git a/src/client/lua_api/phys/cbphysbox.hpp b/src/client/lua_api/phys/cbphysbox.hpp new file mode 100644 index 0000000..df2be71 --- /dev/null +++ b/src/client/lua_api/phys/cbphysbox.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> + +void cbphysbox_register(lua_State* L); diff --git a/src/client/lua_api/scene/icamera.cpp b/src/client/lua_api/scene/icamera.cpp index e53de83..14f9283 100644 --- a/src/client/lua_api/scene/icamera.cpp +++ b/src/client/lua_api/scene/icamera.cpp @@ -21,29 +21,32 @@ 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); @@ -67,157 +70,133 @@ 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); +// ifpscamera.new() +static int newiscenefpscamera(lua_State* L){// + ISceneManager* smgr = device->getSceneManager(); + ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS(); + LISceneNode* lcam = (LISceneNode*)lua_newuserdata(L, sizeof(LISceneNode));//userdata_scenenode + int tref = luaL_ref(L,LUA_REGISTRYINDEX);// + lua_rawgeti(L,LUA_REGISTRYINDEX,tref);//userdata_scenenode - //Create the struct - lcam->n = cam; - lcam->funcmap = hashmap_new(); - lcam->type = "iscenefpscamera"; + //Set it's metatable + luaL_getmetatable(L, "scene.ifpscamera");//userdata_scenenode,scene.ifpscamera + lua_setmetatable(L, -2);//userdata_scenenode - //Free up anything made in this function - //free(label); + //Create the struct + lcam->n = cam; + lcam->funcmap = hashmap_new(); + lcam->type = "iscenefpscamera"; //Put it on top and return it - lua_rawgeti(L,LUA_REGISTRYINDEX,tref); - return 1; + //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); + 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<s32>(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"); + //IGUIStaticText* llabel = (IGUIStaticText*) env->addStaticText(label,core::rect<s32>(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); + //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. + 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); + luaL_getmetatable(L, "scene.iscenecamera"); + lua_setmetatable(L, -2); //Create the struct - lcam->n = cam; - lcam->funcmap = hashmap_new(); - lcam->type = "iscenecamera"; + lcam->n = cam; + lcam->funcmap = hashmap_new(); + lcam->type = "iscenecamera"; //Free up anything made in this function - //free(label); + //free(label); //Put it on top and return it - lua_rawgeti(L,LUA_REGISTRYINDEX,tref); - return 1; + 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}, + {"getpos", iscenegetpos}, + {"setpos", iscenesetpos}, +// {"remove", removeiguielement}, + {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; +void icamera_register(lua_State* L, IrrlichtDevice* d){ + device = d; + + 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,{} + 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); } diff --git a/src/client/lua_api/scene/icamera.hpp b/src/client/lua_api/scene/icamera.hpp index 15525f8..38874e3 100644 --- a/src/client/lua_api/scene/icamera.hpp +++ b/src/client/lua_api/scene/icamera.hpp @@ -8,4 +8,4 @@ extern "C" { } #include <irrlicht.h> -int icamera_register(lua_State* L, irr::IrrlichtDevice* d); +void icamera_register(lua_State* L, irr::IrrlichtDevice* d); diff --git a/src/client/lua_api/scene/ilight.cpp b/src/client/lua_api/scene/ilight.cpp index df01dd3..2511999 100644 --- a/src/client/lua_api/scene/ilight.cpp +++ b/src/client/lua_api/scene/ilight.cpp @@ -108,7 +108,7 @@ int ilight_register(lua_State* L, IrrlichtDevice* d){ device = d; - printf("icamera registered\n"); + printf("ilight registered\n"); luaL_newmetatable(L, "scene.ilight"); diff --git a/src/client/lua_api/scene/imesh.cpp b/src/client/lua_api/scene/imesh.cpp index bbb0017..1a1c28b 100644 --- a/src/client/lua_api/scene/imesh.cpp +++ b/src/client/lua_api/scene/imesh.cpp @@ -97,8 +97,6 @@ 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); diff --git a/src/client/main.cpp b/src/client/main.cpp index 763c9f3..13a52e4 100644 --- a/src/client/main.cpp +++ b/src/client/main.cpp @@ -46,33 +46,11 @@ void loadIrrLibs(lua_State* L, IrrlichtDevice* device){ load_physfuncs(L); } -static int GetRandInt(int TMax) { return rand() % TMax; } - void RemoveISceneNode(btRigidBody* rb){ ISceneNode *Node = static_cast<ISceneNode*>(rb->getUserPointer()); - Node->remove(); -} -/* -// Removes all objects from the world -void ClearObjects(btDiscreteDynamicsWorld* wr, core::list<btRigidBody*> objs, void(*f)(btRigidBody*)) { - - for(list<btRigidBody *>::Iterator Iterator = objs.begin(); Iterator != objs.end(); ++Iterator) { - btRigidBody *Object = *Iterator; - - if(f){ - (*f)(Object); - } - // Delete irrlicht node - ISceneNode *Node = static_cast<ISceneNode *>(Object->getUserPointer()); + if(Node) Node->remove(); - - // Remove the object from the world - wr->removeRigidBody(Object); - delete Object; - } - objs.clear(); } -*/ // Converts a quaternion to an euler angle void QuaternionToEuler(const btQuaternion &TQuat, btVector3 &TEuler) { @@ -92,6 +70,8 @@ void QuaternionToEuler(const btQuaternion &TQuat, btVector3 &TEuler) { } void UpdateElement(btRigidBody* TObject){ + + if(TObject->getUserPointer() != NULL){ //UpdateRender(*Iterator); scene::ISceneNode *Node = static_cast<scene::ISceneNode *>((TObject)->getUserPointer()); @@ -103,36 +83,12 @@ void UpdateElement(btRigidBody* TObject){ btVector3 EulerRotation; QuaternionToEuler(TObject->getOrientation(), EulerRotation); Node->setRotation(core::vector3df(EulerRotation[0], EulerRotation[1], EulerRotation[2])); -} -/* -// Runs the physics simulation. -// - TDeltaTime tells the simulation how much time has passed since the last frame so the simulation can run independently of the frame rate. Optionally pass in an argument that will be called on every rigidbody in the world -void UpdatePhysics(double TDeltaTime, void(*f)(btRigidBody*)) { - - World->stepSimulation(TDeltaTime * 0.02f, 60); - - // Relay the object's orientation to irrlicht - for(core::list<btRigidBody *>::Iterator it = Objects.begin(); it != Objects.end(); ++it) { - (*f)(*it); } } -*/ int main(int argc, char *argv[]){ printf("Brok[en]gine Client"); // Initialize bullet - /* - btBroadphaseInterface *BroadPhase = new btAxisSweep3(btVector3(-1000, -1000, -1000), btVector3(1000, 1000, 1000)); - printf("Broadphase\n"); - btDefaultCollisionConfiguration *CollisionConfiguration = new btDefaultCollisionConfiguration(); - printf("Collision config\n"); - btCollisionDispatcher *Dispatcher = new btCollisionDispatcher(CollisionConfiguration); - printf("Dispatcher\n"); - btSequentialImpulseConstraintSolver *Solver = new btSequentialImpulseConstraintSolver(); - printf("Solver\n"); - World = new btDiscreteDynamicsWorld(Dispatcher, BroadPhase, Solver, CollisionConfiguration); - printf("Physics world init ok.\n"); - */ phys_genesis(); //Create a new lua state, this gets shared everywhere @@ -151,7 +107,7 @@ int main(int argc, char *argv[]){ //Sets the global event handeler GlobalEventReceiver ger = GlobalEventReceiver(device); device->setEventReceiver(&ger); - int iErr = luaL_dofile(state,"../data/guitest.lua"); + int iErr = luaL_dofile(state,"../data/init.lua"); if(iErr != 0){ lua_error(state); printf("Failed to open lua file:../data/guitest.lua\n"); @@ -165,7 +121,6 @@ int main(int argc, char *argv[]){ IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); - ITimer* irrTimer = device->getTimer(); device->setWindowCaption(L"Bork[en]gine Client"); @@ -174,7 +129,6 @@ int main(int argc, char *argv[]){ //u32 TimeStamp = irrTimer->getTime(), DeltaTime = 0; //high_resolution_clock::time_point t1 = high_resolution_clock::now(); while(device->run()){ - gameloop_net(L); gameloop_phys(UpdateElement); if(device->isWindowActive()){ @@ -183,7 +137,6 @@ int main(int argc, char *argv[]){ //double steps = delta.count() * 100; //UpdatePhysics(steps,UpdateElement); //t1 = now; - driver->beginScene(true, true, SColor(255,100,101,140)); smgr->drawAll(); @@ -193,31 +146,20 @@ int main(int argc, char *argv[]){ }else{ device->yield(); } - lua_getglobal(state,"GAME"); - lua_getfield(state,-1,"tick"); - if(!lua_isnil(state,-1)) - lua_call(state,0,0); - lua_pop(state,2); + lua_getglobal(state,"GAME");//{} + lua_getfield(state,-1,"tick");//{},function_tick() + if(!lua_isnil(state,-1)){ + lua_call(state,0,0); + lua_pop(state,1); + }else{ + lua_pop(state,2); + } } printf("Closeing lua state...\n"); //lua_close(state); //printf("clearing objects...\n"); //ClearObjects(World,Objects,RemoveISceneNode); //Clearing objects must be done after we droped the device. phys_shutdown(RemoveISceneNode); - /* - printf("cleared objects\n"); - delete BroadPhase; - printf("deleted broadphase\n"); - delete CollisionConfiguration; - printf("deleted collision config\n"); - delete Dispatcher; - printf("Deleted dispatcher\n"); - delete Solver; - printf("deleted solver\n"); - - delete World; //Muah ha ha - printf("deleted world\n"); - */ device->drop(); printf("droped device\n"); diff --git a/src/server/main.cpp b/src/server/main.cpp index 846ec2b..17fd535 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -47,7 +47,6 @@ int main (){ printf("Failed to open lua file:../data/init.lua\n"); } do{ - gameloop(); std::this_thread::yield(); }while(true); diff --git a/src/shared/lua_api/common.c b/src/shared/lua_api/common.c index 1e0c971..140ece1 100644 --- a/src/shared/lua_api/common.c +++ b/src/shared/lua_api/common.c @@ -36,3 +36,81 @@ void loadLLibs(lua_State* L){ lua_call(L,1,0); */ } + + +int pushvector3i(lua_State* L,long a,long b,long c){ + lua_newtable(L); + + lua_pushinteger(L,1); + lua_pushinteger(L,a); + lua_settable(L,-3); + + lua_pushinteger(L,2); + lua_pushinteger(L,b); + lua_settable(L,-3); + + lua_pushinteger(L,3); + lua_pushinteger(L,c); + lua_settable(L,-3); + + return 1; +} +int pushvector3d(lua_State* L,double a,double b,double c){ + lua_newtable(L);//{} + + lua_pushinteger(L,1);//{},1 + lua_pushnumber(L,a);//{},1,a + lua_settable(L,-3);//{} + + lua_pushinteger(L,2);//{},2 + lua_pushnumber(L,b);//{},2,b + lua_settable(L,-3);//{} + + lua_pushinteger(L,3);//{},3 + lua_pushnumber(L,c);//{},3,c + lua_settable(L,-3);//{} + + return 1; +} + +int popvector3i(lua_State* L,long* a,long* b,long* c){//{v3} + lua_pushinteger(L,1);//{v3},1 + lua_gettable(L,-2);//{v3},v3[1] + *a = lua_tointeger(L,-1);//{v3},v3[1] + lua_pop(L,1);//{v3} + + lua_pushinteger(L,2);//{v3},2 + lua_gettable(L,-2);//{v3},v3[2] + *b = lua_tointeger(L,-1);//{v3},v3[2] + lua_pop(L,1);//{v3} + + lua_pushinteger(L,3);//{v3},3 + lua_gettable(L,-2);//{v3},v3[3] + *c = lua_tointeger(L,-1);//{v3},v3[3] + lua_pop(L,1);//{v3} + + lua_pop(L,1);// + return 0; +} + + + +int popvector3d(lua_State* L,double* a,double* b,double* c){ + lua_pushinteger(L,1); + lua_gettable(L,-2); + *a = lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pushinteger(L,2); + lua_gettable(L,-2); + *b = lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pushinteger(L,3); + lua_gettable(L,-2); + *c = lua_tonumber(L,-1); + lua_pop(L,1); + + lua_pop(L,1); + return 0; +} diff --git a/src/shared/lua_api/load_core.h b/src/shared/lua_api/load_core.h new file mode 100644 index 0000000..3e4b2df --- /dev/null +++ b/src/shared/lua_api/load_core.h @@ -0,0 +1,13 @@ + +struct Entity { + +}; + +struct EntityPoint : Entity{ + double pos[3] = {0,0,0}; +}; + +struct EntityMass : PointEntity{ + double ang[3] = {0,0,0}; + int mass = 0; +}; diff --git a/src/shared/lua_api/load_net.cpp b/src/shared/lua_api/load_net.cpp index cd155fb..5280d42 100644 --- a/src/shared/lua_api/load_net.cpp +++ b/src/shared/lua_api/load_net.cpp @@ -20,18 +20,45 @@ extern "C" { #include "load_net.hpp" -//#include <zmq.h> #include "../util/hashmap.h" +#include "stream.hpp" std::map<int,std::map<std::string,int>> netfuncs; +// stream:readInt() +int lstream_readInt(lua_State* L){//self + lua_getfield(L,-1,"data");//self,lightuserdata + if(!lua_islightuserdata(L,-1)){ + lua_pushstring(L,"data field was not light userdata"); + lua_error(L); + } + struct stream* s = (struct stream*)lua_touserdata(L,-1);//self,lightuserdata + printf("Stream in readint was %p\n",s); + stream_print(s); + int i = stream_readInt(s); + printf("In readint, int read from stream was %d\n",i); + lua_pop(L,2);// + lua_pushinteger(L,i);//int + return 1; +} +// stream:writeInt(number) +int lstream_writeInt(lua_State* L){//self,number + lua_getfield(L,-2,"data");//self,number,lightuserdata + struct stream* s = (struct stream*)lua_touserdata(L,-1);//self,number,lightuserdata + printf("Stream in writeInt was %p\n",s); + stream_print(s); + int num = lua_tointeger(L,-2);//self,number,lightuserdata + printf("Integer was %d\n",num); + stream_writeInt(s,num); + lua_pop(L,3);// + return 0; +} + void gameloop_net(lua_State* L){ //printf("Doing net of gameloop\n"); for(std::map<int,std::map<std::string,int>>::iterator it = netfuncs.begin(); it != netfuncs.end(); ++it){ - //printf("Looking for new data for socket %d\n",it->first); char* buf = NULL; int bytes = nn_recv(it->first, &buf, NN_MSG,NN_DONTWAIT); - //printf("After recv\n"); if(bytes < 0 && nn_errno() != EAGAIN){ lua_pushstring(L,"Failed to receive"); lua_error(L); @@ -39,22 +66,27 @@ void gameloop_net(lua_State* L){ //do nothing }else{ //find how long until the first null character - int msglen = strlen(buf); - char msg[msglen]; - msg[msglen] = '\0'; - sprintf(msg,"%s",buf); + struct stream* stream = stream_create(); + stream->length = bytes; + stream->data = buf; + stream_print(stream); + char* msg = stream_readString(stream); std::map<std::string,int> themap = it->second; std::string s = std::string(msg); std::map<std::string,int>::iterator in = themap.find(s); if(in != themap.end()){ lua_rawgeti(L,LUA_REGISTRYINDEX,(*in).second); lua_newtable(L); + lua_pushlightuserdata(L,stream); + lua_setfield(L,-2,"data"); + luaL_getmetatable(L,"net.stream"); + lua_setmetatable(L,-2); lua_call(L,1,0); } nn_freemsg(buf); + free(stream);//We manually set stream->data so free_stream would crash here } } - //hashmap_iterate(netfuncs,check_socket,0); } int bindsocket(lua_State*L){ @@ -66,7 +98,7 @@ int bindsocket(lua_State*L){ int id = nn_bind(fd,s); if(id < 0){ const char* errstr = nn_strerror(nn_errno()); - char* failmsg = "Failed to bind socket: "; + char* failmsg = (char*)"Failed to bind socket: "; int faillen = strlen(failmsg + 2); char buf[faillen + strlen(errstr)]; sprintf(buf,"%s%s\n",failmsg,errstr); @@ -99,16 +131,28 @@ int connectsocket(lua_State* L){ return 0; } +//socket:send("name",function(stream)) int send(lua_State* L){ - const char* data = lua_tostring(L,-1); - lua_pushstring(L,"fd"); - lua_gettable(L,-2); - int fd = lua_tonumber(L,-1); + const char* data = lua_tostring(L,-2);//socket,"name",function(stream) + lua_pushstring(L,"fd");//socket,"name",function(stream),"fd" + lua_gettable(L,-4);//socket,"name",function(stream),int_socketdescriptor + int fd = lua_tonumber(L,-1);//socket,"name",function(stream),int_socketdescriptor + lua_pop(L,1);//socket,"name",function(stream) int dlen = strlen(data); - int err = nn_send(fd,(void*)data,dlen,0); + struct stream* s = stream_create(); + stream_writeString(s,data,dlen); + lua_newtable(L);//socket,"name",function(stream),streamtable + luaL_getmetatable(L,"net.stream");//socket,"name",function(stream),streamtable,net.stream + lua_setmetatable(L,-2);//socket,"name",function(stream),streamtable + lua_pushlightuserdata(L,s);//socket,"name",function(stream),streamtable,lightudata + lua_setfield(L,-2,"data");//socket,"name",function(stream),streamtable + lua_call(L,1,0);//socket,"name" + lua_pop(L,2);// + int err = nn_send(fd,s->data,s->length,0); + stream_free(s); if(err < 0){ const char* errstr = nn_strerror(nn_errno()); - char* failmsg = "Failed to bind socket: "; + char* failmsg = (char*)"Failed to bind socket: "; int faillen = strlen(failmsg + 2); char buf[faillen + strlen(errstr)]; sprintf(buf,"%s%s\n",failmsg,errstr); @@ -119,7 +163,7 @@ int send(lua_State* L){ } //LUA: -//socket:receive(s_name,function(socket)) +//socket:receive(s_name,function(stream)) int netreceive(lua_State* L){ const char* name = lua_tostring(L,-2); int slen = strlen(name); @@ -215,7 +259,17 @@ void loadNetLibs(lua_State* L){ //Set the table to gobal "net" lua_setglobal(L,"net"); - + + //Create the metatable for streams + luaL_newmetatable(L,"net.stream"); //net.stream + lua_newtable(L); + lua_pushcfunction(L,lstream_readInt);//net.stream,{},readInt() + lua_setfield(L,-2,"readInt");//net.stream,{} + lua_pushcfunction(L,lstream_writeInt);//net.stream,{},writeInt() + lua_setfield(L,-2,"writeInt");//net.stream,{} + lua_setfield(L,-2,"__index"); + + //Create the metatable for sockets luaL_newmetatable(L,"net.socket"); lua_pushvalue(L,-1); diff --git a/src/shared/lua_api/load_phys.cpp b/src/shared/lua_api/load_phys.cpp new file mode 100644 index 0000000..c91396c --- /dev/null +++ b/src/shared/lua_api/load_phys.cpp @@ -0,0 +1,6 @@ +#include "load_phys.hpp" + + +void loadPhysLibs(lua_State* L){ + +} diff --git a/src/shared/lua_api/load_phys.hpp b/src/shared/lua_api/load_phys.hpp new file mode 100644 index 0000000..5e05642 --- /dev/null +++ b/src/shared/lua_api/load_phys.hpp @@ -0,0 +1,14 @@ +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include "load_core.hpp" + +struct EntityPhysics : EntityMass{ + btTransform* transform; + btRigidBody* rigidbody; + btCollisionShape* shape; +}EntityPhysics; + +void loadPhysLibs(lua_State* L); diff --git a/src/shared/lua_api/phys/bphysbox.cpp b/src/shared/lua_api/phys/bphysbox.cpp new file mode 100644 index 0000000..be9db07 --- /dev/null +++ b/src/shared/lua_api/phys/bphysbox.cpp @@ -0,0 +1,151 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <list> +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <btBulletDynamicsCommon.h> +#include "bphysbox.hpp" +#include "../common.h" + +extern btDiscreteDynamicsWorld* World; +extern std::list<btRigidBody*> Objects; +/* +static LBPhysNode* checkisbphysbox(lua_State* L, int index){ + void* ud = luaL_checkudata(L,index,"phys.physbox"); + luaL_argcheck(L,ud != NULL, index, "'phys.physbox' expected"); + return (LBPhysNode*) ud; +} +*/ + +/* +static LISceneNode* checkismesh(lua_State* L){ + return checkismesh(L,1); +} +*/ + +// phys.newphysbox(vector3 size, vector3 origin, double mass) +int newbphysbox(lua_State* L){ + printf("Createing bphysbox!\n"); + int nargs = lua_gettop(L); + if(nargs != 3){ + lua_pushfstring(L,"Expected 3 arguments, got %d",nargs); + lua_error(L); + } + double px,py,pz; //position + double sx,sy,sz; //size + double mass; + + mass = lua_tonumber(L,-1);//{v3_size},{v3_origin},mass + lua_pop(L,1);//{v3_size},{v3_origin} + printf("Got mass: %d\n",mass); + + popvector3d(L,&px,&py,&pz);//{v3_size} + printf("Got position: (%f,%f,%f)\n",px,py,pz); + popvector3d(L,&sx,&sy,&sz);// + + btVector3 vshape = btVector3(sx * 0.5f, sy * 0.5f, sz * 0.5f); + printf("Got size: (%f,%f,%f)\n",sx,sy,sz); + btVector3 pos = btVector3(px,py,pz); + + // Set the initial position of the object + btTransform transform; + transform.setIdentity(); + transform.setOrigin(pos); + + // Give it a default MotionState + btDefaultMotionState* motionstate = new btDefaultMotionState(transform); + + // Create the shape + btCollisionShape* shape = new btBoxShape(vshape); + + // Add mass + btVector3 localinertia; + shape->calculateLocalInertia(mass, localinertia); + + // Create the rigid body object + btRigidBody* rigidbody = new btRigidBody(mass, motionstate, shape, localinertia); + + // Add it to the world + World->addRigidBody(rigidbody); + Objects.push_back(rigidbody); + + //Create it's lua representation + lua_newtable(L);//{} + lua_pushlightuserdata(L,rigidbody);//{},ud_rigidbody + lua_setfield(L,-2,"rigidbody");//{} + + //Set it's metatable + luaL_getmetatable(L, "phys.physbox");//{},{phys.physbox} + lua_setmetatable(L, -2);//{} + + return 1; +} + +//{phys.physbox}:delete() +static int delbphysbox(lua_State* L){//self + printf("Attempting to delete physbox\n"); + lua_getfield(L,-1,"rigidbody");//self,ud_rigidbody + btRigidBody* r = (btRigidBody*)lua_touserdata(L,-1);//self,ud_rigidbody + delete r->getCollisionShape(); + delete r->getMotionState(); + delete r; + + return 0; +} + +// physbox:setpos({v3 pos}) +static int bphyssetpos(lua_State *L){//self,{v3 pos} + double nx,ny,nz; + popvector3d(L,&nx,&ny,&nz);//self + + lua_getfield(L,-1,"rigidbody");//self,ud_rigidbody + btRigidBody* i = (btRigidBody*)lua_touserdata(L,-1);//self + btMotionState* ms = i->getMotionState(); + btTransform bt; + ms->getWorldTransform(bt); + + btVector3 to = btVector3(nx,ny,nz); + bt.setOrigin(to); + ms->setWorldTransform(bt); + i->activate(); + lua_pop(L,1);// + return 0; +} + +// {v3 pos} :: physbox:getpos() +static int bphysgetpos(lua_State *L){//self + lua_getfield(L,-1,"rigidbody");//self,ud_rigidbody + btRigidBody* i = (btRigidBody*)lua_touserdata(L,-1);//self,ud_rigidbody + btTransform bt = i->getWorldTransform(); + btVector3 bv = bt.getOrigin(); + lua_pop(L,2);// + pushvector3d(L,bv.x(),bv.y(),bv.z());//{} + + return 1; +} + +static const luaL_reg bphysbox_m[] = { + {"getpos", bphysgetpos}, + {"setpos", bphyssetpos}, + {"delete", delbphysbox}, + {0, 0}, +}; + +void bphysbox_register(lua_State* L){// + + luaL_newmetatable(L, "phys.physbox");//{phys.physbox} + lua_newtable(L);//{phys.physbox},{} + luaL_register(L,NULL,bphysbox_m);//{phys.physbox},{} + lua_setfield(L,-2,"__index");//{phys.physbox} + + lua_pop(L,1);// + + lua_getglobal(L,"phys");//{} + lua_pushcfunction(L,newbphysbox); + lua_setfield(L,-2,"newphysbox"); + +} diff --git a/src/client/lua_api/phys/bphysbox.hpp b/src/shared/lua_api/phys/bphysbox.hpp index 43285f2..cdc4476 100644 --- a/src/client/lua_api/phys/bphysbox.hpp +++ b/src/shared/lua_api/phys/bphysbox.hpp @@ -1,4 +1,5 @@ + #include <stdio.h> #include <stdlib.h> extern "C" { @@ -8,6 +9,5 @@ extern "C" { } #include <irrlicht.h> -int bphysbox_register(lua_State* L, irr::IrrlichtDevice* d); -static int bphyssetpos(lua_State *L); -static int bphysgetpos(lua_State *L); +void bphysbox_register(lua_State* L); +int newbphysbox(lua_State* L); diff --git a/src/shared/lua_api/stream.cpp b/src/shared/lua_api/stream.cpp new file mode 100644 index 0000000..3ec2394 --- /dev/null +++ b/src/shared/lua_api/stream.cpp @@ -0,0 +1,71 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "stream.hpp" + +char stx = 0x002; +char etx = 0x003; + +struct stream* stream_create(){ + struct stream* s = (struct stream*)malloc(sizeof(struct stream)); + s->length = 0; + s->data = (byte*)malloc(sizeof(byte)*0); + s->read = 0; + return s; +} +void stream_writeInt(struct stream* s, int number){ + long o = s->length; + s->length += sizeof(int); + s->data = (byte*)realloc(s->data,s->length); + int* ptr = (int*)(s->data + o); + *ptr = number; +} +int stream_readInt(struct stream* s){ + int* ptr = (int*)(s->data + s->read); + s->read += sizeof(int); + return *ptr; +} +void stream_writeData(struct stream* s, const char* d, int len){ + long o = s->length; + s->length += sizeof(char)*len; + s->data = (byte*)realloc(s->data,s->length); + char* ptr = (char*)(s->data + o); + memcpy(ptr,d,len); +} +void stream_readData(struct stream* s, int len, char* out){ + char* ptr = (char*)(s->data + s->read); + memcpy(out,ptr,len); + s->read += len; +} +void stream_writeString(struct stream* s, const char* str, size_t len){ + stream_writeData(s,str,len); + stream_writeData(s,"\0",1);//Null character +} +char* stream_readString(struct stream* s){ + char* ptr = (char*)(s->data + s->read); + s->read += strlen(ptr) + 1;//+1 for null character + return ptr; +} +void stream_writeDouble(struct stream* s, double number){ + long o = s->length; + s->length += sizeof(double); + s->data = (byte*)realloc(s->data,s->length); + double* ptr = (double*)(s->data + o); + *ptr = number; +} + +void stream_print(struct stream* s){ + printf("Length:%ld\nRead:%ld\nData starts at %p\nData:",s->length, s->read, s->data); + long i = 0; + byte* ptr = s->data; + while(i < s->length){ + printf("%4X",*(ptr + i)); + i++; + } + printf("\n"); +} + +void stream_free(struct stream* s){ + free(s->data); + free(s); +} diff --git a/src/shared/lua_api/stream.hpp b/src/shared/lua_api/stream.hpp new file mode 100644 index 0000000..71eaf0a --- /dev/null +++ b/src/shared/lua_api/stream.hpp @@ -0,0 +1,28 @@ +#include <stdlib.h> + +//Char is not definitvely a byte, read the fucking standard +#define byte char + +typedef struct stream { + long length; + byte* data; + long read; +} stream; + +struct stream* stream_create(); + +void stream_writeInt(struct stream* s, int number); +int stream_readInt(struct stream* s); + +void stream_writeString(struct stream* s, const char* string, size_t len); +char* stream_readString(struct stream* s); + +void stream_writeData(struct stream* s, const char* data, int len); +void stream_readData(struct stream* s, int len, char* out); + +void stream_writeDouble(struct stream* s, double number); +double stream_readDouble(struct stream* s); + +void stream_print(struct stream* s); + +void stream_free(struct stream* s); |
