1 #ifndef DALI_INTERNAL_SCENE_GRAPH_PROPERTY_OWNER_MESSAGES_H
2 #define DALI_INTERNAL_SCENE_GRAPH_PROPERTY_OWNER_MESSAGES_H
5 * Copyright (c) 2019 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.
25 #include <dali/internal/event/common/event-thread-services.h>
26 #include <dali/internal/event/common/property-input-impl.h>
27 #include <dali/internal/update/common/property-owner.h>
28 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
39 // Property Messages for PropertyOwner
42 * A base class for property owner property messages.
43 * (For future optimization - see NodeMessageBase & Node.SetActive())
45 class PropertyOwnerMessageBase : public MessageBase
52 PropertyOwnerMessageBase();
57 virtual ~PropertyOwnerMessageBase();
62 PropertyOwnerMessageBase(const PropertyOwnerMessageBase&);
63 PropertyOwnerMessageBase& operator=(const PropertyOwnerMessageBase& rhs);
67 * Templated message which bakes a property.
69 template< typename P >
70 class AnimatablePropertyMessage : public PropertyOwnerMessageBase
74 typedef void(AnimatableProperty<P>::*MemberFunction)( BufferIndex, typename ParameterType< P >::PassingType );
78 * @note The scene object is expected to be const in the thread which sends this message.
79 * However it can be modified when Process() is called in a different thread.
80 * @param[in] eventThreadServices The object used to send messages to the scene graph
81 * @param[in] sceneObject The property owner scene object
82 * @param[in] property The property to bake.
83 * @param[in] member The member function of the object.
84 * @param[in] value The new value of the property.
86 static void Send( EventThreadServices& eventThreadServices,
87 const PropertyOwner* sceneObject,
88 const AnimatableProperty<P>* property,
89 MemberFunction member,
90 typename ParameterType< P >::PassingType value )
92 // Reserve some memory inside the message queue
93 uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( AnimatablePropertyMessage ) );
95 // Construct message in the message queue memory; note that delete should not be called on the return value
96 new (slot) AnimatablePropertyMessage( sceneObject, property, member, value );
102 virtual ~AnimatablePropertyMessage()
107 * @copydoc MessageBase::Process
109 virtual void Process( BufferIndex updateBufferIndex )
111 mSceneObject->SetPropertyDirty( true );
112 (mProperty->*mMemberFunction)( updateBufferIndex, mParam );
119 * @note The property owner is expected to be const in the thread which sends this message.
120 * However it can be modified when Process() is called in a different thread.
121 * @param[in] sceneObject the property owner scene object
122 * @param[in] property The property to bake.
123 * @param[in] member The member function of the object.
124 * @param[in] value The new value of the property.
126 AnimatablePropertyMessage( const PropertyOwner* sceneObject,
127 const AnimatableProperty<P>* property,
128 MemberFunction member,
129 typename ParameterType< P >::PassingType value )
130 : PropertyOwnerMessageBase(),
131 mSceneObject( const_cast< PropertyOwner* >( sceneObject ) ),
132 mProperty( const_cast< AnimatableProperty<P>* >( property ) ),
133 mMemberFunction( member ),
140 PropertyOwner* mSceneObject;
141 AnimatableProperty<P>* mProperty;
142 MemberFunction mMemberFunction;
143 typename ParameterType< P >::HolderType mParam;
147 * Templated message which bakes a property.
149 template< typename P >
150 class AnimatablePropertyComponentMessage : public PropertyOwnerMessageBase
154 typedef void(AnimatableProperty<P>::*MemberFunction)( BufferIndex, float );
158 * @note The scene object is expected to be const in the thread which sends this message.
159 * However it can be modified when Process() is called in a different thread.
160 * @param[in] eventThreadServices The service object used for sending messages to the scene graph
161 * @param[in] sceneObject The property owner scene object
162 * @param[in] property The property to bake.
163 * @param[in] member The member function of the object.
164 * @param[in] value The new value of the X,Y,Z or W component.
166 static void Send( EventThreadServices& eventThreadServices,
167 const PropertyOwner* sceneObject,
168 const AnimatableProperty<P>* property,
169 MemberFunction member,
172 // Reserve some memory inside the message queue
173 uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( AnimatablePropertyComponentMessage ) );
175 // Construct message in the message queue memory; note that delete should not be called on the return value
176 new (slot) AnimatablePropertyComponentMessage( sceneObject, property, member, value );
182 virtual ~AnimatablePropertyComponentMessage()
187 * @copydoc MessageBase::Process
189 virtual void Process( BufferIndex updateBufferIndex )
191 mSceneObject->SetPropertyDirty( true );
192 (mProperty->*mMemberFunction)( updateBufferIndex, mParam );
199 * @note The scene object is expected to be const in the thread which sends this message.
200 * However it can be modified when Process() is called in a different thread.
201 * @param[in] sceneObject The property owner scene object
202 * @param[in] property The property to bake.
203 * @param[in] member The member function of the object.
204 * @param[in] value The new value of the X,Y,Z or W component.
206 AnimatablePropertyComponentMessage( const PropertyOwner* sceneObject,
207 const AnimatableProperty<P>* property,
208 MemberFunction member,
210 : PropertyOwnerMessageBase(),
211 mSceneObject( const_cast< PropertyOwner* >( sceneObject ) ),
212 mProperty( const_cast< AnimatableProperty<P>* >( property ) ),
213 mMemberFunction( member ),
219 PropertyOwner* mSceneObject;
220 AnimatableProperty<P>* mProperty;
221 MemberFunction mMemberFunction;
226 // Messages for PropertyOwner
228 inline void InstallCustomPropertyMessage( EventThreadServices& eventThreadServices, const PropertyOwner& owner, OwnerPointer<PropertyBase>& property )
230 typedef MessageValue1< PropertyOwner, OwnerPointer<PropertyBase> > LocalType;
232 // Reserve some memory inside the message queue
233 uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
235 // Construct message in the message queue memory; note that delete should not be called on the return value
236 new (slot) LocalType( &owner, &PropertyOwner::InstallCustomProperty, property );
239 inline void ApplyConstraintMessage( EventThreadServices& eventThreadServices, const PropertyOwner& owner, OwnerPointer<ConstraintBase>& constraint )
241 typedef MessageValue1< PropertyOwner, OwnerPointer<ConstraintBase> > LocalType;
243 // Reserve some memory inside the message queue
244 uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
246 // Construct message in the message queue memory; note that delete should not be called on the return value
247 new (slot) LocalType( &owner, &PropertyOwner::ApplyConstraint, constraint );
250 inline void RemoveConstraintMessage( EventThreadServices& eventThreadServices, const PropertyOwner& owner, const ConstraintBase& constConstraint )
252 // The update-thread can modify this object.
253 ConstraintBase& constraint = const_cast< ConstraintBase& >( constConstraint );
255 typedef MessageValue1< PropertyOwner, ConstraintBase* > LocalType;
257 // Reserve some memory inside the message queue
258 uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
260 // Construct message in the message queue memory; note that delete should not be called on the return value
261 new (slot) LocalType( &owner, &PropertyOwner::RemoveConstraint, &constraint );
264 inline void AddUniformMapMessage( EventThreadServices& eventThreadServices, const PropertyOwner& owner, OwnerPointer< UniformPropertyMapping >& map )
266 typedef MessageValue1< PropertyOwner, OwnerPointer< UniformPropertyMapping > > LocalType;
268 // Reserve some memory inside the message queue
269 uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
271 new (slot) LocalType( &owner, &PropertyOwner::AddUniformMapping, map );
274 inline void RemoveUniformMapMessage( EventThreadServices& eventThreadServices, const PropertyOwner& owner, const std::string& uniformName )
276 typedef MessageValue1< PropertyOwner, std::string > LocalType;
278 // Reserve some memory inside the message queue
279 uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
281 new (slot) LocalType( &owner, &PropertyOwner::RemoveUniformMapping, uniformName );
285 } // namespace SceneGraph
287 } // namespace Internal
291 #endif // DALI_INTERNAL_SCENE_GRAPH_PROPERTY_OWNER_MESSAGES_H