Rendering API clean-up
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / filters / blur-two-pass-filter.cpp
index 5dd5437..ed8dada 100644 (file)
@@ -22,7 +22,9 @@
 #include <sstream>
 #include <dali/public-api/animation/constraints.h>
 #include <dali/public-api/common/stage.h>
+#include <dali/public-api/object/property-map.h>
 #include <dali/public-api/render-tasks/render-task-list.h>
+#include <dali/devel-api/rendering/renderer.h>
 
 // INTERNAL INCLUDES
 
@@ -55,36 +57,20 @@ const float DEFAULT_KERNEL4[] = { 2.0f/16.0f, 1.5f/16.0f, 1.5f/16.0f, 1.5f/16.0f
                                   1.0f/16.0f, 1.0f/16.0f, 1.0f/16.0f, 0.5f/16.0f,
                                   0.5f/16.0f, 0.5f/16.0f, 0.5f/16.0f };
 
-
-const float ARBITRARY_FIELD_OF_VIEW = Math::PI / 4.0f;
-
 const char* BLUR_TWO_PASS_FRAGMENT_SOURCE =
 {
  "precision highp float;\n"
+ "varying mediump vec2 vTexCoord;\n"
+ "uniform sampler2D sTexture;\n"
  "uniform vec2 uSampleOffsets[NUM_SAMPLES];\n"
  "uniform float uSampleWeights[NUM_SAMPLES];\n"
  "void main()\n"
  "{\n"
  "  vec4 color = vec4(0.0);\n"
- "# ifdef DEBUG_RENDER\n"
- "  if( vTexCoord.s < 0.495 )\n"
- "  {\n"
- "# endif //def DEBUG_RENDER\n"
- "    for( int i = 0; i < NUM_SAMPLES; ++i )\n"
- "    {\n"
- "      color += texture2D( sTexture, vTexCoord + uSampleOffsets[i] ) * uSampleWeights[i];\n"
- "    }\n"
- "# ifdef DEBUG_RENDER\n"
- "  }\n"
- "  else if( vTexCoord.s > 0.505 )\n"
- "  {\n"
- "    color = texture2D( sTexture, vTexCoord );\n"
- "  }\n"
- "  else\n"
+ "  for( int i = 0; i < NUM_SAMPLES; ++i )\n"
  "  {\n"
- "    color = vec4( 1.0, 0.0, 0.0, 1.0 );\n"
+ "    color += texture2D( sTexture, vTexCoord + uSampleOffsets[i] ) * uSampleWeights[i];\n"
  "  }\n"
- "# endif //def DEBUG_RENDER\n"
  "  gl_FragColor = color;\n"
  "}\n"
 };
@@ -106,7 +92,10 @@ std::string GetWeightUniformName( int index )
 const char* BLEND_TWO_IMAGES_FRAGMENT_SOURCE =
 {
  "precision highp float;\n"
- "uniform float uBlurStrength; \n "
+ "uniform float uBlurStrength;\n "
+ "uniform sampler2D sTexture;\n"
+ "uniform sampler2D sEffect;\n"
+ "varying mediump vec2 vTexCoord;\n"
  "void main()\n"
  "{\n"
  "  gl_FragColor = texture2D( sTexture, vTexCoord ) * uBlurStrength"
@@ -114,10 +103,8 @@ const char* BLEND_TWO_IMAGES_FRAGMENT_SOURCE =
  "}\n"
 };
 
-std::string GetBlurStrengthUniformName()
-{
-  return "uBlurStrength";
-}
+const char* const BLUR_STRENGTH_UNIFORM_NAME( "uBlurStrength"  );
+const char* const EFFECT_IMAGE_NAME( "sEffect" );
 
 } // namespace
 
@@ -125,9 +112,10 @@ std::string GetBlurStrengthUniformName()
 BlurTwoPassFilter::BlurTwoPassFilter()
 : ImageFilter()
 {
-  mShaderForBlending = ShaderEffect::New( "", BLEND_TWO_IMAGES_FRAGMENT_SOURCE );
-  mShaderForBlending.SetUniform( GetBlurStrengthUniformName(), 1.f );
-  mBlurStrengthPropertyIndex = mShaderForBlending.GetPropertyIndex( GetBlurStrengthUniformName() );
+  // create blending actor and register the property in constructor
+  // to make sure that GetBlurStrengthPropertyIndex() always returns a valid index
+  mActorForBlending = Toolkit::ImageView::New();
+  mBlurStrengthPropertyIndex = mActorForBlending.RegisterProperty( BLUR_STRENGTH_UNIFORM_NAME, 1.f );
 }
 
 BlurTwoPassFilter::~BlurTwoPassFilter()
