Support Markup Underline attributes
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / bubble-effect / bubble-renderer.cpp
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "bubble-renderer.h"
20
21 // EXTERNAL INCLUDES
22 #include <cmath>
23 #include <sstream>
24
25 // INTERNAL INCLUDES
26
27 namespace Dali
28 {
29 namespace Toolkit
30 {
31 namespace Internal
32 {
33 BubbleRenderer::BubbleRenderer()
34 : mRenderer(),
35   mIndicesOffset(),
36   mIndiceStartEndPos(),
37   mIndicesPercentage(),
38   mIndexGravity(Property::INVALID_INDEX),
39   mIndexDynamicScale(Property::INVALID_INDEX),
40   mIndexInvertedMovementArea(Property::INVALID_INDEX)
41 {
42 }
43
44 void BubbleRenderer::Initialize(unsigned int numberOfBubble, const Vector2& movementArea, Geometry geometry, TextureSet textureSet, Shader shader)
45 {
46   if(mRenderer)
47   {
48     // This function is supposed to be called once
49     return;
50   }
51
52   mRenderer = Renderer::New(geometry, shader);
53   mRenderer.SetTextures(textureSet);
54
55   // register uniforms
56   mIndexGravity      = mRenderer.RegisterProperty("uGravity", 50.f);
57   mIndexDynamicScale = mRenderer.RegisterProperty("uDynamicScale", 1.f);
58
59   mIndexInvertedMovementArea = mRenderer.RegisterProperty("uInvertedMovementArea", Vector2(1.f, 1.f) / movementArea);
60
61   mIndicesOffset.resize(9);
62   int offset = movementArea.Length() / 10.f;
63
64   unsigned int seed = time(NULL);
65
66   mIndicesOffset[0] = mRenderer.RegisterProperty("uOffset[0]", Vector2(0.f, 0.f));
67   mIndicesOffset[1] = mRenderer.RegisterProperty("uOffset[1]", Vector2(rand_r(&seed) % offset, rand_r(&seed) % offset));
68   mIndicesOffset[2] = mRenderer.RegisterProperty("uOffset[2]", Vector2(rand_r(&seed) % offset, -rand_r(&seed) % offset));
69   mIndicesOffset[3] = mRenderer.RegisterProperty("uOffset[3]", Vector2(-rand_r(&seed) % offset, rand_r(&seed) % offset));
70   mIndicesOffset[4] = mRenderer.RegisterProperty("uOffset[4]", Vector2(-rand_r(&seed) % offset, -rand_r(&seed) % offset));
71   mIndicesOffset[5] = mRenderer.RegisterProperty("uOffset[5]", Vector2(rand_r(&seed) % offset, 0.f));
72   mIndicesOffset[6] = mRenderer.RegisterProperty("uOffset[6]", Vector2(-rand_r(&seed) % offset, 0.f));
73   mIndicesOffset[7] = mRenderer.RegisterProperty("uOffset[7]", Vector2(0.f, rand_r(&seed) % offset));
74   mIndicesOffset[8] = mRenderer.RegisterProperty("uOffset[8]", Vector2(0.f, -rand_r(&seed) % offset));
75
76   Vector4 zeroVector;
77   mIndiceStartEndPos.resize(numberOfBubble);
78   mIndicesPercentage.resize(numberOfBubble);
79   for(unsigned int i = 0; i < numberOfBubble; i++)
80   {
81     std::ostringstream ossProperty;
82     ossProperty << "uStartEndPosition[" << i << "]";
83     mIndiceStartEndPos[i] = mRenderer.RegisterProperty(ossProperty.str(), zeroVector);
84
85     ossProperty.str("");
86     ossProperty << "uPercentage[" << i << "]";
87     mIndicesPercentage[i] = mRenderer.RegisterProperty(ossProperty.str(), 0.f);
88   }
89 }
90
91 Renderer& BubbleRenderer::GetRenderer()
92 {
93   return mRenderer;
94 }
95
96 void BubbleRenderer::SetGeometry(Geometry geometry)
97 {
98   mRenderer.SetGeometry(geometry);
99 }
100
101 void BubbleRenderer::SetStartAndEndPosition(unsigned int index, const Vector4& startAndEndPosition)
102 {
103   mRenderer.SetProperty(mIndiceStartEndPos[index], startAndEndPosition);
104 }
105
106 void BubbleRenderer::SetPercentage(unsigned int index, float percentage)
107 {
108   mRenderer.SetProperty(mIndicesPercentage[index], percentage);
109 }
110
111 void BubbleRenderer::SetGravity(float gravity)
112 {
113   mRenderer.SetProperty(mIndexGravity, gravity);
114 }
115
116 void BubbleRenderer::SetDynamicScale(float scale)
117 {
118   mRenderer.SetProperty(mIndexDynamicScale, scale);
119 }
120
121 Property BubbleRenderer::GetPercentageProperty(unsigned int index)
122 {
123   return Property(mRenderer, mIndicesPercentage[index]);
124 }
125
126 void BubbleRenderer::ResetProperties()
127 {
128   Vector4 zeroVector;
129   for(unsigned int i = 0; i < mIndicesPercentage.size(); i++)
130   {
131     SetPercentage(i, 0.f);
132     SetStartAndEndPosition(i, zeroVector);
133   }
134 }
135
136 } // namespace Internal
137
138 } // namespace Toolkit
139
140 } // namespace Dali