Commit 8d10a2d0f9e9adb56a41a258c73a818eca4f0b4e

Authored by Francisco Santos
2 parents dd6838fe 48eeaf18

Merge branch 'devel/new_mesh' into devel/master

Change-Id: I84faa5b88e6cca8f606c5f32d8fb5e18ce0ce27c
demo/dali-demo.cpp
... ... @@ -57,11 +57,13 @@ int main(int argc, char **argv)
57 57 demo.AddExample(Example("text-label.example", DALI_DEMO_STR_TITLE_TEXT_LABEL));
58 58 demo.AddExample(Example("text-label-multi-language.example", DALI_DEMO_STR_TITLE_TEXT_LABEL_MULTI_LANGUAGE));
59 59 demo.AddExample(Example("text-label-emojis.example", DALI_DEMO_STR_TITLE_EMOJI_TEXT));
60   - demo.AddExample(Example("animated-shapes.example", DALI_DEMO_STR_TITLE_ANIMATED_SHAPES));
61   - demo.AddExample(Example("path-animation.example", DALI_DEMO_STR_TITLE_PATH_ANIMATION));
62 60 demo.AddExample(Example("size-negotiation.example", DALI_DEMO_STR_TITLE_NEGOTIATE_SIZE));
63 61 demo.AddExample(Example("buttons.example", DALI_DEMO_STR_TITLE_BUTTONS));
64 62 demo.AddExample(Example("logging.example", DALI_DEMO_STR_TITLE_LOGGING));
  63 + demo.AddExample(Example("mesh-morph.example", DALI_DEMO_STR_TITLE_MESH_MORPH));
  64 + demo.AddExample(Example("mesh-sorting.example", DALI_DEMO_STR_TITLE_MESH_SORTING));
  65 + demo.AddExample(Example("textured-mesh.example", DALI_DEMO_STR_TITLE_TEXTURED_MESH));
  66 + demo.AddExample(Example("line-mesh.example", DALI_DEMO_STR_TITLE_LINE_MESH));
65 67  
66 68 demo.SortAlphabetically( true );
67 69  
... ...
demo/dali-table-view.cpp
... ... @@ -268,9 +268,11 @@ void DaliTableView::Initialize( Application& application )
268 268 mScrollView.TouchedSignal().Connect( this, &DaliTableView::OnScrollTouched );
269 269  
270 270 mScrollViewLayer = Layer::New();
  271 +
  272 + // Disable the depth test for performance
  273 + mScrollViewLayer.SetDepthTestDisabled( true );
271 274 mScrollViewLayer.SetAnchorPoint( AnchorPoint::CENTER );
272 275 mScrollViewLayer.SetParentOrigin( ParentOrigin::CENTER );
273   - mScrollViewLayer.SetDrawMode( DrawMode::OVERLAY );
274 276 mScrollViewLayer.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
275 277  
276 278 // Create solid background colour.
... ... @@ -279,7 +281,9 @@ void DaliTableView::Initialize( Application& application )
279 281 backgroundColourActor.SetParentOrigin( ParentOrigin::CENTER );
280 282 backgroundColourActor.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS );
281 283 backgroundColourActor.SetSizeModeFactor( Vector3( 1.0f, 1.5f, 1.0f ) );
282   - backgroundColourActor.SetZ( BACKGROUND_Z );
  284 +
  285 + // Force the filled background right to the back
  286 + backgroundColourActor.SetSortModifier( DemoHelper::BACKGROUND_DEPTH_INDEX );
283 287 mScrollViewLayer.Add( backgroundColourActor );
284 288  
285 289 // Populate background and bubbles - needs to be scrollViewLayer so scroll ends show
... ... @@ -526,7 +530,7 @@ ImageActor DaliTableView::NewStencilImage()
526 530 stencilActor.SetAnchorPoint( AnchorPoint::CENTER );
527 531 stencilActor.SetDrawMode( DrawMode::STENCIL );
528 532  
529   - Dali::ShaderEffect shaderEffect = AlphaDiscardEffect::New();
  533 + Dali::ShaderEffect shaderEffect = CreateAlphaDiscardEffect();
