Remove ResourceImage usage from demos
[platform/core/uifw/dali-demo.git] / examples / new-window / new-window-example.cpp
index 889e038..a72e1de 100644 (file)
@@ -24,6 +24,7 @@
 
 // INTERNAL INCLUDES
 #include "shared/view.h"
+#include "shared/utility.h"
 
 using namespace Dali;
 using namespace Dali::Toolkit;
@@ -32,13 +33,13 @@ class NewWindowController;
 
 namespace
 {
-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 LOSE_CONTEXT_IMAGE_SELECTED( DALI_IMAGE_DIR "icon-cluster-wobble-selected.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 LOGO_IMAGE(DALI_IMAGE_DIR "dali-logo.png");
+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(40);
@@ -99,6 +100,9 @@ void main()\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
@@ -119,16 +123,16 @@ public:
   void Create( Application& app );
   void Destroy( Application& app );
 
-  void AddBubbles(const Vector2& stageSize);
-  void AddMeshActor();
-  void AddBlendingImageActor();
-  void AddTextLabel();
+  void AddBubbles( Actor& parentActor, const Vector2& stageSize);
+  void AddMeshActor( Actor& parentActor );
+  void AddBlendingImageActor( Actor& parentActor );
+  void AddTextLabel( Actor& parentActor );
 
-  ImageActor CreateBlurredMirrorImage(const char* imageName);
-  FrameBufferImage CreateFrameBufferForImage(const char* imageName, Image image, ShaderEffect shaderEffect);
+  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();
-  ShaderEffect CreateColorModifierer( const Vector3& rgbDelta );
+  Dali::Property::Map CreateColorModifierer();
 
   static void NewWindow(void);
 
@@ -184,10 +188,8 @@ void NewWindowController::Create( Application& app )
                                           "Context recovery" );
 
   Size stageSize = stage.GetSize();
-  Image backgroundImage = ResourceImage::New( BACKGROUND_IMAGE, Dali::ImageDimensions( stageSize.x, stageSize.y ), Dali::FittingMode::SCALE_TO_FILL, Dali::SamplingMode::BOX_THEN_LINEAR );
-  ImageActor backgroundActor = ImageActor::New( backgroundImage );
+  ImageView backgroundActor = ImageView::New( BACKGROUND_IMAGE, Dali::ImageDimensions( stageSize.x, stageSize.y ) );
   backgroundActor.SetParentOrigin( ParentOrigin::CENTER );
-  backgroundActor.SetZ(-2.f);
   mContentLayer.Add(backgroundActor);
 
   // Point the default render task at the view
@@ -199,8 +201,8 @@ void NewWindowController::Create( Application& app )
   }
 
   mLoseContextButton = Toolkit::PushButton::New();
-  mLoseContextButton.SetButtonImage( ResourceImage::New( LOSE_CONTEXT_IMAGE ) );
-  mLoseContextButton.SetSelectedImage( ResourceImage::New( LOSE_CONTEXT_IMAGE_SELECTED ) );
+  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 );
 
@@ -208,24 +210,23 @@ void NewWindowController::Create( Application& app )
   logoLayoutActor.SetParentOrigin(ParentOrigin::CENTER);
   logoLayoutActor.SetPosition(0.0f, -200.0f, 0.0f);
   logoLayoutActor.SetScale(0.5f);
-  mContentLayer.Add(logoLayoutActor);
+  backgroundActor.Add(logoLayoutActor);
 
-  Image image = ResourceImage::New(LOGO_IMAGE);
-  ImageActor imageActor = ImageActor::New(image);
-  imageActor.SetName("dali-logo");
-  imageActor.SetParentOrigin(ParentOrigin::CENTER);
-  imageActor.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER);
-  logoLayoutActor.Add(imageActor);
+  ImageView imageView = ImageView::New( LOGO_IMAGE );
+  imageView.SetName("daliLogo");
+  imageView.SetParentOrigin(ParentOrigin::CENTER);
+  imageView.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER);
+  logoLayoutActor.Add(imageView);
 
-  ImageActor mirrorImageActor = CreateBlurredMirrorImage(LOGO_IMAGE);
-  mirrorImageActor.SetParentOrigin(ParentOrigin::CENTER);
-  mirrorImageActor.SetAnchorPoint(AnchorPoint::TOP_CENTER);
-  logoLayoutActor.Add(mirrorImageActor);
+  ImageView mirrorImageView = CreateBlurredMirrorImage(LOGO_IMAGE);
+  mirrorImageView.SetParentOrigin(ParentOrigin::TOP_CENTER);
+  mirrorImageView.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER);
+  logoLayoutActor.Add(mirrorImageView);
 
