mirror of
https://github.com/rive-app/rive-flutter.git
synced 2025-06-27 02:07:12 +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_property_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 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/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() {
|
||||
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 'package:rive/src/core/core.dart';
|
||||
import 'package:rive/src/rive_core/animation/state_machine.dart';
|
||||
import '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);
|
||||
}
|
||||
}
|
||||
|
||||
@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 '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/state_machine.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';
|
||||
export 'package:rive/src/generated/animation/state_machine_layer_base.dart';
|
||||
|
||||
@ -17,4 +21,19 @@ class StateMachineLayer extends StateMachineLayerBase {
|
||||
machine?.layers;
|
||||
@override
|
||||
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 {
|
||||
final StateTransitionConditions conditions = StateTransitionConditions();
|
||||
LayerState stateTo;
|
||||
LayerState stateFrom;
|
||||
@override
|
||||
void onAdded() {}
|
||||
@override
|
||||
@ -23,6 +24,17 @@ class StateTransition extends StateTransitionBase {
|
||||
}
|
||||
|
||||
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) {
|
||||
if (conditions.contains(condition)) {
|
||||
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_transition.dart';
|
||||
import '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() {
|
||||
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 '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/state_machine_base.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/component.dart';
|
||||
import 'package:rive/src/rive_core/runtime/runtime_header.dart';
|
||||
@ -72,6 +77,7 @@ class RiveFile {
|
||||
}
|
||||
|
||||
ImportStackObject stackObject;
|
||||
var stackType = object.coreType;
|
||||
switch (object.coreType) {
|
||||
case ArtboardBase.typeKey:
|
||||
stackObject = ArtboardImporter(object as RuntimeArtboard);
|
||||
@ -96,9 +102,14 @@ class RiveFile {
|
||||
break;
|
||||
}
|
||||
case StateMachineBase.typeKey:
|
||||
stackObject = StateMachineImporter(object as StateMachine);
|
||||
// stackObject = _LinearAnimationStackObject(object as
|
||||
// LinearAnimation); helper = _AnimationImportHelper();
|
||||
stackObject = StateMachineImporter(object as StateMachine);
|
||||
break;
|
||||
case EntryStateBase.typeKey:
|
||||
case AnyStateBase.typeKey:
|
||||
case ExitStateBase.typeKey:
|
||||
case AnimationStateBase.typeKey:
|
||||
stackObject = LayerStateImporter(object as LayerState);
|
||||
stackType = LayerStateBase.typeKey;
|
||||
break;
|
||||
default:
|
||||
if (object is Component) {
|
||||
@ -107,7 +118,7 @@ class RiveFile {
|
||||
break;
|
||||
}
|
||||
|
||||
importStack.makeLatest(object.coreType, stackObject);
|
||||
importStack.makeLatest(stackType, stackObject);
|
||||
|
||||
if (object?.import(importStack) ?? true) {
|
||||
switch (object.coreType) {
|
||||
|
Reference in New Issue
Block a user