From ec34e7e439ba03218064925942a9a555bcd13e83 Mon Sep 17 00:00:00 2001 From: Erik Onarheim Date: Sat, 28 Dec 2024 14:55:01 -0600 Subject: [PATCH] fix: CompositeCollider literal edge case --- src/engine/Collision/Colliders/CollisionJumpTable.ts | 4 ++-- src/engine/Collision/Solver/ContactConstraintPoint.ts | 6 ++++-- src/engine/Collision/Solver/RealisticSolver.ts | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/engine/Collision/Colliders/CollisionJumpTable.ts b/src/engine/Collision/Colliders/CollisionJumpTable.ts index 3cb34ae7a..d63e6b87a 100644 --- a/src/engine/Collision/Colliders/CollisionJumpTable.ts +++ b/src/engine/Collision/Colliders/CollisionJumpTable.ts @@ -318,13 +318,13 @@ export const CollisionJumpTable = { txA.apply(contact.info.localSide.begin).add(shapeA.offset), txA.apply(contact.info.localSide.end).add(shapeA.offset) ); - worldPoint = txB.apply(localPoint); + worldPoint = txB.apply(localPoint).add(shapeB.offset); } else { 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); + worldPoint = txA.apply(localPoint).add(shapeA.offset); } return side.distanceToPoint(worldPoint, true); diff --git a/src/engine/Collision/Solver/ContactConstraintPoint.ts b/src/engine/Collision/Solver/ContactConstraintPoint.ts index 198b90939..a160e6191 100644 --- a/src/engine/Collision/Solver/ContactConstraintPoint.ts +++ b/src/engine/Collision/Solver/ContactConstraintPoint.ts @@ -18,14 +18,16 @@ export class ContactConstraintPoint { */ update() { const bodyA = this.contact.bodyA; + const colliderA = this.contact.colliderA; const bodyB = this.contact.bodyB; + const colliderB = this.contact.colliderB; if (bodyA && bodyB) { const normal = this.contact.normal; const tangent = this.contact.tangent; - this.aToContact = this.point.sub(bodyA.globalPos); - this.bToContact = this.point.sub(bodyB.globalPos); + this.aToContact = this.point.sub(colliderA.center); + this.bToContact = this.point.sub(colliderB.center); const aToContactNormal = this.aToContact.cross(normal); const bToContactNormal = this.bToContact.cross(normal); diff --git a/src/engine/Collision/Solver/RealisticSolver.ts b/src/engine/Collision/Solver/RealisticSolver.ts index 8cc157e50..f3c7df939 100644 --- a/src/engine/Collision/Solver/RealisticSolver.ts +++ b/src/engine/Collision/Solver/RealisticSolver.ts @@ -85,15 +85,17 @@ export class RealisticSolver implements CollisionSolver { let pointIndex = 0; const bodyA = contact.bodyA; + const colliderA = contact.colliderA; const bodyB = contact.bodyB; + const colliderB = contact.colliderB; if (bodyA && bodyB) { for (let j = 0; j < contact.points.length; j++) { const point = contact.points[j]; const normal = contact.normal; const tangent = contact.tangent; - const aToContact = point.sub(bodyA.globalPos); - const bToContact = point.sub(bodyB.globalPos); + const aToContact = point.sub(colliderA.center); + const bToContact = point.sub(colliderB.center); const aToContactNormal = aToContact.cross(normal); const bToContactNormal = bToContact.cross(normal);