--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
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* 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()
{
Geometry CreateGeometry()
{
-
// Create vertices
const float halfQuadSize = .5f;
struct TexturedQuadVertex { Vector2 position; Vector2 textureCoordinates; };
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);
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 );
mMeshActor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
stage.Add( mMeshActor );
-
- mRenderer2 = Renderer::New( mGeometry, mMaterial );
+ mRenderer2 = Renderer::New( mGeometry, mMaterial2 );
mMeshActor2 = Actor::New();
mMeshActor2.AddRenderer( mRenderer2 );
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);
mMeshActor2.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
stage.Add( mMeshActor2 );
-
Animation animation = Animation::New(5);
KeyFrames keyFrames = KeyFrames::New();
keyFrames.Add(0.0f, Vector4::ZERO);
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 )