X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Fline-mesh%2Fline-mesh-example.cpp;h=3ef3d51ca6f4eb171bd89b2d7a49db44a1b15c7f;hb=1b19fd140ff139b5854a1a62447faf31b175d8f6;hp=2fc5d947971130ccfc0ab5ffbbeb4097d9d38845;hpb=9469a93437f1a6a896c2be5911d604ea9048c703;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 2fc5d94..3ef3d51 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,95 +16,88 @@ */ // EXTERNAL INCLUDES -#include #include +#include +#include // INTERNAL INCLUDES #include "shared/view.h" +#include + using namespace Dali; namespace { -const char* MATERIAL_SAMPLE( DALI_IMAGE_DIR "gallery-small-48.jpg" ); -const char* MATERIAL_SAMPLE2( DALI_IMAGE_DIR "gallery-medium-19.jpg" ); - -#define MAKE_SHADER(A)#A +#define MAKE_SHADER(A) #A const char* VERTEX_SHADER = MAKE_SHADER( -attribute mediump vec2 aPosition1; -attribute mediump vec2 aPosition2; -uniform mediump mat4 uMvpMatrix; -uniform mediump vec3 uSize; -uniform mediump float uMorphAmount; - -void main() -{ - mediump vec2 morphPosition = mix(aPosition1, aPosition2, uMorphAmount); - mediump vec4 vertexPosition = vec4(morphPosition, 0.0, 1.0); - vertexPosition.xyz *= uSize; - vertexPosition = uMvpMatrix * vertexPosition; - gl_Position = vertexPosition; -} -); + 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; + }); const char* FRAGMENT_SHADER = MAKE_SHADER( -uniform lowp vec4 uColor; -uniform sampler2D sTexture; + uniform lowp vec4 uColor; + uniform sampler2D sTexture; -void main() -{ - gl_FragColor = uColor; -} -); + varying lowp vec3 vColor; + + void main() { + 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; - PropertyBuffer pentagonVertices = PropertyBuffer::New( pentagonVertexFormat, 5 ); - pentagonVertices.SetData(pentagonVertexData); - - Property::Map pentacleVertexFormat; - pentacleVertexFormat["aPosition2"] = Property::VECTOR2; - PropertyBuffer pentacleVertices = PropertyBuffer::New( pentacleVertexFormat, 5 ); - pentacleVertices.SetData(pentacleVertexData); - - // 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, sizeof(indexData)/sizeof(indexData[0]) ); - indices.SetData(indexData); + pentagonVertexFormat["aPosition2"] = Property::VECTOR2; + pentagonVertexFormat["aColor"] = Property::VECTOR3; + VertexBuffer pentagonVertices = VertexBuffer::New(pentagonVertexFormat); + pentagonVertices.SetData(pentagonVertexData, 5); // Create the geometry object Geometry pentagonGeometry = Geometry::New(); - pentagonGeometry.AddVertexBuffer( pentagonVertices ); - pentagonGeometry.AddVertexBuffer( pentacleVertices ); - pentagonGeometry.SetIndexBuffer( indices ); - - pentagonGeometry.SetGeometryType( Geometry::LINES ); - + pentagonGeometry.AddVertexBuffer(pentagonVertices); + pentagonGeometry.SetIndexBuffer(INDICES[0], INDICES_SIZE[0]); + pentagonGeometry.SetType(Geometry::LINES); return pentagonGeometry; } @@ -115,16 +108,27 @@ Geometry CreateGeometry() class ExampleController : public ConnectionTracker { public: - /** * The example controller constructor. * @param[in] application The application instance */ - ExampleController( Application& application ) - : mApplication( application ) + ExampleController(Application& 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 ); + mApplication.InitSignal().Connect(this, &ExampleController::Create); } /** @@ -139,116 +143,248 @@ public: * Invoked upon creation of application * @param[in] application The application instance */ - void Create( Application& application ) + void Create(Application& application) { - Stage stage = Stage::GetCurrent(); - stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent); + Window window = application.GetWindow(); + + // initial settings + mPrimitiveType = Geometry::LINES; + mCurrentIndexCount = 10; + mMaxIndexCount = 10; - mStageSize = stage.GetSize(); + CreateRadioButtons(); - // The Init signal is received once (only) during the Application lifetime + window.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent); - // Hide the indicator bar - application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE ); + mWindowSize = window.GetSize(); - mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); + Initialise(); - mMaterial = Material::New( mShader ); - mImage = ResourceImage::New( MATERIAL_SAMPLE ); - mMaterial.AddTexture(mImage, "sTexture"); + 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); - - Property::Index morphAmountIndex = mMeshActor.RegisterProperty( "uMorphAmount", 0.0f ); + mMeshActor.AddRenderer(mRenderer); + mMeshActor.SetProperty(Actor::Property::SIZE, Vector2(200, 200)); + mMeshActor.SetProperty(DevelActor::Property::UPDATE_SIZE_HINT, Vector2(400, 400)); - mRenderer.SetDepthIndex(0); + Property::Index morphAmountIndex = mMeshActor.RegisterProperty("uMorphAmount", 0.0f); - mMeshActor.SetParentOrigin( ParentOrigin::CENTER ); - mMeshActor.SetAnchorPoint( AnchorPoint::CENTER ); - stage.Add( mMeshActor ); + mRenderer.SetProperty(Renderer::Property::DEPTH_INDEX, 0); - mChangeImageTimer = Timer::New( 5000 ); - mChangeImageTimer.TickSignal().Connect( this, &ExampleController::OnTimer ); - mChangeImageTimer.Start(); + mMeshActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mMeshActor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + window.Add(mMeshActor); - Animation animation = Animation::New(5); + Animation animation = Animation::New(5); KeyFrames keyFrames = KeyFrames::New(); keyFrames.Add(0.0f, 0.0f); keyFrames.Add(1.0f, 1.0f); - animation.AnimateBetween( Property( mMeshActor, morphAmountIndex ), keyFrames, AlphaFunction(AlphaFunction::SIN) ); + animation.AnimateBetween(Property(mMeshActor, morphAmountIndex), keyFrames, AlphaFunction(AlphaFunction::SIN)); animation.SetLooping(true); animation.Play(); + } + + /** + * 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"}; - stage.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f)); + 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); } /** * Invoked whenever the quit button is clicked * @param[in] button the quit button */ - bool OnQuitButtonClicked( Toolkit::Button button ) + bool OnQuitButtonClicked(Toolkit::Button button) { // quit the application mApplication.Quit(); return true; } - bool OnTimer() - { - Image image = ResourceImage::New( MATERIAL_SAMPLE2 ); - - mMaterial.SetTextureImage(0,image); - return false; - } - void OnKeyEvent(const KeyEvent& event) { - if(event.state == KeyEvent::Down) + if(event.GetState() == KeyEvent::DOWN) { - if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) ) + if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK)) { mApplication.Quit(); } } } -private: - - Application& mApplication; ///< Application instance - Vector3 mStageSize; ///< The size of the stage - - Image mImage; - Shader mShader; - Material mMaterial; - Geometry mGeometry; - Renderer mRenderer; - Actor mMeshActor; - Renderer mRenderer2; - Actor mMeshActor2; - Timer mChangeImageTimer; -}; + 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; + } -void RunTest( Application& application ) -{ - ExampleController test( application ); + 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; + } - application.MainLoop(); -} + bool OnButtonClicked(Toolkit::Button button) + { + if(button == mMinusButton) + { + if(--mCurrentIndexCount < 2) + mCurrentIndexCount = 2; + } + else + { + if(++mCurrentIndexCount > mMaxIndexCount) + mCurrentIndexCount = mMaxIndexCount; + } -// Entry point for Linux & SLP applications -// -int main( int argc, char **argv ) -{ - Application application = Application::New( &argc, &argv ); + std::stringstream str; + str << mCurrentIndexCount; + mIndicesCountLabel.SetProperty(Toolkit::TextLabel::Property::TEXT, str.str()); + mRenderer.SetIndexRange(0, mCurrentIndexCount); + return true; + } - RunTest( application ); +private: + Application& mApplication; ///< Application instance + Vector3 mWindowSize; ///< The size of the window + + Shader mShader; + 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; +}; +int DALI_EXPORT_API main(int argc, char** argv) +{ + Application application = Application::New(&argc, &argv); + ExampleController test(application); + application.MainLoop(); return 0; }