[3.0] Updates after removal of experimental API
[platform/core/uifw/dali-demo.git] / examples / new-window / new-window-example.cpp
index ff17e0f..56b74f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
  * limitations under the License.
  */
 
+// EXTERNAL INCLUDES
+#include <dali/devel-api/images/texture-set-image.h>
+#include <dali/public-api/rendering/renderer.h>
 #include <dali-toolkit/dali-toolkit.h>
-#include "../shared/view.h"
+#include <dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.h>
+#include <dali-toolkit/devel-api/controls/gaussian-blur-view/gaussian-blur-view.h>
+
+#include <cstdio>
+#include <iostream>
+
+// INTERNAL INCLUDES
+#include "shared/view.h"
+#include "shared/utility.h"
 
 using namespace Dali;
 using namespace Dali::Toolkit;
@@ -24,29 +35,85 @@ class NewWindowController;
 
 namespace
 {
-const char * gModelFile = DALI_MODEL_DIR "AlbumCute.dali-bin";
-const char * const BACKGROUND_IMAGE( DALI_IMAGE_DIR "background-2.jpg" );
-const char * const TOOLBAR_IMAGE( DALI_IMAGE_DIR "top-bar.png" );
-const char * const LOSE_CONTEXT_IMAGE( DALI_IMAGE_DIR "icon-cluster-wobble.png" );
-const char * const BASE_IMAGE( DALI_IMAGE_DIR "gallery-large-14.jpg" );
-const char * const EFFECT_IMAGE( DALI_IMAGE_DIR "gallery-large-18.jpg" );
+const char * const BACKGROUND_IMAGE( DEMO_IMAGE_DIR "background-2.jpg" );
+const char * const TOOLBAR_IMAGE( DEMO_IMAGE_DIR "top-bar.png" );
+const char * const LOSE_CONTEXT_IMAGE( DEMO_IMAGE_DIR "icon-cluster-wobble.png" );
+const char * const LOSE_CONTEXT_IMAGE_SELECTED( DEMO_IMAGE_DIR "icon-cluster-wobble-selected.png" );
+const char * const BASE_IMAGE( DEMO_IMAGE_DIR "gallery-large-14.jpg" );
+const char * const EFFECT_IMAGE( DEMO_IMAGE_DIR "gallery-large-18.jpg" );
+const char * const LOGO_IMAGE(DEMO_IMAGE_DIR "dali-logo.png");
 
 const float EXPLOSION_DURATION(1.2f);
-const unsigned int EMIT_INTERVAL_IN_MS(80);
+const unsigned int EMIT_INTERVAL_IN_MS(40);
 const float TRACK_DURATION_IN_MS(970);
 
 Application gApplication;
 NewWindowController* gNewWindowController(NULL);
 
-const char*const FRAG_SHADER=
-  "uniform mediump float alpha;\n"
-  "\n"
-  "void main()\n"
-  "{\n"
-  "  mediump vec4 fragColor = texture2D(sTexture, vTexCoord);\n"
-  "  mediump vec4 fxColor   = texture2D(sEffect, vTexCoord);\n"
-  "  gl_FragColor   = mix(fragColor,fxColor, alpha);\n"
-  "}\n";
+#define MAKE_SHADER(A)#A
+
+const char* VERTEX_COLOR_MESH = MAKE_SHADER(
+attribute mediump vec3  aPosition;\n
+attribute lowp    vec3  aColor;\n
+uniform   mediump mat4  uMvpMatrix;\n
+uniform   mediump vec3  uSize;\n
+varying   lowp    vec3  vColor;\n
+\n
+void main()\n
+{\n
+  gl_Position = uMvpMatrix * vec4( aPosition*uSize, 1.0 );\n
+  vColor = aColor;\n
+}\n
+);
+
+const char* FRAGMENT_COLOR_MESH = MAKE_SHADER(
+uniform lowp vec4  uColor;\n
+varying lowp vec3  vColor;\n
+\n
+void main()\n
+{\n
+  gl_FragColor = vec4(vColor,1.0)*uColor;
+}\n
+);
+
+const char* VERTEX_TEXTURE_MESH = MAKE_SHADER(
+attribute mediump vec3  aPosition;\n
+attribute highp   vec2  aTexCoord;\n
+uniform   mediump mat4  uMvpMatrix;\n
+uniform   mediump vec3  uSize;\n
+varying   mediump vec2  vTexCoord;\n
+\n
+void main()\n
+{\n
+  gl_Position = uMvpMatrix * vec4( aPosition*uSize, 1.0 );\n
+  vTexCoord = aTexCoord;\n
+}\n
+);
+
+const char* FRAGMENT_TEXTURE_MESH = MAKE_SHADER(
+varying mediump vec2  vTexCoord;\n
+uniform lowp    vec4  uColor;\n
+uniform sampler2D     sTexture;\n
+\n
+void main()\n
+{\n
+  gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;
+}\n
+);
+
+const char* FRAGMENT_BLEND_SHADER = MAKE_SHADER(
+varying mediump vec2  vTexCoord;\n
+uniform sampler2D sTexture;\n
+uniform sampler2D sEffect;\n
+uniform mediump float alpha;\n
+\n
+void main()\n
+{\n
+  mediump vec4 fragColor = texture2D(sTexture, vTexCoord);\n
+  mediump vec4 fxColor   = texture2D(sEffect, vTexCoord);\n
+  gl_FragColor = mix(fragColor,fxColor, alpha);\n
+}\n
+);
 
 }; // anonymous namespace
 
