Commit 8d10a2d0f9e9adb56a41a258c73a818eca4f0b4e
Merge branch 'devel/new_mesh' into devel/master
Change-Id: I84faa5b88e6cca8f606c5f32d8fb5e18ce0ce27c
Showing
26 changed files
with
2358 additions
and
1700 deletions
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& 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& 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 "top-bar.png" ); |
| 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& 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& 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& 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& 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& 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 "C" |
| 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 "C" |
| 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& 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& 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 ); | ... | ... |