X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fimage%2Fimage-visual.cpp;h=0cd4c1bf58d092550dc5e8662548f0a8bb9e6c52;hb=a7e69accb538fa508d714cd675398ba4fb66b330;hp=b0324ed4530369f2922d9f412c982a300134189a;hpb=e74563220e35ea81a5b932186221623eed0fc62e;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/image/image-visual.cpp b/dali-toolkit/internal/visuals/image/image-visual.cpp index b0324ed..0cd4c1b 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.cpp +++ b/dali-toolkit/internal/visuals/image/image-visual.cpp @@ -513,7 +513,6 @@ void ImageVisual::GetNaturalSize( Vector2& naturalSize ) void ImageVisual::CreateRenderer( TextureSet& textureSet ) { Geometry geometry; - Shader shader; // Get the geometry if( mImpl->mCustomShader ) @@ -534,65 +533,7 @@ void ImageVisual::CreateRenderer( TextureSet& textureSet ) } } - std::string vertexShader; - bool usesWholeTexture = true; - if(mImpl->mCustomShader && !mImpl->mCustomShader->mVertexShader.empty()) - { - vertexShader = mImpl->mCustomShader->mVertexShader; - usesWholeTexture = false; // Impossible to tell. - } - else - { - vertexShader = mImageVisualShaderFactory.GetVertexShaderSource(); - } - - std::string fragmentShader; - if(mImpl->mCustomShader && !mImpl->mCustomShader->mFragmentShader.empty()) - { - fragmentShader = mImpl->mCustomShader->mFragmentShader; - } - else - { - fragmentShader = mImageVisualShaderFactory.GetFragmentShaderSource(); - } - - // If the texture is native, we may need to change prefix and sampler in - // the fragment shader - bool modifiedFragmentShader = false; - if(mTextures && DevelTexture::IsNative(mTextures.GetTexture(0))) - { - Texture nativeTexture = mTextures.GetTexture(0); - modifiedFragmentShader = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragmentShader); - } - - const bool useStandardShader = !mImpl->mCustomShader && !modifiedFragmentShader; - if(useStandardShader) - { - // Create and cache the standard shader - shader = mImageVisualShaderFactory.GetShader( - mFactoryCache, - mImpl->mFlags & Impl::IS_ATLASING_APPLIED, - mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE, - IsRoundedCornerRequired() ); - } - else if(mImpl->mCustomShader) - { - shader = Shader::New(vertexShader, fragmentShader, mImpl->mCustomShader->mHints); - } - else - { - shader = Shader::New(vertexShader, fragmentShader); - } - - if(usesWholeTexture) - { - shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); - } - - // Set pixel align off as default. - // ToDo: Pixel align causes issues such as rattling image animation. - // We should trun it off until issues are resolved - shader.RegisterProperty( PIXEL_ALIGNED_UNIFORM_NAME, PIXEL_ALIGN_OFF ); + Shader shader = GetShader(); // Create the renderer mImpl->mRenderer = Renderer::New( geometry, shader ); @@ -828,6 +769,15 @@ bool ImageVisual::IsResourceReady() const mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::FAILED ); } +void ImageVisual::UpdateShader() +{ + if(mImpl->mRenderer) + { + Shader shader = GetShader(); + mImpl->mRenderer.SetShader(shader); + } +} + // From existing atlas manager void ImageVisual::UploadCompleted() { @@ -962,6 +912,76 @@ void ImageVisual::RemoveTexture() } } +Shader ImageVisual::GetShader() +{ + Shader shader; + + std::string_view vertexShaderView; + bool usesWholeTexture = true; + if(mImpl->mCustomShader && !mImpl->mCustomShader->mVertexShader.empty()) + { + vertexShaderView = mImpl->mCustomShader->mVertexShader; + usesWholeTexture = false; // Impossible to tell. + } + else + { + vertexShaderView = mImageVisualShaderFactory.GetVertexShaderSource(); + } + + std::string_view fragmentShaderView; + if(mImpl->mCustomShader && !mImpl->mCustomShader->mFragmentShader.empty()) + { + fragmentShaderView = mImpl->mCustomShader->mFragmentShader; + } + else + { + fragmentShaderView = mImageVisualShaderFactory.GetFragmentShaderSource(); + } + + // If the texture is native, we may need to change prefix and sampler in + // the fragment shader + bool modifiedFragmentShader = false; + std::string fragmentShaderString; + if(mTextures && DevelTexture::IsNative(mTextures.GetTexture(0))) + { + Texture nativeTexture = mTextures.GetTexture(0); + fragmentShaderString = std::string(fragmentShaderView); + modifiedFragmentShader = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragmentShaderString); + fragmentShaderView = fragmentShaderString; + } + + const bool useStandardShader = !mImpl->mCustomShader && !modifiedFragmentShader; + if(useStandardShader) + { + // Create and cache the standard shader + shader = mImageVisualShaderFactory.GetShader( + mFactoryCache, + mImpl->mFlags & Impl::IS_ATLASING_APPLIED, + mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE, + IsRoundedCornerRequired() ); + } + else if(mImpl->mCustomShader) + { + shader = Shader::New(vertexShaderView, fragmentShaderView, mImpl->mCustomShader->mHints); + } + else + { + shader = Shader::New(vertexShaderView, fragmentShaderView); + } + + if(usesWholeTexture) + { + shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); + } + + // Set pixel align off as default. + // ToDo: Pixel align causes issues such as rattling image animation. + // We should trun it off until issues are resolved + shader.RegisterProperty( PIXEL_ALIGNED_UNIFORM_NAME, PIXEL_ALIGN_OFF ); + + return shader; +} + } // namespace Internal } // namespace Toolkit