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=1faf68c5eb2f92fee62ecb4d529e23d2adda1afe;hp=f485ea44923f051d4511ddaa7597683a46f87766;hb=57869973578f6a0b0f836d396c7232ddb8302c6b;hpb=9a450f332b63de22521e3e2a70c3378e574ad77f 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 f485ea4..1faf68c 100644 --- a/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp +++ b/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp @@ -1,29 +1,31 @@ -// -// Copyright (c) 2014 Samsung Electronics Co., Ltd. -// -// Licensed under the Flora License, Version 1.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://floralicense.org/license/ -// -// 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 +/* + * Copyright (c) 2014 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-emitter-impl.h" -//EXTERNAL INCLUDES +// EXTERNAL INCLUDES #include +#include +#include -//INTERNAL INCLUDES +// INTERNAL INCLUDES #include - namespace Dali { @@ -36,14 +38,26 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea, Image shapeImage, unsigned int maximumNumberOfBubble, const Vector2& bubbleSizeRange ) -: ControlImpl( true ), +: Control( REQUIRES_TOUCH_EVENTS ), mMovementArea( movementArea ), mShapeImage( shapeImage ), mTotalNumOfBubble( maximumNumberOfBubble ), + mRenderTaskRunning(false), mBubbleSizeRange( bubbleSizeRange ), mCurrentUniform( 0 ), mDensity( 5 ) { + // Calculate how many BubbleEffect shaders are required + if( mTotalNumOfBubble>100 ) + { + mNumBubblePerShader = 100; + mNumShader = mTotalNumOfBubble / 100; + } + else + { + mNumBubblePerShader = mTotalNumOfBubble; + mNumShader = 1; + } } BubbleEmitter::~BubbleEmitter() @@ -80,18 +94,6 @@ void BubbleEmitter::OnInitialize() // Generate the material object, which is used by all meshActors GenMaterial(); - // Calculate how many BubbleEffect shaders are required - if( mTotalNumOfBubble>100 ) - { - mNumBubblePerShader = 100; - mNumShader = mTotalNumOfBubble / 100; - } - else - { - mNumBubblePerShader = mTotalNumOfBubble; - mNumShader = 1; - } - mMesh.resize( mNumShader ); mMeshActor.resize( mNumShader ); mEffect.resize( mNumShader ); @@ -127,7 +129,11 @@ void BubbleEmitter::OnInitialize() // Create a cameraActor for the off screen render task. mCameraActor = CameraActor::New(mMovementArea); mCameraActor.SetParentOrigin(ParentOrigin::CENTER); - Stage::GetCurrent().Add(mCameraActor); + + Stage stage = Stage::GetCurrent(); + + stage.Add(mCameraActor); + stage.ContextRegainedSignal().Connect(this, &BubbleEmitter::OnContextRegained); } Actor BubbleEmitter::GetRootActor() @@ -137,6 +143,9 @@ Actor BubbleEmitter::GetRootActor() void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta ) { + mBackgroundImage = bgImage; + mHSVDelta = hsvDelta; + ImageActor sourceActor = ImageActor::New( bgImage ); sourceActor.SetSize( mMovementArea ); sourceActor.SetParentOrigin(ParentOrigin::CENTER); @@ -151,8 +160,10 @@ void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta ) task.SetSourceActor( sourceActor ); task.SetExclusive(true); task.SetCameraActor(mCameraActor); + task.GetCameraActor().SetInvertYAxis(true); task.SetTargetFrameBuffer( mEffectImage ); task.FinishedSignal().Connect(this, &BubbleEmitter::OnRenderFinished); + mRenderTaskRunning = true; } void BubbleEmitter::SetShapeImage( Image shapeImage ) @@ -201,11 +212,30 @@ void BubbleEmitter::SetBubbleDensity( unsigned int density ) // clear the resources created for the off screen rendering void BubbleEmitter::OnRenderFinished(RenderTask& source) { - Actor sourceActor = source.GetSourceActor(); - sourceActor.RemoveShaderEffect(); - Stage::GetCurrent().Remove(sourceActor); - sourceActor.Reset(); - Stage::GetCurrent().GetRenderTaskList().RemoveTask(source); + mRenderTaskRunning = false; + Actor sourceActor = source.GetSourceActor(); + if( sourceActor ) + { + RenderableActor renderable = RenderableActor::DownCast( sourceActor ); + if( renderable ) + { + renderable.RemoveShaderEffect(); + } + } + + Stage stage = Stage::GetCurrent(); + stage.Remove(sourceActor); + stage.GetRenderTaskList().RemoveTask(source); +} + +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 ) + { + SetBackground( mBackgroundImage, mHSVDelta ); + } } void BubbleEmitter::SetBlendMode( bool enable )