@@ -57,54 +124,39 @@ public:
   NewWindowController( Application& app );
   void Create( Application& app );
   void Destroy( Application& app );
-  void OnKeyEvent(const KeyEvent& event);
-  bool OnLoseContextButtonClicked( Toolkit::Button button );
+
+  void AddBubbles( Actor& parentActor, const Vector2& stageSize);
+  void AddMeshActor( Actor& parentActor );
+  void AddBlendingImageActor( Actor& parentActor );
+  void AddTextLabel( Actor& parentActor );
+
+  ImageView CreateBlurredMirrorImage(const char* imageName);
+  FrameBufferImage CreateFrameBufferForImage( const char* imageName, Property::Map& shaderEffect, const Vector3& rgbDelta );
+  void SetUpBubbleEmission( const Vector2& emitPosition, const Vector2& direction );
+  Geometry CreateMeshGeometry();
+  Dali::Property::Map CreateColorModifierer();
+
   static void NewWindow(void);
 
+  bool OnTrackTimerTick();
+  void OnKeyEvent(const KeyEvent& event);
+  bool OnLoseContextButtonClicked( Toolkit::Button button );
   void OnContextLost();
   void OnContextRegained();
-  void CreateMeshActor();
-  Mesh CreateMesh(bool, Material);
-  void CreateBubbles(Vector2 stageSize);
-  void CreateBlending();
-  void CreateText();
-  void CreateModel();
-  void OnModelLoaded(Model model);
-  bool OnTrackTimerTick();
-  bool OnExplodeTimerTick();
-  void SetUpAnimation( Vector2 emitPosition, Vector2 direction );
-  FrameBufferImage CreateMirrorImage(const char* imageName);
-  ImageActor CreateBlurredMirrorImage(const char* imageName);
-  FrameBufferImage CreateFrameBufferForImage(const char* imageName, Image image, ShaderEffect shaderEffect);
-
 
 private:
   Application                mApplication;
-  Animation                  mModelAnimation;
-  Actor                      mModelActor;
-  Actor                      mCastingLight;
-  TextActor                  mTextActor;
-  ImageActor                 mImageActor;
-  ImageActor                 mBlendActor;
-  Image                      mEffectImage;
-  Image                      mBaseImage;
-  LightActor                 mKeyLightActor;
-  MeshActor                  mMeshActor;
-  MeshActor                  mAnimatedMeshActor;
-  Model                      mModel;
-
-  Toolkit::View              mView;                              ///< The View instance.
+  TextLabel                  mTextActor;
+
+  Toolkit::Control           mView;                              ///< The View instance.
   Toolkit::ToolBar           mToolBar;                           ///< The View's Toolbar.
-  TextView                   mTitleActor;                        ///< The Toolbar's Title.
+  TextLabel                  mTitleActor;                        ///< The Toolbar's Title.
   Layer                      mContentLayer;                      ///< Content layer (scrolling cluster content)
   Toolkit::PushButton        mLoseContextButton;
-  Vector3                    mHSVDelta;
-  Toolkit::BubbleEmitter     mEmitter;
 
+  Toolkit::BubbleEmitter     mEmitter;
   Timer                      mEmitTrackTimer;
-  Timer                      mExplodeTimer;
   bool                       mNeedNewAnimation;
-
   unsigned int               mAnimateComponentCount;
   Animation                  mEmitAnimation;
 };
@@ -112,7 +164,6 @@ private:
 
 NewWindowController::NewWindowController( Application& application )
 : mApplication(application),
-  mHSVDelta(0.5f, 0.0f, 0.5f),
   mNeedNewAnimation(true)
 {
   mApplication.InitSignal().Connect(this, &NewWindowController::Create);
@@ -134,10 +185,15 @@ void NewWindowController::Create( Application& app )
   mContentLayer = DemoHelper::CreateView( app,
                                           mView,
                                           mToolBar,
-                                          BACKGROUND_IMAGE,
+                                          "",
                                           TOOLBAR_IMAGE,
                                           "Context recovery" );
 
+  Size stageSize = stage.GetSize();
+  ImageView backgroundActor = ImageView::New( BACKGROUND_IMAGE, Dali::ImageDimensions( stageSize.x, stageSize.y ) );
+  backgroundActor.SetParentOrigin( ParentOrigin::CENTER );
+  mContentLayer.Add(backgroundActor);
+
   // Point the default render task at the view
   RenderTaskList taskList = stage.GetRenderTaskList();
   RenderTask defaultTask = taskList.GetTask( 0u );
@@ -147,34 +203,32 @@ void NewWindowController::Create( Application& app )
   }
 
   mLoseContextButton = Toolkit::PushButton::New();
