/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * 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.
// EXTERNAL INCLUDES
#include <dali/public-api/animation/constraint.h>
#include <dali/public-api/animation/constraints.h>
-#include <dali/public-api/common/stage.h>
+#include <dali/devel-api/common/stage.h>
+#include <dali/public-api/object/property.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/public-api/render-tasks/render-task-list.h>
#include <dali/public-api/rendering/renderer.h>
-#include <dali/devel-api/images/texture-set-image.h>
// INTERNAL INCLUDES
#include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
-#include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
+#include <dali-toolkit/devel-api/controls/control-devel.h>
#include <dali-toolkit/internal/filters/blur-two-pass-filter.h>
#include <dali-toolkit/internal/filters/emboss-filter.h>
#include <dali-toolkit/internal/filters/spread-filter.h>
+#include <dali-toolkit/internal/controls/control/control-renderers.h>
namespace Dali
{
const Pixel::Format EFFECTS_VIEW_DEFAULT_PIXEL_FORMAT = Pixel::RGBA8888;
const float ARBITRARY_FIELD_OF_VIEW = Math::PI / 4.0f;
-const Vector4 EFFECTS_VIEW_DEFAULT_BACKGROUND_COLOR( 1.0f, 1.0f, 1.0f, 0.0 );
+const Vector4 EFFECTS_VIEW_DEFAULT_BACKGROUND_COLOR( 0.0f, 0.0f, 0.0f, 0.0 );
const bool EFFECTS_VIEW_REFRESH_ON_DEMAND(false);
#define DALI_COMPOSE_SHADER(STR) #STR
}
EffectsView::EffectsView()
-: Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ),
+: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ),
mChildrenRoot(Actor::New()),
mBackgroundColor( EFFECTS_VIEW_DEFAULT_BACKGROUND_COLOR ),
mTargetSize( Vector2::ZERO ),
mEffectType( Toolkit::EffectsView::INVALID_TYPE ),
mPixelFormat( EFFECTS_VIEW_DEFAULT_PIXEL_FORMAT ),
mEnabled( false ),
- mRefreshOnDemand(EFFECTS_VIEW_REFRESH_ON_DEMAND)
+ mRefreshOnDemand( EFFECTS_VIEW_REFRESH_ON_DEMAND )
{
}
RemoveFilters();
Actor self = Self();
- Property::Map rendererMap;
- rendererMap.Insert( "rendererType", "IMAGE" );
switch( type )
{
}
}
- Property::Map customShader;
- customShader[ "vertexShader" ] = EFFECTS_VIEW_VERTEX_SOURCE;
- customShader[ "fragmentShader" ] = EFFECTS_VIEW_FRAGMENT_SOURCE;
- rendererMap[ "shader" ] = customShader;
- InitializeControlRenderer( self, mRendererPostFilter, rendererMap );
-
mEffectType = type;
}
}
void EffectsView::Disable()
{
// stop render tasks processing
- // Note: render target resources are automatically freed since we set the Image::Unused flag
RemoveRenderTasks();
+ mLastSize = Vector2::ZERO; // Ensure resources are reallocated on subsequent enable
mEnabled = false;
}
void EffectsView::OnInitialize()
{
CustomActor self = Self();
- mChildrenRoot.SetParentOrigin( ParentOrigin::CENTER );
+ mChildrenRoot.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
self.Add( mChildrenRoot );
}
void EffectsView::OnSizeSet(const Vector3& targetSize)
{
- Control::OnSizeSet( targetSize );
-
mTargetSize = Vector2(targetSize);
// if we are already on stage, need to update render target sizes now to reflect the new size of this actor
Enable();
}
- mChildrenRoot.SetSize( targetSize );
+ mChildrenRoot.SetProperty( Actor::Property::SIZE, targetSize );
+
+ Control::OnSizeSet( targetSize );
}
-void EffectsView::OnStageConnection( int depth )
+void EffectsView::OnSceneConnection( int depth )
{
- Control::OnStageConnection( depth );
+ Actor self( Self() );
+
+ // Create renderers
+ mRendererPostFilter = CreateRenderer( EFFECTS_VIEW_VERTEX_SOURCE, EFFECTS_VIEW_FRAGMENT_SOURCE );
+ mRendererPostFilter.SetProperty( Dali::Renderer::Property::DEPTH_INDEX, DepthIndex::CONTENT );
+ self.AddRenderer( mRendererPostFilter );
+
+ mRendererForChildren = CreateRenderer( BASIC_VERTEX_SOURCE, BASIC_FRAGMENT_SOURCE );
+ mRendererForChildren.SetProperty( Dali::Renderer::Property::DEPTH_INDEX, DepthIndex::CONTENT + 1 );
+ self.AddRenderer( mRendererForChildren );
Enable();
- Actor self = Self();
- if( mRendererPostFilter )
- {
- mRendererPostFilter.SetOnStage( self );
- }
- if( mRendererForChildren )
- {
- mRendererForChildren.SetOnStage( self );
- }
+ Control::OnSceneConnection( depth );
}
-void EffectsView::OnStageDisconnection()
+void EffectsView::OnSceneDisconnection()
{
+ Actor self( Self() );
+
Disable();
const size_t numFilters( mFilters.Size() );
mFilters[i]->Disable();
}
- Actor self = Self();
- if( mRendererPostFilter )
- {
- mRendererPostFilter.SetOffStage( self );
- }
- if( mRendererForChildren )
- {
- mRendererForChildren.SetOffStage( self );
- }
+ // Remove renderers
+ self.RemoveRenderer( mRendererForChildren );
+ mRendererForChildren.Reset();
+
+ self.RemoveRenderer( mRendererPostFilter );
+ mRendererPostFilter.Reset();
- Control::OnStageDisconnection();
+ Control::OnSceneDisconnection();
}
void EffectsView::OnChildAdd( Actor& child )
{
- Control::OnChildAdd( child );
-
if( child != mChildrenRoot && child != mCameraForChildren )
{
mChildrenRoot.Add( child );
}
+
+ Control::OnChildAdd( child );
}
void EffectsView::OnChildRemove( Actor& child )
case Toolkit::EffectsView::DROP_SHADOW:
{
SpreadFilter* spreadFilter = static_cast< SpreadFilter* >( mFilters[0] );
- spreadFilter->SetInputImage( mImageForChildren );
- spreadFilter->SetOutputImage( mImagePostFilter );
+ spreadFilter->SetInputTexture( mFrameBufferForChildren.GetColorTexture() );
+ spreadFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
spreadFilter->SetRootActor( mChildrenRoot );
spreadFilter->SetBackgroundColor( mBackgroundColor );
spreadFilter->SetPixelFormat( mPixelFormat );
spreadFilter->SetSpread( mEffectSize );
BlurTwoPassFilter* blurFilter = static_cast< BlurTwoPassFilter* >( mFilters[1] );
- blurFilter->SetInputImage( mImagePostFilter );
- blurFilter->SetOutputImage( mImagePostFilter );
+ blurFilter->SetInputTexture( mFrameBufferPostFilter.GetColorTexture() );
+ blurFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
blurFilter->SetRootActor( mChildrenRoot );
blurFilter->SetBackgroundColor( mBackgroundColor );
blurFilter->SetPixelFormat( mPixelFormat );
case Toolkit::EffectsView::EMBOSS:
{
SpreadFilter* spreadFilter = static_cast< SpreadFilter* >( mFilters[0] );
- spreadFilter->SetInputImage( mImageForChildren );
- spreadFilter->SetOutputImage( mImagePostFilter );
+ spreadFilter->SetInputTexture( mFrameBufferForChildren.GetColorTexture() );
+ spreadFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
spreadFilter->SetRootActor( mChildrenRoot );
spreadFilter->SetBackgroundColor( mBackgroundColor );
spreadFilter->SetPixelFormat( Pixel::RGBA8888 );
spreadFilter->SetSpread( mEffectSize );
EmbossFilter* embossFilter = static_cast< EmbossFilter* >( mFilters[1] );
- embossFilter->SetInputImage( mImagePostFilter );
- embossFilter->SetOutputImage( mImagePostFilter );
+ embossFilter->SetInputTexture( mFrameBufferPostFilter.GetColorTexture() );
+ embossFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
embossFilter->SetRootActor( mChildrenRoot );
embossFilter->SetBackgroundColor( mBackgroundColor );
embossFilter->SetPixelFormat( Pixel::RGBA8888 );
embossFilter->SetSize( mTargetSize );
BlurTwoPassFilter* blurFilter = static_cast< BlurTwoPassFilter* >( mFilters[2] );
- blurFilter->SetInputImage( mImagePostFilter );
- blurFilter->SetOutputImage( mImagePostFilter );
+ blurFilter->SetInputTexture( mFrameBufferPostFilter.GetColorTexture() );
+ blurFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
blurFilter->SetRootActor( mChildrenRoot );
blurFilter->SetBackgroundColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0 ) );
blurFilter->SetPixelFormat( Pixel::RGBA8888 );
}
}
}
+
void EffectsView::AllocateResources()
{
if(mTargetSize != mLastSize)
Actor self( Self() );
- mImageForChildren = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Dali::Image::UNUSED );
- InitializeControlRenderer( self, mRendererForChildren, mImageForChildren );
- mRendererForChildren.SetDepthIndex( DepthIndex::CONTENT+1 );
+ mFrameBufferForChildren = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
+ Texture textureForChildren = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
+ mFrameBufferForChildren.AttachColorTexture( textureForChildren );
+
+ SetRendererTexture( mRendererForChildren, textureForChildren );
+
+ mFrameBufferPostFilter = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
+ Texture texturePostFilter = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
+ mFrameBufferPostFilter.AttachColorTexture( texturePostFilter );
- mImagePostFilter = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Dali::Image::UNUSED );
- TextureSet textureSet = TextureSet::New();
- TextureSetImage( textureSet, 0u, mImagePostFilter );
- self.GetRendererAt( 0 ).SetTextures( textureSet );
- mRendererPostFilter.SetDepthIndex( DepthIndex::CONTENT );
+ SetRendererTexture( mRendererPostFilter, texturePostFilter );
SetupFilters();
}
{
// Create a camera for the children render, corresponding to its render target size
mCameraForChildren = CameraActor::New(mTargetSize);
- mCameraForChildren.SetParentOrigin(ParentOrigin::CENTER);
+ mCameraForChildren.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER );
mCameraForChildren.SetInvertYAxis( true );
Self().Add( mCameraForChildren );
}
mCameraForChildren.SetNearClippingPlane(1.0f);
mCameraForChildren.SetAspectRatio(mTargetSize.width / mTargetSize.height);
mCameraForChildren.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor
- mCameraForChildren.SetPosition(0.0f, 0.0f, mTargetSize.height * cameraPosScale);
- mCameraForChildren.SetZ( mTargetSize.height * cameraPosScale );
+ mCameraForChildren.SetProperty( Actor::Property::POSITION, Vector3( 0.0f, 0.0f, mTargetSize.height * cameraPosScale ) );
+ mCameraForChildren.SetProperty( Actor::Property::POSITION_Z, mTargetSize.height * cameraPosScale );
}
}
mRenderTaskForChildren.SetInputEnabled( false );
mRenderTaskForChildren.SetClearColor( mBackgroundColor );
mRenderTaskForChildren.SetClearEnabled( true );
- mRenderTaskForChildren.SetTargetFrameBuffer( mImageForChildren );
+ mRenderTaskForChildren.SetFrameBuffer( mFrameBufferForChildren );
mRenderTaskForChildren.SetCameraActor(mCameraForChildren); // use camera that covers render target exactly
// Enable image filters