From 4b178b651c1109506a3a84b8ab311f0214ee3a34 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 1 Aug 2024 12:19:00 -0300 Subject: [PATCH 01/50] cloning animation keys to reduce heap memory --- lib/src/rive_core/animation/keyed_object.dart | 26 ++++++++++++++ .../rive_core/animation/keyed_property.dart | 5 +++ .../rive_core/animation/keyframe_double.dart | 5 +++ .../rive_core/animation/linear_animation.dart | 30 ++++++++++++++++ lib/src/runtime_artboard.dart | 34 +++++++++++++++++++ 5 files changed, 100 insertions(+) diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index 114871cf..cb08248b 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -1,4 +1,5 @@ import 'dart:collection'; +import 'dart:developer'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyed_object_base.dart'; @@ -20,6 +21,31 @@ class KeyedObject extends KeyedObjectBase { Iterable get keyedProperties => _keyedProperties.values; + // @override + // String toString() => 'KeyedObject[$count]'; + + // static int _objectCount = 0; + // // static final List _all = []; + // // static void dump() { + // // log('DUMPING LINEAR ANIMATIONS all=${_all.length} keyed=${_all.where((a) => a._keyedObjects.isNotEmpty).length} keys=${_all.map((a) => a._keyedObjects.length).sum}'); + // // log(_all.where((a) => a._keyedObjects.isNotEmpty).map((a) => a.toString()).join('\n')); + // // } + + // final int count = ++_objectCount; + // late final bool logging = count % 50000 == 0; + + /// STOKANAL-FORK-EDIT: Reuse this object for every animation + @override + K? clone() => this as K; + + // KeyedObject() { + // + // if (logging) { + // log('CONSTRUCTED >> $this'); + // debugPrintStack(); + // } + // } + @override void onAddedDirty() {} diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index afb97eb6..d0d80b04 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -57,6 +57,11 @@ class KeyFrameList { class KeyedProperty extends KeyedPropertyBase with KeyFrameList { + + /// STOKANAL-FORK-EDIT: Reuse this object for every animation + @override + K? clone() => this as K; + @override void onAdded() {} diff --git a/lib/src/rive_core/animation/keyframe_double.dart b/lib/src/rive_core/animation/keyframe_double.dart index 39d55448..d12b7ee7 100644 --- a/lib/src/rive_core/animation/keyframe_double.dart +++ b/lib/src/rive_core/animation/keyframe_double.dart @@ -14,6 +14,11 @@ void _apply( } class KeyFrameDouble extends KeyFrameDoubleBase { + + /// STOKANAL-FORK-EDIT: Reuse this object for every animation + @override + K? clone() => this as K; + @override void apply(Core object, int propertyKey, double mix) => _apply(object, propertyKey, mix, value); diff --git a/lib/src/rive_core/animation/linear_animation.dart b/lib/src/rive_core/animation/linear_animation.dart index b6b5212c..70977d7a 100644 --- a/lib/src/rive_core/animation/linear_animation.dart +++ b/lib/src/rive_core/animation/linear_animation.dart @@ -1,5 +1,7 @@ import 'dart:collection'; +import 'dart:developer'; +import 'package:collection/collection.dart'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/linear_animation_base.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; @@ -14,6 +16,28 @@ class LinearAnimation extends LinearAnimationBase { /// object is keyed in this animation. final _keyedObjects = HashMap(); + // static int _objectCount = 0; + // static final List _all = []; + // static void dump() { + // log('DUMPING LINEAR ANIMATIONS all=${_all.length} keyed=${_all.where((a) => a._keyedObjects.isNotEmpty).length} keys=${_all.map((a) => a._keyedObjects.length).sum}'); + // // log(_all.where((a) => a._keyedObjects.isNotEmpty).map((a) => a.toString()).join('\n')); + // } + // + // final int count = ++_objectCount; + // late final bool logging = count < 4500 && count % 500 == 0; + // + // @override + // String toString() => 'LinearAnimation[$name, $count, ${_keyedObjects.length}]'; + // + // LinearAnimation() { + // + // _all.add(this); + // if (logging) { + // log('CONSTRUCTED >> $this'); + // debugPrintStack(); + // } + // } + /// The metadata for the objects that are keyed in this animation. Iterable get keyedObjects => _keyedObjects.values; @@ -22,6 +46,12 @@ class LinearAnimation extends LinearAnimationBase { bool internalAddKeyedObject(KeyedObject object) { if (internalCheckAddKeyedObject(object)) { _keyedObjects[object.objectId] = object; + + // if (logging) {// && _keyedObjects.length % 1 == 0) { + // log('ADDING KEY-OBJECT >> $this'); + // debugPrintStack(); + // } + return true; } return false; diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index ca9594a3..5810e9a1 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -1,9 +1,14 @@ +import 'dart:developer'; + +import 'package:collection/collection.dart'; import 'package:flutter/scheduler.dart'; import 'package:rive/rive.dart'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/notifier.dart'; +import 'rive_core/animation/keyed_object.dart'; + /// Adds getters for linear animations and state machines extension RuntimeArtboardGetters on RuntimeArtboard { /// Returns an iterable of linear animations in the artboard @@ -109,6 +114,13 @@ class RuntimeArtboard extends Artboard implements CoreContext { object?.context = this; object?.id = _objects.length; + // if (object is LinearAnimation && object.logging) { + // log('ADD LINEAR-ANIMATION > $object'); + // } + // if (object is KeyedObject && object.logging) { + // log('ADD KEYED-OBJECT > $object'); + // } + _objects.add(object); return object; } @@ -223,9 +235,31 @@ class RuntimeArtboard extends Artboard implements CoreContext { InternalCoreHelper.markValid(object); } artboard.clean(); + + // dump(); + return artboard; } + /// STOKANAL-FORK-EDIT: Reuse this object for every animation + void dump() { + log(toString()); + log(objects + .map((o) => o.runtimeType) + .groupListsBy((o) => o) + .entries + .sorted((e1, e2) => e2.value.length - e1.value.length) + .map((e) => '${e.key}: ${e.value.length}') + .join('\n')); + } + + /// STOKANAL-FORK-EDIT: Reuse this object for every animation + @override + String toString() { + // LinearAnimation.dump(); // uncomment to dump animations + return 'RuntimeArtboard[$name ${objects.length}]'; + } + void addNestedEventListener(StateMachineController controller) { activeNestedArtboards.forEach((artboard) { if (artboard.mountedArtboard is RuntimeMountedArtboard) { From 6e4f5124d44412954458d97a67d60cbf7ea6aee9 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 1 Aug 2024 14:35:53 -0300 Subject: [PATCH 02/50] added some peformance improvements --- lib/src/generated/rive_core_context.dart | 1 + lib/src/rive_core/animation/keyed_object.dart | 8 +++++-- .../rive_core/animation/linear_animation.dart | 2 -- lib/src/rive_core/artboard.dart | 9 ++++++-- lib/src/rive_core/dependency_helper.dart | 23 +++++++++++++++---- lib/src/runtime_artboard.dart | 2 -- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index c0bd5aea..b226a685 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -2364,6 +2364,7 @@ class RiveCoreContext { static CoreFieldType doubleType = CoreDoubleType(); static CoreFieldType bytesType = CoreBytesType(); static CoreFieldType callbackType = CoreCallbackType(); + static CoreFieldType? coreType(int propertyKey) { switch (propertyKey) { case ViewModelInstanceListItemBase.useLinkedArtboardPropertyKey: diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index cb08248b..bbbc9de2 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -1,5 +1,4 @@ import 'dart:collection'; -import 'dart:developer'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyed_object_base.dart'; @@ -111,6 +110,9 @@ class KeyedObject extends KeyedObjectBase { } } + /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map + late final List _properties = _keyedProperties.values.toList(growable: false); + void apply( double time, double mix, @@ -120,7 +122,9 @@ class KeyedObject extends KeyedObjectBase { if (object == null) { return; } - for (final keyedProperty in _keyedProperties.values) { + // for (final keyedProperty in _keyedProperties.values) { + /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map + for (final keyedProperty in _properties) { if (keyedProperty.isCallback) { continue; } diff --git a/lib/src/rive_core/animation/linear_animation.dart b/lib/src/rive_core/animation/linear_animation.dart index 70977d7a..423baa14 100644 --- a/lib/src/rive_core/animation/linear_animation.dart +++ b/lib/src/rive_core/animation/linear_animation.dart @@ -1,7 +1,5 @@ import 'dart:collection'; -import 'dart:developer'; -import 'package:collection/collection.dart'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/linear_animation_base.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index a86fa6f5..cd8c84d9 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -133,8 +133,13 @@ class Artboard extends ArtboardBase with ShapePaintContainer { int _dirtDepth = 0; /// Iterate each component and call callback for it. - void forEachComponent(void Function(Component) callback) => - _components.forEach(callback); + void forEachComponent(void Function(Component) callback) { + // _components.forEach(callback); + /// STOKANAL-FORK-EDIT: dot not use forEach + for (final c in _components) { + callback(c); + } + } /// Find a component of a specific type with a specific name. T? component(String name) { diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index fb0383be..3de7eaba 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -1,20 +1,33 @@ class DependencyHelper { - Set dependents = {}; + + // Set dependents = {}; + /// STOKANAL-FORK-EDIT: make if final + final Set dependents = {}; T? dependencyRoot; DependencyHelper(); bool addDependent(U value) { - if (!dependents.contains(value)) { - dependents.add(value); + + // if (!dependents.contains(value)) { + // dependents.add(value); + + /// STOKANAL-FORK-EDIT: use add directly + if (dependents.add(value)) { return true; } return false; } void addDirt(int dirt, {bool recurse = false}) { - dependents - .forEach((dependent) => dependent.addDirt(dirt, recurse: recurse)); + + /// STOKANAL-FORK-EDIT: dot not use forEach + for (final dependent in dependents) { + dependent.addDirt(dirt, recurse: recurse); + } + + // dependents + // .forEach((dependent) => dependent.addDirt(dirt, recurse: recurse)); } void onComponentDirty(U component) { diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index 5810e9a1..f0085ac8 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -7,8 +7,6 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/notifier.dart'; -import 'rive_core/animation/keyed_object.dart'; - /// Adds getters for linear animations and state machines extension RuntimeArtboardGetters on RuntimeArtboard { /// Returns an iterable of linear animations in the artboard From ca96c716013c31fb3898370126da2b9e993402d0 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 1 Aug 2024 17:49:27 -0300 Subject: [PATCH 03/50] switch benchmark --- .../Flutter/GeneratedPluginRegistrant.swift | 20 +++ .../flutter/generated_plugin_registrant.cc | 17 ++ .../flutter/generated_plugin_registrant.h | 15 ++ .../windows/flutter/generated_plugins.cmake | 25 +++ lib/src/core/field_types/core_field_type.dart | 2 + lib/src/generated/rive_core_context.dart | 157 ++++++++++++++++++ pubspec.yaml | 1 + 7 files changed, 237 insertions(+) create mode 100644 example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 example/windows/flutter/generated_plugin_registrant.cc create mode 100644 example/windows/flutter/generated_plugin_registrant.h create mode 100644 example/windows/flutter/generated_plugins.cmake diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..8dfa1a4d --- /dev/null +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,20 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import audio_session +import just_audio +import path_provider_foundation +import rive_common +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..72ff4b78 --- /dev/null +++ b/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,17 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + RivePluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RivePlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/example/windows/flutter/generated_plugin_registrant.h b/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/example/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/example/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..e141d513 --- /dev/null +++ b/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,25 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + rive_common + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/lib/src/core/field_types/core_field_type.dart b/lib/src/core/field_types/core_field_type.dart index 0caf2741..f966d6c5 100644 --- a/lib/src/core/field_types/core_field_type.dart +++ b/lib/src/core/field_types/core_field_type.dart @@ -4,4 +4,6 @@ import 'package:rive_common/utilities.dart'; abstract class CoreFieldType { T deserialize(BinaryReader reader); void skip(BinaryReader reader) => deserialize(reader); + + // const CoreFieldType(); } diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index b226a685..9b45e8f0 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -188,6 +188,163 @@ import 'package:rive/src/rive_core/viewmodel/viewmodel_property_viewmodel.dart'; // ignore: avoid_classes_with_only_static_members class RiveCoreContext { + + // TODO migrate to new switches when available + + // static Core? makeCoreInstance3(int typeKey) => switch (typeKey) { + // ViewModelInstanceListItemBase.typeKey => ViewModelInstanceListItem(), + // }; + + // static Core? makeCoreInstance2(int typeKey) => switch (typeKey) { + // ViewModelInstanceListItemBase.typeKey => ViewModelInstanceListItem(), + // ViewModelInstanceColorBase.typeKey => ViewModelInstanceColor(), + // ViewModelComponentBase.typeKey => ViewModelComponent(), + // ViewModelPropertyBase.typeKey => ViewModelProperty(), + // ViewModelPropertyNumberBase.typeKey => ViewModelPropertyNumber(), + // ViewModelInstanceEnumBase.typeKey => ViewModelInstanceEnum(), + // ViewModelInstanceStringBase.typeKey => ViewModelInstanceString(), + // ViewModelPropertyListBase.typeKey => ViewModelPropertyList(), + // ViewModelBase.typeKey => ViewModel(), + // ViewModelPropertyViewModelBase.typeKey => ViewModelPropertyViewModel(), + // ViewModelInstanceBase.typeKey => ViewModelInstance(), + // ViewModelPropertyBooleanBase.typeKey => ViewModelPropertyBoolean(), + // DataEnumBase.typeKey => DataEnum(), + // ViewModelPropertyEnumBase.typeKey => ViewModelPropertyEnum(), + // ViewModelPropertyColorBase.typeKey => ViewModelPropertyColor(), + // ViewModelInstanceBooleanBase.typeKey => ViewModelInstanceBoolean(); + // ViewModelInstanceListBase.typeKey => ViewModelInstanceList(); + // ViewModelInstanceNumberBase.typeKey => ViewModelInstanceNumber(); + // ViewModelPropertyStringBase.typeKey => ViewModelPropertyString(); + // ViewModelInstanceViewModelBase.typeKey => ViewModelInstanceViewModel(); + // DataEnumValueBase.typeKey => DataEnumValue(); + // DrawTargetBase.typeKey => DrawTarget(); + // CustomPropertyNumberBase.typeKey => CustomPropertyNumber(); + // DistanceConstraintBase.typeKey => DistanceConstraint(); + // IKConstraintBase.typeKey => IKConstraint(); + // FollowPathConstraintBase.typeKey => FollowPathConstraint(); + // TranslationConstraintBase.typeKey => TranslationConstraint(); + // TransformConstraintBase.typeKey => TransformConstraint(); + // ScaleConstraintBase.typeKey => ScaleConstraint(); + // RotationConstraintBase.typeKey => RotationConstraint(); + // NodeBase.typeKey => Node(); + // NestedArtboardBase.typeKey => NestedArtboard(); + // SoloBase.typeKey => Solo(); + // LayoutComponentStyleBase.typeKey => LayoutComponentStyle(); + // ListenerFireEventBase.typeKey => ListenerFireEvent(); + // KeyFrameUintBase.typeKey => KeyFrameUint(); + // AnimationBase.typeKey => Animation(); + // LinearAnimationBase.typeKey => LinearAnimation(); + // NestedSimpleAnimationBase.typeKey => NestedSimpleAnimation(); + // AnimationStateBase.typeKey => AnimationState(); + // NestedTriggerBase.typeKey => NestedTrigger(); + // KeyedObjectBase.typeKey => KeyedObject(); + // BlendAnimationDirectBase.typeKey => BlendAnimationDirect(); + // StateMachineNumberBase.typeKey => StateMachineNumber(); + // CubicValueInterpolatorBase.typeKey => CubicValueInterpolator(); + // TransitionTriggerConditionBase.typeKey => TransitionTriggerCondition(); + // KeyedPropertyBase.typeKey => KeyedProperty(); + // StateMachineListenerBase.typeKey => StateMachineListener(); + // TransitionPropertyViewModelComparatorBase.typeKey => TransitionPropertyViewModelComparator(); + // KeyFrameIdBase.typeKey => KeyFrameId(); + // KeyFrameBoolBase.typeKey => KeyFrameBool(); + // ListenerBoolChangeBase.typeKey => ListenerBoolChange(); + // ListenerAlignTargetBase.typeKey => ListenerAlignTarget(); + // TransitionNumberConditionBase.typeKey => TransitionNumberCondition(); + // TransitionValueBooleanComparatorBase.typeKey => TransitionValueBooleanComparator(); + // AnyStateBase.typeKey => AnyState(); + // CubicInterpolatorComponentBase.typeKey => CubicInterpolatorComponent(); + // StateMachineLayerBase.typeKey => StateMachineLayer(); + // KeyFrameStringBase.typeKey => KeyFrameString(); + // ListenerNumberChangeBase.typeKey => ListenerNumberChange(); + // TransitionViewModelConditionBase.typeKey => TransitionViewModelCondition(); + // CubicEaseInterpolatorBase.typeKey => CubicEaseInterpolator(); + // StateTransitionBase.typeKey => StateTransition(); + // NestedBoolBase.typeKey => NestedBool(); + // KeyFrameDoubleBase.typeKey => KeyFrameDouble(); + // KeyFrameColorBase.typeKey => KeyFrameColor(); + // StateMachineBase.typeKey => StateMachine(); + // StateMachineFireEventBase.typeKey => StateMachineFireEvent(); + // EntryStateBase.typeKey => EntryState(); + // StateMachineTriggerBase.typeKey => StateMachineTrigger(); + // TransitionValueColorComparatorBase.typeKey => TransitionValueColorComparator(); + // ListenerTriggerChangeBase.typeKey => ListenerTriggerChange(); + // BlendStateDirectBase.typeKey => BlendStateDirect(); + // TransitionValueNumberComparatorBase.typeKey => TransitionValueNumberComparator(); + // NestedStateMachineBase.typeKey => NestedStateMachine(); + // ElasticInterpolatorBase.typeKey => ElasticInterpolator(); + // ExitStateBase.typeKey => ExitState(); + // NestedNumberBase.typeKey => NestedNumber(); + // BlendAnimation1DBase.typeKey => BlendAnimation1D(); + // BlendState1DBase.typeKey => BlendState1D(); + // TransitionValueEnumComparatorBase.typeKey => TransitionValueEnumComparator(); + // KeyFrameCallbackBase.typeKey => KeyFrameCallback(); + // TransitionValueStringComparatorBase.typeKey => TransitionValueStringComparator(); + // NestedRemapAnimationBase.typeKey => NestedRemapAnimation(); + // TransitionBoolConditionBase.typeKey => TransitionBoolCondition(); + // BlendStateTransitionBase.typeKey => BlendStateTransition(); + // StateMachineBoolBase.typeKey => StateMachineBool(); + // LinearGradientBase.typeKey => LinearGradient(); + // RadialGradientBase.typeKey => RadialGradient(); + // StrokeBase.typeKey => Stroke(); + // SolidColorBase.typeKey => SolidColor(); + // GradientStopBase.typeKey => GradientStop(); + // TrimPathBase.typeKey => TrimPath(); + // FillBase.typeKey => Fill(); + // MeshVertexBase.typeKey => MeshVertex(); + // ShapeBase.typeKey => Shape(); + // WeightBase.typeKey => Weight(); + // StraightVertexBase.typeKey => StraightVertex(); + // CubicWeightBase.typeKey => CubicWeight(); + // CubicAsymmetricVertexBase.typeKey => CubicAsymmetricVertex(); + // MeshBase.typeKey => Mesh(); + // PointsPathBase.typeKey => PointsPath(); + // ContourMeshVertexBase.typeKey => ContourMeshVertex(); + // RectangleBase.typeKey => Rectangle(); + // CubicMirroredVertexBase.typeKey => CubicMirroredVertex(); + // TriangleBase.typeKey => Triangle(); + // EllipseBase.typeKey => Ellipse(); + // ClippingShapeBase.typeKey => ClippingShape(); + // PolygonBase.typeKey => Polygon(); + // StarBase.typeKey => Star(); + // ImageBase.typeKey => Image(); + // CubicDetachedVertexBase.typeKey => CubicDetachedVertex(); + // EventBase.typeKey => Event(); + // DrawRulesBase.typeKey => DrawRules(); + // CustomPropertyBooleanBase.typeKey => CustomPropertyBoolean(); + // LayoutComponentBase.typeKey => LayoutComponent(); + // ArtboardBase.typeKey => Artboard(); + // JoystickBase.typeKey => Joystick(); + // BackboardBase.typeKey => Backboard(); + // OpenUrlEventBase.typeKey => OpenUrlEvent(); + // BindablePropertyBooleanBase.typeKey => BindablePropertyBoolean(); + // DataBindBase.typeKey => DataBind(); + // DataBindContextBase.typeKey => DataBindContext(); + // BindablePropertyStringBase.typeKey => BindablePropertyString(); + // BindablePropertyNumberBase.typeKey => BindablePropertyNumber(); + // BindablePropertyEnumBase.typeKey => BindablePropertyEnum(); + // BindablePropertyColorBase.typeKey => BindablePropertyColor(); + // BoneBase.typeKey => Bone(), + // RootBoneBase.typeKey => RootBone(), + // SkinBase.typeKey => Skin(), + // TendonBase.typeKey => Tendon(), + // TextModifierRangeBase.typeKey => TextModifierRange(), + // TextStyleFeatureBase.typeKey => TextStyleFeature(), + // TextVariationModifierBase.typeKey => TextVariationModifier(), + // TextModifierGroupBase.typeKey => TextModifierGroup(), + // TextStyleBase.typeKey => TextStyle(), + // TextStyleAxisBase.typeKey => TextStyleAxis(), + // TextBase.typeKey => Text(), + // TextValueRunBase.typeKey => TextValueRun(), + // CustomPropertyStringBase.typeKey => CustomPropertyString(), + // FolderBase.typeKey => Folder(), + // ImageAssetBase.typeKey => ImageAsset(), + // FontAssetBase.typeKey => FontAsset(), + // AudioAssetBase.typeKey => AudioAsset(), + // FileAssetContentsBase.typeKey => FileAssetContents(), + // AudioEventBase.typeKey => AudioEvent(), + // default => null, + // }; + static Core? makeCoreInstance(int typeKey) { switch (typeKey) { case ViewModelInstanceListItemBase.typeKey: diff --git a/pubspec.yaml b/pubspec.yaml index 7bddd41f..826890e5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,6 +12,7 @@ topics: environment: sdk: ">=2.17.0 <4.0.0" flutter: ">=2.5.0" + dependencies: collection: ^1.15.0 flutter: From a8571428d03bb0eed98f9c4b151a5957e058c573 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 2 Aug 2024 18:23:17 -0300 Subject: [PATCH 04/50] implementing club --- lib/src/rive_core/animation/keyed_object.dart | 4 ++-- .../rive_core/animation/linear_animation.dart | 16 +++++++++++++--- lib/src/rive_file.dart | 4 +--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index bbbc9de2..083381cd 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -111,7 +111,7 @@ class KeyedObject extends KeyedObjectBase { } /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map - late final List _properties = _keyedProperties.values.toList(growable: false); + late final List properties = _keyedProperties.values.toList(growable: false); void apply( double time, @@ -124,7 +124,7 @@ class KeyedObject extends KeyedObjectBase { } // for (final keyedProperty in _keyedProperties.values) { /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map - for (final keyedProperty in _properties) { + for (final keyedProperty in properties) { if (keyedProperty.isCallback) { continue; } diff --git a/lib/src/rive_core/animation/linear_animation.dart b/lib/src/rive_core/animation/linear_animation.dart index 423baa14..8bca0ed8 100644 --- a/lib/src/rive_core/animation/linear_animation.dart +++ b/lib/src/rive_core/animation/linear_animation.dart @@ -70,13 +70,16 @@ class LinearAnimation extends LinearAnimationBase { objects.any((element) => _keyedObjects.containsKey(element.id)); bool isObjectKeyed(Core object) => _keyedObjects.containsKey(object.id); + bool removeObjectKeys(Core object) { var value = _keyedObjects[object.id]; if (value == null) { return false; } bool found = false; - for (final kp in value.keyedProperties) { + // for (final kp in value.keyedProperties) { + /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map + for (final kp in value.properties) { for (final kf in kp.keyframes.toList()) { kf.remove(); found = true; @@ -101,6 +104,9 @@ class LinearAnimation extends LinearAnimationBase { /// Returns the start time of the animation in seconds, considering speed double get startTime => (speed >= 0) ? startSeconds : endSeconds; + /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map + late final List _objects = _keyedObjects.values.toList(growable: false); + void reportKeyedCallbacks( double secondsFrom, double secondsTo, { @@ -116,7 +122,9 @@ class LinearAnimation extends LinearAnimationBase { // Do not report a callback twice if it comes from the "pong" part of a // "ping pong" loop if (!isAtStartFrame || !fromPong) { - for (final keyedObject in _keyedObjects.values) { + // for (final keyedObject in _keyedObjects.values) { + /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map + for (final keyedObject in _objects) { keyedObject.reportKeyedCallbacks( secondsFrom, secondsTo, @@ -138,7 +146,9 @@ class LinearAnimation extends LinearAnimationBase { // ignore: parameter_assignments time = (time * fps).floor() / fps; } - for (final keyedObject in _keyedObjects.values) { + // for (final keyedObject in _keyedObjects.values) { + /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map + for (final keyedObject in _objects) { keyedObject.apply(time, mix, coreContext); } } diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index 4c8e042e..e386775e 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -355,9 +355,7 @@ class RiveFile { // TODO: in the next major version add an assert here to make this a // requirement if (!_initializedText) { - debugPrint('''Rive: RiveFile.import called before RiveFile.initialize() - -Consider calling `await RiveFile.initialize()` before using `RiveFile.import`'''); + debugPrint('''Rive: RiveFile.import called before RiveFile.initialize(). Consider calling `await RiveFile.initialize()` before using `RiveFile.import`'''); } var reader = BinaryReader(bytes); From 0434025537ac918cf3c6ae9bc3f6a545c4e810fa Mon Sep 17 00:00:00 2001 From: gauchoj Date: Tue, 13 Aug 2024 12:28:22 -0300 Subject: [PATCH 05/50] implementing world edit --- lib/src/rive_core/text/text.dart | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/src/rive_core/text/text.dart b/lib/src/rive_core/text/text.dart index 4638a16f..3753733a 100644 --- a/lib/src/rive_core/text/text.dart +++ b/lib/src/rive_core/text/text.dart @@ -1,4 +1,4 @@ -import 'dart:math'; +import 'dart:math' hide log; import 'dart:ui'; import 'package:rive/src/generated/text/text_base.dart'; @@ -66,7 +66,9 @@ class Text extends TextBase with TextStyleContainer implements Sizable { // Shapes that should be cleaned before next shaping call. final List _cleanupShapes = []; BreakLinesResult? _lines; - // TextShapeResult? get shape => _shape; + + /// STOKANAL-FORK-EDIT: exposing shape + TextShapeResult? get shape => _shape; BreakLinesResult? get lines => _lines; // Used by text effectors. @@ -252,6 +254,9 @@ class Text extends TextBase with TextStyleContainer implements Sizable { final List _renderStyles = []; + /// STOKANAL-FORK-EDIT: exposing renderStyles + List get renderStyles => _renderStyles; + Size _measure(Size maxSize) { var defaultFont = _defaultFont; if (defaultFont == null) { @@ -328,6 +333,9 @@ class Text extends TextBase with TextStyleContainer implements Sizable { return Size(bounds.width.ceilToDouble(), bounds.height.ceilToDouble()); } + /// STOKANAL-FORK-EDIT: expose method + void buildRenderStyles() => _buildRenderStyles(); + void _buildRenderStyles() { var lines = _lines; var shape = _shape; @@ -523,6 +531,13 @@ class Text extends TextBase with TextStyleContainer implements Sizable { return; } + /// STOKANAL-FORK-EDIT: logging + // if (text == 'F' && Random().nextDouble() < 0.01) { + // log('TEXT DRAW F > ${hashCode} lines=${_lines?.length} shape=${_shape!=null} styles=${_renderStyles.length} runs=${runs.map((r) => '${r.name}=${r.text}').join(",")}'); + // } else if (text == 'C' && Random().nextDouble() < 0.01) { + // log('TEXT DRAW C > ${hashCode} lines=${_lines?.length} shape=${_shape!=null} styles=${_renderStyles.length} runs=${runs.map((r) => '${r.name}=${r.text}').join(",")}'); + // } + if (!clip(canvas)) { canvas.save(); } From da72b6fdb43dd9468d448b4f765b408b8a30c77a Mon Sep 17 00:00:00 2001 From: gauchoj Date: Wed, 11 Sep 2024 15:17:36 -0300 Subject: [PATCH 06/50] updated dependencies --- pubspec.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 826890e5..cd0c3f22 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,7 +22,8 @@ dependencies: http: ">=0.13.3 <2.0.0" meta: ^1.3.0 plugin_platform_interface: ^2.0.2 - rive_common: 0.4.10 + rive_common: 0.4.11 # was 0.4.10 + dev_dependencies: flutter_test: sdk: flutter From 7b325c7b052afaf7cd02ec2248e2e3d3699e7871 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Tue, 17 Sep 2024 17:04:29 -0300 Subject: [PATCH 07/50] preparing overlay view to add pause, interval and post match --- lib/src/widgets/rive_animation.dart | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/src/widgets/rive_animation.dart b/lib/src/widgets/rive_animation.dart index d80f2dac..12a0d958 100644 --- a/lib/src/widgets/rive_animation.dart +++ b/lib/src/widgets/rive_animation.dart @@ -212,6 +212,21 @@ class RiveAnimationState extends State { _init(await _loadRiveFile()); } + /// STOKANAL-FORK-EDIT: start + /// This is a workaround to allow for embedded Rive animations. It hacks the Flutter State flow. + // @override + // RiveAnimation get widget => _widget??super.widget; + // RiveAnimation? _widget; + // @override + // bool get mounted => (_widget != null) ? true : super.mounted; + // @override + // void setState(VoidCallback fn) => (_widget != null) ? fn() : super.setState(fn); + // Future init(RiveAnimation widget) async { + // _widget = widget; + // initState(); + // } + /// STOKANAL-FORK-EDIT: end + /// Loads the correct Rive file depending on [widget.src] Future _loadRiveFile() { switch (widget.src) { From 41ab78079dffc974d3f0e6d996fb45ca33268e01 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 24 Oct 2024 15:17:29 -0300 Subject: [PATCH 08/50] preparing for sync --- lib/src/rive_core/artboard.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index cd8c84d9..4324be8d 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -134,11 +134,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// Iterate each component and call callback for it. void forEachComponent(void Function(Component) callback) { - // _components.forEach(callback); - /// STOKANAL-FORK-EDIT: dot not use forEach - for (final c in _components) { - callback(c); - } + _components.forEach(callback); } /// Find a component of a specific type with a specific name. From 0804e517f552bdd743f6d2e28a5fa1e0c5bb64b6 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 24 Oct 2024 15:41:51 -0300 Subject: [PATCH 09/50] after merge --- example/macos/Flutter/GeneratedPluginRegistrant.swift | 6 ------ 1 file changed, 6 deletions(-) diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index 8dfa1a4d..f6334d64 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,16 +5,10 @@ import FlutterMacOS import Foundation -import audio_session -import just_audio -import path_provider_foundation import rive_common import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) - JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } From 45ba276e20e632c4d31f56ff2e4d9c0d5abb18a0 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 6 Dec 2024 08:30:23 -0300 Subject: [PATCH 10/50] Update .gitignore --- .gitignore | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.gitignore b/.gitignore index 2491f4c6..19b56216 100644 --- a/.gitignore +++ b/.gitignore @@ -90,3 +90,19 @@ shared_lib/dependencies shared_lib/bin *.make Makefile + +# https://dart.dev/guides/libraries/private-files + +.dart_tool/ +build/ + +doc/api/ + +# IntelliJ +*.iml +*.ipr +*.iws +.idea/ + +# Mac +.DS_Store \ No newline at end of file From 89a24c76e3fe73aeb13fafcb6367e84b2acf7ffc Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 12 Dec 2024 15:59:06 -0300 Subject: [PATCH 11/50] fixed problem with release-mode asset pre loading --- lib/src/rive_file.dart | 3 ++- pubspec.yaml | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index ee91e599..a2abea70 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -355,7 +355,8 @@ class RiveFile { // TODO: in the next major version add an assert here to make this a // requirement if (!_initializedText) { - debugPrint('''Rive: RiveFile.import called before RiveFile.initialize(). Consider calling `await RiveFile.initialize()` before using `RiveFile.import`'''); + /// STOKANAL-FORK-EDIT + // debugPrint('''Rive: RiveFile.import called before RiveFile.initialize(). Consider calling `await RiveFile.initialize()` before using `RiveFile.import`'''); } var reader = BinaryReader(bytes); diff --git a/pubspec.yaml b/pubspec.yaml index 97f5a1d2..14fcb8cd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,6 +13,8 @@ environment: sdk: ">=2.17.0 <4.0.0" flutter: ">=2.5.0" +# see STOKANAL-FORK-EDIT for edits against the fork + dependencies: collection: ^1.15.0 flutter: From 8de21ebafe99b2e6e9070fd494f1473159de49d9 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sat, 11 Jan 2025 13:42:27 -0300 Subject: [PATCH 12/50] reviewing crashlytics --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 14fcb8cd..23852b7a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: http: ">=0.13.3 <2.0.0" meta: ^1.3.0 plugin_platform_interface: ^2.0.2 - rive_common: 0.4.12 # was 0.4.11 + rive_common: 0.4.13 # was 0.4.12 dev_dependencies: flutter_test: From bb9d34073dfd2b6eb63c8e15da73f18b33d51b52 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Tue, 28 Jan 2025 18:21:03 +0000 Subject: [PATCH 13/50] looking for performance opportunities in rive-flutter --- analysis_options.yaml | 4 +- .../Flutter/GeneratedPluginRegistrant.swift | 18 + .../flutter/generated_plugin_registrant.cc | 3 + .../windows/flutter/generated_plugins.cmake | 1 + .../animation/keyed_object_base.dart | 1 + .../animation/keyed_property_base.dart | 16 +- lib/src/generated/rive_core_context.dart | 660 ++++++++---------- lib/src/generated/shapes/vertex_base.dart | 2 + lib/src/rive_core/animation/keyed_object.dart | 45 +- .../rive_core/animation/keyed_property.dart | 11 +- .../rive_core/animation/linear_animation.dart | 5 +- lib/src/rive_core/artboard.dart | 2 +- lib/src/rive_core/dependency_helper.dart | 14 +- lib/src/rive_core/drawable.dart | 2 +- lib/src/rive_core/transform_component.dart | 2 +- pubspec.yaml | 20 +- 16 files changed, 386 insertions(+), 420 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 63fe01d8..0ce5339a 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,6 +1,7 @@ analyzer: errors: unused_import: error + prefer_is_empty: ignore exclude: - ios - macos @@ -51,7 +52,8 @@ linter: - join_return_with_assignment - library_names - library_prefixes - - lines_longer_than_80_chars + # STOKANAL-FORK-EDIT +# - lines_longer_than_80_chars # - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181 - no_adjacent_strings_in_list - no_duplicate_case_values diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index f6334d64..0aa3a062 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,10 +5,28 @@ import FlutterMacOS import Foundation +import audio_session +import device_info_plus +import flutter_udid +import in_app_purchase_storekit +import just_audio +import package_info_plus +import path_provider_foundation import rive_common +import shared_preferences_foundation import url_launcher_macos +import wakelock_plus func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FlutterUdidPlugin.register(with: registry.registrar(forPlugin: "FlutterUdidPlugin")) + InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) } diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc index 72ff4b78..bd19e8f5 100644 --- a/example/windows/flutter/generated_plugin_registrant.cc +++ b/example/windows/flutter/generated_plugin_registrant.cc @@ -6,10 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + FlutterUdidPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterUdidPluginCApi")); RivePluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("RivePlugin")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/example/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake index e141d513..974401b2 100644 --- a/example/windows/flutter/generated_plugins.cmake +++ b/example/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + flutter_udid rive_common url_launcher_windows ) diff --git a/lib/src/generated/animation/keyed_object_base.dart b/lib/src/generated/animation/keyed_object_base.dart index 5c1e6498..e03789dc 100644 --- a/lib/src/generated/animation/keyed_object_base.dart +++ b/lib/src/generated/animation/keyed_object_base.dart @@ -6,6 +6,7 @@ import 'package:rive/src/core/core.dart'; abstract class KeyedObjectBase extends Core { static const int typeKey = 25; + @override int get coreType => KeyedObjectBase.typeKey; @override diff --git a/lib/src/generated/animation/keyed_property_base.dart b/lib/src/generated/animation/keyed_property_base.dart index 515dcf97..c0837be6 100644 --- a/lib/src/generated/animation/keyed_property_base.dart +++ b/lib/src/generated/animation/keyed_property_base.dart @@ -15,20 +15,22 @@ abstract class KeyedPropertyBase extends Core { /// PropertyKey field with key 53. static const int propertyKeyPropertyKey = 53; static const int propertyKeyInitialValue = CoreContext.invalidPropertyKey; - int _propertyKey = propertyKeyInitialValue; + + /// STOKANAL-FORK-EDIT: exposing + int propertyKey_ = propertyKeyInitialValue; /// The property type that is keyed. - int get propertyKey => _propertyKey; + int get propertyKey => propertyKey_; - /// Change the [_propertyKey] field value. + /// Change the [propertyKey_] field value. /// [propertyKeyChanged] will be invoked only if the field's value has /// changed. set propertyKey(int value) { - if (_propertyKey == value) { + if (propertyKey_ == value) { return; } - int from = _propertyKey; - _propertyKey = value; + int from = propertyKey_; + propertyKey_ = value; if (hasValidated) { propertyKeyChanged(from, value); } @@ -40,7 +42,7 @@ abstract class KeyedPropertyBase extends Core { void copy(Core source) { super.copy(source); if (source is KeyedPropertyBase) { - _propertyKey = source._propertyKey; + propertyKey_ = source.propertyKey_; } } } diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index 9615a588..aeca152b 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -191,163 +191,34 @@ import 'package:rive/src/rive_core/viewmodel/viewmodel_property_viewmodel.dart'; // ignore: avoid_classes_with_only_static_members class RiveCoreContext { - // TODO migrate to new switches when available + // static final _counter = {}; - // static Core? makeCoreInstance3(int typeKey) => switch (typeKey) { - // ViewModelInstanceListItemBase.typeKey => ViewModelInstanceListItem(), - // }; + /// STOKANAL-FORK-EDIT + static Core? makeCoreInstance(int typeKey) { - // static Core? makeCoreInstance2(int typeKey) => switch (typeKey) { - // ViewModelInstanceListItemBase.typeKey => ViewModelInstanceListItem(), - // ViewModelInstanceColorBase.typeKey => ViewModelInstanceColor(), - // ViewModelComponentBase.typeKey => ViewModelComponent(), - // ViewModelPropertyBase.typeKey => ViewModelProperty(), - // ViewModelPropertyNumberBase.typeKey => ViewModelPropertyNumber(), - // ViewModelInstanceEnumBase.typeKey => ViewModelInstanceEnum(), - // ViewModelInstanceStringBase.typeKey => ViewModelInstanceString(), - // ViewModelPropertyListBase.typeKey => ViewModelPropertyList(), - // ViewModelBase.typeKey => ViewModel(), - // ViewModelPropertyViewModelBase.typeKey => ViewModelPropertyViewModel(), - // ViewModelInstanceBase.typeKey => ViewModelInstance(), - // ViewModelPropertyBooleanBase.typeKey => ViewModelPropertyBoolean(), - // DataEnumBase.typeKey => DataEnum(), - // ViewModelPropertyEnumBase.typeKey => ViewModelPropertyEnum(), - // ViewModelPropertyColorBase.typeKey => ViewModelPropertyColor(), - // ViewModelInstanceBooleanBase.typeKey => ViewModelInstanceBoolean(); - // ViewModelInstanceListBase.typeKey => ViewModelInstanceList(); - // ViewModelInstanceNumberBase.typeKey => ViewModelInstanceNumber(); - // ViewModelPropertyStringBase.typeKey => ViewModelPropertyString(); - // ViewModelInstanceViewModelBase.typeKey => ViewModelInstanceViewModel(); - // DataEnumValueBase.typeKey => DataEnumValue(); - // DrawTargetBase.typeKey => DrawTarget(); - // CustomPropertyNumberBase.typeKey => CustomPropertyNumber(); - // DistanceConstraintBase.typeKey => DistanceConstraint(); - // IKConstraintBase.typeKey => IKConstraint(); - // FollowPathConstraintBase.typeKey => FollowPathConstraint(); - // TranslationConstraintBase.typeKey => TranslationConstraint(); - // TransformConstraintBase.typeKey => TransformConstraint(); - // ScaleConstraintBase.typeKey => ScaleConstraint(); - // RotationConstraintBase.typeKey => RotationConstraint(); - // NodeBase.typeKey => Node(); - // NestedArtboardBase.typeKey => NestedArtboard(); - // SoloBase.typeKey => Solo(); - // LayoutComponentStyleBase.typeKey => LayoutComponentStyle(); - // ListenerFireEventBase.typeKey => ListenerFireEvent(); - // KeyFrameUintBase.typeKey => KeyFrameUint(); - // AnimationBase.typeKey => Animation(); - // LinearAnimationBase.typeKey => LinearAnimation(); - // NestedSimpleAnimationBase.typeKey => NestedSimpleAnimation(); - // AnimationStateBase.typeKey => AnimationState(); - // NestedTriggerBase.typeKey => NestedTrigger(); - // KeyedObjectBase.typeKey => KeyedObject(); - // BlendAnimationDirectBase.typeKey => BlendAnimationDirect(); - // StateMachineNumberBase.typeKey => StateMachineNumber(); - // CubicValueInterpolatorBase.typeKey => CubicValueInterpolator(); - // TransitionTriggerConditionBase.typeKey => TransitionTriggerCondition(); - // KeyedPropertyBase.typeKey => KeyedProperty(); - // StateMachineListenerBase.typeKey => StateMachineListener(); - // TransitionPropertyViewModelComparatorBase.typeKey => TransitionPropertyViewModelComparator(); - // KeyFrameIdBase.typeKey => KeyFrameId(); - // KeyFrameBoolBase.typeKey => KeyFrameBool(); - // ListenerBoolChangeBase.typeKey => ListenerBoolChange(); - // ListenerAlignTargetBase.typeKey => ListenerAlignTarget(); - // TransitionNumberConditionBase.typeKey => TransitionNumberCondition(); - // TransitionValueBooleanComparatorBase.typeKey => TransitionValueBooleanComparator(); - // AnyStateBase.typeKey => AnyState(); - // CubicInterpolatorComponentBase.typeKey => CubicInterpolatorComponent(); - // StateMachineLayerBase.typeKey => StateMachineLayer(); - // KeyFrameStringBase.typeKey => KeyFrameString(); - // ListenerNumberChangeBase.typeKey => ListenerNumberChange(); - // TransitionViewModelConditionBase.typeKey => TransitionViewModelCondition(); - // CubicEaseInterpolatorBase.typeKey => CubicEaseInterpolator(); - // StateTransitionBase.typeKey => StateTransition(); - // NestedBoolBase.typeKey => NestedBool(); - // KeyFrameDoubleBase.typeKey => KeyFrameDouble(); - // KeyFrameColorBase.typeKey => KeyFrameColor(); - // StateMachineBase.typeKey => StateMachine(); - // StateMachineFireEventBase.typeKey => StateMachineFireEvent(); - // EntryStateBase.typeKey => EntryState(); - // StateMachineTriggerBase.typeKey => StateMachineTrigger(); - // TransitionValueColorComparatorBase.typeKey => TransitionValueColorComparator(); - // ListenerTriggerChangeBase.typeKey => ListenerTriggerChange(); - // BlendStateDirectBase.typeKey => BlendStateDirect(); - // TransitionValueNumberComparatorBase.typeKey => TransitionValueNumberComparator(); - // NestedStateMachineBase.typeKey => NestedStateMachine(); - // ElasticInterpolatorBase.typeKey => ElasticInterpolator(); - // ExitStateBase.typeKey => ExitState(); - // NestedNumberBase.typeKey => NestedNumber(); - // BlendAnimation1DBase.typeKey => BlendAnimation1D(); - // BlendState1DBase.typeKey => BlendState1D(); - // TransitionValueEnumComparatorBase.typeKey => TransitionValueEnumComparator(); - // KeyFrameCallbackBase.typeKey => KeyFrameCallback(); - // TransitionValueStringComparatorBase.typeKey => TransitionValueStringComparator(); - // NestedRemapAnimationBase.typeKey => NestedRemapAnimation(); - // TransitionBoolConditionBase.typeKey => TransitionBoolCondition(); - // BlendStateTransitionBase.typeKey => BlendStateTransition(); - // StateMachineBoolBase.typeKey => StateMachineBool(); - // LinearGradientBase.typeKey => LinearGradient(); - // RadialGradientBase.typeKey => RadialGradient(); - // StrokeBase.typeKey => Stroke(); - // SolidColorBase.typeKey => SolidColor(); - // GradientStopBase.typeKey => GradientStop(); - // TrimPathBase.typeKey => TrimPath(); - // FillBase.typeKey => Fill(); - // MeshVertexBase.typeKey => MeshVertex(); - // ShapeBase.typeKey => Shape(); - // WeightBase.typeKey => Weight(); - // StraightVertexBase.typeKey => StraightVertex(); - // CubicWeightBase.typeKey => CubicWeight(); - // CubicAsymmetricVertexBase.typeKey => CubicAsymmetricVertex(); - // MeshBase.typeKey => Mesh(); - // PointsPathBase.typeKey => PointsPath(); - // ContourMeshVertexBase.typeKey => ContourMeshVertex(); - // RectangleBase.typeKey => Rectangle(); - // CubicMirroredVertexBase.typeKey => CubicMirroredVertex(); - // TriangleBase.typeKey => Triangle(); - // EllipseBase.typeKey => Ellipse(); - // ClippingShapeBase.typeKey => ClippingShape(); - // PolygonBase.typeKey => Polygon(); - // StarBase.typeKey => Star(); - // ImageBase.typeKey => Image(); - // CubicDetachedVertexBase.typeKey => CubicDetachedVertex(); - // EventBase.typeKey => Event(); - // DrawRulesBase.typeKey => DrawRules(); - // CustomPropertyBooleanBase.typeKey => CustomPropertyBoolean(); - // LayoutComponentBase.typeKey => LayoutComponent(); - // ArtboardBase.typeKey => Artboard(); - // JoystickBase.typeKey => Joystick(); - // BackboardBase.typeKey => Backboard(); - // OpenUrlEventBase.typeKey => OpenUrlEvent(); - // BindablePropertyBooleanBase.typeKey => BindablePropertyBoolean(); - // DataBindBase.typeKey => DataBind(); - // DataBindContextBase.typeKey => DataBindContext(); - // BindablePropertyStringBase.typeKey => BindablePropertyString(); - // BindablePropertyNumberBase.typeKey => BindablePropertyNumber(); - // BindablePropertyEnumBase.typeKey => BindablePropertyEnum(); - // BindablePropertyColorBase.typeKey => BindablePropertyColor(); - // BoneBase.typeKey => Bone(), - // RootBoneBase.typeKey => RootBone(), - // SkinBase.typeKey => Skin(), - // TendonBase.typeKey => Tendon(), - // TextModifierRangeBase.typeKey => TextModifierRange(), - // TextStyleFeatureBase.typeKey => TextStyleFeature(), - // TextVariationModifierBase.typeKey => TextVariationModifier(), - // TextModifierGroupBase.typeKey => TextModifierGroup(), - // TextStyleBase.typeKey => TextStyle(), - // TextStyleAxisBase.typeKey => TextStyleAxis(), - // TextBase.typeKey => Text(), - // TextValueRunBase.typeKey => TextValueRun(), - // CustomPropertyStringBase.typeKey => CustomPropertyString(), - // FolderBase.typeKey => Folder(), - // ImageAssetBase.typeKey => ImageAsset(), - // FontAssetBase.typeKey => FontAsset(), - // AudioAssetBase.typeKey => AudioAsset(), - // FileAssetContentsBase.typeKey => FileAssetContents(), - // AudioEventBase.typeKey => AudioEvent(), - // default => null, - // }; + switch (typeKey) { + case KeyFrameDoubleBase.typeKey: return KeyFrameDouble(); + case KeyedPropertyBase.typeKey: return KeyedProperty(); + case KeyedObjectBase.typeKey: return KeyedObject(); + case KeyFrameIdBase.typeKey: return KeyFrameId(); + case TransitionNumberConditionBase.typeKey: return TransitionNumberCondition(); + case TransitionBoolConditionBase.typeKey: return TransitionBoolCondition(); + case CubicEaseInterpolatorBase.typeKey: return CubicEaseInterpolator(); + case CubicDetachedVertexBase.typeKey: return CubicDetachedVertex(); + case StateTransitionBase.typeKey: return StateTransition(); + case CubicValueInterpolatorBase.typeKey: return CubicValueInterpolator(); + case StraightVertexBase.typeKey: return StraightVertex(); + case AnimationStateBase.typeKey: return AnimationState(); + case ImageBase.typeKey: return Image(); + case NodeBase.typeKey: return Node(); + case LinearAnimationBase.typeKey: return LinearAnimation(); + } + + // _counter.putIfAbsent(typeKey, IntCapsule.new).increment(); + // if (Randoms().hit(0.001)) { + // info('makeCoreInstance > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); + // } - static Core? makeCoreInstance(int typeKey) { switch (typeKey) { case ViewModelInstanceListItemBase.typeKey: return ViewModelInstanceListItem(); @@ -409,8 +280,6 @@ class RiveCoreContext { return ScaleConstraint(); case RotationConstraintBase.typeKey: return RotationConstraint(); - case NodeBase.typeKey: - return Node(); case NestedArtboardBase.typeKey: return NestedArtboard(); case SoloBase.typeKey: @@ -423,40 +292,26 @@ class RiveCoreContext { return KeyFrameUint(); case AnimationBase.typeKey: return Animation(); - case LinearAnimationBase.typeKey: - return LinearAnimation(); case NestedSimpleAnimationBase.typeKey: return NestedSimpleAnimation(); - case AnimationStateBase.typeKey: - return AnimationState(); case NestedTriggerBase.typeKey: return NestedTrigger(); - case KeyedObjectBase.typeKey: - return KeyedObject(); case BlendAnimationDirectBase.typeKey: return BlendAnimationDirect(); case StateMachineNumberBase.typeKey: return StateMachineNumber(); - case CubicValueInterpolatorBase.typeKey: - return CubicValueInterpolator(); case TransitionTriggerConditionBase.typeKey: return TransitionTriggerCondition(); - case KeyedPropertyBase.typeKey: - return KeyedProperty(); case StateMachineListenerBase.typeKey: return StateMachineListener(); case TransitionPropertyViewModelComparatorBase.typeKey: return TransitionPropertyViewModelComparator(); - case KeyFrameIdBase.typeKey: - return KeyFrameId(); case KeyFrameBoolBase.typeKey: return KeyFrameBool(); case ListenerBoolChangeBase.typeKey: return ListenerBoolChange(); case ListenerAlignTargetBase.typeKey: return ListenerAlignTarget(); - case TransitionNumberConditionBase.typeKey: - return TransitionNumberCondition(); case TransitionValueBooleanComparatorBase.typeKey: return TransitionValueBooleanComparator(); case AnyStateBase.typeKey: @@ -471,14 +326,8 @@ class RiveCoreContext { return ListenerNumberChange(); case TransitionViewModelConditionBase.typeKey: return TransitionViewModelCondition(); - case CubicEaseInterpolatorBase.typeKey: - return CubicEaseInterpolator(); - case StateTransitionBase.typeKey: - return StateTransition(); case NestedBoolBase.typeKey: return NestedBool(); - case KeyFrameDoubleBase.typeKey: - return KeyFrameDouble(); case KeyFrameColorBase.typeKey: return KeyFrameColor(); case StateMachineBase.typeKey: @@ -519,8 +368,6 @@ class RiveCoreContext { return TransitionValueStringComparator(); case NestedRemapAnimationBase.typeKey: return NestedRemapAnimation(); - case TransitionBoolConditionBase.typeKey: - return TransitionBoolCondition(); case BlendStateTransitionBase.typeKey: return BlendStateTransition(); case StateMachineBoolBase.typeKey: @@ -545,8 +392,6 @@ class RiveCoreContext { return Shape(); case WeightBase.typeKey: return Weight(); - case StraightVertexBase.typeKey: - return StraightVertex(); case CubicWeightBase.typeKey: return CubicWeight(); case CubicAsymmetricVertexBase.typeKey: @@ -571,10 +416,6 @@ class RiveCoreContext { return Polygon(); case StarBase.typeKey: return Star(); - case ImageBase.typeKey: - return Image(); - case CubicDetachedVertexBase.typeKey: - return CubicDetachedVertex(); case EventBase.typeKey: return Event(); case DrawRulesBase.typeKey: @@ -648,7 +489,72 @@ class RiveCoreContext { } } + /// STOKANAL-FORK-EDIT static void setObjectProperty(Core object, int propertyKey, Object value) { + + switch (propertyKey) { + case InterpolatingKeyFrameBase.interpolationTypePropertyKey: + (object as InterpolatingKeyFrameBase).interpolationType = value as int; + // if (object is InterpolatingKeyFrameBase && value is int) { + // object.interpolationType = value; + // } + return; + + case KeyFrameDoubleBase.valuePropertyKey: + (object as KeyFrameDoubleBase).value =value as double; + // if (object is KeyFrameDoubleBase && value is double) { + // object.value = value; + // } + return; + + case KeyedPropertyBase.propertyKeyPropertyKey: + (object as KeyedPropertyBase).propertyKey = value as int; + // if (object is KeyedPropertyBase && value is int) { + // object.propertyKey = value; + // } + return; + + case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: + (object as InterpolatingKeyFrameBase).interpolatorId = value as int; + // if (object is InterpolatingKeyFrameBase && value is int) { + // object.interpolatorId = value; + // } + return; + + case KeyFrameBase.framePropertyKey: + (object as KeyFrameBase).frame = value as int; + // if (object is KeyFrameBase && value is int) { + // object.frame = value; + // } + return; + + case KeyedObjectBase.objectIdPropertyKey: + (object as KeyedObjectBase).objectId = value as int; + // if (object is KeyedObjectBase && value is int) { + // object.objectId = value; + // } + return; + + case ComponentBase.parentIdPropertyKey: + (object as ComponentBase).parentId = value as int; + // if (object is ComponentBase && value is int) { + // object.parentId = value; + // } + return; + + case LayoutComponentStyleBase.interpolatorIdPropertyKey: + (object as LayoutComponentStyleBase).interpolatorId = value as int; + // if (object is LayoutComponentStyleBase && value is int) { + // object.interpolatorId = value; + // } + return; + } + + // _counter.putIfAbsent(propertyKey, IntCapsule.new).increment(); + // if (Randoms().hit(0.001)) { + // info('setObjectProperty > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); + // } + switch (propertyKey) { case ViewModelInstanceListItemBase.useLinkedArtboardPropertyKey: if (object is ViewModelInstanceListItemBase && value is bool) { @@ -710,11 +616,6 @@ class RiveCoreContext { object.name = value; } break; - case ComponentBase.parentIdPropertyKey: - if (object is ComponentBase && value is int) { - object.parentId = value; - } - break; case ViewModelInstanceBase.viewModelIdPropertyKey: if (object is ViewModelInstanceBase && value is int) { object.viewModelId = value; @@ -1125,11 +1026,6 @@ class RiveCoreContext { object.interpolationType = value; } break; - case LayoutComponentStyleBase.interpolatorIdPropertyKey: - if (object is LayoutComponentStyleBase && value is int) { - object.interpolatorId = value; - } - break; case LayoutComponentStyleBase.interpolationTimePropertyKey: if (object is LayoutComponentStyleBase && value is double) { object.interpolationTime = value; @@ -1320,21 +1216,6 @@ class RiveCoreContext { object.flags = value; } break; - case KeyFrameBase.framePropertyKey: - if (object is KeyFrameBase && value is int) { - object.frame = value; - } - break; - case InterpolatingKeyFrameBase.interpolationTypePropertyKey: - if (object is InterpolatingKeyFrameBase && value is int) { - object.interpolationType = value; - } - break; - case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: - if (object is InterpolatingKeyFrameBase && value is int) { - object.interpolatorId = value; - } - break; case KeyFrameUintBase.valuePropertyKey: if (object is KeyFrameUintBase && value is int) { object.value = value; @@ -1425,11 +1306,6 @@ class RiveCoreContext { object.inputId = value; } break; - case KeyedObjectBase.objectIdPropertyKey: - if (object is KeyedObjectBase && value is int) { - object.objectId = value; - } - break; case BlendAnimationBase.animationIdPropertyKey: if (object is BlendAnimationBase && value is int) { object.animationId = value; @@ -1485,11 +1361,6 @@ class RiveCoreContext { object.inputId = value; } break; - case KeyedPropertyBase.propertyKeyPropertyKey: - if (object is KeyedPropertyBase && value is int) { - object.propertyKey = value; - } - break; case StateMachineListenerBase.targetIdPropertyKey: if (object is StateMachineListenerBase && value is int) { object.targetId = value; @@ -1630,11 +1501,6 @@ class RiveCoreContext { object.nestedValue = value; } break; - case KeyFrameDoubleBase.valuePropertyKey: - if (object is KeyFrameDoubleBase && value is double) { - object.value = value; - } - break; case KeyFrameColorBase.valuePropertyKey: if (object is KeyFrameColorBase && value is int) { object.value = value; @@ -2551,8 +2417,32 @@ class RiveCoreContext { static CoreFieldType bytesType = CoreBytesType(); static CoreFieldType callbackType = CoreCallbackType(); + /// STOKANAL-FORK-EDIT static CoreFieldType? coreType(int propertyKey) { + switch (propertyKey) { + + case InterpolatingKeyFrameBase.interpolationTypePropertyKey: + case KeyedPropertyBase.propertyKeyPropertyKey: + case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: + case KeyFrameBase.framePropertyKey: + case KeyedObjectBase.objectIdPropertyKey: + case ComponentBase.parentIdPropertyKey: + return uintType; + + case KeyFrameDoubleBase.valuePropertyKey: + case NodeBase.xPropertyKey: + case NodeBase.yPropertyKey: + return doubleType; + } + + // _counter.putIfAbsent(propertyKey, IntCapsule.new).increment(); + // if (Randoms().hit(0.001)) { + // info('coreType > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); + // } + + switch (propertyKey) { + case ViewModelInstanceListItemBase.useLinkedArtboardPropertyKey: case ViewModelInstanceBooleanBase.propertyValuePropertyKey: case TransformComponentConstraintBase.offsetPropertyKey: @@ -2592,7 +2482,6 @@ class RiveCoreContext { case ViewModelInstanceEnumBase.propertyValuePropertyKey: case ViewModelBase.defaultInstanceIdPropertyKey: case ViewModelPropertyViewModelBase.viewModelReferenceIdPropertyKey: - case ComponentBase.parentIdPropertyKey: case ViewModelInstanceBase.viewModelIdPropertyKey: case ViewModelPropertyEnumBase.enumIdPropertyKey: case ViewModelInstanceViewModelBase.propertyValuePropertyKey: @@ -2614,7 +2503,6 @@ class RiveCoreContext { case LayoutComponentStyleBase.scaleTypePropertyKey: case LayoutComponentStyleBase.layoutAlignmentTypePropertyKey: case LayoutComponentStyleBase.animationStyleTypePropertyKey: - case LayoutComponentStyleBase.interpolationTypePropertyKey: case LayoutComponentStyleBase.interpolatorIdPropertyKey: case LayoutComponentStyleBase.displayValuePropertyKey: case LayoutComponentStyleBase.positionTypeValuePropertyKey: @@ -2652,9 +2540,6 @@ class RiveCoreContext { case LayoutComponentStyleBase.maxHeightUnitsValuePropertyKey: case ListenerFireEventBase.eventIdPropertyKey: case LayerStateBase.flagsPropertyKey: - case KeyFrameBase.framePropertyKey: - case InterpolatingKeyFrameBase.interpolationTypePropertyKey: - case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: case KeyFrameUintBase.valuePropertyKey: case LinearAnimationBase.fpsPropertyKey: case LinearAnimationBase.durationPropertyKey: @@ -2665,12 +2550,10 @@ class RiveCoreContext { case ListenerInputChangeBase.nestedInputIdPropertyKey: case AnimationStateBase.animationIdPropertyKey: case NestedInputBase.inputIdPropertyKey: - case KeyedObjectBase.objectIdPropertyKey: case BlendAnimationBase.animationIdPropertyKey: case BlendAnimationDirectBase.inputIdPropertyKey: case BlendAnimationDirectBase.blendSourcePropertyKey: case TransitionInputConditionBase.inputIdPropertyKey: - case KeyedPropertyBase.propertyKeyPropertyKey: case StateMachineListenerBase.targetIdPropertyKey: case StateMachineListenerBase.listenerTypeValuePropertyKey: case StateMachineListenerBase.eventIdPropertyKey: @@ -2742,6 +2625,7 @@ class RiveCoreContext { case TextValueRunBase.styleIdPropertyKey: case FileAssetBase.assetIdPropertyKey: case AudioEventBase.assetIdPropertyKey: + case LayoutComponentStyleBase.interpolationTypePropertyKey: return uintType; case ViewModelInstanceColorBase.propertyValuePropertyKey: case KeyFrameColorBase.valuePropertyKey: @@ -2784,8 +2668,6 @@ class RiveCoreContext { case TransformComponentBase.rotationPropertyKey: case TransformComponentBase.scaleXPropertyKey: case TransformComponentBase.scaleYPropertyKey: - case NodeBase.xPropertyKey: - case NodeBase.yPropertyKey: case LayoutComponentStyleBase.gapHorizontalPropertyKey: case LayoutComponentStyleBase.gapVerticalPropertyKey: case LayoutComponentStyleBase.maxWidthPropertyKey: @@ -2830,7 +2712,6 @@ class RiveCoreContext { case CubicInterpolatorComponentBase.x2PropertyKey: case CubicInterpolatorComponentBase.y2PropertyKey: case ListenerNumberChangeBase.valuePropertyKey: - case KeyFrameDoubleBase.valuePropertyKey: case TransitionValueNumberComparatorBase.valuePropertyKey: case ElasticInterpolatorBase.amplitudePropertyKey: case ElasticInterpolatorBase.periodPropertyKey: @@ -3024,6 +2905,7 @@ class RiveCoreContext { } static int getUint(Core object, int propertyKey) { + switch (propertyKey) { case ViewModelInstanceListItemBase.viewModelIdPropertyKey: return (object as ViewModelInstanceListItemBase).viewModelId; @@ -3344,6 +3226,7 @@ class RiveCoreContext { } static int getColor(Core object, int propertyKey) { + switch (propertyKey) { case ViewModelInstanceColorBase.propertyValuePropertyKey: return (object as ViewModelInstanceColorBase).propertyValue; @@ -3362,6 +3245,7 @@ class RiveCoreContext { } static String getString(Core object, int propertyKey) { + switch (propertyKey) { case ViewModelComponentBase.namePropertyKey: return (object as ViewModelComponentBase).name; @@ -3399,8 +3283,16 @@ class RiveCoreContext { return ''; } + /// STOKANAL-FORK-EDIT static double getDouble(Core object, int propertyKey) { + switch (propertyKey) { + + case NodeBase.xPropertyKey: + return (object as NodeBase).x; + case NodeBase.yPropertyKey: + return (object as NodeBase).y; + case ViewModelInstanceNumberBase.propertyValuePropertyKey: return (object as ViewModelInstanceNumberBase).propertyValue; case CustomPropertyNumberBase.propertyValuePropertyKey: @@ -3435,10 +3327,6 @@ class RiveCoreContext { return (object as TransformComponentBase).scaleX; case TransformComponentBase.scaleYPropertyKey: return (object as TransformComponentBase).scaleY; - case NodeBase.xPropertyKey: - return (object as NodeBase).x; - case NodeBase.yPropertyKey: - return (object as NodeBase).y; case LayoutComponentStyleBase.gapHorizontalPropertyKey: return (object as LayoutComponentStyleBase).gapHorizontal; case LayoutComponentStyleBase.gapVerticalPropertyKey: @@ -3732,6 +3620,7 @@ class RiveCoreContext { } static Uint8List getBytes(Core object, int propertyKey) { + switch (propertyKey) { case NestedArtboardBase.dataBindPathIdsPropertyKey: return (object as NestedArtboardBase).dataBindPathIds; @@ -3747,8 +3636,18 @@ class RiveCoreContext { return Uint8List(0); } + /// STOKANAL-FORK-EDIT static void setBool(Core object, int propertyKey, bool value) { + switch (propertyKey) { + + case NestedSimpleAnimationBase.isPlayingPropertyKey: + (object as NestedSimpleAnimationBase).isPlaying = value; + // if (object is NestedSimpleAnimationBase) { + // object.isPlaying = value; + // } + break; + case ViewModelInstanceListItemBase.useLinkedArtboardPropertyKey: if (object is ViewModelInstanceListItemBase) { object.useLinkedArtboard = value; @@ -3824,11 +3723,6 @@ class RiveCoreContext { object.quantize = value; } break; - case NestedSimpleAnimationBase.isPlayingPropertyKey: - if (object is NestedSimpleAnimationBase) { - object.isPlaying = value; - } - break; case KeyFrameBoolBase.valuePropertyKey: if (object is KeyFrameBoolBase) { object.value = value; @@ -3907,8 +3801,25 @@ class RiveCoreContext { } } + /// STOKANAL-FORK-EDIT static void setUint(Core object, int propertyKey, int value) { + switch (propertyKey) { + + case SoloBase.activeComponentIdPropertyKey: + (object as SoloBase).activeComponentId = value; + // if (object is SoloBase) { + // object.activeComponentId = value; + // } + return; + + case DrawRulesBase.drawTargetIdPropertyKey: + (object as DrawRulesBase).drawTargetId = value; + // if (object is DrawRulesBase) { + // object.drawTargetId = value; + // } + return; + case ViewModelInstanceListItemBase.viewModelIdPropertyKey: if (object is ViewModelInstanceListItemBase) { object.viewModelId = value; @@ -4034,11 +3945,6 @@ class RiveCoreContext { object.animationId = value; } break; - case SoloBase.activeComponentIdPropertyKey: - if (object is SoloBase) { - object.activeComponentId = value; - } - break; case LayoutComponentStyleBase.scaleTypePropertyKey: if (object is LayoutComponentStyleBase) { object.scaleType = value; @@ -4529,11 +4435,6 @@ class RiveCoreContext { object.assetId = value; } break; - case DrawRulesBase.drawTargetIdPropertyKey: - if (object is DrawRulesBase) { - object.drawTargetId = value; - } - break; case LayoutComponentBase.styleIdPropertyKey: if (object is LayoutComponentBase) { object.styleId = value; @@ -4697,8 +4598,29 @@ class RiveCoreContext { } } + /// STOKANAL-FORK-EDIT static void setColor(Core object, int propertyKey, int value) { + + // _counter.putIfAbsent(propertyKey, IntCapsule.new).increment(); + // if (Randoms().hit(0.001)) { + // info('setColor > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); + // } + + // reordered switch (propertyKey) { + case SolidColorBase.colorValuePropertyKey: + (object as SolidColorBase).colorValue = value; + // if (object is SolidColorBase) { + // object.colorValue = value; + // } + return; + case GradientStopBase.colorValuePropertyKey: + (object as GradientStopBase).colorValue = value; + // if (object is GradientStopBase) { + // object.colorValue = value; + // } + return; + case ViewModelInstanceColorBase.propertyValuePropertyKey: if (object is ViewModelInstanceColorBase) { object.propertyValue = value; @@ -4714,16 +4636,6 @@ class RiveCoreContext { object.value = value; } break; - case SolidColorBase.colorValuePropertyKey: - if (object is SolidColorBase) { - object.colorValue = value; - } - break; - case GradientStopBase.colorValuePropertyKey: - if (object is GradientStopBase) { - object.colorValue = value; - } - break; case BindablePropertyColorBase.propertyValuePropertyKey: if (object is BindablePropertyColorBase) { object.propertyValue = value; @@ -4733,6 +4645,7 @@ class RiveCoreContext { } static void setString(Core object, int propertyKey, String value) { + switch (propertyKey) { case ViewModelComponentBase.namePropertyKey: if (object is ViewModelComponentBase) { @@ -4817,8 +4730,129 @@ class RiveCoreContext { } } + /// STOKANAL-FORK-EDIT static void setDouble(Core object, int propertyKey, double value) { + + // reordered switch to allow for more frequent in the beginning switch (propertyKey) { + case VertexBase.xPropertyKey: + (object as VertexBase).x = value; + // if (object is VertexBase) { + // object.x = value; + // } + return; + case VertexBase.yPropertyKey: + (object as VertexBase).y = value; + // if (object is VertexBase) { + // object.y = value; + // } + return; + case CubicDetachedVertexBase.outRotationPropertyKey: + (object as CubicDetachedVertexBase).outRotation = value; + // if (object is CubicDetachedVertexBase) { + // object.outRotation = value; + // } + return; + case CubicDetachedVertexBase.outDistancePropertyKey: + (object as CubicDetachedVertexBase).outDistance = value; + // if (object is CubicDetachedVertexBase) { + // object.outDistance = value; + // } + return; + case CubicDetachedVertexBase.inRotationPropertyKey: + (object as CubicDetachedVertexBase).inRotation = value; + // if (object is CubicDetachedVertexBase) { + // object.inRotation = value; + // } + return; + case CubicAsymmetricVertexBase.inDistancePropertyKey: + (object as CubicAsymmetricVertexBase).inDistance = value; + // if (object is CubicAsymmetricVertexBase) { + // object.inDistance = value; + // } + return; + case NodeBase.xPropertyKey: + (object as NodeBase).x = value; + // if (object is NodeBase) { + // object.x = value; + // } + return; + case NodeBase.yPropertyKey: + (object as NodeBase).y = value; + // if (object is NodeBase) { + // object.y = value; + // } + return; + case CubicDetachedVertexBase.inDistancePropertyKey: + if (object is CubicDetachedVertexBase) { + object.inDistance = value; + } + return; + case TransformComponentBase.scaleXPropertyKey: + if (object is TransformComponentBase) { + object.scaleX = value; + } + return; + case TransformComponentBase.scaleYPropertyKey: + if (object is TransformComponentBase) { + object.scaleY = value; + } + return; + case TransformComponentBase.rotationPropertyKey: + if (object is TransformComponentBase) { + object.rotation = value; + } + return; + case DistanceConstraintBase.distancePropertyKey: + if (object is DistanceConstraintBase) { + object.distance = value; + } + return; + case WorldTransformComponentBase.opacityPropertyKey: + if (object is WorldTransformComponentBase) { + object.opacity = value; + } + return; + case CubicAsymmetricVertexBase.rotationPropertyKey: + if (object is CubicAsymmetricVertexBase) { + object.rotation = value; + } + return; + case CubicMirroredVertexBase.rotationPropertyKey: + if (object is CubicMirroredVertexBase) { + object.rotation = value; + } + return; + case CubicMirroredVertexBase.distancePropertyKey: + if (object is CubicMirroredVertexBase) { + object.distance = value; + } + return; + case CubicAsymmetricVertexBase.outDistancePropertyKey: + if (object is CubicAsymmetricVertexBase) { + object.outDistance = value; + } + return; + case GradientStopBase.positionPropertyKey: + if (object is GradientStopBase) { + object.position = value; + } + return; + case StrokeBase.thicknessPropertyKey: + if (object is StrokeBase) { + object.thickness = value; + } + return; + + // } + // + // _counter.putIfAbsent(propertyKey, IntCapsule.new).increment(); + // if (Randoms().hit(0.001)) { + // info('setDouble > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); + // } + // + // switch (propertyKey) { + case ViewModelInstanceNumberBase.propertyValuePropertyKey: if (object is ViewModelInstanceNumberBase) { object.propertyValue = value; @@ -4834,11 +4868,6 @@ class RiveCoreContext { object.strength = value; } break; - case DistanceConstraintBase.distancePropertyKey: - if (object is DistanceConstraintBase) { - object.distance = value; - } - break; case TransformComponentConstraintBase.copyFactorPropertyKey: if (object is TransformComponentConstraintBase) { object.copyFactor = value; @@ -4884,36 +4913,6 @@ class RiveCoreContext { object.originY = value; } break; - case WorldTransformComponentBase.opacityPropertyKey: - if (object is WorldTransformComponentBase) { - object.opacity = value; - } - break; - case TransformComponentBase.rotationPropertyKey: - if (object is TransformComponentBase) { - object.rotation = value; - } - break; - case TransformComponentBase.scaleXPropertyKey: - if (object is TransformComponentBase) { - object.scaleX = value; - } - break; - case TransformComponentBase.scaleYPropertyKey: - if (object is TransformComponentBase) { - object.scaleY = value; - } - break; - case NodeBase.xPropertyKey: - if (object is NodeBase) { - object.x = value; - } - break; - case NodeBase.yPropertyKey: - if (object is NodeBase) { - object.y = value; - } - break; case LayoutComponentStyleBase.gapHorizontalPropertyKey: if (object is LayoutComponentStyleBase) { object.gapHorizontal = value; @@ -5194,16 +5193,6 @@ class RiveCoreContext { object.opacity = value; } break; - case StrokeBase.thicknessPropertyKey: - if (object is StrokeBase) { - object.thickness = value; - } - break; - case GradientStopBase.positionPropertyKey: - if (object is GradientStopBase) { - object.position = value; - } - break; case TrimPathBase.startPropertyKey: if (object is TrimPathBase) { object.start = value; @@ -5219,16 +5208,6 @@ class RiveCoreContext { object.offset = value; } break; - case VertexBase.xPropertyKey: - if (object is VertexBase) { - object.x = value; - } - break; - case VertexBase.yPropertyKey: - if (object is VertexBase) { - object.y = value; - } - break; case MeshVertexBase.uPropertyKey: if (object is MeshVertexBase) { object.u = value; @@ -5244,21 +5223,6 @@ class RiveCoreContext { object.radius = value; } break; - case CubicAsymmetricVertexBase.rotationPropertyKey: - if (object is CubicAsymmetricVertexBase) { - object.rotation = value; - } - break; - case CubicAsymmetricVertexBase.inDistancePropertyKey: - if (object is CubicAsymmetricVertexBase) { - object.inDistance = value; - } - break; - case CubicAsymmetricVertexBase.outDistancePropertyKey: - if (object is CubicAsymmetricVertexBase) { - object.outDistance = value; - } - break; case ParametricPathBase.widthPropertyKey: if (object is ParametricPathBase) { object.width = value; @@ -5299,16 +5263,6 @@ class RiveCoreContext { object.cornerRadiusBR = value; } break; - case CubicMirroredVertexBase.rotationPropertyKey: - if (object is CubicMirroredVertexBase) { - object.rotation = value; - } - break; - case CubicMirroredVertexBase.distancePropertyKey: - if (object is CubicMirroredVertexBase) { - object.distance = value; - } - break; case PolygonBase.cornerRadiusPropertyKey: if (object is PolygonBase) { object.cornerRadius = value; @@ -5329,26 +5283,6 @@ class RiveCoreContext { object.originY = value; } break; - case CubicDetachedVertexBase.inRotationPropertyKey: - if (object is CubicDetachedVertexBase) { - object.inRotation = value; - } - break; - case CubicDetachedVertexBase.inDistancePropertyKey: - if (object is CubicDetachedVertexBase) { - object.inDistance = value; - } - break; - case CubicDetachedVertexBase.outRotationPropertyKey: - if (object is CubicDetachedVertexBase) { - object.outRotation = value; - } - break; - case CubicDetachedVertexBase.outDistancePropertyKey: - if (object is CubicDetachedVertexBase) { - object.outDistance = value; - } - break; case LayoutComponentBase.widthPropertyKey: if (object is LayoutComponentBase) { object.width = value; diff --git a/lib/src/generated/shapes/vertex_base.dart b/lib/src/generated/shapes/vertex_base.dart index 58fb3278..f0185db3 100644 --- a/lib/src/generated/shapes/vertex_base.dart +++ b/lib/src/generated/shapes/vertex_base.dart @@ -20,6 +20,7 @@ abstract class VertexBase extends ContainerComponent { /// X field with key 24. static const int xPropertyKey = 24; static const double xInitialValue = 0; + double _x = xInitialValue; /// X value for the translation of the vertex. @@ -44,6 +45,7 @@ abstract class VertexBase extends ContainerComponent { /// Y field with key 25. static const int yPropertyKey = 25; static const double yInitialValue = 0; + double _y = yInitialValue; /// Y value for the translation of the vertex. diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index 083381cd..5888e89f 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -15,36 +15,21 @@ abstract class KeyedCallbackReporter { } class KeyedObject extends KeyedObjectBase { - final HashMap _keyedProperties = - HashMap(); - Iterable get keyedProperties => _keyedProperties.values; + final Map _keyedProperties = HashMap(); - // @override - // String toString() => 'KeyedObject[$count]'; + /// STOKANAL-FORK-EDIT: Keeping a copy of values lazily + List? _set; + Iterable get keyedProperties => + _set ??= _keyedProperties.values.toList(); - // static int _objectCount = 0; - // // static final List _all = []; - // // static void dump() { - // // log('DUMPING LINEAR ANIMATIONS all=${_all.length} keyed=${_all.where((a) => a._keyedObjects.isNotEmpty).length} keys=${_all.map((a) => a._keyedObjects.length).sum}'); - // // log(_all.where((a) => a._keyedObjects.isNotEmpty).map((a) => a.toString()).join('\n')); - // // } - - // final int count = ++_objectCount; - // late final bool logging = count % 50000 == 0; + // final keyedProperties = {}; + // Iterable get keyedProperties => _keyedProperties.values; /// STOKANAL-FORK-EDIT: Reuse this object for every animation @override K? clone() => this as K; - // KeyedObject() { - // - // if (logging) { - // log('CONSTRUCTED >> $this'); - // debugPrintStack(); - // } - // } - @override void onAddedDirty() {} @@ -74,6 +59,11 @@ class KeyedObject extends KeyedObjectBase { } _keyedProperties[property.propertyKey] = property; + if (value != null) { + _set?.remove(property); + } + _set?.add(property); + return true; } @@ -81,6 +71,7 @@ class KeyedObject extends KeyedObjectBase { /// be @internal when it's supported. bool internalRemoveKeyedProperty(KeyedProperty property) { var removed = _keyedProperties.remove(property.propertyKey); + _set?.remove(removed); if (_keyedProperties.isEmpty) { // Remove this keyed property. @@ -98,8 +89,7 @@ class KeyedObject extends KeyedObjectBase { required KeyedCallbackReporter reporter, bool isAtStartFrame = false, }) { - for (final keyedProperty - in _keyedProperties.values.where((property) => property.isCallback)) { + for (final keyedProperty in keyedProperties.where((property) => property.isCallback)) { keyedProperty.reportKeyedCallbacks( objectId, secondsFrom, @@ -110,9 +100,6 @@ class KeyedObject extends KeyedObjectBase { } } - /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map - late final List properties = _keyedProperties.values.toList(growable: false); - void apply( double time, double mix, @@ -122,9 +109,7 @@ class KeyedObject extends KeyedObjectBase { if (object == null) { return; } - // for (final keyedProperty in _keyedProperties.values) { - /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map - for (final keyedProperty in properties) { + for (final keyedProperty in keyedProperties) { if (keyedProperty.isCallback) { continue; } diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index d0d80b04..1fc7786e 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -122,9 +122,6 @@ class KeyedProperty extends KeyedPropertyBase int closestFrameIndex(double seconds, {int exactOffset = 0}) { // Binary find the keyframe index (use timeInSeconds here as opposed to the // finder above which operates in frames). - int mid = 0; - double closestSeconds = 0; - int start = 0; int end = _keyframes.length - 1; // If it's the last keyframe, we skip the binary search @@ -132,6 +129,10 @@ class KeyedProperty extends KeyedPropertyBase return end + 1; } + int mid = 0; + int start = 0; + double closestSeconds = 0; + while (start <= end) { mid = (start + end) >> 1; closestSeconds = _keyframes[mid].seconds; @@ -146,7 +147,7 @@ class KeyedProperty extends KeyedPropertyBase return start; } - bool get isCallback => RiveCoreContext.isCallback(propertyKey); + bool get isCallback => RiveCoreContext.isCallback(propertyKey_); /// Report any keyframes that occured between secondsFrom and secondsTo. void reportKeyedCallbacks( @@ -191,7 +192,7 @@ class KeyedProperty extends KeyedPropertyBase /// Apply keyframe values at a given time expressed in [seconds]. void apply(double seconds, double mix, Core object) { - if (_keyframes.isEmpty) { + if (_keyframes.length == 0) { return; } diff --git a/lib/src/rive_core/animation/linear_animation.dart b/lib/src/rive_core/animation/linear_animation.dart index 8bca0ed8..e294361c 100644 --- a/lib/src/rive_core/animation/linear_animation.dart +++ b/lib/src/rive_core/animation/linear_animation.dart @@ -77,9 +77,8 @@ class LinearAnimation extends LinearAnimationBase { return false; } bool found = false; - // for (final kp in value.keyedProperties) { - /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map - for (final kp in value.properties) { + + for (final kp in value.keyedProperties) { for (final kf in kp.keyframes.toList()) { kf.remove(); found = true; diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index be25c138..ac561cc5 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -216,7 +216,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { Iterable get dataBinds => _dataBinds; bool canPreApplyJoysticks() { - if (_joysticks.isEmpty) { + if (_joysticks.length == 0) { return false; } if (_joysticks.any((joystick) => joystick.isComplex)) { diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index 3de7eaba..427b3d55 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -1,8 +1,8 @@ class DependencyHelper { - // Set dependents = {}; /// STOKANAL-FORK-EDIT: make if final - final Set dependents = {}; + // final dependents = {}; + final dependents = []; T? dependencyRoot; DependencyHelper(); @@ -12,16 +12,20 @@ class DependencyHelper { // if (!dependents.contains(value)) { // dependents.add(value); + // if (dependents.add(value)) { + // return true; + // } + /// STOKANAL-FORK-EDIT: use add directly - if (dependents.add(value)) { - return true; + if (!dependents.contains(value)) { + dependents.add(value); } return false; } void addDirt(int dirt, {bool recurse = false}) { - /// STOKANAL-FORK-EDIT: dot not use forEach + /// STOKANAL-FORK-EDIT: do not use forEach for (final dependent in dependents) { dependent.addDirt(dirt, recurse: recurse); } diff --git a/lib/src/rive_core/drawable.dart b/lib/src/rive_core/drawable.dart index d42aa3f7..fd39fb71 100644 --- a/lib/src/rive_core/drawable.dart +++ b/lib/src/rive_core/drawable.dart @@ -43,7 +43,7 @@ abstract class Drawable extends DrawableBase { List _clippingShapes = []; bool clip(Canvas canvas) { - if (_clippingShapes.isEmpty) { + if (_clippingShapes.length == 0) { return false; } canvas.save(); diff --git a/lib/src/rive_core/transform_component.dart b/lib/src/rive_core/transform_component.dart index a4873389..edf1e48a 100644 --- a/lib/src/rive_core/transform_component.dart +++ b/lib/src/rive_core/transform_component.dart @@ -91,7 +91,7 @@ abstract class TransformComponent extends TransformComponentBase { Mat2D.copy(worldTransform, transform); } - if (_constraints.isNotEmpty) { + if (_constraints.length > 0) { for (final constraint in _constraints) { constraint.constrain(this); } diff --git a/pubspec.yaml b/pubspec.yaml index df07780c..06da719d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,15 +3,22 @@ version: 0.13.20 homepage: https://rive.app description: Rive Flutter Runtime. This package provides runtime functionality for playing back and interacting with animations built with the Rive editor available at https://rive.app. repository: https://github.com/rive-app/rive-flutter + +publish_to: none # STOKANAL-FORK-EDIT: added to include stokanal path dependency + topics: - animation - ui - effects - widgets - widget + - environment: - sdk: ">=2.17.0 <4.0.0" - flutter: ">=2.5.0" +# sdk: ">=2.17.0 <4.0.0" + sdk: ">=3.4.0 <4.0.0" # STOKANAL-FORK-EDIT: synced with stokanal + flutter: ">=3.24.2" # STOKANAL-FORK-EDIT: synced with stokanal +# flutter: ">=2.5.0" + dependencies: collection: ^1.15.0 flutter: @@ -22,8 +29,15 @@ dependencies: meta: ^1.3.0 plugin_platform_interface: ^2.0.2 rive_common: 0.4.15 + + # STOKANAL-FORK-EDIT: added stokanal + stokanal: + path: ../stokanal-flutter/ + dev_dependencies: flutter_test: sdk: flutter mocktail: - path: ^1.8.3 \ No newline at end of file + path: ^1.8.3 + +# see STOKANAL-FORK-EDIT for edits against the fork \ No newline at end of file From 71eed6ab6b61fbd2e55f42ed1f03ca246fd392bb Mon Sep 17 00:00:00 2001 From: gauchoj Date: Tue, 28 Jan 2025 21:31:56 +0000 Subject: [PATCH 14/50] performance tweaks --- .../linear_animation_controller.dart | 4 ++- .../controllers/state_machine_controller.dart | 4 ++- lib/src/core/core.dart | 2 +- .../animation/keyframe_double_base.dart | 17 ++++++----- lib/src/generated/rive_core_context.dart | 4 +-- .../animation/animation_reset_factory.dart | 2 +- lib/src/rive_core/animation/keyed_object.dart | 30 +++++++++---------- .../rive_core/animation/keyframe_double.dart | 6 ++-- lib/src/rive_core/dependency_helper.dart | 13 ++++---- .../rive_core/state_machine_controller.dart | 2 +- lib/src/rive_core/text/text.dart | 4 +-- pubspec.yaml | 6 ++-- 12 files changed, 48 insertions(+), 46 deletions(-) diff --git a/lib/src/controllers/linear_animation_controller.dart b/lib/src/controllers/linear_animation_controller.dart index f4c5f99b..fa112ca7 100644 --- a/lib/src/controllers/linear_animation_controller.dart +++ b/lib/src/controllers/linear_animation_controller.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/linear_animation_instance.dart' @@ -10,7 +12,7 @@ export 'package:rive/src/runtime_mounted_artboard.dart'; /// the inputs of the StateMachine. class LinearAnimationInstance extends core.LinearAnimationInstance with RuntimeEventReporter, KeyedCallbackReporter { - final _runtimeEventListeners = {}; + final _runtimeEventListeners = HashSet(); // {}; late CoreContext? context; LinearAnimationInstance(animation, diff --git a/lib/src/controllers/state_machine_controller.dart b/lib/src/controllers/state_machine_controller.dart index 1448515b..d933625e 100644 --- a/lib/src/controllers/state_machine_controller.dart +++ b/lib/src/controllers/state_machine_controller.dart @@ -1,3 +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/rive_core/animation/state_machine_bool.dart'; @@ -119,7 +121,7 @@ class StateMachineController extends core.StateMachineController /// A list of inputs available in the StateMachine. Iterable get inputs => _inputs; - final _runtimeEventListeners = {}; + final _runtimeEventListeners = HashSet();//{}; StateMachineController( StateMachine stateMachine, { diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index 1f0b8495..87443f98 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -93,7 +93,7 @@ abstract class CoreContext { // ignore: one_member_abstracts abstract class ImportStackObject { - final _resolveBefore = {}; + final _resolveBefore = HashSet();//{}; bool _resolved = false; bool initStack(ImportStack stack) { diff --git a/lib/src/generated/animation/keyframe_double_base.dart b/lib/src/generated/animation/keyframe_double_base.dart index 6f2eb19e..ddc42ad0 100644 --- a/lib/src/generated/animation/keyframe_double_base.dart +++ b/lib/src/generated/animation/keyframe_double_base.dart @@ -21,17 +21,20 @@ abstract class KeyFrameDoubleBase extends InterpolatingKeyFrame { /// Value field with key 70. static const int valuePropertyKey = 70; static const double valueInitialValue = 0; - double _value = valueInitialValue; - double get value => _value; - /// Change the [_value] field value. + /// STOKANAL-FORK-EDIT: exposing + double value_ = valueInitialValue; + + double get value => value_; + + /// Change the [value_] field value. /// [valueChanged] will be invoked only if the field's value has changed. set value(double value) { - if (_value == value) { + if (value_ == value) { return; } - double from = _value; - _value = value; + double from = value_; + value_ = value; if (hasValidated) { valueChanged(from, value); } @@ -43,7 +46,7 @@ abstract class KeyFrameDoubleBase extends InterpolatingKeyFrame { void copy(Core source) { super.copy(source); if (source is KeyFrameDoubleBase) { - _value = source._value; + value_ = source.value_; } } } diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index aeca152b..41c353d7 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -191,7 +191,7 @@ import 'package:rive/src/rive_core/viewmodel/viewmodel_property_viewmodel.dart'; // ignore: avoid_classes_with_only_static_members class RiveCoreContext { - // static final _counter = {}; + // static final _counter = HashMap(); /// STOKANAL-FORK-EDIT static Core? makeCoreInstance(int typeKey) { @@ -3416,7 +3416,7 @@ class RiveCoreContext { case ListenerNumberChangeBase.valuePropertyKey: return (object as ListenerNumberChangeBase).value; case KeyFrameDoubleBase.valuePropertyKey: - return (object as KeyFrameDoubleBase).value; + return (object as KeyFrameDoubleBase).value_; case TransitionValueNumberComparatorBase.valuePropertyKey: return (object as TransitionValueNumberComparatorBase).value; case ElasticInterpolatorBase.amplitudePropertyKey: diff --git a/lib/src/rive_core/animation/animation_reset_factory.dart b/lib/src/rive_core/animation/animation_reset_factory.dart index 7840cade..cd4bbe2e 100644 --- a/lib/src/rive_core/animation/animation_reset_factory.dart +++ b/lib/src/rive_core/animation/animation_reset_factory.dart @@ -202,7 +202,7 @@ class _AnimationsData { animationReset.writePropertyKey(property.propertyKey); if (property.isBaseline) { animationReset.writeDouble( - (property.property.keyframes.first as KeyFrameDouble).value); + (property.property.keyframes.first as KeyFrameDouble).value_); } else { animationReset.writeDouble(RiveCoreContext.getDouble( core.resolve(keyedObject.data.objectId), diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index 5888e89f..14658642 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -1,5 +1,6 @@ import 'dart:collection'; +import 'package:collection/collection.dart'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyed_object_base.dart'; import 'package:rive/src/rive_core/animation/keyed_property.dart'; @@ -19,12 +20,13 @@ class KeyedObject extends KeyedObjectBase { final Map _keyedProperties = HashMap(); /// STOKANAL-FORK-EDIT: Keeping a copy of values lazily - List? _set; + List? _props; Iterable get keyedProperties => - _set ??= _keyedProperties.values.toList(); + _props ??= _keyedProperties.values.toList(); - // final keyedProperties = {}; - // Iterable get keyedProperties => _keyedProperties.values; + List? _propsNonCallback; + Iterable get propsNonCallback => + _propsNonCallback ??= keyedProperties.whereNot((p) => p.isCallback).toList(); /// STOKANAL-FORK-EDIT: Reuse this object for every animation @override @@ -58,11 +60,7 @@ class KeyedObject extends KeyedObjectBase { return false; } _keyedProperties[property.propertyKey] = property; - - if (value != null) { - _set?.remove(property); - } - _set?.add(property); + _propsNonCallback = _props = null; return true; } @@ -71,7 +69,7 @@ class KeyedObject extends KeyedObjectBase { /// be @internal when it's supported. bool internalRemoveKeyedProperty(KeyedProperty property) { var removed = _keyedProperties.remove(property.propertyKey); - _set?.remove(removed); + _propsNonCallback = _props = null; if (_keyedProperties.isEmpty) { // Remove this keyed property. @@ -89,7 +87,12 @@ class KeyedObject extends KeyedObjectBase { required KeyedCallbackReporter reporter, bool isAtStartFrame = false, }) { - for (final keyedProperty in keyedProperties.where((property) => property.isCallback)) { + for (final keyedProperty in keyedProperties) { + + if (!keyedProperty.isCallback) { + continue; + } + keyedProperty.reportKeyedCallbacks( objectId, secondsFrom, @@ -109,10 +112,7 @@ class KeyedObject extends KeyedObjectBase { if (object == null) { return; } - for (final keyedProperty in keyedProperties) { - if (keyedProperty.isCallback) { - continue; - } + for (final keyedProperty in propsNonCallback) { keyedProperty.apply(time, mix, object); } } diff --git a/lib/src/rive_core/animation/keyframe_double.dart b/lib/src/rive_core/animation/keyframe_double.dart index d12b7ee7..bcde08e1 100644 --- a/lib/src/rive_core/animation/keyframe_double.dart +++ b/lib/src/rive_core/animation/keyframe_double.dart @@ -21,15 +21,15 @@ class KeyFrameDouble extends KeyFrameDoubleBase { @override void apply(Core object, int propertyKey, double mix) => - _apply(object, propertyKey, mix, value); + _apply(object, propertyKey, mix, value_); @override void applyInterpolation(Core object, int propertyKey, double currentTime, KeyFrameDouble nextFrame, double mix) { var f = (currentTime - seconds) / (nextFrame.seconds - seconds); - var frameValue = interpolator?.transformValue(value, nextFrame.value, f) ?? - value + (nextFrame.value - value) * f; + var frameValue = interpolator?.transformValue(value_, nextFrame.value_, f) ?? + value_ + (nextFrame.value_ - value_) * f; _apply(object, propertyKey, mix, frameValue); } diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index 427b3d55..05032ca6 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -1,8 +1,9 @@ +import 'dart:collection'; + class DependencyHelper { /// STOKANAL-FORK-EDIT: make if final - // final dependents = {}; - final dependents = []; + final dependents = HashSet();//{}; T? dependencyRoot; DependencyHelper(); @@ -12,13 +13,9 @@ class DependencyHelper { // if (!dependents.contains(value)) { // dependents.add(value); - // if (dependents.add(value)) { - // return true; - // } - /// STOKANAL-FORK-EDIT: use add directly - if (!dependents.contains(value)) { - dependents.add(value); + if (dependents.add(value)) { + 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 1e5ef31a..86d562f5 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -372,7 +372,7 @@ class StateMachineController extends RiveAnimationController /// Optional callback for input value changes OnInputValueChange? onInputValueChange; - final _eventListeners = {}; + final _eventListeners = HashSet();//{}; AudioPlayer? _audioPlayer; AudioPlayer get audioPlayer => (_audioPlayer ??= AudioPlayer.make())!; diff --git a/lib/src/rive_core/text/text.dart b/lib/src/rive_core/text/text.dart index 4c7e2c94..ea95ed85 100644 --- a/lib/src/rive_core/text/text.dart +++ b/lib/src/rive_core/text/text.dart @@ -77,7 +77,7 @@ class Text extends TextBase with TextStyleContainer implements Sizable { final List _cleanupShapes = []; BreakLinesResult? _lines; - /// STOKANAL-FORK-EDIT: exposing shape + /// STOKANAL-FORK-EDIT: exposing TextShapeResult? get shape => _shape; BreakLinesResult? get lines => _lines; @@ -266,7 +266,7 @@ class Text extends TextBase with TextStyleContainer implements Sizable { final List _renderStyles = []; - /// STOKANAL-FORK-EDIT: exposing renderStyles + /// STOKANAL-FORK-EDIT: exposing List get renderStyles => _renderStyles; Size _measuredSizeMax = Size.zero; diff --git a/pubspec.yaml b/pubspec.yaml index 06da719d..3e47ccf0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,10 +14,8 @@ topics: - widget - environment: -# sdk: ">=2.17.0 <4.0.0" - sdk: ">=3.4.0 <4.0.0" # STOKANAL-FORK-EDIT: synced with stokanal - flutter: ">=3.24.2" # STOKANAL-FORK-EDIT: synced with stokanal -# flutter: ">=2.5.0" + sdk: ">=2.17.0 <4.0.0" + flutter: ">=2.5.0" dependencies: collection: ^1.15.0 From c991c0caec0478b7408e618ffadba85532215f51 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Wed, 29 Jan 2025 10:07:54 +0000 Subject: [PATCH 15/50] using HashSet, HashMap, moving from forEach to loops and avoiding unnecessary toList() --- analysis_options.yaml | 2 +- .../linear_animation_controller.dart | 9 ++++-- .../controllers/state_machine_controller.dart | 9 ++++-- lib/src/core/importers/artboard_importer.dart | 2 +- .../core/importers/backboard_importer.dart | 4 +-- .../animation/animation_reset_factory.dart | 32 ++++++++++++------- .../animation/blend_state_1d_instance.dart | 4 +-- .../rive_core/animation/linear_animation.dart | 2 +- .../animation/nested_state_machine.dart | 4 ++- lib/src/rive_core/artboard.dart | 14 ++++---- lib/src/rive_core/assets/font_asset.dart | 3 +- lib/src/rive_core/audio_player.dart | 2 +- lib/src/rive_core/bones/bone.dart | 4 ++- lib/src/rive_core/component.dart | 6 ++-- .../constraints/follow_path_constraint.dart | 3 +- .../rive_core/constraints/ik_constraint.dart | 2 +- lib/src/rive_core/event.dart | 4 ++- .../shapes/paint/trim_path_drawing.dart | 4 +-- lib/src/rive_core/shapes/shape.dart | 3 +- .../shapes/shape_paint_container.dart | 6 ++-- .../rive_core/state_machine_controller.dart | 28 +++++++++------- lib/src/rive_core/text/text_style.dart | 9 +++--- .../rive_core/text/text_style_container.dart | 2 +- lib/src/rive_core/transform_component.dart | 5 +-- lib/src/runtime_artboard.dart | 15 ++++++--- lib/src/runtime_event.dart | 4 ++- lib/src/runtime_mounted_artboard.dart | 6 ++-- lib/src/widgets/rive_animation.dart | 5 +-- test/rive_animation_test.dart | 6 ++-- 29 files changed, 124 insertions(+), 75 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 0ce5339a..05150c1e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -78,7 +78,7 @@ linter: - prefer_contains - prefer_final_fields - prefer_final_in_for_each - - prefer_foreach +# - prefer_foreach - prefer_function_declarations_over_variables - prefer_initializing_formals - prefer_is_empty diff --git a/lib/src/controllers/linear_animation_controller.dart b/lib/src/controllers/linear_animation_controller.dart index fa112ca7..f4675900 100644 --- a/lib/src/controllers/linear_animation_controller.dart +++ b/lib/src/controllers/linear_animation_controller.dart @@ -29,9 +29,12 @@ class LinearAnimationInstance extends core.LinearAnimationInstance @override void reportEvent(Event event) { - _runtimeEventListeners.toList().forEach((callback) { - callback(event); - }); + for (final t in _runtimeEventListeners) { + t(event); + } + // _runtimeEventListeners.toList().forEach((callback) { + // callback(event); + // }); } @override diff --git a/lib/src/controllers/state_machine_controller.dart b/lib/src/controllers/state_machine_controller.dart index d933625e..1e9262d7 100644 --- a/lib/src/controllers/state_machine_controller.dart +++ b/lib/src/controllers/state_machine_controller.dart @@ -226,8 +226,13 @@ class StateMachineController extends core.StateMachineController @override void applyEvents() { - var events = reportedEvents.toList(growable: false); + // var events = reportedEvents.toList(growable: false); super.applyEvents(); - _runtimeEventListeners.toList().forEach(events.forEach); + + // _runtimeEventListeners.toList().forEach(events.forEach); + for (final t in _runtimeEventListeners) { + reportedEvents.forEach(t); + } + // _runtimeEventListeners.toList().forEach(reportedEvents.forEach); } } diff --git a/lib/src/core/importers/artboard_importer.dart b/lib/src/core/importers/artboard_importer.dart index 25d5de64..dd6df72f 100644 --- a/lib/src/core/importers/artboard_importer.dart +++ b/lib/src/core/importers/artboard_importer.dart @@ -31,7 +31,7 @@ class ArtboardImporter extends ImportStackObject { } assert(!artboard.children.contains(artboard), 'artboard should never contain itself as a child'); - for (final object in artboard.objects.toList(growable: false)) { + for (final object in artboard.objects) {//.toList(growable: false)) { if (object == null) { continue; } diff --git a/lib/src/core/importers/backboard_importer.dart b/lib/src/core/importers/backboard_importer.dart index f8eb0907..067eb539 100644 --- a/lib/src/core/importers/backboard_importer.dart +++ b/lib/src/core/importers/backboard_importer.dart @@ -11,9 +11,9 @@ class BackboardImporter extends ImportStackObject { final Backboard backboard; final HashMap artboardLookup; - final Set nestedArtboards = {}; + final Set nestedArtboards = HashSet();//{}; final List fileAssets = []; - final Set fileAssetReferencers = {}; + final Set fileAssetReferencers = HashSet();//{}; BackboardImporter(this.artboardLookup, this.backboard); void addArtboard(Artboard object) {} diff --git a/lib/src/rive_core/animation/animation_reset_factory.dart b/lib/src/rive_core/animation/animation_reset_factory.dart index cd4bbe2e..3274e02b 100644 --- a/lib/src/rive_core/animation/animation_reset_factory.dart +++ b/lib/src/rive_core/animation/animation_reset_factory.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/animation/animation_state.dart'; import 'package:rive/src/rive_core/animation/blend_state.dart'; @@ -120,10 +122,10 @@ class _KeyedProperty { class _KeyedObject { final List<_KeyedProperty> properties = []; final KeyedObject data; - final Set visitedProperties = {}; + final Set visitedProperties = HashSet();//{}; _KeyedObject(this.data); void addProperties( - List props, Core object, bool storeAsBaseline) { + Iterable props, Core object, bool storeAsBaseline) { for (final property in props) { if (!visitedProperties.contains(property.propertyKey)) { visitedProperties.add(property.propertyKey); @@ -151,12 +153,14 @@ class _AnimationsData { int size = 0; List<_KeyedObject> keyedObjects = []; - Map visitedObjects = {}; - _AnimationsData(List animations, CoreContext core, + Map visitedObjects = HashMap();//{}; + + _AnimationsData(Iterable animations, CoreContext core, bool useFirstAsBaseline) { bool isFirstAnimation = useFirstAsBaseline; for (final animation in animations) { - animation.keyedObjects.forEach((keyedObject) { + // animation.keyedObjects.forEach((keyedObject) { + for (final keyedObject in animation.keyedObjects) { final objectIntId = resolveId(keyedObject.objectId); final object = core.resolve(keyedObject.objectId); if (!visitedObjects.containsKey(objectIntId)) { @@ -164,8 +168,8 @@ class _AnimationsData { keyedObjects.add(visitedObjects[objectIntId]!); } visitedObjects[objectIntId]!.addProperties( - keyedObject.keyedProperties.toList(), object!, isFirstAnimation); - }); + keyedObject.keyedProperties, object!, isFirstAnimation); // .toList() + }//); isFirstAnimation = false; } for (final object in keyedObjects) { @@ -178,7 +182,9 @@ class _AnimationsData { } void writeObjects(AnimationReset animationReset, CoreContext core) { - keyedObjects.forEach((keyedObject) { + + // keyedObjects.forEach((keyedObject) { + for (final keyedObject in keyedObjects) { // We might have added keyed objects but no properties need resetting if (keyedObject.properties.isNotEmpty) { int objectIntId = resolveId(keyedObject.data.objectId); @@ -211,14 +217,14 @@ class _AnimationsData { } } } - }); + }//); animationReset.createReader(); } } List _pool = []; -AnimationReset fromAnimations(List animations, +AnimationReset fromAnimations(Iterable animations, CoreContext core, bool useFirstAsBaseline) { final animationData = _AnimationsData(animations, core, useFirstAsBaseline); AnimationReset? animationReset; @@ -247,13 +253,15 @@ List _fromState( if (state is AnimationState && state.animation != null) { animations.add(state.animation!); } else if (state is BlendState) { - state.animations.forEach((blend1DAnimation) { + + // state.animations.forEach((blend1DAnimation) { + for (final blend1DAnimation in state.animations) { final animation = core.resolve(blend1DAnimation.animationId); if (animation != null) { animations.add(animation); } - }); + }//); } } return animations; diff --git a/lib/src/rive_core/animation/blend_state_1d_instance.dart b/lib/src/rive_core/animation/blend_state_1d_instance.dart index 5016852d..9732e6bc 100644 --- a/lib/src/rive_core/animation/blend_state_1d_instance.dart +++ b/lib/src/rive_core/animation/blend_state_1d_instance.dart @@ -20,8 +20,8 @@ class BlendState1DInstance ? animation_reset_factory.fromAnimations( animationInstances .map((animationInstance) => - animationInstance.animationInstance.animation) - .toList(growable: false), + animationInstance.animationInstance.animation), + // .toList(growable: false), state.context, true) : null; diff --git a/lib/src/rive_core/animation/linear_animation.dart b/lib/src/rive_core/animation/linear_animation.dart index e294361c..c7f8fae3 100644 --- a/lib/src/rive_core/animation/linear_animation.dart +++ b/lib/src/rive_core/animation/linear_animation.dart @@ -79,7 +79,7 @@ class LinearAnimation extends LinearAnimationBase { bool found = false; for (final kp in value.keyedProperties) { - for (final kf in kp.keyframes.toList()) { + for (final kf in kp.keyframes){//.toList()) { kf.remove(); found = true; } diff --git a/lib/src/rive_core/animation/nested_state_machine.dart b/lib/src/rive_core/animation/nested_state_machine.dart index 403871e5..b73c3806 100644 --- a/lib/src/rive_core/animation/nested_state_machine.dart +++ b/lib/src/rive_core/animation/nested_state_machine.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:rive/src/core/core.dart'; @@ -41,7 +43,7 @@ class NestedStateMachine extends NestedStateMachineBase { @override bool get isEnabled => _stateMachineInstance?.isActive ?? false; - final Set _nestedInputs = {}; + final Set _nestedInputs = HashSet();//{}; Set get nestedInputs => _nestedInputs; NestedStateMachineInstance? _stateMachineInstance; diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index ac561cc5..8132dd5d 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -106,7 +106,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { final List _rules = []; List _sortedDrawRules = []; - final Set _components = {}; + final Set _components = HashSet();//{}; List get drawables => _drawables; @@ -206,7 +206,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { return didUpdate; } - final Set _activeNestedArtboards = {}; + final Set _activeNestedArtboards = HashSet();//{}; Iterable get activeNestedArtboards => _activeNestedArtboards; final List _joysticks = []; @@ -312,8 +312,8 @@ class Artboard extends ArtboardBase with ShapePaintContainer { } if (nested) { - var active = _activeNestedArtboards.toList(growable: false); - for (final activeNestedArtboard in active) { + // var active = _activeNestedArtboards.toList(growable: false); + for (final activeNestedArtboard in _activeNestedArtboards){//.toList(growable: false)) { if (activeNestedArtboard.advance(elapsedSeconds)) { didUpdate = true; } @@ -574,7 +574,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// The animation controllers that are called back whenever the artboard /// advances. - final Set _animationControllers = {}; + final Set _animationControllers = HashSet();//{}; /// Access a read-only iterator of currently applied animation controllers. Iterable get animationControllers => @@ -666,9 +666,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { } void populateDataBinds(List globalDataBinds) { - dataBinds.forEach((dataBind) { - globalDataBinds.add(dataBind); - }); + dataBinds.forEach(globalDataBinds.add); for (final nestedArtboard in _activeNestedArtboards) { final mountedArtboard = nestedArtboard.mountedArtboard; diff --git a/lib/src/rive_core/assets/font_asset.dart b/lib/src/rive_core/assets/font_asset.dart index 3b9739d7..99e40f05 100644 --- a/lib/src/rive_core/assets/font_asset.dart +++ b/lib/src/rive_core/assets/font_asset.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:collection'; import 'package:flutter/foundation.dart'; import 'package:rive/src/generated/assets/font_asset_base.dart'; @@ -9,7 +10,7 @@ import 'package:rive_common/rive_text.dart'; export 'package:rive/src/generated/assets/font_asset_base.dart'; class FontAsset extends FontAssetBase { - final Set _callbacks = {}; + final Set _callbacks = HashSet();//{}; /// Call [callback] when the font is ready. Set [notifyAlreadySet] to /// specify if you want to be called if the font is already set. diff --git a/lib/src/rive_core/audio_player.dart b/lib/src/rive_core/audio_player.dart index 258121c6..007fa0c3 100644 --- a/lib/src/rive_core/audio_player.dart +++ b/lib/src/rive_core/audio_player.dart @@ -95,7 +95,7 @@ class AudioPlayer { return; } - var completed = _sounds.where((sound) => sound.completed).toList(); + var completed = _sounds.where((sound) => sound.completed);//.toList(); _sounds.removeWhere((sound) => sound.completed); for (final sound in completed) { diff --git a/lib/src/rive_core/bones/bone.dart b/lib/src/rive_core/bones/bone.dart index d83e6c48..41b149d8 100644 --- a/lib/src/rive_core/bones/bone.dart +++ b/lib/src/rive_core/bones/bone.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:rive/src/generated/bones/bone_base.dart'; import 'package:rive/src/rive_core/constraints/constraint.dart'; import 'package:rive_common/math.dart'; @@ -9,7 +11,7 @@ typedef bool BoneCallback(Bone bone); class Bone extends BoneBase { /// Child constraints applied to some child of this bone which also affect /// this bone. - final Set _peerConstraints = {}; + final Set _peerConstraints = HashSet();//{}; Iterable get peerConstraints => _peerConstraints; bool addPeerConstraint(Constraint child) => _peerConstraints.add(child); diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index 5f57567e..dc3764f2 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/rive_core/artboard.dart'; import 'package:rive/src/rive_core/component_dirt.dart'; @@ -163,13 +165,13 @@ abstract class Component extends ComponentBase } /// Components that this component depends on. - final Set _dependsOn = {}; + final Set _dependsOn = HashSet();//{}; @override Set get dependents => _dependencyHelper.dependents; Set get dependencies { - Set components = {}; + Set components = HashSet();//{}; allDependencies(components); return components; } diff --git a/lib/src/rive_core/constraints/follow_path_constraint.dart b/lib/src/rive_core/constraints/follow_path_constraint.dart index eda76937..4ec5f4cf 100644 --- a/lib/src/rive_core/constraints/follow_path_constraint.dart +++ b/lib/src/rive_core/constraints/follow_path_constraint.dart @@ -19,7 +19,8 @@ class FollowPathConstraint extends FollowPathConstraintBase { Mat2D get targetTransform { if (target is Shape || target is Path) { - var metrics = _worldPath.computeMetrics().toList(growable: false); + // var metrics = _worldPath.computeMetrics().toList(growable: false); + var metrics = _worldPath.computeMetrics(); if (metrics.isEmpty) { return Mat2D(); } diff --git a/lib/src/rive_core/constraints/ik_constraint.dart b/lib/src/rive_core/constraints/ik_constraint.dart index 2cacc486..40700245 100644 --- a/lib/src/rive_core/constraints/ik_constraint.dart +++ b/lib/src/rive_core/constraints/ik_constraint.dart @@ -96,7 +96,7 @@ class IKConstraint extends IKConstraintBase { // tip (constrainedComponent). var tip = parent as Bone; - var bones = _fkChain.reversed.map((link) => link.bone).toSet(); + var bones = _fkChain.reversed.map((link) => link.bone).toSet(); // to set to preserve order for (final bone in bones.skip(1)) { for (final child in bone.children) { if (child is TransformComponent && !bones.contains(child)) { diff --git a/lib/src/rive_core/event.dart b/lib/src/rive_core/event.dart index 38e0ce4f..764d4e9d 100644 --- a/lib/src/rive_core/event.dart +++ b/lib/src/rive_core/event.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:rive/src/generated/event_base.dart'; import 'package:rive/src/rive_core/animation/linear_animation_instance.dart'; import 'package:rive/src/rive_core/artboard.dart'; @@ -26,7 +28,7 @@ class Event extends EventBase { } void _syncCustomProperties() { - var nextCustomProperties = children.whereType().toSet(); + var nextCustomProperties = HashSet.of(children.whereType()); if (!iterableEquals(customProperties, nextCustomProperties)) { customProperties.clear(); customProperties.addAll(nextCustomProperties); diff --git a/lib/src/rive_core/shapes/paint/trim_path_drawing.dart b/lib/src/rive_core/shapes/paint/trim_path_drawing.dart index 5baf13b3..01dd2af2 100644 --- a/lib/src/rive_core/shapes/paint/trim_path_drawing.dart +++ b/lib/src/rive_core/shapes/paint/trim_path_drawing.dart @@ -78,7 +78,7 @@ void _appendPathSegmentSync( void _trimPathSequential( Path path, Path result, double startT, double stopT, bool complement) { // Measure length of all the contours. - var metrics = path.computeMetrics().toList(growable: false); + var metrics = path.computeMetrics();//.toList(growable: false); double totalLength = 0.0; for (final metric in metrics) { totalLength += metric.length; @@ -114,7 +114,7 @@ void _trimPathSequential( void _trimPathSync( Path path, Path result, double startT, double stopT, bool complement) { - final metrics = path.computeMetrics().toList(growable: false); + final metrics = path.computeMetrics();//.toList(growable: false); for (final metric in metrics) { double length = metric.length; double trimStart = length * startT; diff --git a/lib/src/rive_core/shapes/shape.dart b/lib/src/rive_core/shapes/shape.dart index 35729995..86a18ad5 100644 --- a/lib/src/rive_core/shapes/shape.dart +++ b/lib/src/rive_core/shapes/shape.dart @@ -1,3 +1,4 @@ +import 'dart:collection'; import 'dart:ui' as ui; import 'package:collection/collection.dart'; @@ -14,7 +15,7 @@ import 'package:rive_common/math.dart'; export 'package:rive/src/generated/shapes/shape_base.dart'; class Shape extends ShapeBase with ShapePaintContainer { - final Set paths = {}; + final Set paths = HashSet();//{}; bool _wantWorldPath = false; bool _wantLocalPath = false; diff --git a/lib/src/rive_core/shapes/shape_paint_container.dart b/lib/src/rive_core/shapes/shape_paint_container.dart index d7935d64..54525f83 100644 --- a/lib/src/rive_core/shapes/shape_paint_container.dart +++ b/lib/src/rive_core/shapes/shape_paint_container.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:meta/meta.dart'; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/container_component.dart'; @@ -9,9 +11,9 @@ import 'package:rive_common/math.dart'; /// An abstraction to give a common interface to any component that can contain /// fills and strokes. abstract class ShapePaintContainer { - final Set fills = {}; + final Set fills = HashSet();//{}; - final Set strokes = {}; + final Set strokes = HashSet();//{}; /// Called whenever a new paint mutator is added/removed from the shape paints /// (for example a linear gradient is added to a stroke). diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 86d562f5..8192f35b 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -364,7 +364,7 @@ class StateMachineController extends RiveAnimationController final _reportedEvents = []; // Keep a seperate list of nested events because we also need to store // the source of the nested event in order to compare to listener target - final Map> _reportedNestedEvents = {}; + final Map> _reportedNestedEvents = HashMap>();//{}; /// Optional callback for state changes final OnStateChange? onStateChange; @@ -512,7 +512,9 @@ class StateMachineController extends RiveAnimationController }); } } - hitShapeLookup.values.toList().forEach(hitComponents.add); + + // hitShapeLookup.values.toList().forEach(hitComponents.add); + hitShapeLookup.values.forEach(hitComponents.add); _artboard = core as RuntimeArtboard; @@ -609,31 +611,34 @@ class StateMachineController extends RiveAnimationController _reportedEvents.clear(); _reportedNestedEvents.clear(); - var listeners = stateMachine.listeners.whereType(); - listeners.forEach((listener) { + // var listeners = stateMachine.listeners.whereType(); + // stateMachine.listeners.whereType().forEach((listener) { + for (final listener in stateMachine.listeners.whereType()) { var listenerTarget = artboard?.context.resolve(listener.targetId); if (listener.listenerType == ListenerType.event) { // Handle events from this artboard if it is the target if (listenerTarget == artboard) { - events.forEach((event) { + // events.forEach((event) { + for (final event in events) { if (listener.eventId == event.id) { listener.performChanges(this, Vec2D(), Vec2D()); } - }); + }//); } else { // Handle events from nested artboards nestedEvents.forEach((targetId, eventList) { if (listener.targetId == targetId) { - eventList.forEach((nestedEvent) { + // eventList.forEach((nestedEvent) { + for (final nestedEvent in eventList) { if (listener.eventId == nestedEvent.id) { listener.performChanges(this, Vec2D(), Vec2D()); } - }); + }//); } }); } } - }); + }//); var riveEvents = []; @@ -643,9 +648,10 @@ class StateMachineController extends RiveAnimationController } riveEvents.add(RiveEvent.fromCoreEvent(event)); } - _eventListeners.toList().forEach((listener) { + // _eventListeners.toList().forEach((listener) { + for (final listener in _eventListeners) { riveEvents.forEach(listener); - }); + }//); } } diff --git a/lib/src/rive_core/text/text_style.dart b/lib/src/rive_core/text/text_style.dart index d47d64da..e58eef8f 100644 --- a/lib/src/rive_core/text/text_style.dart +++ b/lib/src/rive_core/text/text_style.dart @@ -56,10 +56,10 @@ class TextVariationHelper extends Component { class TextStyle extends TextStyleBase with ShapePaintContainer, FileAssetReferencer { - final Set _referencers = {}; + final Set _referencers = HashSet();//{}; Text? get text => parent as Text?; - final Set _variations = {}; - final Set _features = {}; + final Set _variations = HashSet();//{}; + final Set _features = HashSet();//{}; Iterable get variations => _variations; Iterable get features => _features; @@ -133,7 +133,8 @@ class TextStyle extends TextStyleBase _variationHelper?.buildDependencies(); } - void removeVariations() => _variations.toSet().forEach(context.removeObject); + // void removeVariations() => _variations.toSet().forEach(context.removeObject); + void removeVariations() => _variations.forEach(context.removeObject); @override set asset(FontAsset? value) { diff --git a/lib/src/rive_core/text/text_style_container.dart b/lib/src/rive_core/text/text_style_container.dart index b60336ab..8d830f61 100644 --- a/lib/src/rive_core/text/text_style_container.dart +++ b/lib/src/rive_core/text/text_style_container.dart @@ -10,7 +10,7 @@ import 'package:rive_common/utilities.dart'; /// file-wide styles by making them owned by an [Artboard] or [Backboard]. abstract class TextStyleContainer { int _nextShaperId = 0; - final Set styles = {}; + final Set styles = HashSet();//{}; final HashMap _styleLookup = HashMap(); // TextStyle? styleFromShaperId(int id) => _styleLookup[id]; diff --git a/lib/src/rive_core/transform_component.dart b/lib/src/rive_core/transform_component.dart index edf1e48a..aa51ad9e 100644 --- a/lib/src/rive_core/transform_component.dart +++ b/lib/src/rive_core/transform_component.dart @@ -225,11 +225,12 @@ abstract class TransformComponent extends TransformComponentBase { } // In the runtime, we have to iterate the dependents - dependents.forEach((element) { + // dependents.forEach((element) { + for (final element in dependents) { if (element is TransformComponent) { element.markDirtyIfConstrained(); } - }); + }//); return true; } diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index f0085ac8..bc0760d5 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -1,3 +1,4 @@ +import 'dart:collection'; import 'dart:developer'; import 'package:collection/collection.dart'; @@ -102,9 +103,9 @@ class RuntimeArtboard extends Artboard implements CoreContext { final List _objects = []; Iterable get objects => _objects; - final Set _needDependenciesBuilt = {}; + final Set _needDependenciesBuilt = HashSet();//{}; - // Indicates if this artboard is playing or paused + /// Indicates if this artboard is playing or paused bool _isPlaying = true; @override @@ -224,8 +225,13 @@ class RuntimeArtboard extends Artboard implements CoreContext { } object?.onAddedDirty(); } - animations.forEach(artboard.animations.add); - for (final object in artboard.objects.toList(growable: false)) { + + // animations.forEach(artboard.animations.add); + for (var a in animations) { + artboard.animations.add(a); + } + + for (final object in artboard.objects) { //.toList(growable: false)) { if (object == null) { continue; } @@ -259,6 +265,7 @@ class RuntimeArtboard extends Artboard implements CoreContext { } void addNestedEventListener(StateMachineController controller) { + activeNestedArtboards.forEach((artboard) { if (artboard.mountedArtboard is RuntimeMountedArtboard) { (artboard.mountedArtboard as RuntimeMountedArtboard).eventCallback = diff --git a/lib/src/runtime_event.dart b/lib/src/runtime_event.dart index 113c6322..ab9593ad 100644 --- a/lib/src/runtime_event.dart +++ b/lib/src/runtime_event.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:flutter/widgets.dart'; import 'package:rive/src/rive_core/custom_property_boolean.dart'; import 'package:rive/src/rive_core/custom_property_number.dart'; @@ -28,7 +30,7 @@ class RiveEvent { }); factory RiveEvent.fromCoreEvent(Event event) { - final Map properties = {}; + final Map properties = HashMap();//{}; for (final property in event.customProperties) { dynamic value; switch (property.coreType) { diff --git a/lib/src/runtime_mounted_artboard.dart b/lib/src/runtime_mounted_artboard.dart index 7553fdf5..36937414 100644 --- a/lib/src/runtime_mounted_artboard.dart +++ b/lib/src/runtime_mounted_artboard.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:flutter/rendering.dart'; import 'package:rive/src/controllers/state_machine_controller.dart'; import 'package:rive/src/core/core.dart'; @@ -19,11 +21,11 @@ abstract class RuntimeEventReporter { class RuntimeMountedArtboard extends MountedArtboard { NestedArtboard nestedArtboard; final RuntimeArtboard artboardInstance; - final Set _runtimeEventListeners = {}; + final Set _runtimeEventListeners = HashSet();//{}; Size originalArtboardInstanceSize = const Size(0, 0); Set get controllers => - _runtimeEventListeners.whereType().toSet(); + HashSet.of(_runtimeEventListeners.whereType()); // The callback used for bubbling events up from nested artboards Function(Event, NestedArtboard)? eventCallback; diff --git a/lib/src/widgets/rive_animation.dart b/lib/src/widgets/rive_animation.dart index 88b8a53d..90f0a2c2 100644 --- a/lib/src/widgets/rive_animation.dart +++ b/lib/src/widgets/rive_animation.dart @@ -311,9 +311,10 @@ class RiveAnimationState extends State { } // Clear current local controllers. - _controllers.forEach((c) { + // _controllers.forEach((c) { + for (final c in _controllers) { c.dispose(); - }); + }//); _controllers.clear(); final artboard = (widget.artboard != null diff --git a/test/rive_animation_test.dart b/test/rive_animation_test.dart index 7d523995..b871acf4 100644 --- a/test/rive_animation_test.dart +++ b/test/rive_animation_test.dart @@ -1,3 +1,5 @@ +import 'dart:collection'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; @@ -269,7 +271,7 @@ void main() { riveFile.mainArtboard, 'State Machine 1'); expect(controller, isNotNull); - Set receivedEvents = {}; + Set receivedEvents = HashSet();//{}; controller!.addEventListener((event) { receivedEvents.add(event.name); }); @@ -316,7 +318,7 @@ void main() { riveFile.mainArtboard, 'State Machine 1'); expect(controller, isNotNull); - Set receivedEvents = {}; + Set receivedEvents = HashSet();//{}; controller!.addEventListener((event) { receivedEvents.add(event.name); }); From 91997e293157cf106091e300aef258e9c5fd3217 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Wed, 29 Jan 2025 11:47:15 +0000 Subject: [PATCH 16/50] fixed introduced bug (rive-flutter recover routine) --- lib/src/rive_core/dependency_helper.dart | 5 ++--- lib/src/rive_core/event.dart | 4 +--- lib/src/rive_core/text/text_style_container.dart | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index 05032ca6..1d56188a 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -1,9 +1,8 @@ -import 'dart:collection'; + class DependencyHelper { - /// STOKANAL-FORK-EDIT: make if final - final dependents = HashSet();//{}; + final dependents = {}; // set should stay ordered T? dependencyRoot; DependencyHelper(); diff --git a/lib/src/rive_core/event.dart b/lib/src/rive_core/event.dart index 764d4e9d..53effd61 100644 --- a/lib/src/rive_core/event.dart +++ b/lib/src/rive_core/event.dart @@ -1,5 +1,3 @@ -import 'dart:collection'; - import 'package:rive/src/generated/event_base.dart'; import 'package:rive/src/rive_core/animation/linear_animation_instance.dart'; import 'package:rive/src/rive_core/artboard.dart'; @@ -28,7 +26,7 @@ class Event extends EventBase { } void _syncCustomProperties() { - var nextCustomProperties = HashSet.of(children.whereType()); + var nextCustomProperties = children.whereType().toSet();//.toSet(); if (!iterableEquals(customProperties, nextCustomProperties)) { customProperties.clear(); customProperties.addAll(nextCustomProperties); diff --git a/lib/src/rive_core/text/text_style_container.dart b/lib/src/rive_core/text/text_style_container.dart index 8d830f61..838f6ff0 100644 --- a/lib/src/rive_core/text/text_style_container.dart +++ b/lib/src/rive_core/text/text_style_container.dart @@ -10,7 +10,7 @@ import 'package:rive_common/utilities.dart'; /// file-wide styles by making them owned by an [Artboard] or [Backboard]. abstract class TextStyleContainer { int _nextShaperId = 0; - final Set styles = HashSet();//{}; + final Set styles = {}; // preserve order final HashMap _styleLookup = HashMap(); // TextStyle? styleFromShaperId(int id) => _styleLookup[id]; From 482b70d797607741d84a230b43504e7a93d98b5a Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 14 Feb 2025 16:01:02 +0000 Subject: [PATCH 17/50] tweaking --- lib/src/generated/rive_core_context.dart | 74 ++++--------------- .../animation/cubic_interpolator.dart | 31 ++++++-- lib/src/rive_core/animation/keyed_object.dart | 24 ++++-- .../rive_core/animation/keyed_property.dart | 39 ++++++---- lib/src/rive_core/animation/keyframe.dart | 10 ++- .../rive_core/animation/linear_animation.dart | 8 +- lib/src/rive_core/component.dart | 7 +- lib/src/rive_core/dependency_helper.dart | 32 +++++--- 8 files changed, 122 insertions(+), 103 deletions(-) diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index 41c353d7..36f8936f 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -4737,112 +4737,65 @@ class RiveCoreContext { switch (propertyKey) { case VertexBase.xPropertyKey: (object as VertexBase).x = value; - // if (object is VertexBase) { - // object.x = value; - // } return; case VertexBase.yPropertyKey: (object as VertexBase).y = value; - // if (object is VertexBase) { - // object.y = value; - // } return; case CubicDetachedVertexBase.outRotationPropertyKey: (object as CubicDetachedVertexBase).outRotation = value; - // if (object is CubicDetachedVertexBase) { - // object.outRotation = value; - // } return; case CubicDetachedVertexBase.outDistancePropertyKey: (object as CubicDetachedVertexBase).outDistance = value; - // if (object is CubicDetachedVertexBase) { - // object.outDistance = value; - // } return; case CubicDetachedVertexBase.inRotationPropertyKey: (object as CubicDetachedVertexBase).inRotation = value; - // if (object is CubicDetachedVertexBase) { - // object.inRotation = value; - // } return; case CubicAsymmetricVertexBase.inDistancePropertyKey: (object as CubicAsymmetricVertexBase).inDistance = value; - // if (object is CubicAsymmetricVertexBase) { - // object.inDistance = value; - // } return; case NodeBase.xPropertyKey: (object as NodeBase).x = value; - // if (object is NodeBase) { - // object.x = value; - // } return; case NodeBase.yPropertyKey: (object as NodeBase).y = value; - // if (object is NodeBase) { - // object.y = value; - // } return; case CubicDetachedVertexBase.inDistancePropertyKey: - if (object is CubicDetachedVertexBase) { - object.inDistance = value; - } + (object as CubicDetachedVertexBase).inDistance = value; return; case TransformComponentBase.scaleXPropertyKey: - if (object is TransformComponentBase) { - object.scaleX = value; - } + (object as TransformComponentBase).scaleX = value; return; case TransformComponentBase.scaleYPropertyKey: - if (object is TransformComponentBase) { - object.scaleY = value; - } + (object as TransformComponentBase).scaleY = value; return; case TransformComponentBase.rotationPropertyKey: - if (object is TransformComponentBase) { - object.rotation = value; - } + (object as TransformComponentBase).rotation = value; return; case DistanceConstraintBase.distancePropertyKey: - if (object is DistanceConstraintBase) { - object.distance = value; - } + (object as DistanceConstraintBase).distance = value; return; case WorldTransformComponentBase.opacityPropertyKey: - if (object is WorldTransformComponentBase) { - object.opacity = value; - } + (object as WorldTransformComponentBase).opacity = value; return; case CubicAsymmetricVertexBase.rotationPropertyKey: - if (object is CubicAsymmetricVertexBase) { - object.rotation = value; - } + (object as CubicAsymmetricVertexBase).rotation = value; return; case CubicMirroredVertexBase.rotationPropertyKey: - if (object is CubicMirroredVertexBase) { - object.rotation = value; - } + (object as CubicMirroredVertexBase).rotation = value; return; case CubicMirroredVertexBase.distancePropertyKey: - if (object is CubicMirroredVertexBase) { - object.distance = value; - } + (object as CubicMirroredVertexBase).distance = value; return; case CubicAsymmetricVertexBase.outDistancePropertyKey: - if (object is CubicAsymmetricVertexBase) { - object.outDistance = value; - } + (object as CubicAsymmetricVertexBase).outDistance = value; return; case GradientStopBase.positionPropertyKey: - if (object is GradientStopBase) { - object.position = value; - } + (object as GradientStopBase).position = value; return; case StrokeBase.thicknessPropertyKey: - if (object is StrokeBase) { - object.thickness = value; - } + (object as StrokeBase).thickness = value; return; + } // } // @@ -4853,6 +4806,7 @@ class RiveCoreContext { // // switch (propertyKey) { + switch (propertyKey) { case ViewModelInstanceNumberBase.propertyValuePropertyKey: if (object is ViewModelInstanceNumberBase) { object.propertyValue = value; diff --git a/lib/src/rive_core/animation/cubic_interpolator.dart b/lib/src/rive_core/animation/cubic_interpolator.dart index 5d85770f..5378110e 100644 --- a/lib/src/rive_core/animation/cubic_interpolator.dart +++ b/lib/src/rive_core/animation/cubic_interpolator.dart @@ -81,16 +81,33 @@ class InterpolatorCubicFactor { int currentSample = 1; int lastSample = splineTableSize - 1; - for (; - currentSample != lastSample && _values[currentSample] <= x; - ++currentSample) { + // for (; + // currentSample != lastSample && _values[currentSample] <= x; + // ++currentSample) { + // intervalStart += sampleStepSize; + // } + // --currentSample; + // // Interpolate to provide an initial guess for t + // var dist = (x - _values[currentSample]) / + // (_values[currentSample + 1] - _values[currentSample]); + + // if (currentSample-1 < 0) { + // throw Exception('review me'); + // } + double last = _values[currentSample]; + double? previous;// = _values[currentSample-1]; + while (true) { + if (!(currentSample != lastSample && last <= x)) { + break; + } intervalStart += sampleStepSize; + currentSample++; + previous = last; + last = _values[currentSample]; } - --currentSample; + previous ??= _values[currentSample-1]; + var dist = (x - previous) / (last - previous); - // Interpolate to provide an initial guess for t - var dist = (x - _values[currentSample]) / - (_values[currentSample + 1] - _values[currentSample]); var guessForT = intervalStart + dist * sampleStepSize; var initialSlope = getSlope(guessForT, x1, x2); diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index 14658642..0792ffe2 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -21,11 +21,11 @@ class KeyedObject extends KeyedObjectBase { /// STOKANAL-FORK-EDIT: Keeping a copy of values lazily List? _props; - Iterable get keyedProperties => + List get keyedProperties => _props ??= _keyedProperties.values.toList(); List? _propsNonCallback; - Iterable get propsNonCallback => + List get propsNonCallback => _propsNonCallback ??= keyedProperties.whereNot((p) => p.isCallback).toList(); /// STOKANAL-FORK-EDIT: Reuse this object for every animation @@ -87,7 +87,13 @@ class KeyedObject extends KeyedObjectBase { required KeyedCallbackReporter reporter, bool isAtStartFrame = false, }) { - for (final keyedProperty in keyedProperties) { + + var ps = keyedProperties; + var t = ps.length; + KeyedProperty keyedProperty; + for (var i = 0; i < t; i++) { + keyedProperty = ps[i]; + // for (final keyedProperty in keyedProperties) { if (!keyedProperty.isCallback) { continue; @@ -108,13 +114,19 @@ class KeyedObject extends KeyedObjectBase { double mix, CoreContext coreContext, ) { - Core? object = coreContext.resolve(objectId); + var object = coreContext.resolve(objectId); if (object == null) { return; } - for (final keyedProperty in propsNonCallback) { - keyedProperty.apply(time, mix, object); + + var ps = propsNonCallback; + var t = ps.length; + for (var i = 0; i < t; i++) { + ps[i].apply(time, mix, object); } + // for (final keyedProperty in propsNonCallback) { + // keyedProperty.apply(time, mix, object); + // } } @override diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 1fc7786e..33cc29a3 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -11,7 +11,8 @@ abstract class KeyFrameInterface { } class KeyFrameList { - List _keyframes = []; + + var _keyframes = []; List get keyframes => _keyframes; set keyframes(Iterable frames) => _keyframes = frames.toList(); @@ -122,19 +123,33 @@ class KeyedProperty extends KeyedPropertyBase int closestFrameIndex(double seconds, {int exactOffset = 0}) { // Binary find the keyframe index (use timeInSeconds here as opposed to the // finder above which operates in frames). - int end = _keyframes.length - 1; + var length = _keyframes.length; + int end = length - 1; + var totalSeconds = _keyframes[end].seconds; // If it's the last keyframe, we skip the binary search - if (seconds > _keyframes[end].seconds) { + if (seconds > totalSeconds) { return end + 1; } - int mid = 0; + // int mid; + + if (seconds == totalSeconds) { + return end + exactOffset; + } + if (seconds < _keyframes[0].seconds) { + return 0; + } + int mid = (length * seconds/totalSeconds).toInt(); // try to guess an optimal starting seconds + if (mid == length) { + mid = length - 1; + } + int start = 0; - double closestSeconds = 0; + double closestSeconds; while (start <= end) { - mid = (start + end) >> 1; + // mid = (start + end) >> 1; closestSeconds = _keyframes[mid].seconds; if (closestSeconds < seconds) { start = mid + 1; @@ -143,6 +158,7 @@ class KeyedProperty extends KeyedPropertyBase } else { return mid + exactOffset; } + mid = (start + end) >> 1; } return start; } @@ -199,17 +215,14 @@ class KeyedProperty extends KeyedPropertyBase int idx = closestFrameIndex(seconds); int pk = propertyKey; if (idx == 0) { - var first = _keyframes[0]; - - first.apply(object, pk, mix); + _keyframes[0].apply(object, pk, mix); } else { if (idx < _keyframes.length) { - InterpolatingKeyFrame fromFrame = - _keyframes[idx - 1] as InterpolatingKeyFrame; KeyFrame toFrame = _keyframes[idx]; if (seconds == toFrame.seconds) { toFrame.apply(object, pk, mix); } else { + InterpolatingKeyFrame fromFrame = _keyframes[idx - 1] as InterpolatingKeyFrame; /// Equivalent to fromFrame.interpolation == /// KeyFrameInterpolation.hold. if (fromFrame.interpolationType == 0) { @@ -219,9 +232,7 @@ class KeyedProperty extends KeyedPropertyBase } } } else { - var last = _keyframes[idx - 1]; - - last.apply(object, pk, mix); + _keyframes[idx - 1].apply(object, pk, mix); } } } diff --git a/lib/src/rive_core/animation/keyframe.dart b/lib/src/rive_core/animation/keyframe.dart index 8e5cde64..8f68f016 100644 --- a/lib/src/rive_core/animation/keyframe.dart +++ b/lib/src/rive_core/animation/keyframe.dart @@ -8,14 +8,18 @@ export 'package:rive/src/generated/animation/keyframe_base.dart'; abstract class KeyFrame extends KeyFrameBase implements KeyFrameInterface { bool get canInterpolate => false; - double _timeInSeconds = 0; - double get seconds => _timeInSeconds; + + @nonVirtual + double seconds = 0; // avoid getter + // double _timeInSeconds = 0; + // double get seconds => _timeInSeconds; @override void onAdded() {} void computeSeconds(LinearAnimation animation) { - _timeInSeconds = frame / animation.fps; + // _timeInSeconds = frame / animation.fps; + seconds = frame / animation.fps; } @override diff --git a/lib/src/rive_core/animation/linear_animation.dart b/lib/src/rive_core/animation/linear_animation.dart index c7f8fae3..df832dcc 100644 --- a/lib/src/rive_core/animation/linear_animation.dart +++ b/lib/src/rive_core/animation/linear_animation.dart @@ -147,9 +147,13 @@ class LinearAnimation extends LinearAnimationBase { } // for (final keyedObject in _keyedObjects.values) { /// STOKANAL-FORK-EDIT: iterate properties with a list rather than with a map - for (final keyedObject in _objects) { - keyedObject.apply(time, mix, coreContext); + var t = _objects.length; + for (var i = 0; i < t; i++) { + _objects[i].apply(time, mix, coreContext); } + // for (final keyedObject in _objects) { + // keyedObject.apply(time, mix, coreContext); + // } } Loop get loop => Loop.values[loopValue]; diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index dc3764f2..a538e753 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -29,7 +29,9 @@ abstract class Component extends ComponentBase dirt &= ~ComponentDirt.collapsed; } onDirty(dirt); - _dependencyHelper.onComponentDirty(this); + + // _dependencyHelper.onComponentDirty(this); + _dependencyHelper.dependencyRoot?.onComponentDirty(this); // avoid invocking return true; } @@ -56,7 +58,8 @@ abstract class Component extends ComponentBase dirt |= value; onDirty(dirt); - _dependencyHelper.onComponentDirty(this); + // _dependencyHelper.onComponentDirty(this); + _dependencyHelper.dependencyRoot?.onComponentDirty(this); // avoid calling one method if (!recurse) { return true; diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index 1d56188a..90a080e1 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -2,7 +2,12 @@ class DependencyHelper { - final dependents = {}; // set should stay ordered + final _dependents = {}; // set should stay ordered + final _dependentsList = []; // it's a copy of the set used to iterate over + + Set get dependents => _dependents; + + // final dependents = []; // set should stay ordered T? dependencyRoot; DependencyHelper(); @@ -11,30 +16,39 @@ class DependencyHelper { // if (!dependents.contains(value)) { // dependents.add(value); + // return true; + // } + // return false; - /// STOKANAL-FORK-EDIT: use add directly - if (dependents.add(value)) { + // /// STOKANAL-FORK-EDIT: use add directly + if (_dependents.add(value)) { + _dependentsList.add(value); return true; } + return false; } void addDirt(int dirt, {bool recurse = false}) { /// STOKANAL-FORK-EDIT: do not use forEach - for (final dependent in dependents) { - dependent.addDirt(dirt, recurse: recurse); + + var t = _dependentsList.length; + for (var i = 0; i < t; i++) { + _dependentsList[i].addDirt(dirt, recurse: recurse); + // for (final dependent in _dependents) { + // dependent.addDirt(dirt, recurse: recurse); } // dependents // .forEach((dependent) => dependent.addDirt(dirt, recurse: recurse)); } - void onComponentDirty(U component) { - dependencyRoot?.onComponentDirty(component); - } + // void onComponentDirty(U component) { + // dependencyRoot?.onComponentDirty(component); + // } void clear() { - dependents.clear(); + _dependents.clear(); } } From 1b982b7c0372943d376d92b02b67074c7905e70a Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 14 Feb 2025 18:05:11 +0000 Subject: [PATCH 18/50] tweaking --- .../controllers/state_machine_controller.dart | 13 ++++--- lib/src/generated/rive_core_context.dart | 26 +------------ .../animation/animation_reset_factory.dart | 39 +++++++++++-------- lib/src/rive_core/animation/keyed_object.dart | 8 ++-- .../rive_core/animation/keyed_property.dart | 27 +++++++++---- .../rive_core/animation/linear_animation.dart | 28 ------------- lib/src/rive_core/artboard.dart | 5 ++- lib/src/rive_core/component.dart | 3 ++ lib/src/rive_core/container_component.dart | 6 ++- lib/src/rive_core/dependency_helper.dart | 19 +++++---- .../rive_core/state_machine_controller.dart | 28 +++++++++---- lib/src/rive_core/text/text_style.dart | 7 +++- .../rive_core/text/text_style_container.dart | 6 ++- lib/src/rive_core/transform_component.dart | 15 +++++-- lib/src/runtime_artboard.dart | 2 +- lib/src/widgets/rive_animation.dart | 4 +- 16 files changed, 123 insertions(+), 113 deletions(-) diff --git a/lib/src/controllers/state_machine_controller.dart b/lib/src/controllers/state_machine_controller.dart index 1e9262d7..0e36c304 100644 --- a/lib/src/controllers/state_machine_controller.dart +++ b/lib/src/controllers/state_machine_controller.dart @@ -226,13 +226,16 @@ class StateMachineController extends core.StateMachineController @override void applyEvents() { - // var events = reportedEvents.toList(growable: false); super.applyEvents(); - // _runtimeEventListeners.toList().forEach(events.forEach); - for (final t in _runtimeEventListeners) { - reportedEvents.forEach(t); + for (final event in _runtimeEventListeners) { + // reportedEvents.forEach(event); + + var list = reportedEvents; + var t = list.length; + for (var i = 0; i < t; i++) { + event(list[i]); + } } - // _runtimeEventListeners.toList().forEach(reportedEvents.forEach); } } diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index 36f8936f..8585d56d 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -495,58 +495,34 @@ class RiveCoreContext { switch (propertyKey) { case InterpolatingKeyFrameBase.interpolationTypePropertyKey: (object as InterpolatingKeyFrameBase).interpolationType = value as int; - // if (object is InterpolatingKeyFrameBase && value is int) { - // object.interpolationType = value; - // } return; case KeyFrameDoubleBase.valuePropertyKey: (object as KeyFrameDoubleBase).value =value as double; - // if (object is KeyFrameDoubleBase && value is double) { - // object.value = value; - // } return; case KeyedPropertyBase.propertyKeyPropertyKey: (object as KeyedPropertyBase).propertyKey = value as int; - // if (object is KeyedPropertyBase && value is int) { - // object.propertyKey = value; - // } return; case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: (object as InterpolatingKeyFrameBase).interpolatorId = value as int; - // if (object is InterpolatingKeyFrameBase && value is int) { - // object.interpolatorId = value; - // } return; case KeyFrameBase.framePropertyKey: (object as KeyFrameBase).frame = value as int; - // if (object is KeyFrameBase && value is int) { - // object.frame = value; - // } return; case KeyedObjectBase.objectIdPropertyKey: (object as KeyedObjectBase).objectId = value as int; - // if (object is KeyedObjectBase && value is int) { - // object.objectId = value; - // } return; case ComponentBase.parentIdPropertyKey: (object as ComponentBase).parentId = value as int; - // if (object is ComponentBase && value is int) { - // object.parentId = value; - // } return; case LayoutComponentStyleBase.interpolatorIdPropertyKey: (object as LayoutComponentStyleBase).interpolatorId = value as int; - // if (object is LayoutComponentStyleBase && value is int) { - // object.interpolatorId = value; - // } return; } @@ -3078,7 +3054,7 @@ class RiveCoreContext { case TransitionInputConditionBase.inputIdPropertyKey: return (object as TransitionInputConditionBase).inputId; case KeyedPropertyBase.propertyKeyPropertyKey: - return (object as KeyedPropertyBase).propertyKey; + return (object as KeyedPropertyBase).propertyKey_; case StateMachineListenerBase.targetIdPropertyKey: return (object as StateMachineListenerBase).targetId; case StateMachineListenerBase.listenerTypeValuePropertyKey: diff --git a/lib/src/rive_core/animation/animation_reset_factory.dart b/lib/src/rive_core/animation/animation_reset_factory.dart index 3274e02b..47d00b97 100644 --- a/lib/src/rive_core/animation/animation_reset_factory.dart +++ b/lib/src/rive_core/animation/animation_reset_factory.dart @@ -104,19 +104,14 @@ class _KeyedProperty { final bool isBaseline; _KeyedProperty(this.property, this.isBaseline); bool readProperty() { - if (property.propertyKey == 1) { + if (property.propertyKey_ == 1) { return true; } return false; } - int get propertyKey { - return property.propertyKey; - } - - int get size { - return 1 + 4; // property id + float value - } + int get propertyKey => property.propertyKey_; + int get size => 1 + 4; // property id + float value } class _KeyedObject { @@ -124,13 +119,16 @@ class _KeyedObject { final KeyedObject data; final Set visitedProperties = HashSet();//{}; _KeyedObject(this.data); + void addProperties( Iterable props, Core object, bool storeAsBaseline) { for (final property in props) { - if (!visitedProperties.contains(property.propertyKey)) { - visitedProperties.add(property.propertyKey); - if (_isColor(property.propertyKey, object) || - _isDouble(property.propertyKey, object)) { + var prop = property.propertyKey_; + + if (visitedProperties.add(prop)) { + // visitedProperties.add(prop); + if (_isColor(prop, object) || + _isDouble(prop, object)) { properties.add(_KeyedProperty(property, storeAsBaseline)); } } @@ -158,8 +156,9 @@ class _AnimationsData { _AnimationsData(Iterable animations, CoreContext core, bool useFirstAsBaseline) { bool isFirstAnimation = useFirstAsBaseline; + for (final animation in animations) { - // animation.keyedObjects.forEach((keyedObject) { + for (final keyedObject in animation.keyedObjects) { final objectIntId = resolveId(keyedObject.objectId); final object = core.resolve(keyedObject.objectId); @@ -168,13 +167,19 @@ class _AnimationsData { keyedObjects.add(visitedObjects[objectIntId]!); } visitedObjects[objectIntId]!.addProperties( - keyedObject.keyedProperties, object!, isFirstAnimation); // .toList() - }//); + keyedObject.keyedProperties, object!, isFirstAnimation); + } isFirstAnimation = false; } - for (final object in keyedObjects) { - size += object.size; + + var t = keyedObjects.length; + for (var i = 0; i < t; i++) { + size += keyedObjects[i].size; } + + // for (final object in keyedObjects) { + // size += object.size; + // } } int resolveId(int intId) { diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index 0792ffe2..29eeb9de 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -39,7 +39,7 @@ class KeyedObject extends KeyedObjectBase { void onAdded() {} bool isValidKeyedProperty(KeyedProperty property) { - var value = _keyedProperties[property.propertyKey]; + var value = _keyedProperties[property.propertyKey_]; // If the property is already keyed, that's ok just make sure the // KeyedObject matches. @@ -52,14 +52,14 @@ class KeyedObject extends KeyedObjectBase { /// Called by rive_core to add a KeyedProperty to the animation. This should /// be @internal when it's supported. bool internalAddKeyedProperty(KeyedProperty property) { - var value = _keyedProperties[property.propertyKey]; + var value = _keyedProperties[property.propertyKey_]; // If the property is already keyed, that's ok just make sure the // KeyedObject matches. if (value != null && value != property) { return false; } - _keyedProperties[property.propertyKey] = property; + _keyedProperties[property.propertyKey_] = property; _propsNonCallback = _props = null; return true; @@ -68,7 +68,7 @@ class KeyedObject extends KeyedObjectBase { /// Called by rive_core to remove a KeyedObject to the animation. This should /// be @internal when it's supported. bool internalRemoveKeyedProperty(KeyedProperty property) { - var removed = _keyedProperties.remove(property.propertyKey); + var removed = _keyedProperties.remove(property.propertyKey_); _propsNonCallback = _props = null; if (_keyedProperties.isEmpty) { diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 33cc29a3..eb5a8006 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -120,7 +120,11 @@ class KeyedProperty extends KeyedPropertyBase KeyFrame getFrameAt(int index) => _keyframes[index]; - int closestFrameIndex(double seconds, {int exactOffset = 0}) { + double _seconds = -1; + int _closest = -1; + + int _closestFrameIndex(double seconds, {int exactOffset = 0}) { + // Binary find the keyframe index (use timeInSeconds here as opposed to the // finder above which operates in frames). var length = _keyframes.length; @@ -141,8 +145,8 @@ class KeyedProperty extends KeyedPropertyBase return 0; } int mid = (length * seconds/totalSeconds).toInt(); // try to guess an optimal starting seconds - if (mid == length) { - mid = length - 1; + if (mid > end) { + mid = end; } int start = 0; @@ -188,8 +192,8 @@ class KeyedProperty extends KeyedPropertyBase fromExactOffset = 1; } } - int idx = closestFrameIndex(secondsFrom, exactOffset: fromExactOffset); - int idxTo = closestFrameIndex(secondsTo, exactOffset: toExactOffset); + int idx = _closestFrameIndex(secondsFrom, exactOffset: fromExactOffset); + int idxTo = _closestFrameIndex(secondsTo, exactOffset: toExactOffset); // going backwards? if (idxTo < idx) { @@ -201,7 +205,7 @@ class KeyedProperty extends KeyedPropertyBase while (idxTo > idx) { var frame = _keyframes[idx]; reporter.reportKeyedCallback( - objectId, propertyKey, secondsTo - frame.seconds); + objectId, propertyKey_, secondsTo - frame.seconds); idx++; } } @@ -212,8 +216,15 @@ class KeyedProperty extends KeyedPropertyBase return; } - int idx = closestFrameIndex(seconds); - int pk = propertyKey; + int idx; + if (_seconds == seconds) { // return value from last run + idx = _closest; + } else { + _seconds = seconds; + idx = _closest = _closestFrameIndex(seconds); + } + + int pk = propertyKey_; if (idx == 0) { _keyframes[0].apply(object, pk, mix); } else { diff --git a/lib/src/rive_core/animation/linear_animation.dart b/lib/src/rive_core/animation/linear_animation.dart index df832dcc..6e4b66d0 100644 --- a/lib/src/rive_core/animation/linear_animation.dart +++ b/lib/src/rive_core/animation/linear_animation.dart @@ -14,28 +14,6 @@ class LinearAnimation extends LinearAnimationBase { /// object is keyed in this animation. final _keyedObjects = HashMap(); - // static int _objectCount = 0; - // static final List _all = []; - // static void dump() { - // log('DUMPING LINEAR ANIMATIONS all=${_all.length} keyed=${_all.where((a) => a._keyedObjects.isNotEmpty).length} keys=${_all.map((a) => a._keyedObjects.length).sum}'); - // // log(_all.where((a) => a._keyedObjects.isNotEmpty).map((a) => a.toString()).join('\n')); - // } - // - // final int count = ++_objectCount; - // late final bool logging = count < 4500 && count % 500 == 0; - // - // @override - // String toString() => 'LinearAnimation[$name, $count, ${_keyedObjects.length}]'; - // - // LinearAnimation() { - // - // _all.add(this); - // if (logging) { - // log('CONSTRUCTED >> $this'); - // debugPrintStack(); - // } - // } - /// The metadata for the objects that are keyed in this animation. Iterable get keyedObjects => _keyedObjects.values; @@ -44,12 +22,6 @@ class LinearAnimation extends LinearAnimationBase { bool internalAddKeyedObject(KeyedObject object) { if (internalCheckAddKeyedObject(object)) { _keyedObjects[object.objectId] = object; - - // if (logging) {// && _keyedObjects.length % 1 == 0) { - // log('ADDING KEY-OBJECT >> $this'); - // debugPrintStack(); - // } - return true; } return false; diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index 8132dd5d..2b403c90 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -134,7 +134,10 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// Iterate each component and call callback for it. void forEachComponent(void Function(Component) callback) { - _components.forEach(callback); + for (final c in _components) { + callback(c); + } + // _components.forEach(callback); } /// Find a component of a specific type with a specific name. diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index a538e753..c34cda9c 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -173,6 +173,9 @@ abstract class Component extends ComponentBase @override Set get dependents => _dependencyHelper.dependents; + @nonVirtual + List get dependentsList => _dependencyHelper.dependentsList; + Set get dependencies { Set components = HashSet();//{}; allDependencies(components); diff --git a/lib/src/rive_core/container_component.dart b/lib/src/rive_core/container_component.dart index ca936b67..3b5626f6 100644 --- a/lib/src/rive_core/container_component.dart +++ b/lib/src/rive_core/container_component.dart @@ -62,7 +62,11 @@ abstract class ContainerComponent extends ContainerComponentBase { void removeRecursive() { Set deathRow = {this}; forEachChild((child) => deathRow.add(child)); - deathRow.forEach(context.removeObject); + + // deathRow.forEach(context.removeObject); + for (final c in deathRow) { + context.removeObject(c); + } } void buildDrawOrder( diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index 90a080e1..a26fb8b0 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -2,10 +2,10 @@ class DependencyHelper { - final _dependents = {}; // set should stay ordered - final _dependentsList = []; // it's a copy of the set used to iterate over + final dependents = {}; // set should stay ordered + final dependentsList = []; // it's a copy of the set used to iterate over - Set get dependents => _dependents; + // Set get dependents => _dependents; // final dependents = []; // set should stay ordered T? dependencyRoot; @@ -21,8 +21,8 @@ class DependencyHelper { // return false; // /// STOKANAL-FORK-EDIT: use add directly - if (_dependents.add(value)) { - _dependentsList.add(value); + if (dependents.add(value)) { + dependentsList.add(value); return true; } @@ -33,9 +33,9 @@ class DependencyHelper { /// STOKANAL-FORK-EDIT: do not use forEach - var t = _dependentsList.length; + var t = dependentsList.length; for (var i = 0; i < t; i++) { - _dependentsList[i].addDirt(dirt, recurse: recurse); + dependentsList[i].addDirt(dirt, recurse: recurse); // for (final dependent in _dependents) { // dependent.addDirt(dirt, recurse: recurse); } @@ -48,7 +48,6 @@ class DependencyHelper { // dependencyRoot?.onComponentDirty(component); // } - void clear() { - _dependents.clear(); - } + void clear() => + dependents.clear(); } diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 8192f35b..cdcd4be2 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -619,21 +619,35 @@ class StateMachineController extends RiveAnimationController // Handle events from this artboard if it is the target if (listenerTarget == artboard) { // events.forEach((event) { - for (final event in events) { - if (listener.eventId == event.id) { + + var t = events.length; + for (var i = 0; i < t; i++) { + if (listener.eventId == events[i].id) { listener.performChanges(this, Vec2D(), Vec2D()); } - }//); + } + // for (final event in events) { + // if (listener.eventId == event.id) { + // listener.performChanges(this, Vec2D(), Vec2D()); + // } + // } + } else { // Handle events from nested artboards nestedEvents.forEach((targetId, eventList) { if (listener.targetId == targetId) { - // eventList.forEach((nestedEvent) { - for (final nestedEvent in eventList) { - if (listener.eventId == nestedEvent.id) { + + var t = eventList.length; + for (var i = 0; i < t; i++) { + if (listener.eventId == eventList[i].id) { listener.performChanges(this, Vec2D(), Vec2D()); } - }//); + } + // for (final nestedEvent in eventList) { + // if (listener.eventId == nestedEvent.id) { + // listener.performChanges(this, Vec2D(), Vec2D()); + // } + // } } }); } diff --git a/lib/src/rive_core/text/text_style.dart b/lib/src/rive_core/text/text_style.dart index e58eef8f..e39f8cd3 100644 --- a/lib/src/rive_core/text/text_style.dart +++ b/lib/src/rive_core/text/text_style.dart @@ -134,7 +134,12 @@ class TextStyle extends TextStyleBase } // void removeVariations() => _variations.toSet().forEach(context.removeObject); - void removeVariations() => _variations.forEach(context.removeObject); + // void removeVariations() => _variations.forEach(context.removeObject); + void removeVariations() { + for (final v in _variations) { + context.removeObject(v); + } + } @override set asset(FontAsset? value) { diff --git a/lib/src/rive_core/text/text_style_container.dart b/lib/src/rive_core/text/text_style_container.dart index 838f6ff0..48610951 100644 --- a/lib/src/rive_core/text/text_style_container.dart +++ b/lib/src/rive_core/text/text_style_container.dart @@ -42,7 +42,11 @@ abstract class TextStyleContainer { if (!iterableEquals(nextStyles, styles)) { styles.clear(); styles.addAll(nextStyles); - styles.forEach(_registerStyle); + + // styles.forEach(_registerStyle); + for (final s in styles) { + _registerStyle(s); + } } } diff --git a/lib/src/rive_core/transform_component.dart b/lib/src/rive_core/transform_component.dart index aa51ad9e..a91d11fe 100644 --- a/lib/src/rive_core/transform_component.dart +++ b/lib/src/rive_core/transform_component.dart @@ -225,12 +225,21 @@ abstract class TransformComponent extends TransformComponentBase { } // In the runtime, we have to iterate the dependents - // dependents.forEach((element) { - for (final element in dependents) { + + var list = dependentsList; + var t = list.length; + for (var i = 0; i < t; i++) { + var element = list[i]; if (element is TransformComponent) { element.markDirtyIfConstrained(); } - }//); + } + + // for (final element in dependents) { + // if (element is TransformComponent) { + // element.markDirtyIfConstrained(); + // } + // } return true; } diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index bc0760d5..80c1b53d 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -227,7 +227,7 @@ class RuntimeArtboard extends Artboard implements CoreContext { } // animations.forEach(artboard.animations.add); - for (var a in animations) { + for (final a in animations) { artboard.animations.add(a); } diff --git a/lib/src/widgets/rive_animation.dart b/lib/src/widgets/rive_animation.dart index 90f0a2c2..a0f233e4 100644 --- a/lib/src/widgets/rive_animation.dart +++ b/lib/src/widgets/rive_animation.dart @@ -312,9 +312,11 @@ class RiveAnimationState extends State { // Clear current local controllers. // _controllers.forEach((c) { + for (final c in _controllers) { c.dispose(); - }//); + } + _controllers.clear(); final artboard = (widget.artboard != null From 9b9519df698abb3eb116cc9da244c63ef16579bb Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 14 Feb 2025 20:20:19 +0000 Subject: [PATCH 19/50] fixing ios startup --- lib/src/generated/drawable_base.dart | 15 ++++--- lib/src/generated/rive_core_context.dart | 25 +++++------ .../rive_core/animation/keyed_property.dart | 43 ++++++++++--------- .../rive_core/animation/keyframe_double.dart | 23 +++++----- lib/src/rive_core/drawable.dart | 7 ++- 5 files changed, 59 insertions(+), 54 deletions(-) diff --git a/lib/src/generated/drawable_base.dart b/lib/src/generated/drawable_base.dart index 30507fd3..5d098ec2 100644 --- a/lib/src/generated/drawable_base.dart +++ b/lib/src/generated/drawable_base.dart @@ -49,18 +49,21 @@ abstract class DrawableBase extends Node { /// DrawableFlags field with key 129. static const int drawableFlagsPropertyKey = 129; static const int drawableFlagsInitialValue = 0; - int _drawableFlags = drawableFlagsInitialValue; - int get drawableFlags => _drawableFlags; + + // exposing it + int drawableFlags_ = drawableFlagsInitialValue; + @nonVirtual + int get drawableFlags => drawableFlags_; /// Change the [_drawableFlags] field value. /// [drawableFlagsChanged] will be invoked only if the field's value has /// changed. set drawableFlags(int value) { - if (_drawableFlags == value) { + if (drawableFlags_ == value) { return; } - int from = _drawableFlags; - _drawableFlags = value; + int from = drawableFlags_; + drawableFlags_ = value; if (hasValidated) { drawableFlagsChanged(from, value); } @@ -73,7 +76,7 @@ abstract class DrawableBase extends Node { super.copy(source); if (source is DrawableBase) { _blendModeValue = source._blendModeValue; - _drawableFlags = source._drawableFlags; + drawableFlags_ = source.drawableFlags_; } } } diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index 8585d56d..ab6b1c6d 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -2802,15 +2802,15 @@ class RiveCoreContext { } } - static bool isCallback(int propertyKey) { - switch (propertyKey) { - case NestedTriggerBase.firePropertyKey: - case EventBase.triggerPropertyKey: - return true; - default: - return false; - } - } + // static bool isCallback(int propertyKey) { + // switch (propertyKey) { + // case NestedTriggerBase.firePropertyKey: + // case EventBase.triggerPropertyKey: + // return true; + // default: + // return false; + // } + // } static bool getBool(Core object, int propertyKey) { switch (propertyKey) { @@ -2924,7 +2924,7 @@ class RiveCoreContext { case DrawableBase.blendModeValuePropertyKey: return (object as DrawableBase).blendModeValue; case DrawableBase.drawableFlagsPropertyKey: - return (object as DrawableBase).drawableFlags; + return (object as DrawableBase).drawableFlags_; case NestedArtboardBase.artboardIdPropertyKey: return (object as NestedArtboardBase).artboardId; case NestedArtboardBase.fitPropertyKey: @@ -3263,12 +3263,10 @@ class RiveCoreContext { static double getDouble(Core object, int propertyKey) { switch (propertyKey) { - case NodeBase.xPropertyKey: return (object as NodeBase).x; case NodeBase.yPropertyKey: return (object as NodeBase).y; - case ViewModelInstanceNumberBase.propertyValuePropertyKey: return (object as ViewModelInstanceNumberBase).propertyValue; case CustomPropertyNumberBase.propertyValuePropertyKey: @@ -3323,6 +3321,9 @@ class RiveCoreContext { return (object as LayoutComponentStyleBase).borderTop; case LayoutComponentStyleBase.borderBottomPropertyKey: return (object as LayoutComponentStyleBase).borderBottom; + } + + switch (propertyKey) { case LayoutComponentStyleBase.marginLeftPropertyKey: return (object as LayoutComponentStyleBase).marginLeft; case LayoutComponentStyleBase.marginRightPropertyKey: diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index eb5a8006..f4718dd7 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -4,6 +4,9 @@ import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/keyframe.dart'; +import '../../../rive.dart'; +import '../../generated/animation/nested_trigger_base.dart'; + export 'package:rive/src/generated/animation/keyed_property_base.dart'; abstract class KeyFrameInterface { @@ -120,9 +123,6 @@ class KeyedProperty extends KeyedPropertyBase KeyFrame getFrameAt(int index) => _keyframes[index]; - double _seconds = -1; - int _closest = -1; - int _closestFrameIndex(double seconds, {int exactOffset = 0}) { // Binary find the keyframe index (use timeInSeconds here as opposed to the @@ -167,7 +167,10 @@ class KeyedProperty extends KeyedPropertyBase return start; } - bool get isCallback => RiveCoreContext.isCallback(propertyKey_); + bool get isCallback => + propertyKey_ == EventBase.triggerPropertyKey || + propertyKey_ == NestedTriggerBase.firePropertyKey; + // RiveCoreContext.isCallback(propertyKey_); /// Report any keyframes that occured between secondsFrom and secondsTo. void reportKeyedCallbacks( @@ -210,40 +213,40 @@ class KeyedProperty extends KeyedPropertyBase } } + double _seconds = -1; + int _idx = -1; + /// Apply keyframe values at a given time expressed in [seconds]. void apply(double seconds, double mix, Core object) { - if (_keyframes.length == 0) { + var length = _keyframes.length; + if (length == 0) { return; } - int idx; - if (_seconds == seconds) { // return value from last run - idx = _closest; - } else { + if (_seconds != seconds) { // return value from last run _seconds = seconds; - idx = _closest = _closestFrameIndex(seconds); + _idx = _closestFrameIndex(seconds); } - int pk = propertyKey_; - if (idx == 0) { - _keyframes[0].apply(object, pk, mix); + if (_idx == 0) { + _keyframes[0].apply(object, propertyKey_, mix); } else { - if (idx < _keyframes.length) { - KeyFrame toFrame = _keyframes[idx]; + if (_idx < length) { + final toFrame = _keyframes[_idx]; if (seconds == toFrame.seconds) { - toFrame.apply(object, pk, mix); + toFrame.apply(object, propertyKey_, mix); } else { - InterpolatingKeyFrame fromFrame = _keyframes[idx - 1] as InterpolatingKeyFrame; + final fromFrame = _keyframes[_idx - 1] as InterpolatingKeyFrame; /// Equivalent to fromFrame.interpolation == /// KeyFrameInterpolation.hold. if (fromFrame.interpolationType == 0) { - fromFrame.apply(object, pk, mix); + fromFrame.apply(object, propertyKey_, mix); } else { - fromFrame.applyInterpolation(object, pk, seconds, toFrame, mix); + fromFrame.applyInterpolation(object, propertyKey_, seconds, toFrame, mix); } } } else { - _keyframes[idx - 1].apply(object, pk, mix); + _keyframes[_idx - 1].apply(object, propertyKey_, mix); } } } diff --git a/lib/src/rive_core/animation/keyframe_double.dart b/lib/src/rive_core/animation/keyframe_double.dart index bcde08e1..d456fea0 100644 --- a/lib/src/rive_core/animation/keyframe_double.dart +++ b/lib/src/rive_core/animation/keyframe_double.dart @@ -2,16 +2,11 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_double_base.dart'; export 'package:rive/src/generated/animation/keyframe_double_base.dart'; -void _apply( - Core object, int propertyKey, double mix, double value) { - if (mix == 1) { - RiveCoreContext.setDouble(object, propertyKey, value); - } else { - var mixi = 1.0 - mix; - RiveCoreContext.setDouble(object, propertyKey, - RiveCoreContext.getDouble(object, propertyKey) * mixi + value * mix); - } -} +// void _apply( +// Core object, int propertyKey, double mix, double value) { +// RiveCoreContext.setDouble(object, propertyKey, +// mix == 1 ? value : RiveCoreContext.getDouble(object, propertyKey) * (1.0 - mix) + value * mix); +// } class KeyFrameDouble extends KeyFrameDoubleBase { @@ -21,7 +16,8 @@ class KeyFrameDouble extends KeyFrameDoubleBase { @override void apply(Core object, int propertyKey, double mix) => - _apply(object, propertyKey, mix, value_); + RiveCoreContext.setDouble(object, propertyKey, + mix == 1 ? value_ : RiveCoreContext.getDouble(object, propertyKey) * (1.0 - mix) + value_ * mix); @override void applyInterpolation(Core object, int propertyKey, @@ -31,7 +27,10 @@ class KeyFrameDouble extends KeyFrameDoubleBase { var frameValue = interpolator?.transformValue(value_, nextFrame.value_, f) ?? value_ + (nextFrame.value_ - value_) * f; - _apply(object, propertyKey, mix, frameValue); + // _apply(object, propertyKey, mix, frameValue); + + RiveCoreContext.setDouble(object, propertyKey, + mix == 1 ? frameValue : RiveCoreContext.getDouble(object, propertyKey) * (1.0 - mix) + frameValue * mix); } @override diff --git a/lib/src/rive_core/drawable.dart b/lib/src/rive_core/drawable.dart index fd39fb71..6d6d4df3 100644 --- a/lib/src/rive_core/drawable.dart +++ b/lib/src/rive_core/drawable.dart @@ -86,10 +86,9 @@ abstract class Drawable extends DrawableBase { void drawableFlagsChanged(int from, int to) => addDirt(ComponentDirt.paint); bool get isHidden => - (drawableFlags & ComponentFlags.hidden) != 0 || + (drawableFlags_ & ComponentFlags.hidden) != 0 || (dirt & ComponentDirt.collapsed) != 0; - bool get isTargetOpaque { - return (drawableFlags & ComponentFlags.opaque) != 0; - } + bool get isTargetOpaque => + (drawableFlags_ & ComponentFlags.opaque) != 0; } From e73022db3cbe50bf7a84eb91c3d3fae38d0d6a25 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sat, 15 Feb 2025 11:43:08 +0000 Subject: [PATCH 20/50] tweaking rive-flutter --- .../linear_animation_controller.dart | 5 +- .../controllers/state_machine_controller.dart | 5 +- lib/src/core/core.dart | 2 +- .../core/importers/backboard_importer.dart | 4 +- .../animation/animation_reset_factory.dart | 2 +- .../rive_core/animation/keyed_property.dart | 103 ++++++++++++++---- .../animation/nested_state_machine.dart | 4 +- lib/src/rive_core/artboard.dart | 9 +- lib/src/rive_core/assets/font_asset.dart | 3 +- lib/src/rive_core/bones/bone.dart | 4 +- lib/src/rive_core/component.dart | 6 +- lib/src/rive_core/shapes/shape.dart | 3 +- .../shapes/shape_paint_container.dart | 6 +- .../rive_core/state_machine_controller.dart | 2 +- lib/src/rive_core/text/text_style.dart | 6 +- lib/src/runtime_artboard.dart | 3 +- lib/src/runtime_mounted_artboard.dart | 6 +- test/rive_animation_test.dart | 6 +- 18 files changed, 111 insertions(+), 68 deletions(-) diff --git a/lib/src/controllers/linear_animation_controller.dart b/lib/src/controllers/linear_animation_controller.dart index f4675900..f693108a 100644 --- a/lib/src/controllers/linear_animation_controller.dart +++ b/lib/src/controllers/linear_animation_controller.dart @@ -1,18 +1,17 @@ -import 'dart:collection'; - import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/linear_animation_instance.dart' as core; import 'package:rive/src/rive_core/event.dart'; import 'package:rive/src/runtime_mounted_artboard.dart'; + export 'package:rive/src/runtime_mounted_artboard.dart'; /// An AnimationController which controls a StateMachine and provides access to /// the inputs of the StateMachine. class LinearAnimationInstance extends core.LinearAnimationInstance with RuntimeEventReporter, KeyedCallbackReporter { - final _runtimeEventListeners = HashSet(); // {}; + final _runtimeEventListeners = {}; late CoreContext? context; LinearAnimationInstance(animation, diff --git a/lib/src/controllers/state_machine_controller.dart b/lib/src/controllers/state_machine_controller.dart index 0e36c304..1c7a3dbd 100644 --- a/lib/src/controllers/state_machine_controller.dart +++ b/lib/src/controllers/state_machine_controller.dart @@ -1,5 +1,3 @@ -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_bool.dart'; @@ -9,6 +7,7 @@ import 'package:rive/src/rive_core/animation/state_machine_trigger.dart'; import 'package:rive/src/rive_core/artboard.dart'; import 'package:rive/src/rive_core/state_machine_controller.dart' as core; import 'package:rive/src/runtime_mounted_artboard.dart'; + export 'package:rive/src/runtime_mounted_artboard.dart'; /// [StateMachine]s supports three input types. The StateMachine mostly @@ -121,7 +120,7 @@ class StateMachineController extends core.StateMachineController /// A list of inputs available in the StateMachine. Iterable get inputs => _inputs; - final _runtimeEventListeners = HashSet();//{}; + final _runtimeEventListeners = {}; StateMachineController( StateMachine stateMachine, { diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index 87443f98..1f0b8495 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -93,7 +93,7 @@ abstract class CoreContext { // ignore: one_member_abstracts abstract class ImportStackObject { - final _resolveBefore = HashSet();//{}; + final _resolveBefore = {}; bool _resolved = false; bool initStack(ImportStack stack) { diff --git a/lib/src/core/importers/backboard_importer.dart b/lib/src/core/importers/backboard_importer.dart index 067eb539..9ddc2146 100644 --- a/lib/src/core/importers/backboard_importer.dart +++ b/lib/src/core/importers/backboard_importer.dart @@ -11,9 +11,9 @@ class BackboardImporter extends ImportStackObject { final Backboard backboard; final HashMap artboardLookup; - final Set nestedArtboards = HashSet();//{}; + final nestedArtboards = {}; final List fileAssets = []; - final Set fileAssetReferencers = HashSet();//{}; + final fileAssetReferencers = {}; BackboardImporter(this.artboardLookup, this.backboard); void addArtboard(Artboard object) {} diff --git a/lib/src/rive_core/animation/animation_reset_factory.dart b/lib/src/rive_core/animation/animation_reset_factory.dart index 47d00b97..c6718b61 100644 --- a/lib/src/rive_core/animation/animation_reset_factory.dart +++ b/lib/src/rive_core/animation/animation_reset_factory.dart @@ -117,7 +117,7 @@ class _KeyedProperty { class _KeyedObject { final List<_KeyedProperty> properties = []; final KeyedObject data; - final Set visitedProperties = HashSet();//{}; + final visitedProperties = {}; _KeyedObject(this.data); void addProperties( diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index f4718dd7..be6550f6 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -3,6 +3,7 @@ import 'package:rive/src/generated/animation/keyed_property_base.dart'; import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/keyframe.dart'; +import 'package:stokanal/collections.dart'; import '../../../rive.dart'; import '../../generated/animation/nested_trigger_base.dart'; @@ -123,6 +124,51 @@ class KeyedProperty extends KeyedPropertyBase KeyFrame getFrameAt(int index) => _keyframes[index]; + /// Return from and to frames + Pair _closestFramePair(double seconds) { + + // Binary find the keyframe index (use timeInSeconds here as opposed to the + // finder above which operates in frames). + var length = _keyframes.length; + int end = length - 1; + var last = _keyframes[end]; + var totalSeconds = last.seconds; + + // If it's the last keyframe, we skip the binary search + if (seconds >= totalSeconds) { + return Pair.of(null, last); + } + + var first = _keyframes[0]; + if (seconds <= first.seconds) { + return Pair.of(null, first); + } + int mid = (length * seconds/totalSeconds).toInt(); // try to guess an optimal starting seconds + if (mid > end) { + mid = end; + } + + int start = 0; + double closestSeconds; + + while (start <= end) { + // mid = (start + end) >> 1; + var keyframe = _keyframes[mid]; + closestSeconds = keyframe.seconds; + if (closestSeconds < seconds) { + start = mid + 1; + } else if (closestSeconds > seconds) { + end = mid - 1; + } else { + return Pair.of(null, first); + // return mid; + } + mid = (start + end) >> 1; + } + return Pair.of(start == 0 ? null : _keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start]); + // return start; + } + int _closestFrameIndex(double seconds, {int exactOffset = 0}) { // Binary find the keyframe index (use timeInSeconds here as opposed to the @@ -214,7 +260,8 @@ class KeyedProperty extends KeyedPropertyBase } double _seconds = -1; - int _idx = -1; + // int _idx = -1; + Pair? _pair; /// Apply keyframe values at a given time expressed in [seconds]. void apply(double seconds, double mix, Core object) { @@ -223,32 +270,46 @@ class KeyedProperty extends KeyedPropertyBase return; } - if (_seconds != seconds) { // return value from last run + if (_seconds != seconds) { // if seconds coincide, return value from last run _seconds = seconds; - _idx = _closestFrameIndex(seconds); + // _idx = _closestFrameIndex(seconds); + _pair = _closestFramePair(seconds); } - if (_idx == 0) { - _keyframes[0].apply(object, propertyKey_, mix); - } else { - if (_idx < length) { - final toFrame = _keyframes[_idx]; - if (seconds == toFrame.seconds) { - toFrame.apply(object, propertyKey_, mix); - } else { - final fromFrame = _keyframes[_idx - 1] as InterpolatingKeyFrame; - /// Equivalent to fromFrame.interpolation == - /// KeyFrameInterpolation.hold. - if (fromFrame.interpolationType == 0) { - fromFrame.apply(object, propertyKey_, mix); - } else { - fromFrame.applyInterpolation(object, propertyKey_, seconds, toFrame, mix); - } - } + var fromFrame = _pair!.left; + var toFrame = _pair!.right; + + if (fromFrame != null) { // interpolation + if (fromFrame.interpolationType == 0) { + fromFrame.apply(object, propertyKey_, mix); } else { - _keyframes[_idx - 1].apply(object, propertyKey_, mix); + fromFrame.applyInterpolation(object, propertyKey_, seconds, toFrame, mix); } + } else { + toFrame.apply(object, propertyKey_, mix); } + + // if (_idx == 0) { + // _keyframes[_idx].apply(object, propertyKey_, mix); + // } else { + // if (_idx < length) { + // final toFrame = _keyframes[_idx]; + // if (seconds == toFrame.seconds) { + // toFrame.apply(object, propertyKey_, mix); + // } else { + // final fromFrame = _keyframes[_idx - 1] as InterpolatingKeyFrame; + // /// Equivalent to fromFrame.interpolation == + // /// KeyFrameInterpolation.hold. + // if (fromFrame.interpolationType == 0) { + // fromFrame.apply(object, propertyKey_, mix); + // } else { + // fromFrame.applyInterpolation(object, propertyKey_, seconds, toFrame, mix); + // } + // } + // } else { + // _keyframes[_idx - 1].apply(object, propertyKey_, mix); + // } + // } } @override diff --git a/lib/src/rive_core/animation/nested_state_machine.dart b/lib/src/rive_core/animation/nested_state_machine.dart index b73c3806..05dcf81f 100644 --- a/lib/src/rive_core/animation/nested_state_machine.dart +++ b/lib/src/rive_core/animation/nested_state_machine.dart @@ -1,5 +1,3 @@ -import 'dart:collection'; - import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:rive/src/core/core.dart'; @@ -43,7 +41,7 @@ class NestedStateMachine extends NestedStateMachineBase { @override bool get isEnabled => _stateMachineInstance?.isActive ?? false; - final Set _nestedInputs = HashSet();//{}; + final _nestedInputs = {}; Set get nestedInputs => _nestedInputs; NestedStateMachineInstance? _stateMachineInstance; diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index 2b403c90..19f7f73d 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -1,4 +1,3 @@ -import 'dart:collection'; import 'dart:ui'; import 'package:meta/meta.dart'; @@ -34,7 +33,7 @@ import 'package:rive_common/utilities.dart'; export 'package:rive/src/generated/artboard_base.dart'; class Artboard extends ArtboardBase with ShapePaintContainer { - final HashSet _dirtyLayout = HashSet(); + final _dirtyLayout = {}; void markLayoutDirty(LayoutComponent layoutComponent) { _dirtyLayout.add(layoutComponent); @@ -106,7 +105,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { final List _rules = []; List _sortedDrawRules = []; - final Set _components = HashSet();//{}; + final _components = {}; List get drawables => _drawables; @@ -209,7 +208,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { return didUpdate; } - final Set _activeNestedArtboards = HashSet();//{}; + final _activeNestedArtboards = {}; Iterable get activeNestedArtboards => _activeNestedArtboards; final List _joysticks = []; @@ -577,7 +576,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// The animation controllers that are called back whenever the artboard /// advances. - final Set _animationControllers = HashSet();//{}; + final _animationControllers = {}; /// Access a read-only iterator of currently applied animation controllers. Iterable get animationControllers => diff --git a/lib/src/rive_core/assets/font_asset.dart b/lib/src/rive_core/assets/font_asset.dart index 99e40f05..6c92b852 100644 --- a/lib/src/rive_core/assets/font_asset.dart +++ b/lib/src/rive_core/assets/font_asset.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:collection'; import 'package:flutter/foundation.dart'; import 'package:rive/src/generated/assets/font_asset_base.dart'; @@ -10,7 +9,7 @@ import 'package:rive_common/rive_text.dart'; export 'package:rive/src/generated/assets/font_asset_base.dart'; class FontAsset extends FontAssetBase { - final Set _callbacks = HashSet();//{}; + final _callbacks = {}; /// Call [callback] when the font is ready. Set [notifyAlreadySet] to /// specify if you want to be called if the font is already set. diff --git a/lib/src/rive_core/bones/bone.dart b/lib/src/rive_core/bones/bone.dart index 41b149d8..16c9b39c 100644 --- a/lib/src/rive_core/bones/bone.dart +++ b/lib/src/rive_core/bones/bone.dart @@ -1,5 +1,3 @@ -import 'dart:collection'; - import 'package:rive/src/generated/bones/bone_base.dart'; import 'package:rive/src/rive_core/constraints/constraint.dart'; import 'package:rive_common/math.dart'; @@ -11,7 +9,7 @@ typedef bool BoneCallback(Bone bone); class Bone extends BoneBase { /// Child constraints applied to some child of this bone which also affect /// this bone. - final Set _peerConstraints = HashSet();//{}; + final _peerConstraints = {}; Iterable get peerConstraints => _peerConstraints; bool addPeerConstraint(Constraint child) => _peerConstraints.add(child); diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index c34cda9c..0acbec8d 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -1,5 +1,3 @@ -import 'dart:collection'; - import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/rive_core/artboard.dart'; import 'package:rive/src/rive_core/component_dirt.dart'; @@ -168,7 +166,7 @@ abstract class Component extends ComponentBase } /// Components that this component depends on. - final Set _dependsOn = HashSet();//{}; + final _dependsOn = {}; @override Set get dependents => _dependencyHelper.dependents; @@ -177,7 +175,7 @@ abstract class Component extends ComponentBase List get dependentsList => _dependencyHelper.dependentsList; Set get dependencies { - Set components = HashSet();//{}; + var components = {}; allDependencies(components); return components; } diff --git a/lib/src/rive_core/shapes/shape.dart b/lib/src/rive_core/shapes/shape.dart index 86a18ad5..0abd25a0 100644 --- a/lib/src/rive_core/shapes/shape.dart +++ b/lib/src/rive_core/shapes/shape.dart @@ -1,4 +1,3 @@ -import 'dart:collection'; import 'dart:ui' as ui; import 'package:collection/collection.dart'; @@ -15,7 +14,7 @@ import 'package:rive_common/math.dart'; export 'package:rive/src/generated/shapes/shape_base.dart'; class Shape extends ShapeBase with ShapePaintContainer { - final Set paths = HashSet();//{}; + final paths = {}; bool _wantWorldPath = false; bool _wantLocalPath = false; diff --git a/lib/src/rive_core/shapes/shape_paint_container.dart b/lib/src/rive_core/shapes/shape_paint_container.dart index 54525f83..709f0f95 100644 --- a/lib/src/rive_core/shapes/shape_paint_container.dart +++ b/lib/src/rive_core/shapes/shape_paint_container.dart @@ -1,5 +1,3 @@ -import 'dart:collection'; - import 'package:meta/meta.dart'; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/container_component.dart'; @@ -11,9 +9,9 @@ import 'package:rive_common/math.dart'; /// An abstraction to give a common interface to any component that can contain /// fills and strokes. abstract class ShapePaintContainer { - final Set fills = HashSet();//{}; + final fills = {}; - final Set strokes = HashSet();//{}; + final strokes = {}; /// Called whenever a new paint mutator is added/removed from the shape paints /// (for example a linear gradient is added to a stroke). diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index cdcd4be2..b0370d8d 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -372,7 +372,7 @@ class StateMachineController extends RiveAnimationController /// Optional callback for input value changes OnInputValueChange? onInputValueChange; - final _eventListeners = HashSet();//{}; + final _eventListeners = {}; AudioPlayer? _audioPlayer; AudioPlayer get audioPlayer => (_audioPlayer ??= AudioPlayer.make())!; diff --git a/lib/src/rive_core/text/text_style.dart b/lib/src/rive_core/text/text_style.dart index e39f8cd3..1804f6df 100644 --- a/lib/src/rive_core/text/text_style.dart +++ b/lib/src/rive_core/text/text_style.dart @@ -56,10 +56,10 @@ class TextVariationHelper extends Component { class TextStyle extends TextStyleBase with ShapePaintContainer, FileAssetReferencer { - final Set _referencers = HashSet();//{}; + final _referencers = {}; Text? get text => parent as Text?; - final Set _variations = HashSet();//{}; - final Set _features = HashSet();//{}; + final _variations = {}; + final _features = {}; Iterable get variations => _variations; Iterable get features => _features; diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index 80c1b53d..73bef132 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -1,4 +1,3 @@ -import 'dart:collection'; import 'dart:developer'; import 'package:collection/collection.dart'; @@ -103,7 +102,7 @@ class RuntimeArtboard extends Artboard implements CoreContext { final List _objects = []; Iterable get objects => _objects; - final Set _needDependenciesBuilt = HashSet();//{}; + final _needDependenciesBuilt = {}; /// Indicates if this artboard is playing or paused bool _isPlaying = true; diff --git a/lib/src/runtime_mounted_artboard.dart b/lib/src/runtime_mounted_artboard.dart index 36937414..eb02c4b7 100644 --- a/lib/src/runtime_mounted_artboard.dart +++ b/lib/src/runtime_mounted_artboard.dart @@ -1,5 +1,3 @@ -import 'dart:collection'; - import 'package:flutter/rendering.dart'; import 'package:rive/src/controllers/state_machine_controller.dart'; import 'package:rive/src/core/core.dart'; @@ -21,11 +19,11 @@ abstract class RuntimeEventReporter { class RuntimeMountedArtboard extends MountedArtboard { NestedArtboard nestedArtboard; final RuntimeArtboard artboardInstance; - final Set _runtimeEventListeners = HashSet();//{}; + final _runtimeEventListeners = {}; Size originalArtboardInstanceSize = const Size(0, 0); Set get controllers => - HashSet.of(_runtimeEventListeners.whereType()); + _runtimeEventListeners.whereType().toSet(); // The callback used for bubbling events up from nested artboards Function(Event, NestedArtboard)? eventCallback; diff --git a/test/rive_animation_test.dart b/test/rive_animation_test.dart index b871acf4..ef05bebd 100644 --- a/test/rive_animation_test.dart +++ b/test/rive_animation_test.dart @@ -1,5 +1,3 @@ -import 'dart:collection'; - import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; @@ -271,7 +269,7 @@ void main() { riveFile.mainArtboard, 'State Machine 1'); expect(controller, isNotNull); - Set receivedEvents = HashSet();//{}; + var receivedEvents = {}; controller!.addEventListener((event) { receivedEvents.add(event.name); }); @@ -318,7 +316,7 @@ void main() { riveFile.mainArtboard, 'State Machine 1'); expect(controller, isNotNull); - Set receivedEvents = HashSet();//{}; + var receivedEvents = {}; controller!.addEventListener((event) { receivedEvents.add(event.name); }); From c8c230718688722f305b8a27be7463806edbe161 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sat, 15 Feb 2025 12:38:51 +0000 Subject: [PATCH 21/50] unique list --- lib/src/core/core.dart | 11 +++--- lib/src/rive.dart | 3 +- .../rive_core/animation/keyed_property.dart | 10 ++--- lib/src/rive_core/artboard.dart | 39 +++++++++++++------ lib/src/rive_core/component.dart | 7 ++-- lib/src/rive_core/dependency_helper.dart | 14 ++++--- lib/src/rive_core/layout_component.dart | 7 ++-- .../shapes/shape_paint_container.dart | 6 +-- .../rive_core/state_machine_controller.dart | 6 +-- lib/src/runtime_artboard.dart | 8 ---- 10 files changed, 60 insertions(+), 51 deletions(-) diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index 1f0b8495..055fdf1c 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -2,6 +2,7 @@ import 'dart:collection'; import 'package:flutter/foundation.dart'; import 'package:rive/src/rive_core/runtime/exceptions/rive_format_error_exception.dart'; +import 'package:stokanal/collections.dart'; export 'dart:typed_data'; @@ -93,7 +94,7 @@ abstract class CoreContext { // ignore: one_member_abstracts abstract class ImportStackObject { - final _resolveBefore = {}; + final UniqueList _resolveBefore = UniqueList.hashed(); bool _resolved = false; bool initStack(ImportStack stack) { @@ -116,11 +117,9 @@ abstract class ImportStackObject { return true; } _resolved = true; - if (_resolveBefore.isNotEmpty) { - for (final before in _resolveBefore) { - if (!before._internalResolve()) { - return false; - } + for (final before in _resolveBefore) { + if (!before._internalResolve()) { + return false; } } return resolve(); diff --git a/lib/src/rive.dart b/lib/src/rive.dart index 0a8af09c..bce8018e 100644 --- a/lib/src/rive.dart +++ b/lib/src/rive.dart @@ -207,8 +207,7 @@ class RiveRenderObject extends RiveRenderBox implements MouseTrackerAnnotation { void _hitHelper(PointerEvent event, void Function(StateMachineController, Vec2D) callback) { final artboardPosition = _toArtboard(event.localPosition); - final stateMachineControllers = - _artboard.animationControllers.whereType(); + final stateMachineControllers = _artboard.animationControllers.whereType(); for (final stateMachineController in stateMachineControllers) { callback(stateMachineController, artboardPosition); } diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index be6550f6..a7398a24 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -149,15 +149,15 @@ class KeyedProperty extends KeyedPropertyBase } int start = 0; - double closestSeconds; + // double closestSeconds; while (start <= end) { // mid = (start + end) >> 1; var keyframe = _keyframes[mid]; - closestSeconds = keyframe.seconds; - if (closestSeconds < seconds) { + // closestSeconds = keyframe.seconds; + if (keyframe.seconds < seconds) { start = mid + 1; - } else if (closestSeconds > seconds) { + } else if (keyframe.seconds > seconds) { end = mid - 1; } else { return Pair.of(null, first); @@ -182,8 +182,6 @@ class KeyedProperty extends KeyedPropertyBase return end + 1; } - // int mid; - if (seconds == totalSeconds) { return end + exactOffset; } diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index 19f7f73d..f7340535 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -29,6 +29,7 @@ import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; import 'package:rive_common/layout_engine.dart'; import 'package:rive_common/math.dart'; import 'package:rive_common/utilities.dart'; +import 'package:stokanal/collections.dart'; export 'package:rive/src/generated/artboard_base.dart'; @@ -105,7 +106,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { final List _rules = []; List _sortedDrawRules = []; - final _components = {}; + final UniqueList _components = UniqueList.nonHashed(); List get drawables => _drawables; @@ -208,14 +209,14 @@ class Artboard extends ArtboardBase with ShapePaintContainer { return didUpdate; } - final _activeNestedArtboards = {}; + final UniqueList _activeNestedArtboards = UniqueList.nonHashed(); Iterable get activeNestedArtboards => _activeNestedArtboards; final List _joysticks = []; Iterable get joysticks => _joysticks; - final List _dataBinds = []; - Iterable get dataBinds => _dataBinds; + final List dataBinds = []; + // Iterable get dataBinds => _dataBinds; bool canPreApplyJoysticks() { if (_joysticks.length == 0) { @@ -438,7 +439,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { break; case DataBindBase.typeKey: case DataBindContextBase.typeKey: - _dataBinds.add(component as DataBind); + dataBinds.add(component as DataBind); break; } } @@ -460,7 +461,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { break; case DataBindBase.typeKey: case DataBindContextBase.typeKey: - _dataBinds.remove(component as DataBind); + dataBinds.remove(component as DataBind); break; } } @@ -576,7 +577,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// The animation controllers that are called back whenever the artboard /// advances. - final _animationControllers = {}; + final UniqueList _animationControllers = UniqueList.nonHashed(); /// Access a read-only iterator of currently applied animation controllers. Iterable get animationControllers => @@ -686,9 +687,13 @@ class Artboard extends ArtboardBase with ShapePaintContainer { if (dataContext == null) { return; } - for (final dataBind in dataBinds) { - dataBind.bind(dataContext); + + var length = dataBinds.length; + for (var i = 0; i < length; i++) { + // for (final dataBind in dataBinds) { + dataBinds[i].bind(dataContext); } + if (isRoot) { globalDataBinds.clear(); populateDataBinds(globalDataBinds); @@ -698,14 +703,21 @@ class Artboard extends ArtboardBase with ShapePaintContainer { void sortDrawOrder() { hasChangedDrawOrderInLastUpdate = true; + // Clear out rule first/last items. - for (final rule in _sortedDrawRules) { + var length = _sortedDrawRules.length; + for (var i = 0; i < length; i++) { + // for (final rule in _sortedDrawRules) { + final rule = _sortedDrawRules[i]; rule.first = rule.last = null; } firstDrawable = null; Drawable? lastDrawable; - for (final drawable in _drawables) { + length = _drawables.length; + for (var i = 0; i < length; i++) { + // for (final drawable in _drawables) { + final drawable = _drawables[i]; var rules = drawable.flattenedDrawRules; var target = rules?.activeTarget; @@ -731,7 +743,10 @@ class Artboard extends ArtboardBase with ShapePaintContainer { } } - for (final rule in _sortedDrawRules) { + length = _sortedDrawRules.length; + for (var i = 0; i < length; i++) { + // for (final rule in _sortedDrawRules) { + final rule = _sortedDrawRules[i]; if (rule.first == null) { continue; } diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index 0acbec8d..c745c96c 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -4,6 +4,7 @@ import 'package:rive/src/rive_core/component_dirt.dart'; import 'package:rive/src/rive_core/container_component.dart'; import 'package:rive/src/rive_core/dependency_helper.dart'; import 'package:rive_common/utilities.dart'; +import 'package:stokanal/collections.dart'; export 'package:rive/src/generated/component_base.dart'; @@ -166,13 +167,13 @@ abstract class Component extends ComponentBase } /// Components that this component depends on. - final _dependsOn = {}; + final UniqueList _dependsOn = UniqueList.nonHashed(); @override - Set get dependents => _dependencyHelper.dependents; + Set get dependents => _dependencyHelper.dependents.toSet(); @nonVirtual - List get dependentsList => _dependencyHelper.dependentsList; + UniqueList get dependentsList => _dependencyHelper.dependents; Set get dependencies { var components = {}; diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index a26fb8b0..9b558fe3 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -1,9 +1,13 @@ +import 'package:stokanal/collections.dart'; + class DependencyHelper { - final dependents = {}; // set should stay ordered - final dependentsList = []; // it's a copy of the set used to iterate over + final UniqueList dependents = UniqueList.hashed(); // set should stay ordered + + // final dependents = {}; // set should stay ordered + // final dependentsList = []; // it's a copy of the set used to iterate over // Set get dependents => _dependents; @@ -22,7 +26,7 @@ class DependencyHelper { // /// STOKANAL-FORK-EDIT: use add directly if (dependents.add(value)) { - dependentsList.add(value); + // dependentsList.add(value); return true; } @@ -33,9 +37,9 @@ class DependencyHelper { /// STOKANAL-FORK-EDIT: do not use forEach - var t = dependentsList.length; + final t = dependents.length; for (var i = 0; i < t; i++) { - dependentsList[i].addDirt(dirt, recurse: recurse); + dependents[i].addDirt(dirt, recurse: recurse); // for (final dependent in _dependents) { // dependent.addDirt(dirt, recurse: recurse); } diff --git a/lib/src/rive_core/layout_component.dart b/lib/src/rive_core/layout_component.dart index a407c23d..a51cb4a5 100644 --- a/lib/src/rive_core/layout_component.dart +++ b/lib/src/rive_core/layout_component.dart @@ -554,10 +554,11 @@ class LayoutComponent extends LayoutComponentBase with ShapePaintContainer { } void syncLayoutChildren() { - final layoutChildren = children.whereType(); + final layoutChildren = children.whereType().toList(); layoutNode.clearChildren(); - for (var i = 0; i < layoutChildren.length; i++) { - layoutNode.insertChild(layoutChildren.elementAt(i).layoutNode, i); + final length = layoutChildren.length; + for (var i = 0; i < length; i++) { + layoutNode.insertChild(layoutChildren[i].layoutNode, i); } } diff --git a/lib/src/rive_core/shapes/shape_paint_container.dart b/lib/src/rive_core/shapes/shape_paint_container.dart index 709f0f95..4fd8b83d 100644 --- a/lib/src/rive_core/shapes/shape_paint_container.dart +++ b/lib/src/rive_core/shapes/shape_paint_container.dart @@ -5,13 +5,13 @@ import 'package:rive/src/rive_core/shapes/paint/fill.dart'; import 'package:rive/src/rive_core/shapes/paint/shape_paint_mutator.dart'; import 'package:rive/src/rive_core/shapes/paint/stroke.dart'; import 'package:rive_common/math.dart'; +import 'package:stokanal/collections.dart'; /// An abstraction to give a common interface to any component that can contain /// fills and strokes. abstract class ShapePaintContainer { - final fills = {}; - - final strokes = {}; + final UniqueList fills = UniqueList.nonHashed(); + final UniqueList strokes = UniqueList.nonHashed(); /// Called whenever a new paint mutator is added/removed from the shape paints /// (for example a linear gradient is added to a stroke). diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index b0370d8d..95930a34 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -565,11 +565,11 @@ class StateMachineController extends RiveAnimationController firstDrawable = firstDrawable.prev; } - int hitComponentsCount = hitComponents.length; + final hitComponentsCount = hitComponents.length; int currentSortedIndex = 0; while (firstDrawable != null) { for (var i = currentSortedIndex; i < hitComponentsCount; i++) { - if (hitComponents.elementAt(i).component == firstDrawable) { + if (hitComponents[i].component == firstDrawable) { if (currentSortedIndex != i) { hitComponents.swap(i, currentSortedIndex); } @@ -637,7 +637,7 @@ class StateMachineController extends RiveAnimationController nestedEvents.forEach((targetId, eventList) { if (listener.targetId == targetId) { - var t = eventList.length; + final t = eventList.length; for (var i = 0; i < t; i++) { if (listener.eventId == eventList[i].id) { listener.performChanges(this, Vec2D(), Vec2D()); diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index 73bef132..0490e57a 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -111,14 +111,6 @@ class RuntimeArtboard extends Artboard implements CoreContext { T? addObject(T? object) { object?.context = this; object?.id = _objects.length; - - // if (object is LinearAnimation && object.logging) { - // log('ADD LINEAR-ANIMATION > $object'); - // } - // if (object is KeyedObject && object.logging) { - // log('ADD KEYED-OBJECT > $object'); - // } - _objects.add(object); return object; } From 74c049994538827ccd00b48fd817efdfb0f759df Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sat, 15 Feb 2025 13:16:35 +0000 Subject: [PATCH 22/50] fixed UniqueList & removed KeyPropertyBase.propertyKeyChanged --- lib/src/core/core.dart | 14 +++++++------- .../generated/animation/keyed_property_base.dart | 11 ++++++----- lib/src/rive_core/animation/keyed_property.dart | 4 ++-- lib/src/rive_core/artboard.dart | 6 +++--- lib/src/rive_core/component.dart | 4 ++-- lib/src/rive_core/dependency_helper.dart | 2 +- .../rive_core/shapes/shape_paint_container.dart | 4 ++-- 7 files changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index 055fdf1c..432c9ae3 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -1,5 +1,3 @@ -import 'dart:collection'; - import 'package:flutter/foundation.dart'; import 'package:rive/src/rive_core/runtime/exceptions/rive_format_error_exception.dart'; import 'package:stokanal/collections.dart'; @@ -46,8 +44,10 @@ abstract class Core { int get coreType; int id = missingId; Set get coreTypes => {}; - bool _hasValidated = false; - bool get hasValidated => _hasValidated; + + @nonVirtual + bool hasValidated = false; + // bool get hasValidated => _hasValidated; void onAddedDirty(); void onAdded() {} @@ -74,7 +74,7 @@ abstract class Core { // ignore: avoid_classes_with_only_static_members class InternalCoreHelper { static void markValid(Core object) { - object._hasValidated = true; + object.hasValidated = true; } } @@ -94,7 +94,7 @@ abstract class CoreContext { // ignore: one_member_abstracts abstract class ImportStackObject { - final UniqueList _resolveBefore = UniqueList.hashed(); + final _resolveBefore = UniqueList(); bool _resolved = false; bool initStack(ImportStack stack) { @@ -131,7 +131,7 @@ abstract class ImportStackObject { /// Stack to help the RiveFile locate latest ImportStackObject created of a /// certain type. class ImportStack { - final _latests = HashMap(); + final _latests = {}; T? latest(int coreType) { var latest = _latests[coreType]; if (latest is T) { diff --git a/lib/src/generated/animation/keyed_property_base.dart b/lib/src/generated/animation/keyed_property_base.dart index c0837be6..44d6b3c3 100644 --- a/lib/src/generated/animation/keyed_property_base.dart +++ b/lib/src/generated/animation/keyed_property_base.dart @@ -25,18 +25,19 @@ abstract class KeyedPropertyBase extends Core { /// Change the [propertyKey_] field value. /// [propertyKeyChanged] will be invoked only if the field's value has /// changed. + @nonVirtual set propertyKey(int value) { if (propertyKey_ == value) { return; } - int from = propertyKey_; + // int from = propertyKey_; propertyKey_ = value; - if (hasValidated) { - propertyKeyChanged(from, value); - } + // if (hasValidated) { + // propertyKeyChanged(from, value); + // } } - void propertyKeyChanged(int from, int to); + // void propertyKeyChanged(int from, int to); @override void copy(Core source) { diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index a7398a24..6025c380 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -310,8 +310,8 @@ class KeyedProperty extends KeyedPropertyBase // } } - @override - void propertyKeyChanged(int from, int to) {} + // @override + // void propertyKeyChanged(int from, int to) {} @override bool import(ImportStack stack) { diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index f7340535..75204d53 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -106,7 +106,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { final List _rules = []; List _sortedDrawRules = []; - final UniqueList _components = UniqueList.nonHashed(); + final _components = UniqueList(); List get drawables => _drawables; @@ -209,7 +209,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { return didUpdate; } - final UniqueList _activeNestedArtboards = UniqueList.nonHashed(); + final _activeNestedArtboards = UniqueList(); Iterable get activeNestedArtboards => _activeNestedArtboards; final List _joysticks = []; @@ -577,7 +577,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// The animation controllers that are called back whenever the artboard /// advances. - final UniqueList _animationControllers = UniqueList.nonHashed(); + final _animationControllers = UniqueList(); /// Access a read-only iterator of currently applied animation controllers. Iterable get animationControllers => diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index c745c96c..2759eb7f 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -167,10 +167,10 @@ abstract class Component extends ComponentBase } /// Components that this component depends on. - final UniqueList _dependsOn = UniqueList.nonHashed(); + final _dependsOn = UniqueList(); @override - Set get dependents => _dependencyHelper.dependents.toSet(); + Set get dependents => _dependencyHelper.dependents; @nonVirtual UniqueList get dependentsList => _dependencyHelper.dependents; diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index 9b558fe3..f2a12578 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -4,7 +4,7 @@ import 'package:stokanal/collections.dart'; class DependencyHelper { - final UniqueList dependents = UniqueList.hashed(); // set should stay ordered + final dependents = UniqueList(); // set should stay ordered // final dependents = {}; // set should stay ordered // final dependentsList = []; // it's a copy of the set used to iterate over diff --git a/lib/src/rive_core/shapes/shape_paint_container.dart b/lib/src/rive_core/shapes/shape_paint_container.dart index 4fd8b83d..5a5f0cd9 100644 --- a/lib/src/rive_core/shapes/shape_paint_container.dart +++ b/lib/src/rive_core/shapes/shape_paint_container.dart @@ -10,8 +10,8 @@ import 'package:stokanal/collections.dart'; /// An abstraction to give a common interface to any component that can contain /// fills and strokes. abstract class ShapePaintContainer { - final UniqueList fills = UniqueList.nonHashed(); - final UniqueList strokes = UniqueList.nonHashed(); + final fills = UniqueList(); + final strokes = UniqueList(); /// Called whenever a new paint mutator is added/removed from the shape paints /// (for example a linear gradient is added to a stroke). From 718f0a3d5cc39daa17994e092563f24d665359ab Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sat, 15 Feb 2025 15:45:12 +0000 Subject: [PATCH 23/50] rive_core_context refactor (start) --- .../linear_animation_controller.dart | 4 +- .../animation/keyed_property_base.dart | 21 +- lib/src/generated/rive_core_beans.dart | 441 ++++++++++++++++++ lib/src/generated/rive_core_context.dart | 391 ---------------- .../animation/animation_reset_factory.dart | 41 +- lib/src/rive_core/animation/keyed_object.dart | 8 +- .../rive_core/animation/keyed_property.dart | 12 +- lib/src/rive_core/animation/keyframe.dart | 6 +- .../rive_core/animation/keyframe_bool.dart | 11 +- .../animation/keyframe_callback.dart | 6 +- .../rive_core/animation/keyframe_color.dart | 19 +- .../rive_core/animation/keyframe_double.dart | 12 +- lib/src/rive_core/animation/keyframe_id.dart | 10 +- .../rive_core/animation/keyframe_string.dart | 10 +- .../rive_core/animation/keyframe_uint.dart | 10 +- .../context/context_value_boolean.dart | 5 +- .../context/context_value_color.dart | 5 +- .../context/context_value_number.dart | 5 +- .../context/context_value_string.dart | 5 +- .../rive_core/state_machine_controller.dart | 6 +- lib/src/rive_file.dart | 12 +- 21 files changed, 564 insertions(+), 476 deletions(-) create mode 100644 lib/src/generated/rive_core_beans.dart diff --git a/lib/src/controllers/linear_animation_controller.dart b/lib/src/controllers/linear_animation_controller.dart index f693108a..d35095f4 100644 --- a/lib/src/controllers/linear_animation_controller.dart +++ b/lib/src/controllers/linear_animation_controller.dart @@ -1,4 +1,5 @@ import 'package:rive/src/core/core.dart'; +import 'package:rive/src/generated/rive_core_beans.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/linear_animation_instance.dart' as core; @@ -41,9 +42,8 @@ class LinearAnimationInstance extends core.LinearAnimationInstance int objectId, int propertyKey, double elapsedSeconds) { var coreObject = context?.resolve(objectId); if (coreObject != null) { - RiveCoreContext.setCallback( + PropertyBeans.get(propertyKey).setCallback( coreObject, - propertyKey, CallbackData(this, delay: elapsedSeconds), ); } diff --git a/lib/src/generated/animation/keyed_property_base.dart b/lib/src/generated/animation/keyed_property_base.dart index 44d6b3c3..1d284b73 100644 --- a/lib/src/generated/animation/keyed_property_base.dart +++ b/lib/src/generated/animation/keyed_property_base.dart @@ -4,6 +4,8 @@ import 'package:rive/src/core/core.dart'; +import '../rive_core_beans.dart'; + abstract class KeyedPropertyBase extends Core { static const int typeKey = 26; @override @@ -14,24 +16,30 @@ abstract class KeyedPropertyBase extends Core { /// -------------------------------------------------------------------------- /// PropertyKey field with key 53. static const int propertyKeyPropertyKey = 53; - static const int propertyKeyInitialValue = CoreContext.invalidPropertyKey; + // static const int propertyKeyInitialValue = CoreContext.invalidPropertyKey; /// STOKANAL-FORK-EDIT: exposing - int propertyKey_ = propertyKeyInitialValue; + // int propertyKey_ = CoreContext.invalidPropertyKey; + PropertyBean propertyBean = PropertyBeans.invalid; /// The property type that is keyed. - int get propertyKey => propertyKey_; + // int get propertyKey => propertyKey_; + int get propertyKey => propertyBean.propertyKey; /// Change the [propertyKey_] field value. /// [propertyKeyChanged] will be invoked only if the field's value has /// changed. @nonVirtual set propertyKey(int value) { - if (propertyKey_ == value) { + if (propertyKey == value) { return; } + // int from = propertyKey_; - propertyKey_ = value; + + // propertyKey_ = value; + propertyBean = PropertyBeans.get(value); + // if (hasValidated) { // propertyKeyChanged(from, value); // } @@ -43,7 +51,8 @@ abstract class KeyedPropertyBase extends Core { void copy(Core source) { super.copy(source); if (source is KeyedPropertyBase) { - propertyKey_ = source.propertyKey_; + // propertyKey_ = source.propertyKey_; + propertyBean = source.propertyBean; } } } diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart new file mode 100644 index 00000000..91609895 --- /dev/null +++ b/lib/src/generated/rive_core_beans.dart @@ -0,0 +1,441 @@ +import 'package:collection/collection.dart'; +import 'package:rive/src/core/core.dart'; +import 'package:rive/src/core/field_types/core_string_type.dart'; +import 'package:rive/src/core/field_types/core_uint_type.dart'; +import 'package:rive/src/generated/animation/advanceable_state_base.dart'; +import 'package:rive/src/generated/animation/blend_animation_base.dart'; +import 'package:rive/src/generated/animation/cubic_ease_interpolator_base.dart'; +import 'package:rive/src/generated/animation/cubic_interpolator_base.dart'; +import 'package:rive/src/generated/animation/interpolating_keyframe_base.dart'; +import 'package:rive/src/generated/animation/keyframe_base.dart'; +import 'package:rive/src/generated/animation/keyframe_string_base.dart'; +import 'package:rive/src/generated/animation/layer_state_base.dart'; +import 'package:rive/src/generated/animation/listener_input_change_base.dart'; +import 'package:rive/src/generated/animation/nested_input_base.dart'; +import 'package:rive/src/generated/animation/nested_linear_animation_base.dart'; +import 'package:rive/src/generated/animation/state_machine_component_base.dart'; +import 'package:rive/src/generated/animation/transition_input_condition_base.dart'; +import 'package:rive/src/generated/animation/transition_value_condition_base.dart'; +import 'package:rive/src/generated/assets/asset_base.dart'; +import 'package:rive/src/generated/assets/drawable_asset_base.dart'; +import 'package:rive/src/generated/assets/export_audio_base.dart'; +import 'package:rive/src/generated/assets/file_asset_base.dart'; +import 'package:rive/src/generated/component_base.dart'; +import 'package:rive/src/generated/constraints/constraint_base.dart'; +import 'package:rive/src/generated/constraints/targeted_constraint_base.dart'; +import 'package:rive/src/generated/constraints/transform_component_constraint_base.dart'; +import 'package:rive/src/generated/constraints/transform_component_constraint_y_base.dart'; +import 'package:rive/src/generated/constraints/transform_space_constraint_base.dart'; +import 'package:rive/src/generated/data_bind/converters/data_converter_base.dart'; +import 'package:rive/src/generated/drawable_base.dart'; +import 'package:rive/src/generated/nested_animation_base.dart'; +import 'package:rive/src/generated/shapes/paint/shape_paint_base.dart'; +import 'package:rive/src/generated/shapes/parametric_path_base.dart'; +import 'package:rive/src/generated/shapes/path_base.dart'; +import 'package:rive/src/generated/shapes/vertex_base.dart'; +import 'package:rive/src/generated/transform_component_base.dart'; +import 'package:rive/src/generated/viewmodel/viewmodel_instance_value_base.dart'; +import 'package:rive/src/generated/world_transform_component_base.dart'; +import 'package:rive/src/rive_core/animation/animation.dart'; +import 'package:rive/src/rive_core/animation/animation_state.dart'; +import 'package:rive/src/rive_core/animation/any_state.dart'; +import 'package:rive/src/rive_core/animation/blend_animation_1d.dart'; +import 'package:rive/src/rive_core/animation/blend_animation_direct.dart'; +import 'package:rive/src/rive_core/animation/blend_state_1d.dart'; +import 'package:rive/src/rive_core/animation/blend_state_direct.dart'; +import 'package:rive/src/rive_core/animation/blend_state_transition.dart'; +import 'package:rive/src/rive_core/animation/cubic_ease_interpolator.dart'; +import 'package:rive/src/rive_core/animation/cubic_interpolator_component.dart'; +import 'package:rive/src/rive_core/animation/cubic_value_interpolator.dart'; +import 'package:rive/src/rive_core/animation/elastic_interpolator.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/keyed_object.dart'; +import 'package:rive/src/rive_core/animation/keyed_property.dart'; +import 'package:rive/src/rive_core/animation/keyframe_bool.dart'; +import 'package:rive/src/rive_core/animation/keyframe_callback.dart'; +import 'package:rive/src/rive_core/animation/keyframe_color.dart'; +import 'package:rive/src/rive_core/animation/keyframe_double.dart'; +import 'package:rive/src/rive_core/animation/keyframe_id.dart'; +import 'package:rive/src/rive_core/animation/keyframe_string.dart'; +import 'package:rive/src/rive_core/animation/keyframe_uint.dart'; +import 'package:rive/src/rive_core/animation/linear_animation.dart'; +import 'package:rive/src/rive_core/animation/listener_align_target.dart'; +import 'package:rive/src/rive_core/animation/listener_bool_change.dart'; +import 'package:rive/src/rive_core/animation/listener_fire_event.dart'; +import 'package:rive/src/rive_core/animation/listener_number_change.dart'; +import 'package:rive/src/rive_core/animation/listener_trigger_change.dart'; +import 'package:rive/src/rive_core/animation/listener_viewmodel_change.dart'; +import 'package:rive/src/rive_core/animation/nested_bool.dart'; +import 'package:rive/src/rive_core/animation/nested_number.dart'; +import 'package:rive/src/rive_core/animation/nested_remap_animation.dart'; +import 'package:rive/src/rive_core/animation/nested_simple_animation.dart'; +import 'package:rive/src/rive_core/animation/nested_state_machine.dart'; +import 'package:rive/src/rive_core/animation/nested_trigger.dart'; +import 'package:rive/src/rive_core/animation/state_machine.dart'; +import 'package:rive/src/rive_core/animation/state_machine_bool.dart'; +import 'package:rive/src/rive_core/animation/state_machine_fire_event.dart'; +import 'package:rive/src/rive_core/animation/state_machine_layer.dart'; +import 'package:rive/src/rive_core/animation/state_machine_listener.dart'; +import 'package:rive/src/rive_core/animation/state_machine_number.dart'; +import 'package:rive/src/rive_core/animation/state_machine_trigger.dart'; +import 'package:rive/src/rive_core/animation/state_transition.dart'; +import 'package:rive/src/rive_core/animation/transition_bool_condition.dart'; +import 'package:rive/src/rive_core/animation/transition_number_condition.dart'; +import 'package:rive/src/rive_core/animation/transition_property_viewmodel_comparator.dart'; +import 'package:rive/src/rive_core/animation/transition_trigger_condition.dart'; +import 'package:rive/src/rive_core/animation/transition_value_boolean_comparator.dart'; +import 'package:rive/src/rive_core/animation/transition_value_color_comparator.dart'; +import 'package:rive/src/rive_core/animation/transition_value_enum_comparator.dart'; +import 'package:rive/src/rive_core/animation/transition_value_number_comparator.dart'; +import 'package:rive/src/rive_core/animation/transition_value_string_comparator.dart'; +import 'package:rive/src/rive_core/animation/transition_viewmodel_condition.dart'; +import 'package:rive/src/rive_core/artboard.dart'; +import 'package:rive/src/rive_core/assets/audio_asset.dart'; +import 'package:rive/src/rive_core/assets/file_asset_contents.dart'; +import 'package:rive/src/rive_core/assets/folder.dart'; +import 'package:rive/src/rive_core/assets/font_asset.dart'; +import 'package:rive/src/rive_core/assets/image_asset.dart'; +import 'package:rive/src/rive_core/audio_event.dart'; +import 'package:rive/src/rive_core/backboard.dart'; +import 'package:rive/src/rive_core/bones/bone.dart'; +import 'package:rive/src/rive_core/bones/cubic_weight.dart'; +import 'package:rive/src/rive_core/bones/root_bone.dart'; +import 'package:rive/src/rive_core/bones/skin.dart'; +import 'package:rive/src/rive_core/bones/tendon.dart'; +import 'package:rive/src/rive_core/bones/weight.dart'; +import 'package:rive/src/rive_core/constraints/distance_constraint.dart'; +import 'package:rive/src/rive_core/constraints/follow_path_constraint.dart'; +import 'package:rive/src/rive_core/constraints/ik_constraint.dart'; +import 'package:rive/src/rive_core/constraints/rotation_constraint.dart'; +import 'package:rive/src/rive_core/constraints/scale_constraint.dart'; +import 'package:rive/src/rive_core/constraints/transform_constraint.dart'; +import 'package:rive/src/rive_core/constraints/translation_constraint.dart'; +import 'package:rive/src/rive_core/custom_property_boolean.dart'; +import 'package:rive/src/rive_core/custom_property_number.dart'; +import 'package:rive/src/rive_core/custom_property_string.dart'; +import 'package:rive/src/rive_core/data_bind/bindable_property_boolean.dart'; +import 'package:rive/src/rive_core/data_bind/bindable_property_color.dart'; +import 'package:rive/src/rive_core/data_bind/bindable_property_enum.dart'; +import 'package:rive/src/rive_core/data_bind/bindable_property_number.dart'; +import 'package:rive/src/rive_core/data_bind/bindable_property_string.dart'; +import 'package:rive/src/rive_core/data_bind/data_bind.dart'; +import 'package:rive/src/rive_core/data_bind/data_bind_context.dart'; +import 'package:rive/src/rive_core/draw_rules.dart'; +import 'package:rive/src/rive_core/draw_target.dart'; +import 'package:rive/src/rive_core/event.dart'; +import 'package:rive/src/rive_core/joystick.dart'; +import 'package:rive/src/rive_core/layout/layout_component_style.dart'; +import 'package:rive/src/rive_core/layout_component.dart'; +import 'package:rive/src/rive_core/nested_artboard.dart'; +import 'package:rive/src/rive_core/node.dart'; +import 'package:rive/src/rive_core/open_url_event.dart'; +import 'package:rive/src/rive_core/shapes/clipping_shape.dart'; +import 'package:rive/src/rive_core/shapes/contour_mesh_vertex.dart'; +import 'package:rive/src/rive_core/shapes/cubic_asymmetric_vertex.dart'; +import 'package:rive/src/rive_core/shapes/cubic_detached_vertex.dart'; +import 'package:rive/src/rive_core/shapes/cubic_mirrored_vertex.dart'; +import 'package:rive/src/rive_core/shapes/ellipse.dart'; +import 'package:rive/src/rive_core/shapes/image.dart'; +import 'package:rive/src/rive_core/shapes/mesh.dart'; +import 'package:rive/src/rive_core/shapes/mesh_vertex.dart'; +import 'package:rive/src/rive_core/shapes/paint/fill.dart'; +import 'package:rive/src/rive_core/shapes/paint/gradient_stop.dart'; +import 'package:rive/src/rive_core/shapes/paint/linear_gradient.dart'; +import 'package:rive/src/rive_core/shapes/paint/radial_gradient.dart'; +import 'package:rive/src/rive_core/shapes/paint/solid_color.dart'; +import 'package:rive/src/rive_core/shapes/paint/stroke.dart'; +import 'package:rive/src/rive_core/shapes/paint/trim_path.dart'; +import 'package:rive/src/rive_core/shapes/points_path.dart'; +import 'package:rive/src/rive_core/shapes/polygon.dart'; +import 'package:rive/src/rive_core/shapes/rectangle.dart'; +import 'package:rive/src/rive_core/shapes/shape.dart'; +import 'package:rive/src/rive_core/shapes/star.dart'; +import 'package:rive/src/rive_core/shapes/straight_vertex.dart'; +import 'package:rive/src/rive_core/shapes/triangle.dart'; +import 'package:rive/src/rive_core/solo.dart'; +import 'package:rive/src/rive_core/text/text.dart'; +import 'package:rive/src/rive_core/text/text_modifier_group.dart'; +import 'package:rive/src/rive_core/text/text_modifier_range.dart'; +import 'package:rive/src/rive_core/text/text_style.dart'; +import 'package:rive/src/rive_core/text/text_style_axis.dart'; +import 'package:rive/src/rive_core/text/text_style_feature.dart'; +import 'package:rive/src/rive_core/text/text_value_run.dart'; +import 'package:rive/src/rive_core/text/text_variation_modifier.dart'; +import 'package:rive/src/rive_core/viewmodel/data_enum.dart'; +import 'package:rive/src/rive_core/viewmodel/data_enum_value.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_component.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_boolean.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_color.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_enum.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_list.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_list_item.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_number.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_string.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_viewmodel.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_property.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_property_boolean.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_property_color.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_property_enum.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_property_list.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_property_number.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_property_string.dart'; +import 'package:rive/src/rive_core/viewmodel/viewmodel_property_viewmodel.dart'; +import 'package:stokanal/logging.dart'; +import '../core/field_types/core_field_type.dart'; + +class PropertyBean { + final int propertyKey; + PropertyBean._(this.propertyKey); + + bool getBool(Core o) => throw Exception(); + void setBool(Core o, bool v) => throw Exception(); + + double getDouble(Core o) => throw Exception(); + void setDouble(Core o, double v) => throw Exception(); + + @nonVirtual + void transformDouble(Core o, double Function(double) function) { + setDouble(o, function(getDouble(o))); + } + + int getColor(Core o) => throw Exception(); + void setColor(Core o, int v) => throw Exception(); + + int getUint(Core o) => throw Exception(); + void setUint(Core o, int v) => throw Exception(); + + String getString(Core o) => throw Exception(); + void setString(Core o, String v) => throw Exception(); + + void setObjectProperty(Core o, Object v) => throw Exception(); + + CoreFieldType? get coreType => throw Exception(); + + void setCallback(Core o, CallbackData v) => throw Exception(); +} + +class DoublePropertyBean extends PropertyBean { + + final double Function(T) getter; + final void Function(T, double) setter; + DoublePropertyBean._(super.propertyKey, this.getter, this.setter): super._(); + + @override + double getDouble(Core o) => getter(o as T); + + @override + void setDouble(Core o, double v) => setter(o as T, v); + + @override + void setObjectProperty(Core o, Object v) => o is T && v is double ? setDouble(o, v) : {}; + + @override + CoreFieldType? get coreType => RiveCoreContext.doubleType; +} + +class UintPropertyBean extends PropertyBean { + + final int Function(T) getter; + final void Function(T, int) setter; + UintPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); + + @override + int getUint(Core o) => getter(o as T); + + @override + void setUint(Core o, int v) => setter(o as T, v); + + @override + void setObjectProperty(Core o, Object v) => o is T && v is int ? setUint(o, v) : {}; + + @override + CoreFieldType? get coreType => RiveCoreContext.uintType; +} + +class ColorPropertyBean extends PropertyBean { + + final int Function(T) getter; + final void Function(T, int) setter; + ColorPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); + + @override + int getColor(Core o) => getter(o as T); + + @override + void setColor(Core o, int v) => setter(o as T, v); + + @override + void setObjectProperty(Core o, Object v) => o is T && v is int ? setColor(o, v) : {}; + + @override + CoreFieldType? get coreType => RiveCoreContext.colorType; +} + +class StringPropertyBean extends PropertyBean { + + final String Function(T) getter; + final void Function(T, String) setter; + StringPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); + + @override + String getString(Core o) => getter(o as T); + + @override + void setString(Core o, String v) => setter(o as T, v); + + @override + void setObjectProperty(Core o, Object v) => o is T && v is String ? setString(o, v) : {}; + + @override + CoreFieldType? get coreType => RiveCoreContext.stringType; +} + +class FallbackBean extends PropertyBean { + + FallbackBean._(super.propertyKey): + super._(); + + int hits = 0; + bool dumped = false; + + @override + bool getBool(Core o) { + hits++; + return RiveCoreContext.getBool(o, propertyKey); + } + @override + void setBool(Core o, bool v) { + hits++; + RiveCoreContext.setBool(o, propertyKey, v); + } + + @override + double getDouble(Core o) { + hits++; + return RiveCoreContext.getDouble(o, propertyKey); + } + @override + void setDouble(Core o, double v) { + hits++; + RiveCoreContext.setDouble(o, propertyKey, v); + + if (hits >= 10000 && !dumped) { + dumped = true; + PropertyBeans._dumpFallbacks(); + } + } + + @override + int getColor(Core o) { + hits++; + return RiveCoreContext.getColor(o, propertyKey); + } + @override + void setColor(Core o, int v) { + hits++; + RiveCoreContext.setColor(o, propertyKey, v); + } + + @override + int getUint(Core o) { + hits++; + return RiveCoreContext.getUint(o, propertyKey); + } + @override + void setUint(Core o, int v) { + hits++; + RiveCoreContext.setUint(o, propertyKey, v); + } + + @override + String getString(Core o) { + hits++; + return RiveCoreContext.getString(o, propertyKey); + } + @override + void setString(Core o, String v) { + hits++; + RiveCoreContext.setString(o, propertyKey, v); + } + + @override + void setObjectProperty(Core o, Object v) { + hits++; + RiveCoreContext.setObjectProperty(o, propertyKey, v); + } + + @override + CoreFieldType? get coreType { + hits++; + return RiveCoreContext.coreType(propertyKey); + } + + @override + void setCallback(Core o, CallbackData v) { + hits++; + RiveCoreContext.setCallback(o, propertyKey, v); + } + + @override + String toString() => 'FallbackBean[$propertyKey, $hits]'; +} + +final _map = {}; +final _invalid = PropertyBean._(CoreContext.invalidPropertyKey); +var _first = true; +final _implements = [ + _invalid, + DoublePropertyBean._(NodeBase.xPropertyKey, (o) => o.x, (o, v) => o.x = v), + DoublePropertyBean._(NodeBase.yPropertyKey, (o) => o.y, (o, v) => o.y = v), + DoublePropertyBean._(VertexBase.xPropertyKey, (o) => o.x, (o, v) => o.x = v), + DoublePropertyBean._(VertexBase.yPropertyKey, (o) => o.y, (o, v) => o.y = v), + DoublePropertyBean._(CubicDetachedVertexBase.outRotationPropertyKey, (o) => o.outRotation, (o, v) => o.outRotation = v), + DoublePropertyBean._(CubicDetachedVertexBase.outDistancePropertyKey, (o) => o.outDistance, (o, v) => o.outDistance = v), + DoublePropertyBean._(CubicDetachedVertexBase.inRotationPropertyKey, (o) => o.inRotation, (o, v) => o.inRotation = v), + DoublePropertyBean._(CubicDetachedVertexBase.inDistancePropertyKey, (o) => o.inDistance, (o, v) => o.inDistance = v), + DoublePropertyBean._(CubicAsymmetricVertexBase.inDistancePropertyKey, (o) => o.inDistance, (o, v) => o.inDistance = v), + DoublePropertyBean._(CubicAsymmetricVertexBase.rotationPropertyKey, (o) => o.rotation, (o, v) => o.rotation = v), + DoublePropertyBean._(TransformComponentBase.scaleXPropertyKey, (o) => o.scaleX, (o, v) => o.scaleX = v), + DoublePropertyBean._(TransformComponentBase.scaleYPropertyKey, (o) => o.scaleY, (o, v) => o.scaleY = v), + DoublePropertyBean._(TransformComponentBase.rotationPropertyKey, (o) => o.rotation, (o, v) => o.rotation = v), + DoublePropertyBean._(KeyFrameDoubleBase.valuePropertyKey, (o) => o.value_, (o, v) => o.value_ = v), + DoublePropertyBean._(WorldTransformComponentBase.opacityPropertyKey, (o) => o.opacity, (o, v) => o.opacity = v), + UintPropertyBean._(InterpolatingKeyFrameBase.interpolatorIdPropertyKey, (o) => o.interpolatorId, (o, v) => o.interpolatorId = v), + UintPropertyBean._(KeyedPropertyBase.propertyKeyPropertyKey, (o) => o.propertyKey, (o, v) => o.propertyKey = v), + UintPropertyBean._(KeyFrameBase.framePropertyKey, (o) => o.frame, (o, v) => o.frame = v), + DoublePropertyBean._(CubicMirroredVertexBase.rotationPropertyKey, (o) => o.rotation, (o, v) => o.rotation = v), + UintPropertyBean._(InterpolatingKeyFrameBase.interpolationTypePropertyKey, (o) => o.interpolationType, (o, v) => o.interpolationType = v), + UintPropertyBean._(SoloBase.activeComponentIdPropertyKey, (o) => o.activeComponentId, (o, v) => o.activeComponentId = v), + DoublePropertyBean._(CubicAsymmetricVertexBase.outDistancePropertyKey, (o) => o.outDistance, (o, v) => o.outDistance = v), + UintPropertyBean._(KeyedObjectBase.objectIdPropertyKey, (o) => o.objectId, (o, v) => o.objectId = v), + DoublePropertyBean._(StraightVertexBase.radiusPropertyKey, (o) => o.radius, (o, v) => o.radius = v), + UintPropertyBean._(DrawRulesBase.drawTargetIdPropertyKey, (o) => o.drawTargetId, (o, v) => o.drawTargetId = v), + UintPropertyBean._(ComponentBase.parentIdPropertyKey, (o) => o.parentId, (o, v) => o.parentId = v), + ColorPropertyBean._(SolidColorBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), + StringPropertyBean._(ComponentBase.namePropertyKey, (o) => o.name, (o, v) => o.name = v), + DoublePropertyBean._(StrokeBase.thicknessPropertyKey, (o) => o.thickness, (o, v) => o.thickness = v), +]; + + +// ignore: avoid_classes_with_only_static_members +abstract class PropertyBeans { + + static PropertyBean get invalid => _invalid; + + static PropertyBean get(int propertyKey) { + + if (_first) { + _first = false; + _implements.forEach((bean) => _map[bean.propertyKey] = bean); + } + + return _map.putIfAbsent(propertyKey, () => FallbackBean._(propertyKey)); + } + + static void _dumpFallbacks() { + info(_map.values.whereType().sorted((b1, b2) => b2.hits.compareTo(b1.hits)).map((b) => '$b').join('\n')); + } +} \ No newline at end of file diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index ab6b1c6d..85dfa078 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -10,8 +10,6 @@ import 'package:rive/src/generated/animation/advanceable_state_base.dart'; import 'package:rive/src/generated/animation/blend_animation_base.dart'; import 'package:rive/src/generated/animation/cubic_ease_interpolator_base.dart'; import 'package:rive/src/generated/animation/cubic_interpolator_base.dart'; -import 'package:rive/src/generated/animation/interpolating_keyframe_base.dart'; -import 'package:rive/src/generated/animation/keyframe_base.dart'; import 'package:rive/src/generated/animation/keyframe_string_base.dart'; import 'package:rive/src/generated/animation/layer_state_base.dart'; import 'package:rive/src/generated/animation/listener_input_change_base.dart'; @@ -24,7 +22,6 @@ import 'package:rive/src/generated/assets/asset_base.dart'; import 'package:rive/src/generated/assets/drawable_asset_base.dart'; import 'package:rive/src/generated/assets/export_audio_base.dart'; import 'package:rive/src/generated/assets/file_asset_base.dart'; -import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/constraints/constraint_base.dart'; import 'package:rive/src/generated/constraints/targeted_constraint_base.dart'; import 'package:rive/src/generated/constraints/transform_component_constraint_base.dart'; @@ -36,10 +33,7 @@ import 'package:rive/src/generated/nested_animation_base.dart'; import 'package:rive/src/generated/shapes/paint/shape_paint_base.dart'; import 'package:rive/src/generated/shapes/parametric_path_base.dart'; import 'package:rive/src/generated/shapes/path_base.dart'; -import 'package:rive/src/generated/shapes/vertex_base.dart'; -import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/generated/viewmodel/viewmodel_instance_value_base.dart'; -import 'package:rive/src/generated/world_transform_component_base.dart'; import 'package:rive/src/rive_core/animation/animation.dart'; import 'package:rive/src/rive_core/animation/animation_state.dart'; import 'package:rive/src/rive_core/animation/any_state.dart'; @@ -493,44 +487,11 @@ class RiveCoreContext { static void setObjectProperty(Core object, int propertyKey, Object value) { switch (propertyKey) { - case InterpolatingKeyFrameBase.interpolationTypePropertyKey: - (object as InterpolatingKeyFrameBase).interpolationType = value as int; - return; - - case KeyFrameDoubleBase.valuePropertyKey: - (object as KeyFrameDoubleBase).value =value as double; - return; - - case KeyedPropertyBase.propertyKeyPropertyKey: - (object as KeyedPropertyBase).propertyKey = value as int; - return; - - case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: - (object as InterpolatingKeyFrameBase).interpolatorId = value as int; - return; - - case KeyFrameBase.framePropertyKey: - (object as KeyFrameBase).frame = value as int; - return; - - case KeyedObjectBase.objectIdPropertyKey: - (object as KeyedObjectBase).objectId = value as int; - return; - - case ComponentBase.parentIdPropertyKey: - (object as ComponentBase).parentId = value as int; - return; - case LayoutComponentStyleBase.interpolatorIdPropertyKey: (object as LayoutComponentStyleBase).interpolatorId = value as int; return; } - // _counter.putIfAbsent(propertyKey, IntCapsule.new).increment(); - // if (Randoms().hit(0.001)) { - // info('setObjectProperty > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); - // } - switch (propertyKey) { case ViewModelInstanceListItemBase.useLinkedArtboardPropertyKey: if (object is ViewModelInstanceListItemBase && value is bool) { @@ -587,11 +548,6 @@ class RiveCoreContext { object.viewModelReferenceId = value; } break; - case ComponentBase.namePropertyKey: - if (object is ComponentBase && value is String) { - object.name = value; - } - break; case ViewModelInstanceBase.viewModelIdPropertyKey: if (object is ViewModelInstanceBase && value is int) { object.viewModelId = value; @@ -777,36 +733,6 @@ class RiveCoreContext { object.originY = value; } break; - case WorldTransformComponentBase.opacityPropertyKey: - if (object is WorldTransformComponentBase && value is double) { - object.opacity = value; - } - break; - case TransformComponentBase.rotationPropertyKey: - if (object is TransformComponentBase && value is double) { - object.rotation = value; - } - break; - case TransformComponentBase.scaleXPropertyKey: - if (object is TransformComponentBase && value is double) { - object.scaleX = value; - } - break; - case TransformComponentBase.scaleYPropertyKey: - if (object is TransformComponentBase && value is double) { - object.scaleY = value; - } - break; - case NodeBase.xPropertyKey: - if (object is NodeBase && value is double) { - object.x = value; - } - break; - case NodeBase.yPropertyKey: - if (object is NodeBase && value is double) { - object.y = value; - } - break; case DrawableBase.blendModeValuePropertyKey: if (object is DrawableBase && value is int) { object.blendModeValue = value; @@ -842,11 +768,6 @@ class RiveCoreContext { object.animationId = value; } break; - case SoloBase.activeComponentIdPropertyKey: - if (object is SoloBase && value is int) { - object.activeComponentId = value; - } - break; case LayoutComponentStyleBase.gapHorizontalPropertyKey: if (object is LayoutComponentStyleBase && value is double) { object.gapHorizontal = value; @@ -1587,11 +1508,6 @@ class RiveCoreContext { object.opacity = value; } break; - case StrokeBase.thicknessPropertyKey: - if (object is StrokeBase && value is double) { - object.thickness = value; - } - break; case StrokeBase.capPropertyKey: if (object is StrokeBase && value is int) { object.cap = value; @@ -1607,11 +1523,6 @@ class RiveCoreContext { object.transformAffectsStroke = value; } break; - case SolidColorBase.colorValuePropertyKey: - if (object is SolidColorBase && value is int) { - object.colorValue = value; - } - break; case GradientStopBase.colorValuePropertyKey: if (object is GradientStopBase && value is int) { object.colorValue = value; @@ -1647,16 +1558,6 @@ class RiveCoreContext { object.fillRule = value; } break; - case VertexBase.xPropertyKey: - if (object is VertexBase && value is double) { - object.x = value; - } - break; - case VertexBase.yPropertyKey: - if (object is VertexBase && value is double) { - object.y = value; - } - break; case MeshVertexBase.uPropertyKey: if (object is MeshVertexBase && value is double) { object.u = value; @@ -1682,11 +1583,6 @@ class RiveCoreContext { object.indices = value; } break; - case StraightVertexBase.radiusPropertyKey: - if (object is StraightVertexBase && value is double) { - object.radius = value; - } - break; case CubicWeightBase.inValuesPropertyKey: if (object is CubicWeightBase && value is int) { object.inValues = value; @@ -1707,21 +1603,6 @@ class RiveCoreContext { object.outIndices = value; } break; - case CubicAsymmetricVertexBase.rotationPropertyKey: - if (object is CubicAsymmetricVertexBase && value is double) { - object.rotation = value; - } - break; - case CubicAsymmetricVertexBase.inDistancePropertyKey: - if (object is CubicAsymmetricVertexBase && value is double) { - object.inDistance = value; - } - break; - case CubicAsymmetricVertexBase.outDistancePropertyKey: - if (object is CubicAsymmetricVertexBase && value is double) { - object.outDistance = value; - } - break; case MeshBase.triangleIndexBytesPropertyKey: if (object is MeshBase && value is Uint8List) { object.triangleIndexBytes = value; @@ -1777,11 +1658,6 @@ class RiveCoreContext { object.cornerRadiusBR = value; } break; - case CubicMirroredVertexBase.rotationPropertyKey: - if (object is CubicMirroredVertexBase && value is double) { - object.rotation = value; - } - break; case CubicMirroredVertexBase.distancePropertyKey: if (object is CubicMirroredVertexBase && value is double) { object.distance = value; @@ -1832,31 +1708,6 @@ class RiveCoreContext { object.originY = value; } break; - case CubicDetachedVertexBase.inRotationPropertyKey: - if (object is CubicDetachedVertexBase && value is double) { - object.inRotation = value; - } - break; - case CubicDetachedVertexBase.inDistancePropertyKey: - if (object is CubicDetachedVertexBase && value is double) { - object.inDistance = value; - } - break; - case CubicDetachedVertexBase.outRotationPropertyKey: - if (object is CubicDetachedVertexBase && value is double) { - object.outRotation = value; - } - break; - case CubicDetachedVertexBase.outDistancePropertyKey: - if (object is CubicDetachedVertexBase && value is double) { - object.outDistance = value; - } - break; - case DrawRulesBase.drawTargetIdPropertyKey: - if (object is DrawRulesBase && value is int) { - object.drawTargetId = value; - } - break; case CustomPropertyBooleanBase.propertyValuePropertyKey: if (object is CustomPropertyBooleanBase && value is bool) { object.propertyValue = value; @@ -2396,27 +2247,6 @@ class RiveCoreContext { /// STOKANAL-FORK-EDIT static CoreFieldType? coreType(int propertyKey) { - switch (propertyKey) { - - case InterpolatingKeyFrameBase.interpolationTypePropertyKey: - case KeyedPropertyBase.propertyKeyPropertyKey: - case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: - case KeyFrameBase.framePropertyKey: - case KeyedObjectBase.objectIdPropertyKey: - case ComponentBase.parentIdPropertyKey: - return uintType; - - case KeyFrameDoubleBase.valuePropertyKey: - case NodeBase.xPropertyKey: - case NodeBase.yPropertyKey: - return doubleType; - } - - // _counter.putIfAbsent(propertyKey, IntCapsule.new).increment(); - // if (Randoms().hit(0.001)) { - // info('coreType > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); - // } - switch (propertyKey) { case ViewModelInstanceListItemBase.useLinkedArtboardPropertyKey: @@ -2475,7 +2305,6 @@ class RiveCoreContext { case NestedArtboardBase.fitPropertyKey: case NestedArtboardBase.alignmentPropertyKey: case NestedAnimationBase.animationIdPropertyKey: - case SoloBase.activeComponentIdPropertyKey: case LayoutComponentStyleBase.scaleTypePropertyKey: case LayoutComponentStyleBase.layoutAlignmentTypePropertyKey: case LayoutComponentStyleBase.animationStyleTypePropertyKey: @@ -2568,7 +2397,6 @@ class RiveCoreContext { case ClippingShapeBase.fillRulePropertyKey: case PolygonBase.pointsPropertyKey: case ImageBase.assetIdPropertyKey: - case DrawRulesBase.drawTargetIdPropertyKey: case LayoutComponentBase.styleIdPropertyKey: case ArtboardBase.defaultStateMachineIdPropertyKey: case ArtboardBase.viewModelIdPropertyKey: @@ -2606,13 +2434,11 @@ class RiveCoreContext { case ViewModelInstanceColorBase.propertyValuePropertyKey: case KeyFrameColorBase.valuePropertyKey: case TransitionValueColorComparatorBase.valuePropertyKey: - case SolidColorBase.colorValuePropertyKey: case GradientStopBase.colorValuePropertyKey: case BindablePropertyColorBase.propertyValuePropertyKey: return colorType; case ViewModelComponentBase.namePropertyKey: case ViewModelInstanceStringBase.propertyValuePropertyKey: - case ComponentBase.namePropertyKey: case DataEnumValueBase.keyPropertyKey: case DataEnumValueBase.valuePropertyKey: case AnimationBase.namePropertyKey: @@ -2640,10 +2466,6 @@ class RiveCoreContext { case FollowPathConstraintBase.distancePropertyKey: case TransformConstraintBase.originXPropertyKey: case TransformConstraintBase.originYPropertyKey: - case WorldTransformComponentBase.opacityPropertyKey: - case TransformComponentBase.rotationPropertyKey: - case TransformComponentBase.scaleXPropertyKey: - case TransformComponentBase.scaleYPropertyKey: case LayoutComponentStyleBase.gapHorizontalPropertyKey: case LayoutComponentStyleBase.gapVerticalPropertyKey: case LayoutComponentStyleBase.maxWidthPropertyKey: @@ -2699,19 +2521,12 @@ class RiveCoreContext { case LinearGradientBase.endXPropertyKey: case LinearGradientBase.endYPropertyKey: case LinearGradientBase.opacityPropertyKey: - case StrokeBase.thicknessPropertyKey: case GradientStopBase.positionPropertyKey: case TrimPathBase.startPropertyKey: case TrimPathBase.endPropertyKey: case TrimPathBase.offsetPropertyKey: - case VertexBase.xPropertyKey: - case VertexBase.yPropertyKey: case MeshVertexBase.uPropertyKey: case MeshVertexBase.vPropertyKey: - case StraightVertexBase.radiusPropertyKey: - case CubicAsymmetricVertexBase.rotationPropertyKey: - case CubicAsymmetricVertexBase.inDistancePropertyKey: - case CubicAsymmetricVertexBase.outDistancePropertyKey: case ParametricPathBase.widthPropertyKey: case ParametricPathBase.heightPropertyKey: case ParametricPathBase.originXPropertyKey: @@ -2720,16 +2535,11 @@ class RiveCoreContext { case RectangleBase.cornerRadiusTRPropertyKey: case RectangleBase.cornerRadiusBLPropertyKey: case RectangleBase.cornerRadiusBRPropertyKey: - case CubicMirroredVertexBase.rotationPropertyKey: case CubicMirroredVertexBase.distancePropertyKey: case PolygonBase.cornerRadiusPropertyKey: case StarBase.innerRadiusPropertyKey: case ImageBase.originXPropertyKey: case ImageBase.originYPropertyKey: - case CubicDetachedVertexBase.inRotationPropertyKey: - case CubicDetachedVertexBase.inDistancePropertyKey: - case CubicDetachedVertexBase.outRotationPropertyKey: - case CubicDetachedVertexBase.outDistancePropertyKey: case LayoutComponentBase.widthPropertyKey: case LayoutComponentBase.heightPropertyKey: case ArtboardBase.xPropertyKey: @@ -2802,16 +2612,6 @@ class RiveCoreContext { } } - // static bool isCallback(int propertyKey) { - // switch (propertyKey) { - // case NestedTriggerBase.firePropertyKey: - // case EventBase.triggerPropertyKey: - // return true; - // default: - // return false; - // } - // } - static bool getBool(Core object, int propertyKey) { switch (propertyKey) { case ViewModelInstanceListItemBase.useLinkedArtboardPropertyKey: @@ -2897,8 +2697,6 @@ class RiveCoreContext { return (object as ViewModelBase).defaultInstanceId; case ViewModelPropertyViewModelBase.viewModelReferenceIdPropertyKey: return (object as ViewModelPropertyViewModelBase).viewModelReferenceId; - case ComponentBase.parentIdPropertyKey: - return (object as ComponentBase).parentId; case ViewModelInstanceBase.viewModelIdPropertyKey: return (object as ViewModelInstanceBase).viewModelId; case ViewModelPropertyEnumBase.enumIdPropertyKey: @@ -2933,8 +2731,6 @@ class RiveCoreContext { return (object as NestedArtboardBase).alignment; case NestedAnimationBase.animationIdPropertyKey: return (object as NestedAnimationBase).animationId; - case SoloBase.activeComponentIdPropertyKey: - return (object as SoloBase).activeComponentId; case LayoutComponentStyleBase.scaleTypePropertyKey: return (object as LayoutComponentStyleBase).scaleType; case LayoutComponentStyleBase.layoutAlignmentTypePropertyKey: @@ -3017,12 +2813,6 @@ class RiveCoreContext { return (object as ListenerFireEventBase).eventId; case LayerStateBase.flagsPropertyKey: return (object as LayerStateBase).flags; - case KeyFrameBase.framePropertyKey: - return (object as KeyFrameBase).frame; - case InterpolatingKeyFrameBase.interpolationTypePropertyKey: - return (object as InterpolatingKeyFrameBase).interpolationType; - case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: - return (object as InterpolatingKeyFrameBase).interpolatorId; case KeyFrameUintBase.valuePropertyKey: return (object as KeyFrameUintBase).value; case LinearAnimationBase.fpsPropertyKey: @@ -3043,8 +2833,6 @@ class RiveCoreContext { return (object as AnimationStateBase).animationId; case NestedInputBase.inputIdPropertyKey: return (object as NestedInputBase).inputId; - case KeyedObjectBase.objectIdPropertyKey: - return (object as KeyedObjectBase).objectId; case BlendAnimationBase.animationIdPropertyKey: return (object as BlendAnimationBase).animationId; case BlendAnimationDirectBase.inputIdPropertyKey: @@ -3053,8 +2841,6 @@ class RiveCoreContext { return (object as BlendAnimationDirectBase).blendSource; case TransitionInputConditionBase.inputIdPropertyKey: return (object as TransitionInputConditionBase).inputId; - case KeyedPropertyBase.propertyKeyPropertyKey: - return (object as KeyedPropertyBase).propertyKey_; case StateMachineListenerBase.targetIdPropertyKey: return (object as StateMachineListenerBase).targetId; case StateMachineListenerBase.listenerTypeValuePropertyKey: @@ -3131,8 +2917,6 @@ class RiveCoreContext { return (object as PolygonBase).points; case ImageBase.assetIdPropertyKey: return (object as ImageBase).assetId; - case DrawRulesBase.drawTargetIdPropertyKey: - return (object as DrawRulesBase).drawTargetId; case LayoutComponentBase.styleIdPropertyKey: return (object as LayoutComponentBase).styleId; case ArtboardBase.defaultStateMachineIdPropertyKey: @@ -3210,8 +2994,6 @@ class RiveCoreContext { return (object as KeyFrameColorBase).value; case TransitionValueColorComparatorBase.valuePropertyKey: return (object as TransitionValueColorComparatorBase).value; - case SolidColorBase.colorValuePropertyKey: - return (object as SolidColorBase).colorValue; case GradientStopBase.colorValuePropertyKey: return (object as GradientStopBase).colorValue; case BindablePropertyColorBase.propertyValuePropertyKey: @@ -3227,8 +3009,6 @@ class RiveCoreContext { return (object as ViewModelComponentBase).name; case ViewModelInstanceStringBase.propertyValuePropertyKey: return (object as ViewModelInstanceStringBase).propertyValue; - case ComponentBase.namePropertyKey: - return (object as ComponentBase).name; case DataEnumValueBase.keyPropertyKey: return (object as DataEnumValueBase).key; case DataEnumValueBase.valuePropertyKey: @@ -3263,10 +3043,6 @@ class RiveCoreContext { static double getDouble(Core object, int propertyKey) { switch (propertyKey) { - case NodeBase.xPropertyKey: - return (object as NodeBase).x; - case NodeBase.yPropertyKey: - return (object as NodeBase).y; case ViewModelInstanceNumberBase.propertyValuePropertyKey: return (object as ViewModelInstanceNumberBase).propertyValue; case CustomPropertyNumberBase.propertyValuePropertyKey: @@ -3293,14 +3069,6 @@ class RiveCoreContext { return (object as TransformConstraintBase).originX; case TransformConstraintBase.originYPropertyKey: return (object as TransformConstraintBase).originY; - case WorldTransformComponentBase.opacityPropertyKey: - return (object as WorldTransformComponentBase).opacity; - case TransformComponentBase.rotationPropertyKey: - return (object as TransformComponentBase).rotation; - case TransformComponentBase.scaleXPropertyKey: - return (object as TransformComponentBase).scaleX; - case TransformComponentBase.scaleYPropertyKey: - return (object as TransformComponentBase).scaleY; case LayoutComponentStyleBase.gapHorizontalPropertyKey: return (object as LayoutComponentStyleBase).gapHorizontal; case LayoutComponentStyleBase.gapVerticalPropertyKey: @@ -3392,8 +3160,6 @@ class RiveCoreContext { return (object as CubicInterpolatorComponentBase).y2; case ListenerNumberChangeBase.valuePropertyKey: return (object as ListenerNumberChangeBase).value; - case KeyFrameDoubleBase.valuePropertyKey: - return (object as KeyFrameDoubleBase).value_; case TransitionValueNumberComparatorBase.valuePropertyKey: return (object as TransitionValueNumberComparatorBase).value; case ElasticInterpolatorBase.amplitudePropertyKey: @@ -3416,8 +3182,6 @@ class RiveCoreContext { return (object as LinearGradientBase).endY; case LinearGradientBase.opacityPropertyKey: return (object as LinearGradientBase).opacity; - case StrokeBase.thicknessPropertyKey: - return (object as StrokeBase).thickness; case GradientStopBase.positionPropertyKey: return (object as GradientStopBase).position; case TrimPathBase.startPropertyKey: @@ -3426,22 +3190,10 @@ class RiveCoreContext { return (object as TrimPathBase).end; case TrimPathBase.offsetPropertyKey: return (object as TrimPathBase).offset; - case VertexBase.xPropertyKey: - return (object as VertexBase).x; - case VertexBase.yPropertyKey: - return (object as VertexBase).y; case MeshVertexBase.uPropertyKey: return (object as MeshVertexBase).u; case MeshVertexBase.vPropertyKey: return (object as MeshVertexBase).v; - case StraightVertexBase.radiusPropertyKey: - return (object as StraightVertexBase).radius; - case CubicAsymmetricVertexBase.rotationPropertyKey: - return (object as CubicAsymmetricVertexBase).rotation; - case CubicAsymmetricVertexBase.inDistancePropertyKey: - return (object as CubicAsymmetricVertexBase).inDistance; - case CubicAsymmetricVertexBase.outDistancePropertyKey: - return (object as CubicAsymmetricVertexBase).outDistance; case ParametricPathBase.widthPropertyKey: return (object as ParametricPathBase).width; case ParametricPathBase.heightPropertyKey: @@ -3458,8 +3210,6 @@ class RiveCoreContext { return (object as RectangleBase).cornerRadiusBL; case RectangleBase.cornerRadiusBRPropertyKey: return (object as RectangleBase).cornerRadiusBR; - case CubicMirroredVertexBase.rotationPropertyKey: - return (object as CubicMirroredVertexBase).rotation; case CubicMirroredVertexBase.distancePropertyKey: return (object as CubicMirroredVertexBase).distance; case PolygonBase.cornerRadiusPropertyKey: @@ -3470,14 +3220,6 @@ class RiveCoreContext { return (object as ImageBase).originX; case ImageBase.originYPropertyKey: return (object as ImageBase).originY; - case CubicDetachedVertexBase.inRotationPropertyKey: - return (object as CubicDetachedVertexBase).inRotation; - case CubicDetachedVertexBase.inDistancePropertyKey: - return (object as CubicDetachedVertexBase).inDistance; - case CubicDetachedVertexBase.outRotationPropertyKey: - return (object as CubicDetachedVertexBase).outRotation; - case CubicDetachedVertexBase.outDistancePropertyKey: - return (object as CubicDetachedVertexBase).outDistance; case LayoutComponentBase.widthPropertyKey: return (object as LayoutComponentBase).width; case LayoutComponentBase.heightPropertyKey: @@ -3783,20 +3525,6 @@ class RiveCoreContext { switch (propertyKey) { - case SoloBase.activeComponentIdPropertyKey: - (object as SoloBase).activeComponentId = value; - // if (object is SoloBase) { - // object.activeComponentId = value; - // } - return; - - case DrawRulesBase.drawTargetIdPropertyKey: - (object as DrawRulesBase).drawTargetId = value; - // if (object is DrawRulesBase) { - // object.drawTargetId = value; - // } - return; - case ViewModelInstanceListItemBase.viewModelIdPropertyKey: if (object is ViewModelInstanceListItemBase) { object.viewModelId = value; @@ -3832,11 +3560,6 @@ class RiveCoreContext { object.viewModelReferenceId = value; } break; - case ComponentBase.parentIdPropertyKey: - if (object is ComponentBase) { - object.parentId = value; - } - break; case ViewModelInstanceBase.viewModelIdPropertyKey: if (object is ViewModelInstanceBase) { object.viewModelId = value; @@ -4127,21 +3850,6 @@ class RiveCoreContext { object.flags = value; } break; - case KeyFrameBase.framePropertyKey: - if (object is KeyFrameBase) { - object.frame = value; - } - break; - case InterpolatingKeyFrameBase.interpolationTypePropertyKey: - if (object is InterpolatingKeyFrameBase) { - object.interpolationType = value; - } - break; - case InterpolatingKeyFrameBase.interpolatorIdPropertyKey: - if (object is InterpolatingKeyFrameBase) { - object.interpolatorId = value; - } - break; case KeyFrameUintBase.valuePropertyKey: if (object is KeyFrameUintBase) { object.value = value; @@ -4192,11 +3900,6 @@ class RiveCoreContext { object.inputId = value; } break; - case KeyedObjectBase.objectIdPropertyKey: - if (object is KeyedObjectBase) { - object.objectId = value; - } - break; case BlendAnimationBase.animationIdPropertyKey: if (object is BlendAnimationBase) { object.animationId = value; @@ -4217,11 +3920,6 @@ class RiveCoreContext { object.inputId = value; } break; - case KeyedPropertyBase.propertyKeyPropertyKey: - if (object is KeyedPropertyBase) { - object.propertyKey = value; - } - break; case StateMachineListenerBase.targetIdPropertyKey: if (object is StateMachineListenerBase) { object.targetId = value; @@ -4578,24 +4276,10 @@ class RiveCoreContext { /// STOKANAL-FORK-EDIT static void setColor(Core object, int propertyKey, int value) { - // _counter.putIfAbsent(propertyKey, IntCapsule.new).increment(); - // if (Randoms().hit(0.001)) { - // info('setColor > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); - // } - // reordered switch (propertyKey) { - case SolidColorBase.colorValuePropertyKey: - (object as SolidColorBase).colorValue = value; - // if (object is SolidColorBase) { - // object.colorValue = value; - // } - return; case GradientStopBase.colorValuePropertyKey: (object as GradientStopBase).colorValue = value; - // if (object is GradientStopBase) { - // object.colorValue = value; - // } return; case ViewModelInstanceColorBase.propertyValuePropertyKey: @@ -4634,11 +4318,6 @@ class RiveCoreContext { object.propertyValue = value; } break; - case ComponentBase.namePropertyKey: - if (object is ComponentBase) { - object.name = value; - } - break; case DataEnumValueBase.keyPropertyKey: if (object is DataEnumValueBase) { object.key = value; @@ -4712,77 +4391,17 @@ class RiveCoreContext { // reordered switch to allow for more frequent in the beginning switch (propertyKey) { - case VertexBase.xPropertyKey: - (object as VertexBase).x = value; - return; - case VertexBase.yPropertyKey: - (object as VertexBase).y = value; - return; - case CubicDetachedVertexBase.outRotationPropertyKey: - (object as CubicDetachedVertexBase).outRotation = value; - return; - case CubicDetachedVertexBase.outDistancePropertyKey: - (object as CubicDetachedVertexBase).outDistance = value; - return; - case CubicDetachedVertexBase.inRotationPropertyKey: - (object as CubicDetachedVertexBase).inRotation = value; - return; - case CubicAsymmetricVertexBase.inDistancePropertyKey: - (object as CubicAsymmetricVertexBase).inDistance = value; - return; - case NodeBase.xPropertyKey: - (object as NodeBase).x = value; - return; - case NodeBase.yPropertyKey: - (object as NodeBase).y = value; - return; - case CubicDetachedVertexBase.inDistancePropertyKey: - (object as CubicDetachedVertexBase).inDistance = value; - return; - case TransformComponentBase.scaleXPropertyKey: - (object as TransformComponentBase).scaleX = value; - return; - case TransformComponentBase.scaleYPropertyKey: - (object as TransformComponentBase).scaleY = value; - return; - case TransformComponentBase.rotationPropertyKey: - (object as TransformComponentBase).rotation = value; - return; case DistanceConstraintBase.distancePropertyKey: (object as DistanceConstraintBase).distance = value; return; - case WorldTransformComponentBase.opacityPropertyKey: - (object as WorldTransformComponentBase).opacity = value; - return; - case CubicAsymmetricVertexBase.rotationPropertyKey: - (object as CubicAsymmetricVertexBase).rotation = value; - return; - case CubicMirroredVertexBase.rotationPropertyKey: - (object as CubicMirroredVertexBase).rotation = value; - return; case CubicMirroredVertexBase.distancePropertyKey: (object as CubicMirroredVertexBase).distance = value; return; - case CubicAsymmetricVertexBase.outDistancePropertyKey: - (object as CubicAsymmetricVertexBase).outDistance = value; - return; case GradientStopBase.positionPropertyKey: (object as GradientStopBase).position = value; return; - case StrokeBase.thicknessPropertyKey: - (object as StrokeBase).thickness = value; - return; } - // } - // - // _counter.putIfAbsent(propertyKey, IntCapsule.new).increment(); - // if (Randoms().hit(0.001)) { - // info('setDouble > ${_counter.entries.sorted((e1, e2) => e2.value.value - e1.value.value).map((e) => '${e.key}:${e.value}').join(',')}'); - // } - // - // switch (propertyKey) { - switch (propertyKey) { case ViewModelInstanceNumberBase.propertyValuePropertyKey: if (object is ViewModelInstanceNumberBase) { @@ -5064,11 +4683,6 @@ class RiveCoreContext { object.value = value; } break; - case KeyFrameDoubleBase.valuePropertyKey: - if (object is KeyFrameDoubleBase) { - object.value = value; - } - break; case TransitionValueNumberComparatorBase.valuePropertyKey: if (object is TransitionValueNumberComparatorBase) { object.value = value; @@ -5149,11 +4763,6 @@ class RiveCoreContext { object.v = value; } break; - case StraightVertexBase.radiusPropertyKey: - if (object is StraightVertexBase) { - object.radius = value; - } - break; case ParametricPathBase.widthPropertyKey: if (object is ParametricPathBase) { object.width = value; diff --git a/lib/src/rive_core/animation/animation_reset_factory.dart b/lib/src/rive_core/animation/animation_reset_factory.dart index c6718b61..87d76ce1 100644 --- a/lib/src/rive_core/animation/animation_reset_factory.dart +++ b/lib/src/rive_core/animation/animation_reset_factory.dart @@ -11,15 +11,13 @@ import 'package:rive/src/rive_core/animation/linear_animation.dart'; import 'package:rive/src/rive_core/animation/state_instance.dart'; import 'package:rive_common/utilities.dart'; -bool _isDouble(int propertyKey, Core object) { - final coreType = RiveCoreContext.coreType(propertyKey); - return coreType == RiveCoreContext.doubleType; -} +import '../../generated/rive_core_beans.dart'; -bool _isColor(int propertyKey, Core object) { - final coreType = RiveCoreContext.coreType(propertyKey); - return coreType == RiveCoreContext.colorType; -} +bool _isDouble(int propertyKey, Core object) => + PropertyBeans.get(propertyKey).coreType == RiveCoreContext.doubleType; + +bool _isColor(int propertyKey, Core object) => + PropertyBeans.get(propertyKey).coreType == RiveCoreContext.colorType; class AnimationReset { BinaryReader? _reader; @@ -88,10 +86,10 @@ class AnimationReset { // Fourth we read the property value for each property if (_isDouble(propertyKey, object!)) { double value = reader.readFloat32(); - RiveCoreContext.setDouble(object, propertyKey, value); + PropertyBeans.get(propertyKey).setDouble(object, value); } else if (_isColor(propertyKey, object)) { int value = reader.readInt32(); - RiveCoreContext.setColor(object, propertyKey, value); + PropertyBeans.get(propertyKey).setColor(object, value); } currentPropertyIndex += 1; } @@ -104,13 +102,14 @@ class _KeyedProperty { final bool isBaseline; _KeyedProperty(this.property, this.isBaseline); bool readProperty() { - if (property.propertyKey_ == 1) { + if (property.propertyKey == 1) { return true; } return false; } - int get propertyKey => property.propertyKey_; + int get propertyKey => property.propertyKey; + PropertyBean get propertyBean => property.propertyBean; int get size => 1 + 4; // property id + float value } @@ -123,7 +122,7 @@ class _KeyedObject { void addProperties( Iterable props, Core object, bool storeAsBaseline) { for (final property in props) { - var prop = property.propertyKey_; + var prop = property.propertyKey; if (visitedProperties.add(prop)) { // visitedProperties.add(prop); @@ -205,9 +204,9 @@ class _AnimationsData { animationReset.writeColor( (property.property.keyframes.first as KeyFrameColor).value); } else { - animationReset.writeColor(RiveCoreContext.getColor( - core.resolve(keyedObject.data.objectId), - property.propertyKey)); + + animationReset.writeColor(PropertyBeans.get(property.propertyKey).getColor(core.resolve(keyedObject.data.objectId))); + } } else if (_isDouble(property.propertyKey, object)) { animationReset.writePropertyKey(property.propertyKey); @@ -215,9 +214,13 @@ class _AnimationsData { animationReset.writeDouble( (property.property.keyframes.first as KeyFrameDouble).value_); } else { - animationReset.writeDouble(RiveCoreContext.getDouble( - core.resolve(keyedObject.data.objectId), - property.propertyKey)); + + // animationReset.writeDouble(RiveCoreContext.getDouble( + // core.resolve(keyedObject.data.objectId), + // property.propertyKey)); + animationReset.writeDouble( + property.propertyBean.getDouble( + core.resolve(keyedObject.data.objectId))); } } } diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index 29eeb9de..0792ffe2 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -39,7 +39,7 @@ class KeyedObject extends KeyedObjectBase { void onAdded() {} bool isValidKeyedProperty(KeyedProperty property) { - var value = _keyedProperties[property.propertyKey_]; + var value = _keyedProperties[property.propertyKey]; // If the property is already keyed, that's ok just make sure the // KeyedObject matches. @@ -52,14 +52,14 @@ class KeyedObject extends KeyedObjectBase { /// Called by rive_core to add a KeyedProperty to the animation. This should /// be @internal when it's supported. bool internalAddKeyedProperty(KeyedProperty property) { - var value = _keyedProperties[property.propertyKey_]; + var value = _keyedProperties[property.propertyKey]; // If the property is already keyed, that's ok just make sure the // KeyedObject matches. if (value != null && value != property) { return false; } - _keyedProperties[property.propertyKey_] = property; + _keyedProperties[property.propertyKey] = property; _propsNonCallback = _props = null; return true; @@ -68,7 +68,7 @@ class KeyedObject extends KeyedObjectBase { /// Called by rive_core to remove a KeyedObject to the animation. This should /// be @internal when it's supported. bool internalRemoveKeyedProperty(KeyedProperty property) { - var removed = _keyedProperties.remove(property.propertyKey_); + var removed = _keyedProperties.remove(property.propertyKey); _propsNonCallback = _props = null; if (_keyedProperties.isEmpty) { diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 6025c380..16682eea 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -212,8 +212,8 @@ class KeyedProperty extends KeyedPropertyBase } bool get isCallback => - propertyKey_ == EventBase.triggerPropertyKey || - propertyKey_ == NestedTriggerBase.firePropertyKey; + propertyKey == EventBase.triggerPropertyKey || + propertyKey == NestedTriggerBase.firePropertyKey; // RiveCoreContext.isCallback(propertyKey_); /// Report any keyframes that occured between secondsFrom and secondsTo. @@ -252,7 +252,7 @@ class KeyedProperty extends KeyedPropertyBase while (idxTo > idx) { var frame = _keyframes[idx]; reporter.reportKeyedCallback( - objectId, propertyKey_, secondsTo - frame.seconds); + objectId, propertyKey, secondsTo - frame.seconds); idx++; } } @@ -279,12 +279,12 @@ class KeyedProperty extends KeyedPropertyBase if (fromFrame != null) { // interpolation if (fromFrame.interpolationType == 0) { - fromFrame.apply(object, propertyKey_, mix); + fromFrame.apply(object, propertyBean, mix); } else { - fromFrame.applyInterpolation(object, propertyKey_, seconds, toFrame, mix); + fromFrame.applyInterpolation(object, propertyBean, seconds, toFrame, mix); } } else { - toFrame.apply(object, propertyKey_, mix); + toFrame.apply(object, propertyBean, mix); } // if (_idx == 0) { diff --git a/lib/src/rive_core/animation/keyframe.dart b/lib/src/rive_core/animation/keyframe.dart index 8f68f016..5d0b2585 100644 --- a/lib/src/rive_core/animation/keyframe.dart +++ b/lib/src/rive_core/animation/keyframe.dart @@ -3,6 +3,8 @@ import 'package:rive/src/generated/animation/keyframe_base.dart'; import 'package:rive/src/rive_core/animation/keyed_property.dart'; import 'package:rive/src/rive_core/animation/linear_animation.dart'; +import '../../generated/rive_core_beans.dart'; + export 'package:rive/src/generated/animation/keyframe_base.dart'; abstract class KeyFrame extends KeyFrameBase @@ -29,11 +31,11 @@ abstract class KeyFrame extends KeyFrameBase void frameChanged(int from, int to) {} /// Apply the value of this keyframe to the object's property. - void apply(Core object, int propertyKey, double mix) {} + void apply(Core object, PropertyBean bean, double mix) {} /// Interpolate the value between this keyframe and the next and apply it to /// the object's property. - void applyInterpolation(Core object, int propertyKey, double seconds, + void applyInterpolation(Core object, PropertyBean bean, double seconds, covariant KeyFrame nextFrame, double mix) {} @override diff --git a/lib/src/rive_core/animation/keyframe_bool.dart b/lib/src/rive_core/animation/keyframe_bool.dart index 837cfb07..b0096125 100644 --- a/lib/src/rive_core/animation/keyframe_bool.dart +++ b/lib/src/rive_core/animation/keyframe_bool.dart @@ -1,5 +1,6 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_bool_base.dart'; +import 'package:rive/src/generated/rive_core_beans.dart'; export 'package:rive/src/generated/animation/keyframe_bool_base.dart'; /// KeyFrame for animating bool properties. @@ -8,14 +9,16 @@ class KeyFrameBool extends KeyFrameBoolBase { bool get canInterpolate => false; @override - void apply(Core object, int propertyKey, double mix) { - RiveCoreContext.setBool(object, propertyKey, value); + void apply(Core object, PropertyBean bean, double mix) { + // RiveCoreContext.setBool(object, bean, value); + bean.setBool(object, value); } @override - void applyInterpolation(Core object, int propertyKey, + void applyInterpolation(Core object, PropertyBean bean, double currentTime, KeyFrameBool nextFrame, double mix) { - RiveCoreContext.setBool(object, propertyKey, value); + // RiveCoreContext.setBool(object, bean, value); + bean.setBool(object, value); } @override diff --git a/lib/src/rive_core/animation/keyframe_callback.dart b/lib/src/rive_core/animation/keyframe_callback.dart index 1510deaf..928c4a0a 100644 --- a/lib/src/rive_core/animation/keyframe_callback.dart +++ b/lib/src/rive_core/animation/keyframe_callback.dart @@ -2,13 +2,15 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_callback_base.dart'; import 'package:rive/src/rive_core/animation/keyframe.dart'; +import '../../generated/rive_core_beans.dart'; + export 'package:rive/src/generated/animation/keyframe_callback_base.dart'; class KeyFrameCallback extends KeyFrameCallbackBase { @override - void apply(Core object, int propertyKey, double mix) {} + void apply(Core object, PropertyBean bean, double mix) {} @override - void applyInterpolation(Core object, int propertyKey, + void applyInterpolation(Core object, PropertyBean bean, double seconds, covariant KeyFrame nextFrame, double mix) {} } diff --git a/lib/src/rive_core/animation/keyframe_color.dart b/lib/src/rive_core/animation/keyframe_color.dart index 899fea56..a1f928f9 100644 --- a/lib/src/rive_core/animation/keyframe_color.dart +++ b/lib/src/rive_core/animation/keyframe_color.dart @@ -2,29 +2,32 @@ import 'dart:ui'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_color_base.dart'; + +import '../../generated/rive_core_beans.dart'; export 'package:rive/src/generated/animation/keyframe_color_base.dart'; -void _apply(Core object, int propertyKey, double mix, int value) { +void _apply(Core object, PropertyBean bean, double mix, int value) { if (mix == 1) { - RiveCoreContext.setColor(object, propertyKey, value); + // RiveCoreContext.setColor(object, propertyKey, value); + bean.setColor(object, value); } else { var mixedColor = Color.lerp( - Color(RiveCoreContext.getColor(object, propertyKey)), + Color(bean.getColor(object)), Color(value), mix); if (mixedColor != null) { - RiveCoreContext.setColor(object, propertyKey, mixedColor.value); + bean.setColor(object, mixedColor.value); } } } class KeyFrameColor extends KeyFrameColorBase { @override - void apply(Core object, int propertyKey, double mix) => - _apply(object, propertyKey, mix, value); + void apply(Core object, PropertyBean bean, double mix) => + _apply(object, bean, mix, value); @override - void applyInterpolation(Core object, int propertyKey, + void applyInterpolation(Core object, PropertyBean bean, double currentTime, KeyFrameColor nextFrame, double mix) { var f = (currentTime - seconds) / (nextFrame.seconds - seconds); @@ -34,7 +37,7 @@ class KeyFrameColor extends KeyFrameColorBase { var color = Color.lerp(Color(value), Color(nextFrame.value), f); if (color != null) { - _apply(object, propertyKey, mix, color.value); + _apply(object, bean, mix, color.value); } } diff --git a/lib/src/rive_core/animation/keyframe_double.dart b/lib/src/rive_core/animation/keyframe_double.dart index d456fea0..c1481343 100644 --- a/lib/src/rive_core/animation/keyframe_double.dart +++ b/lib/src/rive_core/animation/keyframe_double.dart @@ -1,5 +1,7 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_double_base.dart'; + +import '../../generated/rive_core_beans.dart'; export 'package:rive/src/generated/animation/keyframe_double_base.dart'; // void _apply( @@ -15,12 +17,11 @@ class KeyFrameDouble extends KeyFrameDoubleBase { K? clone() => this as K; @override - void apply(Core object, int propertyKey, double mix) => - RiveCoreContext.setDouble(object, propertyKey, - mix == 1 ? value_ : RiveCoreContext.getDouble(object, propertyKey) * (1.0 - mix) + value_ * mix); + void apply(Core object, PropertyBean bean, double mix) => + bean.transformDouble(object, (v) => mix == 1 ? value_ : v * (1.0 - mix) + value_ * mix); @override - void applyInterpolation(Core object, int propertyKey, + void applyInterpolation(Core object, PropertyBean bean, double currentTime, KeyFrameDouble nextFrame, double mix) { var f = (currentTime - seconds) / (nextFrame.seconds - seconds); @@ -29,8 +30,7 @@ class KeyFrameDouble extends KeyFrameDoubleBase { // _apply(object, propertyKey, mix, frameValue); - RiveCoreContext.setDouble(object, propertyKey, - mix == 1 ? frameValue : RiveCoreContext.getDouble(object, propertyKey) * (1.0 - mix) + frameValue * mix); + bean.setDouble(object, mix == 1 ? frameValue : bean.getDouble(object) * (1.0 - mix) + frameValue * mix); } @override diff --git a/lib/src/rive_core/animation/keyframe_id.dart b/lib/src/rive_core/animation/keyframe_id.dart index 9a688c39..18be7788 100644 --- a/lib/src/rive_core/animation/keyframe_id.dart +++ b/lib/src/rive_core/animation/keyframe_id.dart @@ -1,6 +1,8 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_id_base.dart'; +import '../../generated/rive_core_beans.dart'; + export 'package:rive/src/generated/animation/keyframe_id_base.dart'; class KeyFrameId extends KeyFrameIdBase { @@ -8,14 +10,14 @@ class KeyFrameId extends KeyFrameIdBase { bool get canInterpolate => false; @override - void apply(Core object, int propertyKey, double mix) { - RiveCoreContext.setUint(object, propertyKey, value); + void apply(Core object, PropertyBean bean, double mix) { + bean.setUint(object, value); } @override - void applyInterpolation(Core object, int propertyKey, + void applyInterpolation(Core object, PropertyBean bean, double currentTime, KeyFrameId nextFrame, double mix) { - RiveCoreContext.setUint(object, propertyKey, value); + bean.setUint(object, value); } @override diff --git a/lib/src/rive_core/animation/keyframe_string.dart b/lib/src/rive_core/animation/keyframe_string.dart index 737d1d5f..20bd5bf3 100644 --- a/lib/src/rive_core/animation/keyframe_string.dart +++ b/lib/src/rive_core/animation/keyframe_string.dart @@ -1,6 +1,8 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_string_base.dart'; +import '../../generated/rive_core_beans.dart'; + export 'package:rive/src/generated/animation/keyframe_id_base.dart'; class KeyFrameString extends KeyFrameStringBase { @@ -8,14 +10,14 @@ class KeyFrameString extends KeyFrameStringBase { bool get canInterpolate => false; @override - void apply(Core object, int propertyKey, double mix) { - RiveCoreContext.setString(object, propertyKey, value); + void apply(Core object, PropertyBean bean, double mix) { + bean.setString(object, value); } @override - void applyInterpolation(Core object, int propertyKey, + void applyInterpolation(Core object, PropertyBean bean, double currentTime, KeyFrameString nextFrame, double mix) { - RiveCoreContext.setString(object, propertyKey, value); + bean.setString(object, value); } @override diff --git a/lib/src/rive_core/animation/keyframe_uint.dart b/lib/src/rive_core/animation/keyframe_uint.dart index 692f71a3..fe64d787 100644 --- a/lib/src/rive_core/animation/keyframe_uint.dart +++ b/lib/src/rive_core/animation/keyframe_uint.dart @@ -1,5 +1,7 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_uint_base.dart'; + +import '../../generated/rive_core_beans.dart'; export 'package:rive/src/generated/animation/keyframe_uint_base.dart'; /// KeyFrame for animating uint properties. @@ -8,14 +10,14 @@ class KeyFrameUint extends KeyFrameUintBase { bool get canInterpolate => false; @override - void apply(Core object, int propertyKey, double mix) { - RiveCoreContext.setUint(object, propertyKey, value); + void apply(Core object, PropertyBean bean, double mix) { + bean.setUint(object, value); } @override - void applyInterpolation(Core object, int propertyKey, + void applyInterpolation(Core object, PropertyBean bean, double currentTime, KeyFrameUint nextFrame, double mix) { - RiveCoreContext.setUint(object, propertyKey, value); + bean.setUint(object, value); } @override diff --git a/lib/src/rive_core/data_bind/context/context_value_boolean.dart b/lib/src/rive_core/data_bind/context/context_value_boolean.dart index 07a82656..d10c2e77 100644 --- a/lib/src/rive_core/data_bind/context/context_value_boolean.dart +++ b/lib/src/rive_core/data_bind/context/context_value_boolean.dart @@ -1,4 +1,5 @@ import 'package:rive/src/core/core.dart'; +import 'package:rive/src/generated/rive_core_beans.dart'; import 'package:rive/src/rive_core/data_bind/context/context_value.dart'; import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_boolean.dart'; @@ -12,13 +13,13 @@ class ContextValueBoolean extends ContextValue { if (source?.coreType == ViewModelInstanceBooleanBase.typeKey) { final sourceBoolean = source as ViewModelInstanceBoolean; - RiveCoreContext.setBool(core, propertyKey, sourceBoolean.propertyValue); + PropertyBeans.get(propertyKey).setBool(core, sourceBoolean.propertyValue); } } @override void applyToSource(Core core, int propertyKey) { - final value = RiveCoreContext.getBool(core, propertyKey); + final value = PropertyBeans.get(propertyKey).getBool(core); final sourceBoolean = source as ViewModelInstanceBoolean; sourceBoolean.propertyValue = value; } diff --git a/lib/src/rive_core/data_bind/context/context_value_color.dart b/lib/src/rive_core/data_bind/context/context_value_color.dart index 9e4eacd1..c6ff06f6 100644 --- a/lib/src/rive_core/data_bind/context/context_value_color.dart +++ b/lib/src/rive_core/data_bind/context/context_value_color.dart @@ -1,4 +1,5 @@ import 'package:rive/src/core/core.dart'; +import 'package:rive/src/generated/rive_core_beans.dart'; import 'package:rive/src/rive_core/data_bind/context/context_value.dart'; import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_color.dart'; @@ -12,13 +13,13 @@ class ContextValueColor extends ContextValue { if (source?.coreType == ViewModelInstanceColorBase.typeKey) { final sourceColor = source as ViewModelInstanceColor; - RiveCoreContext.setColor(core, propertyKey, sourceColor.propertyValue); + PropertyBeans.get(propertyKey).setColor(core, sourceColor.propertyValue); } } @override void applyToSource(Core core, int propertyKey) { - final value = RiveCoreContext.getColor(core, propertyKey); + final value = PropertyBeans.get(propertyKey).getColor(core); final sourceColor = source as ViewModelInstanceColor; sourceColor.propertyValue = value; } diff --git a/lib/src/rive_core/data_bind/context/context_value_number.dart b/lib/src/rive_core/data_bind/context/context_value_number.dart index 15d6415c..599e8c6f 100644 --- a/lib/src/rive_core/data_bind/context/context_value_number.dart +++ b/lib/src/rive_core/data_bind/context/context_value_number.dart @@ -1,4 +1,5 @@ import 'package:rive/src/core/core.dart'; +import 'package:rive/src/generated/rive_core_beans.dart'; import 'package:rive/src/rive_core/data_bind/context/context_value.dart'; import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_number.dart'; @@ -12,13 +13,13 @@ class ContextValueNumber extends ContextValue { if (source?.coreType == ViewModelInstanceNumberBase.typeKey) { final sourceNumber = source as ViewModelInstanceNumber; - RiveCoreContext.setDouble(core, propertyKey, sourceNumber.propertyValue); + PropertyBeans.get(propertyKey).setDouble(core, sourceNumber.propertyValue); } } @override void applyToSource(Core core, int propertyKey) { - final value = RiveCoreContext.getDouble(core, propertyKey); + final value = PropertyBeans.get(propertyKey).getDouble(core); final sourceNumber = source as ViewModelInstanceNumber; sourceNumber.propertyValue = value; } diff --git a/lib/src/rive_core/data_bind/context/context_value_string.dart b/lib/src/rive_core/data_bind/context/context_value_string.dart index 221cfcfd..05d6c210 100644 --- a/lib/src/rive_core/data_bind/context/context_value_string.dart +++ b/lib/src/rive_core/data_bind/context/context_value_string.dart @@ -1,4 +1,5 @@ import 'package:rive/src/core/core.dart'; +import 'package:rive/src/generated/rive_core_beans.dart'; import 'package:rive/src/rive_core/data_bind/context/context_value.dart'; import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_string.dart'; @@ -12,13 +13,13 @@ class ContextValueString extends ContextValue { if (source?.coreType == ViewModelInstanceStringBase.typeKey) { final sourceString = source as ViewModelInstanceString; - RiveCoreContext.setString(core, propertyKey, sourceString.propertyValue); + PropertyBeans.get(propertyKey).setString(core, sourceString.propertyValue); } } @override void applyToSource(Core core, int propertyKey) { - final value = RiveCoreContext.getString(core, propertyKey); + final value = PropertyBeans.get(propertyKey).getString(core); final sourceString = source as ViewModelInstanceString; sourceString.propertyValue = value; } diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 95930a34..ea9b7a00 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -40,6 +40,8 @@ import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; import 'package:rive/src/runtime_event.dart'; import 'package:rive_common/math.dart'; +import '../generated/rive_core_beans.dart'; + /// Callback signature for state machine state changes typedef OnStateChange = void Function( String stateMachineName, String stateName); @@ -777,9 +779,9 @@ class StateMachineController extends RiveAnimationController int objectId, int propertyKey, double elapsedSeconds) { var coreObject = core.resolve(objectId); if (coreObject != null) { - RiveCoreContext.setCallback( + PropertyBeans.get(propertyKey).setCallback( coreObject, - propertyKey, + // propertyKey, CallbackData(this, delay: elapsedSeconds), ); } diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index a2abea70..84e8a6ff 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -14,6 +14,7 @@ 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/assets/font_asset_base.dart'; import 'package:rive/src/generated/nested_artboard_base.dart'; +import 'package:rive/src/generated/rive_core_beans.dart'; import 'package:rive/src/generated/text/text_base.dart'; import 'package:rive/src/local_file_io.dart' if (dart.library.js_interop) 'package:rive/src/local_file_web.dart'; @@ -67,12 +68,15 @@ Core? _readRuntimeObject(BinaryReader reader, break; } - var fieldType = RiveCoreContext.coreType(propertyKey); + // var fieldType = RiveCoreContext.coreType(propertyKey); + var fieldType = PropertyBeans.get(propertyKey).coreType; + if (fieldType == null || object == null) { _skipProperty(reader, propertyKey, propertyToField); } else { - RiveCoreContext.setObjectProperty( - object, propertyKey, fieldType.deserialize(reader)); + PropertyBeans.get(propertyKey).setObjectProperty(object, fieldType.deserialize(reader)); + // RiveCoreContext.setObjectProperty( + // object, propertyKey, fieldType.deserialize(reader)); } } return object; @@ -97,7 +101,7 @@ int _peekRuntimeObjectType( void _skipProperty(BinaryReader reader, int propertyKey, HashMap propertyToField) { var field = - RiveCoreContext.coreType(propertyKey) ?? propertyToField[propertyKey]; + PropertyBeans.get(propertyKey).coreType ?? propertyToField[propertyKey]; if (field == null) { throw UnsupportedError('Unsupported property key $propertyKey. ' 'A new runtime is likely necessary to play this file.'); From 3a3bae527c3e1a1bd9d53f328cb4857de9bd9393 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sat, 15 Feb 2025 15:57:15 +0000 Subject: [PATCH 24/50] rive_core_context refactor (2b continued) --- lib/src/generated/rive_core_beans.dart | 11 ++++-- lib/src/generated/rive_core_context.dart | 37 ------------------- .../rive_core/animation/keyframe_double.dart | 9 ++++- 3 files changed, 15 insertions(+), 42 deletions(-) diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index 91609895..ecd28af2 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -196,7 +196,6 @@ class PropertyBean { double getDouble(Core o) => throw Exception(); void setDouble(Core o, double v) => throw Exception(); - @nonVirtual void transformDouble(Core o, double Function(double) function) { setDouble(o, function(getDouble(o))); } @@ -229,6 +228,10 @@ class DoublePropertyBean extends PropertyBean { @override void setDouble(Core o, double v) => setter(o as T, v); + @override + void transformDouble(Core o, double Function(double) function) => + setter(o as T, function(getter(o))); + @override void setObjectProperty(Core o, Object v) => o is T && v is double ? setDouble(o, v) : {}; @@ -417,9 +420,11 @@ final _implements = [ ColorPropertyBean._(SolidColorBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), StringPropertyBean._(ComponentBase.namePropertyKey, (o) => o.name, (o, v) => o.name = v), DoublePropertyBean._(StrokeBase.thicknessPropertyKey, (o) => o.thickness, (o, v) => o.thickness = v), + DoublePropertyBean._(DistanceConstraintBase.distancePropertyKey, (o) => o.distance, (o, v) => o.distance = v), + DoublePropertyBean._(CubicMirroredVertexBase.distancePropertyKey, (o) => o.distance, (o, v) => o.distance = v), + DoublePropertyBean._(GradientStopBase.positionPropertyKey, (o) => o.position, (o, v) => o.position = v), ]; - // ignore: avoid_classes_with_only_static_members abstract class PropertyBeans { @@ -436,6 +441,6 @@ abstract class PropertyBeans { } static void _dumpFallbacks() { - info(_map.values.whereType().sorted((b1, b2) => b2.hits.compareTo(b1.hits)).map((b) => '$b').join('\n')); + info('\n${_map.values.whereType().sorted((b1, b2) => b2.hits.compareTo(b1.hits)).map((b) => '$b').join('\n')}'); } } \ No newline at end of file diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index 85dfa078..7abb1400 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -608,11 +608,6 @@ class RiveCoreContext { object.targetId = value; } break; - case DistanceConstraintBase.distancePropertyKey: - if (object is DistanceConstraintBase && value is double) { - object.distance = value; - } - break; case DistanceConstraintBase.modeValuePropertyKey: if (object is DistanceConstraintBase && value is int) { object.modeValue = value; @@ -1528,11 +1523,6 @@ class RiveCoreContext { object.colorValue = value; } break; - case GradientStopBase.positionPropertyKey: - if (object is GradientStopBase && value is double) { - object.position = value; - } - break; case TrimPathBase.startPropertyKey: if (object is TrimPathBase && value is double) { object.start = value; @@ -1658,11 +1648,6 @@ class RiveCoreContext { object.cornerRadiusBR = value; } break; - case CubicMirroredVertexBase.distancePropertyKey: - if (object is CubicMirroredVertexBase && value is double) { - object.distance = value; - } - break; case ClippingShapeBase.sourceIdPropertyKey: if (object is ClippingShapeBase && value is int) { object.sourceId = value; @@ -2456,7 +2441,6 @@ class RiveCoreContext { case ViewModelInstanceNumberBase.propertyValuePropertyKey: case CustomPropertyNumberBase.propertyValuePropertyKey: case ConstraintBase.strengthPropertyKey: - case DistanceConstraintBase.distancePropertyKey: case TransformComponentConstraintBase.copyFactorPropertyKey: case TransformComponentConstraintBase.minValuePropertyKey: case TransformComponentConstraintBase.maxValuePropertyKey: @@ -2521,7 +2505,6 @@ class RiveCoreContext { case LinearGradientBase.endXPropertyKey: case LinearGradientBase.endYPropertyKey: case LinearGradientBase.opacityPropertyKey: - case GradientStopBase.positionPropertyKey: case TrimPathBase.startPropertyKey: case TrimPathBase.endPropertyKey: case TrimPathBase.offsetPropertyKey: @@ -2535,7 +2518,6 @@ class RiveCoreContext { case RectangleBase.cornerRadiusTRPropertyKey: case RectangleBase.cornerRadiusBLPropertyKey: case RectangleBase.cornerRadiusBRPropertyKey: - case CubicMirroredVertexBase.distancePropertyKey: case PolygonBase.cornerRadiusPropertyKey: case StarBase.innerRadiusPropertyKey: case ImageBase.originXPropertyKey: @@ -3049,8 +3031,6 @@ class RiveCoreContext { return (object as CustomPropertyNumberBase).propertyValue; case ConstraintBase.strengthPropertyKey: return (object as ConstraintBase).strength; - case DistanceConstraintBase.distancePropertyKey: - return (object as DistanceConstraintBase).distance; case TransformComponentConstraintBase.copyFactorPropertyKey: return (object as TransformComponentConstraintBase).copyFactor; case TransformComponentConstraintBase.minValuePropertyKey: @@ -3182,8 +3162,6 @@ class RiveCoreContext { return (object as LinearGradientBase).endY; case LinearGradientBase.opacityPropertyKey: return (object as LinearGradientBase).opacity; - case GradientStopBase.positionPropertyKey: - return (object as GradientStopBase).position; case TrimPathBase.startPropertyKey: return (object as TrimPathBase).start; case TrimPathBase.endPropertyKey: @@ -3210,8 +3188,6 @@ class RiveCoreContext { return (object as RectangleBase).cornerRadiusBL; case RectangleBase.cornerRadiusBRPropertyKey: return (object as RectangleBase).cornerRadiusBR; - case CubicMirroredVertexBase.distancePropertyKey: - return (object as CubicMirroredVertexBase).distance; case PolygonBase.cornerRadiusPropertyKey: return (object as PolygonBase).cornerRadius; case StarBase.innerRadiusPropertyKey: @@ -4389,19 +4365,6 @@ class RiveCoreContext { /// STOKANAL-FORK-EDIT static void setDouble(Core object, int propertyKey, double value) { - // reordered switch to allow for more frequent in the beginning - switch (propertyKey) { - case DistanceConstraintBase.distancePropertyKey: - (object as DistanceConstraintBase).distance = value; - return; - case CubicMirroredVertexBase.distancePropertyKey: - (object as CubicMirroredVertexBase).distance = value; - return; - case GradientStopBase.positionPropertyKey: - (object as GradientStopBase).position = value; - return; - } - switch (propertyKey) { case ViewModelInstanceNumberBase.propertyValuePropertyKey: if (object is ViewModelInstanceNumberBase) { diff --git a/lib/src/rive_core/animation/keyframe_double.dart b/lib/src/rive_core/animation/keyframe_double.dart index c1481343..25a41b6d 100644 --- a/lib/src/rive_core/animation/keyframe_double.dart +++ b/lib/src/rive_core/animation/keyframe_double.dart @@ -17,8 +17,13 @@ class KeyFrameDouble extends KeyFrameDoubleBase { K? clone() => this as K; @override - void apply(Core object, PropertyBean bean, double mix) => - bean.transformDouble(object, (v) => mix == 1 ? value_ : v * (1.0 - mix) + value_ * mix); + void apply(Core object, PropertyBean bean, double mix) { + if (mix == 1) { + bean.setDouble(object, value_); + } else { + bean.transformDouble(object, (v) => v * (1.0 - mix) + value_ * mix); + } + } @override void applyInterpolation(Core object, PropertyBean bean, From 42e46ec21de882bfa219a3882a2510df686a047c Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sat, 15 Feb 2025 18:13:42 +0000 Subject: [PATCH 25/50] rive_core_context refactor done --- .../interpolating_keyframe_base.dart | 38 +-- .../animation/keyed_object_base.dart | 39 +-- .../generated/animation/keyframe_base.dart | 39 +-- .../animation/keyframe_double_base.dart | 39 +-- lib/src/generated/node_base.dart | 32 +-- lib/src/generated/rive_core_beans.dart | 236 +++--------------- lib/src/generated/rive_core_context.dart | 26 -- .../shapes/cubic_asymmetric_vertex_base.dart | 32 +-- .../shapes/cubic_detached_vertex_base.dart | 64 ++--- lib/src/generated/shapes/vertex_base.dart | 32 +-- .../animation/animation_reset_factory.dart | 2 +- .../animation/interpolating_keyframe.dart | 4 +- lib/src/rive_core/animation/keyed_object.dart | 4 +- lib/src/rive_core/animation/keyframe.dart | 4 +- .../rive_core/animation/keyframe_double.dart | 12 +- 15 files changed, 227 insertions(+), 376 deletions(-) diff --git a/lib/src/generated/animation/interpolating_keyframe_base.dart b/lib/src/generated/animation/interpolating_keyframe_base.dart index 59f761e8..be12a799 100644 --- a/lib/src/generated/animation/interpolating_keyframe_base.dart +++ b/lib/src/generated/animation/interpolating_keyframe_base.dart @@ -17,27 +17,31 @@ abstract class InterpolatingKeyFrameBase extends KeyFrame { /// InterpolationType field with key 68. static const int interpolationTypePropertyKey = 68; static const int interpolationTypeInitialValue = 0; - int _interpolationType = interpolationTypeInitialValue; /// The type of interpolation index in KeyframeInterpolation applied to this /// keyframe. - int get interpolationType => _interpolationType; + @nonVirtual + int interpolationType = interpolationTypeInitialValue; - /// Change the [_interpolationType] field value. - /// [interpolationTypeChanged] will be invoked only if the field's value has - /// changed. - set interpolationType(int value) { - if (_interpolationType == value) { - return; - } - int from = _interpolationType; - _interpolationType = value; - if (hasValidated) { - interpolationTypeChanged(from, value); - } - } + // /// The type of interpolation index in KeyframeInterpolation applied to this + // /// keyframe. + // int get interpolationType => _interpolationType; + // + // /// Change the [_interpolationType] field value. + // /// [interpolationTypeChanged] will be invoked only if the field's value has + // /// changed. + // set interpolationType(int value) { + // if (_interpolationType == value) { + // return; + // } + // int from = _interpolationType; + // _interpolationType = value; + // if (hasValidated) { + // interpolationTypeChanged(from, value); + // } + // } - void interpolationTypeChanged(int from, int to); + // void interpolationTypeChanged(int from, int to); /// -------------------------------------------------------------------------- /// InterpolatorId field with key 69. @@ -68,7 +72,7 @@ abstract class InterpolatingKeyFrameBase extends KeyFrame { void copy(Core source) { super.copy(source); if (source is InterpolatingKeyFrameBase) { - _interpolationType = source._interpolationType; + interpolationType = source.interpolationType; _interpolatorId = source._interpolatorId; } } diff --git a/lib/src/generated/animation/keyed_object_base.dart b/lib/src/generated/animation/keyed_object_base.dart index e03789dc..d85af7e5 100644 --- a/lib/src/generated/animation/keyed_object_base.dart +++ b/lib/src/generated/animation/keyed_object_base.dart @@ -16,31 +16,34 @@ abstract class KeyedObjectBase extends Core { /// ObjectId field with key 51. static const int objectIdPropertyKey = 51; static const int objectIdInitialValue = 0; - int _objectId = objectIdInitialValue; /// Identifier used to track the object that is keyed. - int get objectId => _objectId; - - /// Change the [_objectId] field value. - /// [objectIdChanged] will be invoked only if the field's value has changed. - set objectId(int value) { - if (_objectId == value) { - return; - } - int from = _objectId; - _objectId = value; - if (hasValidated) { - objectIdChanged(from, value); - } - } - - void objectIdChanged(int from, int to); + @nonVirtual + int objectId = objectIdInitialValue; + + // /// Identifier used to track the object that is keyed. + // int get objectId => _objectId; + // + // /// Change the [_objectId] field value. + // /// [objectIdChanged] will be invoked only if the field's value has changed. + // set objectId(int value) { + // if (_objectId == value) { + // return; + // } + // int from = _objectId; + // _objectId = value; + // if (hasValidated) { + // objectIdChanged(from, value); + // } + // } + + // void objectIdChanged(int from, int to); @override void copy(Core source) { super.copy(source); if (source is KeyedObjectBase) { - _objectId = source._objectId; + objectId = source.objectId; } } } diff --git a/lib/src/generated/animation/keyframe_base.dart b/lib/src/generated/animation/keyframe_base.dart index 295a1e61..27d149ba 100644 --- a/lib/src/generated/animation/keyframe_base.dart +++ b/lib/src/generated/animation/keyframe_base.dart @@ -14,32 +14,35 @@ abstract class KeyFrameBase extends Core { /// Frame field with key 67. static const int framePropertyKey = 67; static const int frameInitialValue = 0; - int _frame = frameInitialValue; - /// Timecode as frame number can be converted to time by dividing by animation - /// fps. - int get frame => _frame; + /// Timecode as frame number can be converted to time by dividing by animation fps + @nonVirtual + int frame = frameInitialValue; - /// Change the [_frame] field value. - /// [frameChanged] will be invoked only if the field's value has changed. - set frame(int value) { - if (_frame == value) { - return; - } - int from = _frame; - _frame = value; - if (hasValidated) { - frameChanged(from, value); - } - } + // /// Timecode as frame number can be converted to time by dividing by animation + // /// fps. + // int get frame => _frame; + // + // /// Change the [_frame] field value. + // /// [frameChanged] will be invoked only if the field's value has changed. + // set frame(int value) { + // if (_frame == value) { + // return; + // } + // int from = _frame; + // _frame = value; + // if (hasValidated) { + // frameChanged(from, value); + // } + // } - void frameChanged(int from, int to); + // void frameChanged(int from, int to); @override void copy(Core source) { super.copy(source); if (source is KeyFrameBase) { - _frame = source._frame; + frame = source.frame; } } } diff --git a/lib/src/generated/animation/keyframe_double_base.dart b/lib/src/generated/animation/keyframe_double_base.dart index ddc42ad0..34199907 100644 --- a/lib/src/generated/animation/keyframe_double_base.dart +++ b/lib/src/generated/animation/keyframe_double_base.dart @@ -23,30 +23,31 @@ abstract class KeyFrameDoubleBase extends InterpolatingKeyFrame { static const double valueInitialValue = 0; /// STOKANAL-FORK-EDIT: exposing - double value_ = valueInitialValue; - - double get value => value_; - - /// Change the [value_] field value. - /// [valueChanged] will be invoked only if the field's value has changed. - set value(double value) { - if (value_ == value) { - return; - } - double from = value_; - value_ = value; - if (hasValidated) { - valueChanged(from, value); - } - } - - void valueChanged(double from, double to); + @nonVirtual + double value = valueInitialValue; + + // double get value => value_; + // + // /// Change the [value_] field value. + // /// [valueChanged] will be invoked only if the field's value has changed. + // set value(double value) { + // if (value_ == value) { + // return; + // } + // double from = value_; + // value_ = value; + // if (hasValidated) { + // valueChanged(from, value); + // } + // } + + // void valueChanged(double from, double to); @override void copy(Core source) { super.copy(source); if (source is KeyFrameDoubleBase) { - value_ = source.value_; + value = source.value; } } } diff --git a/lib/src/generated/node_base.dart b/lib/src/generated/node_base.dart index f02fe172..b3d16936 100644 --- a/lib/src/generated/node_base.dart +++ b/lib/src/generated/node_base.dart @@ -24,19 +24,21 @@ abstract class NodeBase extends TransformComponent { /// X field with key 13. static const int xPropertyKey = 13; static const double xInitialValue = 0; - double _x = xInitialValue; + double x_ = xInitialValue; @override - double get x => _x; + @nonVirtual + double get x => x_; - /// Change the [_x] field value. + /// Change the [x_] field value. /// [xChanged] will be invoked only if the field's value has changed. @override + @nonVirtual set x(double value) { - if (_x == value) { + if (x_ == value) { return; } - double from = _x; - _x = value; + double from = x_; + x_ = value; if (hasValidated) { xChanged(from, value); } @@ -48,19 +50,21 @@ abstract class NodeBase extends TransformComponent { /// Y field with key 14. static const int yPropertyKey = 14; static const double yInitialValue = 0; - double _y = yInitialValue; + double y_ = yInitialValue; @override - double get y => _y; + @nonVirtual + double get y => y_; - /// Change the [_y] field value. + /// Change the [y_] field value. /// [yChanged] will be invoked only if the field's value has changed. @override + @nonVirtual set y(double value) { - if (_y == value) { + if (y_ == value) { return; } - double from = _y; - _y = value; + double from = y_; + y_ = value; if (hasValidated) { yChanged(from, value); } @@ -72,8 +76,8 @@ abstract class NodeBase extends TransformComponent { void copy(Core source) { super.copy(source); if (source is NodeBase) { - _x = source._x; - _y = source._y; + x_ = source.x_; + y_ = source.y_; } } } diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index ecd28af2..96119dbd 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -1,189 +1,28 @@ import 'package:collection/collection.dart'; import 'package:rive/src/core/core.dart'; -import 'package:rive/src/core/field_types/core_string_type.dart'; -import 'package:rive/src/core/field_types/core_uint_type.dart'; -import 'package:rive/src/generated/animation/advanceable_state_base.dart'; -import 'package:rive/src/generated/animation/blend_animation_base.dart'; -import 'package:rive/src/generated/animation/cubic_ease_interpolator_base.dart'; -import 'package:rive/src/generated/animation/cubic_interpolator_base.dart'; import 'package:rive/src/generated/animation/interpolating_keyframe_base.dart'; import 'package:rive/src/generated/animation/keyframe_base.dart'; -import 'package:rive/src/generated/animation/keyframe_string_base.dart'; -import 'package:rive/src/generated/animation/layer_state_base.dart'; -import 'package:rive/src/generated/animation/listener_input_change_base.dart'; -import 'package:rive/src/generated/animation/nested_input_base.dart'; -import 'package:rive/src/generated/animation/nested_linear_animation_base.dart'; -import 'package:rive/src/generated/animation/state_machine_component_base.dart'; import 'package:rive/src/generated/animation/transition_input_condition_base.dart'; -import 'package:rive/src/generated/animation/transition_value_condition_base.dart'; -import 'package:rive/src/generated/assets/asset_base.dart'; -import 'package:rive/src/generated/assets/drawable_asset_base.dart'; -import 'package:rive/src/generated/assets/export_audio_base.dart'; -import 'package:rive/src/generated/assets/file_asset_base.dart'; import 'package:rive/src/generated/component_base.dart'; -import 'package:rive/src/generated/constraints/constraint_base.dart'; -import 'package:rive/src/generated/constraints/targeted_constraint_base.dart'; -import 'package:rive/src/generated/constraints/transform_component_constraint_base.dart'; -import 'package:rive/src/generated/constraints/transform_component_constraint_y_base.dart'; -import 'package:rive/src/generated/constraints/transform_space_constraint_base.dart'; -import 'package:rive/src/generated/data_bind/converters/data_converter_base.dart'; -import 'package:rive/src/generated/drawable_base.dart'; -import 'package:rive/src/generated/nested_animation_base.dart'; -import 'package:rive/src/generated/shapes/paint/shape_paint_base.dart'; -import 'package:rive/src/generated/shapes/parametric_path_base.dart'; -import 'package:rive/src/generated/shapes/path_base.dart'; import 'package:rive/src/generated/shapes/vertex_base.dart'; import 'package:rive/src/generated/transform_component_base.dart'; -import 'package:rive/src/generated/viewmodel/viewmodel_instance_value_base.dart'; import 'package:rive/src/generated/world_transform_component_base.dart'; -import 'package:rive/src/rive_core/animation/animation.dart'; -import 'package:rive/src/rive_core/animation/animation_state.dart'; -import 'package:rive/src/rive_core/animation/any_state.dart'; -import 'package:rive/src/rive_core/animation/blend_animation_1d.dart'; -import 'package:rive/src/rive_core/animation/blend_animation_direct.dart'; -import 'package:rive/src/rive_core/animation/blend_state_1d.dart'; -import 'package:rive/src/rive_core/animation/blend_state_direct.dart'; -import 'package:rive/src/rive_core/animation/blend_state_transition.dart'; -import 'package:rive/src/rive_core/animation/cubic_ease_interpolator.dart'; -import 'package:rive/src/rive_core/animation/cubic_interpolator_component.dart'; -import 'package:rive/src/rive_core/animation/cubic_value_interpolator.dart'; -import 'package:rive/src/rive_core/animation/elastic_interpolator.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/keyed_object.dart'; import 'package:rive/src/rive_core/animation/keyed_property.dart'; -import 'package:rive/src/rive_core/animation/keyframe_bool.dart'; -import 'package:rive/src/rive_core/animation/keyframe_callback.dart'; -import 'package:rive/src/rive_core/animation/keyframe_color.dart'; import 'package:rive/src/rive_core/animation/keyframe_double.dart'; -import 'package:rive/src/rive_core/animation/keyframe_id.dart'; -import 'package:rive/src/rive_core/animation/keyframe_string.dart'; -import 'package:rive/src/rive_core/animation/keyframe_uint.dart'; -import 'package:rive/src/rive_core/animation/linear_animation.dart'; -import 'package:rive/src/rive_core/animation/listener_align_target.dart'; -import 'package:rive/src/rive_core/animation/listener_bool_change.dart'; -import 'package:rive/src/rive_core/animation/listener_fire_event.dart'; -import 'package:rive/src/rive_core/animation/listener_number_change.dart'; -import 'package:rive/src/rive_core/animation/listener_trigger_change.dart'; -import 'package:rive/src/rive_core/animation/listener_viewmodel_change.dart'; -import 'package:rive/src/rive_core/animation/nested_bool.dart'; -import 'package:rive/src/rive_core/animation/nested_number.dart'; -import 'package:rive/src/rive_core/animation/nested_remap_animation.dart'; -import 'package:rive/src/rive_core/animation/nested_simple_animation.dart'; -import 'package:rive/src/rive_core/animation/nested_state_machine.dart'; -import 'package:rive/src/rive_core/animation/nested_trigger.dart'; -import 'package:rive/src/rive_core/animation/state_machine.dart'; -import 'package:rive/src/rive_core/animation/state_machine_bool.dart'; -import 'package:rive/src/rive_core/animation/state_machine_fire_event.dart'; -import 'package:rive/src/rive_core/animation/state_machine_layer.dart'; -import 'package:rive/src/rive_core/animation/state_machine_listener.dart'; -import 'package:rive/src/rive_core/animation/state_machine_number.dart'; -import 'package:rive/src/rive_core/animation/state_machine_trigger.dart'; -import 'package:rive/src/rive_core/animation/state_transition.dart'; -import 'package:rive/src/rive_core/animation/transition_bool_condition.dart'; -import 'package:rive/src/rive_core/animation/transition_number_condition.dart'; -import 'package:rive/src/rive_core/animation/transition_property_viewmodel_comparator.dart'; -import 'package:rive/src/rive_core/animation/transition_trigger_condition.dart'; -import 'package:rive/src/rive_core/animation/transition_value_boolean_comparator.dart'; -import 'package:rive/src/rive_core/animation/transition_value_color_comparator.dart'; -import 'package:rive/src/rive_core/animation/transition_value_enum_comparator.dart'; -import 'package:rive/src/rive_core/animation/transition_value_number_comparator.dart'; -import 'package:rive/src/rive_core/animation/transition_value_string_comparator.dart'; -import 'package:rive/src/rive_core/animation/transition_viewmodel_condition.dart'; -import 'package:rive/src/rive_core/artboard.dart'; -import 'package:rive/src/rive_core/assets/audio_asset.dart'; -import 'package:rive/src/rive_core/assets/file_asset_contents.dart'; -import 'package:rive/src/rive_core/assets/folder.dart'; -import 'package:rive/src/rive_core/assets/font_asset.dart'; -import 'package:rive/src/rive_core/assets/image_asset.dart'; -import 'package:rive/src/rive_core/audio_event.dart'; -import 'package:rive/src/rive_core/backboard.dart'; -import 'package:rive/src/rive_core/bones/bone.dart'; -import 'package:rive/src/rive_core/bones/cubic_weight.dart'; -import 'package:rive/src/rive_core/bones/root_bone.dart'; -import 'package:rive/src/rive_core/bones/skin.dart'; -import 'package:rive/src/rive_core/bones/tendon.dart'; -import 'package:rive/src/rive_core/bones/weight.dart'; import 'package:rive/src/rive_core/constraints/distance_constraint.dart'; -import 'package:rive/src/rive_core/constraints/follow_path_constraint.dart'; -import 'package:rive/src/rive_core/constraints/ik_constraint.dart'; -import 'package:rive/src/rive_core/constraints/rotation_constraint.dart'; -import 'package:rive/src/rive_core/constraints/scale_constraint.dart'; -import 'package:rive/src/rive_core/constraints/transform_constraint.dart'; -import 'package:rive/src/rive_core/constraints/translation_constraint.dart'; -import 'package:rive/src/rive_core/custom_property_boolean.dart'; -import 'package:rive/src/rive_core/custom_property_number.dart'; -import 'package:rive/src/rive_core/custom_property_string.dart'; -import 'package:rive/src/rive_core/data_bind/bindable_property_boolean.dart'; -import 'package:rive/src/rive_core/data_bind/bindable_property_color.dart'; -import 'package:rive/src/rive_core/data_bind/bindable_property_enum.dart'; -import 'package:rive/src/rive_core/data_bind/bindable_property_number.dart'; -import 'package:rive/src/rive_core/data_bind/bindable_property_string.dart'; -import 'package:rive/src/rive_core/data_bind/data_bind.dart'; -import 'package:rive/src/rive_core/data_bind/data_bind_context.dart'; import 'package:rive/src/rive_core/draw_rules.dart'; -import 'package:rive/src/rive_core/draw_target.dart'; -import 'package:rive/src/rive_core/event.dart'; -import 'package:rive/src/rive_core/joystick.dart'; -import 'package:rive/src/rive_core/layout/layout_component_style.dart'; -import 'package:rive/src/rive_core/layout_component.dart'; -import 'package:rive/src/rive_core/nested_artboard.dart'; import 'package:rive/src/rive_core/node.dart'; -import 'package:rive/src/rive_core/open_url_event.dart'; -import 'package:rive/src/rive_core/shapes/clipping_shape.dart'; -import 'package:rive/src/rive_core/shapes/contour_mesh_vertex.dart'; import 'package:rive/src/rive_core/shapes/cubic_asymmetric_vertex.dart'; import 'package:rive/src/rive_core/shapes/cubic_detached_vertex.dart'; import 'package:rive/src/rive_core/shapes/cubic_mirrored_vertex.dart'; -import 'package:rive/src/rive_core/shapes/ellipse.dart'; -import 'package:rive/src/rive_core/shapes/image.dart'; -import 'package:rive/src/rive_core/shapes/mesh.dart'; -import 'package:rive/src/rive_core/shapes/mesh_vertex.dart'; -import 'package:rive/src/rive_core/shapes/paint/fill.dart'; import 'package:rive/src/rive_core/shapes/paint/gradient_stop.dart'; -import 'package:rive/src/rive_core/shapes/paint/linear_gradient.dart'; -import 'package:rive/src/rive_core/shapes/paint/radial_gradient.dart'; import 'package:rive/src/rive_core/shapes/paint/solid_color.dart'; import 'package:rive/src/rive_core/shapes/paint/stroke.dart'; -import 'package:rive/src/rive_core/shapes/paint/trim_path.dart'; -import 'package:rive/src/rive_core/shapes/points_path.dart'; -import 'package:rive/src/rive_core/shapes/polygon.dart'; -import 'package:rive/src/rive_core/shapes/rectangle.dart'; -import 'package:rive/src/rive_core/shapes/shape.dart'; -import 'package:rive/src/rive_core/shapes/star.dart'; import 'package:rive/src/rive_core/shapes/straight_vertex.dart'; -import 'package:rive/src/rive_core/shapes/triangle.dart'; import 'package:rive/src/rive_core/solo.dart'; -import 'package:rive/src/rive_core/text/text.dart'; -import 'package:rive/src/rive_core/text/text_modifier_group.dart'; -import 'package:rive/src/rive_core/text/text_modifier_range.dart'; -import 'package:rive/src/rive_core/text/text_style.dart'; -import 'package:rive/src/rive_core/text/text_style_axis.dart'; -import 'package:rive/src/rive_core/text/text_style_feature.dart'; -import 'package:rive/src/rive_core/text/text_value_run.dart'; -import 'package:rive/src/rive_core/text/text_variation_modifier.dart'; -import 'package:rive/src/rive_core/viewmodel/data_enum.dart'; -import 'package:rive/src/rive_core/viewmodel/data_enum_value.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_component.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_boolean.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_color.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_enum.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_list.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_list_item.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_number.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_string.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_instance_viewmodel.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_property.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_property_boolean.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_property_color.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_property_enum.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_property_list.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_property_number.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_property_string.dart'; -import 'package:rive/src/rive_core/viewmodel/viewmodel_property_viewmodel.dart'; import 'package:stokanal/logging.dart'; + import '../core/field_types/core_field_type.dart'; class PropertyBean { @@ -301,89 +140,94 @@ class FallbackBean extends PropertyBean { FallbackBean._(super.propertyKey): super._(); - int hits = 0; - bool dumped = false; + int _hits = 0; + + // uncomment me to dump stats + // bool dumped = false; + // int get hits => _hits; + // set hits(int hits) { + // _hits = hits; + // if (_hits >= 1000 && !dumped) { + // dumped = true; + // PropertyBeans._dumpFallbacks(); + // } + // } @override bool getBool(Core o) { - hits++; + // hits++; return RiveCoreContext.getBool(o, propertyKey); } @override void setBool(Core o, bool v) { - hits++; + // hits++; RiveCoreContext.setBool(o, propertyKey, v); } @override double getDouble(Core o) { - hits++; + // hits++; return RiveCoreContext.getDouble(o, propertyKey); } @override void setDouble(Core o, double v) { - hits++; + // hits++; RiveCoreContext.setDouble(o, propertyKey, v); - - if (hits >= 10000 && !dumped) { - dumped = true; - PropertyBeans._dumpFallbacks(); - } } @override int getColor(Core o) { - hits++; + // hits++; return RiveCoreContext.getColor(o, propertyKey); } @override void setColor(Core o, int v) { - hits++; + // hits++; RiveCoreContext.setColor(o, propertyKey, v); } @override int getUint(Core o) { - hits++; + // hits++; return RiveCoreContext.getUint(o, propertyKey); } @override void setUint(Core o, int v) { - hits++; + // hits++; RiveCoreContext.setUint(o, propertyKey, v); } @override String getString(Core o) { - hits++; + // hits++; return RiveCoreContext.getString(o, propertyKey); } @override void setString(Core o, String v) { - hits++; + // hits++; RiveCoreContext.setString(o, propertyKey, v); } @override void setObjectProperty(Core o, Object v) { - hits++; + // hits++; RiveCoreContext.setObjectProperty(o, propertyKey, v); } @override CoreFieldType? get coreType { - hits++; + // hits++; return RiveCoreContext.coreType(propertyKey); } @override void setCallback(Core o, CallbackData v) { - hits++; + // hits++; RiveCoreContext.setCallback(o, propertyKey, v); } @override - String toString() => 'FallbackBean[$propertyKey, $hits]'; + String toString() => 'FallbackBean[$propertyKey, $_hits]'; } final _map = {}; @@ -391,20 +235,20 @@ final _invalid = PropertyBean._(CoreContext.invalidPropertyKey); var _first = true; final _implements = [ _invalid, - DoublePropertyBean._(NodeBase.xPropertyKey, (o) => o.x, (o, v) => o.x = v), - DoublePropertyBean._(NodeBase.yPropertyKey, (o) => o.y, (o, v) => o.y = v), - DoublePropertyBean._(VertexBase.xPropertyKey, (o) => o.x, (o, v) => o.x = v), - DoublePropertyBean._(VertexBase.yPropertyKey, (o) => o.y, (o, v) => o.y = v), - DoublePropertyBean._(CubicDetachedVertexBase.outRotationPropertyKey, (o) => o.outRotation, (o, v) => o.outRotation = v), - DoublePropertyBean._(CubicDetachedVertexBase.outDistancePropertyKey, (o) => o.outDistance, (o, v) => o.outDistance = v), - DoublePropertyBean._(CubicDetachedVertexBase.inRotationPropertyKey, (o) => o.inRotation, (o, v) => o.inRotation = v), - DoublePropertyBean._(CubicDetachedVertexBase.inDistancePropertyKey, (o) => o.inDistance, (o, v) => o.inDistance = v), - DoublePropertyBean._(CubicAsymmetricVertexBase.inDistancePropertyKey, (o) => o.inDistance, (o, v) => o.inDistance = v), - DoublePropertyBean._(CubicAsymmetricVertexBase.rotationPropertyKey, (o) => o.rotation, (o, v) => o.rotation = v), + DoublePropertyBean._(NodeBase.xPropertyKey, (o) => o.x_, (o, v) => o.x = v), + DoublePropertyBean._(NodeBase.yPropertyKey, (o) => o.y_, (o, v) => o.y = v), + DoublePropertyBean._(VertexBase.xPropertyKey, (o) => o.x_, (o, v) => o.x = v), + DoublePropertyBean._(VertexBase.yPropertyKey, (o) => o.y_, (o, v) => o.y = v), + DoublePropertyBean._(CubicDetachedVertexBase.outRotationPropertyKey, (o) => o.outRotation_, (o, v) => o.outRotation = v), + DoublePropertyBean._(CubicDetachedVertexBase.outDistancePropertyKey, (o) => o.outDistance_, (o, v) => o.outDistance = v), + DoublePropertyBean._(CubicDetachedVertexBase.inRotationPropertyKey, (o) => o.inRotation_, (o, v) => o.inRotation = v), + DoublePropertyBean._(CubicDetachedVertexBase.inDistancePropertyKey, (o) => o.inDistance_, (o, v) => o.inDistance = v), + DoublePropertyBean._(CubicAsymmetricVertexBase.inDistancePropertyKey, (o) => o.inDistance_, (o, v) => o.inDistance = v), + DoublePropertyBean._(CubicAsymmetricVertexBase.rotationPropertyKey, (o) => o.rotation_, (o, v) => o.rotation = v), DoublePropertyBean._(TransformComponentBase.scaleXPropertyKey, (o) => o.scaleX, (o, v) => o.scaleX = v), DoublePropertyBean._(TransformComponentBase.scaleYPropertyKey, (o) => o.scaleY, (o, v) => o.scaleY = v), DoublePropertyBean._(TransformComponentBase.rotationPropertyKey, (o) => o.rotation, (o, v) => o.rotation = v), - DoublePropertyBean._(KeyFrameDoubleBase.valuePropertyKey, (o) => o.value_, (o, v) => o.value_ = v), + DoublePropertyBean._(KeyFrameDoubleBase.valuePropertyKey, (o) => o.value, (o, v) => o.value = v), DoublePropertyBean._(WorldTransformComponentBase.opacityPropertyKey, (o) => o.opacity, (o, v) => o.opacity = v), UintPropertyBean._(InterpolatingKeyFrameBase.interpolatorIdPropertyKey, (o) => o.interpolatorId, (o, v) => o.interpolatorId = v), UintPropertyBean._(KeyedPropertyBase.propertyKeyPropertyKey, (o) => o.propertyKey, (o, v) => o.propertyKey = v), @@ -423,6 +267,8 @@ final _implements = [ DoublePropertyBean._(DistanceConstraintBase.distancePropertyKey, (o) => o.distance, (o, v) => o.distance = v), DoublePropertyBean._(CubicMirroredVertexBase.distancePropertyKey, (o) => o.distance, (o, v) => o.distance = v), DoublePropertyBean._(GradientStopBase.positionPropertyKey, (o) => o.position, (o, v) => o.position = v), + ColorPropertyBean._(GradientStopBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), + UintPropertyBean._(TransitionInputConditionBase.inputIdPropertyKey, (o) => o.inputId, (o, v) => o.inputId = v), ]; // ignore: avoid_classes_with_only_static_members @@ -441,6 +287,6 @@ abstract class PropertyBeans { } static void _dumpFallbacks() { - info('\n${_map.values.whereType().sorted((b1, b2) => b2.hits.compareTo(b1.hits)).map((b) => '$b').join('\n')}'); + info('\n${_map.values.whereType().sorted((b1, b2) => b2._hits.compareTo(b1._hits)).map((b) => '$b').join('\n')}'); } } \ No newline at end of file diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart index 7abb1400..47363552 100644 --- a/lib/src/generated/rive_core_context.dart +++ b/lib/src/generated/rive_core_context.dart @@ -16,7 +16,6 @@ import 'package:rive/src/generated/animation/listener_input_change_base.dart'; import 'package:rive/src/generated/animation/nested_input_base.dart'; import 'package:rive/src/generated/animation/nested_linear_animation_base.dart'; import 'package:rive/src/generated/animation/state_machine_component_base.dart'; -import 'package:rive/src/generated/animation/transition_input_condition_base.dart'; import 'package:rive/src/generated/animation/transition_value_condition_base.dart'; import 'package:rive/src/generated/assets/asset_base.dart'; import 'package:rive/src/generated/assets/drawable_asset_base.dart'; @@ -1248,11 +1247,6 @@ class RiveCoreContext { object.y2 = value; } break; - case TransitionInputConditionBase.inputIdPropertyKey: - if (object is TransitionInputConditionBase && value is int) { - object.inputId = value; - } - break; case StateMachineListenerBase.targetIdPropertyKey: if (object is StateMachineListenerBase && value is int) { object.targetId = value; @@ -1518,11 +1512,6 @@ class RiveCoreContext { object.transformAffectsStroke = value; } break; - case GradientStopBase.colorValuePropertyKey: - if (object is GradientStopBase && value is int) { - object.colorValue = value; - } - break; case TrimPathBase.startPropertyKey: if (object is TrimPathBase && value is double) { object.start = value; @@ -2343,7 +2332,6 @@ class RiveCoreContext { case BlendAnimationBase.animationIdPropertyKey: case BlendAnimationDirectBase.inputIdPropertyKey: case BlendAnimationDirectBase.blendSourcePropertyKey: - case TransitionInputConditionBase.inputIdPropertyKey: case StateMachineListenerBase.targetIdPropertyKey: case StateMachineListenerBase.listenerTypeValuePropertyKey: case StateMachineListenerBase.eventIdPropertyKey: @@ -2419,7 +2407,6 @@ class RiveCoreContext { case ViewModelInstanceColorBase.propertyValuePropertyKey: case KeyFrameColorBase.valuePropertyKey: case TransitionValueColorComparatorBase.valuePropertyKey: - case GradientStopBase.colorValuePropertyKey: case BindablePropertyColorBase.propertyValuePropertyKey: return colorType; case ViewModelComponentBase.namePropertyKey: @@ -2821,8 +2808,6 @@ class RiveCoreContext { return (object as BlendAnimationDirectBase).inputId; case BlendAnimationDirectBase.blendSourcePropertyKey: return (object as BlendAnimationDirectBase).blendSource; - case TransitionInputConditionBase.inputIdPropertyKey: - return (object as TransitionInputConditionBase).inputId; case StateMachineListenerBase.targetIdPropertyKey: return (object as StateMachineListenerBase).targetId; case StateMachineListenerBase.listenerTypeValuePropertyKey: @@ -2976,8 +2961,6 @@ class RiveCoreContext { return (object as KeyFrameColorBase).value; case TransitionValueColorComparatorBase.valuePropertyKey: return (object as TransitionValueColorComparatorBase).value; - case GradientStopBase.colorValuePropertyKey: - return (object as GradientStopBase).colorValue; case BindablePropertyColorBase.propertyValuePropertyKey: return (object as BindablePropertyColorBase).propertyValue; } @@ -3891,11 +3874,6 @@ class RiveCoreContext { object.blendSource = value; } break; - case TransitionInputConditionBase.inputIdPropertyKey: - if (object is TransitionInputConditionBase) { - object.inputId = value; - } - break; case StateMachineListenerBase.targetIdPropertyKey: if (object is StateMachineListenerBase) { object.targetId = value; @@ -4254,10 +4232,6 @@ class RiveCoreContext { // reordered switch (propertyKey) { - case GradientStopBase.colorValuePropertyKey: - (object as GradientStopBase).colorValue = value; - return; - case ViewModelInstanceColorBase.propertyValuePropertyKey: if (object is ViewModelInstanceColorBase) { object.propertyValue = value; diff --git a/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart b/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart index 216364bd..930dfe59 100644 --- a/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart +++ b/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart @@ -27,19 +27,21 @@ abstract class CubicAsymmetricVertexBase extends CubicVertex { /// Rotation field with key 79. static const int rotationPropertyKey = 79; static const double rotationInitialValue = 0; - double _rotation = rotationInitialValue; + double rotation_ = rotationInitialValue; /// The control points' angle. - double get rotation => _rotation; + @nonVirtual + double get rotation => rotation_; - /// Change the [_rotation] field value. + /// Change the [rotation_] field value. /// [rotationChanged] will be invoked only if the field's value has changed. + @nonVirtual set rotation(double value) { - if (_rotation == value) { + if (rotation_ == value) { return; } - double from = _rotation; - _rotation = value; + double from = rotation_; + rotation_ = value; if (hasValidated) { rotationChanged(from, value); } @@ -51,19 +53,21 @@ abstract class CubicAsymmetricVertexBase extends CubicVertex { /// InDistance field with key 80. static const int inDistancePropertyKey = 80; static const double inDistanceInitialValue = 0; - double _inDistance = inDistanceInitialValue; + double inDistance_ = inDistanceInitialValue; /// The in point's distance from the translation of the point. - double get inDistance => _inDistance; + @nonVirtual + double get inDistance => inDistance_; - /// Change the [_inDistance] field value. + /// Change the [inDistance_] field value. /// [inDistanceChanged] will be invoked only if the field's value has changed. + @nonVirtual set inDistance(double value) { - if (_inDistance == value) { + if (inDistance_ == value) { return; } - double from = _inDistance; - _inDistance = value; + double from = inDistance_; + inDistance_ = value; if (hasValidated) { inDistanceChanged(from, value); } @@ -100,8 +104,8 @@ abstract class CubicAsymmetricVertexBase extends CubicVertex { void copy(Core source) { super.copy(source); if (source is CubicAsymmetricVertexBase) { - _rotation = source._rotation; - _inDistance = source._inDistance; + rotation_ = source.rotation_; + inDistance_ = source.inDistance_; _outDistance = source._outDistance; } } diff --git a/lib/src/generated/shapes/cubic_detached_vertex_base.dart b/lib/src/generated/shapes/cubic_detached_vertex_base.dart index 8e44fc9e..0abd4198 100644 --- a/lib/src/generated/shapes/cubic_detached_vertex_base.dart +++ b/lib/src/generated/shapes/cubic_detached_vertex_base.dart @@ -27,19 +27,21 @@ abstract class CubicDetachedVertexBase extends CubicVertex { /// InRotation field with key 84. static const int inRotationPropertyKey = 84; static const double inRotationInitialValue = 0; - double _inRotation = inRotationInitialValue; + double inRotation_ = inRotationInitialValue; /// The in point's angle. - double get inRotation => _inRotation; + @nonVirtual + double get inRotation => inRotation_; - /// Change the [_inRotation] field value. + /// Change the [inRotation_] field value. /// [inRotationChanged] will be invoked only if the field's value has changed. + @nonVirtual set inRotation(double value) { - if (_inRotation == value) { + if (inRotation_ == value) { return; } - double from = _inRotation; - _inRotation = value; + double from = inRotation_; + inRotation_ = value; if (hasValidated) { inRotationChanged(from, value); } @@ -51,19 +53,21 @@ abstract class CubicDetachedVertexBase extends CubicVertex { /// InDistance field with key 85. static const int inDistancePropertyKey = 85; static const double inDistanceInitialValue = 0; - double _inDistance = inDistanceInitialValue; + double inDistance_ = inDistanceInitialValue; /// The in point's distance from the translation of the point. - double get inDistance => _inDistance; + @nonVirtual + double get inDistance => inDistance_; - /// Change the [_inDistance] field value. + /// Change the [inDistance_] field value. /// [inDistanceChanged] will be invoked only if the field's value has changed. + @nonVirtual set inDistance(double value) { - if (_inDistance == value) { + if (inDistance_ == value) { return; } - double from = _inDistance; - _inDistance = value; + double from = inDistance_; + inDistance_ = value; if (hasValidated) { inDistanceChanged(from, value); } @@ -75,20 +79,22 @@ abstract class CubicDetachedVertexBase extends CubicVertex { /// OutRotation field with key 86. static const int outRotationPropertyKey = 86; static const double outRotationInitialValue = 0; - double _outRotation = outRotationInitialValue; + double outRotation_ = outRotationInitialValue; /// The out point's angle. - double get outRotation => _outRotation; + @nonVirtual + double get outRotation => outRotation_; - /// Change the [_outRotation] field value. + /// Change the [outRotation_] field value. /// [outRotationChanged] will be invoked only if the field's value has /// changed. + @nonVirtual set outRotation(double value) { - if (_outRotation == value) { + if (outRotation_ == value) { return; } - double from = _outRotation; - _outRotation = value; + double from = outRotation_; + outRotation_ = value; if (hasValidated) { outRotationChanged(from, value); } @@ -100,20 +106,22 @@ abstract class CubicDetachedVertexBase extends CubicVertex { /// OutDistance field with key 87. static const int outDistancePropertyKey = 87; static const double outDistanceInitialValue = 0; - double _outDistance = outDistanceInitialValue; + double outDistance_ = outDistanceInitialValue; /// The out point's distance from the translation of the point. - double get outDistance => _outDistance; + @nonVirtual + double get outDistance => outDistance_; - /// Change the [_outDistance] field value. + /// Change the [outDistance_] field value. /// [outDistanceChanged] will be invoked only if the field's value has /// changed. + @nonVirtual set outDistance(double value) { - if (_outDistance == value) { + if (outDistance_ == value) { return; } - double from = _outDistance; - _outDistance = value; + double from = outDistance_; + outDistance_ = value; if (hasValidated) { outDistanceChanged(from, value); } @@ -125,10 +133,10 @@ abstract class CubicDetachedVertexBase extends CubicVertex { void copy(Core source) { super.copy(source); if (source is CubicDetachedVertexBase) { - _inRotation = source._inRotation; - _inDistance = source._inDistance; - _outRotation = source._outRotation; - _outDistance = source._outDistance; + inRotation_ = source.inRotation_; + inDistance_ = source.inDistance_; + outRotation_ = source.outRotation_; + outDistance_ = source.outDistance_; } } } diff --git a/lib/src/generated/shapes/vertex_base.dart b/lib/src/generated/shapes/vertex_base.dart index f0185db3..230e4cd6 100644 --- a/lib/src/generated/shapes/vertex_base.dart +++ b/lib/src/generated/shapes/vertex_base.dart @@ -21,19 +21,21 @@ abstract class VertexBase extends ContainerComponent { static const int xPropertyKey = 24; static const double xInitialValue = 0; - double _x = xInitialValue; + double x_ = xInitialValue; /// X value for the translation of the vertex. - double get x => _x; + @nonVirtual + double get x => x_; - /// Change the [_x] field value. + /// Change the [x_] field value. /// [xChanged] will be invoked only if the field's value has changed. + @nonVirtual set x(double value) { - if (_x == value) { + if (x_ == value) { return; } - double from = _x; - _x = value; + double from = x_; + x_ = value; if (hasValidated) { xChanged(from, value); } @@ -46,19 +48,21 @@ abstract class VertexBase extends ContainerComponent { static const int yPropertyKey = 25; static const double yInitialValue = 0; - double _y = yInitialValue; + double y_ = yInitialValue; /// Y value for the translation of the vertex. - double get y => _y; + @nonVirtual + double get y => y_; - /// Change the [_y] field value. + /// Change the [y_] field value. /// [yChanged] will be invoked only if the field's value has changed. + @nonVirtual set y(double value) { - if (_y == value) { + if (y_ == value) { return; } - double from = _y; - _y = value; + double from = y_; + y_ = value; if (hasValidated) { yChanged(from, value); } @@ -70,8 +74,8 @@ abstract class VertexBase extends ContainerComponent { void copy(Core source) { super.copy(source); if (source is VertexBase) { - _x = source._x; - _y = source._y; + x_ = source.x_; + y_ = source.y_; } } } diff --git a/lib/src/rive_core/animation/animation_reset_factory.dart b/lib/src/rive_core/animation/animation_reset_factory.dart index 87d76ce1..3bdba438 100644 --- a/lib/src/rive_core/animation/animation_reset_factory.dart +++ b/lib/src/rive_core/animation/animation_reset_factory.dart @@ -212,7 +212,7 @@ class _AnimationsData { animationReset.writePropertyKey(property.propertyKey); if (property.isBaseline) { animationReset.writeDouble( - (property.property.keyframes.first as KeyFrameDouble).value_); + (property.property.keyframes.first as KeyFrameDouble).value); } else { // animationReset.writeDouble(RiveCoreContext.getDouble( diff --git a/lib/src/rive_core/animation/interpolating_keyframe.dart b/lib/src/rive_core/animation/interpolating_keyframe.dart index a9851f17..4ab0058e 100644 --- a/lib/src/rive_core/animation/interpolating_keyframe.dart +++ b/lib/src/rive_core/animation/interpolating_keyframe.dart @@ -18,8 +18,8 @@ abstract class InterpolatingKeyFrame extends InterpolatingKeyFrameBase { interpolationType = value.index; } - @override - void interpolationTypeChanged(int from, int to) {} + // @override + // void interpolationTypeChanged(int from, int to) {} Interpolator? _interpolator; Interpolator? get interpolator => _interpolator; diff --git a/lib/src/rive_core/animation/keyed_object.dart b/lib/src/rive_core/animation/keyed_object.dart index 0792ffe2..a711267b 100644 --- a/lib/src/rive_core/animation/keyed_object.dart +++ b/lib/src/rive_core/animation/keyed_object.dart @@ -129,8 +129,8 @@ class KeyedObject extends KeyedObjectBase { // } } - @override - void objectIdChanged(int from, int to) {} + // @override + // void objectIdChanged(int from, int to) {} @override bool import(ImportStack stack) { diff --git a/lib/src/rive_core/animation/keyframe.dart b/lib/src/rive_core/animation/keyframe.dart index 5d0b2585..4e476f56 100644 --- a/lib/src/rive_core/animation/keyframe.dart +++ b/lib/src/rive_core/animation/keyframe.dart @@ -27,8 +27,8 @@ abstract class KeyFrame extends KeyFrameBase @override void onAddedDirty() {} - @override - void frameChanged(int from, int to) {} + // @override + // void frameChanged(int from, int to) {} /// Apply the value of this keyframe to the object's property. void apply(Core object, PropertyBean bean, double mix) {} diff --git a/lib/src/rive_core/animation/keyframe_double.dart b/lib/src/rive_core/animation/keyframe_double.dart index 25a41b6d..f524b8c2 100644 --- a/lib/src/rive_core/animation/keyframe_double.dart +++ b/lib/src/rive_core/animation/keyframe_double.dart @@ -19,9 +19,9 @@ class KeyFrameDouble extends KeyFrameDoubleBase { @override void apply(Core object, PropertyBean bean, double mix) { if (mix == 1) { - bean.setDouble(object, value_); + bean.setDouble(object, value); } else { - bean.transformDouble(object, (v) => v * (1.0 - mix) + value_ * mix); + bean.transformDouble(object, (v) => v * (1.0 - mix) + value * mix); } } @@ -30,14 +30,14 @@ class KeyFrameDouble extends KeyFrameDoubleBase { double currentTime, KeyFrameDouble nextFrame, double mix) { var f = (currentTime - seconds) / (nextFrame.seconds - seconds); - var frameValue = interpolator?.transformValue(value_, nextFrame.value_, f) ?? - value_ + (nextFrame.value_ - value_) * f; + var frameValue = interpolator?.transformValue(value, nextFrame.value, f) ?? + value + (nextFrame.value - value) * f; // _apply(object, propertyKey, mix, frameValue); bean.setDouble(object, mix == 1 ? frameValue : bean.getDouble(object) * (1.0 - mix) + frameValue * mix); } - @override - void valueChanged(double from, double to) {} + // @override + // void valueChanged(double from, double to) {} } From 49463da119b94b32f00db3aa760f88ec269a1919 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sun, 16 Feb 2025 10:38:28 +0000 Subject: [PATCH 26/50] finding animation loop problem --- lib/src/core/core.dart | 2 +- lib/src/generated/rive_core_beans.dart | 2 ++ .../rive_core/animation/keyed_property.dart | 19 ++++++++++++-- .../rive_core/animation/linear_animation.dart | 7 ++++-- lib/src/rive_core/artboard.dart | 6 ++--- lib/src/rive_core/component.dart | 2 +- lib/src/rive_core/dependency_helper.dart | 25 ++++++------------- .../shapes/shape_paint_container.dart | 4 +-- lib/src/rive_core/transform_component.dart | 2 ++ 9 files changed, 40 insertions(+), 29 deletions(-) diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index 432c9ae3..44a55d40 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -94,7 +94,7 @@ abstract class CoreContext { // ignore: one_member_abstracts abstract class ImportStackObject { - final _resolveBefore = UniqueList(); + final _resolveBefore = UniqueList.of(); bool _resolved = false; bool initStack(ImportStack stack) { diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index 96119dbd..d2635322 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -140,6 +140,7 @@ class FallbackBean extends PropertyBean { FallbackBean._(super.propertyKey): super._(); + // ignore: prefer_final_fields int _hits = 0; // uncomment me to dump stats @@ -286,6 +287,7 @@ abstract class PropertyBeans { return _map.putIfAbsent(propertyKey, () => FallbackBean._(propertyKey)); } + // ignore: unused_element static void _dumpFallbacks() { info('\n${_map.values.whereType().sorted((b1, b2) => b2._hits.compareTo(b1._hits)).map((b) => '$b').join('\n')}'); } diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 16682eea..4a780668 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -20,6 +20,15 @@ class KeyFrameList { List get keyframes => _keyframes; set keyframes(Iterable frames) => _keyframes = frames.toList(); + // T get firstKeyframe => _keyframes.first; + + // void remove(T keyframe) { + // _keyframes.remove(keyframe); + // onKeyframesChanged(); + // } + + void onKeyframesChanged() {} + /// Get the keyframe immediately following the provided one. T? after(T keyframe) { var index = _keyframes.indexOf(keyframe); @@ -81,6 +90,7 @@ class KeyedProperty extends KeyedPropertyBase } _keyframes.add(frame); markKeyFrameOrderDirty(); + onKeyframesChanged(); return true; } @@ -96,6 +106,7 @@ class KeyedProperty extends KeyedPropertyBase } else { markKeyFrameOrderDirty(); } + onKeyframesChanged(); return removed; } @@ -257,8 +268,13 @@ class KeyedProperty extends KeyedPropertyBase } } + @override + void onKeyframesChanged() { + _seconds = -1; + _pair = null; + } + double _seconds = -1; - // int _idx = -1; Pair? _pair; /// Apply keyframe values at a given time expressed in [seconds]. @@ -270,7 +286,6 @@ class KeyedProperty extends KeyedPropertyBase if (_seconds != seconds) { // if seconds coincide, return value from last run _seconds = seconds; - // _idx = _closestFrameIndex(seconds); _pair = _closestFramePair(seconds); } diff --git a/lib/src/rive_core/animation/linear_animation.dart b/lib/src/rive_core/animation/linear_animation.dart index 6e4b66d0..6f55f893 100644 --- a/lib/src/rive_core/animation/linear_animation.dart +++ b/lib/src/rive_core/animation/linear_animation.dart @@ -51,9 +51,12 @@ class LinearAnimation extends LinearAnimationBase { bool found = false; for (final kp in value.keyedProperties) { - for (final kf in kp.keyframes){//.toList()) { + for (final kf in kp.keyframes){ kf.remove(); - found = true; + if (!found) { + kp.onKeyframesChanged(); + found = true; + } } } return found; diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index 75204d53..a7d5c763 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -106,7 +106,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { final List _rules = []; List _sortedDrawRules = []; - final _components = UniqueList(); + final _components = UniqueList.of(); List get drawables => _drawables; @@ -209,7 +209,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { return didUpdate; } - final _activeNestedArtboards = UniqueList(); + final _activeNestedArtboards = UniqueList.of(); Iterable get activeNestedArtboards => _activeNestedArtboards; final List _joysticks = []; @@ -577,7 +577,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// The animation controllers that are called back whenever the artboard /// advances. - final _animationControllers = UniqueList(); + final _animationControllers = UniqueList.of(); /// Access a read-only iterator of currently applied animation controllers. Iterable get animationControllers => diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index 2759eb7f..0833971c 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -167,7 +167,7 @@ abstract class Component extends ComponentBase } /// Components that this component depends on. - final _dependsOn = UniqueList(); + final _dependsOn = UniqueList.of(); @override Set get dependents => _dependencyHelper.dependents; diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index f2a12578..67b67bf0 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -4,14 +4,7 @@ import 'package:stokanal/collections.dart'; class DependencyHelper { - final dependents = UniqueList(); // set should stay ordered - - // final dependents = {}; // set should stay ordered - // final dependentsList = []; // it's a copy of the set used to iterate over - - // Set get dependents => _dependents; - - // final dependents = []; // set should stay ordered + final dependents = UniqueList.of(); // set should stay ordered T? dependencyRoot; DependencyHelper(); @@ -25,27 +18,23 @@ class DependencyHelper { // return false; // /// STOKANAL-FORK-EDIT: use add directly - if (dependents.add(value)) { - // dependentsList.add(value); - return true; - } - - return false; + return dependents.add(value); } void addDirt(int dirt, {bool recurse = false}) { /// STOKANAL-FORK-EDIT: do not use forEach + // UniqueList final t = dependents.length; for (var i = 0; i < t; i++) { dependents[i].addDirt(dirt, recurse: recurse); - // for (final dependent in _dependents) { - // dependent.addDirt(dirt, recurse: recurse); } - // dependents - // .forEach((dependent) => dependent.addDirt(dirt, recurse: recurse)); + // // Set + // for (final dependent in dependents) { + // dependent.addDirt(dirt, recurse: recurse); + // } } // void onComponentDirty(U component) { diff --git a/lib/src/rive_core/shapes/shape_paint_container.dart b/lib/src/rive_core/shapes/shape_paint_container.dart index 5a5f0cd9..ba53350a 100644 --- a/lib/src/rive_core/shapes/shape_paint_container.dart +++ b/lib/src/rive_core/shapes/shape_paint_container.dart @@ -10,8 +10,8 @@ import 'package:stokanal/collections.dart'; /// An abstraction to give a common interface to any component that can contain /// fills and strokes. abstract class ShapePaintContainer { - final fills = UniqueList(); - final strokes = UniqueList(); + final fills = UniqueList.of(); + final strokes = UniqueList.of(); /// Called whenever a new paint mutator is added/removed from the shape paints /// (for example a linear gradient is added to a stroke). diff --git a/lib/src/rive_core/transform_component.dart b/lib/src/rive_core/transform_component.dart index a91d11fe..f4f703d4 100644 --- a/lib/src/rive_core/transform_component.dart +++ b/lib/src/rive_core/transform_component.dart @@ -226,6 +226,7 @@ abstract class TransformComponent extends TransformComponentBase { // In the runtime, we have to iterate the dependents + // Unique List var list = dependentsList; var t = list.length; for (var i = 0; i < t; i++) { @@ -235,6 +236,7 @@ abstract class TransformComponent extends TransformComponentBase { } } + // Set // for (final element in dependents) { // if (element is TransformComponent) { // element.markDirtyIfConstrained(); From 80540a408a9d44ff584243b67b0e599037c25cbe Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sun, 16 Feb 2025 11:55:49 +0000 Subject: [PATCH 27/50] small optimizations --- .../rive_core/animation/keyed_property.dart | 132 +++++++++++------- lib/src/rive_core/component.dart | 1 - lib/src/rive_core/dependency_helper.dart | 6 +- lib/src/runtime_artboard.dart | 4 +- 4 files changed, 87 insertions(+), 56 deletions(-) diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 4a780668..066ed020 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -140,44 +140,37 @@ class KeyedProperty extends KeyedPropertyBase // Binary find the keyframe index (use timeInSeconds here as opposed to the // finder above which operates in frames). - var length = _keyframes.length; - int end = length - 1; - var last = _keyframes[end]; - var totalSeconds = last.seconds; + final lastIndex = _keyframes.length - 1; // If it's the last keyframe, we skip the binary search - if (seconds >= totalSeconds) { - return Pair.of(null, last); + final last = _keyframes[lastIndex]; + if (seconds >= last.seconds) { + return Pair(null, last); } var first = _keyframes[0]; if (seconds <= first.seconds) { - return Pair.of(null, first); + return Pair(null, first); } - int mid = (length * seconds/totalSeconds).toInt(); // try to guess an optimal starting seconds - if (mid > end) { - mid = end; - } - - int start = 0; - // double closestSeconds; + int start = 1; + int end = lastIndex; while (start <= end) { - // mid = (start + end) >> 1; + int mid = (start + end) >> 1; var keyframe = _keyframes[mid]; - // closestSeconds = keyframe.seconds; if (keyframe.seconds < seconds) { start = mid + 1; } else if (keyframe.seconds > seconds) { end = mid - 1; } else { - return Pair.of(null, first); - // return mid; + return Pair(null, keyframe); } - mid = (start + end) >> 1; } - return Pair.of(start == 0 ? null : _keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start]); - // return start; + // if (start == 0) { + // throw Exception('start=0 not expected'); + // } + // return Pair.of((start == 0 ? _keyframes[lastIndex] : _keyframes[start-1]) as InterpolatingKeyFrame, _keyframes[start]); + return Pair(_keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start]); } int _closestFrameIndex(double seconds, {int exactOffset = 0}) { @@ -208,7 +201,6 @@ class KeyedProperty extends KeyedPropertyBase double closestSeconds; while (start <= end) { - // mid = (start + end) >> 1; closestSeconds = _keyframes[mid].seconds; if (closestSeconds < seconds) { start = mid + 1; @@ -222,6 +214,34 @@ class KeyedProperty extends KeyedPropertyBase return start; } + /// Original method (DO NOT DELETE FOR REFERENCE) + // int closestFrameIndex(double seconds, {int exactOffset = 0}) { + // // Binary find the keyframe index (use timeInSeconds here as opposed to the + // // finder above which operates in frames). + // int mid = 0; + // double closestSeconds = 0; + // int start = 0; + // int end = _keyframes.length - 1; + // + // // If it's the last keyframe, we skip the binary search + // if (seconds > _keyframes[end].seconds) { + // return end + 1; + // } + // + // while (start <= end) { + // mid = (start + end) >> 1; + // closestSeconds = _keyframes[mid].seconds; + // if (closestSeconds < seconds) { + // start = mid + 1; + // } else if (closestSeconds > seconds) { + // end = mid - 1; + // } else { + // return mid + exactOffset; + // } + // } + // return start; + // } + bool get isCallback => propertyKey == EventBase.triggerPropertyKey || propertyKey == NestedTriggerBase.firePropertyKey; @@ -253,6 +273,13 @@ class KeyedProperty extends KeyedPropertyBase int idx = _closestFrameIndex(secondsFrom, exactOffset: fromExactOffset); int idxTo = _closestFrameIndex(secondsTo, exactOffset: toExactOffset); + // validate _closestFrameIndex method + // int _idx = closestFrameIndex(secondsFrom, exactOffset: fromExactOffset); + // int _idxTo = closestFrameIndex(secondsTo, exactOffset: toExactOffset); + // if (_idx != idx || idxTo != _idxTo) { + // throw Exception('$_idx != $idx, $idxTo != $_idxTo'); + // } + // going backwards? if (idxTo < idx) { var swap = idx; @@ -279,50 +306,59 @@ class KeyedProperty extends KeyedPropertyBase /// Apply keyframe values at a given time expressed in [seconds]. void apply(double seconds, double mix, Core object) { - var length = _keyframes.length; - if (length == 0) { + if (_keyframes.length == 0) { return; } + // var calculated = false; if (_seconds != seconds) { // if seconds coincide, return value from last run _seconds = seconds; _pair = _closestFramePair(seconds); + // calculated = true; } - var fromFrame = _pair!.left; - var toFrame = _pair!.right; - - if (fromFrame != null) { // interpolation - if (fromFrame.interpolationType == 0) { - fromFrame.apply(object, propertyBean, mix); - } else { - fromFrame.applyInterpolation(object, propertyBean, seconds, toFrame, mix); - } - } else { - toFrame.apply(object, propertyBean, mix); - } - - // if (_idx == 0) { - // _keyframes[_idx].apply(object, propertyKey_, mix); + // // validate _closestFrameIndex method + // int idx = closestFrameIndex(seconds); + // Pair pair; + // if (idx == 0) { + // pair = Pair.of(null, _keyframes[0]); + // // _keyframes[0].apply(object, pk, mix); // } else { - // if (_idx < length) { - // final toFrame = _keyframes[_idx]; + // if (idx < _keyframes.length) { + // InterpolatingKeyFrame fromFrame = _keyframes[idx - 1] as InterpolatingKeyFrame; + // KeyFrame toFrame = _keyframes[idx]; // if (seconds == toFrame.seconds) { - // toFrame.apply(object, propertyKey_, mix); + // pair = Pair.of(null, toFrame); + // // toFrame.apply(object, pk, mix); // } else { - // final fromFrame = _keyframes[_idx - 1] as InterpolatingKeyFrame; - // /// Equivalent to fromFrame.interpolation == - // /// KeyFrameInterpolation.hold. // if (fromFrame.interpolationType == 0) { - // fromFrame.apply(object, propertyKey_, mix); + // pair = Pair.of(fromFrame, toFrame); + // // fromFrame.apply(object, pk, mix); // } else { - // fromFrame.applyInterpolation(object, propertyKey_, seconds, toFrame, mix); + // pair = Pair.of(fromFrame, toFrame); + // // fromFrame.applyInterpolation(object, pk, seconds, toFrame, mix); // } // } // } else { - // _keyframes[_idx - 1].apply(object, propertyKey_, mix); + // pair = Pair.of(null, _keyframes[idx - 1]); + // // _keyframes[idx - 1].apply(object, pk, mix); // } // } + // if (_pair != pair) { + // throw Exception('$_pair != $pair > calculated=$calculated keyframes=${_keyframes.length} idx=$idx index=${_keyframes.indexOf(_pair!.right)} ${_keyframes.indexOf(pair.right)}'); + // } + + var fromFrame = _pair!.key; + + if (fromFrame != null) { // interpolation + if (fromFrame.interpolationType == 0) { + fromFrame.apply(object, propertyBean, mix); + } else { + fromFrame.applyInterpolation(object, propertyBean, seconds, _pair!.value, mix); + } + } else { + _pair!.value.apply(object, propertyBean, mix); + } } // @override diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index 0833971c..8005695e 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -57,7 +57,6 @@ abstract class Component extends ComponentBase dirt |= value; onDirty(dirt); - // _dependencyHelper.onComponentDirty(this); _dependencyHelper.dependencyRoot?.onComponentDirty(this); // avoid calling one method if (!recurse) { diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index 67b67bf0..2475c218 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -17,7 +17,7 @@ class DependencyHelper { // } // return false; - // /// STOKANAL-FORK-EDIT: use add directly + // using set or unique list return dependents.add(value); } @@ -37,10 +37,6 @@ class DependencyHelper { // } } - // void onComponentDirty(U component) { - // dependencyRoot?.onComponentDirty(component); - // } - void clear() => dependents.clear(); } diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index 0490e57a..fb4af10d 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -99,7 +99,7 @@ class RuntimeArtboard extends Artboard implements CoreContext { /// Note that objects must be nullable as some may not resolve during load due /// to format differences. - final List _objects = []; + final _objects = []; Iterable get objects => _objects; final _needDependenciesBuilt = {}; @@ -158,7 +158,7 @@ class RuntimeArtboard extends Artboard implements CoreContext { @override T? resolve(int id) { - if (id >= _objects.length || id < 0) { + if (id < 0 || id >= _objects.length) { return null; } var object = _objects[id]; From f902d0cb8163b2b26d65a22b085ca474d329faab Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sun, 16 Feb 2025 12:01:04 +0000 Subject: [PATCH 28/50] testing commit --- lib/src/rive_core/animation/animation_reset_factory.dart | 5 +++-- lib/src/rive_core/state_machine_controller.dart | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/src/rive_core/animation/animation_reset_factory.dart b/lib/src/rive_core/animation/animation_reset_factory.dart index 3bdba438..5535260a 100644 --- a/lib/src/rive_core/animation/animation_reset_factory.dart +++ b/lib/src/rive_core/animation/animation_reset_factory.dart @@ -286,8 +286,9 @@ AnimationReset fromStates( void release(AnimationReset value) { value.clear(); int index = 0; - while (index < _pool.length) { - final animationReset = _pool.elementAt(index); + final length = _pool.length; + while (index < length) { + final animationReset = _pool[index]; if (animationReset.size > value.size) { break; } diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index ea9b7a00..2f7ee3a2 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -244,7 +244,7 @@ class LayerController { int index = 0; while (index < transitions.length) { final transitionWeight = - transitions.elementAt(index).evaluatedRandomWeight; + transitions[index].evaluatedRandomWeight; if (currentWeight + transitionWeight > random) { break; } @@ -252,7 +252,7 @@ class LayerController { index += 1; } assert(index < transitions.length); - final transition = transitions.elementAt(index); + final transition = transitions[index]; return transition; } return null; From ee7cc7461f2f5d8176e153434515648b60a63d7b Mon Sep 17 00:00:00 2001 From: gauchoj Date: Mon, 17 Feb 2025 17:54:15 +0000 Subject: [PATCH 29/50] detailed dump for iteration infinite loop --- .../animation/animation_reset_factory.dart | 4 ++-- .../rive_core/state_machine_controller.dart | 22 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/src/rive_core/animation/animation_reset_factory.dart b/lib/src/rive_core/animation/animation_reset_factory.dart index 5535260a..ada63dca 100644 --- a/lib/src/rive_core/animation/animation_reset_factory.dart +++ b/lib/src/rive_core/animation/animation_reset_factory.dart @@ -287,9 +287,9 @@ void release(AnimationReset value) { value.clear(); int index = 0; final length = _pool.length; + final valueSize = value.size; while (index < length) { - final animationReset = _pool[index]; - if (animationReset.size > value.size) { + if (_pool[index].size > valueSize) { break; } index++; diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 2f7ee3a2..bf22420b 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -39,6 +39,7 @@ import 'package:rive/src/rive_core/shapes/shape.dart'; import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; import 'package:rive/src/runtime_event.dart'; import 'package:rive_common/math.dart'; +import 'package:stokanal/telemetry.dart'; import '../generated/rive_core_beans.dart'; @@ -165,6 +166,9 @@ class LayerController { } } + static int _maxIterations = 0; + static bool _tooMuchIterationsCollected = false; + bool apply(CoreContext core, double elapsedSeconds) { if (_currentState != null) { _currentState!.advance(elapsedSeconds, controller); @@ -181,18 +185,28 @@ class LayerController { } _apply(core); - for (int i = 0; updateState(i != 0); i++) { + int i = 0; + for (; updateState(i != 0); i++) { _apply(core); - if (i == 100) { // Escape hatch, let the user know their logic is causing some kind of // recursive condition. - print('StateMachineController.apply exceeded max iterations.'); - + if (_tooMuchIterationsCollected) { + print('TOO MUCH ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} $_holdAnimation $_transition ${controller._artboard?.name}'); + } else { + _tooMuchIterationsCollected = true; + Telemetry() + .collect('TOO MUCH ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} $_holdAnimation $_transition ${controller._artboard?.name}') + .error(StackTrace.current, 'Too much iterations', fatal: false); + } return false; } } + if (i > _maxIterations) { + _maxIterations = i; + } + // give the current state the oportunity to clear spilled time, so that we // do not carry this over into another iteration. _currentState?.clearSpilledTime(); From 1f4f7c7116be7ea48919284e27249c189745fd8c Mon Sep 17 00:00:00 2001 From: gauchoj Date: Tue, 18 Feb 2025 08:50:22 +0000 Subject: [PATCH 30/50] logging infinite loop in the animation --- lib/src/rive_core/state_machine_controller.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index bf22420b..f8ab9ccd 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -191,13 +191,14 @@ class LayerController { if (i == 100) { // Escape hatch, let the user know their logic is causing some kind of // recursive condition. + var message = 'TOO MANY ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} $_holdAnimation $_transition ${controller._artboard?.name}'; if (_tooMuchIterationsCollected) { - print('TOO MUCH ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} $_holdAnimation $_transition ${controller._artboard?.name}'); + print(message); } else { _tooMuchIterationsCollected = true; Telemetry() - .collect('TOO MUCH ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} $_holdAnimation $_transition ${controller._artboard?.name}') - .error(StackTrace.current, 'Too much iterations', fatal: false); + .collect(message) + .error(StackTrace.current, 'Too many iterations', fatal: false); } return false; } From 8f1db63eab564c87d5b0f11a3f255ff72a093cb9 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Tue, 18 Feb 2025 18:08:00 +0000 Subject: [PATCH 31/50] small edits --- devtools_options.yaml | 3 +++ example/devtools_options.yaml | 3 +++ lib/src/layer_component_events.dart | 15 +++++++++++---- lib/src/rive_core/animation/keyed_property.dart | 5 +---- lib/src/rive_core/state_machine_controller.dart | 13 +++++++++++-- 5 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 devtools_options.yaml create mode 100644 example/devtools_options.yaml diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 00000000..fa0b357c --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/example/devtools_options.yaml b/example/devtools_options.yaml new file mode 100644 index 00000000..fa0b357c --- /dev/null +++ b/example/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/src/layer_component_events.dart b/lib/src/layer_component_events.dart index 2c39dc7c..34b8715f 100644 --- a/lib/src/layer_component_events.dart +++ b/lib/src/layer_component_events.dart @@ -3,9 +3,16 @@ import 'dart:collection'; import 'package:rive/src/rive_core/animation/state_machine_fire_event.dart'; class LayerComponentEvents extends ListBase { - final List _values = []; - List get values => - _values.cast(); + // final List _values = []; + final List _values = []; + // List get values => + // _values.cast(); + + @override + Iterator get iterator => _values.iterator; + + @override + StateMachineFireEvent elementAt(int index) => _values[index]; @override int get length => _values.length; @@ -14,7 +21,7 @@ class LayerComponentEvents extends ListBase { set length(int value) => _values.length = value; @override - StateMachineFireEvent operator [](int index) => _values[index]!; + StateMachineFireEvent operator [](int index) => _values[index]; @override void operator []=(int index, StateMachineFireEvent value) => diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 066ed020..ca9f3c0f 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -166,10 +166,7 @@ class KeyedProperty extends KeyedPropertyBase return Pair(null, keyframe); } } - // if (start == 0) { - // throw Exception('start=0 not expected'); - // } - // return Pair.of((start == 0 ? _keyframes[lastIndex] : _keyframes[start-1]) as InterpolatingKeyFrame, _keyframes[start]); + return Pair(_keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start]); } diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index f8ab9ccd..70d978eb 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -169,6 +169,13 @@ class LayerController { static int _maxIterations = 0; static bool _tooMuchIterationsCollected = false; + String _dumpState(StateInstance? state) { + if (state == null) { + return 'null'; + } + return '${state.runtimeType} state=${state.state} keepGoing=${state.keepGoing} id=${state.state.id} type=${state.state.runtimeType} coreType=${state.state.coreType}'; + } + bool apply(CoreContext core, double elapsedSeconds) { if (_currentState != null) { _currentState!.advance(elapsedSeconds, controller); @@ -188,10 +195,12 @@ class LayerController { int i = 0; for (; updateState(i != 0); i++) { _apply(core); - if (i == 100) { + if (i == 30) { // Escape hatch, let the user know their logic is causing some kind of // recursive condition. - var message = 'TOO MANY ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} $_holdAnimation $_transition ${controller._artboard?.name}'; + var runtime = core is RuntimeArtboard ? core : null; + var message = 'TOO MANY ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} ${runtime?.artboard.name} > ' + '${_dumpState(_currentState)} ${_dumpState(_stateFrom)}'; if (_tooMuchIterationsCollected) { print(message); } else { From 1ddbedc65ebd799bbe440deca272ce72d61603dc Mon Sep 17 00:00:00 2001 From: gauchoj Date: Wed, 19 Feb 2025 12:24:36 +0000 Subject: [PATCH 32/50] refactored match controllers lifecycle --- lib/src/rive_core/state_machine_controller.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 70d978eb..ac2cee41 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -173,7 +173,8 @@ class LayerController { if (state == null) { return 'null'; } - return '${state.runtimeType} state=${state.state} keepGoing=${state.keepGoing} id=${state.state.id} type=${state.state.runtimeType} coreType=${state.state.coreType}'; + var animationState = state.state is AnimationState ? state.state as AnimationState : null; + return '${state.runtimeType}:${state.state.runtimeType} ${animationState?.animation?.name} > $state ${state.state}'; } bool apply(CoreContext core, double elapsedSeconds) { From b0213b9e32ac4d71f05832c348b4d9799b0f5cd2 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Mon, 24 Feb 2025 21:26:48 +0000 Subject: [PATCH 33/50] memory tuning & tweaking --- .../Flutter/GeneratedPluginRegistrant.swift | 2 + lib/src/core/core.dart | 58 +++++++- lib/src/core/core_meta.dart | 38 ++++++ .../cubic_ease_interpolator_base.dart | 12 +- .../cubic_value_interpolator_base.dart | 12 +- .../interpolating_keyframe_base.dart | 41 ++---- .../animation/keyed_object_base.dart | 4 +- .../animation/keyed_property_base.dart | 4 +- .../generated/animation/keyframe_base.dart | 10 ++ .../animation/keyframe_double_base.dart | 29 +--- .../generated/animation/keyframe_id_base.dart | 12 +- .../animation/state_transition_base.dart | 5 +- .../transition_bool_condition_base.dart | 14 +- .../transition_number_condition_base.dart | 14 +- lib/src/generated/rive_core_beans.dart | 124 ++++++++++++------ .../shapes/cubic_detached_vertex_base.dart | 18 +-- lib/src/rive.dart | 1 + .../cubic_interpolator_component.dart | 3 + .../animation/interpolating_keyframe.dart | 46 +++++-- lib/src/rive_core/animation/interpolator.dart | 27 ++++ .../rive_core/animation/keyframe_double.dart | 6 +- .../animation/keyframe_interpolator.dart | 4 + .../animation/state_machine_component.dart | 1 - .../rive_core/text/text_modifier_range.dart | 1 + lib/src/rive_core/text/text_style.dart | 10 ++ lib/src/runtime_artboard.dart | 6 + pubspec.yaml | 15 ++- 27 files changed, 362 insertions(+), 155 deletions(-) create mode 100644 lib/src/core/core_meta.dart diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index 0aa3a062..d77bfca2 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,6 +9,7 @@ import audio_session import device_info_plus import flutter_udid import in_app_purchase_storekit +import in_app_review import just_audio import package_info_plus import path_provider_foundation @@ -22,6 +23,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FlutterUdidPlugin.register(with: registry.registrar(forPlugin: "FlutterUdidPlugin")) InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin")) + InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin")) JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index 44a55d40..bc2cfd09 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -2,8 +2,6 @@ import 'package:flutter/foundation.dart'; import 'package:rive/src/rive_core/runtime/exceptions/rive_format_error_exception.dart'; import 'package:stokanal/collections.dart'; -export 'dart:typed_data'; - export 'package:flutter/foundation.dart'; export 'package:rive/src/animation_list.dart'; export 'package:rive/src/asset_list.dart'; @@ -38,12 +36,52 @@ export 'package:rive/src/viewmodel_properties.dart'; typedef PropertyChangeCallback = void Function(dynamic from, dynamic to); typedef BatchAddCallback = void Function(); +const _coreTypes = {}; + abstract class Core { static const int missingId = -1; covariant late T context; int get coreType; + + @mustCallSuper + void onRemoved() {} + int id = missingId; - Set get coreTypes => {}; + // var _meta = missing; + // int get id => _meta.id; + // set id(int id) { + // if (this.id != id) { + // _meta = _meta.setId(id); + // } + // } + + // static const int disposedId = -2; + // void onRemoved() => calloc.free(_id); + // final Pointer _id = using((Arena arena) => arena(2)); + // final Pointer _id = calloc(2); + // int get id => _id.cast().value; + // set id(int value) => _id.cast().value = value; + + // Core() { + // id = missingId; + // } + + // @mustCallSuper + // bool dispose() { + // if (id == disposedId) { // already disposed + // return false; + // } + // id = disposedId; + // // if (Randoms().hit(0.01)) { + // // print('REMOVING > $runtimeType'); + // // } + // calloc.free(_id); + // print('FREE > ${_id.address} ${id}'); + // return true; + // } + + // TODO override this method with a static field, see KeyFrameDoubleBase as example + Set get coreTypes => _coreTypes;//{}; @nonVirtual bool hasValidated = false; @@ -51,10 +89,17 @@ abstract class Core { void onAddedDirty(); void onAdded() {} - void onRemoved() {} - void remove() => context.removeObject(this); bool import(ImportStack stack) => true; + void remove() => context.removeObject(this); + // @nonVirtual + // void remove() { + // context.removeObject(this); + // if (Randoms().hit(0.1)) { + // print('REMOVING > $runtimeType'); + // } + // } + bool validate() => true; /// Make a duplicate of this core object, N.B. that all properties excluding @@ -73,9 +118,8 @@ abstract class Core { // ignore: avoid_classes_with_only_static_members class InternalCoreHelper { - static void markValid(Core object) { + static void markValid(Core object) => object.hasValidated = true; - } } abstract class CoreContext { diff --git a/lib/src/core/core_meta.dart b/lib/src/core/core_meta.dart new file mode 100644 index 00000000..3350f6b6 --- /dev/null +++ b/lib/src/core/core_meta.dart @@ -0,0 +1,38 @@ +// import 'package:rive/src/generated/animation/keyframe_base.dart'; +// +// import '../rive_core/container_component.dart'; +// +// final _map = {}; +// +// abstract class CoreMetas { +// static final CoreMeta frameInitialValue = CoreMeta._(frame: KeyFrameBase.frameInitialValue); +// } +// +// @immutable +// class CoreMeta extends Object { +// +// final int frame; +// +// @override +// final int hashCode; +// +// CoreMeta._({required this.frame}): +// hashCode = frame { +// _map[this] = this; +// if (_map.length % 100 == 0) { +// print('MAP LENGTH > ${_map.length} > $frame >> $hashCode'); +// } +// } +// +// @override +// bool operator ==(Object other) => other is CoreMeta && +// other.frame == frame; +// +// CoreMeta _copy({ +// int? frame, +// }) => CoreMeta._( +// frame: frame??this.frame, +// ); +// +// CoreMeta setFrame(int frame) => _map[_copy(frame: frame)]!; +// } \ No newline at end of file diff --git a/lib/src/generated/animation/cubic_ease_interpolator_base.dart b/lib/src/generated/animation/cubic_ease_interpolator_base.dart index 006833ce..a74463e3 100644 --- a/lib/src/generated/animation/cubic_ease_interpolator_base.dart +++ b/lib/src/generated/animation/cubic_ease_interpolator_base.dart @@ -5,14 +5,16 @@ import 'package:rive/src/generated/animation/keyframe_interpolator_base.dart'; import 'package:rive/src/rive_core/animation/cubic_interpolator.dart'; +const _coreTypes = { + CubicEaseInterpolatorBase.typeKey, + CubicInterpolatorBase.typeKey, + KeyFrameInterpolatorBase.typeKey +}; + abstract class CubicEaseInterpolatorBase extends CubicInterpolator { static const int typeKey = 28; @override int get coreType => CubicEaseInterpolatorBase.typeKey; @override - Set get coreTypes => { - CubicEaseInterpolatorBase.typeKey, - CubicInterpolatorBase.typeKey, - KeyFrameInterpolatorBase.typeKey - }; + Set get coreTypes => _coreTypes; } diff --git a/lib/src/generated/animation/cubic_value_interpolator_base.dart b/lib/src/generated/animation/cubic_value_interpolator_base.dart index 21595ea0..3c009ac7 100644 --- a/lib/src/generated/animation/cubic_value_interpolator_base.dart +++ b/lib/src/generated/animation/cubic_value_interpolator_base.dart @@ -5,14 +5,16 @@ import 'package:rive/src/generated/animation/keyframe_interpolator_base.dart'; import 'package:rive/src/rive_core/animation/cubic_interpolator.dart'; +const _coreTypes = { + CubicValueInterpolatorBase.typeKey, + CubicInterpolatorBase.typeKey, + KeyFrameInterpolatorBase.typeKey +}; + abstract class CubicValueInterpolatorBase extends CubicInterpolator { static const int typeKey = 138; @override int get coreType => CubicValueInterpolatorBase.typeKey; @override - Set get coreTypes => { - CubicValueInterpolatorBase.typeKey, - CubicInterpolatorBase.typeKey, - KeyFrameInterpolatorBase.typeKey - }; + Set get coreTypes => _coreTypes; } diff --git a/lib/src/generated/animation/interpolating_keyframe_base.dart b/lib/src/generated/animation/interpolating_keyframe_base.dart index be12a799..827e5a5c 100644 --- a/lib/src/generated/animation/interpolating_keyframe_base.dart +++ b/lib/src/generated/animation/interpolating_keyframe_base.dart @@ -23,47 +23,30 @@ abstract class InterpolatingKeyFrameBase extends KeyFrame { @nonVirtual int interpolationType = interpolationTypeInitialValue; - // /// The type of interpolation index in KeyframeInterpolation applied to this - // /// keyframe. - // int get interpolationType => _interpolationType; - // - // /// Change the [_interpolationType] field value. - // /// [interpolationTypeChanged] will be invoked only if the field's value has - // /// changed. - // set interpolationType(int value) { - // if (_interpolationType == value) { - // return; - // } - // int from = _interpolationType; - // _interpolationType = value; - // if (hasValidated) { - // interpolationTypeChanged(from, value); - // } - // } - - // void interpolationTypeChanged(int from, int to); - /// -------------------------------------------------------------------------- /// InterpolatorId field with key 69. static const int interpolatorIdPropertyKey = 69; static const int interpolatorIdInitialValue = -1; - int _interpolatorId = interpolatorIdInitialValue; + + // int _interpolatorId = interpolatorIdInitialValue; /// The id of the custom interpolator used when interpolation is Cubic. - int get interpolatorId => _interpolatorId; + // int get interpolatorId => _interpolatorId; + + int get interpolatorId; /// Change the [_interpolatorId] field value. /// [interpolatorIdChanged] will be invoked only if the field's value has /// changed. + @nonVirtual set interpolatorId(int value) { - if (_interpolatorId == value) { + // int from = _interpolatorId; + int from = interpolatorId; + if (from == value) { return; } - int from = _interpolatorId; - _interpolatorId = value; - if (hasValidated) { - interpolatorIdChanged(from, value); - } + // _interpolatorId = value; + interpolatorIdChanged(from, value); } void interpolatorIdChanged(int from, int to); @@ -73,7 +56,7 @@ abstract class InterpolatingKeyFrameBase extends KeyFrame { super.copy(source); if (source is InterpolatingKeyFrameBase) { interpolationType = source.interpolationType; - _interpolatorId = source._interpolatorId; + // _interpolatorId = source._interpolatorId; } } } diff --git a/lib/src/generated/animation/keyed_object_base.dart b/lib/src/generated/animation/keyed_object_base.dart index d85af7e5..84d94ed7 100644 --- a/lib/src/generated/animation/keyed_object_base.dart +++ b/lib/src/generated/animation/keyed_object_base.dart @@ -4,13 +4,15 @@ import 'package:rive/src/core/core.dart'; +const _coreTypes = {KeyedObjectBase.typeKey}; + abstract class KeyedObjectBase extends Core { static const int typeKey = 25; @override int get coreType => KeyedObjectBase.typeKey; @override - Set get coreTypes => {KeyedObjectBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// ObjectId field with key 51. diff --git a/lib/src/generated/animation/keyed_property_base.dart b/lib/src/generated/animation/keyed_property_base.dart index 1d284b73..6f6cdebb 100644 --- a/lib/src/generated/animation/keyed_property_base.dart +++ b/lib/src/generated/animation/keyed_property_base.dart @@ -6,12 +6,14 @@ import 'package:rive/src/core/core.dart'; import '../rive_core_beans.dart'; +const _coreTypes = {KeyedPropertyBase.typeKey}; + abstract class KeyedPropertyBase extends Core { static const int typeKey = 26; @override int get coreType => KeyedPropertyBase.typeKey; @override - Set get coreTypes => {KeyedPropertyBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// PropertyKey field with key 53. diff --git a/lib/src/generated/animation/keyframe_base.dart b/lib/src/generated/animation/keyframe_base.dart index 27d149ba..f642f6bc 100644 --- a/lib/src/generated/animation/keyframe_base.dart +++ b/lib/src/generated/animation/keyframe_base.dart @@ -19,6 +19,16 @@ abstract class KeyFrameBase extends Core { @nonVirtual int frame = frameInitialValue; + // var _meta = CoreMetas.frameInitialValue; + // @nonVirtual + // int get frame => _meta.frame; + // @nonVirtual + // set frame(int frame) { + // if (this.frame != frame) { + // _meta = _meta.setFrame(frame); + // } + // } + // /// Timecode as frame number can be converted to time by dividing by animation // /// fps. // int get frame => _frame; diff --git a/lib/src/generated/animation/keyframe_double_base.dart b/lib/src/generated/animation/keyframe_double_base.dart index 34199907..b66b21a4 100644 --- a/lib/src/generated/animation/keyframe_double_base.dart +++ b/lib/src/generated/animation/keyframe_double_base.dart @@ -6,16 +6,18 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_base.dart'; import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; +const _coreTypes = { + KeyFrameDoubleBase.typeKey, + InterpolatingKeyFrameBase.typeKey, + KeyFrameBase.typeKey +}; + abstract class KeyFrameDoubleBase extends InterpolatingKeyFrame { static const int typeKey = 30; @override int get coreType => KeyFrameDoubleBase.typeKey; @override - Set get coreTypes => { - KeyFrameDoubleBase.typeKey, - InterpolatingKeyFrameBase.typeKey, - KeyFrameBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Value field with key 70. @@ -26,23 +28,6 @@ abstract class KeyFrameDoubleBase extends InterpolatingKeyFrame { @nonVirtual double value = valueInitialValue; - // double get value => value_; - // - // /// Change the [value_] field value. - // /// [valueChanged] will be invoked only if the field's value has changed. - // set value(double value) { - // if (value_ == value) { - // return; - // } - // double from = value_; - // value_ = value; - // if (hasValidated) { - // valueChanged(from, value); - // } - // } - - // void valueChanged(double from, double to); - @override void copy(Core source) { super.copy(source); diff --git a/lib/src/generated/animation/keyframe_id_base.dart b/lib/src/generated/animation/keyframe_id_base.dart index 07377b70..4b39349e 100644 --- a/lib/src/generated/animation/keyframe_id_base.dart +++ b/lib/src/generated/animation/keyframe_id_base.dart @@ -6,16 +6,18 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyframe_base.dart'; import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; +const _coreTypes = { + KeyFrameIdBase.typeKey, + InterpolatingKeyFrameBase.typeKey, + KeyFrameBase.typeKey +}; + abstract class KeyFrameIdBase extends InterpolatingKeyFrame { static const int typeKey = 50; @override int get coreType => KeyFrameIdBase.typeKey; @override - Set get coreTypes => { - KeyFrameIdBase.typeKey, - InterpolatingKeyFrameBase.typeKey, - KeyFrameBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Value field with key 122. diff --git a/lib/src/generated/animation/state_transition_base.dart b/lib/src/generated/animation/state_transition_base.dart index c34d9367..846cc74f 100644 --- a/lib/src/generated/animation/state_transition_base.dart +++ b/lib/src/generated/animation/state_transition_base.dart @@ -5,13 +5,14 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/animation/state_machine_layer_component.dart'; +const _coreTypes = {StateTransitionBase.typeKey, StateMachineLayerComponentBase.typeKey}; + abstract class StateTransitionBase extends StateMachineLayerComponent { static const int typeKey = 65; @override int get coreType => StateTransitionBase.typeKey; @override - Set get coreTypes => - {StateTransitionBase.typeKey, StateMachineLayerComponentBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// StateToId field with key 151. diff --git a/lib/src/generated/animation/transition_bool_condition_base.dart b/lib/src/generated/animation/transition_bool_condition_base.dart index e9bcc130..66e7823d 100644 --- a/lib/src/generated/animation/transition_bool_condition_base.dart +++ b/lib/src/generated/animation/transition_bool_condition_base.dart @@ -6,15 +6,17 @@ import 'package:rive/src/generated/animation/transition_condition_base.dart'; import 'package:rive/src/generated/animation/transition_input_condition_base.dart'; import 'package:rive/src/rive_core/animation/transition_value_condition.dart'; +const _coreTypes = { + TransitionBoolConditionBase.typeKey, + TransitionValueConditionBase.typeKey, + TransitionInputConditionBase.typeKey, + TransitionConditionBase.typeKey +}; + abstract class TransitionBoolConditionBase extends TransitionValueCondition { static const int typeKey = 71; @override int get coreType => TransitionBoolConditionBase.typeKey; @override - Set get coreTypes => { - TransitionBoolConditionBase.typeKey, - TransitionValueConditionBase.typeKey, - TransitionInputConditionBase.typeKey, - TransitionConditionBase.typeKey - }; + Set get coreTypes => _coreTypes; } diff --git a/lib/src/generated/animation/transition_number_condition_base.dart b/lib/src/generated/animation/transition_number_condition_base.dart index 7699a911..21819295 100644 --- a/lib/src/generated/animation/transition_number_condition_base.dart +++ b/lib/src/generated/animation/transition_number_condition_base.dart @@ -7,17 +7,19 @@ import 'package:rive/src/generated/animation/transition_condition_base.dart'; import 'package:rive/src/generated/animation/transition_input_condition_base.dart'; import 'package:rive/src/rive_core/animation/transition_value_condition.dart'; +const _coreTypes = { + TransitionNumberConditionBase.typeKey, + TransitionValueConditionBase.typeKey, + TransitionInputConditionBase.typeKey, + TransitionConditionBase.typeKey +}; + abstract class TransitionNumberConditionBase extends TransitionValueCondition { static const int typeKey = 70; @override int get coreType => TransitionNumberConditionBase.typeKey; @override - Set get coreTypes => { - TransitionNumberConditionBase.typeKey, - TransitionValueConditionBase.typeKey, - TransitionInputConditionBase.typeKey, - TransitionConditionBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Value field with key 157. diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index d2635322..f7eda4ff 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -25,111 +25,123 @@ import 'package:stokanal/logging.dart'; import '../core/field_types/core_field_type.dart'; -class PropertyBean { +class PropertyBean { final int propertyKey; PropertyBean._(this.propertyKey); - bool getBool(Core o) => throw Exception(); - void setBool(Core o, bool v) => throw Exception(); + bool getBool(T o) => throw Exception(); + void setBool(T o, bool v) => throw Exception(); - double getDouble(Core o) => throw Exception(); - void setDouble(Core o, double v) => throw Exception(); + double getDouble(T o) => throw Exception(); + void setDouble(T o, double v) => throw Exception(); - void transformDouble(Core o, double Function(double) function) { + void transformDouble(T o, double Function(double) function) { setDouble(o, function(getDouble(o))); } - int getColor(Core o) => throw Exception(); - void setColor(Core o, int v) => throw Exception(); + int getColor(T o) => throw Exception(); + void setColor(T o, int v) => throw Exception(); - int getUint(Core o) => throw Exception(); - void setUint(Core o, int v) => throw Exception(); + int getUint(T o) => throw Exception(); + void setUint(T o, int v) => throw Exception(); - String getString(Core o) => throw Exception(); - void setString(Core o, String v) => throw Exception(); + String getString(T o) => throw Exception(); + void setString(T o, String v) => throw Exception(); void setObjectProperty(Core o, Object v) => throw Exception(); CoreFieldType? get coreType => throw Exception(); - void setCallback(Core o, CallbackData v) => throw Exception(); + void setCallback(T o, CallbackData v) => throw Exception(); } -class DoublePropertyBean extends PropertyBean { +class _DoublePropertyBean extends PropertyBean { + _DoublePropertyBean._(super.propertyKey): super._(); + + @override + @nonVirtual + CoreFieldType? get coreType => RiveCoreContext.doubleType; + + @override + void transformDouble(T o, double Function(double) function) => + setDouble(o, function(getDouble(o))); + + @override + void setObjectProperty(Core o, Object v) => o is T && v is double ? setDouble(o, v) : {}; +} + +class DoublePropertyBean extends _DoublePropertyBean { final double Function(T) getter; final void Function(T, double) setter; DoublePropertyBean._(super.propertyKey, this.getter, this.setter): super._(); @override - double getDouble(Core o) => getter(o as T); + double getDouble(T o) => getter(o); @override - void setDouble(Core o, double v) => setter(o as T, v); + void setDouble(T o, double v) => setter(o, v); @override - void transformDouble(Core o, double Function(double) function) => - setter(o as T, function(getter(o))); + void transformDouble(T o, double Function(double) function) => + setter(o, function(getter(o))); @override - void setObjectProperty(Core o, Object v) => o is T && v is double ? setDouble(o, v) : {}; - - @override - CoreFieldType? get coreType => RiveCoreContext.doubleType; + void setObjectProperty(Core o, Object v) => o is T && v is double ? setter(o, v) : {}; } -class UintPropertyBean extends PropertyBean { +class UintPropertyBean extends PropertyBean { final int Function(T) getter; final void Function(T, int) setter; UintPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); @override - int getUint(Core o) => getter(o as T); + int getUint(T o) => getter(o); @override - void setUint(Core o, int v) => setter(o as T, v); + void setUint(T o, int v) => setter(o, v); @override - void setObjectProperty(Core o, Object v) => o is T && v is int ? setUint(o, v) : {}; + void setObjectProperty(Core o, Object v) => o is T && v is int ? setter(o, v) : {}; @override CoreFieldType? get coreType => RiveCoreContext.uintType; } -class ColorPropertyBean extends PropertyBean { +class ColorPropertyBean extends PropertyBean { final int Function(T) getter; final void Function(T, int) setter; ColorPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); @override - int getColor(Core o) => getter(o as T); + int getColor(T o) => getter(o); @override - void setColor(Core o, int v) => setter(o as T, v); + void setColor(T o, int v) => setter(o, v); @override - void setObjectProperty(Core o, Object v) => o is T && v is int ? setColor(o, v) : {}; + void setObjectProperty(Core o, Object v) => o is T && v is int ? setter(o, v) : {}; @override CoreFieldType? get coreType => RiveCoreContext.colorType; } -class StringPropertyBean extends PropertyBean { +class StringPropertyBean extends PropertyBean { final String Function(T) getter; final void Function(T, String) setter; StringPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); @override - String getString(Core o) => getter(o as T); + String getString(T o) => getter(o); @override - void setString(Core o, String v) => setter(o as T, v); + void setString(T o, String v) => setter(o, v); @override - void setObjectProperty(Core o, Object v) => o is T && v is String ? setString(o, v) : {}; + void setObjectProperty(Core o, Object v) => o is T && v is String ? setter(o, v) : {}; @override CoreFieldType? get coreType => RiveCoreContext.stringType; @@ -236,10 +248,14 @@ final _invalid = PropertyBean._(CoreContext.invalidPropertyKey); var _first = true; final _implements = [ _invalid, - DoublePropertyBean._(NodeBase.xPropertyKey, (o) => o.x_, (o, v) => o.x = v), - DoublePropertyBean._(NodeBase.yPropertyKey, (o) => o.y_, (o, v) => o.y = v), - DoublePropertyBean._(VertexBase.xPropertyKey, (o) => o.x_, (o, v) => o.x = v), - DoublePropertyBean._(VertexBase.yPropertyKey, (o) => o.y_, (o, v) => o.y = v), + XPropertyBean._(), + YPropertyBean._(), + VertexBaseXPropertyBean._(), + VertexBaseYPropertyBean._(), + // DoublePropertyBean._(NodeBase.xPropertyKey, (o) => o.x_, (o, v) => o.x = v), + // DoublePropertyBean._(NodeBase.yPropertyKey, (o) => o.y_, (o, v) => o.y = v), + // DoublePropertyBean._(VertexBase.xPropertyKey, (o) => o.x_, (o, v) => o.x = v), + // DoublePropertyBean._(VertexBase.yPropertyKey, (o) => o.y_, (o, v) => o.y = v), DoublePropertyBean._(CubicDetachedVertexBase.outRotationPropertyKey, (o) => o.outRotation_, (o, v) => o.outRotation = v), DoublePropertyBean._(CubicDetachedVertexBase.outDistancePropertyKey, (o) => o.outDistance_, (o, v) => o.outDistance = v), DoublePropertyBean._(CubicDetachedVertexBase.inRotationPropertyKey, (o) => o.inRotation_, (o, v) => o.inRotation = v), @@ -291,4 +307,34 @@ abstract class PropertyBeans { static void _dumpFallbacks() { info('\n${_map.values.whereType().sorted((b1, b2) => b2._hits.compareTo(b1._hits)).map((b) => '$b').join('\n')}'); } -} \ No newline at end of file +} + +class XPropertyBean extends _DoublePropertyBean { + XPropertyBean._(): super._(NodeBase.xPropertyKey); + @override + double getDouble(NodeBase o) => o.x_; + @override + void setDouble(NodeBase o, double v) => o.x = v; +} +class YPropertyBean extends _DoublePropertyBean { + YPropertyBean._(): super._(NodeBase.yPropertyKey); + @override + double getDouble(NodeBase o) => o.y_; + @override + void setDouble(NodeBase o, double v) => o.y = v; +} + +class VertexBaseXPropertyBean extends _DoublePropertyBean { + VertexBaseXPropertyBean._(): super._(VertexBase.xPropertyKey); + @override + double getDouble(VertexBase o) => o.x_; + @override + void setDouble(VertexBase o, double v) => o.x = v; +} +class VertexBaseYPropertyBean extends _DoublePropertyBean { + VertexBaseYPropertyBean._(): super._(VertexBase.yPropertyKey); + @override + double getDouble(VertexBase o) => o.y_; + @override + void setDouble(VertexBase o, double v) => o.y = v; +} diff --git a/lib/src/generated/shapes/cubic_detached_vertex_base.dart b/lib/src/generated/shapes/cubic_detached_vertex_base.dart index 0abd4198..0172a782 100644 --- a/lib/src/generated/shapes/cubic_detached_vertex_base.dart +++ b/lib/src/generated/shapes/cubic_detached_vertex_base.dart @@ -9,19 +9,21 @@ import 'package:rive/src/generated/shapes/path_vertex_base.dart'; import 'package:rive/src/generated/shapes/vertex_base.dart'; import 'package:rive/src/rive_core/shapes/cubic_vertex.dart'; +const _coreTypes = { + CubicDetachedVertexBase.typeKey, + CubicVertexBase.typeKey, + PathVertexBase.typeKey, + VertexBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class CubicDetachedVertexBase extends CubicVertex { static const int typeKey = 6; @override int get coreType => CubicDetachedVertexBase.typeKey; @override - Set get coreTypes => { - CubicDetachedVertexBase.typeKey, - CubicVertexBase.typeKey, - PathVertexBase.typeKey, - VertexBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// InRotation field with key 84. diff --git a/lib/src/rive.dart b/lib/src/rive.dart index bce8018e..849cdc12 100644 --- a/lib/src/rive.dart +++ b/lib/src/rive.dart @@ -366,6 +366,7 @@ class RiveRenderObject extends RiveRenderBox implements MouseTrackerAnnotation { @override void dispose() { _artboard.redraw.removeListener(scheduleRepaint); + _artboard.dispose(); _recognizer.dispose(); super.dispose(); } diff --git a/lib/src/rive_core/animation/cubic_interpolator_component.dart b/lib/src/rive_core/animation/cubic_interpolator_component.dart index 74380e19..b4a63c7a 100644 --- a/lib/src/rive_core/animation/cubic_interpolator_component.dart +++ b/lib/src/rive_core/animation/cubic_interpolator_component.dart @@ -10,6 +10,9 @@ class CubicInterpolatorComponent extends CubicInterpolatorComponentBase implements Interpolator, CubicInterface { CubicEase _ease = CubicEase.make(0.42, 0, 0.58, 1); + @override + bool get late => false; + @override void update(int dirt) {} diff --git a/lib/src/rive_core/animation/interpolating_keyframe.dart b/lib/src/rive_core/animation/interpolating_keyframe.dart index 4ab0058e..5eeddfc3 100644 --- a/lib/src/rive_core/animation/interpolating_keyframe.dart +++ b/lib/src/rive_core/animation/interpolating_keyframe.dart @@ -18,32 +18,58 @@ abstract class InterpolatingKeyFrame extends InterpolatingKeyFrameBase { interpolationType = value.index; } - // @override - // void interpolationTypeChanged(int from, int to) {} - - Interpolator? _interpolator; - Interpolator? get interpolator => _interpolator; + Interpolator _interpolator = Interpolators.initial; + Interpolator? get interpolator => _interpolator == Interpolators.initial ? null : _interpolator; set interpolator(Interpolator? value) { if (_interpolator == value) { return; } - _interpolator = value; - interpolatorId = value?.id ?? Core.missingId; + _interpolator = value ?? Interpolators.initial; + // interpolatorId = value?.id ?? Core.missingId; + // interpolatorId = value;//?.id ?? Core.missingId; + } + + @override + void copy(Core source) { + super.copy(source); + if (source is InterpolatingKeyFrame) { + _interpolator = source._interpolator; + } } + /// The id of the custom interpolator used when interpolation is Cubic. + @override + // int get interpolatorId => _interpolator?.id ?? Core.missingId; + int get interpolatorId => _interpolator.id; + + // Interpolator _interpolator = nullInterpolator; + // Interpolator? get interpolator => _interpolator == nullInterpolator ? null : _interpolator; + // set interpolator(Interpolator? value) { + // if (_interpolator == value) { + // return; + // } + // + // _interpolator = value == null ? nullInterpolator : value; + // interpolatorId = value?.id ?? Core.missingId; + // } + @override void interpolatorIdChanged(int from, int to) { // This might resolve to null during a load or if context isn't available // yet so we also do this in onAddedDirty. - interpolator = context.resolve(to); + if (hasValidated) { + _interpolator = context.resolve(to) ?? Interpolators.late(to); + } else { + _interpolator = Interpolators.late(to); + } } @override void onAddedDirty() { super.onAddedDirty(); - if (interpolatorId != Core.missingId) { - interpolator = context.resolve(interpolatorId); + if (interpolatorId != Core.missingId && _interpolator.late) { + _interpolator = context.resolve(interpolatorId) ?? Interpolators.late(interpolatorId); } // Ensure interpolation types are valid, correct them if not. switch (interpolation) { diff --git a/lib/src/rive_core/animation/interpolator.dart b/lib/src/rive_core/animation/interpolator.dart index b785de04..58202ecd 100644 --- a/lib/src/rive_core/animation/interpolator.dart +++ b/lib/src/rive_core/animation/interpolator.dart @@ -1,4 +1,5 @@ abstract class Interpolator { + const Interpolator(); int get id; /// Convert a linear interpolation factor to an eased one. Returns a factor @@ -9,4 +10,30 @@ abstract class Interpolator { double transformValue(double from, double to, double f); bool equalParameters(Interpolator other); + + bool get late; +} + +abstract class Interpolators { + + static const initial = LateInterpolator._(-1); + static LateInterpolator late(int id) => LateInterpolator._(id); +} + +class LateInterpolator extends Interpolator { + @override + final int id; + + @override + bool get late => id != 0; + + const LateInterpolator._(this.id); + @override + bool equalParameters(Interpolator other) => throw UnimplementedError(); + + @override + double transform(double f) => throw UnimplementedError(); + + @override + double transformValue(double from, double to, double f) => throw UnimplementedError(); } diff --git a/lib/src/rive_core/animation/keyframe_double.dart b/lib/src/rive_core/animation/keyframe_double.dart index f524b8c2..a1ac32b3 100644 --- a/lib/src/rive_core/animation/keyframe_double.dart +++ b/lib/src/rive_core/animation/keyframe_double.dart @@ -35,7 +35,11 @@ class KeyFrameDouble extends KeyFrameDoubleBase { // _apply(object, propertyKey, mix, frameValue); - bean.setDouble(object, mix == 1 ? frameValue : bean.getDouble(object) * (1.0 - mix) + frameValue * mix); + if (mix == 1) { + bean.setDouble(object, frameValue); + } else { + bean.setDouble(object, bean.getDouble(object) * (1.0 - mix) + frameValue * mix); + } } // @override diff --git a/lib/src/rive_core/animation/keyframe_interpolator.dart b/lib/src/rive_core/animation/keyframe_interpolator.dart index 742b4843..10a65501 100644 --- a/lib/src/rive_core/animation/keyframe_interpolator.dart +++ b/lib/src/rive_core/animation/keyframe_interpolator.dart @@ -7,6 +7,10 @@ export 'package:rive/src/generated/animation/keyframe_interpolator_base.dart'; abstract class KeyFrameInterpolator extends KeyFrameInterpolatorBase implements Interpolator { + + @override + bool get late => false; + @override void onAdded() => updateInterpolator(); diff --git a/lib/src/rive_core/animation/state_machine_component.dart b/lib/src/rive_core/animation/state_machine_component.dart index 1d451cf9..a929c211 100644 --- a/lib/src/rive_core/animation/state_machine_component.dart +++ b/lib/src/rive_core/animation/state_machine_component.dart @@ -41,7 +41,6 @@ abstract class StateMachineComponent @override void onRemoved() { super.onRemoved(); - stateMachine = null; } diff --git a/lib/src/rive_core/text/text_modifier_range.dart b/lib/src/rive_core/text/text_modifier_range.dart index d1a1136b..fc17cb1e 100644 --- a/lib/src/rive_core/text/text_modifier_range.dart +++ b/lib/src/rive_core/text/text_modifier_range.dart @@ -1,4 +1,5 @@ import 'dart:math'; +import 'dart:typed_data'; import 'package:collection/collection.dart'; import 'package:rive/src/core/core.dart'; diff --git a/lib/src/rive_core/text/text_style.dart b/lib/src/rive_core/text/text_style.dart index 1804f6df..48e97705 100644 --- a/lib/src/rive_core/text/text_style.dart +++ b/lib/src/rive_core/text/text_style.dart @@ -44,6 +44,16 @@ class TextVariationHelper extends Component { _font = null; } + // @override + // bool dispose() { + // if (!super.dispose()) { + // return false; + // } + // _font?.dispose(); + // _font = null; + // return true; + // } + @override void buildDependencies() { var text = style.text; diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index fb4af10d..1763e652 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -6,6 +6,7 @@ import 'package:rive/rive.dart'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/notifier.dart'; +// import 'package:stokanal/logging.dart'; /// Adds getters for linear animations and state machines extension RuntimeArtboardGetters on RuntimeArtboard { @@ -287,4 +288,9 @@ class RuntimeArtboard extends Artboard implements CoreContext { @override bool get isPlaying => _isPlaying; + + // @override + void dispose() { + // log('DISPOSING > $runtimeType ${artboard.name}'); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 3e47ccf0..fb3976b9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,19 +6,20 @@ repository: https://github.com/rive-app/rive-flutter publish_to: none # STOKANAL-FORK-EDIT: added to include stokanal path dependency -topics: - - animation - - ui - - effects - - widgets - - widget - - +# topics: + # - animation + # - ui + # - effects + # - widgets + # - widget +# - environment: sdk: ">=2.17.0 <4.0.0" flutter: ">=2.5.0" dependencies: collection: ^1.15.0 +# ffi: ^2.1.4 flutter: sdk: flutter flutter_web_plugins: From 5bbd2749eaa0fe5b2da81c3affc00df617c16010 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Tue, 25 Feb 2025 11:17:27 +0000 Subject: [PATCH 34/50] using a Core.id to store two int values --- lib/src/core/core.dart | 95 +++++++++++-------- .../animation/keyed_object_base.dart | 9 +- .../generated/animation/keyframe_base.dart | 34 +------ .../animation/interpolating_keyframe.dart | 7 +- lib/src/rive_file.dart | 3 +- 5 files changed, 73 insertions(+), 75 deletions(-) diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index bc2cfd09..23abbcc2 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -38,6 +38,45 @@ typedef BatchAddCallback = void Function(); const _coreTypes = {}; +const _highInt = 0xFFFFFFFF00000000; +const _lowInt = 0xFFFFFFFF; +const _negative = 0x80000000; +const _module = 0x7FFFFFFF; + +int _to(int s) { + // // TODO comment me + // if (s > _module || s < -_module) { + // throw Exception('_to=$s'); + // } + + if (s < 0) { + return _negative + (-s); + } else { + return s; + } +} + +int _from(int s) => (s & _negative > 0 ? -1 : 1) * (s & _module); + +int _setLow(final int v, final int s) { + var r = (v & _highInt) + _to(s); + // // TODO comment me + // if (_getLow(r) != s) { + // throw Exception('v=${v.toRadixString(2)} s=${s.toRadixString(2)} r=${r.toRadixString(2)} low=${_getLow(r).toRadixString(2)}'); + // } + return r; +} +int _getLow(int v) => _from(v & _lowInt); +int _setHigh(final int v, final int s) { + var r = (_to(s) << 32) + (v & _lowInt); + // // TODO comment me + // if (_getHigh(r) != s) { + // throw Exception('v=${v.toRadixString(2)} s=${s.toRadixString(2)} r=${r.toRadixString(2)} high=${_getHigh(r).toRadixString(2)}'); + // } + return r; +} +int _getHigh(int v) => _from((v & _highInt) >> 32); + abstract class Core { static const int missingId = -1; covariant late T context; @@ -46,39 +85,26 @@ abstract class Core { @mustCallSuper void onRemoved() {} - int id = missingId; - // var _meta = missing; - // int get id => _meta.id; - // set id(int id) { - // if (this.id != id) { - // _meta = _meta.setId(id); - // } - // } - - // static const int disposedId = -2; - // void onRemoved() => calloc.free(_id); - // final Pointer _id = using((Arena arena) => arena(2)); - // final Pointer _id = calloc(2); - // int get id => _id.cast().value; - // set id(int value) => _id.cast().value = value; + // int id = missingId; - // Core() { - // id = missingId; - // } + int _value = _setLow(0, missingId); + // @nonVirtual + // int get id => _getLow(_value); + // @nonVirtual + // set id(int id) => _value = _setLow(_value, id); + // @nonVirtual + // int get high => _getHigh(_value); + // @nonVirtual + // set high(int high) => _value = _setHigh(_value, high); + @nonVirtual + int get id => _from(_value & _lowInt); + @nonVirtual + set id(int id) => _value = (_value & _highInt) + _to(id); + @nonVirtual + int get high => _from((_value & _highInt) >> 32); + @nonVirtual + set high(int high) => _value = (_to(high) << 32) + (_value & _lowInt); - // @mustCallSuper - // bool dispose() { - // if (id == disposedId) { // already disposed - // return false; - // } - // id = disposedId; - // // if (Randoms().hit(0.01)) { - // // print('REMOVING > $runtimeType'); - // // } - // calloc.free(_id); - // print('FREE > ${_id.address} ${id}'); - // return true; - // } // TODO override this method with a static field, see KeyFrameDoubleBase as example Set get coreTypes => _coreTypes;//{}; @@ -92,13 +118,6 @@ abstract class Core { bool import(ImportStack stack) => true; void remove() => context.removeObject(this); - // @nonVirtual - // void remove() { - // context.removeObject(this); - // if (Randoms().hit(0.1)) { - // print('REMOVING > $runtimeType'); - // } - // } bool validate() => true; diff --git a/lib/src/generated/animation/keyed_object_base.dart b/lib/src/generated/animation/keyed_object_base.dart index 84d94ed7..2faf5691 100644 --- a/lib/src/generated/animation/keyed_object_base.dart +++ b/lib/src/generated/animation/keyed_object_base.dart @@ -20,8 +20,15 @@ abstract class KeyedObjectBase extends Core { static const int objectIdInitialValue = 0; /// Identifier used to track the object that is keyed. + // @nonVirtual + // int objectId = objectIdInitialValue; + + @nonVirtual + int get objectId => high; @nonVirtual - int objectId = objectIdInitialValue; + set objectId(int frame) => high = frame; + + // /// Identifier used to track the object that is keyed. // int get objectId => _objectId; diff --git a/lib/src/generated/animation/keyframe_base.dart b/lib/src/generated/animation/keyframe_base.dart index f642f6bc..6f23359f 100644 --- a/lib/src/generated/animation/keyframe_base.dart +++ b/lib/src/generated/animation/keyframe_base.dart @@ -16,37 +16,13 @@ abstract class KeyFrameBase extends Core { static const int frameInitialValue = 0; /// Timecode as frame number can be converted to time by dividing by animation fps - @nonVirtual - int frame = frameInitialValue; - - // var _meta = CoreMetas.frameInitialValue; - // @nonVirtual - // int get frame => _meta.frame; // @nonVirtual - // set frame(int frame) { - // if (this.frame != frame) { - // _meta = _meta.setFrame(frame); - // } - // } + // int frame = frameInitialValue; - // /// Timecode as frame number can be converted to time by dividing by animation - // /// fps. - // int get frame => _frame; - // - // /// Change the [_frame] field value. - // /// [frameChanged] will be invoked only if the field's value has changed. - // set frame(int value) { - // if (_frame == value) { - // return; - // } - // int from = _frame; - // _frame = value; - // if (hasValidated) { - // frameChanged(from, value); - // } - // } - - // void frameChanged(int from, int to); + @nonVirtual + int get frame => high; + @nonVirtual + set frame(int frame) => high = frame; @override void copy(Core source) { diff --git a/lib/src/rive_core/animation/interpolating_keyframe.dart b/lib/src/rive_core/animation/interpolating_keyframe.dart index 5eeddfc3..a8e160b3 100644 --- a/lib/src/rive_core/animation/interpolating_keyframe.dart +++ b/lib/src/rive_core/animation/interpolating_keyframe.dart @@ -12,11 +12,8 @@ abstract class InterpolatingKeyFrame extends InterpolatingKeyFrameBase { @override bool get canInterpolate => true; - KeyFrameInterpolation get interpolation => - enumAt(KeyFrameInterpolation.values, interpolationType); - set interpolation(KeyFrameInterpolation value) { - interpolationType = value.index; - } + KeyFrameInterpolation get interpolation => enumAt(KeyFrameInterpolation.values, interpolationType); + set interpolation(KeyFrameInterpolation value) => interpolationType = value.index; Interpolator _interpolator = Interpolators.initial; Interpolator? get interpolator => _interpolator == Interpolators.initial ? null : _interpolator; diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index 84e8a6ff..e9d778fe 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -324,8 +324,7 @@ class RiveFile { if (object.validate()) { InternalCoreHelper.markValid(object); } else { - throw RiveFormatErrorException( - 'Rive file is corrupt. Invalid $object.'); + throw RiveFormatErrorException('Rive file is corrupt. Invalid $object.'); } } } From cda2092c39190415e0e992133467da942e5b1af2 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Tue, 25 Feb 2025 11:37:05 +0000 Subject: [PATCH 35/50] moving coreTypes to static initialization --- .../animation/interpolating_keyframe_base.dart | 5 +++-- lib/src/generated/animation/keyframe_base.dart | 4 +++- .../transition_input_condition_base.dart | 5 +++-- lib/src/generated/component_base.dart | 4 +++- .../constraints/distance_constraint_base.dart | 14 ++++++++------ lib/src/generated/draw_rules_base.dart | 12 +++++++----- lib/src/generated/node_base.dart | 16 +++++++++------- .../shapes/cubic_asymmetric_vertex_base.dart | 18 ++++++++++-------- .../shapes/cubic_mirrored_vertex_base.dart | 18 ++++++++++-------- .../shapes/paint/gradient_stop_base.dart | 4 +++- .../shapes/paint/solid_color_base.dart | 4 +++- .../generated/shapes/paint/stroke_base.dart | 14 ++++++++------ .../generated/shapes/straight_vertex_base.dart | 16 +++++++++------- lib/src/generated/shapes/vertex_base.dart | 12 +++++++----- lib/src/generated/solo_base.dart | 18 ++++++++++-------- .../generated/transform_component_base.dart | 14 ++++++++------ .../world_transform_component_base.dart | 12 +++++++----- 17 files changed, 111 insertions(+), 79 deletions(-) diff --git a/lib/src/generated/animation/interpolating_keyframe_base.dart b/lib/src/generated/animation/interpolating_keyframe_base.dart index 827e5a5c..eaa30634 100644 --- a/lib/src/generated/animation/interpolating_keyframe_base.dart +++ b/lib/src/generated/animation/interpolating_keyframe_base.dart @@ -5,13 +5,14 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/animation/keyframe.dart'; +const _coreTypes = {InterpolatingKeyFrameBase.typeKey, KeyFrameBase.typeKey}; + abstract class InterpolatingKeyFrameBase extends KeyFrame { static const int typeKey = 170; @override int get coreType => InterpolatingKeyFrameBase.typeKey; @override - Set get coreTypes => - {InterpolatingKeyFrameBase.typeKey, KeyFrameBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// InterpolationType field with key 68. diff --git a/lib/src/generated/animation/keyframe_base.dart b/lib/src/generated/animation/keyframe_base.dart index 6f23359f..52532b47 100644 --- a/lib/src/generated/animation/keyframe_base.dart +++ b/lib/src/generated/animation/keyframe_base.dart @@ -3,12 +3,14 @@ import 'package:rive/src/core/core.dart'; +const _coreTypes = {KeyFrameBase.typeKey}; + abstract class KeyFrameBase extends Core { static const int typeKey = 29; @override int get coreType => KeyFrameBase.typeKey; @override - Set get coreTypes => {KeyFrameBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Frame field with key 67. diff --git a/lib/src/generated/animation/transition_input_condition_base.dart b/lib/src/generated/animation/transition_input_condition_base.dart index 9026c409..55b6d300 100644 --- a/lib/src/generated/animation/transition_input_condition_base.dart +++ b/lib/src/generated/animation/transition_input_condition_base.dart @@ -5,13 +5,14 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/animation/transition_condition.dart'; +const _coreTypes = {TransitionInputConditionBase.typeKey, TransitionConditionBase.typeKey}; + abstract class TransitionInputConditionBase extends TransitionCondition { static const int typeKey = 67; @override int get coreType => TransitionInputConditionBase.typeKey; @override - Set get coreTypes => - {TransitionInputConditionBase.typeKey, TransitionConditionBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// InputId field with key 155. diff --git a/lib/src/generated/component_base.dart b/lib/src/generated/component_base.dart index 2f795c16..5f3253f9 100644 --- a/lib/src/generated/component_base.dart +++ b/lib/src/generated/component_base.dart @@ -3,12 +3,14 @@ import 'package:rive/src/core/core.dart'; +const _coreTypes = {ComponentBase.typeKey}; + abstract class ComponentBase extends Core { static const int typeKey = 10; @override int get coreType => ComponentBase.typeKey; @override - Set get coreTypes => {ComponentBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Name field with key 4. diff --git a/lib/src/generated/constraints/distance_constraint_base.dart b/lib/src/generated/constraints/distance_constraint_base.dart index dc5c38ef..bc410241 100644 --- a/lib/src/generated/constraints/distance_constraint_base.dart +++ b/lib/src/generated/constraints/distance_constraint_base.dart @@ -7,17 +7,19 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/constraints/constraint_base.dart'; import 'package:rive/src/rive_core/constraints/targeted_constraint.dart'; +const _coreTypes = { + DistanceConstraintBase.typeKey, + TargetedConstraintBase.typeKey, + ConstraintBase.typeKey, + ComponentBase.typeKey +}; + abstract class DistanceConstraintBase extends TargetedConstraint { static const int typeKey = 82; @override int get coreType => DistanceConstraintBase.typeKey; @override - Set get coreTypes => { - DistanceConstraintBase.typeKey, - TargetedConstraintBase.typeKey, - ConstraintBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Distance field with key 177. diff --git a/lib/src/generated/draw_rules_base.dart b/lib/src/generated/draw_rules_base.dart index 46a81fdc..3258c549 100644 --- a/lib/src/generated/draw_rules_base.dart +++ b/lib/src/generated/draw_rules_base.dart @@ -5,16 +5,18 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/rive_core/container_component.dart'; +const _coreTypes = { + DrawRulesBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class DrawRulesBase extends ContainerComponent { static const int typeKey = 49; @override int get coreType => DrawRulesBase.typeKey; @override - Set get coreTypes => { - DrawRulesBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// DrawTargetId field with key 121. diff --git a/lib/src/generated/node_base.dart b/lib/src/generated/node_base.dart index b3d16936..e70acd72 100644 --- a/lib/src/generated/node_base.dart +++ b/lib/src/generated/node_base.dart @@ -7,18 +7,20 @@ import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/generated/world_transform_component_base.dart'; import 'package:rive/src/rive_core/transform_component.dart'; +const _coreTypes = { + NodeBase.typeKey, + TransformComponentBase.typeKey, + WorldTransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class NodeBase extends TransformComponent { static const int typeKey = 2; @override int get coreType => NodeBase.typeKey; @override - Set get coreTypes => { - NodeBase.typeKey, - TransformComponentBase.typeKey, - WorldTransformComponentBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// X field with key 13. diff --git a/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart b/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart index 930dfe59..44c0281f 100644 --- a/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart +++ b/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart @@ -9,19 +9,21 @@ import 'package:rive/src/generated/shapes/path_vertex_base.dart'; import 'package:rive/src/generated/shapes/vertex_base.dart'; import 'package:rive/src/rive_core/shapes/cubic_vertex.dart'; +const _coreTypes = { + CubicAsymmetricVertexBase.typeKey, + CubicVertexBase.typeKey, + PathVertexBase.typeKey, + VertexBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class CubicAsymmetricVertexBase extends CubicVertex { static const int typeKey = 34; @override int get coreType => CubicAsymmetricVertexBase.typeKey; @override - Set get coreTypes => { - CubicAsymmetricVertexBase.typeKey, - CubicVertexBase.typeKey, - PathVertexBase.typeKey, - VertexBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Rotation field with key 79. diff --git a/lib/src/generated/shapes/cubic_mirrored_vertex_base.dart b/lib/src/generated/shapes/cubic_mirrored_vertex_base.dart index 4a0b68cb..84820239 100644 --- a/lib/src/generated/shapes/cubic_mirrored_vertex_base.dart +++ b/lib/src/generated/shapes/cubic_mirrored_vertex_base.dart @@ -9,19 +9,21 @@ import 'package:rive/src/generated/shapes/path_vertex_base.dart'; import 'package:rive/src/generated/shapes/vertex_base.dart'; import 'package:rive/src/rive_core/shapes/cubic_vertex.dart'; +const _coreTypes = { + CubicMirroredVertexBase.typeKey, + CubicVertexBase.typeKey, + PathVertexBase.typeKey, + VertexBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class CubicMirroredVertexBase extends CubicVertex { static const int typeKey = 35; @override int get coreType => CubicMirroredVertexBase.typeKey; @override - Set get coreTypes => { - CubicMirroredVertexBase.typeKey, - CubicVertexBase.typeKey, - PathVertexBase.typeKey, - VertexBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Rotation field with key 82. diff --git a/lib/src/generated/shapes/paint/gradient_stop_base.dart b/lib/src/generated/shapes/paint/gradient_stop_base.dart index bf6117c6..7f564641 100644 --- a/lib/src/generated/shapes/paint/gradient_stop_base.dart +++ b/lib/src/generated/shapes/paint/gradient_stop_base.dart @@ -5,12 +5,14 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/component.dart'; +const _coreTypes = {GradientStopBase.typeKey, ComponentBase.typeKey}; + abstract class GradientStopBase extends Component { static const int typeKey = 19; @override int get coreType => GradientStopBase.typeKey; @override - Set get coreTypes => {GradientStopBase.typeKey, ComponentBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// ColorValue field with key 38. diff --git a/lib/src/generated/shapes/paint/solid_color_base.dart b/lib/src/generated/shapes/paint/solid_color_base.dart index d4da4ac3..86e042c0 100644 --- a/lib/src/generated/shapes/paint/solid_color_base.dart +++ b/lib/src/generated/shapes/paint/solid_color_base.dart @@ -5,12 +5,14 @@ import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/component.dart'; +const _coreTypes = {SolidColorBase.typeKey, ComponentBase.typeKey}; + abstract class SolidColorBase extends Component { static const int typeKey = 18; @override int get coreType => SolidColorBase.typeKey; @override - Set get coreTypes => {SolidColorBase.typeKey, ComponentBase.typeKey}; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// ColorValue field with key 37. diff --git a/lib/src/generated/shapes/paint/stroke_base.dart b/lib/src/generated/shapes/paint/stroke_base.dart index 91a83c44..9b17088e 100644 --- a/lib/src/generated/shapes/paint/stroke_base.dart +++ b/lib/src/generated/shapes/paint/stroke_base.dart @@ -7,17 +7,19 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/rive_core/shapes/paint/shape_paint.dart'; +const _coreTypes = { + StrokeBase.typeKey, + ShapePaintBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class StrokeBase extends ShapePaint { static const int typeKey = 24; @override int get coreType => StrokeBase.typeKey; @override - Set get coreTypes => { - StrokeBase.typeKey, - ShapePaintBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Thickness field with key 47. diff --git a/lib/src/generated/shapes/straight_vertex_base.dart b/lib/src/generated/shapes/straight_vertex_base.dart index 7f3b5927..80282585 100644 --- a/lib/src/generated/shapes/straight_vertex_base.dart +++ b/lib/src/generated/shapes/straight_vertex_base.dart @@ -9,18 +9,20 @@ import 'package:rive/src/generated/shapes/vertex_base.dart'; import 'package:rive/src/rive_core/bones/weight.dart'; import 'package:rive/src/rive_core/shapes/path_vertex.dart'; +const _coreTypes = { + StraightVertexBase.typeKey, + PathVertexBase.typeKey, + VertexBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class StraightVertexBase extends PathVertex { static const int typeKey = 5; @override int get coreType => StraightVertexBase.typeKey; @override - Set get coreTypes => { - StraightVertexBase.typeKey, - PathVertexBase.typeKey, - VertexBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Radius field with key 26. diff --git a/lib/src/generated/shapes/vertex_base.dart b/lib/src/generated/shapes/vertex_base.dart index 230e4cd6..451c8b7d 100644 --- a/lib/src/generated/shapes/vertex_base.dart +++ b/lib/src/generated/shapes/vertex_base.dart @@ -5,16 +5,18 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/rive_core/container_component.dart'; +const _coreTypes = { + VertexBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class VertexBase extends ContainerComponent { static const int typeKey = 107; @override int get coreType => VertexBase.typeKey; @override - Set get coreTypes => { - VertexBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// X field with key 24. diff --git a/lib/src/generated/solo_base.dart b/lib/src/generated/solo_base.dart index 1ef44bb0..ad3090dc 100644 --- a/lib/src/generated/solo_base.dart +++ b/lib/src/generated/solo_base.dart @@ -8,19 +8,21 @@ import 'package:rive/src/generated/transform_component_base.dart'; import 'package:rive/src/generated/world_transform_component_base.dart'; import 'package:rive/src/rive_core/node.dart'; +const _coreTypes = { + SoloBase.typeKey, + NodeBase.typeKey, + TransformComponentBase.typeKey, + WorldTransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class SoloBase extends Node { static const int typeKey = 147; @override int get coreType => SoloBase.typeKey; @override - Set get coreTypes => { - SoloBase.typeKey, - NodeBase.typeKey, - TransformComponentBase.typeKey, - WorldTransformComponentBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// ActiveComponentId field with key 296. diff --git a/lib/src/generated/transform_component_base.dart b/lib/src/generated/transform_component_base.dart index f80dc189..692a1da9 100644 --- a/lib/src/generated/transform_component_base.dart +++ b/lib/src/generated/transform_component_base.dart @@ -7,17 +7,19 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/rive_core/world_transform_component.dart'; +const _coreTypes = { + TransformComponentBase.typeKey, + WorldTransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class TransformComponentBase extends WorldTransformComponent { static const int typeKey = 38; @override int get coreType => TransformComponentBase.typeKey; @override - Set get coreTypes => { - TransformComponentBase.typeKey, - WorldTransformComponentBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Rotation field with key 15. diff --git a/lib/src/generated/world_transform_component_base.dart b/lib/src/generated/world_transform_component_base.dart index cdcaf19b..363226fc 100644 --- a/lib/src/generated/world_transform_component_base.dart +++ b/lib/src/generated/world_transform_component_base.dart @@ -6,16 +6,18 @@ import 'package:rive/src/generated/component_base.dart'; import 'package:rive/src/generated/container_component_base.dart'; import 'package:rive/src/rive_core/container_component.dart'; +const _coreTypes = { + WorldTransformComponentBase.typeKey, + ContainerComponentBase.typeKey, + ComponentBase.typeKey +}; + abstract class WorldTransformComponentBase extends ContainerComponent { static const int typeKey = 91; @override int get coreType => WorldTransformComponentBase.typeKey; @override - Set get coreTypes => { - WorldTransformComponentBase.typeKey, - ContainerComponentBase.typeKey, - ComponentBase.typeKey - }; + Set get coreTypes => _coreTypes; /// -------------------------------------------------------------------------- /// Opacity field with key 18. From ca93e6ba9a0ef136f0ce28e23013e3b541a2ec1d Mon Sep 17 00:00:00 2001 From: gauchoj Date: Wed, 26 Feb 2025 12:13:26 +0000 Subject: [PATCH 36/50] testing match animations --- .../rive_core/animation/keyed_property.dart | 90 +++++++++---------- 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index ca9f3c0f..94b6e2e5 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -3,7 +3,6 @@ import 'package:rive/src/generated/animation/keyed_property_base.dart'; import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/keyframe.dart'; -import 'package:stokanal/collections.dart'; import '../../../rive.dart'; import '../../generated/animation/nested_trigger_base.dart'; @@ -136,7 +135,7 @@ class KeyedProperty extends KeyedPropertyBase KeyFrame getFrameAt(int index) => _keyframes[index]; /// Return from and to frames - Pair _closestFramePair(double seconds) { + _ClosestFrame _closestFramePair(double seconds) { // Binary find the keyframe index (use timeInSeconds here as opposed to the // finder above which operates in frames). @@ -145,12 +144,12 @@ class KeyedProperty extends KeyedPropertyBase // If it's the last keyframe, we skip the binary search final last = _keyframes[lastIndex]; if (seconds >= last.seconds) { - return Pair(null, last); + return _ClosestFrame(null, last, seconds); } var first = _keyframes[0]; if (seconds <= first.seconds) { - return Pair(null, first); + return _ClosestFrame(null, first, seconds); } int start = 1; @@ -158,16 +157,16 @@ class KeyedProperty extends KeyedPropertyBase while (start <= end) { int mid = (start + end) >> 1; var keyframe = _keyframes[mid]; - if (keyframe.seconds < seconds) { + if (keyframe.seconds < seconds - _ClosestFrame._exactSecondsTolerance) { start = mid + 1; - } else if (keyframe.seconds > seconds) { + } else if (keyframe.seconds > seconds + _ClosestFrame._exactSecondsTolerance) { end = mid - 1; } else { - return Pair(null, keyframe); + return _ClosestFrame(null, keyframe, seconds); } } - return Pair(_keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start]); + return _ClosestFrame(_keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start], seconds); } int _closestFrameIndex(double seconds, {int exactOffset = 0}) { @@ -294,12 +293,16 @@ class KeyedProperty extends KeyedPropertyBase @override void onKeyframesChanged() { - _seconds = -1; + // _seconds = -1; _pair = null; } - double _seconds = -1; - Pair? _pair; + _ClosestFrame? _pair; + + // uncomment me for stats + // static var _applies = 0; + // static var _hits = 0; + // static var _toleranceHits = 0; /// Apply keyframe values at a given time expressed in [seconds]. void apply(double seconds, double mix, Core object) { @@ -307,60 +310,36 @@ class KeyedProperty extends KeyedPropertyBase return; } - // var calculated = false; - if (_seconds != seconds) { // if seconds coincide, return value from last run - _seconds = seconds; + // _applies++; + if (_pair != null && seconds >= _pair!.seconds - _ClosestFrame._exactSecondsTolerance && seconds <= _pair!.seconds + _ClosestFrame._exactSecondsTolerance) { // it's a hit + // _hits++; + // if (seconds != _pair!.seconds) { + // _toleranceHits++; + // } + // if (_hits % 1000000 == 0) { + // print('HITS > $_hits $_toleranceHits > hits=${(_hits/_applies).toStringAsFixed(2)} tolerance=${(_toleranceHits/_hits).toStringAsFixed(2)}'); + // } + } else { _pair = _closestFramePair(seconds); - // calculated = true; } - // // validate _closestFrameIndex method - // int idx = closestFrameIndex(seconds); - // Pair pair; - // if (idx == 0) { - // pair = Pair.of(null, _keyframes[0]); - // // _keyframes[0].apply(object, pk, mix); - // } else { - // if (idx < _keyframes.length) { - // InterpolatingKeyFrame fromFrame = _keyframes[idx - 1] as InterpolatingKeyFrame; - // KeyFrame toFrame = _keyframes[idx]; - // if (seconds == toFrame.seconds) { - // pair = Pair.of(null, toFrame); - // // toFrame.apply(object, pk, mix); - // } else { - // if (fromFrame.interpolationType == 0) { - // pair = Pair.of(fromFrame, toFrame); - // // fromFrame.apply(object, pk, mix); - // } else { - // pair = Pair.of(fromFrame, toFrame); - // // fromFrame.applyInterpolation(object, pk, seconds, toFrame, mix); - // } - // } - // } else { - // pair = Pair.of(null, _keyframes[idx - 1]); - // // _keyframes[idx - 1].apply(object, pk, mix); - // } - // } - // if (_pair != pair) { - // throw Exception('$_pair != $pair > calculated=$calculated keyframes=${_keyframes.length} idx=$idx index=${_keyframes.indexOf(_pair!.right)} ${_keyframes.indexOf(pair.right)}'); + // if (_pair == null || _pair!.seconds != seconds) { + // _pair = _closestFramePair(seconds); // } - var fromFrame = _pair!.key; + var fromFrame = _pair!.fromFrame; if (fromFrame != null) { // interpolation if (fromFrame.interpolationType == 0) { fromFrame.apply(object, propertyBean, mix); } else { - fromFrame.applyInterpolation(object, propertyBean, seconds, _pair!.value, mix); + fromFrame.applyInterpolation(object, propertyBean, seconds, _pair!.toFrame, mix); } } else { - _pair!.value.apply(object, propertyBean, mix); + _pair!.toFrame.apply(object, propertyBean, mix); } } - // @override - // void propertyKeyChanged(int from, int to) {} - @override bool import(ImportStack stack) { var importer = stack.latest(KeyedObjectBase.typeKey); @@ -372,3 +351,14 @@ class KeyedProperty extends KeyedPropertyBase return super.import(stack); } } + +class _ClosestFrame { + final InterpolatingKeyFrame? fromFrame; + final KeyFrame toFrame; + final double seconds; + _ClosestFrame(this.fromFrame, this.toFrame, this.seconds); + + /// This value creates a tolerance when resolving frames. + /// Increasing it will make animations less smooth (less interpolations) and improve performance. + static const _exactSecondsTolerance = 0.06; +} \ No newline at end of file From 10843fb45ec626c92a121ae6b4f62a14c380307e Mon Sep 17 00:00:00 2001 From: gauchoj Date: Wed, 5 Mar 2025 19:22:54 +0000 Subject: [PATCH 37/50] implemented dynamic closestFrame exactsSecondsTolerance & optimizations to artboard & runtime_artboard --- .../rive_core/animation/keyed_property.dart | 43 +++++++------- lib/src/rive_core/artboard.dart | 46 ++++++++------- lib/src/runtime_artboard.dart | 57 +++++++++++-------- 3 files changed, 83 insertions(+), 63 deletions(-) diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 94b6e2e5..8f8777ee 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -3,6 +3,7 @@ import 'package:rive/src/generated/animation/keyed_property_base.dart'; import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/keyframe.dart'; +import 'package:stokanal/rive/rive_settings.dart' as rive_settings; import '../../../rive.dart'; import '../../generated/animation/nested_trigger_base.dart'; @@ -135,7 +136,7 @@ class KeyedProperty extends KeyedPropertyBase KeyFrame getFrameAt(int index) => _keyframes[index]; /// Return from and to frames - _ClosestFrame _closestFramePair(double seconds) { + _ClosestFrame _closestFramePair(final double seconds) { // Binary find the keyframe index (use timeInSeconds here as opposed to the // finder above which operates in frames). @@ -143,13 +144,15 @@ class KeyedProperty extends KeyedPropertyBase // If it's the last keyframe, we skip the binary search final last = _keyframes[lastIndex]; + final secondsMin = seconds - rive_settings.interpolationExactSecondsTolerance; + final secondsMax = seconds + rive_settings.interpolationExactSecondsTolerance; if (seconds >= last.seconds) { - return _ClosestFrame(null, last, seconds); + return _ClosestFrame(null, last, secondsMin, secondsMax); } var first = _keyframes[0]; if (seconds <= first.seconds) { - return _ClosestFrame(null, first, seconds); + return _ClosestFrame(null, first, secondsMin, secondsMax); } int start = 1; @@ -157,16 +160,16 @@ class KeyedProperty extends KeyedPropertyBase while (start <= end) { int mid = (start + end) >> 1; var keyframe = _keyframes[mid]; - if (keyframe.seconds < seconds - _ClosestFrame._exactSecondsTolerance) { + if (keyframe.seconds < secondsMin) { start = mid + 1; - } else if (keyframe.seconds > seconds + _ClosestFrame._exactSecondsTolerance) { + } else if (keyframe.seconds > secondsMax) { end = mid - 1; } else { - return _ClosestFrame(null, keyframe, seconds); + return _ClosestFrame(null, keyframe, secondsMin, secondsMax); } } - return _ClosestFrame(_keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start], seconds); + return _ClosestFrame(_keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start], secondsMin, secondsMax); } int _closestFrameIndex(double seconds, {int exactOffset = 0}) { @@ -299,7 +302,7 @@ class KeyedProperty extends KeyedPropertyBase _ClosestFrame? _pair; - // uncomment me for stats + // // uncomment me for stats // static var _applies = 0; // static var _hits = 0; // static var _toleranceHits = 0; @@ -311,9 +314,11 @@ class KeyedProperty extends KeyedPropertyBase } // _applies++; - if (_pair != null && seconds >= _pair!.seconds - _ClosestFrame._exactSecondsTolerance && seconds <= _pair!.seconds + _ClosestFrame._exactSecondsTolerance) { // it's a hit + if (_pair != null && + seconds >= _pair!.secondsMin && + seconds <= _pair!.secondsMax) { // it's a hit // _hits++; - // if (seconds != _pair!.seconds) { + // if (seconds != _pair!._seconds) { // _toleranceHits++; // } // if (_hits % 1000000 == 0) { @@ -323,10 +328,6 @@ class KeyedProperty extends KeyedPropertyBase _pair = _closestFramePair(seconds); } - // if (_pair == null || _pair!.seconds != seconds) { - // _pair = _closestFramePair(seconds); - // } - var fromFrame = _pair!.fromFrame; if (fromFrame != null) { // interpolation @@ -355,10 +356,14 @@ class KeyedProperty extends KeyedPropertyBase class _ClosestFrame { final InterpolatingKeyFrame? fromFrame; final KeyFrame toFrame; - final double seconds; - _ClosestFrame(this.fromFrame, this.toFrame, this.seconds); + // final double seconds; + final double secondsMin; + final double secondsMax; + _ClosestFrame(this.fromFrame, this.toFrame, this.secondsMin, this.secondsMax); + + // double get _seconds => (secondsMin + secondsMax)/2.0; - /// This value creates a tolerance when resolving frames. - /// Increasing it will make animations less smooth (less interpolations) and improve performance. - static const _exactSecondsTolerance = 0.06; + // /// This value creates a tolerance when resolving frames. + // /// Increasing it will make animations less smooth (less interpolations) and improve performance. + // static const _exactSecondsTolerance = 0.06; } \ No newline at end of file diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index a7d5c763..3c75d178 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -102,42 +102,46 @@ class Artboard extends ArtboardBase with ShapePaintContainer { final Path path = Path(); List _dependencyOrder = []; - final List _drawables = []; final List _rules = []; List _sortedDrawRules = []; final _components = UniqueList.of(); - List get drawables => _drawables; + @nonVirtual + final List drawables = []; + // List get drawables => _drawables; - final AnimationList _animations = AnimationList(); - final EventList _events = EventList(); + @nonVirtual + final AnimationList animations = AnimationList(); + @nonVirtual + final EventList events = EventList(); /// List of animations and state machines in the artboard. - AnimationList get animations => _animations; + // AnimationList get animations => _animations; /// List of events in the artboard. - EventList get events => _events; + // EventList get events => _events; DataContext? dataContext; final List globalDataBinds = []; /// List of linear animations in the artboard. Iterable get linearAnimations => - _animations.whereType(); + animations.whereType(); /// List of state machines in the artboard. Iterable get stateMachines => - _animations.whereType(); + animations.whereType(); int _dirtDepth = 0; /// Iterate each component and call callback for it. void forEachComponent(void Function(Component) callback) { - for (final c in _components) { - callback(c); + var t = _components.length; + for (var i = 0; i < t; i++) { + // for (final c in _components) { + callback(_components[i]); } - // _components.forEach(callback); } /// Find a component of a specific type with a specific name. @@ -540,10 +544,10 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// Called by rive_core to add an Animation to an Artboard. This should be /// @internal when it's supported. bool internalAddAnimation(Animation animation) { - if (_animations.contains(animation)) { + if (animations.contains(animation)) { return false; } - _animations.add(animation); + animations.add(animation); return true; } @@ -551,7 +555,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// Called by rive_core to remove an Animation from an Artboard. This should /// be @internal when it's supported. bool internalRemoveAnimation(Animation animation) { - bool removed = _animations.remove(animation); + bool removed = animations.remove(animation); return removed; } @@ -559,10 +563,10 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// Called by rive_core to add an Event to an Artboard. This should be /// @internal when it's supported. bool internalAddEvent(Event event) { - if (_events.contains(event)) { + if (events.contains(event)) { return false; } - _events.add(event); + events.add(event); return true; } @@ -570,7 +574,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { /// Called by rive_core to remove an Event from an Artboard. This should /// be @internal when it's supported. bool internalRemoveEvent(Event event) { - bool removed = _events.remove(event); + bool removed = events.remove(event); return removed; } @@ -634,9 +638,9 @@ class Artboard extends ArtboardBase with ShapePaintContainer { Drawable? firstDrawable; void computeDrawOrder() { - _drawables.clear(); + drawables.clear(); _rules.clear(); - buildDrawOrder(_drawables, null, _rules); + buildDrawOrder(drawables, null, _rules); // Build rule dependencies. In practice this'll need to happen anytime a // target drawable is changed or rule is added/removed. @@ -714,10 +718,10 @@ class Artboard extends ArtboardBase with ShapePaintContainer { firstDrawable = null; Drawable? lastDrawable; - length = _drawables.length; + length = drawables.length; for (var i = 0; i < length; i++) { // for (final drawable in _drawables) { - final drawable = _drawables[i]; + final drawable = drawables[i]; var rules = drawable.flattenedDrawRules; var target = rules?.activeTarget; diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index 1763e652..ad208875 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -95,14 +95,16 @@ extension ArtboardRuntimeExtensions on Artboard { /// directly referenced. Use the Artboard type for any direct interactions with /// an artboard, and use extension methods to add functionality to Artboard. class RuntimeArtboard extends Artboard implements CoreContext { - final _redraw = Notifier(); - ChangeNotifier get redraw => _redraw; + @nonVirtual + final redraw = Notifier(); + // ChangeNotifier get redraw => _redraw; /// Note that objects must be nullable as some may not resolve during load due /// to format differences. - final _objects = []; + @nonVirtual + final objects = []; + // Iterable get objects => _objects; - Iterable get objects => _objects; final _needDependenciesBuilt = {}; /// Indicates if this artboard is playing or paused @@ -111,14 +113,14 @@ class RuntimeArtboard extends Artboard implements CoreContext { @override T? addObject(T? object) { object?.context = this; - object?.id = _objects.length; - _objects.add(object); + object?.id = objects.length; + objects.add(object); return object; } @override void removeObject(T object) { - _objects.remove(object); + objects.remove(object); } @override @@ -159,10 +161,10 @@ class RuntimeArtboard extends Artboard implements CoreContext { @override T? resolve(int id) { - if (id < 0 || id >= _objects.length) { + if (id < 0 || id >= objects.length) { return null; } - var object = _objects[id]; + var object = objects[id]; if (object is T) { return object as T; } @@ -171,10 +173,10 @@ class RuntimeArtboard extends Artboard implements CoreContext { @override T resolveWithDefault(int id, T defaultValue) { - if (id < 0 || id >= _objects.length) { + if (id < 0 || id >= objects.length) { return defaultValue; } - var object = _objects[id]; + var object = objects[id]; if (object is T) { return object as T; } @@ -192,7 +194,7 @@ class RuntimeArtboard extends Artboard implements CoreContext { @override void markNeedsAdvance() { - _redraw.notify(); + redraw.notify(); } @override @@ -201,16 +203,23 @@ class RuntimeArtboard extends Artboard implements CoreContext { artboard.context = artboard; artboard.frameOrigin = frameOrigin; artboard.copy(this); - artboard._objects.add(artboard); + artboard.objects.add(artboard); // First copy the objects ensuring onAddedDirty can later find them in the // _objects list. - for (final object in _objects.skip(1)) { - Core? clone = object?.clone(); - artboard.addObject(clone); + + var t = objects.length; + // for (final object in _objects.skip(1)) { + for (var i = 1; i < t; i++) { + // Core? clone = object?.clone(); + // artboard.addObject(clone); + artboard.addObject(objects[i]?.clone()); } // Then run the onAddedDirty loop. - for (final object in artboard.objects.skip(1)) { + t = artboard.objects.length; + // for (final object in artboard.objects.skip(1)) { + for (var i = 1; i < t; i++) { + var object = artboard.objects[i]; if (object is Component && object.parentId == ComponentBase.parentIdInitialValue) { object.parent = artboard; @@ -218,12 +227,16 @@ class RuntimeArtboard extends Artboard implements CoreContext { object?.onAddedDirty(); } - // animations.forEach(artboard.animations.add); - for (final a in animations) { - artboard.animations.add(a); + t = animations.length; + // for (final a in animations) { + for (var i = 0; i < t; i++) { + artboard.animations.add(animations[i]); } - for (final object in artboard.objects) { //.toList(growable: false)) { + t = artboard.objects.length; + // for (final object in artboard.objects) { + for (var i = 0; i < t; i++) { + var object = artboard.objects[i]; if (object == null) { continue; } @@ -232,8 +245,6 @@ class RuntimeArtboard extends Artboard implements CoreContext { } artboard.clean(); - // dump(); - return artboard; } From 01efd79116226e5f711f6d0fe461e472e903c09a Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 6 Mar 2025 11:32:25 +0000 Subject: [PATCH 38/50] removing specific rive animations from interpolation interval --- lib/src/generated/rive_core_beans.dart | 14 ++- .../rive_core/animation/keyed_property.dart | 85 +++++++++++++------ lib/src/rive_core/artboard.dart | 32 +++---- lib/src/rive_file.dart | 55 ++++++++++-- 4 files changed, 132 insertions(+), 54 deletions(-) diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index f7eda4ff..9d06beb0 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -243,7 +243,8 @@ class FallbackBean extends PropertyBean { String toString() => 'FallbackBean[$propertyKey, $_hits]'; } -final _map = {}; +// final _map = {}; +final _list = List.filled(1000, null); // use a list to map from property keys final _invalid = PropertyBean._(CoreContext.invalidPropertyKey); var _first = true; final _implements = [ @@ -297,15 +298,20 @@ abstract class PropertyBeans { if (_first) { _first = false; - _implements.forEach((bean) => _map[bean.propertyKey] = bean); + // _implements.forEach((bean) => _map[bean.propertyKey] = bean); + _implements.forEach((bean) => _list[bean.propertyKey] = bean); } - return _map.putIfAbsent(propertyKey, () => FallbackBean._(propertyKey)); + // return _map.putIfAbsent(propertyKey, () => FallbackBean._(propertyKey)); + return _list[propertyKey] ?? (_list[propertyKey] = FallbackBean._(propertyKey)); } // ignore: unused_element static void _dumpFallbacks() { - info('\n${_map.values.whereType().sorted((b1, b2) => b2._hits.compareTo(b1._hits)).map((b) => '$b').join('\n')}'); + info('\n${ + // _map.values + _list.whereNotNull() + .whereType().sorted((b1, b2) => b2._hits.compareTo(b1._hits)).map((b) => '$b').join('\n')}'); } } diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 8f8777ee..856d1dd6 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyed_property_base.dart'; import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; @@ -144,8 +146,17 @@ class KeyedProperty extends KeyedPropertyBase // If it's the last keyframe, we skip the binary search final last = _keyframes[lastIndex]; - final secondsMin = seconds - rive_settings.interpolationExactSecondsTolerance; - final secondsMax = seconds + rive_settings.interpolationExactSecondsTolerance; + + final double secondsMin; + final double secondsMax; + if (_skipInterpolation) { // no interpolation + secondsMin = seconds; + secondsMax = seconds; + } else { + secondsMin = seconds - rive_settings.interpolationExactSecondsTolerance; + secondsMax = seconds + rive_settings.interpolationExactSecondsTolerance; + } + if (seconds >= last.seconds) { return _ClosestFrame(null, last, secondsMin, secondsMax); } @@ -296,12 +307,19 @@ class KeyedProperty extends KeyedPropertyBase @override void onKeyframesChanged() { - // _seconds = -1; - _pair = null; + // if (_pair is! _SkipInterpolation) { + _pair = null; + // } } _ClosestFrame? _pair; + var _skipInterpolation = false; + void skipInterpolationTolerance() { + // _pair = _skipInterpolation; + _skipInterpolation = true; + } + // // uncomment me for stats // static var _applies = 0; // static var _hits = 0; @@ -314,30 +332,44 @@ class KeyedProperty extends KeyedPropertyBase } // _applies++; - if (_pair != null && - seconds >= _pair!.secondsMin && - seconds <= _pair!.secondsMax) { // it's a hit - // _hits++; - // if (seconds != _pair!._seconds) { - // _toleranceHits++; - // } - // if (_hits % 1000000 == 0) { - // print('HITS > $_hits $_toleranceHits > hits=${(_hits/_applies).toStringAsFixed(2)} tolerance=${(_toleranceHits/_hits).toStringAsFixed(2)}'); - // } - } else { - _pair = _closestFramePair(seconds); + + var pair = _pair; + if (pair != null) { + if (_skipInterpolation) { // no interpolation, lookup and don't reset + pair = _closestFramePair(seconds); + log('SKIP INTERPOLATION'); + } else if (seconds >= pair.secondsMin && seconds <= pair.secondsMax) { // reuse + // _hits++; + // if (seconds != _pair!._seconds) { + // _toleranceHits++; + // } + // if (_hits % 1000000 == 0) { + // print('HITS > $_hits $_toleranceHits > hits=${(_hits/_applies).toStringAsFixed(2)} tolerance=${(_toleranceHits/_hits).toStringAsFixed(2)}'); + // } + } else { // lookup and reset + _pair = pair = _closestFramePair(seconds); + } + } else { // lookup and reset + _pair = pair = _closestFramePair(seconds); } - var fromFrame = _pair!.fromFrame; + // if (_pair != null && + // seconds >= _pair!.secondsMin && + // seconds <= _pair!.secondsMax) { // it's a hit + // } else { + // _pair = _closestFramePair(seconds); + // } + + var fromFrame = pair.fromFrame; if (fromFrame != null) { // interpolation if (fromFrame.interpolationType == 0) { fromFrame.apply(object, propertyBean, mix); } else { - fromFrame.applyInterpolation(object, propertyBean, seconds, _pair!.toFrame, mix); + fromFrame.applyInterpolation(object, propertyBean, seconds, pair.toFrame, mix); } } else { - _pair!.toFrame.apply(object, propertyBean, mix); + pair.toFrame.apply(object, propertyBean, mix); } } @@ -356,14 +388,13 @@ class KeyedProperty extends KeyedPropertyBase class _ClosestFrame { final InterpolatingKeyFrame? fromFrame; final KeyFrame toFrame; - // final double seconds; final double secondsMin; final double secondsMax; - _ClosestFrame(this.fromFrame, this.toFrame, this.secondsMin, this.secondsMax); - - // double get _seconds => (secondsMin + secondsMax)/2.0; + const _ClosestFrame(this.fromFrame, this.toFrame, this.secondsMin, this.secondsMax); +} - // /// This value creates a tolerance when resolving frames. - // /// Increasing it will make animations less smooth (less interpolations) and improve performance. - // static const _exactSecondsTolerance = 0.06; -} \ No newline at end of file +// class _SkipInterpolation extends _ClosestFrame { +// _SkipInterpolation(): super(null, KeyFrameString(), 0, 0); +// } +// +// final _skipInterpolation = _SkipInterpolation(); diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index 3c75d178..2932f63b 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -213,20 +213,22 @@ class Artboard extends ArtboardBase with ShapePaintContainer { return didUpdate; } - final _activeNestedArtboards = UniqueList.of(); - Iterable get activeNestedArtboards => _activeNestedArtboards; + @nonVirtual + final activeNestedArtboards = UniqueList.of(); + // Iterable get activeNestedArtboards => _activeNestedArtboards; - final List _joysticks = []; - Iterable get joysticks => _joysticks; + @nonVirtual + final List joysticks = []; + // Iterable get joysticks => _joysticks; final List dataBinds = []; // Iterable get dataBinds => _dataBinds; bool canPreApplyJoysticks() { - if (_joysticks.length == 0) { + if (joysticks.length == 0) { return false; } - if (_joysticks.any((joystick) => joystick.isComplex)) { + if (joysticks.any((joystick) => joystick.isComplex)) { return false; } return true; @@ -245,10 +247,10 @@ class Artboard extends ArtboardBase with ShapePaintContainer { } bool applyJoysticks({bool isRoot = false}) { - if (_joysticks.isEmpty) { + if (joysticks.isEmpty) { return false; } - for (final joystick in _joysticks) { + for (final joystick in joysticks) { if (isRoot) { updateDataBinds(); } @@ -320,7 +322,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { if (nested) { // var active = _activeNestedArtboards.toList(growable: false); - for (final activeNestedArtboard in _activeNestedArtboards){//.toList(growable: false)) { + for (final activeNestedArtboard in activeNestedArtboards){//.toList(growable: false)) { if (activeNestedArtboard.advance(elapsedSeconds)) { didUpdate = true; } @@ -439,7 +441,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { case NestedTriggerBase.typeKey: break; case JoystickBase.typeKey: - _joysticks.add(component as Joystick); + joysticks.add(component as Joystick); break; case DataBindBase.typeKey: case DataBindContextBase.typeKey: @@ -461,7 +463,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { case NestedTriggerBase.typeKey: break; case JoystickBase.typeKey: - _joysticks.remove(component as Joystick); + joysticks.remove(component as Joystick); break; case DataBindBase.typeKey: case DataBindContextBase.typeKey: @@ -471,11 +473,11 @@ class Artboard extends ArtboardBase with ShapePaintContainer { } void addNestedArtboard(NestedArtboard artboard) { - _activeNestedArtboards.add(artboard); + activeNestedArtboards.add(artboard); } void removeNestedArtboard(NestedArtboard artboard) { - _activeNestedArtboards.remove(artboard); + activeNestedArtboards.remove(artboard); } /// Let the artboard know that the drawables need to be resorted before @@ -675,7 +677,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { void populateDataBinds(List globalDataBinds) { dataBinds.forEach(globalDataBinds.add); - for (final nestedArtboard in _activeNestedArtboards) { + for (final nestedArtboard in activeNestedArtboards) { final mountedArtboard = nestedArtboard.mountedArtboard; if (mountedArtboard != null) { mountedArtboard.populateDataBinds(globalDataBinds); @@ -838,7 +840,7 @@ class Artboard extends ArtboardBase with ShapePaintContainer { DataContext? parentDataContext, bool isRoot) { dataContext = dataContextValue; dataContext!.parent = parentDataContext; - for (final nestedArtboard in _activeNestedArtboards) { + for (final nestedArtboard in activeNestedArtboards) { final mountedArtboard = nestedArtboard.mountedArtboard; if (mountedArtboard != null) { ViewModelInstance? nestedViewModelInstance = diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index e9d778fe..50a4fa98 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -1,4 +1,5 @@ import 'dart:collection'; +import 'dart:developer'; import 'package:collection/collection.dart'; import 'package:flutter/services.dart'; @@ -42,6 +43,7 @@ import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; import 'package:rive/src/runtime_nested_artboard.dart'; import 'package:rive_common/rive_text.dart'; import 'package:rive_common/utilities.dart'; +import 'package:stokanal/rive/rive_settings.dart'; typedef Core? ObjectGenerator(int coreTypeKey); @@ -166,12 +168,21 @@ class RiveFile { return false; } + // final String? path; + // late final bool skipInterpolation; + RiveFile._( BinaryReader reader, this.header, ObjectGenerator? generator, - this._assetLoader, - ) { + this._assetLoader, { + String? path, + }) { + + var skipInterpolation = path != null && skipInterpolationRiveFiles.any(path.contains); + log('RIVE-FILE >> $path${skipInterpolation?' > SKIP_INTERPOLATION':''}'); + // debugPrintStack(); + /// Property fields table of contents final propertyToField = _propertyToFieldLookup(header); @@ -318,16 +329,39 @@ class RiveFile { throw const RiveFormatErrorException('Rive file is missing a backboard.'); } + // var objects = 0; + // var keyedProperties = 0; + for (final artboard in _artboards) { var runtimeArtboard = artboard as RuntimeArtboard; - for (final object in runtimeArtboard.objects.whereNotNull()) { - if (object.validate()) { - InternalCoreHelper.markValid(object); + final t = runtimeArtboard.objects.length; + // for (final object in runtimeArtboard.objects.whereNotNull()) { + for (var i = 0; i < t; i++) { + var object = runtimeArtboard.objects[i]; + if (object == null) { + continue; + } + // objects++; + // if (object is KeyedProperty) { + // keyedProperties++; + // } + if (skipInterpolation && object is KeyedProperty) { + object.skipInterpolationTolerance(); + } + + if (kDebugMode && true) { + if (object.validate()) { + InternalCoreHelper.markValid(object); + } else { + throw RiveFormatErrorException('Rive file is corrupt. Invalid $object.'); + } } else { - throw RiveFormatErrorException('Rive file is corrupt. Invalid $object.'); + InternalCoreHelper.markValid(object); } } } + + // log('RIVE-FILE >> $path >> objects=$objects keyedProperties=$keyedProperties'); } /// Imports a Rive file from an array of bytes. @@ -354,9 +388,9 @@ class RiveFile { FileAssetLoader? assetLoader, ObjectGenerator? objectGenerator, bool loadCdnAssets = true, + String? path, }) { - // TODO: in the next major version add an assert here to make this a - // requirement + // TODO: in the next major version add an assert here to make this a requirement if (!_initializedText) { /// STOKANAL-FORK-EDIT // debugPrint('''Rive: RiveFile.import called before RiveFile.initialize(). Consider calling `await RiveFile.initialize()` before using `RiveFile.import`'''); @@ -364,6 +398,7 @@ class RiveFile { var reader = BinaryReader(bytes); return RiveFile._( + path: path, reader, RuntimeHeader.read(reader), objectGenerator, @@ -410,6 +445,7 @@ class RiveFile { FileAssetLoader? assetLoader, bool loadCdnAssets = true, ObjectGenerator? objectGenerator, + String? path, }) async { /// If the file looks like it needs the text runtime, let's load it. if (!_initializedText) { @@ -420,6 +456,7 @@ class RiveFile { assetLoader: assetLoader, loadCdnAssets: loadCdnAssets, objectGenerator: objectGenerator, + path: path, ); } @@ -448,6 +485,7 @@ class RiveFile { assetLoader: assetLoader, loadCdnAssets: loadCdnAssets, objectGenerator: objectGenerator, + path: bundleKey, ); } @@ -494,6 +532,7 @@ class RiveFile { assetLoader: assetLoader, loadCdnAssets: loadCdnAssets, objectGenerator: objectGenerator, + path: path, ); } From c0b623628464790998b9036687558b91edca1c81 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 6 Mar 2025 16:24:45 +0000 Subject: [PATCH 39/50] UI optimization and setting player icons @ pre match --- lib/src/rive_core/animation/keyed_property.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 856d1dd6..44735a9b 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:rive/src/core/core.dart'; import 'package:rive/src/generated/animation/keyed_property_base.dart'; import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; @@ -324,6 +322,7 @@ class KeyedProperty extends KeyedPropertyBase // static var _applies = 0; // static var _hits = 0; // static var _toleranceHits = 0; + // var _skips = 0; /// Apply keyframe values at a given time expressed in [seconds]. void apply(double seconds, double mix, Core object) { @@ -337,7 +336,9 @@ class KeyedProperty extends KeyedPropertyBase if (pair != null) { if (_skipInterpolation) { // no interpolation, lookup and don't reset pair = _closestFramePair(seconds); - log('SKIP INTERPOLATION'); + // if (_skips++ % 1000 == 0) { + // log('SKIP INTERPOLATION'); + // } } else if (seconds >= pair.secondsMin && seconds <= pair.secondsMax) { // reuse // _hits++; // if (seconds != _pair!._seconds) { From 037489b03a30d348e9be391b88915ebfb5b28e0f Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 6 Mar 2025 18:49:11 +0000 Subject: [PATCH 40/50] for each -> for i --- .../controllers/state_machine_controller.dart | 24 +++--- .../generated/animation/layer_state_base.dart | 36 +++++---- .../animation/state_transition_base.dart | 37 +++++---- .../rive_core/animation/keyed_property.dart | 80 ++++++++++--------- lib/src/rive_core/animation/layer_state.dart | 16 ++-- .../rive_core/animation/state_transition.dart | 10 ++- .../rive_core/state_machine_controller.dart | 6 +- 7 files changed, 117 insertions(+), 92 deletions(-) diff --git a/lib/src/controllers/state_machine_controller.dart b/lib/src/controllers/state_machine_controller.dart index 1c7a3dbd..d8f1e69a 100644 --- a/lib/src/controllers/state_machine_controller.dart +++ b/lib/src/controllers/state_machine_controller.dart @@ -115,10 +115,13 @@ class SMITrigger extends SMIInput { /// the inputs of the StateMachine. class StateMachineController extends core.StateMachineController with RuntimeEventReporter { - final List _inputs = []; /// A list of inputs available in the StateMachine. - Iterable get inputs => _inputs; + @nonVirtual + final List inputs = []; + + // /// A list of inputs available in the StateMachine. + // Iterable get inputs => _inputs; final _runtimeEventListeners = {}; @@ -131,13 +134,13 @@ class StateMachineController extends core.StateMachineController for (final input in stateMachine.inputs) { switch (input.coreType) { case StateMachineNumberBase.typeKey: - _inputs.add(SMINumber._(input as StateMachineNumber, this)); + inputs.add(SMINumber._(input as StateMachineNumber, this)); break; case StateMachineBoolBase.typeKey: - _inputs.add(SMIBool._(input as StateMachineBool, this)); + inputs.add(SMIBool._(input as StateMachineBool, this)); break; case StateMachineTriggerBase.typeKey: - _inputs.add(SMITrigger._(input as StateMachineTrigger, this)); + inputs.add(SMITrigger._(input as StateMachineTrigger, this)); break; } } @@ -169,7 +172,7 @@ class StateMachineController extends core.StateMachineController /// For easier to use methods, see [getBoolInput], [getTriggerInput], /// [getNumberInput]. SMIInput? findInput(String name) { - for (final input in _inputs) { + for (final input in inputs) { if (input._is() && input.name == name) { return input as SMIInput; } @@ -182,7 +185,7 @@ class StateMachineController extends core.StateMachineController /// For easier to use methods, see [getBoolInput], [getTriggerInput], /// [getNumberInput]. T? findSMI(String name) { - for (final input in _inputs) { + for (final input in inputs) { if (input is T && input.name == name) { return input as T; } @@ -210,8 +213,11 @@ class StateMachineController extends core.StateMachineController @override void advanceInputs() { - for (final input in _inputs) { - input.advance(); + final t = inputs.length; + for (var i = 0; i < t; i++) { + // for (final input in _inputs) { + inputs[i].advance(); + // input.advance(); } } diff --git a/lib/src/generated/animation/layer_state_base.dart b/lib/src/generated/animation/layer_state_base.dart index 89b109b9..e7075c3b 100644 --- a/lib/src/generated/animation/layer_state_base.dart +++ b/lib/src/generated/animation/layer_state_base.dart @@ -17,29 +17,33 @@ abstract class LayerStateBase extends StateMachineLayerComponent { /// Flags field with key 536. static const int flagsPropertyKey = 536; static const int flagsInitialValue = 0; - int _flags = flagsInitialValue; - int get flags => _flags; - /// Change the [_flags] field value. - /// [flagsChanged] will be invoked only if the field's value has changed. - set flags(int value) { - if (_flags == value) { - return; - } - int from = _flags; - _flags = value; - if (hasValidated) { - flagsChanged(from, value); - } - } + int flags = flagsInitialValue; - void flagsChanged(int from, int to); + // int _flags = flagsInitialValue; + // int get flags => _flags; + // + // /// Change the [_flags] field value. + // /// [flagsChanged] will be invoked only if the field's value has changed. + // set flags(int value) { + // if (_flags == value) { + // return; + // } + // int from = _flags; + // _flags = value; + // if (hasValidated) { + // flagsChanged(from, value); + // } + // } + // + // void flagsChanged(int from, int to); @override void copy(Core source) { super.copy(source); if (source is LayerStateBase) { - _flags = source._flags; + // _flags = source._flags; + flags = source.flags; } } } diff --git a/lib/src/generated/animation/state_transition_base.dart b/lib/src/generated/animation/state_transition_base.dart index 846cc74f..0a3eb163 100644 --- a/lib/src/generated/animation/state_transition_base.dart +++ b/lib/src/generated/animation/state_transition_base.dart @@ -42,23 +42,25 @@ abstract class StateTransitionBase extends StateMachineLayerComponent { /// Flags field with key 152. static const int flagsPropertyKey = 152; static const int flagsInitialValue = 0; - int _flags = flagsInitialValue; - int get flags => _flags; - /// Change the [_flags] field value. - /// [flagsChanged] will be invoked only if the field's value has changed. - set flags(int value) { - if (_flags == value) { - return; - } - int from = _flags; - _flags = value; - if (hasValidated) { - flagsChanged(from, value); - } - } - - void flagsChanged(int from, int to); + int flags = flagsInitialValue; + + // int _flags = flagsInitialValue; + // int get flags => _flags; + // + // /// Change the [_flags] field value. + // /// [flagsChanged] will be invoked only if the field's value has changed. + // set flags(int value) { + // if (_flags == value) { + // return; + // } + // int from = _flags; + // _flags = value; + // if (hasValidated) { + // flagsChanged(from, value); + // } + // } + // void flagsChanged(int from, int to); /// -------------------------------------------------------------------------- /// Duration field with key 158. @@ -192,7 +194,8 @@ abstract class StateTransitionBase extends StateMachineLayerComponent { super.copy(source); if (source is StateTransitionBase) { _stateToId = source._stateToId; - _flags = source._flags; + // _flags = source._flags; + flags = source.flags; _duration = source._duration; _exitTime = source._exitTime; _interpolationType = source._interpolationType; diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 44735a9b..6a0c6136 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -16,12 +16,14 @@ abstract class KeyFrameInterface { class KeyFrameList { - var _keyframes = []; - List get keyframes => _keyframes; - set keyframes(Iterable frames) => _keyframes = frames.toList(); + @nonVirtual + List keyframes = []; - // T get firstKeyframe => _keyframes.first; + // var _keyframes = []; + // List get keyframes => _keyframes; + // set keyframes(Iterable frames) => _keyframes = frames.toList(); + // T get firstKeyframe => _keyframes.first; // void remove(T keyframe) { // _keyframes.remove(keyframe); // onKeyframesChanged(); @@ -31,9 +33,9 @@ class KeyFrameList { /// Get the keyframe immediately following the provided one. T? after(T keyframe) { - var index = _keyframes.indexOf(keyframe); - if (index != -1 && index + 1 < _keyframes.length) { - return _keyframes[index + 1]; + var index = keyframes.indexOf(keyframe); + if (index != -1 && index + 1 < keyframes.length) { + return keyframes[index + 1]; } return null; } @@ -45,11 +47,11 @@ class KeyFrameList { int mid = 0; int closestFrame = 0; int start = 0; - int end = _keyframes.length - 1; + int end = keyframes.length - 1; while (start <= end) { mid = (start + end) >> 1; - closestFrame = _keyframes[mid].frame; + closestFrame = keyframes[mid].frame; if (closestFrame < frame) { start = mid + 1; } else if (closestFrame > frame) { @@ -65,7 +67,7 @@ class KeyFrameList { } void sort() { - _keyframes.sort((a, b) => a.frame.compareTo(b.frame)); + keyframes.sort((a, b) => a.frame.compareTo(b.frame)); } } @@ -85,10 +87,10 @@ class KeyedProperty extends KeyedPropertyBase /// Called by rive_core to add a KeyFrame to this KeyedProperty. This should /// be @internal when it's supported. bool internalAddKeyFrame(KeyFrame frame) { - if (_keyframes.contains(frame)) { + if (keyframes.contains(frame)) { return false; } - _keyframes.add(frame); + keyframes.add(frame); markKeyFrameOrderDirty(); onKeyframesChanged(); return true; @@ -97,8 +99,8 @@ class KeyedProperty extends KeyedPropertyBase /// Called by rive_core to remove a KeyFrame from this KeyedProperty. This /// should be @internal when it's supported. bool internalRemoveKeyFrame(KeyFrame frame) { - var removed = _keyframes.remove(frame); - if (_keyframes.isEmpty) { + var removed = keyframes.remove(frame); + if (keyframes.isEmpty) { // If they keyframes are now empty, we might want to remove this keyed // property. Wait for any other pending changes to complete before // checking. @@ -112,7 +114,7 @@ class KeyedProperty extends KeyedPropertyBase } void _checkShouldRemove() { - if (_keyframes.isEmpty) { + if (keyframes.isEmpty) { // Remove this keyed property. context.removeObject(this); } @@ -131,19 +133,19 @@ class KeyedProperty extends KeyedPropertyBase } /// Number of keyframes for this keyed property. - int get numFrames => _keyframes.length; + int get numFrames => keyframes.length; - KeyFrame getFrameAt(int index) => _keyframes[index]; + KeyFrame getFrameAt(int index) => keyframes[index]; /// Return from and to frames _ClosestFrame _closestFramePair(final double seconds) { // Binary find the keyframe index (use timeInSeconds here as opposed to the // finder above which operates in frames). - final lastIndex = _keyframes.length - 1; + final lastIndex = keyframes.length - 1; // If it's the last keyframe, we skip the binary search - final last = _keyframes[lastIndex]; + final last = keyframes[lastIndex]; final double secondsMin; final double secondsMax; @@ -159,7 +161,7 @@ class KeyedProperty extends KeyedPropertyBase return _ClosestFrame(null, last, secondsMin, secondsMax); } - var first = _keyframes[0]; + var first = keyframes[0]; if (seconds <= first.seconds) { return _ClosestFrame(null, first, secondsMin, secondsMax); } @@ -168,7 +170,7 @@ class KeyedProperty extends KeyedPropertyBase int end = lastIndex; while (start <= end) { int mid = (start + end) >> 1; - var keyframe = _keyframes[mid]; + var keyframe = keyframes[mid]; if (keyframe.seconds < secondsMin) { start = mid + 1; } else if (keyframe.seconds > secondsMax) { @@ -178,16 +180,16 @@ class KeyedProperty extends KeyedPropertyBase } } - return _ClosestFrame(_keyframes[start-1] as InterpolatingKeyFrame, _keyframes[start], secondsMin, secondsMax); + return _ClosestFrame(keyframes[start-1] as InterpolatingKeyFrame, keyframes[start], secondsMin, secondsMax); } int _closestFrameIndex(double seconds, {int exactOffset = 0}) { // Binary find the keyframe index (use timeInSeconds here as opposed to the // finder above which operates in frames). - var length = _keyframes.length; + var length = keyframes.length; int end = length - 1; - var totalSeconds = _keyframes[end].seconds; + var totalSeconds = keyframes[end].seconds; // If it's the last keyframe, we skip the binary search if (seconds > totalSeconds) { @@ -197,7 +199,7 @@ class KeyedProperty extends KeyedPropertyBase if (seconds == totalSeconds) { return end + exactOffset; } - if (seconds < _keyframes[0].seconds) { + if (seconds < keyframes[0].seconds) { return 0; } int mid = (length * seconds/totalSeconds).toInt(); // try to guess an optimal starting seconds @@ -209,7 +211,7 @@ class KeyedProperty extends KeyedPropertyBase double closestSeconds; while (start <= end) { - closestSeconds = _keyframes[mid].seconds; + closestSeconds = keyframes[mid].seconds; if (closestSeconds < seconds) { start = mid + 1; } else if (closestSeconds > seconds) { @@ -296,7 +298,7 @@ class KeyedProperty extends KeyedPropertyBase } while (idxTo > idx) { - var frame = _keyframes[idx]; + var frame = keyframes[idx]; reporter.reportKeyedCallback( objectId, propertyKey, secondsTo - frame.seconds); idx++; @@ -326,20 +328,22 @@ class KeyedProperty extends KeyedPropertyBase /// Apply keyframe values at a given time expressed in [seconds]. void apply(double seconds, double mix, Core object) { - if (_keyframes.length == 0) { + if (keyframes.length == 0) { return; } // _applies++; - var pair = _pair; - if (pair != null) { - if (_skipInterpolation) { // no interpolation, lookup and don't reset - pair = _closestFramePair(seconds); - // if (_skips++ % 1000 == 0) { - // log('SKIP INTERPOLATION'); - // } - } else if (seconds >= pair.secondsMin && seconds <= pair.secondsMax) { // reuse + final _ClosestFrame pair; + + if (_skipInterpolation) { // no interpolation, lookup and don't reset + pair = _closestFramePair(seconds); + // if (_skips++ % 1000 == 0) { + // log('SKIP INTERPOLATION'); + // } + } else { + if (_pair != null && seconds >= _pair!.secondsMin && seconds <= _pair!.secondsMax) { // reuse + pair = _pair!; // _hits++; // if (seconds != _pair!._seconds) { // _toleranceHits++; @@ -348,10 +352,8 @@ class KeyedProperty extends KeyedPropertyBase // print('HITS > $_hits $_toleranceHits > hits=${(_hits/_applies).toStringAsFixed(2)} tolerance=${(_toleranceHits/_hits).toStringAsFixed(2)}'); // } } else { // lookup and reset - _pair = pair = _closestFramePair(seconds); + pair = _pair = _closestFramePair(seconds); } - } else { // lookup and reset - _pair = pair = _closestFramePair(seconds); } // if (_pair != null && diff --git a/lib/src/rive_core/animation/layer_state.dart b/lib/src/rive_core/animation/layer_state.dart index 72bbafd4..a524cb5b 100644 --- a/lib/src/rive_core/animation/layer_state.dart +++ b/lib/src/rive_core/animation/layer_state.dart @@ -7,8 +7,10 @@ import 'package:rive/src/rive_core/animation/state_transition.dart'; export 'package:rive/src/generated/animation/layer_state_base.dart'; abstract class LayerState extends LayerStateBase { - final StateTransitions _transitions = StateTransitions(); - StateTransitions get transitions => _transitions; + + @nonVirtual + final StateTransitions transitions = StateTransitions(); + // StateTransitions get transitions => _transitions; @override void onAdded() {} @@ -17,17 +19,17 @@ abstract class LayerState extends LayerStateBase { void onAddedDirty() {} void internalAddTransition(StateTransition transition) { - assert(!_transitions.contains(transition), + assert(!transitions.contains(transition), 'shouldn\'t already contain the transition'); - _transitions.add(transition); + transitions.add(transition); } void internalRemoveTransition(StateTransition transition) { - _transitions.remove(transition); + transitions.remove(transition); } - @override - void flagsChanged(int from, int to) {} + // @override + // void flagsChanged(int from, int to) {} StateInstance makeInstance(); diff --git a/lib/src/rive_core/animation/state_transition.dart b/lib/src/rive_core/animation/state_transition.dart index 56247894..3bd391ad 100644 --- a/lib/src/rive_core/animation/state_transition.dart +++ b/lib/src/rive_core/animation/state_transition.dart @@ -158,8 +158,8 @@ class StateTransition extends StateTransitionBase { return removed; } - @override - void flagsChanged(int from, int to) {} + // @override + // void flagsChanged(int from, int to) {} @override void durationChanged(int from, int to) {} @@ -183,7 +183,11 @@ class StateTransition extends StateTransitionBase { if (isDisabled) { return AllowTransition.no; } - for (final condition in conditions) { + + final t = conditions.length; + for (var i = 0; i < t; i++) { + // for (final condition in conditions) { + var condition = conditions[i]; if (condition is TransitionViewModelCondition) { return AllowTransition.no; } else if (condition is TransitionInputCondition && diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index ac2cee41..b705d62d 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -291,7 +291,11 @@ class LayerController { stateFrom, ignoreTriggers, viewModelInstance); } final transitions = stateFrom.state.transitions; - for (final transition in transitions) { + + final t = transitions.length; + for (var i = 0; i < t; i++) { + // for (final transition in transitions) { + var transition = transitions[i]; var allowed = transition.allowed(stateFrom, controller._inputValues, ignoreTriggers, viewModelInstance); if (allowed == AllowTransition.yes && From b578f3e813e7801767b3552317ed1bf8f6b2d9a3 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 6 Mar 2025 20:06:27 +0000 Subject: [PATCH 41/50] cpu tweaks --- lib/src/core/core.dart | 31 ++++++---------- lib/src/generated/rive_core_beans.dart | 17 +++++++-- .../rive_core/animation/keyed_property.dart | 37 +++++++++---------- .../rive_core/animation/keyframe_double.dart | 3 +- .../rive_core/animation/state_transition.dart | 1 + lib/src/rive_core/dependency_helper.dart | 5 ++- lib/src/rive_file.dart | 3 +- lib/src/state_transition_conditions.dart | 20 ++++++---- 8 files changed, 64 insertions(+), 53 deletions(-) diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index 23abbcc2..ba8eb9b5 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -57,25 +57,18 @@ int _to(int s) { } int _from(int s) => (s & _negative > 0 ? -1 : 1) * (s & _module); - -int _setLow(final int v, final int s) { - var r = (v & _highInt) + _to(s); - // // TODO comment me - // if (_getLow(r) != s) { - // throw Exception('v=${v.toRadixString(2)} s=${s.toRadixString(2)} r=${r.toRadixString(2)} low=${_getLow(r).toRadixString(2)}'); - // } - return r; -} -int _getLow(int v) => _from(v & _lowInt); -int _setHigh(final int v, final int s) { - var r = (_to(s) << 32) + (v & _lowInt); - // // TODO comment me - // if (_getHigh(r) != s) { - // throw Exception('v=${v.toRadixString(2)} s=${s.toRadixString(2)} r=${r.toRadixString(2)} high=${_getHigh(r).toRadixString(2)}'); - // } - return r; -} -int _getHigh(int v) => _from((v & _highInt) >> 32); +int _setLow(final int v, final int s) => (v & _highInt) + _to(s); + +// int _getLow(int v) => _from(v & _lowInt); +// int _setHigh(final int v, final int s) { +// var r = (_to(s) << 32) + (v & _lowInt); +// // // TODO comment me +// // if (_getHigh(r) != s) { +// // throw Exception('v=${v.toRadixString(2)} s=${s.toRadixString(2)} r=${r.toRadixString(2)} high=${_getHigh(r).toRadixString(2)}'); +// // } +// return r; +// } +// int _getHigh(int v) => _from((v & _highInt) >> 32); abstract class Core { static const int missingId = -1; diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index 9d06beb0..712d0e42 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -39,6 +39,10 @@ class PropertyBean { setDouble(o, function(getDouble(o))); } + void applyDouble(T o, double multiplier, double sum) { + setDouble(o, getDouble(o) * multiplier + sum); + } + int getColor(T o) => throw Exception(); void setColor(T o, int v) => throw Exception(); @@ -62,9 +66,12 @@ class _DoublePropertyBean extends PropertyBean { @nonVirtual CoreFieldType? get coreType => RiveCoreContext.doubleType; - @override - void transformDouble(T o, double Function(double) function) => - setDouble(o, function(getDouble(o))); + // @override + // void transformDouble(T o, double Function(double) function) => + // setDouble(o, function(getDouble(o))); + // @override + // void multiplyDouble(T o, double multiplier) => + // setDouble(o, getDouble(o) * multiplier); @override void setObjectProperty(Core o, Object v) => o is T && v is double ? setDouble(o, v) : {}; @@ -86,6 +93,10 @@ class DoublePropertyBean extends _DoublePropertyBean { void transformDouble(T o, double Function(double) function) => setter(o, function(getter(o))); + @override + void applyDouble(T o, double multiplier, double sum) => + setter(o, getter(o) * multiplier + sum); + @override void setObjectProperty(Core o, Object v) => o is T && v is double ? setter(o, v) : {}; } diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index 6a0c6136..c26298ae 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -334,26 +334,25 @@ class KeyedProperty extends KeyedPropertyBase // _applies++; - final _ClosestFrame pair; + // final _ClosestFrame pair; - if (_skipInterpolation) { // no interpolation, lookup and don't reset - pair = _closestFramePair(seconds); - // if (_skips++ % 1000 == 0) { - // log('SKIP INTERPOLATION'); + if (_pair != null && seconds >= _pair!.secondsMin && seconds <= _pair!.secondsMax) { // reuse + // _hits++; + // if (seconds != _pair!._seconds) { + // _toleranceHits++; // } - } else { - if (_pair != null && seconds >= _pair!.secondsMin && seconds <= _pair!.secondsMax) { // reuse - pair = _pair!; - // _hits++; - // if (seconds != _pair!._seconds) { - // _toleranceHits++; - // } - // if (_hits % 1000000 == 0) { - // print('HITS > $_hits $_toleranceHits > hits=${(_hits/_applies).toStringAsFixed(2)} tolerance=${(_toleranceHits/_hits).toStringAsFixed(2)}'); + // if (_hits % 1000000 == 0) { + // print('HITS > $_hits $_toleranceHits > hits=${(_hits/_applies).toStringAsFixed(2)} tolerance=${(_toleranceHits/_hits).toStringAsFixed(2)}'); + // } + + if (_skipInterpolation) { // no interpolation, lookup and don't reset + _pair = _closestFramePair(seconds); + // if (_skips++ % 1000 == 0) { + // log('SKIP INTERPOLATION'); // } - } else { // lookup and reset - pair = _pair = _closestFramePair(seconds); } + } else { // lookup and reset + _pair = _closestFramePair(seconds); } // if (_pair != null && @@ -363,16 +362,16 @@ class KeyedProperty extends KeyedPropertyBase // _pair = _closestFramePair(seconds); // } - var fromFrame = pair.fromFrame; + var fromFrame = _pair!.fromFrame; if (fromFrame != null) { // interpolation if (fromFrame.interpolationType == 0) { fromFrame.apply(object, propertyBean, mix); } else { - fromFrame.applyInterpolation(object, propertyBean, seconds, pair.toFrame, mix); + fromFrame.applyInterpolation(object, propertyBean, seconds, _pair!.toFrame, mix); } } else { - pair.toFrame.apply(object, propertyBean, mix); + _pair!.toFrame.apply(object, propertyBean, mix); } } diff --git a/lib/src/rive_core/animation/keyframe_double.dart b/lib/src/rive_core/animation/keyframe_double.dart index a1ac32b3..545873c5 100644 --- a/lib/src/rive_core/animation/keyframe_double.dart +++ b/lib/src/rive_core/animation/keyframe_double.dart @@ -21,7 +21,8 @@ class KeyFrameDouble extends KeyFrameDoubleBase { if (mix == 1) { bean.setDouble(object, value); } else { - bean.transformDouble(object, (v) => v * (1.0 - mix) + value * mix); + // bean.transformDouble(object, (v) => v * (1.0 - mix) + value * mix); + bean.applyDouble(object, 1.0 - mix, value * mix); } } diff --git a/lib/src/rive_core/animation/state_transition.dart b/lib/src/rive_core/animation/state_transition.dart index 3bd391ad..3df75159 100644 --- a/lib/src/rive_core/animation/state_transition.dart +++ b/lib/src/rive_core/animation/state_transition.dart @@ -184,6 +184,7 @@ class StateTransition extends StateTransitionBase { return AllowTransition.no; } + var conditions = this.conditions.values; final t = conditions.length; for (var i = 0; i < t; i++) { // for (final condition in conditions) { diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index 2475c218..a85d1848 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -26,9 +26,10 @@ class DependencyHelper { /// STOKANAL-FORK-EDIT: do not use forEach // UniqueList - final t = dependents.length; + var list = dependents.list; + final t = list.length; for (var i = 0; i < t; i++) { - dependents[i].addDirt(dirt, recurse: recurse); + list[i].addDirt(dirt, recurse: recurse); } // // Set diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index 50a4fa98..dcf7c1d7 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -1,5 +1,4 @@ import 'dart:collection'; -import 'dart:developer'; import 'package:collection/collection.dart'; import 'package:flutter/services.dart'; @@ -180,7 +179,7 @@ class RiveFile { }) { var skipInterpolation = path != null && skipInterpolationRiveFiles.any(path.contains); - log('RIVE-FILE >> $path${skipInterpolation?' > SKIP_INTERPOLATION':''}'); + // log('RIVE-FILE >> $path${skipInterpolation?' > SKIP_INTERPOLATION':''}'); // debugPrintStack(); /// Property fields table of contents diff --git a/lib/src/state_transition_conditions.dart b/lib/src/state_transition_conditions.dart index b25d8588..1168182d 100644 --- a/lib/src/state_transition_conditions.dart +++ b/lib/src/state_transition_conditions.dart @@ -1,20 +1,26 @@ import 'dart:collection'; +import 'package:flutter/foundation.dart'; import 'package:rive/src/rive_core/animation/transition_condition.dart'; class StateTransitionConditions extends ListBase { - final List _values = []; - List get values => _values.cast(); + + // final List _values = []; + // List get values => _values.cast(); + + @nonVirtual + @override + final List values = []; // has to be nullable + // List get values => _values.cast(); @override - int get length => _values.length; + int get length => values.length; @override - set length(int value) => _values.length = value; + set length(int value) => values.length = value; @override - TransitionCondition operator [](int index) => _values[index]!; + TransitionCondition operator [](int index) => values[index]!; @override - void operator []=(int index, TransitionCondition value) => - _values[index] = value; + void operator []=(int index, TransitionCondition value) => values[index] = value; } From f7828ca6cd6f4ecf257052d3cb63914fdc46bfe6 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 7 Mar 2025 12:24:01 +0000 Subject: [PATCH 42/50] implementing rive_core_beans specific classes --- .../constraints/distance_constraint_base.dart | 17 +- lib/src/generated/node_base.dart | 2 + lib/src/generated/rive_core_beans.dart | 434 +++++++++++++++--- .../shapes/cubic_asymmetric_vertex_base.dart | 21 +- .../shapes/cubic_detached_vertex_base.dart | 8 + .../shapes/cubic_mirrored_vertex_base.dart | 34 +- .../shapes/paint/gradient_stop_base.dart | 17 +- .../generated/shapes/paint/stroke_base.dart | 17 +- .../shapes/straight_vertex_base.dart | 17 +- lib/src/generated/shapes/vertex_base.dart | 2 + .../generated/transform_component_base.dart | 53 ++- .../world_transform_component_base.dart | 17 +- lib/src/state_transition_conditions.dart | 2 +- 13 files changed, 498 insertions(+), 143 deletions(-) diff --git a/lib/src/generated/constraints/distance_constraint_base.dart b/lib/src/generated/constraints/distance_constraint_base.dart index bc410241..6763178e 100644 --- a/lib/src/generated/constraints/distance_constraint_base.dart +++ b/lib/src/generated/constraints/distance_constraint_base.dart @@ -25,20 +25,23 @@ abstract class DistanceConstraintBase extends TargetedConstraint { /// Distance field with key 177. static const int distancePropertyKey = 177; static const double distanceInitialValue = 100.0; - double _distance = distanceInitialValue; + + @nonVirtual + double distance_ = distanceInitialValue; /// The unit distance the constraint will move the constrained object relative /// to the target. - double get distance => _distance; + @nonVirtual + double get distance => distance_; - /// Change the [_distance] field value. + /// Change the [distance_] field value. /// [distanceChanged] will be invoked only if the field's value has changed. set distance(double value) { - if (_distance == value) { + if (distance_ == value) { return; } - double from = _distance; - _distance = value; + double from = distance_; + distance_ = value; if (hasValidated) { distanceChanged(from, value); } @@ -74,7 +77,7 @@ abstract class DistanceConstraintBase extends TargetedConstraint { void copy(Core source) { super.copy(source); if (source is DistanceConstraintBase) { - _distance = source._distance; + distance_ = source.distance_; _modeValue = source._modeValue; } } diff --git a/lib/src/generated/node_base.dart b/lib/src/generated/node_base.dart index e70acd72..9d4066d3 100644 --- a/lib/src/generated/node_base.dart +++ b/lib/src/generated/node_base.dart @@ -26,6 +26,7 @@ abstract class NodeBase extends TransformComponent { /// X field with key 13. static const int xPropertyKey = 13; static const double xInitialValue = 0; + @nonVirtual double x_ = xInitialValue; @override @nonVirtual @@ -52,6 +53,7 @@ abstract class NodeBase extends TransformComponent { /// Y field with key 14. static const int yPropertyKey = 14; static const double yInitialValue = 0; + @nonVirtual double y_ = yInitialValue; @override @nonVirtual diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index 712d0e42..d5dc7590 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -66,42 +66,46 @@ class _DoublePropertyBean extends PropertyBean { @nonVirtual CoreFieldType? get coreType => RiveCoreContext.doubleType; - // @override - // void transformDouble(T o, double Function(double) function) => - // setDouble(o, function(getDouble(o))); - // @override - // void multiplyDouble(T o, double multiplier) => - // setDouble(o, getDouble(o) * multiplier); - @override void setObjectProperty(Core o, Object v) => o is T && v is double ? setDouble(o, v) : {}; } -class DoublePropertyBean extends _DoublePropertyBean { - - final double Function(T) getter; - final void Function(T, double) setter; - DoublePropertyBean._(super.propertyKey, this.getter, this.setter): super._(); - - @override - double getDouble(T o) => getter(o); +// class DoublePropertyBean extends _DoublePropertyBean { +// +// final double Function(T) getter; +// final void Function(T, double) setter; +// DoublePropertyBean._(super.propertyKey, this.getter, this.setter): super._(); +// +// @override +// double getDouble(T o) => getter(o); +// +// @override +// void setDouble(T o, double v) => setter(o, v); +// +// @override +// void transformDouble(T o, double Function(double) function) => +// setter(o, function(getter(o))); +// +// @override +// void applyDouble(T o, double multiplier, double sum) => +// setter(o, getter(o) * multiplier + sum); +// +// @override +// void setObjectProperty(Core o, Object v) => o is T && v is double ? setter(o, v) : {}; +// } + +class _UintPropertyBean extends PropertyBean { + _UintPropertyBean._(super.propertyKey): super._(); @override - void setDouble(T o, double v) => setter(o, v); - - @override - void transformDouble(T o, double Function(double) function) => - setter(o, function(getter(o))); - - @override - void applyDouble(T o, double multiplier, double sum) => - setter(o, getter(o) * multiplier + sum); + @nonVirtual + CoreFieldType? get coreType => RiveCoreContext.uintType; @override - void setObjectProperty(Core o, Object v) => o is T && v is double ? setter(o, v) : {}; + void setObjectProperty(Core o, Object v) => o is T && v is int ? setUint(o, v) : {}; } -class UintPropertyBean extends PropertyBean { +class UintPropertyBean extends _UintPropertyBean { final int Function(T) getter; final void Function(T, int) setter; @@ -116,8 +120,8 @@ class UintPropertyBean extends PropertyBean { @override void setObjectProperty(Core o, Object v) => o is T && v is int ? setter(o, v) : {}; - @override - CoreFieldType? get coreType => RiveCoreContext.uintType; + // @override + // CoreFieldType? get coreType => RiveCoreContext.uintType; } class ColorPropertyBean extends PropertyBean { @@ -260,44 +264,46 @@ final _invalid = PropertyBean._(CoreContext.invalidPropertyKey); var _first = true; final _implements = [ _invalid, - XPropertyBean._(), - YPropertyBean._(), - VertexBaseXPropertyBean._(), - VertexBaseYPropertyBean._(), - // DoublePropertyBean._(NodeBase.xPropertyKey, (o) => o.x_, (o, v) => o.x = v), - // DoublePropertyBean._(NodeBase.yPropertyKey, (o) => o.y_, (o, v) => o.y = v), - // DoublePropertyBean._(VertexBase.xPropertyKey, (o) => o.x_, (o, v) => o.x = v), - // DoublePropertyBean._(VertexBase.yPropertyKey, (o) => o.y_, (o, v) => o.y = v), - DoublePropertyBean._(CubicDetachedVertexBase.outRotationPropertyKey, (o) => o.outRotation_, (o, v) => o.outRotation = v), - DoublePropertyBean._(CubicDetachedVertexBase.outDistancePropertyKey, (o) => o.outDistance_, (o, v) => o.outDistance = v), - DoublePropertyBean._(CubicDetachedVertexBase.inRotationPropertyKey, (o) => o.inRotation_, (o, v) => o.inRotation = v), - DoublePropertyBean._(CubicDetachedVertexBase.inDistancePropertyKey, (o) => o.inDistance_, (o, v) => o.inDistance = v), - DoublePropertyBean._(CubicAsymmetricVertexBase.inDistancePropertyKey, (o) => o.inDistance_, (o, v) => o.inDistance = v), - DoublePropertyBean._(CubicAsymmetricVertexBase.rotationPropertyKey, (o) => o.rotation_, (o, v) => o.rotation = v), - DoublePropertyBean._(TransformComponentBase.scaleXPropertyKey, (o) => o.scaleX, (o, v) => o.scaleX = v), - DoublePropertyBean._(TransformComponentBase.scaleYPropertyKey, (o) => o.scaleY, (o, v) => o.scaleY = v), - DoublePropertyBean._(TransformComponentBase.rotationPropertyKey, (o) => o.rotation, (o, v) => o.rotation = v), - DoublePropertyBean._(KeyFrameDoubleBase.valuePropertyKey, (o) => o.value, (o, v) => o.value = v), - DoublePropertyBean._(WorldTransformComponentBase.opacityPropertyKey, (o) => o.opacity, (o, v) => o.opacity = v), + XBean._(), + YBean._(), + VertexBaseXBean._(), + VertexBaseYBean._(), + + OutRotationBean._(), + OutDistanceBean._(), + InRotationBean._(), + InDistanceBean._(), + CubicAsymmetricVertexInDistanceBean._(), + RotationBean._(), + ScaleXBean._(), + ScaleYBean._(), + TransformComponentRotationBean._(), + ValueBean._(), + OpacityBean._(), + + CubicMirroredVertexBaseRotationBean._(), + CubicAsymmetricVertexBaseOutDistanceBean._(), + StraightVertexBaseRadiusBean._(), + StrokeBaseThicknessBean._(), + DistanceConstraintBaseDistanceBean._(), + CubicMirroredVertexBaseDistanceBean._(), + GradientStopBasePositionBean._(), + UintPropertyBean._(InterpolatingKeyFrameBase.interpolatorIdPropertyKey, (o) => o.interpolatorId, (o, v) => o.interpolatorId = v), UintPropertyBean._(KeyedPropertyBase.propertyKeyPropertyKey, (o) => o.propertyKey, (o, v) => o.propertyKey = v), UintPropertyBean._(KeyFrameBase.framePropertyKey, (o) => o.frame, (o, v) => o.frame = v), - DoublePropertyBean._(CubicMirroredVertexBase.rotationPropertyKey, (o) => o.rotation, (o, v) => o.rotation = v), UintPropertyBean._(InterpolatingKeyFrameBase.interpolationTypePropertyKey, (o) => o.interpolationType, (o, v) => o.interpolationType = v), UintPropertyBean._(SoloBase.activeComponentIdPropertyKey, (o) => o.activeComponentId, (o, v) => o.activeComponentId = v), - DoublePropertyBean._(CubicAsymmetricVertexBase.outDistancePropertyKey, (o) => o.outDistance, (o, v) => o.outDistance = v), UintPropertyBean._(KeyedObjectBase.objectIdPropertyKey, (o) => o.objectId, (o, v) => o.objectId = v), - DoublePropertyBean._(StraightVertexBase.radiusPropertyKey, (o) => o.radius, (o, v) => o.radius = v), UintPropertyBean._(DrawRulesBase.drawTargetIdPropertyKey, (o) => o.drawTargetId, (o, v) => o.drawTargetId = v), UintPropertyBean._(ComponentBase.parentIdPropertyKey, (o) => o.parentId, (o, v) => o.parentId = v), - ColorPropertyBean._(SolidColorBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), + UintPropertyBean._(TransitionInputConditionBase.inputIdPropertyKey, (o) => o.inputId, (o, v) => o.inputId = v), + StringPropertyBean._(ComponentBase.namePropertyKey, (o) => o.name, (o, v) => o.name = v), - DoublePropertyBean._(StrokeBase.thicknessPropertyKey, (o) => o.thickness, (o, v) => o.thickness = v), - DoublePropertyBean._(DistanceConstraintBase.distancePropertyKey, (o) => o.distance, (o, v) => o.distance = v), - DoublePropertyBean._(CubicMirroredVertexBase.distancePropertyKey, (o) => o.distance, (o, v) => o.distance = v), - DoublePropertyBean._(GradientStopBase.positionPropertyKey, (o) => o.position, (o, v) => o.position = v), + + ColorPropertyBean._(SolidColorBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), ColorPropertyBean._(GradientStopBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), - UintPropertyBean._(TransitionInputConditionBase.inputIdPropertyKey, (o) => o.inputId, (o, v) => o.inputId = v), + ]; // ignore: avoid_classes_with_only_static_members @@ -326,32 +332,330 @@ abstract class PropertyBeans { } } -class XPropertyBean extends _DoublePropertyBean { - XPropertyBean._(): super._(NodeBase.xPropertyKey); +/// See EntityMeta.java for the auto generator + +class XBean extends _DoublePropertyBean { + XBean._(): super._(NodeBase.xPropertyKey); @override double getDouble(NodeBase o) => o.x_; @override void setDouble(NodeBase o, double v) => o.x = v; + @override + void transformDouble(NodeBase o, double Function(double) function) => o.x = function(o.x_); + @override + void applyDouble(NodeBase o, double multiplier, double sum) => o.x = o.x_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is NodeBase && v is double ? o.x = v : {}; } -class YPropertyBean extends _DoublePropertyBean { - YPropertyBean._(): super._(NodeBase.yPropertyKey); +class YBean extends _DoublePropertyBean { + YBean._(): super._(NodeBase.yPropertyKey); @override double getDouble(NodeBase o) => o.y_; @override void setDouble(NodeBase o, double v) => o.y = v; + @override + void transformDouble(NodeBase o, double Function(double) function) => o.y = function(o.y_); + @override + void applyDouble(NodeBase o, double multiplier, double sum) => o.y = o.y_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is NodeBase && v is double ? o.y = v : {}; } - -class VertexBaseXPropertyBean extends _DoublePropertyBean { - VertexBaseXPropertyBean._(): super._(VertexBase.xPropertyKey); +class VertexBaseXBean extends _DoublePropertyBean { + VertexBaseXBean._(): super._(VertexBase.xPropertyKey); @override double getDouble(VertexBase o) => o.x_; @override void setDouble(VertexBase o, double v) => o.x = v; + @override + void transformDouble(VertexBase o, double Function(double) function) => o.x = function(o.x_); + @override + void applyDouble(VertexBase o, double multiplier, double sum) => o.x = o.x_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is VertexBase && v is double ? o.x = v : {}; } -class VertexBaseYPropertyBean extends _DoublePropertyBean { - VertexBaseYPropertyBean._(): super._(VertexBase.yPropertyKey); +class VertexBaseYBean extends _DoublePropertyBean { + VertexBaseYBean._(): super._(VertexBase.yPropertyKey); @override double getDouble(VertexBase o) => o.y_; @override void setDouble(VertexBase o, double v) => o.y = v; + @override + void transformDouble(VertexBase o, double Function(double) function) => o.y = function(o.y_); + @override + void applyDouble(VertexBase o, double multiplier, double sum) => o.y = o.y_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is VertexBase && v is double ? o.y = v : {}; } + +// DoublePropertyBean._(CubicDetachedVertexBase.outRotationPropertyKey, (o) => o.outRotation_, (o, v) => o.outRotation = v), +class OutRotationBean extends _DoublePropertyBean { + OutRotationBean._(): super._(CubicDetachedVertexBase.outRotationPropertyKey); + @override + double getDouble(CubicDetachedVertexBase o) => o.outRotation_; + @override + void setDouble(CubicDetachedVertexBase o, double v) => o.outRotation = v; + @override + void transformDouble(CubicDetachedVertexBase o, double Function(double) function) => o.outRotation = function(o.outRotation_); + @override + void applyDouble(CubicDetachedVertexBase o, double multiplier, double sum) => o.outRotation = o.outRotation_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicDetachedVertexBase && v is double ? o.outRotation = v : {}; +} + +// DoublePropertyBean._(CubicDetachedVertexBase.outDistancePropertyKey, (o) => o.outDistance_, (o, v) => o.outDistance = v), +class OutDistanceBean extends _DoublePropertyBean { + OutDistanceBean._(): super._(CubicDetachedVertexBase.outDistancePropertyKey); + @override + double getDouble(CubicDetachedVertexBase o) => o.outDistance_; + @override + void setDouble(CubicDetachedVertexBase o, double v) => o.outDistance = v; + @override + void transformDouble(CubicDetachedVertexBase o, double Function(double) function) => o.outDistance = function(o.outDistance_); + @override + void applyDouble(CubicDetachedVertexBase o, double multiplier, double sum) => o.outDistance = o.outDistance_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicDetachedVertexBase && v is double ? o.outDistance = v : {}; +} + +// DoublePropertyBean._(CubicDetachedVertexBase.inRotationPropertyKey, (o) => o.inRotation_, (o, v) => o.inRotation = v), +class InRotationBean extends _DoublePropertyBean { + InRotationBean._(): super._(CubicDetachedVertexBase.inRotationPropertyKey); + @override + double getDouble(CubicDetachedVertexBase o) => o.inRotation_; + @override + void setDouble(CubicDetachedVertexBase o, double v) => o.inRotation = v; + @override + void transformDouble(CubicDetachedVertexBase o, double Function(double) function) => o.inRotation = function(o.inRotation_); + @override + void applyDouble(CubicDetachedVertexBase o, double multiplier, double sum) => o.inRotation = o.inRotation_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicDetachedVertexBase && v is double ? o.inRotation = v : {}; +} + +// DoublePropertyBean._(CubicDetachedVertexBase.inDistancePropertyKey, (o) => o.inDistance_, (o, v) => o.inDistance = v), +class InDistanceBean extends _DoublePropertyBean { + InDistanceBean._(): super._(CubicDetachedVertexBase.inDistancePropertyKey); + @override + double getDouble(CubicDetachedVertexBase o) => o.inDistance_; + @override + void setDouble(CubicDetachedVertexBase o, double v) => o.inDistance = v; + @override + void transformDouble(CubicDetachedVertexBase o, double Function(double) function) => o.inDistance = function(o.inDistance_); + @override + void applyDouble(CubicDetachedVertexBase o, double multiplier, double sum) => o.inDistance = o.inDistance_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicDetachedVertexBase && v is double ? o.inDistance = v : {}; +} + +// DoublePropertyBean._(CubicAsymmetricVertexBase.inDistancePropertyKey, (o) => o.inDistance_, (o, v) => o.inDistance = v), +class CubicAsymmetricVertexInDistanceBean extends _DoublePropertyBean { + CubicAsymmetricVertexInDistanceBean._(): super._(CubicAsymmetricVertexBase.inDistancePropertyKey); + @override + double getDouble(CubicAsymmetricVertexBase o) => o.inDistance_; + @override + void setDouble(CubicAsymmetricVertexBase o, double v) => o.inDistance = v; + @override + void transformDouble(CubicAsymmetricVertexBase o, double Function(double) function) => o.inDistance = function(o.inDistance_); + @override + void applyDouble(CubicAsymmetricVertexBase o, double multiplier, double sum) => o.inDistance = o.inDistance_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicAsymmetricVertexBase && v is double ? o.inDistance = v : {}; +} + +// DoublePropertyBean._(CubicAsymmetricVertexBase.rotationPropertyKey, (o) => o.rotation_, (o, v) => o.rotation = v), +class RotationBean extends _DoublePropertyBean { + RotationBean._(): super._(CubicAsymmetricVertexBase.rotationPropertyKey); + @override + double getDouble(CubicAsymmetricVertexBase o) => o.rotation_; + @override + void setDouble(CubicAsymmetricVertexBase o, double v) => o.rotation = v; + @override + void transformDouble(CubicAsymmetricVertexBase o, double Function(double) function) => o.rotation = function(o.rotation_); + @override + void applyDouble(CubicAsymmetricVertexBase o, double multiplier, double sum) => o.rotation = o.rotation_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicAsymmetricVertexBase && v is double ? o.rotation = v : {}; +} + +// DoublePropertyBean._(TransformComponentBase.scaleXPropertyKey, (o) => o.scaleX_, (o, v) => o.scaleX = v), +class ScaleXBean extends _DoublePropertyBean { + ScaleXBean._(): super._(TransformComponentBase.scaleXPropertyKey); + @override + double getDouble(TransformComponentBase o) => o.scaleX_; + @override + void setDouble(TransformComponentBase o, double v) => o.scaleX = v; + @override + void transformDouble(TransformComponentBase o, double Function(double) function) => o.scaleX = function(o.scaleX_); + @override + void applyDouble(TransformComponentBase o, double multiplier, double sum) => o.scaleX = o.scaleX_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is TransformComponentBase && v is double ? o.scaleX = v : {}; +} + +// DoublePropertyBean._(TransformComponentBase.scaleYPropertyKey, (o) => o.scaleY_, (o, v) => o.scaleY = v), +class ScaleYBean extends _DoublePropertyBean { + ScaleYBean._(): super._(TransformComponentBase.scaleYPropertyKey); + @override + double getDouble(TransformComponentBase o) => o.scaleY_; + @override + void setDouble(TransformComponentBase o, double v) => o.scaleY = v; + @override + void transformDouble(TransformComponentBase o, double Function(double) function) => o.scaleY = function(o.scaleY_); + @override + void applyDouble(TransformComponentBase o, double multiplier, double sum) => o.scaleY = o.scaleY_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is TransformComponentBase && v is double ? o.scaleY = v : {}; +} + +// DoublePropertyBean._(TransformComponentBase.rotationPropertyKey, (o) => o.rotation_, (o, v) => o.rotation = v), +class TransformComponentRotationBean extends _DoublePropertyBean { + TransformComponentRotationBean._(): super._(TransformComponentBase.rotationPropertyKey); + @override + double getDouble(TransformComponentBase o) => o.rotation_; + @override + void setDouble(TransformComponentBase o, double v) => o.rotation = v; + @override + void transformDouble(TransformComponentBase o, double Function(double) function) => o.rotation = function(o.rotation_); + @override + void applyDouble(TransformComponentBase o, double multiplier, double sum) => o.rotation = o.rotation_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is TransformComponentBase && v is double ? o.rotation = v : {}; +} + +// DoublePropertyBean._(KeyFrameDoubleBase.valuePropertyKey, (o) => o.value, (o, v) => o.value = v), +class ValueBean extends _DoublePropertyBean { + ValueBean._(): super._(KeyFrameDoubleBase.valuePropertyKey); + @override + double getDouble(KeyFrameDoubleBase o) => o.value; + @override + void setDouble(KeyFrameDoubleBase o, double v) => o.value = v; + @override + void transformDouble(KeyFrameDoubleBase o, double Function(double) function) => o.value = function(o.value); + @override + void applyDouble(KeyFrameDoubleBase o, double multiplier, double sum) => o.value = o.value * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is KeyFrameDoubleBase && v is double ? o.value = v : {}; +} + +// DoublePropertyBean._(WorldTransformComponentBase.opacityPropertyKey, (o) => o.opacity_, (o, v) => o.opacity = v), +class OpacityBean extends _DoublePropertyBean { + OpacityBean._(): super._(WorldTransformComponentBase.opacityPropertyKey); + @override + double getDouble(WorldTransformComponentBase o) => o.opacity_; + @override + void setDouble(WorldTransformComponentBase o, double v) => o.opacity = v; + @override + void transformDouble(WorldTransformComponentBase o, double Function(double) function) => o.opacity = function(o.opacity_); + @override + void applyDouble(WorldTransformComponentBase o, double multiplier, double sum) => o.opacity = o.opacity_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is WorldTransformComponentBase && v is double ? o.opacity = v : {}; +} + +// DoublePropertyBean._(CubicMirroredVertexBase.rotationPropertyKey, (o) => o.rotation, (o, v) => o.rotation = v), +class CubicMirroredVertexBaseRotationBean extends _DoublePropertyBean { + CubicMirroredVertexBaseRotationBean._(): super._(CubicMirroredVertexBase.rotationPropertyKey); + @override + double getDouble(CubicMirroredVertexBase o) => o.rotation_; + @override + void setDouble(CubicMirroredVertexBase o, double v) => o.rotation = v; + @override + void transformDouble(CubicMirroredVertexBase o, double Function(double) function) => o.rotation = function(o.rotation_); + @override + void applyDouble(CubicMirroredVertexBase o, double multiplier, double sum) => o.rotation = o.rotation_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicMirroredVertexBase && v is double ? o.rotation = v : {}; +} + +// DoublePropertyBean._(CubicAsymmetricVertexBase.outDistancePropertyKey, (o) => o.outDistance, (o, v) => o.outDistance = v), +class CubicAsymmetricVertexBaseOutDistanceBean extends _DoublePropertyBean { + CubicAsymmetricVertexBaseOutDistanceBean._(): super._(CubicAsymmetricVertexBase.outDistancePropertyKey); + @override + double getDouble(CubicAsymmetricVertexBase o) => o.outDistance_; + @override + void setDouble(CubicAsymmetricVertexBase o, double v) => o.outDistance = v; + @override + void transformDouble(CubicAsymmetricVertexBase o, double Function(double) function) => o.outDistance = function(o.outDistance_); + @override + void applyDouble(CubicAsymmetricVertexBase o, double multiplier, double sum) => o.outDistance = o.outDistance_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicAsymmetricVertexBase && v is double ? o.outDistance = v : {}; +} + +// DoublePropertyBean._(StraightVertexBase.radiusPropertyKey, (o) => o.radius, (o, v) => o.radius = v), +class StraightVertexBaseRadiusBean extends _DoublePropertyBean { + StraightVertexBaseRadiusBean._(): super._(StraightVertexBase.radiusPropertyKey); + @override + double getDouble(StraightVertexBase o) => o.radius_; + @override + void setDouble(StraightVertexBase o, double v) => o.radius = v; + @override + void transformDouble(StraightVertexBase o, double Function(double) function) => o.radius = function(o.radius_); + @override + void applyDouble(StraightVertexBase o, double multiplier, double sum) => o.radius = o.radius_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is StraightVertexBase && v is double ? o.radius = v : {}; +} + +// DoublePropertyBean._(StrokeBase.thicknessPropertyKey, (o) => o.thickness, (o, v) => o.thickness = v), +class StrokeBaseThicknessBean extends _DoublePropertyBean { + StrokeBaseThicknessBean._(): super._(StrokeBase.thicknessPropertyKey); + @override + double getDouble(StrokeBase o) => o.thickness_; + @override + void setDouble(StrokeBase o, double v) => o.thickness = v; + @override + void transformDouble(StrokeBase o, double Function(double) function) => o.thickness = function(o.thickness_); + @override + void applyDouble(StrokeBase o, double multiplier, double sum) => o.thickness = o.thickness_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is StrokeBase && v is double ? o.thickness = v : {}; +} + +// DoublePropertyBean._(DistanceConstraintBase.distancePropertyKey, (o) => o.distance, (o, v) => o.distance = v), +class DistanceConstraintBaseDistanceBean extends _DoublePropertyBean { + DistanceConstraintBaseDistanceBean._(): super._(DistanceConstraintBase.distancePropertyKey); + @override + double getDouble(DistanceConstraintBase o) => o.distance_; + @override + void setDouble(DistanceConstraintBase o, double v) => o.distance = v; + @override + void transformDouble(DistanceConstraintBase o, double Function(double) function) => o.distance = function(o.distance_); + @override + void applyDouble(DistanceConstraintBase o, double multiplier, double sum) => o.distance = o.distance_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is DistanceConstraintBase && v is double ? o.distance = v : {}; +} + +// DoublePropertyBean._(CubicMirroredVertexBase.distancePropertyKey, (o) => o.distance, (o, v) => o.distance = v), +class CubicMirroredVertexBaseDistanceBean extends _DoublePropertyBean { + CubicMirroredVertexBaseDistanceBean._(): super._(CubicMirroredVertexBase.distancePropertyKey); + @override + double getDouble(CubicMirroredVertexBase o) => o.distance_; + @override + void setDouble(CubicMirroredVertexBase o, double v) => o.distance = v; + @override + void transformDouble(CubicMirroredVertexBase o, double Function(double) function) => o.distance = function(o.distance_); + @override + void applyDouble(CubicMirroredVertexBase o, double multiplier, double sum) => o.distance = o.distance_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is CubicMirroredVertexBase && v is double ? o.distance = v : {}; +} + +// DoublePropertyBean._(GradientStopBase.positionPropertyKey, (o) => o.position, (o, v) => o.position = v), +class GradientStopBasePositionBean extends _DoublePropertyBean { + GradientStopBasePositionBean._(): super._(GradientStopBase.positionPropertyKey); + @override + double getDouble(GradientStopBase o) => o.position_; + @override + void setDouble(GradientStopBase o, double v) => o.position = v; + @override + void transformDouble(GradientStopBase o, double Function(double) function) => o.position = function(o.position_); + @override + void applyDouble(GradientStopBase o, double multiplier, double sum) => o.position = o.position_ * multiplier + sum; + @override + void setObjectProperty(Core o, Object v) => o is GradientStopBase && v is double ? o.position = v : {}; +} + + +// TODO review accessors from here diff --git a/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart b/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart index 44c0281f..c51d5ed4 100644 --- a/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart +++ b/lib/src/generated/shapes/cubic_asymmetric_vertex_base.dart @@ -29,6 +29,8 @@ abstract class CubicAsymmetricVertexBase extends CubicVertex { /// Rotation field with key 79. static const int rotationPropertyKey = 79; static const double rotationInitialValue = 0; + + @nonVirtual double rotation_ = rotationInitialValue; /// The control points' angle. @@ -55,6 +57,8 @@ abstract class CubicAsymmetricVertexBase extends CubicVertex { /// InDistance field with key 80. static const int inDistancePropertyKey = 80; static const double inDistanceInitialValue = 0; + + @nonVirtual double inDistance_ = inDistanceInitialValue; /// The in point's distance from the translation of the point. @@ -81,20 +85,23 @@ abstract class CubicAsymmetricVertexBase extends CubicVertex { /// OutDistance field with key 81. static const int outDistancePropertyKey = 81; static const double outDistanceInitialValue = 0; - double _outDistance = outDistanceInitialValue; + + @nonVirtual + double outDistance_ = outDistanceInitialValue; /// The out point's distance from the translation of the point. - double get outDistance => _outDistance; + @nonVirtual + double get outDistance => outDistance_; - /// Change the [_outDistance] field value. + /// Change the [outDistance_] field value. /// [outDistanceChanged] will be invoked only if the field's value has /// changed. set outDistance(double value) { - if (_outDistance == value) { + if (outDistance_ == value) { return; } - double from = _outDistance; - _outDistance = value; + double from = outDistance_; + outDistance_ = value; if (hasValidated) { outDistanceChanged(from, value); } @@ -108,7 +115,7 @@ abstract class CubicAsymmetricVertexBase extends CubicVertex { if (source is CubicAsymmetricVertexBase) { rotation_ = source.rotation_; inDistance_ = source.inDistance_; - _outDistance = source._outDistance; + outDistance_ = source.outDistance_; } } } diff --git a/lib/src/generated/shapes/cubic_detached_vertex_base.dart b/lib/src/generated/shapes/cubic_detached_vertex_base.dart index 0172a782..a92ff58f 100644 --- a/lib/src/generated/shapes/cubic_detached_vertex_base.dart +++ b/lib/src/generated/shapes/cubic_detached_vertex_base.dart @@ -29,6 +29,8 @@ abstract class CubicDetachedVertexBase extends CubicVertex { /// InRotation field with key 84. static const int inRotationPropertyKey = 84; static const double inRotationInitialValue = 0; + + @nonVirtual double inRotation_ = inRotationInitialValue; /// The in point's angle. @@ -55,6 +57,8 @@ abstract class CubicDetachedVertexBase extends CubicVertex { /// InDistance field with key 85. static const int inDistancePropertyKey = 85; static const double inDistanceInitialValue = 0; + + @nonVirtual double inDistance_ = inDistanceInitialValue; /// The in point's distance from the translation of the point. @@ -81,6 +85,8 @@ abstract class CubicDetachedVertexBase extends CubicVertex { /// OutRotation field with key 86. static const int outRotationPropertyKey = 86; static const double outRotationInitialValue = 0; + + @nonVirtual double outRotation_ = outRotationInitialValue; /// The out point's angle. @@ -108,6 +114,8 @@ abstract class CubicDetachedVertexBase extends CubicVertex { /// OutDistance field with key 87. static const int outDistancePropertyKey = 87; static const double outDistanceInitialValue = 0; + + @nonVirtual double outDistance_ = outDistanceInitialValue; /// The out point's distance from the translation of the point. diff --git a/lib/src/generated/shapes/cubic_mirrored_vertex_base.dart b/lib/src/generated/shapes/cubic_mirrored_vertex_base.dart index 84820239..17ad525e 100644 --- a/lib/src/generated/shapes/cubic_mirrored_vertex_base.dart +++ b/lib/src/generated/shapes/cubic_mirrored_vertex_base.dart @@ -29,19 +29,22 @@ abstract class CubicMirroredVertexBase extends CubicVertex { /// Rotation field with key 82. static const int rotationPropertyKey = 82; static const double rotationInitialValue = 0; - double _rotation = rotationInitialValue; + + @nonVirtual + double rotation_ = rotationInitialValue; /// The control points' angle. - double get rotation => _rotation; + @nonVirtual + double get rotation => rotation_; - /// Change the [_rotation] field value. + /// Change the [rotation_] field value. /// [rotationChanged] will be invoked only if the field's value has changed. set rotation(double value) { - if (_rotation == value) { + if (rotation_ == value) { return; } - double from = _rotation; - _rotation = value; + double from = rotation_; + rotation_ = value; if (hasValidated) { rotationChanged(from, value); } @@ -53,19 +56,22 @@ abstract class CubicMirroredVertexBase extends CubicVertex { /// Distance field with key 83. static const int distancePropertyKey = 83; static const double distanceInitialValue = 0; - double _distance = distanceInitialValue; + + @nonVirtual + double distance_ = distanceInitialValue; /// The control points' distance from the translation of the point. - double get distance => _distance; + @nonVirtual + double get distance => distance_; - /// Change the [_distance] field value. + /// Change the [distance_] field value. /// [distanceChanged] will be invoked only if the field's value has changed. set distance(double value) { - if (_distance == value) { + if (distance_ == value) { return; } - double from = _distance; - _distance = value; + double from = distance_; + distance_ = value; if (hasValidated) { distanceChanged(from, value); } @@ -77,8 +83,8 @@ abstract class CubicMirroredVertexBase extends CubicVertex { void copy(Core source) { super.copy(source); if (source is CubicMirroredVertexBase) { - _rotation = source._rotation; - _distance = source._distance; + rotation_ = source.rotation_; + distance_ = source.distance_; } } } diff --git a/lib/src/generated/shapes/paint/gradient_stop_base.dart b/lib/src/generated/shapes/paint/gradient_stop_base.dart index 7f564641..f0d135c1 100644 --- a/lib/src/generated/shapes/paint/gradient_stop_base.dart +++ b/lib/src/generated/shapes/paint/gradient_stop_base.dart @@ -40,17 +40,20 @@ abstract class GradientStopBase extends Component { /// Position field with key 39. static const int positionPropertyKey = 39; static const double positionInitialValue = 0; - double _position = positionInitialValue; - double get position => _position; - /// Change the [_position] field value. + @nonVirtual + double position_ = positionInitialValue; + @nonVirtual + double get position => position_; + + /// Change the [position_] field value. /// [positionChanged] will be invoked only if the field's value has changed. set position(double value) { - if (_position == value) { + if (position_ == value) { return; } - double from = _position; - _position = value; + double from = position_; + position_ = value; if (hasValidated) { positionChanged(from, value); } @@ -63,7 +66,7 @@ abstract class GradientStopBase extends Component { super.copy(source); if (source is GradientStopBase) { _colorValue = source._colorValue; - _position = source._position; + position_ = source.position_; } } } diff --git a/lib/src/generated/shapes/paint/stroke_base.dart b/lib/src/generated/shapes/paint/stroke_base.dart index 9b17088e..1e28da91 100644 --- a/lib/src/generated/shapes/paint/stroke_base.dart +++ b/lib/src/generated/shapes/paint/stroke_base.dart @@ -25,17 +25,20 @@ abstract class StrokeBase extends ShapePaint { /// Thickness field with key 47. static const int thicknessPropertyKey = 47; static const double thicknessInitialValue = 1; - double _thickness = thicknessInitialValue; - double get thickness => _thickness; - /// Change the [_thickness] field value. + @nonVirtual + double thickness_ = thicknessInitialValue; + @nonVirtual + double get thickness => thickness_; + + /// Change the [thickness_] field value. /// [thicknessChanged] will be invoked only if the field's value has changed. set thickness(double value) { - if (_thickness == value) { + if (thickness_ == value) { return; } - double from = _thickness; - _thickness = value; + double from = thickness_; + thickness_ = value; if (hasValidated) { thicknessChanged(from, value); } @@ -114,7 +117,7 @@ abstract class StrokeBase extends ShapePaint { void copy(Core source) { super.copy(source); if (source is StrokeBase) { - _thickness = source._thickness; + thickness_ = source.thickness_; _cap = source._cap; _join = source._join; _transformAffectsStroke = source._transformAffectsStroke; diff --git a/lib/src/generated/shapes/straight_vertex_base.dart b/lib/src/generated/shapes/straight_vertex_base.dart index 80282585..a5480d76 100644 --- a/lib/src/generated/shapes/straight_vertex_base.dart +++ b/lib/src/generated/shapes/straight_vertex_base.dart @@ -28,19 +28,22 @@ abstract class StraightVertexBase extends PathVertex { /// Radius field with key 26. static const int radiusPropertyKey = 26; static const double radiusInitialValue = 0; - double _radius = radiusInitialValue; + + @nonVirtual + double radius_ = radiusInitialValue; /// Radius of the vertex - double get radius => _radius; + @nonVirtual + double get radius => radius_; - /// Change the [_radius] field value. + /// Change the [radius_] field value. /// [radiusChanged] will be invoked only if the field's value has changed. set radius(double value) { - if (_radius == value) { + if (radius_ == value) { return; } - double from = _radius; - _radius = value; + double from = radius_; + radius_ = value; if (hasValidated) { radiusChanged(from, value); } @@ -52,7 +55,7 @@ abstract class StraightVertexBase extends PathVertex { void copy(Core source) { super.copy(source); if (source is StraightVertexBase) { - _radius = source._radius; + radius_ = source.radius_; } } } diff --git a/lib/src/generated/shapes/vertex_base.dart b/lib/src/generated/shapes/vertex_base.dart index 451c8b7d..17557986 100644 --- a/lib/src/generated/shapes/vertex_base.dart +++ b/lib/src/generated/shapes/vertex_base.dart @@ -23,6 +23,7 @@ abstract class VertexBase extends ContainerComponent { static const int xPropertyKey = 24; static const double xInitialValue = 0; + @nonVirtual double x_ = xInitialValue; /// X value for the translation of the vertex. @@ -50,6 +51,7 @@ abstract class VertexBase extends ContainerComponent { static const int yPropertyKey = 25; static const double yInitialValue = 0; + @nonVirtual double y_ = yInitialValue; /// Y value for the translation of the vertex. diff --git a/lib/src/generated/transform_component_base.dart b/lib/src/generated/transform_component_base.dart index 692a1da9..6ad19156 100644 --- a/lib/src/generated/transform_component_base.dart +++ b/lib/src/generated/transform_component_base.dart @@ -25,17 +25,20 @@ abstract class TransformComponentBase extends WorldTransformComponent { /// Rotation field with key 15. static const int rotationPropertyKey = 15; static const double rotationInitialValue = 0; - double _rotation = rotationInitialValue; - double get rotation => _rotation; - /// Change the [_rotation] field value. + @nonVirtual + double rotation_ = rotationInitialValue; + @nonVirtual + double get rotation => rotation_; + + /// Change the [rotation_] field value. /// [rotationChanged] will be invoked only if the field's value has changed. set rotation(double value) { - if (_rotation == value) { + if (rotation_ == value) { return; } - double from = _rotation; - _rotation = value; + double from = rotation_; + rotation_ = value; if (hasValidated) { rotationChanged(from, value); } @@ -47,17 +50,21 @@ abstract class TransformComponentBase extends WorldTransformComponent { /// ScaleX field with key 16. static const int scaleXPropertyKey = 16; static const double scaleXInitialValue = 1; - double _scaleX = scaleXInitialValue; - double get scaleX => _scaleX; - /// Change the [_scaleX] field value. + @nonVirtual + double scaleX_ = scaleXInitialValue; + + @nonVirtual + double get scaleX => scaleX_; + + /// Change the [scaleX_] field value. /// [scaleXChanged] will be invoked only if the field's value has changed. set scaleX(double value) { - if (_scaleX == value) { + if (scaleX_ == value) { return; } - double from = _scaleX; - _scaleX = value; + double from = scaleX_; + scaleX_ = value; if (hasValidated) { scaleXChanged(from, value); } @@ -69,17 +76,21 @@ abstract class TransformComponentBase extends WorldTransformComponent { /// ScaleY field with key 17. static const int scaleYPropertyKey = 17; static const double scaleYInitialValue = 1; - double _scaleY = scaleYInitialValue; - double get scaleY => _scaleY; - /// Change the [_scaleY] field value. + @nonVirtual + double scaleY_ = scaleYInitialValue; + + @nonVirtual + double get scaleY => scaleY_; + + /// Change the [scaleY_] field value. /// [scaleYChanged] will be invoked only if the field's value has changed. set scaleY(double value) { - if (_scaleY == value) { + if (scaleY_ == value) { return; } - double from = _scaleY; - _scaleY = value; + double from = scaleY_; + scaleY_ = value; if (hasValidated) { scaleYChanged(from, value); } @@ -91,9 +102,9 @@ abstract class TransformComponentBase extends WorldTransformComponent { void copy(Core source) { super.copy(source); if (source is TransformComponentBase) { - _rotation = source._rotation; - _scaleX = source._scaleX; - _scaleY = source._scaleY; + rotation_ = source.rotation_; + scaleX_ = source.scaleX_; + scaleY_ = source.scaleY_; } } } diff --git a/lib/src/generated/world_transform_component_base.dart b/lib/src/generated/world_transform_component_base.dart index 363226fc..ebbb3236 100644 --- a/lib/src/generated/world_transform_component_base.dart +++ b/lib/src/generated/world_transform_component_base.dart @@ -23,17 +23,20 @@ abstract class WorldTransformComponentBase extends ContainerComponent { /// Opacity field with key 18. static const int opacityPropertyKey = 18; static const double opacityInitialValue = 1; - double _opacity = opacityInitialValue; - double get opacity => _opacity; - /// Change the [_opacity] field value. + @nonVirtual + double opacity_ = opacityInitialValue; + @nonVirtual + double get opacity => opacity_; + + /// Change the [opacity_] field value. /// [opacityChanged] will be invoked only if the field's value has changed. set opacity(double value) { - if (_opacity == value) { + if (opacity_ == value) { return; } - double from = _opacity; - _opacity = value; + double from = opacity_; + opacity_ = value; if (hasValidated) { opacityChanged(from, value); } @@ -45,7 +48,7 @@ abstract class WorldTransformComponentBase extends ContainerComponent { void copy(Core source) { super.copy(source); if (source is WorldTransformComponentBase) { - _opacity = source._opacity; + opacity_ = source.opacity_; } } } diff --git a/lib/src/state_transition_conditions.dart b/lib/src/state_transition_conditions.dart index 1168182d..a03689b8 100644 --- a/lib/src/state_transition_conditions.dart +++ b/lib/src/state_transition_conditions.dart @@ -8,7 +8,7 @@ class StateTransitionConditions extends ListBase { // List get values => _values.cast(); @nonVirtual - @override + // @override final List values = []; // has to be nullable // List get values => _values.cast(); From e82c2659bbeaec3a06430e94e13a7380a2886bec Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 7 Mar 2025 13:00:25 +0000 Subject: [PATCH 43/50] all rive_core_beans migrated to specific implementation --- .../interpolating_keyframe_base.dart | 5 - .../animation/keyed_object_base.dart | 1 - .../transition_input_condition_base.dart | 17 +- lib/src/generated/component_base.dart | 34 ++- lib/src/generated/draw_rules_base.dart | 17 +- lib/src/generated/rive_core_beans.dart | 272 ++++++++++++++---- .../shapes/paint/gradient_stop_base.dart | 17 +- .../shapes/paint/solid_color_base.dart | 17 +- lib/src/generated/solo_base.dart | 17 +- 9 files changed, 282 insertions(+), 115 deletions(-) diff --git a/lib/src/generated/animation/interpolating_keyframe_base.dart b/lib/src/generated/animation/interpolating_keyframe_base.dart index eaa30634..bae5c27f 100644 --- a/lib/src/generated/animation/interpolating_keyframe_base.dart +++ b/lib/src/generated/animation/interpolating_keyframe_base.dart @@ -29,11 +29,6 @@ abstract class InterpolatingKeyFrameBase extends KeyFrame { static const int interpolatorIdPropertyKey = 69; static const int interpolatorIdInitialValue = -1; - // int _interpolatorId = interpolatorIdInitialValue; - - /// The id of the custom interpolator used when interpolation is Cubic. - // int get interpolatorId => _interpolatorId; - int get interpolatorId; /// Change the [_interpolatorId] field value. diff --git a/lib/src/generated/animation/keyed_object_base.dart b/lib/src/generated/animation/keyed_object_base.dart index 2faf5691..f9e6c92d 100644 --- a/lib/src/generated/animation/keyed_object_base.dart +++ b/lib/src/generated/animation/keyed_object_base.dart @@ -29,7 +29,6 @@ abstract class KeyedObjectBase extends Core { set objectId(int frame) => high = frame; - // /// Identifier used to track the object that is keyed. // int get objectId => _objectId; // diff --git a/lib/src/generated/animation/transition_input_condition_base.dart b/lib/src/generated/animation/transition_input_condition_base.dart index 55b6d300..45dcf2fc 100644 --- a/lib/src/generated/animation/transition_input_condition_base.dart +++ b/lib/src/generated/animation/transition_input_condition_base.dart @@ -18,19 +18,22 @@ abstract class TransitionInputConditionBase extends TransitionCondition { /// InputId field with key 155. static const int inputIdPropertyKey = 155; static const int inputIdInitialValue = -1; - int _inputId = inputIdInitialValue; + + @nonVirtual + int inputId_ = inputIdInitialValue; /// Id of the StateMachineInput referenced. - int get inputId => _inputId; + @nonVirtual + int get inputId => inputId_; - /// Change the [_inputId] field value. + /// Change the [inputId_] field value. /// [inputIdChanged] will be invoked only if the field's value has changed. set inputId(int value) { - if (_inputId == value) { + if (inputId_ == value) { return; } - int from = _inputId; - _inputId = value; + int from = inputId_; + inputId_ = value; if (hasValidated) { inputIdChanged(from, value); } @@ -42,7 +45,7 @@ abstract class TransitionInputConditionBase extends TransitionCondition { void copy(Core source) { super.copy(source); if (source is TransitionInputConditionBase) { - _inputId = source._inputId; + inputId_ = source.inputId_; } } } diff --git a/lib/src/generated/component_base.dart b/lib/src/generated/component_base.dart index 5f3253f9..619fb7c6 100644 --- a/lib/src/generated/component_base.dart +++ b/lib/src/generated/component_base.dart @@ -16,20 +16,23 @@ abstract class ComponentBase extends Core { /// Name field with key 4. static const int namePropertyKey = 4; static const String nameInitialValue = ''; - String _name = nameInitialValue; + + @nonVirtual + String name_ = nameInitialValue; /// Non-unique identifier, used to give friendly names to elements in the /// hierarchy. Runtimes provide an API for finding components by this [name]. - String get name => _name; + @nonVirtual + String get name => name_; - /// Change the [_name] field value. + /// Change the [name_] field value. /// [nameChanged] will be invoked only if the field's value has changed. set name(String value) { - if (_name == value) { + if (name_ == value) { return; } - String from = _name; - _name = value; + String from = name_; + name_ = value; if (hasValidated) { nameChanged(from, value); } @@ -41,19 +44,22 @@ abstract class ComponentBase extends Core { /// ParentId field with key 5. static const int parentIdPropertyKey = 5; static const int parentIdInitialValue = 0; - int _parentId = parentIdInitialValue; + + @nonVirtual + int parentId_ = parentIdInitialValue; /// Identifier used to track parent ContainerComponent. - int get parentId => _parentId; + @nonVirtual + int get parentId => parentId_; - /// Change the [_parentId] field value. + /// Change the [parentId_] field value. /// [parentIdChanged] will be invoked only if the field's value has changed. set parentId(int value) { - if (_parentId == value) { + if (parentId_ == value) { return; } - int from = _parentId; - _parentId = value; + int from = parentId_; + parentId_ = value; if (hasValidated) { parentIdChanged(from, value); } @@ -65,8 +71,8 @@ abstract class ComponentBase extends Core { void copy(Core source) { super.copy(source); if (source is ComponentBase) { - _name = source._name; - _parentId = source._parentId; + name_ = source.name_; + parentId_ = source.parentId_; } } } diff --git a/lib/src/generated/draw_rules_base.dart b/lib/src/generated/draw_rules_base.dart index 3258c549..857d825d 100644 --- a/lib/src/generated/draw_rules_base.dart +++ b/lib/src/generated/draw_rules_base.dart @@ -22,20 +22,23 @@ abstract class DrawRulesBase extends ContainerComponent { /// DrawTargetId field with key 121. static const int drawTargetIdPropertyKey = 121; static const int drawTargetIdInitialValue = -1; - int _drawTargetId = drawTargetIdInitialValue; + + @nonVirtual + int drawTargetId_ = drawTargetIdInitialValue; /// Id of the DrawTarget that is currently active for this set of rules. - int get drawTargetId => _drawTargetId; + @nonVirtual + int get drawTargetId => drawTargetId_; - /// Change the [_drawTargetId] field value. + /// Change the [drawTargetId_] field value. /// [drawTargetIdChanged] will be invoked only if the field's value has /// changed. set drawTargetId(int value) { - if (_drawTargetId == value) { + if (drawTargetId_ == value) { return; } - int from = _drawTargetId; - _drawTargetId = value; + int from = drawTargetId_; + drawTargetId_ = value; if (hasValidated) { drawTargetIdChanged(from, value); } @@ -47,7 +50,7 @@ abstract class DrawRulesBase extends ContainerComponent { void copy(Core source) { super.copy(source); if (source is DrawRulesBase) { - _drawTargetId = source._drawTargetId; + drawTargetId_ = source.drawTargetId_; } } } diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index d5dc7590..376822de 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -66,8 +66,8 @@ class _DoublePropertyBean extends PropertyBean { @nonVirtual CoreFieldType? get coreType => RiveCoreContext.doubleType; - @override - void setObjectProperty(Core o, Object v) => o is T && v is double ? setDouble(o, v) : {}; + // @override + // void setObjectProperty(Core o, Object v) => o is T && v is double ? setDouble(o, v) : {}; } // class DoublePropertyBean extends _DoublePropertyBean { @@ -101,66 +101,88 @@ class _UintPropertyBean extends PropertyBean { @nonVirtual CoreFieldType? get coreType => RiveCoreContext.uintType; - @override - void setObjectProperty(Core o, Object v) => o is T && v is int ? setUint(o, v) : {}; + // @override + // void setObjectProperty(Core o, Object v) => o is T && v is int ? setUint(o, v) : {}; } -class UintPropertyBean extends _UintPropertyBean { - - final int Function(T) getter; - final void Function(T, int) setter; - UintPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); - - @override - int getUint(T o) => getter(o); +// class UintPropertyBean extends _UintPropertyBean { +// +// final int Function(T) getter; +// final void Function(T, int) setter; +// UintPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); +// +// @override +// int getUint(T o) => getter(o); +// +// @override +// void setUint(T o, int v) => setter(o, v); +// +// @override +// void setObjectProperty(Core o, Object v) => o is T && v is int ? setter(o, v) : {}; +// +// // @override +// // CoreFieldType? get coreType => RiveCoreContext.uintType; +// } - @override - void setUint(T o, int v) => setter(o, v); +class _ColorPropertyBean extends PropertyBean { + _ColorPropertyBean._(super.propertyKey): super._(); @override - void setObjectProperty(Core o, Object v) => o is T && v is int ? setter(o, v) : {}; + @nonVirtual + CoreFieldType? get coreType => RiveCoreContext.colorType; // @override - // CoreFieldType? get coreType => RiveCoreContext.uintType; + // void setObjectProperty(Core o, Object v) => o is T && v is int ? setUint(o, v) : {}; } -class ColorPropertyBean extends PropertyBean { - - final int Function(T) getter; - final void Function(T, int) setter; - ColorPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); - - @override - int getColor(T o) => getter(o); +// class ColorPropertyBean extends PropertyBean { +// +// final int Function(T) getter; +// final void Function(T, int) setter; +// ColorPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); +// +// @override +// int getColor(T o) => getter(o); +// +// @override +// void setColor(T o, int v) => setter(o, v); +// +// @override +// void setObjectProperty(Core o, Object v) => o is T && v is int ? setter(o, v) : {}; +// +// @override +// CoreFieldType? get coreType => RiveCoreContext.colorType; +// } - @override - void setColor(T o, int v) => setter(o, v); +class _StringPropertyBean extends PropertyBean { + _StringPropertyBean._(super.propertyKey): super._(); @override - void setObjectProperty(Core o, Object v) => o is T && v is int ? setter(o, v) : {}; + @nonVirtual + CoreFieldType? get coreType => RiveCoreContext.stringType; - @override - CoreFieldType? get coreType => RiveCoreContext.colorType; + // @override + // void setObjectProperty(Core o, Object v) => o is T && v is int ? setUint(o, v) : {}; } -class StringPropertyBean extends PropertyBean { - - final String Function(T) getter; - final void Function(T, String) setter; - StringPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); - - @override - String getString(T o) => getter(o); - - @override - void setString(T o, String v) => setter(o, v); - - @override - void setObjectProperty(Core o, Object v) => o is T && v is String ? setter(o, v) : {}; - - @override - CoreFieldType? get coreType => RiveCoreContext.stringType; -} +// class StringPropertyBean extends _StringPropertyBean { +// +// final String Function(T) getter; +// final void Function(T, String) setter; +// StringPropertyBean._(super.propertyKey, this.getter, this.setter): super._(); +// +// @override +// String getString(T o) => getter(o); +// +// @override +// void setString(T o, String v) => setter(o, v); +// +// @override +// void setObjectProperty(Core o, Object v) => o is T && v is String ? setter(o, v) : {}; +// +// // @override +// // CoreFieldType? get coreType => RiveCoreContext.stringType; +// } class FallbackBean extends PropertyBean { @@ -289,20 +311,20 @@ final _implements = [ CubicMirroredVertexBaseDistanceBean._(), GradientStopBasePositionBean._(), - UintPropertyBean._(InterpolatingKeyFrameBase.interpolatorIdPropertyKey, (o) => o.interpolatorId, (o, v) => o.interpolatorId = v), - UintPropertyBean._(KeyedPropertyBase.propertyKeyPropertyKey, (o) => o.propertyKey, (o, v) => o.propertyKey = v), - UintPropertyBean._(KeyFrameBase.framePropertyKey, (o) => o.frame, (o, v) => o.frame = v), - UintPropertyBean._(InterpolatingKeyFrameBase.interpolationTypePropertyKey, (o) => o.interpolationType, (o, v) => o.interpolationType = v), - UintPropertyBean._(SoloBase.activeComponentIdPropertyKey, (o) => o.activeComponentId, (o, v) => o.activeComponentId = v), - UintPropertyBean._(KeyedObjectBase.objectIdPropertyKey, (o) => o.objectId, (o, v) => o.objectId = v), - UintPropertyBean._(DrawRulesBase.drawTargetIdPropertyKey, (o) => o.drawTargetId, (o, v) => o.drawTargetId = v), - UintPropertyBean._(ComponentBase.parentIdPropertyKey, (o) => o.parentId, (o, v) => o.parentId = v), - UintPropertyBean._(TransitionInputConditionBase.inputIdPropertyKey, (o) => o.inputId, (o, v) => o.inputId = v), + InterpolatingKeyFrameBaseInterpolatorIdBean._(), + KeyedPropertyBasePropertyKeyBean._(), + KeyFrameBaseFrameBean._(), + InterpolatingKeyFrameBaseInterpolationTypeBean._(), + SoloBaseActiveComponentIdBean._(), + KeyedObjectBaseObjectIdBean._(), + DrawRulesBaseDrawTargetIdBean._(), + ComponentBaseParentIdBean._(), + TransitionInputConditionBaseInputIdBean._(), - StringPropertyBean._(ComponentBase.namePropertyKey, (o) => o.name, (o, v) => o.name = v), + ComponentBaseNameBean._(), - ColorPropertyBean._(SolidColorBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), - ColorPropertyBean._(GradientStopBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), + SolidColorBaseColorValueBean._(), + GradientStopBaseColorValueBean._(), ]; @@ -657,5 +679,135 @@ class GradientStopBasePositionBean extends _DoublePropertyBean void setObjectProperty(Core o, Object v) => o is GradientStopBase && v is double ? o.position = v : {}; } +// UintPropertyBean._(InterpolatingKeyFrameBase.interpolatorIdPropertyKey, (o) => o.interpolatorId, (o, v) => o.interpolatorId = v), +class InterpolatingKeyFrameBaseInterpolatorIdBean extends _UintPropertyBean { + InterpolatingKeyFrameBaseInterpolatorIdBean._(): super._(InterpolatingKeyFrameBase.interpolatorIdPropertyKey); + @override + int getUint(InterpolatingKeyFrameBase o) => o.interpolatorId; + @override + void setUint(InterpolatingKeyFrameBase o, int v) => o.interpolatorId = v; + @override + void setObjectProperty(Core o, Object v) => o is InterpolatingKeyFrameBase && v is int ? o.interpolatorId = v : {}; +} + +// UintPropertyBean._(KeyedPropertyBase.propertyKeyPropertyKey, (o) => o.propertyKey, (o, v) => o.propertyKey = v), +class KeyedPropertyBasePropertyKeyBean extends _UintPropertyBean { + KeyedPropertyBasePropertyKeyBean._(): super._(KeyedPropertyBase.propertyKeyPropertyKey); + @override + int getUint(KeyedPropertyBase o) => o.propertyKey; + @override + void setUint(KeyedPropertyBase o, int v) => o.propertyKey = v; + @override + void setObjectProperty(Core o, Object v) => o is KeyedPropertyBase && v is int ? o.propertyKey = v : {}; +} + +// UintPropertyBean._(KeyFrameBase.framePropertyKey, (o) => o.frame, (o, v) => o.frame = v), +class KeyFrameBaseFrameBean extends _UintPropertyBean { + KeyFrameBaseFrameBean._(): super._(KeyFrameBase.framePropertyKey); + @override + int getUint(KeyFrameBase o) => o.high; + @override + void setUint(KeyFrameBase o, int v) => o.high = v; + @override + void setObjectProperty(Core o, Object v) => o is KeyFrameBase && v is int ? o.high = v : {}; +} + +// UintPropertyBean._(InterpolatingKeyFrameBase.interpolationTypePropertyKey, (o) => o.interpolationType, (o, v) => o.interpolationType = v), +class InterpolatingKeyFrameBaseInterpolationTypeBean extends _UintPropertyBean { + InterpolatingKeyFrameBaseInterpolationTypeBean._(): super._(InterpolatingKeyFrameBase.interpolationTypePropertyKey); + @override + int getUint(InterpolatingKeyFrameBase o) => o.interpolationType; + @override + void setUint(InterpolatingKeyFrameBase o, int v) => o.interpolationType = v; + @override + void setObjectProperty(Core o, Object v) => o is InterpolatingKeyFrameBase && v is int ? o.interpolationType = v : {}; +} + +// UintPropertyBean._(SoloBase.activeComponentIdPropertyKey, (o) => o.activeComponentId, (o, v) => o.activeComponentId = v), +class SoloBaseActiveComponentIdBean extends _UintPropertyBean { + SoloBaseActiveComponentIdBean._(): super._(SoloBase.activeComponentIdPropertyKey); + @override + int getUint(SoloBase o) => o.activeComponentId_; + @override + void setUint(SoloBase o, int v) => o.activeComponentId = v; + @override + void setObjectProperty(Core o, Object v) => o is SoloBase && v is int ? o.activeComponentId = v : {}; +} + +// UintPropertyBean._(KeyedObjectBase.objectIdPropertyKey, (o) => o.objectId, (o, v) => o.objectId = v), +class KeyedObjectBaseObjectIdBean extends _UintPropertyBean { + KeyedObjectBaseObjectIdBean._(): super._(KeyedObjectBase.objectIdPropertyKey); + @override + int getUint(KeyedObjectBase o) => o.high; + @override + void setUint(KeyedObjectBase o, int v) => o.high = v; + @override + void setObjectProperty(Core o, Object v) => o is KeyedObjectBase && v is int ? o.high = v : {}; +} + +// UintPropertyBean._(DrawRulesBase.drawTargetIdPropertyKey, (o) => o.drawTargetId, (o, v) => o.drawTargetId = v), +class DrawRulesBaseDrawTargetIdBean extends _UintPropertyBean { + DrawRulesBaseDrawTargetIdBean._(): super._(DrawRulesBase.drawTargetIdPropertyKey); + @override + int getUint(DrawRulesBase o) => o.drawTargetId_; + @override + void setUint(DrawRulesBase o, int v) => o.drawTargetId = v; + @override + void setObjectProperty(Core o, Object v) => o is DrawRulesBase && v is int ? o.drawTargetId = v : {}; +} + +// UintPropertyBean._(ComponentBase.parentIdPropertyKey, (o) => o.parentId, (o, v) => o.parentId = v), +class ComponentBaseParentIdBean extends _UintPropertyBean { + ComponentBaseParentIdBean._(): super._(ComponentBase.parentIdPropertyKey); + @override + int getUint(ComponentBase o) => o.parentId_; + @override + void setUint(ComponentBase o, int v) => o.parentId = v; + @override + void setObjectProperty(Core o, Object v) => o is ComponentBase && v is int ? o.parentId = v : {}; +} + +// UintPropertyBean._(TransitionInputConditionBase.inputIdPropertyKey, (o) => o.inputId, (o, v) => o.inputId = v), +class TransitionInputConditionBaseInputIdBean extends _UintPropertyBean { + TransitionInputConditionBaseInputIdBean._(): super._(TransitionInputConditionBase.inputIdPropertyKey); + @override + int getUint(TransitionInputConditionBase o) => o.inputId_; + @override + void setUint(TransitionInputConditionBase o, int v) => o.inputId = v; + @override + void setObjectProperty(Core o, Object v) => o is TransitionInputConditionBase && v is int ? o.inputId = v : {}; +} + +// StringPropertyBean._(ComponentBase.namePropertyKey, (o) => o.name, (o, v) => o.name = v), +class ComponentBaseNameBean extends _StringPropertyBean { + ComponentBaseNameBean._(): super._(ComponentBase.namePropertyKey); + @override + String getString(ComponentBase o) => o.name_; + @override + void setString(ComponentBase o, String v) => o.name = v; + @override + void setObjectProperty(Core o, Object v) => o is ComponentBase && v is String ? o.name = v : {}; +} + +// ColorPropertyBean._(SolidColorBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), +class SolidColorBaseColorValueBean extends _ColorPropertyBean { + SolidColorBaseColorValueBean._(): super._(SolidColorBase.colorValuePropertyKey); + @override + int getColor(SolidColorBase o) => o.colorValue_; + @override + void setColor(SolidColorBase o, int v) => o.colorValue = v; + @override + void setObjectProperty(Core o, Object v) => o is SolidColorBase && v is int ? o.colorValue = v : {}; +} + +// ColorPropertyBean._(GradientStopBase.colorValuePropertyKey, (o) => o.colorValue, (o, v) => o.colorValue = v), +class GradientStopBaseColorValueBean extends _ColorPropertyBean { + GradientStopBaseColorValueBean._(): super._(GradientStopBase.colorValuePropertyKey); + @override + int getColor(GradientStopBase o) => o.colorValue_; + @override + void setColor(GradientStopBase o, int v) => o.colorValue = v; + @override + void setObjectProperty(Core o, Object v) => o is GradientStopBase && v is int ? o.colorValue = v : {}; +} -// TODO review accessors from here diff --git a/lib/src/generated/shapes/paint/gradient_stop_base.dart b/lib/src/generated/shapes/paint/gradient_stop_base.dart index f0d135c1..3e6adb93 100644 --- a/lib/src/generated/shapes/paint/gradient_stop_base.dart +++ b/lib/src/generated/shapes/paint/gradient_stop_base.dart @@ -18,17 +18,20 @@ abstract class GradientStopBase extends Component { /// ColorValue field with key 38. static const int colorValuePropertyKey = 38; static const int colorValueInitialValue = 0xFFFFFFFF; - int _colorValue = colorValueInitialValue; - int get colorValue => _colorValue; - /// Change the [_colorValue] field value. + @nonVirtual + int colorValue_ = colorValueInitialValue; + @nonVirtual + int get colorValue => colorValue_; + + /// Change the [colorValue_] field value. /// [colorValueChanged] will be invoked only if the field's value has changed. set colorValue(int value) { - if (_colorValue == value) { + if (colorValue_ == value) { return; } - int from = _colorValue; - _colorValue = value; + int from = colorValue_; + colorValue_ = value; if (hasValidated) { colorValueChanged(from, value); } @@ -65,7 +68,7 @@ abstract class GradientStopBase extends Component { void copy(Core source) { super.copy(source); if (source is GradientStopBase) { - _colorValue = source._colorValue; + colorValue_ = source.colorValue_; position_ = source.position_; } } diff --git a/lib/src/generated/shapes/paint/solid_color_base.dart b/lib/src/generated/shapes/paint/solid_color_base.dart index 86e042c0..fab83ac2 100644 --- a/lib/src/generated/shapes/paint/solid_color_base.dart +++ b/lib/src/generated/shapes/paint/solid_color_base.dart @@ -18,17 +18,20 @@ abstract class SolidColorBase extends Component { /// ColorValue field with key 37. static const int colorValuePropertyKey = 37; static const int colorValueInitialValue = 0xFF747474; - int _colorValue = colorValueInitialValue; - int get colorValue => _colorValue; - /// Change the [_colorValue] field value. + @nonVirtual + int colorValue_ = colorValueInitialValue; + @nonVirtual + int get colorValue => colorValue_; + + /// Change the [colorValue_] field value. /// [colorValueChanged] will be invoked only if the field's value has changed. set colorValue(int value) { - if (_colorValue == value) { + if (colorValue_ == value) { return; } - int from = _colorValue; - _colorValue = value; + int from = colorValue_; + colorValue_ = value; if (hasValidated) { colorValueChanged(from, value); } @@ -40,7 +43,7 @@ abstract class SolidColorBase extends Component { void copy(Core source) { super.copy(source); if (source is SolidColorBase) { - _colorValue = source._colorValue; + colorValue_ = source.colorValue_; } } } diff --git a/lib/src/generated/solo_base.dart b/lib/src/generated/solo_base.dart index ad3090dc..8bd2928a 100644 --- a/lib/src/generated/solo_base.dart +++ b/lib/src/generated/solo_base.dart @@ -28,20 +28,23 @@ abstract class SoloBase extends Node { /// ActiveComponentId field with key 296. static const int activeComponentIdPropertyKey = 296; static const int activeComponentIdInitialValue = 0; - int _activeComponentId = activeComponentIdInitialValue; + + @nonVirtual + int activeComponentId_ = activeComponentIdInitialValue; /// Identifier of the active child in the solo set. - int get activeComponentId => _activeComponentId; + @nonVirtual + int get activeComponentId => activeComponentId_; - /// Change the [_activeComponentId] field value. + /// Change the [activeComponentId_] field value. /// [activeComponentIdChanged] will be invoked only if the field's value has /// changed. set activeComponentId(int value) { - if (_activeComponentId == value) { + if (activeComponentId_ == value) { return; } - int from = _activeComponentId; - _activeComponentId = value; + int from = activeComponentId_; + activeComponentId_ = value; if (hasValidated) { activeComponentIdChanged(from, value); } @@ -53,7 +56,7 @@ abstract class SoloBase extends Node { void copy(Core source) { super.copy(source); if (source is SoloBase) { - _activeComponentId = source._activeComponentId; + activeComponentId_ = source.activeComponentId_; } } } From e7be7a4a19d74150adc4738d124b2b6640b30684 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Sat, 8 Mar 2025 13:20:24 +0000 Subject: [PATCH 44/50] investigating badge render problem --- lib/src/widgets/rive_animation.dart | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/src/widgets/rive_animation.dart b/lib/src/widgets/rive_animation.dart index a0f233e4..ea80526b 100644 --- a/lib/src/widgets/rive_animation.dart +++ b/lib/src/widgets/rive_animation.dart @@ -227,10 +227,15 @@ class RiveAnimationState extends State { } /// Loads [RiveFile] and calls [_init] - Future _configure() async { + // Future _configure() async { + void _configure() { if (!mounted) return; - _init(await _loadRiveFile()); + // log('RIVE-ANIMATION CONFIGURE $runtimeType:$hashCode > ${widget.artboard}:${widget.file}'); + // debugPrintStack(maxFrames: 10); + + _loadRiveFile().then(_init); + // _init(await _loadRiveFile()); } /// STOKANAL-FORK-EDIT: start @@ -281,10 +286,10 @@ class RiveAnimationState extends State { if (widget.name != oldWidget.name || widget.file != oldWidget.file || widget.src != oldWidget.src) { - _configure(); // Rife file has changed + _configure(); // Rive file has changed } else if (_requiresInit(oldWidget)) { if (_riveFile == null) { - _configure(); // Rife file not yet loaded + _configure(); // Rive file not yet loaded } else { _init(_riveFile!); } @@ -312,7 +317,6 @@ class RiveAnimationState extends State { // Clear current local controllers. // _controllers.forEach((c) { - for (final c in _controllers) { c.dispose(); } @@ -359,7 +363,7 @@ class RiveAnimationState extends State { setState(() => _artboard = artboard); // Call the onInit callback if provided - widget.onInit?.call(_artboard!); + widget.onInit?.call(artboard); } @override From 6a1e6beaab7dec8b014c969656fb2ee75f190eb9 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Wed, 19 Mar 2025 13:20:12 +0000 Subject: [PATCH 45/50] removing MoneySource from Dart export --- lib/src/rive_core/state_machine_controller.dart | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index b705d62d..5ca5ec91 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -167,7 +167,7 @@ class LayerController { } static int _maxIterations = 0; - static bool _tooMuchIterationsCollected = false; + static final _tooManyIterationsCollected = {}; String _dumpState(StateInstance? state) { if (state == null) { @@ -200,14 +200,10 @@ class LayerController { // Escape hatch, let the user know their logic is causing some kind of // recursive condition. var runtime = core is RuntimeArtboard ? core : null; - var message = 'TOO MANY ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} ${runtime?.artboard.name} > ' - '${_dumpState(_currentState)} ${_dumpState(_stateFrom)}'; - if (_tooMuchIterationsCollected) { - print(message); - } else { - _tooMuchIterationsCollected = true; + var state = _dumpState(_currentState); + if (_tooManyIterationsCollected.add(state)) { Telemetry() - .collect(message) + .collect('TOO MANY ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} ${runtime?.artboard.name} > $state ${_dumpState(_stateFrom)}') .error(StackTrace.current, 'Too many iterations', fatal: false); } return false; From 84696c7fa16e8c428a357a0f225ee89c614ab5b0 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Wed, 19 Mar 2025 18:18:37 +0000 Subject: [PATCH 46/50] preparing google play submission --- lib/src/rive_core/state_machine_controller.dart | 9 +++++---- lib/src/rive_file.dart | 5 ++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 5ca5ec91..5b7babd5 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -174,7 +174,8 @@ class LayerController { return 'null'; } var animationState = state.state is AnimationState ? state.state as AnimationState : null; - return '${state.runtimeType}:${state.state.runtimeType} ${animationState?.animation?.name} > $state ${state.state}'; + // return '${state.runtimeType}:${state.state.runtimeType} ${animationState?.animation?.name} > $state ${state.state}'; + return '${animationState?.animation?.name}'; } bool apply(CoreContext core, double elapsedSeconds) { @@ -200,10 +201,10 @@ class LayerController { // Escape hatch, let the user know their logic is causing some kind of // recursive condition. var runtime = core is RuntimeArtboard ? core : null; - var state = _dumpState(_currentState); - if (_tooManyIterationsCollected.add(state)) { + var transition = '${_dumpState(_currentState)} |> ${_dumpState(_stateFrom)}'; + if (_tooManyIterationsCollected.add(transition)) { Telemetry() - .collect('TOO MANY ITERATIONS > $i max=$_maxIterations >> ${core.runtimeType} ${runtime?.artboard.name} > $state ${_dumpState(_stateFrom)}') + .collect('TOO MANY ITERATIONS > $i max=$_maxIterations | ${core.runtimeType} ${runtime?.artboard.name} || $transition') .error(StackTrace.current, 'Too many iterations', fatal: false); } return false; diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index dcf7c1d7..ba62010c 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -1,4 +1,5 @@ import 'dart:collection'; +import 'dart:developer'; import 'package:collection/collection.dart'; import 'package:flutter/services.dart'; @@ -179,7 +180,9 @@ class RiveFile { }) { var skipInterpolation = path != null && skipInterpolationRiveFiles.any(path.contains); - // log('RIVE-FILE >> $path${skipInterpolation?' > SKIP_INTERPOLATION':''}'); + if (skipInterpolation) { + log('RIVE-FILE >> $path${skipInterpolation ? ' > SKIP_INTERPOLATION' : ''}'); + } // debugPrintStack(); /// Property fields table of contents From 291e8065ebb19c57a10a24e0bd9ea29543e6d967 Mon Sep 17 00:00:00 2001 From: "Kaio C. de Oliveira" Date: Thu, 27 Mar 2025 16:42:09 -0300 Subject: [PATCH 47/50] chore: git ref stokanal --- pubspec.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index fb3976b9..28ad44ef 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,7 +31,10 @@ dependencies: # STOKANAL-FORK-EDIT: added stokanal stokanal: - path: ../stokanal-flutter/ + # path: ../stokanal-flutter/ + git: + url: https://github.com/kaypora-games/stokanal-flutter.git + ref: develop dev_dependencies: flutter_test: From e5781f6e7760dc5cc913aff5adc0b9fc5e7853f3 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 28 Mar 2025 11:42:34 +0000 Subject: [PATCH 48/50] _tooManyIterationsCollected set --- lib/src/rive_core/state_machine_controller.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index 5b7babd5..e90fad72 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -56,6 +56,9 @@ typedef OnLayerStateChange = void Function(LayerState); /// Callback signature for events firing. typedef OnEvent = void Function(RiveEvent); +int _maxIterations = 0; +final _tooManyIterationsCollected = {}; + class LayerController { final StateMachineLayer layer; final StateInstance anyStateInstance; @@ -166,9 +169,6 @@ class LayerController { } } - static int _maxIterations = 0; - static final _tooManyIterationsCollected = {}; - String _dumpState(StateInstance? state) { if (state == null) { return 'null'; @@ -197,14 +197,14 @@ class LayerController { int i = 0; for (; updateState(i != 0); i++) { _apply(core); - if (i == 30) { + if (i == 10) { // Escape hatch, let the user know their logic is causing some kind of // recursive condition. var runtime = core is RuntimeArtboard ? core : null; var transition = '${_dumpState(_currentState)} |> ${_dumpState(_stateFrom)}'; if (_tooManyIterationsCollected.add(transition)) { Telemetry() - .collect('TOO MANY ITERATIONS > $i max=$_maxIterations | ${core.runtimeType} ${runtime?.artboard.name} || $transition') + .collect('TOO MANY ITERATIONS > $i max=$_maxIterations | ${core.runtimeType} ${runtime?.artboard.name} | $transition') .error(StackTrace.current, 'Too many iterations', fatal: false); } return false; From 22f443f1306c5a9c6c4644d1dec8b9f428cfdb95 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Fri, 28 Mar 2025 11:44:31 +0000 Subject: [PATCH 49/50] stokanal can be imported from path --- pubspec.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 28ad44ef..23891e56 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,10 +31,10 @@ dependencies: # STOKANAL-FORK-EDIT: added stokanal stokanal: - # path: ../stokanal-flutter/ - git: - url: https://github.com/kaypora-games/stokanal-flutter.git - ref: develop + path: ../stokanal-flutter/ +# git: +# url: https://github.com/kaypora-games/stokanal-flutter.git +# ref: develop dev_dependencies: flutter_test: From c600982acc8a35bc718f15896f491e31cea8b9f2 Mon Sep 17 00:00:00 2001 From: gauchoj Date: Thu, 9 Oct 2025 14:34:06 +0000 Subject: [PATCH 50/50] running views after refactor --- example/macos/Flutter/GeneratedPluginRegistrant.swift | 2 ++ example/windows/flutter/generated_plugin_registrant.cc | 3 +++ example/windows/flutter/generated_plugins.cmake | 1 + lib/src/core/core.dart | 2 +- lib/src/generated/rive_core_beans.dart | 2 +- lib/src/rive_core/animation/keyed_property.dart | 2 +- lib/src/rive_core/artboard.dart | 2 +- lib/src/rive_core/component.dart | 2 +- lib/src/rive_core/dependency_helper.dart | 4 +--- lib/src/rive_core/shapes/shape_paint_container.dart | 2 +- lib/src/rive_core/state_machine_controller.dart | 4 ++-- lib/src/rive_file.dart | 2 +- lib/src/runtime_artboard.dart | 2 +- 13 files changed, 17 insertions(+), 13 deletions(-) diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index d77bfca2..2735b12c 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,6 +6,7 @@ import FlutterMacOS import Foundation import audio_session +import connectivity_plus import device_info_plus import flutter_udid import in_app_purchase_storekit @@ -20,6 +21,7 @@ import wakelock_plus func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FlutterUdidPlugin.register(with: registry.registrar(forPlugin: "FlutterUdidPlugin")) InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin")) diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc index bd19e8f5..19277733 100644 --- a/example/windows/flutter/generated_plugin_registrant.cc +++ b/example/windows/flutter/generated_plugin_registrant.cc @@ -6,11 +6,14 @@ #include "generated_plugin_registrant.h" +#include #include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); FlutterUdidPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterUdidPluginCApi")); RivePluginRegisterWithRegistrar( diff --git a/example/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake index 974401b2..305dfbd6 100644 --- a/example/windows/flutter/generated_plugins.cmake +++ b/example/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + connectivity_plus flutter_udid rive_common url_launcher_windows diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index ba8eb9b5..0da79316 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -1,6 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:rive/src/rive_core/runtime/exceptions/rive_format_error_exception.dart'; -import 'package:stokanal/collections.dart'; +import 'package:stokanal/core.dart'; export 'package:flutter/foundation.dart'; export 'package:rive/src/animation_list.dart'; diff --git a/lib/src/generated/rive_core_beans.dart b/lib/src/generated/rive_core_beans.dart index 376822de..508501fc 100644 --- a/lib/src/generated/rive_core_beans.dart +++ b/lib/src/generated/rive_core_beans.dart @@ -21,7 +21,7 @@ import 'package:rive/src/rive_core/shapes/paint/solid_color.dart'; import 'package:rive/src/rive_core/shapes/paint/stroke.dart'; import 'package:rive/src/rive_core/shapes/straight_vertex.dart'; import 'package:rive/src/rive_core/solo.dart'; -import 'package:stokanal/logging.dart'; +import 'package:stokanal/core.dart'; import '../core/field_types/core_field_type.dart'; diff --git a/lib/src/rive_core/animation/keyed_property.dart b/lib/src/rive_core/animation/keyed_property.dart index c26298ae..bf7b43e9 100644 --- a/lib/src/rive_core/animation/keyed_property.dart +++ b/lib/src/rive_core/animation/keyed_property.dart @@ -3,7 +3,7 @@ import 'package:rive/src/generated/animation/keyed_property_base.dart'; import 'package:rive/src/rive_core/animation/interpolating_keyframe.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/keyframe.dart'; -import 'package:stokanal/rive/rive_settings.dart' as rive_settings; +import 'package:stokanal/core.dart' as rive_settings; import '../../../rive.dart'; import '../../generated/animation/nested_trigger_base.dart'; diff --git a/lib/src/rive_core/artboard.dart b/lib/src/rive_core/artboard.dart index 2932f63b..53e378c9 100644 --- a/lib/src/rive_core/artboard.dart +++ b/lib/src/rive_core/artboard.dart @@ -29,7 +29,7 @@ import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; import 'package:rive_common/layout_engine.dart'; import 'package:rive_common/math.dart'; import 'package:rive_common/utilities.dart'; -import 'package:stokanal/collections.dart'; +import 'package:stokanal/core.dart' hide Event; export 'package:rive/src/generated/artboard_base.dart'; diff --git a/lib/src/rive_core/component.dart b/lib/src/rive_core/component.dart index 8005695e..32f2743f 100644 --- a/lib/src/rive_core/component.dart +++ b/lib/src/rive_core/component.dart @@ -4,7 +4,7 @@ import 'package:rive/src/rive_core/component_dirt.dart'; import 'package:rive/src/rive_core/container_component.dart'; import 'package:rive/src/rive_core/dependency_helper.dart'; import 'package:rive_common/utilities.dart'; -import 'package:stokanal/collections.dart'; +import 'package:stokanal/core.dart'; export 'package:rive/src/generated/component_base.dart'; diff --git a/lib/src/rive_core/dependency_helper.dart b/lib/src/rive_core/dependency_helper.dart index a85d1848..f7b4c586 100644 --- a/lib/src/rive_core/dependency_helper.dart +++ b/lib/src/rive_core/dependency_helper.dart @@ -1,6 +1,4 @@ - - -import 'package:stokanal/collections.dart'; +import 'package:stokanal/core.dart'; class DependencyHelper { diff --git a/lib/src/rive_core/shapes/shape_paint_container.dart b/lib/src/rive_core/shapes/shape_paint_container.dart index ba53350a..fa80cb42 100644 --- a/lib/src/rive_core/shapes/shape_paint_container.dart +++ b/lib/src/rive_core/shapes/shape_paint_container.dart @@ -5,7 +5,7 @@ import 'package:rive/src/rive_core/shapes/paint/fill.dart'; import 'package:rive/src/rive_core/shapes/paint/shape_paint_mutator.dart'; import 'package:rive/src/rive_core/shapes/paint/stroke.dart'; import 'package:rive_common/math.dart'; -import 'package:stokanal/collections.dart'; +import 'package:stokanal/core.dart'; /// An abstraction to give a common interface to any component that can contain /// fills and strokes. diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart index e90fad72..7c5f4dd0 100644 --- a/lib/src/rive_core/state_machine_controller.dart +++ b/lib/src/rive_core/state_machine_controller.dart @@ -39,7 +39,7 @@ import 'package:rive/src/rive_core/shapes/shape.dart'; import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; import 'package:rive/src/runtime_event.dart'; import 'package:rive_common/math.dart'; -import 'package:stokanal/telemetry.dart'; +import 'package:stokanal/core.dart' hide Event, Node; import '../generated/rive_core_beans.dart'; @@ -390,7 +390,7 @@ class StateMachineController extends RiveAnimationController final _inputValues = HashMap(); final layerControllers = []; final _reportedEvents = []; - // Keep a seperate list of nested events because we also need to store + // Keep a separate list of nested events because we also need to store // the source of the nested event in order to compare to listener target final Map> _reportedNestedEvents = HashMap>();//{}; diff --git a/lib/src/rive_file.dart b/lib/src/rive_file.dart index ba62010c..eb501a09 100644 --- a/lib/src/rive_file.dart +++ b/lib/src/rive_file.dart @@ -43,7 +43,7 @@ import 'package:rive/src/rive_core/viewmodel/viewmodel_instance.dart'; import 'package:rive/src/runtime_nested_artboard.dart'; import 'package:rive_common/rive_text.dart'; import 'package:rive_common/utilities.dart'; -import 'package:stokanal/rive/rive_settings.dart'; +import 'package:stokanal/core.dart' hide log; typedef Core? ObjectGenerator(int coreTypeKey); diff --git a/lib/src/runtime_artboard.dart b/lib/src/runtime_artboard.dart index ad208875..dfcf67fd 100644 --- a/lib/src/runtime_artboard.dart +++ b/lib/src/runtime_artboard.dart @@ -6,7 +6,7 @@ import 'package:rive/rive.dart'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/component.dart'; import 'package:rive/src/rive_core/notifier.dart'; -// import 'package:stokanal/logging.dart'; +// import 'package:stokanal/core.dart'; /// Adds getters for linear animations and state machines extension RuntimeArtboardGetters on RuntimeArtboard {