Merge "DALi Version 1.1.26" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / event / common / property-input-impl.h
1 #ifndef __DALI_INTERNAL_PROPERTY_INPUT_IMPL_H__
2 #define __DALI_INTERNAL_PROPERTY_INPUT_IMPL_H__
3
4 /*
5  * Copyright (c) 2014 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 // EXTERNAL INCLUDES
22 #include <iostream>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/object/property-input.h>
26 #include <dali/public-api/math/vector2.h>
27 #include <dali/public-api/math/vector3.h>
28 #include <dali/public-api/math/vector4.h>
29 #include <dali/public-api/math/quaternion.h>
30 #include <dali/public-api/math/matrix3.h>
31 #include <dali/public-api/math/matrix.h>
32 #include <dali/internal/common/buffer-index.h>
33
34 namespace Dali
35 {
36
37 namespace Internal
38 {
39
40 /**
41  * An abstract interface for receiving property values, and for querying whether
42  * a property value has changed i.e. whether a constraint needs to be reapplied.
43  */
44 class PropertyInputImpl
45 {
46 public:
47
48   /**
49    * Virtual destructor.
50    */
51   virtual ~PropertyInputImpl()
52   {
53   }
54
55   /**
56    * Query the type of property input.
57    * @return The property type.
58    */
59   virtual Property::Type GetType() const = 0;
60
61   /**
62    * Query the input value (for a constraint) has been initialized.
63    * @return True if initialized, otherwise the constraint should be skipped.
64    */
65   virtual bool InputInitialized() const = 0;
66
67   /**
68    * Query the input value (for a constraint) has changed.
69    * @return True if the input value has changed.
70    */
71   virtual bool InputChanged() const = 0;
72
73   /**
74    * Retrieve a boolean value.
75    * @pre GetType() returns Property::BOOLEAN.
76    * @param[in] bufferIndex The buffer to read from.
77    * @return The boolean value.
78    */
79   virtual const bool& GetBoolean( BufferIndex bufferIndex ) const
80   {
81     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
82     // the return will never be executed due to assert above so just keep the compiler happy
83     return reinterpret_cast<const bool&>(*this);
84   }
85
86   /**
87    * Retrieve an integer value.
88    * @pre GetType() returns Property::INTEGER.
89    * @param[in] bufferIndex The buffer to read from.
90    * @return The integer value.
91    */
92   virtual const int& GetInteger( BufferIndex bufferIndex ) const
93   {
94     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
95     // the return will never be executed due to assert above so just keep the compiler happy
96     return reinterpret_cast<const int&>(*this);
97   }
98
99   /**
100    * Retrieve a float value.
101    * @pre GetType() returns Property::FLOAT.
102    * @param[in] bufferIndex The buffer to read from.
103    * @return The float value.
104    */
105   virtual const float& GetFloat( BufferIndex bufferIndex ) const
106   {
107     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
108     // the return will never be executed due to assert above so just keep the compiler happy
109     return reinterpret_cast<const float&>(*this);
110   }
111
112   /**
113    * Retrieve a Vector2 value.
114    * @pre GetType() returns Property::VECTOR2.
115    * @param[in] bufferIndex The buffer to read from.
116    * @return The Vector2 value.
117    */
118   virtual const Vector2& GetVector2( BufferIndex bufferIndex ) const
119   {
120     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
121     // the return will never be executed due to assert above so just keep the compiler happy
122     return reinterpret_cast<const Vector2&>(*this);
123   }
124
125   /**
126    * Retrieve a Vector3 value.
127    * @pre GetType() returns Property::VECTOR3.
128    * @param[in] bufferIndex The buffer to read from.
129    * @return The Vector3 value.
130    */
131   virtual const Vector3& GetVector3( BufferIndex bufferIndex ) const
132   {
133     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
134     // the return will never be executed due to assert above so just keep the compiler happy
135     return reinterpret_cast<const Vector3&>(*this);
136   }
137
138   /**
139    * Retrieve a Vector4 value.
140    * @pre GetType() returns Property::VECTOR4.
141    * @param[in] bufferIndex The buffer to read from.
142    * @return The Vector4 value.
143    */
144   virtual const Vector4& GetVector4( BufferIndex bufferIndex ) const
145   {
146     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
147     // the return will never be executed due to assert above so just keep the compiler happy
148     return reinterpret_cast<const Vector4&>(*this);
149   }
150
151   /**
152    * Retrieve a Quaternion value.
153    * @pre GetType() returns Property::Quaternion.
154    * @param[in] bufferIndex The buffer to read from.
155    * @return The Quaternion value.
156    */
157   virtual const Quaternion& GetQuaternion( BufferIndex bufferIndex ) const
158   {
159     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
160     // the return will never be executed due to assert above so just keep the compiler happy
161     return reinterpret_cast<const Quaternion&>(*this);
162   }
163
164   /**
165    * Retrieve a Matrix value.
166    * @pre GetType() returns Property::Matrix.
167    * @param[in] bufferIndex The buffer to read from.
168    * @return The Matrix value.
169    */
170   virtual const Matrix3& GetMatrix3( BufferIndex bufferIndex ) const
171   {
172     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
173     // the return will never be executed due to assert above so just keep the compiler happy
174     return reinterpret_cast<const Matrix3&>(*this);
175   }
176
177   /**
178    * Retrieve a Matrix value.
179    * @pre GetType() returns Property::Matrix.
180    * @param[in] bufferIndex The buffer to read from.
181    * @return The Matrix value.
182    */
183   virtual const Matrix& GetMatrix( BufferIndex bufferIndex ) const
184   {
185     DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
186     // the return will never be executed due to assert above so just keep the compiler happy
187     return reinterpret_cast<const Matrix&>(*this);
188   }
189
190   // Accessors for Constraint functions
191
192   /**
193    * Retrieve a boolean input for a constraint function.
194    * @note For inherited properties, this method should be overriden to return the value
195    * from the previous frame i.e. not from the current update buffer.
196    * @pre GetType() returns Property::BOOLEAN.
197    * @param[in] updateBufferIndex The current update buffer index.
198    * @return The boolean value.
199    */
200   virtual const bool& GetConstraintInputBoolean( BufferIndex updateBufferIndex ) const
201   {
202     return GetBoolean( updateBufferIndex );
203   }
204
205   /**
206    * Retrieve an integer input for a constraint function.
207    * @note For inherited properties, this method should be overriden to return the value
208    * from the previous frame i.e. not from the current update buffer.
209    * @pre GetType() returns Property::INTEGER.
210    * @param[in] updateBufferIndex The current update buffer index.
211    * @return The integer value.
212    */
213   virtual const int& GetConstraintInputInteger( BufferIndex updateBufferIndex ) const
214   {
215     return GetInteger( updateBufferIndex );
216   }
217
218   /**
219    * Retrieve a float input for a constraint function.
220    * @note For inherited properties, this method should be overriden to return the value
221    * from the previous frame i.e. not from the current update buffer.
222    * @pre GetType() returns Property::FLOAT.
223    * @param[in] updateBufferIndex The current update buffer index.
224    * @return The float value.
225    */
226   virtual const float& GetConstraintInputFloat( BufferIndex updateBufferIndex ) const
227   {
228     return GetFloat( updateBufferIndex );
229   }
230
231   /**
232    * Retrieve a Vector2 input for a constraint function.
233    * @note For inherited properties, this method should be overriden to return the value
234    * from the previous frame i.e. not from the current update buffer.
235    * @pre GetType() returns Property::VECTOR2.
236    * @param[in] updateBufferIndex The buffer to read from.
237    * @return The Vector2 value.
238    */
239   virtual const Vector2& GetConstraintInputVector2( BufferIndex updateBufferIndex ) const
240   {
241     return GetVector2( updateBufferIndex );
242   }
243
244   /**
245    * Retrieve a Vector3 input for a constraint function.
246    * @note For inherited properties, this method should be overriden to return the value
247    * from the previous frame i.e. not from the current update buffer.
248    * @pre GetType() returns Property::VECTOR3.
249    * @param[in] updateBufferIndex The buffer to read from.
250    * @return The Vector3 value.
251    */
252   virtual const Vector3& GetConstraintInputVector3( BufferIndex updateBufferIndex ) const
253   {
254     return GetVector3( updateBufferIndex );
255   }
256
257   /**
258    * Retrieve a Vector4 input for a constraint function.
259    * @note For inherited properties, this method should be overriden to return the value
260    * from the previous frame i.e. not from the current update buffer.
261    * @pre GetType() returns Property::VECTOR4.
262    * @param[in] updateBufferIndex The buffer to read from.
263    * @return The Vector4 value.
264    */
265   virtual const Vector4& GetConstraintInputVector4( BufferIndex updateBufferIndex ) const
266   {
267     return GetVector4( updateBufferIndex );
268   }
269
270   /**
271    * Retrieve a Quaternion input for a constraint function.
272    * @note For inherited properties, this method should be overriden to return the value
273    * from the previous frame i.e. not from the current update buffer.
274    * @pre GetType() returns Property::Quaternion.
275    * @param[in] updateBufferIndex The buffer to read from.
276    * @return The Quaternion value.
277    */
278   virtual const Quaternion& GetConstraintInputQuaternion( BufferIndex updateBufferIndex ) const
279   {
280     return GetQuaternion( updateBufferIndex );
281   }
282
283   /**
284    * Retrieve a Matrix3 input for a constraint function.
285    * @note For inherited properties, this method should be overriden to return the value
286    * from the previous frame i.e. not from the current update buffer.
287    * @pre GetType() returns Property::Matrix.
288    * @param[in] updateBufferIndex The buffer to read from.
289    * @return The Matrix value.
290    */
291   virtual const Matrix3& GetConstraintInputMatrix3( BufferIndex updateBufferIndex ) const
292   {
293     return GetMatrix3( updateBufferIndex );
294   }
295
296   /**
297    * Retrieve a Matrix input for a constraint function.
298    * @note For inherited properties, this method should be overriden to return the value
299    * from the previous frame i.e. not from the current update buffer.
300    * @pre GetType() returns Property::Matrix.
301    * @param[in] updateBufferIndex The buffer to read from.
302    * @return The Matrix value.
303    */
304   virtual const Matrix& GetConstraintInputMatrix( BufferIndex updateBufferIndex ) const
305   {
306     return GetMatrix( updateBufferIndex );
307   }
308
309   /**
310    * Query whether the property belongs to the
311    * transform manager or not.
312    * @return True if it is a transform manager property, false otherwise
313    */
314   virtual bool IsTransformManagerProperty() const
315   {
316     return false;
317   }
318
319   /**
320    * Print the property value using a stream.
321    * @param[in] debugStream The output stream.
322    * @param[in] bufferIndex The buffer to read from.
323    * @todo Place this far-too-large-to-be-inlined function in a cpp and remove <iostream> header dependency from this file.
324    */
325   void DebugPrint( std::ostream& debugStream, BufferIndex bufferIndex ) const
326   {
327     switch ( GetType() )
328     {
329       case Property::BOOLEAN:
330       {
331         debugStream << GetBoolean( bufferIndex );
332         break;
333       }
334
335       case Property::INTEGER:
336       {
337         debugStream << GetInteger( bufferIndex );
338         break;
339       }
340
341       case Property::FLOAT:
342       {
343         debugStream << GetFloat( bufferIndex );
344         break;
345       }
346
347       case Property::VECTOR2:
348       {
349         debugStream << GetVector2( bufferIndex );
350         break;
351       }
352
353       case Property::VECTOR3:
354       {
355         debugStream << GetVector3( bufferIndex );
356         break;
357       }
358
359       case Property::VECTOR4:
360       {
361         debugStream << GetVector4( bufferIndex );
362         break;
363       }
364
365       case Property::ROTATION:
366       {
367         debugStream << GetQuaternion( bufferIndex );
368         break;
369       }
370
371       case Property::MATRIX:
372       {
373         debugStream << GetMatrix( bufferIndex );
374         break;
375       }
376
377       case Property::MATRIX3:
378       {
379         debugStream << GetMatrix3( bufferIndex );
380         break;
381       }
382
383       default:
384         break; // print nothing
385     }
386   }
387 };
388
389 } // namespace Internal
390
391 } // namespace Dali
392
393 #endif // __DALI_INTERNAL_PROPERTY_INPUT_IMPL_H__