From c5ae4e5ab966f480f9c8c552da2a103153b7e0b1 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Thu, 19 Nov 2020 17:51:45 +0300 Subject: [PATCH] Fixed falling through blocks --- .../common/collision/colliders/Collider.java | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/main/java/ru/windcorp/progressia/common/collision/colliders/Collider.java b/src/main/java/ru/windcorp/progressia/common/collision/colliders/Collider.java index 8fdbc90..07c62c4 100644 --- a/src/main/java/ru/windcorp/progressia/common/collision/colliders/Collider.java +++ b/src/main/java/ru/windcorp/progressia/common/collision/colliders/Collider.java @@ -15,6 +15,23 @@ public class Collider { private static final int MAX_COLLISIONS_PER_ENTITY = 64; + /** + * Dear Princess Celestia, + *

+ * When {@linkplain #advanceTime(Collection, Collision, WorldData, float) advancing time}, + * time step for all entities except currently colliding bodies is the current + * collisions's timestamp relative to now. However, currently colliding bodies + * (Collision.a and Collision.b) have a smaller time step. This is done to make sure + * they don't intersect due to rounding errors. + *

+ * Today I learned that bad code has nothing to do with friendship, although lemme tell ya: + * it's got some dank magic. + *

+ * Your faithful student,
+ * Kostyl. + */ + private static final float TIME_STEP_COEFFICIENT_FOR_CURRENTLY_COLLIDING_BODIES = 1e-1f; + public static void performCollisions( List colls, WorldData world, @@ -46,7 +63,7 @@ public class Collider { } } - advanceTime(colls, world, tickLength); + advanceTime(colls, null, world, tickLength); } private static Collision getFirstCollision( @@ -148,7 +165,7 @@ public class Collider { float tickLength, ColliderWorkspace workspace ) { - advanceTime(colls, world, collision.time); + advanceTime(colls, collision, world, collision.time); boolean doNotHandle = false; @@ -274,8 +291,6 @@ public class Collider { collision.a.changeVelocityOnCollision(du_a); collision.b.changeVelocityOnCollision(du_b); - separate(collision, n, m_a, m_b); - // JGML is still to fuck Vectors.release(n); Vectors.release(v_a); @@ -287,25 +302,9 @@ public class Collider { Vectors.release(du_b); } - private static void separate( - Collision collision, - Vec3 normal, float aRelativeMass, float bRelativeMass - ) { - final float margin = 1e-4f; - - Vec3 displacement = Vectors.grab3(); - - displacement.set(normal).mul(margin).mul(bRelativeMass); - collision.a.moveAsCollideable(displacement); - - displacement.set(normal).mul(margin).mul(aRelativeMass).negate(); - collision.b.moveAsCollideable(displacement); - - Vectors.release(displacement); - } - private static void advanceTime( Collection colls, + Collision exceptions, WorldData world, float step ) { @@ -315,7 +314,14 @@ public class Collider { for (Collideable coll : colls) { coll.getCollideableVelocity(tmp); - tmp.mul(step); + + float currentStep = step; + + if (exceptions != null && (exceptions.a == coll || exceptions.b == coll)) { + currentStep *= TIME_STEP_COEFFICIENT_FOR_CURRENTLY_COLLIDING_BODIES; + } + + tmp.mul(currentStep); coll.moveAsCollideable(tmp); }