530 534 stencilActor.SetShaderEffect( shaderEffect );
531 535  
532 536 return stencilActor;
... ... @@ -764,11 +768,14 @@ void DaliTableView::AddBackgroundActors( Actor layer, int count, BufferImage dis
764 768 dfActor.SetSize( Vector2( randSize, randSize ) );
765 769 dfActor.SetParentOrigin( ParentOrigin::CENTER );
766 770  
767   - Toolkit::DistanceFieldEffect effect = Toolkit::DistanceFieldEffect::New();
  771 + // Force the bubbles just in front of the solid background
  772 + dfActor.SetSortModifier( DemoHelper::BACKGROUND_DEPTH_INDEX + 1 );
  773 +
  774 + ShaderEffect effect = Toolkit::CreateDistanceFieldEffect();
768 775 dfActor.SetShaderEffect( effect );
769 776 dfActor.SetColor( randColour );
770   - effect.SetOutlineParams( Vector2( 0.55f, 0.00f ) );
771   - effect.SetSmoothingEdge( 0.5f );
  777 + effect.SetUniform("uOutlineParams", Vector2( 0.55f, 0.00f ) );
  778 + effect.SetUniform("uSmoothing", 0.5f );
772 779 layer.Add( dfActor );
773 780 }
774 781  
... ...
examples/animated-shapes/animated-shapes-example.cpp deleted
1   -/*
2   - * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3   - *
4   - * Licensed under the Apache License, Version 2.0 (the "License");
5   - * you may not use this file except in compliance with the License.
6   - * You may obtain a copy of the License at
7   - *
8   - * http://www.apache.org/licenses/LICENSE-2.0
9   - *
10   - * Unless required by applicable law or agreed to in writing, software
11   - * distributed under the License is distributed on an "AS IS" BASIS,
12   - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   - * See the License for the specific language governing permissions and
14   - * limitations under the License.
15   - *
16   - */
17   -
18   -#include <dali/dali.h>
19   -#include <dali-toolkit/dali-toolkit.h>
20   -#include <dali/devel-api/actors/mesh-actor.h>
21   -#include <dali/devel-api/geometry/mesh.h>
22   -#include <dali-toolkit/devel-api/shader-effects/quadratic-bezier.h>
23   -
24   -#include "shared/view.h"
25   -
26   -using namespace Dali;
27   -
28   -namespace
29   -{
30   -const char* BACKGROUND_IMAGE( DALI_IMAGE_DIR "background-gradient.jpg" );
31   -
32   -}
33   -
34   -// This example shows resolution independent rendering and animation of curves using the gpu.
35   -//
36   -class AnimatedShapesExample : public ConnectionTracker
37   -{
38   -public:
39   -
40   - AnimatedShapesExample( Application& application )
41   -: mApplication( application )
42   -{
43   - // Connect to the Application's Init signal
44   - mApplication.InitSignal().Connect( this, &AnimatedShapesExample::Create );
45   -}
46   -
47   - ~AnimatedShapesExample()
48   - {
49   - // Nothing to do here;
50   - }
51   -
52   - // The Init signal is received once (only) during the Application lifetime
53   - void Create( Application& application )
54   - {
55   - // Get a handle to the stage
56   - Stage stage = Stage::GetCurrent();
57   -
58   - // Create a view
59   - mView = Dali::Toolkit::Control::New();
60   - mView.SetAnchorPoint( Dali::AnchorPoint::CENTER );
61   - mView.SetParentOrigin( Dali::ParentOrigin::CENTER );
62   - mView.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
63   - mView.SetDrawMode( DrawMode::OVERLAY );
64   - stage.Add( mView );
65   -
66   - //Set background image for the view
67   - mView.SetBackgroundImage( ResourceImage::New( BACKGROUND_IMAGE ) );
68   -
69   - CreateTriangleMorph(Vector3( stage.GetSize().x*0.5f,stage.GetSize().y*0.15f,0.0f), 100.0f );
70   - CreateCircleMorph( Vector3( stage.GetSize().x*0.5f,stage.GetSize().y*0.85f,0.0f), 60.0f );
71   - CreatePathMorph( Vector3( stage.GetSize().x*0.5f,stage.GetSize().y*0.5f,0.0f), 55.0f );
72   -
73   -
74   - stage.KeyEventSignal().Connect(this, &AnimatedShapesExample::OnKeyEvent);
75   - }
76   -
77   - void CreateCircleMorph( Vector3 center, float radius )
78   - {
79   - Toolkit::QuadraticBezier shader = Toolkit::QuadraticBezier::New(16, true);
80   -
81   - shader.SetPoint(0, Vector3(-radius,-radius,0.0f));
82   - shader.SetPoint(1, Vector3( 0.0f,-radius,0.0f));
83   - shader.SetPoint(2, Vector3(radius,-radius,0.0f));
84   -
85   - shader.SetPoint(3, Vector3(radius,-radius,0.0f));
86   - shader.SetPoint(4, Vector3( radius,0.0f,0.0f));
87   - shader.SetPoint(5, Vector3(radius,radius,0.0f));
88   -
89   - shader.SetPoint(6, Vector3(radius,radius,0.0f));
90   - shader.SetPoint(7, Vector3( 0.0f,radius,0.0f));
91   - shader.SetPoint(8, Vector3( -radius,radius,0.0f));
92   -
93   - shader.SetPoint(9, Vector3( -radius,radius,0.0f));
94   - shader.SetPoint(10, Vector3( -radius,0.0f,0.0f));
95   - shader.SetPoint(11, Vector3(-radius,-radius,0.0f));
96   -
97   - shader.SetPoint(12, Vector3(-radius,-radius,0.0f));
98   - shader.SetPoint(13, Vector3(radius,-radius,0.0f));
99   - shader.SetPoint(14, Vector3(radius,radius,0.0f));
100   - shader.SetPoint(15, Vector3( -radius,radius,0.0f));
101   -
102   - shader.SetColor(Vector4(1.0f,0.0f,0.0f,1.0f) );
103   - shader.SetLineWidth(2.0f);
104   -
105   - ////Generate the mesh
106   - Dali::MeshData::VertexContainer vertices;
107   - for( unsigned int i(0); i<12; i+=3 )
108   - {
109   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,0.0f,i) ));
110   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.5f,0.0f,i+1)));
111   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(1.0f,1.0f,i+2)));
112   - }
113   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,12) ));
114   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,13)));
115   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,14)));
116   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,15)));
117   -
118   - short unsigned int indexArray[] = { 0,2,1, 3,5,4,6,8,7, 9, 11, 10, 12,15,14,12,14,13};
119   - Dali::MeshData::FaceIndices index( indexArray, indexArray + sizeof(indexArray)/sizeof(short unsigned int) );
120   -
121   - //Material
122   - Dali::Material material = Material::New("Material");
123   - material.SetDiffuseColor( Vector4(1.0f,1.0f,1.0f,1.0f));
124   -
125   - //Create the Mesh object
126   - Dali::MeshData data;
127   - data.SetVertices(vertices);
128   - data.SetFaceIndices( index );
129   - data.SetMaterial( material );
130   - data.SetHasNormals( true );
131   - Mesh mesh = Mesh::New( data );
132   -
133   - //Create the mesh actor
134   - MeshActor meshActor = MeshActor::New(mesh);
135   - meshActor.SetAnchorPoint( AnchorPoint::CENTER );
136   - meshActor.SetShaderEffect(shader);
137   - meshActor.SetPosition( center );
138   - meshActor.SetBlendMode(BlendingMode::ON );
139   - mView.Add( meshActor );
140   -
141   -
142   - //Animation
143   - Animation animation = Animation::New(5.0f);
144   - KeyFrames k0 = KeyFrames::New();
145   - k0.Add( 0.0f, Vector3( 0.0f,-radius, 0.0f) );
146   - k0.Add( 0.5f, Vector3(0.0f, -radius*4.0f, 0.0f));
147   - k0.Add( 1.0f, Vector3( 0.0f,-radius, 0.0f) );
148   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(1)),k0,AlphaFunction::EASE_IN_OUT );
149   -
150   - k0 = KeyFrames::New();
151   - k0.Add( 0.0f, Vector3( radius, 0.0f, 0.0f) );
152   - k0.Add( 0.5f, Vector3(radius*4.0f,0.0f, 0.0f));
153   - k0.Add( 1.0f, Vector3( radius,0.0f, 0.0f));
154   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(4)),k0,AlphaFunction::EASE_IN_OUT );
155   -
156   - k0 = KeyFrames::New();
157   - k0.Add( 0.0f, Vector3(0.0f,radius, 0.0f) );
158   - k0.Add( 0.5f, Vector3(0.0f,radius*4.0f, 0.0f));
159   - k0.Add( 1.0f, Vector3(0.0f,radius, 0.0f) );
160   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(7)),k0,AlphaFunction::EASE_IN_OUT );
161   -
162   - k0 = KeyFrames::New();
163   - k0.Add( 0.0f, Vector3( -radius, 0.0f, 0.0f) );
164   - k0.Add( 0.5f, Vector3(-radius*4.0f,0.0f, 0.0f));
165   - k0.Add( 1.0f, Vector3( -radius, 0.0f, 0.0f) );
166   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(10)),k0,AlphaFunction::EASE_IN_OUT );
167   -
168   - animation.AnimateBy( Property( meshActor, Actor::Property::ORIENTATION ), Quaternion( Radian( Degree(90.0f) ), Vector3::ZAXIS ) );
169   - animation.SetLooping( true );
170   - animation.Play();
171   - }
172   -
173   - void CreateTriangleMorph( Vector3 center, float side )
174   - {
175   - float h = (side *0.5f)/0.866f;
176   -
177   - Vector3 v0 = Vector3(-h,h,0.0f);
178   - Vector3 v1 = Vector3(0.0f,-(side*0.366f),0.0f );
179   - Vector3 v2 = Vector3(h,h,0.0f);
180   -
181   - Vector3 v3 = v0 + ((v1-v0) * 0.5f);
182   - Vector3 v4 = v1 + ((v2-v1) * 0.5f);
183   - Vector3 v5 = v2 + ((v0-v2) * 0.5f);
184   -
185   - Toolkit::QuadraticBezier shader = Toolkit::QuadraticBezier::New(12, true);
186   -
187   - shader.SetPoint(0,v0);
188   - shader.SetPoint(1,v3);
189   - shader.SetPoint(2,v1);
190   -
191   - shader.SetPoint(3,v1);
192   - shader.SetPoint(4,v4);
193   - shader.SetPoint(5,v2);
194   -
195   - shader.SetPoint(6,v2);
196   - shader.SetPoint(7,v5);
197   - shader.SetPoint(8,v0);
198   -
199   - shader.SetPoint(9, v0);
200   - shader.SetPoint(10,v1);
201   - shader.SetPoint(11,v2);
202   -
203   - shader.SetColor(Vector4(0.0f,1.0f,0.0f,1.0f));
204   - shader.SetLineWidth(2.0f);
205   -
206   - ////Generate the mesh
207   - Dali::MeshData::VertexContainer vertices;
208   - for( unsigned int i(0);i<9;i+=3 )
209   - {
210   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,0.0f,i)) );
211   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO,Vector3(0.5f,0.0f,i+1) ) );
212   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(1.0f,1.0f,i+2) ) );
213   - }
214   -
215   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,9)) );
216   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO,Vector3(0.0f,1.0f,10) ) );
217   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,1.0f,11) ) );
218   -
219   - short unsigned int indexArray[] = { 0,2,1,3,5,4,6,8,7,9,11,10 };
220   - Dali::MeshData::FaceIndices index( indexArray, indexArray + sizeof(indexArray)/sizeof(short unsigned int) );
221   -
222   - //Material
223   - Dali::Material material = Material::New("Material");
224   - material.SetDiffuseColor( Vector4(1.0f,1.0f,1.0f,1.0f));
225   -
226   - //Create the Mesh object
227   - Dali::MeshData data;
228   - data.SetVertices(vertices);
229   - data.SetFaceIndices( index );
230   - data.SetMaterial( material );
231   - data.SetHasNormals( true );
232   - Mesh mesh = Mesh::New( data );
233   -
234   -// //Create the mesh actor
235   - MeshActor meshActor = MeshActor::New(mesh);
236   - meshActor.SetAnchorPoint( AnchorPoint::CENTER );
237   - meshActor.SetShaderEffect(shader);
238   - meshActor.SetPosition( center );
239   - meshActor.SetBlendMode(BlendingMode::ON );
240   - mView.Add( meshActor );
241   -
242   - //Animation
243   - Animation animation = Animation::New(5.0f);
244   -
245   - KeyFrames k0 = KeyFrames::New();
246   - k0.Add( 0.0f,v3 );
247   - k0.Add( 0.5f, v3 + Vector3(-200.0f,-200.0f,0.0f));
248   - k0.Add( 1.0f, v3 );
249   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(1)),k0,AlphaFunction::EASE_IN_OUT );
250   -
251   - k0 = KeyFrames::New();
252   - k0.Add( 0.0f,v4 );
253   - k0.Add( 0.5f, v4 + Vector3(200.0f,-200.0f,0.0f));
254   - k0.Add( 1.0f, v4 );
255   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(4)),k0,AlphaFunction::EASE_IN_OUT );
256   -
257   - k0 = KeyFrames::New();
258   - k0.Add( 0.0f,v5 );
259   - k0.Add( 0.5f, v5 + Vector3(0.0,200.0f,0.0f));
260   - k0.Add( 1.0f, v5 );
261   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(7)),k0,AlphaFunction::EASE_IN_OUT );
262   - animation.SetLooping( true );
263   - animation.Play();
264   - }
265   -
266   - void CreatePathMorph( Vector3 center, float radius )
267   - {
268   - Toolkit::QuadraticBezier shader = Toolkit::QuadraticBezier::New(12, false);
269   -
270   - shader.SetPoint(0, Vector3(-radius,-radius,0.0f));
271   - shader.SetPoint(1, Vector3( 0.0f,-radius,0.0f));
272   - shader.SetPoint(2, Vector3(radius,-radius,0.0f));
273   -
274   - shader.SetPoint(3, Vector3(radius,-radius,0.0f));
275   - shader.SetPoint(4, Vector3( radius,0.0f,0.0f));
276   - shader.SetPoint(5, Vector3(radius,radius,0.0f));
277   -
278   - shader.SetPoint(6, Vector3(radius,radius,0.0f));
279   - shader.SetPoint(7, Vector3( 0.0f,radius,0.0f));
280   - shader.SetPoint(8, Vector3( -radius,radius,0.0f));
281   -
282   - shader.SetPoint(9, Vector3( -radius,radius,0.0f));
283   - shader.SetPoint(10, Vector3( -radius,0.0f,0.0f));
284   - shader.SetPoint(11, Vector3(-radius,-radius,0.0f));
285   -
286   - shader.SetColor(Vector4(1.0f,1.0f,0.0f,1.0f) );
287   - shader.SetLineWidth(1.5f);
288   -
289   - ////Generate the mesh/S
290   - Dali::MeshData::VertexContainer vertices;
291   - for( unsigned int i(0); i<12; i+=3 )
292   - {
293   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.0f,0.0f,i) ));
294   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(0.5f,0.0f,i+1)));
295   - vertices.push_back( MeshData::Vertex( Vector3::ZERO, Vector2::ZERO, Vector3(1.0f,1.0f,i+2)));
296   - }
297   -
298   -
299   - short unsigned int indexArray[] = { 0,2,1, 3,5,4,6,8,7, 9, 11, 10 };
300   - Dali::MeshData::FaceIndices index( indexArray, indexArray + sizeof(indexArray)/sizeof(short unsigned int) );
301   -
302   - //Material
303   - Dali::Material material = Material::New("Material");
304   - material.SetDiffuseColor( Vector4(1.0f,1.0f,1.0f,1.0f));
305   -
306   - //Create the Mesh object
307   - Dali::MeshData data;
308   - data.SetVertices(vertices);
309   - data.SetFaceIndices( index );
310   - data.SetMaterial( material );
311   - data.SetHasNormals( true );
312   - Mesh mesh = Mesh::New( data );
313   -
314   - //Create the mesh actor
315   - MeshActor meshActor = MeshActor::New(mesh);
316   - meshActor.SetAnchorPoint( AnchorPoint::CENTER );
317   - meshActor.SetShaderEffect(shader);
318   - meshActor.SetPosition( center );
319   - meshActor.SetBlendMode(BlendingMode::ON );
320   - mView.Add( meshActor );
321   -
322   -
323   - //Animation
324   - Animation animation = Animation::New(5.0f);
325   - KeyFrames k0 = KeyFrames::New();
326   - k0.Add( 0.0f, Vector3( 0.0f,-radius*2.0, 0.0f) );
327   - k0.Add( 0.5f, Vector3(-radius*2.0, -radius*3.0f, 0.0f));
328   - k0.Add( 1.0f, Vector3( 0.0f,-radius*2.0, 0.0f) );
329   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(1)),k0,AlphaFunction::EASE_IN_OUT );
330   -
331   - k0 = KeyFrames::New();
332   - k0.Add( 0.0f, Vector3( radius*2.0, 0.0f, 0.0f) );
333   - k0.Add( 0.5f, Vector3(radius*3.0f,-radius*2.0, 0.0f));
334   - k0.Add( 1.0f, Vector3( radius*2.0,0.0f, 0.0f));
335   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(4)),k0,AlphaFunction::EASE_IN_OUT );
336   -
337   - k0 = KeyFrames::New();
338   - k0.Add( 0.0f, Vector3(0.0f,radius*2.0, 0.0f) );
339   - k0.Add( 0.5f, Vector3(radius*2.0,radius*3.0f, 0.0f));
340   - k0.Add( 1.0f, Vector3(0.0f,radius*2.0, 0.0f) );
341   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(7)),k0,AlphaFunction::EASE_IN_OUT );
342   -
343   - k0 = KeyFrames::New();
344   - k0.Add( 0.0f, Vector3( -radius*2.0, 0.0f, 0.0f) );
345   - k0.Add( 0.5f, Vector3(-radius*3.0f,radius*2.0, 0.0f));
346   - k0.Add( 1.0f, Vector3( -radius*2.0, 0.0f, 0.0f) );
347   - animation.AnimateBetween( Property(shader, shader.GetPointPropertyName(10)),k0,AlphaFunction::EASE_IN_OUT );
348   -
349   - animation.AnimateBy( Property( meshActor, Actor::Property::ORIENTATION ), Quaternion( Radian( Degree(-90.0f) ), Vector3::ZAXIS ) );
350   - animation.SetLooping( true );
351   - animation.Play();
352   - }
353   -
354   - /**
355   - * Main key event handler
356   - */
357   - void OnKeyEvent(const KeyEvent& event)
358   - {
359   - if( event.state == KeyEvent::Down && (IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK )) )
360   - {
361   - mApplication.Quit();
362   - }
363   - }
364   -
365   -private:
366   - Application& mApplication;
367   - Toolkit::Control mView;
368   -};
369   -
370   -void RunTest( Application& application )
371   -{
372   - AnimatedShapesExample test( application );
373   - application.MainLoop();
374   -}
375   -
376   -int main( int argc, char **argv )
377   -{
378   - Application application = Application::New( &argc, &argv, DALI_DEMO_THEME_PATH );
379   - RunTest( application );
380   -
381   - return 0;
382   -}
examples/bubble-effect/bubble-effect-example.cpp
... ... @@ -42,9 +42,9 @@ const unsigned int NUM_BACKGROUND_IMAGES( sizeof( BACKGROUND_IMAGES ) / sizeof(
42 42 const char* BUBBLE_SHAPE_IMAGES[] =
43 43 {
44 44 DALI_IMAGE_DIR "bubble-ball.png",
  45 + DALI_IMAGE_DIR "icon-effect-cross.png",
45 46 DALI_IMAGE_DIR "icon-item-view-layout-spiral.png",
46   - DALI_IMAGE_DIR "icon-replace.png",
47   - DALI_IMAGE_DIR "icon-effect-cross.png"
  47 + DALI_IMAGE_DIR "icon-replace.png"
48 48 };
49 49 const unsigned int NUM_BUBBLE_SHAPE_IMAGES( sizeof( BUBBLE_SHAPE_IMAGES ) / sizeof( BUBBLE_SHAPE_IMAGES[0] ) );
50 50  
... ... @@ -74,10 +74,10 @@ public:
74 74 BubbleEffectExample(Application &app)
75 75 : mApp(app),
76 76 mHSVDelta( Vector3( 0.f, 0.f, 0.5f ) ),
77   - mNeedNewAnimation( true ),
78 77 mTimerInterval( 16 ),
79 78 mCurrentBackgroundImageId( 0 ),
80   - mCurrentBubbleShapeImageId( 0 )
  79 + mCurrentBubbleShapeImageId( 0 ),
  80 + mNeedNewAnimation( true )
81 81 {
82 82 // Connect to the Application's Init signal
83 83 app.InitSignal().Connect(this, &BubbleEffectExample::Create);
... ... @@ -154,7 +154,7 @@ private:
154 154 * Emit bubbles
155 155 *****************/
156 156  
157   - // Set up the animation of emitting bubbles, to be efficient, every animation controls multiple bubbles ( 4 here )
  157 + // Set up the animation of emitting bubbles, to be efficient, every animation controls multiple emission ( 4 here )
158 158 void SetUpAnimation( Vector2 emitPosition, Vector2 direction )
159 159 {
160 160 if( mNeedNewAnimation )
... ... @@ -232,6 +232,9 @@ private:
232 232 case TouchPoint::Interrupted:
233 233 {
234 234 mTimerForBubbleEmission.Stop();
  235 + mEmitAnimation.Play();
  236 + mNeedNewAnimation = true;
  237 + mAnimateComponentCount = 0;
235 238 break;
236 239 }
237 240 case TouchPoint::Stationary:
... ... @@ -283,23 +286,22 @@ private:
283 286 Dali::Toolkit::Control mBackground;
284 287  
285 288 Toolkit::BubbleEmitter mBubbleEmitter;
286   - Vector3 mHSVDelta;
287   -
288 289 Animation mEmitAnimation;
289   - unsigned int mAnimateComponentCount;
290   - bool mNeedNewAnimation;
291   -
  290 + Toolkit::PushButton mChangeBackgroundButton;
  291 + Toolkit::PushButton mChangeBubbleShapeButton;
292 292 Timer mTimerForBubbleEmission;
293   - unsigned int mNonMovementCount;
294   - unsigned int mTimerInterval;
295 293  
  294 + Vector3 mHSVDelta;
296 295 Vector2 mCurrentTouchPosition;
297 296 Vector2 mEmitPosition;
298 297  
299   - Toolkit::PushButton mChangeBackgroundButton;
300   - Toolkit::PushButton mChangeBubbleShapeButton;
  298 + unsigned int mAnimateComponentCount;
  299 + unsigned int mNonMovementCount;
  300 + unsigned int mTimerInterval;
301 301 unsigned int mCurrentBackgroundImageId;
302 302 unsigned int mCurrentBubbleShapeImageId;
  303 +
  304 + bool mNeedNewAnimation;
303 305 };
304 306  
305 307 /*****************************************************************************/
... ...
examples/cluster/cluster-example.cpp
... ... @@ -376,6 +376,8 @@ public:
376 376 TOOLBAR_IMAGE,
377 377 "" );
378 378  
  379 + mContentLayer.SetProperty(Layer::Property::BEHAVIOR, "Dali::Layer::LAYER_3D");
  380 +
379 381 // Create a effect toggle button. (right of toolbar)
380 382 mLayoutButtonImages[ NO_EFFECT ] = ResourceImage::New( LAYOUT_NONE_IMAGE );
381 383 mLayoutButtonImages[ MOTION_BLUR_EFFECT ] = ResourceImage::New( LAYOUT_MOTION_BLUR_IMAGE );
... ... @@ -552,21 +554,22 @@ public:
552 554 */
553 555 void SetMotionBlurEffect( Actor actor )
554 556 {
  557 +
555 558 // only do something if the actor and effect are valid
556 559 if( actor )
557 560 {
558 561 // first remove from this actor
559   - RenderableActor renderable = RenderableActor::DownCast( actor );
560   - if( renderable )
  562 + ImageActor imageActor = ImageActor::DownCast( actor );
  563 + if( imageActor )
561 564 {
562   - MotionBlurEffect shaderEffect = MotionBlurEffect::New();
563   - shaderEffect.SetSpeedScalingFactor(0.1f);
  565 + ShaderEffect shaderEffect = Toolkit::CreateMotionBlurEffect();
  566 + shaderEffect.SetUniform("uSpeedScalingFactor",0.1f);
564 567  
565 568 Dali::Property::Index uModelProperty = shaderEffect.GetPropertyIndex( "uModelLastFrame" );
566 569 Constraint constraint = Constraint::New<Matrix>( shaderEffect, uModelProperty, EqualToConstraint() );
567   - constraint.AddSource( Source( actor , Actor::Property::WORLD_MATRIX ) );
  570 + constraint.AddSource( Source( imageActor , Actor::Property::WORLD_MATRIX ) );
568 571 constraint.Apply();
569   - renderable.SetShaderEffect( shaderEffect );
  572 + imageActor.SetShaderEffect( shaderEffect );
570 573 }
571 574 // then all children recursively
572 575 const unsigned int count = actor.GetChildCount();
... ... @@ -650,8 +653,8 @@ public:
650 653 case CAROUSEL_EFFECT:
651 654 {
652 655 // Apply Carousel Shader Effect to scrollView
653   - CarouselEffect shaderEffect = CarouselEffect::New();
654   - shaderEffect.SetRadius( -CAROUSEL_EFFECT_RADIUS );
  656 + ShaderEffect shaderEffect = Toolkit::CreateCarouselEffect();
  657 + shaderEffect.SetUniform( "uRadius", -CAROUSEL_EFFECT_RADIUS );
655 658 // dont apply shader effect to scrollview as it might override internal shaders for bounce effect etc
656 659 for( std::vector<ClusterInfo>::iterator i = mClusterInfo.begin(); i != mClusterInfo.end(); ++i )
657 660 {
... ... @@ -663,7 +666,7 @@ public:
663 666 const Vector2 angleSweep( CAROUSEL_EFFECT_ANGLE_SWEEP / stageSize.width,
664 667 CAROUSEL_EFFECT_ANGLE_SWEEP / stageSize.width );
665 668  
666   - Property::Index anglePerUnit = shaderEffect.GetPropertyIndex( shaderEffect.GetAnglePerUnitPropertyName() );
  669 + Property::Index anglePerUnit = shaderEffect.GetPropertyIndex( "uAnglePerUnit" );
667 670 Constraint constraint = Constraint::New<Vector2>( shaderEffect, anglePerUnit, CarouselEffectOrientationConstraint( angleSweep ) );
668 671 constraint.AddSource( Source(mView, Actor::Property::ORIENTATION) );
669 672 constraint.Apply();
... ... @@ -685,10 +688,10 @@ public:
685 688 mScrollView.SetRulerY(rulerY);
686 689  
687 690 // Apply Carousel Shader Effect to scrollView (Spherical style)
688   - CarouselEffect shaderEffect = CarouselEffect::New();
  691 + ShaderEffect shaderEffect = Toolkit::CreateCarouselEffect();
689 692  
690   - shaderEffect.SetRadius( SPHERE_EFFECT_RADIUS );
691   - shaderEffect.SetAnglePerUnit( Vector2( SPHERE_EFFECT_ANGLE_SWEEP / stageSize.y, SPHERE_EFFECT_ANGLE_SWEEP / stageSize.y ) );
  693 + shaderEffect.SetUniform( "uRadius", SPHERE_EFFECT_RADIUS );
  694 + shaderEffect.SetUniform( "uAnglePerUnit", Vector2( SPHERE_EFFECT_ANGLE_SWEEP / stageSize.y, SPHERE_EFFECT_ANGLE_SWEEP / stageSize.y ) );
692 695 // dont apply shader effect to scrollview as it might override internal shaders for bounce effect etc
693 696 for( std::vector<ClusterInfo>::iterator i = mClusterInfo.begin(); i != mClusterInfo.end(); ++i )
694 697 {
... ...
examples/dissolve-effect/dissolve-effect-example.cpp
... ... @@ -163,8 +163,8 @@ private:
163 163 ImageActor mNextImage;
164 164 unsigned int mIndex;
165 165  
166   - Toolkit::DissolveEffect mCurrentImageEffect;
167   - Toolkit::DissolveEffect mNextImageEffect;
  166 + ShaderEffect mCurrentImageEffect;
  167 + ShaderEffect mNextImageEffect;
168 168 bool mUseHighPrecision;
169 169 Animation mAnimation;
170 170  
... ... @@ -234,8 +234,8 @@ void DissolveEffectApp::OnInit( Application&amp; application )
234 234 mPanGestureDetector.DetectedSignal().Connect( this, &DissolveEffectApp::OnPanGesture );
235 235  
236 236 // create the dissolve effect object
237   - mCurrentImageEffect = Toolkit::DissolveEffect::New(mUseHighPrecision);
238   - mNextImageEffect = Toolkit::DissolveEffect::New(mUseHighPrecision);
  237 + mCurrentImageEffect = Toolkit::CreateDissolveEffect(mUseHighPrecision);
  238 + mNextImageEffect = Toolkit::CreateDissolveEffect(mUseHighPrecision);
239 239  
240 240 mViewTimer = Timer::New( VIEWINGTIME );
241 241 mViewTimer.TickSignal().Connect( this, &DissolveEffectApp::OnTimerTick );
... ... @@ -293,20 +293,20 @@ void DissolveEffectApp::StartTransition(Vector2 position, Vector2 displacement)
293 293 {
294 294 mAnimation = Animation::New(TRANSITION_DURATION);
295 295  
296   - mCurrentImageEffect.SetCentralLine(position,displacement);
297   - mCurrentImageEffect.SetDistortion(0.0f);
  296 + Dali::Toolkit::DissolveEffectSetCentralLine( mCurrentImageEffect, position, displacement );
  297 + mCurrentImageEffect.SetUniform("uPercentage", 0.0f);
298 298 mCurrentImage.SetShaderEffect(mCurrentImageEffect);
299   - mAnimation.AnimateTo( Property(mCurrentImageEffect, mCurrentImageEffect.GetDistortionPropertyName()), 1.0f, AlphaFunction::LINEAR );
  299 + mAnimation.AnimateTo( Property(mCurrentImageEffect, "uPercentage"), 1.0f, AlphaFunction::LINEAR );
300 300  
301 301 mNextImage.SetOpacity(0.0f);
302 302 mAnimation.AnimateTo( Property( mNextImage, Actor::Property::COLOR_ALPHA ), 1.0f, AlphaFunction::LINEAR );
303 303  
304 304 if(mUseHighPrecision)
305 305 {
306   - mNextImageEffect.SetCentralLine(position,-displacement);
307   - mNextImageEffect.SetDistortion(1.0f);
  306 + Dali::Toolkit::DissolveEffectSetCentralLine( mNextImageEffect, position, displacement );
  307 + mNextImageEffect.SetUniform("uPercentage", 1.0f);
308 308 mNextImage.SetShaderEffect(mNextImageEffect);
309   - mAnimation.AnimateTo( Property(mNextImageEffect, mNextImageEffect.GetDistortionPropertyName()), 0.0f, AlphaFunction::LINEAR );
  309 + mAnimation.AnimateTo( Property(mNextImageEffect, "uPercentage"), 0.0f, AlphaFunction::LINEAR );
310 310 }
311 311 else
312 312 {
... ... @@ -332,7 +332,7 @@ void DissolveEffectApp::OnKeyEvent(const KeyEvent&amp; event)
332 332 bool DissolveEffectApp::OnEffectButtonClicked( Toolkit::Button button )
333 333 {
334 334 mUseHighPrecision = !mUseHighPrecision;
335   - mCurrentImageEffect = Toolkit::DissolveEffect::New(mUseHighPrecision);
  335 + mCurrentImageEffect = Dali::Toolkit::CreateDissolveEffect(mUseHighPrecision);
336 336 if(mUseHighPrecision)
337 337 {
338 338 mTitleActor.SetProperty( TextLabel::Property::TEXT, std::string(APPLICATION_TITLE_HIGHP) );
... ...
examples/image-scaling-and-filtering/image-scaling-and-filtering-example.cpp
... ... @@ -211,16 +211,19 @@ public:
211 211 mDesiredBox.SetParentOrigin( ParentOrigin::CENTER );
212 212 mDesiredBox.SetAnchorPoint( AnchorPoint::CENTER );
213 213 mDesiredBox.SetPosition( 0, 0, -1 );
  214 + mDesiredBox.SetSortModifier(4.f);
214 215  
215 216 mHeightBox.SetSize( stage.GetSize().width, (stage.GetSize() * mImageStageScale).height );
216 217 mHeightBox.SetParentOrigin( ParentOrigin::CENTER );
217 218 mHeightBox.SetAnchorPoint( AnchorPoint::CENTER );
218 219 mHeightBox.SetPosition( 0, 0, -1 );
  220 + mHeightBox.SetSortModifier(3.f);
219 221  
220 222 mWidthBox.SetSize( (stage.GetSize() * mImageStageScale).width, stage.GetSize().height );
221 223 mWidthBox.SetParentOrigin( ParentOrigin::CENTER );
222 224 mWidthBox.SetAnchorPoint( AnchorPoint::CENTER );
223 225 mWidthBox.SetPosition( 0, 0, -1 );
  226 + mWidthBox.SetSortModifier(2.f);
224 227  
225 228 // Make a grab-handle for resizing the image:
226 229 mGrabCorner = Toolkit::PushButton::New();
... ... @@ -233,9 +236,14 @@ public:
233 236 mGrabCorner.SetAnchorPoint( AnchorPoint::BOTTOM_RIGHT );
234 237 mGrabCorner.SetParentOrigin( ParentOrigin::BOTTOM_RIGHT );
235 238 mGrabCorner.SetSize( Vector2( stage.GetSize().width*0.08f, stage.GetSize().width*0.08f ) );
236   - mGrabCorner.SetZ( 1.0f );
237 239 mGrabCorner.SetOpacity( 0.6f );
238   - mDesiredBox.Add( mGrabCorner );
  240 +
  241 + Layer grabCornerLayer = Layer::New();
  242 + grabCornerLayer.SetAnchorPoint( AnchorPoint::BOTTOM_RIGHT );
  243 + grabCornerLayer.SetParentOrigin( ParentOrigin::BOTTOM_RIGHT );
  244 +
  245 + grabCornerLayer.Add( mGrabCorner );
  246 + mDesiredBox.Add( grabCornerLayer );
239 247 mPanGestureDetector = PanGestureDetector::New();
240 248 mPanGestureDetector.Attach( mGrabCorner );
241 249 mPanGestureDetector.DetectedSignal().Connect( this, &ImageScalingAndFilteringController::OnPan );
... ... @@ -246,6 +254,7 @@ public:
246 254 // Reposition the actor
247 255 mImageActor.SetParentOrigin( ParentOrigin::CENTER );
248 256 mImageActor.SetAnchorPoint( AnchorPoint::CENTER );
  257 + mImageActor.SetSortModifier(5.f);
249 258  
250 259 // Display the actor on the stage
251 260 stage.Add( mImageActor );
... ... @@ -700,9 +709,9 @@ private:
700 709  
701 710 private:
702 711 Application& mApplication;
703   - Actor mDesiredBox; //< Background rectangle to show requested image size.
704   - Actor mHeightBox; //< Background horizontal stripe to show requested image height.
705   - Actor mWidthBox; //< Background vertical stripe to show requested image width.
  712 + ImageActor mDesiredBox; //< Background rectangle to show requested image size.
  713 + ImageActor mHeightBox; //< Background horizontal stripe to show requested image height.
  714 + ImageActor mWidthBox; //< Background vertical stripe to show requested image width.
706 715 Toolkit::PushButton mFittingModeButton;
707 716 Toolkit::PushButton mSamplingModeButton;
708 717 Toolkit::Popup mPopup;
... ...
examples/line-mesh/line-mesh-example.cpp 0 โ†’ 100644
  1 +/*
  2 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + *
  16 + */
  17 +
  18 +// EXTERNAL INCLUDES
  19 +#include <dali/devel-api/rendering/renderer.h>
  20 +#include <dali-toolkit/dali-toolkit.h>
  21 +
  22 +// INTERNAL INCLUDES
  23 +#include "shared/view.h"
  24 +
  25 +using namespace Dali;
  26 +
  27 +namespace
  28 +{
  29 +const char* MATERIAL_SAMPLE( DALI_IMAGE_DIR "gallery-small-48.jpg" );
  30 +const char* MATERIAL_SAMPLE2( DALI_IMAGE_DIR "gallery-medium-19.jpg" );
  31 +
  32 +#define MAKE_SHADER(A)#A
  33 +
  34 +const char* VERTEX_SHADER = MAKE_SHADER(
  35 +attribute mediump vec2 aPosition1;
  36 +attribute mediump vec2 aPosition2;
  37 +uniform mediump mat4 uMvpMatrix;
  38 +uniform mediump vec3 uSize;
  39 +uniform mediump float uMorphAmount;
  40 +
  41 +void main()
  42 +{
  43 + mediump vec2 morphPosition = mix(aPosition1, aPosition2, uMorphAmount);
  44 + mediump vec4 vertexPosition = vec4(morphPosition, 0.0, 1.0);
  45 + vertexPosition.xyz *= uSize;
  46 + vertexPosition = uMvpMatrix * vertexPosition;
  47 + gl_Position = vertexPosition;
  48 +}
  49 +);
  50 +
  51 +const char* FRAGMENT_SHADER = MAKE_SHADER(
  52 +uniform lowp vec4 uColor;
  53 +uniform sampler2D sTexture;
  54 +
  55 +void main()
  56 +{
  57 + gl_FragColor = uColor;
  58 +}
  59 +);
  60 +
  61 +Geometry CreateGeometry()
  62 +{
  63 + // Create vertices
  64 + struct Vertex { Vector2 position; };
  65 + Vertex pentagonVertexData[5] =
  66 + {
  67 + { Vector2( 0.0f, 1.00f) }, // 0
  68 + { Vector2( -0.95f, 0.31f) }, // 1
  69 + { Vector2( -0.59f, -0.81f) }, // 2
  70 + { Vector2( 0.59f, -0.81f) }, // 3
  71 + { Vector2( 0.95f, 0.31f) }, // 4
  72 + };
  73 +
  74 + Vertex pentacleVertexData[5] =
  75 + {
  76 + { Vector2( 0.0f, -1.00f) }, //
  77 + { Vector2( 0.59f, 0.81f) }, //
  78 + { Vector2( -0.95f, -0.31f) }, //
  79 + { Vector2( 0.95f, -0.31f) }, //
  80 + { Vector2( -0.59f, 0.81f) }, //
  81 + };
  82 +
  83 + Property::Map pentagonVertexFormat;
  84 + pentagonVertexFormat["aPosition1"] = Property::VECTOR2;
  85 + PropertyBuffer pentagonVertices = PropertyBuffer::New( pentagonVertexFormat, 5 );
  86 + pentagonVertices.SetData(pentagonVertexData);
  87 +
  88 + Property::Map pentacleVertexFormat;
  89 + pentacleVertexFormat["aPosition2"] = Property::VECTOR2;
  90 + PropertyBuffer pentacleVertices = PropertyBuffer::New( pentacleVertexFormat, 5 );
  91 + pentacleVertices.SetData(pentacleVertexData);
  92 +
  93 + // Create indices
  94 + unsigned int indexData[10] = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 0 };
  95 + Property::Map indexFormat;
  96 + indexFormat["indices"] = Property::UNSIGNED_INTEGER;
  97 + PropertyBuffer indices = PropertyBuffer::New( indexFormat, sizeof(indexData)/sizeof(indexData[0]) );
  98 + indices.SetData(indexData);
  99 +
  100 + // Create the geometry object
  101 + Geometry pentagonGeometry = Geometry::New();
  102 + pentagonGeometry.AddVertexBuffer( pentagonVertices );
  103 + pentagonGeometry.AddVertexBuffer( pentacleVertices );
  104 + pentagonGeometry.SetIndexBuffer( indices );
  105 +
  106 + pentagonGeometry.SetGeometryType( Geometry::LINES );
  107 +
  108 + return pentagonGeometry;
  109 +}
  110 +
  111 +} // anonymous namespace
  112 +
  113 +// This example shows how to morph between 2 meshes with the same number of
  114 +// vertices.
  115 +class ExampleController : public ConnectionTracker
  116 +{
  117 +public:
  118 +
  119 + /**
  120 + * The example controller constructor.
  121 + * @param[in] application The application instance
  122 + */
  123 + ExampleController( Application& application )
  124 + : mApplication( application )
  125 + {
  126 + // Connect to the Application's Init signal
  127 + mApplication.InitSignal().Connect( this, &ExampleController::Create );
  128 + }
  129 +
  130 + /**
  131 + * The example controller destructor
  132 + */
  133 + ~ExampleController()
  134 + {
  135 + // Nothing to do here;
  136 + }
  137 +
  138 + /**
  139 + * Invoked upon creation of application
  140 + * @param[in] application The application instance
  141 + */
  142 + void Create( Application& application )
  143 + {
  144 + Stage stage = Stage::GetCurrent();
  145 + stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
  146 +
  147 + mStageSize = stage.GetSize();
  148 +
  149 + // The Init signal is received once (only) during the Application lifetime
  150 +
  151 + // Hide the indicator bar
  152 + application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
  153 +
  154 + mImage = ResourceImage::New( MATERIAL_SAMPLE );
  155 + mSampler = Sampler::New(mImage, "sTexture");
  156 + mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
  157 +
  158 + mMaterial = Material::New( mShader );
  159 + mMaterial.AddSampler( mSampler );
  160 +
  161 + mGeometry = CreateGeometry();
  162 +
  163 + mRenderer = Renderer::New( mGeometry, mMaterial );
  164 +
  165 + mMeshActor = Actor::New();
  166 + mMeshActor.AddRenderer( mRenderer );
  167 + mMeshActor.SetSize(200, 200);
  168 +
  169 + Property::Index morphAmountIndex = mMeshActor.RegisterProperty( "uMorphAmount", 0.0f );
  170 +
  171 + mRenderer.SetDepthIndex(0);
  172 +
  173 + mMeshActor.SetParentOrigin( ParentOrigin::CENTER );
  174 + mMeshActor.SetAnchorPoint( AnchorPoint::CENTER );
  175 + stage.Add( mMeshActor );
  176 +
  177 + mChangeImageTimer = Timer::New( 5000 );
  178 + mChangeImageTimer.TickSignal().Connect( this, &ExampleController::OnTimer );
  179 + mChangeImageTimer.Start();
  180 +
  181 + Animation animation = Animation::New(5);
  182 + KeyFrames keyFrames = KeyFrames::New();
  183 + keyFrames.Add(0.0f, 0.0f);
  184 + keyFrames.Add(1.0f, 1.0f);
  185 +
  186 + animation.AnimateBetween( Property( mMeshActor, morphAmountIndex ), keyFrames, AlphaFunction(AlphaFunction::SIN) );
  187 + animation.SetLooping(true);
  188 + animation.Play();
  189 +
  190 + stage.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f));;
  191 + }
  192 +
  193 + /**
  194 + * Invoked whenever the quit button is clicked
  195 + * @param[in] button the quit button
  196 + */
  197 + bool OnQuitButtonClicked( Toolkit::Button button )
  198 + {
  199 + // quit the application
  200 + mApplication.Quit();
  201 + return true;
  202 + }
  203 +
  204 + bool OnTimer()
  205 + {
  206 + Image image = ResourceImage::New( MATERIAL_SAMPLE2 );
  207 + mSampler.SetImage( image );
  208 + return false;
  209 + }
  210 +
  211 + void OnKeyEvent(const KeyEvent& event)
  212 + {
  213 + if(event.state == KeyEvent::Down)
  214 + {
  215 + if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) )
  216 + {
  217 + mApplication.Quit();
  218 + }
  219 + }
  220 + }
  221 +
  222 +private:
  223 +
  224 + Application& mApplication; ///< Application instance
  225 + Vector3 mStageSize; ///< The size of the stage
  226 +
  227 + Image mImage;
  228 + Sampler mSampler;
  229 + Shader mShader;
  230 + Material mMaterial;
  231 + Geometry mGeometry;
  232 + Renderer mRenderer;
  233 + Actor mMeshActor;
  234 + Renderer mRenderer2;
  235 + Actor mMeshActor2;
  236 + Timer mChangeImageTimer;
  237 +};
  238 +
  239 +void RunTest( Application& application )
  240 +{
  241 + ExampleController test( application );
  242 +
  243 + application.MainLoop();
  244 +}
  245 +
  246 +// Entry point for Linux & SLP applications
  247 +//
  248 +int main( int argc, char **argv )
  249 +{
  250 + Application application = Application::New( &argc, &argv );
  251 +
  252 + RunTest( application );
  253 +
  254 + return 0;
  255 +}
... ...
examples/mesh-morph/mesh-morph-example.cpp 0 โ†’ 100644
  1 +/*
  2 + * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + *
  16 + */
  17 +
  18 +// EXTERNAL INCLUDES
  19 +#include <dali/devel-api/rendering/renderer.h>
  20 +#include <dali-toolkit/dali-toolkit.h>
  21 +
  22 +// INTERNAL INCLUDES
  23 +#include "shared/view.h"
  24 +
  25 +using namespace Dali;
  26 +
  27 +namespace
  28 +{
  29 +
  30 +#define MAKE_SHADER(A)#A
  31 +
  32 +const char* VERTEX_SHADER = MAKE_SHADER(
  33 +attribute mediump vec2 aInitPos;
  34 +attribute mediump vec2 aFinalPos;
  35 +attribute mediump vec3 aColor;
  36 +uniform mediump mat4 uMvpMatrix;
  37 +uniform mediump vec3 uSize;
  38 +uniform mediump float uDelta;
  39 +uniform lowp vec4 uColor;
  40 +varying lowp vec4 vColor;
  41 +
  42 +void main()
  43 +{
  44 + mediump vec4 vertexPosition = vec4(mix(aInitPos, aFinalPos, uDelta), 0.0, 1.0);
  45 + vertexPosition.xyz *= uSize;
  46 + vertexPosition = uMvpMatrix * vertexPosition;
  47 + gl_Position = vertexPosition;
  48 + vColor = vec4(aColor, 0.) * uColor;
  49 +}
  50 +);
  51 +
  52 +const char* FRAGMENT_SHADER = MAKE_SHADER(
  53 +varying lowp vec4 vColor;
  54 +
  55 +void main()
  56 +{
  57 + gl_FragColor = vColor;
  58 +}
  59 +);
  60 +
  61 +Geometry CreateGeometry()
  62 +{
  63 + // Create vertices
  64 + struct VertexPosition { Vector2 position; };
  65 + struct VertexColor { Vector3 color; };
  66 +
  67 + VertexPosition quad[] = {
  68 + // yellow
  69 + { Vector2(-.5, -.5) },
  70 + { Vector2( .0, .0) },
  71 + { Vector2(-.5, .5) },
  72 +
  73 + // green
  74 + { Vector2(-.5, -.5) },
  75 + { Vector2( .5, -.5) },
  76 + { Vector2( .0, .0) },
  77 +
  78 + // blue
  79 + { Vector2(.5, -.5) },
  80 + { Vector2(.5, .0) },
  81 + { Vector2(.25, -.25) },
  82 +
  83 + // red
  84 + { Vector2(.25, -.25) },
  85 + { Vector2(.5, .0) },
  86 + { Vector2(.25, .25) },
  87 + { Vector2(.25, .25) },
  88 + { Vector2(.0, .0) },
  89 + { Vector2(.25, -.25) },
  90 +
  91 + // cyan
  92 + { Vector2( .0, .0) },
  93 + { Vector2( .25, .25) },
  94 + { Vector2(-.25, .25) },
  95 +
  96 + // magenta
  97 + { Vector2(-.25, .25) },
  98 + { Vector2( .25, .25) },
  99 + { Vector2( .0, .5) },
  100 + { Vector2( .0, .5) },
  101 + { Vector2(-.5, .5) },
  102 + { Vector2(-.25, .25) },
  103 +
  104 + // orange
  105 + { Vector2( .5, .0) },
  106 + { Vector2( .5, .5) },
  107 + { Vector2( .0, .5) },
  108 + };
  109 +
  110 + float bigSide = 0.707106781;
  111 + float side = bigSide * .5f;
  112 + // float smallSide = side * .5f;
  113 +
  114 + Vector2 pA = Vector2( side, .25 );
  115 + Vector2 pB = pA + Vector2( 0., bigSide );
  116 + Vector2 pC = pB + Vector2( -bigSide, 0. );
  117 + Vector2 pD = pA + Vector2(-.5, -.5 );
  118 + Vector2 pE = pD + Vector2( .0, 1. );
  119 + Vector2 pF = pD + Vector2(-side, side );
  120 + Vector2 pF2 = pD + Vector2( 0., bigSide );
  121 + Vector2 pG = pD + Vector2(-.25, .25 );
  122 + Vector2 pH = pD + Vector2( -.5, .0 );
  123 + Vector2 pI = pD + Vector2(-.25, -.25 );
  124 + Vector2 pJ = pD + Vector2( 0., -.5);
  125 + Vector2 pK = pD + Vector2(-.5, -.5);
  126 + Vector2 pL = pB + Vector2(0, -side);
  127 + Vector2 pM = pL + Vector2(side, -side);
  128 + Vector2 pN = pB + Vector2(side, -side);
  129 +
  130 + VertexPosition cat[] = {
  131 + // yellow
  132 + { pA },
  133 + { pB },
  134 + { pC },
  135 +
  136 + // green
  137 + { pD },
  138 + { pA },
  139 + { pE },
  140 +
  141 + // blue
  142 + { pJ },
  143 + { pD },
  144 + { pI },
  145 +
  146 + // red
  147 + { pI },
  148 + { pD },
  149 + { pG },
  150 + { pG },
  151 + { pH },
  152 + { pI },
  153 +
  154 + // cyan
  155 + { pI },
  156 + { pH },
  157 + { pK },
  158 +
  159 + // magenta
  160 + { pL },
  161 + { pM },
  162 + { pN },
  163 + { pN },
  164 + { pB },
  165 + { pL },
  166 +
  167 + // orange
  168 + { pD },
  169 + { pF2 },
  170 + { pF },
  171 + };
  172 +
  173 + VertexColor colors[] = {
  174 + // yellow
  175 + { Vector3( 1., 1., 0. ) },
  176 + { Vector3( 1., 1., 0. ) },
  177 + { Vector3( 1., 1., 0. ) },
  178 +
  179 + // green
  180 + { Vector3( 0., 1., 0. ) },
  181 + { Vector3( 0., 1., 0. ) },
  182 + { Vector3( 0., 1., 0. ) },
  183 +
  184 + // blue
  185 + { Vector3( 0., 0., 1. ) },
  186 + { Vector3( 0., 0., 1. ) },
  187 + { Vector3( 0., 0., 1. ) },
  188 +
  189 + // red
  190 + { Vector3( 1., 0., 0. ) },
  191 + { Vector3( 1., 0., 0. ) },
  192 + { Vector3( 1., 0., 0. ) },
  193 + { Vector3( 1., 0., 0. ) },
  194 + { Vector3( 1., 0., 0. ) },
  195 + { Vector3( 1., 0., 0. ) },
  196 +
  197 + // cyan
  198 + { Vector3( 0., 1., 1. ) },
  199 + { Vector3( 0., 1., 1. ) },
  200 + { Vector3( 0., 1., 1. ) },
  201 +
  202 + // magenta
  203 + { Vector3( 1., 0., 1. ) },
  204 + { Vector3( 1., 0., 1. ) },
  205 + { Vector3( 1., 0., 1. ) },
  206 + { Vector3( 1., 0., 1. ) },
  207 + { Vector3( 1., 0., 1. ) },
  208 + { Vector3( 1., 0., 1. ) },
  209 +
  210 + // orange
  211 + { Vector3( 1., 0.5, 0. ) },
  212 + { Vector3( 1., 0.5, 0. ) },
  213 + { Vector3( 1., 0.5, 0. ) },
  214 +
  215 + };
  216 +
  217 + unsigned int numberOfVertices = sizeof(quad)/sizeof(VertexPosition);
  218 +
  219 + Property::Map initialPositionVertexFormat;
  220 + initialPositionVertexFormat["aInitPos"] = Property::VECTOR2;
  221 + PropertyBuffer initialPositionVertices = PropertyBuffer::New( initialPositionVertexFormat, numberOfVertices );
  222 + initialPositionVertices.SetData(quad);
  223 +
  224 + Property::Map finalPositionVertexFormat;
  225 + finalPositionVertexFormat["aFinalPos"] = Property::VECTOR2;
  226 + PropertyBuffer finalPositionVertices = PropertyBuffer::New( finalPositionVertexFormat, numberOfVertices );
  227 + finalPositionVertices.SetData(cat);
  228 +
  229 + Property::Map colorVertexFormat;
  230 + colorVertexFormat["aColor"] = Property::VECTOR3;
  231 + PropertyBuffer colorVertices = PropertyBuffer::New( colorVertexFormat, numberOfVertices );
  232 + colorVertices.SetData(colors);
  233 +
  234 + // Create the geometry object
  235 + Geometry texturedQuadGeometry = Geometry::New();
  236 + texturedQuadGeometry.AddVertexBuffer( initialPositionVertices );
  237 + texturedQuadGeometry.AddVertexBuffer( finalPositionVertices );
  238 + texturedQuadGeometry.AddVertexBuffer( colorVertices );
  239 +
  240 + return texturedQuadGeometry;
  241 +}
  242 +
  243 +inline float StationarySin( float progress ) ///< Single revolution
  244 +{
  245 + float val = cosf(progress * 2.0f * Math::PI) + .5f;
  246 + val = val > 1.f ? 1.f : val;
  247 + val = val < 0.f ? 0.f : val;
  248 + return val;
  249 +}
  250 +
  251 +} // anonymous namespace
  252 +
  253 +// This example shows how to use a simple mesh
  254 +//
  255 +class ExampleController : public ConnectionTracker
  256 +{
  257 +public:
  258 +
  259 + /**
  260 + * The example controller constructor.
  261 + * @param[in] application The application instance
  262 + */
  263 + ExampleController( Application& application )
  264 + : mApplication( application )
  265 + {
  266 + // Connect to the Application's Init signal
  267 + mApplication.InitSignal().Connect( this, &ExampleController::Create );
  268 + }
  269 +
  270 + /**
  271 + * The example controller destructor
  272 + */
  273 + ~ExampleController()
  274 + {
  275 + // Nothing to do here;
  276 + }
  277 +
  278 + /**
  279 + * Invoked upon creation of application
  280 + * @param[in] application The application instance
  281 + */
  282 + void Create( Application& application )
  283 + {
  284 + Stage stage = Stage::GetCurrent();
  285 + stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
  286 +
  287 + mStageSize = stage.GetSize();
  288 +
  289 + // The Init signal is received once (only) during the Application lifetime
  290 +
  291 + // Hide the indicator bar
  292 + application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
  293 +
  294 + mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
  295 +
  296 + mMaterial = Material::New( mShader );
  297 + mGeometry = CreateGeometry();
  298 +
  299 + mRenderer = Renderer::New( mGeometry, mMaterial );
  300 +
  301 + mMeshActor = Actor::New();
  302 + mMeshActor.AddRenderer( mRenderer );
  303 + mMeshActor.SetSize(400, 400);
  304 +
  305 + Property::Index morphDeltaIndex = mMeshActor.RegisterProperty( "uDelta", 0.f );
  306 +
  307 + mRenderer.SetDepthIndex(0);
  308 +
  309 + mMeshActor.SetParentOrigin( ParentOrigin::CENTER );
  310 + mMeshActor.SetAnchorPoint( AnchorPoint::CENTER );
  311 + stage.Add( mMeshActor );
  312 +
  313 + Animation animation = Animation::New(10);
  314 + animation.AnimateTo( Property( mMeshActor, morphDeltaIndex ), 1.f, StationarySin );
  315 + animation.SetLooping( true );
  316 + animation.Play();
  317 +
  318 + stage.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f));;
  319 + }
  320 +
  321 + /**
  322 + * Invoked whenever the quit button is clicked
  323 + * @param[in] button the quit button
  324 + */
  325 + bool OnQuitButtonClicked( Toolkit::Button button )
  326 + {
  327 + // quit the application
  328 + mApplication.Quit();
  329 + return true;
  330 + }
  331 +
  332 + void OnKeyEvent(const KeyEvent& event)
  333 + {
  334 + if(event.state == KeyEvent::Down)
  335 + {
  336 + if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) )
  337 + {
  338 + mApplication.Quit();
  339 + }
  340 + }
  341 + }
  342 +
  343 +private:
  344 +
  345 + Application& mApplication; ///< Application instance
  346 + Vector3 mStageSize; ///< The size of the stage
  347 +
  348 + Shader mShader;
  349 + Material mMaterial;
  350 + Geometry mGeometry;
  351 + Renderer mRenderer;
  352 + Actor mMeshActor;
  353 + Timer mMorphTimer;
  354 +};
  355 +
  356 +void RunTest( Application& application )
  357 +{
  358 + ExampleController test( application );
  359 +
  360 + application.MainLoop();
  361 +}
  362 +
  363 +// Entry point for Linux & SLP applications
  364 +//
  365 +int main( int argc, char **argv )
  366 +{
  367 + Application application = Application::New( &argc, &argv );
  368 +
  369 + RunTest( application );
  370 +
  371 + return 0;
  372 +}
... ...
examples/mesh-sorting/mesh-sorting-example.cpp 0 โ†’ 100644
  1 +/*
  2 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + *
  16 + */
  17 +
  18 +// EXTERNAL INCLUDES
  19 +#include <dali/devel-api/rendering/renderer.h>
  20 +#include <dali-toolkit/dali-toolkit.h>
  21 +#include <stdio.h>
  22 +#include <sstream>
  23 +#include <cstring>
  24 +
  25 +// INTERNAL INCLUDES
  26 +#include "shared/view.h"
  27 +
  28 +using namespace Dali;
  29 +
  30 +namespace
  31 +{
  32 +
  33 +const char* MATERIAL_SAMPLES[] =
  34 +{
  35 + DALI_IMAGE_DIR "people-medium-1.jpg",
  36 + DALI_IMAGE_DIR "people-medium-4.jpg",
  37 + DALI_IMAGE_DIR "people-medium-11.jpg",
  38 + DALI_IMAGE_DIR "people-small-16.jpg",
  39 + DALI_IMAGE_DIR "people-medium-15.jpg",
  40 + DALI_IMAGE_DIR "people-medium-6.jpg",
  41 +};
  42 +const unsigned int NUMBER_OF_SAMPLES(sizeof(MATERIAL_SAMPLES)/sizeof(const char*));
  43 +
  44 +
  45 +#define MAKE_SHADER(A)#A
  46 +
  47 +const char* VERTEX_SHADER = MAKE_SHADER(
  48 +uniform highp float uHue;
  49 +attribute mediump vec2 aPosition;
  50 +attribute highp vec2 aTexCoord;
  51 +varying mediump vec2 vTexCoord;
  52 +uniform mediump mat4 uMvpMatrix;
  53 +uniform mediump vec3 uSize;
  54 +varying mediump vec3 vGlobColor;
  55 +
  56 +vec3 hsv2rgb(vec3 c)
  57 +{
  58 + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
  59 + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
  60 + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
  61 +}
  62 +
  63 +void main()
  64 +{
  65 + mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);
  66 + vertexPosition.xyz *= uSize;
  67 + vertexPosition = uMvpMatrix * vertexPosition;
  68 + vGlobColor = hsv2rgb( vec3( clamp(uHue, 0.0, 1.0), 1.0, 1.0 ) );
  69 +
  70 + vTexCoord = aTexCoord;
  71 + gl_Position = vertexPosition;
  72 +}
  73 +);
  74 +
  75 +const char* FRAGMENT_SHADER = MAKE_SHADER(
  76 +varying mediump vec2 vTexCoord;
  77 +varying mediump vec3 vGlobColor;
  78 +uniform lowp vec4 uColor;
  79 +uniform sampler2D sTexture;
  80 +
  81 +void main()
  82 +{
  83 + gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor * vec4(vGlobColor, 1.0) ;
  84 +}
  85 +);
  86 +
  87 +Geometry CreateGeometry()
  88 +{
  89 + // Create vertices
  90 + const float halfQuadSize = .5f;
  91 + struct TexturedQuadVertex { Vector2 position; Vector2 textureCoordinates; };
  92 + TexturedQuadVertex texturedQuadVertexData[4] = {
  93 + { Vector2(-halfQuadSize, -halfQuadSize), Vector2(0.f, 0.f) },
  94 + { Vector2( halfQuadSize, -halfQuadSize), Vector2(1.f, 0.f) },
  95 + { Vector2(-halfQuadSize, halfQuadSize), Vector2(0.f, 1.f) },
  96 + { Vector2( halfQuadSize, halfQuadSize), Vector2(1.f, 1.f) } };
  97 +
  98 + Property::Map texturedQuadVertexFormat;
  99 + texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
  100 + texturedQuadVertexFormat["aTexCoord"] = Property::VECTOR2;
  101 + PropertyBuffer texturedQuadVertices = PropertyBuffer::New( texturedQuadVertexFormat, 4 );
  102 + texturedQuadVertices.SetData(texturedQuadVertexData);
  103 +
  104 + // Create indices
  105 + unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 };
  106 + Property::Map indexFormat;
  107 + indexFormat["indices"] = Property::UNSIGNED_INTEGER;
  108 + PropertyBuffer indices = PropertyBuffer::New( indexFormat, 6 );
  109 + indices.SetData(indexData);
  110 +
  111 + // Create the geometry object
  112 + Geometry texturedQuadGeometry = Geometry::New();
  113 + texturedQuadGeometry.AddVertexBuffer( texturedQuadVertices );
  114 + texturedQuadGeometry.SetIndexBuffer( indices );
  115 +
  116 + return texturedQuadGeometry;
  117 +}
  118 +
  119 +} // anonymous namespace
  120 +
  121 +// This example shows how to use a simple mesh
  122 +//
  123 +class ExampleController : public ConnectionTracker
  124 +{
  125 +public:
  126 +
  127 + /**
  128 + * The example controller constructor.
  129 + * @param[in] application The application instance
  130 + */
  131 + ExampleController( Application& application )
  132 + : mApplication( application ),
  133 + mZMode(0)
  134 + {
  135 + // Connect to the Application's Init signal
  136 + mApplication.InitSignal().Connect( this, &ExampleController::Create );
  137 + memset(mDepthIndices, 0, sizeof(mDepthIndices));
  138 + }
  139 +
  140 + /**
  141 + * The example controller destructor
  142 + */
  143 + ~ExampleController()
  144 + {
  145 + // Nothing to do here;
  146 + }
  147 +
  148 + /**
  149 + * Invoked upon creation of application
  150 + * @param[in] application The application instance
  151 + */
  152 + void Create( Application& application )
  153 + {
  154 + Stage stage = Stage::GetCurrent();
  155 + stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
  156 +
  157 + mStageSize = stage.GetSize();
  158 +
  159 + // The Init signal is received once (only) during the Application lifetime
  160 +
  161 + // Hide the indicator bar
  162 + application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
  163 +
  164 + mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
  165 + mGeometry = CreateGeometry();
  166 +
  167 + Material firstMat;
  168 +
  169 + for( unsigned i=0; i<NUMBER_OF_SAMPLES; ++i)
  170 + {
  171 + Image image = ResourceImage::New( MATERIAL_SAMPLES[i] );
  172 + Sampler sampler = Sampler::New(image, "sTexture");
  173 + Material material = Material::New( mShader );
  174 + material.AddSampler( sampler );
  175 + if( i==0 ) { firstMat = material; }
  176 +
  177 + Renderer renderer = Renderer::New( mGeometry, material );
  178 + Actor meshActor = Actor::New();
  179 + mActors[i] = meshActor;
  180 + meshActor.AddRenderer( renderer );
  181 + meshActor.SetSize(175, 175);
  182 + meshActor.RegisterProperty("index", (int)i);
  183 +
  184 + renderer.SetDepthIndex(0);
  185 + // Test with actor alpha
  186 + meshActor.SetParentOrigin( ParentOrigin::CENTER );
  187 + meshActor.SetAnchorPoint( AnchorPoint::CENTER );
  188 + meshActor.SetPosition( 40.0f*(i-(NUMBER_OF_SAMPLES*0.5f)), 40.0f*(i-(NUMBER_OF_SAMPLES*0.5f)), i*10 );
  189 +
  190 + meshActor.SetOpacity( i%2?0.7f:1.0f );
  191 +
  192 + meshActor.RegisterProperty("uHue", i/(float)NUMBER_OF_SAMPLES);
  193 +
  194 + meshActor.TouchedSignal().Connect(this, &ExampleController::OnTouched);
  195 + std::ostringstream oss;
  196 + oss << "Mesh Actor " << i;
  197 + meshActor.SetName(oss.str());
  198 + stage.Add( meshActor );
  199 + }
  200 +
  201 + mActors[NUMBER_OF_SAMPLES-2].GetRendererAt(0).SetMaterial( firstMat );
  202 +
  203 + stage.GetRootLayer().TouchedSignal().Connect(this, &ExampleController::OnStageTouched);
  204 + }
  205 +
  206 + void PrintDepths()
  207 + {
  208 + switch( mZMode )
  209 + {
  210 + case 0:
  211 + {
  212 + printf("Children Z ordered back to front\n");
  213 + break;
  214 + }
  215 + case 1:
  216 + {
  217 + printf("All children set to same Z=0\n");
  218 + break;
  219 + }
  220 + case 2:
  221 + {
  222 + printf("Children Z ordered front to back\n");
  223 + break;
  224 + }
  225 + }
  226 +
  227 + for( unsigned i=0; i<NUMBER_OF_SAMPLES; ++i)
  228 + {
  229 + printf("DepthIndex[%d]=%d\n", i, mDepthIndices[i]);
  230 + }
  231 + printf("\n");
  232 + }
  233 +
  234 + bool OnTouched( Actor actor, const TouchEvent& event )
  235 + {
  236 + if( event.GetPoint(0).state == TouchPoint::Finished )
  237 + {
  238 + int index = actor.GetProperty<int>(actor.GetPropertyIndex("index"));
  239 +
  240 + int newDepthIndex = (mDepthIndices[index] + 10) % 30;
  241 + mDepthIndices[index] = newDepthIndex;
  242 +
  243 + Renderer renderer = actor.GetRendererAt(0);
  244 + renderer.SetDepthIndex(newDepthIndex);
  245 +
  246 + PrintDepths();
  247 + }
  248 + return true;
  249 + }
  250 +
  251 + bool OnStageTouched( Actor rootLayer, const TouchEvent& event )
  252 + {
  253 + if( event.GetPoint(0).state == TouchPoint::Finished )
  254 + {
  255 + switch( mZMode )
  256 + {
  257 + case 0:
  258 + {
  259 + mZMode = 1;
  260 + for(unsigned int i=1; i < rootLayer.GetChildCount(); ++i)
  261 + {
  262 + Actor child = rootLayer.GetChildAt(i);
  263 + child.SetZ( 0.0f );
  264 + }
  265 + PrintDepths();
  266 + break;
  267 + }
  268 + case 1:
  269 + {
  270 + mZMode = 2;
  271 + for(unsigned int i=1; i < rootLayer.GetChildCount(); ++i)
  272 + {
  273 + Actor child = rootLayer.GetChildAt(i);
  274 + child.SetZ( 100-i*10 );
  275 + }
  276 + PrintDepths();
  277 + break;
  278 + }
  279 + case 2:
  280 + {
  281 + mZMode = 0;
  282 + for(unsigned int i=1; i < rootLayer.GetChildCount(); ++i)
  283 + {
  284 + Actor child = rootLayer.GetChildAt(i);
  285 + child.SetZ( i*10 );
  286 + }
  287 + PrintDepths();
  288 + break;
  289 + }
  290 + }
  291 + }
  292 + return true;
  293 + }
  294 +
  295 + /**
  296 + * Invoked whenever the quit button is clicked
  297 + * @param[in] button the quit button
  298 + */
  299 + bool OnQuitButtonClicked( Toolkit::Button button )
  300 + {
  301 + // quit the application
  302 + mApplication.Quit();
  303 + return true;
  304 + }
  305 +
  306 + void OnKeyEvent(const KeyEvent& event)
  307 + {
  308 + if(event.state == KeyEvent::Down)
  309 + {
  310 + if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) )
  311 + {
  312 + mApplication.Quit();
  313 + }
  314 + }
  315 + }
  316 +
  317 +private:
  318 +
  319 + Application& mApplication; ///< Application instance
  320 + Vector3 mStageSize; ///< The size of the stage
  321 +
  322 + Shader mShader;
  323 + Geometry mGeometry;
  324 +
  325 + int mDepthIndices[NUMBER_OF_SAMPLES];
  326 + Actor mActors[NUMBER_OF_SAMPLES];
  327 + int mZMode;
  328 +};
  329 +
  330 +void RunTest( Application& application )
  331 +{
  332 + ExampleController test( application );
  333 +
  334 + application.MainLoop();
  335 +}
  336 +
  337 +// Entry point for Linux & SLP applications
  338 +//
  339 +int main( int argc, char **argv )
  340 +{
  341 + Application application = Application::New( &argc, &argv );
  342 +
  343 + RunTest( application );
  344 +
  345 + return 0;
  346 +}
