X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fbubble-effect%2Fbubble-emitter-impl.cpp;h=dde825373166eb425a3714bf48913d870f873bdf;hp=b1e28e7d2b929341b6cb0f8512217c6051e176c2;hb=f2039d47f9bed8104575da80a2ecf0bb6e37ff8d;hpb=f3e45e41c5f16ccc2538b283897ed6efb07e4ea9 diff --git a/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp b/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp index b1e28e7..dde8253 100644 --- a/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp +++ b/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -21,8 +21,8 @@ // EXTERNAL INCLUDES #include #include -#include #include +#include // INTERNAL INCLUDES #include @@ -34,16 +34,20 @@ namespace struct Vertex { Vertex() - : index( 0.0f ), position(), textureCoord() + : index(0.0f), + position(), + textureCoord() { } - Vertex( float index, const Dali::Vector2& position, const Dali::Vector2& textureCoord ) - : index( index ), position( position ), textureCoord( textureCoord ) + Vertex(float index, const Dali::Vector2& position, const Dali::Vector2& textureCoord) + : index(index), + position(position), + textureCoord(textureCoord) { } - float index; + float index; Dali::Vector2 position; Dali::Vector2 textureCoord; }; @@ -57,7 +61,7 @@ struct Vertex */ float RandomRange(float f0, float f1, unsigned int& seed) { - return f0 + (rand_r( &seed ) & 0xfff) * (f1-f0) * (1.0f/4095.0f); + return f0 + (rand_r(&seed) & 0xfff) * (f1 - f0) * (1.0f / 4095.0f); } Dali::Geometry CreateTexturedQuad() @@ -68,85 +72,82 @@ Dali::Geometry CreateTexturedQuad() 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 ) }}; + 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::VertexBuffer vertexBuffer = Dali::VertexBuffer::New( Dali::Property::Map() - .Add( "aPosition", Dali::Property::VECTOR2 ) - .Add( "aTexCoord", Dali::Property::VECTOR2 ) ); - vertexBuffer.SetData( data, 4u ); + Dali::VertexBuffer vertexBuffer = Dali::VertexBuffer::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 ); + geometry.AddVertexBuffer(vertexBuffer); + geometry.SetType(Dali::Geometry::TRIANGLE_STRIP); return geometry; } -} +} // namespace namespace Dali { - namespace Toolkit { - namespace Internal { -BubbleEmitter::BubbleEmitter( const Vector2& movementArea, - Texture shapeTexture, - unsigned int maximumNumberOfBubble, - const Vector2& bubbleSizeRange ) -: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), - mShapeTexture( shapeTexture ), - mMovementArea( movementArea ), - mBubbleSizeRange( bubbleSizeRange ), - mDensity( 5 ), - mTotalNumOfBubble( maximumNumberOfBubble ), - mCurrentBubble( 0 ), - mRandomSeed( 0 ), +BubbleEmitter::BubbleEmitter(const Vector2& movementArea, + Texture shapeTexture, + unsigned int maximumNumberOfBubble, + const Vector2& bubbleSizeRange) +: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)), + mShapeTexture(shapeTexture), + mMovementArea(movementArea), + mBubbleSizeRange(bubbleSizeRange), + mDensity(5), + mTotalNumOfBubble(maximumNumberOfBubble), + mCurrentBubble(0), + mRandomSeed(0), mRenderTaskRunning(false) { // Calculate how many shaders are required - if( mTotalNumOfBubble>100 ) + if(mTotalNumOfBubble > 100) { mNumBubblePerRenderer = 100; - mNumRenderer = mTotalNumOfBubble / 100; - if( mNumRenderer*mNumBubblePerRenderer < mTotalNumOfBubble ) + mNumRenderer = mTotalNumOfBubble / 100; + if(mNumRenderer * mNumBubblePerRenderer < mTotalNumOfBubble) { mNumRenderer++; - mNumBubblePerRenderer = mTotalNumOfBubble / mNumRenderer+1; - mTotalNumOfBubble = mNumRenderer * mNumBubblePerRenderer; + mNumBubblePerRenderer = mTotalNumOfBubble / mNumRenderer + 1; + mTotalNumOfBubble = mNumRenderer * mNumBubblePerRenderer; } } else { mNumBubblePerRenderer = mTotalNumOfBubble; - mNumRenderer = 1; + mNumRenderer = 1; } - mRandomSeed = time( NULL ); + mRandomSeed = time(NULL); } BubbleEmitter::~BubbleEmitter() { } -Toolkit::BubbleEmitter BubbleEmitter::New( const Vector2& winSize, - Texture shapeTexture, - unsigned int maximumNumberOfBubble, - const Vector2& bubbleSizeRange ) +Toolkit::BubbleEmitter BubbleEmitter::New(const Vector2& winSize, + Texture shapeTexture, + unsigned int maximumNumberOfBubble, + const Vector2& bubbleSizeRange) { // Create the implementation - IntrusivePtr internalBubbleEmitter ( new BubbleEmitter( winSize, shapeTexture, - maximumNumberOfBubble,bubbleSizeRange ) ); + IntrusivePtr internalBubbleEmitter(new BubbleEmitter(winSize, shapeTexture, maximumNumberOfBubble, bubbleSizeRange)); // Pass ownership to Toolkit::BubbleEmitter handle - Toolkit::BubbleEmitter bubbleEmitter( *internalBubbleEmitter ); + Toolkit::BubbleEmitter bubbleEmitter(*internalBubbleEmitter); //Second phase of implementeation : Initialization internalBubbleEmitter->OnInitialize(); @@ -158,34 +159,34 @@ void BubbleEmitter::OnInitialize() { // Create the root actor, all the meshActor should be its children mBubbleRoot = Actor::New(); - mBubbleRoot.SetProperty( Actor::Property::SIZE, mMovementArea ); + mBubbleRoot.SetProperty(Actor::Property::SIZE, mMovementArea); // 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, FrameBuffer::Attachment::NONE ); - mEffectTexture = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, imageSize.x, imageSize.y ); - mFrameBuffer.AttachColorTexture( mEffectTexture ); + Vector2 imageSize = Vector2(mMovementArea.width / 4.f, mMovementArea.height / 4.f); + mFrameBuffer = FrameBuffer::New(imageSize.x, imageSize.y, FrameBuffer::Attachment::NONE); + 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( mNumBubblePerRenderer*mDensity ); + mMeshGeometry = CreateGeometry(mNumBubblePerRenderer * mDensity); - Shader bubbleShader = CreateBubbleShader( mNumBubblePerRenderer ); + Shader bubbleShader = CreateBubbleShader(mNumBubblePerRenderer); mTextureSet = TextureSet::New(); - mTextureSet.SetTexture( 0u, mEffectTexture ); - mTextureSet.SetTexture( 1u, mShapeTexture ); + mTextureSet.SetTexture(0u, mEffectTexture); + mTextureSet.SetTexture(1u, mShapeTexture); // Create the renderers to render the bubbles - mBubbleRenderers.resize( mNumRenderer ); - for(unsigned int i=0; i < mNumRenderer; i++ ) + mBubbleRenderers.resize(mNumRenderer); + for(unsigned int i = 0; i < mNumRenderer; i++) { - mBubbleRenderers[i].Initialize( mNumBubblePerRenderer, mMovementArea, mMeshGeometry, mTextureSet, bubbleShader ); - mBubbleRoot.AddRenderer( mBubbleRenderers[i].GetRenderer() ); + mBubbleRenderers[i].Initialize(mNumBubblePerRenderer, mMovementArea, mMeshGeometry, mTextureSet, bubbleShader); + mBubbleRoot.AddRenderer(mBubbleRenderers[i].GetRenderer()); } // Create a cameraActor for the off screen render task. mCameraActor = CameraActor::New(mMovementArea); - mCameraActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); + mCameraActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); Stage stage = Stage::GetCurrent(); @@ -198,67 +199,67 @@ Actor BubbleEmitter::GetRootActor() return mBubbleRoot; } -void BubbleEmitter::SetBackground( Texture bgTexture, const Vector3& hsvDelta ) +void BubbleEmitter::SetBackground(Texture bgTexture, const Vector3& hsvDelta) { mBackgroundTexture = bgTexture; - mHSVDelta = hsvDelta; + mHSVDelta = hsvDelta; //Create RenderTask source actor Actor sourceActor = Actor::New(); - sourceActor.SetProperty( Actor::Property::SIZE, mMovementArea ); - sourceActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); - sourceActor.RegisterProperty( "uHSVDelta", hsvDelta ); - Stage::GetCurrent().Add( sourceActor ); + sourceActor.SetProperty(Actor::Property::SIZE, mMovementArea); + sourceActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + sourceActor.RegisterProperty("uHSVDelta", hsvDelta); + Stage::GetCurrent().Add(sourceActor); //Create renderer - Dali::Geometry geometry = CreateTexturedQuad(); - Shader shader = Shader::New( SHADER_BUBBLE_EMITTER_VERT, SHADER_BUBBLE_EMITTER_FRAG ); - Renderer renderer = Renderer::New( geometry, shader ); - TextureSet textureSet = TextureSet::New(); - textureSet.SetTexture(0u, bgTexture ); - renderer.SetTextures( textureSet ); - sourceActor.AddRenderer( renderer ); + Dali::Geometry geometry = CreateTexturedQuad(); + Shader shader = Shader::New(SHADER_BUBBLE_EMITTER_VERT, SHADER_BUBBLE_EMITTER_FRAG); + 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 ); - task.SetSourceActor( sourceActor ); + RenderTask task = taskList.CreateTask(); + task.SetRefreshRate(RenderTask::REFRESH_ONCE); + task.SetSourceActor(sourceActor); task.SetExclusive(true); task.SetCameraActor(mCameraActor); task.GetCameraActor().SetInvertYAxis(true); - task.SetFrameBuffer( mFrameBuffer ); + task.SetFrameBuffer(mFrameBuffer); task.FinishedSignal().Connect(this, &BubbleEmitter::OnRenderFinished); mRenderTaskRunning = true; } -void BubbleEmitter::SetBubbleShape( Texture shapeTexture ) +void BubbleEmitter::SetBubbleShape(Texture shapeTexture) { - mTextureSet.SetTexture( 1, shapeTexture ); + mTextureSet.SetTexture(1, shapeTexture); } -void BubbleEmitter::SetBubbleScale( float scale ) +void BubbleEmitter::SetBubbleScale(float scale) { - for(unsigned int i=0; i < mNumRenderer; i++ ) + for(unsigned int i = 0; i < mNumRenderer; i++) { - mBubbleRenderers[i].SetDynamicScale( scale ); + mBubbleRenderers[i].SetDynamicScale(scale); } } -void BubbleEmitter::SetBubbleDensity( unsigned int density ) +void BubbleEmitter::SetBubbleDensity(unsigned int density) { - DALI_ASSERT_ALWAYS( density>0 && density<=9 && " Only densities between 1 to 9 are valid " ); + DALI_ASSERT_ALWAYS(density > 0 && density <= 9 && " Only densities between 1 to 9 are valid "); - if( density == mDensity ) + if(density == mDensity) { return; } else { - mDensity = density; - mMeshGeometry = CreateGeometry( mNumBubblePerRenderer*mDensity ); - for(unsigned int i=0; i < mNumRenderer; i++ ) + mDensity = density; + mMeshGeometry = CreateGeometry(mNumBubblePerRenderer * mDensity); + for(unsigned int i = 0; i < mNumRenderer; i++) { - mBubbleRenderers[i].SetGeometry( mMeshGeometry ); + mBubbleRenderers[i].SetGeometry(mMeshGeometry); } } } @@ -267,8 +268,8 @@ void BubbleEmitter::SetBubbleDensity( unsigned int density ) void BubbleEmitter::OnRenderFinished(RenderTask& source) { mRenderTaskRunning = false; - Actor sourceActor = source.GetSourceActor(); - Stage stage = Stage::GetCurrent(); + Actor sourceActor = source.GetSourceActor(); + Stage stage = Stage::GetCurrent(); stage.Remove(sourceActor); stage.GetRenderTaskList().RemoveTask(source); } @@ -277,94 +278,94 @@ void BubbleEmitter::OnContextRegained() { // Context was lost, so the framebuffer has been destroyed. Re-create render task // and trigger re-draw if not already running - if( ! mRenderTaskRunning ) + if(!mRenderTaskRunning) { - SetBackground( mBackgroundTexture, mHSVDelta ); + SetBackground(mBackgroundTexture, mHSVDelta); } } -void BubbleEmitter::EmitBubble( Animation& animation, const Vector2& emitPosition, const Vector2& direction, const Vector2& displacement ) +void BubbleEmitter::EmitBubble(Animation& animation, const Vector2& emitPosition, const Vector2& direction, const Vector2& displacement) { - 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 ); + 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; } void BubbleEmitter::Restore() { - for(unsigned int i=0; i < mNumRenderer; i++ ) + for(unsigned int i = 0; i < mNumRenderer; i++) { mBubbleRenderers[i].ResetProperties(); } } -Geometry BubbleEmitter::CreateGeometry( unsigned int numOfPatch ) +Geometry BubbleEmitter::CreateGeometry(unsigned int numOfPatch) { - unsigned int numVertex = numOfPatch*4u; + unsigned int numVertex = numOfPatch * 4u; Vector vertexData; - vertexData.Reserve( numVertex ); + vertexData.Reserve(numVertex); - unsigned int numIndex = numOfPatch*6u; + unsigned int numIndex = numOfPatch * 6u; Vector indexData; - indexData.Reserve( numIndex ); + indexData.Reserve(numIndex); for(unsigned int i = 0; i < numOfPatch; i++) { float halfSize = RandomRange(mBubbleSizeRange.x, mBubbleSizeRange.y, mRandomSeed) * 0.5f; - float index = static_cast( i ); - 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) ) ); + float index = static_cast(i); + 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 ); - indexData.PushBack( idx+1 ); - indexData.PushBack( idx+2 ); - indexData.PushBack( idx ); - indexData.PushBack( idx+2 ); - indexData.PushBack( idx+3 ); + indexData.PushBack(idx); + indexData.PushBack(idx + 1); + indexData.PushBack(idx + 2); + indexData.PushBack(idx); + indexData.PushBack(idx + 2); + indexData.PushBack(idx + 3); } Property::Map vertexFormat; - vertexFormat["aIndex"] = Property::FLOAT; + vertexFormat["aIndex"] = Property::FLOAT; vertexFormat["aPosition"] = Property::VECTOR2; vertexFormat["aTexCoord"] = Property::VECTOR2; - VertexBuffer vertices = VertexBuffer::New( vertexFormat ); - vertices.SetData( &vertexData[0], numVertex ); + VertexBuffer vertices = VertexBuffer::New(vertexFormat); + vertices.SetData(&vertexData[0], numVertex); Geometry geometry = Geometry::New(); - geometry.AddVertexBuffer( vertices ); - geometry.SetIndexBuffer( &indexData[0], numIndex ); + geometry.AddVertexBuffer(vertices); + geometry.SetIndexBuffer(&indexData[0], numIndex); return geometry; } -void BubbleEmitter::SetBubbleParameter( BubbleRenderer& bubbleRenderer, unsigned int curUniform, - const Vector2& emitPosition, const Vector2& direction, const Vector2& displacement ) +void BubbleEmitter::SetBubbleParameter(BubbleRenderer& bubbleRenderer, unsigned int curUniform, const Vector2& emitPosition, const Vector2& direction, const Vector2& displacement) { Vector2 dir(direction); int halfRange = displacement.x / 2; // for the y coordinate, always negative, so bubbles always go upwards - Vector2 randomVec( rand_r( &mRandomSeed ) % static_cast(displacement.x) - halfRange, -rand_r( &mRandomSeed ) % static_cast(displacement.y) ); + Vector2 randomVec(rand_r(&mRandomSeed) % static_cast(displacement.x) - halfRange, -rand_r(&mRandomSeed) % static_cast(displacement.y)); dir.Normalize(); - randomVec.x -= dir.x*halfRange; - randomVec.y *= 1.0f - fabsf(dir.x)*0.33f; + randomVec.x -= dir.x * halfRange; + randomVec.y *= 1.0f - fabsf(dir.x) * 0.33f; if(randomVec.y > 0.0f) { randomVec.y *= 0.33f; } - Vector4 startAndEndPos( emitPosition.x, emitPosition.y, emitPosition.x+randomVec.x, emitPosition.y+randomVec.y ); - bubbleRenderer.SetStartAndEndPosition( curUniform, startAndEndPos ); + Vector4 startAndEndPos(emitPosition.x, emitPosition.y, emitPosition.x + randomVec.x, emitPosition.y + randomVec.y); + bubbleRenderer.SetStartAndEndPosition(curUniform, startAndEndPos); - bubbleRenderer.SetPercentage( curUniform, 0.f); + bubbleRenderer.SetPercentage(curUniform, 0.f); } } // namespace Internal