From 0d2de2ba9c616862d7881f089382db772d034f89 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 27 Oct 2019 17:25:16 -0400 Subject: Various updates --- src/shared/phys/physcommon.cpp | 49 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'src/shared/phys') diff --git a/src/shared/phys/physcommon.cpp b/src/shared/phys/physcommon.cpp index 379ad55..45374d2 100644 --- a/src/shared/phys/physcommon.cpp +++ b/src/shared/phys/physcommon.cpp @@ -2,8 +2,14 @@ #define __shared_physcommon_h #include #include +#include #include - +extern "C" { + #include + #include + #include +} +#include #include "physcommon.hpp" using namespace std::chrono; @@ -11,6 +17,7 @@ using namespace std::chrono; btDiscreteDynamicsWorld* World; std::list Objects; std::list Chars; +extern lua_State *L; extern void dropCollisionObject(btCollisionObject* b); @@ -45,7 +52,7 @@ btCollisionDispatcher* Dispatcher; btSequentialImpulseConstraintSolver* Solver; void phys_genesis(){ - broadphase = new btAxisSweep3(btVector3(-1000,-1000,-1000),btVector3(1000,1000,1000)); + broadphase = new btAxisSweep3(btVector3(-100000,-100000,-100000),btVector3(100000,100000,100000)); broadphase ->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); //printf("Broadphase\n"); CollisionConfiguration = new btDefaultCollisionConfiguration(); @@ -84,6 +91,7 @@ void UpdatePhysics(double TDeltaTime, void(*f)(btCollisionObject *)) { //printf("Pre step simulation\n"); World->stepSimulation(TDeltaTime * 0.2f, 60); //printf("Done step simulation\n"); + assert(lua_gettop(L) == 0); if(f){ //printf("Updating the position of %llu objects\n", Objects.size()); // Relay the object's orientation to irrlicht @@ -91,15 +99,52 @@ void UpdatePhysics(double TDeltaTime, void(*f)(btCollisionObject *)) { (*f)(*it); } } + assert(lua_gettop(L) == 0); + + //Call phy.oncollide(obj1, obj2, point1, point2, normal2) + lua_getglobal(L,"phys");//phys + lua_getfield(L,-1,"colliders");//phys,colliders + int nummanifolds = World->getDispatcher()->getNumManifolds(); + pusherrorfunc(L);//{phys},{colliders},errfunc() + for(int i = 0; i < nummanifolds; i++){ + //printf("Looking at manifold %d, top is %d\n", i, lua_gettop(L)); + + lua_getfield(L,-3,"oncollide");//{phys},{colliders},errfunc(),oncollide() + if(lua_isnil(L,-1)){ + lua_pop(L,4); + return; + } + btPersistentManifold *mf = World->getDispatcher()->getManifoldByIndexInternal(i); + btCollisionObject *oa = (btCollisionObject*)mf->getBody0(); + btCollisionObject *ob = (btCollisionObject*)mf->getBody1(); + btManifoldPoint mp = mf->getContactPoint(i); + btVector3 pa = mp.getPositionWorldOnA(); + btVector3 pb = mp.getPositionWorldOnB(); + btVector3 pn = mp.m_normalWorldOnB; + lua_pushlightuserdata(L,oa);//{phys},{colliders},errfunc(),oncollide(),ud_oa + lua_gettable(L,-4);//{phys},{colliders},errfun(),concollide(),{oa} + lua_pushlightuserdata(L,ob);//{phys},{colliders},errfunc(),oncollide(),{oa},ud_ob + lua_gettable(L,-5);//{phys},{colliders},errfunc(),oncollide(),{oa},{ob} + pushvector3d(L,pa.x(),pa.y(),pa.z()); + pushvector3d(L,pb.x(),pb.y(),pb.z()); + pushvector3d(L,pn.x(),pn.y(),pn.z());//{phys},{colliders},errfunc(),oncollide(),{oa},{ob},{pa},{pb},{normal} + int err = lua_pcall(L,5,0,-7);//{phys},{colliders},errfunc() + if(err) + printf("Failed to call oncollide\n"); + } + lua_pop(L,3); + assert(lua_gettop(L) == 0); } high_resolution_clock::time_point t1 = high_resolution_clock::now(); void gameloop_phys(void(*f)(btCollisionObject *)){ + assert(lua_gettop(L) == 0); //printf("Doing phys gameloop\n"); high_resolution_clock::time_point now = high_resolution_clock::now(); duration delta = now-t1; double steps = delta.count() * 10; UpdatePhysics(steps,f); t1 = now; + assert(lua_gettop(L) == 0); } #endif -- cgit v1.2.3-70-g09d2