#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); IMeshBuffer *b = pmesh->getMeshBuffer(0); u32 bi = b->getVertexCount(); btTriangleMesh* trimesh = new btTriangleMesh(); for(u32 i = 0; i < bi; i+= 3){ printf("Getting triangle %u of %u\n",i,bi); vector3df p1 = b->getPosition(i + 0); vector3df p2 = b->getPosition(i + 1); vector3df p3 = b->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); } 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; }