Adding importing of state machine with format 7.

This commit is contained in:
Luigi Rosso
2021-03-03 17:02:39 -08:00
parent 65465f56ed
commit 77a0a2bdc2
10 changed files with 156 additions and 4 deletions

View File

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

View 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() {}
}

View 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];
}
}
}
}

View 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() {}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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