@@ -136,37 +124,24 @@ BlurTwoPassFilter::~BlurTwoPassFilter()
 
 void BlurTwoPassFilter::Enable()
 {
-  mCameraForBlur = CameraActor::New();
-  mCameraForBlur.SetParentOrigin(ParentOrigin::CENTER);
-
   // create actor to render input with applied emboss effect
-  mActorForInput = ImageActor::New( mInputImage );
+  mActorForInput = Toolkit::ImageView::New( mInputImage );
   mActorForInput.SetParentOrigin( ParentOrigin::CENTER );
-  mActorForInput.SetSize(mTargetSize);
-  mActorForInput.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
+  mActorForInput.SetSize( mTargetSize );
 
   // create internal offscreen for result of horizontal pass
   mImageForHorz = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
-
   // create an actor to render mImageForHorz for vertical blur pass
-  mActorForHorz = ImageActor::New( mImageForHorz );
+  mActorForHorz = Toolkit::ImageView::New( mImageForHorz );
   mActorForHorz.SetParentOrigin( ParentOrigin::CENTER );
-  mActorForHorz.SetSize(mTargetSize);
-  mActorForHorz.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
+  mActorForHorz.SetSize( mTargetSize );
 
   // create internal offscreen for result of the two pass blurred image
   mBlurredImage = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED);
-
   // create an actor to blend the blurred image and the input image with the given blur strength
-  mActorForBlending = ImageActor::New( mBlurredImage );
+  mActorForBlending.SetImage( mBlurredImage );
   mActorForBlending.SetParentOrigin( ParentOrigin::CENTER );
-  mActorForBlending.SetSize(mTargetSize);
-  mActorForBlending.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) );
-
-  mRootActor.Add( mActorForInput );
-  mRootActor.Add( mActorForHorz );
-  mRootActor.Add( mActorForBlending );
-  mRootActor.Add( mCameraForBlur );
+  mActorForBlending.SetSize( mTargetSize );
 
   // create custom shader effect
   if( !GetKernelSize() )
@@ -175,32 +150,42 @@ void BlurTwoPassFilter::Enable()
   }
   int kernelSize( static_cast< int >(GetKernelSize()) );
 
-  std::ostringstream fragmentSource;
-  if( mDebugRender )
-  {
-    fragmentSource << "#define DEBUG_RENDER\n";
-  }
-  fragmentSource << "#define NUM_SAMPLES " << kernelSize << "\n";
-  fragmentSource << BLUR_TWO_PASS_FRAGMENT_SOURCE;
-  mShaderForHorz = ShaderEffect::New( "", fragmentSource.str() );
-  mActorForInput.SetShaderEffect( mShaderForHorz );
-  mShaderForVert = ShaderEffect::New( "", fragmentSource.str() );
-  mActorForHorz.SetShaderEffect( mShaderForVert );
-
   for( int i = 0; i < kernelSize; ++i )
   {
     const std::string offsetUniform( GetOffsetUniformName( i ) );
     const std::string weightUniform( GetWeightUniformName( i ) );
 
-    mShaderForHorz.SetUniform( offsetUniform, Vector2(mKernel[i]) * Vector2::XAXIS );
-    mShaderForHorz.SetUniform( weightUniform, mKernel[i].z );
+    mActorForInput.RegisterProperty( offsetUniform, Vector2(mKernel[i]) * Vector2::XAXIS );
+    mActorForInput.RegisterProperty( weightUniform, mKernel[i].z );
 
-    mShaderForVert.SetUniform( offsetUniform, Vector2(mKernel[i]) * Vector2::YAXIS );
-    mShaderForVert.SetUniform( weightUniform, mKernel[i].z );
+    mActorForHorz.RegisterProperty( offsetUniform, Vector2(mKernel[i]) * Vector2::YAXIS );
+    mActorForHorz.RegisterProperty( weightUniform, mKernel[i].z );
   }
 
