From a54f7f087a222b9f684df232b1aee661c7b9da9c Mon Sep 17 00:00:00 2001 From: Erik Onarheim Date: Fri, 17 May 2024 21:20:22 -0500 Subject: [PATCH] perf: Polygon check winding on negative scale --- src/engine/Collision/Colliders/PolygonCollider.ts | 6 ++++-- src/engine/Math/affine-matrix.ts | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) 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; }