From 640cf66ba4ba2f270c521a4d58b1403ab53e0f87 Mon Sep 17 00:00:00 2001 From: GeoKureli-BlackbookPro Date: Tue, 29 Apr 2025 09:55:19 -0500 Subject: [PATCH 1/7] add matrix isIdentity skewRandians and skewDegrees --- flixel/math/FlxMatrix.hx | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/flixel/math/FlxMatrix.hx b/flixel/math/FlxMatrix.hx index 26c3b7c881..c70d1f6798 100644 --- a/flixel/math/FlxMatrix.hx +++ b/flixel/math/FlxMatrix.hx @@ -9,6 +9,37 @@ import openfl.geom.Matrix; */ class FlxMatrix extends Matrix { + public inline function isIdentity():Bool + { + return a == 1 && b == 0 && c == 0 && d == 1 && tx == 0 && ty == 0; + } + + /** + * Skews `this` matrix, in radians. + * @param skewX Horizontal skew in radians. + * @param skewY Vertical skew in radians. + * @return `this` skewed matrix. + */ + public inline function skewRadians(skewX:Float, skewY:Float):FlxMatrix + { + b = Math.tan(skewY); + + c = Math.tan(skewX); + + return this; + } + + /** + * Skews `this` matrix, in degrees. + * @param skewY Horizontal skew in degrees. + * @param skewX Vertical skew in degrees. + * @return `this` skewed matrix. + */ + public inline function skewDegrees(skewX:Float, skewY:Float):FlxMatrix + { + return skewRadians(skewY * FlxAngle.TO_RAD, skewX * FlxAngle.TO_RAD); + } + /** * Rotates this matrix, but takes the values of sine and cosine, * so it might be useful when you rotate multiple matrices by the same angle From 8bf9b548803ec2a280a920303e813422a928c291 Mon Sep 17 00:00:00 2001 From: GeoKureli-BlackbookPro Date: Tue, 29 Apr 2025 10:42:14 -0500 Subject: [PATCH 2/7] WIP add FlxMatrixSprite --- flixel/FlxSprite.hx | 20 +++++++--- flixel/effects/FlxMatrixSprite.hx | 63 +++++++++++++++++++++++++++++++ flixel/text/FlxText.hx | 26 ++++++------- 3 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 flixel/effects/FlxMatrixSprite.hx diff --git a/flixel/FlxSprite.hx b/flixel/FlxSprite.hx index cd4704bfff..125efd6e65 100644 --- a/flixel/FlxSprite.hx +++ b/flixel/FlxSprite.hx @@ -873,9 +873,18 @@ class FlxSprite extends FlxObject drawFrameComplex(_frame, camera); } + @:noCompletion + static final drawComplexMatrix = new FlxMatrix(); function drawFrameComplex(frame:FlxFrame, camera:FlxCamera):Void { - final matrix = this._matrix; // TODO: Just use local? + final matrix = drawComplexMatrix; // TODO: Just use local? + prepareComplexMatrix(matrix, frame, camera); + + camera.drawPixels(frame, framePixels, matrix, colorTransform, blend, antialiasing, shader); + } + + function prepareComplexMatrix(matrix:FlxMatrix, frame:FlxFrame, camera:FlxCamera) + { frame.prepareMatrix(matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); matrix.translate(-origin.x, -origin.y); matrix.scale(scale.x, scale.y); @@ -888,17 +897,16 @@ class FlxSprite extends FlxObject matrix.rotateWithTrig(_cosAngle, _sinAngle); } - getScreenPosition(_point, camera).subtract(offset); - _point.add(origin.x, origin.y); - matrix.translate(_point.x, _point.y); + final screenPos = getScreenPosition(camera).subtract(offset); + screenPos.add(origin.x, origin.y); + matrix.translate(screenPos.x, screenPos.y); + screenPos.put(); if (isPixelPerfectRender(camera)) { matrix.tx = Math.floor(matrix.tx); matrix.ty = Math.floor(matrix.ty); } - - camera.drawPixels(frame, framePixels, matrix, colorTransform, blend, antialiasing, shader); } /** diff --git a/flixel/effects/FlxMatrixSprite.hx b/flixel/effects/FlxMatrixSprite.hx new file mode 100644 index 0000000000..108fce8dd7 --- /dev/null +++ b/flixel/effects/FlxMatrixSprite.hx @@ -0,0 +1,63 @@ +package flixel.effects; + +import flixel.FlxSprite; +import flixel.math.FlxMatrix; + +/** + * A sprite that uses a `renderMatrix` to transform its rendering + */ +class FlxMatrixSprite implements FlxSprite +{ + /** + * The matrix used to transform how this sprite is rendered + * + * @since 6.2.0 + */ + public final renderMatrix:FlxMatrix; + + public function new (x = 0.0, y = 0.0, simpleGraphic) + { + renderMatrix = new FlxSpriteMatrixTransform(this); + + super(x, y, graphic); + } + override function destroy():Void + { + super.destroy(); + + renderMatrix.destroy(); + } + + override function isSimpleRenderBlit() + { + return isSimpleRenderBlit() || matrix.isIdentity(); + } + + override function getDrawComplexMatrix(matrix:FlxMatrix, frame:FlxFrame, camera:FlxCamera) + { + frame.prepareMatrix(matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); + matrix.translate(-origin.x, -origin.y); + matrix.scale(scale.x, scale.y); + + if (bakedRotationAngle <= 0) + { + updateTrig(); + + if (angle != 0) + matrix.rotateWithTrig(_cosAngle, _sinAngle); + } + + matrix.concat(renderMatrix); + + final screenPos = getScreenPosition(camera).subtract(offset); + screenPos.add(origin.x, origin.y); + matrix.translate(screenPos.x, screenPos.y); + screenPos.put(); + + if (isPixelPerfectRender(camera)) + { + matrix.tx = Math.floor(matrix.tx); + matrix.ty = Math.floor(matrix.ty); + } + } +} \ No newline at end of file diff --git a/flixel/text/FlxText.hx b/flixel/text/FlxText.hx index 8d63c667d6..b94d1ed5be 100644 --- a/flixel/text/FlxText.hx +++ b/flixel/text/FlxText.hx @@ -1034,34 +1034,32 @@ class FlxText extends FlxSprite camera.copyPixels(_frame, framePixels, _flashRect, _flashPoint, colorTransform, blend, antialiasing); } - override function drawComplex(camera:FlxCamera):Void + override function getDrawComplexMatrix(matrix:FlxMatrix, frame:FlxFrame, camera:FlxCamera) { - _frame.prepareMatrix(_matrix, ANGLE_0, checkFlipX(), checkFlipY()); - _matrix.translate(-origin.x, -origin.y); - _matrix.scale(scale.x, scale.y); + frame.prepareMatrix(matrix, ANGLE_0, checkFlipX(), checkFlipY()); + matrix.translate(-origin.x, -origin.y); + matrix.scale(scale.x, scale.y); if (bakedRotationAngle <= 0) { updateTrig(); if (angle != 0) - _matrix.rotateWithTrig(_cosAngle, _sinAngle); + matrix.rotateWithTrig(_cosAngle, _sinAngle); } - // same as super but checks _graphicOffset - getScreenPosition(_point, camera).subtract(offset).subtract(_graphicOffset); - _point.add(origin.x, origin.y); - _matrix.translate(_point.x, _point.y); + final screenPos = getScreenPosition(camera).subtract(offset).subtract(_graphicOffset); + screenPos.add(origin.x, origin.y); + matrix.translate(screenPos.x, screenPos.y); + screenPos.put(); if (isPixelPerfectRender(camera)) { - _matrix.tx = Math.floor(_matrix.tx); - _matrix.ty = Math.floor(_matrix.ty); + matrix.tx = Math.floor(matrix.tx); + matrix.ty = Math.floor(matrix.ty); } - - camera.drawPixels(_frame, framePixels, _matrix, colorTransform, blend, antialiasing, shader); } - + /** * Internal function to update the current animation frame. * From 7e42efdc8236215667d42b24e3f20e99224065c8 Mon Sep 17 00:00:00 2001 From: GeoKureli-BlackbookPro Date: Tue, 29 Apr 2025 10:51:46 -0500 Subject: [PATCH 3/7] fixes --- flixel/effects/FlxMatrixSprite.hx | 8 +------ flixel/text/FlxText.hx | 36 ++----------------------------- 2 files changed, 3 insertions(+), 41 deletions(-) diff --git a/flixel/effects/FlxMatrixSprite.hx b/flixel/effects/FlxMatrixSprite.hx index 108fce8dd7..7f0e96de41 100644 --- a/flixel/effects/FlxMatrixSprite.hx +++ b/flixel/effects/FlxMatrixSprite.hx @@ -19,13 +19,7 @@ class FlxMatrixSprite implements FlxSprite { renderMatrix = new FlxSpriteMatrixTransform(this); - super(x, y, graphic); - } - override function destroy():Void - { - super.destroy(); - - renderMatrix.destroy(); + super(x, y, simpleGraphic); } override function isSimpleRenderBlit() diff --git a/flixel/text/FlxText.hx b/flixel/text/FlxText.hx index b94d1ed5be..2b5f570ff6 100644 --- a/flixel/text/FlxText.hx +++ b/flixel/text/FlxText.hx @@ -1023,41 +1023,9 @@ class FlxText extends FlxSprite super.draw(); } - override function drawSimple(camera:FlxCamera):Void + override function getScreenPosition(?result:FlxPoint, ?camera:FlxCamera):FlxPoint { - // same as super but checks _graphicOffset - getScreenPosition(_point, camera).subtract(offset).subtract(_graphicOffset); - if (isPixelPerfectRender(camera)) - _point.floor(); - - _point.copyTo(_flashPoint); - camera.copyPixels(_frame, framePixels, _flashRect, _flashPoint, colorTransform, blend, antialiasing); - } - - override function getDrawComplexMatrix(matrix:FlxMatrix, frame:FlxFrame, camera:FlxCamera) - { - frame.prepareMatrix(matrix, ANGLE_0, checkFlipX(), checkFlipY()); - matrix.translate(-origin.x, -origin.y); - matrix.scale(scale.x, scale.y); - - if (bakedRotationAngle <= 0) - { - updateTrig(); - - if (angle != 0) - matrix.rotateWithTrig(_cosAngle, _sinAngle); - } - - final screenPos = getScreenPosition(camera).subtract(offset).subtract(_graphicOffset); - screenPos.add(origin.x, origin.y); - matrix.translate(screenPos.x, screenPos.y); - screenPos.put(); - - if (isPixelPerfectRender(camera)) - { - matrix.tx = Math.floor(matrix.tx); - matrix.ty = Math.floor(matrix.ty); - } + return super.getScreenPosition(result, camera).subtract(_graphicOffset); } /** From b90e85d5d0bce9ec082c65d95e65ef68069a1a5b Mon Sep 17 00:00:00 2001 From: GeoKureli-BlackbookPro Date: Tue, 29 Apr 2025 11:20:29 -0500 Subject: [PATCH 4/7] D'oh --- flixel/effects/FlxMatrixSprite.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flixel/effects/FlxMatrixSprite.hx b/flixel/effects/FlxMatrixSprite.hx index 7f0e96de41..7d49642a17 100644 --- a/flixel/effects/FlxMatrixSprite.hx +++ b/flixel/effects/FlxMatrixSprite.hx @@ -6,7 +6,7 @@ import flixel.math.FlxMatrix; /** * A sprite that uses a `renderMatrix` to transform its rendering */ -class FlxMatrixSprite implements FlxSprite +class FlxMatrixSprite extends FlxSprite { /** * The matrix used to transform how this sprite is rendered From 6d3c6c85da74cc25a0b89477ce279dbacd15c1d4 Mon Sep 17 00:00:00 2001 From: GeoKureli-BlackbookPro Date: Tue, 29 Apr 2025 11:38:22 -0500 Subject: [PATCH 5/7] D'oh! --- flixel/effects/FlxMatrixSprite.hx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flixel/effects/FlxMatrixSprite.hx b/flixel/effects/FlxMatrixSprite.hx index 7d49642a17..fa8a4a05f7 100644 --- a/flixel/effects/FlxMatrixSprite.hx +++ b/flixel/effects/FlxMatrixSprite.hx @@ -1,6 +1,7 @@ package flixel.effects; import flixel.FlxSprite; +import flixel.graphics.frames.FlxFrame; import flixel.math.FlxMatrix; /** @@ -17,7 +18,7 @@ class FlxMatrixSprite extends FlxSprite public function new (x = 0.0, y = 0.0, simpleGraphic) { - renderMatrix = new FlxSpriteMatrixTransform(this); + renderMatrix = new FlxMatrix(this); super(x, y, simpleGraphic); } From 4498500dfaedfa3e84cf93935267dcead1186020 Mon Sep 17 00:00:00 2001 From: GeoKureli-BlackbookPro Date: Tue, 29 Apr 2025 12:10:11 -0500 Subject: [PATCH 6/7] D'OH! --- flixel/effects/FlxMatrixSprite.hx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flixel/effects/FlxMatrixSprite.hx b/flixel/effects/FlxMatrixSprite.hx index fa8a4a05f7..1bd71dfd88 100644 --- a/flixel/effects/FlxMatrixSprite.hx +++ b/flixel/effects/FlxMatrixSprite.hx @@ -18,14 +18,14 @@ class FlxMatrixSprite extends FlxSprite public function new (x = 0.0, y = 0.0, simpleGraphic) { - renderMatrix = new FlxMatrix(this); + renderMatrix = new FlxMatrix(); super(x, y, simpleGraphic); } - override function isSimpleRenderBlit() + override function isSimpleRenderBlit(cam) { - return isSimpleRenderBlit() || matrix.isIdentity(); + return super.isSimpleRenderBlit(cam) || matrix.isIdentity(); } override function getDrawComplexMatrix(matrix:FlxMatrix, frame:FlxFrame, camera:FlxCamera) From ef895a6c04c060ac31f36b5c901838b765ccfdbe Mon Sep 17 00:00:00 2001 From: GeoKureli-BlackbookPro Date: Tue, 29 Apr 2025 12:20:17 -0500 Subject: [PATCH 7/7] omgwtf --- flixel/effects/FlxMatrixSprite.hx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flixel/effects/FlxMatrixSprite.hx b/flixel/effects/FlxMatrixSprite.hx index 1bd71dfd88..946bd63c76 100644 --- a/flixel/effects/FlxMatrixSprite.hx +++ b/flixel/effects/FlxMatrixSprite.hx @@ -16,19 +16,19 @@ class FlxMatrixSprite extends FlxSprite */ public final renderMatrix:FlxMatrix; - public function new (x = 0.0, y = 0.0, simpleGraphic) + public function new (x = 0.0, y = 0.0, ?simpleGraphic) { renderMatrix = new FlxMatrix(); super(x, y, simpleGraphic); } - override function isSimpleRenderBlit(cam) + override function isSimpleRenderBlit(?cam) { - return super.isSimpleRenderBlit(cam) || matrix.isIdentity(); + return super.isSimpleRenderBlit(cam) || renderMatrix.isIdentity(); } - override function getDrawComplexMatrix(matrix:FlxMatrix, frame:FlxFrame, camera:FlxCamera) + override function prepareComplexMatrix(matrix:FlxMatrix, frame:FlxFrame, camera:FlxCamera) { frame.prepareMatrix(matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); matrix.translate(-origin.x, -origin.y);