-  mLoseContextButton.SetBackgroundImage( Image::New( LOSE_CONTEXT_IMAGE ) );
+  mLoseContextButton.SetUnselectedImage( LOSE_CONTEXT_IMAGE );
+  mLoseContextButton.SetSelectedImage( LOSE_CONTEXT_IMAGE_SELECTED );
   mLoseContextButton.ClickedSignal().Connect( this, &NewWindowController::OnLoseContextButtonClicked );
   mToolBar.AddControl( mLoseContextButton, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Toolkit::Alignment::HorizontalRight, DemoHelper::DEFAULT_MODE_SWITCH_PADDING );
 
-
   Actor logoLayoutActor = Actor::New();
   logoLayoutActor.SetParentOrigin(ParentOrigin::CENTER);
   logoLayoutActor.SetPosition(0.0f, -200.0f, 0.0f);
   logoLayoutActor.SetScale(0.5f);
-  mContentLayer.Add(logoLayoutActor);
-
-  Image image = Image::New(DALI_IMAGE_DIR "dali-logo.png");
-  mImageActor = ImageActor::New(image);
-  mImageActor.SetName("dali-logo");
-  mImageActor.SetParentOrigin(ParentOrigin::CENTER);
-  mImageActor.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER);
-  logoLayoutActor.Add(mImageActor);
-
-  ImageActor mirrorImageActor = CreateBlurredMirrorImage(DALI_IMAGE_DIR "dali-logo.png");
-  mirrorImageActor.SetParentOrigin(ParentOrigin::CENTER);
-  mirrorImageActor.SetAnchorPoint(AnchorPoint::TOP_CENTER);
-  logoLayoutActor.Add(mirrorImageActor);
-
-  CreateBubbles(stage.GetSize());
-  CreateMeshActor();
-  CreateBlending();
-  CreateText();
-  CreateModel();
+  backgroundActor.Add(logoLayoutActor);
+
+  ImageView imageView = ImageView::New( LOGO_IMAGE );
+  imageView.SetName("daliLogo");
+  imageView.SetParentOrigin(ParentOrigin::CENTER);
+  imageView.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER);
+  logoLayoutActor.Add(imageView);
+
+  ImageView mirrorImageView = CreateBlurredMirrorImage(LOGO_IMAGE);
+  mirrorImageView.SetParentOrigin(ParentOrigin::TOP_CENTER);
+  mirrorImageView.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER);
+  logoLayoutActor.Add(mirrorImageView);
+
+  AddBubbles( backgroundActor, stage.GetSize());
+  AddMeshActor( backgroundActor );
+  AddBlendingImageActor( backgroundActor );
+  AddTextLabel( backgroundActor );
 
   stage.ContextLostSignal().Connect(this, &NewWindowController::OnContextLost);
   stage.ContextRegainedSignal().Connect(this, &NewWindowController::OnContextRegained);
@@ -185,52 +239,118 @@ void NewWindowController::Destroy( Application& app )
   UnparentAndReset(mTextActor);
 }
 
