extern "C" { #include #include #include } #include //#include #include //extern IrrlichtDevice* device; //extern btDiscreteDynamicsWorld* World; //extern std::list Objects; /*Physics things have the form of: { rigidbody = btRigidBody, node = ISceneNode, } */ //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; } //apply force at a reletive offset //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; } //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; } //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; } //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; } //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; } //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; } //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; }