diff --git a/CHANGELOG.md b/CHANGELOG.md index c11309405..3109989bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed +- Fixed issue with CompositeCollider where large TileMaps would sometimes causes odd collision behavior in the Realistic Solver when the body & collider components are far apart in a TileMap. - Fixed crash on Xiaomi Redmi Phones by lazy loading the GPU particle renderer, GPU particles still do not work on these phones - Add warning if World.add() falls through! This is caused by multiple versions of Excalibur usually - Fixed CollidePolygonPolygon crash with some defense against invalid separation diff --git a/src/engine/Collision/Colliders/CollisionJumpTable.ts b/src/engine/Collision/Colliders/CollisionJumpTable.ts index 8921d484a..3cb34ae7a 100644 --- a/src/engine/Collision/Colliders/CollisionJumpTable.ts +++ b/src/engine/Collision/Colliders/CollisionJumpTable.ts @@ -294,7 +294,7 @@ export const CollisionJumpTable = { return []; }, - FindContactSeparation(contact: CollisionContact, localPoint: Vector) { + FindContactSeparation(contact: CollisionContact, localPoint: Vector): number { const shapeA = contact.colliderA; const txA = contact.bodyA?.transform ?? new TransformComponent(); const shapeB = contact.colliderB; @@ -314,10 +314,16 @@ export const CollisionJumpTable = { let side: LineSegment; let worldPoint: Vector; if (contact.info.collider === shapeA) { - side = new LineSegment(txA.apply(contact.info.localSide.begin), txA.apply(contact.info.localSide.end)); + side = new LineSegment( + txA.apply(contact.info.localSide.begin).add(shapeA.offset), + txA.apply(contact.info.localSide.end).add(shapeA.offset) + ); worldPoint = txB.apply(localPoint); } else { - side = new LineSegment(txB.apply(contact.info.localSide.begin), txB.apply(contact.info.localSide.end)); + side = new LineSegment( + txB.apply(contact.info.localSide.begin).add(shapeB.offset), + txB.apply(contact.info.localSide.end).add(shapeB.offset) + ); worldPoint = txA.apply(localPoint); }