mirror of https://github.com/bjornbytes/lovr.git
Initialize inertia information for new colliders
Inertia matrix has to be calculated with algorithm specific for each shape. Without calculated matrix the physics behaves very floaty and slowed down.
This commit is contained in:
parent
8e13158148
commit
097d39628a
|
@ -60,6 +60,7 @@ static int l_lovrWorldNewBoxCollider(lua_State* L) {
|
|||
Collider* collider = lovrColliderCreate(world, x, y, z);
|
||||
BoxShape* shape = lovrBoxShapeCreate(sx, sy, sz);
|
||||
lovrColliderAddShape(collider, shape);
|
||||
lovrColliderInitInertia(collider, shape);
|
||||
luax_pushtype(L, Collider, collider);
|
||||
lovrRelease(Collider, collider);
|
||||
lovrRelease(Shape, shape);
|
||||
|
@ -76,6 +77,7 @@ static int l_lovrWorldNewCapsuleCollider(lua_State* L) {
|
|||
Collider* collider = lovrColliderCreate(world, x, y, z);
|
||||
CapsuleShape* shape = lovrCapsuleShapeCreate(radius, length);
|
||||
lovrColliderAddShape(collider, shape);
|
||||
lovrColliderInitInertia(collider, shape);
|
||||
luax_pushtype(L, Collider, collider);
|
||||
lovrRelease(Collider, collider);
|
||||
lovrRelease(Shape, shape);
|
||||
|
@ -92,6 +94,7 @@ static int l_lovrWorldNewCylinderCollider(lua_State* L) {
|
|||
Collider* collider = lovrColliderCreate(world, x, y, z);
|
||||
CylinderShape* shape = lovrCylinderShapeCreate(radius, length);
|
||||
lovrColliderAddShape(collider, shape);
|
||||
lovrColliderInitInertia(collider, shape);
|
||||
luax_pushtype(L, Collider, collider);
|
||||
lovrRelease(Collider, collider);
|
||||
lovrRelease(Shape, shape);
|
||||
|
@ -107,6 +110,7 @@ static int l_lovrWorldNewSphereCollider(lua_State* L) {
|
|||
Collider* collider = lovrColliderCreate(world, x, y, z);
|
||||
SphereShape* shape = lovrSphereShapeCreate(radius);
|
||||
lovrColliderAddShape(collider, shape);
|
||||
lovrColliderInitInertia(collider, shape);
|
||||
luax_pushtype(L, Collider, collider);
|
||||
lovrRelease(Collider, collider);
|
||||
lovrRelease(Shape, shape);
|
||||
|
|
|
@ -332,6 +332,14 @@ void lovrColliderDestroyData(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) {
|
||||
return collider->world;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#define MAX_CONTACTS 4
|
||||
#define MAX_CONTACTS 10
|
||||
#define MAX_TAGS 16
|
||||
#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__)
|
||||
void lovrColliderDestroy(void* ref);
|
||||
void lovrColliderDestroyData(Collider* collider);
|
||||
void lovrColliderInitInertia(Collider* collider, Shape * shape);
|
||||
World* lovrColliderGetWorld(Collider* collider);
|
||||
void lovrColliderAddShape(Collider* collider, Shape* shape);
|
||||
void lovrColliderRemoveShape(Collider* collider, Shape* shape);
|
||||
|
|
Loading…
Reference in New Issue