diff --git a/com.samsung.dali-demo.xml b/com.samsung.dali-demo.xml index 14fe3a3..aaf6dd5 100644 --- a/com.samsung.dali-demo.xml +++ b/com.samsung.dali-demo.xml @@ -76,4 +76,7 @@ + + + diff --git a/demo/dali-demo.cpp b/demo/dali-demo.cpp index 3209499..281fe63 100644 --- a/demo/dali-demo.cpp +++ b/demo/dali-demo.cpp @@ -42,6 +42,7 @@ int main(int argc, char **argv) demo.AddExample(Example("builder.example", "Script Based UI")); demo.AddExample(Example("image-scaling-irregular-grid.example", "Image Scaling Modes")); demo.AddExample(Example("text-view.example", "Text View")); + demo.AddExample(Example("animated-shapes.example", "Animated Shapes")); app.MainLoop(); return 0; diff --git a/examples/animated-shapes/animated-shapes-example.cpp b/examples/animated-shapes/animated-shapes-example.cpp new file mode 100644 index 0000000..b7a5a72 --- /dev/null +++ b/examples/animated-shapes/animated-shapes-example.cpp @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +using namespace Dali; + +namespace +{ +const char* BACKGROUND_IMAGE( DALI_IMAGE_DIR "background-gradient.jpg" ); + +} + +// This example shows resolution independent rendering and animation of curves using the gpu. +// +class AnimatedShapesExample : public ConnectionTracker +{ +public: + + AnimatedShapesExample( Application& application ) +: mApplication( application ) +{ + // Connect to the Application's Init signal + mApplication.InitSignal().Connect( this, &AnimatedShapesExample::Create ); +} + + ~AnimatedShapesExample() + { + // Nothing to do here; + } + + // The Init signal is received once (only) during the Application lifetime + void Create( Application& application ) + { + // Get a handle to the stage + Stage stage = Stage::GetCurrent(); + + //Create a view + mView = Dali::Toolkit::View::New(); + stage.Add( mView ); + + //Set background image for the view + ImageAttributes attributes; + Image image = ResourceImage::New( BACKGROUND_IMAGE, attributes ); + + + Dali::ImageActor backgroundImageActor = Dali::ImageActor::New( image ); + mView.SetBackground( backgroundImageActor ); + + CreateTriangleMorph(Vector3( stage.GetSize().x*0.5f,stage.GetSize().y*0.15f,0.0f), 100.0f ); + CreateCircleMorph( Vector3( stage.GetSize().x*0.5f,stage.GetSize().y*0.85f,0.0f), 60.0f ); + CreatePathMorph( Vector3( stage.GetSize().x*0.5f,stage.GetSize().y*0.5f,0.0f), 55.0f ); + + + stage.KeyEventSignal().Connect(this, &AnimatedShapesExample::OnKeyEvent); + } + + void CreateCircleMorph( Vector3 center, float radius ) + { + Toolkit::QuadraticBezier shader = Toolkit::QuadraticBezier::New(16, true); + + shader.SetPoint(0, Vector3(-radius,-radius,0.0f)); + shader.SetPoint(1, Vector3( 0.0f,-radius,0.0f)); + shader.SetPoint(2, Vector3(radius,-radius,0.0f)); + + shader.SetPoint(3, Vector3(radius,-radius,0.0f)); + shader.SetPoint(4, Vector3( radius,0.0f,0.0f)); + shader.SetPoint(5, Vector3(radius,radius,0.0f)); + + shader.SetPoint(6, Vector3(radius,radius,0.0f)); + shader.SetPoint(7, Vector3( 0.0f,radius,0.0f)); + shader.SetPoint(8, Vector3( -radius,radius,0.0f)); + + shader.SetPoint(9, Vector3( -radius,radius,0.0f)); + shader.SetPoint(10, Vector3( -radius,0.0f,0.0f)); + shader.SetPoint(11, Vector3(-radius,-radius,0.0f)); + + shader.SetPoint(12, Vector3(-radius,-radius,0.0f)); + shader.SetPoint(13, Vector3(radius,-radius,0.0f)); + shader.SetPoint(14, Vector3(radius,radius,0.0f)); + shader.SetPoint(15, Vector3( -radius,radius,0.0f)); + + shader.SetColor(Vector4(1.0f,0.0f,0.0f,1.0f) ); + shader.SetLineWidth(2.0f); + + ////Generate the mesh + Dali::MeshData::VertexContainer vertices; + for( unsigned int i(0); i<12; i+=3 ) + { + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,0.0f,i) )); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.5f,0.0f,i+1))); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(1.0f,1.0f,i+2))); + } + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,12) )); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,13))); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,14))); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,15))); + + short unsigned int indexArray[] = { 0,2,1, 3,5,4,6,8,7, 9, 11, 10, 12,15,14,12,14,13}; + Dali::MeshData::FaceIndices index( indexArray, indexArray + sizeof(indexArray)/sizeof(short unsigned int) ); + + //Material + Dali::Material material = Material::New("Material"); + material.SetDiffuseColor( Vector4(1.0f,1.0f,1.0f,1.0f)); + + //Create the Mesh object + Dali::MeshData data; + data.SetVertices(vertices); + data.SetFaceIndices( index ); + data.SetMaterial( material ); + data.SetHasNormals( true ); + Mesh mesh = Mesh::New( data ); + + //Create the mesh actor + MeshActor meshActor = MeshActor::New(mesh); + meshActor.SetAnchorPoint( AnchorPoint::CENTER ); + meshActor.SetShaderEffect(shader); + meshActor.SetPosition( center ); + meshActor.SetBlendMode(BlendingMode::ON ); + mView.Add( meshActor ); + + + //Animation + Animation animation = Animation::New(5.0f); + KeyFrames k0 = KeyFrames::New(); + k0.Add( 0.0f, Vector3( 0.0f,-radius, 0.0f) ); + k0.Add( 0.5f, Vector3(0.0f, -radius*4.0f, 0.0f)); + k0.Add( 1.0f, Vector3( 0.0f,-radius, 0.0f) ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(1)),k0,AlphaFunctions::EaseInOutSine ); + + k0 = KeyFrames::New(); + k0.Add( 0.0f, Vector3( radius, 0.0f, 0.0f) ); + k0.Add( 0.5f, Vector3(radius*4.0f,0.0f, 0.0f)); + k0.Add( 1.0f, Vector3( radius,0.0f, 0.0f)); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(4)),k0,AlphaFunctions::EaseInOutSine ); + + k0 = KeyFrames::New(); + k0.Add( 0.0f, Vector3(0.0f,radius, 0.0f) ); + k0.Add( 0.5f, Vector3(0.0f,radius*4.0f, 0.0f)); + k0.Add( 1.0f, Vector3(0.0f,radius, 0.0f) ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(7)),k0,AlphaFunctions::EaseInOutSine ); + + k0 = KeyFrames::New(); + k0.Add( 0.0f, Vector3( -radius, 0.0f, 0.0f) ); + k0.Add( 0.5f, Vector3(-radius*4.0f,0.0f, 0.0f)); + k0.Add( 1.0f, Vector3( -radius, 0.0f, 0.0f) ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(10)),k0,AlphaFunctions::EaseInOutSine ); + + animation.RotateBy(meshActor,Degree(90.0f), Vector3::ZAXIS ); + animation.SetLooping( true ); + animation.Play(); + } + + void CreateTriangleMorph( Vector3 center, float side ) + { + float h = (side *0.5f)/0.866f; + + Vector3 v0 = Vector3(-h,h,0.0f); + Vector3 v1 = Vector3(0.0f,-(side*0.366f),0.0f ); + Vector3 v2 = Vector3(h,h,0.0f); + + Vector3 v3 = v0 + ((v1-v0) * 0.5f); + Vector3 v4 = v1 + ((v2-v1) * 0.5f); + Vector3 v5 = v2 + ((v0-v2) * 0.5f); + + Toolkit::QuadraticBezier shader = Toolkit::QuadraticBezier::New(12, true); + + shader.SetPoint(0,v0); + shader.SetPoint(1,v3); + shader.SetPoint(2,v1); + + shader.SetPoint(3,v1); + shader.SetPoint(4,v4); + shader.SetPoint(5,v2); + + shader.SetPoint(6,v2); + shader.SetPoint(7,v5); + shader.SetPoint(8,v0); + + shader.SetPoint(9, v0); + shader.SetPoint(10,v1); + shader.SetPoint(11,v2); + + shader.SetColor(Vector4(0.0f,1.0f,0.0f,1.0f)); + shader.SetLineWidth(2.0f); + + ////Generate the mesh + Dali::MeshData::VertexContainer vertices; + for( unsigned int i(0);i<9;i+=3 ) + { + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,0.0f,i)) ); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO,Vector3(0.5f,0.0f,i+1) ) ); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(1.0f,1.0f,i+2) ) ); + } + + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,9)) ); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO,Vector3(0.0f,1.0f,10) ) ); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,11) ) ); + + short unsigned int indexArray[] = { 0,2,1,3,5,4,6,8,7,9,11,10 }; + Dali::MeshData::FaceIndices index( indexArray, indexArray + sizeof(indexArray)/sizeof(short unsigned int) ); + + //Material + Dali::Material material = Material::New("Material"); + material.SetDiffuseColor( Vector4(1.0f,1.0f,1.0f,1.0f)); + + //Create the Mesh object + Dali::MeshData data; + data.SetVertices(vertices); + data.SetFaceIndices( index ); + data.SetMaterial( material ); + data.SetHasNormals( true ); + Mesh mesh = Mesh::New( data ); + +// //Create the mesh actor + MeshActor meshActor = MeshActor::New(mesh); + meshActor.SetAnchorPoint( AnchorPoint::CENTER ); + meshActor.SetShaderEffect(shader); + meshActor.SetPosition( center ); + meshActor.SetBlendMode(BlendingMode::ON ); + mView.Add( meshActor ); + + //Animation + Animation animation = Animation::New(5.0f); + + KeyFrames k0 = KeyFrames::New(); + k0.Add( 0.0f,v3 ); + k0.Add( 0.5f, v3 + Vector3(-200.0f,-200.0f,0.0f)); + k0.Add( 1.0f, v3 ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(1)),k0,AlphaFunctions::EaseInOutSine ); + + k0 = KeyFrames::New(); + k0.Add( 0.0f,v4 ); + k0.Add( 0.5f, v4 + Vector3(200.0f,-200.0f,0.0f)); + k0.Add( 1.0f, v4 ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(4)),k0,AlphaFunctions::EaseInOutSine ); + + k0 = KeyFrames::New(); + k0.Add( 0.0f,v5 ); + k0.Add( 0.5f, v5 + Vector3(0.0,200.0f,0.0f)); + k0.Add( 1.0f, v5 ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(7)),k0,AlphaFunctions::EaseInOutSine ); + animation.SetLooping( true ); + animation.Play(); + } + + void CreatePathMorph( Vector3 center, float radius ) + { + Toolkit::QuadraticBezier shader = Toolkit::QuadraticBezier::New(12, false); + + shader.SetPoint(0, Vector3(-radius,-radius,0.0f)); + shader.SetPoint(1, Vector3( 0.0f,-radius,0.0f)); + shader.SetPoint(2, Vector3(radius,-radius,0.0f)); + + shader.SetPoint(3, Vector3(radius,-radius,0.0f)); + shader.SetPoint(4, Vector3( radius,0.0f,0.0f)); + shader.SetPoint(5, Vector3(radius,radius,0.0f)); + + shader.SetPoint(6, Vector3(radius,radius,0.0f)); + shader.SetPoint(7, Vector3( 0.0f,radius,0.0f)); + shader.SetPoint(8, Vector3( -radius,radius,0.0f)); + + shader.SetPoint(9, Vector3( -radius,radius,0.0f)); + shader.SetPoint(10, Vector3( -radius,0.0f,0.0f)); + shader.SetPoint(11, Vector3(-radius,-radius,0.0f)); + + shader.SetColor(Vector4(1.0f,1.0f,0.0f,1.0f) ); + shader.SetLineWidth(1.5f); + + ////Generate the mesh/S + Dali::MeshData::VertexContainer vertices; + for( unsigned int i(0); i<12; i+=3 ) + { + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,0.0f,i) )); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.5f,0.0f,i+1))); + vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(1.0f,1.0f,i+2))); + } + + + short unsigned int indexArray[] = { 0,2,1, 3,5,4,6,8,7, 9, 11, 10 }; + Dali::MeshData::FaceIndices index( indexArray, indexArray + sizeof(indexArray)/sizeof(short unsigned int) ); + + //Material + Dali::Material material = Material::New("Material"); + material.SetDiffuseColor( Vector4(1.0f,1.0f,1.0f,1.0f)); + + //Create the Mesh object + Dali::MeshData data; + data.SetVertices(vertices); + data.SetFaceIndices( index ); + data.SetMaterial( material ); + data.SetHasNormals( true ); + Mesh mesh = Mesh::New( data ); + + //Create the mesh actor + MeshActor meshActor = MeshActor::New(mesh); + meshActor.SetAnchorPoint( AnchorPoint::CENTER ); + meshActor.SetShaderEffect(shader); + meshActor.SetPosition( center ); + meshActor.SetBlendMode(BlendingMode::ON ); + mView.Add( meshActor ); + + + //Animation + Animation animation = Animation::New(5.0f); + KeyFrames k0 = KeyFrames::New(); + k0.Add( 0.0f, Vector3( 0.0f,-radius*2.0, 0.0f) ); + k0.Add( 0.5f, Vector3(-radius*2.0, -radius*3.0f, 0.0f)); + k0.Add( 1.0f, Vector3( 0.0f,-radius*2.0, 0.0f) ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(1)),k0,AlphaFunctions::EaseInOutSine ); + + k0 = KeyFrames::New(); + k0.Add( 0.0f, Vector3( radius*2.0, 0.0f, 0.0f) ); + k0.Add( 0.5f, Vector3(radius*3.0f,-radius*2.0, 0.0f)); + k0.Add( 1.0f, Vector3( radius*2.0,0.0f, 0.0f)); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(4)),k0,AlphaFunctions::EaseInOutSine ); + + k0 = KeyFrames::New(); + k0.Add( 0.0f, Vector3(0.0f,radius*2.0, 0.0f) ); + k0.Add( 0.5f, Vector3(radius*2.0,radius*3.0f, 0.0f)); + k0.Add( 1.0f, Vector3(0.0f,radius*2.0, 0.0f) ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(7)),k0,AlphaFunctions::EaseInOutSine ); + + k0 = KeyFrames::New(); + k0.Add( 0.0f, Vector3( -radius*2.0, 0.0f, 0.0f) ); + k0.Add( 0.5f, Vector3(-radius*3.0f,radius*2.0, 0.0f)); + k0.Add( 1.0f, Vector3( -radius*2.0, 0.0f, 0.0f) ); + animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(10)),k0,AlphaFunctions::EaseInOutSine ); + + animation.RotateBy(meshActor,Degree(-90.0f), Vector3::ZAXIS ); + animation.SetLooping( true ); + animation.Play(); + } + + /** + * Main key event handler + */ + void OnKeyEvent(const KeyEvent& event) + { + if( event.state == KeyEvent::Down && (IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK )) ) + { + mApplication.Quit(); + } + } + +private: + Application& mApplication; + Toolkit::View mView; +}; + +void RunTest( Application& application ) +{ + AnimatedShapesExample test( application ); + application.MainLoop(); +} + +int main( int argc, char **argv ) +{ + Application application = Application::New( &argc, &argv ); + RunTest( application ); + + return 0; +}