diff options
Diffstat (limited to 'src/client/lua_api/phys')
| -rw-r--r-- | src/client/lua_api/phys/bphysbox.cpp | 49 | ||||
| -rw-r--r-- | src/client/lua_api/phys/bphysbox.hpp | 2 | ||||
| -rw-r--r-- | src/client/lua_api/phys/bphysmodel.cpp | 319 | ||||
| -rw-r--r-- | src/client/lua_api/phys/bphysmodel.hpp | 11 | ||||
| -rw-r--r-- | src/client/lua_api/phys/butil.cpp | 26 | ||||
| -rw-r--r-- | src/client/lua_api/phys/butil.hpp | 9 |
6 files changed, 393 insertions, 23 deletions
diff --git a/src/client/lua_api/phys/bphysbox.cpp b/src/client/lua_api/phys/bphysbox.cpp index 9a87045..80cd2eb 100644 --- a/src/client/lua_api/phys/bphysbox.cpp +++ b/src/client/lua_api/phys/bphysbox.cpp @@ -10,9 +10,11 @@ extern "C" { #include <lauxlib.h> #include <lualib.h> } +#include <btBulletDynamicsCommon.h> #include <irrlicht.h> #include "../gameparts.hpp" #include "bphysbox.hpp" +#include "../scene/igeneric.hpp" using namespace irr; using namespace scene; @@ -99,7 +101,8 @@ static int newbphysbox(lua_State* L){ //Node->setMaterialFlag(video::EMF_WIREFRAME,true) //Node->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); - Node->setMaterialTexture(0, device->getVideoDriver()->getTexture("sydney.bmp")); + Node->setMaterialFlag(video::EMF_LIGHTING,true); + //Node->setMaterialTexture(0, device->getVideoDriver()->getTexture("../data/wall.jpg")); printf("Set node's lighting stuff...\n"); @@ -148,7 +151,7 @@ static int newbphysbox(lua_State* L){ 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"); + luaL_getmetatable(L, "phys.physbox"); lua_setmetatable(L, -2); //Create the struct @@ -169,7 +172,7 @@ static int newbphysbox(lua_State* L){ static int delbphysbox(lua_State* L){ LBPhysNode* pnode = checkisbphysbox(L,-1); - delete pnode->r->getMotionState(); + //delete pnode->r->getMotionState(); delete pnode->r->getCollisionShape(); delete pnode->r; @@ -213,7 +216,7 @@ static int bphyssetpos(lua_State *L){ 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; } @@ -248,7 +251,7 @@ static const luaL_reg bphysbox_f[] = { }; static const luaL_reg bphysbox_m[] = { -// {"setMaterial", setmaterial}, + {"setmaterial", iscenesetmaterial}, {"getpos", bphysgetpos}, {"setpos", bphyssetpos}, // {"settext", setiguitext}, @@ -258,29 +261,29 @@ static const luaL_reg bphysbox_m[] = { int bphysbox_register(lua_State* L, IrrlichtDevice* d){ - device = d; + device = d; - printf("bphysbox registered\n"); + printf("bphysbox registered\n"); - luaL_newmetatable(L, "phys.physbox"); + luaL_newmetatable(L, "phys.physbox"); - luaL_register(L,"physbox",bphysbox_f); + 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,"__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); + lua_pushstring(L,"__newindex"); + lua_pushstring(L,"sethandeler"); + lua_gettable(L,-3); + lua_settable(L,-4); - luaL_register(L, NULL, bphysbox_m); + lua_pushstring(L,"__gc"); + lua_pushcfunction(L,delbphysbox); + lua_settable(L,-4); - return 1; + 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 index cad3d02..43285f2 100644 --- a/src/client/lua_api/phys/bphysbox.hpp +++ b/src/client/lua_api/phys/bphysbox.hpp @@ -9,3 +9,5 @@ extern "C" { #include <irrlicht.h> int bphysbox_register(lua_State* L, irr::IrrlichtDevice* d); +static int bphyssetpos(lua_State *L); +static int bphysgetpos(lua_State *L); diff --git a/src/client/lua_api/phys/bphysmodel.cpp b/src/client/lua_api/phys/bphysmodel.cpp new file mode 100644 index 0000000..08ec599 --- /dev/null +++ b/src/client/lua_api/phys/bphysmodel.cpp @@ -0,0 +1,319 @@ + +#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); + //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; +} + +/*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 const luaL_reg bphysmodel_f[] = { + {"new", newbphysmodel}, +// {"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/bphysmodel.hpp b/src/client/lua_api/phys/bphysmodel.hpp new file mode 100644 index 0000000..a59c451 --- /dev/null +++ b/src/client/lua_api/phys/bphysmodel.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/butil.cpp b/src/client/lua_api/phys/butil.cpp new file mode 100644 index 0000000..6319688 --- /dev/null +++ b/src/client/lua_api/phys/butil.cpp @@ -0,0 +1,26 @@ +#include <stdio.h> + +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} + +#include <btBulletDynamicsCommon.h> + +#include "butil.hpp" + +btVector3 lua_popbtvector(lua_State* L,int pos){ + f32 p[3]; + + for(int i = 0; i < 3; i++){ + lua_pushnumber(L,i+1); + lua_gettable(L,pos); + p[i] = (f32) lua_tonumber(L,-1); + lua_pop(L,1); + } + + printf("Found vector (%f,%f,%f)\n",p[0],p[1],p[2]); + + return btVector3(p[0],p[1],p[2]); +} diff --git a/src/client/lua_api/phys/butil.hpp b/src/client/lua_api/phys/butil.hpp new file mode 100644 index 0000000..c288b97 --- /dev/null +++ b/src/client/lua_api/phys/butil.hpp @@ -0,0 +1,9 @@ +extern "C" { + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> +} + +#include <btBulletDynamicsCommon.h> + +btVector3 lua_popbtvector(lua_State* L,int pos); |
