/* * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include using namespace Dali; using namespace Dali::Toolkit; namespace { const char* BACKGROUND_IMAGE_PATH( DEMO_IMAGE_DIR "desktop_background_1440x2560.png" ); const char* UI_DIFFUSE_IMAGE( DEMO_IMAGE_DIR "UI-Leather-DIFF.png" ); const Rect UI_PIXEL_AREA( 0, 0, 720, 1280 ); const Rect PANEL1_PIXEL_AREA( 0, 0, 720, 39 ); const Rect PANEL2_PIXEL_AREA( 0, 39, 720, 100 ); const unsigned int NUM_MOVEMENT_ANIMATIONS = 2; // for animating bloom intensity on tap gesture const float PULSE_BLOOM_INCREASE_ANIM_TIME = 1.175; const float PULSE_BLOOM_DECREASE_ANIM_TIME = 2.4; const float PULSE_BLOOM_TOTAL_ANIM_TIME = PULSE_BLOOM_INCREASE_ANIM_TIME + PULSE_BLOOM_DECREASE_ANIM_TIME; const float PULSE_BLOOM_INTENSITY_DEFAULT = 1.0f; const float PULSE_BLOOM_INTENSITY_INCREASE = 3.0f; // These values depend on the button background image const Vector4 BUTTON_IMAGE_BORDER(16.0f, 16.0f, 16.0f, 20.0f); const float UI_MARGIN = 4.0f; ///< Screen Margin for placement of UI buttons const Vector3 BUTTON_SIZE_CONSTRAINT( 0.24f, 0.09f, 1.0f ); } // namespace /** * This example demonstrates a bloom effect. */ class BloomExample : public ConnectionTracker { public: BloomExample( Application &application ) : mApplication(application), mCurrentAnimation(0) { application.InitSignal().Connect( this, &BloomExample::Create ); } ~BloomExample() { } public: void Create( Application& application ) { Window window = application.GetWindow(); Vector2 windowSize = window.GetSize(); Vector2 viewSize( windowSize ); mRootActor = Actor::New(); mRootActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mRootActor.SetProperty( Actor::Property::SIZE, windowSize ); window.Add( mRootActor ); // Create the object that will perform the blooming work mBloomView = Dali::Toolkit::BloomView::New(); mBloomView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mBloomView.SetProperty( Actor::Property::SIZE, viewSize ); mRootActor.Add( mBloomView ); mBloomView.Activate(); Layer backgroundLayer = Layer::New(); backgroundLayer.SetProperty( Actor::Property::SIZE, viewSize ); backgroundLayer.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mBloomView.Add( backgroundLayer ); // Create the background image ImageView backgroundImage = ImageView::New( BACKGROUND_IMAGE_PATH ); backgroundImage.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); backgroundImage.SetProperty( Actor::Property::SIZE, viewSize ); backgroundLayer.Add( backgroundImage ); Layer foregroundLayer = Layer::New(); foregroundLayer.SetProperty( Actor::Property::SIZE, viewSize ); foregroundLayer.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mBloomView.Add( foregroundLayer ); // Create visible actors mObjectRootActor = Actor::New(); mObjectRootActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mObjectRootActor.SetProperty( Actor::Property::SIZE, viewSize ); foregroundLayer.Add( mObjectRootActor ); ImageView imageView = ImageView::New( UI_DIFFUSE_IMAGE ); imageView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); imageView.SetProperty( Actor::Property::SIZE, viewSize ); mObjectRootActor.Add( imageView ); imageView = ImageView::New( UI_DIFFUSE_IMAGE ); imageView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); imageView.SetProperty( Actor::Property::SIZE, windowSize * 0.5f ); imageView.SetProperty( Actor::Property::POSITION, Vector3( 0.0f, 0.0f, 100.0f ) ); mObjectRootActor.Add( imageView ); AnimateBloomView(); PulseBloomIntensity(); // Respond to key events window.KeyEventSignal().Connect( this, &BloomExample::OnKeyEvent ); } void OnKeyEvent( const KeyEvent& event ) { if( event.GetState() == KeyEvent::Down ) { if ( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) ) { mApplication.Quit(); } } } void AnimateBloomView() { if(mRotationAnimation) { mRotationAnimation.Stop(); } if(mResizeAnimation) { mResizeAnimation.Stop(); } if(mTranslationAnimation) { mTranslationAnimation.Stop(); } if(mBlurAnimation) { mBlurAnimation.Stop(); } // ROTATE mRotationAnimation = Animation::New( 5.0f ); mRotationAnimation.AnimateBy( Property( mObjectRootActor, Actor::Property::ORIENTATION ), Quaternion( Radian( Degree( 360 )), Vector3::YAXIS ), AlphaFunction::EASE_IN_OUT ); mRotationAnimation.SetEndAction( Animation::DISCARD ); mRotationAnimation.SetLooping( true ); mRotationAnimation.Play(); // TRANSLATE mTranslationAnimation = Animation::New( 7.5f ); mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::Property::POSITION), Vector3(100.0f, 0.0f, 0.0f), AlphaFunction::BOUNCE, TimePeriod(2.5f) ); mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::Property::POSITION), Vector3(300.0f, 0.0f, 0.0f), AlphaFunction::BOUNCE, TimePeriod(2.5f, 2.5f) ); mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::Property::POSITION), Vector3(0.0f, 0.0f, 0.0f), AlphaFunction::BOUNCE, TimePeriod(5.0f, 2.5f) ); mTranslationAnimation.SetEndAction( Animation::DISCARD ); mTranslationAnimation.SetLooping( true ); //mTranslationAnimation.Play(); // BLUR mBlurAnimation = Animation::New( 4.0f ); mBlurAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBlurStrengthPropertyIndex() ), 0.0f, AlphaFunction::LINEAR, TimePeriod(0.0f, 0.5f) ); mBlurAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBlurStrengthPropertyIndex() ), 1.0f, AlphaFunction::LINEAR, TimePeriod(2.0f, 0.5f) ); mBlurAnimation.SetEndAction( Animation::DISCARD ); mBlurAnimation.SetLooping( true ); mBlurAnimation.Play(); } void PulseBloomIntensity() { mPulseBloomIntensityAnim = Animation::New( 2.5f ); mPulseBloomIntensityAnim.AnimateTo( Property(mBloomView, mBloomView.GetBloomIntensityPropertyIndex()), 3.0f, AlphaFunction::BOUNCE, TimePeriod(2.5f) ); mPulseBloomIntensityAnim.SetEndAction( Animation::DISCARD ); mPulseBloomIntensityAnim.SetLooping( true ); mPulseBloomIntensityAnim.Play(); } private: Application& mApplication; Actor mRootActor; Actor mObjectRootActor; unsigned int mCurrentAnimation; Animation mRotationAnimation; Animation mResizeAnimation; Animation mTranslationAnimation; Animation mBlurAnimation; Animation mPulseBloomIntensityAnim; BloomView mBloomView; }; int DALI_EXPORT_API main(int argc, char **argv) { Application application = Application::New( &argc, &argv ); BloomExample theApp( application ); application.MainLoop(); return 0; }