Merge "Add focus indicator only when attaching physicalkeyboard" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / bubble-effect / bubble-renderer.cpp
1 /*
2  * Copyright (c) 2016 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
30 namespace Toolkit
31 {
32
33 namespace Internal
34 {
35
36 BubbleRenderer::BubbleRenderer()
37 : mRenderer(),
38   mIndicesOffset(),
39   mIndiceStartEndPos(),
40   mIndicesPercentage(),
41   mIndexGravity( Property::INVALID_INDEX ),
42   mIndexDynamicScale( Property::INVALID_INDEX ),
43   mIndexInvertedMovementArea( Property::INVALID_INDEX )
44 {
45 }
46
47 void BubbleRenderer::Initialize( unsigned int numberOfBubble, const Vector2& movementArea, Geometry geometry, TextureSet textureSet, Shader shader  )
48 {
49   if( mRenderer )
50   {
51     // This function is supposed to be called once
52     return;
53   }
54
55   mRenderer = Renderer::New( geometry, shader );
56   mRenderer.SetTextures( textureSet );
57
58   // register uniforms
59   mIndexGravity = mRenderer.RegisterProperty( "uGravity", 50.f );
60   mIndexDynamicScale = mRenderer.RegisterProperty( "uDynamicScale", 1.f );
61
62   mIndexInvertedMovementArea = mRenderer.RegisterProperty( "uInvertedMovementArea", Vector2(1.f,1.f) / movementArea );
63
64   mIndicesOffset.resize(9);
65   int offset = movementArea.Length() / 10.f;
66
67   unsigned int seed = time( NULL );
68
69   mIndicesOffset[0] = mRenderer.RegisterProperty( "uOffset[0]", Vector2( 0.f,0.f ) );
70   mIndicesOffset[1] = mRenderer.RegisterProperty( "uOffset[1]", Vector2( rand_r( &seed ) % offset,  rand_r( &seed ) % offset ) );
71   mIndicesOffset[2] = mRenderer.RegisterProperty( "uOffset[2]", Vector2( rand_r( &seed ) % offset, -rand_r( &seed ) % offset ) );
72   mIndicesOffset[3] = mRenderer.RegisterProperty( "uOffset[3]", Vector2(-rand_r( &seed ) % offset,  rand_r( &seed ) % offset ) );
73   mIndicesOffset[4] = mRenderer.RegisterProperty( "uOffset[4]", Vector2(-rand_r( &seed ) % offset, -rand_r( &seed ) % offset ) );
74   mIndicesOffset[5] = mRenderer.RegisterProperty( "uOffset[5]", Vector2( rand_r( &seed ) % offset, 0.f ) );
75   mIndicesOffset[6] = mRenderer.RegisterProperty( "uOffset[6]", Vector2(-rand_r( &seed ) % offset, 0.f ) );
76   mIndicesOffset[7] = mRenderer.RegisterProperty( "uOffset[7]", Vector2( 0.f,  rand_r( &seed ) % offset ) );
77   mIndicesOffset[8] = mRenderer.RegisterProperty( "uOffset[8]", Vector2( 0.f, -rand_r( &seed ) % offset ) );
78
79   Vector4 zeroVector;
80   mIndiceStartEndPos.resize( numberOfBubble );
81   mIndicesPercentage.resize( numberOfBubble );
82   for( unsigned int i=0; i<numberOfBubble; i++ )
83   {
84     std::ostringstream ossProperty;
85     ossProperty<< "uStartEndPosition["<< i << "]";
86     mIndiceStartEndPos[i] = mRenderer.RegisterProperty( ossProperty.str(), zeroVector );
87
88     ossProperty.str("");
89     ossProperty<< "uPercentage["<< i << "]";
90     mIndicesPercentage[i] = mRenderer.RegisterProperty( ossProperty.str(), 0.f );
91   }
92 }
93
94 Renderer& BubbleRenderer::GetRenderer()
95 {
96   return mRenderer;
97 }
98
99 void BubbleRenderer::SetGeometry( Geometry geometry )
100 {
101   mRenderer.SetGeometry( geometry );
102 }
103
104 void BubbleRenderer::SetStartAndEndPosition( unsigned int index, const Vector4& startAndEndPosition )
105 {
106   mRenderer.SetProperty( mIndiceStartEndPos[index], startAndEndPosition );
107 }
108
109 void BubbleRenderer::SetPercentage( unsigned int index, float percentage )
110 {
111   mRenderer.SetProperty( mIndicesPercentage[index], percentage );
112 }
113
114 void BubbleRenderer::SetGravity( float gravity )
115 {
116   mRenderer.SetProperty( mIndexGravity, gravity );
117 }
118
119 void BubbleRenderer::SetDynamicScale( float scale )
120 {
121   mRenderer.SetProperty( mIndexDynamicScale, scale );
122 }
123
124 Property BubbleRenderer::GetPercentageProperty( unsigned int index )
125 {
126   return Property( mRenderer, mIndicesPercentage[index] );
127 }
128
129 void BubbleRenderer::ResetProperties()
130 {
131   Vector4 zeroVector;
132   for( unsigned int i=0; i<mIndicesPercentage.size(); i++ )
133   {
134     SetPercentage( i, 0.f);
135     SetStartAndEndPosition( i, zeroVector );
136   }
137 }
138
139 } // namespace Internal
140
141 } // namespace Toolkit
142
143 } // namespace Dali