mirror of
https://github.com/rive-app/rive-flutter.git
synced 2025-06-28 02:37:16 +08:00
Adding importing of state machine with format 7.
This commit is contained in:
@ -11,6 +11,9 @@ export 'package:rive/src/core/importers/linear_animation_importer.dart';
|
|||||||
export 'package:rive/src/core/importers/keyed_object_importer.dart';
|
export 'package:rive/src/core/importers/keyed_object_importer.dart';
|
||||||
export 'package:rive/src/core/importers/keyed_property_importer.dart';
|
export 'package:rive/src/core/importers/keyed_property_importer.dart';
|
||||||
export 'package:rive/src/core/importers/state_machine_importer.dart';
|
export 'package:rive/src/core/importers/state_machine_importer.dart';
|
||||||
|
export 'package:rive/src/core/importers/state_machine_layer_importer.dart';
|
||||||
|
export 'package:rive/src/core/importers/layer_state_importer.dart';
|
||||||
|
export 'package:rive/src/core/importers/state_transition_importer.dart';
|
||||||
|
|
||||||
typedef PropertyChangeCallback = void Function(dynamic from, dynamic to);
|
typedef PropertyChangeCallback = void Function(dynamic from, dynamic to);
|
||||||
typedef BatchAddCallback = void Function();
|
typedef BatchAddCallback = void Function();
|
||||||
|
16
lib/src/core/importers/layer_state_importer.dart
Normal file
16
lib/src/core/importers/layer_state_importer.dart
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import 'package:rive/src/core/core.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/layer_state.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/state_transition.dart';
|
||||||
|
|
||||||
|
class LayerStateImporter extends ImportStackObject {
|
||||||
|
final LayerState state;
|
||||||
|
LayerStateImporter(this.state);
|
||||||
|
|
||||||
|
void addTransition(StateTransition transition) {
|
||||||
|
state.context.addObject(transition);
|
||||||
|
transition.stateFrom = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void resolve() {}
|
||||||
|
}
|
38
lib/src/core/importers/state_machine_layer_importer.dart
Normal file
38
lib/src/core/importers/state_machine_layer_importer.dart
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import 'package:rive/src/core/core.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/layer_state.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/state_machine_layer.dart';
|
||||||
|
|
||||||
|
class StateMachineLayerImporter extends ImportStackObject {
|
||||||
|
final StateMachineLayer layer;
|
||||||
|
StateMachineLayerImporter(this.layer);
|
||||||
|
|
||||||
|
final List<LayerState> importedStates = [];
|
||||||
|
|
||||||
|
void addState(LayerState state) {
|
||||||
|
importedStates.add(state);
|
||||||
|
// Here the state gets assigned a core (artboard) id.
|
||||||
|
layer.context.addObject(state);
|
||||||
|
layer.internalAddState(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void resolve() {
|
||||||
|
for (final state in importedStates) {
|
||||||
|
for (final transition in state.transitions) {
|
||||||
|
// At import time the stateToId is an index relative to the entire layer
|
||||||
|
// (which state in this layer). We can use that to find the matching
|
||||||
|
// importedState and assign back the core id that will resolve after the
|
||||||
|
// entire artboard imports.
|
||||||
|
assert(transition.stateToId >= 0 &&
|
||||||
|
transition.stateToId < importedStates.length);
|
||||||
|
transition.stateToId = importedStates[transition.stateToId].id;
|
||||||
|
|
||||||
|
// As an alternative way to do this, in the future we could consider
|
||||||
|
// just short-circuiting the reference here. We're avoiding this for now
|
||||||
|
// to keep shared code between the editor and runtime more consistent.
|
||||||
|
|
||||||
|
// transition.stateTo = importedStates[transition.stateToId];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
lib/src/core/importers/state_transition_importer.dart
Normal file
15
lib/src/core/importers/state_transition_importer.dart
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import 'package:rive/src/core/core.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/state_transition.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/transition_condition.dart';
|
||||||
|
|
||||||
|
class StateTransitionImporter extends ImportStackObject {
|
||||||
|
final StateTransition transition;
|
||||||
|
StateTransitionImporter(this.transition);
|
||||||
|
|
||||||
|
void addCondition(TransitionCondition condition) {
|
||||||
|
transition.internalAddCondition(condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void resolve() {}
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
import 'package:rive/src/core/core.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/state_machine_layer.dart';
|
||||||
import 'package:rive/src/rive_core/animation/state_transition.dart';
|
import 'package:rive/src/rive_core/animation/state_transition.dart';
|
||||||
import 'package:rive/src/generated/animation/layer_state_base.dart';
|
import 'package:rive/src/generated/animation/layer_state_base.dart';
|
||||||
export 'package:rive/src/generated/animation/layer_state_base.dart';
|
export 'package:rive/src/generated/animation/layer_state_base.dart';
|
||||||
@ -23,4 +25,15 @@ abstract class LayerState extends LayerStateBase {
|
|||||||
void onRemoved() {
|
void onRemoved() {
|
||||||
super.onRemoved();
|
super.onRemoved();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool import(ImportStack stack) {
|
||||||
|
var importer =
|
||||||
|
stack.latest<StateMachineLayerImporter>(StateMachineLayerBase.typeKey);
|
||||||
|
if (importer == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
importer.addState(this);
|
||||||
|
return super.import(stack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
|
import 'package:rive/src/core/core.dart';
|
||||||
import 'package:rive/src/rive_core/animation/state_machine.dart';
|
import 'package:rive/src/rive_core/animation/state_machine.dart';
|
||||||
import 'package:rive/src/generated/animation/state_machine_component_base.dart';
|
import 'package:rive/src/generated/animation/state_machine_component_base.dart';
|
||||||
export 'package:rive/src/generated/animation/state_machine_component_base.dart';
|
export 'package:rive/src/generated/animation/state_machine_component_base.dart';
|
||||||
@ -38,4 +39,15 @@ abstract class StateMachineComponent extends StateMachineComponentBase {
|
|||||||
machineComponentList(stateMachine).remove(this);
|
machineComponentList(stateMachine).remove(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool import(ImportStack importStack) {
|
||||||
|
var importer =
|
||||||
|
importStack.latest<StateMachineImporter>(StateMachineBase.typeKey);
|
||||||
|
if (importer == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
importer.addMachineComponent(this);
|
||||||
|
return super.import(importStack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
|
import 'package:rive/src/rive_core/animation/any_state.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/entry_state.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/exit_state.dart';
|
||||||
import 'package:rive/src/rive_core/animation/layer_state.dart';
|
import 'package:rive/src/rive_core/animation/layer_state.dart';
|
||||||
import 'package:rive/src/rive_core/animation/state_machine.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/animation/state_machine_component.dart';
|
||||||
|
import 'package:rive/src/generated/animation/any_state_base.dart';
|
||||||
import 'package:rive/src/generated/animation/state_machine_layer_base.dart';
|
import 'package:rive/src/generated/animation/state_machine_layer_base.dart';
|
||||||
export 'package:rive/src/generated/animation/state_machine_layer_base.dart';
|
export 'package:rive/src/generated/animation/state_machine_layer_base.dart';
|
||||||
|
|
||||||
@ -17,4 +21,19 @@ class StateMachineLayer extends StateMachineLayerBase {
|
|||||||
machine?.layers;
|
machine?.layers;
|
||||||
@override
|
@override
|
||||||
void onAdded() {}
|
void onAdded() {}
|
||||||
|
bool internalAddState(LayerState state) {
|
||||||
|
assert(state != null);
|
||||||
|
switch (state.coreType) {
|
||||||
|
case AnyStateBase.typeKey:
|
||||||
|
_anyState = state;
|
||||||
|
break;
|
||||||
|
case ExitStateBase.typeKey:
|
||||||
|
_exitState = state;
|
||||||
|
break;
|
||||||
|
case EntryStateBase.typeKey:
|
||||||
|
_entryState = state;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ export 'package:rive/src/generated/animation/state_transition_base.dart';
|
|||||||
class StateTransition extends StateTransitionBase {
|
class StateTransition extends StateTransitionBase {
|
||||||
final StateTransitionConditions conditions = StateTransitionConditions();
|
final StateTransitionConditions conditions = StateTransitionConditions();
|
||||||
LayerState stateTo;
|
LayerState stateTo;
|
||||||
|
LayerState stateFrom;
|
||||||
@override
|
@override
|
||||||
void onAdded() {}
|
void onAdded() {}
|
||||||
@override
|
@override
|
||||||
@ -23,6 +24,17 @@ class StateTransition extends StateTransitionBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool get isDisabled => (flags & StateTransitionFlags.disabled) != 0;
|
bool get isDisabled => (flags & StateTransitionFlags.disabled) != 0;
|
||||||
|
@override
|
||||||
|
bool import(ImportStack importStack) {
|
||||||
|
var importer =
|
||||||
|
importStack.latest<LayerStateImporter>(LayerStateBase.typeKey);
|
||||||
|
if (importer == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
importer.addTransition(this);
|
||||||
|
return super.import(importStack);
|
||||||
|
}
|
||||||
|
|
||||||
bool internalAddCondition(TransitionCondition condition) {
|
bool internalAddCondition(TransitionCondition condition) {
|
||||||
if (conditions.contains(condition)) {
|
if (conditions.contains(condition)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
|
import 'package:rive/src/core/core.dart';
|
||||||
import 'package:rive/src/rive_core/animation/state_machine_input.dart';
|
import 'package:rive/src/rive_core/animation/state_machine_input.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/state_transition.dart';
|
||||||
import 'package:rive/src/generated/animation/transition_condition_base.dart';
|
import 'package:rive/src/generated/animation/transition_condition_base.dart';
|
||||||
export 'package:rive/src/generated/animation/transition_condition_base.dart';
|
export 'package:rive/src/generated/animation/transition_condition_base.dart';
|
||||||
|
|
||||||
@ -33,4 +35,15 @@ abstract class TransitionCondition extends TransitionConditionBase {
|
|||||||
void onAddedDirty() {
|
void onAddedDirty() {
|
||||||
input = inputId == null ? null : context.resolve(inputId);
|
input = inputId == null ? null : context.resolve(inputId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool import(ImportStack importStack) {
|
||||||
|
var importer = importStack
|
||||||
|
.latest<StateTransitionImporter>(StateTransitionBase.typeKey);
|
||||||
|
if (importer == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
importer.addCondition(this);
|
||||||
|
return super.import(importStack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,14 @@ import 'dart:collection';
|
|||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:rive/src/core/field_types/core_field_type.dart';
|
import 'package:rive/src/core/field_types/core_field_type.dart';
|
||||||
|
import 'package:rive/src/generated/animation/animation_state_base.dart';
|
||||||
|
import 'package:rive/src/generated/animation/any_state_base.dart';
|
||||||
|
import 'package:rive/src/generated/animation/entry_state_base.dart';
|
||||||
|
import 'package:rive/src/generated/animation/exit_state_base.dart';
|
||||||
import 'package:rive/src/generated/animation/keyed_property_base.dart';
|
import 'package:rive/src/generated/animation/keyed_property_base.dart';
|
||||||
import 'package:rive/src/generated/animation/state_machine_base.dart';
|
import 'package:rive/src/generated/animation/state_machine_base.dart';
|
||||||
import 'package:rive/src/rive_core/animation/keyed_property.dart';
|
import 'package:rive/src/rive_core/animation/keyed_property.dart';
|
||||||
|
import 'package:rive/src/rive_core/animation/layer_state.dart';
|
||||||
import 'package:rive/src/rive_core/animation/state_machine.dart';
|
import 'package:rive/src/rive_core/animation/state_machine.dart';
|
||||||
import 'package:rive/src/rive_core/component.dart';
|
import 'package:rive/src/rive_core/component.dart';
|
||||||
import 'package:rive/src/rive_core/runtime/runtime_header.dart';
|
import 'package:rive/src/rive_core/runtime/runtime_header.dart';
|
||||||
@ -72,6 +77,7 @@ class RiveFile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ImportStackObject stackObject;
|
ImportStackObject stackObject;
|
||||||
|
var stackType = object.coreType;
|
||||||
switch (object.coreType) {
|
switch (object.coreType) {
|
||||||
case ArtboardBase.typeKey:
|
case ArtboardBase.typeKey:
|
||||||
stackObject = ArtboardImporter(object as RuntimeArtboard);
|
stackObject = ArtboardImporter(object as RuntimeArtboard);
|
||||||
@ -96,9 +102,14 @@ class RiveFile {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case StateMachineBase.typeKey:
|
case StateMachineBase.typeKey:
|
||||||
stackObject = StateMachineImporter(object as StateMachine);
|
stackObject = StateMachineImporter(object as StateMachine);
|
||||||
// stackObject = _LinearAnimationStackObject(object as
|
break;
|
||||||
// LinearAnimation); helper = _AnimationImportHelper();
|
case EntryStateBase.typeKey:
|
||||||
|
case AnyStateBase.typeKey:
|
||||||
|
case ExitStateBase.typeKey:
|
||||||
|
case AnimationStateBase.typeKey:
|
||||||
|
stackObject = LayerStateImporter(object as LayerState);
|
||||||
|
stackType = LayerStateBase.typeKey;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (object is Component) {
|
if (object is Component) {
|
||||||
@ -107,7 +118,7 @@ class RiveFile {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
importStack.makeLatest(object.coreType, stackObject);
|
importStack.makeLatest(stackType, stackObject);
|
||||||
|
|
||||||
if (object?.import(importStack) ?? true) {
|
if (object?.import(importStack) ?? true) {
|
||||||
switch (object.coreType) {
|
switch (object.coreType) {
|
||||||
|
Reference in New Issue
Block a user