X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fgaussian-blur-view%2Fgaussian-blur-view-impl.cpp;h=233a79c3877a5c4e93d42d91f9dfa1122565db13;hp=89851d40e440b439868c1ad34c2b8932ea06a0ad;hb=7d7006623dc5520280ceebd56c102aa76f121c3d;hpb=41278d3fb755de3cb89edf6d80603b18562b4e01 diff --git a/dali-toolkit/internal/controls/gaussian-blur-view/gaussian-blur-view-impl.cpp b/dali-toolkit/internal/controls/gaussian-blur-view/gaussian-blur-view-impl.cpp index 89851d4..233a79c 100644 --- a/dali-toolkit/internal/controls/gaussian-blur-view/gaussian-blur-view-impl.cpp +++ b/dali-toolkit/internal/controls/gaussian-blur-view/gaussian-blur-view-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 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. @@ -24,14 +24,18 @@ #include #include #include -#include #include #include +#include +#include +#include +#include #include #include // INTERNAL INCLUDES -#include +#include +#include // TODO: // pixel format / size - set from JSON @@ -55,13 +59,13 @@ // 2 modes: // 1st mode, this control has a tree of actors (use Add() to add children) that are rendered and blurred. // mRenderChildrenTask renders children to FB mRenderTargetForRenderingChildren -// mHorizBlurTask renders mImageActorHorizBlur Actor showing FB mRenderTargetForRenderingChildren into FB mRenderTarget2 -// mVertBlurTask renders mImageActorVertBlur Actor showing FB mRenderTarget2 into FB mRenderTarget1 -// mCompositeTask renders mImageActorComposite Actor showing FB mRenderTarget1 into FB mRenderTargetForRenderingChildren +// mHorizBlurTask renders mHorizBlurActor Actor showing FB mRenderTargetForRenderingChildren into FB mRenderTarget2 +// mVertBlurTask renders mVertBlurActor Actor showing FB mRenderTarget2 into FB mRenderTarget1 +// mCompositeTask renders mCompositingActor Actor showing FB mRenderTarget1 into FB mRenderTargetForRenderingChildren // // 2nd mode, an image is blurred and rendered to a supplied target framebuffer -// mHorizBlurTask renders mImageActorHorizBlur Actor showing mUserInputImage into FB mRenderTarget2 -// mVertBlurTask renders mImageActorVertBlur Actor showing mRenderTarget2 into FB mUserOutputRenderTarget +// mHorizBlurTask renders mHorizBlurActor Actor showing mUserInputImage into FB mRenderTarget2 +// mVertBlurTask renders mVertBlurActor Actor showing mRenderTarget2 into FB mUserOutputRenderTarget // // Only this 2nd mode handles ActivateOnce @@ -97,68 +101,72 @@ const float GAUSSIAN_BLUR_VIEW_DEFAULT_DOWNSAMPLE_HEIGHT_SCALE = 0.5f; const float ARBITRARY_FIELD_OF_VIEW = Math::PI / 4.0f; -const char* const GAUSSIAN_BLUR_FRAGMENT_SOURCE = - "varying mediump vec2 vTexCoord;\n" - "uniform sampler2D sTexture;\n" - "uniform lowp vec4 uColor;\n" - "uniform mediump vec2 uSampleOffsets[NUM_SAMPLES];\n" - "uniform mediump float uSampleWeights[NUM_SAMPLES];\n" - - "void main()\n" - "{\n" - " mediump vec4 col = texture2D(sTexture, vTexCoord + uSampleOffsets[0]) * uSampleWeights[0];\n" - " for (int i=1; i( mImageActorComposite, Actor::Property::COLOR_ALPHA, EqualToConstraint()); + Constraint blurStrengthConstraint = Constraint::New( mCompositingActor, Actor::Property::COLOR_ALPHA, EqualToConstraint()); blurStrengthConstraint.AddSource( Source( self, mBlurStrengthPropertyIndex) ); blurStrengthConstraint.Apply(); - // Create an ImageActor for holding final result, i.e. the blurred image. This will get rendered to screen later, via default / user render task - mTargetActor = Toolkit::ImageView::New(); + // Create an image view for holding final result, i.e. the blurred image. This will get rendered to screen later, via default / user render task + mTargetActor = Actor::New(); mTargetActor.SetParentOrigin(ParentOrigin::CENTER); + renderer = CreateRenderer( BASIC_VERTEX_SOURCE, BASIC_FRAGMENT_SOURCE ); + mTargetActor.AddRenderer( renderer ); ////////////////////////////////////////////////////// // Create cameras for the renders corresponding to the view size @@ -303,43 +314,37 @@ void GaussianBlurView::OnInitialize() mRenderFullSizeCamera.SetInvertYAxis( true ); mRenderFullSizeCamera.SetParentOrigin(ParentOrigin::CENTER); - ////////////////////////////////////////////////////// // Connect to actor tree - mInternalRoot.Add( mImageActorComposite ); + mInternalRoot.Add( mCompositingActor ); mInternalRoot.Add( mTargetActor ); mInternalRoot.Add( mRenderFullSizeCamera ); } - ////////////////////////////////////////////////////// // Create camera for the renders corresponding to the (potentially downsampled) render targets' size mRenderDownsampledCamera = CameraActor::New(); mRenderDownsampledCamera.SetInvertYAxis( true ); mRenderDownsampledCamera.SetParentOrigin(ParentOrigin::CENTER); - ////////////////////////////////////////////////////// // Connect to actor tree Self().Add( mChildrenRoot ); - Self().Add( mInternalRoot ); - mInternalRoot.Add( mImageActorHorizBlur ); - mInternalRoot.Add( mImageActorVertBlur ); + mInternalRoot.Add( mHorizBlurActor ); + mInternalRoot.Add( mVertBlurActor ); mInternalRoot.Add( mRenderDownsampledCamera ); } void GaussianBlurView::OnSizeSet(const Vector3& targetSize) { - Control::OnSizeSet( targetSize ); - mTargetSize = Vector2(targetSize); mChildrenRoot.SetSize(targetSize); if( !mBlurUserImage ) { - mImageActorComposite.SetSize(targetSize); + mCompositingActor.SetSize(targetSize); mTargetActor.SetSize(targetSize); // Children render camera must move when GaussianBlurView object is resized. This is since we cannot change render target size - so we need to remap the child actors' rendering @@ -357,16 +362,18 @@ void GaussianBlurView::OnSizeSet(const Vector3& targetSize) Deactivate(); Activate(); } + + Control::OnSizeSet( targetSize ); } void GaussianBlurView::OnChildAdd( Actor& child ) { - Control::OnChildAdd( child ); - if( child != mChildrenRoot && child != mInternalRoot) { mChildrenRoot.Add( child ); } + + Control::OnChildAdd( child ); } void GaussianBlurView::OnChildRemove( Actor& child ) @@ -410,30 +417,36 @@ void GaussianBlurView::AllocateResources() mRenderFullSizeCamera.SetPosition(0.0f, 0.0f, mTargetSize.height * cameraPosConstraintScale); // create offscreen buffer of new size to render our child actors to - mRenderTargetForRenderingChildren = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat ); + mRenderTargetForRenderingChildren = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE ); + Texture texture = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) ); + mRenderTargetForRenderingChildren.AttachColorTexture( texture ); - // Set ImageActor for performing a horizontal blur on the texture - mImageActorHorizBlur.SetImage( mRenderTargetForRenderingChildren ); + // Set actor for performing a horizontal blur + SetRendererTexture( mHorizBlurActor.GetRendererAt(0), mRenderTargetForRenderingChildren ); // Create offscreen buffer for vert blur pass - mRenderTarget1 = FrameBufferImage::New( mDownsampledWidth, mDownsampledHeight, mPixelFormat ); + mRenderTarget1 = FrameBuffer::New( mDownsampledWidth, mDownsampledHeight, FrameBuffer::Attachment::NONE ); + texture = Texture::New(TextureType::TEXTURE_2D, mPixelFormat, unsigned(mDownsampledWidth), unsigned(mDownsampledHeight)); + mRenderTarget1.AttachColorTexture( texture ); // use the completed blur in the first buffer and composite with the original child actors render - mImageActorComposite.SetImage( mRenderTarget1 ); + SetRendererTexture( mCompositingActor.GetRendererAt(0), mRenderTarget1 ); // set up target actor for rendering result, i.e. the blurred image - mTargetActor.SetImage(mRenderTargetForRenderingChildren); + SetRendererTexture( mTargetActor.GetRendererAt(0), mRenderTargetForRenderingChildren ); } // Create offscreen buffer for horiz blur pass - mRenderTarget2 = FrameBufferImage::New( mDownsampledWidth, mDownsampledHeight, mPixelFormat ); + mRenderTarget2 = FrameBuffer::New( mDownsampledWidth, mDownsampledHeight, FrameBuffer::Attachment::NONE ); + Texture texture = Texture::New(TextureType::TEXTURE_2D, mPixelFormat, unsigned(mDownsampledWidth), unsigned(mDownsampledHeight)); + mRenderTarget2.AttachColorTexture( texture ); // size needs to match render target - mImageActorHorizBlur.SetSize(mDownsampledWidth, mDownsampledHeight); + mHorizBlurActor.SetSize(mDownsampledWidth, mDownsampledHeight); // size needs to match render target - mImageActorVertBlur.SetImage( mRenderTarget2 ); - mImageActorVertBlur.SetSize(mDownsampledWidth, mDownsampledHeight); + mVertBlurActor.SetSize(mDownsampledWidth, mDownsampledHeight); + SetRendererTexture( mVertBlurActor.GetRendererAt(0), mRenderTarget2 ); // set gaussian blur up for new sized render targets SetShaderConstants(); @@ -455,18 +468,18 @@ void GaussianBlurView::CreateRenderTasks() mRenderChildrenTask.SetClearColor( mBackgroundColor ); mRenderChildrenTask.SetCameraActor(mRenderFullSizeCamera); - mRenderChildrenTask.SetTargetFrameBuffer( mRenderTargetForRenderingChildren ); + mRenderChildrenTask.SetFrameBuffer( mRenderTargetForRenderingChildren ); } // perform a horizontal blur targeting the second buffer mHorizBlurTask = taskList.CreateTask(); - mHorizBlurTask.SetSourceActor( mImageActorHorizBlur ); + mHorizBlurTask.SetSourceActor( mHorizBlurActor ); mHorizBlurTask.SetExclusive(true); mHorizBlurTask.SetInputEnabled( false ); mHorizBlurTask.SetClearEnabled( true ); mHorizBlurTask.SetClearColor( mBackgroundColor ); mHorizBlurTask.SetCameraActor(mRenderDownsampledCamera); - mHorizBlurTask.SetTargetFrameBuffer( mRenderTarget2 ); + mHorizBlurTask.SetFrameBuffer( mRenderTarget2 ); if( mRenderOnce && mBlurUserImage ) { mHorizBlurTask.SetRefreshRate(RenderTask::REFRESH_ONCE); @@ -474,7 +487,7 @@ void GaussianBlurView::CreateRenderTasks() // use the second buffer and perform a horizontal blur targeting the first buffer mVertBlurTask = taskList.CreateTask(); - mVertBlurTask.SetSourceActor( mImageActorVertBlur ); + mVertBlurTask.SetSourceActor( mVertBlurActor ); mVertBlurTask.SetExclusive(true); mVertBlurTask.SetInputEnabled( false ); mVertBlurTask.SetClearEnabled( true ); @@ -482,11 +495,11 @@ void GaussianBlurView::CreateRenderTasks() mVertBlurTask.SetCameraActor(mRenderDownsampledCamera); if(mUserOutputRenderTarget) { - mVertBlurTask.SetTargetFrameBuffer( mUserOutputRenderTarget ); + mVertBlurTask.SetFrameBuffer( mUserOutputRenderTarget ); } else { - mVertBlurTask.SetTargetFrameBuffer( mRenderTarget1 ); + mVertBlurTask.SetFrameBuffer( mRenderTarget1 ); } if( mRenderOnce && mBlurUserImage ) { @@ -498,12 +511,12 @@ void GaussianBlurView::CreateRenderTasks() if(!mBlurUserImage) { mCompositeTask = taskList.CreateTask(); - mCompositeTask.SetSourceActor( mImageActorComposite ); + mCompositeTask.SetSourceActor( mCompositingActor ); mCompositeTask.SetExclusive(true); mCompositeTask.SetInputEnabled( false ); mCompositeTask.SetCameraActor(mRenderFullSizeCamera); - mCompositeTask.SetTargetFrameBuffer( mRenderTargetForRenderingChildren ); + mCompositeTask.SetFrameBuffer( mRenderTargetForRenderingChildren ); } } @@ -520,6 +533,7 @@ void GaussianBlurView::RemoveRenderTasks() void GaussianBlurView::Activate() { // make sure resources are allocated and start the render tasks processing + Self().Add( mInternalRoot ); AllocateResources(); CreateRenderTasks(); mActivated = true; @@ -536,6 +550,7 @@ void GaussianBlurView::Deactivate() { // stop render tasks processing // Note: render target resources are automatically freed since we set the Image::Unused flag + mInternalRoot.Unparent(); RemoveRenderTasks(); mRenderTargetForRenderingChildren.Reset(); mRenderTarget1.Reset(); @@ -600,11 +615,11 @@ void GaussianBlurView::SetShaderConstants() Vector2 yAxis(0.0f, 1.0f); for (i = 0; i < mNumSamples; ++i ) { - mImageActorHorizBlur.RegisterProperty( GetSampleOffsetsPropertyName( i ), uvOffsets[ i ] * xAxis ); - mImageActorHorizBlur.RegisterProperty( GetSampleWeightsPropertyName( i ), weights[ i ] ); + mHorizBlurActor.RegisterProperty( GetSampleOffsetsPropertyName( i ), uvOffsets[ i ] * xAxis ); + mHorizBlurActor.RegisterProperty( GetSampleWeightsPropertyName( i ), weights[ i ] ); - mImageActorVertBlur.RegisterProperty( GetSampleOffsetsPropertyName( i ), uvOffsets[ i ] * yAxis ); - mImageActorVertBlur.RegisterProperty( GetSampleWeightsPropertyName( i ), weights[ i ] ); + mVertBlurActor.RegisterProperty( GetSampleOffsetsPropertyName( i ), uvOffsets[ i ] * yAxis ); + mVertBlurActor.RegisterProperty( GetSampleWeightsPropertyName( i ), weights[ i ] ); } delete[] uvOffsets;