From 3b4996b7d0714f566c41547630e9723176f0e923 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 25 May 2017 00:56:56 -0700 Subject: [PATCH] Collider:setFriction; Collider:setRestitution; --- src/api/types/collider.c | 30 ++++++++++++++++++++++++++++++ src/physics/physics.c | 22 ++++++++++++++++++++++ src/physics/physics.h | 4 ++++ 3 files changed, 56 insertions(+) diff --git a/src/api/types/collider.c b/src/api/types/collider.c index f78579c8..cda56831 100644 --- a/src/api/types/collider.c +++ b/src/api/types/collider.c @@ -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 } }; diff --git a/src/physics/physics.c b/src/physics/physics.c index ea4fc09a..d701a793 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -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); diff --git a/src/physics/physics.h b/src/physics/physics.h index e8fa9908..f27b3358 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -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);