... ...
examples/motion-blur/motion-blur-example.cpp
... ... @@ -214,7 +214,12 @@ public:
214 214 mContentLayer.Add( mMotionBlurImageActor );
215 215  
216 216 // Create shader used for doing motion blur
217   - mMotionBlurEffect = MotionBlurEffect::Apply(mMotionBlurImageActor);
  217 + mMotionBlurEffect = Toolkit::CreateMotionBlurEffect();
  218 + Dali::Property::Index uModelProperty = mMotionBlurEffect.GetPropertyIndex( "uModelLastFrame" );
  219 + Constraint constraint = Constraint::New<Matrix>( mMotionBlurEffect, uModelProperty, EqualToConstraint() );
  220 + constraint.AddSource( Source( mMotionBlurImageActor , Actor::Property::WORLD_MATRIX ) );
  221 + constraint.Apply();
  222 + mMotionBlurImageActor.SetShaderEffect( mMotionBlurEffect );
218 223  
219 224  
220 225 #ifdef MULTIPLE_MOTION_BLURRED_ACTORS
... ... @@ -231,7 +236,7 @@ public:
231 236 mMotionBlurImageActor.Add( mMotionBlurImageActor2 );
232 237  
233 238 // Create shader used for doing motion blur
234   - mMotionBlurEffect2 = MotionBlurEffect::New(MOTION_BLUR_NUM_SAMPLES);
  239 + mMotionBlurEffect2 = CreateMotionBlurEffect(MOTION_BLUR_NUM_SAMPLES);
235 240  
236 241 // set actor shader to the blur one
237 242 mMotionBlurImageActor2.SetShaderEffect( mMotionBlurEffect2 );
... ... @@ -249,7 +254,7 @@ public:
249 254 mMotionBlurImageActor.Add( mMotionBlurImageActor3 );
250 255  
251 256 // Create shader used for doing motion blur
252   - mMotionBlurEffect3 = MotionBlurEffect::New(MOTION_BLUR_NUM_SAMPLES);
  257 + mMotionBlurEffect3 = CreateMotionBlurEffect(MOTION_BLUR_NUM_SAMPLES);
253 258  
254 259 // set actor shader to the blur one
255 260 mMotionBlurImageActor3.SetShaderEffect( mMotionBlurEffect3 );
... ... @@ -267,7 +272,7 @@ public:
267 272 mMotionBlurImageActor.Add( mMotionBlurImageActor4 );
268 273  
269 274 // Create shader used for doing motion blur
270   - mMotionBlurEffect4 = MotionBlurEffect::New(MOTION_BLUR_NUM_SAMPLES);
  275 + mMotionBlurEffect4 = CreateMotionBlurEffect(MOTION_BLUR_NUM_SAMPLES);
271 276  
272 277 // set actor shader to the blur one
273 278 mMotionBlurImageActor4.SetShaderEffect( mMotionBlurEffect4 );
... ... @@ -285,7 +290,7 @@ public:
285 290 mMotionBlurImageActor.Add( mMotionBlurImageActor5 );
286 291  
287 292 // Create shader used for doing motion blur
288   - mMotionBlurEffect5 = MotionBlurEffect::New(MOTION_BLUR_NUM_SAMPLES);
  293 + mMotionBlurEffect5 = CreateMotionBlurEffect(MOTION_BLUR_NUM_SAMPLES);
289 294  
290 295 // set actor shader to the blur one
291 296 mMotionBlurImageActor5.SetShaderEffect( mMotionBlurEffect5 );
... ... @@ -515,15 +520,15 @@ private:
515 520 PushButton mActorEffectsButton; ///< The actor effects toggling Button.
516 521  
517 522 // Motion blur
518   - MotionBlurEffect mMotionBlurEffect;
  523 + ShaderEffect mMotionBlurEffect;
519 524 ImageActor mMotionBlurImageActor;
520 525 Size mMotionBlurActorSize;
521 526  
522 527 #ifdef MULTIPLE_MOTION_BLURRED_ACTORS
523   - MotionBlurEffect mMotionBlurEffect2;
524   - MotionBlurEffect mMotionBlurEffect3;
525   - MotionBlurEffect mMotionBlurEffect4;
526   - MotionBlurEffect mMotionBlurEffect5;
  528 + ShaderEffect mMotionBlurEffect2;
  529 + ShaderEffect mMotionBlurEffect3;
  530 + ShaderEffect mMotionBlurEffect4;
  531 + ShaderEffect mMotionBlurEffect5;
527 532  
528 533 ImageActor mMotionBlurImageActor2;
529 534 ImageActor mMotionBlurImageActor3;
... ...
examples/motion-stretch/motion-stretch-example.cpp
... ... @@ -184,7 +184,12 @@ public:
184 184 mContentLayer.Add( mMotionStretchImageActor );
185 185  
186 186 // Create shader used for doing motion stretch
187   - mMotionStretchEffect = MotionStretchEffect::Apply(mMotionStretchImageActor);
  187 + mMotionStretchEffect = Toolkit::CreateMotionStretchEffect();
  188 + Dali::Property::Index uModelProperty = mMotionStretchEffect.GetPropertyIndex( "uModelLastFrame" );
  189 + Constraint constraint = Constraint::New<Matrix>( mMotionStretchEffect, uModelProperty, EqualToConstraint() );
  190 + constraint.AddSource( Source( mMotionStretchImageActor , Actor::Property::WORLD_MATRIX ) );
  191 + constraint.Apply();
  192 + mMotionStretchImageActor.SetShaderEffect( mMotionStretchEffect );
188 193 }
189 194  
190 195 //////////////////////////////////////////////////////////////
... ... @@ -408,7 +413,7 @@ private:
408 413 PushButton mActorEffectsButton; ///< The actor effects toggling Button.
409 414  
410 415 // Motion stretch
411   - MotionStretchEffect mMotionStretchEffect;
  416 + ShaderEffect mMotionStretchEffect;
412 417 ImageActor mMotionStretchImageActor;
413 418  
414 419 // animate actor to position where user taps screen
... ...
examples/new-window/new-window-example.cpp
... ... @@ -14,18 +14,17 @@
14 14 * limitations under the License.
15 15 */
16 16  
  17 +// EXTERNAL INCLUDES
  18 +#include <dali/devel-api/rendering/renderer.h>
17 19 #include <dali-toolkit/dali-toolkit.h>
18   -#include <dali/devel-api/actors/mesh-actor.h>
19   -#include <dali/devel-api/modeling/material.h>
20   -#include <dali/devel-api/geometry/mesh.h>
21 20 #include <dali-toolkit/devel-api/controls/bubble-effect/bubble-emitter.h>
22   -#include <dali-toolkit/devel-api/shader-effects/bubble-effect/color-adjuster.h>
23 21  
24   -
25   -#include "shared/view.h"
26 22 #include <cstdio>
27 23 #include <iostream>
28 24  
  25 +// INTERNAL INCLUDES
  26 +#include "shared/view.h"
  27 +
29 28 using namespace Dali;
30 29 using namespace Dali::Toolkit;
31 30  
... ... @@ -38,23 +37,76 @@ const char * const TOOLBAR_IMAGE( DALI_IMAGE_DIR &quot;top-bar.png&quot; );
38 37 const char * const LOSE_CONTEXT_IMAGE( DALI_IMAGE_DIR "icon-cluster-wobble.png" );
39 38 const char * const BASE_IMAGE( DALI_IMAGE_DIR "gallery-large-14.jpg" );
40 39 const char * const EFFECT_IMAGE( DALI_IMAGE_DIR "gallery-large-18.jpg" );
  40 +const char * const LOGO_IMAGE(DALI_IMAGE_DIR "dali-logo.png");
41 41  
42 42 const float EXPLOSION_DURATION(1.2f);
43   -const unsigned int EMIT_INTERVAL_IN_MS(80);
  43 +const unsigned int EMIT_INTERVAL_IN_MS(40);
44 44 const float TRACK_DURATION_IN_MS(970);
45 45  
46 46 Application gApplication;
47 47 NewWindowController* gNewWindowController(NULL);
48 48  
49   -const char*const FRAG_SHADER=
50   - "uniform mediump float alpha;\n"
51   - "\n"
52   - "void main()\n"
53   - "{\n"
54   - " mediump vec4 fragColor = texture2D(sTexture, vTexCoord);\n"
55   - " mediump vec4 fxColor = texture2D(sEffect, vTexCoord);\n"
56   - " gl_FragColor = mix(fragColor,fxColor, alpha);\n"
57   - "}\n";
  49 +#define MAKE_SHADER(A)#A
  50 +
  51 +const char* VERTEX_COLOR_MESH = MAKE_SHADER(
  52 +attribute mediump vec3 aPosition;\n
  53 +attribute lowp vec3 aColor;\n
  54 +uniform mediump mat4 uMvpMatrix;\n
  55 +uniform mediump vec3 uSize;\n
  56 +varying lowp vec3 vColor;\n
  57 +\n
  58 +void main()\n
  59 +{\n
  60 + gl_Position = uMvpMatrix * vec4( aPosition*uSize, 1.0 );\n
  61 + vColor = aColor;\n
  62 +}\n
  63 +);
  64 +
  65 +const char* FRAGMENT_COLOR_MESH = MAKE_SHADER(
  66 +uniform lowp vec4 uColor;\n
  67 +varying lowp vec3 vColor;\n
  68 +\n
  69 +void main()\n
  70 +{\n
  71 + gl_FragColor = vec4(vColor,1.0)*uColor;
  72 +}\n
  73 +);
  74 +
  75 +const char* VERTEX_TEXTURE_MESH = MAKE_SHADER(
  76 +attribute mediump vec3 aPosition;\n
  77 +attribute highp vec2 aTexCoord;\n
  78 +uniform mediump mat4 uMvpMatrix;\n
  79 +uniform mediump vec3 uSize;\n
  80 +varying mediump vec2 vTexCoord;\n
  81 +\n
  82 +void main()\n
  83 +{\n
  84 + gl_Position = uMvpMatrix * vec4( aPosition*uSize, 1.0 );\n
  85 + vTexCoord = aTexCoord;\n
  86 +}\n
  87 +);
  88 +
  89 +const char* FRAGMENT_TEXTURE_MESH = MAKE_SHADER(
  90 +varying mediump vec2 vTexCoord;\n
  91 +uniform lowp vec4 uColor;\n
  92 +uniform sampler2D sTexture;\n
  93 +\n
  94 +void main()\n
  95 +{\n
  96 + gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;
  97 +}\n
  98 +);
  99 +
  100 +const char* FRAGMENT_BLEND_SHADER = MAKE_SHADER(
  101 +uniform mediump float alpha;\n
  102 +\n
  103 +void main()\n
  104 +{\n
  105 + mediump vec4 fragColor = texture2D(sTexture, vTexCoord);\n
  106 + mediump vec4 fxColor = texture2D(sEffect, vTexCoord);\n
  107 + gl_FragColor = mix(fragColor,fxColor, alpha);\n
  108 +}\n
  109 +);
58 110  
59 111 }; // anonymous namespace
60 112  
... ... @@ -65,48 +117,39 @@ public:
65 117 NewWindowController( Application& app );
66 118 void Create( Application& app );
67 119 void Destroy( Application& app );
68   - void OnKeyEvent(const KeyEvent& event);
69   - bool OnLoseContextButtonClicked( Toolkit::Button button );
70   - static void NewWindow(void);
71 120  
72   - void OnContextLost();
73   - void OnContextRegained();
74   - void CreateMeshActor();
75   - Mesh CreateMesh(bool, Material);
76   - void CreateBubbles(Vector2 stageSize);
77   - void CreateBlending();
78   - void CreateText();
79   - bool OnTrackTimerTick();
80   - bool OnExplodeTimerTick();
81   - void SetUpAnimation( Vector2 emitPosition, Vector2 direction );
82   - FrameBufferImage CreateMirrorImage(const char* imageName);
  121 + void AddBubbles(const Vector2& stageSize);
  122 + void AddMeshActor();
  123 + void AddBlendingImageActor();
  124 + void AddTextLabel();
  125 +
83 126 ImageActor CreateBlurredMirrorImage(const char* imageName);
84 127 FrameBufferImage CreateFrameBufferForImage(const char* imageName, Image image, ShaderEffect shaderEffect);
  128 + void SetUpBubbleEmission( const Vector2& emitPosition, const Vector2& direction );
  129 + Geometry CreateMeshGeometry();
  130 + ShaderEffect CreateColorModifierer( const Vector3& rgbDelta );