-  AddBubbles(stage.GetSize());
-  AddMeshActor();
-  AddBlendingImageActor();
-  AddTextLabel();
+  AddBubbles( backgroundActor, stage.GetSize());
+  AddMeshActor( backgroundActor );
+  AddBlendingImageActor( backgroundActor );
+  AddTextLabel( backgroundActor );
 
   stage.ContextLostSignal().Connect(this, &NewWindowController::OnContextLost);
   stage.ContextRegainedSignal().Connect(this, &NewWindowController::OnContextRegained);
@@ -236,17 +237,17 @@ void NewWindowController::Destroy( Application& app )
   UnparentAndReset(mTextActor);
 }
 
-void NewWindowController::AddBubbles(const Vector2& stageSize)
+void NewWindowController::AddBubbles( Actor& parentActor, const Vector2& stageSize)
 {
   mEmitter = Toolkit::BubbleEmitter::New( stageSize,
-                                          ResourceImage::New( DALI_IMAGE_DIR "bubble-ball.png" ),
+                                          DemoHelper::LoadImage( DEMO_IMAGE_DIR "bubble-ball.png" ),
                                           200, Vector2( 5.0f, 5.0f ) );
 
-  Image background = ResourceImage::New(BACKGROUND_IMAGE);
+  Image background = DemoHelper::LoadImage(BACKGROUND_IMAGE);
   mEmitter.SetBackground( background, Vector3(0.5f, 0.f,0.5f) );
   mEmitter.SetBubbleDensity( 9.f );
   Actor bubbleRoot = mEmitter.GetRootActor();
-  mContentLayer.Add( bubbleRoot );
+  parentActor.Add( bubbleRoot );
   bubbleRoot.SetParentOrigin(ParentOrigin::CENTER);
   bubbleRoot.SetZ(0.1f);
 
@@ -255,88 +256,96 @@ void NewWindowController::AddBubbles(const Vector2& stageSize)
   mEmitTrackTimer.Start();
 }
 
-void NewWindowController::AddMeshActor()
+void NewWindowController::AddMeshActor( Actor& parentActor )
 {
   Geometry meshGeometry = CreateMeshGeometry();
 
   // Create a coloured mesh
   Shader shaderColorMesh = Shader::New( VERTEX_COLOR_MESH, FRAGMENT_COLOR_MESH );
-  Material colorMeshmaterial = Material::New( shaderColorMesh );
-  Renderer colorMeshRenderer = Renderer::New( meshGeometry, colorMeshmaterial );
+  Renderer colorMeshRenderer = Renderer::New( meshGeometry, shaderColorMesh );
 
   Actor colorMeshActor = Actor::New();
   colorMeshActor.AddRenderer( colorMeshRenderer );
-  colorMeshActor.SetSize( 175.f,175.f );
+  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");
-  mContentLayer.Add( colorMeshActor );
 
  // Create a textured mesh
-  Image effectImage = ResourceImage::New(EFFECT_IMAGE);
-  Sampler sampler = Sampler::New(effectImage, "sTexture");
-
+  Texture effectTexture = DemoHelper::LoadTexture(EFFECT_IMAGE);
   Shader shaderTextureMesh = Shader::New( VERTEX_TEXTURE_MESH, FRAGMENT_TEXTURE_MESH );
-  Material textureMeshMaterial = Material::New( shaderTextureMesh );
-  textureMeshMaterial.AddSampler( sampler );
-  Renderer textureMeshRenderer = Renderer::New( meshGeometry, textureMeshMaterial );
+  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 );
+  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");
-  mContentLayer.Add( 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::AddBlendingImageActor()
+void NewWindowController::AddBlendingImageActor( Actor& parentActor )
 {
-  ShaderEffect colorModifier = CreateColorModifierer(Vector3( 0.5f, 0.5f, 0.5f ));
-  Image effectImage = ResourceImage::New(EFFECT_IMAGE);
-  FrameBufferImage fb2 = CreateFrameBufferForImage( EFFECT_IMAGE, effectImage, colorModifier );
+  Property::Map colorModifier = CreateColorModifierer();
+
+  FrameBufferImage fb2 = CreateFrameBufferForImage( EFFECT_IMAGE, colorModifier, Vector3( 0.5f, 0.5f, 0.5f ) );
 
-  ImageActor tmpActor = ImageActor::New(fb2);
-  mContentLayer.Add(tmpActor);
+  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
-  ShaderEffect blendShader = ShaderEffect::New( "", FRAGMENT_BLEND_SHADER );
-  blendShader.SetEffectImage( fb2 );
-  blendShader.SetUniform("alpha", 0.5f);
+  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 );
 
-  Image baseImage = ResourceImage::New(BASE_IMAGE);
-  ImageActor blendActor = ImageActor::New( baseImage );
   blendActor.SetParentOrigin(ParentOrigin::CENTER_RIGHT);
   blendActor.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
   blendActor.SetPosition(Vector3(0.0f, 100.0f, 0.0f));
   blendActor.SetSize(140, 140);
-  blendActor.SetShaderEffect( blendShader );
-  mContentLayer.Add(blendActor);
+  parentActor.Add(blendActor);
+
+  blendActor.GetRendererAt(0u).GetTextures().SetImage( 1u, fb2 );
 }
 
