aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/phys/bphysbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/lua_api/phys/bphysbox.cpp')
-rw-r--r--src/client/lua_api/phys/bphysbox.cpp286
1 files changed, 286 insertions, 0 deletions
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;
+}