Fixed falling through blocks
This commit is contained in:
parent
cf18da8350
commit
c5ae4e5ab9
@ -15,6 +15,23 @@ public class Collider {
|
|||||||
|
|
||||||
private static final int MAX_COLLISIONS_PER_ENTITY = 64;
|
private static final int MAX_COLLISIONS_PER_ENTITY = 64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dear Princess Celestia,
|
||||||
|
* <p>
|
||||||
|
* When {@linkplain #advanceTime(Collection, Collision, WorldData, float) advancing time},
|
||||||
|
* time step for all entities <em>except</em> 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.
|
||||||
|
* <p>
|
||||||
|
* Today I learned that bad code has nothing to do with friendship, although lemme tell ya:
|
||||||
|
* it's got some dank magic.
|
||||||
|
* <p>
|
||||||
|
* Your faithful student,<br />
|
||||||
|
* Kostyl.
|
||||||
|
*/
|
||||||
|
private static final float TIME_STEP_COEFFICIENT_FOR_CURRENTLY_COLLIDING_BODIES = 1e-1f;
|
||||||
|
|
||||||
public static void performCollisions(
|
public static void performCollisions(
|
||||||
List<? extends Collideable> colls,
|
List<? extends Collideable> colls,
|
||||||
WorldData world,
|
WorldData world,
|
||||||
@ -46,7 +63,7 @@ public class Collider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
advanceTime(colls, world, tickLength);
|
advanceTime(colls, null, world, tickLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Collision getFirstCollision(
|
private static Collision getFirstCollision(
|
||||||
@ -148,7 +165,7 @@ public class Collider {
|
|||||||
float tickLength,
|
float tickLength,
|
||||||
ColliderWorkspace workspace
|
ColliderWorkspace workspace
|
||||||
) {
|
) {
|
||||||
advanceTime(colls, world, collision.time);
|
advanceTime(colls, collision, world, collision.time);
|
||||||
|
|
||||||
boolean doNotHandle = false;
|
boolean doNotHandle = false;
|
||||||
|
|
||||||
@ -274,8 +291,6 @@ public class Collider {
|
|||||||
collision.a.changeVelocityOnCollision(du_a);
|
collision.a.changeVelocityOnCollision(du_a);
|
||||||
collision.b.changeVelocityOnCollision(du_b);
|
collision.b.changeVelocityOnCollision(du_b);
|
||||||
|
|
||||||
separate(collision, n, m_a, m_b);
|
|
||||||
|
|
||||||
// JGML is still to fuck
|
// JGML is still to fuck
|
||||||
Vectors.release(n);
|
Vectors.release(n);
|
||||||
Vectors.release(v_a);
|
Vectors.release(v_a);
|
||||||
@ -287,25 +302,9 @@ public class Collider {
|
|||||||
Vectors.release(du_b);
|
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(
|
private static void advanceTime(
|
||||||
Collection<? extends Collideable> colls,
|
Collection<? extends Collideable> colls,
|
||||||
|
Collision exceptions,
|
||||||
WorldData world,
|
WorldData world,
|
||||||
float step
|
float step
|
||||||
) {
|
) {
|
||||||
@ -315,7 +314,14 @@ public class Collider {
|
|||||||
|
|
||||||
for (Collideable coll : colls) {
|
for (Collideable coll : colls) {
|
||||||
coll.getCollideableVelocity(tmp);
|
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);
|
coll.moveAsCollideable(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user