Fixing import order issue with state machines.

This commit is contained in:
Luigi Rosso
2021-04-29 15:49:56 -07:00
parent c9e8d90379
commit cad4c64ef8
9 changed files with 61 additions and 41 deletions

View File

@ -1,7 +1,6 @@
import 'dart:collection';
import 'package:rive/src/rive_core/runtime/exceptions/rive_format_error_exception.dart';
export 'package:rive/src/animation_list.dart';
export 'package:rive/src/state_machine_components.dart';
export 'package:rive/src/state_transition_conditions.dart';
@ -61,7 +60,40 @@ abstract class CoreContext {
// ignore: one_member_abstracts
abstract class ImportStackObject {
bool resolve();
final _resolveBefore = <ImportStackObject>{};
bool _resolved = false;
bool initStack(ImportStack stack) {
var type = resolvesBefore;
if (type == -1) {
return true;
}
var importer = stack.latest<ImportStackObject>(type);
if (importer == null) {
return false;
}
importer._resolveBefore.add(this);
return true;
}
int get resolvesBefore => -1;
bool _internalResolve() {
if (_resolved) {
return true;
}
_resolved = true;
if (_resolveBefore.isNotEmpty) {
for (final before in _resolveBefore) {
if (!before._internalResolve()) {
return false;
}
}
}
return resolve();
}
bool resolve() => true;
}
/// Stack to help the RiveFile locate latest ImportStackObject created of a
@ -89,11 +121,11 @@ class ImportStack {
bool makeLatest(int coreType, ImportStackObject? importObject) {
var latest = _latests[coreType];
if (latest != null) {
if (!latest.resolve()) {
if (!latest._internalResolve()) {
return false;
}
}
if (importObject != null) {
if (importObject != null && importObject.initStack(this)) {
_latests[coreType] = importObject;
} else {
_latests.remove(coreType);
@ -103,7 +135,7 @@ class ImportStack {
bool resolve() {
for (final object in _latests.values) {
if (!object.resolve()) {
if (!object._internalResolve()) {
return false;
}
}

View File

@ -0,0 +1,8 @@
import 'package:rive/src/core/core.dart';
import 'package:rive/src/rive_core/artboard.dart';
/// An importer that will always resolve with the artboard importer.
abstract class ArtboardImportStackObject extends ImportStackObject {
@override
int get resolvesBefore => ArtboardBase.typeKey;
}

View File

@ -1,8 +1,8 @@
import 'package:rive/src/core/core.dart';
import 'package:rive/src/core/importers/artboard_import_stack_object.dart';
import 'package:rive/src/rive_core/animation/keyed_object.dart';
import 'package:rive/src/rive_core/animation/keyed_property.dart';
class KeyedObjectImporter extends ImportStackObject {
class KeyedObjectImporter extends ArtboardImportStackObject {
final KeyedObject keyedObject;
KeyedObjectImporter(this.keyedObject);
@ -11,7 +11,4 @@ class KeyedObjectImporter extends ImportStackObject {
keyedObject.context.addObject(property);
keyedObject.internalAddKeyedProperty(property);
}
@override
bool resolve() => true;
}

View File

@ -1,9 +1,9 @@
import 'package:rive/src/core/core.dart';
import 'package:rive/src/core/importers/artboard_import_stack_object.dart';
import 'package:rive/src/rive_core/animation/keyed_property.dart';
import 'package:rive/src/rive_core/animation/keyframe.dart';
import 'package:rive/src/rive_core/animation/linear_animation.dart';
class KeyedPropertyImporter extends ImportStackObject {
class KeyedPropertyImporter extends ArtboardImportStackObject {
final KeyedProperty keyedProperty;
final LinearAnimation animation;
@ -14,7 +14,4 @@ class KeyedPropertyImporter extends ImportStackObject {
keyedProperty.internalAddKeyFrame(keyFrame);
keyFrame.computeSeconds(animation);
}
@override
bool resolve() => true;
}

View File

@ -1,8 +1,8 @@
import 'package:rive/src/core/core.dart';
import 'package:rive/src/core/importers/artboard_import_stack_object.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 {
class LayerStateImporter extends ArtboardImportStackObject {
final LayerState state;
LayerStateImporter(this.state);
@ -10,7 +10,4 @@ class LayerStateImporter extends ImportStackObject {
state.context.addObject(transition);
state.internalAddTransition(transition);
}
@override
bool resolve() => true;
}

View File

@ -1,25 +1,13 @@
import 'package:rive/rive.dart';
import 'package:rive/src/core/core.dart';
import 'package:rive/src/core/importers/artboard_import_stack_object.dart';
import 'package:rive/src/rive_core/animation/keyed_object.dart';
class LinearAnimationImporter extends ImportStackObject {
class LinearAnimationImporter extends ArtboardImportStackObject {
final LinearAnimation linearAnimation;
// final keyedObjects = <KeyedObject>[];
LinearAnimationImporter(this.linearAnimation);
void addKeyedObject(KeyedObject object) {
linearAnimation.context.addObject(object);
// keyedObjects.add(object);
linearAnimation.internalAddKeyedObject(object);
}
@override
bool resolve() {
// for (final keyedObject in keyedObjects) {
// keyedObject.objectId ??= linearAnimation.artboard.id;
// }
return true;
}
}

View File

@ -1,8 +1,8 @@
import 'package:rive/src/core/core.dart';
import 'package:rive/src/core/importers/artboard_import_stack_object.dart';
import 'package:rive/src/rive_core/animation/state_machine.dart';
import 'package:rive/src/rive_core/animation/state_machine_component.dart';
class StateMachineImporter extends ImportStackObject {
class StateMachineImporter extends ArtboardImportStackObject {
final StateMachine machine;
StateMachineImporter(this.machine);
@ -10,7 +10,4 @@ class StateMachineImporter extends ImportStackObject {
machine.context.addObject(object);
object.stateMachine = machine;
}
@override
bool resolve() => true;
}

View File

@ -1,3 +1,4 @@
import 'package:rive/rive.dart';
import 'package:rive/src/core/core.dart';
import 'package:rive/src/rive_core/animation/animation_state.dart';
import 'package:rive/src/rive_core/animation/layer_state.dart';
@ -17,6 +18,9 @@ class StateMachineLayerImporter extends ImportStackObject {
layer.internalAddState(state);
}
@override
int get resolvesBefore => StateMachineBase.typeKey;
bool _resolved = false;
@override
bool resolve() {
@ -36,7 +40,6 @@ class StateMachineLayerImporter extends ImportStackObject {
// entire artboard imports.
assert(transition.stateToId >= 0 &&
transition.stateToId < importedStates.length);
// transition.stateToId = importedStates[transition.stateToId].id;
transition.stateTo = importedStates[transition.stateToId];
}
}

View File

@ -1,8 +1,9 @@
import 'package:rive/src/core/core.dart';
import 'package:rive/src/core/importers/artboard_import_stack_object.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 {
class StateTransitionImporter extends ArtboardImportStackObject {
final StateMachineImporter stateMachineImporter;
final StateTransition transition;
StateTransitionImporter(this.transition, this.stateMachineImporter);