diff --git a/com.samsung.dali-demo.xml b/com.samsung.dali-demo.xml index 70a5541..8c296a6 100644 --- a/com.samsung.dali-demo.xml +++ b/com.samsung.dali-demo.xml @@ -34,22 +34,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -94,9 +94,9 @@ - - - + + + @@ -121,6 +121,9 @@ + + + diff --git a/demo/dali-demo.cpp b/demo/dali-demo.cpp index 5ca4f65..1f1b3db 100644 --- a/demo/dali-demo.cpp +++ b/demo/dali-demo.cpp @@ -69,6 +69,7 @@ int main(int argc, char **argv) demo.AddExample(Example("line-mesh.example", DALI_DEMO_STR_TITLE_LINE_MESH)); demo.AddExample(Example("gradients.example", DALI_DEMO_STR_TITLE_COLOR_GRADIENT)); demo.AddExample(Example("image-view.example", DALI_DEMO_STR_TITLE_IMAGE_VIEW)); + demo.AddExample(Example("super-blur-bloom.example", DALI_DEMO_STR_TITLE_SUPER_BLUR_BLOOM)); demo.SortAlphabetically( true ); diff --git a/examples/benchmark/benchmark.cpp b/examples/benchmark/benchmark.cpp index 576f404..7b257cf 100644 --- a/examples/benchmark/benchmark.cpp +++ b/examples/benchmark/benchmark.cpp @@ -207,7 +207,7 @@ Geometry& QuadMesh() } bool gUseMesh(false); -bool gUseImageView(false); +bool gUseImageActor(false); bool gNinePatch(false); unsigned int gRowsPerPage(25); unsigned int gColumnsPerPage( 25 ); @@ -243,11 +243,11 @@ Actor CreateMeshActor( unsigned int index) } // Test application to compare performance between ImageActor and ImageView -// By default, the application consist of 10 pages of 25x25 ImageActors, this can be modified using the following command line arguments: +// By default, the application consist of 10 pages of 25x25 Image views, this can be modified using the following command line arguments: // -r NumberOfRows (Modifies the number of rows per page) // -c NumberOfColumns (Modifies the number of columns per page) // -p NumberOfPages (Modifies the nimber of pages ) -// --use-imageview ( Use ImageView instead of ImageActor ) +// --use-image-actor ( Use ImageActor instead of ImageView ) // --use-mesh ( Use new renderer API (as ImageView) but shares renderers between actors when possible ) // --nine-patch ( Use nine patch images ) @@ -290,13 +290,13 @@ public: { CreateMeshActors(); } - else if( gUseImageView ) + else if( gUseImageActor ) { - CreateImageViews(); + CreateImageActors(); } else { - CreateImageActors(); + CreateImageViews(); } ShowAnimation(); @@ -406,15 +406,7 @@ public: duration = durationPerActor; delay = delayBetweenActors * count; } - if( gUseImageView ) - { - mImageView[count].SetPosition( initialPosition ); - mImageView[count].SetSize( Vector3(0.0f,0.0f,0.0f) ); - mImageView[count].SetOrientation( Quaternion( Radian(0.0f),Vector3::XAXIS)); - mShow.AnimateTo( Property( mImageView[count], Actor::Property::POSITION), Vector3(xpos+mSize.x*0.5f, ypos+mSize.y*0.5f, 0.0f), AlphaFunction::EASE_OUT_BACK, TimePeriod( delay, duration )); - mShow.AnimateTo( Property( mImageView[count], Actor::Property::SIZE), mSize, AlphaFunction::EASE_OUT_BACK, TimePeriod( delay, duration )); - } - else + if( gUseImageActor || gUseMesh ) { mActor[count].SetPosition( initialPosition ); mActor[count].SetSize( Vector3(0.0f,0.0f,0.0f) ); @@ -422,6 +414,14 @@ public: mShow.AnimateTo( Property( mActor[count], Actor::Property::POSITION), Vector3(xpos+mSize.x*0.5f, ypos+mSize.y*0.5f, 0.0f), AlphaFunction::EASE_OUT_BACK, TimePeriod( delay, duration )); mShow.AnimateTo( Property( mActor[count], Actor::Property::SIZE), mSize, AlphaFunction::EASE_OUT_BACK, TimePeriod( delay, duration )); } + else + { + mImageView[count].SetPosition( initialPosition ); + mImageView[count].SetSize( Vector3(0.0f,0.0f,0.0f) ); + mImageView[count].SetOrientation( Quaternion( Radian(0.0f),Vector3::XAXIS)); + mShow.AnimateTo( Property( mImageView[count], Actor::Property::POSITION), Vector3(xpos+mSize.x*0.5f, ypos+mSize.y*0.5f, 0.0f), AlphaFunction::EASE_OUT_BACK, TimePeriod( delay, duration )); + mShow.AnimateTo( Property( mImageView[count], Actor::Property::SIZE), mSize, AlphaFunction::EASE_OUT_BACK, TimePeriod( delay, duration )); + } ++count; } } @@ -438,20 +438,20 @@ public: size_t actorCount( mRowsPerPage*mColumnsPerPage*mPageCount); for( size_t i(0); i +#include +#include +#include +#include "shared/view.h" + +using namespace Dali; + +namespace +{ +const char * const TOOLBAR_IMAGE( DALI_IMAGE_DIR "top-bar.png" ); +const char * const TITLE_SUPER_BLUR( "Super Blur" ); +const char * const TITLE_BLOOM( "Bloom" ); +const char * const CHANGE_BACKGROUND_ICON( DALI_IMAGE_DIR "icon-change.png" ); +const char * const CHANGE_BACKGROUND_ICON_SELECTED( DALI_IMAGE_DIR "icon-change-selected.png" ); +const char * const CHANGE_BLUR_ICON( DALI_IMAGE_DIR "icon-replace.png" ); +const char * const CHANGE_BLUR_ICON_SELECTED( DALI_IMAGE_DIR "icon-replace-selected.png" ); + +const char* BACKGROUND_IMAGES[]= +{ + DALI_IMAGE_DIR "background-1.jpg", + DALI_IMAGE_DIR "background-2.jpg", + DALI_IMAGE_DIR "background-3.jpg", + DALI_IMAGE_DIR "background-4.jpg", + DALI_IMAGE_DIR "background-5.jpg", + DALI_IMAGE_DIR "background-magnifier.jpg", +}; +const unsigned int NUM_BACKGROUND_IMAGES( sizeof( BACKGROUND_IMAGES ) / sizeof( BACKGROUND_IMAGES[0] ) ); +} + +/** + * @brief Load an image, scaled-down to no more than the stage dimensions. + * + * Uses image scaling mode FittingMode::SCALE_TO_FILL to resize the image at + * load time to cover the entire stage with pixels with no borders, + * and filter mode BOX_THEN_LINEAR to sample the image with + * maximum quality. + */ +ResourceImage LoadStageFillingImage( const char * const imagePath ) +{ + Size stageSize = Stage::GetCurrent().GetSize(); + return ResourceImage::New( imagePath, Dali::ImageDimensions( stageSize.x, stageSize.y ), Dali::FittingMode::SCALE_TO_FILL, Dali::SamplingMode::BOX_THEN_LINEAR ); +} + +class BlurExample : public ConnectionTracker +{ +public: + BlurExample(Application &app) + : mApp(app), + mImageIndex( 0 ), + mIsBlurring( false ) + { + // Connect to the Application's Init signal + app.InitSignal().Connect(this, &BlurExample::Create); + } + + ~BlurExample() + { + } +private: + // The Init signal is received once (only) during the Application lifetime + void Create(Application& app) + { + Stage stage = Stage::GetCurrent(); + Vector2 stageSize = stage.GetSize(); + + stage.KeyEventSignal().Connect(this, &BlurExample::OnKeyEvent); + + // Creates a default view with a default tool bar. + // The view is added to the stage. + Layer content = DemoHelper::CreateView( app, + mBackground, + mToolBar, + "", + TOOLBAR_IMAGE, + "" ); + + // Add a button to change background. (right of toolbar) + Toolkit::PushButton changeBackgroundButton = Toolkit::PushButton::New(); + changeBackgroundButton.SetUnselectedImage( CHANGE_BACKGROUND_ICON ); + changeBackgroundButton.SetSelectedImage( CHANGE_BACKGROUND_ICON_SELECTED ); + changeBackgroundButton.ClickedSignal().Connect( this, &BlurExample::OnChangeBackgroundIconClicked ); + mToolBar.AddControl( changeBackgroundButton, + DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, + Toolkit::Alignment::HorizontalRight, + DemoHelper::DEFAULT_MODE_SWITCH_PADDING ); + + // Add a button to change the blur view. (left of toolbar) + Toolkit::PushButton changeBlurButton = Toolkit::PushButton::New(); + changeBlurButton.SetUnselectedImage( CHANGE_BLUR_ICON ); + changeBlurButton.SetSelectedImage( CHANGE_BLUR_ICON_SELECTED ); + changeBlurButton.ClickedSignal().Connect( this, &BlurExample::OnChangeBlurIconClicked ); + mToolBar.AddControl( changeBlurButton, + DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, + Toolkit::Alignment::HorizontalLeft, + DemoHelper::DEFAULT_MODE_SWITCH_PADDING ); + + mSuperBlurView = Toolkit::SuperBlurView::New( 5 ); + mSuperBlurView.SetSize( stageSize ); + mSuperBlurView.SetParentOrigin( ParentOrigin::CENTER ); + mSuperBlurView.SetAnchorPoint( AnchorPoint::CENTER ); + mSuperBlurView.BlurFinishedSignal().Connect(this, &BlurExample::OnBlurFinished); + mCurrentImage = LoadStageFillingImage( BACKGROUND_IMAGES[mImageIndex] ); + mSuperBlurView.SetImage( mCurrentImage ); + mBackground.Add( mSuperBlurView ); + mIsBlurring = true; + SetTitle( TITLE_SUPER_BLUR ); + + mBloomView = Toolkit::BloomView::New(); + mBloomView.SetParentOrigin(ParentOrigin::CENTER); + mBloomView.SetSize(stageSize); + mBloomActor = Toolkit::ImageView::New(mCurrentImage); + mBloomActor.SetParentOrigin( ParentOrigin::CENTER ); + mBloomView.Add( mBloomActor ); + + // Connect the callback to the touch signal on the background + mSuperBlurView.TouchedSignal().Connect( this, &BlurExample::OnTouch ); + mBloomView.TouchedSignal().Connect( this, &BlurExample::OnTouch ); + } + + // Callback function of the touch signal on the background + bool OnTouch(Dali::Actor actor, const Dali::TouchEvent& event) + { + const TouchPoint &point = event.GetPoint(0); + switch(point.state) + { + case TouchPoint::Down: + { + if( mAnimation ) + { + mAnimation.Clear(); + } + + mAnimation = Animation::New( 2.f ); + if( mSuperBlurView.OnStage() ) + { + mAnimation.AnimateTo( Property( mSuperBlurView, mSuperBlurView.GetBlurStrengthPropertyIndex() ), 1.f ); + } + else + { + mAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBloomIntensityPropertyIndex() ), 3.f ); + } + mAnimation.Play(); + break; + } + case TouchPoint::Up: + case TouchPoint::Leave: + case TouchPoint::Interrupted: + { + if( mAnimation ) + { + mAnimation.Clear(); + } + + mAnimation = Animation::New( 2.f ); + if( mSuperBlurView.OnStage() ) + { + mAnimation.AnimateTo( Property( mSuperBlurView, mSuperBlurView.GetBlurStrengthPropertyIndex() ), 0.f ); + } + else + { + mAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBloomIntensityPropertyIndex() ), 0.f ); + } + mAnimation.Play(); + break; + } + case TouchPoint::Motion: + case TouchPoint::Stationary: + case TouchPoint::Last: + default: + { + break; + } + } + return true; + } + + /** + * Main key event handler + */ + void OnKeyEvent(const KeyEvent& event) + { + if(event.state == KeyEvent::Down) + { + if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) ) + { + mApp.Quit(); + } + } + } + + bool OnChangeBackgroundIconClicked( Toolkit::Button button ) + { + if( mIsBlurring ) + { + return true; + } + + if( mAnimation ) + { + mAnimation.Clear(); + } + + mImageIndex = (mImageIndex+1u)%NUM_BACKGROUND_IMAGES; + mCurrentImage = LoadStageFillingImage( BACKGROUND_IMAGES[mImageIndex] ); + + if( mSuperBlurView.OnStage() ) + { + mIsBlurring = true; + + mSuperBlurView.SetBlurStrength( 0.f ); + mSuperBlurView.SetImage( mCurrentImage ); + } + else + { + mBloomView.SetProperty( mBloomView.GetBloomIntensityPropertyIndex(), 0.f ); + mBloomActor.SetImage( mCurrentImage ); + } + + return true; + } + + bool OnChangeBlurIconClicked( Toolkit::Button button ) + { + if( mSuperBlurView.OnStage() ) + { + SetTitle( TITLE_BLOOM ); + mBackground.Remove( mSuperBlurView ); + + mBloomActor.SetImage( mCurrentImage ); + mBloomView.SetProperty( mBloomView.GetBloomIntensityPropertyIndex(), 0.f ); + mBackground.Add( mBloomView ); + mBloomView.Activate(); + + } + else + { + SetTitle( TITLE_SUPER_BLUR ); + mBackground.Remove( mBloomView ); + mBloomView.Deactivate(); + + mBackground.Add( mSuperBlurView ); + mSuperBlurView.SetBlurStrength( 0.f ); + mSuperBlurView.SetImage( mCurrentImage ); + mIsBlurring = true; + } + + return true; + } + + void OnBlurFinished( Toolkit::SuperBlurView blurView ) + { + mIsBlurring = false; + } + + /** + * Sets/Updates the title of the View + * @param[in] title The new title for the view. + */ + void SetTitle(const std::string& title) + { + if(!mTitleActor) + { + mTitleActor = DemoHelper::CreateToolBarLabel( title ); + // Add title to the tool bar. + mToolBar.AddControl( mTitleActor, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarTitlePercentage, Toolkit::Alignment::HorizontalCenter ); + } + + mTitleActor.SetProperty( Toolkit::TextLabel::Property::TEXT, title ); + } + +private: + + Application& mApp; + Toolkit::ToolBar mToolBar; + Toolkit::TextLabel mTitleActor; ///< The Toolbar's Title. + Toolkit::Control mBackground; + Toolkit::SuperBlurView mSuperBlurView; + Toolkit::BloomView mBloomView; + Animation mAnimation; + Toolkit::ImageView mBloomActor; + Image mCurrentImage; + unsigned int mImageIndex; + bool mIsBlurring; +}; + +/*****************************************************************************/ + +static void +RunTest(Application& app) +{ + BlurExample theApp(app); + app.MainLoop(); +} + +/*****************************************************************************/ + +int +main(int argc, char **argv) +{ + Application app = Application::New(&argc, &argv, DALI_DEMO_THEME_PATH); + + RunTest(app); + + return 0; +} diff --git a/packaging/com.samsung.dali-demo.spec b/packaging/com.samsung.dali-demo.spec index ae466e8..1eb3f13 100755 --- a/packaging/com.samsung.dali-demo.spec +++ b/packaging/com.samsung.dali-demo.spec @@ -2,7 +2,7 @@ Name: com.samsung.dali-demo Summary: The OpenGLES Canvas Core Demo -Version: 1.1.14 +Version: 1.1.15 Release: 1 Group: System/Libraries License: Apache-2.0 diff --git a/resources/scripts/shader-effect-ripple.json b/resources/scripts/shader-effect-ripple.json index b47012c..e32fc1e 100644 --- a/resources/scripts/shader-effect-ripple.json +++ b/resources/scripts/shader-effect-ripple.json @@ -51,9 +51,9 @@ "Ripple2D": { "program": { "vertexPrefix": "", - "vertex": "void main(void)\n{\n gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);\n vTexCoord = aTexCoord;\n}\n\n", + "vertex": "void main(void)\n{\n gl_Position = uMvpMatrix * vec4(aPosition*uSize.xy, 0.0, 1.0);\n vTexCoord = mix( uTextureRect.xy, uTextureRect.zw, aPosition + vec2(0.5) );\n}\n\n", "fragmentPrefix": "", - "fragment": "precision mediump float;\nuniform float uAmplitude; // 0.02; (< 1)\nuniform float uTime;\nvoid main()\n{\n highp vec2 textureSize = sTextureRect.zw - sTextureRect.xy;\n highp vec2 pos = -1.0 + 2.0 * vTexCoord.st/textureSize;\n highp float len = length(pos);\n highp vec2 texCoord = vTexCoord.st/textureSize + pos/len * sin( len * 12.0 - uTime * 4.0 ) * uAmplitude; \n gl_FragColor = texture2D(sTexture, texCoord) * uColor;\n}\n\n\n", + "fragment": "precision mediump float;\nuniform float uAmplitude; // 0.02; (< 1)\nuniform float uTime;\nvoid main()\n{\n highp vec2 textureSize = uTextureRect.zw - uTextureRect.xy;\n highp vec2 pos = -1.0 + 2.0 * vTexCoord.st/textureSize;\n highp float len = length(pos);\n highp vec2 texCoord = vTexCoord.st/textureSize + pos/len * sin( len * 12.0 - uTime * 4.0 ) * uAmplitude; \n gl_FragColor = texture2D(sTexture, texCoord) * uColor;\n}\n\n\n", "geometryType": "GEOMETRY_TYPE_IMAGE" }, "geometryHints": "HINT_NONE", diff --git a/shared/dali-demo-strings.h b/shared/dali-demo-strings.h index 0e8f240..0f0dea9 100644 --- a/shared/dali-demo-strings.h +++ b/shared/dali-demo-strings.h @@ -61,6 +61,7 @@ extern "C" #define DALI_DEMO_STR_TITLE_TEXTURED_MESH dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TEXTURED_MESH") #define DALI_DEMO_STR_TITLE_LINE_MESH dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_LINE_MESH") #define DALI_DEMO_STR_TITLE_COLOR_GRADIENT dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_COLOR_GRADIENT") +#define DALI_DEMO_STR_TITLE_SUPER_BLUR_BLOOM dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_SUPER_BLUR_BLOOM") #else // !INTERNATIONALIZATION_ENABLED @@ -97,6 +98,7 @@ extern "C" #define DALI_DEMO_STR_TITLE_LINE_MESH "Mesh Line" #define DALI_DEMO_STR_TITLE_COLOR_GRADIENT "Color Gradient" #define DALI_DEMO_STR_TITLE_IMAGE_VIEW "Image View" +#define DALI_DEMO_STR_TITLE_SUPER_BLUR_BLOOM "Super Blur and Bloom" #endif