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