aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile83
-rw-r--r--src/client/lua_api/gameparts.hpp10
-rw-r--r--src/client/lua_api/gui/iguibutton.cpp4
-rw-r--r--src/client/lua_api/load_core.cpp10
-rw-r--r--src/client/lua_api/load_core.hpp2
-rw-r--r--src/client/lua_api/load_game.cpp2
-rw-r--r--src/client/lua_api/load_game.hpp2
-rw-r--r--src/client/lua_api/load_gui.cpp12
-rw-r--r--src/client/lua_api/load_gui.hpp2
-rw-r--r--src/client/lua_api/load_phys.cpp22
-rw-r--r--src/client/lua_api/load_phys.hpp14
-rw-r--r--src/client/lua_api/phys/bphysbox.cpp286
-rw-r--r--src/client/lua_api/phys/bphysbox.hpp11
-rw-r--r--src/client/lua_api/scene/imesh.cpp2
-rw-r--r--src/client/main.cpp233
15 files changed, 628 insertions, 67 deletions
diff --git a/Makefile b/Makefile
index 216a7dd..e086dd3 100644
--- a/Makefile
+++ b/Makefile
@@ -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;
}