mIsPixelAreaSet( false ),
mPreviousRefreshHints( 0 ),
mStyle( Dali::ImageActor::STYLE_QUAD ),
- mCullFaceMode( CullNone )
+ mCullFaceMode( CullNone ),
+ mUseBlend( false )
{
}
{
DALI_ASSERT_DEBUG( NULL != mSceneController );
- // Create main renderer, passing ownership to the render-thread
- mImageRenderer = ImageRenderer::New( *mParent );
+ // Get a reusable renderer from the pool
+ mImageRenderer = mSceneController->NewImageRenderer( *mParent );
- mSceneController->GetRenderMessageDispatcher().AddRenderer( *mImageRenderer );
+ mSceneController->GetRenderMessageDispatcher().AddImageRenderer( mImageRenderer, mParent );
ATTACHMENT_LOG_FMT(Debug::General, " renderer: %p\n", mImageRenderer);
new (slot) DerivedType( mImageRenderer, &ImageRenderer::SetTextureId, mTextureId );
}
- // After derived classes have (potentially) created their renderer
- Renderer& renderer = GetRenderer();
- renderer.SetCullFace( mCullFaceMode );
-
- // set the default shader here as well
- renderer.SetShader( mShader );
+ // send messages to renderer
+ SendCullFaceChangeMessage( updateBufferIndex );
+ SendShaderChangeMessage( updateBufferIndex );
}
void ImageAttachment::OnDestroy2()
{
DALI_ASSERT_DEBUG( NULL != mSceneController );
- // Request deletion in the next Render
- mSceneController->GetRenderMessageDispatcher().RemoveRenderer( *mImageRenderer );
- mImageRenderer = NULL;
+ if( NULL != mImageRenderer )
+ {
+ // Request GL cleanup in the next Render
+ mSceneController->GetRenderMessageDispatcher().RemoveImageRenderer( mImageRenderer );
+
+ // Return reusable renderer to the pool
+ mSceneController->FreeImageRenderer( *mImageRenderer );
+
+ mImageRenderer = NULL;
+ }
}
void ImageAttachment::ConnectedToSceneGraph()
void ImageAttachment::SetBlendingOptions( BufferIndex updateBufferIndex, unsigned int options )
{
// Blending options are forwarded to renderer in render-thread
- typedef MessageValue1< Renderer, unsigned int > DerivedType;
+ typedef MessageValue1< ImageRenderer, unsigned int > DerivedType;
// Reserve some memory inside the render queue
unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
// Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &GetRenderer(), &Renderer::SetBlendingOptions, options );
+ new (slot) DerivedType( mImageRenderer, &ImageRenderer::SetBlendingOptions, options );
}
void ImageAttachment::SetBlendColor( BufferIndex updateBufferIndex, const Vector4& color )
{
// Blend color is forwarded to renderer in render-thread
- typedef MessageValue1< Renderer, Vector4 > DerivedType;
+ typedef MessageValue1< ImageRenderer, Vector4 > DerivedType;
// Reserve some memory inside the render queue
unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
// Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &GetRenderer(), &Renderer::SetBlendColor, color );
+ new (slot) DerivedType( mImageRenderer, &ImageRenderer::SetBlendColor, color );
}
void ImageAttachment::SetCullFace( BufferIndex updateBufferIndex, CullFaceMode mode )
mCullFaceMode = mode;
- typedef MessageValue1< Renderer, CullFaceMode > DerivedType;
-
- // Reserve some memory inside the render queue
- unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
-
- // Construct message in the render queue memory; note that delete should not be called on the return value
- new (slot) DerivedType( &GetRenderer(), &Renderer::SetCullFace, mode );
+ SendCullFaceChangeMessage( updateBufferIndex );
}
void ImageAttachment::SetSampler( BufferIndex updateBufferIndex, unsigned int samplerBitfield )
mRefreshMeshData = false;
}
+
+ bool blend = !IsFullyOpaque( updateBufferIndex );
+
+ if ( mUseBlend != blend )
+ {
+ mUseBlend = blend;
+
+ // Enable/disable blending in the next render
+ typedef MessageValue1< ImageRenderer, bool > DerivedType;
+
+ // Reserve some memory inside the render queue
+ unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
+
+ // Construct message in the render queue memory; note that delete should not be called on the return value
+ new (slot) DerivedType( mImageRenderer, &ImageRenderer::SetUseBlend, blend );
+ }
}
void RenderableAttachment::SetBlendingMode( BlendingMode::Type mode )
return fullyOpaque;
}
+void ImageAttachment::SendCullFaceChangeMessage( BufferIndex updateBufferIndex )
+{
+ typedef MessageValue1< Renderer, CullFaceMode > DerivedType;
+
+ // Reserve some memory inside the render queue
+ unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
+
+ // Construct message in the render queue memory; note that delete should not be called on the return value
+ new (slot) DerivedType( &GetRenderer(), &Renderer::SetCullFace, mCullFaceMode );
+}
+
void ImageAttachment::SendShaderChangeMessage( BufferIndex updateBufferIndex )
{
typedef MessageValue1< Renderer, Shader* > DerivedType;