2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <dali-toolkit/dali-toolkit.h>
19 #include <dali-toolkit/devel-api/controls/bloom-view/bloom-view.h>
20 #include <dali/dali.h>
23 using namespace Dali::Toolkit;
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");
30 const Rect<int> UI_PIXEL_AREA(0, 0, 720, 1280);
32 const Rect<int> PANEL1_PIXEL_AREA(0, 0, 720, 39);
33 const Rect<int> PANEL2_PIXEL_AREA(0, 39, 720, 100);
35 const unsigned int NUM_MOVEMENT_ANIMATIONS = 2;
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;
44 // These values depend on the button background image
45 const Vector4 BUTTON_IMAGE_BORDER(16.0f, 16.0f, 16.0f, 20.0f);
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);
53 * This example demonstrates a bloom effect.
55 class BloomExample : public ConnectionTracker
58 BloomExample(Application& application)
59 : mApplication(application),
62 application.InitSignal().Connect(this, &BloomExample::Create);
70 void Create(Application& application)
72 Window window = application.GetWindow();
73 Vector2 windowSize = window.GetSize();
74 Vector2 viewSize(windowSize);
76 mRootActor = Actor::New();
77 mRootActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
78 mRootActor.SetProperty(Actor::Property::SIZE, windowSize);
79 window.Add(mRootActor);
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();
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);
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);
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);
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);
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);
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);
122 PulseBloomIntensity();
124 // Respond to key events
125 window.KeyEventSignal().Connect(this, &BloomExample::OnKeyEvent);
128 void OnKeyEvent(const KeyEvent& event)
130 if(event.GetState() == KeyEvent::DOWN)
132 if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
139 void AnimateBloomView()
141 if(mRotationAnimation)
143 mRotationAnimation.Stop();
147 mResizeAnimation.Stop();
149 if(mTranslationAnimation)
151 mTranslationAnimation.Stop();
155 mBlurAnimation.Stop();
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();
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();
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();
183 void PulseBloomIntensity()
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();
193 Application& mApplication;
197 Actor mObjectRootActor;
199 unsigned int mCurrentAnimation;
200 Animation mRotationAnimation;
201 Animation mResizeAnimation;
202 Animation mTranslationAnimation;
203 Animation mBlurAnimation;
204 Animation mPulseBloomIntensityAnim;
206 BloomView mBloomView;
209 int DALI_EXPORT_API main(int argc, char** argv)
211 Application application = Application::New(&argc, &argv);
213 BloomExample theApp(application);
214 application.MainLoop();