85 131  
  132 + static void NewWindow(void);
  133 +
  134 + bool OnTrackTimerTick();
  135 + void OnKeyEvent(const KeyEvent& event);
  136 + bool OnLoseContextButtonClicked( Toolkit::Button button );
  137 + void OnContextLost();
  138 + void OnContextRegained();
86 139  
87 140 private:
88 141 Application mApplication;
89   - Actor mCastingLight;
90 142 TextLabel mTextActor;
91   - ImageActor mImageActor;
92   - ImageActor mBlendActor;
93   - Image mEffectImage;
94   - Image mBaseImage;
95   - MeshActor mMeshActor;
96   - MeshActor mAnimatedMeshActor;
97 143  
98 144 Toolkit::Control mView; ///< The View instance.
99 145 Toolkit::ToolBar mToolBar; ///< The View's Toolbar.
100   - TextLabel mTitleActor; ///< The Toolbar's Title.
  146 + TextLabel mTitleActor; ///< The Toolbar's Title.
101 147 Layer mContentLayer; ///< Content layer (scrolling cluster content)
102 148 Toolkit::PushButton mLoseContextButton;
103   - Vector3 mHSVDelta;
104   - Toolkit::BubbleEmitter mEmitter;
105 149  
  150 + Toolkit::BubbleEmitter mEmitter;
106 151 Timer mEmitTrackTimer;
107   - Timer mExplodeTimer;
108 152 bool mNeedNewAnimation;
109   -
110 153 unsigned int mAnimateComponentCount;
111 154 Animation mEmitAnimation;
112 155 };
... ... @@ -114,7 +157,6 @@ private:
114 157  
115 158 NewWindowController::NewWindowController( Application& application )
116 159 : mApplication(application),
117   - mHSVDelta(0.5f, 0.0f, 0.5f),
118 160 mNeedNewAnimation(true)
119 161 {
120 162 mApplication.InitSignal().Connect(this, &NewWindowController::Create);
... ... @@ -136,10 +178,17 @@ void NewWindowController::Create( Application&amp; app )
136 178 mContentLayer = DemoHelper::CreateView( app,
137 179 mView,
138 180 mToolBar,
139   - BACKGROUND_IMAGE,
  181 + "",
140 182 TOOLBAR_IMAGE,
141 183 "Context recovery" );
142 184  
  185 + Size stageSize = stage.GetSize();
  186 + Image backgroundImage = ResourceImage::New( BACKGROUND_IMAGE, Dali::ImageDimensions( stageSize.x, stageSize.y ), Dali::FittingMode::SCALE_TO_FILL, Dali::SamplingMode::BOX_THEN_LINEAR );
  187 + ImageActor backgroundActor = ImageActor::New( backgroundImage );
  188 + backgroundActor.SetParentOrigin( ParentOrigin::CENTER );
  189 + backgroundActor.SetZ(-2.f);
  190 + mContentLayer.Add(backgroundActor);
  191 +
143 192 // Point the default render task at the view
144 193 RenderTaskList taskList = stage.GetRenderTaskList();
145 194 RenderTask defaultTask = taskList.GetTask( 0u );
... ... @@ -153,29 +202,28 @@ void NewWindowController::Create( Application&amp; app )
153 202 mLoseContextButton.ClickedSignal().Connect( this, &NewWindowController::OnLoseContextButtonClicked );
154 203 mToolBar.AddControl( mLoseContextButton, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Toolkit::Alignment::HorizontalRight, DemoHelper::DEFAULT_MODE_SWITCH_PADDING );
155 204  
156   -
157 205 Actor logoLayoutActor = Actor::New();
158 206 logoLayoutActor.SetParentOrigin(ParentOrigin::CENTER);
159 207 logoLayoutActor.SetPosition(0.0f, -200.0f, 0.0f);
160 208 logoLayoutActor.SetScale(0.5f);
161 209 mContentLayer.Add(logoLayoutActor);
162 210  
163   - Image image = ResourceImage::New(DALI_IMAGE_DIR "dali-logo.png");
164   - mImageActor = ImageActor::New(image);
165   - mImageActor.SetName("dali-logo");
166   - mImageActor.SetParentOrigin(ParentOrigin::CENTER);
167   - mImageActor.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER);
168   - logoLayoutActor.Add(mImageActor);
  211 + Image image = ResourceImage::New(LOGO_IMAGE);
  212 + ImageActor imageActor = ImageActor::New(image);
  213 + imageActor.SetName("dali-logo");
  214 + imageActor.SetParentOrigin(ParentOrigin::CENTER);
  215 + imageActor.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER);
  216 + logoLayoutActor.Add(imageActor);
169 217  
170   - ImageActor mirrorImageActor = CreateBlurredMirrorImage(DALI_IMAGE_DIR "dali-logo.png");
  218 + ImageActor mirrorImageActor = CreateBlurredMirrorImage(LOGO_IMAGE);
171 219 mirrorImageActor.SetParentOrigin(ParentOrigin::CENTER);
172 220 mirrorImageActor.SetAnchorPoint(AnchorPoint::TOP_CENTER);
173 221 logoLayoutActor.Add(mirrorImageActor);
174 222  
175   - CreateBubbles(stage.GetSize());
176   - CreateMeshActor();
177   - CreateBlending();
178   - CreateText();
  223 + AddBubbles(stage.GetSize());
  224 + AddMeshActor();
  225 + AddBlendingImageActor();
  226 + AddTextLabel();
179 227  
180 228 stage.ContextLostSignal().Connect(this, &NewWindowController::OnContextLost);
181 229 stage.ContextRegainedSignal().Connect(this, &NewWindowController::OnContextRegained);
... ... @@ -186,51 +234,109 @@ void NewWindowController::Destroy( Application&amp; app )
186 234 UnparentAndReset(mTextActor);
187 235 }
188 236  
189   -bool NewWindowController::OnLoseContextButtonClicked( Toolkit::Button button )
  237 +void NewWindowController::AddBubbles(const Vector2& stageSize)
190 238 {
191   - // Add as an idle callback to avoid ProcessEvents being recursively called.
192   - mApplication.AddIdle( MakeCallback( NewWindowController::NewWindow ) );
193   - return true;
  239 + mEmitter = Toolkit::BubbleEmitter::New( stageSize,
  240 + ResourceImage::New( DALI_IMAGE_DIR "bubble-ball.png" ),
  241 + 200, Vector2( 5.0f, 5.0f ) );
  242 +
  243 + Image background = ResourceImage::New(BACKGROUND_IMAGE);
  244 + mEmitter.SetBackground( background, Vector3(0.5f, 0.f,0.5f) );
  245 + mEmitter.SetBubbleDensity( 9.f );
  246 + Actor bubbleRoot = mEmitter.GetRootActor();
  247 + mContentLayer.Add( bubbleRoot );
  248 + bubbleRoot.SetParentOrigin(ParentOrigin::CENTER);
  249 + bubbleRoot.SetZ(0.1f);
  250 +
  251 + mEmitTrackTimer = Timer::New( EMIT_INTERVAL_IN_MS );
  252 + mEmitTrackTimer.TickSignal().Connect(this, &NewWindowController::OnTrackTimerTick);
  253 + mEmitTrackTimer.Start();
194 254 }
195 255  
196   -void NewWindowController::CreateMeshActor()
  256 +void NewWindowController::AddMeshActor()
197 257 {
198   - mEffectImage = ResourceImage::New(EFFECT_IMAGE);
199   -
200   - Material baseMaterial = Material::New( "Material1" );
201   - Dali::MeshActor meshActor = MeshActor::New( CreateMesh(true, baseMaterial) );
202   - meshActor.SetScale( 100.0f );
203   - meshActor.SetParentOrigin( ParentOrigin::CENTER );
204   - meshActor.SetPosition(Vector3( -150.0f, 200.0f, 0.0f ));
205   - meshActor.SetName("MeshActor");
206   - mContentLayer.Add( meshActor );
207   -
208   - Material orchidMaterial = Material::New( "Material2" );
209   - orchidMaterial.SetDiffuseTexture(mEffectImage);
210   -
211   - Dali::MeshActor meshActor2 = MeshActor::New( CreateMesh(false, orchidMaterial) );
212   - meshActor2.SetScale( 100.0f );
213   - meshActor2.SetParentOrigin( ParentOrigin::CENTER );
214   - meshActor2.SetPosition(Vector3( -150.0f, 310.0f, 0.0f ));
215   - meshActor2.SetName("MeshActor");
216   - mContentLayer.Add( meshActor2 );
  258 + Geometry meshGeometry = CreateMeshGeometry();
  259 +
  260 + // Create a coloured mesh
  261 + Shader shaderColorMesh = Shader::New( VERTEX_COLOR_MESH, FRAGMENT_COLOR_MESH );
  262 + Material colorMeshmaterial = Material::New( shaderColorMesh );
  263 + Renderer colorMeshRenderer = Renderer::New( meshGeometry, colorMeshmaterial );
  264 +
  265 + Actor colorMeshActor = Actor::New();
  266 + colorMeshActor.AddRenderer( colorMeshRenderer );
  267 + colorMeshActor.SetSize( 175.f,175.f );
  268 + colorMeshActor.SetParentOrigin( ParentOrigin::CENTER );
  269 + colorMeshActor.SetAnchorPoint(AnchorPoint::TOP_CENTER);
  270 + colorMeshActor.SetPosition(Vector3(0.0f, 50.0f, 0.0f));
  271 + colorMeshActor.SetOrientation( Degree(75.f), Vector3::XAXIS );
  272 + colorMeshActor.SetName("ColorMeshActor");
  273 + mContentLayer.Add( colorMeshActor );
  274 +
  275 + // Create a textured mesh
  276 + Image effectImage = ResourceImage::New(EFFECT_IMAGE);
  277 + Sampler sampler = Sampler::New(effectImage, "sTexture");
  278 +
  279 + Shader shaderTextureMesh = Shader::New( VERTEX_TEXTURE_MESH, FRAGMENT_TEXTURE_MESH );
  280 + Material textureMeshMaterial = Material::New( shaderTextureMesh );
  281 + textureMeshMaterial.AddSampler( sampler );
  282 + Renderer textureMeshRenderer = Renderer::New( meshGeometry, textureMeshMaterial );
  283 +
  284 + Actor textureMeshActor = Actor::New();
  285 + textureMeshActor.AddRenderer( textureMeshRenderer );
  286 + textureMeshActor.SetSize( 175.f,175.f );
  287 + textureMeshActor.SetParentOrigin( ParentOrigin::CENTER );
  288 + textureMeshActor.SetAnchorPoint(AnchorPoint::TOP_CENTER);
  289 + textureMeshActor.SetPosition(Vector3(0.0f, 200.0f, 0.0f));
  290 + textureMeshActor.SetOrientation( Degree(75.f), Vector3::XAXIS );
  291 + textureMeshActor.SetName("TextureMeshActor");
  292 + mContentLayer.Add( textureMeshActor );
217 293 }
218 294  
219   -FrameBufferImage NewWindowController::CreateMirrorImage(const char* imageName)
  295 +void NewWindowController::AddBlendingImageActor()
