[dali_1.2.17] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / bubble-effect / bubble-renderer.h
1 #ifndef DALI_TOOLKIT_INTERNAL_BUBBLE_RENDERER_H
2 #define DALI_TOOLKIT_INTERNAL_BUBBLE_RENDERER_H
3
4 /*
5  * Copyright (c) 2016 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 <dali/public-api/actors/actor.h>
23 #include <dali/public-api/common/vector-wrapper.h>
24 #include <dali/public-api/object/property-map.h>
25 #include <dali/public-api/rendering/renderer.h>
26
27 namespace Dali
28 {
29
30 namespace Toolkit
31 {
32
33 namespace Internal
34 {
35
36 /**
37  * BubbleRenderer renders a group of bubbles.Each bubble can be moved separately.
38  * Its custom shader achieves similar effect of particle system by applying on a specially created mesh
39  * Each bubble is rendered on a patch with two triangles; and each mesh can contain multiple such patches, thus a group.
40  */
41 class BubbleRenderer
42 {
43 public:
44
45   /**
46    * Constructor   *
47    * @return A newly allocated object.
48    */
49   BubbleRenderer();
50
51   /**
52    * @brief Destructor
53    */
54   ~BubbleRenderer(){}
55
56   /**
57    * Prepare for the rendering: create the renderer, and register properties
58    * @param[in] numberOfBubble How many groups of uniforms are used to control the bubble movement.
59    * Note: Limited by the maximum available uniforms, this parameter cannot be bigger than 100.
60    * Ideally use one group of uniform to control one bubble.
61    * If the num of patches in the MeshActor is more than groups of uniforms,
62    * the uniform values will be shared by multiple bubbles. Allow up to 9 times.
63    * @param[in] movementArea The size of the bubble moving area, usually the same size as the background.
64    * @param[in] geometry The geometry to be used by the renderer
65    * @param[in] textureSet The texture set to be used by the renderer
66    * @param[in] shader The shader set to be used by the renderer
67    */
68   void Initialize( unsigned int numberOfBubble, const Vector2& movementArea, Geometry geometry, TextureSet textureSet, Shader shader  );
69
70   /**
71    * Return the mesh actor which is used to display the bubbles
72    */
73   Renderer& GetRenderer();
74
75   /**
76    * Sets the geometry to be used by the renderer
77    * @param[in] geometry The geometry to be used by the renderer
78    */
79   void SetGeometry( Geometry geometry );
80
81   /**
82    * Set the start and end positions of the index-th bubble's movement.
83    * @param[in] index Indicate which bubble these properties are applied on.
84    * @param[in] startAndEndPosition The start and the end position of movement.
85    */
86   void SetStartAndEndPosition( unsigned int index, const Vector4& startAndEndPosition );
87
88   /**
89    * Set the movement completed percentage of the index-th bubble.
90    * The bubble will appear at start position when percentage equals to zero,
91    * and disappear near end position (affected by gravity) when percentage equals to one.
92    * This percentage property is used to animate the bubble movement.
93    * @param[in] index Indicate which bubble this property is applied on.
94    * @param[in] percentage Set the percentage property value ( between zero and one ).
95    */
96   void SetPercentage( unsigned int index, float percentage );
97
98   /**
99    * Set the gravity applied to the y direction, which makes the bubbles no longer moving on a straight line.
100    * @param[in] gravity The gravity on the y direction.
101    */
102   void SetGravity( float gravity );
103
104   /**
105    * Set the scale factor applied to the bubbles
106    * @param[in] scale The scale factor applied on all bubbles.
107    */
108   void SetDynamicScale( float scale );
109
110   /**
111    * Get the idx-th percentage property.
112    * @param[in] idx The percentage property index.
113    * @return the idx-th percentage property.
114    */
115   Property GetPercentageProperty( unsigned int idx );
116
117   /**
118    * Reset the uniform values to default.
119    */
120   void ResetProperties();
121
122 private:
123
124   Renderer     mRenderer;
125
126   //properties mapped as uniforms
127   std::vector<Property::Index> mIndicesOffset;             ///< Indices of the properties mapping to uniform array 'uOffset'
128   std::vector<Property::Index> mIndiceStartEndPos;         ///< Indices of the properties mapping to uniform array 'uStartAndEndPos'
129   std::vector<Property::Index> mIndicesPercentage;         ///< Indices of the properties mapping to uniform array 'uPercentage'
130   Property::Index              mIndexGravity;              ///< Index of the property mapping to uniform 'uGravity'
131   Property::Index              mIndexDynamicScale;         ///< Index of the property mapping to uniform 'uDynamicScale'
132   Property::Index              mIndexInvertedMovementArea; ///< Index of the property mapping to uniform 'uInvertedMovementArea'
133 };
134
135 } // namespace Internal
136
137 } // namespace Toolkit
138
139 } // namespace Dali
140
141 #endif // DALI_TOOLKIT_INTERNAL_BUBBLE_RENDERER_H