Basic pan-gesture resampling for when prediction is off
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / bubble-effect / bubble-actor.cpp
1 /*
2  * Copyright (c) 2015 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-actor.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 BubbleActor::BubbleActor( unsigned int numberOfBubble,
37                           const Vector2& movementArea)
38 : mMovementArea( movementArea ),
39   mNumBubble( numberOfBubble )
40 {
41   mActor = Actor::New();
42 }
43
44 void BubbleActor::MakeRenderable( Geometry geometry, Material material  )
45 {
46   if( mRenderer )
47   {
48     // This function is supposed to be called once
49     return;
50   }
51
52   mRenderer = Renderer::New( geometry, material );
53
54   mActor.AddRenderer( mRenderer );
55   mActor.SetSize( mMovementArea );
56   mActor.SetParentOrigin(ParentOrigin::TOP_LEFT);
57
58   // register uniforms
59   mIndexGravity = mActor.RegisterProperty( "uGravity", 50.f );
60   mIndexDynamicScale = mActor.RegisterProperty( "uDynamicScale", 1.f );
61
62   mIndexInvertedMovementArea = mActor.RegisterProperty( "uInvertedMovementArea", Vector2(1.f,1.f) / mMovementArea );
63
64   srand(time(NULL));
65   mIndicesOffset.resize(9);
66   int offset = mMovementArea.Length() / 10.f;
67   mIndicesOffset[0] = mActor.RegisterProperty( "uOffset[0]", Vector2(0.f,0.f));
68   mIndicesOffset[1] = mActor.RegisterProperty( "uOffset[1]", Vector2(rand()%offset,rand()%offset) );
69   mIndicesOffset[2] = mActor.RegisterProperty( "uOffset[2]", Vector2(rand()%offset,-rand()%offset) );
70   mIndicesOffset[3] = mActor.RegisterProperty( "uOffset[3]", Vector2(-rand()%offset,rand()%offset) );
71   mIndicesOffset[4] = mActor.RegisterProperty( "uOffset[4]", Vector2(-rand()%offset,-rand()%offset) );
72   mIndicesOffset[5] = mActor.RegisterProperty( "uOffset[5]", Vector2(rand()%offset,0.f));
73   mIndicesOffset[6] = mActor.RegisterProperty( "uOffset[6]", Vector2(-rand()%offset,0.f));
74   mIndicesOffset[7] = mActor.RegisterProperty( "uOffset[7]", Vector2(0.f,rand()%offset));
75   mIndicesOffset[8] = mActor.RegisterProperty( "uOffset[8]", Vector2(0.f,-rand()%offset));
76
77   Vector4 zeroVector;
78   mIndiceStartEndPos.resize( mNumBubble );
79   mIndicesPercentage.resize( mNumBubble );
80   for( unsigned int i=0; i<mNumBubble; i++ )
81   {
82     std::ostringstream ossProperty;
83     ossProperty<< "uStartEndPosition["<< i << "]";
84     mIndiceStartEndPos[i] = mActor.RegisterProperty( ossProperty.str(), zeroVector );
85
86     ossProperty.str("");
87     ossProperty<< "uPercentage["<< i << "]";
88     mIndicesPercentage[i] = mActor.RegisterProperty( ossProperty.str(), 0.f );
89   }
90 }
91
92 Actor BubbleActor::GetMeshActor()
93 {
94   return mActor;
95 }
96
97 void BubbleActor::SetGeometry( Geometry geometry )
98 {
99   mRenderer.SetGeometry( geometry );
100 }
101
102 void BubbleActor::SetMovementArea( const Vector2& movementArea )
103 {
104   if( movementArea == mMovementArea)
105   {
106     return;
107   }
108
109   mMovementArea = movementArea;
110   mActor.SetSize( mMovementArea );
111   mActor.SetProperty( mIndexInvertedMovementArea, Vector2(1.f,1.f) / mMovementArea );
112
113   int offset = mMovementArea.Length() / 10.f;
114   mActor.SetProperty( mIndicesOffset[1], Vector2(rand()%offset,rand()%offset) );
115   mActor.SetProperty( mIndicesOffset[2], Vector2(rand()%offset,-rand()%offset) );
116   mActor.SetProperty( mIndicesOffset[3], Vector2(-rand()%offset,rand()%offset) );
117   mActor.SetProperty( mIndicesOffset[4], Vector2(-rand()%offset,-rand()%offset) );
118   mActor.SetProperty( mIndicesOffset[5], Vector2(rand()%offset,0.f));
119   mActor.SetProperty( mIndicesOffset[6], Vector2(-rand()%offset,0.f));
120   mActor.SetProperty( mIndicesOffset[7], Vector2(0.f,rand()%offset));
121   mActor.SetProperty( mIndicesOffset[8], Vector2(0.f,-rand()%offset));
122 }
123
124 void BubbleActor::SetStartAndEndPosition( unsigned int index, const Vector4& startAndEndPosition )
125 {
126   mActor.SetProperty( mIndiceStartEndPos[index], startAndEndPosition );
127 }
128
129 void BubbleActor::SetPercentage( unsigned int index, float percentage )
130 {
131   mActor.SetProperty( mIndicesPercentage[index], percentage );
132 }
133
134 void BubbleActor::SetGravity( float gravity )
135 {
136   mActor.SetProperty( mIndexGravity, gravity );
137 }
138
139 void BubbleActor::SetDynamicScale( float scale )
140 {
141   mActor.SetProperty( mIndexDynamicScale, scale );
142 }
143
144 Property BubbleActor::GetPercentageProperty( unsigned int index )
145 {
146   return Property( mActor, mIndicesPercentage[index] );
147 }
148
149 void BubbleActor::ResetProperties()
150 {
151   Vector4 zeroVector;
152   for( unsigned int i=0; i<mNumBubble; i++ )
153   {
154     SetPercentage( i, 0.f);
155     SetStartAndEndPosition( i, zeroVector );
156   }
157 }
158
159 } // namespace Internal
160
161 } // namespace Toolkit
162
163 } // namespace Dali