220 296 {
221   - FrameBufferImage fbo;
222   - Image image = ResourceImage::New(imageName);
223   - fbo = CreateFrameBufferForImage(imageName, image, ShaderEffect());
224   - return fbo;
  297 + ShaderEffect colorModifier = CreateColorModifierer(Vector3( 0.5f, 0.5f, 0.5f ));
  298 + Image effectImage = ResourceImage::New(EFFECT_IMAGE);
  299 + FrameBufferImage fb2 = CreateFrameBufferForImage( EFFECT_IMAGE, effectImage, colorModifier );
  300 +
  301 + ImageActor tmpActor = ImageActor::New(fb2);
  302 + mContentLayer.Add(tmpActor);
  303 + tmpActor.SetParentOrigin(ParentOrigin::CENTER_RIGHT);
  304 + tmpActor.SetAnchorPoint(AnchorPoint::TOP_RIGHT);
  305 + tmpActor.SetPosition(Vector3(0.0f, 150.0f, 0.0f));
  306 + tmpActor.SetScale(0.25f);
  307 +
  308 + // create blending shader effect
  309 + ShaderEffect blendShader = ShaderEffect::New( "", FRAGMENT_BLEND_SHADER );
  310 + blendShader.SetEffectImage( fb2 );
  311 + blendShader.SetUniform("alpha", 0.5f);
  312 +
  313 + Image baseImage = ResourceImage::New(BASE_IMAGE);
  314 + ImageActor blendActor = ImageActor::New( baseImage );
  315 + blendActor.SetParentOrigin(ParentOrigin::CENTER_RIGHT);
  316 + blendActor.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
  317 + blendActor.SetPosition(Vector3(0.0f, 100.0f, 0.0f));
  318 + blendActor.SetSize(140, 140);
  319 + blendActor.SetShaderEffect( blendShader );
  320 + mContentLayer.Add(blendActor);
  321 +}
  322 +
  323 +void NewWindowController::AddTextLabel()
  324 +{
  325 + mTextActor = TextLabel::New("Some text");
  326 + mTextActor.SetParentOrigin(ParentOrigin::CENTER);
  327 + mTextActor.SetColor(Color::RED);
  328 + mTextActor.SetName("PushMe text");
  329 + mContentLayer.Add( mTextActor );
225 330 }
226 331  
227 332 ImageActor NewWindowController::CreateBlurredMirrorImage(const char* imageName)
228 333 {
229   - FrameBufferImage fbo;
230 334 Image image = ResourceImage::New(imageName);
  335 +
231 336 Uint16Pair intFboSize = ResourceImage::GetImageSize(imageName);
232 337 Vector2 FBOSize = Vector2( intFboSize.GetWidth(), intFboSize.GetHeight() );
233   - fbo = FrameBufferImage::New( FBOSize.width, FBOSize.height, Pixel::RGBA8888);
  338 + FrameBufferImage fbo = FrameBufferImage::New( FBOSize.width, FBOSize.height, Pixel::RGBA8888);
  339 +
234 340 GaussianBlurView gbv = GaussianBlurView::New(5, 2.0f, Pixel::RGBA8888, 0.5f, 0.5f, true);
235 341 gbv.SetBackgroundColor(Color::TRANSPARENT);
236 342 gbv.SetUserImageAndOutputRenderTarget( image, fbo );
... ... @@ -285,38 +391,7 @@ FrameBufferImage NewWindowController::CreateFrameBufferForImage(const char* imag
285 391 return framebuffer;
286 392 }
287 393  
288   -void NewWindowController::CreateBubbles(Vector2 stageSize)
289   -{
290   - mEmitter = Toolkit::BubbleEmitter::New( stageSize,
291   - ResourceImage::New( DALI_IMAGE_DIR "bubble-ball.png" ),
292   - 1000, Vector2( 5.0f, 5.0f ) );
293   -
294   - Image background = ResourceImage::New(BACKGROUND_IMAGE);
295   - mEmitter.SetBackground( background, mHSVDelta );
296   - Actor bubbleRoot = mEmitter.GetRootActor();
297   - mContentLayer.Add( bubbleRoot );
298   - bubbleRoot.SetParentOrigin(ParentOrigin::CENTER);
299   - bubbleRoot.SetZ(0.1f);
300   -
301   - mEmitTrackTimer = Timer::New( EMIT_INTERVAL_IN_MS );
302   - mEmitTrackTimer.TickSignal().Connect(this, &NewWindowController::OnTrackTimerTick);
303   - mEmitTrackTimer.Start();
304   -
305   - //mExplodeTimer = Timer::New( Random::Range(4000.f, 8000.f) );
306   - //mExplodeTimer.TickSignal().Connect(this, &NewWindowController::OnExplodeTimerTick);
307   - //mExplodeTimer.Start();
308   -}
309   -
310   -bool NewWindowController::OnExplodeTimerTick()
311   -{
312   - mEmitter.StartExplosion( EXPLOSION_DURATION, 5.0f );
313   -
314   - mExplodeTimer = Timer::New( Random::Range(4.f, 8.f) );
315   - mExplodeTimer.TickSignal().Connect(this, &NewWindowController::OnExplodeTimerTick);
316   - return false;
317   -}
318   -
319   -void NewWindowController::SetUpAnimation( Vector2 emitPosition, Vector2 direction )
  394 +void NewWindowController::SetUpBubbleEmission( const Vector2& emitPosition, const Vector2& direction)
320 395 {
321 396 if( mNeedNewAnimation )
322 397 {
... ... @@ -326,17 +401,97 @@ void NewWindowController::SetUpAnimation( Vector2 emitPosition, Vector2 directio
326 401 mAnimateComponentCount = 0;
327 402 }
328 403  
329   - mEmitter.EmitBubble( mEmitAnimation, emitPosition, direction, Vector2(1, 1) );
  404 + mEmitter.EmitBubble( mEmitAnimation, emitPosition, direction, Vector2(10,10) );
330 405  
331 406 mAnimateComponentCount++;
332 407  
333   - if( mAnimateComponentCount % 20 ==0 )
  408 + if( mAnimateComponentCount % 6 ==0 )
334 409 {
335 410 mEmitAnimation.Play();
336 411 mNeedNewAnimation = true;
337 412 }
338 413 }
339 414  
  415 +Geometry NewWindowController::CreateMeshGeometry()
  416 +{
  417 + // Create vertices and specify their color
  418 + struct Vertex
  419 + {
  420 + Vector3 position;
  421 + Vector2 textureCoordinates;
  422 + Vector3 color;
  423 + };
  424 +
  425 + Vertex vertexData[5] = {
  426 + { Vector3( 0.0f, 0.0f, 0.5f ), Vector2(0.5f, 0.5f), Vector3(1.0f, 1.0f, 1.0f) },
  427 + { Vector3( -0.5f, -0.5f, 0.0f ), Vector2(0.0f, 0.0f), Vector3(1.0f, 0.0f, 0.0f) },
  428 + { Vector3( 0.5f, -0.5f, 0.0f ), Vector2(1.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f) },
  429 + { Vector3( -0.5f, 0.5f, 0.0f ), Vector2(0.0f, 1.0f), Vector3(0.0f, 1.0f, 0.0f) },
  430 + { Vector3( 0.5f, 0.5f, 0.0f ), Vector2(1.0f, 1.0f), Vector3(0.0f, 0.0f, 1.0f) } };
  431 +
  432 + Property::Map vertexFormat;
  433 + vertexFormat["aPosition"] = Property::VECTOR3;
  434 + vertexFormat["aTexCoord"] = Property::VECTOR2;
  435 + vertexFormat["aColor"] = Property::VECTOR3;
  436 + PropertyBuffer vertices = PropertyBuffer::New( vertexFormat, 5 );
  437 + vertices.SetData( vertexData );
  438 +
  439 + // Specify all the faces
  440 + unsigned int indexData[12] = { 0,1,3,0,2,4,0,3,4,0,2,1 };
  441 + Property::Map indexFormat;
  442 + indexFormat["indices"] = Property::UNSIGNED_INTEGER;
  443 + PropertyBuffer indices = PropertyBuffer::New( indexFormat, 12 );
  444 + indices.SetData( indexData );
  445 +
  446 + // Create the geometry object
  447 + Geometry geometry = Geometry::New();
  448 + geometry.AddVertexBuffer( vertices );
  449 + geometry.SetIndexBuffer( indices );
  450 +
  451 + return geometry;
  452 +}
  453 +
  454 +ShaderEffect NewWindowController::CreateColorModifierer( const Vector3& rgbDelta )
  455 +{
  456 + std::string fragmentShader = MAKE_SHADER(
  457 + precision highp float;\n
  458 + uniform vec3 uRGBDelta;\n
  459 + uniform float uIgnoreAlpha;\n
  460 + float rand(vec2 co) \n
  461 + {\n
  462 + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); \n}
  463 + \n
  464 + void main() {\n
  465 + vec4 color = texture2D(sTexture, vTexCoord); \n
  466 + // modify the hsv Value
  467 + color.rgb += uRGBDelta * rand(vTexCoord); \n
  468 + // if the new vale exceeds one, then decrease it
  469 + color.rgb -= max(color.rgb*2.0 - vec3(2.0), 0.0);\n
  470 + // if the new vale drops below zero, then increase it
  471 + color.rgb -= min(color.rgb*2.0, 0.0);\n
  472 + gl_FragColor = color; \n
  473 + }\n
  474 + );
  475 +
  476 + ShaderEffect shaderEffect = ShaderEffect::New("", fragmentShader);
  477 + shaderEffect.SetUniform( "uRGBDelta", rgbDelta );
  478 +
  479 + return shaderEffect;
  480 +}
  481 +
  482 +void NewWindowController::NewWindow(void)
  483 +{
  484 + PositionSize posSize(0, 0, 720, 1280);
  485 + gApplication.ReplaceWindow(posSize, "NewWindow"); // Generates a new window
  486 +}
  487 +
  488 +bool NewWindowController::OnLoseContextButtonClicked( Toolkit::Button button )
  489 +{
  490 + // Add as an idle callback to avoid ProcessEvents being recursively called.
  491 + mApplication.AddIdle( MakeCallback( NewWindowController::NewWindow ) );
  492 + return true;
  493 +}
  494 +
340 495 bool NewWindowController::OnTrackTimerTick()
341 496 {
342 497 static int time=0;
... ... @@ -351,82 +506,13 @@ bool NewWindowController::OnTrackTimerTick()
351 506 Vector2 direction = aimPos-position;
352 507 Vector2 stageSize = Stage::GetCurrent().GetSize();
353 508  
354   - for(int i=0; i<20; i++)
355   - {
356   - SetUpAnimation( stageSize*0.5f+position, direction );
357   - }
  509 + SetUpBubbleEmission( stageSize*0.5f+position, direction );
  510 + SetUpBubbleEmission( stageSize*0.5f+position*0.75f, direction );
  511 + SetUpBubbleEmission( stageSize*0.5f+position*0.7f, direction );
358 512  
359 513 return true;
360 514 }
361 515  
362   -
363   -void NewWindowController::CreateBlending()
364   -{
365   - Toolkit::ColorAdjuster colorAdjuster = ColorAdjuster::New(mHSVDelta);
366   - FrameBufferImage fb2 = CreateFrameBufferForImage( EFFECT_IMAGE, mEffectImage, colorAdjuster );
367   -
368   - ImageActor tmpActor = ImageActor::New(fb2);
369   - mContentLayer.Add(tmpActor);
370   - tmpActor.SetParentOrigin(ParentOrigin::BOTTOM_RIGHT);
371   - tmpActor.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
372   - tmpActor.SetScale(0.25f);
373   -
374   - // create blending shader effect
375   - ShaderEffect blendShader = ShaderEffect::New( "", FRAG_SHADER );
376   - blendShader.SetEffectImage( fb2 );
377   - blendShader.SetUniform("alpha", 0.5f);
378   -
379   - mBaseImage = ResourceImage::New(BASE_IMAGE);
380   - mBlendActor = ImageActor::New( mBaseImage );
381   - mBlendActor.SetParentOrigin(ParentOrigin::CENTER);
382   - mBlendActor.SetPosition(Vector3(150.0f, 200.0f, 0.0f));
383   - mBlendActor.SetSize(140, 140);
384   - mBlendActor.SetShaderEffect( blendShader );
385   - mContentLayer.Add(mBlendActor);
386   -}
387   -
388   -void NewWindowController::CreateText()
389   -{
390   - mTextActor = TextLabel::New("Some text");
391   - mTextActor.SetParentOrigin(ParentOrigin::CENTER);
392   - mTextActor.SetColor(Color::RED);
393   - mTextActor.SetName("PushMe text");
394   - mContentLayer.Add( mTextActor );
395   -}
396   -
397   -Mesh NewWindowController::CreateMesh(bool hasColor, Material material)
398   -{
399   - // Create vertices and specify their color
400   - MeshData::VertexContainer vertices(4);
401   - vertices[ 0 ] = MeshData::Vertex( Vector3( -0.5f, -0.5f, 0.0f ), Vector2(0.0f, 0.0f), Vector3(1.0f, 0.0f, 0.0f) );
402   - vertices[ 1 ] = MeshData::Vertex( Vector3( 0.5f, -0.5f, 0.0f ), Vector2(1.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f) );
403   - vertices[ 2 ] = MeshData::Vertex( Vector3( -0.5f, 0.5f, 0.0f ), Vector2(0.0f, 1.0f), Vector3(0.0f,1.0f,0.0f) );
404   - vertices[ 3 ] = MeshData::Vertex( Vector3( 0.5f, 0.5f, 0.0f ), Vector2(1.0f, 1.0f), Vector3(0.0f,0.0f,1.0f) );
405   -
406   - // Specify all the faces
407   - MeshData::FaceIndices faces;
408   - faces.reserve( 6 ); // 2 triangles in Quad
409   - faces.push_back( 0 ); faces.push_back( 3 ); faces.push_back( 1 );
410   - faces.push_back( 0 ); faces.push_back( 2 ); faces.push_back( 3 );
411   -
412   - // Create the mesh data from the vertices and faces
413   - MeshData meshData;
414   - meshData.SetHasColor( hasColor );
415   - meshData.SetMaterial( material );
416   - meshData.SetVertices( vertices );
417   - meshData.SetFaceIndices( faces );
418   -
419   - // Create a mesh from the data
420   - Dali::Mesh mesh = Mesh::New( meshData );
421   - return mesh;
422   -}
423   -
424   -void NewWindowController::NewWindow(void)
425   -{
426   - PositionSize posSize(0, 0, 720, 1280);
427   - gApplication.ReplaceWindow(posSize, "NewWindow"); // Generates a new window
428   -}
429   -
430 516 void NewWindowController::OnKeyEvent(const KeyEvent& event)
431 517 {
432 518 if(event.state == KeyEvent::Down)
... ... @@ -448,9 +534,6 @@ void NewWindowController::OnContextRegained()
448 534 printf("Stage reporting context regain\n");
449 535 }
450 536  
451   -
452   -
453   -
454 537 void RunTest(Application& app)
455 538 {
456 539 gNewWindowController = new NewWindowController(app);
... ... @@ -459,7 +542,6 @@ void RunTest(Application&amp; app)
459 542  
460 543 // Entry point for Linux & Tizen applications
461 544 //
462   -
463 545 int main(int argc, char **argv)
464 546 {
465 547 gApplication = Application::New(&argc, &argv, DALI_DEMO_THEME_PATH);
... ...
examples/page-turn-view/page-turn-view-example.cpp
... ... @@ -17,7 +17,6 @@
17 17  
18 18 #include <dali/dali.h>
19 19 #include <dali-toolkit/dali-toolkit.h>
20   -#include <dali-toolkit/devel-api/shader-effects/page-turn-effect.h>
21 20 #include <dali-toolkit/devel-api/controls/page-turn-view/page-factory.h>
22 21 #include <dali-toolkit/devel-api/controls/page-turn-view/page-turn-landscape-view.h>
23 22 #include <dali-toolkit/devel-api/controls/page-turn-view/page-turn-portrait-view.h>
... ...
examples/path-animation/path-animation.cpp deleted
1   -/*
2   - * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3   - *
4   - * Licensed under the Apache License, Version 2.0 (the "License");
5   - * you may not use this file except in compliance with the License.
6   - * You may obtain a copy of the License at
7   - *
8   - * http://www.apache.org/licenses/LICENSE-2.0
9   - *
10   - * Unless required by applicable law or agreed to in writing, software
11   - * distributed under the License is distributed on an "AS IS" BASIS,
12   - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   - * See the License for the specific language governing permissions and
14   - * limitations under the License.
15   - *
16   - */
17   -
18   -/**
19   - * This example shows how to use path animations in DALi
20   - */
21   -
22   -// EXTERNAL INCLUDES
23   -#include <dali-toolkit/dali-toolkit.h>
24   -#include <dali/devel-api/actors/mesh-actor.h>
25   -#include <dali/devel-api/geometry/mesh.h>
26   -#include <dali/devel-api/geometry/mesh-factory.h>
27   -#include <dali-toolkit/devel-api/controls/slider/slider.h>
28   -
29   -
30   -
31   -// INTERNAL INCLUDES
32   -#include "shared/view.h"
33   -
34   -using namespace Dali;
35   -using namespace Dali::Toolkit;
36   -
37   -
38   -namespace
39   -{
40   -const char* BACKGROUND_IMAGE( DALI_IMAGE_DIR "background-default.png" );
41   -const char* ACTOR_IMAGE( DALI_IMAGE_DIR "dali-logo.png" );
42   -const char* TOOLBAR_IMAGE( DALI_IMAGE_DIR "top-bar.png" );
43   -const char* APPLICATION_TITLE( "Path Animation Example" );
44   -}; //Unnamed namespace
45   -
46   -/**
47   - * @brief The main class of the demo.
48   - */
49   -class PathController : public ConnectionTracker
50   -{
51   -public:
52   -
53   - PathController( Application& application )
54   -: mApplication( application )
55   -{
56   - // Connect to the Application's Init signal
57   - mApplication.InitSignal().Connect( this, &PathController::Create );
58   -}
59   -
60   - ~PathController()
61   - {
62   - // Nothing to do here.
63   - }
64   -
65   - /*
66   - * Create a control composed of a label and an slider
67   - * @param[in] label The text to be displayed ny the label
68   - * @param[in] size The size of the slider
69   - * @param[in] callback Pointer to the callback function to be called when user moves the slider
70   - */
71   - Actor CreateVectorComponentControl( const std::string& label, const Vector3& size, bool(PathController::*callback)(Dali::Toolkit::Slider,float) )
72   - {
73   - TextLabel text = TextLabel::New(label);
74   - text.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::WIDTH );
75   - text.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT );
76   - text.SetColor( Vector4(0.0f,0.0f,0.0f,1.0f));
77   -
78   - Slider slider = Slider::New();
79   - slider.SetAnchorPoint( AnchorPoint::CENTER_LEFT);
80   - slider.SetParentOrigin( ParentOrigin::CENTER_RIGHT);
81   - slider.SetProperty(Slider::Property::LOWER_BOUND, -1.0f );
82   - slider.SetProperty(Slider::Property::UPPER_BOUND, 1.0f );
83   -
84   - Property::Array marks;
85   - float mark = -1.0f;
86   - for(unsigned short i(0); i<21; ++i )
87   - {
88   - marks.PushBack( mark );
89   - mark += 0.1f;
90   - }
91   -
92   - slider.SetProperty(Slider::Property::MARKS, marks);
93   - slider.SetProperty(Slider::Property::SNAP_TO_MARKS, true );
94   - slider.SetSize(size);
95   - slider.SetScale( 0.5f );
96   - slider.ValueChangedSignal().Connect(this,callback);
97   - text.Add( slider );
98   - return text;
99   - }
100   -
101   - /**
102   - * Crate all the GUI controls
103   - */
104   - void CreateControls()
105   - {
106   - Stage stage = Stage::GetCurrent();
107   -
108   - //TextInput
109   - Dali::Layer controlsLayer = Dali::Layer::New();
110   - controlsLayer.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS );
111   - controlsLayer.SetSizeModeFactor( Vector3( 1.0f, 0.3f, 1.0f ) );
112   - controlsLayer.SetPosition( 0.0f, stage.GetSize().y*0.8f, 0.0f );
113   - controlsLayer.SetAnchorPoint( AnchorPoint::TOP_LEFT);
114   - controlsLayer.SetParentOrigin( ParentOrigin::TOP_LEFT);
115   - controlsLayer.TouchedSignal().Connect(this, &PathController::OnTouchGuiLayer);
116   - stage.Add( controlsLayer );
117   -
118   - Vector3 textInputSize( stage.GetSize().x, stage.GetSize().y*0.04f, 0.0f );
119   - Actor control0 = CreateVectorComponentControl("x:", textInputSize, &PathController::OnSliderXValueChange );
120   - control0.SetY( stage.GetSize().y*0.05f );
121   - control0.SetAnchorPoint(AnchorPoint::TOP_LEFT);
122   - controlsLayer.Add( control0 );
123   -
124   - Actor control1 = CreateVectorComponentControl("y:", textInputSize, &PathController::OnSliderYValueChange );
125   - control1.SetAnchorPoint(AnchorPoint::TOP_LEFT);
126   - control1.SetParentOrigin( ParentOrigin::BOTTOM_LEFT );
127   - control1.SetPosition(0.0f,stage.GetSize().y*0.01,0.0f);
128   - control0.Add( control1 );
129   -
130   - Actor control2 =CreateVectorComponentControl("z:", textInputSize, &PathController::OnSliderZValueChange );
131   - control2.SetAnchorPoint(AnchorPoint::TOP_LEFT);
132   - control2.SetParentOrigin( ParentOrigin::BOTTOM_LEFT );
133   - control2.SetPosition(0.0f,stage.GetSize().y*0.01,0.0f);
134   - control1.Add( control2 );
135   - }
136   -
137   - /**
138   - * Draws the path and the control points for the path
139   - * @param[in] resolution Number of segments for the path.
140   - */
141   - void DrawPath( unsigned int resolution )
142   - {
143   - //Create path mesh actor
144   - Dali::MeshData meshData = MeshFactory::NewPath( mPath, resolution );
145   - Dali::Material material = Material::New("LineMaterial");
146   - material.SetDiffuseColor( Vector4(0.0f,0.0f,0.0f,1.0f));
147   - meshData.SetMaterial(material);
148   - Dali::Mesh mesh = Dali::Mesh::New( meshData );
149   - if( mMeshPath )
150   - {
151   - mContentLayer.Remove( mMeshPath );
152   - }
153   - mMeshPath = Dali::MeshActor::New( mesh );
154   - mMeshPath.SetAnchorPoint( AnchorPoint::TOP_LEFT );
155   - mMeshPath.SetParentOrigin( ParentOrigin::TOP_LEFT );
156   - mContentLayer.Add( mMeshPath );
157   -
158   -
159   - ////Create mesh connecting interpolation points and control points
160   - std::vector<Dali::MeshData::Vertex> vVertex;
161   - std::vector<unsigned short> vIndex;
162   - size_t pointCount = mPath.GetPointCount();
163   - size_t controlPointIndex = 0;
164   - for( size_t i(0); i<pointCount; ++i )
165   - {
166   - vVertex.push_back( MeshData::Vertex(mPath.GetPoint(i),Vector2::ZERO, Vector3::ZERO ) );
167   - if( i<pointCount-1)
168   - {
169   - vVertex.push_back( MeshData::Vertex(mPath.GetControlPoint(controlPointIndex),Vector2::ZERO, Vector3::ZERO ));
170   - vVertex.push_back( MeshData::Vertex(mPath.GetControlPoint(controlPointIndex+1),Vector2::ZERO, Vector3::ZERO ));
171   - }
172   - controlPointIndex += 2;
173   - }
174   -
175   - size_t segmentCount = 2*(pointCount-2)+2;
176   - unsigned short index=0;
177   - for( size_t i(0); i<segmentCount; ++i, ++index )
178   - {
179   - vIndex.push_back(index);
180   - vIndex.push_back(index+1);
181   -
182   - if( ~i & 1 )
183   - {
184   - index++;
185   - }
186   - }
187   -
188   - meshData.SetLineData( vVertex, vIndex, material );
189   - meshData.SetMaterial(material);
190   - mesh = Dali::Mesh::New( meshData );
191   - if( mMeshHandlers )
192   - {
193   - mContentLayer.Remove( mMeshHandlers );
194   - }
195   - mMeshHandlers = Dali::MeshActor::New( mesh );
196   - mMeshHandlers.SetAnchorPoint( AnchorPoint::TOP_LEFT );
197   - mMeshHandlers.SetParentOrigin( ParentOrigin::TOP_LEFT );
198   - mContentLayer.Add( mMeshHandlers );
199   -
200   -
201   - //Create actors representing interpolation points
202   - index = 0;
203   - for( size_t i(0); i<pointCount; ++i )
204   - {
205   - if( !mControlPoint[index] )
206   - {
207   - mControlPoint[index] = Toolkit::CreateSolidColorActor(Vector4(1.0f,1.0f,1.0f,1.0f));
208   - mControlPoint[index].SetParentOrigin( ParentOrigin::TOP_LEFT);
209   - mControlPoint[index].SetAnchorPoint( AnchorPoint::CENTER );
210   - mControlPoint[index].SetSize( 20.0f, 20.0f );
211   - mContentLayer.Add(mControlPoint[index]);
212   - }
213   -
214   - std::string name( "Knot");
215   - name.push_back(i);
216   - mControlPoint[index].SetName( name );
217   - mControlPoint[index].SetPosition( mPath.GetPoint(i) );
218   - mControlPoint[index].SetColor( Vector4(0.0f,0.0f,0.0f,1.0f));
219   - ++index;
220   - }
221   -
222   - //Create actors representing control points
223   - size_t controlPointCount=2*(pointCount-1);
224   - for( size_t i(0); i<controlPointCount; ++i )
225   - {
226   - if( !mControlPoint[index])
227   - {
228   - mControlPoint[index] = Toolkit::CreateSolidColorActor(Vector4(1.0f,1.0f,1.0f,1.0f));
229   - mControlPoint[index].SetParentOrigin( ParentOrigin::TOP_LEFT);
230   - mControlPoint[index].SetAnchorPoint( AnchorPoint::CENTER );
231   - mControlPoint[index].SetSize( 20.0f, 20.0f );
232   - mContentLayer.Add(mControlPoint[index]);
233   - }
234   - std::string name( "ControlPoint");
235   - name.push_back(i);
236   - mControlPoint[index].SetName( name );
237   - mControlPoint[index].SetPosition( mPath.GetControlPoint(i) );
238   - mControlPoint[index].SetColor( Vector4(1.0f,0.0f,0.0f,1.0f));
239   - ++index;
240   - }
241   - }
242   -
243   - /**
244   - * Create the path animation.
245   - */
246   - void CreateAnimation()
247   - {
248   - if( !mAnimation )
249   - {
250   - mAnimation = Animation::New( 2.0f );
251   - }
252   - else
253   - {
254   - mAnimation.Pause();
255   - mAnimation.Clear();
256   - mActor.SetOrientation( Quaternion() );
257   - }
258   -
259   - mAnimation.Animate( mActor, mPath, mForward );
260   - mAnimation.SetLooping( true );
261   - mAnimation.Play();
262   - }
263   -
264   - /**
265   - * Get closest control point.void
266   - * @param[in] point Point from where the distance is computed
267   - * @return The closest actor if the distance is beyond 0.5cm or an uninitialized actor otherwise
268   - */
269   - Actor GetClosestActor(const Vector3& point)
270   - {
271   - size_t pointCount = mPath.GetPointCount();
272   - size_t controlPointCount = 3*pointCount - 2;
273   - Actor result;
274   - float minDistance = 1.0/0.0;
275   -
276   - for( size_t i(0); i<controlPointCount; ++i )
277   - {
278   - Vector3 v = mControlPoint[i].GetCurrentPosition() - point;
279   - float distance = v.LengthSquared();
280   - if( distance < minDistance )
281   - {
282   - result = mControlPoint[i];
283   - minDistance = distance;
284   - }
285   - }
286   -
287   - Vector2 dpi = Dali::Stage::GetCurrent().GetDpi();
288   - float distanceTreshold = 0.2f * dpi.x * 0.2f * dpi.x;
289   -
290   - if( minDistance < distanceTreshold )
291   - {
292   - return result;
293   - }
294   - else
295   - {
296   - return Actor();
297   - }
298   - }
299   -
300   - /**
301   - * Callback called when the background layer is touched
302   - */
303   - bool OnTouchLayer(Actor actor, const TouchEvent& event)
304   - {
305   - if(event.GetPointCount()>0)
306   - {
307   - const TouchPoint& point = event.GetPoint(0);
308   -
309   - if(point.state==TouchPoint::Up)
310   - {
311   - //Stop dragging
312   - mDragActor.Reset();
313   - }
314   - else if(point.state==TouchPoint::Down)
315   - {
316   - Vector3 touchPoint = Vector3(event.GetPoint(0).screen.x, event.GetPoint(0).screen.y, 0.0f);
317   - if(!mDragActor )
318   - {
319   - mDragActor = GetClosestActor( touchPoint );
320   - if( !mDragActor && mPath.GetPointCount() < 10 )
321   - {
322   - // Add new point
323   - Vector3 lastPoint = mPath.GetPoint( mPath.GetPointCount()-1);
324   - mPath.AddPoint( touchPoint );
325   - Vector3 displacement = (touchPoint-lastPoint)/8;
326   - mPath.AddControlPoint( lastPoint + displacement );
327   - mPath.AddControlPoint( touchPoint - displacement);
328   -
329   - DrawPath( 200u );
330   - CreateAnimation();
331   - }
332   - }
333   - }
334   - else if( mDragActor && point.state==TouchPoint::Motion )
335   - {
336   - Vector3 touchPoint = Vector3(event.GetPoint(0).screen.x, event.GetPoint(0).screen.y, 0.0f);
337   - std::string actorName(mDragActor.GetName());
338   - if( actorName.compare(0, 4, "Knot") == 0)
339   - {
340   - int index = actorName[4];
341   - mPath.GetPoint(index) = touchPoint;
342   - }
343   - else
344   - {
345   - int index = actorName[12];
346   - mPath.GetControlPoint(index) = touchPoint;
347   - }
348   -
349   - DrawPath( 200u );
350   - CreateAnimation();
351   - }
352   - }
353   -
354   - return true;
355   - }
356   -
357   - bool OnTouchGuiLayer(Actor actor, const TouchEvent& event)
358   - {
359   - mDragActor.Reset();
360   - return false;
361   - }
362   - /**
363   - * Callback called when user changes slider X
364   - * @param[in] slider The slider that has generated the signal
365   - * @param[in] value The new value
366   - */
367   - bool OnSliderXValueChange( Slider s, float value)
368   - {
369   - if( fabs( value ) - Math::MACHINE_EPSILON_1000 < 0.0f )
370   - {
371   - mForward.x = 0.0f;
372   - }
373   - else
374   - {
375   - mForward.x = value;
376   - }
377   -
378   - CreateAnimation();
379   - return true;
380   - }
381   -
382   - /**
383   - * Callback called when user changes slider Y
384   - * @param[in] slider The slider that has generated the signal
385   - * @param[in] value The new value
386   - */
387   - bool OnSliderYValueChange( Slider s, float value)
388   - {
389   - if( fabs( value ) - Math::MACHINE_EPSILON_1000 < 0.0f )
390   - {
391   - mForward.y = 0.0f;
392   - }
393   - else
394   - {
395   - mForward.y = value;
396   - }
397   - CreateAnimation();
398   - return true;
399   - }
400   -
401   - /**
402   - * Callback called when user changes slider Z
403   - * @param[in] slider The slider that has generated the signal
404   - * @param[in] value The new value
405   - */
406   - bool OnSliderZValueChange( Slider s, float value)
407   - {
408   - if( fabs( value ) - Math::MACHINE_EPSILON_1000 < 0.0f )
409   - {
410   - mForward.z = 0.0f;
411   - }
412   - else
413   - {
414   - mForward.z = value;
415   - }
416   -
417   - CreateAnimation();
418   - return true;
419   - }
420   -
421   - /**
422   - * Main key event handler.
423   - * Quit on escape key.
424   - */
425   - void OnKeyEvent(const KeyEvent& event)
426   - {
427   - if( event.state == KeyEvent::Down )
428   - {
429   - if( IsKey( event, Dali::DALI_KEY_ESCAPE ) ||
430   - IsKey( event, Dali::DALI_KEY_BACK ) )
431   - {
432   - mApplication.Quit();
433   - }
434   - }
435   - }
436   -
437   - /**
438   - * One-time setup in response to Application InitSignal.
439   - */
440   - void Create( Application& application )
441   - {
442   - // Get a handle to the stage:
443   - Stage stage = Stage::GetCurrent();
444   -
445   - // Connect to input event signals:
446   - stage.KeyEventSignal().Connect(this, &PathController::OnKeyEvent);
447   -
448   - // Create a default view with a default tool bar:
449   - Toolkit::Control view; ///< The View instance.
450   - Toolkit::ToolBar toolBar; ///< The View's Toolbar.
451   - mContentLayer = DemoHelper::CreateView( mApplication,
452   - view,
453   - toolBar,
454   - BACKGROUND_IMAGE,
455   - TOOLBAR_IMAGE,
456   - "" );
457   - mContentLayer.SetDrawMode( DrawMode::OVERLAY );
458   -
459   - mContentLayer.TouchedSignal().Connect(this, &PathController::OnTouchLayer);
460   -
461   - //Title
462   - TextLabel title = DemoHelper::CreateToolBarLabel( APPLICATION_TITLE );
463   - toolBar.AddControl( title, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarTitlePercentage, Alignment::HorizontalCenter );
464   -
465   - //Path
466   - mPath = Dali::Path::New();
467   - mPath.AddPoint( Vector3( 10.0f, stage.GetSize().y*0.5f, 0.0f ));
468   - mPath.AddPoint( Vector3( stage.GetSize().x*0.5f, stage.GetSize().y*0.5f, 0.0f ));
469   - mPath.GenerateControlPoints(0.25f);
470   - DrawPath( 200u );
471   -
472   - //Actor
473   - Image img = ResourceImage::New(ACTOR_IMAGE);
474   - mActor = ImageActor::New( img );
475   - mActor.SetAnchorPoint( AnchorPoint::CENTER );
476   - mActor.SetSize( 100, 50, 1 );
477   - mContentLayer.Add( mActor );
478   -
479   - CreateAnimation();
480   - CreateControls();
481   - }
482   -
483   -private:
484   - Application& mApplication;
485   -
486   - Layer mContentLayer; ///< The content layer
487   -
488   - Path mPath; ///< The path used in the animation
489   - ImageActor mActor; ///< Actor being animated
490   - Vector3 mForward; ///< Current forward vector
491   - Animation mAnimation; ///< Path animation
492   -
493   - MeshActor mMeshPath; ///< Mesh actor for the path
494   - MeshActor mMeshHandlers; ///< Mesh actor for the handlers of the path
495   -
496   - Actor mControlPoint[28]; ///< ImageActors represeting control points of the path
497   -
498   - Actor mDragActor; ///< Reference to the actor currently being dragged
499   -};
500   -
501   -
502   -void RunTest( Application& application )
503   -{
504   - PathController test( application );
505   -
506   - application.MainLoop();
507   -}
508   -
509   -/** Entry point for Linux & Tizen applications */
510   -int main( int argc, char **argv )
511   -{
512   - Application application = Application::New( &argc, &argv, DALI_DEMO_THEME_PATH );
513   -
514   - RunTest( application );
515   -
516   - return 0;
517   -}
examples/point-mesh/point-mesh-example.cpp 0 โ†’ 100644
  1 +/*
  2 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + *
  16 + */
  17 +
  18 +// EXTERNAL INCLUDES
  19 +#include <dali/devel-api/rendering/renderer.h>
  20 +#include <dali-toolkit/dali-toolkit.h>
  21 +
  22 +// INTERNAL INCLUDES
  23 +#include "shared/view.h"
  24 +
  25 +using namespace Dali;
  26 +
  27 +namespace
  28 +{
  29 +const char* MATERIAL_SAMPLE( DALI_IMAGE_DIR "gallery-small-48.jpg" );
  30 +const char* MATERIAL_SAMPLE2( DALI_IMAGE_DIR "gallery-medium-19.jpg" );
  31 +
  32 +#define MAKE_SHADER(A)#A
  33 +
  34 +const char* VERTEX_SHADER = MAKE_SHADER(
  35 +attribute mediump vec2 aPosition;
  36 +attribute highp float aHue;
  37 +varying mediump vec2 vTexCoord;
  38 +uniform mediump mat4 uMvpMatrix;
  39 +uniform mediump vec3 uSize;
  40 +uniform mediump float uPointSize;
  41 +uniform lowp vec4 uFadeColor;
  42 +varying mediump vec3 vVertexColor;
  43 +varying mediump float vHue;
  44 +
  45 +vec3 hsv2rgb(vec3 c)
  46 +{
  47 + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
  48 + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
  49 + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
  50 +}
  51 +
  52 +void main()
  53 +{
  54 + mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);
  55 + vertexPosition.xyz *= (uSize-uPointSize);
  56 + vertexPosition = uMvpMatrix * vertexPosition;
  57 + vVertexColor = hsv2rgb( vec3( aHue, 0.7, 1.0 ) );
  58 + vHue = aHue;
  59 + gl_PointSize = uPointSize;
  60 + gl_Position = vertexPosition;
  61 +}
  62 +);
  63 +
  64 +const char* FRAGMENT_SHADER = MAKE_SHADER(
  65 +varying mediump vec3 vVertexColor;
  66 +varying mediump float vHue;
  67 +uniform lowp vec4 uColor;
  68 +uniform sampler2D sTexture1;
  69 +uniform sampler2D sTexture2;
  70 +uniform lowp vec4 uFadeColor;
  71 +
  72 +void main()
  73 +{
  74 + mediump vec4 texCol1 = texture2D(sTexture1, gl_PointCoord);
  75 + mediump vec4 texCol2 = texture2D(sTexture2, gl_PointCoord);
  76 + gl_FragColor = vec4(vVertexColor, 1.0) * ((texCol1*vHue) + (texCol2*(1.0-vHue)));
  77 +}
  78 +);
  79 +
  80 +Geometry CreateGeometry()
  81 +{
  82 + // Create vertices
  83 + struct Vertex { Vector2 position; float hue; };
  84 +
  85 + unsigned int numSides = 20;
  86 + Vertex polyhedraVertexData[numSides];
  87 + float angle=0;
  88 + float sectorAngle = 2.0f * Math::PI / (float) numSides;
  89 +
  90 + for(unsigned int i=0; i<numSides; ++i)
  91 + {
  92 + polyhedraVertexData[i].position.x = sinf(angle)*0.5f;
  93 + polyhedraVertexData[i].position.y = cosf(angle)*0.5f;
  94 + polyhedraVertexData[i].hue = angle / ( 2.0f * Math::PI);
  95 + angle += sectorAngle;
  96 + }
  97 +
  98 + Property::Map polyhedraVertexFormat;
  99 + polyhedraVertexFormat["aPosition"] = Property::VECTOR2;
  100 + polyhedraVertexFormat["aHue"] = Property::FLOAT;
  101 + PropertyBuffer polyhedraVertices = PropertyBuffer::New( polyhedraVertexFormat, numSides );
  102 + polyhedraVertices.SetData(polyhedraVertexData);
  103 +
  104 + // Create the geometry object
  105 + Geometry polyhedraGeometry = Geometry::New();
  106 + polyhedraGeometry.AddVertexBuffer( polyhedraVertices );
  107 + polyhedraGeometry.SetGeometryType( Geometry::POINTS );
  108 +
  109 + return polyhedraGeometry;
  110 +}
  111 +
  112 +} // anonymous namespace
  113 +
  114 +// This example shows how to use a simple mesh
  115 +//
  116 +class ExampleController : public ConnectionTracker
  117 +{
  118 +public:
  119 +
  120 + /**
  121 + * The example controller constructor.
  122 + * @param[in] application The application instance
  123 + */
  124 + ExampleController( Application& application )
  125 + : mApplication( application )
  126 + {
  127 + // Connect to the Application's Init signal
  128 + mApplication.InitSignal().Connect( this, &ExampleController::Create );
  129 + }
  130 +
  131 + /**
  132 + * The example controller destructor
  133 + */
  134 + ~ExampleController()
  135 + {
  136 + // Nothing to do here;
  137 + }
  138 +
  139 + /**
  140 + * Invoked upon creation of application
  141 + * @param[in] application The application instance
  142 + */
  143 + void Create( Application& application )
  144 + {
  145 + Stage stage = Stage::GetCurrent();
  146 + stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
  147 +
  148 + mStageSize = stage.GetSize();
  149 +
  150 + // The Init signal is received once (only) during the Application lifetime
  151 +
  152 + // Hide the indicator bar
  153 + application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
  154 +
  155 + mImage = ResourceImage::New( MATERIAL_SAMPLE );
  156 + Image image = ResourceImage::New( MATERIAL_SAMPLE2 );
  157 + mSampler1 = Sampler::New(mImage, "sTexture1");
  158 + mSampler2 = Sampler::New(image, "sTexture2");
  159 +
  160 + mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
  161 +
  162 + mMaterial = Material::New( mShader );
  163 + mMaterial.AddSampler( mSampler1 );
  164 + mMaterial.AddSampler( mSampler2 );
  165 +
  166 + mGeometry = CreateGeometry();
  167 +
  168 + mRenderer = Renderer::New( mGeometry, mMaterial );
  169 +
  170 + mMeshActor = Actor::New();
  171 + mMeshActor.AddRenderer( mRenderer );
  172 + mMeshActor.SetSize(400, 400);
  173 +
  174 + mMeshActor.RegisterProperty( "uFadeColor", Color::GREEN );
  175 +
  176 + mRenderer.RegisterProperty( "uFadeColor", Color::MAGENTA );
  177 + mRenderer.RegisterProperty( "uPointSize", 80.0f );
  178 + mRenderer.SetDepthIndex(0);
  179 +
  180 + mMeshActor.SetParentOrigin( ParentOrigin::CENTER );
  181 + mMeshActor.SetAnchorPoint( AnchorPoint::CENTER );
  182 + stage.Add( mMeshActor );
  183 +
  184 + Animation animation = Animation::New(15);
  185 + KeyFrames keyFrames = KeyFrames::New();
  186 + keyFrames.Add(0.0f, Vector4::ZERO);
  187 + keyFrames.Add(1.0f, Vector4( 1.0f, 0.0f, 1.0f, 1.0f ));
  188 +
  189 + animation.AnimateBy( Property(mMeshActor, Actor::Property::ORIENTATION), Quaternion(Degree(360), Vector3::ZAXIS) );
  190 +
  191 + animation.SetLooping(true);
  192 + animation.Play();
  193 +
  194 + stage.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f));;
  195 + }
  196 +
  197 + /**
  198 + * Invoked whenever the quit button is clicked
  199 + * @param[in] button the quit button
  200 + */
  201 + bool OnQuitButtonClicked( Toolkit::Button button )
  202 + {
  203 + // quit the application
  204 + mApplication.Quit();
  205 + return true;
  206 + }
  207 +
  208 + void OnKeyEvent(const KeyEvent& event)
  209 + {
  210 + if(event.state == KeyEvent::Down)
  211 + {
  212 + if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) )
  213 + {
  214 + mApplication.Quit();
  215 + }
  216 + }
  217 + }
  218 +
  219 +private:
  220 +
  221 + Application& mApplication; ///< Application instance
  222 + Vector3 mStageSize; ///< The size of the stage
  223 +
  224 + Image mImage;
  225 + Sampler mSampler1;
  226 + Sampler mSampler2;
  227 + Shader mShader;
  228 + Material mMaterial;
  229 + Geometry mGeometry;
  230 + Renderer mRenderer;
  231 + Actor mMeshActor;
  232 + Renderer mRenderer2;
  233 + Actor mMeshActor2;
  234 + Timer mChangeImageTimer;
  235 +};
  236 +
  237 +void RunTest( Application& application )
  238 +{
  239 + ExampleController test( application );
  240 +
  241 + application.MainLoop();
  242 +}
  243 +
  244 +// Entry point for Linux & SLP applications
  245 +//
  246 +int main( int argc, char **argv )
  247 +{
  248 + Application application = Application::New( &argc, &argv );
  249 +
  250 + RunTest( application );
  251 +
  252 + return 0;
  253 +}
... ...
examples/radial-menu/radial-menu-example.cpp
1 1 /*
2   - * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  2 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3 3 *
4 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 5 * you may not use this file except in compliance with the License.
... ... @@ -17,7 +17,6 @@
17 17  
18 18 #include <dali/dali.h>
19 19 #include <dali-toolkit/dali-toolkit.h>
20   -#include <dali/devel-api/actors/mesh-actor.h>
21 20 #include "shared/view.h"
22 21 #include "radial-sweep-view.h"
23 22 #include "radial-sweep-view-impl.h"
... ... @@ -70,10 +69,19 @@ private:
70 69 */
71 70 RadialSweepView CreateSweepView( std::string imageName, Degree initial, Degree final );
72 71  
  72 + /**
  73 + * Start the sweep animation on the menu
  74 + */
73 75 void StartAnimation();
74 76  
  77 + /**
  78 + * Play or pause the animation when the button is clicked
  79 + */
75 80 bool OnButtonClicked( Toolkit::Button button );
76 81  
  82 + /**
  83 + * Update the state flag and change the button icon when the animation is finished
  84 + */
