Adding support for align listener action.

This commit is contained in:
Luigi Rosso
2022-06-18 15:59:20 -07:00
committed by Luigi Rosso
parent 9146fc0482
commit 7289978fa9
20 changed files with 220 additions and 70 deletions

View File

@ -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';

View File

@ -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);
}
}

View File

@ -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};
}

View File

@ -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;
}
}

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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.

View File

@ -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
};
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -1,3 +1,5 @@
abstract class Interpolator {
int get id;

View File

@ -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);
}
}

View File

@ -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) {}
}

View File

@ -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);

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}
}
}

View File

@ -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,