From 9ab30596268fd2466e73214f40d4c9c6930e26ff Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Sun, 18 Jan 2026 23:34:22 +0100 Subject: [PATCH] Removed flxanimate entirely + Fixed transition + Fixed offsets --- building/libs.xml | 3 +- project.xml | 1 - source/funkin/backend/FunkinSprite.hx | 44 +++++++++++++++++++ source/funkin/backend/utils/CoolUtil.hx | 6 +-- .../editors/character/CharacterAnimButton.hx | 6 --- source/funkin/editors/ui/UIImageExplorer.hx | 6 +-- 6 files changed, 51 insertions(+), 15 deletions(-) diff --git a/building/libs.xml b/building/libs.xml index 90a4ed65..c45fdd46 100644 --- a/building/libs.xml +++ b/building/libs.xml @@ -14,7 +14,6 @@ - @@ -33,7 +32,7 @@ - + diff --git a/project.xml b/project.xml index ac294e4e..a0a557a7 100644 --- a/project.xml +++ b/project.xml @@ -130,7 +130,6 @@ - diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index f03dd285..78126bab 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -16,6 +16,8 @@ import funkin.backend.utils.XMLUtil.AnimData; import funkin.backend.utils.XMLUtil.BeatAnim; import funkin.backend.utils.XMLUtil.IXMLEvents; import haxe.io.Path; +import flixel.graphics.frames.FlxFrame; +import flixel.math.FlxAngle; enum abstract XMLAnimType(Int) { @@ -373,4 +375,46 @@ class FunkinSprite extends FlxAnimate implements IBeatReceiver implements IOffse animation.curAnim.curFrame = val; return val; } + + override function drawComplex(camera:FlxCamera):Void + { + #if (flixel < "6.1.0") final frame = this._frame; #end + final matrix = this._matrix; // TODO: Just use local? + + frame.prepareMatrix(matrix, FlxFrameAngle.ANGLE_0, checkFlipX() != camera.flipX, checkFlipY() != camera.flipY); + matrix.translate(-origin.x, -origin.y); + + if (frameOffsetAngle != null && frameOffsetAngle != angle) + { + var angleOff = (frameOffsetAngle - angle) * FlxAngle.TO_RAD; + var cos = Math.cos(angleOff); + var sin = Math.sin(angleOff); + // cos doesnt need to be negated + _matrix.rotateWithTrig(cos, -sin); + _matrix.translate(-frameOffset.x, -frameOffset.y); + _matrix.rotateWithTrig(cos, sin); + } + else + _matrix.translate(-frameOffset.x, -frameOffset.y); + + matrix.scale(scale.x, scale.y); + if (bakedRotationAngle <= 0) + { + updateTrig(); + if (angle != 0) + matrix.rotateWithTrig(_cosAngle, _sinAngle); + } + if (skew.x != 0 || skew.y != 0) + { + updateSkew(); + _matrix.concat(FlxAnimate._skewMatrix); + } + getScreenPosition(_point, camera); + _point.x += origin.x - offset.x; + _point.y += origin.y - offset.y; + matrix.translate(_point.x, _point.y); + if (isPixelPerfectRender(camera)) + preparePixelPerfectMatrix(matrix); + camera.drawPixels(frame, framePixels, matrix, colorTransform, blend, antialiasing, shader); + } } diff --git a/source/funkin/backend/utils/CoolUtil.hx b/source/funkin/backend/utils/CoolUtil.hx index d8733f4a..65dc4340 100644 --- a/source/funkin/backend/utils/CoolUtil.hx +++ b/source/funkin/backend/utils/CoolUtil.hx @@ -21,7 +21,6 @@ import flixel.util.FlxAxes; import flixel.util.FlxColor; import flixel.util.typeLimit.OneOfThree; import flixel.util.typeLimit.OneOfTwo; -import flxanimate.data.AnimationData.AnimAtlas; import funkin.backend.system.Conductor; import funkin.backend.utils.XMLUtil.TextFormat; import haxe.CallStack; @@ -34,6 +33,7 @@ import haxe.xml.Access; import lime.utils.Assets; import openfl.display.BitmapData; import openfl.geom.ColorTransform; +import animate.FlxAnimateJson; using StringTools; @@ -1252,13 +1252,13 @@ final class CoolUtil return animsList; } - public static function getAnimsListFromAtlas(atlas:AnimAtlas):Array { + public static function getAnimsListFromAtlas(atlas:AnimationJson):Array { if (atlas == null) return []; var animsList:Array = []; if (atlas.AN.SN != null) animsList.push(atlas.AN.SN); if (atlas.SD != null) - for (symbol in atlas.SD.S) + for (symbol in atlas.SD) if (symbol.SN != null) animsList.push(symbol.SN); return animsList; diff --git a/source/funkin/editors/character/CharacterAnimButton.hx b/source/funkin/editors/character/CharacterAnimButton.hx index fb5f2e14..5bc20a27 100644 --- a/source/funkin/editors/character/CharacterAnimButton.hx +++ b/source/funkin/editors/character/CharacterAnimButton.hx @@ -2,12 +2,6 @@ package funkin.editors.character; import flixel.text.FlxText.FlxTextFormat; import flixel.text.FlxText.FlxTextFormatMarkerPair; -import flxanimate.animate.FlxAnim.FlxSymbolAnimation; -import flxanimate.animate.FlxSymbol; -import flxanimate.animate.FlxElement; -import flxanimate.animate.SymbolParameters; -import flxanimate.animate.FlxKeyFrame; -import flxanimate.animate.FlxTimeline; import flixel.graphics.frames.FlxFrame; import flixel.animation.FlxAnimation; import openfl.geom.Rectangle; diff --git a/source/funkin/editors/ui/UIImageExplorer.hx b/source/funkin/editors/ui/UIImageExplorer.hx index 12268e4d..cf6cdab3 100644 --- a/source/funkin/editors/ui/UIImageExplorer.hx +++ b/source/funkin/editors/ui/UIImageExplorer.hx @@ -3,7 +3,6 @@ package funkin.editors.ui; import flixel.util.typeLimit.OneOfTwo; import flixel.text.FlxText.FlxTextFormat; import flixel.text.FlxText.FlxTextFormatMarkerPair; -import flxanimate.data.SpriteMapData.AnimateAtlas; import flixel.graphics.frames.FlxFramesCollection; import haxe.Json; import haxe.io.Bytes; @@ -11,6 +10,7 @@ import haxe.io.Path; import openfl.display.BitmapData; import sys.FileSystem; import sys.io.File; +import animate.FlxAnimateJson; using StringTools; using funkin.backend.utils.BitmapUtil; @@ -122,7 +122,7 @@ class UIImageExplorer extends UIFileExplorer { for(file in files) { if(SPRITEMAP_JSON_REGEX.match(file)) { var content:String = CoolUtil.removeBOM(File.getContent(Path.join([directoryPath, file]))); - var json:AnimateAtlas = Json.parse(content); + var json:SpritemapJson = Json.parse(content); if(json.meta.image.toLowerCase() == fileName.toLowerCase()) foundSpritemapJson = true; } else if(file == "Animation.json") @@ -147,7 +147,7 @@ class UIImageExplorer extends UIFileExplorer { spritemaps.sort(Reflect.compare); for(spritemap in spritemaps) { var content:String = CoolUtil.removeBOM(File.getContent(Path.join([directoryPath, spritemap]))); - var json:AnimateAtlas = Json.parse(content); + var json:SpritemapJson = Json.parse(content); var imageToFind:String = json.meta.image.toLowerCase(); for(file in files) { // lowercase since windows does case insensitive stuff, so we use lowercase to match behavior on mac and linux