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