New point and line demos 35/38035/5
authorDavid Steele <david.steele@partner.samsung.com>
Thu, 9 Apr 2015 18:12:28 +0000 (19:12 +0100)
committerDavid Steele <david.steele@partner.samsung.com>
Tue, 14 Apr 2015 13:41:58 +0000 (14:41 +0100)
The point demo shows off multiple points each using a morph from one
sampler to another, and applying a hue to each point based on it's
angle.

The line demo shows off morphing between two position buffers.

The textured demo shows a single geometry being used by 2 different
renderers each with a different material, and also shows off uniform
mapping by animating a "fade-color" property which is mapped to a
"uFadeColor" uniform.

Change-Id: I53c0ed2f3849dffd4b9461f07bbce75308811d9b
Signed-off-by: David Steele <david.steele@partner.samsung.com>
examples/line-mesh/line-mesh-example.cpp [new file with mode: 0644]
examples/point-mesh/point-mesh-example.cpp [new file with mode: 0644]
examples/textured-mesh/textured-mesh-example.cpp [moved from examples/mesh/mesh-example.cpp with 89% similarity]

diff --git a/examples/line-mesh/line-mesh-example.cpp b/examples/line-mesh/line-mesh-example.cpp
new file mode 100644 (file)
index 0000000..07e1f86
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) 2015 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.
+ *
+ */
+
+// EXTERNAL INCLUDES
+
+// INTERNAL INCLUDES
+#include "shared/view.h"
+
+#include <dali-toolkit/dali-toolkit.h>
+
+using namespace Dali;
+
+namespace
+{
+const char* MATERIAL_SAMPLE( DALI_IMAGE_DIR "gallery-small-48.jpg" );
+const char* MATERIAL_SAMPLE2( DALI_IMAGE_DIR "gallery-medium-19.jpg" );
+
+#define MAKE_SHADER(A)#A
+
+const char* VERTEX_SHADER = MAKE_SHADER(
+attribute mediump vec2    aPosition1;
+attribute mediump vec2    aPosition2;
+uniform   mediump mat4    uMvpMatrix;
+uniform   mediump vec3    uSize;
+uniform   mediump float   uMorphAmount;
+
+void main()
+{
+  mediump vec2 morphPosition = mix(aPosition1, aPosition2, uMorphAmount);
+  mediump vec4 vertexPosition = vec4(morphPosition, 0.0, 1.0);
+  vertexPosition.xyz *= uSize;
+  vertexPosition = uMvpMatrix * vertexPosition;
+  gl_Position = vertexPosition;
+}
+);
+
+const char* FRAGMENT_SHADER = MAKE_SHADER(
+uniform lowp  vec4    uColor;
+uniform sampler2D     sTexture;
+
+void main()
+{
+  gl_FragColor = uColor;
+}
+);
+
+Geometry CreateGeometry()
+{
+  // Create vertices
+  struct Vertex { Vector2 position; };
+  Vertex pentagonVertexData[5] =
+    {
+      { Vector2(  0.0f,   1.00f) }, // 0
+      { Vector2( -0.95f,  0.31f) }, // 1
+      { Vector2( -0.59f, -0.81f) }, // 2
+      { Vector2(  0.59f, -0.81f) }, // 3
+      { Vector2(  0.95f,  0.31f) }, // 4
+    };
+
+  Vertex pentacleVertexData[5] =
+    {
+      { Vector2(  0.0f,  -1.00f) }, //
+      { Vector2(  0.59f,  0.81f) }, //
+      { Vector2( -0.95f, -0.31f) }, //
+      { Vector2(  0.95f, -0.31f) }, //
+      { Vector2( -0.59f,  0.81f) }, //
+    };
+
+  Property::Map pentagonVertexFormat;
+  pentagonVertexFormat["aPosition1"] = Property::VECTOR2;
+  PropertyBuffer pentagonVertices = PropertyBuffer::New( PropertyBuffer::STATIC, pentagonVertexFormat, 5 );
+  pentagonVertices.SetData(pentagonVertexData);
+
+  Property::Map pentacleVertexFormat;
+  pentacleVertexFormat["aPosition2"] = Property::VECTOR2;
+  PropertyBuffer pentacleVertices = PropertyBuffer::New( PropertyBuffer::STATIC, pentacleVertexFormat, 5 );
+  pentacleVertices.SetData(pentacleVertexData);
+
+  // Create indices
+  unsigned short indexData[10] = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 0 };
+  Property::Map indexFormat;
+  indexFormat["indices"] = Property::UNSIGNED_INTEGER;
+  PropertyBuffer indices = PropertyBuffer::New( PropertyBuffer::STATIC, indexFormat, 5 );
+  indices.SetData(indexData);
+
+  // Create the geometry object
+  Geometry pentagonGeometry = Geometry::New();
+  pentagonGeometry.AddVertexBuffer( pentagonVertices );
+  pentagonGeometry.AddVertexBuffer( pentacleVertices );
+  pentagonGeometry.SetIndexBuffer( indices );
+
+  pentagonGeometry.SetGeometryType( Geometry::LINES );
+
+  return pentagonGeometry;
+}
+
+} // anonymous namespace
+
+// This example shows how to morph between 2 meshes with the same number of
+// vertices.
+class ExampleController : public ConnectionTracker
+{
+public:
+
+  /**
+   * The example controller constructor.
+   * @param[in] application The application instance
+   */
+  ExampleController( Application& application )
+  : mApplication( application )
+  {
+    // Connect to the Application's Init signal
+    mApplication.InitSignal().Connect( this, &ExampleController::Create );
+  }
+
+  /**
+   * The example controller destructor
+   */
+  ~ExampleController()
+  {
+    // Nothing to do here;
+  }
+
+  /**
+   * Invoked upon creation of application
+   * @param[in] application The application instance
+   */
+  void Create( Application& application )
+  {
+    Stage stage = Stage::GetCurrent();
+    stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
+
+    mStageSize = stage.GetSize();
+
+    // The Init signal is received once (only) during the Application lifetime
+
+    // Hide the indicator bar
+    application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
+
+    mImage = ResourceImage::New( MATERIAL_SAMPLE );
+    mSampler = Sampler::New(mImage, "sTexture");
+    mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
+
+    mMaterial = Material::New( mShader );
+    mMaterial.AddSampler( mSampler );
+
+    mGeometry = CreateGeometry();
+
+    mRenderer = Renderer::New( mGeometry, mMaterial );
+
+    mMeshActor = Actor::New();
+    mMeshActor.AddRenderer( mRenderer );
+    mMeshActor.SetSize(200, 200);
+
+    Property::Index morphAmountIndex = mMeshActor.RegisterProperty( "morph-amount", 0.0f );
+    mMeshActor.AddUniformMapping( morphAmountIndex, std::string("uMorphAmount") );
+
+    mRenderer.SetDepthIndex(0);
+
+    mMeshActor.SetParentOrigin( ParentOrigin::CENTER );
+    mMeshActor.SetAnchorPoint( AnchorPoint::CENTER );
+    stage.Add( mMeshActor );
+
+    mChangeImageTimer = Timer::New( 5000 );
+    mChangeImageTimer.TickSignal().Connect( this, &ExampleController::OnTimer );
+    mChangeImageTimer.Start();
+
+    Animation  animation = Animation::New(5);
+    KeyFrames keyFrames = KeyFrames::New();
+    keyFrames.Add(0.0f, 0.0f);
+    keyFrames.Add(1.0f, 1.0f);
+
+    animation.AnimateBetween( Property( mMeshActor, morphAmountIndex ), keyFrames, AlphaFunctions::Sin );
+    animation.SetLooping(true);
+    animation.Play();
+
+    stage.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f));;
+  }
+
+  /**
+   * Invoked whenever the quit button is clicked
+   * @param[in] button the quit button
+   */
+  bool OnQuitButtonClicked( Toolkit::Button button )
+  {
+    // quit the application
+    mApplication.Quit();
+    return true;
+  }
+
+  bool OnTimer()
+  {
+    Image image = ResourceImage::New( MATERIAL_SAMPLE2 );
+    mSampler.SetImage( image );
+    return false;
+  }
+
+  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();
+      }
+    }
+  }
+
+private:
+
+  Application&  mApplication;                             ///< Application instance
+  Vector3 mStageSize;                                     ///< The size of the stage
+
+  Image    mImage;
+  Sampler  mSampler;
+  Shader   mShader;
+  Material mMaterial;
+  Geometry mGeometry;
+  Renderer mRenderer;
+  Actor    mMeshActor;
+  Renderer mRenderer2;
+  Actor    mMeshActor2;
+  Timer    mChangeImageTimer;
+};
+
+void RunTest( Application& application )
+{
+  ExampleController test( application );
+
+  application.MainLoop();
+}
+
+// Entry point for Linux & SLP applications
+//
+int main( int argc, char **argv )
+{
+  Application application = Application::New( &argc, &argv );
+
+  RunTest( application );
+
+  return 0;
+}
diff --git a/examples/point-mesh/point-mesh-example.cpp b/examples/point-mesh/point-mesh-example.cpp
new file mode 100644 (file)
index 0000000..80a6ad0
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 2015 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.
+ *
+ */
+
+// EXTERNAL INCLUDES
+
+// INTERNAL INCLUDES
+#include "shared/view.h"
+
+#include <dali-toolkit/dali-toolkit.h>
+
+using namespace Dali;
+
+namespace
+{
+const char* MATERIAL_SAMPLE( DALI_IMAGE_DIR "gallery-small-48.jpg" );
+const char* MATERIAL_SAMPLE2( DALI_IMAGE_DIR "gallery-medium-19.jpg" );
+
+#define MAKE_SHADER(A)#A
+
+const char* VERTEX_SHADER = MAKE_SHADER(
+attribute mediump vec2    aPosition;
+attribute highp   float   aHue;
+varying   mediump vec2    vTexCoord;
+uniform   mediump mat4    uMvpMatrix;
+uniform   mediump vec3    uSize;
+uniform   lowp    vec4    uFadeColor;
+varying   mediump vec3    vVertexColor;
+varying   mediump float   vHue;
+
+vec3 hsv2rgb(vec3 c)
+{
+  vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+  vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
+  return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+}
+
+void main()
+{
+  mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);
+  vertexPosition.xyz *= uSize;
+  vertexPosition = uMvpMatrix * vertexPosition;
+  vVertexColor = hsv2rgb( vec3( aHue, 0.6, 0.7 ) );
+  vHue = aHue;
+  gl_PointSize = 80.0;
+  gl_Position = vertexPosition;
+}
+);
+
+const char* FRAGMENT_SHADER = MAKE_SHADER(
+varying mediump vec3  vVertexColor;
+varying mediump float vHue;
+uniform lowp  vec4    uColor;
+uniform sampler2D     sTexture1;
+uniform sampler2D     sTexture2;
+uniform lowp vec4     uFadeColor;
+
+void main()
+{
+  mediump vec4 texCol1 = texture2D(sTexture1, gl_PointCoord);
+  mediump vec4 texCol2 = texture2D(sTexture2, gl_PointCoord);
+  gl_FragColor = vec4(vVertexColor, 1.0) * ((texCol1*vHue) + (texCol2*(1.0-vHue)));
+}
+);
+
+Geometry CreateGeometry()
+{
+  // Create vertices
+  struct Vertex { Vector2 position; float hue; };
+
+  unsigned int numSides = 20;
+  Vertex polyhedraVertexData[numSides];
+  float angle=0;
+  float sectorAngle = 2.0f * Math::PI / (float) numSides;
+  for(unsigned int i=0; i<numSides; ++i)
+  {
+    polyhedraVertexData[i].position.x = sinf(angle);
+    polyhedraVertexData[i].position.y = cosf(angle);
+    polyhedraVertexData[i].hue = angle / ( 2.0f * Math::PI);
+    angle += sectorAngle;
+  }
+
+  Property::Map polyhedraVertexFormat;
+  polyhedraVertexFormat["aPosition"] = Property::VECTOR2;
+  polyhedraVertexFormat["aHue"] = Property::FLOAT;
+  PropertyBuffer polyhedraVertices = PropertyBuffer::New( PropertyBuffer::STATIC, polyhedraVertexFormat, numSides );
+  polyhedraVertices.SetData(polyhedraVertexData);
+
+  // Create the geometry object
+  Geometry polyhedraGeometry = Geometry::New();
+  polyhedraGeometry.AddVertexBuffer( polyhedraVertices );
+  polyhedraGeometry.SetGeometryType( Geometry::POINTS );
+
+  return polyhedraGeometry;
+}
+
+} // anonymous namespace
+
+// This example shows how to use a simple mesh
+//
+class ExampleController : public ConnectionTracker
+{
+public:
+
+  /**
+   * The example controller constructor.
+   * @param[in] application The application instance
+   */
+  ExampleController( Application& application )
+  : mApplication( application )
+  {
+    // Connect to the Application's Init signal
+    mApplication.InitSignal().Connect( this, &ExampleController::Create );
+  }
+
+  /**
+   * The example controller destructor
+   */
+  ~ExampleController()
+  {
+    // Nothing to do here;
+  }
+
+  /**
+   * Invoked upon creation of application
+   * @param[in] application The application instance
+   */
+  void Create( Application& application )
+  {
+    Stage stage = Stage::GetCurrent();
+    stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
+
+    mStageSize = stage.GetSize();
+
+    // The Init signal is received once (only) during the Application lifetime
+
+    // Hide the indicator bar
+    application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
+
+    mImage = ResourceImage::New( MATERIAL_SAMPLE );
+    Image image = ResourceImage::New( MATERIAL_SAMPLE2 );
+    mSampler1 = Sampler::New(mImage, "sTexture1");
+    mSampler2 = Sampler::New(image, "sTexture2");
+
+    mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
+
+    mMaterial = Material::New( mShader );
+    mMaterial.AddSampler( mSampler1 );
+    mMaterial.AddSampler( mSampler2 );
+
+    mGeometry = CreateGeometry();
+
+    mRenderer = Renderer::New( mGeometry, mMaterial );
+
+    mMeshActor = Actor::New();
+    mMeshActor.AddRenderer( mRenderer );
+    mMeshActor.SetSize(200, 200);
+
+    Property::Index fadeColorIndex = mMeshActor.RegisterProperty( "fade-color", Color::GREEN );
+    mMeshActor.AddUniformMapping( fadeColorIndex, std::string("uFadeColor") );
+
+    fadeColorIndex = mRenderer.RegisterProperty( "fade-color", Color::MAGENTA );
+    mRenderer.AddUniformMapping( fadeColorIndex, std::string("uFadeColor" ) );
+    mRenderer.SetDepthIndex(0);
+
+    mMeshActor.SetParentOrigin( ParentOrigin::CENTER );
+    mMeshActor.SetAnchorPoint( AnchorPoint::CENTER );
+    stage.Add( mMeshActor );
+
+    Animation  animation = Animation::New(15);
+    KeyFrames keyFrames = KeyFrames::New();
+    keyFrames.Add(0.0f, Vector4::ZERO);
+    keyFrames.Add(1.0f, Vector4( 1.0f, 0.0f, 1.0f, 1.0f ));
+
+    animation.RotateBy( mMeshActor, Degree(360), Vector3::ZAXIS );
+
+    animation.SetLooping(true);
+    animation.Play();
+
+    stage.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f));;
+  }
+
+  /**
+   * Invoked whenever the quit button is clicked
+   * @param[in] button the quit button
+   */
+  bool OnQuitButtonClicked( Toolkit::Button button )
+  {
+    // quit the application
+    mApplication.Quit();
+    return true;
+  }
+
+  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();
+      }
+    }
+  }
+
+private:
+
+  Application&  mApplication;                             ///< Application instance
+  Vector3 mStageSize;                                     ///< The size of the stage
+
+  Image    mImage;
+  Sampler  mSampler1;
+  Sampler  mSampler2;
+  Shader   mShader;
+  Material mMaterial;
+  Geometry mGeometry;
+  Renderer mRenderer;
+  Actor    mMeshActor;
+  Renderer mRenderer2;
+  Actor    mMeshActor2;
+  Timer    mChangeImageTimer;
+};
+
+void RunTest( Application& application )
+{
+  ExampleController test( application );
+
+  application.MainLoop();
+}
+
+// Entry point for Linux & SLP applications
+//
+int main( int argc, char **argv )
+{
+  Application application = Application::New( &argc, &argv );
+
+  RunTest( application );
+
+  return 0;
+}
similarity index 89%
rename from examples/mesh/mesh-example.cpp
rename to examples/textured-mesh/textured-mesh-example.cpp
index 5702436..f8752ea 100644 (file)
@@ -27,6 +27,7 @@ using namespace Dali;
 namespace
 {
 const char* MATERIAL_SAMPLE( DALI_IMAGE_DIR "gallery-small-48.jpg" );
+const char* MATERIAL_SAMPLE2( DALI_IMAGE_DIR "gallery-medium-19.jpg" );
 
 #define MAKE_SHADER(A)#A
 
@@ -50,9 +51,9 @@ void main()
 
 const char* FRAGMENT_SHADER = MAKE_SHADER(
 varying mediump vec2  vTexCoord;
-uniform lowp  vec4    uColor;
+uniform lowp    vec4  uColor;
 uniform sampler2D     sTexture;
-uniform   lowp    vec4    uFadeColor;
+uniform lowp    vec4  uFadeColor;
 
 void main()
 {
@@ -62,7 +63,6 @@ void main()
 
 Geometry CreateGeometry()
 {
-
   // Create vertices
   const float halfQuadSize = .5f;
   struct TexturedQuadVertex { Vector2 position; Vector2 textureCoordinates; };
@@ -74,7 +74,7 @@ Geometry CreateGeometry()
 
   Property::Map texturedQuadVertexFormat;
   texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
-  texturedQuadVertexFormat["aVertexCoord"] = Property::VECTOR2;
+  texturedQuadVertexFormat["aTexCoord"] = Property::VECTOR2;
   PropertyBuffer texturedQuadVertices = PropertyBuffer::New( PropertyBuffer::STATIC, texturedQuadVertexFormat, 4 );
   texturedQuadVertices.SetData(texturedQuadVertexData);
 
@@ -137,15 +137,22 @@ public:
     application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
 
     mImage = ResourceImage::New( MATERIAL_SAMPLE );
-    mSampler = Sampler::New(mImage, "sTexture");
+    mSampler1 = Sampler::New(mImage, "sTexture");
+
+    Image image = ResourceImage::New( MATERIAL_SAMPLE2 );
+    mSampler2 = Sampler::New(image, "sTexture");
+
     mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
 
-    mMaterial = Material::New( mShader );
-    mMaterial.AddSampler( mSampler );
+    mMaterial1 = Material::New( mShader );
+    mMaterial1.AddSampler( mSampler1 );
+
+    mMaterial2 = Material::New( mShader );
+    mMaterial2.AddSampler( mSampler2);
 
     mGeometry = CreateGeometry();
 
-    mRenderer = Renderer::New( mGeometry, mMaterial );
+    mRenderer = Renderer::New( mGeometry, mMaterial1 );
 
     mMeshActor = Actor::New();
     mMeshActor.AddRenderer( mRenderer );
@@ -162,8 +169,7 @@ public:
     mMeshActor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
     stage.Add( mMeshActor );
 
-
-    mRenderer2 = Renderer::New( mGeometry, mMaterial );
+    mRenderer2 = Renderer::New( mGeometry, mMaterial2 );
 
     mMeshActor2 = Actor::New();
     mMeshActor2.AddRenderer( mRenderer2 );
@@ -174,7 +180,7 @@ public:
     mMeshActor2.AddUniformMapping( fadeColorIndex2, std::string("uFadeColor") );
 
     mRenderer2.RegisterProperty( "a-n-other-property", Vector3::ZERO );
-    mRenderer2.RegisterProperty( "winning-formula", 8008.135f );
+    mRenderer2.RegisterProperty( "a-coefficient", 0.008f );
     fadeColorIndex2 = mRenderer2.RegisterProperty( "another-fade-color", Color::GREEN );
     mRenderer2.AddUniformMapping( fadeColorIndex2, std::string("uFadeColor" ) );
     mRenderer2.SetDepthIndex(0);
@@ -183,7 +189,6 @@ public:
     mMeshActor2.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
     stage.Add( mMeshActor2 );
 
-
     Animation  animation = Animation::New(5);
     KeyFrames keyFrames = KeyFrames::New();
     keyFrames.Add(0.0f, Vector4::ZERO);
@@ -229,14 +234,17 @@ private:
   Vector3 mStageSize;                                     ///< The size of the stage
 
   Image    mImage;
-  Sampler  mSampler;
+  Sampler  mSampler1;
+  Sampler  mSampler2;
   Shader   mShader;
-  Material mMaterial;
+  Material mMaterial1;
+  Material mMaterial2;
   Geometry mGeometry;
   Renderer mRenderer;
   Actor    mMeshActor;
   Renderer mRenderer2;
   Actor    mMeshActor2;
+  Timer    mChangeImageTimer;
 };
 
 void RunTest( Application& application )