From 112517494847f0c86f58544cbf4c35c9b7712ab1 Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Thu, 1 Nov 2018 13:53:16 -0400 Subject: Refactored code and added library Physics code for models now lives in the shared directory. To get file loading without irrlicht, a single-file header library (lib/tinyobjloader-c) was added. Metatables for generics and physics generics have also been seperated out. --- src/client/lua_api/load_cphys.cpp | 55 +++++++++ src/client/lua_api/load_cphys.hpp | 14 +++ src/client/lua_api/load_phys.cpp | 55 --------- src/client/lua_api/load_phys.hpp | 14 --- src/client/lua_api/phys/bphysbuffer.cpp | 197 ------------------------------ src/client/lua_api/phys/bphysbuffer.hpp | 11 -- src/client/lua_api/phys/bphysgeneric.cpp | 200 ------------------------------- src/client/lua_api/phys/bphysgeneric.hpp | 28 ----- src/client/lua_api/phys/bphysmodel.cpp | 138 --------------------- src/client/lua_api/phys/bphysmodel.hpp | 12 -- src/client/lua_api/phys/cbphysbox.cpp | 13 +- src/client/lua_api/phys/cbphysmodel.cpp | 135 +++++++++++++++++++++ src/client/lua_api/phys/cbphysmodel.hpp | 12 ++ src/client/lua_api/scene/igeneric.cpp | 9 ++ src/client/lua_api/scene/igeneric.hpp | 9 +- src/client/main.cpp | 2 +- 16 files changed, 234 insertions(+), 670 deletions(-) create mode 100644 src/client/lua_api/load_cphys.cpp create mode 100644 src/client/lua_api/load_cphys.hpp delete mode 100644 src/client/lua_api/load_phys.cpp delete mode 100644 src/client/lua_api/load_phys.hpp delete mode 100644 src/client/lua_api/phys/bphysbuffer.cpp delete mode 100644 src/client/lua_api/phys/bphysbuffer.hpp delete mode 100644 src/client/lua_api/phys/bphysgeneric.cpp delete mode 100644 src/client/lua_api/phys/bphysgeneric.hpp delete mode 100644 src/client/lua_api/phys/bphysmodel.cpp delete mode 100644 src/client/lua_api/phys/bphysmodel.hpp create mode 100644 src/client/lua_api/phys/cbphysmodel.cpp create mode 100644 src/client/lua_api/phys/cbphysmodel.hpp (limited to 'src/client') diff --git a/src/client/lua_api/load_cphys.cpp b/src/client/lua_api/load_cphys.cpp new file mode 100644 index 0000000..b38b84d --- /dev/null +++ b/src/client/lua_api/load_cphys.cpp @@ -0,0 +1,55 @@ +#include +#include +#include +#include +extern "C" { + #include + #include + #include +} +#include +#include "../callbackhandeler.hpp" +#include "phys/cbphysbox.hpp" +#include "phys/cbphysmodel.hpp" +#include +#include +//#include +#include + +using namespace irr; +using namespace gui; +using namespace core; + +extern IrrlichtDevice* device; +extern btDiscreteDynamicsWorld* World; +extern btBroadphaseInterface *BroadPhase; + +//raytest({from},{to},{mins},{maxes}) :: hashit +int raytest(lua_State *L){ + double fx,fy,fz; + double tx,ty,tz; + popvector3d(L, &fx, &fy, &fz); + popvector3d(L, &tx, &ty, &tz); + + btVector3 from(fx, fy, fz); + btVector3 to(tx, ty, tz); + btCollisionWorld::RayResultCallback *res = new btDiscreteDynamicsWorld::ClosestRayResultCallback(from, to); + World->rayTest(from,to,*res); + + lua_pushboolean(L,res->hasHit()); + return 1; +} + +void load_physfuncs(lua_State* L){ + lua_newtable(L);//{} + lua_setglobal(L,"phys");// + //phys things + cbphysbox_register(L); + + cbphysmodel_register(L); + + lua_getglobal(L,"phys");//{} + lua_pushcfunction(L,raytest);//{},raytest() + lua_setfield(L,-2,"raytest");//{} + lua_pop(L,1); +} diff --git a/src/client/lua_api/load_cphys.hpp b/src/client/lua_api/load_cphys.hpp new file mode 100644 index 0000000..7ee07fe --- /dev/null +++ b/src/client/lua_api/load_cphys.hpp @@ -0,0 +1,14 @@ +#ifndef __H_loadphys +#define __H_loadphys +#include +#include +#include +extern "C" { + #include + #include + #include +} +#include + +void load_physfuncs(lua_State* L); +#endif diff --git a/src/client/lua_api/load_phys.cpp b/src/client/lua_api/load_phys.cpp deleted file mode 100644 index 0a4889b..0000000 --- a/src/client/lua_api/load_phys.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include -#include -extern "C" { - #include - #include - #include -} -#include -#include "../callbackhandeler.hpp" -#include "phys/cbphysbox.hpp" -#include "phys/bphysmodel.hpp" -#include -#include -//#include -#include - -using namespace irr; -using namespace gui; -using namespace core; - -extern IrrlichtDevice* device; -extern btDiscreteDynamicsWorld* World; -extern btBroadphaseInterface *BroadPhase; - -//raytest({from},{to},{mins},{maxes}) :: hashit -int raytest(lua_State *L){ - double fx,fy,fz; - double tx,ty,tz; - popvector3d(L, &fx, &fy, &fz); - popvector3d(L, &tx, &ty, &tz); - - btVector3 from(fx, fy, fz); - btVector3 to(tx, ty, tz); - btCollisionWorld::RayResultCallback *res = new btDiscreteDynamicsWorld::ClosestRayResultCallback(from, to); - World->rayTest(from,to,*res); - - lua_pushboolean(L,res->hasHit()); - return 1; -} - -void load_physfuncs(lua_State* L){ - lua_newtable(L);//{} - lua_setglobal(L,"phys");// - //phys things - cbphysbox_register(L); - - bphysmodel_register(L,device); - - lua_getglobal(L,"phys");//{} - lua_pushcfunction(L,raytest);//{},raytest() - lua_setfield(L,-2,"raytest");//{} - lua_pop(L,1); -} diff --git a/src/client/lua_api/load_phys.hpp b/src/client/lua_api/load_phys.hpp deleted file mode 100644 index 7ee07fe..0000000 --- a/src/client/lua_api/load_phys.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __H_loadphys -#define __H_loadphys -#include -#include -#include -extern "C" { - #include - #include - #include -} -#include - -void load_physfuncs(lua_State* L); -#endif diff --git a/src/client/lua_api/phys/bphysbuffer.cpp b/src/client/lua_api/phys/bphysbuffer.cpp deleted file mode 100644 index f1f20c0..0000000 --- a/src/client/lua_api/phys/bphysbuffer.cpp +++ /dev/null @@ -1,197 +0,0 @@ - -#include -#include -#include -#include -#include -#include -extern "C" { - #include - #include - #include -} -#include -#include -#include -#include -#include "bphysmodel.hpp" -#include "../scene/igeneric.hpp" -#include - -using namespace irr; -using namespace scene; -using namespace core; -using namespace video; - -extern IrrlichtDevice* device; - -extern btDiscreteDynamicsWorld* World; -extern core::list 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; -} - -//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"); - - double x,y,z; - popvector3d(L,&x,&y,&z); - printf("Found position for phys model: %f %f %f\n",x,y,z); - - //Find the vector scale - double sx,sy,sz; - popvector3d(L,&sx,&sy,&sz); - 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 const luaL_reg bphysbuffer_f[] = { - //{"new", newbphysmodel}, -// {"gethandeler", guigethandeler}, -// {"sethandeler", guisethandeler}, - {0,0}, -}; - -static const luaL_reg bphysbuffer_m[] = { - //{"setmaterial", iscenesetmaterial}, - //{"getpos", bphysgetpos}, - //{"setpos", bphyssetpos}, -// {"settext", setiguitext}, -// {"remove", removeiguielement}, - {0, 0}, -}; - -void bphysbuffer_register(lua_State* L, IrrlichtDevice* d){ - - device = d; - - luaL_newmetatable(L, "phys.physbuffer");//{m_physbuffer} - lua_newtable(L);//{m_physbuffer},{} - luaL_register(L,"physbuffer",bphysbuffer_m);//{m_physbuffer},{physbuffer} - lua_setfield(L,-2,"__index");//{m_physbuffer} - lua_pop(L,1); -} diff --git a/src/client/lua_api/phys/bphysbuffer.hpp b/src/client/lua_api/phys/bphysbuffer.hpp deleted file mode 100644 index cfbf549..0000000 --- a/src/client/lua_api/phys/bphysbuffer.hpp +++ /dev/null @@ -1,11 +0,0 @@ - -#include -#include -extern "C" { - #include - #include - #include -} -#include - -void bphysmodel_register(lua_State* L); diff --git a/src/client/lua_api/phys/bphysgeneric.cpp b/src/client/lua_api/phys/bphysgeneric.cpp deleted file mode 100644 index 91b4c21..0000000 --- a/src/client/lua_api/phys/bphysgeneric.cpp +++ /dev/null @@ -1,200 +0,0 @@ - -extern "C" { - #include - #include - #include -} -#include -#include - -/*** -@module phys -*/ - - -/*Physics things from lua have the form of: -{ - rigidbody = btRigidBody, - node = ISceneNode, -} -*/ - -/*** -Sets the direction of gravity on this object. -@function rigidbody:setgravity({x,y,z}) -@tparam vector3d direction The direction to make gravity point -*/ -//rigidbody:setgravity({x,y,z}) -int setgravity(lua_State *L){ - double x,y,z; - popvector3d(L,&x,&y,&z); - - lua_getfield(L,-1,"rigidbody"); - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - lua_pop(L,2); - - btVector3 v = btVector3(x,y,z); - - r->setGravity(v); - - return 0; -} - -/*** -Gets the direction of gravity on this object. -@function rigidbody:getgravity() -@treturn vector3d The direction of gravity on this object. -*/ -//rigidbody:getgravity() -int getgravity(lua_State *L){ - lua_getfield(L,-1,"rigidbody");//{rigidbody},ud_rigidbody - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - lua_pop(L,2);// - - btVector3 v = r->getGravity(); - pushvector3d(L,v.x(),v.y(),v.z()); - - return 0; -} - -/*** -Apply force at a reletive offset. -@function rigidbody:applyforce(direction, offset = {0,0,0}) -@tparam vector3d direction The direction of the force to apply -@tparam vector3d offset The offset from the center of gravity to apply the force -*/ -//rigidbody:applyforce({x,y,z}[,{rx,ry,rz}]) -int applyforce(lua_State *L){ - double rx,ry,rz; - rx = 0; - ry = 0; - rz = 0; - if(lua_gettop(L) > 2){ - popvector3d(L,&rx,&ry,&rz);//{phys},{x,y,z} - } - - double x,y,z; - popvector3d(L,&x,&y,&z);//{phys} - - lua_getfield(L,-1,"rigidbody"); - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - lua_pop(L,2); - - btVector3 v = btVector3(x,y,z); - btVector3 o = btVector3(rx,ry,rz); - - r->applyForce(v,o); - - return 0; -} - -/*** -Gets the damping applied to this rigidbody -@function rigidbody:getldamping() -@treturn number damping The ammount of damping applied to the object's momentum -*/ -//rigidbody:getldamping() -int getlineardamping(lua_State *L){ - lua_getfield(L,-1,"rigidbody"); - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - lua_pop(L,2); - - double damp = r->getLinearDamping(); - lua_pushnumber(L,damp); - - return 1; -} - -/*** -Gets the angular damping applied to this rigidbody -@function rigidbody:getadamping() -@treturn number damping The ammount of damping applied to angular momentum -*/ -//rigidbody:getadamping() -int getangulardamping(lua_State *L){ - lua_getfield(L,-1,"rigidbody"); - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - lua_pop(L,2); - - double damp = r->getAngularDamping(); - lua_pushnumber(L,damp); - - return 1; -} - -/*** -Gets the velocity of this object -@function rigidbody:getvelocity() -@treturn vector3 The velocity in each direction -*/ -//rigidbody:getvelocity() -int getvelocity(lua_State *L){ - btVector3 vel; - lua_getfield(L,-1,"rigidbody"); - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - - vel = r->getLinearVelocity(); - pushvector3d(L,(double)vel.x(),(double)vel.y(),(double)vel.z()); - - return 1; -} - -/*** -Sets the velocity of this object -@function rigidbody:setvelocity() -@tparam vector3d direction The ammount on each axis to set the velocity of this object. -*/ -//rigidbody:setvelocity({x,y,z}) -int setvelocity(lua_State *L){ - double x,y,z; - popvector3d(L,&x,&y,&z); - btVector3 newvel = btVector3(x,y,z); - - lua_getfield(L,-1,"rigidbody"); - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - lua_pop(L,2); - - r->setLinearVelocity(newvel); - - return 0; -} - -/*** -Activates this object. -If this object was sleeping, it will move again. If you are using -applyforce or setvelocity, you will need to activate() the rigidbody for it -to move. -@function rigidbody:activate() -*/ -//rigidbody:activate() -int activate(lua_State *L){ - lua_getfield(L,-1,"rigidbody"); - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - lua_pop(L,2); - - r->activate(); - - return 0; -} - -/*** -Sets the damping of this object. -@function rigidbody:setdamping(damping,angular_damping) -@tparam number damping The ammount of damping the object should put on it's movement. -@tparam number angular_damping The ammount of damping the object should put on it's angular momentum -*/ -//rigidbody:setdamping(lineardamping, angulardamping) -int setdamping(lua_State *L){ - double adamp,ldamp; - adamp = lua_tonumber(L,-1); - ldamp = lua_tonumber(L,-2); - lua_pop(L,2); - - lua_getfield(L,-1,"rigidbody"); - btRigidBody *r = (btRigidBody*)lua_touserdata(L,-1); - lua_pop(L,2); - - r->setDamping(adamp,ldamp); - - return 0; -} diff --git a/src/client/lua_api/phys/bphysgeneric.hpp b/src/client/lua_api/phys/bphysgeneric.hpp deleted file mode 100644 index d035084..0000000 --- a/src/client/lua_api/phys/bphysgeneric.hpp +++ /dev/null @@ -1,28 +0,0 @@ - -extern "C" { - #include - #include - #include -} - - -int setgravity(lua_State *L); -int applyforce(lua_State *L); -int getlineardamping(lua_State *L); -int getangulardamping(lua_State *L); -int setdamping(lua_State *L); -int activate(lua_State *L); -int getvelocity(lua_State *L); -int setvelocity(lua_State *L); - -static const luaL_reg brigidbody_m[] = { - {"setgravity", setgravity}, - {"applyforce", applyforce}, - {"getldamping", getlineardamping}, - {"getadamping", getangulardamping}, - {"setdamping", setdamping}, - {"activate", activate}, - {"getvelocity", getvelocity}, - {"setvelocity", setvelocity}, - {NULL, NULL} -}; diff --git a/src/client/lua_api/phys/bphysmodel.cpp b/src/client/lua_api/phys/bphysmodel.cpp deleted file mode 100644 index 2bf65fb..0000000 --- a/src/client/lua_api/phys/bphysmodel.cpp +++ /dev/null @@ -1,138 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -extern "C" { - #include - #include - #include -} -#include -#include -#include "../gameparts.hpp" -#include "cbphysbox.hpp" -#include "bphysmodel.hpp" -#include -#include - - -using namespace irr; -using namespace scene; -using namespace core; -using namespace video; - -extern IrrlichtDevice* device; - -extern btDiscreteDynamicsWorld* World; -extern std::list Objects; - -//newbphysmodel("graphicfile","physicfile",mass,[,{position}][,{lookat}]) -static int newbphysmodel(lua_State* L){ - printf("Creating bphysmodel\n"); - int nargs = lua_gettop(L); - double lx,ly,lz; - double x,y,z; - if(nargs > 4){ - //"graphicsfile","physicsfile",{position},{lookat} - popvector3d(L,&lx,&ly,&lz); - } - if(nargs > 3){ - //"graphicsfile","physicsfile",{position} - popvector3d(L,&x,&y,&z); - } - //"graphicsfile","physicsfile" - - double mass = lua_tonumber(L,-1); - const char *ppath = lua_tostring(L,-2); - const char *gpath = lua_tostring(L,-3); - lua_pop(L,3); - - ISceneManager *smgr = device->getSceneManager(); - - printf("bphysnode, creating the scene node\n"); - - //Create the scene node - IMesh *gmesh = smgr->getMesh(gpath); - ISceneNode *node = smgr->addMeshSceneNode(gmesh,0,-1,vector3df(x,y,z)); - - printf("bphysnode, createing the physics body\n"); - //Create the physics body - IMesh *pmesh = smgr->getMesh(ppath); - printf("We have %d mesh buffers\n",pmesh->getMeshBufferCount()); - u32 meshcount = pmesh->getMeshBufferCount(); - btTriangleMesh* trimesh = new btTriangleMesh(); - for(u32 meshnum = 0; meshnum < meshcount; meshnum++){ - IMeshBuffer *b = pmesh->getMeshBuffer(meshnum); - //assert(b->getVertexType() == video::EVT_STANDARD); - u32 bi = b->getIndexCount(); - u16 *indices = b->getIndices(); - for(u32 i = 0; i < bi; i+= 3){ - printf("Getting triangle %u of %u\n",i,bi); - u16 i1 = indices[i]; - u16 i2 = indices[i + 1]; - u16 i3 = indices[i + 2]; - vector3df p1 = b->getPosition(i1); - vector3df p2 = b->getPosition(i2); - vector3df p3 = b->getPosition(i3); - 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); - } - } - printf("Done building trimesh\n"); - btCollisionShape *shape = new btBvhTriangleMeshShape(trimesh,true); - btTransform tr; - tr.setIdentity(); - tr.setOrigin(btVector3(x,y,z)); - printf("Created default motion shape\n"); - btDefaultMotionState *ms = new btDefaultMotionState(btTransform(tr)); - btVector3 li; - shape->calculateLocalInertia(mass, li); - btRigidBody *rb = new btRigidBody(mass,ms,shape,li); - rb->setUserPointer((void*) node); - World->addRigidBody(rb); - Objects.push_back(rb); - printf("Rigid body finished\n"); - - //Create the lua representation - lua_newtable(L); - lua_pushlightuserdata(L,rb); - lua_setfield(L,-2,"rigidbody"); - lua_pushlightuserdata(L,node); - lua_setfield(L,-2,"node"); - luaL_getmetatable(L,"phys.physmodel"); - lua_setmetatable(L,-2); - printf("finished creating the lua representation\n"); - - return 1; -} - -static const luaL_reg bphysmodel_f[] = { - {"newphysmodel", newbphysmodel}, - {0,0}, -}; - -static const luaL_reg bphysmodel_m[] = { - {0, 0}, -}; - -int bphysmodel_register(lua_State* L, IrrlichtDevice* d){ - - device = d; - - //printf("bphysmodel registered\n"); - - luaL_newmetatable(L, "phys.physmodel");//{} - luaL_register(L,NULL,bphysmodel_m); - luaL_register(L,NULL,igeneric_m); //Inherit all the things to do with scene nodes - - lua_getglobal(L,"phys"); - luaL_register(L,NULL,bphysmodel_f); - - return 1; -} diff --git a/src/client/lua_api/phys/bphysmodel.hpp b/src/client/lua_api/phys/bphysmodel.hpp deleted file mode 100644 index 1c0fbac..0000000 --- a/src/client/lua_api/phys/bphysmodel.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _BPHYSMODEL_HPP_ -#include -#include -extern "C" { - #include - #include - #include -} -#include - -int bphysmodel_register(lua_State* L, irr::IrrlichtDevice* d); -#endif diff --git a/src/client/lua_api/phys/cbphysbox.cpp b/src/client/lua_api/phys/cbphysbox.cpp index 578fc8d..86deacf 100644 --- a/src/client/lua_api/phys/cbphysbox.cpp +++ b/src/client/lua_api/phys/cbphysbox.cpp @@ -16,7 +16,7 @@ extern "C" { #include "../scene/igeneric.hpp" #include -#include "bphysgeneric.hpp" +#include using namespace irr; using namespace scene; @@ -146,11 +146,11 @@ int cbsetmaterial(lua_State* L){ } static const luaL_reg cbphysbox_m[] = { - {"setcpos", cbphyssetpos},//overload - {"getcpos", cbphysgetpos}, - {"getgravity", cbphysgetgravity}, - {"applygravity",cbphysapplygravity}, - {"setMaterial", cbsetmaterial}, + {"setpos", cbphyssetpos},//overload + {"getpos", cbphysgetpos}, + //{"getgravity", cbphysgetgravity}, + //{"applygravity",cbphysapplygravity}, + //{"setMaterial", cbsetmaterial}, // {"delete", delbphysbox},//client side delete needs to delete the visual representation {0, 0}, }; @@ -166,6 +166,7 @@ void cbphysbox_register(lua_State* L){ luaL_getmetatable(L,"phys.physbox");//phys.physbox lua_newtable(L);//phys.physbox,{} luaL_register(L,NULL,brigidbody_m); + luaL_register(L,NULL,igeneric_m); luaL_register(L,NULL,cbphysbox_m);//phys.physbox,{} lua_setfield(L,-2,"__index");//phys.physbox diff --git a/src/client/lua_api/phys/cbphysmodel.cpp b/src/client/lua_api/phys/cbphysmodel.cpp new file mode 100644 index 0000000..51ff2d8 --- /dev/null +++ b/src/client/lua_api/phys/cbphysmodel.cpp @@ -0,0 +1,135 @@ + +#include +#include +#include +#include +#include +#include +#include +extern "C" { + #include + #include + #include +} +#include +#include +#include "../gameparts.hpp" +#include "cbphysbox.hpp" +#include "cbphysmodel.hpp" +#include +#include + + +using namespace irr; +using namespace scene; +using namespace core; +using namespace video; + +extern IrrlichtDevice* device; + +extern btDiscreteDynamicsWorld* World; +extern std::list Objects; + +//newbphysmodel("graphicfile","physicfile",mass,[,{position}][,{lookat}]) +static int newbphysmodel(lua_State* L){ + printf("Creating bphysmodel\n"); + int nargs = lua_gettop(L); + double lx,ly,lz; + double x,y,z; + if(nargs > 4){ + //"graphicsfile","physicsfile",{position},{lookat} + popvector3d(L,&lx,&ly,&lz); + } + if(nargs > 3){ + //"graphicsfile","physicsfile",{position} + popvector3d(L,&x,&y,&z); + } + //"graphicsfile","physicsfile" + + double mass = lua_tonumber(L,-1); + const char *ppath = lua_tostring(L,-2); + const char *gpath = lua_tostring(L,-3); + lua_pop(L,3); + + ISceneManager *smgr = device->getSceneManager(); + + printf("bphysnode, creating the scene node\n"); + + //Create the scene node + IMesh *gmesh = smgr->getMesh(gpath); + ISceneNode *node = smgr->addMeshSceneNode(gmesh,0,-1,vector3df(x,y,z)); + + printf("bphysnode, createing the physics body\n"); + //Create the physics body + IMesh *pmesh = smgr->getMesh(ppath); + printf("We have %d mesh buffers\n",pmesh->getMeshBufferCount()); + u32 meshcount = pmesh->getMeshBufferCount(); + btTriangleMesh* trimesh = new btTriangleMesh(); + for(u32 meshnum = 0; meshnum < meshcount; meshnum++){ + IMeshBuffer *b = pmesh->getMeshBuffer(meshnum); + //assert(b->getVertexType() == video::EVT_STANDARD); + u32 bi = b->getIndexCount(); + u16 *indices = b->getIndices(); + for(u32 i = 0; i < bi; i+= 3){ + printf("Getting triangle %u of %u\n",i,bi); + u16 i1 = indices[i]; + u16 i2 = indices[i + 1]; + u16 i3 = indices[i + 2]; + vector3df p1 = b->getPosition(i1); + vector3df p2 = b->getPosition(i2); + vector3df p3 = b->getPosition(i3); + 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); + } + } + printf("Done building trimesh\n"); + btCollisionShape *shape = new btBvhTriangleMeshShape(trimesh,true); + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(x,y,z)); + printf("Created default motion shape\n"); + btDefaultMotionState *ms = new btDefaultMotionState(btTransform(tr)); + btVector3 li; + shape->calculateLocalInertia(mass, li); + btRigidBody *rb = new btRigidBody(mass,ms,shape,li); + rb->setUserPointer((void*) node); + World->addRigidBody(rb); + Objects.push_back(rb); + printf("Rigid body finished\n"); + + //Create the lua representation + lua_newtable(L); + lua_pushlightuserdata(L,rb); + lua_setfield(L,-2,"rigidbody"); + lua_pushlightuserdata(L,node); + lua_setfield(L,-2,"node"); + luaL_getmetatable(L,"phys.physmodel"); + lua_setmetatable(L,-2); + printf("finished creating the lua representation\n"); + + return 1; +} + +static const luaL_reg bphysmodel_f[] = { + {"newphysmodel", newbphysmodel}, + {0,0}, +}; + +static const luaL_reg bphysmodel_m[] = { + {0, 0}, +}; + +int cbphysmodel_register(lua_State* L){ + //printf("bphysmodel registered\n"); + + luaL_newmetatable(L, "phys.physmodel");//{} + luaL_register(L,NULL,bphysmodel_m); + luaL_register(L,NULL,igeneric_m); //Inherit all the things to do with scene nodes + + lua_getglobal(L,"phys"); + luaL_register(L,NULL,bphysmodel_f); + + return 1; +} diff --git a/src/client/lua_api/phys/cbphysmodel.hpp b/src/client/lua_api/phys/cbphysmodel.hpp new file mode 100644 index 0000000..5ea42a8 --- /dev/null +++ b/src/client/lua_api/phys/cbphysmodel.hpp @@ -0,0 +1,12 @@ +#ifndef _BPHYSMODEL_HPP_ +#include +#include +extern "C" { + #include + #include + #include +} +#include + +int cbphysmodel_register(lua_State* L); +#endif diff --git a/src/client/lua_api/scene/igeneric.cpp b/src/client/lua_api/scene/igeneric.cpp index 0383619..38479d4 100644 --- a/src/client/lua_api/scene/igeneric.cpp +++ b/src/client/lua_api/scene/igeneric.cpp @@ -67,3 +67,12 @@ int iscenesetmaterial(lua_State* L){ return 0; } + +extern const luaL_reg igeneric_m[] = { + {"getpos", iscenegetpos}, + {"setpos", iscenesetpos}, + {"getang", iscenegetangle}, + {"setang", iscenesetangle}, + {"setmaterial", iscenesetmaterial}, + {0, 0}, +}; diff --git a/src/client/lua_api/scene/igeneric.hpp b/src/client/lua_api/scene/igeneric.hpp index 6d41028..9e3d6f6 100644 --- a/src/client/lua_api/scene/igeneric.hpp +++ b/src/client/lua_api/scene/igeneric.hpp @@ -15,12 +15,5 @@ int iscenegetangle(lua_State* L); int iscenesetangle(lua_State* L); int iscenesetmaterial(lua_State* L); -static const luaL_reg igeneric_m[] = { - {"getpos", iscenegetpos}, - {"setpos", iscenesetpos}, - {"getang", iscenegetangle}, - {"setang", iscenesetangle}, - {"setmaterial", iscenesetmaterial}, - {0, 0}, -}; +extern const luaL_reg igeneric_m[]; #endif diff --git a/src/client/main.cpp b/src/client/main.cpp index 6336dc1..bc509c7 100644 --- a/src/client/main.cpp +++ b/src/client/main.cpp @@ -17,7 +17,7 @@ extern "C" { #include "lua_api/load_gui.hpp" #include "lua_api/load_game.hpp" #include "lua_api/load_scene.hpp" -#include "lua_api/load_phys.hpp" +#include "lua_api/load_cphys.hpp" #include "lua_api/load_video.hpp" #include "lua_api/load_io.hpp" #include "callbackhandeler.hpp" -- cgit v1.2.3-70-g09d2