1 #ifndef DALI_INTERNAL_SCENEGRAPH_PROPERTY_RESETTER_H
2 #define DALI_INTERNAL_SCENEGRAPH_PROPERTY_RESETTER_H
5 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 #include <cstdint> // int8_t
23 #include <dali/internal/update/animation/scene-graph-animator.h>
24 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
25 #include <dali/internal/update/animation/property-accessor.h>
26 #include <dali/internal/update/animation/property-component-accessor.h>
27 #include <dali/internal/update/common/property-owner.h>
37 * Class to reset the watched property to it's base value. Used by UpdateManager to
38 * reset animating and constrained properties. The derived classes AnimatorResetter and
39 * ConstraintResetter are designed to match the lifecycle of the SceneGraph::Animator
40 * and SceneGraph::Constraint respectively.
42 class PropertyResetterBase : public PropertyOwner::Observer
48 ~PropertyResetterBase() override
50 if( mPropertyOwner != nullptr )
52 mPropertyOwner->RemoveObserver(*this);
59 * Watches the property owner to track if it's disconnected or not.
63 mPropertyOwner->AddObserver(*this);
67 * Reset the property to it's base value if the property owner is still alive and on stage
68 * @param[in] updateBufferIndex the current buffer index
70 void ResetToBaseValue( BufferIndex updateBufferIndex )
72 if( mPropertyOwner != nullptr && mActive )
74 // If property-owner has disconnected, start aging.
75 // We need to reset the property for two frames after disconnection to ensure both
76 // property values are set appropriately.
82 mBaseProperty->ResetToBaseValue( updateBufferIndex );
87 * Called when mPropertyOwner is connected to the scene graph.
89 * Note, this resetter object may be created after the property owner has been connected
90 * to the stage, so we track disconnection and re-connection instead of connection
92 * @param[in] owner The property owner
94 void PropertyOwnerConnected( PropertyOwner& owner ) override
96 mDisconnected = false;
101 * Called when mPropertyOwner is disconnected from the scene graph.
102 * @param[in] bufferIndex the current buffer index
103 * @param[in] owner The property owner
105 void PropertyOwnerDisconnected( BufferIndex bufferIndex, PropertyOwner& owner ) override
107 mDisconnected = true;
111 * Called shortly before the propertyOwner is destroyed
112 * @param[in] owner The property owner
114 void PropertyOwnerDestroyed( PropertyOwner& owner ) override
116 mDisconnected = true;
117 mPropertyOwner = nullptr;
119 // Don't need to wait another frame as the property is being destroyed
125 * Determine if the resetter has finished.
127 * If an animation or constraint stops, then we need to reset the
128 * property in the next frame as well to ensure both property values
129 * are set appropriately.
131 * @return true if the resetter has finished.
133 virtual bool IsFinished()
135 bool finished = mRunning <= STOPPED;
136 if( mRunning == AGING )
155 * @param[in] propertyOwner The property owner storing the base property
156 * @param[in] baseProperty The base property
158 PropertyResetterBase( PropertyOwner* propertyOwner,
159 PropertyBase* baseProperty )
160 : mPropertyOwner( propertyOwner ),
161 mBaseProperty( baseProperty ),
164 mDisconnected( false )
168 PropertyOwner* mPropertyOwner; ///< The property owner
169 PropertyBase* mBaseProperty; ///< The base property being animated or constrained
170 int8_t mRunning; ///< Used to determine if we should finish or not, 2 if running, 1 if aging, 0 if stopped
171 int8_t mActive; ///< 2 if active, 1 if aging, 0 if stopped
172 bool mDisconnected; ///< True if the property owner has been disconnected
177 * Specialization of Resetter based on templated modifier type (either Constraint or Animator)
179 template< typename ModifierType>
180 class Resetter : public PropertyResetterBase, public ModifierType::LifecycleObserver
186 * @param[in] propertyOwner The owner of the property
187 * @param[in] baseProperty The property being animated
188 * @param[in] modifier The scene-graph animator/constraint of the property
189 * @return the new property resetter
191 static PropertyResetterBase* New( const PropertyOwner& propertyOwner,
192 const PropertyBase& baseProperty,
193 const ModifierType& modifier )
195 return new Resetter<ModifierType>( const_cast<PropertyOwner*>( &propertyOwner ),
196 const_cast<PropertyBase*>( &baseProperty ),
197 const_cast<ModifierType*>( &modifier ) );
201 * Virtual destructor.
205 // Disconnect from modifier object. Although this resetter should match the lifecycle of the modifier object,
206 // there are situations where it is deleted first (e.g. if the property owner is destroyed)
209 mModifier->RemoveLifecycleObserver(*this);
216 * @param[in] propertyOwner The owner of the property
217 * @param[in] baseProperty The property being animated
218 * @param[in] modifier The scene-graph animator/constraint of the property
220 Resetter( PropertyOwner* propertyOwner,
221 PropertyBase* baseProperty,
222 ModifierType* modifier )
223 : PropertyResetterBase( propertyOwner, baseProperty ),
224 mModifier( modifier )
226 // Track the lifecycle of the modifying object
227 mModifier->AddLifecycleObserver(*this);
231 * The Animator or Constraint is destroyed
233 void ObjectDestroyed() override
235 // When the modifier is destroyed, reduce the running value to ensure we stay alive for
236 // another frame to reset the other buffer.
241 ModifierType* mModifier;
244 using AnimatorResetter = Resetter<SceneGraph::AnimatorBase>;
245 using ConstraintResetter = Resetter<SceneGraph::ConstraintBase>;
247 } // namespace SceneGraph
249 } // namespace Internal
253 #endif //DALI_INTERNAL_SCENEGRAPH_PROPERTY_RESETTER_H