From 7289978fa99601b006b2b54d41ad486522119e5d Mon Sep 17 00:00:00 2001 From: Luigi Rosso <luigi.rosso@gmail.com> Date: Sat, 18 Jun 2022 15:59:20 -0700 Subject: [PATCH] Adding support for align listener action. --- lib/src/core/core.dart | 2 +- .../state_machine_listener_importer.dart | 13 +++--- .../animation/listener_action_base.dart | 13 ++++++ .../animation/listener_align_target_base.dart | 45 +++++++++++++++++++ .../animation/listener_bool_change_base.dart | 8 +++- .../animation/listener_input_change_base.dart | 8 ++-- .../listener_number_change_base.dart | 8 +++- .../listener_trigger_change_base.dart | 8 +++- lib/src/generated/rive_core_context.dart | 16 +++++++ lib/src/input_changes.dart | 21 --------- lib/src/listener_actions.dart | 20 +++++++++ lib/src/rive_core/animation/interpolator.dart | 2 + .../rive_core/animation/listener_action.dart | 30 +++++++++++++ .../animation/listener_align_target.dart | 31 +++++++++++++ .../animation/listener_bool_change.dart | 3 +- .../animation/listener_input_change.dart | 14 +----- .../animation/listener_number_change.dart | 3 +- .../animation/listener_trigger_change.dart | 3 +- .../animation/state_machine_listener.dart | 27 +++++------ .../rive_core/state_machine_controller.dart | 15 +++++-- 20 files changed, 220 insertions(+), 70 deletions(-) create mode 100644 lib/src/generated/animation/listener_action_base.dart create mode 100644 lib/src/generated/animation/listener_align_target_base.dart delete mode 100644 lib/src/input_changes.dart create mode 100644 lib/src/listener_actions.dart create mode 100644 lib/src/rive_core/animation/listener_action.dart create mode 100644 lib/src/rive_core/animation/listener_align_target.dart diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index b10505c..f34d43b 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -23,7 +23,7 @@ export 'package:rive/src/core/importers/state_machine_layer_importer.dart'; export 'package:rive/src/core/importers/state_machine_listener_importer.dart'; export 'package:rive/src/core/importers/state_transition_importer.dart'; export 'package:rive/src/generated/rive_core_context.dart'; -export 'package:rive/src/input_changes.dart'; +export 'package:rive/src/listener_actions.dart'; export 'package:rive/src/runtime_artboard.dart'; export 'package:rive/src/state_machine_components.dart'; export 'package:rive/src/state_transition_conditions.dart'; diff --git a/lib/src/core/importers/state_machine_listener_importer.dart b/lib/src/core/importers/state_machine_listener_importer.dart index 388a52f..0c8ce9d 100644 --- a/lib/src/core/importers/state_machine_listener_importer.dart +++ b/lib/src/core/importers/state_machine_listener_importer.dart @@ -1,14 +1,13 @@ import 'package:rive/src/core/importers/artboard_import_stack_object.dart'; -import 'package:rive/src/rive_core/animation/listener_input_change.dart'; +import 'package:rive/src/rive_core/animation/listener_action.dart'; import 'package:rive/src/rive_core/animation/state_machine_listener.dart'; class StateMachineListenerImporter extends ArtboardImportStackObject { - final StateMachineListener event; - StateMachineListenerImporter(this.event); + final StateMachineListener listener; + StateMachineListenerImporter(this.listener); - void addInputChange(ListenerInputChange change) { - // Other state machine importers do this, do we really need it? - // event.context.addObject(change); - event.internalAddInputChange(change); + void addAction(ListenerAction change) { + // listener.context.addObject(change); + listener.internalAddAction(change); } } diff --git a/lib/src/generated/animation/listener_action_base.dart b/lib/src/generated/animation/listener_action_base.dart new file mode 100644 index 0000000..2311b10 --- /dev/null +++ b/lib/src/generated/animation/listener_action_base.dart @@ -0,0 +1,13 @@ +/// Core automatically generated +/// lib/src/generated/animation/listener_action_base.dart. +/// Do not modify manually. + +import 'package:rive/src/core/core.dart'; + +abstract class ListenerActionBase<T extends CoreContext> extends Core<T> { + static const int typeKey = 125; + @override + int get coreType => ListenerActionBase.typeKey; + @override + Set<int> get coreTypes => {ListenerActionBase.typeKey}; +} diff --git a/lib/src/generated/animation/listener_align_target_base.dart b/lib/src/generated/animation/listener_align_target_base.dart new file mode 100644 index 0000000..5243d13 --- /dev/null +++ b/lib/src/generated/animation/listener_align_target_base.dart @@ -0,0 +1,45 @@ +/// Core automatically generated +/// lib/src/generated/animation/listener_align_target_base.dart. +/// Do not modify manually. + +import 'package:rive/src/rive_core/animation/listener_action.dart'; + +abstract class ListenerAlignTargetBase extends ListenerAction { + static const int typeKey = 126; + @override + int get coreType => ListenerAlignTargetBase.typeKey; + @override + Set<int> get coreTypes => + {ListenerAlignTargetBase.typeKey, ListenerActionBase.typeKey}; + + /// -------------------------------------------------------------------------- + /// TargetId field with key 240. + static const int targetIdInitialValue = 0; + int _targetId = targetIdInitialValue; + static const int targetIdPropertyKey = 240; + + /// Identifier used to track the object use as a target fo this listener + /// action. + int get targetId => _targetId; + + /// Change the [_targetId] field value. + /// [targetIdChanged] will be invoked only if the field's value has changed. + set targetId(int value) { + if (_targetId == value) { + return; + } + int from = _targetId; + _targetId = value; + if (hasValidated) { + targetIdChanged(from, value); + } + } + + void targetIdChanged(int from, int to); + + @override + void copy(covariant ListenerAlignTargetBase source) { + super.copy(source); + _targetId = source._targetId; + } +} diff --git a/lib/src/generated/animation/listener_bool_change_base.dart b/lib/src/generated/animation/listener_bool_change_base.dart index a6103dd..8a95f53 100644 --- a/lib/src/generated/animation/listener_bool_change_base.dart +++ b/lib/src/generated/animation/listener_bool_change_base.dart @@ -2,6 +2,7 @@ /// lib/src/generated/animation/listener_bool_change_base.dart. /// Do not modify manually. +import 'package:rive/src/generated/animation/listener_action_base.dart'; import 'package:rive/src/rive_core/animation/listener_input_change.dart'; abstract class ListenerBoolChangeBase extends ListenerInputChange { @@ -9,8 +10,11 @@ abstract class ListenerBoolChangeBase extends ListenerInputChange { @override int get coreType => ListenerBoolChangeBase.typeKey; @override - Set<int> get coreTypes => - {ListenerBoolChangeBase.typeKey, ListenerInputChangeBase.typeKey}; + Set<int> get coreTypes => { + ListenerBoolChangeBase.typeKey, + ListenerInputChangeBase.typeKey, + ListenerActionBase.typeKey + }; /// -------------------------------------------------------------------------- /// Value field with key 228. diff --git a/lib/src/generated/animation/listener_input_change_base.dart b/lib/src/generated/animation/listener_input_change_base.dart index 41efba5..82a7b20 100644 --- a/lib/src/generated/animation/listener_input_change_base.dart +++ b/lib/src/generated/animation/listener_input_change_base.dart @@ -2,14 +2,15 @@ /// lib/src/generated/animation/listener_input_change_base.dart. /// Do not modify manually. -import 'package:rive/src/core/core.dart'; +import 'package:rive/src/rive_core/animation/listener_action.dart'; -abstract class ListenerInputChangeBase<T extends CoreContext> extends Core<T> { +abstract class ListenerInputChangeBase extends ListenerAction { static const int typeKey = 116; @override int get coreType => ListenerInputChangeBase.typeKey; @override - Set<int> get coreTypes => {ListenerInputChangeBase.typeKey}; + Set<int> get coreTypes => + {ListenerInputChangeBase.typeKey, ListenerActionBase.typeKey}; /// -------------------------------------------------------------------------- /// InputId field with key 227. @@ -37,6 +38,7 @@ abstract class ListenerInputChangeBase<T extends CoreContext> extends Core<T> { @override void copy(covariant ListenerInputChangeBase source) { + super.copy(source); _inputId = source._inputId; } } diff --git a/lib/src/generated/animation/listener_number_change_base.dart b/lib/src/generated/animation/listener_number_change_base.dart index da53ed2..988f8f7 100644 --- a/lib/src/generated/animation/listener_number_change_base.dart +++ b/lib/src/generated/animation/listener_number_change_base.dart @@ -2,6 +2,7 @@ /// lib/src/generated/animation/listener_number_change_base.dart. /// Do not modify manually. +import 'package:rive/src/generated/animation/listener_action_base.dart'; import 'package:rive/src/rive_core/animation/listener_input_change.dart'; abstract class ListenerNumberChangeBase extends ListenerInputChange { @@ -9,8 +10,11 @@ abstract class ListenerNumberChangeBase extends ListenerInputChange { @override int get coreType => ListenerNumberChangeBase.typeKey; @override - Set<int> get coreTypes => - {ListenerNumberChangeBase.typeKey, ListenerInputChangeBase.typeKey}; + Set<int> get coreTypes => { + ListenerNumberChangeBase.typeKey, + ListenerInputChangeBase.typeKey, + ListenerActionBase.typeKey + }; /// -------------------------------------------------------------------------- /// Value field with key 229. diff --git a/lib/src/generated/animation/listener_trigger_change_base.dart b/lib/src/generated/animation/listener_trigger_change_base.dart index a347e7b..686dbcf 100644 --- a/lib/src/generated/animation/listener_trigger_change_base.dart +++ b/lib/src/generated/animation/listener_trigger_change_base.dart @@ -2,6 +2,7 @@ /// lib/src/generated/animation/listener_trigger_change_base.dart. /// Do not modify manually. +import 'package:rive/src/generated/animation/listener_action_base.dart'; import 'package:rive/src/rive_core/animation/listener_input_change.dart'; abstract class ListenerTriggerChangeBase extends ListenerInputChange { @@ -9,6 +10,9 @@ abstract class ListenerTriggerChangeBase extends ListenerInputChange { @override int get coreType => ListenerTriggerChangeBase.typeKey; @override - Set<int> get coreTypes => - {ListenerTriggerChangeBase.typeKey, ListenerInputChangeBase.typeKey}; + Set<int> get coreTypes => { + ListenerTriggerChangeBase.typeKey, + ListenerInputChangeBase.typeKey, + ListenerActionBase.typeKey + }; } diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index 9d2eb18..32f32d5 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -50,6 +50,7 @@ import 'package:rive/src/rive_core/animation/keyframe_color.dart'; import 'package:rive/src/rive_core/animation/keyframe_double.dart'; import 'package:rive/src/rive_core/animation/keyframe_id.dart'; import 'package:rive/src/rive_core/animation/linear_animation.dart'; +import 'package:rive/src/rive_core/animation/listener_align_target.dart'; import 'package:rive/src/rive_core/animation/listener_bool_change.dart'; import 'package:rive/src/rive_core/animation/listener_number_change.dart'; import 'package:rive/src/rive_core/animation/listener_trigger_change.dart'; @@ -164,6 +165,8 @@ class RiveCoreContext { return KeyFrameBool(); case ListenerBoolChangeBase.typeKey: return ListenerBoolChange(); + case ListenerAlignTargetBase.typeKey: + return ListenerAlignTarget(); case TransitionNumberConditionBase.typeKey: return TransitionNumberCondition(); case AnyStateBase.typeKey: @@ -612,6 +615,11 @@ class RiveCoreContext { object.value = value; } break; + case ListenerAlignTargetBase.targetIdPropertyKey: + if (object is ListenerAlignTargetBase && value is int) { + object.targetId = value; + } + break; case TransitionValueConditionBase.opValuePropertyKey: if (object is TransitionValueConditionBase && value is int) { object.opValue = value; @@ -1196,6 +1204,7 @@ class RiveCoreContext { case KeyFrameBase.interpolatorIdPropertyKey: case KeyFrameIdBase.valuePropertyKey: case ListenerBoolChangeBase.valuePropertyKey: + case ListenerAlignTargetBase.targetIdPropertyKey: case TransitionValueConditionBase.opValuePropertyKey: case StateTransitionBase.stateToIdPropertyKey: case StateTransitionBase.flagsPropertyKey: @@ -1423,6 +1432,8 @@ class RiveCoreContext { return (object as KeyFrameIdBase).value; case ListenerBoolChangeBase.valuePropertyKey: return (object as ListenerBoolChangeBase).value; + case ListenerAlignTargetBase.targetIdPropertyKey: + return (object as ListenerAlignTargetBase).targetId; case TransitionValueConditionBase.opValuePropertyKey: return (object as TransitionValueConditionBase).opValue; case StateTransitionBase.stateToIdPropertyKey: @@ -1913,6 +1924,11 @@ class RiveCoreContext { object.value = value; } break; + case ListenerAlignTargetBase.targetIdPropertyKey: + if (object is ListenerAlignTargetBase) { + object.targetId = value; + } + break; case TransitionValueConditionBase.opValuePropertyKey: if (object is TransitionValueConditionBase) { object.opValue = value; diff --git a/lib/src/input_changes.dart b/lib/src/input_changes.dart deleted file mode 100644 index 525f2e9..0000000 --- a/lib/src/input_changes.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'dart:collection'; - -import 'package:rive/src/rive_core/animation/listener_input_change.dart'; - -class InputChanges extends ListBase<ListenerInputChange> { - final List<ListenerInputChange?> _values = []; - List<ListenerInputChange> get values => _values.cast<ListenerInputChange>(); - - @override - int get length => _values.length; - - @override - set length(int value) => _values.length = value; - - @override - ListenerInputChange operator [](int index) => _values[index]!; - - @override - void operator []=(int index, ListenerInputChange value) => - _values[index] = value; -} diff --git a/lib/src/listener_actions.dart b/lib/src/listener_actions.dart new file mode 100644 index 0000000..eb4ec55 --- /dev/null +++ b/lib/src/listener_actions.dart @@ -0,0 +1,20 @@ +import 'dart:collection'; + +import 'package:rive/src/rive_core/animation/listener_action.dart'; + +class ListenerActions extends ListBase<ListenerAction> { + final List<ListenerAction?> _values = []; + List<ListenerAction> get values => _values.cast<ListenerAction>(); + + @override + int get length => _values.length; + + @override + set length(int value) => _values.length = value; + + @override + ListenerAction operator [](int index) => _values[index]!; + + @override + void operator []=(int index, ListenerAction value) => _values[index] = value; +} diff --git a/lib/src/rive_core/animation/interpolator.dart b/lib/src/rive_core/animation/interpolator.dart index 8526b5b..94a09e6 100644 --- a/lib/src/rive_core/animation/interpolator.dart +++ b/lib/src/rive_core/animation/interpolator.dart @@ -1,3 +1,5 @@ + + abstract class Interpolator { int get id; diff --git a/lib/src/rive_core/animation/listener_action.dart b/lib/src/rive_core/animation/listener_action.dart new file mode 100644 index 0000000..b015b78 --- /dev/null +++ b/lib/src/rive_core/animation/listener_action.dart @@ -0,0 +1,30 @@ +import 'package:rive/src/core/core.dart'; +import 'package:rive/src/generated/animation/listener_action_base.dart'; +import 'package:rive/src/rive_core/animation/state_machine_listener.dart'; +import 'package:rive/src/rive_core/math/vec2d.dart'; +import 'package:rive/src/rive_core/state_machine_controller.dart'; + +export 'package:rive/src/generated/animation/listener_action_base.dart'; + +abstract class ListenerAction extends ListenerActionBase { + @override + void onAdded() {} + + @override + void onAddedDirty() {} + + /// Perform the action. + void perform(StateMachineController controller, Vec2D position); + + @override + bool import(ImportStack importStack) { + var importer = importStack + .latest<StateMachineListenerImporter>(StateMachineListenerBase.typeKey); + if (importer == null) { + return false; + } + importer.addAction(this); + + return super.import(importStack); + } +} diff --git a/lib/src/rive_core/animation/listener_align_target.dart b/lib/src/rive_core/animation/listener_align_target.dart new file mode 100644 index 0000000..3917199 --- /dev/null +++ b/lib/src/rive_core/animation/listener_align_target.dart @@ -0,0 +1,31 @@ +import 'package:rive/src/generated/animation/listener_align_target_base.dart'; +import 'package:rive/src/rive_core/constraints/constraint.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/node.dart'; +import 'package:rive/src/rive_core/state_machine_controller.dart'; + +export 'package:rive/src/generated/animation/listener_align_target_base.dart'; + +class ListenerAlignTarget extends ListenerAlignTargetBase { + @override + void perform(StateMachineController controller, Vec2D position) { + Node? target = controller.core.resolve(targetId); + + if (target == null) { + return; + } + var targetParentWorld = parentWorld(target); + var inverse = Mat2D(); + if (!Mat2D.invert(inverse, targetParentWorld)) { + return; + } + + var localPosition = inverse * position; + target.x = localPosition.x; + target.y = localPosition.y; + } + + @override + void targetIdChanged(int from, int to) {} +} diff --git a/lib/src/rive_core/animation/listener_bool_change.dart b/lib/src/rive_core/animation/listener_bool_change.dart index c6abcdc..e9681ab 100644 --- a/lib/src/rive_core/animation/listener_bool_change.dart +++ b/lib/src/rive_core/animation/listener_bool_change.dart @@ -1,4 +1,5 @@ import 'package:rive/src/generated/animation/listener_bool_change_base.dart'; +import 'package:rive/src/rive_core/math/vec2d.dart'; import 'package:rive/src/rive_core/state_machine_controller.dart'; export 'package:rive/src/generated/animation/listener_bool_change_base.dart'; @@ -8,7 +9,7 @@ class ListenerBoolChange extends ListenerBoolChangeBase { void valueChanged(int from, int to) {} @override - void perform(StateMachineController controller) { + void perform(StateMachineController controller, Vec2D position) { switch (value) { case 0: controller.setInputValue(inputId, false); diff --git a/lib/src/rive_core/animation/listener_input_change.dart b/lib/src/rive_core/animation/listener_input_change.dart index 0cc82c2..b331afa 100644 --- a/lib/src/rive_core/animation/listener_input_change.dart +++ b/lib/src/rive_core/animation/listener_input_change.dart @@ -2,8 +2,6 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/listener_input_change_base.dart'; import 'package:rive/src/rive_core/animation/state_machine.dart'; import 'package:rive/src/rive_core/animation/state_machine_input.dart'; -import 'package:rive/src/rive_core/animation/state_machine_listener.dart'; -import 'package:rive/src/rive_core/state_machine_controller.dart'; export 'package:rive/src/generated/animation/listener_input_change_base.dart'; @@ -25,25 +23,17 @@ abstract class ListenerInputChange extends ListenerInputChangeBase { input = context.resolveWithDefault(to, StateMachineInput.unknown); } - @override - void onAdded() {} - @override void onAddedDirty() { + super.onAddedDirty(); input = context.resolveWithDefault(inputId, StateMachineInput.unknown); } - /// Make the change to the input values. - void perform(StateMachineController controller); - @override bool import(ImportStack importStack) { - var importer = importStack - .latest<StateMachineListenerImporter>(StateMachineListenerBase.typeKey); - if (importer == null) { + if (!super.import(importStack)) { return false; } - importer.addInputChange(this); var stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachineBase.typeKey); diff --git a/lib/src/rive_core/animation/listener_number_change.dart b/lib/src/rive_core/animation/listener_number_change.dart index 0709d58..5bb9709 100644 --- a/lib/src/rive_core/animation/listener_number_change.dart +++ b/lib/src/rive_core/animation/listener_number_change.dart @@ -1,4 +1,5 @@ import 'package:rive/src/generated/animation/listener_number_change_base.dart'; +import 'package:rive/src/rive_core/math/vec2d.dart'; import 'package:rive/src/rive_core/state_machine_controller.dart'; export 'package:rive/src/generated/animation/listener_number_change_base.dart'; @@ -8,6 +9,6 @@ class ListenerNumberChange extends ListenerNumberChangeBase { void valueChanged(double from, double to) {} @override - void perform(StateMachineController controller) => + void perform(StateMachineController controller, Vec2D position) => controller.setInputValue(inputId, value); } diff --git a/lib/src/rive_core/animation/listener_trigger_change.dart b/lib/src/rive_core/animation/listener_trigger_change.dart index 3619b45..e43174f 100644 --- a/lib/src/rive_core/animation/listener_trigger_change.dart +++ b/lib/src/rive_core/animation/listener_trigger_change.dart @@ -1,10 +1,11 @@ import 'package:rive/src/generated/animation/listener_trigger_change_base.dart'; +import 'package:rive/src/rive_core/math/vec2d.dart'; import 'package:rive/src/rive_core/state_machine_controller.dart'; export 'package:rive/src/generated/animation/listener_trigger_change_base.dart'; class ListenerTriggerChange extends ListenerTriggerChangeBase { @override - void perform(StateMachineController controller) => + void perform(StateMachineController controller, Vec2D position) => controller.setInputValue(inputId, true); } diff --git a/lib/src/rive_core/animation/state_machine_listener.dart b/lib/src/rive_core/animation/state_machine_listener.dart index fa0dc6d..6561370 100644 --- a/lib/src/rive_core/animation/state_machine_listener.dart +++ b/lib/src/rive_core/animation/state_machine_listener.dart @@ -2,18 +2,19 @@ import 'dart:collection'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/state_machine_listener_base.dart'; -import 'package:rive/src/rive_core/animation/listener_input_change.dart'; +import 'package:rive/src/rive_core/animation/listener_action.dart'; import 'package:rive/src/rive_core/animation/state_machine.dart'; import 'package:rive/src/rive_core/animation/state_machine_component.dart'; +import 'package:rive/src/rive_core/math/vec2d.dart'; import 'package:rive/src/rive_core/node.dart'; import 'package:rive/src/rive_core/state_machine_controller.dart'; export 'package:rive/src/generated/animation/state_machine_listener_base.dart'; -enum ListenerType { enter, exit, down, up } +enum ListenerType { enter, exit, down, up, move } class StateMachineListener extends StateMachineListenerBase { - final InputChanges inputChanges = InputChanges(); + final ListenerActions actions = ListenerActions(); Node? _target; Node? get target => _target; @@ -43,28 +44,28 @@ class StateMachineListener extends StateMachineListenerBase { @override void targetIdChanged(int from, int to) => target = context.resolve(to); - /// Called by rive_core to add an [ListenerInputChange] to this + /// Called by rive_core to add an [ListenerAction] to this /// [StateMachineListener]. This should be @internal when it's supported. - bool internalAddInputChange(ListenerInputChange change) { - if (inputChanges.contains(change)) { + bool internalAddAction(ListenerAction action) { + if (actions.contains(action)) { return false; } - inputChanges.add(change); + actions.add(action); return true; } - /// Called by rive_core to remove an [ListenerInputChange] from this + /// Called by rive_core to remove an [ListenerAction] from this /// [StateMachineListener]. This should be @internal when it's supported. - bool internalRemoveInputChange(ListenerInputChange change) { - var removed = inputChanges.remove(change); + bool internalRemoveAction(ListenerAction action) { + var removed = actions.remove(action); return removed; } - void performChanges(StateMachineController controller) { - for (final change in inputChanges) { - change.perform(controller); + void performChanges(StateMachineController controller, Vec2D position) { + for (final action in actions) { + action.perform(controller, position); } } } diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 8ca242c..8098ada 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -254,8 +254,12 @@ class StateMachineController extends RiveAnimationController<CoreContext> { /// The artboard that this state machine controller is manipulating. Artboard? get artboard => _artboard; + late CoreContext core; + @override bool init(CoreContext core) { + this.core = core; + _clearLayerControllers(); for (final layer in stateMachine.layers) { @@ -391,15 +395,15 @@ class StateMachineController extends RiveAnimationController<CoreContext> { // we're trying to trigger. if (hoverChange) { if (isOver && event.listenerType == ListenerType.enter) { - event.performChanges(this); + event.performChanges(this, position); isActive = true; } else if (!isOver && event.listenerType == ListenerType.exit) { - event.performChanges(this); + event.performChanges(this, position); isActive = true; } } if (isOver && hitEvent == event.listenerType) { - event.performChanges(this); + event.performChanges(this, position); isActive = true; } } @@ -427,7 +431,10 @@ class StateMachineController extends RiveAnimationController<CoreContext> { } } - void pointerMove(Vec2D position) => _processEvent(position); + void pointerMove(Vec2D position) => _processEvent( + position, + hitEvent: ListenerType.move, + ); void pointerDown(Vec2D position) => _processEvent( position,