X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fbubble-effect%2Fbubble-emitter-impl.cpp;h=d19daa46c57ff03b972424423b28d013e8239328;hb=6275c8953b7908321d408a470b78c07383614b45;hp=f485ea44923f051d4511ddaa7597683a46f87766;hpb=9a450f332b63de22521e3e2a70c3378e574ad77f;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git 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..d19daa4 100644 --- a/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp +++ b/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp @@ -1,28 +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 +#include -//INTERNAL INCLUDES -#include - +// INTERNAL INCLUDES +#include namespace Dali { @@ -36,14 +39,26 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea, Image shapeImage, unsigned int maximumNumberOfBubble, const Vector2& bubbleSizeRange ) -: ControlImpl( true ), +: Control( ControlBehaviour( 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() @@ -75,23 +90,11 @@ void BubbleEmitter::OnInitialize() 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, Dali::Image::Unused ); + mEffectImage = FrameBufferImage::New( mMovementArea.width/4.f, mMovementArea.height/4.f, Pixel::RGBA8888, Dali::Image::UNUSED ); // 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 ); @@ -103,9 +106,8 @@ void BubbleEmitter::OnInitialize() { mMesh[i] = Mesh::New( meshData ); mMeshActor[i] = MeshActor::New( mMesh[i] ); - mMeshActor[i].SetAffectedByLighting( false ); mMeshActor[i].SetParentOrigin(ParentOrigin::TOP_LEFT); - mEffect[i] = BubbleEffect::New( mNumBubblePerShader, mShapeImage.GetFilename() ); + mEffect[i] = BubbleEffect::New( mNumBubblePerShader ); mEffect[i].SetEffectImage( mEffectImage ); mEffect[i].SetMovementArea( mMovementArea ); mMeshActor[i].SetShaderEffect( mEffect[i] ); @@ -116,9 +118,8 @@ void BubbleEmitter::OnInitialize() MeshData meshDataForNoise; ConstructBubbleMesh( meshDataForNoise, mNumBubblePerShader); mMeshActorForNoise = MeshActor::New( Mesh::New(meshDataForNoise) ); - mMeshActorForNoise.SetAffectedByLighting( false ); mMeshActorForNoise.SetParentOrigin(ParentOrigin::TOP_LEFT); - mEffectForNoise = BubbleEffect::New( mNumBubblePerShader, mShapeImage.GetFilename() ); + mEffectForNoise = BubbleEffect::New( mNumBubblePerShader ); mEffectForNoise.SetMovementArea( mMovementArea ); mEffectForNoise.SetEffectImage( mEffectImage ); mMeshActorForNoise.SetShaderEffect( mEffectForNoise ); @@ -127,7 +128,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 +142,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,22 +159,15 @@ 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 ) { mCustomMaterial.SetDiffuseTexture( shapeImage ); - - //Get pixel width of the shape - float width = Image::GetImageSize(shapeImage.GetFilename()).width; - - for(unsigned int i=0; i < mNumShader; i++ ) - { - mEffect[i].SetShapeImageWidth(width); - } - mEffectForNoise.SetShapeImageWidth(width); } void BubbleEmitter::SetBubbleScale( float scale ) @@ -201,11 +202,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 ) @@ -241,14 +261,14 @@ void BubbleEmitter::EmitBubble( Animation& animation, const Vector2& emitPositio unsigned int groupIdx = mCurrentUniform / mNumBubblePerShader; SetBubbleParameter( mEffect[groupIdx], curUniform, emitPosition, direction, displacement); animation.AnimateTo( Property( mEffect[groupIdx], mEffect[groupIdx].GetPercentagePropertyName(curUniform) ), - 1.f, AlphaFunctions::Linear ); + 1.f, AlphaFunction::LINEAR ); if( mCurrentUniform % mNumShader == 0 ) { unsigned int uniform = mCurrentUniform / mNumShader; SetBubbleParameter(mEffectForNoise, uniform, emitPosition, displacement); animation.AnimateTo( Property( mEffectForNoise, mEffectForNoise.GetPercentagePropertyName(uniform) ), - 1.f, AlphaFunctions::Linear ); + 1.f, AlphaFunction::LINEAR ); } mCurrentUniform = (mCurrentUniform + 1) % mTotalNumOfBubble; @@ -260,10 +280,10 @@ void BubbleEmitter::StartExplosion( float duration, float multiple ) for(unsigned int i=0; i < mNumShader; i++ ) { animation.AnimateTo( Property( mEffect[i], mEffect[i].GetMagnificationPropertyName() ), - multiple, AlphaFunctions::EaseOut); + multiple, AlphaFunction::EASE_OUT); } animation.AnimateTo( Property( mEffectForNoise, mEffectForNoise.GetMagnificationPropertyName() ), - multiple, AlphaFunctions::EaseOut); + multiple, AlphaFunction::EASE_OUT); animation.Play(); animation.FinishedSignal().Connect(this, &BubbleEmitter::OnExplosionFinished);