diff --git a/src/engine/Collision/Colliders/PolygonCollider.ts b/src/engine/Collision/Colliders/PolygonCollider.ts index 6411bdccd..0c2a6b6db 100644 --- a/src/engine/Collision/Colliders/PolygonCollider.ts +++ b/src/engine/Collision/Colliders/PolygonCollider.ts @@ -372,9 +372,11 @@ export class PolygonCollider extends Collider { for (let i = 0; i < len; i++) { this._transformedPoints[i] = this._globalMatrix.multiply(points[i].clone()); } - // TODO possible optimization here only check if the transform has a potentially problematic value? // it is possible for the transform to change the winding, scale (-1, 1) for example - this._checkAndUpdateWinding(this._transformedPoints); + const scale = this._globalMatrix.getScale(); + if (scale.x < 0 || scale.y < 0) { + this._checkAndUpdateWinding(this._transformedPoints); + } } /** diff --git a/src/engine/Math/affine-matrix.ts b/src/engine/Math/affine-matrix.ts index dfda55551..e89159f46 100644 --- a/src/engine/Math/affine-matrix.ts +++ b/src/engine/Math/affine-matrix.ts @@ -151,6 +151,8 @@ export class AffineMatrix { this._scale[0] = x; this._scale[1] = y; + this._scaleSignX = sign(x); + this._scaleSignY = sign(y); return this; } @@ -406,6 +408,8 @@ export class AffineMatrix { public clone(dest?: AffineMatrix): AffineMatrix { const mat = dest || new AffineMatrix(); mat.data.set(this.data); + mat._scaleSignX = this._scaleSignX; + mat._scaleSignY = this._scaleSignY; return mat; }