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