From c0efb545bdeaa72b803224b39e4dde5340500829 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Tue, 11 Jun 2024 14:07:50 +0200 Subject: [PATCH] [flutter] Fixes #2546, fix drawing before controller initialized drawable --- spine-flutter/CHANGELOG.md | 3 +++ .../example/lib/simple_animation.dart | 8 ++++++-- .../lib/assets/libspine_flutter.wasm | Bin 416625 -> 416639 bytes spine-flutter/lib/spine_widget.dart | 10 +++++++--- spine-flutter/pubspec.yaml | 2 +- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/spine-flutter/CHANGELOG.md b/spine-flutter/CHANGELOG.md index 69b28344f..e6cb14e33 100644 --- a/spine-flutter/CHANGELOG.md +++ b/spine-flutter/CHANGELOG.md @@ -1,3 +1,6 @@ +# 4.2.27 +- Fixes clipping in case of colinear clipping edges. + # 4.2.26 - `Skeleton.getBounds()` takes clipping into consideration. diff --git a/spine-flutter/example/lib/simple_animation.dart b/spine-flutter/example/lib/simple_animation.dart index f9a96ecdf..0c34c777c 100644 --- a/spine-flutter/example/lib/simple_animation.dart +++ b/spine-flutter/example/lib/simple_animation.dart @@ -37,8 +37,12 @@ class SimpleAnimation extends StatelessWidget { Widget build(BuildContext context) { reportLeaks(); final controller = SpineWidgetController(onInitialized: (controller) { - // Set the walk animation on track 0, let it loop - controller.animationState.setAnimationByName(0, "walk", true); + // Set the default mixing time between animations + controller.animationState.getData().setDefaultMix(0.2); + // Set the portal animation on track 0 + controller.animationState.setAnimationByName(0, "portal", true); + // Queue the run animation after the portal animation + controller.animationState.addAnimationByName(0, "run", true, 0); }); return Scaffold( diff --git a/spine-flutter/lib/assets/libspine_flutter.wasm b/spine-flutter/lib/assets/libspine_flutter.wasm index 56a1c920ac2aedd3fdfa962e419a90a619296001..163d45cd061e0c04b17a78357eb73a0ebcdd2705 100755 GIT binary patch delta 7296 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 Z1BDUUO*y~xJ+b7>5i@n>i2u>K{|j17cQF6} diff --git a/spine-flutter/lib/spine_widget.dart b/spine-flutter/lib/spine_widget.dart index 113e80593..aed34abac 100644 --- a/spine-flutter/lib/spine_widget.dart +++ b/spine-flutter/lib/spine_widget.dart @@ -483,6 +483,7 @@ class _SpineRenderObject extends RenderBox { Bounds _bounds; bool _sizedByBounds; bool _disposed = false; + bool _firstUpdated = false; _SpineRenderObject(this._skeletonDrawable, this._controller, this._fit, this._alignment, this._bounds, this._sizedByBounds); @@ -618,6 +619,7 @@ class _SpineRenderObject extends RenderBox { markNeedsPaint(); _scheduleFrame(); } + _firstUpdated = true; } void _setCanvasTransform(Canvas canvas, Offset offset) { @@ -669,9 +671,11 @@ class _SpineRenderObject extends RenderBox { canvas.save(); _setCanvasTransform(canvas, offset); - _controller.onBeforePaint?.call(_controller, canvas); - final commands = _skeletonDrawable.renderToCanvas(canvas); - _controller.onAfterPaint?.call(_controller, canvas, commands); + if (_firstUpdated) { + _controller.onBeforePaint?.call(_controller, canvas); + final commands = _skeletonDrawable.renderToCanvas(canvas); + _controller.onAfterPaint?.call(_controller, canvas, commands); + } canvas.restore(); } diff --git a/spine-flutter/pubspec.yaml b/spine-flutter/pubspec.yaml index beacc15ea..949f5fc24 100644 --- a/spine-flutter/pubspec.yaml +++ b/spine-flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: spine_flutter description: The official Spine Flutter Runtime to load, display and interact with Spine animations. -version: 4.2.26 +version: 4.2.27 homepage: https://esotericsoftware.com repository: https://github.com/esotericsoftware/spine-runtimes issue_tracker: https://github.com/esotericsoftware/spine-runtimes/issues