-bool NewWindowController::OnLoseContextButtonClicked( Toolkit::Button button )
+void NewWindowController::AddBubbles( Actor& parentActor, const Vector2& stageSize)
 {
-  // Add as an idle callback to avoid ProcessEvents being recursively called.
-  mApplication.AddIdle(NewWindowController::NewWindow);
-  return true;
+  mEmitter = Toolkit::BubbleEmitter::New( stageSize,
+                                          DemoHelper::LoadImage( DEMO_IMAGE_DIR "bubble-ball.png" ),
+                                          200, Vector2( 5.0f, 5.0f ) );
+
+  Image background = DemoHelper::LoadImage(BACKGROUND_IMAGE);
+  mEmitter.SetBackground( background, Vector3(0.5f, 0.f,0.5f) );
+  mEmitter.SetBubbleDensity( 9.f );
+  Actor bubbleRoot = mEmitter.GetRootActor();
+  parentActor.Add( bubbleRoot );
+  bubbleRoot.SetParentOrigin(ParentOrigin::CENTER);
+  bubbleRoot.SetZ(0.1f);
+
+  mEmitTrackTimer = Timer::New( EMIT_INTERVAL_IN_MS );
+  mEmitTrackTimer.TickSignal().Connect(this, &NewWindowController::OnTrackTimerTick);
+  mEmitTrackTimer.Start();
+}
+
+void NewWindowController::AddMeshActor( Actor& parentActor )
+{
+  Geometry meshGeometry = CreateMeshGeometry();
+
+  // Create a coloured mesh
+  Shader shaderColorMesh = Shader::New( VERTEX_COLOR_MESH, FRAGMENT_COLOR_MESH );
+  Renderer colorMeshRenderer = Renderer::New( meshGeometry, shaderColorMesh );
+
+  Actor colorMeshActor = Actor::New();
+  colorMeshActor.AddRenderer( colorMeshRenderer );
+  colorMeshActor.SetSize( 175.f,175.f, 175.f );
+  colorMeshActor.SetParentOrigin( ParentOrigin::CENTER );
+  colorMeshActor.SetAnchorPoint(AnchorPoint::TOP_CENTER);
+  colorMeshActor.SetPosition(Vector3(0.0f, 50.0f, 0.0f));
+  colorMeshActor.SetOrientation( Degree(75.f), Vector3::XAXIS );
+  colorMeshActor.SetName("ColorMeshActor");
+
+ // Create a textured mesh
+  Texture effectTexture = DemoHelper::LoadTexture(EFFECT_IMAGE);
+  Shader shaderTextureMesh = Shader::New( VERTEX_TEXTURE_MESH, FRAGMENT_TEXTURE_MESH );
+  TextureSet textureSet = TextureSet::New();
+  textureSet.SetTexture( 0u, effectTexture );
+  Renderer textureMeshRenderer = Renderer::New( meshGeometry, shaderTextureMesh );
+  textureMeshRenderer.SetTextures( textureSet );
+
+  Actor textureMeshActor = Actor::New();
+  textureMeshActor.AddRenderer( textureMeshRenderer );
+  textureMeshActor.SetSize( 175.f,175.f, 175.f );
+  textureMeshActor.SetParentOrigin( ParentOrigin::CENTER );
+  textureMeshActor.SetAnchorPoint(AnchorPoint::TOP_CENTER);
+  textureMeshActor.SetPosition(Vector3(0.0f, 200.0f, 0.0f));
+  textureMeshActor.SetOrientation( Degree(75.f), Vector3::XAXIS );
+  textureMeshActor.SetName("TextureMeshActor");
+
+  Layer layer3d = Layer::New();
+  layer3d.SetParentOrigin( ParentOrigin::CENTER );
+  layer3d.SetAnchorPoint( AnchorPoint::CENTER );
+  layer3d.SetBehavior(Layer::LAYER_3D);
+
+  layer3d.Add( colorMeshActor );
+  layer3d.Add( textureMeshActor );
+  parentActor.Add(layer3d);
 }
 
-void NewWindowController::CreateMeshActor()
+void NewWindowController::AddBlendingImageActor( Actor& parentActor )
 {
-  mEffectImage = Image::New(EFFECT_IMAGE);
-
-  Material baseMaterial = Material::New( "Material1" );
-  Dali::MeshActor meshActor = MeshActor::New( CreateMesh(true, baseMaterial) );
-  meshActor.SetScale( 100.0f );
-  meshActor.SetParentOrigin( ParentOrigin::CENTER );
-  meshActor.SetPosition(Vector3( -150.0f, 200.0f, 0.0f ));
-  meshActor.SetAffectedByLighting( false );
-  meshActor.SetName("MeshActor");
-  mContentLayer.Add( meshActor );
-
-  Material orchidMaterial = Material::New( "Material2" );
-  orchidMaterial.SetDiffuseTexture(mEffectImage);
-
-  Dali::MeshActor meshActor2 = MeshActor::New( CreateMesh(false, orchidMaterial) );
-  meshActor2.SetScale( 100.0f );
-  meshActor2.SetParentOrigin( ParentOrigin::CENTER );
-  meshActor2.SetPosition(Vector3( -150.0f, 310.0f, 0.0f ));
-  meshActor2.SetAffectedByLighting( false );
-  meshActor2.SetName("MeshActor");
-  mContentLayer.Add( meshActor2 );
+  Property::Map colorModifier = CreateColorModifierer();
+
+  FrameBufferImage fb2 = CreateFrameBufferForImage( EFFECT_IMAGE, colorModifier, Vector3( 0.5f, 0.5f, 0.5f ) );
+
+  ImageView tmpActor = ImageView::New(fb2);
+  parentActor.Add(tmpActor);
+  tmpActor.SetParentOrigin(ParentOrigin::CENTER_RIGHT);
+  tmpActor.SetAnchorPoint(AnchorPoint::TOP_RIGHT);
+  tmpActor.SetPosition(Vector3(0.0f, 150.0f, 0.0f));
+  tmpActor.SetScale(0.25f);
+
+  // create blending shader effect
+  Property::Map customShader;
+  customShader[ "fragmentShader" ] = FRAGMENT_BLEND_SHADER;
+  Property::Map map;
+  map[ "shader" ] = customShader;
+
+  ImageView blendActor = ImageView::New( BASE_IMAGE );
+  blendActor.SetProperty( ImageView::Property::IMAGE, map );
+  blendActor.RegisterProperty( "alpha", 0.5f );
+
+  blendActor.SetParentOrigin(ParentOrigin::CENTER_RIGHT);
+  blendActor.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+  blendActor.SetPosition(Vector3(0.0f, 100.0f, 0.0f));
+  blendActor.SetSize(140, 140);
+  parentActor.Add(blendActor);
+
+  TextureSet textureSet = blendActor.GetRendererAt(0u).GetTextures();
+  TextureSetImage( textureSet, 1u, fb2 );
 }
 
