2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali-toolkit/dali-toolkit.h>
20 #include <dali/devel-api/actors/actor-devel.h>
23 #include "shared/view.h"
24 #include "generated/mesh-morph-vert.h"
25 #include "generated/mesh-morph-frag.h"
32 Geometry CreateGeometry()
44 VertexPosition quad[] = {
87 float bigSide = 0.707106781;
88 float side = bigSide * .5f;
89 // float smallSide = side * .5f;
91 Vector2 pA = Vector2(side, .25);
92 Vector2 pB = pA + Vector2(0., bigSide);
93 Vector2 pC = pB + Vector2(-bigSide, 0.);
94 Vector2 pD = pA + Vector2(-.5, -.5);
95 Vector2 pE = pD + Vector2(.0, 1.);
96 Vector2 pF = pD + Vector2(-side, side);
97 Vector2 pF2 = pD + Vector2(0., bigSide);
98 Vector2 pG = pD + Vector2(-.25, .25);
99 Vector2 pH = pD + Vector2(-.5, .0);
100 Vector2 pI = pD + Vector2(-.25, -.25);
101 Vector2 pJ = pD + Vector2(0., -.5);
102 Vector2 pK = pD + Vector2(-.5, -.5);
103 Vector2 pL = pB + Vector2(0, -side);
104 Vector2 pM = pL + Vector2(side, -side);
105 Vector2 pN = pB + Vector2(side, -side);
107 VertexPosition cat[] = {
150 VertexColor colors[] = {
152 {Vector3(1., 1., 0.)},
153 {Vector3(1., 1., 0.)},
154 {Vector3(1., 1., 0.)},
157 {Vector3(0., 1., 0.)},
158 {Vector3(0., 1., 0.)},
159 {Vector3(0., 1., 0.)},
162 {Vector3(0., 0., 1.)},
163 {Vector3(0., 0., 1.)},
164 {Vector3(0., 0., 1.)},
167 {Vector3(1., 0., 0.)},
168 {Vector3(1., 0., 0.)},
169 {Vector3(1., 0., 0.)},
170 {Vector3(1., 0., 0.)},
171 {Vector3(1., 0., 0.)},
172 {Vector3(1., 0., 0.)},
175 {Vector3(0., 1., 1.)},
176 {Vector3(0., 1., 1.)},
177 {Vector3(0., 1., 1.)},
180 {Vector3(1., 0., 1.)},
181 {Vector3(1., 0., 1.)},
182 {Vector3(1., 0., 1.)},
183 {Vector3(1., 0., 1.)},
184 {Vector3(1., 0., 1.)},
185 {Vector3(1., 0., 1.)},
188 {Vector3(1., 0.5, 0.)},
189 {Vector3(1., 0.5, 0.)},
190 {Vector3(1., 0.5, 0.)},
194 unsigned int numberOfVertices = sizeof(quad) / sizeof(VertexPosition);
196 Property::Map initialPositionVertexFormat;
197 initialPositionVertexFormat["aInitPos"] = Property::VECTOR2;
198 VertexBuffer initialPositionVertices = VertexBuffer::New(initialPositionVertexFormat);
199 initialPositionVertices.SetData(quad, numberOfVertices);
201 Property::Map finalPositionVertexFormat;
202 finalPositionVertexFormat["aFinalPos"] = Property::VECTOR2;
203 VertexBuffer finalPositionVertices = VertexBuffer::New(finalPositionVertexFormat);
204 finalPositionVertices.SetData(cat, numberOfVertices);
206 Property::Map colorVertexFormat;
207 colorVertexFormat["aColor"] = Property::VECTOR3;
208 VertexBuffer colorVertices = VertexBuffer::New(colorVertexFormat);
209 colorVertices.SetData(colors, numberOfVertices);
211 // Create the geometry object
212 Geometry texturedQuadGeometry = Geometry::New();
213 texturedQuadGeometry.AddVertexBuffer(initialPositionVertices);
214 texturedQuadGeometry.AddVertexBuffer(finalPositionVertices);
215 texturedQuadGeometry.AddVertexBuffer(colorVertices);
217 return texturedQuadGeometry;
220 inline float StationarySin(float progress) ///< Single revolution
222 float val = cosf(progress * 2.0f * Math::PI) + .5f;
223 val = val > 1.f ? 1.f : val;
224 val = val < 0.f ? 0.f : val;
228 } // anonymous namespace
230 // This example shows how to use a simple mesh
232 class ExampleController : public ConnectionTracker
236 * The example controller constructor.
237 * @param[in] application The application instance
239 ExampleController(Application& application)
240 : mApplication(application)
242 // Connect to the Application's Init signal
243 mApplication.InitSignal().Connect(this, &ExampleController::Create);
247 * The example controller destructor
251 // Nothing to do here;
255 * Invoked upon creation of application
256 * @param[in] application The application instance
258 void Create(Application& application)
260 Window window = application.GetWindow();
261 window.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
263 mWindowSize = window.GetSize();
265 // The Init signal is received once (only) during the Application lifetime
267 mShader = Shader::New(SHADER_MESH_MORPH_VERT, SHADER_MESH_MORPH_FRAG);
268 mGeometry = CreateGeometry();
269 mRenderer = Renderer::New(mGeometry, mShader);
271 mMeshActor = Actor::New();
272 mMeshActor.AddRenderer(mRenderer);
273 mMeshActor.SetProperty(Actor::Property::SIZE, Vector2(400, 400));
274 mMeshActor.SetProperty(DevelActor::Property::UPDATE_SIZE_HINT, Vector2(480, 700));
276 Property::Index morphDeltaIndex = mMeshActor.RegisterProperty("uDelta", 0.f);
278 mRenderer.SetProperty(Renderer::Property::DEPTH_INDEX, 0);
280 mMeshActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
281 mMeshActor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
282 window.Add(mMeshActor);
284 Animation animation = Animation::New(10);
285 animation.AnimateTo(Property(mMeshActor, morphDeltaIndex), 1.f, StationarySin);
286 animation.SetLooping(true);
289 window.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f));
293 * Invoked whenever the quit button is clicked
294 * @param[in] button the quit button
296 bool OnQuitButtonClicked(Toolkit::Button button)
298 // quit the application
303 void OnKeyEvent(const KeyEvent& event)
305 if(event.GetState() == KeyEvent::DOWN)
307 if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
315 Application& mApplication; ///< Application instance
316 Vector3 mWindowSize; ///< The size of the window
325 int DALI_EXPORT_API main(int argc, char** argv)
327 Application application = Application::New(&argc, &argv);
328 ExampleController test(application);
329 application.MainLoop();