Merge branch 'devel/master' into tizen 61/132661/1 accepted/tizen/unified/20170608.072244 submit/tizen/20170607.061735
authorminho.sun <minho.sun@samsung.com>
Wed, 7 Jun 2017 03:15:18 +0000 (12:15 +0900)
committerminho.sun <minho.sun@samsung.com>
Wed, 7 Jun 2017 05:58:02 +0000 (14:58 +0900)
Change-Id: I8da619e6557a2bdb0f9e9dfd276164d1bf335640

31 files changed:
com.samsung.dali-demo.xml
demo/dali-demo.cpp
examples/mesh-visual/mesh-visual-example.cpp
examples/primitive-shapes/primitive-shapes-example.cpp
examples/rendering-skybox/look-camera.cpp [new file with mode: 0644]
examples/rendering-skybox/look-camera.h [new file with mode: 0644]
examples/rendering-skybox/rendering-skybox.cpp [new file with mode: 0644]
examples/text-field/text-field-example.cpp
examples/text-scrolling/text-scrolling-example.cpp
examples/transitions/shadow-button-impl.cpp
examples/visual-transitions/beat-control-impl.cpp
examples/visual-transitions/beat-control-impl.h
examples/visual-transitions/transition-application.cpp
packaging/com.samsung.dali-demo.spec
resources/images/lake_back.jpg [new file with mode: 0644]
resources/images/lake_bottom.jpg [new file with mode: 0644]
resources/images/lake_front.jpg [new file with mode: 0644]
resources/images/lake_left.jpg [new file with mode: 0644]
resources/images/lake_right.jpg [new file with mode: 0644]
resources/images/lake_top.jpg [new file with mode: 0644]
resources/po/as.po
resources/po/de.po
resources/po/en_GB.po
resources/po/en_US.po
resources/po/es.po
resources/po/fi.po
resources/po/ko.po
resources/po/ml.po
resources/po/ur.po
resources/po/zn_CH.po
shared/dali-demo-strings.h

index 9dab573..a71c9a3 100644 (file)
        <ui-application appid="rendering-basic-light.example" exec="/usr/apps/com.samsung.dali-demo/bin/rendering-basic-light.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true">
                <label>Basic Light</label>
        </ui-application>
+       <ui-application appid="rendering-skybox.example" exec="/usr/apps/com.samsung.dali-demo/bin/rendering-skybox.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true">
+               <label>Skybox</label>
+       </ui-application>
 </manifest>
index 566c57e..093a2f2 100644 (file)
@@ -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 );
 
index 341a72c..4b9fb23 100644 (file)
@@ -1,5 +1,7 @@
 #include <dali-toolkit/dali-toolkit.h>
 #include <dali/public-api/object/property-map.h>
+#include <dali-toolkit/devel-api/align-enums.h>
+#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 
 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 );
index cc762be..cce4f3c 100644 (file)
@@ -17,7 +17,9 @@
 
 #include <dali-toolkit/dali-toolkit.h>
 #include <dali/public-api/object/property-map.h>
+#include <dali-toolkit/devel-api/align-enums.h>
 #include <dali-toolkit/devel-api/controls/buttons/button-devel.h>
+#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 #include <dali-toolkit/public-api/controls/slider/slider.h>
 
 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 (file)
index 0000000..9e6cf00
--- /dev/null
@@ -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 <dali/public-api/common/stage.h>
+#include <dali/public-api/render-tasks/render-task-list.h>
+#include <dali/public-api/render-tasks/render-task.h>
+#include <dali/public-api/events/touch-data.h>
+#include <dali/public-api/events/touch-event.h>
+
+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 (file)
index 0000000..6cd3a60
--- /dev/null
@@ -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 <dali/public-api/actors/camera-actor.h>
+#include <dali/public-api/adaptor-framework/timer.h>
+#include <dali/public-api/math/vector2.h>
+
+/**
+ * @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 (file)
index 0000000..420ac61
--- /dev/null
@@ -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 <dali/dali.h>
+#include <dali-toolkit/dali-toolkit.h>
+
+#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;
+}
index 944cb71..9462657 100644 (file)
@@ -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;
index 709dce0..872f289 100644 (file)
@@ -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
index edcfbec..135ea16 100644 (file)
@@ -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;
       }
     }
index d160e5b..54ae6b0 100644 (file)
 #include "beat-control-impl.h"
 #include <dali-toolkit/dali-toolkit.h>
 #include <dali/public-api/object/type-registry-helper.h>
-#include <dali-toolkit/devel-api/align-enums.h>
 #include <dali-toolkit/devel-api/controls/control-devel.h>
 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 
-#include <cstdio>
-
 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 );
index 7138a8e..7e77def 100644 (file)
@@ -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 <dali/public-api/animation/animation.h>
 #include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/devel-api/align-enums.h>
 #include <dali-toolkit/devel-api/visual-factory/visual-base.h>
 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
 
@@ -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;
 };
 
index 7094d14..87a69d5 100644 (file)
@@ -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");
index 4bedd00..e9f5d79 100755 (executable)
@@ -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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
index 0000000..4db3c2a
Binary files /dev/null and b/resources/images/lake_top.jpg differ
index 66f9e46..b4e4000 100755 (executable)
@@ -168,3 +168,6 @@ msgstr "রশ্মীয় অগ্রগতি অঙ্কন"
 
 msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING"
 msgstr "রে মার্চিং"
+
+msgid "DALI_DEMO_STR_TITLE_SKYBOX"
+msgstr "Skybox"
index dc1c7cb..fe66ac4 100755 (executable)
@@ -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"
index 8ccd957..4c9c8f1 100755 (executable)
@@ -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"
index 9c8447a..ee9e456 100755 (executable)
@@ -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"
index 834cad1..31a5ea7 100755 (executable)
@@ -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"
index 811425b..1be314f 100755 (executable)
@@ -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"
index 97da858..498cbf7 100755 (executable)
@@ -168,3 +168,6 @@ msgstr "방사형 진행 상황 그리기"
 
 msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING"
 msgstr "레이 마칭"
+
+msgid "DALI_DEMO_STR_TITLE_SKYBOX"
+msgstr "Skybox"
index 88e1b29..fefc46d 100755 (executable)
@@ -168,3 +168,6 @@ msgstr "റേഡിയൽ പുരോഗതി ഡ്രോയിംഗ
 
 msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING"
 msgstr "ലൈറ്റ് മാർച്ചിംഗ്"
+
+msgid "DALI_DEMO_STR_TITLE_SKYBOX"
+msgstr "Skybox"
index cab8aba..24bb67e 100755 (executable)
@@ -168,3 +168,6 @@ msgstr "ریڈیل پیش رفت ڈرائنگ"
 
 msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING"
 msgstr "رے چلتے"
+
+msgid "DALI_DEMO_STR_TITLE_SKYBOX"
+msgstr "Skybox"
index 272a4fb..116d2ce 100755 (executable)
@@ -168,3 +168,6 @@ msgstr "绘制径向进度"
 
 msgid "DALI_DEMO_STR_TITLE_RENDERING_RAY_MARCHING"
 msgstr "射线行军"
+
+msgid "DALI_DEMO_STR_TITLE_SKYBOX"
+msgstr "Skybox"
index 5a8a1b8..adc0bca 100644 (file)
@@ -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"