From: minho.sun Date: Wed, 7 Jun 2017 03:15:18 +0000 (+0900) Subject: Merge branch 'devel/master' into tizen X-Git-Tag: submit/tizen/20170607.061735 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=683988554b034d71f29b7dbbf6830d15834baf8d;hp=0e5e935c3efbd74191aa8b167d64fa167cf1e734;p=platform%2Fcore%2Fuifw%2Fdali-demo.git Merge branch 'devel/master' into tizen Change-Id: I8da619e6557a2bdb0f9e9dfd276164d1bf335640 --- diff --git a/com.samsung.dali-demo.xml b/com.samsung.dali-demo.xml index 9dab573..a71c9a3 100644 --- a/com.samsung.dali-demo.xml +++ b/com.samsung.dali-demo.xml @@ -221,4 +221,7 @@ + + + diff --git a/demo/dali-demo.cpp b/demo/dali-demo.cpp index 566c57e..093a2f2 100644 --- a/demo/dali-demo.cpp +++ b/demo/dali-demo.cpp @@ -48,6 +48,7 @@ int DALI_EXPORT_API main(int argc, char **argv) demo.AddExample(Example("renderer-stencil.example", DALI_DEMO_STR_TITLE_RENDERER_STENCIL)); demo.AddExample(Example("shadows-and-lights.example", DALI_DEMO_STR_TITLE_LIGHTS_AND_SHADOWS)); demo.AddExample(Example("sparkle.example", DALI_DEMO_STR_TITLE_SPARKLE)); + demo.AddExample(Example("rendering-skybox.example", DALI_DEMO_STR_TITLE_SKYBOX)); demo.SortAlphabetically( true ); diff --git a/examples/mesh-visual/mesh-visual-example.cpp b/examples/mesh-visual/mesh-visual-example.cpp index 341a72c..4b9fb23 100644 --- a/examples/mesh-visual/mesh-visual-example.cpp +++ b/examples/mesh-visual/mesh-visual-example.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include using namespace Dali; using namespace Dali::Toolkit; @@ -321,6 +323,9 @@ public: //Create mesh property map Property::Map map; map.Insert( Visual::Property::TYPE, Visual::MESH ); + map.Insert( DevelVisual::Property::TRANSFORM, + Property::Map().Add( DevelVisual::Transform::Property::ORIGIN, Align::CENTER ) + .Add( DevelVisual::Transform::Property::ANCHOR_POINT, Align::CENTER ) ); map.Insert( MeshVisual::Property::OBJECT_URL, MODEL_FILE_TABLE[mModelIndex] ); map.Insert( MeshVisual::Property::MATERIAL_URL, MATERIAL_FILE_TABLE[mModelIndex] ); map.Insert( MeshVisual::Property::TEXTURES_PATH, TEXTURES_PATH ); diff --git a/examples/primitive-shapes/primitive-shapes-example.cpp b/examples/primitive-shapes/primitive-shapes-example.cpp index cc762be..cce4f3c 100644 --- a/examples/primitive-shapes/primitive-shapes-example.cpp +++ b/examples/primitive-shapes/primitive-shapes-example.cpp @@ -17,7 +17,9 @@ #include #include +#include #include +#include #include using namespace Dali; @@ -355,6 +357,9 @@ public: mVisualMap.Clear(); mVisualMap[ Visual::Property::TYPE ] = Visual::PRIMITIVE; mVisualMap[ PrimitiveVisual::Property::MIX_COLOR ] = mColor; + mVisualMap[ DevelVisual::Property::TRANSFORM ] = + Property::Map().Add( DevelVisual::Transform::Property::ORIGIN, Align::CENTER ) + .Add( DevelVisual::Transform::Property::ANCHOR_POINT, Align::CENTER ); } //Sets the 3D model to a sphere and modifies the sliders appropriately. diff --git a/examples/rendering-skybox/look-camera.cpp b/examples/rendering-skybox/look-camera.cpp new file mode 100644 index 0000000..9e6cf00 --- /dev/null +++ b/examples/rendering-skybox/look-camera.cpp @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2017 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 "look-camera.h" + +#include +#include +#include +#include +#include + +using namespace Dali; + +namespace +{ +// Input sensitivity, the larger value, the more sensitive input +// Default value has been chosen empirically +const float CAMERA_SENSITIVITY ( 90.0f ); + +// Vertical angle limit of the camera +const float CAMERA_VERTICAL_LIMIT ( 80.0f ); + +// Position where camera is instantiated by default +const Vector3 CAMERA_DEFAULT_POSITION ( 0.0f, 0.0f, 3.0f ); + +// Field-of-View in degrees +const float CAMERA_DEFAULT_FOV ( 60.0f ); + +// Near plane +const float CAMERA_DEFAULT_NEAR ( 0.1f ); + +// Far plane +const float CAMERA_DEFAULT_FAR ( 100.0f ); + +// Default forward vector +const Vector3 CAMERA_FORWARD ( 0.0f, 0.0f, 1.0f ); + +// Default up vector +const Vector3 CAMERA_UP ( Vector3::YAXIS ); +} + +LookCamera::LookCamera() +: mCameraYawPitch( 0.0f, 180.0f ), + mFovY( CAMERA_DEFAULT_FOV ), + mNear( CAMERA_DEFAULT_NEAR ), + mFar( CAMERA_DEFAULT_FAR ), + mCameraPosition( CAMERA_DEFAULT_POSITION ) +{ +} + +LookCamera::~LookCamera() +{ + mTimer.Stop(); + mCameraActor.Remove( mInterceptorActor ); +} + +void LookCamera::Initialise( const Vector3& position, float fovY, float near, float far ) +{ + mFovY = fovY; + mNear = near; + mFar = far; + + // Camera position is shadowed in order to avoid using GetCurrentPosition() + mCameraPosition = position; + + // Initialise default camera + InitialiseDefaultCamera(); + + // Create input interceptor actor + CreateInterceptorActor(); + + // Start timer + mTimer = Timer::New( 16 ); + mTimer.TickSignal().Connect( this, &LookCamera::OnTick ); + mTimer.Start(); +} + +bool LookCamera::OnTick() +{ + Vector2 stageSize = Stage::GetCurrent().GetSize(); + + // --------------------------------------------------------------------- + // update rotation + Vector2 tmp( mScreenLookDelta ); + mScreenLookDelta = Vector2::ZERO; + + float yaw = ( (tmp.y / stageSize.x ) * CAMERA_SENSITIVITY ); + float pitch = ( (tmp.x / stageSize.y ) * CAMERA_SENSITIVITY ); + mCameraYawPitch.x -= yaw; + mCameraYawPitch.y -= pitch; + if( abs( mCameraYawPitch.x ) > CAMERA_VERTICAL_LIMIT ) + { + mCameraYawPitch.x = CAMERA_VERTICAL_LIMIT * ((mCameraYawPitch.x < 0) ? -1.0f : 1.0f ); + } + + Quaternion rotation; + Quaternion rotX( Degree( mCameraYawPitch.x), Vector3( 1.0f, 0.0f, 0.0f ) ); + Quaternion rotY( Degree( mCameraYawPitch.y), Vector3( 0.0f, 1.0f, 0.0f ) ); + rotation = ( rotY * rotX ); + + mCameraActor.SetOrientation( rotation ); + + return true; +} + +void LookCamera::InitialiseDefaultCamera() +{ + Stage stage = Stage::GetCurrent(); + mCameraActor = stage.GetRenderTaskList().GetTask(0).GetCameraActor(); + mCameraActor.SetName( "LookCamera" ); + mCameraActor.SetAnchorPoint( AnchorPoint::CENTER ); + mCameraActor.SetParentOrigin( ParentOrigin::CENTER ); + mCameraActor.SetFieldOfView( Radian( Degree( mFovY ) ) ); + + // should be read from file + mCameraActor.SetNearClippingPlane( mNear ); + mCameraActor.SetFarClippingPlane( mFar ); + mCameraActor.SetPosition( mCameraPosition ); +} + +void LookCamera::CreateInterceptorActor() +{ + Stage stage = Stage::GetCurrent(); + + mInterceptorActor = Actor::New(); + mInterceptorActor.SetName( "InputInterceptor" ); + mInterceptorActor.SetSize( Vector3( stage.GetSize().x, stage.GetSize().y, 1 ) ); + mInterceptorActor.SetPosition( Vector3( 0.0, 0.0, 1.0 ) ); + mInterceptorActor.SetAnchorPoint( AnchorPoint::CENTER ); + mInterceptorActor.SetParentOrigin( ParentOrigin::CENTER ); + mCameraActor.Add( mInterceptorActor ); + + // Connect TouchSignal to interceptor actor + mInterceptorActor.TouchSignal().Connect( this, &LookCamera::OnTouch ); +} + +bool LookCamera::OnTouch( Actor actor, const TouchData& touch ) +{ + Stage stage = Stage::GetCurrent(); + + for( int i = 0; i < (int)touch.GetPointCount() && i < 3; ++i ) + { + Vector2 position( touch.GetScreenPosition( i ) ); + + // touch started + if( touch.GetState( i ) == PointState::STARTED ) + { + mOldTouchLookPosition = position; + } + else if( touch.GetState( i ) == PointState::FINISHED || + touch.GetState( i ) == PointState::LEAVE || + touch.GetState( i ) == PointState::INTERRUPTED + ) + { + mScreenLookDelta = Vector2::ZERO; + mOldTouchLookPosition = Vector2::ZERO; + } + else // on motion + { + mScreenLookDelta.x += ( position.x - mOldTouchLookPosition.x ); + mScreenLookDelta.y += ( position.y - mOldTouchLookPosition.y ); + mOldTouchLookPosition = position; + } + } + + return true; +} diff --git a/examples/rendering-skybox/look-camera.h b/examples/rendering-skybox/look-camera.h new file mode 100644 index 0000000..6cd3a60 --- /dev/null +++ b/examples/rendering-skybox/look-camera.h @@ -0,0 +1,105 @@ +#ifndef LOOK_CAMERA_H +#define LOOK_CAMERA_H + +/* + * Copyright (c) 2017 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 +#include + +/** + * @brief The LookCamera class + * + * LookCamera handles user input to change the orientation of the default camera. + */ +class LookCamera : public Dali::ConnectionTracker +{ +public: + + /** + * Creates an instance of LookCamera + */ + LookCamera(); + + /** + * Destroys an instance of LookCamera + */ + ~LookCamera(); + + /** + * Initialise with given position, fovY, near, far + * @param[in] position Position of the camera. + * @param[in] fovY Field of view in degrees + * @param[in] near Near plane + * @param[in] far Far Plane + */ + void Initialise( const Dali::Vector3& position, float fov, float near, float far ); + + /** + * Retrieves actor associated with camera object + * @return Returns camera actor + */ + Dali::CameraActor GetCameraActor(); + +private: + + /** + * Sets up a perspective camera using Dali default camera + */ + void InitialiseDefaultCamera(); + + /** + * Creates 'interceptor' actor. Interceptor actor is always parallel + * to the camera and positioned little bit in front of it in order to + * intercept user input. + */ + void CreateInterceptorActor(); + + /** + * Handles onTouch signal on the 'interceptor' actor + * @param[in] actor Actor receiving signal + * @param[in] touch Touch data + */ + bool OnTouch( Dali::Actor actor, const Dali::TouchData& touch ); + + /** + * Handles camera tick() update + * @return true if continue running timer, false otherwise + */ + bool OnTick(); + +private: + + Dali::CameraActor mCameraActor; /// Camera actor + Dali::Actor mInterceptorActor; /// Actor intercepting user input + + Dali::Timer mTimer; /// Per-frame timer + + Dali::Vector2 mScreenLookDelta; /// Look delta vector in screen space + Dali::Vector2 mOldTouchLookPosition; /// Previous look vector in screen space + + Dali::Vector2 mCameraYawPitch; /// Camera yaw-pitch angles + + float mFovY; /// Camera field-of-view + float mNear; /// Near plane + float mFar; /// Far plane + + Dali::Vector3 mCameraPosition; /// Current camera position ( shadowing the actor position ) +}; + +#endif diff --git a/examples/rendering-skybox/rendering-skybox.cpp b/examples/rendering-skybox/rendering-skybox.cpp new file mode 100644 index 0000000..420ac61 --- /dev/null +++ b/examples/rendering-skybox/rendering-skybox.cpp @@ -0,0 +1,503 @@ +/* + * Copyright (c) 2017 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 + +#include "look-camera.h" + +using namespace Dali; +using namespace Toolkit; + +namespace +{ + +/* + * Vertex shader for a textured cube + */ +const char* VERTEX_SHADER_CUBE = DALI_COMPOSE_SHADER( +attribute mediump vec3 aPosition;\n // DALi shader builtin +attribute mediump vec2 aTexCoord;\n // DALi shader builtin +uniform mediump mat4 uMvpMatrix;\n // DALi shader builtin +uniform mediump vec3 uSize;\n // DALi shader builtin +\n +varying mediump vec2 vTexCoord;\n +void main()\n +{\n + mediump vec4 vertexPosition = vec4(aPosition, 1.0);\n + vertexPosition.xyz *= uSize;\n + vTexCoord = aTexCoord;\n + gl_Position = uMvpMatrix * vertexPosition;\n +}\n +); + +/* + * Fragment shader for a textured cube + */ +const char* FRAGMENT_SHADER_CUBE = DALI_COMPOSE_SHADER( +uniform sampler2D uTexture;\n +\n +varying mediump vec2 vTexCoord;\n +void main()\n +{\n + mediump vec4 texColor = texture2D( uTexture, vTexCoord );\n + gl_FragColor = texColor;\n +}\n +); + +/* + * Vertex shader for a skybox + */ +const char* VERTEX_SHADER_SKYBOX = DALI_COMPOSE_SHADER( +attribute mediump vec3 aPosition;\n // DALi shader builtin +uniform mediump mat4 uMvpMatrix;\n // DALi shader builtin +\n +varying mediump vec3 vTexCoord;\n +void main()\n +{\n + vTexCoord.x = aPosition.x;\n + vTexCoord.y = -aPosition.y;\n // convert to GL coords + vTexCoord.z = aPosition.z;\n + + mediump vec4 vertexPosition = vec4(aPosition, 1.0);\n + vec4 clipSpacePosition = uMvpMatrix * vertexPosition;\n + gl_Position = clipSpacePosition.xyww;\n // Writes 1.0, the maximum depth value, into the depth buffer. + // This is an optimization to avoid running the fragment shader + // for the pixels hidden by the scene's objects. +}\n +); + +/* + * Fragment shader for a skybox + */ +const char* FRAGMENT_SHADER_SKYBOX = DALI_COMPOSE_SHADER( +uniform samplerCube uSkyBoxTexture;\n +\n +varying mediump vec3 vTexCoord;\n +void main()\n +{\n + mediump vec4 texColor = textureCube( uSkyBoxTexture, vTexCoord );\n + gl_FragColor = texColor;\n +}\n +); + +const float CAMERA_DEFAULT_FOV( 60.0f ); +const float CAMERA_DEFAULT_NEAR( 0.1f ); +const float CAMERA_DEFAULT_FAR( 1000.0f ); +const Vector3 CAMERA_DEFAULT_POSITION( 0.0f, 0.0f, 100.0f ); + +const char* TEXTURE_URL = DEMO_IMAGE_DIR "wood.png"; + +const unsigned int SKYBOX_FACE_COUNT = 6; +const unsigned int SKYBOX_FACE_WIDTH = 2048; +const unsigned int SKYBOX_FACE_HEIGHT = 2048; + +/* + * Credit to Joey do Vries for the following cubemap images + * Take from git://github.com/JoeyDeVries/LearnOpenGL.git + * The images are licensed under the terms of the CC BY 4.0 license: + * https://creativecommons.org/licenses/by/4.0/ + */ +const char* SKYBOX_FACES[ SKYBOX_FACE_COUNT ] = +{ + DEMO_IMAGE_DIR "lake_right.jpg", + DEMO_IMAGE_DIR "lake_left.jpg", + DEMO_IMAGE_DIR "lake_top.jpg", + DEMO_IMAGE_DIR "lake_bottom.jpg", + DEMO_IMAGE_DIR "lake_back.jpg", + DEMO_IMAGE_DIR "lake_front.jpg" +}; + +} + +// This example shows how to create a skybox +// +// Recommended screen size on desktop: 1280x720 +// +class TexturedCubeController : public ConnectionTracker +{ +public: + + TexturedCubeController( Application& application ) + : mApplication( application ) + { + // Connect to the Application's Init signal + mApplication.InitSignal().Connect( this, &TexturedCubeController::Create ); + } + + ~TexturedCubeController() + { + // Nothing to do here; + } + + // The Init signal is received once (only) during the Application lifetime + void Create( Application& application ) + { + // Disable indicator. + // It avoids reposition the camera to fit with the indicator height. + Dali::Window winHandle = application.GetWindow(); + winHandle.ShowIndicator( Dali::Window::INVISIBLE ); + + // Get a handle to the stage + Stage stage = Stage::GetCurrent(); + stage.SetBackgroundColor( Color::WHITE ); + + // Step 1. Setup camera + SetupCamera(); + + // Step 2. Create shaders + CreateShaders(); + + // Step 3. Create geometry + CreateCubeGeometry(); + CreateSkyboxGeometry(); + + // Step 4. Display first a cube at the world origin. + // The write on the depth buffer is enabled. + DisplayCube(); + + // Step 5. Display last the skybox surrounding the camera. + // The depth test is enabled, the shader sets 1.0, which is the maximum depth and + // the depth function is set to LESS or EQUAL so the fragment shader will run only + // in those pixels that any other object has written on them. + DisplaySkybox(); + + // Step 6. Play animation to rotate the cube + PlayAnimation(); + + // Respond to key events + stage.KeyEventSignal().Connect( this, &TexturedCubeController::OnKeyEvent ); + } + + /** + * @brief Called when any key event is received + * + * Will use this to quit the application if Back or the Escape key is received + * @param[in] event The key event information + */ + void OnKeyEvent( const KeyEvent& event ) + { + if( event.state == KeyEvent::Down ) + { + if ( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) ) + { + mApplication.Quit(); + } + } + } + + /** + * @brief Setup a perspective camera pointing in the negative Z direction + */ + void SetupCamera() + { + Stage stage = Stage::GetCurrent(); + + RenderTask renderTask = stage.GetRenderTaskList().GetTask( 0 ); + renderTask.SetCullMode( false ); // avoid frustum culling affecting the skybox + + mCamera.Initialise( CAMERA_DEFAULT_POSITION, CAMERA_DEFAULT_FOV, CAMERA_DEFAULT_NEAR, CAMERA_DEFAULT_FAR ); + } + + /** + * Creates a shader using inlined variable VERTEX_SHADER and FRAGMENT_SHADER + * + * Shaders are very basic and all they do is transforming vertices and sampling + * a texture. + */ + void CreateShaders() + { + mShaderCube = Shader::New( VERTEX_SHADER_CUBE, FRAGMENT_SHADER_CUBE ); + mShaderSkybox = Shader::New( VERTEX_SHADER_SKYBOX, FRAGMENT_SHADER_SKYBOX ); + } + + /** + * @brief CreateCubeGeometry + * This function creates a cube geometry including texture coordinates. + * Also it demonstrates using the indexed draw feature by setting an index array. + */ + void CreateCubeGeometry() + { + struct Vertex + { + Vector3 aPosition; + Vector2 aTexCoord; + }; + + Vertex vertices[] = { + { Vector3( 1.0f,-1.0f,-1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f, 1.0f,-1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( 1.0f, 1.0f,-1.0f ), Vector2( 0.0, 1.0 ) }, + { Vector3( -1.0f, 1.0f, 1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( 1.0f,-1.0f, 1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( 1.0f, 1.0f, 1.0f ), Vector2( 0.0, 1.0 ) }, + { Vector3( 1.0f, 1.0f, 1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( 1.0f,-1.0f,-1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( 1.0f, 1.0f,-1.0f ), Vector2( 0.0, 1.0 ) }, + { Vector3( 1.0f,-1.0f, 1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f,-1.0f,-1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( 1.0f,-1.0f,-1.0f ), Vector2( 0.0, 1.0 ) }, + { Vector3( -1.0f,-1.0f,-1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f, 1.0f, 1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( -1.0f, 1.0f,-1.0f ), Vector2( 0.0, 1.0 ) }, + { Vector3( 1.0f, 1.0f,-1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f, 1.0f, 1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( 1.0f, 1.0f, 1.0f ), Vector2( 0.0, 1.0 ) }, + { Vector3( 1.0f,-1.0f,-1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f,-1.0f,-1.0f ), Vector2( 1.0, 0.0 ) }, + { Vector3( -1.0f, 1.0f,-1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( -1.0f, 1.0f, 1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f,-1.0f, 1.0f ), Vector2( 1.0, 0.0 ) }, + { Vector3( 1.0f,-1.0f, 1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( 1.0f, 1.0f, 1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( 1.0f,-1.0f, 1.0f ), Vector2( 1.0, 0.0 ) }, + { Vector3( 1.0f,-1.0f,-1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( 1.0f,-1.0f, 1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f,-1.0f, 1.0f ), Vector2( 1.0, 0.0 ) }, + { Vector3( -1.0f,-1.0f,-1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( -1.0f,-1.0f,-1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f,-1.0f, 1.0f ), Vector2( 1.0, 0.0 ) }, + { Vector3( -1.0f, 1.0f, 1.0f ), Vector2( 0.0, 0.0 ) }, + { Vector3( 1.0f, 1.0f,-1.0f ), Vector2( 1.0, 1.0 ) }, + { Vector3( -1.0f, 1.0f,-1.0f ), Vector2( 1.0, 0.0 ) }, + { Vector3( -1.0f, 1.0f, 1.0f ), Vector2( 0.0, 0.0 ) }, + }; + + PropertyBuffer vertexBuffer = PropertyBuffer::New( Property::Map() + .Add( "aPosition", Property::VECTOR3 ) + .Add( "aTexCoord", Property::VECTOR2 ) ); + vertexBuffer.SetData( vertices, sizeof(vertices) / sizeof(Vertex) ); + + // create indices + const unsigned short INDEX_CUBE[] = { + 2, 1, 0, + 5, 4, 3, + 8, 7, 6, + 11, 10, 9, + 14, 13, 12, + 17, 16, 15, + 20, 19, 18, + 23, 22, 21, + 26, 25, 24, + 29, 28, 27, + 32, 31, 30, + 35, 34, 33 + }; + + mGeometry = Geometry::New(); + mGeometry.AddVertexBuffer( vertexBuffer ); + mGeometry.SetIndexBuffer( INDEX_CUBE, + sizeof(INDEX_CUBE)/sizeof(INDEX_CUBE[0]) ); + mGeometry.SetType( Geometry::TRIANGLES ); + } + + /** + * @brief CreateCubeGeometry + * This function creates a cube geometry including texture coordinates. + * Also it demonstrates using the indexed draw feature by setting an index array. + */ + void CreateSkyboxGeometry() + { + struct Vertex + { + Vector3 aPosition; + }; + + Vertex skyboxVertices[] = { + // back + { Vector3( -1.0f, 1.0f, -1.0f ) }, + { Vector3( -1.0f, -1.0f, -1.0f ) }, + { Vector3( 1.0f, -1.0f, -1.0f ) }, + { Vector3( 1.0f, -1.0f, -1.0f ) }, + { Vector3( 1.0f, 1.0f, -1.0f ) }, + { Vector3( -1.0f, 1.0f, -1.0f ) }, + + // left + { Vector3( -1.0f, -1.0f, 1.0f ) }, + { Vector3( -1.0f, -1.0f, -1.0f ) }, + { Vector3( -1.0f, 1.0f, -1.0f ) }, + { Vector3( -1.0f, 1.0f, -1.0f ) }, + { Vector3( -1.0f, 1.0f, 1.0f ) }, + { Vector3( -1.0f, -1.0f, 1.0f ) }, + + // right + { Vector3( 1.0f, -1.0f, -1.0f ) }, + { Vector3( 1.0f, -1.0f, 1.0f ) }, + { Vector3( 1.0f, 1.0f, 1.0f ) }, + { Vector3( 1.0f, 1.0f, 1.0f ) }, + { Vector3( 1.0f, 1.0f, -1.0f ) }, + { Vector3( 1.0f, -1.0f, -1.0f ) }, + + // front + { Vector3( -1.0f, -1.0f, 1.0f ) }, + { Vector3( -1.0f, 1.0f, 1.0f ) }, + { Vector3( 1.0f, 1.0f, 1.0f ) }, + { Vector3( 1.0f, 1.0f, 1.0f ) }, + { Vector3( 1.0f, -1.0f, 1.0f ) }, + { Vector3( -1.0f, -1.0f, 1.0f ) }, + + // botton + { Vector3( -1.0f, 1.0f, -1.0f ) }, + { Vector3( 1.0f, 1.0f, -1.0f ) }, + { Vector3( 1.0f, 1.0f, 1.0f ) }, + { Vector3( 1.0f, 1.0f, 1.0f ) }, + { Vector3( -1.0f, 1.0f, 1.0f ) }, + { Vector3( -1.0f, 1.0f, -1.0f ) }, + + // top + { Vector3( -1.0f, -1.0f, -1.0f ) }, + { Vector3( -1.0f, -1.0f, 1.0f ) }, + { Vector3( 1.0f, -1.0f, -1.0f ) }, + { Vector3( 1.0f, -1.0f, -1.0f ) }, + { Vector3( -1.0f, -1.0f, 1.0f ) }, + { Vector3( 1.0f, -1.0f, 1.0f ) } + }; + + PropertyBuffer vertexBuffer = PropertyBuffer::New( Property::Map() + .Add( "aPosition", Property::VECTOR3 ) ); + vertexBuffer.SetData( skyboxVertices, sizeof(skyboxVertices) / sizeof(Vertex) ); + + mSkyboxGeometry = Geometry::New(); + mSkyboxGeometry.AddVertexBuffer( vertexBuffer ); + mSkyboxGeometry.SetType( Geometry::TRIANGLES ); + } + + /** + * Display a cube at the world origin + */ + void DisplayCube() + { + // Load image from file + PixelData pixels = SyncImageLoader::Load( TEXTURE_URL ); + + Texture texture = Texture::New( TextureType::TEXTURE_2D, pixels.GetPixelFormat(), pixels.GetWidth(), pixels.GetHeight() ); + texture.Upload( pixels, 0, 0, 0, 0, pixels.GetWidth(), pixels.GetHeight() ); + + // create TextureSet + mTextureSet = TextureSet::New(); + mTextureSet.SetTexture( 0, texture ); + + mRenderer = Renderer::New( mGeometry, mShaderCube ); + mRenderer.SetTextures( mTextureSet ); + mRenderer.SetProperty( Renderer::Property::DEPTH_INDEX, 1.0f ); + + // A further optimization would be to enable debug testing instead + mRenderer.SetProperty( Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::BACK ); + + // Enables the write on the depth buffer. + mRenderer.SetProperty( Renderer::Property::DEPTH_WRITE_MODE, DepthWriteMode::ON ); + + mActor = Actor::New(); + mActor.SetName( "Cube" ); + mActor.SetAnchorPoint( AnchorPoint::CENTER ); + mActor.SetParentOrigin( ParentOrigin::CENTER ); + mActor.AddRenderer( mRenderer ); + + mActor.SetSize( 10.f, 10.f, 10.f ); + + Stage stage = Stage::GetCurrent(); + stage.Add( mActor ); + } + + /** + * Display a skybox surrounding the camera + */ + void DisplaySkybox() + { + // Load skybox faces from file + Texture texture = Texture::New( TextureType::TEXTURE_CUBE, Pixel::RGBA8888, SKYBOX_FACE_WIDTH, SKYBOX_FACE_HEIGHT ); + for (unsigned int i = 0; i < SKYBOX_FACE_COUNT; i++) + { + PixelData pixels = SyncImageLoader::Load( SKYBOX_FACES[i] ); + texture.Upload( pixels, CubeMapLayer::POSITIVE_X + i, 0, 0, 0, SKYBOX_FACE_WIDTH, SKYBOX_FACE_HEIGHT ); + } + + // create TextureSet + mSkyboxTextures = TextureSet::New(); + mSkyboxTextures.SetTexture( 0, texture ); + + mSkyboxRenderer = Renderer::New( mSkyboxGeometry, mShaderSkybox ); + mSkyboxRenderer.SetTextures( mSkyboxTextures ); + mSkyboxRenderer.SetProperty( Renderer::Property::DEPTH_INDEX, 2.0f ); + + // Enables the depth test. + mSkyboxRenderer.SetProperty( Renderer::Property::DEPTH_TEST_MODE, DepthTestMode::ON ); + + // The fragment shader will run only is those pixels that have the max depth value. + mSkyboxRenderer.SetProperty( Renderer::Property::DEPTH_FUNCTION, DepthFunction::LESS_EQUAL ); + + Stage stage = Stage::GetCurrent(); + + mSkyboxActor = Actor::New(); + mSkyboxActor.SetName( "SkyBox" ); + mSkyboxActor.SetAnchorPoint( AnchorPoint::CENTER ); + mSkyboxActor.SetParentOrigin( ParentOrigin::CENTER ); + mSkyboxActor.SetPosition( CAMERA_DEFAULT_POSITION ); + mSkyboxActor.AddRenderer( mSkyboxRenderer ); + stage.Add( mSkyboxActor ); + } + + /** + * Plays animation + */ + void PlayAnimation() + { + mAnimation = Animation::New( 5.0f ); + mAnimation.SetLooping( true ); + mAnimation.AnimateBy( Property( mActor, Actor::Property::ORIENTATION ), Quaternion( Radian( Degree( 360 )), Vector3::ZAXIS ) ); + mAnimation.AnimateBy( Property( mActor, Actor::Property::ORIENTATION ), Quaternion( Radian( Degree( 360 )), Vector3::YAXIS ) ); + mAnimation.AnimateBy( Property( mActor, Actor::Property::ORIENTATION ), Quaternion( Radian( Degree( 360 )), Vector3::XAXIS ) ); + mAnimation.Play(); + } + +private: + Application& mApplication; + + LookCamera mCamera; + + Shader mShaderCube; + Shader mShaderSkybox; + + Geometry mGeometry; + TextureSet mTextureSet; + Renderer mRenderer; + Actor mActor; + Animation mAnimation; + + Geometry mSkyboxGeometry; + TextureSet mSkyboxTextures; + Renderer mSkyboxRenderer; + Actor mSkyboxActor; +}; + +void RunTest( Application& application ) +{ + TexturedCubeController test( application ); + + application.MainLoop(); +} + +// Entry point for Linux & Tizen applications +// +int DALI_EXPORT_API main( int argc, char **argv ) +{ + Application application = Application::New( &argc, &argv ); + + RunTest( application ); + + return 0; +} diff --git a/examples/text-field/text-field-example.cpp b/examples/text-field/text-field-example.cpp index 944cb71..9462657 100644 --- a/examples/text-field/text-field-example.cpp +++ b/examples/text-field/text-field-example.cpp @@ -43,8 +43,6 @@ namespace const float BORDER_WIDTH = 4.0f; - const Vector3 POPUP_SIZE_FACTOR_TO_PARENT = Vector3( 0.8, 0.25, 0.0 ); - } // unnamed namespace /** @@ -133,8 +131,8 @@ public: Popup popup = Popup::New(); popup.SetParentOrigin( ParentOrigin::CENTER ); popup.SetAnchorPoint( AnchorPoint::CENTER ); - popup.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS ); - popup.SetSizeModeFactor( POPUP_SIZE_FACTOR_TO_PARENT ); + popup.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::WIDTH ); + popup.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::HEIGHT ); popup.TouchSignal().Connect( this, &TextFieldExample::OnPopupTouched ); return popup; diff --git a/examples/text-scrolling/text-scrolling-example.cpp b/examples/text-scrolling/text-scrolling-example.cpp index 709dce0..872f289 100644 --- a/examples/text-scrolling/text-scrolling-example.cpp +++ b/examples/text-scrolling/text-scrolling-example.cpp @@ -36,6 +36,14 @@ const Vector2 SCROLLING_BOX_SIZE( Vector2(330.0f, 40.0f ) ); const float MAX_OFFSCREEN_RENDERING_SIZE = 2048.f; const float SCREEN_BORDER = 5.0f; // Border around screen that Popups and handles will not exceed +const char * ALIGNMENT_TABLE[] = +{ + "BEGIN", + "CENTER", + "END" +}; +const unsigned int ALIGNMENT_TABLE_COUNT = sizeof( ALIGNMENT_TABLE ) / sizeof( ALIGNMENT_TABLE[ 0 ] ); + enum Labels { SMALL = 1u, @@ -172,7 +180,7 @@ public: boxC.SetPosition( 0.0f, -300.0f, 1.0f ); Toolkit::PushButton scrollSmallButton = Toolkit::PushButton::New(); scrollSmallButton.ClickedSignal().Connect( this, &TextScrollingExample::OnButtonClickedSmall ); - CreateLabel( mSmallLabel, "A Quick Brown Fox", boxC , true, scrollSmallButton ); + CreateLabel( mSmallLabel, "Hello Text", boxC , true, scrollSmallButton ); mSmallLabel.SetProperty( TextLabel::Property::TEXT_COLOR, Color::BLACK ); mSmallLabel.SetProperty( TextLabel::Property::SHADOW_OFFSET, Vector2( 1.0f, 1.0f ) ); mSmallLabel.SetProperty( TextLabel::Property::SHADOW_COLOR, Color::CYAN ); @@ -209,6 +217,25 @@ public: colorButton.SetSize(BOX_SIZE.height,BOX_SIZE.height); colorButton.ClickedSignal().Connect( this, &TextScrollingExample::OnColorButtonClicked ); rootActor.Add( colorButton ); + + for( unsigned int i = 0; i < ALIGNMENT_TABLE_COUNT; ++i ) + { + Toolkit::RadioButton alignButton = Toolkit::RadioButton::New( ALIGNMENT_TABLE[ i ] ); + alignButton.ClickedSignal().Connect( this, &TextScrollingExample::OnAlignButtonClicked ); + alignButton.SetName( ALIGNMENT_TABLE[ i ] ); + + // Place first button to left aligned, second center aligned and third right aligned + alignButton.SetAnchorPoint( Vector3( i * 0.5f, 0.0f, 0.5f ) ); + alignButton.SetParentOrigin( Vector3( i * 0.5f, 0.0f, 0.5f ) ); + + rootActor.Add( alignButton ); + + if( i == 0 ) + { + // Set the first button as selected + alignButton.SetProperty( Button::Property::SELECTED, true ); + } + } } void EnableScrolling( Labels labels ) @@ -281,26 +308,45 @@ public: } bool OnColorButtonClicked( Toolkit::Button button ) - { - Vector4 color = Color::RED; - - if ( mToggleColor ) { - color = Color::BLACK; - mToggleColor = false; - } - else - { - mToggleColor = true; + Vector4 color = Color::RED; + + if ( mToggleColor ) + { + color = Color::BLACK; + mToggleColor = false; + } + else + { + mToggleColor = true; + } + + mSmallLabel.SetProperty( TextLabel::Property::SHADOW_COLOR, Color::BLACK ); + mSmallLabel.SetProperty( TextLabel::Property::TEXT_COLOR, color ); + mRtlLabel.SetProperty( TextLabel::Property::TEXT_COLOR, color ); + mLargeLabel.SetProperty( TextLabel::Property::TEXT_COLOR, color ); + mRtlLongLabel.SetProperty( TextLabel::Property::TEXT_COLOR, color ); + + return true; } - mSmallLabel.SetProperty( TextLabel::Property::SHADOW_COLOR, Color::BLACK ); - mSmallLabel.SetProperty( TextLabel::Property::TEXT_COLOR, color ); - mLargeLabel.SetProperty( TextLabel::Property::TEXT_COLOR, color ); - mRtlLongLabel.SetProperty( TextLabel::Property::TEXT_COLOR, color ); + bool OnAlignButtonClicked( Toolkit::Button button ) + { + for( unsigned int index = 0; index < ALIGNMENT_TABLE_COUNT; ++index ) + { + const std::string& buttonName = button.GetName(); + if( buttonName == ALIGNMENT_TABLE[ index ] ) + { + mSmallLabel.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, ALIGNMENT_TABLE[ index ] ); + mRtlLabel.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, ALIGNMENT_TABLE[ index ] ); + mLargeLabel.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, ALIGNMENT_TABLE[ index ] ); + mRtlLongLabel.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, ALIGNMENT_TABLE[ index ] ); + break; + } + } - return true; - } + return true; + } /** * Main key event handler diff --git a/examples/transitions/shadow-button-impl.cpp b/examples/transitions/shadow-button-impl.cpp index edcfbec..135ea16 100644 --- a/examples/transitions/shadow-button-impl.cpp +++ b/examples/transitions/shadow-button-impl.cpp @@ -353,26 +353,22 @@ void ShadowButton::ResetVisual( { case Demo::ShadowButton::Property::BACKGROUND_VISUAL: { - DevelControl::RegisterVisual( *this, index, visual ); - visual.SetDepthIndex(0.0f); + DevelControl::RegisterVisual( *this, index, visual, 0 ); break; } case Demo::ShadowButton::Property::CHECKBOX_BG_VISUAL: { - DevelControl::RegisterVisual( *this, index, visual ); - visual.SetDepthIndex(1.0f); + DevelControl::RegisterVisual( *this, index, visual, 1 ); break; } case Demo::ShadowButton::Property::CHECKBOX_FG_VISUAL: { - DevelControl::RegisterVisual( *this, index, visual, mCheckState ); - visual.SetDepthIndex(2.0f); + DevelControl::RegisterVisual( *this, index, visual, mCheckState, 2 ); break; } case Demo::ShadowButton::Property::LABEL_VISUAL: { - DevelControl::RegisterVisual( *this, index, visual ); - visual.SetDepthIndex(1.0f); + DevelControl::RegisterVisual( *this, index, visual, 1 ); break; } } diff --git a/examples/visual-transitions/beat-control-impl.cpp b/examples/visual-transitions/beat-control-impl.cpp index d160e5b..54ae6b0 100644 --- a/examples/visual-transitions/beat-control-impl.cpp +++ b/examples/visual-transitions/beat-control-impl.cpp @@ -17,13 +17,10 @@ #include "beat-control-impl.h" #include #include -#include #include #include #include -#include - using namespace Dali; // Needed for macros using namespace Dali::Toolkit; @@ -60,13 +57,18 @@ Toolkit::TransitionData ConvertPropertyToTransition( const Property::Value& valu { Toolkit::TransitionData transitionData; - if( value.GetType() == Property::ARRAY ) + const Property::Array* array = value.GetArray(); + if( array ) { - transitionData = Toolkit::TransitionData::New( *value.GetArray()); + transitionData = Toolkit::TransitionData::New( *array ); } - else if( value.GetType() == Property::MAP ) + else { - transitionData = Toolkit::TransitionData::New( *value.GetMap() ); + const Property::Map* map = value.GetMap(); + if( map ) + { + transitionData = Toolkit::TransitionData::New( *map ); + } } return transitionData; } @@ -77,6 +79,8 @@ Toolkit::TransitionData ConvertPropertyToTransition( const Property::Value& valu Internal::BeatControl::BeatControl() : Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ), mTransformSize(1.0f, 1.0f), + mTransformOrigin(Align::CENTER), + mTransformAnchorPoint(Align::CENTER), mAnimationPlaying(0) { } @@ -209,6 +213,8 @@ void BeatControl::RelayoutVisuals( const Vector2& targetSize ) // Make the visual half the size of the control, but leave // origin and anchor point at center, position is relative, but Zer0 transformMap[ DevelVisual::Transform::Property::SIZE ] = mTransformSize; + transformMap[ DevelVisual::Transform::Property::ORIGIN ] = mTransformOrigin; + transformMap[ DevelVisual::Transform::Property::ANCHOR_POINT ] = mTransformAnchorPoint; mVisual.SetTransformAndSize( transformMap, size ); } } @@ -249,7 +255,7 @@ void BeatControl::SetProperty( BaseObject* object, Property::Index index, const { case Demo::BeatControl::Property::BEAT_VISUAL: { - bool sizeOnly = false; + bool sizeAndPositionOnly = false; // Determine if a transform.size property exists in the map, and // save it. @@ -262,18 +268,47 @@ void BeatControl::SetProperty( BaseObject* object, Property::Index index, const Property::Map* transformMap = value->GetMap(); if( transformMap ) { + // We'll increment this whenever SIZE, ORIGIN or ANCHOR_POINT's are modified as we won't need to create a new visual if only these properties are used + // If there are more properties in the transform map, then we need to create a new visual + unsigned int sizeAndPositionPropertyCount = 0; + Property::Value* sizeValue = transformMap->Find( DevelVisual::Transform::Property::SIZE, "size" ); if( sizeValue ) { sizeValue->Get( impl.mTransformSize ); - if( map->Count() == 1 && transformMap->Count() == 1 ) + ++sizeAndPositionPropertyCount; + } + + Property::Value* originValue = transformMap->Find( DevelVisual::Transform::Property::ORIGIN, "origin" ); + if( originValue ) + { + int intValue = 0; + if( originValue->Get( intValue ) ) { - sizeOnly = true; + impl.mTransformOrigin = static_cast< Toolkit::Align::Type >( intValue ); + ++sizeAndPositionPropertyCount; } } + + Property::Value* anchorPointValue = transformMap->Find( DevelVisual::Transform::Property::ANCHOR_POINT, "anchorPoint" ); + if( anchorPointValue ) + { + int intValue = 0; + if( anchorPointValue->Get( intValue ) ) + { + impl.mTransformAnchorPoint = static_cast< Toolkit::Align::Type >( intValue ); + ++sizeAndPositionPropertyCount; + } + } + + // If the only properties that the application is overriding are the size and the position properties, then we do not need to create another visual. + if( map->Count() == 1 && transformMap->Count() == sizeAndPositionPropertyCount ) + { + sizeAndPositionOnly = true; + } } } - if( ! sizeOnly ) + if( ! sizeAndPositionOnly ) { // Only register a visual if there is more than just a size setting impl.mVisual = Toolkit::VisualFactory::Get().CreateVisual( *map ); diff --git a/examples/visual-transitions/beat-control-impl.h b/examples/visual-transitions/beat-control-impl.h index 7138a8e..7e77def 100644 --- a/examples/visual-transitions/beat-control-impl.h +++ b/examples/visual-transitions/beat-control-impl.h @@ -2,7 +2,7 @@ #define DALI_DEMO_INTERNAL_BEAT_CONTROL_IMPL_H /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 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. @@ -20,6 +20,7 @@ #include "beat-control.h" #include #include +#include #include #include @@ -128,6 +129,8 @@ private: Dali::Animation mYAnimation; Dali::Animation mFadeAnimation; Dali::Vector2 mTransformSize; + Dali::Toolkit::Align::Type mTransformOrigin; + Dali::Toolkit::Align::Type mTransformAnchorPoint; int mAnimationPlaying; }; diff --git a/examples/visual-transitions/transition-application.cpp b/examples/visual-transitions/transition-application.cpp index 7094d14..87a69d5 100644 --- a/examples/visual-transitions/transition-application.cpp +++ b/examples/visual-transitions/transition-application.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 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. @@ -124,7 +124,7 @@ void TransitionApplication::Create( Application& application ) Property::Map map; CreateVisualMap( i, map ); map.Add( DevelVisual::Property::TRANSFORM, Property::Map() - .Add( DevelVisual::Transform::Property::SIZE, Vector2(0.8f, 0.8f) ) ); + .Add( DevelVisual::Transform::Property::SIZE, Vector2(0.8f, 0.8f) ) ); mVisualButtons[i] = BeatControl::New(); mVisualButtons[i].SetProperty( BeatControl::Property::BEAT_VISUAL, map ); mVisualButtons[i].SetName("VisualButton"); diff --git a/packaging/com.samsung.dali-demo.spec b/packaging/com.samsung.dali-demo.spec index 4bedd00..e9f5d79 100755 --- a/packaging/com.samsung.dali-demo.spec +++ b/packaging/com.samsung.dali-demo.spec @@ -2,7 +2,7 @@ Name: com.samsung.dali-demo Summary: The OpenGLES Canvas Core Demo -Version: 1.2.41 +Version: 1.2.42 Release: 1 Group: System/Libraries License: Apache-2.0 diff --git a/resources/images/lake_back.jpg b/resources/images/lake_back.jpg new file mode 100644 index 0000000..4e17b77 Binary files /dev/null and b/resources/images/lake_back.jpg differ diff --git a/resources/images/lake_bottom.jpg b/resources/images/lake_bottom.jpg new file mode 100644 index 0000000..893f394 Binary files /dev/null and b/resources/images/lake_bottom.jpg differ diff --git a/resources/images/lake_front.jpg b/resources/images/lake_front.jpg new file mode 100644 index 0000000..470a679 Binary files /dev/null and b/resources/images/lake_front.jpg differ diff --git a/resources/images/lake_left.jpg b/resources/images/lake_left.jpg new file mode 100644 index 0000000..5750b91 Binary files /dev/null and b/resources/images/lake_left.jpg differ diff --git a/resources/images/lake_right.jpg b/resources/images/lake_right.jpg new file mode 100644 index 0000000..8963037 Binary files /dev/null and b/resources/images/lake_right.jpg differ diff --git a/resources/images/lake_top.jpg b/resources/images/lake_top.jpg new file mode 100644 index 0000000..4db3c2a Binary files /dev/null and b/resources/images/lake_top.jpg differ diff --git a/resources/po/as.po b/resources/po/as.po index 66f9e46..b4e4000 100755 --- a/resources/po/as.po +++ b/resources/po/as.po @@ -168,3 +168,6 @@ msgstr "রশ্মীয় অগ্রগতি অঙ্কন" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "রে মার্চিং" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/de.po b/resources/po/de.po index dc1c7cb..fe66ac4 100755 --- a/resources/po/de.po +++ b/resources/po/de.po @@ -168,3 +168,6 @@ msgstr "Radialer Fortschritt zeichnen" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "Ray marschieren" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/en_GB.po b/resources/po/en_GB.po index 8ccd957..4c9c8f1 100755 --- a/resources/po/en_GB.po +++ b/resources/po/en_GB.po @@ -180,3 +180,6 @@ msgstr "Draw radial progress" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "Ray Marching" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/en_US.po b/resources/po/en_US.po index 9c8447a..ee9e456 100755 --- a/resources/po/en_US.po +++ b/resources/po/en_US.po @@ -180,3 +180,6 @@ msgstr "Draw radial progress" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "Ray Marching" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/es.po b/resources/po/es.po index 834cad1..31a5ea7 100755 --- a/resources/po/es.po +++ b/resources/po/es.po @@ -168,3 +168,6 @@ msgstr "Dibujo progreso radial" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "trazado de rayos" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/fi.po b/resources/po/fi.po index 811425b..1be314f 100755 --- a/resources/po/fi.po +++ b/resources/po/fi.po @@ -168,3 +168,6 @@ msgstr "Piirustus radial edistyminen" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "Ray marssi" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/ko.po b/resources/po/ko.po index 97da858..498cbf7 100755 --- a/resources/po/ko.po +++ b/resources/po/ko.po @@ -168,3 +168,6 @@ msgstr "방사형 진행 상황 그리기" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "레이 마칭" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/ml.po b/resources/po/ml.po index 88e1b29..fefc46d 100755 --- a/resources/po/ml.po +++ b/resources/po/ml.po @@ -168,3 +168,6 @@ msgstr "റേഡിയൽ പുരോഗതി ഡ്രോയിംഗ msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "ലൈറ്റ് മാർച്ചിംഗ്" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/ur.po b/resources/po/ur.po index cab8aba..24bb67e 100755 --- a/resources/po/ur.po +++ b/resources/po/ur.po @@ -168,3 +168,6 @@ msgstr "ریڈیل پیش رفت ڈرائنگ" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "رے چلتے" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/resources/po/zn_CH.po b/resources/po/zn_CH.po index 272a4fb..116d2ce 100755 --- a/resources/po/zn_CH.po +++ b/resources/po/zn_CH.po @@ -168,3 +168,6 @@ msgstr "绘制径向进度" msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING" msgstr "射线行军" + +msgid "DALI_DEMO_STR_TITLE_SKYBOX" +msgstr "Skybox" diff --git a/shared/dali-demo-strings.h b/shared/dali-demo-strings.h index 5a8a1b8..adc0bca 100644 --- a/shared/dali-demo-strings.h +++ b/shared/dali-demo-strings.h @@ -81,6 +81,7 @@ extern "C" #define DALI_DEMO_STR_TITLE_SIMPLE_VISUALS_CONTROL dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_SIMPLE_VISUALS") #define DALI_DEMO_STR_TITLE_SCRIPT_BASED_UI dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_SCRIPT_BASED_UI") #define DALI_DEMO_STR_TITLE_SCROLL_VIEW dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_SCROLL_VIEW") +#define DALI_DEMO_STR_TITLE_SKYBOX dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_SKYBOX") #define DALI_DEMO_STR_TITLE_SPARKLE dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_SPARKLE") #define DALI_DEMO_STR_TITLE_STYLING dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_STYLING") #define DALI_DEMO_STR_TITLE_TEXTURED_MESH dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_TEXTURED_MESH") @@ -144,6 +145,7 @@ extern "C" #define DALI_DEMO_STR_TITLE_SIMPLE_VISUALS_CONTROL "Simple Visuals Control" #define DALI_DEMO_STR_TITLE_SCRIPT_BASED_UI "Script Based UI" #define DALI_DEMO_STR_TITLE_SCROLL_VIEW "Scroll View" +#define DALI_DEMO_STR_TITLE_SKYBOX "Skybox" #define DALI_DEMO_STR_TITLE_SPARKLE "Sparkle" #define DALI_DEMO_STR_TITLE_STYLING "Styling" #define DALI_DEMO_STR_TITLE_TEXTURED_MESH "Mesh Texture"