77 85 void OnAnimationFinished( Animation& source );
78 86  
79 87 /**
... ... @@ -149,16 +157,15 @@ void RadialMenuExample::OnInit(Application&amp; app)
149 157 DemoHelper::DEFAULT_PLAY_PADDING );
150 158  
151 159  
152   - const Uint16Pair intImgSize = ResourceImage::GetImageSize(TEST_OUTER_RING_FILENAME);
  160 + const ImageDimensions intImgSize = ResourceImage::GetImageSize(TEST_OUTER_RING_FILENAME);
153 161 Vector2 imgSize = Vector2( intImgSize.GetWidth(), intImgSize.GetHeight() );
154 162 Vector2 stageSize = stage.GetSize();
155   - float minStageDimension = std::min(stageSize.width, stageSize.height);
156   -
157   - if(stageSize.height <= stageSize.width)
  163 + float scale = stageSize.width / imgSize.width;
  164 + float availableHeight = stageSize.height - DemoHelper::DEFAULT_VIEW_STYLE.mToolBarHeight * 2.0f;
  165 + if(availableHeight <= stageSize.width)
158 166 {
159   - minStageDimension -= DemoHelper::DEFAULT_VIEW_STYLE.mToolBarHeight * 2.0f;
  167 + scale = availableHeight / imgSize.width;
160 168 }
161   - float scale = minStageDimension / imgSize.width;
162 169  
163 170 mRadialSweepView1 = CreateSweepView( TEST_OUTER_RING_FILENAME, Degree(-90.0f), Degree(-90.0f));
164 171 mRadialSweepView2 = CreateSweepView( TEST_INNER_RING_FILENAME, Degree(90.0f), Degree(0.0f));
... ... @@ -208,6 +215,7 @@ bool RadialMenuExample::OnButtonClicked( Toolkit::Button button )
208 215 case PLAYING:
209 216 {
210 217 mAnimation.Pause();
  218 + mAnimationState = PAUSED;
211 219 mPlayStopButton.SetBackgroundImage( mIconPlay );
212 220 }
213 221 break;
... ... @@ -215,6 +223,7 @@ bool RadialMenuExample::OnButtonClicked( Toolkit::Button button )
215 223 case PAUSED:
216 224 {
217 225 mAnimation.Play();
  226 + mAnimationState = PLAYING;
218 227 mPlayStopButton.SetBackgroundImage( mIconStop );
219 228 }
220 229 break;
... ... @@ -249,7 +258,7 @@ RadialSweepView RadialMenuExample::CreateSweepView( std::string imageName,
249 258 mImageActor.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
250 259  
251 260 // Create the stencil
252   - const Uint16Pair imageSize = ResourceImage::GetImageSize(imageName);
  261 + const ImageDimensions imageSize = ResourceImage::GetImageSize(imageName);
253 262 float diameter = std::max(imageSize.GetWidth(), imageSize.GetHeight());
254 263 RadialSweepView radialSweepView = RadialSweepView::New();
255 264 radialSweepView.SetDiameter( diameter );
... ...
examples/radial-menu/radial-sweep-view-impl.cpp
1 1 /*
2   - * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  2 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3 3 *
4 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 5 * you may not use this file except in compliance with the License.
... ... @@ -17,47 +17,56 @@
17 17  
18 18 #include "radial-sweep-view-impl.h"
19 19  
  20 +#include <dali/devel-api/rendering/renderer.h>
  21 +#include <sstream>
  22 +
20 23 using namespace Dali;
21 24  
22 25 namespace
23 26 {
24 27  
25   -/**
26   - * Method to project a point on a circle of radius halfSide at given
27   - * angle onto a square of side 2 * halfSide
28   - */
29   -void CircleSquareProjection( Vector3& position, Radian angle, float halfSide )
30   -{
31   - // 135 90 45
32   - // +--+--+
33   - // | \|/ |
34   - // 180 +--+--+ 0
35   - // | /|\ |
36   - // +--+--+
37   - // 225 270 315
38   - if( angle >= Dali::ANGLE_45 && angle < Dali::ANGLE_135 )
39   - {
40   - position.x = halfSide * cosf(angle) / sinf(angle);
41   - position.y = -halfSide;
42   - }
43   - else if( angle >= Dali::ANGLE_135 && angle < Dali::ANGLE_225 )
44   - {
45   - position.x = -halfSide;
46   - position.y = halfSide * sinf(angle) / cosf(angle);
47   - }
48   - else if( angle >= Dali::ANGLE_225 && angle < Dali::ANGLE_315 )
49   - {
50   - position.x = -halfSide * cosf(angle) / sinf(angle);
51   - position.y = halfSide;
52   - }
53   - else
54   - {
55   - position.x = halfSide;
56   - position.y = -halfSide * sinf(angle) / cosf(angle);
57   - }
58   -
59   - position.z = 0.0f;
  28 +const char* VERTEX_SHADER_PREFIX( "#define MATH_PI_2 1.570796\n#define MATH_PI_4 0.785398\n" );
  29 +
  30 +const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
  31 +attribute mediump float aAngleIndex;\n
  32 +attribute mediump vec2 aPosition1;\n
  33 +attribute mediump vec2 aPosition2;\n
  34 +uniform mediump mat4 uMvpMatrix;\n
  35 +uniform mediump float uStartAngle;\n
  36 +uniform mediump float uRotationAngle;\n
  37 +\n
  38 +void main()\n
  39 +{\n
  40 + float currentAngle = uStartAngle + uRotationAngle;\n
  41 + float angleInterval1 = MATH_PI_4 * aAngleIndex;\n
  42 + vec4 vertexPosition = vec4(0.0, 0.0, 0.0, 1.0);\n
  43 + if( currentAngle >= angleInterval1)\n
  44 + {\n
  45 + float angleInterval2 = angleInterval1 + MATH_PI_2;\n
  46 + float angle = currentAngle < angleInterval2 ? currentAngle : angleInterval2;\n
  47 + float delta;\n
  48 + if( mod( aAngleIndex+4.0, 4.0) < 2.0 )\n
  49 + {\n
  50 + delta = 0.5 - 0.5*cos(angle) / sin(angle);\n
  51 + }\n
  52 + else\n
  53 + {\n
  54 + delta = 0.5 + 0.5*sin(angle) / cos(angle);\n
  55 + }\n
  56 + vertexPosition.xy = mix( aPosition1, aPosition2, delta );\n
  57 + }\n
  58 + gl_Position = uMvpMatrix * vertexPosition;\n
60 59 }
  60 +);
  61 +
  62 +const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
  63 +uniform lowp vec4 uColor;\n
  64 +\n
  65 +void main()\n
  66 +{\n
  67 + gl_FragColor = uColor;\n
  68 +}\n
  69 +);
61 70  
62 71 float HoldZeroFastEaseInOutHoldOne(float progress)
63 72 {
... ... @@ -81,58 +90,23 @@ float HoldZeroFastEaseInOutHoldOne(float progress)
81 90 }
82 91 }
83 92  
84   -struct SquareFanConstraint
85   -{
86   - SquareFanConstraint(int sideIndex)
87   - : mSideIndex(sideIndex)
88   - {
89   - }
90   -
91   - void operator()( Vector3& current, const PropertyInputContainer& inputs )
92   - {
93   - float degree = fmodf((inputs[0]->GetFloat() + inputs[1]->GetFloat()), 360.0f);
94   - if(degree < 0.0f)
95   - {
96   - degree += 360.0f;
97   - }
98   -
99   - float startAngle = (90.0f*mSideIndex)-45.0f;
100   - float endAngle = (90.0f*mSideIndex)+45.0f;
101   - if(degree < startAngle)
102   - {
103   - current = Vector3::ZERO;
104   - }
105   - else
106   - {
107   - if( degree >= endAngle )
108   - {
109   - degree = endAngle;
110   - }
111   - CircleSquareProjection( current, Degree(degree), 0.5f );
112   - current.x = -current.x; // Inverting X makes the animation go anti clockwise from left center
113   - }
114   - }
115   -
116   - int mSideIndex;
117   -};
118   -
119 93 } // anonymous namespace
120 94  
121 95  
122 96 RadialSweepView RadialSweepViewImpl::New( )
123 97 {
124   - return New( 2.0f, 100.0f, Degree(0.0f), Degree(0.0f), Degree(0.0f), Degree(359.999f) );
  98 + return New( 2.0f, 100.0f, ANGLE_0, ANGLE_0, ANGLE_0, ANGLE_360 );
125 99 }
126 100  
127 101  
128   -RadialSweepView RadialSweepViewImpl::New( float duration, float diameter, Degree initialAngle, Degree finalAngle, Degree initialSector, Degree finalSector )
  102 +RadialSweepView RadialSweepViewImpl::New( float duration, float diameter, Radian initialAngle, Radian finalAngle, Radian initialSector, Radian finalSector )
129 103 {
130 104 RadialSweepViewImpl* impl= new RadialSweepViewImpl(duration, diameter, initialAngle, finalAngle, initialSector, finalSector);
131 105 RadialSweepView handle = RadialSweepView(*impl);
132 106 return handle;
133 107 }
134 108  
135   -RadialSweepViewImpl::RadialSweepViewImpl( float duration, float diameter, Degree initialAngle, Degree finalAngle, Degree initialSector, Degree finalSector )
  109 +RadialSweepViewImpl::RadialSweepViewImpl( float duration, float diameter, Radian initialAngle, Radian finalAngle, Radian initialSector, Radian finalSector )
136 110 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ),
137 111 mDuration(duration),
138 112 mDiameter(diameter),
... ... @@ -165,33 +139,33 @@ void RadialSweepViewImpl::SetDiameter(float diameter)
165 139 mDiameter = diameter;
166 140 }
167 141  
168   -void RadialSweepViewImpl::SetInitialAngle( Dali::Degree initialAngle)
  142 +void RadialSweepViewImpl::SetInitialAngle( Dali::Radian initialAngle)
169 143 {
170 144 mInitialAngle = initialAngle;
171 145 }
172 146  
173   -void RadialSweepViewImpl::SetFinalAngle( Dali::Degree finalAngle)
  147 +void RadialSweepViewImpl::SetFinalAngle( Dali::Radian finalAngle)
174 148 {
175 149 mFinalAngle = finalAngle;
176 150 }
177 151  
178   -void RadialSweepViewImpl::SetInitialSector( Dali::Degree initialSector)
  152 +void RadialSweepViewImpl::SetInitialSector( Dali::Radian initialSector)
179 153 {
180 154 mInitialSector = initialSector;
181 155 }
182 156  
183   -void RadialSweepViewImpl::SetFinalSector( Dali::Degree finalSector)
  157 +void RadialSweepViewImpl::SetFinalSector( Dali::Radian finalSector)
184 158 {
185 159 mFinalSector = finalSector;
186 160 }
187 161  
188   -void RadialSweepViewImpl::SetInitialActorAngle( Dali::Degree initialAngle )
  162 +void RadialSweepViewImpl::SetInitialActorAngle( Dali::Radian initialAngle )
189 163 {
190 164 mInitialActorAngle = initialAngle;
191 165 mRotateActors = true;
192 166 }
193 167  
194   -void RadialSweepViewImpl::SetFinalActorAngle( Dali::Degree finalAngle )
  168 +void RadialSweepViewImpl::SetFinalActorAngle( Dali::Radian finalAngle )
195 169 {
196 170 mFinalActorAngle = finalAngle;
197 171 mRotateActors = true;
... ... @@ -207,32 +181,32 @@ float RadialSweepViewImpl::GetDiameter( )
207 181 return mDiameter;
208 182 }
209 183  
210   -Dali::Degree RadialSweepViewImpl::GetInitialAngle( )
  184 +Dali::Radian RadialSweepViewImpl::GetInitialAngle( )
211 185 {
212 186 return mInitialAngle;
213 187 }
214 188  
215   -Dali::Degree RadialSweepViewImpl::GetFinalAngle( )
  189 +Dali::Radian RadialSweepViewImpl::GetFinalAngle( )
216 190 {
217 191 return mFinalAngle;
218 192 }
219 193  
220   -Dali::Degree RadialSweepViewImpl::GetInitialSector( )
  194 +Dali::Radian RadialSweepViewImpl::GetInitialSector( )
221 195 {
222 196 return mInitialSector;
223 197 }
224 198  
225   -Dali::Degree RadialSweepViewImpl::GetFinalSector( )
  199 +Dali::Radian RadialSweepViewImpl::GetFinalSector( )
226 200 {
227 201 return mFinalSector;
228 202 }
229 203  
230   -Dali::Degree RadialSweepViewImpl::GetInitialActorAngle( )
  204 +Dali::Radian RadialSweepViewImpl::GetInitialActorAngle( )
231 205 {
232 206 return mInitialActorAngle;
233 207 }
234 208  
235   -Dali::Degree RadialSweepViewImpl::GetFinalActorAngle( )
  209 +Dali::Radian RadialSweepViewImpl::GetFinalActorAngle( )
236 210 {
237 211 return mFinalActorAngle;
238 212 }
... ... @@ -269,11 +243,11 @@ void RadialSweepViewImpl::Activate( Animation anim, float offsetTime, float dura
269 243 {
270 244 CreateStencil( mInitialSector );
271 245 mLayer.Add( mStencilActor );
272   - mStencilActor.SetSize(mDiameter, mDiameter);
  246 + mStencilActor.SetScale(mDiameter);
273 247 }
274 248  
275   - mStencilActor.SetOrientation( Degree(mInitialAngle), Vector3::ZAXIS );
276   - mStencilActor.SetProperty( mRotationAngleIndex, mInitialSector.degree );
  249 + mStencilActor.SetOrientation( mInitialAngle, Vector3::ZAXIS );
  250 + mStencilActor.SetProperty( mRotationAngleIndex, mInitialSector.radian );
277 251  
278 252 if( mRotateActors )
279 253 {
... ... @@ -287,7 +261,7 @@ void RadialSweepViewImpl::Activate( Animation anim, float offsetTime, float dura
287 261 }
288 262 }
289 263  
290   - anim.AnimateTo( Property( mStencilActor, mRotationAngleIndex ), mFinalSector.degree, mEasingFunction, TimePeriod( offsetTime, duration ) );
  264 + anim.AnimateTo( Property( mStencilActor, mRotationAngleIndex ), mFinalSector.radian, mEasingFunction, TimePeriod( offsetTime, duration ) );
291 265 anim.AnimateTo( Property( mStencilActor, Actor::Property::ORIENTATION ), Quaternion( Radian( mFinalAngle ), Vector3::ZAXIS ), mEasingFunction, TimePeriod( offsetTime, duration ) );
292 266  
293 267 if( mRotateActorsWithStencil )
... ... @@ -297,7 +271,7 @@ void RadialSweepViewImpl::Activate( Animation anim, float offsetTime, float dura
297 271 Actor actor = mLayer.GetChildAt(i);
298 272 if( actor != mStencilActor )
299 273 {
300   - anim.AnimateTo( Property( actor, Actor::Property::ORIENTATION ), Quaternion( Radian( Degree( mFinalAngle.degree - mInitialAngle.degree ) ), Vector3::ZAXIS ), mEasingFunction, TimePeriod( offsetTime, duration ) );
  274 + anim.AnimateTo( Property( actor, Actor::Property::ORIENTATION ), Quaternion( Radian( mFinalAngle.radian - mInitialAngle.radian ) , Vector3::ZAXIS ), mEasingFunction, TimePeriod( offsetTime, duration ) );
301 275 }
302 276 }
303 277 }
... ... @@ -334,65 +308,58 @@ void RadialSweepViewImpl::Deactivate()
334 308 // mMaterial.Reset();
335 309 }
336 310  
337   -void RadialSweepViewImpl::CreateStencil( Degree initialSector )
  311 +void RadialSweepViewImpl::CreateStencil( Radian initialSector )
338 312 {
339   - mMaterial = Material::New("Material");
340   - mMaterial.SetDiffuseColor(Color::WHITE);
341   - mMaterial.SetAmbientColor(Vector4(0.0, 0.1, 0.1, 1.0));
342   -
343   - // Generate a square mesh with a point at the center:
344   -
345   - AnimatableMesh::Faces faces;
346   - // Create triangles joining up the verts
347   - faces.push_back(0); faces.push_back(1); faces.push_back(2);
348   - faces.push_back(0); faces.push_back(2); faces.push_back(3);
349   - faces.push_back(0); faces.push_back(3); faces.push_back(4);
350   - faces.push_back(0); faces.push_back(4); faces.push_back(5);
351   - faces.push_back(0); faces.push_back(5); faces.push_back(6);
352   -
353   - mMesh = AnimatableMesh::New(7, faces, mMaterial);
354   - mMesh[0].SetPosition( Vector3( 0.0f, 0.0f, 0.0f ) ); // Center pt
355   -
356   - mStencilActor = MeshActor::New(mMesh);
357   - mStencilActor.SetCullFace(CullNone); // Allow clockwise & anticlockwise faces
358   -
359   - mStartAngleIndex = mStencilActor.RegisterProperty("start-angle", Property::Value(0.0f));
360   - mRotationAngleIndex = mStencilActor.RegisterProperty("rotation-angle", Property::Value(initialSector.degree));
361   -
362   - Source srcStart( mStencilActor, mStartAngleIndex );
363   - Source srcRotation( mStencilActor, mRotationAngleIndex );
364   -
365   - // Constrain the vertices of the square mesh to sweep out a sector as the
366   - // rotation angle is animated.
367   - Constraint constraint = Constraint::New<Vector3>( mMesh, mMesh.GetPropertyIndex(1, AnimatableVertex::Property::POSITION), SquareFanConstraint(0) );
368   - constraint.AddSource( srcStart );
369   - constraint.AddSource( srcStart );
370   - constraint.Apply();
371   -
372   - constraint = Constraint::New<Vector3>( mMesh, mMesh.GetPropertyIndex(2, AnimatableVertex::Property::POSITION), SquareFanConstraint(0) );
373   - constraint.AddSource( srcStart );
374   - constraint.AddSource( srcRotation );
375   - constraint.Apply();
376   -
377   - constraint = Constraint::New<Vector3>( mMesh, mMesh.GetPropertyIndex(3, AnimatableVertex::Property::POSITION), SquareFanConstraint(1) );
378   - constraint.AddSource( srcStart );
379   - constraint.AddSource( srcRotation );
380   - constraint.Apply();
381   -
382   - constraint = Constraint::New<Vector3>( mMesh, mMesh.GetPropertyIndex(4, AnimatableVertex::Property::POSITION), SquareFanConstraint(2) );
383   - constraint.AddSource( srcStart );
384   - constraint.AddSource( srcRotation );
385   - constraint.Apply();
386   -
387   - constraint = Constraint::New<Vector3>( mMesh, mMesh.GetPropertyIndex(5, AnimatableVertex::Property::POSITION), SquareFanConstraint(3) );
388   - constraint.AddSource( srcStart );
389   - constraint.AddSource( srcRotation );
390   - constraint.Apply();
391   -
392   - constraint = Constraint::New<Vector3>( mMesh, mMesh.GetPropertyIndex(6, AnimatableVertex::Property::POSITION), SquareFanConstraint(4) );
393   - constraint.AddSource( srcStart );
394   - constraint.AddSource( srcRotation );
395   - constraint.Apply();
  313 + // Create the stencil mesh geometry
  314 + // 3-----2
  315 + // | \ / |
  316 + // | 0--1 , 6
  317 + // | / \ |
  318 + // 4-----5
  319 +
  320 + struct VertexPosition { float angleIndex; Vector2 position1; Vector2 position2; };
  321 + VertexPosition vertexData[7] = { // With X coordinate inverted to make the animation go anti clockwise from left center
  322 + { 9.f, Vector2( 0.f, 0.f ), Vector2( 0.f, 0.f ) }, // center point, keep static
  323 + { 0.f, Vector2( -0.5f, 0.f ), Vector2( -0.5f, 0.f ) }, // vertex 1, 0 degree, keep static
  324 + { -1.f, Vector2( -0.5f, 0.5f ), Vector2( -0.5f, -0.5f ) }, // -45 ~ 45 degrees ( 0 ~ 45)
  325 + { 1.f, Vector2( -0.5f, -0.5f ), Vector2( 0.5f, -0.5f ) }, // 45 ~ 135 degrees
  326 + { 3.f, Vector2( 0.5f, -0.5f ), Vector2( 0.5f, 0.5f ) }, // 135 ~ 225 degrees
  327 + { 5.f, Vector2( 0.5f, 0.5f ), Vector2( -0.5f, 0.5f ) }, // 225 ~ 315 degrees
  328 + { 7.f, Vector2( -0.5f, 0.5f ), Vector2( -0.5f, -0.5f ) } // 315 ~ 405 degrees ( 315 ~ 359.999 )
  329 + };
  330 + Property::Map vertexFormat;
  331 + vertexFormat["aAngleIndex"] = Property::FLOAT;
  332 + vertexFormat["aPosition1"] = Property::VECTOR2;
  333 + vertexFormat["aPosition2"] = Property::VECTOR2;
  334 + PropertyBuffer vertices = PropertyBuffer::New( vertexFormat, 7u );
  335 + vertices.SetData( vertexData );
  336 +
  337 + unsigned int indexData[15] = { 0,1,2,0,2,3,0,3,4,0,4,5,0,5,6 };
  338 + Property::Map indexFormat;
  339 + indexFormat["indices"] = Property::UNSIGNED_INTEGER;
  340 + PropertyBuffer indices = PropertyBuffer::New( indexFormat, 15u );
  341 + indices.SetData( indexData );
  342 +
  343 + Geometry meshGeometry = Geometry::New();
  344 + meshGeometry.AddVertexBuffer( vertices );
  345 + meshGeometry.SetIndexBuffer( indices );
  346 +
  347 + // Create material
  348 + std::ostringstream vertexShaderStringStream;
  349 + vertexShaderStringStream<<VERTEX_SHADER_PREFIX<<VERTEX_SHADER;
  350 + Shader shader = Shader::New( vertexShaderStringStream.str(), FRAGMENT_SHADER );
  351 + Material material = Material::New( shader );
  352 +
  353 + // Create renderer
  354 + Renderer renderer = Renderer::New( meshGeometry, material );
  355 +
  356 + mStencilActor = Actor::New();
  357 + mStencilActor.AddRenderer( renderer );
  358 + mStencilActor.SetSize(1.f, 1.f);
  359 +
  360 + // register properties
  361 + mStartAngleIndex = mStencilActor.RegisterProperty("uStartAngle", 0.f);
  362 + mRotationAngleIndex = mStencilActor.RegisterProperty("uRotationAngle", initialSector.radian);
396 363  
397 364 mStencilActor.SetDrawMode( DrawMode::STENCIL );
398 365 mStencilActor.SetPositionInheritanceMode(USE_PARENT_POSITION);
... ...
examples/radial-menu/radial-sweep-view-impl.h
... ... @@ -2,7 +2,7 @@
2 2 #define DALI_DEMO_RADIAL_SWEEP_VIEW_IMPL_H
3 3  
4 4 /*
5   - * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  5 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6 6 *
7 7 * Licensed under the Apache License, Version 2.0 (the "License");
8 8 * you may not use this file except in compliance with the License.
... ... @@ -19,10 +19,6 @@
19 19 */
20 20  
21 21 #include <dali-toolkit/dali-toolkit.h>
22   -#include <dali/devel-api/actors/mesh-actor.h>
23   -#include <dali/devel-api/modeling/material.h>
24   -#include <dali/devel-api/geometry/animatable-mesh.h>
25   -
26 22 #include "radial-sweep-view.h"
27 23  
28 24  
... ... @@ -36,37 +32,37 @@ public:
36 32  
37 33 static RadialSweepView New( float duration,
38 34 float diameter,
39   - Dali::Degree initialAngle,
40   - Dali::Degree finalAngle,
41   - Dali::Degree initialSector,
42   - Dali::Degree finalSector );
  35 + Dali::Radian initialAngle,
  36 + Dali::Radian finalAngle,
  37 + Dali::Radian initialSector,
  38 + Dali::Radian finalSector );
43 39  
44 40 RadialSweepViewImpl( float duration,
45 41 float diameter,
46   - Dali::Degree initialAngle,
47   - Dali::Degree finalAngle,
48   - Dali::Degree initialSector,
49   - Dali::Degree finalSector );
  42 + Dali::Radian initialAngle,
  43 + Dali::Radian finalAngle,
  44 + Dali::Radian initialSector,
  45 + Dali::Radian finalSector );
50 46  
51 47 void SetDuration(float duration);
52 48 void SetEasingFunction( Dali::AlphaFunction easingFunction );
53 49  
54 50 void SetDiameter(float diameter);
55   - void SetInitialAngle( Dali::Degree initialAngle);
56   - void SetFinalAngle( Dali::Degree finalAngle);
57   - void SetInitialSector( Dali::Degree initialSector);
58   - void SetFinalSector( Dali::Degree finalSector);
59   - void SetInitialActorAngle( Dali::Degree initialAngle );
60   - void SetFinalActorAngle( Dali::Degree finalAngle );
  51 + void SetInitialAngle( Dali::Radian initialAngle);
  52 + void SetFinalAngle( Dali::Radian finalAngle);
  53 + void SetInitialSector( Dali::Radian initialSector);
  54 + void SetFinalSector( Dali::Radian finalSector);
  55 + void SetInitialActorAngle( Dali::Radian initialAngle );
  56 + void SetFinalActorAngle( Dali::Radian finalAngle );
61 57  
62 58 float GetDuration( );
63 59 float GetDiameter( );
64   - Dali::Degree GetInitialAngle( );
65   - Dali::Degree GetFinalAngle( );
66   - Dali::Degree GetInitialSector( );
67   - Dali::Degree GetFinalSector( );
68   - Dali::Degree GetInitialActorAngle( );
69   - Dali::Degree GetFinalActorAngle( );
  60 + Dali::Radian GetInitialAngle( );
  61 + Dali::Radian GetFinalAngle( );
  62 + Dali::Radian GetInitialSector( );
  63 + Dali::Radian GetFinalSector( );
  64 + Dali::Radian GetInitialActorAngle( );
  65 + Dali::Radian GetFinalActorAngle( );
70 66  
71 67 void RotateActorsWithStencil(bool rotate);
72 68  
... ... @@ -81,23 +77,21 @@ private:
81 77 /**
82 78 * Create the stencil mask
83 79 */
84   - void CreateStencil(Dali::Degree initialSector );
  80 + void CreateStencil(Dali::Radian initialSector );
85 81  
86 82 private:
87 83 Dali::Layer mLayer;
88 84 Dali::Animation mAnim;
89 85 float mDuration;
90 86 float mDiameter;
91   - Dali::Degree mInitialAngle;
92   - Dali::Degree mFinalAngle;
93   - Dali::Degree mInitialSector;
94   - Dali::Degree mFinalSector;
95   - Dali::Degree mInitialActorAngle;
96   - Dali::Degree mFinalActorAngle;
  87 + Dali::Radian mInitialAngle;
  88 + Dali::Radian mFinalAngle;
  89 + Dali::Radian mInitialSector;
  90 + Dali::Radian mFinalSector;
  91 + Dali::Radian mInitialActorAngle;
  92 + Dali::Radian mFinalActorAngle;
97 93 Dali::AlphaFunction mEasingFunction;
98   - Dali::MeshActor mStencilActor; ///< Stencil actor which generates mask
99   - Dali::Material mMaterial; ///< Material for drawing mesh actor
100   - Dali::AnimatableMesh mMesh; ///< Animatable mesh
  94 + Dali::Actor mStencilActor; ///< Stencil actor which generates mask
