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/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>
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"
36 void visual_renderer_test_startup(void)
38 test_return_value = TET_UNDEF;
41 void visual_renderer_test_cleanup(void)
43 test_return_value = TET_PASS;
46 int UtcDaliVisualRendererNew01(void)
48 TestApplication application;
50 Geometry geometry = CreateQuadGeometry();
51 Shader shader = CreateShader();
52 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
54 DALI_TEST_EQUALS((bool)renderer, true, TEST_LOCATION);
58 int UtcDaliVisualRendererNew02(void)
60 TestApplication application;
61 VisualRenderer renderer;
62 DALI_TEST_EQUALS((bool)renderer, false, TEST_LOCATION);
66 int UtcDaliVisualRendererCopyConstructor(void)
68 TestApplication application;
70 Geometry geometry = CreateQuadGeometry();
71 Shader shader = CreateShader();
72 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
74 VisualRenderer rendererCopy(renderer);
75 DALI_TEST_EQUALS((bool)rendererCopy, true, TEST_LOCATION);
80 int UtcDaliVisualRendererAssignmentOperator(void)
82 TestApplication application;
84 Geometry geometry = CreateQuadGeometry();
85 Shader shader = CreateShader();
86 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
88 VisualRenderer renderer2;
89 DALI_TEST_EQUALS((bool)renderer2, false, TEST_LOCATION);
92 DALI_TEST_EQUALS((bool)renderer2, true, TEST_LOCATION);
96 int UtcDaliVisualRendererMoveConstructor(void)
98 TestApplication application;
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);
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);
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);
122 int UtcDaliVisualRendererMoveAssignment(void)
124 TestApplication application;
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);
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);
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);
148 int UtcDaliVisualRendererDownCast01(void)
150 TestApplication application;
152 Geometry geometry = CreateQuadGeometry();
153 Shader shader = CreateShader();
154 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
156 BaseHandle handle(renderer);
157 VisualRenderer renderer2 = VisualRenderer::DownCast(handle);
158 DALI_TEST_EQUALS((bool)renderer2, true, TEST_LOCATION);
162 int UtcDaliVisualRendererDownCast02(void)
164 TestApplication application;
166 Handle handle = Handle::New(); // Create a custom object
167 VisualRenderer renderer = VisualRenderer::DownCast(handle);
168 DALI_TEST_EQUALS((bool)renderer, false, TEST_LOCATION);
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)
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);
184 int UtcDaliVisualRendererDefaultProperties(void)
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);
192 DALI_TEST_EQUALS(baseRenderer.GetPropertyCount(), 27, TEST_LOCATION);
193 DALI_TEST_EQUALS(renderer.GetPropertyCount(), 27 + 8, TEST_LOCATION);
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);
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);
208 int UtcDaliVisualRendererAnimatedProperty01(void)
210 TestApplication application;
212 tet_infoline("Test that a visual renderer property can be animated");
214 Shader shader = Shader::New("VertexSource", "FragmentSource");
215 Geometry geometry = CreateQuadGeometry();
216 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
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);
223 Property::Index colorIndex = VisualRenderer::Property::VISUAL_MIX_COLOR;
224 renderer.SetProperty(colorIndex, Vector3(1.0f, 1.0f, 1.0f));
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);
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);
237 application.SendNotification();
238 application.Render(500);
240 DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector3>(colorIndex), Vector3(0.5f, 0.f, 0.5f), TEST_LOCATION);
242 application.Render(400);
243 DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector3>(colorIndex), Vector3(0.1f, 0.f, 0.1f), TEST_LOCATION);
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);
249 // Can we test to see if the actor has stopped being drawn?
253 int UtcDaliVisualRendererAnimatedProperty02(void)
255 TestApplication application;
257 tet_infoline("Test that a visual renderer property can be animated");
259 Shader shader = Shader::New("VertexSource", "FragmentSource");
260 Geometry geometry = CreateQuadGeometry();
261 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
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);
268 Property::Index index = VisualRenderer::Property::TRANSFORM_OFFSET;
269 renderer.SetProperty(index, Vector2(1.0f, 0.0f));
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);
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);
284 application.SendNotification();
285 application.Render(500);
287 DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector2>(index), Vector2(0.5f, 0.5f), TEST_LOCATION);
289 application.Render(400);
290 DALI_TEST_EQUALS(renderer.GetCurrentProperty<Vector2>(index), Vector2(0.1f, 0.9f), TEST_LOCATION);
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);
299 struct VisualProperties
301 VisualProperties() = default;
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),
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};
322 static VisualProperties GetPropsAt(float alpha, const VisualProperties& start, const VisualProperties& end)
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;
336 void PrintVisualProperties(const VisualProperties& props, const std::string& prefix)
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",
347 props.mTransformOffset.x,
348 props.mTransformOffset.y,
351 props.mTransformSize.x,
352 props.mTransformSize.y,
355 props.mTransformOrigin.x,
356 props.mTransformOrigin.y,
359 props.mTransformAnchorPoint.x,
360 props.mTransformAnchorPoint.y,
363 props.mTransformOffsetSizeMode.x,
364 props.mTransformOffsetSizeMode.y,
365 props.mTransformOffsetSizeMode.z,
366 props.mTransformOffsetSizeMode.w,
378 void SetVisualProperties(VisualRenderer renderer, VisualProperties props)
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);
389 void CheckEventVisualProperties(VisualRenderer renderer, VisualProperties expectedProps)
391 tet_infoline("CheckEventVisualProperties\n");
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);
402 PrintVisualProperties(actualProps, "Actual event props");
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);
413 void CheckSceneGraphVisualProperties(VisualRenderer renderer, VisualProperties expectedProps)
415 tet_infoline("CheckSceneGraphVisualProperties\n");
417 VisualProperties actualProps;
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);
427 PrintVisualProperties(actualProps, "Actual update props");
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);
438 void CheckUniforms(VisualRenderer renderer, VisualProperties props, std::vector<UniformData>& uniforms, TraceCallStack& callStack, TestGlAbstraction& gl)
440 tet_infoline("CheckUniforms\n");
442 TraceCallStack::NamedParams params;
444 tet_printf("Callback trace: \n%s\n", callStack.GetTraceString().c_str());
446 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[0].name, params));
447 DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[0].name.c_str(), props.mTransformOffset));
449 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[1].name, params));
450 DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[1].name.c_str(), props.mTransformSize));
452 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[2].name, params));
453 DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[2].name.c_str(), props.mTransformOrigin));
455 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[3].name, params));
456 DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[3].name.c_str(), props.mTransformAnchorPoint));
458 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[4].name, params));
459 DALI_TEST_CHECK(gl.GetUniformValue<Vector4>(uniforms[4].name.c_str(), props.mTransformOffsetSizeMode));
461 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[5].name, params));
462 DALI_TEST_CHECK(gl.GetUniformValue<Vector2>(uniforms[5].name.c_str(), props.mExtraSize));
464 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters(uniforms[6].name, params));
465 DALI_TEST_CHECK(gl.GetUniformValue<Vector3>(uniforms[6].name.c_str(), props.mMixColor));
468 int UtcDaliVisualRendererAnimatedProperty03(void)
470 TestApplication application;
471 TestGlAbstraction& gl = application.GetGlAbstraction();
472 TraceCallStack& callStack = gl.GetSetUniformTrace();
473 gl.EnableSetUniformCallTrace(true);
475 tet_infoline("Test that a visual renderer property can be animated and that the uniforms are set");
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}};
485 application.GetGraphicsController().AddCustomUniforms(customUniforms);
487 Shader shader = Shader::New("VertexSource", "FragmentSource");
488 Geometry geometry = CreateQuadGeometry();
489 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
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);
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)};
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);
506 // Set up a 1 second anim.
507 Animation animation = Animation::New(1.0f);
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);
515 CheckEventVisualProperties(renderer, targetProps);
517 for(int i = 0; i <= 10; ++i)
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");
524 application.SendNotification();
525 application.Render((i == 0 ? 0 : 100));
527 CheckEventVisualProperties(renderer, targetProps);
529 CheckSceneGraphVisualProperties(renderer, propsProgress);
530 CheckUniforms(renderer, propsProgress, customUniforms, callStack, gl);
533 // Ensure animation finishes
534 application.SendNotification();
535 application.Render(100);
536 CheckSceneGraphVisualProperties(renderer, targetProps);
537 CheckUniforms(renderer, targetProps, customUniforms, callStack, gl);
542 int UtcDaliVisualRendererAnimatedProperty04(void)
544 TestApplication application;
546 tet_infoline("Test that a visual renderer property can't be animated");
548 Shader shader = Shader::New("VertexSource", "FragmentSource");
549 Geometry geometry = CreateQuadGeometry();
550 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
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);
557 Property::Index index = VisualRenderer::Property::TRANSFORM_ANCHOR_POINT;
558 renderer.SetProperty(index, Vector2(AnchorPoint::TOP_RIGHT));
560 application.SendNotification();
561 application.Render(0);
562 DALI_TEST_EQUALS(renderer.GetProperty<Vector2>(index), Vector2(AnchorPoint::TOP_RIGHT), 0.001f, TEST_LOCATION);
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));
570 animation.AnimateBetween(Property(renderer, index), keyFrames);
571 tet_result(TET_FAIL);
573 catch(DaliException& e)
575 DALI_TEST_ASSERT(e, "baseProperty && \"Property is not animatable\"", TEST_LOCATION);
581 int UtcDaliVisualRendererAnimatedProperty05(void)
583 TestApplication application;
585 tet_infoline("Test that a visual renderer property can't be animated");
587 Shader shader = Shader::New("VertexSource", "FragmentSource");
588 Geometry geometry = CreateQuadGeometry();
589 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
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);
596 Property::Index index = VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA;
597 renderer.SetProperty(index, 1.0f);
599 application.SendNotification();
600 application.Render(0);
601 DALI_TEST_EQUALS(renderer.GetProperty<float>(index), 1.0f, 0.001f, TEST_LOCATION);
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);
609 animation.AnimateBetween(Property(renderer, index), keyFrames);
610 tet_result(TET_FAIL);
612 catch(DaliException& e)
614 DALI_TEST_ASSERT(e, "baseProperty && \"Property is not animatable\"", TEST_LOCATION);
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);
623 int UtcDaliVisualRendererAnimatedProperty06(void)
625 TestApplication application;
627 tet_infoline("Test that a parent renderer property can still be animated");
629 Shader shader = Shader::New("VertexSource", "FragmentSource");
630 Geometry geometry = CreateQuadGeometry();
631 VisualRenderer renderer = VisualRenderer::New(geometry, shader);
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);
638 Property::Index index = DevelRenderer::Property::OPACITY;
639 renderer.SetProperty(index, 1.0f);
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);
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);
653 application.SendNotification();
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);
658 application.Render(500);
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);
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);
666 // Complete the animation
667 application.Render(500);
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);