-FrameBufferImage NewWindowController::CreateMirrorImage(const char* imageName)
+void NewWindowController::AddTextLabel( Actor& parentActor )
 {
-  FrameBufferImage fbo;
-  Image image = Image::New(imageName);
-  fbo = CreateFrameBufferForImage(imageName, image, ShaderEffect());
-  return fbo;
+  mTextActor = TextLabel::New("Some text");
+  mTextActor.SetParentOrigin(ParentOrigin::CENTER);
+  mTextActor.SetColor(Color::RED);
+  mTextActor.SetName("PushMe text");
+  parentActor.Add( mTextActor );
 }
 
-ImageActor NewWindowController::CreateBlurredMirrorImage(const char* imageName)
+ImageView NewWindowController::CreateBlurredMirrorImage(const char* imageName)
 {
-  FrameBufferImage fbo;
-  Image image = Image::New( imageName );
-  Vector2 FBOSize = Image::GetImageSize(imageName);
-  fbo = FrameBufferImage::New( FBOSize.width, FBOSize.height, Pixel::RGBA8888);
+  Image image = DemoHelper::LoadImage(imageName);
+
+  Vector2 FBOSize = Vector2( image.GetWidth(), image.GetHeight() );
+  FrameBufferImage fbo = FrameBufferImage::New( FBOSize.width, FBOSize.height, Pixel::RGBA8888);
+
   GaussianBlurView gbv = GaussianBlurView::New(5, 2.0f, Pixel::RGBA8888, 0.5f, 0.5f, true);
   gbv.SetBackgroundColor(Color::TRANSPARENT);
   gbv.SetUserImageAndOutputRenderTarget( image, fbo );
@@ -238,31 +358,31 @@ ImageActor NewWindowController::CreateBlurredMirrorImage(const char* imageName)
   Stage::GetCurrent().Add(gbv);
   gbv.ActivateOnce();
 
-  ImageActor blurredActor = ImageActor::New(fbo);
+  ImageView blurredActor = ImageView::New(fbo);
   blurredActor.SetSize(FBOSize);
   blurredActor.SetScale(1.0f, -1.0f, 1.0f);
   return blurredActor;
 }
 