101 95 Dali::Property::Index mStartAngleIndex; ///< Index of start-angle property
102 96 Dali::Property::Index mRotationAngleIndex; ///< Index of rotation-angle property
103 97 bool mRotateActorsWithStencil:1;
... ...
examples/radial-menu/radial-sweep-view.cpp
1 1 /*
2   - * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  2 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3 3 *
4 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 5 * you may not use this file except in compliance with the License.
... ... @@ -18,10 +18,6 @@
18 18 #include "radial-sweep-view.h"
19 19 #include "radial-sweep-view-impl.h"
20 20  
21   -// EXTERNAL INCLUDES
22   -#include <dali/devel-api/actors/mesh-actor.h>
23   -
24   -
25 21 using namespace Dali;
26 22  
27 23 RadialSweepView::RadialSweepView()
... ... @@ -58,10 +54,10 @@ RadialSweepView RadialSweepView::New( )
58 54  
59 55 RadialSweepView RadialSweepView::New( float duration,
60 56 float diameter,
61   - Degree initialAngle,
62   - Degree finalAngle,
63   - Degree initialSector,
64   - Degree finalSector )
  57 + Radian initialAngle,
  58 + Radian finalAngle,
  59 + Radian initialSector,
  60 + Radian finalSector )
65 61 {
66 62 return RadialSweepViewImpl::New(duration, diameter, initialAngle, finalAngle, initialSector, finalSector );
67 63 }
... ... @@ -92,32 +88,32 @@ void RadialSweepView::SetDiameter(float diameter)
92 88 GetImpl(*this).SetDiameter(diameter);
93 89 }
94 90  
95   -void RadialSweepView::SetInitialAngle( Dali::Degree initialAngle)
  91 +void RadialSweepView::SetInitialAngle( Dali::Radian initialAngle)
96 92 {
97 93 GetImpl(*this).SetInitialAngle(initialAngle);
98 94 }
99 95  
100   -void RadialSweepView::SetFinalAngle( Dali::Degree finalAngle)
  96 +void RadialSweepView::SetFinalAngle( Dali::Radian finalAngle)
101 97 {
102 98 GetImpl(*this).SetFinalAngle(finalAngle);
103 99 }
104 100  
105   -void RadialSweepView::SetInitialSector( Dali::Degree initialSector)
  101 +void RadialSweepView::SetInitialSector( Dali::Radian initialSector)
106 102 {
107 103 GetImpl(*this).SetInitialSector(initialSector);
108 104 }
109 105  
110   -void RadialSweepView::SetFinalSector( Dali::Degree finalSector)
  106 +void RadialSweepView::SetFinalSector( Dali::Radian finalSector)
111 107 {
112 108 GetImpl(*this).SetFinalSector(finalSector);
113 109 }
114 110  
115   -void RadialSweepView::SetInitialActorAngle( Dali::Degree initialAngle )
  111 +void RadialSweepView::SetInitialActorAngle( Dali::Radian initialAngle )
116 112 {
117 113 GetImpl(*this).SetInitialActorAngle(initialAngle);
118 114 }
119 115  
120   -void RadialSweepView::SetFinalActorAngle( Dali::Degree finalAngle )
  116 +void RadialSweepView::SetFinalActorAngle( Dali::Radian finalAngle )
121 117 {
122 118 GetImpl(*this).SetFinalActorAngle(finalAngle);
123 119 }
... ... @@ -132,32 +128,32 @@ float RadialSweepView::GetDiameter( )
132 128 return GetImpl(*this).GetDiameter();
133 129 }
134 130  
135   -Dali::Degree RadialSweepView::GetInitialAngle( )
  131 +Dali::Radian RadialSweepView::GetInitialAngle( )
136 132 {
137 133 return GetImpl(*this).GetInitialAngle();
138 134 }
139 135  
140   -Dali::Degree RadialSweepView::GetFinalAngle( )
  136 +Dali::Radian RadialSweepView::GetFinalAngle( )
141 137 {
142 138 return GetImpl(*this).GetFinalAngle();
143 139 }
144 140  
145   -Dali::Degree RadialSweepView::GetInitialSector( )
  141 +Dali::Radian RadialSweepView::GetInitialSector( )
146 142 {
147 143 return GetImpl(*this).GetInitialSector();
148 144 }
149 145  
150   -Dali::Degree RadialSweepView::GetFinalSector( )
  146 +Dali::Radian RadialSweepView::GetFinalSector( )
151 147 {
152 148 return GetImpl(*this).GetFinalSector();
153 149 }
154 150  
155   -Dali::Degree RadialSweepView::GetInitialActorAngle( )
  151 +Dali::Radian RadialSweepView::GetInitialActorAngle( )
156 152 {
157 153 return GetImpl(*this).GetInitialActorAngle();
158 154 }
159 155  
160   -Dali::Degree RadialSweepView::GetFinalActorAngle( )
  156 +Dali::Radian RadialSweepView::GetFinalActorAngle( )
161 157 {
162 158 return GetImpl(*this).GetFinalActorAngle();
163 159 }
... ...
examples/radial-menu/radial-sweep-view.h
... ... @@ -2,7 +2,7 @@
2 2 #define DALI_DEMO_RADIAL_SWEEP_VIEW_H
3 3  
4 4 /*
5   - * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  5 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6 6 *
7 7 * Licensed under the Apache License, Version 2.0 (the "License");
8 8 * you may not use this file except in compliance with the License.
... ... @@ -31,7 +31,7 @@ class RadialSweepView : public Dali::Toolkit::Control
31 31 public:
32 32 /**
33 33 * Create a new RadialSweepView with default parameters (2 second animation,
34   - * no rotation, sweeping out a full cicle).
  34 + * no rotation, sweeping out a full circle).
35 35 */
36 36 static RadialSweepView New( );
37 37  
... ... @@ -43,7 +43,7 @@ public:
43 43 * @param[in] finalAngle The final angle of the anticlockwise line of the sweep sector
44 44 * @param[in] initialSector The angle of the starting sector
45 45 * @param[in] finalSector The angle of the sector at the end of the animation.
46   - * Note, to cover the entire circle, use a value of 359.9999f, not zero or 360.
  46 + * Note, to cover the entire circle, use a value of 359.9999 degrees, not zero or 360 degrees.
47 47 *
48 48 * initial sector
49 49 * \ | .
... ... @@ -54,10 +54,10 @@ public:
54 54 */
55 55 static RadialSweepView New( float duration,
56 56 float diameter,
57   - Dali::Degree initialAngle,
58   - Dali::Degree finalAngle,
59   - Dali::Degree initialSector,
60   - Dali::Degree finalSector );
  57 + Dali::Radian initialAngle,
  58 + Dali::Radian finalAngle,
  59 + Dali::Radian initialSector,
  60 + Dali::Radian finalSector );
61 61  
62 62 void SetDuration(float duration);
63 63  
... ... @@ -65,33 +65,33 @@ public:
65 65  
66 66 void SetDiameter(float diameter);
67 67  
68   - void SetInitialAngle( Dali::Degree initialAngle);
  68 + void SetInitialAngle( Dali::Radian initialAngle);
69 69  
70   - void SetFinalAngle( Dali::Degree finalAngle);
  70 + void SetFinalAngle( Dali::Radian finalAngle);
71 71  
72   - void SetInitialSector( Dali::Degree initialSector);
  72 + void SetInitialSector( Dali::Radian initialSector);
73 73  
74   - void SetFinalSector( Dali::Degree finalSector);
  74 + void SetFinalSector( Dali::Radian finalSector);
75 75  
76   - void SetInitialActorAngle( Dali::Degree initialAngle );
  76 + void SetInitialActorAngle( Dali::Radian initialAngle );
77 77  
78   - void SetFinalActorAngle( Dali::Degree finalAngle );
  78 + void SetFinalActorAngle( Dali::Radian finalAngle );
79 79  
80 80 float GetDuration( );
81 81  
82 82 float GetDiameter( );
83 83  
84   - Dali::Degree GetInitialAngle( );
  84 + Dali::Radian GetInitialAngle( );
85 85  
86   - Dali::Degree GetFinalAngle( );
  86 + Dali::Radian GetFinalAngle( );
87 87  
88   - Dali::Degree GetInitialSector( );
  88 + Dali::Radian GetInitialSector( );
89 89  
90   - Dali::Degree GetFinalSector( );
  90 + Dali::Radian GetFinalSector( );
91 91  
92   - Dali::Degree GetInitialActorAngle( );
  92 + Dali::Radian GetInitialActorAngle( );
93 93  
94   - Dali::Degree GetFinalActorAngle( );
  94 + Dali::Radian GetFinalActorAngle( );
95 95  
96 96 /**
97 97 * @param[in] rotate True if the actors should rotate with the stencil
... ...
examples/refraction-effect/refraction-effect-example.cpp
1 1 /*
2   - * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  2 + * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3 3 *
4 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 5 * you may not use this file except in compliance with the License.
... ... @@ -15,18 +15,18 @@
15 15 *
16 16 */
17 17  
  18 +// EXTERNAL INCLUDES
18 19 #include <dali/dali.h>
  20 +#include <dali/devel-api/rendering/renderer.h>
19 21 #include <dali-toolkit/dali-toolkit.h>
20   -#include <dali/devel-api/actors/mesh-actor.h>
21   -#include <dali/devel-api/modeling/material.h>
22   -#include <dali/devel-api/geometry/mesh.h>
23   -
24   -#include "shared/view.h"
25 22  
26 23 #include <fstream>
27 24 #include <sstream>
28 25 #include <limits>
29 26  
  27 +// INTERNAL INCLUDES
  28 +#include "shared/view.h"
  29 +
30 30 using namespace Dali;
31 31  
32 32 namespace
... ... @@ -52,8 +52,6 @@ const char* TEXTURE_IMAGES[]=
52 52 };
53 53 const unsigned int NUM_TEXTURE_IMAGES( sizeof( TEXTURE_IMAGES ) / sizeof( TEXTURE_IMAGES[0] ) );
54 54  
55   -#define MAKE_SHADER(A)#A
56   -
57 55 struct LightOffsetConstraint
58 56 {
59 57 LightOffsetConstraint( float radius )
... ... @@ -86,214 +84,134 @@ ResourceImage LoadStageFillingImage( const char * const imagePath )
86 84 return ResourceImage::New( imagePath, ImageDimensions( stageSize.x, stageSize.y ), Dali::FittingMode::SCALE_TO_FILL, Dali::SamplingMode::BOX_THEN_LINEAR );
87 85 }
88 86  
89   -} // namespace
90   -
91   -/************************************************************************************************
92   - *** This shader is used when the MeshActor is not touched***
93   - ************************************************************************************************/
94   -class NoEffect : public ShaderEffect
  87 +/**
  88 + * structure of the vertex in the mesh
  89 + */
  90 +struct Vertex
95 91 {
96   -public:
97   - /**
98   - * Create an empty handle.
99   - */
100   - NoEffect()
101   - {
102   - }
  92 + Vector3 position;
  93 + Vector3 normal;
  94 + Vector2 textureCoord;
103 95  
104   - /**
105   - * Virtual destructor
106   - */
107   - virtual ~NoEffect()
108   - {
109   - }
110   -
111   - /**
112   - * Create a NoEffect object.
113   - * @return A handle to a newly allocated NoEffect
114   - */
115   - static NoEffect New()
116   - {
117   - std::string vertexShader = MAKE_SHADER(
118   - precision mediump float;\n
119   - uniform mediump vec4 uTextureRect;\n
120   - void main()\n
121   - {\n
122   - gl_Position = uMvpMatrix * vec4( aPosition.xy, 0.0, 1.0 );\n
123   - vTexCoord = aTexCoord.xy;\n
124   - }\n
125   - );
126   - std::string fragmentShader = MAKE_SHADER(
127   - precision mediump float;\n
128   - void main()\n
129   - {\n
130   - gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n
131   - }\n
132   - );
133   - ShaderEffect shaderEffect = ShaderEffect::New( vertexShader, fragmentShader,
134   - GeometryType( GEOMETRY_TYPE_TEXTURED_MESH),
135   - ShaderEffect::GeometryHints( ShaderEffect::HINT_NONE ) );
136   - NoEffect handle( shaderEffect );
137   - return handle;
138   - }
  96 + Vertex()
  97 + {}
139 98  
140   -private:
141   - /**
142   - * Helper for New()
143   - */
144   - NoEffect( ShaderEffect handle )
145   - : ShaderEffect( handle )
146   - {
147   - }
  99 + Vertex( const Vector3& position, const Vector3& normal, const Vector2& textureCoord )
  100 + : position( position ), normal( normal ), textureCoord( textureCoord )
  101 + {}
148 102 };
149 103  
150   -/************************************************************/
151   -/* Custom refraction effect shader******************************/
152   -/************************************************************/
153   -
154   -class RefractionEffect : public ShaderEffect
155   -{
156   -public:
157   -
158   - /**
159   - * Create an empty RefractionEffect handle.
160   - */
161   - RefractionEffect()
162   - {
163   - }
164   -
165   - /**
166   - * Virtual destructor
167   - */
168   - virtual ~RefractionEffect()
169   - {
170   - }
171   -
172   - /**
173   - * Create a RefractionEffect object.
174   - * @return A handle to a newly allocated RefractionEffect
175   - */
176   - static RefractionEffect New()
177   - {
178   - std::string vertexShader = MAKE_SHADER(
179   - precision mediump float;\n
180   - varying mediump vec2 vTextureOffset;\n
181   - void main()\n
182   - {\n
183   - gl_Position = uMvpMatrix * vec4( aPosition.xy, 0.0, 1.0 );\n
184   - vTexCoord = aTexCoord.xy;\n
185   -
186   - vNormal = aNormal;\n
187   - vVertex = vec4( aPosition, 1.0 );\n
188   - float length = max(0.01, length(aNormal.xy)) * 40.0;\n
189   - vTextureOffset = aNormal.xy / length;\n
190   - }\n
191   - );
192   -
193   - std::string fragmentShader = MAKE_SHADER(
194   - precision mediump float;\n
195   - uniform mediump float uEffectStrength;\n
196   - uniform mediump vec3 uLightPosition;\n
197   - uniform mediump vec2 uLightXYOffset;\n
198   - uniform mediump vec2 uLightSpinOffset;\n
199   - uniform mediump float uLightIntensity;\n
200   - varying mediump vec2 vTextureOffset;\n
201   -
202   - vec3 rgb2hsl(vec3 rgb)\n
203   - {\n
204   - float epsilon = 1.0e-10;\n
205   - vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n
206   - vec4 P = mix(vec4(rgb.bg, K.wz), vec4(rgb.gb, K.xy), step(rgb.b, rgb.g));\n
207   - vec4 Q = mix(vec4(P.xyw, rgb.r), vec4(rgb.r, P.yzx), step(P.x, rgb.r));\n
208   - \n
209   - // RGB -> HCV
210   - float value = Q.x;\n
211   - float chroma = Q.x - min(Q.w, Q.y);\n
212   - float hue = abs(Q.z + (Q.w-Q.y) / (6.0*chroma+epsilon));\n
213   - // HCV -> HSL
214   - float lightness = value - chroma*0.5;\n
215   - return vec3( hue, chroma/max( 1.0-abs(lightness*2.0-1.0), 1.0e-1 ), lightness );\n
216   - }\n
217   -
218   - vec3 hsl2rgb( vec3 hsl )
219   - {
220   - // pure hue->RGB
221   - vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n
222   - vec3 p = abs(fract(hsl.xxx + K.xyz) * 6.0 - K.www);\n
223   - vec3 RGB = clamp(p - K.xxx, 0.0, 1.0);\n
224   - \n
225   - float chroma = ( 1.0 - abs( hsl.z*2.0-1.0 ) ) * hsl.y;\n
226   - return ( RGB - 0.5 ) * chroma + hsl.z;
227   - }
228   -
229   - void main()\n
230   - {\n
231   - vec3 normal = normalize( vNormal);\n
232   -
233   - vec3 lightPosition = uLightPosition + vec3(uLightXYOffset+uLightSpinOffset, 0.0);\n
234   - mediump vec3 vecToLight = normalize( (lightPosition - vVertex.xyz) * 0.01 );\n
235   - mediump float spotEffect = pow( max(0.05, vecToLight.z ) - 0.05, 8.0);\n
236   -
237   - spotEffect = spotEffect * uEffectStrength;\n
238   - mediump float lightDiffuse = ( ( dot( vecToLight, normal )-0.75 ) *uLightIntensity ) * spotEffect;\n
239   -
240   - lowp vec4 color = texture2D( sTexture, vTexCoord + vTextureOffset * spotEffect );\n
241   - vec3 lightedColor = hsl2rgb( rgb2hsl(color.rgb) + vec3(0.0,0.0,lightDiffuse) );\n
242   -
243   - gl_FragColor = vec4( lightedColor, color.a ) * uColor;\n
244   - }\n
245   - );
246   -
247   - ShaderEffect shaderEffect = ShaderEffect::New( vertexShader, fragmentShader,
248   - GeometryType( GEOMETRY_TYPE_TEXTURED_MESH),
249   - ShaderEffect::GeometryHints( ShaderEffect::HINT_BLENDING ) );
250   - RefractionEffect handle( shaderEffect );
251   -
252   - Vector2 stageSize = Stage::GetCurrent().GetSize();
253   - handle.SetLightPosition( Vector2(stageSize.x, 0.f) );
254   - handle.SetUniform( "uLightXYOffset", Vector2::ZERO );
255   - handle.SetUniform( "uLightSpinOffset", Vector2::ZERO );
256   - handle.SetUniform( "uEffectStrength", 0.f );
257   - handle.SetUniform( "uLightIntensity", 2.5f );
258   -
259   - Dali::Property::Index index = handle.RegisterProperty( "uSpinAngle", 0.f );
260   - Constraint constraint = Constraint::New<Vector2>( handle, handle.GetPropertyIndex("uLightSpinOffset"), LightOffsetConstraint(stageSize.x*0.1f) );
261   - constraint.AddSource( LocalSource(index) );
262   - constraint.Apply();
263   -
264   - return handle;
265   - }
266   -
267   - void SetLightPosition( const Vector2& position )
268   - {
269   - Vector2 stageHalfSize = Stage::GetCurrent().GetSize() * 0.5f;
270   - SetUniform( "uLightPosition", Vector3( position.x - stageHalfSize.x, position.y - stageHalfSize.y, stageHalfSize.x ) );
271   - }
272   -
273   - void SetLightXYOffset( const Vector2& offset )
274   - {
275   - SetUniform( "uLightXYOffset", offset );
276   - }
277   -
278   - void SetEffectStrength( float strength )
279   - {
280   - SetUniform( "uEffectStrength", strength );
281   - }
  104 +/************************************************************************************************
  105 + *** The shader source is used when the MeshActor is not touched***
  106 + ************************************************************************************************/
  107 +const char* VERTEX_SHADER_FLAT = DALI_COMPOSE_SHADER(
  108 +attribute mediump vec3 aPosition;\n
  109 +attribute mediump vec3 aNormal;\n
  110 +attribute highp vec2 aTexCoord;\n
  111 +uniform mediump mat4 uMvpMatrix;\n
  112 +varying mediump vec2 vTexCoord;\n
  113 +void main()\n
  114 +{\n
  115 + gl_Position = uMvpMatrix * vec4( aPosition.xy, 0.0, 1.0 );\n
  116 + vTexCoord = aTexCoord.xy;\n
  117 +}\n
  118 +);
  119 +
  120 +const char* FRAGMENT_SHADER_FLAT = DALI_COMPOSE_SHADER(
  121 +uniform lowp vec4 uColor;\n
  122 +uniform sampler2D sTexture;\n
  123 +varying mediump vec2 vTexCoord;\n
  124 +void main()\n
  125 +{\n
  126 + gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n
  127 +}\n
  128 +);
  129 +
  130 +/************************************************************
  131 + ** Custom refraction effect shader***************************
  132 + ************************************************************/
  133 +const char* VERTEX_SHADER_REFRACTION = DALI_COMPOSE_SHADER(
  134 +attribute mediump vec3 aPosition;\n
  135 +attribute mediump vec3 aNormal;\n
  136 +attribute highp vec2 aTexCoord;\n
  137 +uniform mediump mat4 uMvpMatrix;\n
  138 +varying mediump vec4 vVertex;\n
  139 +varying mediump vec3 vNormal;\n
  140 +varying mediump vec2 vTexCoord;\n
  141 +varying mediump vec2 vTextureOffset;\n
  142 +void main()\n
  143 +{\n
  144 + gl_Position = uMvpMatrix * vec4( aPosition.xy, 0.0, 1.0 );\n
  145 + vTexCoord = aTexCoord.xy;\n
  146 +
  147 + vNormal = aNormal;\n
  148 + vVertex = vec4( aPosition, 1.0 );\n
  149 + float length = max(0.01, length(aNormal.xy)) * 40.0;\n
  150 + vTextureOffset = aNormal.xy / length;\n
  151 +}\n
  152 +);
  153 +
  154 +const char* FRAGMENT_SHADER_REFRACTION = DALI_COMPOSE_SHADER(
  155 +precision mediump float;\n
  156 +uniform mediump float uEffectStrength;\n
  157 +uniform mediump vec3 uLightPosition;\n
  158 +uniform mediump vec2 uLightXYOffset;\n
  159 +uniform mediump vec2 uLightSpinOffset;\n
  160 +uniform mediump float uLightIntensity;\n
  161 +uniform lowp vec4 uColor;\n
  162 +uniform sampler2D sTexture;\n
  163 +varying mediump vec4 vVertex;\n
  164 +varying mediump vec3 vNormal;\n
  165 +varying mediump vec2 vTexCoord;\n
  166 +varying mediump vec2 vTextureOffset;\n
  167 +
  168 +vec3 rgb2hsl(vec3 rgb)\n
  169 +{\n
  170 + float epsilon = 1.0e-10;\n
  171 + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n
  172 + vec4 P = mix(vec4(rgb.bg, K.wz), vec4(rgb.gb, K.xy), step(rgb.b, rgb.g));\n
  173 + vec4 Q = mix(vec4(P.xyw, rgb.r), vec4(rgb.r, P.yzx), step(P.x, rgb.r));\n
  174 + \n
  175 + // RGB -> HCV
  176 + float value = Q.x;\n
  177 + float chroma = Q.x - min(Q.w, Q.y);\n
  178 + float hue = abs(Q.z + (Q.w-Q.y) / (6.0*chroma+epsilon));\n
  179 + // HCV -> HSL
  180 + float lightness = value - chroma*0.5;\n
  181 + return vec3( hue, chroma/max( 1.0-abs(lightness*2.0-1.0), 1.0e-1 ), lightness );\n
  182 +}\n
  183 +
  184 +vec3 hsl2rgb( vec3 hsl )\n
  185 +{\n
  186 + // pure hue->RGB
  187 + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n
  188 + vec3 p = abs(fract(hsl.xxx + K.xyz) * 6.0 - K.www);\n
  189 + vec3 RGB = clamp(p - K.xxx, 0.0, 1.0);\n
  190 + \n
  191 + float chroma = ( 1.0 - abs( hsl.z*2.0-1.0 ) ) * hsl.y;\n
  192 + return ( RGB - 0.5 ) * chroma + hsl.z;\n
  193 +}\n
  194 +
  195 +void main()\n
  196 +{\n
  197 + vec3 normal = normalize( vNormal);\n
  198 +
  199 + vec3 lightPosition = uLightPosition + vec3(uLightXYOffset+uLightSpinOffset, 0.0);\n
  200 + mediump vec3 vecToLight = normalize( (lightPosition - vVertex.xyz) * 0.01 );\n
  201 + mediump float spotEffect = pow( max(0.05, vecToLight.z ) - 0.05, 8.0);\n
  202 +
  203 + spotEffect = spotEffect * uEffectStrength;\n
  204 + mediump float lightDiffuse = ( ( dot( vecToLight, normal )-0.75 ) *uLightIntensity ) * spotEffect;\n
  205 +
  206 + lowp vec4 color = texture2D( sTexture, vTexCoord + vTextureOffset * spotEffect );\n
  207 + vec3 lightedColor = hsl2rgb( rgb2hsl(color.rgb) + vec3(0.0,0.0,lightDiffuse) );\n
  208 +
  209 + gl_FragColor = vec4( lightedColor, color.a ) * uColor;\n
  210 +}\n
  211 +);
282 212  
283   - void SetLightIntensity( float intensity )
284   - {
285   - SetUniform( "uLightIntensity", intensity );
286   - }
  213 +} // namespace
287 214  
288   -private:
289   - /**
290   - * Helper for New()
291   - */
292   - RefractionEffect( ShaderEffect handle )
293   - : ShaderEffect( handle )
294   - {
295   - }
296   -};
297 215  
298 216 /*************************************************/
299 217 /*Demo using RefractionEffect*****************/
... ... @@ -303,7 +221,6 @@ class RefractionEffectExample : public ConnectionTracker
303 221 public:
304 222 RefractionEffectExample( Application &application )
305 223 : mApplication( application ),
306   - mIsDown( false ),
307 224 mCurrentTextureId( 1 ),
308 225 mCurrentMeshId( 0 )
309 226 {
... ... @@ -321,7 +238,7 @@ private:
321 238 void Create(Application& application)
322 239 {
323 240 Stage stage = Stage::GetCurrent();
324   - mStageHalfSize = stage.GetSize() * 0.5f;
  241 + Vector2 stageSize = stage.GetSize();
325 242  
326 243 stage.KeyEventSignal().Connect(this, &RefractionEffectExample::OnKeyEvent);
327 244  
... ... @@ -353,37 +270,68 @@ private:
353 270 Toolkit::Alignment::HorizontalLeft,
354 271 DemoHelper::DEFAULT_MODE_SWITCH_PADDING );
355 272  
356   - // creates the shader effects applied on the mesh actor
357   - mRefractionEffect = RefractionEffect::New(); // used when the finger is touching the screen
358   - mNoEffect = NoEffect::New(); // used in the other situations, basic render shader
359   - // Create the mesh from the obj file and add to stage
360   - mMaterial = Material::New( "Material" ) ;
361   - mMaterial.SetDiffuseTexture( LoadStageFillingImage( TEXTURE_IMAGES[mCurrentTextureId] ) );
362   - CreateSurface( MESH_FILES[mCurrentMeshId] );
  273 +
  274 +
  275 + // shader used when the screen is not touched, render a flat surface
  276 + mShaderFlat = Shader::New( VERTEX_SHADER_FLAT, FRAGMENT_SHADER_FLAT );
  277 + mGeometry = CreateGeometry( MESH_FILES[mCurrentMeshId] );
  278 +
  279 + Image texture = LoadStageFillingImage( TEXTURE_IMAGES[mCurrentTextureId] );
  280 + mSampler = Sampler::New( texture, "sTexture" );
  281 + mMaterial = Material::New( mShaderFlat );
  282 + mMaterial.AddSampler( mSampler );
  283 +
  284 + mRenderer = Renderer::New( mGeometry, mMaterial );
  285 +
  286 + mMeshActor = Actor::New();
  287 + mMeshActor.AddRenderer( mRenderer );
  288 + mMeshActor.SetSize( stageSize );
  289 + mMeshActor.SetParentOrigin(ParentOrigin::CENTER);
  290 + mContent.Add( mMeshActor );
363 291  
364 292 // Connect the callback to the touch signal on the mesh actor
365 293 mContent.TouchedSignal().Connect( this, &RefractionEffectExample::OnTouch );
366 294  
  295 + // shader used when the finger is touching the screen. render refraction effect
  296 + mShaderRefraction = Shader::New( VERTEX_SHADER_REFRACTION, FRAGMENT_SHADER_REFRACTION );
  297 +
  298 + // register uniforms
  299 + mLightXYOffsetIndex = mMeshActor.RegisterProperty( "uLightXYOffset", Vector2::ZERO );
  300 +
  301 + mLightIntensityIndex = mMeshActor.RegisterProperty( "uLightIntensity", 2.5f );
  302 +
  303 + mEffectStrengthIndex = mMeshActor.RegisterProperty( "uEffectStrength", 0.f );
  304 +
  305 + Vector3 lightPosition( -stageSize.x*0.5f, -stageSize.y*0.5f, stageSize.x*0.5f ); // top_left
  306 + mMeshActor.RegisterProperty( "uLightPosition", lightPosition );
  307 +
  308 + Property::Index lightSpinOffsetIndex = mMeshActor.RegisterProperty( "uLightSpinOffset", Vector2::ZERO );
  309 +
  310 + mSpinAngleIndex = mMeshActor.RegisterProperty("uSpinAngle", 0.f );
  311 + Constraint constraint = Constraint::New<Vector2>( mMeshActor, lightSpinOffsetIndex, LightOffsetConstraint(stageSize.x*0.1f) );
  312 + constraint.AddSource( LocalSource(mSpinAngleIndex) );
  313 + constraint.Apply();
  314 +
367 315 // the animation which spin the light around the finger touch position
368   - mLightPosition = Vector2( mStageHalfSize.x*2.f, 0.f);
369 316 mLightAnimation = Animation::New(2.f);
370   - mLightAnimation.AnimateTo( Property( mRefractionEffect, "uSpinAngle" ), Math::PI*2.f );
  317 + mLightAnimation.AnimateTo( Property( mMeshActor, mSpinAngleIndex ), Math::PI*2.f );
371 318 mLightAnimation.SetLooping( true );
372 319 mLightAnimation.Pause();
373 320 }
374 321  
  322 + void SetLightXYOffset( const Vector2& offset )
  323 + {
  324 + mMeshActor.SetProperty( mLightXYOffsetIndex, offset );
  325 + }
  326 +
