Updated demos to use DALi clang-format
[platform/core/uifw/dali-demo.git] / examples / bloom-view / bloom-view-example.cpp
1 /*
2  * Copyright (c) 2020 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 #include <dali-toolkit/dali-toolkit.h>
19 #include <dali-toolkit/devel-api/controls/bloom-view/bloom-view.h>
20 #include <dali/dali.h>
21
22 using namespace Dali;
23 using namespace Dali::Toolkit;
24
25 namespace
26 {
27 const char* BACKGROUND_IMAGE_PATH(DEMO_IMAGE_DIR "desktop_background_1440x2560.png");
28 const char* UI_DIFFUSE_IMAGE(DEMO_IMAGE_DIR "UI-Leather-DIFF.png");
29
30 const Rect<int> UI_PIXEL_AREA(0, 0, 720, 1280);
31
32 const Rect<int> PANEL1_PIXEL_AREA(0, 0, 720, 39);
33 const Rect<int> PANEL2_PIXEL_AREA(0, 39, 720, 100);
34
35 const unsigned int NUM_MOVEMENT_ANIMATIONS = 2;
36
37 // for animating bloom intensity on tap gesture
38 const float PULSE_BLOOM_INCREASE_ANIM_TIME = 1.175;
39 const float PULSE_BLOOM_DECREASE_ANIM_TIME = 2.4;
40 const float PULSE_BLOOM_TOTAL_ANIM_TIME    = PULSE_BLOOM_INCREASE_ANIM_TIME + PULSE_BLOOM_DECREASE_ANIM_TIME;
41 const float PULSE_BLOOM_INTENSITY_DEFAULT  = 1.0f;
42 const float PULSE_BLOOM_INTENSITY_INCREASE = 3.0f;
43
44 // These values depend on the button background image
45 const Vector4 BUTTON_IMAGE_BORDER(16.0f, 16.0f, 16.0f, 20.0f);
46
47 const float   UI_MARGIN = 4.0f; ///< Screen Margin for placement of UI buttons
48 const Vector3 BUTTON_SIZE_CONSTRAINT(0.24f, 0.09f, 1.0f);
49
50 } // namespace
51
52 /**
53  * This example demonstrates a bloom effect.
54  */
55 class BloomExample : public ConnectionTracker
56 {
57 public:
58   BloomExample(Application& application)
59   : mApplication(application),
60     mCurrentAnimation(0)
61   {
62     application.InitSignal().Connect(this, &BloomExample::Create);
63   }
64
65   ~BloomExample()
66   {
67   }
68
69 public:
70   void Create(Application& application)
71   {
72     Window  window     = application.GetWindow();
73     Vector2 windowSize = window.GetSize();
74     Vector2 viewSize(windowSize);
75
76     mRootActor = Actor::New();
77     mRootActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
78     mRootActor.SetProperty(Actor::Property::SIZE, windowSize);
79     window.Add(mRootActor);
80
81     // Create the object that will perform the blooming work
82     mBloomView = Dali::Toolkit::BloomView::New();
83     mBloomView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
84     mBloomView.SetProperty(Actor::Property::SIZE, viewSize);
85     mRootActor.Add(mBloomView);
86     mBloomView.Activate();
87
88     Layer backgroundLayer = Layer::New();
89     backgroundLayer.SetProperty(Actor::Property::SIZE, viewSize);
90     backgroundLayer.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
91     mBloomView.Add(backgroundLayer);
92
93     // Create the background image
94     ImageView backgroundImage = ImageView::New(BACKGROUND_IMAGE_PATH);
95     backgroundImage.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
96     backgroundImage.SetProperty(Actor::Property::SIZE, viewSize);
97     backgroundLayer.Add(backgroundImage);
98
99     Layer foregroundLayer = Layer::New();
100     foregroundLayer.SetProperty(Actor::Property::SIZE, viewSize);
101     foregroundLayer.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
102     mBloomView.Add(foregroundLayer);
103
104     // Create visible actors
105     mObjectRootActor = Actor::New();
106     mObjectRootActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
107     mObjectRootActor.SetProperty(Actor::Property::SIZE, viewSize);
108     foregroundLayer.Add(mObjectRootActor);
109
110     ImageView imageView = ImageView::New(UI_DIFFUSE_IMAGE);
111     imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
112     imageView.SetProperty(Actor::Property::SIZE, viewSize);
113     mObjectRootActor.Add(imageView);
114
115     imageView = ImageView::New(UI_DIFFUSE_IMAGE);
116     imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
117     imageView.SetProperty(Actor::Property::SIZE, windowSize * 0.5f);
118     imageView.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 100.0f));
119     mObjectRootActor.Add(imageView);
120
121     AnimateBloomView();
122     PulseBloomIntensity();
123
124     // Respond to key events
125     window.KeyEventSignal().Connect(this, &BloomExample::OnKeyEvent);
126   }
127
128   void OnKeyEvent(const KeyEvent& event)
129   {
130     if(event.GetState() == KeyEvent::DOWN)
131     {
132       if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
133       {
134         mApplication.Quit();
135       }
136     }
137   }
138
139   void AnimateBloomView()
140   {
141     if(mRotationAnimation)
142     {
143       mRotationAnimation.Stop();
144     }
145     if(mResizeAnimation)
146     {
147       mResizeAnimation.Stop();
148     }
149     if(mTranslationAnimation)
150     {
151       mTranslationAnimation.Stop();
152     }
153     if(mBlurAnimation)
154     {
155       mBlurAnimation.Stop();
156     }
157
158     // ROTATE
159     mRotationAnimation = Animation::New(5.0f);
160     mRotationAnimation.AnimateBy(Property(mObjectRootActor, Actor::Property::ORIENTATION), Quaternion(Radian(Degree(360)), Vector3::YAXIS), AlphaFunction::EASE_IN_OUT);
161     mRotationAnimation.SetEndAction(Animation::DISCARD);
162     mRotationAnimation.SetLooping(true);
163     mRotationAnimation.Play();
164
165     // TRANSLATE
166     mTranslationAnimation = Animation::New(7.5f);
167     mTranslationAnimation.AnimateBy(Property(mObjectRootActor, Actor::Property::POSITION), Vector3(100.0f, 0.0f, 0.0f), AlphaFunction::BOUNCE, TimePeriod(2.5f));
168     mTranslationAnimation.AnimateBy(Property(mObjectRootActor, Actor::Property::POSITION), Vector3(300.0f, 0.0f, 0.0f), AlphaFunction::BOUNCE, TimePeriod(2.5f, 2.5f));
169     mTranslationAnimation.AnimateBy(Property(mObjectRootActor, Actor::Property::POSITION), Vector3(0.0f, 0.0f, 0.0f), AlphaFunction::BOUNCE, TimePeriod(5.0f, 2.5f));
170     mTranslationAnimation.SetEndAction(Animation::DISCARD);
171     mTranslationAnimation.SetLooping(true);
172     //mTranslationAnimation.Play();
173
174     // BLUR
175     mBlurAnimation = Animation::New(4.0f);
176     mBlurAnimation.AnimateTo(Property(mBloomView, mBloomView.GetBlurStrengthPropertyIndex()), 0.0f, AlphaFunction::LINEAR, TimePeriod(0.0f, 0.5f));
177     mBlurAnimation.AnimateTo(Property(mBloomView, mBloomView.GetBlurStrengthPropertyIndex()), 1.0f, AlphaFunction::LINEAR, TimePeriod(2.0f, 0.5f));
178     mBlurAnimation.SetEndAction(Animation::DISCARD);
179     mBlurAnimation.SetLooping(true);
180     mBlurAnimation.Play();
181   }
182
183   void PulseBloomIntensity()
184   {
185     mPulseBloomIntensityAnim = Animation::New(2.5f);
186     mPulseBloomIntensityAnim.AnimateTo(Property(mBloomView, mBloomView.GetBloomIntensityPropertyIndex()), 3.0f, AlphaFunction::BOUNCE, TimePeriod(2.5f));
187     mPulseBloomIntensityAnim.SetEndAction(Animation::DISCARD);
188     mPulseBloomIntensityAnim.SetLooping(true);
189     mPulseBloomIntensityAnim.Play();
190   }
191
192 private:
193   Application& mApplication;
194
195   Actor mRootActor;
196
197   Actor mObjectRootActor;
198
199   unsigned int mCurrentAnimation;
200   Animation    mRotationAnimation;
201   Animation    mResizeAnimation;
202   Animation    mTranslationAnimation;
203   Animation    mBlurAnimation;
204   Animation    mPulseBloomIntensityAnim;
205
206   BloomView mBloomView;
207 };
208
209 int DALI_EXPORT_API main(int argc, char** argv)
210 {
211   Application application = Application::New(&argc, &argv);
212
213   BloomExample theApp(application);
214   application.MainLoop();
215
216   return 0;
217 }