2 * Copyright (c) 2022 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>
22 #include "generated/mesh-morph-frag.h"
23 #include "generated/mesh-morph-vert.h"
24 #include "shared/view.h"
30 Geometry CreateGeometry()
42 VertexPosition quad[] = {
85 float bigSide = 0.707106781;
86 float side = bigSide * .5f;
87 // float smallSide = side * .5f;
89 Vector2 pA = Vector2(side, .25);
90 Vector2 pB = pA + Vector2(0., bigSide);
91 Vector2 pC = pB + Vector2(-bigSide, 0.);
92 Vector2 pD = pA + Vector2(-.5, -.5);
93 Vector2 pE = pD + Vector2(.0, 1.);
94 Vector2 pF = pD + Vector2(-side, side);
95 Vector2 pF2 = pD + Vector2(0., bigSide);
96 Vector2 pG = pD + Vector2(-.25, .25);
97 Vector2 pH = pD + Vector2(-.5, .0);
98 Vector2 pI = pD + Vector2(-.25, -.25);
99 Vector2 pJ = pD + Vector2(0., -.5);
100 Vector2 pK = pD + Vector2(-.5, -.5);
101 Vector2 pL = pB + Vector2(0, -side);
102 Vector2 pM = pL + Vector2(side, -side);
103 Vector2 pN = pB + Vector2(side, -side);
105 VertexPosition cat[] = {
148 VertexColor colors[] = {
150 {Vector3(1., 1., 0.)},
151 {Vector3(1., 1., 0.)},
152 {Vector3(1., 1., 0.)},
155 {Vector3(0., 1., 0.)},
156 {Vector3(0., 1., 0.)},
157 {Vector3(0., 1., 0.)},
160 {Vector3(0., 0., 1.)},
161 {Vector3(0., 0., 1.)},
162 {Vector3(0., 0., 1.)},
165 {Vector3(1., 0., 0.)},
166 {Vector3(1., 0., 0.)},
167 {Vector3(1., 0., 0.)},
168 {Vector3(1., 0., 0.)},
169 {Vector3(1., 0., 0.)},
170 {Vector3(1., 0., 0.)},
173 {Vector3(0., 1., 1.)},
174 {Vector3(0., 1., 1.)},
175 {Vector3(0., 1., 1.)},
178 {Vector3(1., 0., 1.)},
179 {Vector3(1., 0., 1.)},
180 {Vector3(1., 0., 1.)},
181 {Vector3(1., 0., 1.)},
182 {Vector3(1., 0., 1.)},
183 {Vector3(1., 0., 1.)},
186 {Vector3(1., 0.5, 0.)},
187 {Vector3(1., 0.5, 0.)},
188 {Vector3(1., 0.5, 0.)},
192 unsigned int numberOfVertices = sizeof(quad) / sizeof(VertexPosition);
194 Property::Map initialPositionVertexFormat;
195 initialPositionVertexFormat["aInitPos"] = Property::VECTOR2;
196 VertexBuffer initialPositionVertices = VertexBuffer::New(initialPositionVertexFormat);
197 initialPositionVertices.SetData(quad, numberOfVertices);
199 Property::Map finalPositionVertexFormat;
200 finalPositionVertexFormat["aFinalPos"] = Property::VECTOR2;
201 VertexBuffer finalPositionVertices = VertexBuffer::New(finalPositionVertexFormat);
202 finalPositionVertices.SetData(cat, numberOfVertices);
204 Property::Map colorVertexFormat;
205 colorVertexFormat["aColor"] = Property::VECTOR3;
206 VertexBuffer colorVertices = VertexBuffer::New(colorVertexFormat);
207 colorVertices.SetData(colors, numberOfVertices);
209 // Create the geometry object
210 Geometry texturedQuadGeometry = Geometry::New();
211 texturedQuadGeometry.AddVertexBuffer(initialPositionVertices);
212 texturedQuadGeometry.AddVertexBuffer(finalPositionVertices);
213 texturedQuadGeometry.AddVertexBuffer(colorVertices);
215 return texturedQuadGeometry;
218 inline float StationarySin(float progress) ///< Single revolution
220 float val = cosf(progress * 2.0f * Math::PI) + .5f;
221 val = val > 1.f ? 1.f : val;
222 val = val < 0.f ? 0.f : val;
226 } // anonymous namespace
228 // This example shows how to use a simple mesh
230 class ExampleController : public ConnectionTracker
234 * The example controller constructor.
235 * @param[in] application The application instance
237 ExampleController(Application& application)
238 : mApplication(application)
240 // Connect to the Application's Init signal
241 mApplication.InitSignal().Connect(this, &ExampleController::Create);
245 * The example controller destructor
249 // Nothing to do here;
253 * Invoked upon creation of application
254 * @param[in] application The application instance
256 void Create(Application& application)
258 Window window = application.GetWindow();
259 window.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
261 mWindowSize = window.GetSize();
263 // The Init signal is received once (only) during the Application lifetime
265 mShader = Shader::New(SHADER_MESH_MORPH_VERT, SHADER_MESH_MORPH_FRAG);
266 mGeometry = CreateGeometry();
267 mRenderer = Renderer::New(mGeometry, mShader);
269 mMeshActor = Actor::New();
270 mMeshActor.AddRenderer(mRenderer);
271 mMeshActor.SetProperty(Actor::Property::SIZE, Vector2(400, 400));
272 mMeshActor.SetProperty(Actor::Property::UPDATE_AREA_HINT, Vector4(0, 0, 560, 780));
274 Property::Index morphDeltaIndex = mMeshActor.RegisterProperty("uDelta", 0.f);
276 mRenderer.SetProperty(Renderer::Property::DEPTH_INDEX, 0);
278 mMeshActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
279 mMeshActor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
280 window.Add(mMeshActor);
282 Animation animation = Animation::New(10);
283 animation.AnimateTo(Property(mMeshActor, morphDeltaIndex), 1.f, StationarySin);
284 animation.SetLooping(true);
287 window.SetBackgroundColor(Vector4(0.0f, 0.2f, 0.2f, 1.0f));
291 * Invoked whenever the quit button is clicked
292 * @param[in] button the quit button
294 bool OnQuitButtonClicked(Toolkit::Button button)
296 // quit the application
301 void OnKeyEvent(const KeyEvent& event)
303 if(event.GetState() == KeyEvent::DOWN)
305 if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
313 Application& mApplication; ///< Application instance
314 Vector3 mWindowSize; ///< The size of the window
323 int DALI_EXPORT_API main(int argc, char** argv)
325 Application application = Application::New(&argc, &argv);
326 ExampleController test(application);
327 application.MainLoop();