X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Factor-attachments%2Fimage-attachment-impl.cpp;h=cf221b8aab643151442898b2f6eb1dee65ad2529;hb=7eacfe2a5e6e543acaf4b113378c422f86782a00;hp=04b04e02b2ca82608cc90b0260bb146b91c296d9;hpb=078039368f80a882a4166ab9b550c31ad72398ec;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/actor-attachments/image-attachment-impl.cpp b/dali/internal/event/actor-attachments/image-attachment-impl.cpp index 04b04e0..cf221b8 100644 --- a/dali/internal/event/actor-attachments/image-attachment-impl.cpp +++ b/dali/internal/event/actor-attachments/image-attachment-impl.cpp @@ -22,6 +22,8 @@ #include #include #include +#include +#include namespace Dali { @@ -50,7 +52,15 @@ ImageAttachment::ImageAttachment( Stage& stage ) mStyle(Dali::ImageActor::STYLE_QUAD), mBorder(0.45,0.45,0.1,0.1), mIsPixelAreaSet(false), - mBorderInPixels(false) + mBorderInPixels(false), + + + mBlendingOptions(), + mSamplerBitfield( ImageSampler::PackBitfield( FilterMode::DEFAULT, FilterMode::DEFAULT ) ), + mSortModifier( 0.0f ), + mCullFaceMode( CullNone ), + mBlendingMode( BlendingMode::AUTO ), + mShaderEffect() { mImageConnectable.Set( NULL, false ); } @@ -127,8 +137,183 @@ SceneGraph::ImageAttachment* ImageAttachment::CreateSceneObject() return SceneGraph::ImageAttachment::New( 0u ); } +const SceneGraph::RenderableAttachment& ImageAttachment::GetSceneObject() const +{ + DALI_ASSERT_DEBUG( mSceneObject != NULL ); + return *mSceneObject; +} + + +void ImageAttachment::SetSortModifier(float modifier) +{ + // Cache for actor-side getters + mSortModifier = modifier; + + // attachment is being used in a separate thread; queue a message to set the value & base value + SetSortModifierMessage( mStage->GetUpdateInterface(), GetSceneObject(), modifier ); +} + +float ImageAttachment::GetSortModifier() const +{ + // mSortModifier is not animatable; this is the most up-to-date value. + return mSortModifier; +} + +void ImageAttachment::SetCullFace( CullFaceMode mode ) +{ + // Cache for actor-side getters + mCullFaceMode = mode; + + // attachment is being used in a separate thread; queue a message to set the value + SetCullFaceMessage( mStage->GetUpdateInterface(), GetSceneObject(), mode ); +} + +CullFaceMode ImageAttachment::GetCullFace() const +{ + // mCullFaceMode is not animatable; this is the most up-to-date value. + return mCullFaceMode; +} + +void ImageAttachment::SetBlendMode( BlendingMode::Type mode ) +{ + mBlendingMode = mode; + + // attachment is being used in a separate thread; queue a message to set the value + SetBlendingModeMessage( mStage->GetUpdateInterface(), GetSceneObject(), mode ); +} + +BlendingMode::Type ImageAttachment::GetBlendMode() const +{ + return mBlendingMode; +} + +void ImageAttachment::SetBlendFunc( BlendingFactor::Type srcFactorRgb, BlendingFactor::Type destFactorRgb, + BlendingFactor::Type srcFactorAlpha, BlendingFactor::Type destFactorAlpha ) +{ + // Cache for actor-side getters + mBlendingOptions.SetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha ); + + // attachment is being used in a separate thread; queue a message to set the value + SetBlendingOptionsMessage( mStage->GetUpdateInterface(), GetSceneObject(), mBlendingOptions.GetBitmask() ); +} + +void ImageAttachment::GetBlendFunc( BlendingFactor::Type& srcFactorRgb, BlendingFactor::Type& destFactorRgb, + BlendingFactor::Type& srcFactorAlpha, BlendingFactor::Type& destFactorAlpha ) const +{ + // These are not animatable, the cached values are up-to-date. + srcFactorRgb = mBlendingOptions.GetBlendSrcFactorRgb(); + destFactorRgb = mBlendingOptions.GetBlendDestFactorRgb(); + srcFactorAlpha = mBlendingOptions.GetBlendSrcFactorAlpha(); + destFactorAlpha = mBlendingOptions.GetBlendDestFactorAlpha(); +} + +void ImageAttachment::SetBlendEquation( BlendingEquation::Type equationRgb, BlendingEquation::Type equationAlpha ) +{ + mBlendingOptions.SetBlendEquation( equationRgb, equationAlpha ); + + // attachment is being used in a separate thread; queue a message to set the value + SetBlendingOptionsMessage( mStage->GetUpdateInterface(), GetSceneObject(), mBlendingOptions.GetBitmask() ); +} + +void ImageAttachment::GetBlendEquation( BlendingEquation::Type& equationRgb, BlendingEquation::Type& equationAlpha ) const +{ + // These are not animatable, the cached values are up-to-date. + equationRgb = mBlendingOptions.GetBlendEquationRgb(); + equationAlpha = mBlendingOptions.GetBlendEquationAlpha(); +} + +void ImageAttachment::SetBlendColor( const Vector4& color ) +{ + if( mBlendingOptions.SetBlendColor( color ) ) + { + // attachment is being used in a separate thread; queue a message to set the value + SetBlendColorMessage( mStage->GetUpdateInterface(), GetSceneObject(), color ); + } +} + +const Vector4& ImageAttachment::GetBlendColor() const +{ + const Vector4* optionalColor = mBlendingOptions.GetBlendColor(); + if( optionalColor ) + { + return *optionalColor; + } + + return Vector4::ZERO; +} + +void ImageAttachment::SetFilterMode( FilterMode::Type minFilter, FilterMode::Type magFilter ) +{ + mSamplerBitfield = ImageSampler::PackBitfield( minFilter, magFilter ); + + SetSamplerMessage( mStage->GetUpdateInterface(), GetSceneObject(), mSamplerBitfield ); +} + +void ImageAttachment::GetFilterMode( FilterMode::Type& minFilter, FilterMode::Type& magFilter ) const +{ + minFilter = ImageSampler::GetMinifyFilterMode( mSamplerBitfield ); + magFilter = ImageSampler::GetMagnifyFilterMode( mSamplerBitfield ); +} + + +void ImageAttachment::SetShaderEffect(ShaderEffect& effect) +{ + if ( OnStage() ) + { + if ( mShaderEffect ) + { + mShaderEffect->Disconnect(); + } + + mShaderEffect.Reset( &effect ); + + const SceneGraph::Shader& shader = dynamic_cast( *mShaderEffect->GetSceneObject() ); + + ApplyShaderMessage( mStage->GetUpdateInterface(), GetSceneObject(), shader ); + + mShaderEffect->Connect(); + } + else + { + mShaderEffect = ShaderEffectPtr(&effect); + } + // Effects can only be applied when the Node is connected to scene-graph +} + +ShaderEffectPtr ImageAttachment::GetShaderEffect() const +{ + return mShaderEffect; +} + +void ImageAttachment::RemoveShaderEffect() +{ + if ( OnStage() ) + { + RemoveShaderMessage( mStage->GetUpdateInterface(), GetSceneObject() ); + + // Notify shader effect + if (mShaderEffect) + { + mShaderEffect->Disconnect(); + } + } + + mShaderEffect.Reset(); +} + + void ImageAttachment::OnStageConnection2() { + if ( mShaderEffect ) + { + const SceneGraph::Shader& shader = dynamic_cast( *mShaderEffect->GetSceneObject() ); + + ApplyShaderMessage( mStage->GetUpdateInterface(), GetSceneObject(), shader ); + + // Notify shader effect + mShaderEffect->Connect(); + } + mImageConnectable.OnStageConnect(); // Provide resource ID when scene-graph attachment is connected @@ -142,17 +327,19 @@ void ImageAttachment::OnStageConnection2() void ImageAttachment::OnStageDisconnection2() { + // Notify shader effect + if ( mShaderEffect ) + { + mShaderEffect->Disconnect(); + } + // Remove resource ID when scene-graph attachment is disconnected SetTextureIdMessage( mStage->GetUpdateInterface(), *mSceneObject, 0u ); mImageConnectable.OnStageDisconnect(); } -const SceneGraph::RenderableAttachment& ImageAttachment::GetSceneObject() const -{ - DALI_ASSERT_DEBUG( mSceneObject != NULL ); - return *mSceneObject; -} + } // namespace Internal