X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=dali%2Finternal%2Fevent%2Factors%2Fimage-actor-impl.cpp;h=92016de44e3f766b9c65f3981057cad1ae16cd68;hb=2b10280985738c74efa2aa0fb956a837c69acee6;hp=19f6cd24ada68016a168ab1b11b7a31efb0d32d9;hpb=df1a7c80b5b16f823d50a854c99cc8b521b74419;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/actors/image-actor-impl.cpp b/dali/internal/event/actors/image-actor-impl.cpp index 19f6cd2..92016de 100644 --- a/dali/internal/event/actors/image-actor-impl.cpp +++ b/dali/internal/event/actors/image-actor-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 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. @@ -24,6 +24,7 @@ // INTERNAL INCLUDES #include // for EqualToConstraint #include +#include #include #include #include @@ -59,14 +60,20 @@ TypeRegistration mType( typeid( Dali::ImageActor ), typeid( Dali::Actor ), Creat struct GridVertex { + GridVertex( float positionX, float positionY, const Vector2& size ) + : mPosition( positionX*size.x, positionY*size.y, 0.f ), + mTextureCoord( positionX+0.5f, positionY+0.5f ) + { + } + Vector3 mPosition; Vector2 mTextureCoord; }; -GeometryPtr CreateGeometry( unsigned int gridWidth, unsigned int gridHeight ) +GeometryPtr CreateGeometry( unsigned int gridWidth, unsigned int gridHeight, const Vector2& size ) { // Create vertices - std::vector< Vector2 > vertices; + std::vector< GridVertex > vertices; vertices.reserve( ( gridWidth + 1 ) * ( gridHeight + 1 ) ); for( unsigned int y = 0u; y < gridHeight + 1; ++y ) @@ -75,12 +82,12 @@ GeometryPtr CreateGeometry( unsigned int gridWidth, unsigned int gridHeight ) for( unsigned int x = 0u; x < gridWidth + 1; ++x ) { float xPos = (float)x / gridWidth; - vertices.push_back( Vector2( xPos - 0.5f, yPos - 0.5f ) ); + vertices.push_back( GridVertex( xPos - 0.5f, yPos - 0.5f, size ) ); } } // Create indices - Vector< unsigned int > indices; + Vector< unsigned short > indices; indices.Reserve( ( gridWidth + 2 ) * gridHeight * 2 - 2); for( unsigned int row = 0u; row < gridHeight; ++row ) @@ -105,48 +112,39 @@ GeometryPtr CreateGeometry( unsigned int gridWidth, unsigned int gridHeight ) } } - Property::Map vertexFormat; - vertexFormat[ "aPosition" ] = Property::VECTOR2; - PropertyBufferPtr vertexPropertyBuffer = PropertyBuffer::New(); - vertexPropertyBuffer->SetFormat( vertexFormat ); - vertexPropertyBuffer->SetSize( vertices.size() ); + vertexFormat[ "aPosition" ] = Property::VECTOR3; + vertexFormat[ "aTexCoord" ] = Property::VECTOR2; + PropertyBufferPtr vertexPropertyBuffer = PropertyBuffer::New( vertexFormat ); if( vertices.size() > 0 ) { - vertexPropertyBuffer->SetData( &vertices[ 0 ] ); - } - - Property::Map indexFormat; - indexFormat[ "indices" ] = Property::INTEGER; - PropertyBufferPtr indexPropertyBuffer = PropertyBuffer::New(); - indexPropertyBuffer->SetFormat( indexFormat ); - indexPropertyBuffer->SetSize( indices.Size() ); - if( indices.Size() > 0 ) - { - indexPropertyBuffer->SetData( &indices[ 0 ] ); + vertexPropertyBuffer->SetData( &vertices[ 0 ], vertices.size() ); } // Create the geometry object GeometryPtr geometry = Geometry::New(); geometry->AddVertexBuffer( *vertexPropertyBuffer ); - geometry->SetIndexBuffer( *indexPropertyBuffer ); - geometry->SetGeometryType( Dali::Geometry::TRIANGLE_STRIP ); + if( indices.Size() > 0 ) + { + geometry->SetIndexBuffer( &indices[0], indices.Size() ); + } + geometry->SetType( Dali::Geometry::TRIANGLE_STRIP ); return geometry; - } const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( - attribute mediump vec2 aPosition;\n + attribute mediump vec3 aPosition;\n + attribute mediump vec2 aTexCoord;\n varying mediump vec2 vTexCoord;\n uniform mediump mat4 uMvpMatrix;\n uniform mediump vec3 uSize;\n - uniform mediump vec4 uTextureRect;\n + uniform mediump vec4 sTextureRect;\n \n void main()\n {\n - gl_Position = uMvpMatrix * vec4(aPosition*uSize.xy, 0.0, 1.0);\n - vTexCoord = mix( uTextureRect.xy, uTextureRect.zw, aPosition + vec2(0.5));\n + gl_Position = uMvpMatrix * vec4(aPosition, 1.0);\n + vTexCoord = aTexCoord;\n }\n ); @@ -161,7 +159,8 @@ const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER( }\n ); -const size_t INVALID_TEXTURE_ID = (size_t)-1; +const char * const TEXTURE_RECT_UNIFORM_NAME( "sTextureRect" ); + const int INVALID_RENDERER_ID = -1; const uint16_t MAXIMUM_GRID_SIZE = 2048; } @@ -176,13 +175,13 @@ ImageActorPtr ImageActor::New() //Create the renderer actor->mRenderer = Renderer::New(); - GeometryPtr quad = CreateGeometry( 1u, 1u ); + GeometryPtr quad = CreateGeometry( 1u, 1u, Vector2::ONE ); actor->mRenderer->SetGeometry( *quad ); - ShaderPtr shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER, Dali::Shader::HINT_NONE ); - MaterialPtr material = Material::New(); - material->SetShader( *shader ); - actor->mRenderer->SetMaterial( *material ); + ShaderPtr shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER, Dali::Shader::Hint::NONE ); + actor->mRenderer->SetShader( *shader ); + TextureSetPtr textureSet = TextureSet::New(); + actor->mRenderer->SetTextures( *textureSet ); return actor; } @@ -208,7 +207,9 @@ void ImageActor::SetImage( ImagePtr& image ) SamplerPtr sampler = Sampler::New(); sampler->SetFilterMode( mMinFilter, mMagFilter ); - mTextureIndex = mRenderer->GetMaterial()->AddTexture( image, "sTexture", sampler ); + TextureSet* textureSet( mRenderer->GetTextures() ); + textureSet->SetImage( 0u, image.Get() ); + textureSet->SetSampler( 0u, sampler ); if( mRendererIndex == INVALID_RENDERER_ID ) { @@ -227,7 +228,7 @@ void ImageActor::SetImage( ImagePtr& image ) ImagePtr ImageActor::GetImage() const { - return mRenderer->GetMaterial()->GetTexture( mTextureIndex ); + return mRenderer->GetTextures()->GetImage( 0u ); } void ImageActor::SetPixelArea( const PixelArea& pixelArea ) @@ -270,34 +271,33 @@ void ImageActor::ClearPixelArea() void ImageActor::SetStyle( Dali::ImageActor::Style style ) { - DALI_LOG_WARNING( "SetStyle Deprecated. Only STYLE_QUAD supported." ); + DALI_LOG_WARNING( "SetStyle Deprecated. Only STYLE_QUAD supported.\n" ); mStyle = style; } Dali::ImageActor::Style ImageActor::GetStyle() const { - DALI_LOG_WARNING( "GetStyle Deprecated. Only STYLE_QUAD supported." ); + DALI_LOG_WARNING( "GetStyle Deprecated. Only STYLE_QUAD supported.\n" ); return mStyle; } void ImageActor::SetNinePatchBorder( const Vector4& border ) { - DALI_LOG_WARNING( "SetNinePatchBorder Deprecated. Only STYLE_QUAD supported." ); + DALI_LOG_WARNING( "SetNinePatchBorder Deprecated. Only STYLE_QUAD supported.\n" ); mNinePatchBorder = border; } Vector4 ImageActor::GetNinePatchBorder() const { - DALI_LOG_WARNING( "GetNinePatchBorder Deprecated. Only STYLE_QUAD supported." ); + DALI_LOG_WARNING( "GetNinePatchBorder Deprecated. Only STYLE_QUAD supported.\n" ); return mNinePatchBorder; } ImageActor::ImageActor() : Actor( Actor::BASIC ), + mActorSize( Vector2::ZERO ), mGridSize( 1u, 1u ), mRendererIndex( INVALID_RENDERER_ID ), - mTextureIndex( INVALID_TEXTURE_ID ), - mEffectTextureIndex( INVALID_TEXTURE_ID ), mMinFilter( FilterMode::DEFAULT ), mMagFilter( FilterMode::DEFAULT ), mStyle( Dali::ImageActor::STYLE_QUAD ), @@ -352,14 +352,11 @@ void ImageActor::UpdateGeometry() gridHeight = std::min( MAXIMUM_GRID_SIZE, static_cast(gridSize.height) ); } - if( gridWidth != mGridSize.GetWidth() || gridHeight != mGridSize.GetHeight() ) - { - mGridSize.SetWidth( gridWidth ); - mGridSize.SetHeight( gridHeight ); + mGridSize.SetWidth( gridWidth ); + mGridSize.SetHeight( gridHeight ); - GeometryPtr geometry = CreateGeometry( gridWidth, gridHeight ); - mRenderer->SetGeometry( *geometry ); - } + GeometryPtr geometry = CreateGeometry( gridWidth, gridHeight, mActorSize ); + mRenderer->SetGeometry( *geometry ); } void ImageActor::UpdateTexureRect() { @@ -378,8 +375,7 @@ void ImageActor::UpdateTexureRect() textureRect.w = vScale * float(mPixelArea.y + mPixelArea.height); } - Material* material = mRenderer->GetMaterial(); - material->RegisterProperty( "uTextureRect", textureRect ); + mRenderer->RegisterProperty( TEXTURE_RECT_UNIFORM_NAME, textureRect ); } unsigned int ImageActor::GetDefaultPropertyCount() const @@ -609,62 +605,52 @@ float ImageActor::GetSortModifier() const return mRenderer->GetDepthIndex(); } -void ImageActor::SetCullFace(CullFaceMode mode) -{ - mRenderer->GetMaterial()->SetFaceCullingMode( static_cast< Dali::Material::FaceCullingMode >( mode ) ); -} - -CullFaceMode ImageActor::GetCullFace() const -{ - return static_cast< CullFaceMode >( mRenderer->GetMaterial()->GetFaceCullingMode() ); -} - void ImageActor::SetBlendMode( BlendingMode::Type mode ) { - mRenderer->GetMaterial()->SetBlendMode( mode ); + mRenderer->SetBlendMode( static_cast( mode ) ); } BlendingMode::Type ImageActor::GetBlendMode() const { - return mRenderer->GetMaterial()->GetBlendMode(); + return static_cast( mRenderer->GetBlendMode() ); } void ImageActor::SetBlendFunc( BlendingFactor::Type srcFactorRgba, BlendingFactor::Type destFactorRgba ) { - mRenderer->GetMaterial()->SetBlendFunc( srcFactorRgba, destFactorRgba, srcFactorRgba, destFactorRgba ); + mRenderer->SetBlendFunc( static_cast(srcFactorRgba), static_cast(destFactorRgba), static_cast(srcFactorRgba), static_cast(destFactorRgba) ); } void ImageActor::SetBlendFunc( BlendingFactor::Type srcFactorRgb, BlendingFactor::Type destFactorRgb, BlendingFactor::Type srcFactorAlpha, BlendingFactor::Type destFactorAlpha ) { - mRenderer->GetMaterial()->SetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha ); + mRenderer->SetBlendFunc( static_cast(srcFactorRgb), static_cast(destFactorRgb), static_cast(srcFactorAlpha), static_cast(destFactorAlpha) ); } void ImageActor::GetBlendFunc( BlendingFactor::Type& srcFactorRgb, BlendingFactor::Type& destFactorRgb, BlendingFactor::Type& srcFactorAlpha, BlendingFactor::Type& destFactorAlpha ) const { - mRenderer->GetMaterial()->GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha ); + mRenderer->GetBlendFunc( reinterpret_cast(srcFactorRgb), reinterpret_cast(destFactorRgb), reinterpret_cast(srcFactorAlpha), reinterpret_cast(destFactorAlpha) ); } void ImageActor::SetBlendEquation( BlendingEquation::Type equationRgba ) { - mRenderer->GetMaterial()->SetBlendEquation( equationRgba, equationRgba ); + mRenderer->SetBlendEquation( static_cast(equationRgba), static_cast(equationRgba) ); } void ImageActor::SetBlendEquation( BlendingEquation::Type equationRgb, BlendingEquation::Type equationAlpha ) { - mRenderer->GetMaterial()->SetBlendEquation( equationRgb, equationAlpha ); + mRenderer->SetBlendEquation( static_cast(equationRgb), static_cast(equationAlpha) ); } void ImageActor::GetBlendEquation( BlendingEquation::Type& equationRgb, BlendingEquation::Type& equationAlpha ) const { - mRenderer->GetMaterial()->GetBlendEquation( equationRgb, equationAlpha ); + mRenderer->GetBlendEquation( reinterpret_cast(equationRgb), reinterpret_cast(equationAlpha) ); } void ImageActor::SetBlendColor( const Vector4& color ) { mBlendColor = color; - mRenderer->GetMaterial()->SetBlendColor( mBlendColor ); + mRenderer->SetBlendColor( mBlendColor ); } const Vector4& ImageActor::GetBlendColor() const @@ -677,13 +663,9 @@ void ImageActor::SetFilterMode( FilterMode::Type minFilter, FilterMode::Type mag mMinFilter = minFilter; mMagFilter = magFilter; - if( mTextureIndex != INVALID_TEXTURE_ID ) - { - SamplerPtr sampler = Sampler::New(); - sampler->SetFilterMode( minFilter, magFilter ); - - mRenderer->GetMaterial()->SetTextureSampler( mTextureIndex, sampler.Get() ); - } + SamplerPtr sampler = Sampler::New(); + sampler->SetFilterMode( minFilter, magFilter ); + mRenderer->GetTextures()->SetSampler( 0u, sampler.Get() ); } void ImageActor::GetFilterMode( FilterMode::Type& minFilter, FilterMode::Type& magFilter ) const @@ -703,7 +685,7 @@ void ImageActor::SetShaderEffect( ShaderEffect& effect ) effect.Connect( this ); ShaderPtr shader = mShaderEffect->GetShader(); - mRenderer->GetMaterial()->SetShader( *shader ); + mRenderer->SetShader( *shader ); EffectImageUpdated(); @@ -721,8 +703,8 @@ void ImageActor::RemoveShaderEffect() { mShaderEffect->Disconnect( this ); // change to the standard shader and quad geometry - ShaderPtr shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER, Dali::Shader::HINT_NONE ); - mRenderer->GetMaterial()->SetShader( *shader ); + ShaderPtr shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER, Dali::Shader::Hint::NONE ); + mRenderer->SetShader( *shader ); mShaderEffect.Reset(); UpdateGeometry(); @@ -737,25 +719,31 @@ void ImageActor::EffectImageUpdated() if( effectImage ) { Image& effectImageImpl = GetImplementation( effectImage ); - - if( mEffectTextureIndex == INVALID_TEXTURE_ID ) - { - mEffectTextureIndex = mRenderer->GetMaterial()->AddTexture( &effectImageImpl, "sEffect", NULL ); - } - else - { - mRenderer->GetMaterial()->SetTextureImage( mEffectTextureIndex, &effectImageImpl ); - } + mRenderer->GetTextures()->SetImage( 1u, &effectImageImpl ); } else { - if( mEffectTextureIndex != INVALID_TEXTURE_ID ) - { - mRenderer->GetMaterial()->RemoveTexture( mEffectTextureIndex ); - } - mEffectTextureIndex = INVALID_TEXTURE_ID; + mRenderer->GetTextures()->SetImage( 1u, 0 ); } + } +} + +void ImageActor::OnRelayout( const Vector2& size, RelayoutContainer& container ) +{ + if( mActorSize != size ) + { + mActorSize = size; + UpdateGeometry(); + } +} +void ImageActor::OnSizeSet( const Vector3& targetSize ) +{ + Vector2 size( targetSize.x, targetSize.y ); + if( mActorSize != size ) + { + mActorSize = size; + UpdateGeometry(); } }