/*
- * 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.
// INTERNAL INCLUDES
#include <dali/public-api/animation/constraints.h> // for EqualToConstraint
#include <dali/public-api/object/type-registry.h>
+#include <dali/public-api/rendering/renderer.h>
#include <dali/devel-api/scripting/scripting.h>
#include <dali/internal/event/animation/constraint-impl.h>
#include <dali/internal/event/common/property-helper.h>
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 )
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 )
}
}
-
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
);
}\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;
}
//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;
}
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 )
{
ImagePtr ImageActor::GetImage() const
{
- return mRenderer->GetMaterial()->GetTexture( mTextureIndex );
+ return mRenderer->GetTextures()->GetImage( 0u );
}
void ImageActor::SetPixelArea( const PixelArea& pixelArea )
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 ),
gridHeight = std::min( MAXIMUM_GRID_SIZE, static_cast<uint16_t>(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()
{
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
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<BlendMode::Type>( mode ) );
}
BlendingMode::Type ImageActor::GetBlendMode() const
{
- return mRenderer->GetMaterial()->GetBlendMode();
+ return static_cast<BlendingMode::Type>( mRenderer->GetBlendMode() );
}
void ImageActor::SetBlendFunc( BlendingFactor::Type srcFactorRgba, BlendingFactor::Type destFactorRgba )
{
- mRenderer->GetMaterial()->SetBlendFunc( srcFactorRgba, destFactorRgba, srcFactorRgba, destFactorRgba );
+ mRenderer->SetBlendFunc( static_cast<BlendFactor::Type>(srcFactorRgba), static_cast<BlendFactor::Type>(destFactorRgba), static_cast<BlendFactor::Type>(srcFactorRgba), static_cast<BlendFactor::Type>(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<BlendFactor::Type>(srcFactorRgb), static_cast<BlendFactor::Type>(destFactorRgb), static_cast<BlendFactor::Type>(srcFactorAlpha), static_cast<BlendFactor::Type>(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<BlendFactor::Type&>(srcFactorRgb), reinterpret_cast<BlendFactor::Type&>(destFactorRgb), reinterpret_cast<BlendFactor::Type&>(srcFactorAlpha), reinterpret_cast<BlendFactor::Type&>(destFactorAlpha) );
}
void ImageActor::SetBlendEquation( BlendingEquation::Type equationRgba )
{
- mRenderer->GetMaterial()->SetBlendEquation( equationRgba, equationRgba );
+ mRenderer->SetBlendEquation( static_cast<BlendEquation::Type>(equationRgba), static_cast<BlendEquation::Type>(equationRgba) );
}
void ImageActor::SetBlendEquation( BlendingEquation::Type equationRgb, BlendingEquation::Type equationAlpha )
{
- mRenderer->GetMaterial()->SetBlendEquation( equationRgb, equationAlpha );
+ mRenderer->SetBlendEquation( static_cast<BlendEquation::Type>(equationRgb), static_cast<BlendEquation::Type>(equationAlpha) );
}
void ImageActor::GetBlendEquation( BlendingEquation::Type& equationRgb, BlendingEquation::Type& equationAlpha ) const
{
- mRenderer->GetMaterial()->GetBlendEquation( equationRgb, equationAlpha );
+ mRenderer->GetBlendEquation( reinterpret_cast<BlendEquation::Type&>(equationRgb), reinterpret_cast<BlendEquation::Type&>(equationAlpha) );
}
void ImageActor::SetBlendColor( const Vector4& color )
{
mBlendColor = color;
- mRenderer->GetMaterial()->SetBlendColor( mBlendColor );
+ mRenderer->SetBlendColor( mBlendColor );
}
const Vector4& ImageActor::GetBlendColor() const
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
effect.Connect( this );
ShaderPtr shader = mShaderEffect->GetShader();
- mRenderer->GetMaterial()->SetShader( *shader );
+ mRenderer->SetShader( *shader );
EffectImageUpdated();
{
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();
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();
}
}