diff --git a/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend b/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend index 1f3a9f9..60374bf 100644 Binary files a/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend and b/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend differ diff --git a/src/physics/collision_object.c b/src/physics/collision_object.c index 4aebecc..3a17ce1 100644 --- a/src/physics/collision_object.c +++ b/src/physics/collision_object.c @@ -3,6 +3,7 @@ #include "gjk.h" #include "contact_insertion.h" #include "collision_scene.h" +#include "../math/mathf.h" void collisionObjectInit(struct CollisionObject* object, struct ColliderTypeData *collider, struct RigidBody* body, float mass) { object->collider = collider; @@ -50,6 +51,10 @@ void collisionObjectCollideWithQuad(struct CollisionObject* object, struct Colli contact->friction = 0.5f; contact->restitution = 0.5f; + if (isnan(result.penetration) || isnan(result.contactA.x) || isnan(result.contactB.x) || isnan(result.normal.x)) { + return; + } + contactInsert(contact, &result); } diff --git a/src/physics/contact_solver.c b/src/physics/contact_solver.c index ad2ebe0..b1b7298 100644 --- a/src/physics/contact_solver.c +++ b/src/physics/contact_solver.c @@ -8,7 +8,7 @@ #include -#define Q3_BAUMGARTE 0.3f +#define Q3_BAUMGARTE 0.1f #define Q3_PENETRATION_SLOP 0.001f @@ -18,6 +18,8 @@ #define ENABLE_FRICTION 1 +#define SOLVER_ITERATIONS 8 + struct ContactSolver gContactSolver; void contactSolverCleanupManifold(struct ContactManifold* manifold) { @@ -381,9 +383,9 @@ void contactSolverIterate(struct ContactSolver* contactSolver) { void contactSolverSolve(struct ContactSolver* solver) { contactSolverPreSolve(solver); - contactSolverIterate(solver); - contactSolverIterate(solver); - contactSolverIterate(solver); + for (int i = 0; i < SOLVER_ITERATIONS; ++i) { + contactSolverIterate(solver); + } } struct ContactManifold* contactSolverGetContactManifold(struct ContactSolver* solver, struct CollisionObject* shapeA, struct CollisionObject* shapeB) { diff --git a/src/util/time.h b/src/util/time.h index e9c991c..d7877b5 100644 --- a/src/util/time.h +++ b/src/util/time.h @@ -6,7 +6,7 @@ extern float gTimePassed; extern OSTime gLastTime; -#define FRAME_SKIP 2 +#define FRAME_SKIP 1 #define FIXED_DELTA_TIME ((1.0f + FRAME_SKIP) / 60.0f) void timeUpdateDelta();