From 44ebf31f3bb8243599e240ccd1b637dc35feb0fa Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Sun, 25 May 2025 04:20:59 -0700 Subject: [PATCH] remove use of shared_ptr from AnimatedNode (#51588) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/51588 changelog: [internal] AnimatedNode never outlive NativeAnimatedNodesManager. We can safely use raw pointer here instead of shared_ptr. This improves a C++ binary size a little bit. Reviewed By: rshest Differential Revision: D75148487 fbshipit-source-id: 4c2f6dc6e4de670be37dd3b65dc3a8d63d546150 --- .../animated/NativeAnimatedNodesManager.cpp | 42 +++---- .../animated/nodes/AdditionAnimatedNode.cpp | 12 +- .../animated/nodes/AdditionAnimatedNode.h | 2 +- .../renderer/animated/nodes/AnimatedNode.cpp | 10 +- .../renderer/animated/nodes/AnimatedNode.h | 5 +- .../animated/nodes/ColorAnimatedNode.cpp | 32 ++--- .../animated/nodes/ColorAnimatedNode.h | 2 +- .../animated/nodes/DiffClampAnimatedNode.cpp | 16 ++- .../animated/nodes/DiffClampAnimatedNode.h | 2 +- .../animated/nodes/DivisionAnimatedNode.cpp | 24 ++-- .../animated/nodes/DivisionAnimatedNode.h | 2 +- .../nodes/InterpolationAnimatedNode.cpp | 16 ++- .../nodes/InterpolationAnimatedNode.h | 2 +- .../animated/nodes/ModulusAnimatedNode.cpp | 10 +- .../animated/nodes/ModulusAnimatedNode.h | 2 +- .../nodes/MultiplicationAnimatedNode.cpp | 23 ++-- .../nodes/MultiplicationAnimatedNode.h | 2 +- .../animated/nodes/PropsAnimatedNode.cpp | 112 +++++++++--------- .../animated/nodes/PropsAnimatedNode.h | 2 +- .../animated/nodes/RoundAnimatedNode.cpp | 12 +- .../animated/nodes/RoundAnimatedNode.h | 2 +- .../animated/nodes/StyleAnimatedNode.cpp | 95 +++++++-------- .../animated/nodes/StyleAnimatedNode.h | 2 +- .../nodes/SubtractionAnimatedNode.cpp | 24 ++-- .../animated/nodes/SubtractionAnimatedNode.h | 2 +- .../animated/nodes/TrackingAnimatedNode.cpp | 24 ++-- .../animated/nodes/TrackingAnimatedNode.h | 2 +- .../animated/nodes/TransformAnimatedNode.cpp | 36 +++--- .../animated/nodes/TransformAnimatedNode.h | 2 +- .../animated/nodes/ValueAnimatedNode.cpp | 4 +- .../animated/nodes/ValueAnimatedNode.h | 4 +- 31 files changed, 237 insertions(+), 290 deletions(-) diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/NativeAnimatedNodesManager.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/NativeAnimatedNodesManager.cpp index 9eebc9f62e8..ea00876744c 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/NativeAnimatedNodesManager.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/NativeAnimatedNodesManager.cpp @@ -95,47 +95,33 @@ std::unique_ptr NativeAnimatedNodesManager::animatedNode( switch (type.value()) { case AnimatedNodeType::Style: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Value: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Color: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Props: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Tracking: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Interpolation: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Transform: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Subtraction: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Addition: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Multiplication: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Division: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Modulus: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Diffclamp: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); case AnimatedNodeType::Round: - return std::make_unique( - tag, config, shared_from_this()); + return std::make_unique(tag, config, *this); default: LOG(WARNING) << "Cannot create AnimatedNode of type " << typeName << ", it's not implemented yet"; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AdditionAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AdditionAnimatedNode.cpp index 0facd3d21af..384b62fd3a0 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AdditionAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AdditionAnimatedNode.cpp @@ -18,13 +18,11 @@ namespace facebook::react { void AdditionAnimatedNode::update() { auto rawValue = 0.0; - if (const auto manager = manager_.lock()) { - for (const auto tag : inputNodes_) { - const auto node = manager->getAnimatedNode(tag); - react_native_assert( - node && "Invalid node tag set as input for AdditionAnimatedNode"); - rawValue += node->value(); - } + for (const auto tag : inputNodes_) { + const auto node = manager_->getAnimatedNode(tag); + react_native_assert( + node && "Invalid node tag set as input for AdditionAnimatedNode"); + rawValue += node->value(); } setRawValue(rawValue); } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AdditionAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AdditionAnimatedNode.h index 53652ef277f..101941e4a32 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AdditionAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AdditionAnimatedNode.h @@ -20,7 +20,7 @@ class AdditionAnimatedNode final : public OperatorAnimatedNode { AdditionAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : OperatorAnimatedNode(tag, config, manager) {} void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AnimatedNode.cpp index 77cf4b46447..ffc67b7d5c2 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AnimatedNode.cpp @@ -19,9 +19,9 @@ namespace facebook::react { AnimatedNode::AnimatedNode( Tag tag, folly::dynamic config, - const std::shared_ptr& manager, + NativeAnimatedNodesManager& manager, AnimatedNodeType type) - : tag_(tag), manager_(manager), type_(type), config_(std::move(config)) {} + : tag_(tag), manager_(&manager), type_(type), config_(std::move(config)) {} void AnimatedNode::addChild(const Tag animatedNodeTag) { children_.insert(animatedNodeTag); @@ -36,10 +36,8 @@ void AnimatedNode::removeChild(const Tag tag) { } AnimatedNode* AnimatedNode::getChildNode(Tag tag) { - if (const auto manager = manager_.lock()) { - if (children_.find(tag) != children_.end()) { - return manager->getAnimatedNode(tag); - } + if (children_.find(tag) != children_.end()) { + return manager_->getAnimatedNode(tag); } return nullptr; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AnimatedNode.h index 1ea45dd134a..00cdc24ad66 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/AnimatedNode.h @@ -14,7 +14,6 @@ #include #include #include -#include namespace facebook::react { @@ -44,7 +43,7 @@ class AnimatedNode { folly::dynamic config, // TODO: T190028913 maybe pass in strongly typed data when constructing // AnimatedNode - const std::shared_ptr& manager, + NativeAnimatedNodesManager& manager, AnimatedNodeType type); // Detach Node @@ -99,7 +98,7 @@ class AnimatedNode { protected: AnimatedNode* getChildNode(Tag tag); Tag tag_{0}; - std::weak_ptr manager_; + NativeAnimatedNodesManager* manager_; AnimatedNodeType type_; std::unordered_set children_{}; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ColorAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ColorAnimatedNode.cpp index 6c8c2830e17..7b303e17b4a 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ColorAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ColorAnimatedNode.cpp @@ -18,10 +18,10 @@ namespace facebook::react { namespace { uint8_t getColorValue( - std::shared_ptr manager, + const NativeAnimatedNodesManager& manager, Tag nodeTag, bool isDecimal = false) { - if (const auto node = manager->getAnimatedNode(nodeTag)) { + if (const auto node = manager.getAnimatedNode(nodeTag)) { if (isDecimal) { return std::clamp(static_cast(node->value() * 255), 0u, 255u); } else { @@ -31,9 +31,7 @@ uint8_t getColorValue( return 0; } -uint8_t getAlphaValue( - std::shared_ptr manager, - Tag nodeTag) { +uint8_t getAlphaValue(const NativeAnimatedNodesManager& manager, Tag nodeTag) { return getColorValue(manager, nodeTag, true); } @@ -42,7 +40,7 @@ uint8_t getAlphaValue( ColorAnimatedNode::ColorAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : AnimatedNode(tag, config, manager, AnimatedNodeType::Color), rNodeTag_(static_cast(getConfig()["r"].asInt())), gNodeTag_(static_cast(getConfig()["g"].asInt())), @@ -50,23 +48,19 @@ ColorAnimatedNode::ColorAnimatedNode( aNodeTag_(static_cast(getConfig()["a"].asInt())) {} void ColorAnimatedNode::update() { - if (const auto manager = manager_.lock()) { - color_ = *colorFromRGBA( - getColorValue(manager, rNodeTag_), - getColorValue(manager, gNodeTag_), - getColorValue(manager, bNodeTag_), - getAlphaValue(manager, aNodeTag_)); - } + color_ = *colorFromRGBA( + getColorValue(*manager_, rNodeTag_), + getColorValue(*manager_, gNodeTag_), + getColorValue(*manager_, bNodeTag_), + getAlphaValue(*manager_, aNodeTag_)); } Color ColorAnimatedNode::getColor() { - if (const auto manager = manager_.lock()) { - if (manager->updatedNodeTags_.contains(tag_)) { - update(); - manager->updatedNodeTags_.erase(tag_); - } - return color_; + if (manager_->updatedNodeTags_.contains(tag_)) { + update(); + manager_->updatedNodeTags_.erase(tag_); } + return color_; return 0; } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ColorAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ColorAnimatedNode.h index 64f3820bf5d..4a9e8c59652 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ColorAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ColorAnimatedNode.h @@ -21,7 +21,7 @@ class ColorAnimatedNode final : public AnimatedNode { ColorAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DiffClampAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DiffClampAnimatedNode.cpp index 45f7a141c59..b8004d38446 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DiffClampAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DiffClampAnimatedNode.cpp @@ -18,21 +18,19 @@ namespace facebook::react { DiffClampAnimatedNode::DiffClampAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : ValueAnimatedNode(tag, config, manager), inputNodeTag_(static_cast(getConfig()["input"].asDouble())), min_(getConfig()["min"].asDouble()), max_(getConfig()["max"].asDouble()) {} void DiffClampAnimatedNode::update() { - if (const auto manager = manager_.lock()) { - if (const auto node = - manager->getAnimatedNode(inputNodeTag_)) { - const auto value = node->value(); - const auto diff = value - lastValue_; - lastValue_ = value; - setRawValue(std::clamp(this->value() + diff, min_, max_)); - } + if (const auto node = + manager_->getAnimatedNode(inputNodeTag_)) { + const auto value = node->value(); + const auto diff = value - lastValue_; + lastValue_ = value; + setRawValue(std::clamp(this->value() + diff, min_, max_)); } } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DiffClampAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DiffClampAnimatedNode.h index 95d15106a11..ecf15ba25e0 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DiffClampAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DiffClampAnimatedNode.h @@ -20,7 +20,7 @@ class DiffClampAnimatedNode final : public ValueAnimatedNode { DiffClampAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DivisionAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DivisionAnimatedNode.cpp index b9f75e14c1c..e893230ca6f 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DivisionAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DivisionAnimatedNode.cpp @@ -18,20 +18,18 @@ namespace facebook::react { void DivisionAnimatedNode::update() { auto rawValue = 0.0; - if (const auto manager = manager_.lock()) { - int count = 0; - for (const auto tag : inputNodes_) { - const auto node = manager->getAnimatedNode(tag); - react_native_assert( - node && "Invalid node tag set as input for DivisionAnimatedNode"); - if (count == 0) { - rawValue = node->value(); - } else { - rawValue /= node->value(); - } - - count++; + int count = 0; + for (const auto tag : inputNodes_) { + const auto node = manager_->getAnimatedNode(tag); + react_native_assert( + node && "Invalid node tag set as input for DivisionAnimatedNode"); + if (count == 0) { + rawValue = node->value(); + } else { + rawValue /= node->value(); } + + count++; } setRawValue(rawValue); } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DivisionAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DivisionAnimatedNode.h index 851560b978f..63bf599bebb 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DivisionAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/DivisionAnimatedNode.h @@ -20,7 +20,7 @@ class DivisionAnimatedNode final : public OperatorAnimatedNode { DivisionAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : OperatorAnimatedNode(tag, config, manager) {} void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/InterpolationAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/InterpolationAnimatedNode.cpp index 2caf8673e46..a6e5d4fe037 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/InterpolationAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/InterpolationAnimatedNode.cpp @@ -21,7 +21,7 @@ namespace facebook::react { InterpolationAnimatedNode::InterpolationAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : ValueAnimatedNode(tag, config, manager) { // inputRange example: [0, 1, 10], [1, 1.4, 1.5] const auto& nodeConfig = getConfig(); @@ -51,14 +51,12 @@ void InterpolationAnimatedNode::update() { return; } - if (const auto manager = manager_.lock()) { - if (const auto node = - manager->getAnimatedNode(parentTag_)) { - if (isColorValue_) { - setRawValue(interpolateColor(node->value())); - } else { - setRawValue(interpolateValue(node->value())); - } + if (const auto node = + manager_->getAnimatedNode(parentTag_)) { + if (isColorValue_) { + setRawValue(interpolateColor(node->value())); + } else { + setRawValue(interpolateValue(node->value())); } } } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/InterpolationAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/InterpolationAnimatedNode.h index 4c45179d9b8..206ce38d944 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/InterpolationAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/InterpolationAnimatedNode.h @@ -23,7 +23,7 @@ class InterpolationAnimatedNode final : public ValueAnimatedNode { InterpolationAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void update() override; void onDetachedFromNode(Tag animatedNodeTag) override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ModulusAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ModulusAnimatedNode.cpp index a26422a9b0a..e650a5917a0 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ModulusAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ModulusAnimatedNode.cpp @@ -18,17 +18,15 @@ namespace facebook::react { ModulusAnimatedNode::ModulusAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : ValueAnimatedNode(tag, config, manager), inputNodeTag_(static_cast(getConfig()["input"].asInt())), modulus_(getConfig()["modulus"].asDouble()) {} void ModulusAnimatedNode::update() { - if (const auto manager = manager_.lock()) { - if (const auto node = - manager->getAnimatedNode(inputNodeTag_)) { - setRawValue(std::fmod(node->value(), modulus_)); - } + if (const auto node = + manager_->getAnimatedNode(inputNodeTag_)) { + setRawValue(std::fmod(node->value(), modulus_)); } } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ModulusAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ModulusAnimatedNode.h index 221ec60d606..78326347fe8 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ModulusAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ModulusAnimatedNode.h @@ -20,7 +20,7 @@ class ModulusAnimatedNode final : public ValueAnimatedNode { ModulusAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/MultiplicationAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/MultiplicationAnimatedNode.cpp index 4cf90835eee..5bf7fbe973a 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/MultiplicationAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/MultiplicationAnimatedNode.cpp @@ -18,20 +18,17 @@ namespace facebook::react { void MultiplicationAnimatedNode::update() { auto rawValue = 0.0; - if (const auto manager = manager_.lock()) { - int count = 0; - for (const auto tag : inputNodes_) { - const auto node = manager->getAnimatedNode(tag); - react_native_assert( - node && - "Invalid node tag set as input for MultiplicationAnimatedNode"); - if (count == 0) { - rawValue = node->value(); - } else { - rawValue *= node->value(); - } - count++; + int count = 0; + for (const auto tag : inputNodes_) { + const auto node = manager_->getAnimatedNode(tag); + react_native_assert( + node && "Invalid node tag set as input for MultiplicationAnimatedNode"); + if (count == 0) { + rawValue = node->value(); + } else { + rawValue *= node->value(); } + count++; } setRawValue(rawValue); } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/MultiplicationAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/MultiplicationAnimatedNode.h index a8da00cecdc..e21e40aa592 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/MultiplicationAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/MultiplicationAnimatedNode.h @@ -20,7 +20,7 @@ class MultiplicationAnimatedNode final : public OperatorAnimatedNode { MultiplicationAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : OperatorAnimatedNode(tag, config, manager) {} void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/PropsAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/PropsAnimatedNode.cpp index f9e16a841ee..6e16075e573 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/PropsAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/PropsAnimatedNode.cpp @@ -24,13 +24,13 @@ namespace { bool isLayoutStyleUpdated( const folly::dynamic& props, - const std::shared_ptr& manager) { + NativeAnimatedNodesManager& manager) { for (const auto& entry : props.items()) { auto nodeTag = static_cast(entry.second.asInt()); - if (const auto& node = manager->getAnimatedNode(nodeTag)) { + if (const auto& node = manager.getAnimatedNode(nodeTag)) { if (node->type() == AnimatedNodeType::Style) { if (const auto& styleNode = - manager->getAnimatedNode(nodeTag)) { + manager.getAnimatedNode(nodeTag)) { auto& styleNodeProps = styleNode->getProps(); for (const auto& styleNodeProp : styleNodeProps.items()) { if (getDirectManipulationAllowlist().count( @@ -51,7 +51,7 @@ bool isLayoutStyleUpdated( PropsAnimatedNode::PropsAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : AnimatedNode(tag, config, manager, AnimatedNodeType::Props), props_(folly::dynamic::object()), layoutStyleUpdated_(isLayoutStyleUpdated(getConfig()["props"], manager)) { @@ -76,10 +76,8 @@ void PropsAnimatedNode::disconnectFromView(Tag viewTag) { void PropsAnimatedNode::restoreDefaultValues() { // If node is already disconnected from View, we cannot restore default values if (connectedViewTag_ != animated::undefinedAnimatedNodeIdentifier) { - if (const auto manager = manager_.lock()) { - manager->schedulePropsCommit( - connectedViewTag_, folly::dynamic::object(), false, false); - } + manager_->schedulePropsCommit( + connectedViewTag_, folly::dynamic::object(), false, false); } } @@ -95,63 +93,59 @@ void PropsAnimatedNode::update(bool forceFabricCommit) { // TODO: T190192206 consolidate shared update logic between // Props/StyleAnimatedNode std::lock_guard lock(propsMutex_); - if (const auto manager = manager_.lock()) { - const auto& configProps = getConfig()["props"]; - for (const auto& entry : configProps.items()) { - auto propName = entry.first.asString(); - auto nodeTag = static_cast(entry.second.asInt()); - if (auto node = manager->getAnimatedNode(nodeTag)) { - switch (node->type()) { - case AnimatedNodeType::Value: - case AnimatedNodeType::Interpolation: - case AnimatedNodeType::Modulus: - case AnimatedNodeType::Round: - case AnimatedNodeType::Diffclamp: - // Operators - case AnimatedNodeType::Addition: - case AnimatedNodeType::Subtraction: - case AnimatedNodeType::Multiplication: - case AnimatedNodeType::Division: { - if (const auto& valueNode = - manager->getAnimatedNode(nodeTag)) { - if (valueNode->isColorValue()) { - props_.insert( - propName.c_str(), static_cast(valueNode->value())); - } else { - props_.insert(propName.c_str(), valueNode->value()); - } - } - } break; - case AnimatedNodeType::Color: { - if (const auto& colorNode = - manager->getAnimatedNode(nodeTag)) { + const auto& configProps = getConfig()["props"]; + for (const auto& entry : configProps.items()) { + auto propName = entry.first.asString(); + auto nodeTag = static_cast(entry.second.asInt()); + if (auto node = manager_->getAnimatedNode(nodeTag)) { + switch (node->type()) { + case AnimatedNodeType::Value: + case AnimatedNodeType::Interpolation: + case AnimatedNodeType::Modulus: + case AnimatedNodeType::Round: + case AnimatedNodeType::Diffclamp: + // Operators + case AnimatedNodeType::Addition: + case AnimatedNodeType::Subtraction: + case AnimatedNodeType::Multiplication: + case AnimatedNodeType::Division: { + if (const auto& valueNode = + manager_->getAnimatedNode(nodeTag)) { + if (valueNode->isColorValue()) { props_.insert( - propName.c_str(), - static_cast(colorNode->getColor())); + propName.c_str(), static_cast(valueNode->value())); + } else { + props_.insert(propName.c_str(), valueNode->value()); } - } break; - case AnimatedNodeType::Style: { - if (const auto& styleNode = - manager->getAnimatedNode(nodeTag)) { - styleNode->update(); - auto& styleNodeProps = styleNode->getProps(); - for (const auto& styleNodeProp : styleNodeProps.items()) { - props_.insert( - styleNodeProp.first.c_str(), styleNodeProp.second); - } + } + } break; + case AnimatedNodeType::Color: { + if (const auto& colorNode = + manager_->getAnimatedNode(nodeTag)) { + props_.insert( + propName.c_str(), static_cast(colorNode->getColor())); + } + } break; + case AnimatedNodeType::Style: { + if (const auto& styleNode = + manager_->getAnimatedNode(nodeTag)) { + styleNode->update(); + auto& styleNodeProps = styleNode->getProps(); + for (const auto& styleNodeProp : styleNodeProps.items()) { + props_.insert(styleNodeProp.first.c_str(), styleNodeProp.second); } - } break; - case AnimatedNodeType::Props: - case AnimatedNodeType::Tracking: - case AnimatedNodeType::Transform: - break; - } + } + } break; + case AnimatedNodeType::Props: + case AnimatedNodeType::Tracking: + case AnimatedNodeType::Transform: + break; } } - - manager->schedulePropsCommit( - connectedViewTag_, props_, layoutStyleUpdated_, forceFabricCommit); } + + manager_->schedulePropsCommit( + connectedViewTag_, props_, layoutStyleUpdated_, forceFabricCommit); } } // namespace facebook::react diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/PropsAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/PropsAnimatedNode.h index e7a494af4f4..c1fde9deeee 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/PropsAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/PropsAnimatedNode.h @@ -22,7 +22,7 @@ class PropsAnimatedNode final : public AnimatedNode { PropsAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void connectToView(Tag viewTag); void disconnectFromView(Tag viewTag); void restoreDefaultValues(); diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/RoundAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/RoundAnimatedNode.cpp index 6bb00b55691..6f06480e3fb 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/RoundAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/RoundAnimatedNode.cpp @@ -19,7 +19,7 @@ namespace facebook::react { RoundAnimatedNode::RoundAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : ValueAnimatedNode(tag, config, manager), inputNodeTag_(static_cast(getConfig()["input"].asInt())), nearest_(getConfig()["input"].asDouble()) { @@ -29,12 +29,10 @@ RoundAnimatedNode::RoundAnimatedNode( } void RoundAnimatedNode::update() { - if (auto manager = manager_.lock()) { - auto node = manager->getAnimatedNode(inputNodeTag_); - react_native_assert( - node && "Illegal node ID set as an input for Animated.round node"); - setRawValue(round(node->value() / nearest_) * nearest_); - } + auto node = manager_->getAnimatedNode(inputNodeTag_); + react_native_assert( + node && "Illegal node ID set as an input for Animated.round node"); + setRawValue(round(node->value() / nearest_) * nearest_); } } // namespace facebook::react diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/RoundAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/RoundAnimatedNode.h index 7d19b196846..6ef2d991237 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/RoundAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/RoundAnimatedNode.h @@ -26,7 +26,7 @@ class RoundAnimatedNode : public ValueAnimatedNode { RoundAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/StyleAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/StyleAnimatedNode.cpp index ca7d3fd203d..624dc3ee99e 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/StyleAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/StyleAnimatedNode.cpp @@ -20,62 +20,59 @@ namespace facebook::react { StyleAnimatedNode::StyleAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : AnimatedNode(tag, config, manager, AnimatedNodeType::Style), props_(folly::dynamic::object()) {} void StyleAnimatedNode::update() { - if (const auto manager = manager_.lock()) { - const auto& style = getConfig()["style"]; - for (const auto& styleProp : style.items()) { - auto propName = styleProp.first.asString(); - const auto nodeTag = static_cast(styleProp.second.asInt()); - if (auto node = manager->getAnimatedNode(nodeTag)) { - switch (node->type()) { - case AnimatedNodeType::Transform: { - if (const auto transformNode = - manager->getAnimatedNode(nodeTag)) { - transformNode->update(); - auto& transformNodeProps = transformNode->getProps(); - for (const auto& styleNodeProp : transformNodeProps.items()) { - props_.insert( - styleNodeProp.first.c_str(), styleNodeProp.second); - } + const auto& style = getConfig()["style"]; + for (const auto& styleProp : style.items()) { + auto propName = styleProp.first.asString(); + const auto nodeTag = static_cast(styleProp.second.asInt()); + if (auto node = manager_->getAnimatedNode(nodeTag)) { + switch (node->type()) { + case AnimatedNodeType::Transform: { + if (const auto transformNode = + manager_->getAnimatedNode(nodeTag)) { + transformNode->update(); + auto& transformNodeProps = transformNode->getProps(); + for (const auto& styleNodeProp : transformNodeProps.items()) { + props_.insert(styleNodeProp.first.c_str(), styleNodeProp.second); } - } break; - case AnimatedNodeType::Value: - case AnimatedNodeType::Interpolation: - case AnimatedNodeType::Modulus: - case AnimatedNodeType::Round: - case AnimatedNodeType::Diffclamp: - // Operators - case AnimatedNodeType::Addition: - case AnimatedNodeType::Subtraction: - case AnimatedNodeType::Multiplication: - case AnimatedNodeType::Division: { - if (const auto valueNode = - manager->getAnimatedNode(nodeTag)) { - if (valueNode->isColorValue()) { - props_.insert( - propName.c_str(), static_cast(valueNode->value())); - } else { - props_.insert(propName.c_str(), valueNode->value()); - } - } - } break; - case AnimatedNodeType::Color: { - if (const auto colorAnimNode = - manager->getAnimatedNode(nodeTag)) { + } + } break; + case AnimatedNodeType::Value: + case AnimatedNodeType::Interpolation: + case AnimatedNodeType::Modulus: + case AnimatedNodeType::Round: + case AnimatedNodeType::Diffclamp: + // Operators + case AnimatedNodeType::Addition: + case AnimatedNodeType::Subtraction: + case AnimatedNodeType::Multiplication: + case AnimatedNodeType::Division: { + if (const auto valueNode = + manager_->getAnimatedNode(nodeTag)) { + if (valueNode->isColorValue()) { props_.insert( - propName.c_str(), - static_cast(colorAnimNode->getColor())); + propName.c_str(), static_cast(valueNode->value())); + } else { + props_.insert(propName.c_str(), valueNode->value()); } - } break; - case AnimatedNodeType::Tracking: - case AnimatedNodeType::Style: - case AnimatedNodeType::Props: - break; - } + } + } break; + case AnimatedNodeType::Color: { + if (const auto colorAnimNode = + manager_->getAnimatedNode(nodeTag)) { + props_.insert( + propName.c_str(), + static_cast(colorAnimNode->getColor())); + } + } break; + case AnimatedNodeType::Tracking: + case AnimatedNodeType::Style: + case AnimatedNodeType::Props: + break; } } } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/StyleAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/StyleAnimatedNode.h index 90fcf32920a..90cb9dace4f 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/StyleAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/StyleAnimatedNode.h @@ -21,7 +21,7 @@ class StyleAnimatedNode final : public AnimatedNode { StyleAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void update() override; const folly::dynamic& getProps() const { diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/SubtractionAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/SubtractionAnimatedNode.cpp index 6b3e4aa1d76..4bf6f49a599 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/SubtractionAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/SubtractionAnimatedNode.cpp @@ -18,20 +18,18 @@ namespace facebook::react { void SubtractionAnimatedNode::update() { auto rawValue = 0.0; - if (const auto manager = manager_.lock()) { - int count = 0; - for (const auto& tag : inputNodes_) { - const auto node = manager->getAnimatedNode(tag); - react_native_assert( - node && "Invalid node tag set as input for SubtractionAnimatedNode"); - if (count == 0) { - rawValue = node->value(); - } else { - rawValue -= node->value(); - } - - count++; + int count = 0; + for (const auto& tag : inputNodes_) { + const auto node = manager_->getAnimatedNode(tag); + react_native_assert( + node && "Invalid node tag set as input for SubtractionAnimatedNode"); + if (count == 0) { + rawValue = node->value(); + } else { + rawValue -= node->value(); } + + count++; } setRawValue(rawValue); } diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/SubtractionAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/SubtractionAnimatedNode.h index 71c02a51666..6a6159035ad 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/SubtractionAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/SubtractionAnimatedNode.h @@ -21,7 +21,7 @@ class SubtractionAnimatedNode final : public OperatorAnimatedNode { SubtractionAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : OperatorAnimatedNode(tag, config, manager) {} void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TrackingAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TrackingAnimatedNode.cpp index ac31c98aa06..a6725ef68ca 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TrackingAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TrackingAnimatedNode.cpp @@ -19,26 +19,24 @@ namespace facebook::react { TrackingAnimatedNode::TrackingAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : AnimatedNode(tag, config, manager, AnimatedNodeType::Tracking), animationId_(static_cast(getConfig()["animationId"].asInt())), toValueNodeId_(static_cast(getConfig()["toValue"].asInt())), valueNodeId_(static_cast(getConfig()["value"].asInt())) {} void TrackingAnimatedNode::update() { - if (const auto manager = manager_.lock()) { - if (const auto toValueNode = - manager->getAnimatedNode(toValueNodeId_)) { - // In case the animation is already running, we need to stop it to free up - // the animationId key in the active animations map in the animation - // manager. - manager->stopAnimation(animationId_, true); - auto animationConfig = getConfig()["animationConfig"]; - animationConfig["toValue"] = toValueNode->value(); + if (const auto toValueNode = + manager_->getAnimatedNode(toValueNodeId_)) { + // In case the animation is already running, we need to stop it to free up + // the animationId key in the active animations map in the animation + // manager. + manager_->stopAnimation(animationId_, true); + auto animationConfig = getConfig()["animationConfig"]; + animationConfig["toValue"] = toValueNode->value(); - manager->startAnimatingNode( - animationId_, valueNodeId_, animationConfig, std::nullopt); - } + manager_->startAnimatingNode( + animationId_, valueNodeId_, animationConfig, std::nullopt); } }; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TrackingAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TrackingAnimatedNode.h index 1738841d391..e60a3bbed6c 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TrackingAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TrackingAnimatedNode.h @@ -20,7 +20,7 @@ class TrackingAnimatedNode final : public AnimatedNode { TrackingAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TransformAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TransformAnimatedNode.cpp index e0805f06952..d1e47939c00 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TransformAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TransformAnimatedNode.cpp @@ -29,33 +29,31 @@ static constexpr std::string_view sTransformPropName{"transform"}; TransformAnimatedNode::TransformAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : AnimatedNode(tag, config, manager, AnimatedNodeType::Transform), props_(folly::dynamic::object()) {} void TransformAnimatedNode::update() { folly::dynamic transforms = folly::dynamic::array(); - if (const auto manager = manager_.lock()) { - auto transformsArray = getConfig()[sTransformsName]; - react_native_assert(transformsArray.type() == folly::dynamic::ARRAY); - for (const auto& transform : transformsArray) { - std::optional value; - if (transform[sTypeName].asString() == sAnimatedName) { - const auto inputTag = static_cast(transform[sNodeTagName].asInt()); - if (const auto node = - manager->getAnimatedNode(inputTag)) { - value = node->value(); - } - } else { - value = transform[sValueName].asDouble(); - } - if (value) { - const auto property = transform[sPropertyName].asString(); - transforms.push_back(folly::dynamic::object(property, value.value())); + auto transformsArray = getConfig()[sTransformsName]; + react_native_assert(transformsArray.type() == folly::dynamic::ARRAY); + for (const auto& transform : transformsArray) { + std::optional value; + if (transform[sTypeName].asString() == sAnimatedName) { + const auto inputTag = static_cast(transform[sNodeTagName].asInt()); + if (const auto node = + manager_->getAnimatedNode(inputTag)) { + value = node->value(); } + } else { + value = transform[sValueName].asDouble(); + } + if (value) { + const auto property = transform[sPropertyName].asString(); + transforms.push_back(folly::dynamic::object(property, value.value())); } - props_[sTransformPropName] = std::move(transforms); } + props_[sTransformPropName] = std::move(transforms); } const folly::dynamic& TransformAnimatedNode::getProps() { diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TransformAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TransformAnimatedNode.h index 727fe283651..654203c119b 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TransformAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/TransformAnimatedNode.h @@ -27,7 +27,7 @@ class TransformAnimatedNode final : public AnimatedNode { TransformAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); void update() override; diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ValueAnimatedNode.cpp b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ValueAnimatedNode.cpp index 69a0081f06d..2cb463f6638 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ValueAnimatedNode.cpp +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ValueAnimatedNode.cpp @@ -18,7 +18,7 @@ namespace facebook::react { ValueAnimatedNode::ValueAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : AnimatedNode(tag, config, manager, AnimatedNodeType::Value) { auto value = 0.0; auto offset = 0.0; @@ -87,7 +87,7 @@ void ValueAnimatedNode::setValueListener(ValueListenerCallback&& callback) { OperatorAnimatedNode::OperatorAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager) + NativeAnimatedNodesManager& manager) : ValueAnimatedNode(tag, config, manager) { const auto& input = getConfig()["input"]; react_native_assert( diff --git a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ValueAnimatedNode.h b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ValueAnimatedNode.h index 6073229928a..9a03fa60f42 100644 --- a/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ValueAnimatedNode.h +++ b/packages/react-native/ReactCxxPlatform/react/renderer/animated/nodes/ValueAnimatedNode.h @@ -24,7 +24,7 @@ class ValueAnimatedNode : public AnimatedNode { ValueAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); double value(); double rawValue(); bool setRawValue(double value); @@ -54,7 +54,7 @@ class OperatorAnimatedNode : public ValueAnimatedNode { OperatorAnimatedNode( Tag tag, const folly::dynamic& config, - const std::shared_ptr& manager); + NativeAnimatedNodesManager& manager); protected: std::vector inputNodes_{};