From 28ee17686d2f44d5a901e87a8cada9ccd1f151e8 Mon Sep 17 00:00:00 2001 From: Ferran Sole Date: Thu, 24 Nov 2016 14:52:51 +0000 Subject: [PATCH] Changed bubble effect to use new texture API * Bubble effect uses new texture API * Removed unneded actors Change-Id: I2a682599928e118194c399417990ec7b417fba99 --- .../src/dali-toolkit/utc-Dali-BubbleEmitter.cpp | 86 ++++----- .../controls/bubble-effect/bubble-emitter.cpp | 12 +- .../controls/bubble-effect/bubble-emitter.h | 15 +- .../controls/bubble-effect/bubble-actor.cpp | 176 ----------------- .../controls/bubble-effect/bubble-effect.h | 2 +- .../controls/bubble-effect/bubble-emitter-impl.cpp | 213 ++++++++++++++------- .../controls/bubble-effect/bubble-emitter-impl.h | 36 ++-- .../controls/bubble-effect/bubble-renderer.cpp | 143 ++++++++++++++ .../{bubble-actor.h => bubble-renderer.h} | 49 ++--- dali-toolkit/internal/file.list | 2 +- 10 files changed, 377 insertions(+), 357 deletions(-) delete mode 100644 dali-toolkit/internal/controls/bubble-effect/bubble-actor.cpp create mode 100644 dali-toolkit/internal/controls/bubble-effect/bubble-renderer.cpp rename dali-toolkit/internal/controls/bubble-effect/{bubble-actor.h => bubble-renderer.h} (79%) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-BubbleEmitter.cpp b/automated-tests/src/dali-toolkit/utc-Dali-BubbleEmitter.cpp index 4c711f3..a4575fc 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-BubbleEmitter.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-BubbleEmitter.cpp @@ -75,30 +75,10 @@ static int Wait(ToolkitTestApplication& application, int duration = 0) return time; } -static Image CreateSolidColorImage( ToolkitTestApplication& application, const Vector4& color, unsigned int width, unsigned int height ) +static Texture CreateSolidColorTexture( ToolkitTestApplication& application, const Vector4& color, unsigned int width, unsigned int height ) { - BufferImage imageData = BufferImage::New( width, height, Pixel::RGBA8888 ); - - // Create the image - PixelBuffer* pixbuf = imageData.GetBuffer(); - unsigned int size = width * height; - - for( size_t i = 0; i < size; i++ ) - { - pixbuf[i*4+0] = 0xFF * color.r; - pixbuf[i*4+1] = 0xFF * color.g; - pixbuf[i*4+2] = 0xFF * color.b; - pixbuf[i*4+3] = 0xFF * color.a; - } - imageData.Update(); - - application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE ); - application.SendNotification(); - application.Render(RENDER_FRAME_INTERVAL); - application.Render(RENDER_FRAME_INTERVAL); - application.SendNotification(); - - return imageData; + Texture texture = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height ); + return texture; } }//namespace @@ -114,7 +94,7 @@ int UtcDaliBubbleEmitterNew(void) DALI_TEST_CHECK( !emitter ); // Test object creation - Image shapeImage = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); + Texture shapeImage = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage, 200, Vector2( 5.f, 10.f )); DALI_TEST_CHECK( emitter ); @@ -146,7 +126,7 @@ int UtcDaliBubbleEmitterDownCast01(void) tet_infoline(" UtcDaliBubbleEmitterDownCast01 "); - Image shapeImage = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); + Texture shapeImage = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); BubbleEmitter emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage, 200, Vector2( 5.f, 10.f )); BaseHandle handle(emitter); @@ -172,12 +152,12 @@ int UtcDaliBubbleEmitterGetRootActor(void) ToolkitTestApplication application; tet_infoline( " UtcDaliBubbleEmitterGetRootActor " ); - Image shapeImage = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); + Texture shapeImage = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); BubbleEmitter emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage, 270, Vector2( 5.f, 10.f )); Actor root = emitter.GetRootActor(); DALI_TEST_CHECK( root ); - DALI_TEST_CHECK( root.GetChildCount() == 3 ); + DALI_TEST_CHECK( root.GetChildCount() == 0 ); END_TEST; } @@ -186,13 +166,13 @@ int UtcDaliBubbleEmitterSetBackground(void) ToolkitTestApplication application; tet_infoline( " UtcDaliBubbleEmitterSetBackground " ); - Image shapeImage = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); + Texture shapeImage = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); BubbleEmitter emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage, 200, Vector2( 5.f, 10.f )); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); unsigned int taskCount = taskList.GetTaskCount(); - Image bgImage = CreateSolidColorImage( application, Color::RED, 50, 50 ); + Texture bgImage = CreateSolidColorTexture( application, Color::RED, 50, 50 ); emitter.SetBackground( bgImage, Vector3(0.f, 0.f, 0.5f) ); DALI_TEST_CHECK( taskList.GetTaskCount() == taskCount+1 ); @@ -213,7 +193,7 @@ int UtcDaliBubbleEmitterSetBubbleScale(void) ToolkitTestApplication application; tet_infoline( " UtcDaliBubbleEmitterSetBubbleScale " ); - Image shapeImage = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); + Texture shapeImage = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); BubbleEmitter emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage, 150, Vector2( 5.f, 10.f )); DALI_TEST_CHECK(emitter); Actor root = emitter.GetRootActor(); @@ -248,7 +228,7 @@ int UtcDaliBubbleEmitterSetBubbleDensity01(void) ToolkitTestApplication application; tet_infoline( " UtcDaliBubbleEmitterSetBubbleDensity " ); - Image shapeImage = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); + Texture shapeImage = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); BubbleEmitter emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage, 200, Vector2( 5.f, 10.f )); try @@ -269,7 +249,7 @@ int UtcDaliBubbleEmitterSetBubbleDensity02(void) ToolkitTestApplication application; tet_infoline( " UtcDaliBubbleEmitterSetBubbleDensity " ); - Image shapeImage = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); + Texture shapeImage = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); BubbleEmitter emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage, 200, Vector2( 5.f, 10.f )); try @@ -289,39 +269,39 @@ int UtcDaliBubbleEmitterEmitBubble(void) ToolkitTestApplication application; tet_infoline( " UtcDaliBubbleEmitterEmitBubble " ); - Image shapeImage1 = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); + Texture shapeImage1 = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); BubbleEmitter emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage1, 200, Vector2( 5.f, 10.f )); Actor root = emitter.GetRootActor(); - Actor bubbleMesh = root.GetChildAt( 0 ); + Renderer bubbleRenderer = root.GetRendererAt( 0 ); Stage::GetCurrent().Add( root ); - DALI_TEST_CHECK( bubbleMesh ); + DALI_TEST_CHECK( bubbleRenderer ); - Property::Index propertyIndex0 = bubbleMesh.GetPropertyIndex( "uPercentage[0]" ); - Property::Index propertyIndex1 = bubbleMesh.GetPropertyIndex( "uPercentage[1]" ); + Property::Index propertyIndex0 = bubbleRenderer.GetPropertyIndex( "uPercentage[0]" ); + Property::Index propertyIndex1 = bubbleRenderer.GetPropertyIndex( "uPercentage[1]" ); float value0, value1; Animation animation = Animation::New( 0.5f ); emitter.EmitBubble( animation, Vector2(40.f,40.f), Vector2(-5.f,-5.f), Vector2(30.f,30.f) ); emitter.EmitBubble( animation, Vector2(10.f,10.f), Vector2(5.f,5.f), Vector2(30.f,30.f) ); - (bubbleMesh.GetProperty(propertyIndex0)).Get( value0 ); - (bubbleMesh.GetProperty(propertyIndex1)).Get( value1 ); + (bubbleRenderer.GetProperty(propertyIndex0)).Get( value0 ); + (bubbleRenderer.GetProperty(propertyIndex1)).Get( value1 ); DALI_TEST_EQUALS(value0, 0.f, TEST_LOCATION ); DALI_TEST_EQUALS(value1, 0.f, TEST_LOCATION ); animation.Play(); Wait(application, 300); - propertyIndex0 = bubbleMesh.GetPropertyIndex( "uPercentage[0]" ); - propertyIndex1 = bubbleMesh.GetPropertyIndex( "uPercentage[1]" ); - (bubbleMesh.GetProperty(propertyIndex0)).Get( value0 ); - (bubbleMesh.GetProperty(propertyIndex1)).Get( value1 ); + propertyIndex0 = bubbleRenderer.GetPropertyIndex( "uPercentage[0]" ); + propertyIndex1 = bubbleRenderer.GetPropertyIndex( "uPercentage[1]" ); + (bubbleRenderer.GetProperty(propertyIndex0)).Get( value0 ); + (bubbleRenderer.GetProperty(propertyIndex1)).Get( value1 ); DALI_TEST_CHECK( value0 >= 0.6f ); DALI_TEST_CHECK( value1 >= 0.6f ); Wait(application,500); - (bubbleMesh.GetProperty(propertyIndex0)).Get( value0 ); - (bubbleMesh.GetProperty(propertyIndex1)).Get( value1 ); + (bubbleRenderer.GetProperty(propertyIndex0)).Get( value0 ); + (bubbleRenderer.GetProperty(propertyIndex1)).Get( value1 ); DALI_TEST_EQUALS(value0, 1.f, TEST_LOCATION ); DALI_TEST_EQUALS(value1, 1.f, TEST_LOCATION ); END_TEST; @@ -332,16 +312,16 @@ int UtcDaliBubbleEmitterRestore(void) ToolkitTestApplication application; tet_infoline( " UtcDaliBubbleEmitterRestore " ); - Image shapeImage = CreateSolidColorImage( application, Color::GREEN, 5, 5 ); - BubbleEmitter emitter = BubbleEmitter::New( Vector2(50.f,50.f),shapeImage, 90, Vector2( 5.f, 10.f )); + Vector2 movementArea(50.f,50.f); + Texture shapeImage = CreateSolidColorTexture( application, Color::GREEN, 5, 5 ); + BubbleEmitter emitter = BubbleEmitter::New( movementArea,shapeImage, 90, Vector2( 5.f, 10.f )); Actor root = emitter.GetRootActor(); Stage::GetCurrent().Add( root ); root.SetPosition( Vector3::ZERO ); root.SetParentOrigin( ParentOrigin::CENTER ); root.SetAnchorPoint( AnchorPoint::CENTER ); - Actor bubbleMesh = root.GetChildAt( 0 ); - Renderer renderer = bubbleMesh.GetRendererAt( 0 ); + Renderer renderer = root.GetRendererAt( 0 ); DALI_TEST_CHECK( renderer ); TestGlAbstraction& gl = application.GetGlAbstraction(); @@ -358,8 +338,8 @@ int UtcDaliBubbleEmitterRestore(void) DALI_TEST_EQUALS( percentageValue, 0.f, TEST_LOCATION ); DALI_TEST_CHECK( gl.GetUniformValue( "uStartEndPosition[0]", startEndPosValue ) ); - DALI_TEST_EQUALS( startEndPosValue.x, 40.f, TEST_LOCATION ); - DALI_TEST_EQUALS( startEndPosValue.y, 40.f, TEST_LOCATION ); + DALI_TEST_EQUALS( startEndPosValue.x, 40.f - movementArea.x*0.5f, TEST_LOCATION ); + DALI_TEST_EQUALS( startEndPosValue.y, 40.f- movementArea.x*0.5f, TEST_LOCATION ); animation.Play(); Wait(application, 200); @@ -369,8 +349,8 @@ int UtcDaliBubbleEmitterRestore(void) DALI_TEST_CHECK( percentageValue < 0.5f && percentageValue >= 0.4); DALI_TEST_CHECK( gl.GetUniformValue( "uStartEndPosition[0]", startEndPosValue ) ); - DALI_TEST_EQUALS( startEndPosValue.x, 40.f, TEST_LOCATION ); - DALI_TEST_EQUALS( startEndPosValue.y, 40.f, TEST_LOCATION ); + DALI_TEST_EQUALS( startEndPosValue.x, 40.f- movementArea.x*0.5f, TEST_LOCATION ); + DALI_TEST_EQUALS( startEndPosValue.y, 40.f- movementArea.x*0.5f, TEST_LOCATION ); emitter.Restore(); application.SendNotification(); diff --git a/dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.cpp b/dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.cpp index 16faba4..506e12d 100644 --- a/dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.cpp +++ b/dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.cpp @@ -48,11 +48,11 @@ BubbleEmitter::BubbleEmitter(Dali::Internal::CustomActor* internal) } BubbleEmitter BubbleEmitter::New( const Vector2& winSize, - Image shapeImage, + Dali::Texture shapeTexture, unsigned int maximumNumberOfBubble, const Vector2& bubbleSizeRange ) { - return Internal::BubbleEmitter::New( winSize, shapeImage, maximumNumberOfBubble, bubbleSizeRange ); + return Internal::BubbleEmitter::New( winSize, shapeTexture, maximumNumberOfBubble, bubbleSizeRange ); } BubbleEmitter::BubbleEmitter( const BubbleEmitter& handle ) @@ -79,14 +79,14 @@ Actor BubbleEmitter::GetRootActor() return GetImpl(*this).GetRootActor(); } -void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta ) +void BubbleEmitter::SetBackground( Dali::Texture bgTexture, const Vector3& hsvDelta ) { - GetImpl(*this).SetBackground( bgImage, hsvDelta ); + GetImpl(*this).SetBackground( bgTexture, hsvDelta ); } -void BubbleEmitter::SetShapeImage( Image shapeImage ) +void BubbleEmitter::SetBubbleShape( Dali::Texture shapeTexture ) { - GetImpl(*this).SetShapeImage( shapeImage ); + GetImpl(*this).SetBubbleShape( shapeTexture ); } void BubbleEmitter::SetBubbleScale( float scale ) diff --git a/dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.h b/dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.h index a9a5c3a..3bbdce9 100644 --- a/dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.h +++ b/dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.h @@ -20,6 +20,7 @@ // INTERNAL INCLUDES #include +#include namespace Dali { @@ -58,13 +59,13 @@ public: * @brief Create an initialized BubbleEmitter. * * @param[in] winSize The size of the bubble moving area, usually the same size as the background. - * @param[in] shapeImage The alpha channnel of this texture defines the bubble shape. + * @param[in] shapeTexture The alpha channnel of this texture defines the bubble shape. * @param[in] maximumNumberOfBubble The maximum number of bubble needed. * @param[in] bubbleSizeRange The size range of the bubbles; x component is the low bound, and y component is the up bound. * @return The initialized BubbleEmitter object. */ static BubbleEmitter New( const Vector2& winSize, - Image shapeImage, + Dali::Texture shapeTexture, unsigned int maximumNumberOfBubble, const Vector2& bubbleSizeRange ); @@ -107,19 +108,19 @@ public: * @brief Set Background image. * * The bubbles pick color from this image with HSV values adjusted. - * @param[in] bgImage The background image which provide color to bubbles. + * @param[in] bgTexture The background texture which provide color to bubbles. * @param[in] hsvDelta The hsv channel difference used to adjust the background image color. * If set these vector as Vector3::Zero, original colors are used. */ - void SetBackground( Image bgImage, const Vector3& hsvDelta ); + void SetBackground( Dali::Texture bgTexture, const Vector3& hsvDelta ); /** * @brief Set bubble shape. * - * The bubble mesh is a rectangular patch, but its displayed shape is decided by the alpha channel of the shape image. - * @param[in] shapeImage The image whose alpha channel defines the bubble shape. + * The bubble mesh is a rectangular patch, but its displayed shape is decided by the alpha channel of the shape texture. + * @param[in] shapeTexture The texture whose alpha channel defines the bubble shape. */ - void SetShapeImage( Image shapeImage ); + void SetBubbleShape( Dali::Texture shapeTexture ); /** * @brief Set the scale factor applied to all the bubbles. diff --git a/dali-toolkit/internal/controls/bubble-effect/bubble-actor.cpp b/dali-toolkit/internal/controls/bubble-effect/bubble-actor.cpp deleted file mode 100644 index f42b72b..0000000 --- a/dali-toolkit/internal/controls/bubble-effect/bubble-actor.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) 2015 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// CLASS HEADER -#include "bubble-actor.h" - -// EXTERNAL INCLUDES -#include -#include - -// INTERNAL INCLUDES - -namespace Dali -{ - -namespace Toolkit -{ - -namespace Internal -{ - -BubbleActor::BubbleActor( unsigned int numberOfBubble, - const Vector2& movementArea) -: mActor(), - mRenderer(), - mMovementArea( movementArea ), - mIndicesOffset(), - mIndiceStartEndPos(), - mIndicesPercentage(), - mIndexGravity( Property::INVALID_INDEX ), - mIndexDynamicScale( Property::INVALID_INDEX ), - mIndexInvertedMovementArea( Property::INVALID_INDEX ), - mNumBubble( numberOfBubble ), - mRandomSeed( 0 ) -{ - mActor = Actor::New(); -} - -void BubbleActor::MakeRenderable( Geometry geometry, TextureSet textureSet, Shader shader ) -{ - if( mRenderer ) - { - // This function is supposed to be called once - return; - } - - mRenderer = Renderer::New( geometry, shader ); - mRenderer.SetTextures( textureSet ); - - mActor.AddRenderer( mRenderer ); - mActor.SetSize( mMovementArea ); - mActor.SetParentOrigin(ParentOrigin::TOP_LEFT); - - // register uniforms - mIndexGravity = mActor.RegisterProperty( "uGravity", 50.f ); - mIndexDynamicScale = mActor.RegisterProperty( "uDynamicScale", 1.f ); - - mIndexInvertedMovementArea = mActor.RegisterProperty( "uInvertedMovementArea", Vector2(1.f,1.f) / mMovementArea ); - - mIndicesOffset.resize(9); - int offset = mMovementArea.Length() / 10.f; - - mRandomSeed = time( NULL ); - - mIndicesOffset[0] = mActor.RegisterProperty( "uOffset[0]", Vector2( 0.f,0.f ) ); - mIndicesOffset[1] = mActor.RegisterProperty( "uOffset[1]", Vector2( rand_r( &mRandomSeed ) % offset, rand_r( &mRandomSeed ) % offset ) ); - mIndicesOffset[2] = mActor.RegisterProperty( "uOffset[2]", Vector2( rand_r( &mRandomSeed ) % offset, -rand_r( &mRandomSeed ) % offset ) ); - mIndicesOffset[3] = mActor.RegisterProperty( "uOffset[3]", Vector2(-rand_r( &mRandomSeed ) % offset, rand_r( &mRandomSeed ) % offset ) ); - mIndicesOffset[4] = mActor.RegisterProperty( "uOffset[4]", Vector2(-rand_r( &mRandomSeed ) % offset, -rand_r( &mRandomSeed ) % offset ) ); - mIndicesOffset[5] = mActor.RegisterProperty( "uOffset[5]", Vector2( rand_r( &mRandomSeed ) % offset, 0.f ) ); - mIndicesOffset[6] = mActor.RegisterProperty( "uOffset[6]", Vector2(-rand_r( &mRandomSeed ) % offset, 0.f ) ); - mIndicesOffset[7] = mActor.RegisterProperty( "uOffset[7]", Vector2( 0.f, rand_r( &mRandomSeed ) % offset ) ); - mIndicesOffset[8] = mActor.RegisterProperty( "uOffset[8]", Vector2( 0.f, -rand_r( &mRandomSeed ) % offset ) ); - - Vector4 zeroVector; - mIndiceStartEndPos.resize( mNumBubble ); - mIndicesPercentage.resize( mNumBubble ); - for( unsigned int i=0; i #include -#include -#include +#include +#include // INTERNAL INCLUDES -#include -#include #include -#include - +#include namespace { @@ -62,6 +59,87 @@ float RandomRange(float f0, float f1, unsigned int& seed) return f0 + (rand_r( &seed ) & 0xfff) * (f1-f0) * (1.0f/4095.0f); } +const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( + attribute mediump vec2 aPosition;\n + attribute mediump vec2 aTexCoord;\n + uniform mediump vec3 uSize;\n + uniform mediump mat4 uMvpMatrix;\n + varying mediump vec2 vTexCoord;\n + \n + + void main()\n + {\n + gl_Position = uMvpMatrix * vec4(aPosition*uSize.xy,0.0,1.0); + vTexCoord = aTexCoord;\n + }\n +); + +const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER( + precision highp float;\n + uniform vec3 uHSVDelta;\n + varying mediump vec2 vTexCoord;\n + uniform sampler2D sTexture;\n + float rand(vec2 co) \n + {\n + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); \n} + \n + vec3 rgb2hsv(vec3 c)\n + {\n + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n + \n + float d = q.x - min(q.w, q.y);\n + float e = 1.0e-10;\n + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n + }\n + vec3 hsv2rgb(vec3 c)\n + {\n + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n + }\n + void main() {\n + vec4 color = texture2D(sTexture, vTexCoord); \n + vec3 hsvColor = rgb2hsv( color.rgb );\n + // modify the hsv Value + hsvColor += uHSVDelta * rand(vTexCoord); \n + // if the new vale exceeds one, then decrease it + hsvColor -= max(hsvColor*2.0 - vec3(2.0), 0.0);\n + // if the new vale drops below zero, then increase it + hsvColor -= min(hsvColor*2.0, 0.0);\n + color = vec4( hsv2rgb( hsvColor ), 1.0 ); \n + gl_FragColor = color; \n + }\n + ); + +Dali::Geometry CreateTexturedQuad() +{ + struct Vertex + { + Dali::Vector2 position; + Dali::Vector2 texCoord; + }; + + static const Vertex data[] = {{ Dali::Vector2( -0.5f, -0.5f ), Dali::Vector2( 0.0f, 0.0f ) }, + { Dali::Vector2( 0.5f, -0.5f ), Dali::Vector2( 1.0f, 0.0f ) }, + { Dali::Vector2( -0.5f, 0.5f ), Dali::Vector2( 0.0f, 1.0f ) }, + { Dali::Vector2( 0.5f, 0.5f ), Dali::Vector2( 1.0f, 1.0f ) }}; + + //Create a vertex buffer for vertex positions and texture coordinates + Dali::PropertyBuffer vertexBuffer = Dali::PropertyBuffer::New( Dali::Property::Map() + .Add( "aPosition", Dali::Property::VECTOR2 ) + .Add( "aTexCoord", Dali::Property::VECTOR2 ) ); + vertexBuffer.SetData( data, 4u ); + + //Create the geometry + Dali::Geometry geometry = Dali::Geometry::New(); + geometry.AddVertexBuffer( vertexBuffer ); + geometry.SetType(Dali::Geometry::TRIANGLE_STRIP ); + + return geometry; +} + } namespace Dali @@ -73,11 +151,11 @@ namespace Toolkit namespace Internal { BubbleEmitter::BubbleEmitter( const Vector2& movementArea, - Image shapeImage, + Texture shapeTexture, unsigned int maximumNumberOfBubble, const Vector2& bubbleSizeRange ) : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), - mShapeImage( shapeImage ), + mShapeTexture( shapeTexture ), mMovementArea( movementArea ), mBubbleSizeRange( bubbleSizeRange ), mDensity( 5 ), @@ -89,19 +167,19 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea, // Calculate how many shaders are required if( mTotalNumOfBubble>100 ) { - mNumBubblePerActor = 100; - mNumActor = mTotalNumOfBubble / 100; - if( mNumActor*mNumBubblePerActor < mTotalNumOfBubble ) + mNumBubblePerRenderer = 100; + mNumRenderer = mTotalNumOfBubble / 100; + if( mNumRenderer*mNumBubblePerRenderer < mTotalNumOfBubble ) { - mNumActor++; - mNumBubblePerActor = mTotalNumOfBubble / mNumActor+1; - mTotalNumOfBubble = mNumActor * mNumBubblePerActor; + mNumRenderer++; + mNumBubblePerRenderer = mTotalNumOfBubble / mNumRenderer+1; + mTotalNumOfBubble = mNumRenderer * mNumBubblePerRenderer; } } else { - mNumBubblePerActor = mTotalNumOfBubble; - mNumActor = 1; + mNumBubblePerRenderer = mTotalNumOfBubble; + mNumRenderer = 1; } mRandomSeed = time( NULL ); @@ -112,12 +190,12 @@ BubbleEmitter::~BubbleEmitter() } Toolkit::BubbleEmitter BubbleEmitter::New( const Vector2& winSize, - Image shapeImage, + Texture shapeTexture, unsigned int maximumNumberOfBubble, const Vector2& bubbleSizeRange ) { // Create the implementation - IntrusivePtr internalBubbleEmitter ( new BubbleEmitter( winSize, shapeImage, + IntrusivePtr internalBubbleEmitter ( new BubbleEmitter( winSize, shapeTexture, maximumNumberOfBubble,bubbleSizeRange ) ); // Pass ownership to Toolkit::BubbleEmitter handle @@ -135,26 +213,27 @@ void BubbleEmitter::OnInitialize() mBubbleRoot = Actor::New(); mBubbleRoot.SetSize(mMovementArea); - // Prepare the frame buffer to store the color adjusted background image - mEffectImage = FrameBufferImage::New( mMovementArea.width/4.f, mMovementArea.height/4.f, Pixel::RGBA8888 ); + // Prepare the frame buffer to store the color adjusted background texture + Vector2 imageSize = Vector2( mMovementArea.width/4.f, mMovementArea.height/4.f ); + mFrameBuffer = FrameBuffer::New( imageSize.x, imageSize.y, 0 ); + mEffectTexture = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, imageSize.x, imageSize.y ); + mFrameBuffer.AttachColorTexture( mEffectTexture ); // Generate the geometry, which is used by all bubbleActors - mMeshGeometry = CreateGeometry( mNumBubblePerActor*mDensity ); + mMeshGeometry = CreateGeometry( mNumBubblePerRenderer*mDensity ); - Shader bubbleShader = CreateBubbleShader (mNumBubblePerActor ); + Shader bubbleShader = CreateBubbleShader( mNumBubblePerRenderer ); mTextureSet = TextureSet::New(); - TextureSetImage( mTextureSet, 0u, mEffectImage ); - TextureSetImage( mTextureSet, 1u, mShapeImage ); - - mBubbleActors.resize( mNumActor ); + mTextureSet.SetTexture( 0u, mEffectTexture ); + mTextureSet.SetTexture( 1u, mShapeTexture ); - // Create the meshActor group and bubbleEffect group to emit bubbles following the given track, such as finger touch track. - for(unsigned int i=0; i < mNumActor; i++ ) + // Create the renderers to render the bubbles + mBubbleRenderers.resize( mNumRenderer ); + for(unsigned int i=0; i < mNumRenderer; i++ ) { - mBubbleActors[i] = new BubbleActor( mNumBubblePerActor, mMovementArea ); - (mBubbleActors[i])->MakeRenderable( mMeshGeometry, mTextureSet, bubbleShader ); - mBubbleRoot.Add( (mBubbleActors[i])->GetMeshActor() ); + mBubbleRenderers[i].Initialize( mNumBubblePerRenderer, mMovementArea, mMeshGeometry, mTextureSet, bubbleShader ); + mBubbleRoot.AddRenderer( mBubbleRenderers[i].GetRenderer() ); } // Create a cameraActor for the off screen render task. @@ -172,21 +251,27 @@ Actor BubbleEmitter::GetRootActor() return mBubbleRoot; } -void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta ) +void BubbleEmitter::SetBackground( Texture bgTexture, const Vector3& hsvDelta ) { - mBackgroundImage = bgImage; + mBackgroundTexture = bgTexture; mHSVDelta = hsvDelta; - Toolkit::ImageView sourceActor = Toolkit::ImageView::New(bgImage); + //Create RenderTask source actor + Actor sourceActor = Actor::New(); sourceActor.SetSize( mMovementArea ); sourceActor.SetParentOrigin(ParentOrigin::CENTER); - - Property::Map colorAdjuster = CreateColorAdjuster(); - sourceActor.SetProperty( Toolkit::ImageView::Property::IMAGE, colorAdjuster); - SetColorAdjusterProperties( sourceActor, hsvDelta, true /*ignore alpha to make bubble color always*/ ); - + sourceActor.RegisterProperty( "uHSVDelta", hsvDelta ); Stage::GetCurrent().Add( sourceActor ); + //Create renderer + Dali::Geometry geometry = CreateTexturedQuad(); + Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); + Renderer renderer = Renderer::New( geometry, shader ); + TextureSet textureSet = TextureSet::New(); + textureSet.SetTexture(0u, bgTexture ); + renderer.SetTextures( textureSet ); + sourceActor.AddRenderer( renderer ); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); RenderTask task = taskList.CreateTask(); task.SetRefreshRate( RenderTask::REFRESH_ONCE ); @@ -194,21 +279,21 @@ void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta ) task.SetExclusive(true); task.SetCameraActor(mCameraActor); task.GetCameraActor().SetInvertYAxis(true); - task.SetTargetFrameBuffer( mEffectImage ); + task.SetFrameBuffer( mFrameBuffer ); task.FinishedSignal().Connect(this, &BubbleEmitter::OnRenderFinished); mRenderTaskRunning = true; } -void BubbleEmitter::SetShapeImage( Image shapeImage ) +void BubbleEmitter::SetBubbleShape( Texture shapeTexture ) { - TextureSetImage( mTextureSet, 1, shapeImage ); + mTextureSet.SetTexture( 1, shapeTexture ); } void BubbleEmitter::SetBubbleScale( float scale ) { - for(unsigned int i=0; i < mNumActor; i++ ) + for(unsigned int i=0; i < mNumRenderer; i++ ) { - (mBubbleActors[i])->SetDynamicScale( scale ); + mBubbleRenderers[i].SetDynamicScale( scale ); } } @@ -223,10 +308,10 @@ void BubbleEmitter::SetBubbleDensity( unsigned int density ) else { mDensity = density; - mMeshGeometry = CreateGeometry( mNumBubblePerActor*mDensity ); - for(unsigned int i=0; i < mNumActor; i++ ) + mMeshGeometry = CreateGeometry( mNumBubblePerRenderer*mDensity ); + for(unsigned int i=0; i < mNumRenderer; i++ ) { - (mBubbleActors[i])->SetGeometry( mMeshGeometry ); + mBubbleRenderers[i].SetGeometry( mMeshGeometry ); } } } @@ -247,16 +332,16 @@ void BubbleEmitter::OnContextRegained() // and trigger re-draw if not already running if( ! mRenderTaskRunning ) { - SetBackground( mBackgroundImage, mHSVDelta ); + SetBackground( mBackgroundTexture, mHSVDelta ); } } void BubbleEmitter::EmitBubble( Animation& animation, const Vector2& emitPosition, const Vector2& direction, const Vector2& displacement ) { - unsigned int curUniform = mCurrentBubble % mNumBubblePerActor; - unsigned int groupIdx = mCurrentBubble / mNumBubblePerActor; - SetBubbleParameter( mBubbleActors[groupIdx], curUniform, emitPosition, direction, displacement); - animation.AnimateTo( (mBubbleActors[groupIdx])->GetPercentageProperty(curUniform), + unsigned int curUniform = mCurrentBubble % mNumBubblePerRenderer; + unsigned int groupIdx = mCurrentBubble / mNumBubblePerRenderer; + SetBubbleParameter( mBubbleRenderers[groupIdx], curUniform, emitPosition - Vector2(mMovementArea.x*0.5f,mMovementArea.y*0.5f), direction, displacement); + animation.AnimateTo( mBubbleRenderers[groupIdx].GetPercentageProperty(curUniform), 1.f, AlphaFunction::LINEAR ); mCurrentBubble = (mCurrentBubble + 1) % mTotalNumOfBubble; @@ -264,17 +349,17 @@ void BubbleEmitter::EmitBubble( Animation& animation, const Vector2& emitPositio void BubbleEmitter::Restore() { - for(unsigned int i=0; i < mNumActor; i++ ) + for(unsigned int i=0; i < mNumRenderer; i++ ) { - (mBubbleActors[i])->ResetProperties(); + mBubbleRenderers[i].ResetProperties(); } } Geometry BubbleEmitter::CreateGeometry( unsigned int numOfPatch ) { unsigned int numVertex = numOfPatch*4u; - std::vector vertexData; - vertexData.reserve( numVertex ); + Vector vertexData; + vertexData.Reserve( numVertex ); unsigned int numIndex = numOfPatch*6u; Vector indexData; @@ -282,13 +367,13 @@ Geometry BubbleEmitter::CreateGeometry( unsigned int numOfPatch ) for(unsigned int i = 0; i < numOfPatch; i++) { - float curSize = RandomRange(mBubbleSizeRange.x, mBubbleSizeRange.y, mRandomSeed); + float halfSize = RandomRange(mBubbleSizeRange.x, mBubbleSizeRange.y, mRandomSeed) * 0.5f; float index = static_cast( i ); - vertexData.push_back( Vertex( index, Vector2(0.f,0.f), Vector2(0.f,0.f) ) ); - vertexData.push_back( Vertex( index, Vector2(0.f,curSize), Vector2(0.f,1.f) ) ); - vertexData.push_back( Vertex( index, Vector2(curSize,curSize), Vector2(1.f,1.f) ) ); - vertexData.push_back( Vertex( index, Vector2(curSize,0.f), Vector2(1.f,0.f) ) ); + vertexData.PushBack( Vertex( index, Vector2(-halfSize,-halfSize),Vector2(0.f,0.f) ) ); + vertexData.PushBack( Vertex( index, Vector2(-halfSize, halfSize), Vector2(0.f,1.f) ) ); + vertexData.PushBack( Vertex( index, Vector2( halfSize, halfSize), Vector2(1.f,1.f) ) ); + vertexData.PushBack( Vertex( index, Vector2( halfSize,-halfSize), Vector2(1.f,0.f) ) ); unsigned short idx = index * 4; indexData.PushBack( idx ); @@ -313,7 +398,7 @@ Geometry BubbleEmitter::CreateGeometry( unsigned int numOfPatch ) return geometry; } -void BubbleEmitter::SetBubbleParameter( BubbleActorPtr bubbleActor, unsigned int curUniform, +void BubbleEmitter::SetBubbleParameter( BubbleRenderer& bubbleRenderer, unsigned int curUniform, const Vector2& emitPosition, const Vector2& direction, const Vector2& displacement ) { Vector2 dir(direction); @@ -330,9 +415,9 @@ void BubbleEmitter::SetBubbleParameter( BubbleActorPtr bubbleActor, unsigned int randomVec.y *= 0.33f; } Vector4 startAndEndPos( emitPosition.x, emitPosition.y, emitPosition.x+randomVec.x, emitPosition.y+randomVec.y ); - bubbleActor->SetStartAndEndPosition( curUniform, startAndEndPos ); + bubbleRenderer.SetStartAndEndPosition( curUniform, startAndEndPos ); - bubbleActor->SetPercentage( curUniform, 0.f); + bubbleRenderer.SetPercentage( curUniform, 0.f); } } // namespace Internal diff --git a/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.h b/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.h index fecbd85..e6879ae 100644 --- a/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.h +++ b/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.h @@ -21,7 +21,7 @@ // EXTERNAL INCLUDES #include #include -#include +#include #include #include #include @@ -42,8 +42,7 @@ namespace Toolkit namespace Internal { -class BubbleActor; -typedef IntrusivePtr BubbleActorPtr; +class BubbleRenderer; /** * BubbleEmitter implementation class. @@ -61,7 +60,7 @@ public: * @copydoc Toolkit::BubbleEmitter::New */ static Toolkit::BubbleEmitter New( const Vector2& winSize, - Image shapeImage, + Texture shapeTexture, unsigned int maximumNumberOfBubble, const Vector2& bubbleSizeRange ); @@ -73,12 +72,12 @@ public: /** * @copydoc Toolkit::BubbleEmitter::SetBackground */ - void SetBackground( Image bgImage, const Vector3& hsvDelta ); + void SetBackground( Texture bgTexture, const Vector3& hsvDelta ); /** - * @copydoc Toolkit::BubbleEmitter::SetShapeImage + * @copydoc Toolkit::BubbleEmitter::SetShape */ - void SetShapeImage( Image shapeImage ); + void SetBubbleShape( Texture shapeTexture ); /** * @copydoc Toolkit::BubbleEmiter::SetBubbleScale @@ -105,12 +104,12 @@ private: /** * Construct a new BubbleEmitter object. * @param[in] movementArea The size of the bubble moving area - * @param[in] shapeImage The alpha channnel of this texture defines the bubble shape. + * @param[in] shapeTexture The alpha channnel of this texture defines the bubble shape. * @param[in] maximumNumberOfBubble The maximum number of bubble needed. * @param[in] bubbleSizeRange The size range of the bubbles; x component is the minimal size, and y component is the maximum size. */ BubbleEmitter( const Vector2& movementArea, - Image shapeImage, + Texture shapeTexture, unsigned int maximumNumberOfBubble, const Vector2& bubbleSizeRange ); @@ -129,7 +128,7 @@ private: /** * Callback function of the finished signal of off-screen render task. - * @param[in] source The render task used to create the color adjusted background image. + * @param[in] source The render task used to create the color adjusted background texture. */ void OnRenderFinished(RenderTask& source); @@ -140,33 +139,34 @@ private: /** * Set the uniform values to the shader effect to emit a bubble - * @param[in] bubbleActor The BubbleActor to render the current bubble + * @param[in] bubbleRenderer The BubbleRenderer * @param[in] curUniform The index of the uniform array in the shader * @param[in] emitPosition The start position of the bubble movement. * @param[in] direction The direction used to constrain the bubble to move in an adjacent direction around it. * @param[in] displacement The displacement used to bound the moving distance of the bubble. */ - void SetBubbleParameter( BubbleActorPtr bubbleActor, unsigned int curUniform, + void SetBubbleParameter( BubbleRenderer& bubbleRenderer, unsigned int curUniform, const Vector2& emitPosition, const Vector2& direction, const Vector2& displacement ); private: Actor mBubbleRoot; /// mBubbleActors; ///< The meshActor vector, its size is mNumShader. + std::vector mBubbleRenderers; ///< The BubbleRenderer vector, its size is mNumShader. Vector2 mMovementArea; ///< The size of the bubble moving area, usually the same size as the background. Vector2 mBubbleSizeRange; ///< The size range of the bubbles; x component is the low bound, and y component is the up bound. Vector3 mHSVDelta; ///< The HSV difference used to adjust the background image color. - unsigned int mNumBubblePerActor; ///< How many bubbles for each BubbleActor. - unsigned int mNumActor; ///< How many BubbleActors are used. + unsigned int mNumBubblePerRenderer; ///< How many bubbles for each BubbleRenderer. + unsigned int mNumRenderer; ///< How many BubbleRenderers are used. unsigned int mDensity; ///< How many bubbles will emit at each time, they are controlled by same uniforms in the shader. unsigned int mTotalNumOfBubble; ///< mNumBubblePerShader*mNumShader. unsigned int mCurrentBubble; ///< Keep track of the index for the newly emitted bubble diff --git a/dali-toolkit/internal/controls/bubble-effect/bubble-renderer.cpp b/dali-toolkit/internal/controls/bubble-effect/bubble-renderer.cpp new file mode 100644 index 0000000..88b1a85 --- /dev/null +++ b/dali-toolkit/internal/controls/bubble-effect/bubble-renderer.cpp @@ -0,0 +1,143 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// CLASS HEADER +#include "bubble-renderer.h" + +// EXTERNAL INCLUDES +#include +#include + +// INTERNAL INCLUDES + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal +{ + +BubbleRenderer::BubbleRenderer() +: mRenderer(), + mIndicesOffset(), + mIndiceStartEndPos(), + mIndicesPercentage(), + mIndexGravity( Property::INVALID_INDEX ), + mIndexDynamicScale( Property::INVALID_INDEX ), + mIndexInvertedMovementArea( Property::INVALID_INDEX ) +{ +} + +void BubbleRenderer::Initialize( unsigned int numberOfBubble, const Vector2& movementArea, Geometry geometry, TextureSet textureSet, Shader shader ) +{ + if( mRenderer ) + { + // This function is supposed to be called once + return; + } + + mRenderer = Renderer::New( geometry, shader ); + mRenderer.SetTextures( textureSet ); + + // register uniforms + mIndexGravity = mRenderer.RegisterProperty( "uGravity", 50.f ); + mIndexDynamicScale = mRenderer.RegisterProperty( "uDynamicScale", 1.f ); + + mIndexInvertedMovementArea = mRenderer.RegisterProperty( "uInvertedMovementArea", Vector2(1.f,1.f) / movementArea ); + + mIndicesOffset.resize(9); + int offset = movementArea.Length() / 10.f; + + unsigned int seed = time( NULL ); + + mIndicesOffset[0] = mRenderer.RegisterProperty( "uOffset[0]", Vector2( 0.f,0.f ) ); + mIndicesOffset[1] = mRenderer.RegisterProperty( "uOffset[1]", Vector2( rand_r( &seed ) % offset, rand_r( &seed ) % offset ) ); + mIndicesOffset[2] = mRenderer.RegisterProperty( "uOffset[2]", Vector2( rand_r( &seed ) % offset, -rand_r( &seed ) % offset ) ); + mIndicesOffset[3] = mRenderer.RegisterProperty( "uOffset[3]", Vector2(-rand_r( &seed ) % offset, rand_r( &seed ) % offset ) ); + mIndicesOffset[4] = mRenderer.RegisterProperty( "uOffset[4]", Vector2(-rand_r( &seed ) % offset, -rand_r( &seed ) % offset ) ); + mIndicesOffset[5] = mRenderer.RegisterProperty( "uOffset[5]", Vector2( rand_r( &seed ) % offset, 0.f ) ); + mIndicesOffset[6] = mRenderer.RegisterProperty( "uOffset[6]", Vector2(-rand_r( &seed ) % offset, 0.f ) ); + mIndicesOffset[7] = mRenderer.RegisterProperty( "uOffset[7]", Vector2( 0.f, rand_r( &seed ) % offset ) ); + mIndicesOffset[8] = mRenderer.RegisterProperty( "uOffset[8]", Vector2( 0.f, -rand_r( &seed ) % offset ) ); + + Vector4 zeroVector; + mIndiceStartEndPos.resize( numberOfBubble ); + mIndicesPercentage.resize( numberOfBubble ); + for( unsigned int i=0; i mIndicesOffset; ///< Indices of the properties mapping to uniform array 'uOffset' std::vector mIndiceStartEndPos; ///< Indices of the properties mapping to uniform array 'uStartAndEndPos' @@ -140,9 +130,6 @@ private: Property::Index mIndexGravity; ///< Index of the property mapping to uniform 'uGravity' Property::Index mIndexDynamicScale; ///< Index of the property mapping to uniform 'uDynamicScale' Property::Index mIndexInvertedMovementArea; ///< Index of the property mapping to uniform 'uInvertedMovementArea' - - unsigned int mNumBubble; ///< How many groups of uniforms are used to control the bubble movement. - unsigned int mRandomSeed; ///< Seed to generate random number. }; } // namespace Internal @@ -151,4 +138,4 @@ private: } // namespace Dali -#endif // DALI_TOOLKIT_INTERNAL_BUBBLE_ACTOR_H +#endif // DALI_TOOLKIT_INTERNAL_BUBBLE_RENDERER_H diff --git a/dali-toolkit/internal/file.list b/dali-toolkit/internal/file.list index 994faaf..c8c98ad 100644 --- a/dali-toolkit/internal/file.list +++ b/dali-toolkit/internal/file.list @@ -36,7 +36,7 @@ toolkit_src_files = \ $(toolkit_src_dir)/controls/alignment/alignment-impl.cpp \ $(toolkit_src_dir)/controls/bloom-view/bloom-view-impl.cpp \ $(toolkit_src_dir)/controls/bubble-effect/bubble-emitter-impl.cpp \ - $(toolkit_src_dir)/controls/bubble-effect/bubble-actor.cpp \ + $(toolkit_src_dir)/controls/bubble-effect/bubble-renderer.cpp \ $(toolkit_src_dir)/controls/buttons/button-impl.cpp \ $(toolkit_src_dir)/controls/buttons/check-box-button-impl.cpp \ $(toolkit_src_dir)/controls/buttons/push-button-impl.cpp \ -- 2.7.4