1 #ifndef DALI_INTERNAL_TRANSFORM_MANAGER_H
2 #define DALI_INTERNAL_TRANSFORM_MANAGER_H
5 * Copyright (c) 2017 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 typedef unsigned int TransformId;
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
199 * Resets all the animatable properties to its base value
201 void ResetToBaseValue();
204 * Get the value of a Vector3 property
205 * @param[in] id Id of the transform component
206 * @param[in] property The property
208 Vector3& GetVector3PropertyValue( TransformId id, TransformManagerProperty property );
211 * Get the value of a Vector3 property
212 * @param[in] id Id of the transform component
213 * @param[in] property The property
215 const Vector3& GetVector3PropertyValue( TransformId id, TransformManagerProperty property ) const;
218 * Get the value of a component of Vector3 property
219 * @param[in] id Id of the transform component
220 * @param[in] property The property
221 * param[in] component The component (0,1,2)
223 const float& GetVector3PropertyComponentValue(TransformId id, TransformManagerProperty property, unsigned int component ) const;
226 * Set the value of a Vector3 property
227 * @param[in] id Id of the transform component
228 * @param[in] property The property
229 * @param[in] value The new value
231 void SetVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value );
234 * Set the value of a component of a Vector3 property
235 * @param[in] id Id of the transform component
236 * @param[in] property The property
237 * @param[in] value The new value
238 * param[in] component The component (0,1,2)
240 void SetVector3PropertyComponentValue( TransformId id, TransformManagerProperty property, float value, unsigned int component );
243 * Bakes the value of a Vector3 property
244 * @param[in] id Id of the transform component
245 * @param[in] property The property
246 * @param[in] value The new value
248 void BakeVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value );
251 * Bakes the value of a Vector3 property relative to the current value
252 * @param[in] id Id of the transform component
253 * @param[in] property The property
254 * @param[in] value The new value
256 void BakeRelativeVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value );
259 * Bakes the value of a Vector3 property by multiplying the current value and the new value
260 * @param[in] id Id of the transform component
261 * @param[in] property The property
262 * @param[in] value The new value
264 void BakeMultiplyVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value );
267 * Bakes the value of a component of Vector3 property
268 * @param[in] id Id of the transform component
269 * @param[in] property The property
270 * @param[in] value The new value
272 void BakeVector3PropertyComponentValue( TransformId id, TransformManagerProperty property, float value, unsigned int component );
275 * Bakes the value of the x component of Vector3 property
276 * @param[in] id Id of the transform component
277 * @param[in] property The property
278 * @param[in] value The new value
280 void BakeXVector3PropertyValue( TransformId id, TransformManagerProperty property, float value );
283 * Bakes the value of the y component of Vector3 property
284 * @param[in] id Id of the transform component
285 * @param[in] property The property
286 * @param[in] value The new value
288 void BakeYVector3PropertyValue( TransformId id, TransformManagerProperty property, float value );
291 * Bakes the value of the z component of Vector3 property
292 * @param[in] id Id of the transform component
293 * @param[in] property The property
294 * @param[in] value The new value
296 void BakeZVector3PropertyValue( TransformId id, TransformManagerProperty property, float value );
299 * Get the value of a quaternion property
300 * @param[in] id Id of the transform component
302 Quaternion& GetQuaternionPropertyValue( TransformId id );
305 * Get the value of a quaternion property
306 * @param[in] id Id of the transform component
308 const Quaternion& GetQuaternionPropertyValue( TransformId id ) const;
311 * Set the value of a quaternion property
312 * @param[in] id Id of the transform component
313 * @param[in] q The new value
315 void SetQuaternionPropertyValue( TransformId id, const Quaternion& q );
318 * Bake the value of a quaternion property
319 * @param[in] id Id of the transform component
320 * @param[in] q The new value
322 void BakeQuaternionPropertyValue( TransformId id, const Quaternion& q );
325 * Bake the value of a quaternion property relative to its current value
326 * @param[in] id Id of the transform component
327 * @param[in] q The new value
329 void BakeRelativeQuaternionPropertyValue( TransformId id, const Quaternion& q );
332 * Get the bounding sphere, in world coordinates, of a given component
333 * @param[in] id Id of the transform component
334 * @return The world space bounding sphere of the component
336 const Vector4& GetBoundingSphere( TransformId id ) const;
339 * Get the world matrix and size of a given component
340 * @param[in] id Id of the transform component
341 * @param[out] The world matrix of the component
342 * @param[out] size size of the component
344 void GetWorldMatrixAndSize( TransformId id, Matrix& worldMatrix, Vector3& size ) const;
347 * @brief Sets the boolean which states whether the position should use the anchor-point on the given transform component.
348 * @param[in] id Id of the transform component
349 * @param[in] value True if the position should use the anchor-point
351 void SetPositionUsesAnchorPoint( TransformId id, bool value );
355 //Helper struct to order components
358 bool operator<(const SOrderItem& item) const {return level < item.level;}
365 * Swaps two components in the vectors
366 * @param[in] i Index of a component
367 * @param[in] j Index of a component
369 void SwapComponents( unsigned int i, unsigned int j );
372 * Reorders components in hierarchical order so update can iterate sequentially
373 * updating the world transforms
375 void ReorderComponents();
377 unsigned int mComponentCount; ///< Total number of components
378 FreeList mIds; ///< FreeList of Ids
379 Vector< TransformComponentAnimatable > mTxComponentAnimatable; ///< Animatable part of the components
380 Vector< TransformComponentStatic > mTxComponentStatic; ///< Static part of the components
381 Vector< unsigned int > mInheritanceMode; ///< Inheritance mode of the components
382 Vector< TransformId > mComponentId; ///< Ids of the components
383 Vector< Vector3 > mSize; ///< Size of the components
384 Vector< TransformId > mParent; ///< Parent of the components
385 Vector< Matrix > mWorld; ///< Local to world transform of the components
386 Vector< Matrix > mLocal; ///< Local to parent space transform of the components
387 Vector< Vector4 > mBoundingSpheres; ///< Bounding spheres. xyz is the center and w is the radius
388 Vector< TransformComponentAnimatable > mTxComponentAnimatableBaseValue; ///< Base values for the animatable part of the components
389 Vector< Vector3 > mSizeBase; ///< Base value for the size of the components
390 Vector< bool > mComponentDirty; ///< 1u if some of the parts of the component has changed in this frame, 0 otherwise
391 Vector< bool > mLocalMatrixDirty; ///< 1u if the local matrix has been updated in this frame, 0 otherwise
392 Vector< SOrderItem > mOrderedComponents; ///< Used to reorder components when hierarchy changes
393 bool mReorder; ///< Flag to determine if the components have to reordered in the next Update
396 } //namespace SceneGraph
398 } //namespace Internal
404 #endif // DALI_INTERNAL_TRANSFORM_MANAGER_H