Merge branch 'devel/master' into tizen
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-VisualRenderer.cpp
1 /*
2  * Copyright (c) 2022 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/actors/actor-devel.h>
20 #include <dali/devel-api/common/capabilities.h>
21 #include <dali/devel-api/common/stage.h>
22 #include <dali/devel-api/rendering/renderer-devel.h>
23 #include <dali/integration-api/render-task-list-integ.h>
24 #include <dali/public-api/dali-core.h>
25 #include <cstdio>
26 #include <string>
27
28 // INTERNAL INCLUDES
29 #include <dali-test-suite-utils.h>
30 #include <mesh-builder.h>
31 #include <test-trace-call-stack.h>
32 #include "test-graphics-command-buffer.h"
33
34 using namespace Dali;
35
36 void visual_renderer_test_startup(void)
37 {
38   test_return_value = TET_UNDEF;
39 }
40
41 void visual_renderer_test_cleanup(void)
42 {
43   test_return_value = TET_PASS;
44 }
45
46 int UtcDaliVisualRendererNew01(void)
47 {
48   TestApplication application;
49
50   Geometry       geometry = CreateQuadGeometry();
51   Shader         shader   = CreateShader();
52   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
53
54   DALI_TEST_EQUALS((bool)renderer, true, TEST_LOCATION);
55   END_TEST;
56 }
57
58 int UtcDaliVisualRendererNew02(void)
59 {
60   TestApplication application;
61   VisualRenderer  renderer;
62   DALI_TEST_EQUALS((bool)renderer, false, TEST_LOCATION);
63   END_TEST;
64 }
65
66 int UtcDaliVisualRendererCopyConstructor(void)
67 {
68   TestApplication application;
69
70   Geometry       geometry = CreateQuadGeometry();
71   Shader         shader   = CreateShader();
72   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
73
74   VisualRenderer rendererCopy(renderer);
75   DALI_TEST_EQUALS((bool)rendererCopy, true, TEST_LOCATION);
76
77   END_TEST;
78 }
79
80 int UtcDaliVisualRendererAssignmentOperator(void)
81 {
82   TestApplication application;
83
84   Geometry       geometry = CreateQuadGeometry();
85   Shader         shader   = CreateShader();
86   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
87
88   VisualRenderer renderer2;
89   DALI_TEST_EQUALS((bool)renderer2, false, TEST_LOCATION);
90
91   renderer2 = renderer;
92   DALI_TEST_EQUALS((bool)renderer2, true, TEST_LOCATION);
93   END_TEST;
94 }
95
96 int UtcDaliVisualRendererMoveConstructor(void)
97 {
98   TestApplication application;
99
100   Geometry       geometry = CreateQuadGeometry();
101   Shader         shader   = Shader::New("vertexSrc", "fragmentSrc");
102   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
103   DALI_TEST_CHECK(renderer);
104   DALI_TEST_EQUALS(1, renderer.GetBaseObject().ReferenceCount(), TEST_LOCATION);
105   DALI_TEST_EQUALS(renderer.GetProperty<Vector3>(VisualRenderer::Property::VISUAL_MIX_COLOR), Vector3::ONE, TEST_LOCATION);
106
107   auto testColor = Vector3(1.0f, 0.0f, 1.0f);
108   renderer.SetProperty(VisualRenderer::Property::VISUAL_MIX_COLOR, testColor);
109   application.SendNotification();
110   application.Render();
111   DALI_TEST_EQUALS(renderer.GetProperty<Vector3>(VisualRenderer::Property::VISUAL_MIX_COLOR), testColor, TEST_LOCATION);
112
113   VisualRenderer move = std::move(renderer);
114   DALI_TEST_CHECK(move);
115   DALI_TEST_EQUALS(1, move.GetBaseObject().ReferenceCount(), TEST_LOCATION);
116   DALI_TEST_EQUALS(move.GetProperty<Vector3>(VisualRenderer::Property::VISUAL_MIX_COLOR), testColor, TEST_LOCATION);
117   DALI_TEST_CHECK(!renderer);
118
119   END_TEST;
120 }
121
122 int UtcDaliVisualRendererMoveAssignment(void)
123 {
124   TestApplication application;
125
126   Geometry       geometry = CreateQuadGeometry();
127   Shader         shader   = Shader::New("vertexSrc", "fragmentSrc");
128   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
129   DALI_TEST_CHECK(renderer);
130   DALI_TEST_EQUALS(1, renderer.GetBaseObject().ReferenceCount(), TEST_LOCATION);
131   DALI_TEST_EQUALS(renderer.GetProperty<Vector3>(VisualRenderer::Property::VISUAL_MIX_COLOR), Vector3::ONE, TEST_LOCATION);
132
133   renderer.SetProperty(VisualRenderer::Property::VISUAL_MIX_COLOR, Vector3(1.0f, 0.0f, 1.0f));
134   application.SendNotification();
135   application.Render();
136   DALI_TEST_EQUALS(renderer.GetProperty<Vector3>(VisualRenderer::Property::VISUAL_MIX_COLOR), Vector3(1.0f, 0.0f, 1.0f), TEST_LOCATION);
137
138   VisualRenderer move;
139   move = std::move(renderer);
140   DALI_TEST_CHECK(move);
141   DALI_TEST_EQUALS(1, move.GetBaseObject().ReferenceCount(), TEST_LOCATION);
142   DALI_TEST_EQUALS(move.GetProperty<Vector3>(VisualRenderer::Property::VISUAL_MIX_COLOR), Vector3(1.0f, 0.0f, 1.0f), TEST_LOCATION);
143   DALI_TEST_CHECK(!renderer);
144
145   END_TEST;
146 }
147
148 int UtcDaliVisualRendererDownCast01(void)
149 {
150   TestApplication application;
151
152   Geometry       geometry = CreateQuadGeometry();
153   Shader         shader   = CreateShader();
154   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
155
156   BaseHandle     handle(renderer);
157   VisualRenderer renderer2 = VisualRenderer::DownCast(handle);
158   DALI_TEST_EQUALS((bool)renderer2, true, TEST_LOCATION);
159   END_TEST;
160 }
161
162 int UtcDaliVisualRendererDownCast02(void)
163 {
164   TestApplication application;
165
166   Handle         handle   = Handle::New(); // Create a custom object
167   VisualRenderer renderer = VisualRenderer::DownCast(handle);
168   DALI_TEST_EQUALS((bool)renderer, false, TEST_LOCATION);
169   END_TEST;
170 }
171
172 // using a template to auto deduce the parameter types
173 template<typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>
174 void TEST_RENDERER_PROPERTY(P1 renderer, P2 stringName, P3 type, P4 isWriteable, P5 isAnimateable, P6 isConstraintInput, P7 enumName, P8 LOCATION)
175 {
176   DALI_TEST_EQUALS(renderer.GetPropertyName(enumName), stringName, LOCATION);
177   DALI_TEST_EQUALS(renderer.GetPropertyIndex(stringName), static_cast<Property::Index>(enumName), LOCATION);
178   DALI_TEST_EQUALS(renderer.GetPropertyType(enumName), type, LOCATION);
179   DALI_TEST_EQUALS(renderer.IsPropertyWritable(enumName), isWriteable, LOCATION);
180   DALI_TEST_EQUALS(renderer.IsPropertyAnimatable(enumName), isAnimateable, LOCATION);
181   DALI_TEST_EQUALS(renderer.IsPropertyAConstraintInput(enumName), isConstraintInput, LOCATION);
182 }
183
184 int UtcDaliVisualRendererDefaultProperties(void)
185 {
186   TestApplication application;
187   Geometry        geometry     = CreateQuadGeometry();
188   Shader          shader       = CreateShader();
189   VisualRenderer  renderer     = VisualRenderer::New(geometry, shader);
190   Renderer        baseRenderer = Renderer::New(geometry, shader);
191
192   DALI_TEST_EQUALS(baseRenderer.GetPropertyCount(), 27, TEST_LOCATION);
193   DALI_TEST_EQUALS(renderer.GetPropertyCount(), 27 + 8, TEST_LOCATION);
194
195   TEST_RENDERER_PROPERTY(renderer, "transformOffset", Property::VECTOR2, true, true, true, VisualRenderer::Property::TRANSFORM_OFFSET, TEST_LOCATION);
196   TEST_RENDERER_PROPERTY(renderer, "transformSize", Property::VECTOR2, true, true, true, VisualRenderer::Property::TRANSFORM_SIZE, TEST_LOCATION);
197   TEST_RENDERER_PROPERTY(renderer, "transformOrigin", Property::VECTOR2, true, false, false, VisualRenderer::Property::TRANSFORM_ORIGIN, TEST_LOCATION);
198   TEST_RENDERER_PROPERTY(renderer, "transformAnchorPoint", Property::VECTOR2, true, false, false, VisualRenderer::Property::TRANSFORM_ANCHOR_POINT, TEST_LOCATION);
199   TEST_RENDERER_PROPERTY(renderer, "transformOffsetSizeMode", Property::VECTOR4, true, false, false, VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE, TEST_LOCATION);
200   TEST_RENDERER_PROPERTY(renderer, "extraSize", Property::VECTOR2, true, true, true, VisualRenderer::Property::EXTRA_SIZE, TEST_LOCATION);
201
202   TEST_RENDERER_PROPERTY(renderer, "visualMixColor", Property::VECTOR3, true, true, true, VisualRenderer::Property::VISUAL_MIX_COLOR, TEST_LOCATION);
203   TEST_RENDERER_PROPERTY(renderer, "preMultipliedAlpha", Property::FLOAT, true, false, false, VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA, TEST_LOCATION);
204
205   END_TEST;
206 }
207
208 int UtcDaliVisualRendererAnimatedProperty01(void)
209 {
210   TestApplication application;
211
212   tet_infoline("Test that a visual renderer property can be animated");
213
214   Shader         shader   = Shader::New("VertexSource", "FragmentSource");
215   Geometry       geometry = CreateQuadGeometry();
216   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
217
218   Actor actor = Actor::New();
219   actor.AddRenderer(renderer);
220   actor.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 400.0f));
221   application.GetScene().Add(actor);
222
223   Property::Index colorIndex = VisualRenderer::Property::VISUAL_MIX_COLOR;
224   renderer.SetProperty(colorIndex, Vector3(1.0f, 1.0f, 1.0f));
225
226   application.SendNotification();
227   application.Render(0);
228   DALI_TEST_EQUALS(renderer.GetProperty<Vector3>(colorIndex), Vector3(1.0f, 1.0f, 1.0f), 0.001f, TEST_LOCATION);
229
230   Animation animation = Animation::New(1.0f);
231   KeyFrames keyFrames = KeyFrames::New();
232   keyFrames.Add(0.0f, Vector3(1.0f, 0.0f, 1.0f));
233   keyFrames.Add(1.0f, Vector3(0.0f, 0.0f, 0.0f));
234   animation.AnimateBetween(Property(renderer, colorIndex), keyFrames);
235   animation.Play();
236
237   application.SendNotification();
238   application.Render(500);
239
240   DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector3>(colorIndex), Vector3(0.5f, 0.f, 0.5f), TEST_LOCATION);
241
242   application.Render(400);
243   DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector3>(colorIndex), Vector3(0.1f, 0.f, 0.1f), TEST_LOCATION);
244
245   application.Render(100);
246   DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector3>(colorIndex), Vector3(0.f, 0.f, 0.f), TEST_LOCATION);
247   DALI_TEST_EQUALS(renderer.GetProperty<Vector3>(colorIndex), Vector3(0.f, 0.f, 0.f), TEST_LOCATION);
248
249   // Can we test to see if the actor has stopped being drawn?
250   END_TEST;
251 }
252
253 int UtcDaliVisualRendererAnimatedProperty02(void)
254 {
255   TestApplication application;
256
257   tet_infoline("Test that a visual renderer property can be animated");
258
259   Shader         shader   = Shader::New("VertexSource", "FragmentSource");
260   Geometry       geometry = CreateQuadGeometry();
261   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
262
263   Actor actor = Actor::New();
264   actor.AddRenderer(renderer);
265   actor.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 400.0f));
266   application.GetScene().Add(actor);
267
268   Property::Index index = VisualRenderer::Property::TRANSFORM_OFFSET;
269   renderer.SetProperty(index, Vector2(1.0f, 0.0f));
270
271   application.SendNotification();
272   application.Render(0);
273   application.SendNotification();
274   application.Render(0);
275   DALI_TEST_EQUALS(renderer.GetProperty<Vector2>(index), Vector2(1.0f, 0.0f), 0.001f, TEST_LOCATION);
276
277   Animation animation = Animation::New(1.0f);
278   KeyFrames keyFrames = KeyFrames::New();
279   keyFrames.Add(0.0f, Vector2(1.0f, 0.0f));
280   keyFrames.Add(1.0f, Vector2(0.0f, 1.0f));
281   animation.AnimateBetween(Property(renderer, index), keyFrames);
282   animation.Play();
283
284   application.SendNotification();
285   application.Render(500);
286
287   DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector2>(index), Vector2(0.5f, 0.5f), TEST_LOCATION);
288
289   application.Render(400);
290   DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector2>(index), Vector2(0.1f, 0.9f), TEST_LOCATION);
291
292   application.Render(100);
293   DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector2>(index), Vector2(0.f, 1.0f), TEST_LOCATION);
294   DALI_TEST_EQUALS(renderer.GetProperty<Vector2>(index), Vector2(0.f, 1.f), TEST_LOCATION);
295
296   END_TEST;
297 }
298
299 struct VisualProperties
300 {
301   VisualProperties() = default;
302
303   VisualProperties(Vector2 offset, Vector2 size, Vector2 origin, Vector2 pivot, Vector4 modes, Vector2 extraSize, Vector3 mixColor)
304   : mTransformOffset(offset),
305     mTransformSize(size),
306     mTransformOrigin(origin),
307     mTransformAnchorPoint(pivot),
308     mTransformOffsetSizeMode(modes),
309     mExtraSize(extraSize),
310     mMixColor(mixColor)
311   {
312   }
313
314   Vector2 mTransformOffset{Vector2::ZERO};
315   Vector2 mTransformSize{Vector2::ZERO};
316   Vector2 mTransformOrigin{Vector2::ZERO};
317   Vector2 mTransformAnchorPoint{Vector2::ZERO};
318   Vector4 mTransformOffsetSizeMode{Vector2::ZERO};
319   Vector2 mExtraSize{Vector2::ZERO};
320   Vector3 mMixColor{Vector3::ONE};
321
322   static VisualProperties GetPropsAt(float alpha, const VisualProperties& start, const VisualProperties& end)
323   {
324     VisualProperties progress;
325     progress.mTransformOffset         = start.mTransformOffset + (end.mTransformOffset - start.mTransformOffset) * alpha;
326     progress.mTransformSize           = start.mTransformSize + (end.mTransformSize - start.mTransformSize) * alpha;
327     progress.mExtraSize               = start.mExtraSize + (end.mExtraSize - start.mExtraSize) * alpha;
328     progress.mMixColor                = start.mMixColor + (end.mMixColor - start.mMixColor) * alpha;
329     progress.mTransformOffsetSizeMode = end.mTransformOffsetSizeMode;
330     progress.mTransformOrigin         = end.mTransformOrigin;
331     progress.mTransformAnchorPoint    = end.mTransformAnchorPoint;
332     return progress;
333   }
334 };
335
336 void PrintVisualProperties(const VisualProperties& props, const std::string& prefix)
337 {
338   tet_printf(
339     "%s: offset:(%5.3f, %5.3f)\n"
340     "%*c size:(%5.3f, %5.3f)\n"
341     "%*c origin:(%5.3f, %5.3f)\n"
342     "%*c anchorPoint:(%5.3f, %5.3f)\n"
343     "%*c offsetSizeMode:(%5.3f, %5.3f, %5.3f, %5.3f)\n"
344     "%*c extraSize:(%5.3f, %5.3f)\n"
345     "%*c mixColor:(%5.3f, %5.3f, %5.3f, %5.3f)\n",
346     prefix.c_str(),
347     props.mTransformOffset.x,
348     props.mTransformOffset.y,
349     prefix.length(),
350     ' ',
351     props.mTransformSize.x,
352     props.mTransformSize.y,
353     prefix.length(),
354     ' ',
355     props.mTransformOrigin.x,
356     props.mTransformOrigin.y,
357     prefix.length(),
358     ' ',
359     props.mTransformAnchorPoint.x,
360     props.mTransformAnchorPoint.y,
361     prefix.length(),
362     ' ',
363     props.mTransformOffsetSizeMode.x,
364     props.mTransformOffsetSizeMode.y,
365     props.mTransformOffsetSizeMode.z,
366     props.mTransformOffsetSizeMode.w,
367     prefix.length(),
368     ' ',
369     props.mExtraSize.x,
370     props.mExtraSize.y,
371     prefix.length(),
372     ' ',
373     props.mMixColor.x,
374     props.mMixColor.y,
375     props.mMixColor.z);
376 }
377
378 void SetVisualProperties(VisualRenderer renderer, VisualProperties props)
379 {
380   renderer.SetProperty(VisualRenderer::Property::TRANSFORM_OFFSET, props.mTransformOffset);
381   renderer.SetProperty(VisualRenderer::Property::TRANSFORM_SIZE, props.mTransformSize);
382   renderer.SetProperty(VisualRenderer::Property::TRANSFORM_ORIGIN, props.mTransformOrigin);
383   renderer.SetProperty(VisualRenderer::Property::TRANSFORM_ANCHOR_POINT, props.mTransformAnchorPoint);
384   renderer.SetProperty(VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE, props.mTransformOffsetSizeMode);
385   renderer.SetProperty(VisualRenderer::Property::EXTRA_SIZE, props.mExtraSize);
386   renderer.SetProperty(VisualRenderer::Property::VISUAL_MIX_COLOR, props.mMixColor);
387 }
388
389 void CheckEventVisualProperties(VisualRenderer renderer, VisualProperties expectedProps)
390 {
391   tet_infoline("CheckEventVisualProperties\n");
392
393   VisualProperties actualProps;
394   actualProps.mTransformOffset         = renderer.GetProperty<Vector2>(VisualRenderer::Property::TRANSFORM_OFFSET);
395   actualProps.mTransformSize           = renderer.GetProperty<Vector2>(VisualRenderer::Property::TRANSFORM_SIZE);
396   actualProps.mTransformOrigin         = renderer.GetProperty<Vector2>(VisualRenderer::Property::TRANSFORM_ORIGIN);
397   actualProps.mTransformAnchorPoint    = renderer.GetProperty<Vector2>(VisualRenderer::Property::TRANSFORM_ANCHOR_POINT);
398   actualProps.mTransformOffsetSizeMode = renderer.GetProperty<Vector4>(VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE);
399   actualProps.mExtraSize               = renderer.GetProperty<Vector2>(VisualRenderer::Property::EXTRA_SIZE);
400   actualProps.mMixColor                = renderer.GetProperty<Vector3>(VisualRenderer::Property::VISUAL_MIX_COLOR);
401
402   PrintVisualProperties(actualProps, "Actual event props");
403
404   DALI_TEST_EQUALS(actualProps.mTransformOffset, expectedProps.mTransformOffset, TEST_LOCATION);
405   DALI_TEST_EQUALS(actualProps.mTransformSize, expectedProps.mTransformSize, TEST_LOCATION);
406   DALI_TEST_EQUALS(actualProps.mTransformOrigin, expectedProps.mTransformOrigin, TEST_LOCATION);
407   DALI_TEST_EQUALS(actualProps.mTransformAnchorPoint, expectedProps.mTransformAnchorPoint, TEST_LOCATION);
408   DALI_TEST_EQUALS(actualProps.mTransformOffsetSizeMode, expectedProps.mTransformOffsetSizeMode, TEST_LOCATION);
409   DALI_TEST_EQUALS(actualProps.mExtraSize, expectedProps.mExtraSize, TEST_LOCATION);
410   DALI_TEST_EQUALS(actualProps.mMixColor, expectedProps.mMixColor, TEST_LOCATION);
411 }
412
413 void CheckSceneGraphVisualProperties(VisualRenderer renderer, VisualProperties expectedProps)
414 {
415   tet_infoline("CheckSceneGraphVisualProperties\n");
416
417   VisualProperties actualProps;
418
419   actualProps.mTransformOffset         = renderer.GetCurrentProperty<Vector2>(VisualRenderer::Property::TRANSFORM_OFFSET);
420   actualProps.mTransformSize           = renderer.GetCurrentProperty<Vector2>(VisualRenderer::Property::TRANSFORM_SIZE);
421   actualProps.mTransformOrigin         = renderer.GetCurrentProperty<Vector2>(VisualRenderer::Property::TRANSFORM_ORIGIN);
422   actualProps.mTransformAnchorPoint    = renderer.GetCurrentProperty<Vector2>(VisualRenderer::Property::TRANSFORM_ANCHOR_POINT);
423   actualProps.mTransformOffsetSizeMode = renderer.GetCurrentProperty<Vector4>(VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE);
424   actualProps.mExtraSize               = renderer.GetCurrentProperty<Vector2>(VisualRenderer::Property::EXTRA_SIZE);
425   actualProps.mMixColor                = renderer.GetCurrentProperty<Vector3>(VisualRenderer::Property::VISUAL_MIX_COLOR);
426
427   PrintVisualProperties(actualProps, "Actual update props");
428
429   DALI_TEST_EQUALS(actualProps.mTransformOffset, expectedProps.mTransformOffset, TEST_LOCATION);
430   DALI_TEST_EQUALS(actualProps.mTransformSize, expectedProps.mTransformSize, TEST_LOCATION);
431   DALI_TEST_EQUALS(actualProps.mTransformOrigin, expectedProps.mTransformOrigin, TEST_LOCATION);
432   DALI_TEST_EQUALS(actualProps.mTransformAnchorPoint, expectedProps.mTransformAnchorPoint, TEST_LOCATION);
433   DALI_TEST_EQUALS(actualProps.mTransformOffsetSizeMode, expectedProps.mTransformOffsetSizeMode, TEST_LOCATION);
434   DALI_TEST_EQUALS(actualProps.mExtraSize, expectedProps.mExtraSize, TEST_LOCATION);
435   DALI_TEST_EQUALS(actualProps.mMixColor, expectedProps.mMixColor, TEST_LOCATION);
436 }
437
438 void CheckUniforms(VisualRenderer renderer, VisualProperties props, std::vector<UniformData>& uniforms, TraceCallStack& callStack, TestGlAbstraction& gl)
439 {
440   tet_infoline("CheckUniforms\n");
441
442   TraceCallStack::NamedParams params;
443
444   tet_printf("Callback trace: \n%s\n", callStack.GetTraceString().c_str());
445
446   DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[0].name, params));
447   DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[0].name.c_str(), props.mTransformOffset));
448
449   DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[1].name, params));
450   DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[1].name.c_str(), props.mTransformSize));
451
452   DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[2].name, params));
453   DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[2].name.c_str(), props.mTransformOrigin));
454
455   DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[3].name, params));
456   DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[3].name.c_str(), props.mTransformAnchorPoint));
457
458   DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[4].name, params));
459   DALI_TEST_CHECK(gl.GetUniformValue<Vector4>(uniforms[4].name.c_str(), props.mTransformOffsetSizeMode));
460
461   DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[5].name, params));
462   DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[5].name.c_str(), props.mExtraSize));
463
464   DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[6].name, params));
465   DALI_TEST_CHECK(gl.GetUniformValue<Vector3>(uniforms[6].name.c_str(), props.mMixColor));
466 }
467
468 int UtcDaliVisualRendererAnimatedProperty03(void)
469 {
470   TestApplication    application;
471   TestGlAbstraction& gl        = application.GetGlAbstraction();
472   TraceCallStack&    callStack = gl.GetSetUniformTrace();
473   gl.EnableSetUniformCallTrace(true);
474
475   tet_infoline("Test that a visual renderer property can be animated and that the uniforms are set");
476
477   std::vector<UniformData> customUniforms{{"offset", Property::VECTOR2},
478                                           {"size", Property::VECTOR2},
479                                           {"origin", Property::VECTOR2},
480                                           {"anchorPoint", Property::VECTOR2},
481                                           {"offsetSizeMode", Property::VECTOR4},
482                                           {"extraSize", Property::VECTOR2},
483                                           {"mixColor", Property::VECTOR3}};
484
485   application.GetGraphicsController().AddCustomUniforms(customUniforms);
486
487   Shader         shader   = Shader::New("VertexSource", "FragmentSource");
488   Geometry       geometry = CreateQuadGeometry();
489   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
490
491   Actor actor = Actor::New();
492   actor.AddRenderer(renderer);
493   actor.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 400.0f));
494   application.GetScene().Add(actor);
495
496   VisualProperties props{Vector2(10.f, 10.f), Vector2(200.f, 100.f), Vector2(0.5f, 0.5f), Vector2(0.5f, 0.5f), Vector4::ZERO, Vector2(0.0f, 0.0f), Vector3(Color::SEA_GREEN)};
497   VisualProperties targetProps{Vector2(40.f, 40.f), Vector2(100.f, 200.f), Vector2(0.5f, 0.5f), Vector2(0.5f, 0.5f), Vector4::ZERO, Vector2(25.0f, 25.0f), Vector3(Color::MEDIUM_PURPLE)};
498
499   SetVisualProperties(renderer, props);
500   CheckEventVisualProperties(renderer, props);
501   application.SendNotification();
502   application.Render(0);
503   CheckSceneGraphVisualProperties(renderer, props);
504   CheckUniforms(renderer, props, customUniforms, callStack, gl);
505
506   // Set up a 1 second anim.
507   Animation animation = Animation::New(1.0f);
508
509   animation.AnimateTo(Property(renderer, VisualRenderer::Property::TRANSFORM_OFFSET), targetProps.mTransformOffset);
510   animation.AnimateTo(Property(renderer, VisualRenderer::Property::TRANSFORM_SIZE), targetProps.mTransformSize);
511   animation.AnimateTo(Property(renderer, VisualRenderer::Property::EXTRA_SIZE), targetProps.mExtraSize);
512   animation.AnimateTo(Property(renderer, VisualRenderer::Property::VISUAL_MIX_COLOR), targetProps.mMixColor);
513   animation.Play();
514
515   CheckEventVisualProperties(renderer, targetProps);
516
517   for(int i = 0; i <= 10; ++i)
518   {
519     tet_printf("\n###########  Animation progress: %d%%\n\n", i * 10);
520     VisualProperties propsProgress = VisualProperties::GetPropsAt(0.1f * i, props, targetProps);
521     PrintVisualProperties(propsProgress, "Expected values");
522
523     callStack.Reset();
524     application.SendNotification();
525     application.Render((i == 0 ? 0 : 100));
526
527     CheckEventVisualProperties(renderer, targetProps);
528
529     CheckSceneGraphVisualProperties(renderer, propsProgress);
530     CheckUniforms(renderer, propsProgress, customUniforms, callStack, gl);
531   }
532
533   // Ensure animation finishes
534   application.SendNotification();
535   application.Render(100);
536   CheckSceneGraphVisualProperties(renderer, targetProps);
537   CheckUniforms(renderer, targetProps, customUniforms, callStack, gl);
538
539   END_TEST;
540 }
541
542 int UtcDaliVisualRendererAnimatedProperty04(void)
543 {
544   TestApplication application;
545
546   tet_infoline("Test that a visual renderer property can't be animated");
547
548   Shader         shader   = Shader::New("VertexSource", "FragmentSource");
549   Geometry       geometry = CreateQuadGeometry();
550   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
551
552   Actor actor = Actor::New();
553   actor.AddRenderer(renderer);
554   actor.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 400.0f));
555   application.GetScene().Add(actor);
556
557   Property::Index index = VisualRenderer::Property::TRANSFORM_ANCHOR_POINT;
558   renderer.SetProperty(index, Vector2(AnchorPoint::TOP_RIGHT));
559
560   application.SendNotification();
561   application.Render(0);
562   DALI_TEST_EQUALS(renderer.GetProperty<Vector2>(index), Vector2(AnchorPoint::TOP_RIGHT), 0.001f, TEST_LOCATION);
563
564   Animation animation = Animation::New(1.0f);
565   KeyFrames keyFrames = KeyFrames::New();
566   keyFrames.Add(0.0f, Vector2::ZERO);
567   keyFrames.Add(1.0f, Vector2(10.0f, 10.0f));
568   try
569   {
570     animation.AnimateBetween(Property(renderer, index), keyFrames);
571     tet_result(TET_FAIL);
572   }
573   catch(DaliException& e)
574   {
575     DALI_TEST_ASSERT(e, "baseProperty && \"Property is not animatable\"", TEST_LOCATION);
576   }
577
578   END_TEST;
579 }
580
581 int UtcDaliVisualRendererAnimatedProperty05(void)
582 {
583   TestApplication application;
584
585   tet_infoline("Test that a visual renderer property can't be animated");
586
587   Shader         shader   = Shader::New("VertexSource", "FragmentSource");
588   Geometry       geometry = CreateQuadGeometry();
589   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
590
591   Actor actor = Actor::New();
592   actor.AddRenderer(renderer);
593   actor.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 400.0f));
594   application.GetScene().Add(actor);
595
596   Property::Index index = VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA;
597   renderer.SetProperty(index, 1.0f);
598
599   application.SendNotification();
600   application.Render(0);
601   DALI_TEST_EQUALS(renderer.GetProperty<float>(index), 1.0f, 0.001f, TEST_LOCATION);
602
603   Animation animation = Animation::New(1.0f);
604   KeyFrames keyFrames = KeyFrames::New();
605   keyFrames.Add(0.0f, 0.5f);
606   keyFrames.Add(1.0f, 1.0f);
607   try
608   {
609     animation.AnimateBetween(Property(renderer, index), keyFrames);
610     tet_result(TET_FAIL);
611   }
612   catch(DaliException& e)
613   {
614     DALI_TEST_ASSERT(e, "baseProperty && \"Property is not animatable\"", TEST_LOCATION);
615   }
616
617   DALI_TEST_EQUALS(renderer.GetProperty<float>(index), 1.0f, 0.0001f, TEST_LOCATION);
618   DALI_TEST_EQUALS(renderer.GetCurrentProperty<float>(index), 1.0f, 0.0001f, TEST_LOCATION);
619
620   END_TEST;
621 }
622
623 int UtcDaliVisualRendererAnimatedProperty06(void)
624 {
625   TestApplication application;
626
627   tet_infoline("Test that a parent renderer property can still be animated");
628
629   Shader         shader   = Shader::New("VertexSource", "FragmentSource");
630   Geometry       geometry = CreateQuadGeometry();
631   VisualRenderer renderer = VisualRenderer::New(geometry, shader);
632
633   Actor actor = Actor::New();
634   actor.AddRenderer(renderer);
635   actor.SetProperty(Actor::Property::SIZE, Vector2(400.0f, 400.0f));
636   application.GetScene().Add(actor);
637
638   Property::Index index = DevelRenderer::Property::OPACITY;
639   renderer.SetProperty(index, 1.0f);
640
641   application.SendNotification();
642   application.Render(0);
643   DALI_TEST_EQUALS(renderer.GetProperty<float>(index), 1.0f, 0.001f, TEST_LOCATION);
644   DALI_TEST_EQUALS(renderer.GetCurrentProperty<float>(DevelRenderer::Property::OPACITY), 1.0f, 0.0001f, TEST_LOCATION);
645
646   Animation animation = Animation::New(1.0f);
647   KeyFrames keyFrames = KeyFrames::New();
648   keyFrames.Add(0.0f, float(0.5f));
649   keyFrames.Add(1.0f, float(0.0f));
650   animation.AnimateBetween(Property(renderer, index), keyFrames);
651   animation.Play();
652
653   application.SendNotification();
654
655   // Test that the event side properties are set to target value of 0
656   DALI_TEST_EQUALS(renderer.GetProperty<float>(DevelRenderer::Property::OPACITY), 0.0f, 0.0001f, TEST_LOCATION);
657
658   application.Render(500);
659
660   DALI_TEST_EQUALS(renderer.GetCurrentProperty<float>(index), 0.25f, 0.0001f, TEST_LOCATION);
661   DALI_TEST_EQUALS(renderer.GetCurrentProperty<float>(DevelRenderer::Property::OPACITY), 0.25f, 0.0001f, TEST_LOCATION);
662
663   // Test that the event side properties are set to target value 0f 0
664   DALI_TEST_EQUALS(renderer.GetProperty<float>(DevelRenderer::Property::OPACITY), 0.0f, 0.0001f, TEST_LOCATION);
665
666   // Complete the animation
667   application.Render(500);
668
669   DALI_TEST_EQUALS(renderer.GetCurrentProperty<float>(index), 0.0f, 0.0001f, TEST_LOCATION);
670   DALI_TEST_EQUALS(renderer.GetCurrentProperty<float>(DevelRenderer::Property::OPACITY), 0.0f, 0.0001f, TEST_LOCATION);
671   DALI_TEST_EQUALS(renderer.GetProperty<float>(DevelRenderer::Property::OPACITY), 0.0f, 0.0001f, TEST_LOCATION);
672   END_TEST;
673 }