Rendering API clean-up
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / bubble-effect / bubble-emitter-impl.cpp
index af57a7f..836a26d 100644 (file)
 #include <dali-toolkit/internal/controls/bubble-effect/bubble-actor.h>
 #include <dali-toolkit/internal/controls/bubble-effect/color-adjuster.h>
 #include <dali-toolkit/internal/controls/bubble-effect/bubble-effect.h>
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
+
 
 namespace
 {
 struct Vertex
 {
-  float index;
-  Dali::Vector2 position;
-  Dali::Vector2 textureCoord;
-
   Vertex()
-  {}
+  : index( 0.0f ), position(), textureCoord()
+  {
+  }
 
   Vertex( float index, const Dali::Vector2& position, const Dali::Vector2& textureCoord )
   : index( index ), position( position ), textureCoord( textureCoord )
-  {}
+  {
+  }
+
+  float index;
+  Dali::Vector2 position;
+  Dali::Vector2 textureCoord;
 };
 
 /**
  * Return a random value between the given interval.
  * @param[in] f0 The low bound
  * @param[in] f1 The up bound
+ * @param[in] seed The seed to genergate random number
  * @return A random value between the given interval
  */
-float RandomRange(float f0, float f1)
+float RandomRange(float f0, float f1, unsigned int& seed)
 {
-  return f0 + (rand() & 0xfff) * (f1-f0) * (1.0f/4095.0f);
+  return f0 + (rand_r( &seed ) & 0xfff) * (f1-f0) * (1.0f/4095.0f);
 }
 
 }
@@ -76,6 +82,7 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea,
   mDensity( 5 ),
   mTotalNumOfBubble( maximumNumberOfBubble ),
   mCurrentBubble( 0 ),
+  mRandomSeed( 0 ),
   mRenderTaskRunning(false)
 {
   // Calculate how many shaders are required
@@ -95,6 +102,8 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea,
     mNumBubblePerActor = mTotalNumOfBubble;
     mNumActor = 1;
   }
+
+  mRandomSeed = time( NULL );
 }
 
 BubbleEmitter::~BubbleEmitter()
@@ -128,16 +137,14 @@ void BubbleEmitter::OnInitialize()
   // 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 );
 
-  // Generate the samplers and geometry, which is used by all bubbleActors
-  mSamplerBackground = Sampler::New( mEffectImage, "sBackground" );
-  mSamplerBubbleShape = Sampler::New( mShapeImage, "sBubbleShape" );
+  // Generate the geometry, which is used by all bubbleActors
   mMeshGeometry =  CreateGeometry( mNumBubblePerActor*mDensity );
 
   Shader bubbleShader = CreateBubbleShader (mNumBubblePerActor );
 
-  mMaterial = Material::New( bubbleShader );
-  mMaterial.AddSampler( mSamplerBackground );
-  mMaterial.AddSampler( mSamplerBubbleShape );
+  mTextureSet = TextureSet::New();
+  mTextureSet.SetImage( 0u, mEffectImage );
+  mTextureSet.SetImage( 1u, mShapeImage );
 
   mBubbleActors.resize( mNumActor );
 
@@ -145,7 +152,7 @@ void BubbleEmitter::OnInitialize()
   for(unsigned int i=0; i < mNumActor; i++ )
   {
     mBubbleActors[i] = new BubbleActor( mNumBubblePerActor, mMovementArea );
-    (mBubbleActors[i])->MakeRenderable( mMeshGeometry, mMaterial );
+    (mBubbleActors[i])->MakeRenderable( mMeshGeometry, mTextureSet, bubbleShader );
     mBubbleRoot.Add( (mBubbleActors[i])->GetMeshActor() );
   }
 
@@ -169,13 +176,15 @@ void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta )
   mBackgroundImage = bgImage;
   mHSVDelta = hsvDelta;
 
-  ImageActor sourceActor = ImageActor::New( bgImage );
+  Toolkit::ImageView sourceActor = Toolkit::ImageView::New( bgImage );
   sourceActor.SetSize( mMovementArea );
   sourceActor.SetParentOrigin(ParentOrigin::CENTER);
-  Stage::GetCurrent().Add( sourceActor );
 
-  ShaderEffect colorAdjuster = CreateColorAdjuster( hsvDelta, true /*ignore alpha to make bubble color always*/ );
-  sourceActor.SetShaderEffect( colorAdjuster );
+  Property::Map colorAdjuster = CreateColorAdjuster();
+  sourceActor.SetProperty( Toolkit::ImageView::Property::IMAGE, colorAdjuster);
+  SetColorAdjusterProperties( sourceActor, hsvDelta, true /*ignore alpha to make bubble color always*/ );
+
+  Stage::GetCurrent().Add( sourceActor );
 
   RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
   RenderTask task = taskList.CreateTask();
