/*
- * 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.
#include <cmath>
#include <dali/public-api/animation/constraint.h>
#include <dali/public-api/common/stage.h>
-#include <dali/public-api/object/type-registry.h>
#include <dali/public-api/object/property-map.h>
+#include <dali/public-api/object/type-registry.h>
#include <dali/public-api/object/type-registry-helper.h>
-#include <dali/devel-api/rendering/renderer.h>
+#include <dali/public-api/rendering/renderer.h>
#include <dali/devel-api/scripting/scripting.h>
#include <dali/integration-api/debug.h>
+// INTERNAL_INCLUDES
+#include <dali-toolkit/devel-api/controls/control-devel.h>
+#include <dali-toolkit/internal/visuals/visual-base-impl.h>
+#include <dali-toolkit/internal/visuals/visual-factory-impl.h>
+
namespace //Unnamed namespace
{
} // unnamed namespace
SuperBlurView::SuperBlurView( unsigned int blurLevels )
-: Control( ControlBehaviour( DISABLE_SIZE_NEGOTIATION ) ),
+: Control( ControlBehaviour( DISABLE_SIZE_NEGOTIATION | DISABLE_STYLE_CHANGE_SIGNALS ) ),
mTargetSize( Vector2::ZERO ),
mBlurStrengthPropertyIndex(Property::INVALID_INDEX),
mBlurLevels( blurLevels ),
DALI_ASSERT_ALWAYS( mBlurLevels > 0 && " Minimal blur level is one, otherwise no blur is needed" );
mGaussianBlurView.assign( blurLevels, Toolkit::GaussianBlurView() );
mBlurredImage.assign( blurLevels, FrameBufferImage() );
- mRenderers.assign( blurLevels+1, Toolkit::ControlRenderer() );
+ mVisuals.assign( blurLevels+1, Toolkit::Visual::Base() );
}
SuperBlurView::~SuperBlurView()
void SuperBlurView::OnInitialize()
{
mBlurStrengthPropertyIndex = Self().RegisterProperty( "blurStrength", 0.f );
-
- Property::Map rendererMap;
- rendererMap.Insert( "rendererType", "image");
-
- Property::Map shaderMap;
- std::stringstream verterShaderString;
- shaderMap[ "fragmentShader" ] = FRAGMENT_SHADER;
- rendererMap.Insert( "shader", shaderMap );
-
- Toolkit::RendererFactory rendererFactory = Toolkit::RendererFactory::Get();
- for(unsigned int i=0; i<=mBlurLevels; i++)
- {
- mRenderers[i] = rendererFactory.GetControlRenderer( rendererMap );
- mRenderers[i].SetDepthIndex(i);
- }
}
void SuperBlurView::SetImage(Image inputImage)
{
- if( mTargetSize == Vector2::ZERO || mInputImage == inputImage)
+ mInputImage = inputImage;
+ if( mTargetSize == Vector2::ZERO )
{
return;
}
ClearBlurResource();
- mInputImage = inputImage;
- Actor self = Self();
- Toolkit::RendererFactory::Get().ResetRenderer( mRenderers[0], self, mInputImage );
+ Actor self( Self() );
+
+ mVisuals[0] = Toolkit::VisualFactory::Get().CreateVisual( mInputImage );
+ DevelControl::RegisterVisual( *this, 0, mVisuals[0], 0 ); // Will clean up previously registered visuals for this index.
+ // custom shader is not applied on the original image.
BlurImage( 0, inputImage);
for(unsigned int i=1; i<mBlurLevels;i++)
mResourcesCleared = true;
}
}
+void SuperBlurView::SetShaderEffect( Toolkit::Visual::Base& visual )
+{
+ Property::Map shaderMap;
+ std::stringstream verterShaderString;
+ shaderMap[ "fragmentShader" ] = FRAGMENT_SHADER;
+
+ Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual );
+ visualImpl.SetCustomShader( shaderMap );
+}
void SuperBlurView::OnSizeSet( const Vector3& targetSize )
{
{
mTargetSize = Vector2(targetSize);
- Toolkit::RendererFactory rendererFactory = Toolkit::RendererFactory::Get();
Actor self = Self();
- for(unsigned int i=1; i<=mBlurLevels;i++)
+ for( unsigned int i = 1; i <= mBlurLevels; i++ )
{
float exponent = static_cast<float>(i);
mBlurredImage[i-1] = FrameBufferImage::New( mTargetSize.width/std::pow(2.f,exponent) , mTargetSize.height/std::pow(2.f,exponent),
- GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT, Dali::Image::NEVER );
- rendererFactory.ResetRenderer( mRenderers[i], self, mBlurredImage[i-1] );
+ GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT );
+
+ mVisuals[i] = Toolkit::VisualFactory::Get().CreateVisual( mBlurredImage[i - 1] );
+ DevelControl::RegisterVisual( *this, i, mVisuals[i], int( i ) ); // Will clean up existing visual with same index.
+ SetShaderEffect( mVisuals[i] );
}
if( mInputImage )
{
SetImage( mInputImage );
}
-
- if( self.OnStage() )
- {
- for(unsigned int i=0; i<=mBlurLevels;i++)
- {
- mRenderers[i].SetOnStage( self );
- }
- }
}
+
+ Control::OnSizeSet( targetSize );
}
void SuperBlurView::OnStageConnection( int depth )
{
- Control::OnStageConnection( depth );
-
if( mTargetSize == Vector2::ZERO )
{
return;
}
- Actor self = Self();
- mRenderers[0].SetOnStage( self );
- for(unsigned int i=1; i<=mBlurLevels;i++)
- {
- mRenderers[i].SetOnStage( self );
-
- Renderer renderer = self.GetRendererAt( i );
- Property::Index index = renderer.RegisterProperty( ALPHA_UNIFORM_NAME, 0.f );
- Constraint constraint = Constraint::New<float>( renderer, index, ActorOpacityConstraint(mBlurLevels, i-1) );
- constraint.AddSource( Source( self, mBlurStrengthPropertyIndex ) );
- constraint.Apply();
- }
-}
-
-void SuperBlurView::OnStageDisconnection( )
-{
- if( mTargetSize == Vector2::ZERO )
- {
- return;
- }
+ // Exception to the rule, chaining up first ensures visuals have SetOnStage called to create their renderers
+ Control::OnStageConnection( depth );
Actor self = Self();
- for(unsigned int i=0; i<mBlurLevels+1;i++)
+ for(unsigned int i=0; i<=mBlurLevels;i++)
{
- mRenderers[i].SetOffStage( self );
+ // Note that the renderer indices are depending on the order they been added to the actor
+ // which might be different from the blur level of its texture.
+ // We can check the depth index of the renderer to know which blurred image it renders.
+ // All visuals WILL have renderers at this point as we are simply creating visuals with an Image handle.
+ Renderer renderer = self.GetRendererAt( i );
+ int depthIndex = renderer.GetProperty<int>(Renderer::Property::DEPTH_INDEX);
+ if( depthIndex > 0 )
+ {
+ Property::Index index = renderer.RegisterProperty( ALPHA_UNIFORM_NAME, 0.f );
+ Constraint constraint = Constraint::New<float>( renderer, index, ActorOpacityConstraint(mBlurLevels, depthIndex-1) );
+ constraint.AddSource( Source( self, mBlurStrengthPropertyIndex ) );
+ constraint.Apply();
+ }
}
-
- Control::OnStageDisconnection();
}
Vector3 SuperBlurView::GetNaturalSize()