-FrameBufferImage NewWindowController::CreateFrameBufferForImage(const char* imageName, Image image, ShaderEffect shaderEffect)
+FrameBufferImage NewWindowController::CreateFrameBufferForImage(const char* imageName, Property::Map& shaderEffect, const Vector3& rgbDelta )
 {
   Stage stage = Stage::GetCurrent();
-  Vector2 FBOSize = Image::GetImageSize(imageName);
+  Uint16Pair intFboSize = ResourceImage::GetImageSize( imageName );
+  Vector2 FBOSize = Vector2(intFboSize.GetWidth(), intFboSize.GetHeight());
 
   FrameBufferImage framebuffer = FrameBufferImage::New(FBOSize.x, FBOSize.y );
 
   RenderTask renderTask = stage.GetRenderTaskList().CreateTask();
 
-  ImageActor imageActor = ImageActor::New(image);
-  imageActor.SetName("Source image actor");
-  if(shaderEffect)
-  {
-    imageActor.SetShaderEffect(shaderEffect);
-  }
-  imageActor.SetParentOrigin(ParentOrigin::CENTER);
-  imageActor.SetAnchorPoint(AnchorPoint::CENTER);
-  imageActor.SetScale(1.0f, -1.0f, 1.0f);
-  stage.Add(imageActor); // Not in default image view
+  ImageView imageView = ImageView::New( imageName );
+  imageView.SetName("Source image actor");
+  imageView.SetProperty( ImageView::Property::IMAGE, shaderEffect );
+  imageView.RegisterProperty( "uRGBDelta", rgbDelta );
+
+  imageView.SetParentOrigin(ParentOrigin::CENTER);
+  imageView.SetAnchorPoint(AnchorPoint::CENTER);
+  imageView.SetScale(1.0f, -1.0f, 1.0f);
+  stage.Add(imageView); // Not in default image view
 
   CameraActor cameraActor = CameraActor::New(FBOSize);
   cameraActor.SetParentOrigin(ParentOrigin::CENTER);
@@ -270,11 +390,10 @@ FrameBufferImage NewWindowController::CreateFrameBufferForImage(const char* imag
   cameraActor.SetNearClippingPlane(1.0f);
   cameraActor.SetAspectRatio(FBOSize.width / FBOSize.height);
   cameraActor.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor
-  cameraActor.SetRotation(Quaternion(M_PI, Vector3::YAXIS));
   cameraActor.SetPosition(0.0f, 0.0f, ((FBOSize.height * 0.5f) / tanf(Math::PI * 0.125f)));
   stage.Add(cameraActor);
 
-  renderTask.SetSourceActor(imageActor);
+  renderTask.SetSourceActor(imageView);
   renderTask.SetInputEnabled(false);
   renderTask.SetTargetFrameBuffer(framebuffer);
   renderTask.SetCameraActor( cameraActor );
@@ -285,38 +404,7 @@ FrameBufferImage NewWindowController::CreateFrameBufferForImage(const char* imag
   return framebuffer;
 }
 
-void NewWindowController::CreateBubbles(Vector2 stageSize)
-{
-  mEmitter = Toolkit::BubbleEmitter::New( stageSize,
-                                          Image::New( DALI_IMAGE_DIR "bubble-ball.png" ),
-                                          1000, Vector2( 5.0f, 5.0f ) );
-
-  Image background = Image::New(BACKGROUND_IMAGE);
-  mEmitter.SetBackground( background, mHSVDelta );
-  Actor bubbleRoot = mEmitter.GetRootActor();
-  mContentLayer.Add( bubbleRoot );
-  bubbleRoot.SetParentOrigin(ParentOrigin::CENTER);
-  bubbleRoot.SetZ(0.1f);
-
-  mEmitTrackTimer = Timer::New( EMIT_INTERVAL_IN_MS );
-  mEmitTrackTimer.TickSignal().Connect(this, &NewWindowController::OnTrackTimerTick);
-  mEmitTrackTimer.Start();
-
-  //mExplodeTimer = Timer::New( Random::Range(4000.f, 8000.f) );
-  //mExplodeTimer.TickSignal().Connect(this, &NewWindowController::OnExplodeTimerTick);
-  //mExplodeTimer.Start();
-}
-
-bool NewWindowController::OnExplodeTimerTick()
-{
-  mEmitter.StartExplosion( EXPLOSION_DURATION, 5.0f );
-
-  mExplodeTimer = Timer::New( Random::Range(4.f, 8.f) );
-  mExplodeTimer.TickSignal().Connect(this, &NewWindowController::OnExplodeTimerTick);
-  return false;
-}
-
-void NewWindowController::SetUpAnimation( Vector2 emitPosition, Vector2 direction )
+void NewWindowController::SetUpBubbleEmission( const Vector2& emitPosition, const Vector2& direction)
 {
   if( mNeedNewAnimation )
   {
@@ -326,157 +414,118 @@ void NewWindowController::SetUpAnimation( Vector2 emitPosition, Vector2 directio
     mAnimateComponentCount = 0;
   }
 
-  mEmitter.EmitBubble( mEmitAnimation, emitPosition, direction, Vector2(1, 1) );
+  mEmitter.EmitBubble( mEmitAnimation, emitPosition, direction, Vector2(10,10) );
 
   mAnimateComponentCount++;
 
-  if( mAnimateComponentCount % 20 ==0 )
+  if( mAnimateComponentCount % 6 ==0 )
   {
     mEmitAnimation.Play();
     mNeedNewAnimation = true;
   }
 }
 
-bool NewWindowController::OnTrackTimerTick()
+Geometry NewWindowController::CreateMeshGeometry()
 {
-  static int time=0;
-  const float radius(250.0f);
-
-  time += EMIT_INTERVAL_IN_MS;
-  float modTime = time / TRACK_DURATION_IN_MS;
-  float angle = 2.0f*Math::PI*modTime;
-
-  Vector2 position(radius*cosf(angle), radius*-sinf(angle));
-  Vector2 aimPos(radius*2*sinf(angle), radius*2*-cosf(angle));
-  Vector2 direction = aimPos-position;
-  Vector2 stageSize = Stage::GetCurrent().GetSize();
-
-  for(int i=0; i<20; i++)
+  // Create vertices and specify their color
+  struct Vertex
   {
-    SetUpAnimation( stageSize*0.5f+position, direction );
-  }
-
-  return true;
-}
+    Vector3 position;
+    Vector2 textureCoordinates;
+    Vector3 color;
+  };
+
+  Vertex vertexData[5] = {
+    { Vector3(  0.0f,  0.0f, 0.5f ), Vector2(0.5f, 0.5f), Vector3(1.0f, 1.0f, 1.0f) },
+    { Vector3( -0.5f, -0.5f, 0.0f ), Vector2(0.0f, 0.0f), Vector3(1.0f, 0.0f, 0.0f) },
+    { Vector3(  0.5f, -0.5f, 0.0f ), Vector2(1.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f) },
+    { Vector3( -0.5f,  0.5f, 0.0f ), Vector2(0.0f, 1.0f), Vector3(0.0f, 1.0f, 0.0f) },
+    { Vector3(  0.5f,  0.5f, 0.0f ), Vector2(1.0f, 1.0f), Vector3(0.0f, 0.0f, 1.0f) }  };
+
+  Property::Map vertexFormat;
+  vertexFormat["aPosition"] = Property::VECTOR3;
+  vertexFormat["aTexCoord"] = Property::VECTOR2;
+  vertexFormat["aColor"] = Property::VECTOR3;
+  PropertyBuffer vertices = PropertyBuffer::New( vertexFormat );
+  vertices.SetData( vertexData, 5 );
 
+  // Specify all the faces
+  unsigned short indexData[12] = { 0,1,3,0,2,4,0,3,4,0,2,1 };
 
-void NewWindowController::CreateBlending()
-{
-  Toolkit::ColorAdjuster colorAdjuster = ColorAdjuster::New(mHSVDelta);
-  FrameBufferImage fb2 = CreateFrameBufferForImage( EFFECT_IMAGE, mEffectImage, colorAdjuster );
-
-  ImageActor tmpActor = ImageActor::New(fb2);
-  mContentLayer.Add(tmpActor);
-  tmpActor.SetParentOrigin(ParentOrigin::BOTTOM_RIGHT);
-  tmpActor.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
-  tmpActor.SetScale(0.25f);
+  // Create the geometry object
+  Geometry geometry = Geometry::New();
+  geometry.AddVertexBuffer( vertices );
+  geometry.SetIndexBuffer( &indexData[0], 12 );
 
-  // create blending shader effect
-  ShaderEffect blendShader = ShaderEffect::New( "", FRAG_SHADER );
-  blendShader.SetEffectImage( fb2 );
-  blendShader.SetUniform("alpha", 0.5f);
-
-  mBaseImage = Image::New(BASE_IMAGE);
-  mBlendActor = ImageActor::New( mBaseImage );
-  mBlendActor.SetParentOrigin(ParentOrigin::CENTER);
-  mBlendActor.SetPosition(Vector3(150.0f, 200.0f, 0.0f));
-  mBlendActor.SetSize(140, 140);
-  mBlendActor.SetShaderEffect( blendShader );
-  mContentLayer.Add(mBlendActor);
+  return geometry;
 }
 
-void NewWindowController::CreateText()
+Dali::Property::Map NewWindowController::CreateColorModifierer()
 {
-  mTextActor = TextActor::New("Some text");
-  mTextActor.SetParentOrigin(ParentOrigin::CENTER);
-  mTextActor.SetColor(Color::RED);
-  mTextActor.SetName("PushMe text");
-  mContentLayer.Add( mTextActor );
+ const char* fragmentShader ( DALI_COMPOSE_SHADER (
+   precision highp float;\n
+   uniform vec3 uRGBDelta;\n
+   uniform float uIgnoreAlpha;\n
+   \n
+   varying mediump vec2 vTexCoord;\n
+   uniform sampler2D sTexture;\n
+   \n
+   float rand(vec2 co) \n
+   {\n
+     return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); \n}
+   \n
+   void main() {\n
+     vec4 color = texture2D(sTexture, vTexCoord); \n
+     // modify the hsv Value
+     color.rgb += uRGBDelta * rand(vTexCoord); \n
+     // if the new vale exceeds one, then decrease it
+     color.rgb -= max(color.rgb*2.0 - vec3(2.0), 0.0);\n
+     // if the new vale drops below zero, then increase it
+     color.rgb -= min(color.rgb*2.0, 0.0);\n
+     gl_FragColor = color; \n
+   }\n
+ ) );
+
+ Property::Map map;
+ Property::Map customShader;
+ customShader[ "fragmentShader" ] = fragmentShader;
+ map[ "shader" ] = customShader;
+
+ return map;
 }
 
-Mesh NewWindowController::CreateMesh(bool hasColor, Material material)
+void NewWindowController::NewWindow(void)
 {
-  // Create vertices and specify their color
-  MeshData::VertexContainer vertices(4);
-  vertices[ 0 ] = MeshData::Vertex( Vector3( -0.5f, -0.5f, 0.0f ), Vector2(0.0f, 0.0f), Vector3(1.0f, 0.0f, 0.0f) );
-  vertices[ 1 ] = MeshData::Vertex( Vector3(  0.5f, -0.5f, 0.0f ), Vector2(1.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f) );
-  vertices[ 2 ] = MeshData::Vertex( Vector3( -0.5f,  0.5f, 0.0f ), Vector2(0.0f, 1.0f), Vector3(0.0f,1.0f,0.0f) );
-  vertices[ 3 ] = MeshData::Vertex( Vector3(  0.5f,  0.5f, 0.0f ), Vector2(1.0f, 1.0f), Vector3(0.0f,0.0f,1.0f) );
-
-  // Specify all the faces
-  MeshData::FaceIndices faces;
-  faces.reserve( 6 ); // 2 triangles in Quad
-  faces.push_back( 0 ); faces.push_back( 3 ); faces.push_back( 1 );
-  faces.push_back( 0 ); faces.push_back( 2 ); faces.push_back( 3 );
-
-  // Create the mesh data from the vertices and faces
-  MeshData meshData;
-  meshData.SetHasColor( hasColor );
-  meshData.SetMaterial( material );
-  meshData.SetVertices( vertices );
-  meshData.SetFaceIndices( faces );
-
-  // Create a mesh from the data
-  Dali::Mesh mesh = Mesh::New( meshData );
-  return mesh;
+  PositionSize posSize(0, 0, 720, 1280);
+  gApplication.ReplaceWindow(posSize, "NewWindow"); // Generates a new window
 }
 
-void NewWindowController::CreateModel()
+bool NewWindowController::OnLoseContextButtonClicked( Toolkit::Button button )
 {
-  mModel = Model::New(gModelFile);
-  mModel.LoadingFinishedSignal().Connect(this, &NewWindowController::OnModelLoaded);
-
-  //Create a Key light
-  Light keylight = Light::New("KeyLight");
-  keylight.SetFallOff(Vector2(10000.0f, 10000.0f));
-
-  mCastingLight = Actor::New();
-  mCastingLight.SetParentOrigin(ParentOrigin::CENTER);
-  mCastingLight.SetAnchorPoint(AnchorPoint::CENTER);
-  mCastingLight.SetPosition( Vector3( 0.0f, 0.0f, 800.0f ) );
-  mContentLayer.Add( mCastingLight );
-
-  mKeyLightActor = LightActor::New();
-  mKeyLightActor.SetParentOrigin(ParentOrigin::CENTER);
-  mKeyLightActor.SetName(keylight.GetName());
-
-  //Add all the actors to the stage
-  mCastingLight.Add(mKeyLightActor);
-  mKeyLightActor.SetLight(keylight);
+  // Add as an idle callback to avoid ProcessEvents being recursively called.
+  mApplication.AddIdle( MakeCallback( NewWindowController::NewWindow ) );
+  return true;
 }
 
-void NewWindowController::OnModelLoaded( Model model )
+bool NewWindowController::OnTrackTimerTick()
 {
-  if( model.GetLoadingState() == ResourceLoadingSucceeded )
-  {
-    std::cout << "Succeeded loading model" << std::endl;
-    mModelActor = ModelActorFactory::BuildActorTree(mModel, "");  // Gets root actor
-    mModelActor.SetSize(250.0f, 250.0f);
-    mModelActor.SetPosition(0.0f, 200.0f, 70.0f);
-    mModelActor.SetScale(0.5f);
-    mModelActor.SetRotation(Radian(Math::PI*0.25f), Vector3(1.0, 0.7, 0.0));
+  static int time=0;
+  const float radius(250.0f);
 
-    mContentLayer.Add( mModelActor );
+  time += EMIT_INTERVAL_IN_MS;
+  float modTime = time / TRACK_DURATION_IN_MS;
+  float angle = 2.0f*Math::PI*modTime;
 
-    if (mModel.NumberOfAnimations())
-    {
-      mModelAnimation = ModelActorFactory::BuildAnimation(mModel, mModelActor, 0);
-      mModelAnimation.SetDuration(4.0f);
-      mModelAnimation.SetLooping(true);
-      mModelAnimation.Play();
-    }
-  }
-  else
-  {
-    std::cout << "Failed loading model" << std::endl;
-    mApplication.Quit();
-  }
-}
+  Vector2 position(radius*cosf(angle), radius*-sinf(angle));
+  Vector2 aimPos(radius*2*sinf(angle), radius*2*-cosf(angle));
+  Vector2 direction = aimPos-position;
+  Vector2 stageSize = Stage::GetCurrent().GetSize();
 
-void NewWindowController::NewWindow(void)
-{
-  PositionSize posSize(0, 0, 720, 1280);
-  gApplication.ReplaceWindow(posSize, "NewWindow"); // Generates a new window
+  SetUpBubbleEmission( stageSize*0.5f+position, direction );
+  SetUpBubbleEmission( stageSize*0.5f+position*0.75f, direction );
+  SetUpBubbleEmission( stageSize*0.5f+position*0.7f, direction );
+
+  return true;
 }
 
 void NewWindowController::OnKeyEvent(const KeyEvent& event)
@@ -500,21 +549,17 @@ void NewWindowController::OnContextRegained()
   printf("Stage reporting context regain\n");
 }
 
-
-
-
 void RunTest(Application& app)
 {
   gNewWindowController = new NewWindowController(app);
   app.MainLoop(Configuration::APPLICATION_DOES_NOT_HANDLE_CONTEXT_LOSS);
 }
 
-// Entry point for Linux & SLP applications
+// Entry point for Linux & Tizen applications
 //
-
-int main(int argc, char **argv)
+int DALI_EXPORT_API main(int argc, char **argv)
 {
-  gApplication = Application::New(&argc, &argv);
+  gApplication = Application::New(&argc, &argv, DEMO_THEME_PATH);
   RunTest(gApplication);
 
   return 0;