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=ae17a0dcdbe88081107fa62bca297bc873f3337f;hp=90223eed12fc10e952087b321a583e3c45584ceb;hb=df92f45e89c92ca9b2286d51116ff7b69e75c569;hpb=d592858e8b94a1e5df4e83b6c5b6c484152547d8 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 90223ee..ae17a0d 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,32 @@ -// -// 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 +// 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); @@ -154,20 +162,12 @@ void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta ) 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 ) @@ -202,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 ) @@ -242,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; @@ -261,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);