diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index 8635b7c..afc3610 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -5,6 +5,7 @@ import 'package:rive/src/rive_core/runtime/exceptions/rive_format_error_exceptio export 'package:rive/src/animation_list.dart'; export 'package:rive/src/state_machine_components.dart'; export 'package:rive/src/state_transition_conditions.dart'; +export 'package:rive/src/state_transitions.dart'; export 'package:rive/src/container_children.dart'; export 'package:rive/src/runtime_artboard.dart'; export 'package:rive/src/generated/rive_core_context.dart'; diff --git a/lib/src/rive_core/animation/layer_state.dart b/lib/src/rive_core/animation/layer_state.dart index 324c175..9dfece1 100644 --- a/lib/src/rive_core/animation/layer_state.dart +++ b/lib/src/rive_core/animation/layer_state.dart @@ -5,8 +5,8 @@ import 'package:rive/src/generated/animation/layer_state_base.dart'; export 'package:rive/src/generated/animation/layer_state_base.dart'; abstract class LayerState extends LayerStateBase { - final Set _transitions = {}; - Iterable get transitions => _transitions; + final StateTransitions _transitions = StateTransitions(); + StateTransitions get transitions => _transitions; @override void onAdded() {} @override diff --git a/lib/src/rive_core/animation/transition_trigger_condition.dart b/lib/src/rive_core/animation/transition_trigger_condition.dart index 796cb43..670c29a 100644 --- a/lib/src/rive_core/animation/transition_trigger_condition.dart +++ b/lib/src/rive_core/animation/transition_trigger_condition.dart @@ -18,7 +18,6 @@ class TransitionTriggerCondition extends TransitionTriggerConditionBase { } var triggerInput = input as StateMachineTrigger; if (triggerInput.triggered) { - triggerInput.reset(); return true; } return false; diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 7a38896..b395739 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -1,5 +1,6 @@ import 'dart:collection'; import 'package:rive/src/core/core.dart'; +import 'package:flutter/foundation.dart'; import 'package:rive/src/rive_core/animation/animation_state.dart'; import 'package:rive/src/rive_core/animation/layer_state.dart'; import 'package:rive/src/rive_core/animation/linear_animation_instance.dart'; @@ -32,8 +33,8 @@ class LayerController { _changeState(null); } - bool apply(CoreContext core, double elapsedSeconds, - HashMap inputValues) { + bool apply(StateMachineController machineController, CoreContext core, + double elapsedSeconds, HashMap inputValues) { if (_animationInstance != null) { _animationInstance!.advance(elapsedSeconds); } @@ -53,6 +54,7 @@ class LayerController { } for (int i = 0; updateState(inputValues); i++) { if (i == 100) { + machineController.advanceInputs(); print('StateMachineController.apply exceeded max iterations.'); return false; } @@ -167,11 +169,13 @@ class StateMachineController extends RiveAnimationController { super.dispose(); } + @protected + void advanceInputs() {} @override void apply(CoreContext core, double elapsedSeconds) { bool keepGoing = false; for (final layerController in layerControllers) { - if (layerController.apply(core, elapsedSeconds, inputValues)) { + if (layerController.apply(this, core, elapsedSeconds, inputValues)) { keepGoing = true; } } diff --git a/lib/src/state_machine_controller.dart b/lib/src/state_machine_controller.dart index 13aa852..65ce821 100644 --- a/lib/src/state_machine_controller.dart +++ b/lib/src/state_machine_controller.dart @@ -167,4 +167,11 @@ class StateMachineController extends core.StateMachineController { input.advance(); } } + + @override + void advanceInputs() { + for (final input in _inputs) { + input.advance(); + } + } } diff --git a/lib/src/state_transitions.dart b/lib/src/state_transitions.dart new file mode 100644 index 0000000..006203f --- /dev/null +++ b/lib/src/state_transitions.dart @@ -0,0 +1,19 @@ +import 'dart:collection'; +import 'package:rive/src/rive_core/animation/state_transition.dart'; + +class StateTransitions extends ListBase { + final List _values = []; + List get values => _values.cast(); + + @override + int get length => _values.length; + + @override + set length(int value) => _values.length = value; + + @override + StateTransition operator [](int index) => _values[index]!; + + @override + void operator []=(int index, StateTransition value) => _values[index] = value; +}