diff options
| author | Alexander Pickering <alex@cogarr.net> | 2018-10-03 18:05:30 -0400 |
|---|---|---|
| committer | Alexander Pickering <alex@cogarr.net> | 2018-10-03 18:05:30 -0400 |
| commit | 9d4d161ed962bdab6d793279df5a9fe122c1206c (patch) | |
| tree | 1c6d5661d57a7b440ef1001eefd14d64be1b2499 /src/client/lua_api/phys | |
| parent | 7c165e6c5ba2c92bab5359344f0755fd43d1bb9e (diff) | |
| download | brokengine-9d4d161ed962bdab6d793279df5a9fe122c1206c.tar.gz brokengine-9d4d161ed962bdab6d793279df5a9fe122c1206c.tar.bz2 brokengine-9d4d161ed962bdab6d793279df5a9fe122c1206c.zip | |
Started refactoring phys model
Diffstat (limited to 'src/client/lua_api/phys')
| -rw-r--r-- | src/client/lua_api/phys/bphysmodel.cpp | 337 |
1 files changed, 84 insertions, 253 deletions
diff --git a/src/client/lua_api/phys/bphysmodel.cpp b/src/client/lua_api/phys/bphysmodel.cpp index fdd5584..6307d3a 100644 --- a/src/client/lua_api/phys/bphysmodel.cpp +++ b/src/client/lua_api/phys/bphysmodel.cpp @@ -7,16 +7,18 @@ #include <functional> #include <list> extern "C" { - #include <lua.h> - #include <lauxlib.h> - #include <lualib.h> + #include <lua.h> + #include <lauxlib.h> + #include <lualib.h> } #include <btBulletDynamicsCommon.h> #include <irrlicht.h> #include "../gameparts.hpp" #include "cbphysbox.hpp" #include "bphysmodel.hpp" -#include "../scene/igeneric.hpp" +#include <client/lua_api/scene/igeneric.hpp> +#include <shared/lua_api/common.hpp> + using namespace irr; using namespace scene; @@ -28,271 +30,100 @@ extern IrrlichtDevice* device; extern btDiscreteDynamicsWorld* World; extern std::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; -} - -//iscenecamera.new(Vector position, Vector lookat, parrent) -// {} {} 0 1 +//newbphysmodel("graphicfile","physicfile",mass,[,{position}][,{lookat}]) static int newbphysmodel(lua_State* L){ - printf("Createing bphysbox!\n"); + printf("Creating bphysmodel\n"); int nargs = lua_gettop(L); - if(nargs != 3){ - printf("Incorrect # of args to create a physmodel!"); + double lx,ly,lz; + double x,y,z; + if(nargs > 4){ + //"graphicsfile","physicsfile",{position},{lookat} + popvector3d(L,&lx,&ly,&lz); } - //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; -} + if(nargs > 3){ + //"graphicsfile","physicsfile",{position} + popvector3d(L,&x,&y,&z); + } + //"graphicsfile","physicsfile" -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; -} + double mass = lua_tonumber(L,-1); + const char *ppath = lua_tostring(L,-2); + const char *gpath = lua_tostring(L,-3); + lua_pop(L,3); -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; + 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[] = { - {"new", newbphysmodel}, - {0,0}, + {"newphysmodel", newbphysmodel}, + {0,0}, }; static const luaL_reg bphysmodel_m[] = { - {"setmaterial", iscenesetmaterial}, - {"getpos", bphysgetpos}, - {"setpos", bphyssetpos}, -// {"remove", removeiguielement}, - {0, 0}, + {0, 0}, }; int bphysmodel_register(lua_State* L, IrrlichtDevice* d){ - device = d; - - //printf("bphysmodel registered\n"); + device = d; - luaL_newmetatable(L, "phys.physmodel"); + //printf("bphysmodel registered\n"); - 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); + 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; + return 1; } |
