static const uint32_t CLEAN_FLAG = 0x00; ///< Indicates that the value did not change in this, or the previous frame
static const uint32_t BAKED_FLAG = 0x01; ///< Indicates that the value was Baked during the previous frame
static const uint32_t SET_FLAG = 0x02; ///< Indicates that the value was Set during the previous frame
+static const uint32_t RESET_FLAG = 0x02; ///< Indicates that the value should be reset to the base value in the next two frames
template<class T>
class AnimatableProperty;
mDirtyFlags = BAKED_FLAG;
}
+public:
+
+ /**
+ * Mark the property as dirty so that it will be reset to the base value in the next two frames.
+ */
+ void MarkAsDirty()
+ {
+ mDirtyFlags = RESET_FLAG;
+ }
+
public: // From PropertyBase
/**
* @copydoc Dali::Internal::SceneGraph::PropertyBase::IsClean()
// Start aging the node properties.
// We need to reset the node properties for two frames to ensure both
// property values are set appropriately.
- // if(mDisconnected)
- {
- --mActive;
- }
+ --mActive;
mNode->mVisible.ResetToBaseValue(updateBufferIndex);
- mNode->mCulled.ResetToBaseValue(updateBufferIndex);
mNode->mColor.ResetToBaseValue(updateBufferIndex);
- mNode->mUpdateSizeHint.ResetToBaseValue(updateBufferIndex);
}
};
{
mDisconnected = false;
mActive = ACTIVE;
+
+ mNode->mVisible.MarkAsDirty();
+ mNode->mColor.MarkAsDirty();
}
/**
mActive(ACTIVE),
mDisconnected(false)
{
+ mNode->mVisible.MarkAsDirty();
+ mNode->mColor.MarkAsDirty();
}
Node* mNode; ///< The node that owns the properties
if(mUpdateProxy)
{
mUpdateProxy->GetRootNode().RemoveObserver(*this);
+ mUpdateProxy->AddNodeResetters();
}
Invalidate();
rootLayer->CreateTransform(&mImpl->transformManager);
rootLayer->SetRoot(true);
- OwnerPointer<SceneGraph::NodeResetter> nodeResetter = SceneGraph::NodeResetter::New(*rootLayer);
- AddNodeResetter(nodeResetter);
+ AddNodeResetter(*rootLayer);
mImpl->scenes.emplace_back(new Impl::SceneInfo(rootLayer));
}
parent->ConnectChild(node);
- OwnerPointer<SceneGraph::NodeResetter> nodeResetter = SceneGraph::NodeResetter::New(*node);
- AddNodeResetter(nodeResetter);
+ AddNodeResetter(*node);
// Inform the frame-callback-processor, if set, about the node-hierarchy changing
if(mImpl->frameCallbackProcessor)
mImpl->propertyResetters.PushBack(propertyResetter.Release());
}
-void UpdateManager::AddNodeResetter(OwnerPointer<NodeResetter>& nodeResetter)
+void UpdateManager::AddNodeResetter(const Node& node)
{
+ OwnerPointer<SceneGraph::NodeResetter> nodeResetter = SceneGraph::NodeResetter::New(node);
nodeResetter->Initialize();
mImpl->nodeResetters.PushBack(nodeResetter.Release());
}
* It will be killed by UpdateManager when the node is disconnected from the scene graph;
* or when the node is destroyed.
*/
- void AddNodeResetter(OwnerPointer<NodeResetter>& nodeResetter);
+ void AddNodeResetter(const Node& node);
// Property Notification
UpdateProxy::UpdateProxy(SceneGraph::UpdateManager& updateManager, SceneGraph::TransformManager& transformManager, SceneGraph::Node& rootNode)
: mNodeContainer(),
mLastCachedIdNodePair({0u, nullptr}),
+ mDirtyNodes(),
mCurrentBufferIndex(0u),
mUpdateManager(updateManager),
mTransformManager(transformManager),
{
node->mColor.Set(mCurrentBufferIndex, color);
node->SetDirtyFlag(SceneGraph::NodePropertyFlags::COLOR);
+ mDirtyNodes.push_back(id);
AddResetter(*node, node->mColor);
success = true;
}
mPropertyModifier->AddResetter(node, propertyBase);
}
+void UpdateProxy::AddNodeResetters()
+{
+ for(auto&& id : mDirtyNodes)
+ {
+ SceneGraph::Node* node = FindNodeInSceneGraph(id, mRootNode);
+ if(node)
+ {
+ mUpdateManager.AddNodeResetter(*node);
+ }
+ }
+}
+
} // namespace Internal
} // namespace Dali
*/
void NodeHierarchyChanged();
+ /**
+ * @brief Adds node resetter for each dirty node whose animatable properties have been changed.
+ */
+ void AddNodeResetters();
+
private:
/**
* @brief Retrieves the node with the specified ID.
mutable std::vector<IdNodePair> mNodeContainer; ///< Used to store cached pointers to already searched for Nodes.
mutable IdNodePair mLastCachedIdNodePair; ///< Used to cache the last retrieved id-node pair.
+ mutable std::vector<uint32_t> mDirtyNodes; ///< Used to store the ID of the dirty nodes with non-transform property modifications.
BufferIndex mCurrentBufferIndex;
SceneGraph::UpdateManager& mUpdateManager; ///< Reference to the Update Manager.