@@ -191,7 +200,7 @@ void BubbleEmitter::SetBackground( Image bgImage, const Vector3& hsvDelta )
 
 void BubbleEmitter::SetShapeImage( Image shapeImage )
 {
-  mSamplerBubbleShape.SetImage( shapeImage );
+  mTextureSet.SetImage( 1, shapeImage );
 }
 
 void BubbleEmitter::SetBubbleScale( float scale )
@@ -221,36 +230,11 @@ void BubbleEmitter::SetBubbleDensity( unsigned int density )
   }
 }
 
-void BubbleEmitter::SetBlendMode( bool enable )
-{
-  if(enable)
-  {
-    // linear overlay
-    mMaterial.SetBlendFunc(BlendingFactor::SRC_ALPHA, BlendingFactor::ONE,
-                           BlendingFactor::ZERO, BlendingFactor::ONE);
-  }
-  else
-  {
-    // using default blend func
-    mMaterial.SetBlendFunc( BlendingFactor::SRC_ALPHA,   BlendingFactor::ONE_MINUS_SRC_ALPHA,
-                            BlendingFactor::ONE, BlendingFactor::ONE_MINUS_SRC_ALPHA );
-  }
-}
-
 // clear the resources created for the off screen rendering
 void BubbleEmitter::OnRenderFinished(RenderTask& source)
 {
   mRenderTaskRunning = false;
   Actor sourceActor = source.GetSourceActor();
-  if( sourceActor )
-  {
-    ImageActor renderable = ImageActor::DownCast( sourceActor );
-    if( renderable )
-    {
-      renderable.RemoveShaderEffect();
-    }
-  }
-
   Stage stage = Stage::GetCurrent();
   stage.Remove(sourceActor);
   stage.GetRenderTaskList().RemoveTask(source);
@@ -297,7 +281,7 @@ Geometry BubbleEmitter::CreateGeometry( unsigned int numOfPatch )
 
   for(unsigned int i = 0; i < numOfPatch; i++)
   {
-    float curSize = RandomRange(mBubbleSizeRange.x, mBubbleSizeRange.y);
+    float curSize = RandomRange(mBubbleSizeRange.x, mBubbleSizeRange.y, mRandomSeed);
 
     float index = static_cast<float>( i );
     vertexData.push_back( Vertex( index, Vector2(0.f,0.f),         Vector2(0.f,0.f) ) );
@@ -318,13 +302,13 @@ Geometry BubbleEmitter::CreateGeometry( unsigned int numOfPatch )
   vertexFormat["aIndex"] = Property::FLOAT;
   vertexFormat["aPosition"] = Property::VECTOR2;
   vertexFormat["aTexCoord"] = Property::VECTOR2;
-  PropertyBuffer vertices = PropertyBuffer::New( vertexFormat, numVertex  );
-  vertices.SetData( &vertexData[0] );
+  PropertyBuffer vertices = PropertyBuffer::New( vertexFormat );
+  vertices.SetData( &vertexData[0], numVertex );
 
   Property::Map indexFormat;
-  indexFormat["indices"] = Property::UNSIGNED_INTEGER;
-  PropertyBuffer indices = PropertyBuffer::New( indexFormat, numIndex  );
-  indices.SetData( &indexData[0] );
+  indexFormat["indices"] = Property::INTEGER;
+  PropertyBuffer indices = PropertyBuffer::New( indexFormat );
+  indices.SetData( &indexData[0], numIndex );
 
   Geometry geometry = Geometry::New();
   geometry.AddVertexBuffer( vertices );
@@ -340,7 +324,7 @@ void BubbleEmitter::SetBubbleParameter( BubbleActorPtr bubbleActor, unsigned int
 
   int halfRange = displacement.x / 2;
   // for the y coordinate, always negative, so bubbles always go upwards
-  Vector2 randomVec(rand()%static_cast<int>(displacement.x) - halfRange, -rand()%static_cast<int>(displacement.y));
+  Vector2 randomVec( rand_r( &mRandomSeed ) % static_cast<int>(displacement.x) - halfRange, -rand_r( &mRandomSeed ) % static_cast<int>(displacement.y) );
   dir.Normalize();
   randomVec.x -= dir.x*halfRange;
   randomVec.y *= 1.0f - fabsf(dir.x)*0.33f;