diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2017-07-04 15:15:48 -0400 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2017-07-04 15:15:48 -0400 |
| commit | b98dbac4ed2f755ce71bd9be17f26a3f86c1e3cc (patch) | |
| tree | c9d7755ca9a308706c4dc1b6fd1eaa690d8ec46e | |
| parent | bced528a07a2ff1591455e4c4228ec18f8e0532d (diff) | |
| download | brokengine-b98dbac4ed2f755ce71bd9be17f26a3f86c1e3cc.tar.gz brokengine-b98dbac4ed2f755ce71bd9be17f26a3f86c1e3cc.tar.bz2 brokengine-b98dbac4ed2f755ce71bd9be17f26a3f86c1e3cc.zip | |
Lots of changes
* client no longer crashes when closed
* started work on adding physics types
* some bugfixes to core lua api
| -rw-r--r-- | Makefile | 83 | ||||
| -rw-r--r-- | src/client/lua_api/gameparts.hpp | 10 | ||||
| -rw-r--r-- | src/client/lua_api/gui/iguibutton.cpp | 4 | ||||
| -rw-r--r-- | src/client/lua_api/load_core.cpp | 10 | ||||
| -rw-r--r-- | src/client/lua_api/load_core.hpp | 2 | ||||
| -rw-r--r-- | src/client/lua_api/load_game.cpp | 2 | ||||
| -rw-r--r-- | src/client/lua_api/load_game.hpp | 2 | ||||
| -rw-r--r-- | src/client/lua_api/load_gui.cpp | 12 | ||||
| -rw-r--r-- | src/client/lua_api/load_gui.hpp | 2 | ||||
| -rw-r--r-- | src/client/lua_api/load_phys.cpp | 22 | ||||
| -rw-r--r-- | src/client/lua_api/load_phys.hpp | 14 | ||||
| -rw-r--r-- | src/client/lua_api/phys/bphysbox.cpp | 286 | ||||
| -rw-r--r-- | src/client/lua_api/phys/bphysbox.hpp | 11 | ||||
| -rw-r--r-- | src/client/lua_api/scene/imesh.cpp | 2 | ||||
| -rw-r--r-- | src/client/main.cpp | 233 |
15 files changed, 628 insertions, 67 deletions
@@ -2,6 +2,7 @@ CLIENT_EXE=borkengin.exe CLIENT_PATH=bin/client/bin/$(CLIENT_EXE) CLIENT_SRC=src/client/ +CLIENT_BUILD=build/client/ SERVER_EXE=borkserver.exe MASTER_EXE=borkmaster.exe @@ -9,7 +10,7 @@ MASTER_EXE=borkmaster.exe CC=g++ #Change this on linux -RM=rm +RM=del #Include directories ILUADIR=./lib/luajit/LuaJIT-2.0.4/src @@ -24,60 +25,66 @@ LIBRARIES=-L$(LLUADIR) -L$(LIRRDIR) -L$(LBULDIR) LIBS=-llua51 -lopengl32 -lm -lIrrlicht -lBulletDynamics -lBulletCollision -lLinearMath #can't compile with -std=c++11 because irrlicht will complain -CFLAGS=-Wall -O3 $(INCLUDES) $(LIBRARIES) +CFLAGS=-Wall -g $(INCLUDES) $(LIBRARIES) 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) $(LIBS) $(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 + #Compile the client -main.o : - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)main.o $(CLIENT_SRC)main.cpp +$(CLIENT_BUILD)main.o : $(CLIENT_SRC)main.cpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)main.o $(CLIENT_SRC)main.cpp + +$(CLIENT_BUILD)initdevice.o : $(CLIENT_SRC)initdevice.cpp $(CLIENT_SRC)initdevice.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)initdevice.o $(CLIENT_SRC)initdevice.cpp + +$(CLIENT_BUILD)menuhandeler.o : $(CLIENT_SRC)menuhandeler.cpp $(CLIENT_SRC)menuhandeler.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)menuhandeler.o $(CLIENT_SRC)menuhandeler.cpp -initdevice.o : - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)initdevice.o $(CLIENT_SRC)initdevice.cpp +$(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 -menuhandeler.o : - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)menuhandeler.o $(CLIENT_SRC)menuhandeler.cpp +$(CLIENT_BUILD)load_gui.o : $(CLIENT_BUILD)iguibutton.o $(CLIENT_BUILD)iguilabel.o $(CLIENT_BUILD)iguielement.o $(CLIENT_BUILD)iguigeneric.o + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_gui.o $(CLIENT_SRC)lua_api/load_gui.cpp -load_game.o : - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)load_game.o $(CLIENT_SRC)lua_api/load_game.cpp +$(CLIENT_BUILD)load_phys.o : $(CLIENT_BUILD)bphysbox.o + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_phys.o $(CLIENT_SRC)lua_api/load_phys.cpp -load_gui.o : iguibutton.o iguilabel.o iguielement.o iguigeneric.o - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)load_gui.o $(CLIENT_SRC)lua_api/load_gui.cpp +$(CLIENT_BUILD)load_core.o : $(CLIENT_BUILD)icamera.o $(CLIENT_BUILD)imesh.o $(CLIENT_BUILD)bphysbox.o + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)load_core.o $(CLIENT_SRC)lua_api/load_core.cpp -load_core.o : icamera.o imesh.o - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)load_core.o $(CLIENT_SRC)lua_api/load_core.cpp +$(CLIENT_BUILD)iguibutton.o : $(CLIENT_SRC)lua_api/gui/iguibutton.cpp $(CLIENT_SRC)lua_api/gui/iguibutton.hpp $(CLIENT_SRC)lua_api/guiparts.hpp $(CLIENT_SRC)callbackhandeler.hpp $(CLIENT_SRC)util/hashmap.h + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)iguibutton.o $(CLIENT_SRC)lua_api/gui/iguibutton.cpp -iguibutton.o : - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)iguibutton.o $(CLIENT_SRC)lua_api/gui/iguibutton.cpp +$(CLIENT_BUILD)iguilabel.o : $(CLIENT_SRC)lua_api/gui/iguilabel.cpp $(CLIENT_SRC)lua_api/gui/iguilabel.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)iguilabel.o $(CLIENT_SRC)lua_api/gui/iguilabel.cpp -iguilabel.o: - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)iguilabel.o $(CLIENT_SRC)lua_api/gui/iguilabel.cpp +$(CLIENT_BUILD)iguielement.o : $(CLIENT_BUILD)hashmap.o $(CLIENT_SRC)lua_api/gui/iguielement.cpp $(CLIENT_SRC)lua_api/gui/iguielement.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)iguielement.o $(CLIENT_SRC)lua_api/gui/iguielement.cpp -iguielement.o : hashmap.o - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)iguielement.o $(CLIENT_SRC)lua_api/gui/iguielement.cpp +$(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 -iguigeneric.o : - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)iguigeneric.o $(CLIENT_SRC)lua_api/gui/iguigeneric.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 -icamera.o: igeneric.o - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)icamera.o $(CLIENT_SRC)lua_api/scene/icamera.cpp +$(CLIENT_BUILD)imesh.o : $(CLIENT_SRC)lua_api/scene/imesh.cpp $(CLIENT_SRC)lua_api/scene/imesh.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)imesh.o $(CLIENT_SRC)lua_api/scene/imesh.cpp -imesh.o: - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)imesh.o $(CLIENT_SRC)lua_api/scene/imesh.cpp +$(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 -igeneric.o: - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)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 + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)bphysbox.o $(CLIENT_SRC)lua_api/phys/bphysbox.cpp -callbackhandeler.o : - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)callbackhandeler.o $(CLIENT_SRC)callbackhandeler.cpp +$(CLIENT_BUILD)callbackhandeler.o : $(CLIENT_SRC)callbackhandeler.cpp $(CLIENT_SRC)callbackhandeler.hpp + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)callbackhandeler.o $(CLIENT_SRC)callbackhandeler.cpp -hashmap.o : - $(CC) $(CFLAGS) -c -o $(CLIENT_SRC)hashmap.o $(CLIENT_SRC)util/hashmap.c +$(CLIENT_BUILD)hashmap.o : $(CLIENT_SRC)util/hashmap.c $(CLIENT_SRC)util/hashmap.h + $(CC) $(CFLAGS) -c -o $(CLIENT_BUILD)hashmap.o $(CLIENT_SRC)util/hashmap.c -$(CLIENT_EXE) : main.o initdevice.o menuhandeler.o load_gui.o callbackhandeler.o load_game.o load_core.o - $(CC) -o $(CLIENT_PATH) $(CFLAGS) $(LIBS) $(CLIENT_SRC)main.o $(CLIENT_SRC)initdevice.o $(CLIENT_SRC)menuhandeler.o $(CLIENT_SRC)load_gui.o $(CLIENT_SRC)load_core.o $(CLIENT_SRC)iguibutton.o $(CLIENT_SRC)iguilabel.o $(CLIENT_SRC)iguigeneric.o $(CLIENT_SRC)iguielement.o $(CLIENT_SRC)icamera.o $(CLIENT_SRC)imesh.o $(CLIENT_SRC)igeneric.o $(CLIENT_SRC)callbackhandeler.o $(CLIENT_SRC)lua_api/guiparts.hpp $(CLIENT_SRC)hashmap.o $(CLIENT_SRC)load_game.o -all : $(CLIENT_EXE) - $(RM) $(CLIENT_SRC)*.o $(CLIENT_SRC)*.gch clean : - rm $(CLIENT_SRC)*.o - rm $(CLIENT_SRC)*.gch + $(RM) $(CLIENT_BUILD)*.o diff --git a/src/client/lua_api/gameparts.hpp b/src/client/lua_api/gameparts.hpp index 2938ee2..2a14f4a 100644 --- a/src/client/lua_api/gameparts.hpp +++ b/src/client/lua_api/gameparts.hpp @@ -1,4 +1,5 @@ #include "../util/hashmap.h" +#include <btBulletDynamicsCommon.h> extern "C" { #include <lua.h> #include <lauxlib.h> @@ -9,7 +10,14 @@ typedef struct LISceneNode { irr::scene::ISceneNode* n; map_t funcmap; const char* type; -} LIGUIElement; +} LISceneNode; + +typedef struct LBPhysNode { + irr::scene::ISceneNode* n; + btRigidBody* r; + map_t funcmap; + const char* type; +} LIPhysNode; extern lua_State* tL; extern irr::IrrlichtDevice* gamedevice; diff --git a/src/client/lua_api/gui/iguibutton.cpp b/src/client/lua_api/gui/iguibutton.cpp index 6c2fc5a..88aa48e 100644 --- a/src/client/lua_api/gui/iguibutton.cpp +++ b/src/client/lua_api/gui/iguibutton.cpp @@ -19,7 +19,7 @@ extern "C" { using namespace irr; using namespace gui; -IrrlichtDevice* device; +extern IrrlichtDevice* device; char lhashkey[20]; static LIGUIElement* checkiguibutton(lua_State* L, int index){ @@ -140,7 +140,7 @@ static const luaL_reg iguibutton_m[] = { }; int iguibutton_register(lua_State* L, IrrlichtDevice* d){ - device = d; + //device = d; tL = L; luaL_newmetatable(L, "gui.iguibutton"); diff --git a/src/client/lua_api/load_core.cpp b/src/client/lua_api/load_core.cpp index 2109fd5..152ab76 100644 --- a/src/client/lua_api/load_core.cpp +++ b/src/client/lua_api/load_core.cpp @@ -10,12 +10,16 @@ extern "C" { #include <irrlicht.h> #include "scene/icamera.hpp" #include "scene/imesh.hpp" +#include "phys/bphysbox.hpp" using namespace irr; -void load_corefuncs(lua_State* L, IrrlichtDevice* d){ - icamera_register(L,d); - imesh_register(L,d); +extern IrrlichtDevice* device; + +void load_corefuncs(lua_State* L){ + icamera_register(L,device); + imesh_register(L,device); + bphysbox_register(L,device); lua_pop(L, 1); lua_newtable(L); diff --git a/src/client/lua_api/load_core.hpp b/src/client/lua_api/load_core.hpp index 6280484..b3b42ff 100644 --- a/src/client/lua_api/load_core.hpp +++ b/src/client/lua_api/load_core.hpp @@ -10,5 +10,5 @@ extern "C" { } #include <irrlicht.h> -void load_corefuncs(lua_State* L, IrrlichtDevice* device); +void load_corefuncs(lua_State* L); #endif diff --git a/src/client/lua_api/load_game.cpp b/src/client/lua_api/load_game.cpp index fb51595..92cb2d5 100644 --- a/src/client/lua_api/load_game.cpp +++ b/src/client/lua_api/load_game.cpp @@ -18,7 +18,7 @@ using namespace irr; using namespace gui; using namespace core; -void load_gamefuncs(lua_State* L, IrrlichtDevice* d){ +void load_gamefuncs(lua_State* L){ lua_newtable(L); lua_setglobal(L,"GAME"); } diff --git a/src/client/lua_api/load_game.hpp b/src/client/lua_api/load_game.hpp index f20e0c6..41c9135 100644 --- a/src/client/lua_api/load_game.hpp +++ b/src/client/lua_api/load_game.hpp @@ -10,5 +10,5 @@ extern "C" { } #include <irrlicht.h> -void load_gamefuncs(lua_State* L, IrrlichtDevice* device); +void load_gamefuncs(lua_State* L); #endif diff --git a/src/client/lua_api/load_gui.cpp b/src/client/lua_api/load_gui.cpp index 49c40e4..e1a6c99 100644 --- a/src/client/lua_api/load_gui.cpp +++ b/src/client/lua_api/load_gui.cpp @@ -19,6 +19,8 @@ using namespace irr; using namespace gui; using namespace core; +extern IrrlichtDevice* device; + //Things from guiparts.hpp std::map<irr::gui::IGUIElement*,int> iguielements; IrrlichtDevice* guidevice; @@ -29,15 +31,15 @@ lua_State* tL; int screenwidth(lua_State* L); int screenheight(lua_State* L); -void load_guifuncs(lua_State* L, IrrlichtDevice* d){ +void load_guifuncs(lua_State* L){ tL = L; - guidevice = d; + guidevice = device; gui_elenum = 0; guielements[0] = NULL; - iguibutton_register(L,d); - iguilabel_register(L,d); - iguigeneric_register(L,d); + iguibutton_register(L,device); + iguilabel_register(L,device); + iguigeneric_register(L,device); lua_pop(L, 1); lua_newtable(L); diff --git a/src/client/lua_api/load_gui.hpp b/src/client/lua_api/load_gui.hpp index eb76634..a022306 100644 --- a/src/client/lua_api/load_gui.hpp +++ b/src/client/lua_api/load_gui.hpp @@ -10,5 +10,5 @@ extern "C" { } #include <irrlicht.h> -void load_guifuncs(lua_State* L, IrrlichtDevice* device); +void load_guifuncs(lua_State* L); #endif diff --git a/src/client/lua_api/load_phys.cpp b/src/client/lua_api/load_phys.cpp new file mode 100644 index 0000000..846d34c --- /dev/null +++ b/src/client/lua_api/load_phys.cpp @@ -0,0 +1,22 @@ +#include <stdio.h> +#include <stdlib.h> +#include <vector> +#include <map> +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <irrlicht.h> + +#include "../callbackhandeler.hpp" + +using namespace irr; +using namespace gui; +using namespace core; + +extern IrrlichtDevice* d; + +void load_physfuncs(lua_State* L){ + printf("Called load physfuncs..."); +} diff --git a/src/client/lua_api/load_phys.hpp b/src/client/lua_api/load_phys.hpp new file mode 100644 index 0000000..7ee07fe --- /dev/null +++ b/src/client/lua_api/load_phys.hpp @@ -0,0 +1,14 @@ +#ifndef __H_loadphys +#define __H_loadphys +#include <stdio.h> +#include <stdlib.h> +#include <vector> +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} +#include <irrlicht.h> + +void load_physfuncs(lua_State* L); +#endif diff --git a/src/client/lua_api/phys/bphysbox.cpp b/src/client/lua_api/phys/bphysbox.cpp new file mode 100644 index 0000000..9a87045 --- /dev/null +++ b/src/client/lua_api/phys/bphysbox.cpp @@ -0,0 +1,286 @@ + +#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 "../gameparts.hpp" +#include "bphysbox.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* 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); +} +*/ + +//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->setMaterialTexture(0, device->getVideoDriver()->getTexture("sydney.bmp")); + + 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, "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)*/ +/* +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 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); + + 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", setmaterial}, + {"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; +} diff --git a/src/client/lua_api/phys/bphysbox.hpp b/src/client/lua_api/phys/bphysbox.hpp new file mode 100644 index 0000000..cad3d02 --- /dev/null +++ b/src/client/lua_api/phys/bphysbox.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 bphysbox_register(lua_State* L, irr::IrrlichtDevice* d); diff --git a/src/client/lua_api/scene/imesh.cpp b/src/client/lua_api/scene/imesh.cpp index c2b6510..c95366f 100644 --- a/src/client/lua_api/scene/imesh.cpp +++ b/src/client/lua_api/scene/imesh.cpp @@ -81,7 +81,7 @@ static int newiscenemesh(lua_State* L){ /*mesh:setmaterial("string",layernum=0)*/ static int setmaterial(lua_State* L){ LISceneNode* n = checkismesh(L,1); - u32 layernum = luaL_optint(L,3,0); + //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(); diff --git a/src/client/main.cpp b/src/client/main.cpp index 71a51c6..65dd99c 100644 --- a/src/client/main.cpp +++ b/src/client/main.cpp @@ -15,6 +15,7 @@ extern "C" { #include "lua_api/load_gui.hpp" #include "lua_api/load_game.hpp" #include "lua_api/load_core.hpp" +#include "lua_api/load_phys.hpp" #include "callbackhandeler.hpp" using namespace irr; @@ -24,6 +25,9 @@ using namespace video; using namespace io; using namespace gui; +btDiscreteDynamicsWorld* World; +core::list<btRigidBody*> Objects; + void loadLLibs(lua_State* L){ luaopen_base(L); luaopen_table(L); @@ -33,22 +37,175 @@ void loadLLibs(lua_State* L){ } lua_State* L; +IrrlichtDevice* device; void loadIrrLibs(lua_State* L, IrrlichtDevice* device){ printf("Loading guifuncs...\n"); - load_guifuncs(L,device); - load_gamefuncs(L,device); - load_corefuncs(L,device); + load_guifuncs(L); + load_gamefuncs(L); + load_corefuncs(L); + load_physfuncs(L); +} + +static int GetRandInt(int TMax) { return rand() % TMax; } + +// Removes all objects from the world +void ClearObjects() { + + for(list<btRigidBody *>::Iterator Iterator = Objects.begin(); Iterator != Objects.end(); ++Iterator) { + btRigidBody *Object = *Iterator; + + // Delete irrlicht node + ISceneNode *Node = static_cast<ISceneNode *>(Object->getUserPointer()); + Node->remove(); + + // Remove the object from the world + World->removeRigidBody(Object); + + delete Object; + } + + Objects.clear(); +} + +// Create a box rigid body +void CreateBox(ISceneManager* irrScene, const btVector3 &TPosition, const core::vector3df &TScale, btScalar TMass) { + + // Create an Irrlicht cube + scene::ISceneNode *Node = irrScene->addCubeSceneNode(1.0f); + Node->setScale(TScale); + + Node->setMaterialFlag(video::EMF_LIGHTING, 1); + Node->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); + //Node->setMaterialTexture(0, irrDriver->getTexture("rust0.jpg")); + + // Set the initial position of the object + btTransform Transform; + Transform.setIdentity(); + Transform.setOrigin(TPosition); + + // Give it a default MotionState + btDefaultMotionState *MotionState = new btDefaultMotionState(Transform); + + // Create the shape + btVector3 HalfExtents(TScale.X * 0.5f, TScale.Y * 0.5f, TScale.Z * 0.5f); + btCollisionShape *Shape = new btBoxShape(HalfExtents); + + // Add mass + btVector3 LocalInertia; + Shape->calculateLocalInertia(TMass, LocalInertia); + + // Create the rigid body object + btRigidBody *RigidBody = new btRigidBody(TMass, MotionState, Shape, LocalInertia); + + // Store a pointer to the irrlicht node so we can update it later + RigidBody->setUserPointer((void *)(Node)); + + // Add it to the world + World->addRigidBody(RigidBody); + Objects.push_back(RigidBody); +} + +// Create a sphere rigid body +void CreateSphere(ISceneManager* irrScene, const btVector3 &TPosition, btScalar TRadius, btScalar TMass) { + + // Create an Irrlicht sphere + scene::ISceneNode *Node = irrScene->addSphereSceneNode(TRadius, 32); + Node->setMaterialFlag(video::EMF_LIGHTING, 1); + Node->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); + //Node->setMaterialTexture(0, irrDriver->getTexture("ice0.jpg")); + + // Set the initial position of the object + btTransform Transform; + Transform.setIdentity(); + Transform.setOrigin(TPosition); + + // Give it a default MotionState + btDefaultMotionState *MotionState = new btDefaultMotionState(Transform); + + // Create the shape + btCollisionShape *Shape = new btSphereShape(TRadius); + + // Add mass + btVector3 LocalInertia; + Shape->calculateLocalInertia(TMass, LocalInertia); + + // Create the rigid body object + btRigidBody *RigidBody = new btRigidBody(TMass, MotionState, Shape, LocalInertia); + + // Store a pointer to the irrlicht node so we can update it later + RigidBody->setUserPointer((void *)(Node)); + + // Add it to the world + World->addRigidBody(RigidBody); + Objects.push_back(RigidBody); +} + +// Converts a quaternion to an euler angle +void QuaternionToEuler(const btQuaternion &TQuat, btVector3 &TEuler) { + btScalar W = TQuat.getW(); + btScalar X = TQuat.getX(); + btScalar Y = TQuat.getY(); + btScalar Z = TQuat.getZ(); + float WSquared = W * W; + float XSquared = X * X; + float YSquared = Y * Y; + float ZSquared = Z * Z; + + TEuler.setX(atan2f(2.0f * (Y * Z + X * W), -XSquared - YSquared + ZSquared + WSquared)); + TEuler.setY(asinf(-2.0f * (X * Z - Y * W))); + TEuler.setZ(atan2f(2.0f * (X * Y + Z * W), XSquared - YSquared - ZSquared + WSquared)); + TEuler *= core::RADTODEG; +} + +// 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. +void UpdatePhysics(u32 TDeltaTime) { + + World->stepSimulation(TDeltaTime * 0.001f, 60); + + btRigidBody *TObject; + // Relay the object's orientation to irrlicht + for(core::list<btRigidBody *>::Iterator it = Objects.begin(); it != Objects.end(); ++it) { + + //UpdateRender(*Iterator); + scene::ISceneNode *Node = static_cast<scene::ISceneNode *>((*it)->getUserPointer()); + TObject = *it; + + // Set position + btVector3 Point = TObject->getCenterOfMassPosition(); + Node->setPosition(core::vector3df((f32)Point[0], (f32)Point[1], (f32)Point[2])); + + // Set rotation + btVector3 EulerRotation; + QuaternionToEuler(TObject->getOrientation(), EulerRotation); + Node->setRotation(core::vector3df(EulerRotation[0], EulerRotation[1], EulerRotation[2])); + + } +} + +// Creates a base box +void CreateStartScene(ISceneManager* smgr) { + + ClearObjects(); + CreateBox(smgr,btVector3(0.0f, 0.0f, 0.0f), core::vector3df(10.0f, 0.5f, 10.0f), 0.0f); } int main(int argc, char *argv[]){ + // Initialize bullet + btBroadphaseInterface *BroadPhase = new btAxisSweep3(btVector3(-1000, -1000, -1000), btVector3(1000, 1000, 1000)); + btDefaultCollisionConfiguration *CollisionConfiguration = new btDefaultCollisionConfiguration(); + btCollisionDispatcher *Dispatcher = new btCollisionDispatcher(CollisionConfiguration); + btSequentialImpulseConstraintSolver *Solver = new btSequentialImpulseConstraintSolver(); + World = new btDiscreteDynamicsWorld(Dispatcher, BroadPhase, Solver, CollisionConfiguration); + //Create a new lua state, this gets shared everywhere lua_State *state = luaL_newstate(); L = state; //Load the lua libraries loadLLibs(state); //Defined in initdevice.cpp, creates the irrlicht device - IrrlichtDevice *device = spawnIrrDevice(state); + device = spawnIrrDevice(state); if (!device) return 1; //Loads libraries for interfaceing with irrlicht @@ -63,9 +220,7 @@ int main(int argc, char *argv[]){ printf("Failed to open lua file:../data/guitest.lua\n"); } - - - device->setWindowCaption(L"Bork[en]gine Demo"); + //Load some bullet physics stuff //Load some menu loadMenu("Some menu",device); @@ -73,6 +228,30 @@ 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 Demo"); + + /* + CreateBox(smgr, + btVector3( + GetRandInt(10) - 5.0f, 7.0f, + GetRandInt(10) - 5.0f), + core::vector3df( + GetRandInt(3) + 0.5f, + GetRandInt(3) + 0.5f, + GetRandInt(3) + 0.5f), + 1.0f); + CreateBox(smgr, + btVector3(0,0,0), + core::vector3df(10,10,10), + 0.0f); + CreateSphere(smgr, + btVector3( + GetRandInt(10) - 5.0f, 7.0f, + GetRandInt(10) - 5.0f), + GetRandInt(5) / 5.0f + 0.2f, 1.0f); + */ guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!", rect<s32>(10,10,260,22), true); @@ -81,19 +260,47 @@ int main(int argc, char *argv[]){ printf("Everything registered, about to start running device!\n"); + u32 TimeStamp = irrTimer->getTime(), DeltaTime = 0; while(device->run()){ - driver->beginScene(true, true, SColor(255,100,101,140)); - - smgr->drawAll(); - guienv->drawAll(); + if(device->isWindowActive()){ + DeltaTime = irrTimer->getTime() - TimeStamp; + TimeStamp = irrTimer->getTime(); - driver->endScene(); + UpdatePhysics(DeltaTime); + + driver->beginScene(true, true, SColor(255,100,101,140)); + + smgr->drawAll(); + guienv->drawAll(); + + driver->endScene(); + }else{ + device->yield(); + } lua_getglobal(state,"GAME"); lua_getfield(state,-1,"tick"); if(!lua_isnil(state,-1)) lua_call(state,0,0); } - lua_close(state); + printf("Claoseing lua state...\n"); + //lua_close(state); + printf("clearing objects...\n"); + ClearObjects(); + 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"); + return 0; } |