-void NewWindowController::AddTextLabel()
+void NewWindowController::AddTextLabel( Actor& parentActor )
 {
   mTextActor = TextLabel::New("Some text");
   mTextActor.SetParentOrigin(ParentOrigin::CENTER);
   mTextActor.SetColor(Color::RED);
   mTextActor.SetName("PushMe text");
-  mContentLayer.Add( mTextActor );
+  parentActor.Add( mTextActor );
 }
 
-ImageActor NewWindowController::CreateBlurredMirrorImage(const char* imageName)
+ImageView NewWindowController::CreateBlurredMirrorImage(const char* imageName)
 {
-  Image image = ResourceImage::New(imageName);
+  Image image = DemoHelper::LoadImage(imageName);
 
-  Uint16Pair intFboSize = ResourceImage::GetImageSize(imageName);
-  Vector2 FBOSize = Vector2( intFboSize.GetWidth(), intFboSize.GetHeight() );
+  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);
@@ -346,32 +355,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();
-  Uint16Pair intFboSize = ResourceImage::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);
@@ -382,7 +390,7 @@ FrameBufferImage NewWindowController::CreateFrameBufferForImage(const char* imag
   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 );
@@ -435,30 +443,30 @@ Geometry NewWindowController::CreateMeshGeometry()
   vertexFormat["aPosition"] = Property::VECTOR3;
   vertexFormat["aTexCoord"] = Property::VECTOR2;
   vertexFormat["aColor"] = Property::VECTOR3;
-  PropertyBuffer vertices = PropertyBuffer::New( vertexFormat, 5 );
-  vertices.SetData( vertexData );
+  PropertyBuffer vertices = PropertyBuffer::New( vertexFormat );
+  vertices.SetData( vertexData, 5 );
 
   // Specify all the faces
-  unsigned int indexData[12] = { 0,1,3,0,2,4,0,3,4,0,2,1 };
-  Property::Map indexFormat;
-  indexFormat["indices"] = Property::UNSIGNED_INTEGER;
-  PropertyBuffer indices = PropertyBuffer::New( indexFormat, 12 );
-  indices.SetData( indexData );
+  unsigned short indexData[12] = { 0,1,3,0,2,4,0,3,4,0,2,1 };
 
   // Create the geometry object
   Geometry geometry = Geometry::New();
   geometry.AddVertexBuffer( vertices );
-  geometry.SetIndexBuffer( indices );
+  geometry.SetIndexBuffer( &indexData[0], 12 );
 
   return geometry;
 }
 
-ShaderEffect NewWindowController::CreateColorModifierer( const Vector3& rgbDelta )
+Dali::Property::Map NewWindowController::CreateColorModifierer()
 {
std::string fragmentShader = MAKE_SHADER(
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}
@@ -473,12 +481,14 @@ ShaderEffect NewWindowController::CreateColorModifierer( const Vector3& rgbDelta
      color.rgb -= min(color.rgb*2.0, 0.0);\n
      gl_FragColor = color; \n
    }\n
- );
+ ) );
 
- ShaderEffect shaderEffect = ShaderEffect::New("", fragmentShader);
- shaderEffect.SetUniform( "uRGBDelta", rgbDelta );
+ Property::Map map;
+ Property::Map customShader;
+ customShader[ "fragmentShader" ] = fragmentShader;
+ map[ "shader" ] = customShader;
 
- return shaderEffect;
+ return map;
 }
 
 void NewWindowController::NewWindow(void)
@@ -544,9 +554,9 @@ void RunTest(Application& app)
 
 // 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, DALI_DEMO_THEME_PATH);
+  gApplication = Application::New(&argc, &argv, DEMO_THEME_PATH);
   RunTest(gApplication);
 
   return 0;