Collider:setFriction; Collider:setRestitution;

This commit is contained in:
bjorn 2017-05-25 00:56:56 -07:00
parent a32eb38026
commit 3b4996b7d0
3 changed files with 56 additions and 0 deletions

View File

@ -423,6 +423,32 @@ int l_lovrColliderGetAABB(lua_State* L) {
return 6;
}
int l_lovrColliderGetFriction(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
lua_pushnumber(L, lovrColliderGetFriction(collider));
return 1;
}
int l_lovrColliderSetFriction(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
float friction = luaL_checknumber(L, 2);
lovrColliderSetFriction(collider, friction);
return 0;
}
int l_lovrColliderGetRestitution(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
lua_pushnumber(L, lovrColliderGetRestitution(collider));
return 1;
}
int l_lovrColliderSetRestitution(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
float restitution = luaL_checknumber(L, 2);
lovrColliderSetRestitution(collider, restitution);
return 0;
}
const luaL_Reg lovrCollider[] = {
{ "destroy", l_lovrColliderDestroy },
{ "getWorld", l_lovrColliderGetWorld },
@ -465,5 +491,9 @@ const luaL_Reg lovrCollider[] = {
{ "getLinearVelocityFromLocalPoint", l_lovrColliderGetLinearVelocityFromLocalPoint },
{ "getLinearVelocityFromWorldPoint", l_lovrColliderGetLinearVelocityFromWorldPoint },
{ "getAABB", l_lovrColliderGetAABB },
{ "getFriction", l_lovrColliderGetFriction },
{ "setFriction", l_lovrColliderSetFriction },
{ "getRestitution", l_lovrColliderGetRestitution },
{ "setRestitution", l_lovrColliderSetRestitution },
{ NULL, NULL }
};

View File

@ -129,6 +129,10 @@ int lovrWorldCollide(World* world, Shape* a, Shape* b, float friction, float res
contacts[i].surface.mu = friction;
contacts[i].surface.bounce = restitution;
contacts[i].surface.mu = dInfinity;
if (restitution > 0) {
contacts[i].surface.mode |= dContactBounce;
}
}
int contactCount = dCollide(a->id, b->id, MAX_CONTACTS, &contacts[0].geom, sizeof(dContact));
@ -203,6 +207,8 @@ Collider* lovrColliderCreate(World* world) {
collider->body = dBodyCreate(world->id);
collider->world = world;
collider->friction = 0;
collider->restitution = 0;
dBodySetData(collider->body, collider);
vec_init(&collider->shapes);
vec_init(&collider->joints);
@ -495,6 +501,22 @@ void lovrColliderGetLinearVelocityFromWorldPoint(Collider* collider, float wx, f
*vz = velocity[2];
}
float lovrColliderGetFriction(Collider* collider) {
return collider->friction;
}
void lovrColliderSetFriction(Collider* collider, float friction) {
collider->friction = friction;
}
float lovrColliderGetRestitution(Collider* collider) {
return collider->restitution;
}
void lovrColliderSetRestitution(Collider* collider, float restitution) {
collider->restitution = restitution;
}
void lovrColliderGetAABB(Collider* collider, float aabb[6]) {
dGeomID shape = dBodyGetFirstGeom(collider->body);

View File

@ -136,6 +136,10 @@ void lovrColliderGetWorldVector(Collider* collider, float x, float y, float z, f
void lovrColliderGetLinearVelocityFromLocalPoint(Collider* collider, float x, float y, float z, float* vx, float* vy, float* vz);
void lovrColliderGetLinearVelocityFromWorldPoint(Collider* collider, float wx, float wy, float wz, float* vx, float* vy, float* vz);
void lovrColliderGetAABB(Collider* collider, float aabb[6]);
float lovrColliderGetFriction(Collider* collider);
void lovrColliderSetFriction(Collider* collider, float friction);
float lovrColliderGetRestitution(Collider* collider);
void lovrColliderSetRestitution(Collider* collider, float restitution);
void lovrShapeDestroy(const Ref* ref);
void lovrShapeDestroyData(Shape* shape);