X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Fline-mesh%2Fline-mesh-example.cpp;h=ff3aace3e713adfe740a36cb3a0504c25e3affbd;hb=694dced621016315f10a5bdbd3f4552f5e29e380;hp=89169288e4b35aaf918eee11a75df8817c0f0ad6;hpb=6081c160daa8cac70730dfe0e927cc7de8c38207;p=platform%2Fcore%2Fuifw%2Fdali-demo.git diff --git a/examples/line-mesh/line-mesh-example.cpp b/examples/line-mesh/line-mesh-example.cpp index 8916928..ff3aace 100644 --- a/examples/line-mesh/line-mesh-example.cpp +++ b/examples/line-mesh/line-mesh-example.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -16,12 +16,15 @@ */ // EXTERNAL INCLUDES -#include +#include #include +#include // INTERNAL INCLUDES #include "shared/view.h" +#include + using namespace Dali; namespace @@ -32,14 +35,18 @@ namespace const char* VERTEX_SHADER = MAKE_SHADER( attribute mediump vec2 aPosition1; attribute mediump vec2 aPosition2; +attribute lowp vec3 aColor; uniform mediump mat4 uMvpMatrix; uniform mediump vec3 uSize; uniform mediump float uMorphAmount; +varying lowp vec3 vColor; + void main() { mediump vec2 morphPosition = mix(aPosition1, aPosition2, uMorphAmount); mediump vec4 vertexPosition = vec4(morphPosition, 0.0, 1.0); + vColor = aColor; vertexPosition.xyz *= uSize; vertexPosition = uMvpMatrix * vertexPosition; gl_Position = vertexPosition; @@ -50,59 +57,53 @@ const char* FRAGMENT_SHADER = MAKE_SHADER( uniform lowp vec4 uColor; uniform sampler2D sTexture; +varying lowp vec3 vColor; + void main() { - gl_FragColor = uColor; + gl_FragColor = uColor * vec4( vColor, 1.0 ); } ); +const unsigned short INDEX_LINES[] = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 0 }; +const unsigned short INDEX_LOOP[] = { 0, 1, 2, 3, 4 }; +const unsigned short INDEX_STRIP[] = { 0, 1, 2, 3, 4, 0 }; +const unsigned short* INDICES[3] = { &INDEX_LINES[0], &INDEX_LOOP[0], &INDEX_STRIP[0] }; +const unsigned int INDICES_SIZE[3] = { sizeof(INDEX_LINES)/sizeof(INDEX_LINES[0]), sizeof(INDEX_LOOP)/sizeof(INDEX_LOOP[0]), sizeof(INDEX_STRIP)/sizeof(INDEX_STRIP[0])}; + Geometry CreateGeometry() { // Create vertices - struct Vertex { Vector2 position; }; - Vertex pentagonVertexData[5] = - { - { Vector2( 0.0f, 1.00f) }, // 0 - { Vector2( -0.95f, 0.31f) }, // 1 - { Vector2( -0.59f, -0.81f) }, // 2 - { Vector2( 0.59f, -0.81f) }, // 3 - { Vector2( 0.95f, 0.31f) }, // 4 - }; + struct Vertex + { + Vector2 position1; + Vector2 position2; + Vector3 color; + }; - Vertex pentacleVertexData[5] = + // Create new geometry object + Vertex pentagonVertexData[5] = { - { Vector2( 0.0f, -1.00f) }, // - { Vector2( 0.59f, 0.81f) }, // - { Vector2( -0.95f, -0.31f) }, // - { Vector2( 0.95f, -0.31f) }, // - { Vector2( -0.59f, 0.81f) }, // + { Vector2( 0.0f, 1.00f), Vector2( 0.0f, -1.00f), Vector3( 1.0f, 1.0f, 1.0f ) }, // 0 + { Vector2( -0.95f, 0.31f), Vector2( 0.59f, 0.81f), Vector3( 1.0f, 0.0f, 0.0f ) }, // 1 + { Vector2( -0.59f, -0.81f), Vector2( -0.95f, -0.31f), Vector3( 0.0f, 1.0f, 0.0f ) }, // 2 + { Vector2( 0.59f, -0.81f), Vector2( 0.95f, -0.31f), Vector3( 0.0f, 0.0f, 1.0f ) }, // 3 + { Vector2( 0.95f, 0.31f), Vector2( -0.59f, 0.81f), Vector3( 1.0f, 1.0f, 0.0f ) }, // 4 }; Property::Map pentagonVertexFormat; pentagonVertexFormat["aPosition1"] = Property::VECTOR2; + pentagonVertexFormat["aPosition2"] = Property::VECTOR2; + pentagonVertexFormat["aColor"] = Property::VECTOR3; PropertyBuffer pentagonVertices = PropertyBuffer::New( pentagonVertexFormat ); pentagonVertices.SetData(pentagonVertexData, 5); - Property::Map pentacleVertexFormat; - pentacleVertexFormat["aPosition2"] = Property::VECTOR2; - PropertyBuffer pentacleVertices = PropertyBuffer::New( pentacleVertexFormat ); - pentacleVertices.SetData( pentacleVertexData, 5 ); - - // Create indices - unsigned int indexData[10] = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 0 }; - Property::Map indexFormat; - indexFormat["indices"] = Property::INTEGER; - PropertyBuffer indices = PropertyBuffer::New( indexFormat ); - indices.SetData( indexData, sizeof(indexData)/sizeof(indexData[0]) ); // Create the geometry object Geometry pentagonGeometry = Geometry::New(); pentagonGeometry.AddVertexBuffer( pentagonVertices ); - pentagonGeometry.AddVertexBuffer( pentacleVertices ); - pentagonGeometry.SetIndexBuffer( indices ); - - pentagonGeometry.SetGeometryType( Geometry::LINES ); - + pentagonGeometry.SetIndexBuffer( INDICES[0], INDICES_SIZE[0] ); + pentagonGeometry.SetType( Geometry::LINES ); return pentagonGeometry; } @@ -119,7 +120,19 @@ public: * @param[in] application The application instance */ ExampleController( Application& application ) - : mApplication( application ) + : mApplication( application ), + mWindowSize(), + mShader(), + mGeometry(), + mRenderer(), + mMeshActor(), + mButtons(), + mMinusButton(), + mPlusButton(), + mIndicesCountLabel(), + mPrimitiveType( Geometry::LINES ), + mCurrentIndexCount( 0 ), + mMaxIndexCount( 0 ) { // Connect to the Application's Init signal mApplication.InitSignal().Connect( this, &ExampleController::Create ); @@ -139,35 +152,57 @@ public: */ void Create( Application& application ) { - Stage stage = Stage::GetCurrent(); - stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent); + Window window = application.GetWindow(); - mStageSize = stage.GetSize(); + // initial settings + mPrimitiveType = Geometry::LINES; + mCurrentIndexCount = 10; + mMaxIndexCount = 10; - // The Init signal is received once (only) during the Application lifetime + CreateRadioButtons(); - // Hide the indicator bar - application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE ); + window.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent); - mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); + mWindowSize = window.GetSize(); + + Initialise(); - mMaterial = Material::New( mShader ); + window.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f)); + } + /** + * Invoked whenever application changes the type of geometry drawn + */ + void Initialise() + { + Window window = mApplication.GetWindow(); + + // destroy mesh actor and its resources if already exists + if( mMeshActor ) + { + window.Remove( mMeshActor ); + mMeshActor.Reset(); + } + + mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); mGeometry = CreateGeometry(); + mRenderer = Renderer::New( mGeometry, mShader ); - mRenderer = Renderer::New( mGeometry, mMaterial ); + mRenderer.SetIndexRange( 0, 10 ); // lines + mPrimitiveType = Geometry::LINES; mMeshActor = Actor::New(); mMeshActor.AddRenderer( mRenderer ); - mMeshActor.SetSize(200, 200); + mMeshActor.SetProperty( Actor::Property::SIZE, Vector2(200, 200) ); + mMeshActor.SetProperty( DevelActor::Property::UPDATE_SIZE_HINT, Vector2(400, 400) ); Property::Index morphAmountIndex = mMeshActor.RegisterProperty( "uMorphAmount", 0.0f ); mRenderer.SetProperty( Renderer::Property::DEPTH_INDEX, 0 ); - mMeshActor.SetParentOrigin( ParentOrigin::CENTER ); - mMeshActor.SetAnchorPoint( AnchorPoint::CENTER ); - stage.Add( mMeshActor ); + mMeshActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); + mMeshActor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); + window.Add( mMeshActor ); Animation animation = Animation::New(5); KeyFrames keyFrames = KeyFrames::New(); @@ -177,8 +212,89 @@ public: animation.AnimateBetween( Property( mMeshActor, morphAmountIndex ), keyFrames, AlphaFunction(AlphaFunction::SIN) ); animation.SetLooping(true); animation.Play(); + } - stage.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f)); + /** + * Invoked on create + */ + void CreateRadioButtons() + { + Window window = mApplication.GetWindow(); + + Toolkit::TableView modeSelectTableView = Toolkit::TableView::New( 4, 1 ); + modeSelectTableView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + modeSelectTableView.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + modeSelectTableView.SetFitHeight( 0 ); + modeSelectTableView.SetFitHeight( 1 ); + modeSelectTableView.SetFitHeight( 2 ); + modeSelectTableView.SetCellPadding( Vector2( 6.0f, 0.0f ) ); + modeSelectTableView.SetProperty( Actor::Property::SCALE, Vector3( 0.8f, 0.8f, 0.8f )); + + const char* labels[] = + { + "LINES", + "LINE_LOOP", + "LINE_STRIP" + }; + + for( int i = 0; i < 3; ++i ) + { + Dali::Toolkit::RadioButton radio = Dali::Toolkit::RadioButton::New(); + + radio.SetProperty( Toolkit::Button::Property::LABEL, + Property::Map() + .Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::TEXT ) + .Add( Toolkit::TextVisual::Property::TEXT, labels[i] ) + .Add( Toolkit::TextVisual::Property::TEXT_COLOR, Vector4( 0.8f, 0.8f, 0.8f, 1.0f ) ) + ); + + radio.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + radio.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + radio.SetProperty( Toolkit::Button::Property::SELECTED, i == 0 ); + radio.PressedSignal().Connect( this, &ExampleController::OnButtonPressed ); + mButtons[i] = radio; + modeSelectTableView.AddChild( radio, Toolkit::TableView::CellPosition( i, 0 ) ); + } + + Toolkit::TableView elementCountTableView = Toolkit::TableView::New( 1, 3 ); + elementCountTableView.SetCellPadding( Vector2( 6.0f, 0.0f ) ); + elementCountTableView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_LEFT ); + elementCountTableView.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_LEFT ); + elementCountTableView.SetFitHeight( 0 ); + elementCountTableView.SetFitWidth( 0 ); + elementCountTableView.SetFitWidth( 1 ); + elementCountTableView.SetFitWidth( 2 ); + mMinusButton = Toolkit::PushButton::New(); + mMinusButton.SetProperty( Toolkit::Button::Property::LABEL, "<<" ); + mMinusButton.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + mMinusButton.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER_LEFT ); + + Toolkit::PushButton mPlusButton = Toolkit::PushButton::New(); + mPlusButton.SetProperty( Toolkit::Button::Property::LABEL, ">>" ); + mPlusButton.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + mPlusButton.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER_RIGHT ); + + mMinusButton.ClickedSignal().Connect( this, &ExampleController::OnButtonClicked ); + mPlusButton.ClickedSignal().Connect( this, &ExampleController::OnButtonClicked ); + + mIndicesCountLabel = Toolkit::TextLabel::New(); + mIndicesCountLabel.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); + mIndicesCountLabel.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + + std::stringstream str; + str << mCurrentIndexCount; + mIndicesCountLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, str.str() ); + mIndicesCountLabel.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Vector4( 1.0, 1.0, 1.0, 1.0 ) ); + mIndicesCountLabel.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "BOTTOM"); + mIndicesCountLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::WIDTH ); + mIndicesCountLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT ); + + elementCountTableView.AddChild( mMinusButton, Toolkit::TableView::CellPosition( 0, 0 ) ); + elementCountTableView.AddChild( mIndicesCountLabel, Toolkit::TableView::CellPosition( 0, 1 ) ); + elementCountTableView.AddChild( mPlusButton, Toolkit::TableView::CellPosition( 0, 2 ) ); + + window.Add(modeSelectTableView); + window.Add(elementCountTableView); } /** @@ -203,32 +319,82 @@ public: } } + bool OnButtonPressed( Toolkit::Button button ) + { + int indicesArray; + if( button == mButtons[0] ) + { + mCurrentIndexCount = 10; + mMaxIndexCount = 10; + mPrimitiveType = Geometry::LINES; + indicesArray = 0; + } + else if( button == mButtons[1] ) + { + mCurrentIndexCount = 5; + mMaxIndexCount = 5; + mPrimitiveType = Geometry::LINE_LOOP; + indicesArray = 1; + } + else + { + mCurrentIndexCount = 6; + mMaxIndexCount = 6; + mPrimitiveType = Geometry::LINE_STRIP; + indicesArray = 2; + } + + std::stringstream str; + str << mCurrentIndexCount; + mIndicesCountLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, str.str() ); + mGeometry.SetType( mPrimitiveType ); + mGeometry.SetIndexBuffer( INDICES[ indicesArray ], INDICES_SIZE[ indicesArray ] ); + mRenderer.SetIndexRange( 0, mCurrentIndexCount ); + return true; + } + + bool OnButtonClicked( Toolkit::Button button ) + { + if( button == mMinusButton ) + { + if (--mCurrentIndexCount < 2 ) + mCurrentIndexCount = 2; + } + else + { + if (++mCurrentIndexCount > mMaxIndexCount ) + mCurrentIndexCount = mMaxIndexCount; + } + + std::stringstream str; + str << mCurrentIndexCount; + mIndicesCountLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, str.str() ); + mRenderer.SetIndexRange( 0, mCurrentIndexCount ); + return true; + } + private: Application& mApplication; ///< Application instance - Vector3 mStageSize; ///< The size of the stage + Vector3 mWindowSize; ///< The size of the window Shader mShader; - Material mMaterial; Geometry mGeometry; Renderer mRenderer; Actor mMeshActor; + Toolkit::RadioButton mButtons[3]; + Toolkit::PushButton mMinusButton; + Toolkit::PushButton mPlusButton; + Toolkit::TextLabel mIndicesCountLabel; + Geometry::Type mPrimitiveType; + int mCurrentIndexCount; + int mMaxIndexCount; }; -void RunTest( Application& application ) +int DALI_EXPORT_API main( int argc, char **argv ) { + Application application = Application::New( &argc, &argv ); ExampleController test( application ); - application.MainLoop(); -} - -// Entry point for Linux & SLP applications -// -int main( int argc, char **argv ) -{ - Application application = Application::New( &argc, &argv ); - - RunTest( application ); - return 0; }