mMovementArea( movementArea ),
mShapeImage( shapeImage ),
mTotalNumOfBubble( maximumNumberOfBubble ),
+ mRenderTaskRunning(false),
mBubbleSizeRange( bubbleSizeRange ),
mCurrentUniform( 0 ),
mDensity( 5 )
// 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()
void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta )
{
+ mBackgroundImage = bgImage;
+ mHSVDelta = hsvDelta;
+
ImageActor sourceActor = ImageActor::New( bgImage );
sourceActor.SetSize( mMovementArea );
sourceActor.SetParentOrigin(ParentOrigin::CENTER);
task.GetCameraActor().SetInvertYAxis(true);
task.SetTargetFrameBuffer( mEffectImage );
task.FinishedSignal().Connect(this, &BubbleEmitter::OnRenderFinished);
+ mRenderTaskRunning = true;
}
void BubbleEmitter::SetShapeImage( Image shapeImage )
// clear the resources created for the off screen rendering
void BubbleEmitter::OnRenderFinished(RenderTask& source)
{
+ mRenderTaskRunning = false;
Actor sourceActor = source.GetSourceActor();
if( sourceActor )
{
renderable.RemoveShaderEffect();
}
}
- Stage::GetCurrent().Remove(sourceActor);
- Stage::GetCurrent().GetRenderTaskList().RemoveTask(source);
+
+ 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 )