Add move semantics to commonly used classes in dali-core
[platform/core/uifw/dali-core.git] / dali / public-api / animation / path.h
1 #ifndef DALI_PATH_H
2 #define DALI_PATH_H
3
4 /*
5  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/object/handle.h>
23 #include <dali/public-api/object/property-index-ranges.h>
24
25 namespace Dali
26 {
27 /**
28  * @addtogroup dali_core_animation
29  * @{
30  */
31
32 namespace Internal DALI_INTERNAL
33 {
34 class Path;
35 }
36
37 /**
38  * @brief A 3D parametric curve.
39  *
40  * Paths can be used to animate position and orientation of actors using Dali::Animate().
41  *
42  * @SINCE_1_0.0
43  */
44 class DALI_CORE_API Path : public Handle
45 {
46 public:
47
48   /**
49    * @brief Enumeration for the instance of properties belonging to the Path class.
50    * @SINCE_1_0.0
51    */
52   struct Property
53   {
54     /**
55      * @brief Enumeration for the instance of properties belonging to the Path class.
56      * @SINCE_1_0.0
57      */
58     enum
59     {
60       POINTS         = DEFAULT_OBJECT_PROPERTY_START_INDEX, ///< name "points",         type Vector3 @SINCE_1_0.0
61       CONTROL_POINTS,                                       ///< name "controlPoints",  type Vector3 @SINCE_1_0.0
62     };
63   };
64
65   /**
66    * @brief Creates an initialized Path handle.
67    *
68    * @SINCE_1_0.0
69    * @return A handle to a newly allocated Dali resource
70    */
71   static Path New();
72
73   /**
74    * @brief Downcasts a handle to Path handle.
75    *
76    * If handle points to a Path object, the downcast produces valid handle.
77    * If not, the returned handle is left uninitialized.
78    * @SINCE_1_0.0
79    * @param[in] handle Handle to an object
80    * @return Handle to a Path object or an uninitialized handle
81    */
82   static Path DownCast( BaseHandle handle );
83
84   /**
85    * @brief Creates an uninitialized Path handle.
86    *
87    * This can be initialized with Path::New().
88    * Calling member functions with an uninitialized Path handle is not allowed.
89    * @SINCE_1_0.0
90    */
91   Path();
92
93   /**
94    * @brief Destructor.
95    *
96    * This is non-virtual since derived Handle types must not contain data or virtual methods.
97    * @SINCE_1_0.0
98    */
99   ~Path();
100
101   /**
102    * @brief This copy constructor is required for (smart) pointer semantics.
103    *
104    * @SINCE_1_0.0
105    * @param[in] handle A reference to the copied handle
106    */
107   Path(const Path& handle);
108
109   /**
110    * @brief This assignment operator is required for (smart) pointer semantics.
111    *
112    * @SINCE_1_0.0
113    * @param[in] rhs A reference to the copied handle
114    * @return A reference to this
115    */
116   Path& operator=(const Path& rhs);
117
118   /**
119    * @brief Move constructor.
120    *
121    * @SINCE_1_9.22
122    * @param[in] rhs A reference to the moved handle
123    */
124   Path( Path&& rhs );
125
126   /**
127    * @brief Move assignment operator.
128    *
129    * @SINCE_1_9.22
130    * @param[in] rhs A reference to the moved handle
131    * @return A reference to this
132    */
133   Path& operator=( Path&& rhs );
134
135   /**
136    * @brief Adds an interpolation point.
137    *
138    * @SINCE_1_0.0
139    * @param[in] point The new interpolation point to be added
140    */
141   void AddPoint(const Vector3& point );
142
143   /**
144    * @brief Adds a control point.
145    *
146    * @SINCE_1_0.0
147    * @param[in] point The new control point to be added
148    */
149   void AddControlPoint(const Vector3& point );
150
151   /**
152    * @brief Automatic generation of control points. Generated control points which result in a smooth join between the splines of each segment.
153    *
154    * The generating algorithm is as follows:
155    * For a given knot point K[N], find the vector that bisects K[N-1],[N] and [N],[N+1].
156    * Calculate the tangent vector by taking the normal of this bisector.
157    * The in control point is the length of the preceding segment back along this bisector multiplied by the curvature.
158    * The out control point is the length of the succeeding segment forward along this bisector multiplied by the curvature.
159    *
160    * @SINCE_1_0.0
161    * @param[in] curvature The curvature of the spline. 0 gives straight lines between the knots,
162    *                      negative values means the spline contains loops, positive values up to
163    *                      0.5 result in a smooth curve, positive values between 0.5 and 1 result
164    *                      in looped curves where the loops are not distinct (i.e. the curve appears
165    *                      to be non-continuous), positive values higher than 1 result in looped curves
166    * @pre There are at least two points in the path ( one segment ).
167    *
168    */
169   void GenerateControlPoints( float curvature );
170
171   /**
172    * @brief Sample path at a given progress. Calculates position and tangent at that point of the curve.
173    *
174    * @SINCE_1_0.0
175    * @param[in] progress A floating point value between 0.0 and 1.0
176    * @param[out] position The interpolated position at that progress
177    * @param[out] tangent The interpolated tangent at that progress
178    */
179   void Sample( float progress, Vector3& position, Vector3& tangent ) const;
180
181   /**
182    * @brief Accessor for the interpolation points.
183    *
184    * @SINCE_1_0.0
185    * @param[in] index The index of the interpolation point
186    * @return A reference to the interpolation point
187    */
188   Vector3& GetPoint( size_t index );
189
190   /**
191    * @brief Accessor for the control points.
192    *
193    * @SINCE_1_0.0
194    * @param[in] index The index of the control point
195    * @return A reference to the control point
196    */
197   Vector3& GetControlPoint( size_t index );
198
199   /**
200    * @brief Gets the number of interpolation points in the path.
201    *
202    * @SINCE_1_0.0
203    * @return The number of interpolation points in the path
204    */
205   size_t GetPointCount() const;
206
207 public: // Not intended for application developers
208   /// @cond internal
209   /**
210    * @brief This constructor is used by Path::New() methods.
211    *
212    * @SINCE_1_0.0
213    * @param[in] path A pointer to an internal path resource
214    */
215   explicit DALI_INTERNAL Path(Internal::Path* path);
216   /// @endcond
217 };
218
219 /**
220  * @}
221  */
222 } // namespace Dali
223
224 #endif // DALI_PATH_H