375 327 /**
376 328 * Create a mesh actor with different geometry to replace the current one
377 329 */
378 330 bool OnChangeMesh( Toolkit::Button button )
379 331 {
380   - if( mMeshActor )
381   - {
382   - UnparentAndReset( mMeshActor );
383   - }
384   -
385 332 mCurrentMeshId = ( mCurrentMeshId + 1 ) % NUM_MESH_FILES;
386   - CreateSurface( MESH_FILES[mCurrentMeshId] );
  333 + mGeometry = CreateGeometry( MESH_FILES[mCurrentMeshId] );
  334 + mRenderer.SetGeometry( mGeometry );
387 335  
388 336 return true;
389 337 }
... ... @@ -391,21 +339,21 @@ private:
391 339 bool OnChangeTexture( Toolkit::Button button )
392 340 {
393 341 mCurrentTextureId = ( mCurrentTextureId + 1 ) % NUM_TEXTURE_IMAGES;
394   - mMaterial.SetDiffuseTexture( LoadStageFillingImage( TEXTURE_IMAGES[mCurrentTextureId] ) );
395   -
  342 + Image texture = LoadStageFillingImage( TEXTURE_IMAGES[mCurrentTextureId] );
  343 + mSampler.SetImage( texture );
396 344 return true;
397 345 }
398 346  
399 347 bool OnTouch( Actor actor , const TouchEvent& event )
400 348 {
401 349 const TouchPoint &point = event.GetPoint(0);
402   -
403 350 switch(point.state)
404 351 {
405 352 case TouchPoint::Down:
406 353 {
407   - mIsDown = true;
408   - mDownPosition = point.screen;
  354 + mMaterial.SetShader( mShaderRefraction );
  355 +
  356 + SetLightXYOffset( point.screen );
409 357  
410 358 mLightAnimation.Play();
411 359  
... ... @@ -414,42 +362,32 @@ private:
414 362 mStrenghAnimation.Clear();
415 363 }
416 364  
417   - mRefractionEffect.SetLightXYOffset( point.screen - mLightPosition );
418   - mMeshActor.SetShaderEffect( mRefractionEffect );
419 365 mStrenghAnimation= Animation::New(0.5f);
420   - mStrenghAnimation.AnimateTo( Property( mRefractionEffect, "uEffectStrength" ), 1.f );
  366 + mStrenghAnimation.AnimateTo( Property( mMeshActor, mEffectStrengthIndex ), 1.f );
421 367 mStrenghAnimation.Play();
422 368  
423 369 break;
424 370 }
425 371 case TouchPoint::Motion:
426 372 {
427   - if(mIsDown)
428   - {
429   - // make the light position following the finger movement
430   - mRefractionEffect.SetLightXYOffset( point.screen - mLightPosition );
431   - }
  373 + // make the light position following the finger movement
  374 + SetLightXYOffset( point.screen );
432 375 break;
433 376 }
434 377 case TouchPoint::Up:
435 378 case TouchPoint::Leave:
436 379 case TouchPoint::Interrupted:
437 380 {
438   - if(mIsDown)
439   - {
440   - mLightAnimation.Pause();
  381 + mLightAnimation.Pause();
441 382  
442   - if( mStrenghAnimation )
443   - {
444   - mStrenghAnimation.Clear();
445   - }
446   - mStrenghAnimation = Animation::New(0.5f);
447   - mStrenghAnimation.AnimateTo( Property( mRefractionEffect, "uEffectStrength" ), 0.f );
448   - mStrenghAnimation.FinishedSignal().Connect( this, &RefractionEffectExample::OnTouchFinished );
449   - mStrenghAnimation.Play();
  383 + if( mStrenghAnimation )
  384 + {
  385 + mStrenghAnimation.Clear();
450 386 }
451   -
452   - mIsDown = false;
  387 + mStrenghAnimation = Animation::New(0.5f);
  388 + mStrenghAnimation.AnimateTo( Property( mMeshActor, mEffectStrengthIndex ), 0.f );
  389 + mStrenghAnimation.FinishedSignal().Connect( this, &RefractionEffectExample::OnTouchFinished );
  390 + mStrenghAnimation.Play();
453 391 break;
454 392 }
455 393 case TouchPoint::Stationary:
... ... @@ -459,24 +397,21 @@ private:
459 397 break;
460 398 }
461 399 }
  400 +
462 401 return true;
463 402 }
464 403  
465 404 void OnTouchFinished( Animation& source )
466 405 {
467   - mMeshActor.SetShaderEffect( mNoEffect );
468   - mRefractionEffect.SetLightXYOffset( Vector2::ZERO );
  406 + mMaterial.SetShader( mShaderFlat );
  407 + SetLightXYOffset( Vector2::ZERO );
469 408 }
470 409  
471   - void CreateSurface( const std::string& objFileName )
  410 + Geometry CreateGeometry(const std::string& objFileName)
472 411 {
473   - MeshData::VertexContainer vertices;
474   - MeshData::FaceIndices faces;
475   - MeshData meshData;
476   -
477   - std::vector<float> boundingBox;
478 412 std::vector<Vector3> vertexPositions;
479   - std::vector<int> faceIndices;
  413 + Vector<unsigned int> faceIndices;
  414 + Vector<float> boundingBox;
480 415 // read the vertice and faces from the .obj file, and record the bounding box
481 416 ReadObjFile( objFileName, boundingBox, vertexPositions, faceIndices );
482 417  
... ... @@ -486,53 +421,55 @@ private:
486 421  
487 422 // re-organize the mesh, the vertices are duplicated, each vertex only belongs to one triangle.
488 423 // Without sharing vertex between triangle, so we can manipulate the texture offset on each triangle conveniently.
489   - for( std::size_t i=0; i<faceIndices.size(); i=i+3 )
  424 + std::vector<Vertex> vertices;
  425 +
  426 + std::size_t size = faceIndices.Size();
  427 + vertices.reserve( size );
  428 +
  429 + for( std::size_t i=0; i<size; i=i+3 )
490 430 {
491 431 Vector3 edge1 = vertexPositions[ faceIndices[i+2] ] - vertexPositions[ faceIndices[i] ];
492 432 Vector3 edge2 = vertexPositions[ faceIndices[i+1] ] - vertexPositions[ faceIndices[i] ];
493 433 Vector3 normal = edge1.Cross(edge2);
494 434 normal.Normalize();
495 435  
  436 + // make sure all the faces are front-facing
496 437 if( normal.z > 0 )
497 438 {
498   - faces.push_back( i );
499   - faces.push_back( i+1 );
500   - faces.push_back( i+2 );
  439 + vertices.push_back( Vertex( vertexPositions[ faceIndices[i] ], normal, textureCoordinates[ faceIndices[i] ] ) );
  440 + vertices.push_back( Vertex( vertexPositions[ faceIndices[i+1] ], normal, textureCoordinates[ faceIndices[i+1] ] ) );
  441 + vertices.push_back( Vertex( vertexPositions[ faceIndices[i+2] ], normal, textureCoordinates[ faceIndices[i+2] ] ) );
501 442 }
502 443 else
503 444 {
504 445 normal *= -1.f;
505   - faces.push_back( i );
506   - faces.push_back( i+2 );
507   - faces.push_back( i+1 );
  446 + vertices.push_back( Vertex( vertexPositions[ faceIndices[i] ], normal, textureCoordinates[ faceIndices[i] ] ) );
  447 + vertices.push_back( Vertex( vertexPositions[ faceIndices[i+2] ], normal, textureCoordinates[ faceIndices[i+2] ] ) );
  448 + vertices.push_back( Vertex( vertexPositions[ faceIndices[i+1] ], normal, textureCoordinates[ faceIndices[i+1] ] ) );
508 449 }
  450 + }
509 451  
510   - vertices.push_back( MeshData::Vertex( vertexPositions[ faceIndices[i] ], textureCoordinates[ faceIndices[i] ], normal ) );
511   - vertices.push_back( MeshData::Vertex( vertexPositions[ faceIndices[i+1] ], textureCoordinates[ faceIndices[i+1] ], normal ) );
512   - vertices.push_back( MeshData::Vertex( vertexPositions[ faceIndices[i+2] ], textureCoordinates[ faceIndices[i+2] ], normal ) );
  452 + Property::Map vertexFormat;
  453 + vertexFormat["aPosition"] = Property::VECTOR3;
  454 + vertexFormat["aNormal"] = Property::VECTOR3;
  455 + vertexFormat["aTexCoord"] = Property::VECTOR2;
  456 + PropertyBuffer surfaceVertices = PropertyBuffer::New( vertexFormat, vertices.size() );
  457 + surfaceVertices.SetData( &vertices[0] );
513 458  
514   - }
  459 + Geometry surface = Geometry::New();
  460 + surface.AddVertexBuffer( surfaceVertices );
515 461  
516   - // Now ready to construct the mesh actor
517   - meshData.SetMaterial( mMaterial );
518   - meshData.SetVertices( vertices );
519   - meshData.SetFaceIndices( faces );
520   - meshData.SetHasTextureCoords(true);
521   - meshData.SetHasNormals(true);
522   - mMeshActor = MeshActor::New( Mesh::New( meshData ) );
523   - mMeshActor.SetParentOrigin(ParentOrigin::CENTER);
524   - mMeshActor.SetShaderEffect( mNoEffect );
525   - mContent.Add( mMeshActor );
  462 + return surface;
526 463 }
527 464  
528 465 void ReadObjFile( const std::string& objFileName,
529   - std::vector<float>& boundingBox,
  466 + Vector<float>& boundingBox,
530 467 std::vector<Vector3>& vertexPositions,
531   - std::vector<int>& faceIndices)
  468 + Vector<unsigned int>& faceIndices)
532 469 {
533 470 std::ifstream ifs( objFileName.c_str(), std::ios::in );
534 471  
535   - boundingBox.resize( 6 );
  472 + boundingBox.Resize( 6 );
536 473 boundingBox[0]=boundingBox[2]=boundingBox[4] = std::numeric_limits<float>::max();
537 474 boundingBox[1]=boundingBox[3]=boundingBox[5] = -std::numeric_limits<float>::max();
538 475  
... ... @@ -568,20 +505,20 @@ private:
568 505 }
569 506  
570 507 std::istringstream iss(line.substr(2), std::istringstream::in);
571   - int indices[ numOfInt ];
  508 + unsigned int indices[ numOfInt ];
572 509 unsigned int i=0;
573 510 while( iss >> indices[i++] && i < numOfInt);
574 511 unsigned int step = (i+1) / 3;
575   - faceIndices.push_back( indices[0]-1 );
576   - faceIndices.push_back( indices[step]-1 );
577   - faceIndices.push_back( indices[2*step]-1 );
  512 + faceIndices.PushBack( indices[0]-1 );
  513 + faceIndices.PushBack( indices[step]-1 );
  514 + faceIndices.PushBack( indices[2*step]-1 );
578 515 }
579 516 }
580 517  
581 518 ifs.close();
582 519 }
583 520  
584   - void ShapeResizeAndTexureCoordinateCalculation( const std::vector<float>& boundingBox,
  521 + void ShapeResizeAndTexureCoordinateCalculation( const Vector<float>& boundingBox,
585 522 std::vector<Vector3>& vertexPositions,
586 523 std::vector<Vector2>& textureCoordinates)
587 524 {
... ... @@ -592,12 +529,13 @@ private:
592 529 Vector3 scale( stageSize.x / bBoxSize.x, stageSize.y / bBoxSize.y, 1.f );
593 530 scale.z = (scale.x + scale.y)/2.f;
594 531  
  532 + textureCoordinates.reserve(vertexPositions.size());
  533 +
595 534 for( std::vector<Vector3>::iterator iter = vertexPositions.begin(); iter != vertexPositions.end(); iter++ )
596 535 {
597 536 Vector3 newPosition( (*iter) - bBoxMinCorner ) ;
598 537  
599   - Vector2 textureCoord( newPosition.x / bBoxSize.x, newPosition.y / bBoxSize.y );
600   - textureCoordinates.push_back( textureCoord );
  538 + textureCoordinates.push_back( Vector2( newPosition.x / bBoxSize.x, newPosition.y / bBoxSize.y ) );
601 539  
602 540 newPosition -= bBoxSize * 0.5f;
603 541 (*iter) = newPosition * scale;
... ... @@ -623,18 +561,22 @@ private:
623 561 Application& mApplication;
624 562 Layer mContent;
625 563  
626   - bool mIsDown;
627   - Vector2 mDownPosition;
628   - Vector2 mLightPosition;
629   - Vector2 mStageHalfSize;
630   -
  564 + Sampler mSampler;
631 565 Material mMaterial;
632   - MeshActor mMeshActor;
  566 + Geometry mGeometry;
  567 + Renderer mRenderer;
  568 + Actor mMeshActor;
  569 +
  570 + Shader mShaderFlat;
  571 + Shader mShaderRefraction;
  572 +
  573 + Animation mLightAnimation;
  574 + Animation mStrenghAnimation;
633 575  
634   - RefractionEffect mRefractionEffect;
635   - NoEffect mNoEffect;
636   - Animation mLightAnimation;
637   - Animation mStrenghAnimation;
  576 + Property::Index mLightXYOffsetIndex;
  577 + Property::Index mSpinAngleIndex;
  578 + Property::Index mLightIntensityIndex;
  579 + Property::Index mEffectStrengthIndex;
638 580  
639 581 Toolkit::PushButton mChangeTextureButton;
640 582 Toolkit::PushButton mChangeMeshButton;
... ...
examples/shadow-bone-lighting/shadow-bone-lighting-example.cpp
... ... @@ -167,6 +167,7 @@ public:
167 167 // Setup
168 168 mView.SetPosition(Vector3(0.0f, 0.0f, -50));
169 169  
  170 + mContents.SetBehavior(Layer::LAYER_3D);
170 171 mContents.SetPosition(mTranslation);
171 172 mContents.SetOrientation( CalculateWorldRotation( mSceneXRotation, mSceneYRotation ) );
172 173 mContents.SetScale(mPinchScale, mPinchScale, mPinchScale);
... ...
examples/textured-mesh/textured-mesh-example.cpp 0 โ†’ 100644
  1 +/*
  2 + * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + *
  16 + */
  17 +
  18 +// EXTERNAL INCLUDES
  19 +#include <dali/devel-api/rendering/renderer.h>
  20 +#include <dali-toolkit/dali-toolkit.h>
  21 +
  22 +// INTERNAL INCLUDES
  23 +#include "shared/view.h"
  24 +
  25 +using namespace Dali;
  26 +
  27 +namespace
  28 +{
  29 +const char* MATERIAL_SAMPLE( DALI_IMAGE_DIR "gallery-small-48.jpg" );
  30 +const char* MATERIAL_SAMPLE2( DALI_IMAGE_DIR "gallery-medium-19.jpg" );
  31 +
  32 +#define MAKE_SHADER(A)#A
  33 +
  34 +const char* VERTEX_SHADER = MAKE_SHADER(
  35 +attribute mediump vec2 aPosition;
  36 +attribute highp vec2 aTexCoord;
  37 +varying mediump vec2 vTexCoord;
  38 +uniform mediump mat4 uMvpMatrix;
  39 +uniform mediump vec3 uSize;
  40 +uniform lowp vec4 uFadeColor;
  41 +
  42 +void main()
  43 +{
  44 + mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);
  45 + vertexPosition.xyz *= uSize;
  46 + vertexPosition = uMvpMatrix * vertexPosition;
  47 + vTexCoord = aTexCoord;
  48 + gl_Position = vertexPosition;
  49 +}
  50 +);
  51 +
  52 +const char* FRAGMENT_SHADER = MAKE_SHADER(
  53 +varying mediump vec2 vTexCoord;
  54 +uniform lowp vec4 uColor;
  55 +uniform sampler2D sTexture;
  56 +uniform lowp vec4 uFadeColor;
  57 +
  58 +void main()
  59 +{
  60 + gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor * uFadeColor;
  61 +}
  62 +);
  63 +
  64 +Geometry CreateGeometry()
  65 +{
  66 + // Create vertices
  67 + const float halfQuadSize = .5f;
  68 + struct TexturedQuadVertex { Vector2 position; Vector2 textureCoordinates; };
  69 + TexturedQuadVertex texturedQuadVertexData[4] = {
  70 + { Vector2(-halfQuadSize, -halfQuadSize), Vector2(0.f, 0.f) },
  71 + { Vector2( halfQuadSize, -halfQuadSize), Vector2(1.f, 0.f) },
  72 + { Vector2(-halfQuadSize, halfQuadSize), Vector2(0.f, 1.f) },
  73 + { Vector2( halfQuadSize, halfQuadSize), Vector2(1.f, 1.f) } };
  74 +
  75 + Property::Map texturedQuadVertexFormat;
  76 + texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
  77 + texturedQuadVertexFormat["aTexCoord"] = Property::VECTOR2;
  78 + PropertyBuffer texturedQuadVertices = PropertyBuffer::New( texturedQuadVertexFormat, 4 );
  79 + texturedQuadVertices.SetData(texturedQuadVertexData);
  80 +
  81 + // Create indices
  82 + unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 };
  83 + Property::Map indexFormat;
  84 + indexFormat["indices"] = Property::UNSIGNED_INTEGER;
  85 + PropertyBuffer indices = PropertyBuffer::New( indexFormat, sizeof(indexData)/sizeof(indexData[0]) );
  86 + indices.SetData(indexData);
  87 +
  88 + // Create the geometry object
  89 + Geometry texturedQuadGeometry = Geometry::New();
  90 + texturedQuadGeometry.AddVertexBuffer( texturedQuadVertices );
  91 + texturedQuadGeometry.SetIndexBuffer( indices );
  92 +
  93 + return texturedQuadGeometry;
  94 +}
  95 +
  96 +/**
  97 + * Sinusoidal curve starting at zero with 2 cycles
  98 + */
  99 +float AlphaFunctionSineX2(float progress)
  100 +{
  101 + return 0.5f - cosf(progress * 4.0f * Math::PI) * 0.5f;
  102 +}
  103 +
  104 +} // anonymous namespace
  105 +
  106 +// This example shows how to use a simple mesh
  107 +//
  108 +class ExampleController : public ConnectionTracker
  109 +{
  110 +public:
  111 +
  112 + /**
  113 + * The example controller constructor.
  114 + * @param[in] application The application instance
  115 + */
  116 + ExampleController( Application& application )
  117 + : mApplication( application )
  118 + {
  119 + // Connect to the Application's Init signal
  120 + mApplication.InitSignal().Connect( this, &ExampleController::Create );
  121 + }
  122 +
  123 + /**
  124 + * The example controller destructor
  125 + */
  126 + ~ExampleController()
  127 + {
  128 + // Nothing to do here;
  129 + }
  130 +
  131 + /**
  132 + * Invoked upon creation of application
  133 + * @param[in] application The application instance
  134 + */
  135 + void Create( Application& application )
  136 + {
  137 + // The Init signal is received once (only) during the Application lifetime
  138 +
  139 + Stage stage = Stage::GetCurrent();
  140 + stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
  141 +
  142 + mStageSize = stage.GetSize();
  143 +
  144 + // Hide the indicator bar
  145 + application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE );
  146 +
  147 + mImage = ResourceImage::New( MATERIAL_SAMPLE, ResourceImage::ON_DEMAND, Image::NEVER );
  148 + mSampler1 = Sampler::New(mImage, "sTexture");
  149 +
  150 + Image image = ResourceImage::New( MATERIAL_SAMPLE2 );
  151 + mSampler2 = Sampler::New(image, "sTexture");
  152 +
  153 + mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
  154 + mMaterial1 = Material::New( mShader );
  155 + mMaterial1.AddSampler( mSampler1 );
  156 +
  157 + mMaterial2 = Material::New( mShader );
  158 + mMaterial2.AddSampler( mSampler2 );
  159 +
  160 + mGeometry = CreateGeometry();
  161 +
  162 + mRenderer = Renderer::New( mGeometry, mMaterial1 );
  163 +
  164 + mMeshActor = Actor::New();
  165 + mMeshActor.AddRenderer( mRenderer );
  166 + mMeshActor.SetSize(400, 400);
  167 +
  168 + Property::Index fadeColorIndex = mMeshActor.RegisterProperty( "uFadeColor", Color::GREEN );
  169 +
  170 + fadeColorIndex = mRenderer.RegisterProperty( "uFadeColor", Color::MAGENTA );
  171 + mRenderer.SetDepthIndex(0);
  172 +
  173 + mMeshActor.SetParentOrigin( ParentOrigin::TOP_CENTER );
  174 + mMeshActor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
  175 + stage.Add( mMeshActor );
  176 +
  177 + mRenderer2 = Renderer::New( mGeometry, mMaterial2 );
  178 +
  179 + mMeshActor2 = Actor::New();
  180 + mMeshActor2.AddRenderer( mRenderer2 );
  181 + mMeshActor2.SetSize(400, 400);
  182 +
  183 + mMeshActor2.RegisterProperty( "a-n-other-property", Color::GREEN );
  184 + Property::Index fadeColorIndex2 = mMeshActor2.RegisterProperty( "uFadeColor", Color::GREEN );
  185 +
  186 + mRenderer2.RegisterProperty( "a-n-other-property", Vector3::ZERO );
  187 + mRenderer2.RegisterProperty( "a-coefficient", 0.008f );
  188 + fadeColorIndex2 = mRenderer2.RegisterProperty( "uFadeColor", Color::BLUE );
  189 + mRenderer2.SetDepthIndex(0);
  190 +
  191 + mMeshActor2.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
  192 + mMeshActor2.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
  193 + stage.Add( mMeshActor2 );
  194 +
  195 + Animation animation = Animation::New(5);
  196 + KeyFrames keyFrames = KeyFrames::New();
  197 + keyFrames.Add(0.0f, Vector4::ZERO);
  198 + keyFrames.Add(1.0f, Vector4( Color::GREEN ));
  199 +
  200 + KeyFrames keyFrames2 = KeyFrames::New();
  201 + keyFrames2.Add(0.0f, Vector4::ZERO);
  202 + keyFrames2.Add(1.0f, Color::MAGENTA);
  203 +
  204 + animation.AnimateBetween( Property( mRenderer, fadeColorIndex ), keyFrames, AlphaFunction(AlphaFunction::SIN) );
  205 + animation.AnimateBetween( Property( mRenderer2, fadeColorIndex2 ), keyFrames2, AlphaFunction(AlphaFunctionSineX2) );
  206 + animation.SetLooping(true);
  207 + animation.Play();
  208 +
  209 + stage.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f));;
  210 + }
  211 +
  212 + BufferImage CreateBufferImage()
  213 + {
  214 + BufferImage image = BufferImage::New( 200, 200, Pixel::RGB888 );
  215 + PixelBuffer* pixelBuffer = image.GetBuffer();
  216 + unsigned int stride = image.GetBufferStride();
  217 + for( unsigned int x=0; x<200; x++ )
  218 + {
  219 + for( unsigned int y=0; y<200; y++ )
  220 + {
  221 + PixelBuffer* pixel = pixelBuffer + y*stride + x*3;
  222 + if( ((int)(x/20.0f))%2 + ((int)(y/20.0f)%2) == 1 )
  223 + {
  224 + pixel[0]=255;
  225 + pixel[1]=0;
  226 + pixel[2]=0;
  227 + pixel[3]=255;
  228 + }
  229 + else
  230 + {
  231 + pixel[0]=0;
  232 + pixel[1]=0;
  233 + pixel[2]=255;
  234 + pixel[3]=255;
  235 + }
  236 + }
  237 + }
  238 + image.Update();
  239 + return image;
  240 + }
  241 +
  242 + /**
  243 + * Invoked whenever the quit button is clicked
  244 + * @param[in] button the quit button
  245 + */
  246 + bool OnQuitButtonClicked( Toolkit::Button button )
  247 + {
  248 + // quit the application
  249 + mApplication.Quit();
  250 + return true;
  251 + }
  252 +
  253 + void OnKeyEvent(const KeyEvent& event)
  254 + {
  255 + if(event.state == KeyEvent::Down)
  256 + {
  257 + if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) )
  258 + {
  259 + mApplication.Quit();
  260 + }
  261 + }
  262 + }
  263 +
  264 +private:
  265 +
  266 + Application& mApplication; ///< Application instance
  267 + Vector3 mStageSize; ///< The size of the stage
  268 +
  269 + Image mImage;
  270 + Sampler mSampler1;
  271 + Sampler mSampler2;
  272 + Shader mShader;
  273 + Material mMaterial1;
  274 + Material mMaterial2;
  275 + Geometry mGeometry;
  276 + Renderer mRenderer;
  277 + Actor mMeshActor;
  278 + Renderer mRenderer2;
  279 + Actor mMeshActor2;
  280 + Timer mChangeImageTimer;
  281 +};
  282 +
  283 +void RunTest( Application& application )
  284 +{
  285 + ExampleController test( application );
  286 +
  287 + application.MainLoop();
  288 +}
  289 +
  290 +// Entry point for Linux & SLP applications
  291 +//
  292 +int main( int argc, char **argv )
  293 +{
  294 + Application application = Application::New( &argc, &argv );
  295 +
  296 + RunTest( application );
  297 +
  298 + return 0;
  299 +}
... ...
shared/dali-demo-strings.h
... ... @@ -53,11 +53,13 @@ extern &quot;C&quot;
53 53 #define DALI_DEMO_STR_TITLE_TEXT_LABEL dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_TEXT_LABEL")
54 54 #define DALI_DEMO_STR_TITLE_TEXT_LABEL_MULTI_LANGUAGE dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_TEXT_LABEL_MULTI_LANGUAGE")
55 55 #define DALI_DEMO_STR_TITLE_EMOJI_TEXT dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_EMOJI_TEXT")
56   -#define DALI_DEMO_STR_TITLE_ANIMATED_SHAPES dgettext(DALI_DEMO_STR_TITLE_ANIMATED_SHAPES)
57   -#define DALI_DEMO_STR_TITLE_PATH_ANIMATION dgettext(DALI_DEMO_STR_TITLE_PATH_ANIMATION)
58 56 #define DALI_DEMO_STR_TITLE_NEGOTIATE_SIZE dgettext(DALI_DEMO_STR_TITLE_NEGOTIATE_SIZE)
59 57 #define DALI_DEMO_STR_TITLE_BUTTONS dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_BUTTONS")
60 58 #define DALI_DEMO_STR_TITLE_LOGGING dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_LOGGING")
  59 +#define DALI_DEMO_STR_TITLE_MESH_MORPH dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_MESH_MORPH")
  60 +#define DALI_DEMO_STR_TITLE_MESH_SORTING dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_MESH_SORTING")
  61 +#define DALI_DEMO_STR_TITLE_TEXTURED_MESH dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TEXTURED_MESH")
  62 +#define DALI_DEMO_STR_TITLE_LINE_MESH dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_LINE_MESH")
61 63  
62 64 #else // !INTERNATIONALIZATION_ENABLED
63 65  
... ... @@ -82,11 +84,13 @@ extern &quot;C&quot;
82 84 #define DALI_DEMO_STR_TITLE_TEXT_LABEL "Text Label"
83 85 #define DALI_DEMO_STR_TITLE_TEXT_LABEL_MULTI_LANGUAGE "Text Scripts"
84 86 #define DALI_DEMO_STR_TITLE_EMOJI_TEXT "Emoji Text"
85   -#define DALI_DEMO_STR_TITLE_ANIMATED_SHAPES "Animated Shapes"
86   -#define DALI_DEMO_STR_TITLE_PATH_ANIMATION "Animated Path"
87 87 #define DALI_DEMO_STR_TITLE_NEGOTIATE_SIZE "Negotiate Size"
88 88 #define DALI_DEMO_STR_TITLE_BUTTONS "Buttons"
89 89 #define DALI_DEMO_STR_TITLE_LOGGING "Logging"
  90 +#define DALI_DEMO_STR_TITLE_MESH_MORPH "Mesh Morph"
  91 +#define DALI_DEMO_STR_TITLE_MESH_SORTING "Mesh Sorting"
  92 +#define DALI_DEMO_STR_TITLE_TEXTURED_MESH "Mesh Texture"
  93 +#define DALI_DEMO_STR_TITLE_LINE_MESH "Mesh Line"
90 94  
91 95 #endif
92 96  
... ...
shared/view.h
... ... @@ -26,6 +26,13 @@
26 26 namespace DemoHelper
27 27 {
28 28  
  29 +enum ControlDepthIndexRanges
  30 +{
  31 + BACKGROUND_DEPTH_INDEX = -10000000,
  32 + CONTENT_DEPTH_INDEX = 0,
  33 + DECORATION_DEPTH_INDEX = 10000000
  34 +};
  35 +
29 36 /**
30 37 * Provide a style for the view and its tool bar.
31 38 */
... ... @@ -94,7 +101,6 @@ Dali::Layer CreateToolbar( Dali::Toolkit::ToolBar&amp; toolBar,
94 101 {
95 102 Dali::Toolkit::TextLabel label = Dali::Toolkit::TextLabel::New();
96 103 label.SetAnchorPoint( Dali::AnchorPoint::TOP_LEFT );
97   - label.SetDrawMode( Dali::DrawMode::OVERLAY );
98 104 label.SetProperty( Dali::Toolkit::Control::Property::STYLE_NAME, "toolbarlabel" );
99 105 label.SetProperty( Dali::Toolkit::TextLabel::Property::TEXT, title );
100 106 label.SetProperty( Dali::Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
... ... @@ -160,7 +166,6 @@ Dali::Toolkit::TextLabel CreateToolBarLabel( const std::string&amp; text )
160 166 {
161 167 Dali::Toolkit::TextLabel label = Dali::Toolkit::TextLabel::New( text );
162 168 label.SetProperty( Dali::Toolkit::Control::Property::STYLE_NAME, "toolbarlabel" );
163   - label.SetDrawMode( Dali::DrawMode::OVERLAY );
164 169 label.SetProperty( Dali::Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
165 170 label.SetProperty( Dali::Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
166 171 label.SetResizePolicy( Dali::ResizePolicy::FILL_TO_PARENT, Dali::Dimension::HEIGHT );
... ...