#include <limits>
#include <stack>
#include <dali/public-api/actors/image-actor.h>
-#include <dali/public-api/actors/renderer.h>
#include <dali/public-api/animation/constraint.h>
#include <dali/public-api/animation/constraints.h>
-#include <dali/public-api/geometry/geometry.h>
#include <dali/public-api/object/type-registry.h>
+#include <dali/public-api/size-negotiation/relayout-container.h>
#include <dali/devel-api/object/type-registry-helper.h>
+#include <dali/devel-api/rendering/renderer.h>
#include <dali/devel-api/scripting/scripting.h>
-#include <dali/public-api/shader-effects/shader.h>
-#include <dali/public-api/shader-effects/material.h>
-#include <dali/public-api/size-negotiation/relayout-container.h>
#include <dali/integration-api/debug.h>
// INTERNAL INCLUDES
Vector2( 0.5f, 0.5f )
};
-struct VertexWithTexture
-{
- Vector2 position;
- Vector2 texCoord;
-};
-
-VertexWithTexture gQuadWithTexture[] = {
- { Vector2( -0.5f, -0.5f ), Vector2( 0.0f, 0.0f ) },
- { Vector2( 0.5f, -0.5f ), Vector2( 1.0f, 0.0f ) },
- { Vector2( -0.5f, 0.5f ), Vector2( 0.0f, 1.0f ) },
- { Vector2( 0.5f, 0.5f ), Vector2( 1.0f, 1.0f ) }
-};
const char* VERTEX_SHADER_COLOR = DALI_COMPOSE_SHADER(
attribute mediump vec2 aPosition;\n
}\n
);
-const char* VERTEX_SHADER_TEXTURE = DALI_COMPOSE_SHADER(
- attribute mediump vec2 aPosition;\n
- attribute mediump vec2 aTexCoord;\n
- uniform mediump mat4 uMvpMatrix;\n
- varying mediump vec2 vTexCoord;\n
- void main()\n
- {\n
- gl_Position = uMvpMatrix * vec4( aPosition, 0.0, 1.0 );\n
- vTexCoord = aTexCoord;\n
- }\n
-);
-
-const char* FRAGMENT_SHADER_TEXTURE = DALI_COMPOSE_SHADER(
- uniform lowp vec4 uBackgroundColor;\n
- uniform lowp vec4 uColor;\n
- uniform sampler2D sTexture;\n
- varying mediump vec2 vTexCoord;\n
-
- void main()\n
- {\n
- gl_FragColor = texture2D( sTexture, vTexCoord ) * uBackgroundColor * uColor;\n
- }\n
-);
/**
* @brief Create the background actor for the control.
*/
Actor CreateBackground( Actor parent, const Vector4& color, Image image = Image() )
{
- PropertyBuffer vertexBuffer;
- Shader shader;
- Material material;
- if( image )
+ if( !image )
{
- Property::Map vertexFormat;
- vertexFormat["aPosition"] = Property::VECTOR2;
- vertexFormat["aTexCoord"] = Property::VECTOR2;
-
- //Create a vertex buffer for vertex positions and texture coordinates
- vertexBuffer = PropertyBuffer::New( vertexFormat, 4u );
- vertexBuffer.SetData( gQuadWithTexture );
+ PropertyBuffer vertexBuffer;
+ Shader shader;
+ Material material;
- shader = Shader::New( VERTEX_SHADER_TEXTURE, FRAGMENT_SHADER_TEXTURE );
- Sampler textureSampler = Sampler::New( image, "sTexture" );
- material = Material::New( shader );
- material.AddSampler(textureSampler);
- }
- else
- {
Property::Map vertexFormat;
vertexFormat["aPosition"] = Property::VECTOR2;
shader = Shader::New( VERTEX_SHADER_COLOR, FRAGMENT_SHADER_COLOR );
material = Material::New( shader );
- }
- //Create the index buffer
- Property::Map indexFormat;
- indexFormat["indices"] = Property::UNSIGNED_INTEGER;
- PropertyBuffer indexBuffer = PropertyBuffer::New( indexFormat, 6u );
- indexBuffer.SetData(gQuadIndex);
-
- //Create the geometry
- Geometry mesh = Geometry::New();
- mesh.AddVertexBuffer( vertexBuffer );
- mesh.SetIndexBuffer( indexBuffer );
-
- //Add uniforms to the shader
- shader.RegisterProperty( "uBackgroundColor", color );
-
- //Create the renderer
- Renderer renderer = Renderer::New( mesh, material );
- renderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX );
-
- //Create the actor
- Actor meshActor = Actor::New();
- meshActor.SetSize( Vector3::ONE );
- meshActor.AddRenderer( renderer );
- meshActor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
- meshActor.SetColorMode( USE_PARENT_COLOR );
+ //Create the index buffer
+ Property::Map indexFormat;
+ indexFormat["indices"] = Property::UNSIGNED_INTEGER;
+ PropertyBuffer indexBuffer = PropertyBuffer::New( indexFormat, 6u );
+ indexBuffer.SetData(gQuadIndex);
+
+ //Create the geometry
+ Geometry mesh = Geometry::New();
+ mesh.AddVertexBuffer( vertexBuffer );
+ mesh.SetIndexBuffer( indexBuffer );
+
+ //Add uniforms to the shader
+ shader.RegisterProperty( "uBackgroundColor", color );
+
+ //Create the renderer
+ Renderer renderer = Renderer::New( mesh, material );
+ renderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX );
+
+ //Create the actor
+ Actor meshActor = Actor::New();
+ meshActor.SetSize( Vector3::ONE );
+ meshActor.AddRenderer( renderer );
+ meshActor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
+ meshActor.SetColorMode( USE_PARENT_COLOR );
+
+ //Constraint scale of the mesh actor to the size of the control
+ Constraint constraint = Constraint::New<Vector3>( meshActor,
+ Actor::Property::SCALE,
+ EqualToConstraint() );
+ constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
+ constraint.Apply();
+
+ return meshActor;
+ }
+ else
+ {
+ ImageActor imageActor = ImageActor::New( image );
+ imageActor.SetColor( color );
+ imageActor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
+ imageActor.SetColorMode( USE_OWN_MULTIPLY_PARENT_COLOR );
+ imageActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
- //Constraint scale of the mesh actor to the size of the control
- Constraint constraint = Constraint::New<Vector3>( meshActor,
- Actor::Property::SCALE,
- EqualToConstraint() );
- constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
- constraint.Apply();
+ return imageActor;
+ }
- return meshActor;
}
} // unnamed namespace
case Toolkit::Control::Property::BACKGROUND_IMAGE:
{
- if ( value.HasKey( "image" ) )
+ Image image = Scripting::NewImage( value );
+ if ( image )
{
- Property::Map imageMap = value.GetValue( "image" ).Get< Property::Map >();
- Image image = Scripting::NewImage( imageMap );
-
- if ( image )
- {
- controlImpl.SetBackgroundImage( image );
- }
+ controlImpl.SetBackgroundImage( image );
}
- else if ( value.Get< Property::Map >().Empty() )
+ else
{
// An empty map means the background is no longer required
controlImpl.ClearBackground();
Property::Map map;
Background* back = controlImpl.mImpl->mBackground;
- if ( back && back->actor && back->actor.GetRendererAt(0).GetMaterial().GetNumberOfSamplers() > 0)
+ if ( back && back->actor )
{
- Image image = back->actor.GetRendererAt(0).GetMaterial().GetSamplerAt(0).GetImage();
- if ( image )
+ if( back->actor.GetRendererCount() > 0 && back->actor.GetRendererAt(0).GetMaterial().GetNumberOfSamplers() > 0 )
+ {
+ Image image = back->actor.GetRendererAt(0).GetMaterial().GetSamplerAt(0).GetImage();
+ if ( image )
+ {
+ Scripting::CreatePropertyMap( image, map );
+ }
+ }
+ else
{
- Property::Map imageMap;
- Scripting::CreatePropertyMap( image, imageMap );
- map[ "image" ] = imageMap;
+ ImageActor imageActor = ImageActor::DownCast( back->actor );
+ if ( imageActor )
+ {
+ Image image = imageActor.GetImage();
+ Scripting::CreatePropertyMap( image, map );
+ }
}
}
if ( background.actor )
{
- Shader shader = background.actor.GetRendererAt(0).GetMaterial().GetShader();
- shader.SetProperty( shader.GetPropertyIndex("uBackgroundColor"), color );
+ if( background.actor.GetRendererCount() > 0 )
+ {
+ Shader shader = background.actor.GetRendererAt(0).GetMaterial().GetShader();
+ shader.SetProperty( shader.GetPropertyIndex("uBackgroundColor"), color );
+ }
+ else
+ {
+ background.actor.SetColor( color );
+ }
}
else
{
void Control::SetBackgroundImage( Image image )
{
Background& background( mImpl->GetBackground() );
- if( !background.actor || background.actor.GetRendererAt(0).GetMaterial().GetNumberOfSamplers() == 0)
- {
- // Remove current actor as it has not texture coordinates
- if( background.actor )
- {
- mImpl->mAddRemoveBackgroundChild = true;
- Self().Remove( background.actor );
- mImpl->mAddRemoveBackgroundChild = false;
- background.actor.Reset();
- }
- //Create a new actor with texture coordinates
- Actor actor = CreateBackground(Self(), background.color, image);
- mImpl->mAddRemoveBackgroundChild = true;
- // use insert to guarantee its the first child (so that OVERLAY mode works)
- Self().Insert( 0, actor );
- mImpl->mAddRemoveBackgroundChild = false;
- background.actor = actor;
- }
- else
- {
- //Change sampler image
- Sampler sampler = background.actor.GetRendererAt(0).GetMaterial().GetSamplerAt(0);
- sampler.SetImage(image);
- }
+ if ( background.actor )
+ {
+ // Remove Current actor, unset AFTER removal
+ mImpl->mAddRemoveBackgroundChild = true;
+ Self().Remove( background.actor );
+ mImpl->mAddRemoveBackgroundChild = false;
+ background.actor.Reset();
+ }
+
+ Actor actor = CreateBackground(Self(), background.color, image);
+
+ // Set the background actor before adding so that we do not inform derived classes
+ background.actor = actor;
+ mImpl->mAddRemoveBackgroundChild = true;
+ // use insert to guarantee its the first child (so that OVERLAY mode works)
+ Self().Insert( 0, actor );
+ mImpl->mAddRemoveBackgroundChild = false;
}
void Control::ClearBackground()
void Control::Initialize()
{
+ // Call deriving classes so initialised before styling is applied to them.
+ OnInitialize();
+
if( mImpl->mFlags & REQUIRES_STYLE_CHANGE_SIGNALS )
{
Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
// Register for style changes
styleManager.StyleChangeSignal().Connect( this, &Control::OnStyleChange );
- // SetTheme
+ // Apply the current style
GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) );
}
{
SetKeyboardNavigationSupport( true );
}
-
- // Calling deriving classes
- OnInitialize();
}
void Control::OnInitialize()
if( mImpl->mBackground )
{
- Renderer backgroundRenderer = mImpl->mBackground->actor.GetRendererAt( 0 );
- if(backgroundRenderer)
+ if(mImpl->mBackground->actor.GetRendererCount() > 0 )
{
- backgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX+depth );
+ Renderer backgroundRenderer = mImpl->mBackground->actor.GetRendererAt( 0 );
+ if(backgroundRenderer)
+ {
+ backgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX+depth );
+ }
+ }
+ else
+ {
+
+ ImageActor imageActor = ImageActor::DownCast( mImpl->mBackground->actor );
+ if ( imageActor )
+ {
+ imageActor.SetSortModifier( BACKGROUND_DEPTH_INDEX+depth );
+ }
}
}
}
Vector3 naturalSize = Vector3::ZERO;
if( mImpl->mBackground )
{
- Material backgroundMaterial = mImpl->mBackground->actor.GetRendererAt(0).GetMaterial();
- if( backgroundMaterial.GetNumberOfSamplers() > 0 )
+ if( mImpl->mBackground->actor.GetRendererCount() > 0 )
{
- Image backgroundImage = backgroundMaterial.GetSamplerAt(0).GetImage();
- if( backgroundImage )
+ Material backgroundMaterial = mImpl->mBackground->actor.GetRendererAt(0).GetMaterial();
+ if( backgroundMaterial.GetNumberOfSamplers() > 0 )
{
- naturalSize.x = backgroundImage.GetWidth();
- naturalSize.y = backgroundImage.GetHeight();
+ Image backgroundImage = backgroundMaterial.GetSamplerAt(0).GetImage();
+ if( backgroundImage )
+ {
+ naturalSize.x = backgroundImage.GetWidth();
+ naturalSize.y = backgroundImage.GetHeight();
+ }
}
}
+ else
+ {
+ return mImpl->mBackground->actor.GetNaturalSize();
+ }
}
return naturalSize;