Merge pull request #249 from jmiskovic/init-inertia

Initialize inertia information for new colliders
This commit is contained in:
Bjorn 2020-04-30 11:46:32 -07:00 committed by GitHub
commit f811be431f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 1 deletions

View File

@ -60,6 +60,7 @@ static int l_lovrWorldNewBoxCollider(lua_State* L) {
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
BoxShape* shape = lovrBoxShapeCreate(sx, sy, sz); BoxShape* shape = lovrBoxShapeCreate(sx, sy, sz);
lovrColliderAddShape(collider, shape); lovrColliderAddShape(collider, shape);
lovrColliderInitInertia(collider, shape);
luax_pushtype(L, Collider, collider); luax_pushtype(L, Collider, collider);
lovrRelease(Collider, collider); lovrRelease(Collider, collider);
lovrRelease(Shape, shape); lovrRelease(Shape, shape);
@ -76,6 +77,7 @@ static int l_lovrWorldNewCapsuleCollider(lua_State* L) {
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
CapsuleShape* shape = lovrCapsuleShapeCreate(radius, length); CapsuleShape* shape = lovrCapsuleShapeCreate(radius, length);
lovrColliderAddShape(collider, shape); lovrColliderAddShape(collider, shape);
lovrColliderInitInertia(collider, shape);
luax_pushtype(L, Collider, collider); luax_pushtype(L, Collider, collider);
lovrRelease(Collider, collider); lovrRelease(Collider, collider);
lovrRelease(Shape, shape); lovrRelease(Shape, shape);
@ -92,6 +94,7 @@ static int l_lovrWorldNewCylinderCollider(lua_State* L) {
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
CylinderShape* shape = lovrCylinderShapeCreate(radius, length); CylinderShape* shape = lovrCylinderShapeCreate(radius, length);
lovrColliderAddShape(collider, shape); lovrColliderAddShape(collider, shape);
lovrColliderInitInertia(collider, shape);
luax_pushtype(L, Collider, collider); luax_pushtype(L, Collider, collider);
lovrRelease(Collider, collider); lovrRelease(Collider, collider);
lovrRelease(Shape, shape); lovrRelease(Shape, shape);
@ -107,6 +110,7 @@ static int l_lovrWorldNewSphereCollider(lua_State* L) {
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
SphereShape* shape = lovrSphereShapeCreate(radius); SphereShape* shape = lovrSphereShapeCreate(radius);
lovrColliderAddShape(collider, shape); lovrColliderAddShape(collider, shape);
lovrColliderInitInertia(collider, shape);
luax_pushtype(L, Collider, collider); luax_pushtype(L, Collider, collider);
lovrRelease(Collider, collider); lovrRelease(Collider, collider);
lovrRelease(Shape, shape); lovrRelease(Shape, shape);

View File

@ -332,6 +332,14 @@ void lovrColliderDestroyData(Collider* collider) {
lovrRelease(Collider, collider); lovrRelease(Collider, collider);
} }
void lovrColliderInitInertia(Collider* collider, Shape * shape) {
// compute inertia matrix for default density
const float density = 1.0f;
float cx, cy, cz, mass, inertia[6];
lovrShapeGetMass(shape, density, &cx, &cy, &cz, &mass, inertia);
lovrColliderSetMassData(collider, cx, cy, cz, mass, inertia);
}
World* lovrColliderGetWorld(Collider* collider) { World* lovrColliderGetWorld(Collider* collider) {
return collider->world; return collider->world;
} }

View File

@ -5,7 +5,7 @@
#pragma once #pragma once
#define MAX_CONTACTS 4 #define MAX_CONTACTS 10
#define MAX_TAGS 16 #define MAX_TAGS 16
#define NO_TAG ~0u #define NO_TAG ~0u
@ -111,6 +111,7 @@ Collider* lovrColliderInit(Collider* collider, World* world, float x, float y, f
#define lovrColliderCreate(...) lovrColliderInit(lovrAlloc(Collider), __VA_ARGS__) #define lovrColliderCreate(...) lovrColliderInit(lovrAlloc(Collider), __VA_ARGS__)
void lovrColliderDestroy(void* ref); void lovrColliderDestroy(void* ref);
void lovrColliderDestroyData(Collider* collider); void lovrColliderDestroyData(Collider* collider);
void lovrColliderInitInertia(Collider* collider, Shape * shape);
World* lovrColliderGetWorld(Collider* collider); World* lovrColliderGetWorld(Collider* collider);
void lovrColliderAddShape(Collider* collider, Shape* shape); void lovrColliderAddShape(Collider* collider, Shape* shape);
void lovrColliderRemoveShape(Collider* collider, Shape* shape); void lovrColliderRemoveShape(Collider* collider, Shape* shape);