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=836a26dd76786b5ace9ea6122dcb17c06522d22e;hp=4ff070b136a1c5d64ee7b32cdc25e96c3ea79d1a;hb=a2de9cf491172cd5da9dc9ed60b17683dab6d7bc;hpb=da0b26956ee6258765ff541e1b8057557a37144b 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 4ff070b..836a26dd 100644 --- a/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp +++ b/dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp @@ -24,36 +24,41 @@ #include // INTERNAL INCLUDES -#include #include #include #include +#include + 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); } } @@ -77,6 +82,7 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea, mDensity( 5 ), mTotalNumOfBubble( maximumNumberOfBubble ), mCurrentBubble( 0 ), + mRandomSeed( 0 ), mRenderTaskRunning(false) { // Calculate how many shaders are required @@ -96,6 +102,8 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea, mNumBubblePerActor = mTotalNumOfBubble; mNumActor = 1; } + + mRandomSeed = time( NULL ); } BubbleEmitter::~BubbleEmitter() @@ -129,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 ); @@ -146,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() ); } @@ -170,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(); @@ -192,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 ) @@ -222,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); @@ -298,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( i ); vertexData.push_back( Vertex( index, Vector2(0.f,0.f), Vector2(0.f,0.f) ) ); @@ -319,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 ); @@ -341,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(displacement.x) - halfRange, -rand()%static_cast(displacement.y)); + Vector2 randomVec( rand_r( &mRandomSeed ) % static_cast(displacement.x) - halfRange, -rand_r( &mRandomSeed ) % static_cast(displacement.y) ); dir.Normalize(); randomVec.x -= dir.x*halfRange; randomVec.y *= 1.0f - fabsf(dir.x)*0.33f;