-  mActorForBlending.SetShaderEffect( mShaderForBlending );
-  mShaderForBlending.SetEffectImage( mInputImage );
+  // Set up blur-two-pass custom shader
+  std::ostringstream fragmentSource;
+  fragmentSource << "#define NUM_SAMPLES " << kernelSize << "\n";
+  fragmentSource << BLUR_TWO_PASS_FRAGMENT_SOURCE;
+
+  Property::Map customShader;
+  customShader[ "fragmentShader" ] = fragmentSource.str();
+  Property::Map rendererMap;
+  rendererMap.Insert( "shader", customShader );
+  mActorForInput.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap );
+  mActorForHorz.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap );
+
+  // Set up blend-two-image custom shader
+  customShader[ "fragmentShader" ] = BLEND_TWO_IMAGES_FRAGMENT_SOURCE;
+  rendererMap[ "shader"] = customShader;
+  mActorForBlending.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap );
+
+  mRootActor.Add( mActorForInput );
+  mRootActor.Add( mActorForHorz );
+  mRootActor.Add( mActorForBlending );
+
+  // Add effect texture to blend-two-image custom shader
+  TextureSet textureSet = mActorForBlending.GetRendererAt(0).GetTextures();
+  textureSet.SetImage( 1u, mInputImage );
 
   SetupCamera();
   CreateRenderTasks();
@@ -210,10 +195,10 @@ void BlurTwoPassFilter::Disable()
 {
   if( mRootActor )
   {
-    if( mCameraForBlur )
+    if( mCameraActor )
     {
-      mRootActor.Remove( mCameraForBlur );
-      mCameraForBlur.Reset();
+      mRootActor.Remove( mCameraActor );
+      mCameraActor.Reset();
     }
 
     if( mActorForInput )
@@ -228,12 +213,6 @@ void BlurTwoPassFilter::Disable()
       mActorForHorz.Reset();
     }
 
-    if( mActorForBlending )
-    {
-      mRootActor.Remove( mActorForBlending );
-      mActorForBlending.Reset();
-    }
-
     RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
 
     if( mRenderTaskForHorz )
@@ -288,20 +267,9 @@ void BlurTwoPassFilter::SetSize( const Vector2& size )
   }
 }
 
-Constrainable BlurTwoPassFilter::GetHandleForAnimateBlurStrength()
-{
-  return mShaderForBlending;
-}
-
-void BlurTwoPassFilter::SetupCamera()
+Handle BlurTwoPassFilter::GetHandleForAnimateBlurStrength()
 {
-  // Create and place a camera for the embossing render, corresponding to its render target size
-  mCameraForBlur.SetFieldOfView(ARBITRARY_FIELD_OF_VIEW);
-  mCameraForBlur.SetNearClippingPlane(1.0f);
-  mCameraForBlur.SetAspectRatio(mTargetSize.width / mTargetSize.height);
-  mCameraForBlur.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor
-  mCameraForBlur.SetRotation(Quaternion(M_PI, Vector3::YAXIS));
-  mCameraForBlur.SetPosition(0.0f, 0.0f, ((mTargetSize.height * 0.5f) / tanf(ARBITRARY_FIELD_OF_VIEW * 0.5f)));
+  return mActorForBlending;
 }
 
 void BlurTwoPassFilter::CreateRenderTasks()
@@ -317,7 +285,7 @@ void BlurTwoPassFilter::CreateRenderTasks()
   mRenderTaskForHorz.SetClearEnabled( true );
   mRenderTaskForHorz.SetClearColor( mBackgroundColor );
   mRenderTaskForHorz.SetTargetFrameBuffer( mImageForHorz );
-  mRenderTaskForHorz.SetCameraActor( mCameraForBlur );
+  mRenderTaskForHorz.SetCameraActor( mCameraActor );
 
   // use the internal buffer and perform a horizontal blur targeting the output buffer
   mRenderTaskForVert = taskList.CreateTask();
@@ -328,7 +296,7 @@ void BlurTwoPassFilter::CreateRenderTasks()
   mRenderTaskForVert.SetClearEnabled( true );
   mRenderTaskForVert.SetClearColor( mBackgroundColor );
   mRenderTaskForVert.SetTargetFrameBuffer( mBlurredImage );
-  mRenderTaskForVert.SetCameraActor( mCameraForBlur );
+  mRenderTaskForVert.SetCameraActor( mCameraActor );
 
   //Perform a blending between the blurred image and the input image
   mRenderTaskForBlending = taskList.CreateTask();
@@ -339,7 +307,7 @@ void BlurTwoPassFilter::CreateRenderTasks()
   mRenderTaskForBlending.SetClearEnabled( true );
   mRenderTaskForBlending.SetClearColor( mBackgroundColor );
   mRenderTaskForBlending.SetTargetFrameBuffer( mOutputImage );
-  mRenderTaskForBlending.SetCameraActor( mCameraForBlur );
+  mRenderTaskForBlending.SetCameraActor( mCameraActor );
 }
 
 } // namespace Internal