1 #ifndef DALI_INTERNAL_TRANSFORM_MANAGER_H
2 #define DALI_INTERNAL_TRANSFORM_MANAGER_H
5 * Copyright (c) 2020 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.
22 #include <dali/public-api/common/dali-vector.h>
23 #include <dali/public-api/math/matrix.h>
24 #include <dali/public-api/math/quaternion.h>
25 #include <dali/public-api/math/vector3.h>
26 #include <dali/public-api/common/constants.h>
27 #include <dali/internal/update/manager/free-list.h>
39 * Struct to store the animatable part of a component (Scale, orientation and position)
41 struct TransformComponentAnimatable
43 TransformComponentAnimatable()
44 : mScale( Vector3::ONE ),
45 mOrientation( Quaternion::IDENTITY ),
46 mPosition( Vector3::ZERO )
51 Quaternion mOrientation;
56 * Struct to store the non-animatable part of a component (AnchorPoint and ParentOrigin)
58 struct TransformComponentStatic
60 TransformComponentStatic()
61 : mAnchorPoint( AnchorPoint::DEFAULT ),
62 mParentOrigin( ParentOrigin::DEFAULT ),
63 mPositionUsesAnchorPoint( true )
68 Vector3 mParentOrigin;
69 bool mPositionUsesAnchorPoint;
74 DONT_INHERIT_TRANSFORM = 0,
77 INHERIT_ORIENTATION = 4,
78 INHERIT_ALL = INHERIT_POSITION | INHERIT_SCALE | INHERIT_ORIENTATION,
81 enum TransformManagerProperty
83 TRANSFORM_PROPERTY_POSITION = 0,
84 TRANSFORM_PROPERTY_SCALE,
85 TRANSFORM_PROPERTY_ANCHOR_POINT,
86 TRANSFORM_PROPERTY_PARENT_ORIGIN,
87 TRANSFORM_PROPERTY_SIZE,
88 TRANSFORM_PROPERTY_WORLD_POSITION,
89 TRANSFORM_PROPERTY_WORLD_SCALE,
90 TRANSFORM_PROPERTY_WORLD_ORIENTATION,
91 TRANSFORM_PROPERTY_WORLD_MATRIX,
92 TRANSFORM_PROPERTY_COUNT,
95 using TransformId = uint32_t; // 4,294,967,295 transforms supported
96 static const TransformId INVALID_TRANSFORM_ID = -1;
101 // Allow TransformComponentAnimatable to be treated as a POD type
102 template <> struct TypeTraits< Dali::Internal::SceneGraph::TransformComponentAnimatable >: public Dali::BasicTypes< Dali::Internal::SceneGraph::TransformComponentAnimatable > { enum { IS_TRIVIAL_TYPE = true }; };
111 * Transform manager computes the local to world transformations
112 * of all the nodes in the scene. All the transformation data is stored contiguously
113 * in memory which minimizes cache misses during updates
115 class TransformManager
120 * Default constructor
130 * Add a new transform component to the manager
131 * @return A TransformId used to access the component
133 TransformId CreateTransform();
136 * Removes an existing transform component
137 * @param[in] id Id of the transform to remove
139 void RemoveTransform(TransformId id);
142 * Sets the parent transform of an existing component
143 * @param[in] id Id of the transform
144 * @param[in] parentId Id of the new parent
146 void SetParent( TransformId id, TransformId parentId );
149 * Gets the world transform matrix of an exisiting transform component
150 * @param[in] id Id of the transform component
151 * @return The local to world transformation matrix of the component
153 const Matrix& GetWorldMatrix( TransformId id ) const;
156 * Gets the world transform matrix of an exisiting transform component
157 * @param[in] id Id of the transform component
158 * @return The local to world transformation matrix of the component
160 Matrix& GetWorldMatrix( TransformId id );
163 * Checks if the local transform was updated in the last Update
164 * @param[in] id Id of the transform
165 * @return true if local matrix changed in the last update, false otherwise
167 bool IsLocalMatrixDirty( TransformId id ) const
169 return mLocalMatrixDirty[mIds[id]];
173 * Sets position inheritance mode.
174 * @param[in] id Id of the transform
175 * @param[in] inherit True if position is inherited from parent, false otherwise
177 void SetInheritPosition( TransformId id, bool inherit );
180 * Sets scale inheritance mode.
181 * @param[in] id Id of the transform
182 * @param[in] inherit True if scale is inherited from parent, false otherwise
184 void SetInheritScale( TransformId id, bool inherit );
187 * Sets orientation inheritance mode.
188 * @param[in] id Id of the transform
189 * @param[in] inherit True if orientation is inherited from parent, false otherwise
191 void SetInheritOrientation( TransformId id, bool inherit );
194 * Recomputes all world transform matrices
195 * @return true if any component has been changed in this frame, false otherwise
200 * Resets all the animatable properties to its base value
202 void ResetToBaseValue();
205 * Get the value of a Vector3 property
206 * @param[in] id Id of the transform component
207 * @param[in] property The property
209 Vector3& GetVector3PropertyValue( TransformId id, TransformManagerProperty property );
212 * Get the value of a Vector3 property
213 * @param[in] id Id of the transform component
214 * @param[in] property The property
216 const Vector3& GetVector3PropertyValue( TransformId id, TransformManagerProperty property ) const;
219 * Get the value of a component of Vector3 property
220 * @param[in] id Id of the transform component
221 * @param[in] property The property
222 * param[in] component The component (0,1,2)
224 const float& GetVector3PropertyComponentValue( TransformId id, TransformManagerProperty property, uint32_t component ) const;
227 * Set the value of a Vector3 property
228 * @param[in] id Id of the transform component
229 * @param[in] property The property
230 * @param[in] value The new value
232 void SetVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value );
235 * Set the value of a component of a Vector3 property
236 * @param[in] id Id of the transform component
237 * @param[in] property The property
238 * @param[in] value The new value
239 * param[in] component The component (0,1,2)
241 void SetVector3PropertyComponentValue( TransformId id, TransformManagerProperty property, float value, uint32_t component );
244 * Bakes the value of a Vector3 property
245 * @param[in] id Id of the transform component
246 * @param[in] property The property
247 * @param[in] value The new value
249 void BakeVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value );
252 * Bakes the value of a Vector3 property relative to the current value
253 * @param[in] id Id of the transform component
254 * @param[in] property The property
255 * @param[in] value The new value
257 void BakeRelativeVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value );
260 * Bakes the value of a Vector3 property by multiplying the current value and the new value
261 * @param[in] id Id of the transform component
262 * @param[in] property The property
263 * @param[in] value The new value
265 void BakeMultiplyVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value );
268 * Bakes the value of a component of Vector3 property
269 * @param[in] id Id of the transform component
270 * @param[in] property The property
271 * @param[in] value The new value
273 void BakeVector3PropertyComponentValue( TransformId id, TransformManagerProperty property, float value, uint32_t component );
276 * Bakes the value of the x component of Vector3 property
277 * @param[in] id Id of the transform component
278 * @param[in] property The property
279 * @param[in] value The new value
281 void BakeXVector3PropertyValue( TransformId id, TransformManagerProperty property, float value );
284 * Bakes the value of the y component of Vector3 property
285 * @param[in] id Id of the transform component
286 * @param[in] property The property
287 * @param[in] value The new value
289 void BakeYVector3PropertyValue( TransformId id, TransformManagerProperty property, float value );
292 * Bakes the value of the z component of Vector3 property
293 * @param[in] id Id of the transform component
294 * @param[in] property The property
295 * @param[in] value The new value
297 void BakeZVector3PropertyValue( TransformId id, TransformManagerProperty property, float value );
300 * Get the value of a quaternion property
301 * @param[in] id Id of the transform component
303 Quaternion& GetQuaternionPropertyValue( TransformId id );
306 * Get the value of a quaternion property
307 * @param[in] id Id of the transform component
309 const Quaternion& GetQuaternionPropertyValue( TransformId id ) const;
312 * Set the value of a quaternion property
313 * @param[in] id Id of the transform component
314 * @param[in] q The new value
316 void SetQuaternionPropertyValue( TransformId id, const Quaternion& q );
319 * Bake the value of a quaternion property
320 * @param[in] id Id of the transform component
321 * @param[in] q The new value
323 void BakeQuaternionPropertyValue( TransformId id, const Quaternion& q );
326 * Bake the value of a quaternion property relative to its current value
327 * @param[in] id Id of the transform component
328 * @param[in] q The new value
330 void BakeRelativeQuaternionPropertyValue( TransformId id, const Quaternion& q );
333 * Get the bounding sphere, in world coordinates, of a given component
334 * @param[in] id Id of the transform component
335 * @return The world space bounding sphere of the component
337 const Vector4& GetBoundingSphere( TransformId id ) const;
340 * Get the world matrix and size of a given component
341 * @param[in] id Id of the transform component
342 * @param[out] The world matrix of the component
343 * @param[out] size size of the component
345 void GetWorldMatrixAndSize( TransformId id, Matrix& worldMatrix, Vector3& size ) const;
348 * @brief Sets the boolean which states whether the position should use the anchor-point on the given transform component.
349 * @param[in] id Id of the transform component
350 * @param[in] value True if the position should use the anchor-point
352 void SetPositionUsesAnchorPoint( TransformId id, bool value );
356 //Helper struct to order components
359 bool operator<(const SOrderItem& item) const {return level < item.level;}
366 * Swaps two components in the vectors
367 * @param[in] i Index of a component
368 * @param[in] j Index of a component
370 void SwapComponents( uint32_t i, uint32_t j );
373 * Reorders components in hierarchical order so update can iterate sequentially
374 * updating the world transforms
376 void ReorderComponents();
378 uint32_t mComponentCount; ///< Total number of components
379 FreeList mIds; ///< FreeList of Ids
380 Vector< TransformComponentAnimatable > mTxComponentAnimatable; ///< Animatable part of the components
381 Vector< TransformComponentStatic > mTxComponentStatic; ///< Static part of the components
382 Vector< uint32_t > mInheritanceMode; ///< Inheritance mode of the components
383 Vector< TransformId > mComponentId; ///< Ids of the components
384 Vector< Vector3 > mSize; ///< Size of the components
385 Vector< TransformId > mParent; ///< Parent of the components
386 Vector< Matrix > mWorld; ///< Local to world transform of the components
387 Vector< Matrix > mLocal; ///< Local to parent space transform of the components
388 Vector< Vector4 > mBoundingSpheres; ///< Bounding spheres. xyz is the center and w is the radius
389 Vector< TransformComponentAnimatable > mTxComponentAnimatableBaseValue; ///< Base values for the animatable part of the components
390 Vector< Vector3 > mSizeBase; ///< Base value for the size of the components
391 Vector< bool > mComponentDirty; ///< 1u if some of the parts of the component has changed in this frame, 0 otherwise
392 Vector< bool > mLocalMatrixDirty; ///< 1u if the local matrix has been updated in this frame, 0 otherwise
393 Vector< SOrderItem > mOrderedComponents; ///< Used to reorder components when hierarchy changes
394 bool mReorder; ///< Flag to determine if the components have to reordered in the next Update
397 } //namespace SceneGraph
399 } //namespace Internal
405 #endif // DALI_INTERNAL_TRANSFORM_MANAGER_H