diff --git a/example/assets/teeny_tiny.riv b/example/assets/teeny_tiny.riv index e9b3a5b..cf390db 100644 Binary files a/example/assets/teeny_tiny.riv and b/example/assets/teeny_tiny.riv differ diff --git a/lib/src/generated/bones/bone_base.dart b/lib/src/generated/bones/bone_base.dart new file mode 100644 index 0000000..ace67a5 --- /dev/null +++ b/lib/src/generated/bones/bone_base.dart @@ -0,0 +1,41 @@ +/// Core automatically generated lib/src/generated/bones/bone_base.dart. +/// Do not modify manually. + +import 'package:rive/src/generated/bones/skeletal_component_base.dart'; +import 'package:rive/src/generated/component_base.dart'; +import 'package:rive/src/generated/container_component_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; +import 'package:rive/src/rive_core/bones/skeletal_component.dart'; + +abstract class BoneBase extends SkeletalComponent { + static const int typeKey = 40; + @override + int get coreType => BoneBase.typeKey; + @override + Set get coreTypes => { + BoneBase.typeKey, + SkeletalComponentBase.typeKey, + TransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey + }; + + /// -------------------------------------------------------------------------- + /// Length field with key 89. + double _length = 0; + static const int lengthPropertyKey = 89; + double get length => _length; + + /// Change the [_length] field value. + /// [lengthChanged] will be invoked only if the field's value has changed. + set length(double value) { + if (_length == value) { + return; + } + double from = _length; + _length = value; + lengthChanged(from, value); + } + + void lengthChanged(double from, double to); +} diff --git a/lib/src/generated/bones/root_bone_base.dart b/lib/src/generated/bones/root_bone_base.dart new file mode 100644 index 0000000..33c9173 --- /dev/null +++ b/lib/src/generated/bones/root_bone_base.dart @@ -0,0 +1,66 @@ +/// Core automatically generated lib/src/generated/bones/root_bone_base.dart. +/// Do not modify manually. + +import 'package:rive/src/generated/bones/bone_base.dart'; +import 'package:rive/src/generated/bones/skeletal_component_base.dart'; +import 'package:rive/src/generated/component_base.dart'; +import 'package:rive/src/generated/container_component_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; +import 'package:rive/src/rive_core/bones/bone.dart'; + +abstract class RootBoneBase extends Bone { + static const int typeKey = 41; + @override + int get coreType => RootBoneBase.typeKey; + @override + Set get coreTypes => { + RootBoneBase.typeKey, + BoneBase.typeKey, + SkeletalComponentBase.typeKey, + TransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey + }; + + /// -------------------------------------------------------------------------- + /// X field with key 90. + double _x = 0; + static const int xPropertyKey = 90; + @override + double get x => _x; + + /// Change the [_x] field value. + /// [xChanged] will be invoked only if the field's value has changed. + @override + set x(double value) { + if (_x == value) { + return; + } + double from = _x; + _x = value; + xChanged(from, value); + } + + void xChanged(double from, double to); + + /// -------------------------------------------------------------------------- + /// Y field with key 91. + double _y = 0; + static const int yPropertyKey = 91; + @override + double get y => _y; + + /// Change the [_y] field value. + /// [yChanged] will be invoked only if the field's value has changed. + @override + set y(double value) { + if (_y == value) { + return; + } + double from = _y; + _y = value; + yChanged(from, value); + } + + void yChanged(double from, double to); +} diff --git a/lib/src/generated/bones/skeletal_component_base.dart b/lib/src/generated/bones/skeletal_component_base.dart new file mode 100644 index 0000000..b0153fd --- /dev/null +++ b/lib/src/generated/bones/skeletal_component_base.dart @@ -0,0 +1,21 @@ +/// Core automatically generated +/// lib/src/generated/bones/skeletal_component_base.dart. +/// Do not modify manually. + +import 'package:rive/src/generated/component_base.dart'; +import 'package:rive/src/generated/container_component_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; +import 'package:rive/src/rive_core/transform_component.dart'; + +abstract class SkeletalComponentBase extends TransformComponent { + static const int typeKey = 39; + @override + int get coreType => SkeletalComponentBase.typeKey; + @override + Set get coreTypes => { + SkeletalComponentBase.typeKey, + TransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey + }; +} diff --git a/lib/src/generated/drawable_base.dart b/lib/src/generated/drawable_base.dart index 24d72e1..666bd50 100644 --- a/lib/src/generated/drawable_base.dart +++ b/lib/src/generated/drawable_base.dart @@ -4,6 +4,7 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/node_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/node.dart'; abstract class DrawableBase extends Node { @@ -14,6 +15,7 @@ abstract class DrawableBase extends Node { Set get coreTypes => { DrawableBase.typeKey, NodeBase.typeKey, + TransformComponentBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey }; diff --git a/lib/src/generated/node_base.dart b/lib/src/generated/node_base.dart index 5054c00..7837348 100644 --- a/lib/src/generated/node_base.dart +++ b/lib/src/generated/node_base.dart @@ -3,24 +3,31 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; -import 'package:rive/src/rive_core/container_component.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; +import 'package:rive/src/rive_core/transform_component.dart'; -abstract class NodeBase extends ContainerComponent { +abstract class NodeBase extends TransformComponent { static const int typeKey = 2; @override int get coreType => NodeBase.typeKey; @override - Set get coreTypes => - {NodeBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey}; + Set get coreTypes => { + NodeBase.typeKey, + TransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey + }; /// -------------------------------------------------------------------------- /// X field with key 13. double _x = 0; static const int xPropertyKey = 13; + @override double get x => _x; /// Change the [_x] field value. /// [xChanged] will be invoked only if the field's value has changed. + @override set x(double value) { if (_x == value) { return; @@ -36,10 +43,12 @@ abstract class NodeBase extends ContainerComponent { /// Y field with key 14. double _y = 0; static const int yPropertyKey = 14; + @override double get y => _y; /// Change the [_y] field value. /// [yChanged] will be invoked only if the field's value has changed. + @override set y(double value) { if (_y == value) { return; @@ -50,80 +59,4 @@ abstract class NodeBase extends ContainerComponent { } void yChanged(double from, double to); - - /// -------------------------------------------------------------------------- - /// Rotation field with key 15. - double _rotation = 0; - static const int rotationPropertyKey = 15; - double get rotation => _rotation; - - /// Change the [_rotation] field value. - /// [rotationChanged] will be invoked only if the field's value has changed. - set rotation(double value) { - if (_rotation == value) { - return; - } - double from = _rotation; - _rotation = value; - rotationChanged(from, value); - } - - void rotationChanged(double from, double to); - - /// -------------------------------------------------------------------------- - /// ScaleX field with key 16. - double _scaleX = 1; - static const int scaleXPropertyKey = 16; - double get scaleX => _scaleX; - - /// Change the [_scaleX] field value. - /// [scaleXChanged] will be invoked only if the field's value has changed. - set scaleX(double value) { - if (_scaleX == value) { - return; - } - double from = _scaleX; - _scaleX = value; - scaleXChanged(from, value); - } - - void scaleXChanged(double from, double to); - - /// -------------------------------------------------------------------------- - /// ScaleY field with key 17. - double _scaleY = 1; - static const int scaleYPropertyKey = 17; - double get scaleY => _scaleY; - - /// Change the [_scaleY] field value. - /// [scaleYChanged] will be invoked only if the field's value has changed. - set scaleY(double value) { - if (_scaleY == value) { - return; - } - double from = _scaleY; - _scaleY = value; - scaleYChanged(from, value); - } - - void scaleYChanged(double from, double to); - - /// -------------------------------------------------------------------------- - /// Opacity field with key 18. - double _opacity = 1; - static const int opacityPropertyKey = 18; - double get opacity => _opacity; - - /// Change the [_opacity] field value. - /// [opacityChanged] will be invoked only if the field's value has changed. - set opacity(double value) { - if (_opacity == value) { - return; - } - double from = _opacity; - _opacity = value; - opacityChanged(from, value); - } - - void opacityChanged(double from, double to); } diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index b70eddb..9ec2267 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -17,6 +17,8 @@ import 'package:rive/src/generated/animation/keyframe_draw_order_value_base.dart import 'package:rive/src/generated/animation/linear_animation_base.dart'; import 'package:rive/src/generated/artboard_base.dart'; import 'package:rive/src/generated/backboard_base.dart'; +import 'package:rive/src/generated/bones/bone_base.dart'; +import 'package:rive/src/generated/bones/root_bone_base.dart'; import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/drawable_base.dart'; import 'package:rive/src/generated/node_base.dart'; @@ -39,6 +41,7 @@ import 'package:rive/src/generated/shapes/rectangle_base.dart'; import 'package:rive/src/generated/shapes/shape_base.dart'; import 'package:rive/src/generated/shapes/straight_vertex_base.dart'; import 'package:rive/src/generated/shapes/triangle_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/animation/animation.dart'; import 'package:rive/src/rive_core/animation/cubic_interpolator.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; @@ -50,6 +53,8 @@ import 'package:rive/src/rive_core/animation/keyframe_draw_order_value.dart'; import 'package:rive/src/rive_core/animation/linear_animation.dart'; import 'package:rive/src/rive_core/artboard.dart'; import 'package:rive/src/rive_core/backboard.dart'; +import 'package:rive/src/rive_core/bones/bone.dart'; +import 'package:rive/src/rive_core/bones/root_bone.dart'; import 'package:rive/src/rive_core/node.dart'; import 'package:rive/src/rive_core/shapes/cubic_asymmetric_vertex.dart'; import 'package:rive/src/rive_core/shapes/cubic_detached_vertex.dart'; @@ -128,6 +133,10 @@ class RiveCoreContext { return Artboard(); case BackboardBase.typeKey: return Backboard(); + case BoneBase.typeKey: + return Bone(); + case RootBoneBase.typeKey: + return RootBone(); default: return null; } @@ -324,6 +333,26 @@ class RiveCoreContext { object.fillRule = value; } break; + case TransformComponentBase.rotationPropertyKey: + if (object is TransformComponentBase && value is double) { + object.rotation = value; + } + break; + case TransformComponentBase.scaleXPropertyKey: + if (object is TransformComponentBase && value is double) { + object.scaleX = value; + } + break; + case TransformComponentBase.scaleYPropertyKey: + if (object is TransformComponentBase && value is double) { + object.scaleY = value; + } + break; + case TransformComponentBase.opacityPropertyKey: + if (object is TransformComponentBase && value is double) { + object.opacity = value; + } + break; case NodeBase.xPropertyKey: if (object is NodeBase && value is double) { object.x = value; @@ -334,26 +363,6 @@ class RiveCoreContext { object.y = value; } break; - case NodeBase.rotationPropertyKey: - if (object is NodeBase && value is double) { - object.rotation = value; - } - break; - case NodeBase.scaleXPropertyKey: - if (object is NodeBase && value is double) { - object.scaleX = value; - } - break; - case NodeBase.scaleYPropertyKey: - if (object is NodeBase && value is double) { - object.scaleY = value; - } - break; - case NodeBase.opacityPropertyKey: - if (object is NodeBase && value is double) { - object.opacity = value; - } - break; case DrawableBase.drawOrderPropertyKey: if (object is DrawableBase && value is int) { object.drawOrder = value; @@ -474,6 +483,21 @@ class RiveCoreContext { object.originY = value; } break; + case BoneBase.lengthPropertyKey: + if (object is BoneBase && value is double) { + object.length = value; + } + break; + case RootBoneBase.xPropertyKey: + if (object is RootBoneBase && value is double) { + object.x = value; + } + break; + case RootBoneBase.yPropertyKey: + if (object is RootBoneBase && value is double) { + object.y = value; + } + break; } } @@ -519,12 +543,12 @@ class RiveCoreContext { case LinearGradientBase.opacityPropertyKey: case StrokeBase.thicknessPropertyKey: case GradientStopBase.positionPropertyKey: + case TransformComponentBase.rotationPropertyKey: + case TransformComponentBase.scaleXPropertyKey: + case TransformComponentBase.scaleYPropertyKey: + case TransformComponentBase.opacityPropertyKey: case NodeBase.xPropertyKey: case NodeBase.yPropertyKey: - case NodeBase.rotationPropertyKey: - case NodeBase.scaleXPropertyKey: - case NodeBase.scaleYPropertyKey: - case NodeBase.opacityPropertyKey: case PathVertexBase.xPropertyKey: case PathVertexBase.yPropertyKey: case StraightVertexBase.radiusPropertyKey: @@ -546,6 +570,9 @@ class RiveCoreContext { case ArtboardBase.yPropertyKey: case ArtboardBase.originXPropertyKey: case ArtboardBase.originYPropertyKey: + case BoneBase.lengthPropertyKey: + case RootBoneBase.xPropertyKey: + case RootBoneBase.yPropertyKey: return doubleType; case KeyFrameColorBase.valuePropertyKey: case SolidColorBase.colorValuePropertyKey: @@ -641,18 +668,18 @@ class RiveCoreContext { return (object as StrokeBase).thickness; case GradientStopBase.positionPropertyKey: return (object as GradientStopBase).position; + case TransformComponentBase.rotationPropertyKey: + return (object as TransformComponentBase).rotation; + case TransformComponentBase.scaleXPropertyKey: + return (object as TransformComponentBase).scaleX; + case TransformComponentBase.scaleYPropertyKey: + return (object as TransformComponentBase).scaleY; + case TransformComponentBase.opacityPropertyKey: + return (object as TransformComponentBase).opacity; case NodeBase.xPropertyKey: return (object as NodeBase).x; case NodeBase.yPropertyKey: return (object as NodeBase).y; - case NodeBase.rotationPropertyKey: - return (object as NodeBase).rotation; - case NodeBase.scaleXPropertyKey: - return (object as NodeBase).scaleX; - case NodeBase.scaleYPropertyKey: - return (object as NodeBase).scaleY; - case NodeBase.opacityPropertyKey: - return (object as NodeBase).opacity; case PathVertexBase.xPropertyKey: return (object as PathVertexBase).x; case PathVertexBase.yPropertyKey: @@ -695,6 +722,12 @@ class RiveCoreContext { return (object as ArtboardBase).originX; case ArtboardBase.originYPropertyKey: return (object as ArtboardBase).originY; + case BoneBase.lengthPropertyKey: + return (object as BoneBase).length; + case RootBoneBase.xPropertyKey: + return (object as RootBoneBase).x; + case RootBoneBase.yPropertyKey: + return (object as RootBoneBase).y; } return 0.0; } @@ -836,24 +869,24 @@ class RiveCoreContext { case GradientStopBase.positionPropertyKey: (object as GradientStopBase).position = value; break; + case TransformComponentBase.rotationPropertyKey: + (object as TransformComponentBase).rotation = value; + break; + case TransformComponentBase.scaleXPropertyKey: + (object as TransformComponentBase).scaleX = value; + break; + case TransformComponentBase.scaleYPropertyKey: + (object as TransformComponentBase).scaleY = value; + break; + case TransformComponentBase.opacityPropertyKey: + (object as TransformComponentBase).opacity = value; + break; case NodeBase.xPropertyKey: (object as NodeBase).x = value; break; case NodeBase.yPropertyKey: (object as NodeBase).y = value; break; - case NodeBase.rotationPropertyKey: - (object as NodeBase).rotation = value; - break; - case NodeBase.scaleXPropertyKey: - (object as NodeBase).scaleX = value; - break; - case NodeBase.scaleYPropertyKey: - (object as NodeBase).scaleY = value; - break; - case NodeBase.opacityPropertyKey: - (object as NodeBase).opacity = value; - break; case PathVertexBase.xPropertyKey: (object as PathVertexBase).x = value; break; @@ -917,6 +950,15 @@ class RiveCoreContext { case ArtboardBase.originYPropertyKey: (object as ArtboardBase).originY = value; break; + case BoneBase.lengthPropertyKey: + (object as BoneBase).length = value; + break; + case RootBoneBase.xPropertyKey: + (object as RootBoneBase).x = value; + break; + case RootBoneBase.yPropertyKey: + (object as RootBoneBase).y = value; + break; } } diff --git a/lib/src/generated/shapes/ellipse_base.dart b/lib/src/generated/shapes/ellipse_base.dart index b3c46ba..76c99aa 100644 --- a/lib/src/generated/shapes/ellipse_base.dart +++ b/lib/src/generated/shapes/ellipse_base.dart @@ -6,6 +6,7 @@ import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/node_base.dart'; import 'package:rive/src/generated/shapes/parametric_path_base.dart'; import 'package:rive/src/generated/shapes/path_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/shapes/parametric_path.dart'; abstract class EllipseBase extends ParametricPath { @@ -18,6 +19,7 @@ abstract class EllipseBase extends ParametricPath { ParametricPathBase.typeKey, PathBase.typeKey, NodeBase.typeKey, + TransformComponentBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey }; diff --git a/lib/src/generated/shapes/parametric_path_base.dart b/lib/src/generated/shapes/parametric_path_base.dart index e51dc46..675ab7b 100644 --- a/lib/src/generated/shapes/parametric_path_base.dart +++ b/lib/src/generated/shapes/parametric_path_base.dart @@ -6,6 +6,7 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/node_base.dart'; import 'package:rive/src/generated/shapes/path_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/shapes/path.dart'; abstract class ParametricPathBase extends Path { @@ -17,6 +18,7 @@ abstract class ParametricPathBase extends Path { ParametricPathBase.typeKey, PathBase.typeKey, NodeBase.typeKey, + TransformComponentBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey }; diff --git a/lib/src/generated/shapes/path_base.dart b/lib/src/generated/shapes/path_base.dart index 5f00988..4af6ae9 100644 --- a/lib/src/generated/shapes/path_base.dart +++ b/lib/src/generated/shapes/path_base.dart @@ -4,6 +4,7 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/node_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/node.dart'; abstract class PathBase extends Node { @@ -14,6 +15,7 @@ abstract class PathBase extends Node { Set get coreTypes => { PathBase.typeKey, NodeBase.typeKey, + TransformComponentBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey }; diff --git a/lib/src/generated/shapes/points_path_base.dart b/lib/src/generated/shapes/points_path_base.dart index 8683b9f..bb98050 100644 --- a/lib/src/generated/shapes/points_path_base.dart +++ b/lib/src/generated/shapes/points_path_base.dart @@ -5,6 +5,7 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/node_base.dart'; import 'package:rive/src/generated/shapes/path_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/shapes/path.dart'; abstract class PointsPathBase extends Path { @@ -16,6 +17,7 @@ abstract class PointsPathBase extends Path { PointsPathBase.typeKey, PathBase.typeKey, NodeBase.typeKey, + TransformComponentBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey }; diff --git a/lib/src/generated/shapes/rectangle_base.dart b/lib/src/generated/shapes/rectangle_base.dart index 60d1de4..31f2351 100644 --- a/lib/src/generated/shapes/rectangle_base.dart +++ b/lib/src/generated/shapes/rectangle_base.dart @@ -6,6 +6,7 @@ import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/node_base.dart'; import 'package:rive/src/generated/shapes/parametric_path_base.dart'; import 'package:rive/src/generated/shapes/path_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/shapes/parametric_path.dart'; abstract class RectangleBase extends ParametricPath { @@ -18,6 +19,7 @@ abstract class RectangleBase extends ParametricPath { ParametricPathBase.typeKey, PathBase.typeKey, NodeBase.typeKey, + TransformComponentBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey }; diff --git a/lib/src/generated/shapes/shape_base.dart b/lib/src/generated/shapes/shape_base.dart index 9f4d59b..86a71f4 100644 --- a/lib/src/generated/shapes/shape_base.dart +++ b/lib/src/generated/shapes/shape_base.dart @@ -5,6 +5,7 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/drawable_base.dart'; import 'package:rive/src/generated/node_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/drawable.dart'; abstract class ShapeBase extends Drawable { @@ -16,6 +17,7 @@ abstract class ShapeBase extends Drawable { ShapeBase.typeKey, DrawableBase.typeKey, NodeBase.typeKey, + TransformComponentBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey }; diff --git a/lib/src/generated/shapes/triangle_base.dart b/lib/src/generated/shapes/triangle_base.dart index 33d6de9..2186c8d 100644 --- a/lib/src/generated/shapes/triangle_base.dart +++ b/lib/src/generated/shapes/triangle_base.dart @@ -6,6 +6,7 @@ import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/node_base.dart'; import 'package:rive/src/generated/shapes/parametric_path_base.dart'; import 'package:rive/src/generated/shapes/path_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/rive_core/shapes/parametric_path.dart'; abstract class TriangleBase extends ParametricPath { @@ -18,6 +19,7 @@ abstract class TriangleBase extends ParametricPath { ParametricPathBase.typeKey, PathBase.typeKey, NodeBase.typeKey, + TransformComponentBase.typeKey, ContainerComponentBase.typeKey, ComponentBase.typeKey }; diff --git a/lib/src/generated/transform_component_base.dart b/lib/src/generated/transform_component_base.dart new file mode 100644 index 0000000..d947069 --- /dev/null +++ b/lib/src/generated/transform_component_base.dart @@ -0,0 +1,95 @@ +/// Core automatically generated +/// lib/src/generated/transform_component_base.dart. +/// Do not modify manually. + +import 'package:rive/src/generated/component_base.dart'; +import 'package:rive/src/generated/container_component_base.dart'; +import 'package:rive/src/rive_core/container_component.dart'; + +abstract class TransformComponentBase extends ContainerComponent { + static const int typeKey = 38; + @override + int get coreType => TransformComponentBase.typeKey; + @override + Set get coreTypes => { + TransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey + }; + + /// -------------------------------------------------------------------------- + /// Rotation field with key 15. + double _rotation = 0; + static const int rotationPropertyKey = 15; + double get rotation => _rotation; + + /// Change the [_rotation] field value. + /// [rotationChanged] will be invoked only if the field's value has changed. + set rotation(double value) { + if (_rotation == value) { + return; + } + double from = _rotation; + _rotation = value; + rotationChanged(from, value); + } + + void rotationChanged(double from, double to); + + /// -------------------------------------------------------------------------- + /// ScaleX field with key 16. + double _scaleX = 1; + static const int scaleXPropertyKey = 16; + double get scaleX => _scaleX; + + /// Change the [_scaleX] field value. + /// [scaleXChanged] will be invoked only if the field's value has changed. + set scaleX(double value) { + if (_scaleX == value) { + return; + } + double from = _scaleX; + _scaleX = value; + scaleXChanged(from, value); + } + + void scaleXChanged(double from, double to); + + /// -------------------------------------------------------------------------- + /// ScaleY field with key 17. + double _scaleY = 1; + static const int scaleYPropertyKey = 17; + double get scaleY => _scaleY; + + /// Change the [_scaleY] field value. + /// [scaleYChanged] will be invoked only if the field's value has changed. + set scaleY(double value) { + if (_scaleY == value) { + return; + } + double from = _scaleY; + _scaleY = value; + scaleYChanged(from, value); + } + + void scaleYChanged(double from, double to); + + /// -------------------------------------------------------------------------- + /// Opacity field with key 18. + double _opacity = 1; + static const int opacityPropertyKey = 18; + double get opacity => _opacity; + + /// Change the [_opacity] field value. + /// [opacityChanged] will be invoked only if the field's value has changed. + set opacity(double value) { + if (_opacity == value) { + return; + } + double from = _opacity; + _opacity = value; + opacityChanged(from, value); + } + + void opacityChanged(double from, double to); +} diff --git a/lib/src/rive_core/bones/bone.dart b/lib/src/rive_core/bones/bone.dart new file mode 100644 index 0000000..ef7dd15 --- /dev/null +++ b/lib/src/rive_core/bones/bone.dart @@ -0,0 +1,49 @@ +import 'package:rive/src/generated/bones/bone_base.dart'; +export 'package:rive/src/generated/bones/bone_base.dart'; + +typedef bool BoneCallback(Bone bone); + +class Bone extends BoneBase { + @override + void lengthChanged(double from, double to) { + for (final child in children) { + if (child.coreType == BoneBase.typeKey) { + (child as Bone).markTransformDirty(); + } + } + } + + Bone get firstChildBone { + for (final child in children) { + if (child.coreType == BoneBase.typeKey) { + return child as Bone; + } + } + return null; + } + + bool forEachBone(BoneCallback callback) { + for (final child in children) { + if (child.coreType == BoneBase.typeKey) { + if (!callback(child as Bone)) { + return false; + } + } + } + return true; + } + + @override + double get x => (parent as Bone).length; + @override + set x(double value) { + throw UnsupportedError('not expected to set x on a bone.'); + } + + @override + double get y => 0; + @override + set y(double value) { + throw UnsupportedError('not expected to set y on a bone.'); + } +} diff --git a/lib/src/rive_core/bones/root_bone.dart b/lib/src/rive_core/bones/root_bone.dart new file mode 100644 index 0000000..cda4758 --- /dev/null +++ b/lib/src/rive_core/bones/root_bone.dart @@ -0,0 +1,14 @@ +import 'package:rive/src/generated/bones/root_bone_base.dart'; +export 'package:rive/src/generated/bones/root_bone_base.dart'; + +class RootBone extends RootBoneBase { + @override + void xChanged(double from, double to) { + markTransformDirty(); + } + + @override + void yChanged(double from, double to) { + markTransformDirty(); + } +} diff --git a/lib/src/rive_core/bones/skeletal_component.dart b/lib/src/rive_core/bones/skeletal_component.dart new file mode 100644 index 0000000..159005e --- /dev/null +++ b/lib/src/rive_core/bones/skeletal_component.dart @@ -0,0 +1,4 @@ +import 'package:rive/src/generated/bones/skeletal_component_base.dart'; +export 'package:rive/src/generated/bones/skeletal_component_base.dart'; + +abstract class SkeletalComponent extends SkeletalComponentBase {} diff --git a/lib/src/rive_core/math/aabb.dart b/lib/src/rive_core/math/aabb.dart index 7d1f2a4..a4a5015 100644 --- a/lib/src/rive_core/math/aabb.dart +++ b/lib/src/rive_core/math/aabb.dart @@ -48,8 +48,13 @@ class AABB { var transformedPoint = transform == null ? point : Vec2D.transformMat2D(Vec2D(), point, transform); - var x = transformedPoint[0]; - var y = transformedPoint[1]; + expandToPoint(transformedPoint); + return transformedPoint; + } + + void expandToPoint(Vec2D point) { + var x = point[0]; + var y = point[1]; if (x < _buffer[0]) { _buffer[0] = x; } @@ -62,7 +67,6 @@ class AABB { if (y > _buffer[3]) { _buffer[3] = y; } - return transformedPoint; } AABB.fromMinMax(Vec2D min, Vec2D max) { diff --git a/lib/src/rive_core/node.dart b/lib/src/rive_core/node.dart index 4460500..8a1711c 100644 --- a/lib/src/rive_core/node.dart +++ b/lib/src/rive_core/node.dart @@ -1,98 +1,14 @@ -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'; -import 'package:meta/meta.dart'; export 'package:rive/src/generated/node_base.dart'; class Node extends NodeBase { - final Mat2D transform = Mat2D(); - final Mat2D worldTransform = Mat2D(); - double _renderOpacity = 0; - double get renderOpacity => _renderOpacity; - @override - void update(int dirt) { - if (dirt & ComponentDirt.transform != 0) { - updateTransform(); - } - if (dirt & ComponentDirt.worldTransform != 0) { - updateWorldTransform(); - } - } - - Vec2D get translation => Vec2D.fromValues(x, y); - Vec2D get worldTranslation => - Vec2D.fromValues(worldTransform[4], worldTransform[5]); set translation(Vec2D pos) { x = pos[0]; y = pos[1]; } - Vec2D get scale => Vec2D.fromValues(scaleX, scaleY); - set scale(Vec2D value) { - scaleX = value[0]; - scaleY = value[1]; - } - - void updateTransform() { - if (rotation != 0) { - Mat2D.fromRotation(transform, rotation); - } else { - Mat2D.identity(transform); - } - transform[4] = x; - transform[5] = y; - Mat2D.scaleByValues(transform, scaleX, scaleY); - } - - double get childOpacity => _renderOpacity; - @mustCallSuper - void updateWorldTransform() { - _renderOpacity = opacity; - if (parent is Node) { - var parentNode = parent as Node; - _renderOpacity *= parentNode.childOpacity; - Mat2D.multiply(worldTransform, parentNode.worldTransform, transform); - } else { - Mat2D.copy(worldTransform, transform); - } - } - - void calculateWorldTransform() { - var parent = this.parent; - final chain = [this]; - while (parent != null) { - if (parent is Node) { - chain.insert(0, parent); - } - parent = parent.parent; - } - for (final item in chain) { - item.updateTransform(); - item.updateWorldTransform(); - } - } - - @override - void buildDependencies() { - super.buildDependencies(); - parent?.addDependent(this); - } - - void markTransformDirty() { - if (!addDirt(ComponentDirt.transform)) { - return; - } - markWorldTransformDirty(); - } - - void markWorldTransformDirty() { - addDirt(ComponentDirt.worldTransform, recurse: true); - } - @override void xChanged(double from, double to) { markTransformDirty(); @@ -103,31 +19,5 @@ class Node extends NodeBase { markTransformDirty(); } - @override - void rotationChanged(double from, double to) { - markTransformDirty(); - } - - @override - void scaleXChanged(double from, double to) { - markTransformDirty(); - } - - @override - void scaleYChanged(double from, double to) { - markTransformDirty(); - } - - @override - void opacityChanged(double from, double to) { - markTransformDirty(); - } - - @override - void parentChanged(ContainerComponent from, ContainerComponent to) { - super.parentChanged(from, to); - markWorldTransformDirty(); - } - AABB get localBounds => AABB.fromValues(x, y, x, y); } diff --git a/lib/src/rive_core/runtime/runtime_header.dart b/lib/src/rive_core/runtime/runtime_header.dart index 00ce8ee..30f1e52 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 = 3; + static const int majorVersion = 4; static const int minorVersion = 0; static const String fingerprint = 'RIVE'; final int ownerId; diff --git a/lib/src/rive_core/transform_component.dart b/lib/src/rive_core/transform_component.dart new file mode 100644 index 0000000..63dd4da --- /dev/null +++ b/lib/src/rive_core/transform_component.dart @@ -0,0 +1,118 @@ +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/mat2d.dart'; +import 'package:rive/src/rive_core/math/vec2d.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; +export 'package:rive/src/generated/transform_component_base.dart'; + +abstract class TransformComponent extends TransformComponentBase { + double _renderOpacity = 0; + double get renderOpacity => _renderOpacity; + final Mat2D worldTransform = Mat2D(); + final Mat2D transform = Mat2D(); + Vec2D get translation => Vec2D.fromValues(x, y); + Vec2D get worldTranslation => + Vec2D.fromValues(worldTransform[4], worldTransform[5]); + double get x; + double get y; + set x(double value); + set y(double value); + @override + void update(int dirt) { + if (dirt & ComponentDirt.transform != 0) { + updateTransform(); + } + if (dirt & ComponentDirt.worldTransform != 0) { + updateWorldTransform(); + } + } + + void updateTransform() { + if (rotation != 0) { + Mat2D.fromRotation(transform, rotation); + } else { + Mat2D.identity(transform); + } + transform[4] = x; + transform[5] = y; + Mat2D.scaleByValues(transform, scaleX, scaleY); + } + + double get childOpacity => _renderOpacity; + Vec2D get scale => Vec2D.fromValues(scaleX, scaleY); + set scale(Vec2D value) { + scaleX = value[0]; + scaleY = value[1]; + } + + @mustCallSuper + void updateWorldTransform() { + _renderOpacity = opacity; + if (parent is TransformComponent) { + var parentNode = parent as TransformComponent; + _renderOpacity *= parentNode.childOpacity; + Mat2D.multiply(worldTransform, parentNode.worldTransform, transform); + } else { + Mat2D.copy(worldTransform, transform); + } + } + + void calculateWorldTransform() { + var parent = this.parent; + final chain = [this]; + while (parent != null) { + if (parent is TransformComponent) { + chain.insert(0, parent); + } + parent = parent.parent; + } + for (final item in chain) { + item.updateTransform(); + item.updateWorldTransform(); + } + } + + @override + void buildDependencies() { + super.buildDependencies(); + parent?.addDependent(this); + } + + void markTransformDirty() { + if (!addDirt(ComponentDirt.transform)) { + return; + } + markWorldTransformDirty(); + } + + void markWorldTransformDirty() { + addDirt(ComponentDirt.worldTransform, recurse: true); + } + + @override + void rotationChanged(double from, double to) { + markTransformDirty(); + } + + @override + void scaleXChanged(double from, double to) { + markTransformDirty(); + } + + @override + void scaleYChanged(double from, double to) { + markTransformDirty(); + } + + @override + void opacityChanged(double from, double to) { + markTransformDirty(); + } + + @override + void parentChanged(ContainerComponent from, ContainerComponent to) { + super.parentChanged(from, to); + markWorldTransformDirty(); + } +} diff --git a/lib/src/utilities/binary_buffer/binary_reader.dart b/lib/src/utilities/binary_buffer/binary_reader.dart index a583f62..e3fc826 100644 --- a/lib/src/utilities/binary_buffer/binary_reader.dart +++ b/lib/src/utilities/binary_buffer/binary_reader.dart @@ -6,8 +6,12 @@ var _utf8Decoder = const Utf8Decoder(); class BinaryReader { final ByteData buffer; final Endian endian; - int _readIndex = 0; - int get position => _readIndex; + + /// TODO: remove setter for readIndex when we remove _readVarInt from + /// core_double_type.dart + int readIndex = 0; + + int get position => readIndex; BinaryReader(this.buffer, {this.endian = Endian.little}); @@ -15,65 +19,65 @@ class BinaryReader { : buffer = ByteData.view(list.buffer, list.offsetInBytes, list.lengthInBytes); - bool get isEOF => _readIndex >= buffer.lengthInBytes; + bool get isEOF => readIndex >= buffer.lengthInBytes; double readFloat32() { - double value = buffer.getFloat32(_readIndex, endian); - _readIndex += 4; + double value = buffer.getFloat32(readIndex, endian); + readIndex += 4; return value; } double readFloat64() { - double value = buffer.getFloat64(_readIndex, endian); - _readIndex += 8; + double value = buffer.getFloat64(readIndex, endian); + readIndex += 8; return value; } int readInt8() { - int value = buffer.getInt8(_readIndex); - _readIndex += 1; + int value = buffer.getInt8(readIndex); + readIndex += 1; return value; } int readUint8() { - int value = buffer.getUint8(_readIndex); - _readIndex += 1; + int value = buffer.getUint8(readIndex); + readIndex += 1; return value; } int readInt16() { - int value = buffer.getInt16(_readIndex, endian); - _readIndex += 2; + int value = buffer.getInt16(readIndex, endian); + readIndex += 2; return value; } int readUint16() { - int value = buffer.getUint16(_readIndex, endian); - _readIndex += 2; + int value = buffer.getUint16(readIndex, endian); + readIndex += 2; return value; } int readInt32() { - int value = buffer.getInt32(_readIndex, endian); - _readIndex += 4; + int value = buffer.getInt32(readIndex, endian); + readIndex += 4; return value; } int readUint32() { - int value = buffer.getUint32(_readIndex, endian); - _readIndex += 4; + int value = buffer.getUint32(readIndex, endian); + readIndex += 4; return value; } int readInt64() { - int value = buffer.getInt64(_readIndex, endian); - _readIndex += 8; + int value = buffer.getInt64(readIndex, endian); + readIndex += 8; return value; } int readUint64() { - int value = buffer.getUint64(_readIndex, endian); - _readIndex += 8; + int value = buffer.getUint64(readIndex, endian); + readIndex += 8; return value; } @@ -83,7 +87,7 @@ class BinaryReader { int result = 0; int shift = 0; while (true) { - int byte = buffer.getUint8(_readIndex++) & 0xff; + int byte = buffer.getUint8(readIndex++) & 0xff; result |= (byte & 0x7f) << shift; if ((byte & 0x80) == 0) break; shift += 7; @@ -97,15 +101,15 @@ class BinaryReader { 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; + buffer.buffer, buffer.offsetInBytes + readIndex, length)); + readIndex += length; return value; } Uint8List read(int length, [bool allocNew = false]) { - var view = Uint8List.view( - buffer.buffer, buffer.offsetInBytes + _readIndex, length); - _readIndex += length; + var view = + Uint8List.view(buffer.buffer, buffer.offsetInBytes + readIndex, length); + readIndex += length; return allocNew ? Uint8List.fromList(view) : view; } } diff --git a/lib/src/utilities/tops.dart b/lib/src/utilities/tops.dart index 5c2e617..44094be 100644 --- a/lib/src/utilities/tops.dart +++ b/lib/src/utilities/tops.dart @@ -17,3 +17,12 @@ Set tops>(Iterable parentables) { } return tips; } + +bool isChildOf>(T child, Iterable parents) { + for (var parent = child; parent != null; parent = parent.parent) { + if (parents.contains(parent)) { + return true; + } + } + return false; +}