From c9f0a9afdd4b35c1c126f93a344f8661808287c6 Mon Sep 17 00:00:00 2001 From: creativecreatorormaybenot Date: Thu, 9 Jul 2020 09:09:31 +0000 Subject: [PATCH 01/14] Fix Pub analysis --- lib/rive.dart | 2 ++ lib/src/generated/rive_core_context.dart | 1 + lib/src/rive_core/animation/keyframe_draw_order_value.dart | 1 - lib/src/rive_core/bounds_delegate.dart | 1 + lib/src/rive_core/shapes/cubic_detached_vertex.dart | 2 -- lib/src/rive_core/shapes/paint/gradient_stop.dart | 2 -- lib/src/rive_core/shapes/paint/linear_gradient.dart | 1 - lib/src/rive_core/shapes/paint/shape_paint.dart | 1 - lib/src/rive_core/shapes/paint/solid_color.dart | 1 - lib/src/rive_core/shapes/paint/stroke.dart | 1 - lib/src/rive_core/shapes/path.dart | 1 - lib/src/rive_core/shapes/render_cubic_vertex.dart | 2 -- pubspec.yaml | 3 +-- 13 files changed, 5 insertions(+), 14 deletions(-) diff --git a/lib/rive.dart b/lib/rive.dart index d9393ee..c545a52 100644 --- a/lib/rive.dart +++ b/lib/rive.dart @@ -1,3 +1,5 @@ +library rive; + export 'package:rive/src/rive_file.dart'; export 'package:rive/src/rive.dart'; export 'package:rive/src/rive_core/rive_animation_controller.dart'; diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index fd73615..976a017 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -67,6 +67,7 @@ import 'package:rive/src/rive_core/shapes/shape.dart'; import 'package:rive/src/rive_core/shapes/straight_vertex.dart'; import 'package:rive/src/rive_core/shapes/triangle.dart'; +// ignore: avoid_classes_with_only_static_members class RiveCoreContext { static Core makeCoreInstance(int typeKey) { switch (typeKey) { diff --git a/lib/src/rive_core/animation/keyframe_draw_order_value.dart b/lib/src/rive_core/animation/keyframe_draw_order_value.dart index ae5f7a7..da7fc9a 100644 --- a/lib/src/rive_core/animation/keyframe_draw_order_value.dart +++ b/lib/src/rive_core/animation/keyframe_draw_order_value.dart @@ -20,7 +20,6 @@ class KeyFrameDrawOrderValue extends KeyFrameDrawOrderValueBase { } } - @override int runtimeValueValue(int editorValue) { assert(false, 'this should never get called'); return 0; diff --git a/lib/src/rive_core/bounds_delegate.dart b/lib/src/rive_core/bounds_delegate.dart index 48de16b..fde94ed 100644 --- a/lib/src/rive_core/bounds_delegate.dart +++ b/lib/src/rive_core/bounds_delegate.dart @@ -1,3 +1,4 @@ +// ignore: one_member_abstracts abstract class BoundsDelegate { void boundsChanged(); } diff --git a/lib/src/rive_core/shapes/cubic_detached_vertex.dart b/lib/src/rive_core/shapes/cubic_detached_vertex.dart index 63e4189..79dd88e 100644 --- a/lib/src/rive_core/shapes/cubic_detached_vertex.dart +++ b/lib/src/rive_core/shapes/cubic_detached_vertex.dart @@ -28,7 +28,6 @@ class CubicDetachedVertex extends CubicDetachedVertexBase { translation, Vec2D.fromValues( cos(outRotation) * outDistance, sin(outRotation) * outDistance)); - @override set outPoint(Vec2D value) { _outPoint = Vec2D.clone(value); } @@ -39,7 +38,6 @@ class CubicDetachedVertex extends CubicDetachedVertexBase { translation, Vec2D.fromValues( cos(inRotation) * inDistance, sin(inRotation) * inDistance)); - @override set inPoint(Vec2D value) { _inPoint = Vec2D.clone(value); } diff --git a/lib/src/rive_core/shapes/paint/gradient_stop.dart b/lib/src/rive_core/shapes/paint/gradient_stop.dart index 324d203..4d372c2 100644 --- a/lib/src/rive_core/shapes/paint/gradient_stop.dart +++ b/lib/src/rive_core/shapes/paint/gradient_stop.dart @@ -6,10 +6,8 @@ import 'package:rive/src/rive_core/shapes/paint/linear_gradient.dart'; export 'package:rive/src/generated/shapes/paint/gradient_stop_base.dart'; class GradientStop extends GradientStopBase { - @override Component get timelineParent => _gradient is LinearGradient ? _gradient.parent : null; - @override String get timelineName => 'Stop ${_gradient.gradientStops.indexOf(this) + 1}'; LinearGradient _gradient; diff --git a/lib/src/rive_core/shapes/paint/linear_gradient.dart b/lib/src/rive_core/shapes/paint/linear_gradient.dart index c78ea02..140dc95 100644 --- a/lib/src/rive_core/shapes/paint/linear_gradient.dart +++ b/lib/src/rive_core/shapes/paint/linear_gradient.dart @@ -10,7 +10,6 @@ export 'package:rive/src/generated/shapes/paint/linear_gradient_base.dart'; class LinearGradient extends LinearGradientBase with ShapePaintMutator { final List gradientStops = []; - @override Component get timelineProxy => parent; bool _paintsInWorldSpace = true; bool get paintsInWorldSpace => _paintsInWorldSpace; diff --git a/lib/src/rive_core/shapes/paint/shape_paint.dart b/lib/src/rive_core/shapes/paint/shape_paint.dart index 402914d..9966e77 100644 --- a/lib/src/rive_core/shapes/paint/shape_paint.dart +++ b/lib/src/rive_core/shapes/paint/shape_paint.dart @@ -21,7 +21,6 @@ abstract class ShapePaint extends ShapePaintBase { set blendMode(BlendMode value) => _paint.blendMode = value; double get renderOpacity => _paintMutator.renderOpacity; set renderOpacity(double value) => _paintMutator.renderOpacity = value; - @override Component get timelineParent => _shapePaintContainer as Component; ShapePaintMutator get paintMutator => _paintMutator; void _changeMutator(ShapePaintMutator mutator) { diff --git a/lib/src/rive_core/shapes/paint/solid_color.dart b/lib/src/rive_core/shapes/paint/solid_color.dart index 0cde995..6b3c315 100644 --- a/lib/src/rive_core/shapes/paint/solid_color.dart +++ b/lib/src/rive_core/shapes/paint/solid_color.dart @@ -7,7 +7,6 @@ import 'package:rive/src/generated/shapes/paint/solid_color_base.dart'; export 'package:rive/src/generated/shapes/paint/solid_color_base.dart'; class SolidColor extends SolidColorBase with ShapePaintMutator { - @override Component get timelineProxy => parent; Color get color => Color(colorValue); set color(Color c) { diff --git a/lib/src/rive_core/shapes/paint/stroke.dart b/lib/src/rive_core/shapes/paint/stroke.dart index 4f97189..83c75a5 100644 --- a/lib/src/rive_core/shapes/paint/stroke.dart +++ b/lib/src/rive_core/shapes/paint/stroke.dart @@ -11,7 +11,6 @@ class Stroke extends StrokeBase { ..strokeCap = strokeCap ..strokeJoin = strokeJoin ..strokeWidth = thickness; - @override String get timelineParentGroup => 'strokes'; StrokeCap get strokeCap => StrokeCap.values[cap]; set strokeCap(StrokeCap value) => cap = value.index; diff --git a/lib/src/rive_core/shapes/path.dart b/lib/src/rive_core/shapes/path.dart index 1ba1d3f..31ae031 100644 --- a/lib/src/rive_core/shapes/path.dart +++ b/lib/src/rive_core/shapes/path.dart @@ -31,7 +31,6 @@ abstract class Path extends PathBase { Mat2D get pathTransform; Mat2D get inversePathTransform; Mat2D get inverseWorldTransform => _inverseWorldTransform; - @override Component get timelineParent => _shape; @override bool resolveArtboard() { diff --git a/lib/src/rive_core/shapes/render_cubic_vertex.dart b/lib/src/rive_core/shapes/render_cubic_vertex.dart index ca561a4..4b4ab7a 100644 --- a/lib/src/rive_core/shapes/render_cubic_vertex.dart +++ b/lib/src/rive_core/shapes/render_cubic_vertex.dart @@ -4,7 +4,6 @@ import 'package:rive/src/rive_core/shapes/cubic_vertex.dart'; import 'package:rive/src/utilities/binary_buffer/binary_writer.dart'; class RenderCubicVertex extends CubicVertex { - @override void changeNonNull() {} @override Vec2D inPoint; @@ -12,7 +11,6 @@ class RenderCubicVertex extends CubicVertex { Vec2D outPoint; @override void onAddedDirty() {} - @override void writeRuntimeProperties( BinaryWriter writer, HashMap idLookup) {} } diff --git a/pubspec.yaml b/pubspec.yaml index daf701a..dbf3c26 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,6 +2,7 @@ name: rive description: Rive 2 Flutter Runtime version: 0.0.1+2 repository: https://github.com/rive-app/rive-flutter +homepage: https://rive.app environment: sdk: ">=2.2.2 <3.0.0" @@ -15,5 +16,3 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - -flutter: \ No newline at end of file From f99599f02568a708acbb68916cf21d9e8e260bec Mon Sep 17 00:00:00 2001 From: creativecreatorormaybenot Date: Thu, 9 Jul 2020 09:25:46 +0000 Subject: [PATCH 02/14] Add shield --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index defa1b7..5d71134 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Rive +# Rive [![Pub Version](https://img.shields.io/pub/v/rive)][https://pub.dev/packages/rive] [Flutter package](https://pub.dev/packages/rive) for Rive 2. ## Bring Your Apps and Games to Life with Real-Time Animation @@ -11,4 +11,4 @@ dependencies: ``` ## Example -See how to use it in [example](example/). \ No newline at end of file +See how to use it in [example](example). From eda9329b28db9f19577c84fb79bed2a844e17ff8 Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Thu, 9 Jul 2020 11:11:51 -0700 Subject: [PATCH 03/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d71134..cff7823 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Rive [![Pub Version](https://img.shields.io/pub/v/rive)][https://pub.dev/packages/rive] +# Rive [![Pub Version](https://img.shields.io/pub/v/rive)](https://pub.dev/packages/rive) [Flutter package](https://pub.dev/packages/rive) for Rive 2. ## Bring Your Apps and Games to Life with Real-Time Animation From 237eef1cf6836a721a3c9e347ffa96ac786858fa Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Thu, 9 Jul 2020 11:12:41 -0700 Subject: [PATCH 04/14] Regenerated cleaned up code that happily runs through flutter analyze. --- .../animation/keyframe_draw_order_value.dart | 5 ----- lib/src/rive_core/bounds_delegate.dart | 4 ---- lib/src/rive_core/node.dart | 12 ------------ .../shapes/cubic_asymmetric_vertex.dart | 10 ++++++++++ .../rive_core/shapes/cubic_detached_vertex.dart | 2 ++ .../rive_core/shapes/cubic_mirrored_vertex.dart | 11 +++++++++++ lib/src/rive_core/shapes/cubic_vertex.dart | 2 ++ .../rive_core/shapes/paint/gradient_stop.dart | 5 ----- .../rive_core/shapes/paint/linear_gradient.dart | 1 - lib/src/rive_core/shapes/paint/shape_paint.dart | 1 - lib/src/rive_core/shapes/paint/solid_color.dart | 2 -- lib/src/rive_core/shapes/paint/stroke.dart | 1 - lib/src/rive_core/shapes/path.dart | 16 ---------------- .../rive_core/shapes/render_cubic_vertex.dart | 5 ----- lib/src/rive_core/shapes/shape.dart | 15 --------------- 15 files changed, 25 insertions(+), 67 deletions(-) delete mode 100644 lib/src/rive_core/bounds_delegate.dart diff --git a/lib/src/rive_core/animation/keyframe_draw_order_value.dart b/lib/src/rive_core/animation/keyframe_draw_order_value.dart index da7fc9a..06a5241 100644 --- a/lib/src/rive_core/animation/keyframe_draw_order_value.dart +++ b/lib/src/rive_core/animation/keyframe_draw_order_value.dart @@ -19,9 +19,4 @@ class KeyFrameDrawOrderValue extends KeyFrameDrawOrderValueBase { drawable.drawOrder = value; } } - - int runtimeValueValue(int editorValue) { - assert(false, 'this should never get called'); - return 0; - } } diff --git a/lib/src/rive_core/bounds_delegate.dart b/lib/src/rive_core/bounds_delegate.dart deleted file mode 100644 index fde94ed..0000000 --- a/lib/src/rive_core/bounds_delegate.dart +++ /dev/null @@ -1,4 +0,0 @@ -// ignore: one_member_abstracts -abstract class BoundsDelegate { - void boundsChanged(); -} diff --git a/lib/src/rive_core/node.dart b/lib/src/rive_core/node.dart index afd195e..f65a258 100644 --- a/lib/src/rive_core/node.dart +++ b/lib/src/rive_core/node.dart @@ -1,5 +1,4 @@ import 'package:flutter/foundation.dart'; -import 'package:rive/src/rive_core/bounds_delegate.dart'; import 'package:rive/src/rive_core/component_dirt.dart'; import 'package:rive/src/rive_core/container_component.dart'; import 'package:rive/src/rive_core/math/mat2d.dart'; @@ -11,7 +10,6 @@ export 'package:rive/src/generated/node_base.dart'; class Node extends NodeBase { final Mat2D transform = Mat2D(); final Mat2D worldTransform = Mat2D(); - BoundsDelegate _delegate; double _renderOpacity = 0; double get renderOpacity => _renderOpacity; @override @@ -60,16 +58,6 @@ class Node extends NodeBase { } else { Mat2D.copy(worldTransform, transform); } - _delegate?.boundsChanged(); - } - - @override - void userDataChanged(dynamic from, dynamic to) { - if (to is BoundsDelegate) { - _delegate = to; - } else { - _delegate = null; - } } void calculateWorldTransform() { diff --git a/lib/src/rive_core/shapes/cubic_asymmetric_vertex.dart b/lib/src/rive_core/shapes/cubic_asymmetric_vertex.dart index e377105..bad8694 100644 --- a/lib/src/rive_core/shapes/cubic_asymmetric_vertex.dart +++ b/lib/src/rive_core/shapes/cubic_asymmetric_vertex.dart @@ -16,6 +16,11 @@ class CubicAsymmetricVertex extends CubicAsymmetricVertexBase { cos(rotation) * outDistance, sin(rotation) * outDistance)); } + @override + set outPoint(Vec2D value) { + _outPoint = Vec2D.clone(value); + } + @override Vec2D get inPoint { return _inPoint ??= Vec2D.add( @@ -25,6 +30,11 @@ class CubicAsymmetricVertex extends CubicAsymmetricVertexBase { cos(rotation) * -inDistance, sin(rotation) * -inDistance)); } + @override + set inPoint(Vec2D value) { + _inPoint = Vec2D.clone(value); + } + @override String toString() { return 'in ${inPoint[0]}, ${inPoint[1]} | ${translation.toString()} ' diff --git a/lib/src/rive_core/shapes/cubic_detached_vertex.dart b/lib/src/rive_core/shapes/cubic_detached_vertex.dart index 79dd88e..63e4189 100644 --- a/lib/src/rive_core/shapes/cubic_detached_vertex.dart +++ b/lib/src/rive_core/shapes/cubic_detached_vertex.dart @@ -28,6 +28,7 @@ class CubicDetachedVertex extends CubicDetachedVertexBase { translation, Vec2D.fromValues( cos(outRotation) * outDistance, sin(outRotation) * outDistance)); + @override set outPoint(Vec2D value) { _outPoint = Vec2D.clone(value); } @@ -38,6 +39,7 @@ class CubicDetachedVertex extends CubicDetachedVertexBase { translation, Vec2D.fromValues( cos(inRotation) * inDistance, sin(inRotation) * inDistance)); + @override set inPoint(Vec2D value) { _inPoint = Vec2D.clone(value); } diff --git a/lib/src/rive_core/shapes/cubic_mirrored_vertex.dart b/lib/src/rive_core/shapes/cubic_mirrored_vertex.dart index 1899835..d03e9fb 100644 --- a/lib/src/rive_core/shapes/cubic_mirrored_vertex.dart +++ b/lib/src/rive_core/shapes/cubic_mirrored_vertex.dart @@ -13,12 +13,23 @@ class CubicMirroredVertex extends CubicMirroredVertexBase { Vec2D.fromValues(cos(rotation) * distance, sin(rotation) * distance)); } + @override + set outPoint(Vec2D value) { + _outPoint = Vec2D.clone(value); + } + @override Vec2D get inPoint { return _inPoint ??= Vec2D.add(Vec2D(), translation, Vec2D.fromValues(cos(rotation) * -distance, sin(rotation) * -distance)); } + @override + set inPoint(Vec2D value) { + var diffIn = Vec2D.fromValues(value[0] - x, value[1] - y); + outPoint = Vec2D.subtract(Vec2D(), translation, diffIn); + } + @override String toString() { return 'in ${inPoint[0]}, ${inPoint[1]} | ${translation.toString()} ' diff --git a/lib/src/rive_core/shapes/cubic_vertex.dart b/lib/src/rive_core/shapes/cubic_vertex.dart index 2ea5b38..a52e95f 100644 --- a/lib/src/rive_core/shapes/cubic_vertex.dart +++ b/lib/src/rive_core/shapes/cubic_vertex.dart @@ -4,4 +4,6 @@ import 'package:rive/src/generated/shapes/cubic_vertex_base.dart'; abstract class CubicVertex extends CubicVertexBase { Vec2D get outPoint; Vec2D get inPoint; + set outPoint(Vec2D value); + set inPoint(Vec2D value); } diff --git a/lib/src/rive_core/shapes/paint/gradient_stop.dart b/lib/src/rive_core/shapes/paint/gradient_stop.dart index 4d372c2..4c543a4 100644 --- a/lib/src/rive_core/shapes/paint/gradient_stop.dart +++ b/lib/src/rive_core/shapes/paint/gradient_stop.dart @@ -1,15 +1,10 @@ import 'dart:ui' as ui; -import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/container_component.dart'; import 'package:rive/src/generated/shapes/paint/gradient_stop_base.dart'; import 'package:rive/src/rive_core/shapes/paint/linear_gradient.dart'; export 'package:rive/src/generated/shapes/paint/gradient_stop_base.dart'; class GradientStop extends GradientStopBase { - Component get timelineParent => - _gradient is LinearGradient ? _gradient.parent : null; - String get timelineName => - 'Stop ${_gradient.gradientStops.indexOf(this) + 1}'; LinearGradient _gradient; LinearGradient get gradient => _gradient; ui.Color get color => ui.Color(colorValue); diff --git a/lib/src/rive_core/shapes/paint/linear_gradient.dart b/lib/src/rive_core/shapes/paint/linear_gradient.dart index 140dc95..b518d7d 100644 --- a/lib/src/rive_core/shapes/paint/linear_gradient.dart +++ b/lib/src/rive_core/shapes/paint/linear_gradient.dart @@ -10,7 +10,6 @@ export 'package:rive/src/generated/shapes/paint/linear_gradient_base.dart'; class LinearGradient extends LinearGradientBase with ShapePaintMutator { final List gradientStops = []; - Component get timelineProxy => parent; bool _paintsInWorldSpace = true; bool get paintsInWorldSpace => _paintsInWorldSpace; set paintsInWorldSpace(bool value) { diff --git a/lib/src/rive_core/shapes/paint/shape_paint.dart b/lib/src/rive_core/shapes/paint/shape_paint.dart index 9966e77..e17b0ed 100644 --- a/lib/src/rive_core/shapes/paint/shape_paint.dart +++ b/lib/src/rive_core/shapes/paint/shape_paint.dart @@ -21,7 +21,6 @@ abstract class ShapePaint extends ShapePaintBase { set blendMode(BlendMode value) => _paint.blendMode = value; double get renderOpacity => _paintMutator.renderOpacity; set renderOpacity(double value) => _paintMutator.renderOpacity = value; - Component get timelineParent => _shapePaintContainer as Component; ShapePaintMutator get paintMutator => _paintMutator; void _changeMutator(ShapePaintMutator mutator) { _paint = makePaint(); diff --git a/lib/src/rive_core/shapes/paint/solid_color.dart b/lib/src/rive_core/shapes/paint/solid_color.dart index 6b3c315..3d8b3c3 100644 --- a/lib/src/rive_core/shapes/paint/solid_color.dart +++ b/lib/src/rive_core/shapes/paint/solid_color.dart @@ -1,5 +1,4 @@ import 'dart:ui'; -import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/component_dirt.dart'; import 'package:rive/src/rive_core/shapes/paint/shape_paint_mutator.dart'; import 'package:rive/src/rive_core/shapes/shape_paint_container.dart'; @@ -7,7 +6,6 @@ import 'package:rive/src/generated/shapes/paint/solid_color_base.dart'; export 'package:rive/src/generated/shapes/paint/solid_color_base.dart'; class SolidColor extends SolidColorBase with ShapePaintMutator { - Component get timelineProxy => parent; Color get color => Color(colorValue); set color(Color c) { colorValue = c.value; diff --git a/lib/src/rive_core/shapes/paint/stroke.dart b/lib/src/rive_core/shapes/paint/stroke.dart index 83c75a5..fe65130 100644 --- a/lib/src/rive_core/shapes/paint/stroke.dart +++ b/lib/src/rive_core/shapes/paint/stroke.dart @@ -11,7 +11,6 @@ class Stroke extends StrokeBase { ..strokeCap = strokeCap ..strokeJoin = strokeJoin ..strokeWidth = thickness; - String get timelineParentGroup => 'strokes'; StrokeCap get strokeCap => StrokeCap.values[cap]; set strokeCap(StrokeCap value) => cap = value.index; StrokeJoin get strokeJoin => StrokeJoin.values[join]; diff --git a/lib/src/rive_core/shapes/path.dart b/lib/src/rive_core/shapes/path.dart index 31ae031..b507885 100644 --- a/lib/src/rive_core/shapes/path.dart +++ b/lib/src/rive_core/shapes/path.dart @@ -1,6 +1,5 @@ import 'dart:math'; import 'dart:ui' as ui; -import 'package:rive/src/rive_core/bounds_delegate.dart'; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/component_dirt.dart'; import 'package:rive/src/rive_core/math/aabb.dart'; @@ -31,27 +30,12 @@ abstract class Path extends PathBase { Mat2D get pathTransform; Mat2D get inversePathTransform; Mat2D get inverseWorldTransform => _inverseWorldTransform; - Component get timelineParent => _shape; @override bool resolveArtboard() { _changeShape(null); return super.resolveArtboard(); } - BoundsDelegate _delegate; - void markBoundsDirty() { - _delegate?.boundsChanged(); - } - - @override - void userDataChanged(dynamic from, dynamic to) { - if (to is BoundsDelegate) { - _delegate = to; - } else { - _delegate = null; - } - } - @override void visitAncestor(Component ancestor) { if (_shape == null && ancestor is Shape) { diff --git a/lib/src/rive_core/shapes/render_cubic_vertex.dart b/lib/src/rive_core/shapes/render_cubic_vertex.dart index 4b4ab7a..64451ed 100644 --- a/lib/src/rive_core/shapes/render_cubic_vertex.dart +++ b/lib/src/rive_core/shapes/render_cubic_vertex.dart @@ -1,16 +1,11 @@ -import 'dart:collection'; import 'package:rive/src/rive_core/math/vec2d.dart'; import 'package:rive/src/rive_core/shapes/cubic_vertex.dart'; -import 'package:rive/src/utilities/binary_buffer/binary_writer.dart'; class RenderCubicVertex extends CubicVertex { - void changeNonNull() {} @override Vec2D inPoint; @override Vec2D outPoint; @override void onAddedDirty() {} - void writeRuntimeProperties( - BinaryWriter writer, HashMap idLookup) {} } diff --git a/lib/src/rive_core/shapes/shape.dart b/lib/src/rive_core/shapes/shape.dart index 4abb181..9536f6c 100644 --- a/lib/src/rive_core/shapes/shape.dart +++ b/lib/src/rive_core/shapes/shape.dart @@ -1,5 +1,4 @@ import 'dart:ui'; -import 'package:rive/src/rive_core/bounds_delegate.dart'; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/component_dirt.dart'; import 'package:rive/src/rive_core/math/aabb.dart'; @@ -34,17 +33,12 @@ class Shape extends ShapeBase with ShapePaintContainer { AABB _worldBounds; AABB _localBounds; - BoundsDelegate _delegate; @override AABB get worldBounds => _worldBounds ??= computeWorldBounds(); @override AABB get localBounds => _localBounds ??= computeLocalBounds(); void markBoundsDirty() { _worldBounds = _localBounds = null; - _delegate?.boundsChanged(); - for (final path in paths) { - path.markBoundsDirty(); - } } @override @@ -202,15 +196,6 @@ class Shape extends ShapeBase with ShapePaintContainer { return localBounds; } - @override - void userDataChanged(dynamic from, dynamic to) { - if (to is BoundsDelegate) { - _delegate = to; - } else { - _delegate = null; - } - } - @override void blendModeValueChanged(int from, int to) => _markBlendModeDirty(); @override From 454b020a95670a49962ad8432b1eee38fac8060b Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Thu, 9 Jul 2020 11:15:27 -0700 Subject: [PATCH 05/14] Prepping for publish. --- CHANGELOG.md | 4 ++++ example/pubspec.lock | 2 +- pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a365b..5758453 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [0.0.1+3] - 2020-07-09 11:13:22 + +- Fixing up ```flutter analyze``` issues thanks to @creativecreatorormaybenot. + ## [0.0.1+2] - 2020-07-08 16:47:10 - Updating meta dependency to one that is compatible with Flutter 😶 diff --git a/example/pubspec.lock b/example/pubspec.lock index ff38332..fec5648 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -94,7 +94,7 @@ packages: path: ".." relative: true source: path - version: "0.0.1+2" + version: "0.0.1+3" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index dbf3c26..cd58401 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: rive description: Rive 2 Flutter Runtime -version: 0.0.1+2 +version: 0.0.1+3 repository: https://github.com/rive-app/rive-flutter homepage: https://rive.app From 8317068d7070c6e1dbbda50a6e710001f5a12d27 Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Thu, 9 Jul 2020 11:15:52 -0700 Subject: [PATCH 06/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cff7823..c2a1943 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Add to pubspec.yaml ```yaml dependencies: - rive: ^0.0.1+2 + rive: ^0.0.1+3 ``` ## Example From 1c9035d64b947a79885fdfcd3bc77c9ff0f48167 Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Fri, 17 Jul 2020 11:45:18 -0700 Subject: [PATCH 07/14] Exposing more internal components. --- lib/rive.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/rive.dart b/lib/rive.dart index c545a52..807036f 100644 --- a/lib/rive.dart +++ b/lib/rive.dart @@ -6,3 +6,9 @@ export 'package:rive/src/rive_core/rive_animation_controller.dart'; export 'package:rive/src/controllers/simple_controller.dart'; export 'package:rive/src/controllers/simple_controller.dart'; export 'package:rive/src/rive_core/artboard.dart'; +export 'package:rive/src/rive_core/shapes/shape.dart'; +export 'package:rive/src/rive_core/shapes/paint/fill.dart'; +export 'package:rive/src/rive_core/shapes/paint/stroke.dart'; +export 'package:rive/src/rive_core/shapes/paint/solid_color.dart'; +export 'package:rive/src/rive_core/shapes/paint/linear_gradient.dart'; +export 'package:rive/src/rive_core/shapes/paint/radial_gradient.dart'; \ No newline at end of file From a2c9178bfc3c14a019ded1409e3eac6b6cc8ddb2 Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Fri, 17 Jul 2020 15:30:23 -0700 Subject: [PATCH 08/14] Improving controllers so they can mix animations more easily. --- lib/rive.dart | 6 +- lib/src/controllers/simple_controller.dart | 67 ++----- .../animation/linear_animation_instance.dart | 58 ++++++ lib/src/rive_core/artboard.dart | 11 +- lib/src/rive_core/math/segment2d.dart | 14 +- lib/src/rive_core/node.dart | 3 + lib/src/rive_core/shapes/path.dart | 166 ++++++------------ 7 files changed, 146 insertions(+), 179 deletions(-) create mode 100644 lib/src/rive_core/animation/linear_animation_instance.dart diff --git a/lib/rive.dart b/lib/rive.dart index 807036f..3a7f369 100644 --- a/lib/rive.dart +++ b/lib/rive.dart @@ -2,9 +2,11 @@ library rive; export 'package:rive/src/rive_file.dart'; export 'package:rive/src/rive.dart'; +export 'package:rive/src/runtime_artboard.dart'; +export 'package:rive/src/controllers/simple_controller.dart'; export 'package:rive/src/rive_core/rive_animation_controller.dart'; -export 'package:rive/src/controllers/simple_controller.dart'; -export 'package:rive/src/controllers/simple_controller.dart'; +export 'package:rive/src/rive_core/animation/linear_animation.dart'; +export 'package:rive/src/rive_core/animation/linear_animation_instance.dart'; export 'package:rive/src/rive_core/artboard.dart'; export 'package:rive/src/rive_core/shapes/shape.dart'; export 'package:rive/src/rive_core/shapes/paint/fill.dart'; diff --git a/lib/src/controllers/simple_controller.dart b/lib/src/controllers/simple_controller.dart index 62d3e49..790d793 100644 --- a/lib/src/controllers/simple_controller.dart +++ b/lib/src/controllers/simple_controller.dart @@ -1,5 +1,5 @@ import 'package:rive/src/rive_core/animation/linear_animation.dart'; -import 'package:rive/src/rive_core/animation/loop.dart'; +import 'package:rive/src/rive_core/animation/linear_animation_instance.dart'; import 'package:rive/src/rive_core/rive_animation_controller.dart'; import 'package:rive/src/runtime_artboard.dart'; @@ -7,70 +7,29 @@ import 'package:rive/src/runtime_artboard.dart'; /// by an artist. All playback parameters (looping, speed, keyframes) are artist /// defined in the Rive editor. class SimpleAnimation extends RiveAnimationController { - LinearAnimation _animation; - double _time = 0; - int _direction = 1; + LinearAnimationInstance _instance; final String animationName; SimpleAnimation(this.animationName); @override bool init(RuntimeArtboard artboard) { - _animation = artboard.animations.firstWhere( - (animation) => animation.name == animationName, + var animation = artboard.animations.firstWhere( + (animation) => + animation is LinearAnimation && animation.name == animationName, orElse: () => null, - ) as LinearAnimation; + ); + if (animation != null) { + _instance = LinearAnimationInstance(animation as LinearAnimation); + } isActive = true; - return _animation != null; + return _instance != null; } @override void apply(RuntimeArtboard artboard, double elapsedSeconds) { - _animation.apply(_time, coreContext: artboard); - _time += elapsedSeconds * _animation.speed * _direction; - - double frames = _time * _animation.fps; - - var start = _animation.enableWorkArea ? _animation.workStart : 0; - var end = - _animation.enableWorkArea ? _animation.workEnd : _animation.duration; - var range = end - start; - - switch (_animation.loop) { - case Loop.oneShot: - if (frames > end) { - isActive = false; - frames = end.toDouble(); - _time = frames / _animation.fps; - } - break; - case Loop.loop: - if (frames >= end) { - frames = _time * _animation.fps; - frames = start + (frames - start) % range; - _time = frames / _animation.fps; - } - break; - case Loop.pingPong: - // ignore: literal_only_boolean_expressions - while (true) { - if (_direction == 1 && frames >= end) { - _direction = -1; - frames = end + (end - frames); - _time = frames / _animation.fps; - } else if (_direction == -1 && frames < start) { - _direction = 1; - frames = start + (start - frames); - _time = frames / _animation.fps; - } else { - // we're within the range, we can stop fixing. We do this in a - // loop to fix conditions when time has advanced so far that we've - // ping-ponged back and forth a few times in a single frame. We - // want to accomodate for this in cases where animations are not - // advanced on regular intervals. - break; - } - } - break; + _instance.animation.apply(_instance.time, coreContext: artboard); + if (!_instance.advance(elapsedSeconds)) { + isActive = false; } } diff --git a/lib/src/rive_core/animation/linear_animation_instance.dart b/lib/src/rive_core/animation/linear_animation_instance.dart new file mode 100644 index 0000000..1b1465f --- /dev/null +++ b/lib/src/rive_core/animation/linear_animation_instance.dart @@ -0,0 +1,58 @@ +import 'package:rive/src/rive_core/animation/linear_animation.dart'; +import 'package:rive/src/rive_core/animation/loop.dart'; + +class LinearAnimationInstance { + final LinearAnimation animation; + double _time = 0; + int direction = 1; + LinearAnimationInstance(this.animation); + double get time => _time; + set time(double value) { + if (_time == value) { + return; + } + _time = value; + direction = 1; + } + + bool advance(double elapsedSeconds) { + _time += elapsedSeconds * animation.speed * direction; + double frames = _time * animation.fps; + var start = animation.enableWorkArea ? animation.workStart : 0; + var end = animation.enableWorkArea ? animation.workEnd : animation.duration; + var range = end - start; + bool keepGoing = true; + switch (animation.loop) { + case Loop.oneShot: + if (frames > end) { + keepGoing = false; + frames = end.toDouble(); + _time = frames / animation.fps; + } + break; + case Loop.loop: + if (frames >= end) { + frames = _time * animation.fps; + frames = start + (frames - start) % range; + _time = frames / animation.fps; + } + break; + case Loop.pingPong: + while (true) { + if (direction == 1 && frames >= end) { + direction = -1; + frames = end + (end - frames); + _time = frames / animation.fps; + } else if (direction == -1 && frames < start) { + direction = 1; + frames = start + (start - frames); + _time = frames / animation.fps; + } else { + break; + } + } + break; + } + return keepGoing; + } +} diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index fda90d6..813206d 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -189,6 +189,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { } canvas.save(); canvas.clipRect(Rect.fromLTWH(0, 0, width, height)); + canvas.translate(width * (originX ?? 0), height * (originY ?? 0)); for (final drawable in _drawables) { drawable.draw(canvas); } @@ -202,9 +203,15 @@ class Artboard extends ArtboardBase with ShapePaintContainer { @override Mat2D get worldTransform => Mat2D(); @override - void originXChanged(double from, double to) {} + void originXChanged(double from, double to) { + addDirt(ComponentDirt.worldTransform); + } + @override - void originYChanged(double from, double to) {} + void originYChanged(double from, double to) { + addDirt(ComponentDirt.worldTransform); + } + bool internalAddAnimation(Animation animation) { if (_animations.contains(animation)) { return false; diff --git a/lib/src/rive_core/math/segment2d.dart b/lib/src/rive_core/math/segment2d.dart index 14eb98c..a852574 100644 --- a/lib/src/rive_core/math/segment2d.dart +++ b/lib/src/rive_core/math/segment2d.dart @@ -12,7 +12,7 @@ class Segment2D { Vec2D diff; double lengthSquared; Segment2D(this.start, this.end); - ProjectionResult projectPoint(Vec2D point) { + ProjectionResult projectPoint(Vec2D point, {bool clamp = true}) { if (diff == null) { diff = Vec2D.subtract(Vec2D(), start, end); lengthSquared = Vec2D.squaredLength(diff); @@ -23,11 +23,13 @@ class Segment2D { double t = ((point[0] - start[0]) * (end[0] - start[0]) + (point[1] - start[1]) * (end[1] - start[1])) / lengthSquared; - if (t < 0.0) { - return ProjectionResult(0, start); - } - if (t > 1.0) { - return ProjectionResult(1, end); + if (clamp) { + if (t < 0.0) { + return ProjectionResult(0, start); + } + if (t > 1.0) { + return ProjectionResult(1, end); + } } return ProjectionResult( t, diff --git a/lib/src/rive_core/node.dart b/lib/src/rive_core/node.dart index f65a258..4460500 100644 --- a/lib/src/rive_core/node.dart +++ b/lib/src/rive_core/node.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:rive/src/rive_core/component_dirt.dart'; import 'package:rive/src/rive_core/container_component.dart'; +import 'package:rive/src/rive_core/math/aabb.dart'; import 'package:rive/src/rive_core/math/mat2d.dart'; import 'package:rive/src/rive_core/math/vec2d.dart'; import 'package:rive/src/generated/node_base.dart'; @@ -127,4 +128,6 @@ class Node extends NodeBase { super.parentChanged(from, to); markWorldTransformDirty(); } + + AABB get localBounds => AABB.fromValues(x, y, x, y); } diff --git a/lib/src/rive_core/shapes/path.dart b/lib/src/rive_core/shapes/path.dart index b507885..62a6382 100644 --- a/lib/src/rive_core/shapes/path.dart +++ b/lib/src/rive_core/shapes/path.dart @@ -204,7 +204,10 @@ abstract class Path extends PathBase { return true; } - AABB preciseComputeBounds(List renderPoints, Mat2D transform) { + @override + AABB get localBounds => preciseComputeBounds(renderVertices, Mat2D()); + AABB preciseComputeBounds(List renderPoints, Mat2D transform, + {bool debug = false}) { if (renderPoints.isEmpty) { return AABB(); } @@ -230,7 +233,6 @@ abstract class Path extends PathBase { cin = Vec2D.transformMat2D(Vec2D(), cin, transform); cout = Vec2D.transformMat2D(Vec2D(), cout, transform); } - const double epsilon = 0.000000001; final double startX = lastPoint[0]; final double startY = lastPoint[1]; final double cpX1 = cout[0]; @@ -240,121 +242,55 @@ abstract class Path extends PathBase { final double endX = next[0]; final double endY = next[1]; lastPoint = next; - double extremaX; - double extremaY; - double a, b, c; - if (!(((startX < cpX1) && (cpX1 < cpX2) && (cpX2 < endX)) || - ((startX > cpX1) && (cpX1 > cpX2) && (cpX2 > endX)))) { - a = -startX + (3 * (cpX1 - cpX2)) + endX; - b = 2 * (startX - (2 * cpX1) + cpX2); - c = -startX + cpX1; - double s = (b * b) - (4 * a * c); - if ((s >= 0.0) && (a.abs() > epsilon)) { - if (s == 0.0) { - final double t = -b / (2 * a); - final double tprime = 1.0 - t; - if ((t >= 0.0) && (t <= 1.0)) { - extremaX = ((tprime * tprime * tprime) * startX) + - ((3 * tprime * tprime * t) * cpX1) + - ((3 * tprime * t * t) * cpX2) + - (t * t * t * endX); - if (extremaX < bounds[0]) { - bounds[0] = extremaX; - } - if (extremaX > bounds[2]) { - bounds[2] = extremaX; - } - } - } else { - s = sqrt(s); - double t = (-b - s) / (2 * a); - double tprime = 1.0 - t; - if ((t >= 0.0) && (t <= 1.0)) { - extremaX = ((tprime * tprime * tprime) * startX) + - ((3 * tprime * tprime * t) * cpX1) + - ((3 * tprime * t * t) * cpX2) + - (t * t * t * endX); - if (extremaX < bounds[0]) { - bounds[0] = extremaX; - } - if (extremaX > bounds[2]) { - bounds[2] = extremaX; - } - } - t = (-b + s) / (2 * a); - tprime = 1.0 - t; - if ((t >= 0.0) && (t <= 1.0)) { - extremaX = ((tprime * tprime * tprime) * startX) + - ((3 * tprime * tprime * t) * cpX1) + - ((3 * tprime * t * t) * cpX2) + - (t * t * t * endX); - if (extremaX < bounds[0]) { - bounds[0] = extremaX; - } - if (extremaX > bounds[2]) { - bounds[2] = extremaX; - } - } - } - } - } - if (!(((startY < cpY1) && (cpY1 < cpY2) && (cpY2 < endY)) || - ((startY > cpY1) && (cpY1 > cpY2) && (cpY2 > endY)))) { - a = -startY + (3 * (cpY1 - cpY2)) + endY; - b = 2 * (startY - (2 * cpY1) + cpY2); - c = -startY + cpY1; - double s = (b * b) - (4 * a * c); - if ((s >= 0.0) && (a.abs() > epsilon)) { - if (s == 0.0) { - final double t = -b / (2 * a); - final double tprime = 1.0 - t; - if ((t >= 0.0) && (t <= 1.0)) { - extremaY = ((tprime * tprime * tprime) * startY) + - ((3 * tprime * tprime * t) * cpY1) + - ((3 * tprime * t * t) * cpY2) + - (t * t * t * endY); - if (extremaY < bounds[1]) { - bounds[1] = extremaY; - } - if (extremaY > bounds[3]) { - bounds[3] = extremaY; - } - } - } else { - s = sqrt(s); - final double t = (-b - s) / (2 * a); - final double tprime = 1.0 - t; - if ((t >= 0.0) && (t <= 1.0)) { - extremaY = ((tprime * tprime * tprime) * startY) + - ((3 * tprime * tprime * t) * cpY1) + - ((3 * tprime * t * t) * cpY2) + - (t * t * t * endY); - if (extremaY < bounds[1]) { - bounds[1] = extremaY; - } - if (extremaY > bounds[3]) { - bounds[3] = extremaY; - } - } - final double t2 = (-b + s) / (2 * a); - final double tprime2 = 1.0 - t2; - if ((t2 >= 0.0) && (t2 <= 1.0)) { - extremaY = ((tprime2 * tprime2 * tprime2) * startY) + - ((3 * tprime2 * tprime2 * t2) * cpY1) + - ((3 * tprime2 * t2 * t2) * cpY2) + - (t2 * t2 * t2 * endY); - if (extremaY < bounds[1]) { - bounds[1] = extremaY; - } - if (extremaY > bounds[3]) { - bounds[3] = extremaY; - } - } - } - } - } + _expandBoundsForAxis(bounds, 0, startX, cpX1, cpX2, endX); + _expandBoundsForAxis(bounds, 1, startY, cpY1, cpY2, endY); } } return bounds; } } + +void _expandBoundsToCubicPoint(AABB bounds, int component, double t, double a, + double b, double c, double d) { + if (t >= 0 && t <= 1) { + var ti = 1 - t; + double extremaY = ((ti * ti * ti) * a) + + ((3 * ti * ti * t) * b) + + ((3 * ti * t * t) * c) + + (t * t * t * d); + if (extremaY < bounds[component]) { + bounds[component] = extremaY; + } + if (extremaY > bounds[component + 2]) { + bounds[component + 2] = extremaY; + } + } +} + +void _expandBoundsForAxis(AABB bounds, int component, double start, double cp1, + double cp2, double end) { + if (!(((start < cp1) && (cp1 < cp2) && (cp2 < end)) || + ((start > cp1) && (cp1 > cp2) && (cp2 > end)))) { + var a = 3 * (cp1 - start); + var b = 3 * (cp2 - cp1); + var c = 3 * (end - cp2); + var d = a - 2 * b + c; + if (d != 0) { + var m1 = -sqrt(b * b - a * c); + var m2 = -a + b; + _expandBoundsToCubicPoint( + bounds, component, -(m1 + m2) / d, start, cp1, cp2, end); + _expandBoundsToCubicPoint( + bounds, component, -(-m1 + m2) / d, start, cp1, cp2, end); + } else if (b != c && d == 0) { + _expandBoundsToCubicPoint( + bounds, component, (2 * b - c) / (2 * (b - c)), start, cp1, cp2, end); + } + var d2a = 2 * (b - a); + var d2b = 2 * (c - b); + if (d2a != b) { + _expandBoundsToCubicPoint( + bounds, component, d2a / (d2a - d2b), start, cp1, cp2, end); + } + } +} From 2c728554a87a3968f9b3e169ba8688b34c7e8660 Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Fri, 17 Jul 2020 15:34:28 -0700 Subject: [PATCH 09/14] Bumping version. --- example/pubspec.lock | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index fec5648..5ca8c76 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -94,7 +94,7 @@ packages: path: ".." relative: true source: path - version: "0.0.1+3" + version: "0.0.2" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index cd58401..e0ba403 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: rive description: Rive 2 Flutter Runtime -version: 0.0.1+3 +version: 0.0.2 repository: https://github.com/rive-app/rive-flutter homepage: https://rive.app From 2ca33a8a1139a33f3ffa1d21540af7e7bf445cf4 Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Fri, 17 Jul 2020 18:41:20 -0700 Subject: [PATCH 10/14] Fixing draw order loading. --- lib/src/rive_file.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index 68171cf..a3d159c 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -97,10 +97,10 @@ class RiveFile { continue; } else if (keyframe is KeyFrameDrawOrder) { int numValues = reader.readVarUint(); - for (int i = 0; i < numValues; i++) { + for (int m = 0; m < numValues; m++) { var valueObject = KeyFrameDrawOrderValue(); valueObject.drawableId = reader.readVarInt(); - valueObject.value = i; + valueObject.value = m; keyframe.internalAddValue(valueObject); } } From 4cb915605f6c25d14aa9fa81a24c0c1007035d6d Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Sun, 19 Jul 2020 18:18:34 -0700 Subject: [PATCH 11/14] Revving format to 2 with smaller string encoding. --- example/assets/blue_artboard.riv | Bin 461 -> 0 bytes example/assets/colors_juice.riv | Bin 21963 -> 0 bytes example/assets/cubic_work.riv | Bin 10483 -> 0 bytes example/assets/draworderanimation_3.riv | Bin 837 -> 0 bytes example/assets/jet_fighter.riv | Bin 7789 -> 0 bytes example/assets/ping_pong.riv | Bin 7487 -> 0 bytes example/assets/tape_deck.riv | Bin 13495 -> 0 bytes example/assets/teeny_tiny.riv | Bin 0 -> 62601 bytes example/assets/web_&_desktop_2.riv | Bin 26305 -> 0 bytes example/lib/main.dart | 4 ++-- lib/src/core/field_types/core_string_type.dart | 3 ++- lib/src/rive_core/runtime/runtime_header.dart | 2 +- .../utilities/binary_buffer/binary_reader.dart | 4 ++-- .../utilities/binary_buffer/binary_writer.dart | 6 ++++-- 14 files changed, 11 insertions(+), 8 deletions(-) delete mode 100644 example/assets/blue_artboard.riv delete mode 100644 example/assets/colors_juice.riv delete mode 100644 example/assets/cubic_work.riv delete mode 100644 example/assets/draworderanimation_3.riv delete mode 100644 example/assets/jet_fighter.riv delete mode 100644 example/assets/ping_pong.riv delete mode 100644 example/assets/tape_deck.riv create mode 100644 example/assets/teeny_tiny.riv delete mode 100644 example/assets/web_&_desktop_2.riv diff --git a/example/assets/blue_artboard.riv b/example/assets/blue_artboard.riv deleted file mode 100644 index 53252c82dd3e3d807f1ba875d975e176a786c25d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 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 JK8H1x`~cnTd;b6c diff --git a/example/assets/jet_fighter.riv b/example/assets/jet_fighter.riv deleted file mode 100644 index 2cbbae7776688bb0a9562b67e3ce89fcd40a8a6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7789 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 diff --git a/example/assets/ping_pong.riv b/example/assets/ping_pong.riv deleted file mode 100644 index 0a513b8f6d48b03de7843ffd894f64432c6d7c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7487 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 diff --git a/example/assets/tape_deck.riv b/example/assets/tape_deck.riv deleted file mode 100644 index 96fcaa654f1297860ea12f2e86eff00f2071ed05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13495 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 G@jn4Fb-W2^-*>LA$-URwYp?y;Yp=cb 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 diff --git a/example/lib/main.dart b/example/lib/main.dart index 88729b6..6b8fd0f 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -44,7 +44,7 @@ class _MyHomePageState extends State { // Load the animation file from the bundle, note that you could also // download this. The RiveFile just expects a list of bytes. - rootBundle.load('assets/colors_juice.riv').then( + rootBundle.load('assets/teeny_tiny.riv').then( (data) async { var file = RiveFile(); // Load the RiveFile from the binary data. @@ -56,7 +56,7 @@ class _MyHomePageState extends State { // Add a controller to play back a known animation on the main/default // artboard.We store a reference to it so we can toggle playback. artboard.addController( - _controller = SimpleAnimation('walk'), + _controller = SimpleAnimation('idle'), ); setState(() => _riveArtboard = artboard); } diff --git a/lib/src/core/field_types/core_string_type.dart b/lib/src/core/field_types/core_string_type.dart index 1599a9c..cec1892 100644 --- a/lib/src/core/field_types/core_string_type.dart +++ b/lib/src/core/field_types/core_string_type.dart @@ -3,7 +3,8 @@ import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; class CoreStringType extends CoreFieldType { @override - String deserialize(BinaryReader reader) => reader.readString(); + String deserialize(BinaryReader reader) => + reader.readString(explicitLength: false); @override String lerp(String from, String to, double f) => from; diff --git a/lib/src/rive_core/runtime/runtime_header.dart b/lib/src/rive_core/runtime/runtime_header.dart index 231920f..333bb35 100644 --- a/lib/src/rive_core/runtime/runtime_header.dart +++ b/lib/src/rive_core/runtime/runtime_header.dart @@ -4,7 +4,7 @@ import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; import 'exceptions/rive_format_error_exception.dart'; class RuntimeHeader { - static const int majorVersion = 1; + static const int majorVersion = 2; static const int minorVersion = 0; static const String fingerprint = 'RIVE'; final int ownerId; diff --git a/lib/src/utilities/binary_buffer/binary_reader.dart b/lib/src/utilities/binary_buffer/binary_reader.dart index eb529b1..f2006c9 100644 --- a/lib/src/utilities/binary_buffer/binary_reader.dart +++ b/lib/src/utilities/binary_buffer/binary_reader.dart @@ -115,8 +115,8 @@ class BinaryReader { /// Read a string encoded into the stream. Strings are encoded with a varuint /// integer length written first followed by length number of utf8 encoded /// bytes. - String readString() { - int length = readVarUint(); + String readString({bool explicitLength = true}) { + int length = explicitLength ? readVarUint() : buffer.lengthInBytes; String value = _utf8Decoder.convert(Uint8List.view( buffer.buffer, buffer.offsetInBytes + _readIndex, length)); _readIndex += length; diff --git a/lib/src/utilities/binary_buffer/binary_writer.dart b/lib/src/utilities/binary_buffer/binary_writer.dart index 5c9a4af..1ef1ae7 100644 --- a/lib/src/utilities/binary_buffer/binary_writer.dart +++ b/lib/src/utilities/binary_buffer/binary_writer.dart @@ -151,9 +151,11 @@ class BinaryWriter { /// Encode a string into the buffer. Strings are encoded with a varuint /// integer length written first followed by length number of utf8 encoded /// bytes. - void writeString(String value) { + void writeString(String value, {bool explicitLength = true}) { var list = _utf8Encoder.convert(value); - writeVarUint(list.length); + if (explicitLength) { + writeVarUint(list.length); + } write(list); } From a9ea5f06c5f3983dcf35b606154016043af93c49 Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Mon, 20 Jul 2020 10:59:21 -0700 Subject: [PATCH 12/14] Updating for pub.dev release. --- CHANGELOG.md | 4 ++++ example/pubspec.lock | 2 +- pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5758453..4bc7191 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [0.0.3] - 2020-07-19 18:18:50 + +- Support shorter string encoding. Format bumps to version 2.0 as it breaks backwards compatibility. + ## [0.0.1+3] - 2020-07-09 11:13:22 - Fixing up ```flutter analyze``` issues thanks to @creativecreatorormaybenot. diff --git a/example/pubspec.lock b/example/pubspec.lock index 5ca8c76..dd5e36d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -94,7 +94,7 @@ packages: path: ".." relative: true source: path - version: "0.0.2" + version: "0.0.3" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index e0ba403..c7b4bc4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: rive description: Rive 2 Flutter Runtime -version: 0.0.2 +version: 0.0.3 repository: https://github.com/rive-app/rive-flutter homepage: https://rive.app From c71fa9ecdedd99687ead69ebd13e34e1997afbcb Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Tue, 21 Jul 2020 19:48:48 -0700 Subject: [PATCH 13/14] Invalidate shape less aggressively. --- example/assets/teeny_tiny.riv | Bin 62601 -> 68297 bytes lib/src/rive_core/shapes/path.dart | 11 +---------- pubspec.lock | 16 ++++++++-------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/example/assets/teeny_tiny.riv b/example/assets/teeny_tiny.riv index 26b855d519b218480c35afd37fd737811efe4986..14c920e4104dea3c490b8ed6a97f34b65eda4f2a 100644 GIT binary patch literal 68297 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 get vertices; diff --git a/pubspec.lock b/pubspec.lock index ca477ab..efae536 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,7 +21,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0-nullsafety" charcode: dependency: transitive description: @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.13" + version: "1.15.0-nullsafety" fake_async: dependency: transitive description: @@ -73,14 +73,14 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.8" + version: "0.12.9" meta: dependency: "direct main" description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.8" + version: "1.3.0-nullsafety" path: dependency: transitive description: @@ -134,20 +134,20 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.17" + version: "0.2.18" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0-nullsafety" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0-nullsafety" sdks: - dart: ">=2.9.0-14.0.dev <3.0.0" + dart: ">=2.9.0-18.0 <2.9.0" From ad784625e3a7a4a2616098ee4e025e326b1d06d1 Mon Sep 17 00:00:00 2001 From: Luigi Rosso Date: Tue, 28 Jul 2020 18:48:25 -0700 Subject: [PATCH 14/14] Updating to latest version of Rive runtime format and prepping for pub.dev release. --- CHANGELOG.md | 4 + example/assets/teeny_tiny.riv | Bin 68297 -> 46416 bytes example/pubspec.lock | 14 +-- lib/src/core/field_types/core_bool_type.dart | 4 - lib/src/core/field_types/core_color_type.dart | 7 ++ .../core/field_types/core_double_type.dart | 7 +- lib/src/core/field_types/core_field_type.dart | 2 +- .../core_fractional_index_type.dart | 18 ---- lib/src/core/field_types/core_int_type.dart | 4 - .../core/field_types/core_string_type.dart | 5 +- lib/src/core/field_types/core_uint_type.dart | 7 ++ lib/src/generated/rive_core_context.dart | 81 +++++++++++------- lib/src/generated/shapes/rectangle_base.dart | 2 +- lib/src/rive_core/math/circle_constant.dart | 2 +- lib/src/rive_core/math/mat2d.dart | 4 + lib/src/rive_core/runtime/runtime_header.dart | 2 +- lib/src/rive_core/shapes/ellipse.dart | 3 +- lib/src/rive_core/shapes/path.dart | 3 +- lib/src/rive_file.dart | 23 +---- .../binary_buffer/binary_reader.dart | 1 + pubspec.lock | 4 +- pubspec.yaml | 2 +- 22 files changed, 94 insertions(+), 105 deletions(-) create mode 100644 lib/src/core/field_types/core_color_type.dart delete mode 100644 lib/src/core/field_types/core_fractional_index_type.dart create mode 100644 lib/src/core/field_types/core_uint_type.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bc7191..5e9a5bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [0.0.4] - 2020-07-28 18:35:44 + +- Fundamental changes to runtime format enabling smaller file sizes. Format bumps to version 3.0 as it breaks backwards compatibility. + ## [0.0.3] - 2020-07-19 18:18:50 - Support shorter string encoding. Format bumps to version 2.0 as it breaks backwards compatibility. diff --git a/example/assets/teeny_tiny.riv b/example/assets/teeny_tiny.riv index 14c920e4104dea3c490b8ed6a97f34b65eda4f2a..e9b3a5b1b0808b0d6a5a61d96f1ead52a9206328 100644 GIT binary patch literal 46416 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 UoJ@$lIa4{ZObmQc7E_P^1NP??_y7O^ literal 68297 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.9.0-14.0.dev <3.0.0" + dart: ">=2.9.0-18.0 <2.9.0" diff --git a/lib/src/core/field_types/core_bool_type.dart b/lib/src/core/field_types/core_bool_type.dart index 8c5b8e5..70bb679 100644 --- a/lib/src/core/field_types/core_bool_type.dart +++ b/lib/src/core/field_types/core_bool_type.dart @@ -1,11 +1,7 @@ import 'package:rive/src/core/field_types/core_field_type.dart'; import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; - class CoreBoolType extends CoreFieldType { @override bool deserialize(BinaryReader reader) => reader.readInt8() == 1; - - @override - bool lerp(bool from, bool to, double f) => from; } diff --git a/lib/src/core/field_types/core_color_type.dart b/lib/src/core/field_types/core_color_type.dart new file mode 100644 index 0000000..321942f --- /dev/null +++ b/lib/src/core/field_types/core_color_type.dart @@ -0,0 +1,7 @@ +import 'package:rive/src/core/field_types/core_field_type.dart'; +import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; + +class CoreColorType extends CoreFieldType { + @override + int deserialize(BinaryReader reader) => reader.readUint32(); +} diff --git a/lib/src/core/field_types/core_double_type.dart b/lib/src/core/field_types/core_double_type.dart index 8722d30..71f8784 100644 --- a/lib/src/core/field_types/core_double_type.dart +++ b/lib/src/core/field_types/core_double_type.dart @@ -3,10 +3,5 @@ import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; class CoreDoubleType extends CoreFieldType { @override - double deserialize(BinaryReader reader) => reader.buffer.lengthInBytes == 4 - ? reader.readFloat32() - : reader.readFloat64(); - - @override - double lerp(double from, double to, double f) => from + (to - from) * f; + double deserialize(BinaryReader reader) => reader.readFloat32(); } diff --git a/lib/src/core/field_types/core_field_type.dart b/lib/src/core/field_types/core_field_type.dart index c9e3f7d..a123e05 100644 --- a/lib/src/core/field_types/core_field_type.dart +++ b/lib/src/core/field_types/core_field_type.dart @@ -1,6 +1,6 @@ import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; +// ignore: one_member_abstracts abstract class CoreFieldType { T deserialize(BinaryReader reader); - T lerp(T from, T to, double f); } diff --git a/lib/src/core/field_types/core_fractional_index_type.dart b/lib/src/core/field_types/core_fractional_index_type.dart deleted file mode 100644 index 9ecb79a..0000000 --- a/lib/src/core/field_types/core_fractional_index_type.dart +++ /dev/null @@ -1,18 +0,0 @@ - -import 'package:rive/src/core/core.dart'; -import 'package:rive/src/core/field_types/core_field_type.dart'; -import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; - - -class CoreFractionalIndexType extends CoreFieldType { - @override - FractionalIndex deserialize(BinaryReader reader) { - var numerator = reader.readVarInt(); - var denominator = reader.readVarInt(); - return FractionalIndex(numerator, denominator); - } - - @override - FractionalIndex lerp(FractionalIndex from, FractionalIndex to, double f) => - from; -} diff --git a/lib/src/core/field_types/core_int_type.dart b/lib/src/core/field_types/core_int_type.dart index 056a0f0..5642bb1 100644 --- a/lib/src/core/field_types/core_int_type.dart +++ b/lib/src/core/field_types/core_int_type.dart @@ -1,11 +1,7 @@ import 'package:rive/src/core/field_types/core_field_type.dart'; import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; - class CoreIntType extends CoreFieldType { @override int deserialize(BinaryReader reader) => reader.readVarInt(); - - @override - int lerp(int from, int to, double f) => (from + (to - from) * f).round(); } diff --git a/lib/src/core/field_types/core_string_type.dart b/lib/src/core/field_types/core_string_type.dart index cec1892..80c3317 100644 --- a/lib/src/core/field_types/core_string_type.dart +++ b/lib/src/core/field_types/core_string_type.dart @@ -4,8 +4,5 @@ import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; class CoreStringType extends CoreFieldType { @override String deserialize(BinaryReader reader) => - reader.readString(explicitLength: false); - - @override - String lerp(String from, String to, double f) => from; + reader.readString(explicitLength: true); } diff --git a/lib/src/core/field_types/core_uint_type.dart b/lib/src/core/field_types/core_uint_type.dart new file mode 100644 index 0000000..cf4bdb1 --- /dev/null +++ b/lib/src/core/field_types/core_uint_type.dart @@ -0,0 +1,7 @@ +import 'package:rive/src/core/field_types/core_field_type.dart'; +import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; + +class CoreUintType extends CoreFieldType { + @override + int deserialize(BinaryReader reader) => reader.readVarUint(); +} diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index 976a017..5459e8b 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -1,9 +1,11 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/core/field_types/core_bool_type.dart'; +import 'package:rive/src/core/field_types/core_color_type.dart'; import 'package:rive/src/core/field_types/core_double_type.dart'; import 'package:rive/src/core/field_types/core_field_type.dart'; import 'package:rive/src/core/field_types/core_int_type.dart'; import 'package:rive/src/core/field_types/core_string_type.dart'; +import 'package:rive/src/core/field_types/core_uint_type.dart'; import 'package:rive/src/generated/animation/animation_base.dart'; import 'package:rive/src/generated/animation/cubic_interpolator_base.dart'; import 'package:rive/src/generated/animation/keyed_object_base.dart'; @@ -476,30 +478,32 @@ class RiveCoreContext { } } + static CoreFieldType uintType = CoreUintType(); static CoreFieldType intType = CoreIntType(); static CoreFieldType stringType = CoreStringType(); static CoreFieldType doubleType = CoreDoubleType(); - static CoreFieldType colorType = CoreIntType(); + static CoreFieldType colorType = CoreColorType(); static CoreFieldType boolType = CoreBoolType(); static CoreFieldType coreType(int propertyKey) { switch (propertyKey) { case KeyedObjectBase.objectIdPropertyKey: + case KeyFrameBase.interpolatorIdPropertyKey: + case KeyFrameDrawOrderValueBase.drawableIdPropertyKey: + case KeyFrameDrawOrderValueBase.valuePropertyKey: + case ComponentBase.parentIdPropertyKey: + case DrawableBase.drawOrderPropertyKey: + return uintType; case KeyedPropertyBase.propertyKeyPropertyKey: case KeyFrameBase.framePropertyKey: case KeyFrameBase.interpolationTypePropertyKey: - case KeyFrameBase.interpolatorIdPropertyKey: case LinearAnimationBase.fpsPropertyKey: case LinearAnimationBase.durationPropertyKey: case LinearAnimationBase.loopValuePropertyKey: case LinearAnimationBase.workStartPropertyKey: case LinearAnimationBase.workEndPropertyKey: - case KeyFrameDrawOrderValueBase.drawableIdPropertyKey: - case KeyFrameDrawOrderValueBase.valuePropertyKey: - case ComponentBase.parentIdPropertyKey: case StrokeBase.capPropertyKey: case StrokeBase.joinPropertyKey: case FillBase.fillRulePropertyKey: - case DrawableBase.drawOrderPropertyKey: case DrawableBase.blendModeValuePropertyKey: return intType; case AnimationBase.namePropertyKey: @@ -560,18 +564,32 @@ class RiveCoreContext { } } - static int getInt(Core object, int propertyKey) { + static int getUint(Core object, int propertyKey) { switch (propertyKey) { case KeyedObjectBase.objectIdPropertyKey: return (object as KeyedObjectBase).objectId; + case KeyFrameBase.interpolatorIdPropertyKey: + return (object as KeyFrameBase).interpolatorId; + case KeyFrameDrawOrderValueBase.drawableIdPropertyKey: + return (object as KeyFrameDrawOrderValueBase).drawableId; + case KeyFrameDrawOrderValueBase.valuePropertyKey: + return (object as KeyFrameDrawOrderValueBase).value; + case ComponentBase.parentIdPropertyKey: + return (object as ComponentBase).parentId; + case DrawableBase.drawOrderPropertyKey: + return (object as DrawableBase).drawOrder; + } + return 0; + } + + static int getInt(Core object, int propertyKey) { + switch (propertyKey) { case KeyedPropertyBase.propertyKeyPropertyKey: return (object as KeyedPropertyBase).propertyKey; case KeyFrameBase.framePropertyKey: return (object as KeyFrameBase).frame; case KeyFrameBase.interpolationTypePropertyKey: return (object as KeyFrameBase).interpolationType; - case KeyFrameBase.interpolatorIdPropertyKey: - return (object as KeyFrameBase).interpolatorId; case LinearAnimationBase.fpsPropertyKey: return (object as LinearAnimationBase).fps; case LinearAnimationBase.durationPropertyKey: @@ -582,20 +600,12 @@ class RiveCoreContext { return (object as LinearAnimationBase).workStart; case LinearAnimationBase.workEndPropertyKey: return (object as LinearAnimationBase).workEnd; - case KeyFrameDrawOrderValueBase.drawableIdPropertyKey: - return (object as KeyFrameDrawOrderValueBase).drawableId; - case KeyFrameDrawOrderValueBase.valuePropertyKey: - return (object as KeyFrameDrawOrderValueBase).value; - case ComponentBase.parentIdPropertyKey: - return (object as ComponentBase).parentId; case StrokeBase.capPropertyKey: return (object as StrokeBase).cap; case StrokeBase.joinPropertyKey: return (object as StrokeBase).join; case FillBase.fillRulePropertyKey: return (object as FillBase).fillRule; - case DrawableBase.drawOrderPropertyKey: - return (object as DrawableBase).drawOrder; case DrawableBase.blendModeValuePropertyKey: return (object as DrawableBase).blendModeValue; } @@ -724,11 +734,31 @@ class RiveCoreContext { return false; } - static void setInt(Core object, int propertyKey, int value) { + static void setUint(Core object, int propertyKey, int value) { switch (propertyKey) { case KeyedObjectBase.objectIdPropertyKey: (object as KeyedObjectBase).objectId = value; break; + case KeyFrameBase.interpolatorIdPropertyKey: + (object as KeyFrameBase).interpolatorId = value; + break; + case KeyFrameDrawOrderValueBase.drawableIdPropertyKey: + (object as KeyFrameDrawOrderValueBase).drawableId = value; + break; + case KeyFrameDrawOrderValueBase.valuePropertyKey: + (object as KeyFrameDrawOrderValueBase).value = value; + break; + case ComponentBase.parentIdPropertyKey: + (object as ComponentBase).parentId = value; + break; + case DrawableBase.drawOrderPropertyKey: + (object as DrawableBase).drawOrder = value; + break; + } + } + + static void setInt(Core object, int propertyKey, int value) { + switch (propertyKey) { case KeyedPropertyBase.propertyKeyPropertyKey: (object as KeyedPropertyBase).propertyKey = value; break; @@ -738,9 +768,6 @@ class RiveCoreContext { case KeyFrameBase.interpolationTypePropertyKey: (object as KeyFrameBase).interpolationType = value; break; - case KeyFrameBase.interpolatorIdPropertyKey: - (object as KeyFrameBase).interpolatorId = value; - break; case LinearAnimationBase.fpsPropertyKey: (object as LinearAnimationBase).fps = value; break; @@ -756,15 +783,6 @@ class RiveCoreContext { case LinearAnimationBase.workEndPropertyKey: (object as LinearAnimationBase).workEnd = value; break; - case KeyFrameDrawOrderValueBase.drawableIdPropertyKey: - (object as KeyFrameDrawOrderValueBase).drawableId = value; - break; - case KeyFrameDrawOrderValueBase.valuePropertyKey: - (object as KeyFrameDrawOrderValueBase).value = value; - break; - case ComponentBase.parentIdPropertyKey: - (object as ComponentBase).parentId = value; - break; case StrokeBase.capPropertyKey: (object as StrokeBase).cap = value; break; @@ -774,9 +792,6 @@ class RiveCoreContext { case FillBase.fillRulePropertyKey: (object as FillBase).fillRule = value; break; - case DrawableBase.drawOrderPropertyKey: - (object as DrawableBase).drawOrder = value; - break; case DrawableBase.blendModeValuePropertyKey: (object as DrawableBase).blendModeValue = value; break; diff --git a/lib/src/generated/shapes/rectangle_base.dart b/lib/src/generated/shapes/rectangle_base.dart index ddda4fc..60d1de4 100644 --- a/lib/src/generated/shapes/rectangle_base.dart +++ b/lib/src/generated/shapes/rectangle_base.dart @@ -24,7 +24,7 @@ abstract class RectangleBase extends ParametricPath { /// -------------------------------------------------------------------------- /// CornerRadius field with key 31. - double _cornerRadius; + double _cornerRadius = 0; static const int cornerRadiusPropertyKey = 31; /// Radius of the corners of this rectangle diff --git a/lib/src/rive_core/math/circle_constant.dart b/lib/src/rive_core/math/circle_constant.dart index 08aee37..67f3041 100644 --- a/lib/src/rive_core/math/circle_constant.dart +++ b/lib/src/rive_core/math/circle_constant.dart @@ -1 +1 @@ -double circleConstant = 0.552284749831; +const circleConstant = 0.552284749831; diff --git a/lib/src/rive_core/math/mat2d.dart b/lib/src/rive_core/math/mat2d.dart index cab0418..ac86869 100644 --- a/lib/src/rive_core/math/mat2d.dart +++ b/lib/src/rive_core/math/mat2d.dart @@ -48,6 +48,10 @@ class Mat2D { Mat2D.fromScaling(Vec2D scaling) { _buffer = Float32List.fromList([scaling[0], 0, 0, scaling[1], 0, 0]); } + Mat2D.fromMat4(Float64List mat4) { + _buffer = Float32List.fromList( + [mat4[0], mat4[1], mat4[4], mat4[5], mat4[12], mat4[13]]); + } Mat2D.clone(Mat2D copy) { _buffer = Float32List.fromList(copy.values); } diff --git a/lib/src/rive_core/runtime/runtime_header.dart b/lib/src/rive_core/runtime/runtime_header.dart index 333bb35..00ce8ee 100644 --- a/lib/src/rive_core/runtime/runtime_header.dart +++ b/lib/src/rive_core/runtime/runtime_header.dart @@ -4,7 +4,7 @@ import 'package:rive/src/utilities/binary_buffer/binary_reader.dart'; import 'exceptions/rive_format_error_exception.dart'; class RuntimeHeader { - static const int majorVersion = 2; + static const int majorVersion = 3; static const int minorVersion = 0; static const String fingerprint = 'RIVE'; final int ownerId; diff --git a/lib/src/rive_core/shapes/ellipse.dart b/lib/src/rive_core/shapes/ellipse.dart index 9b4f935..2e934a7 100644 --- a/lib/src/rive_core/shapes/ellipse.dart +++ b/lib/src/rive_core/shapes/ellipse.dart @@ -1,10 +1,9 @@ +import 'package:rive/src/rive_core/math/circle_constant.dart'; import 'package:rive/src/rive_core/shapes/cubic_detached_vertex.dart'; import 'package:rive/src/rive_core/shapes/path_vertex.dart'; import 'package:rive/src/generated/shapes/ellipse_base.dart'; export 'package:rive/src/generated/shapes/ellipse_base.dart'; -const double circleConstant = 0.55; - class Ellipse extends EllipseBase { @override List get vertices => [ diff --git a/lib/src/rive_core/shapes/path.dart b/lib/src/rive_core/shapes/path.dart index b575381..280deaa 100644 --- a/lib/src/rive_core/shapes/path.dart +++ b/lib/src/rive_core/shapes/path.dart @@ -3,6 +3,7 @@ import 'dart:ui' as ui; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/component_dirt.dart'; import 'package:rive/src/rive_core/math/aabb.dart'; +import 'package:rive/src/rive_core/math/circle_constant.dart'; import 'package:rive/src/rive_core/math/mat2d.dart'; import 'package:rive/src/rive_core/math/vec2d.dart'; import 'package:rive/src/rive_core/shapes/cubic_vertex.dart'; @@ -98,7 +99,7 @@ abstract class Path extends PathBase { } List renderPoints = []; int pl = pts.length; - const double arcConstant = 0.55; + const arcConstant = circleConstant; const double iarcConstant = 1.0 - arcConstant; PathVertex previous = isClosed ? pts[pl - 1] : null; for (int i = 0; i < pl; i++) { diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index a3d159c..871d51b 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -99,7 +99,7 @@ class RiveFile { int numValues = reader.readVarUint(); for (int m = 0; m < numValues; m++) { var valueObject = KeyFrameDrawOrderValue(); - valueObject.drawableId = reader.readVarInt(); + valueObject.drawableId = reader.readVarUint(); valueObject.value = m; keyframe.internalAddValue(valueObject); } @@ -153,30 +153,15 @@ T readRuntimeObject>(BinaryReader reader, // Terminator. https://media.giphy.com/media/7TtvTUMm9mp20/giphy.gif break; } - int propertyLength = reader.readVarUint(); - Uint8List valueBytes = reader.read(propertyLength); var fieldType = RiveCoreContext.coreType(propertyKey); if (fieldType == null) { - // This is considered an acceptable failure. A runtime may not support - // the same properties that were exported. The older object could still - // function without them, however, so it's up to the implementation to - // make sure that major versions are revved when breaking properties are - // added. Note that we intentionally first read the entire value bytes - // for the property so we can advance as expected even if we are - // skipping this value. - continue; + throw UnsupportedError('Unsupported property key $propertyKey. ' + 'A new runtime is likely necessary to play this file.'); } - // We know what to expect, let's try to read the value. We instance a new - // reader here so that we don't overflow the exact length we're allowed to - // read. - var valueReader = BinaryReader.fromList(valueBytes); - - // This will attempt to set the object property, but failure here is - // acceptable. RiveCoreContext.setObjectProperty( - object, propertyKey, fieldType.deserialize(valueReader)); + object, propertyKey, fieldType.deserialize(reader)); } return object as T; } diff --git a/lib/src/utilities/binary_buffer/binary_reader.dart b/lib/src/utilities/binary_buffer/binary_reader.dart index f2006c9..b5b85e7 100644 --- a/lib/src/utilities/binary_buffer/binary_reader.dart +++ b/lib/src/utilities/binary_buffer/binary_reader.dart @@ -7,6 +7,7 @@ class BinaryReader { final ByteData buffer; final Endian endian; int _readIndex = 0; + int get position => _readIndex; BinaryReader(this.buffer, {this.endian = Endian.little}); diff --git a/pubspec.lock b/pubspec.lock index efae536..13bf620 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -73,7 +73,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.9" + version: "0.12.8" meta: dependency: "direct main" description: @@ -134,7 +134,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.18" + version: "0.2.17" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c7b4bc4..dd775f9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: rive description: Rive 2 Flutter Runtime -version: 0.0.3 +version: 0.0.4 repository: https://github.com/rive-app/rive-flutter homepage: https://rive.app