[dali_2.2.35] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-scene3d / utc-Dali-Light.cpp
1 /*
2  * Copyright (c) 2023 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-toolkit-test-suite-utils.h>
19 #include <dali-toolkit/dali-toolkit.h>
20 #include <dali/devel-api/actors/actor-devel.h>
21 #include <stdlib.h>
22 #include <iostream>
23
24 #include <dali-scene3d/public-api/controls/model/model.h>
25 #include <dali-scene3d/public-api/controls/scene-view/scene-view.h>
26 #include <dali-scene3d/public-api/light/light.h>
27 #include <dali/public-api/object/property.h>
28 #include <toolkit-event-thread-callback.h>
29
30 using namespace Dali;
31 using namespace Dali::Toolkit;
32
33 void light_startup(void)
34 {
35   test_return_value = TET_UNDEF;
36 }
37
38 void light_cleanup(void)
39 {
40   test_return_value = TET_PASS;
41 }
42
43 namespace
44 {
45 const char* TEST_GLTF_FILE_NAME = TEST_RESOURCE_DIR "/BoxAnimated.gltf";
46 } // namespace
47
48 // Negative test case for a method
49 int UtcDaliLightUninitialized(void)
50 {
51   ToolkitTestApplication application;
52   tet_infoline("UtcDaliLightUninitialized");
53
54   Scene3D::Light light;
55
56   try
57   {
58     // New() must be called to create a Model or it wont be valid.
59     Actor a = Actor::New();
60     light.Add(a);
61     DALI_TEST_CHECK(false);
62   }
63   catch(Dali::DaliException& e)
64   {
65     // Tests that a negative test of an assertion succeeds
66     DALI_TEST_PRINT_ASSERT(e);
67     DALI_TEST_CHECK(!light);
68   }
69   END_TEST;
70 }
71
72 // Positive test case for a method
73 int UtcDaliLightNew(void)
74 {
75   ToolkitTestApplication application;
76   tet_infoline("UtcDaliLightNew");
77
78   Scene3D::Light light = Scene3D::Light::New();
79   DALI_TEST_CHECK(light);
80   END_TEST;
81 }
82
83 // Positive test case for a method
84 int UtcDaliLightDownCast(void)
85 {
86   ToolkitTestApplication application;
87   tet_infoline("UtcDaliLightDownCast");
88
89   Scene3D::Light light = Scene3D::Light::New();
90   BaseHandle     handle(light);
91
92   Scene3D::Light light2 = Scene3D::Light::DownCast(handle);
93   DALI_TEST_CHECK(light);
94   DALI_TEST_CHECK(light2);
95   DALI_TEST_CHECK(light == light2);
96   END_TEST;
97 }
98
99 // Positive test case for a method
100 int UtcDaliLightCopyAndAssignment(void)
101 {
102   ToolkitTestApplication application;
103
104   Scene3D::Light light = Scene3D::Light::New();
105   DALI_TEST_CHECK(light);
106
107   Scene3D::Light copy(light);
108   DALI_TEST_CHECK(light == copy);
109
110   Scene3D::Light assign;
111   DALI_TEST_CHECK(!assign);
112
113   assign = copy;
114   DALI_TEST_CHECK(assign == light);
115
116   END_TEST;
117 }
118
119 int UtcDaliLightMoveConstructor(void)
120 {
121   ToolkitTestApplication application;
122
123   Scene3D::Light light = Scene3D::Light::New();
124   DALI_TEST_EQUALS(1, light.GetBaseObject().ReferenceCount(), TEST_LOCATION);
125   light.SetProperty(Actor::Property::SENSITIVE, false);
126   DALI_TEST_CHECK(false == light.GetProperty<bool>(Actor::Property::SENSITIVE));
127
128   Scene3D::Light moved = std::move(light);
129   DALI_TEST_CHECK(moved);
130   DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
131   DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
132   DALI_TEST_CHECK(!light);
133
134   END_TEST;
135 }
136
137 int UtcDaliLightMoveAssignment(void)
138 {
139   ToolkitTestApplication application;
140
141   Scene3D::Light light = Scene3D::Light::New();
142   DALI_TEST_EQUALS(1, light.GetBaseObject().ReferenceCount(), TEST_LOCATION);
143   light.SetProperty(Actor::Property::SENSITIVE, false);
144   DALI_TEST_CHECK(false == light.GetProperty<bool>(Actor::Property::SENSITIVE));
145
146   Scene3D::Light moved;
147   moved = std::move(light);
148   DALI_TEST_CHECK(moved);
149   DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
150   DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
151   DALI_TEST_CHECK(!light);
152
153   END_TEST;
154 }
155
156 // For TC coverage
157 int UtcDaliLightSize(void)
158 {
159   ToolkitTestApplication application;
160
161   Scene3D::Light light = Scene3D::Light::New();
162   application.GetScene().Add(light);
163
164   application.SendNotification();
165   application.Render();
166
167   light.SetProperty(Dali::Actor::Property::SIZE, Vector3::ONE);
168   DALI_TEST_EQUALS(Vector3::ONE, light.GetProperty<Vector3>(Dali::Actor::Property::SIZE), 0.01f, TEST_LOCATION);
169   DALI_TEST_EQUALS(Vector3::ZERO, light.GetNaturalSize(), 0.01f, TEST_LOCATION);
170
171   application.SendNotification();
172   application.Render();
173
174   light.SetProperty(Dali::Actor::Property::WIDTH_RESIZE_POLICY, ResizePolicy::FIXED);
175   DALI_TEST_EQUALS(ResizePolicy::FIXED, light.GetProperty<ResizePolicy::Type>(Dali::Actor::Property::WIDTH_RESIZE_POLICY), TEST_LOCATION);
176
177   application.SendNotification();
178   application.Render();
179
180   float widthForHeight = light.GetWidthForHeight(light.GetProperty<float>(Dali::Actor::Property::SIZE_HEIGHT));
181   float heightForWidth = light.GetHeightForWidth(light.GetProperty<float>(Dali::Actor::Property::SIZE_WIDTH));
182   DALI_TEST_EQUALS(0.0f, widthForHeight, 0.01f, TEST_LOCATION);
183   DALI_TEST_EQUALS(0.0f, heightForWidth, 0.01f, TEST_LOCATION);
184
185   END_TEST;
186 }
187
188 int UtcDaliLightOnScene01(void)
189 {
190   ToolkitTestApplication application;
191
192   Scene3D::Light light = Scene3D::Light::New();
193   application.GetScene().Add(light);
194
195   application.SendNotification();
196   application.Render();
197
198   // Light is added on layer when on scene
199   DALI_TEST_EQUALS(true, light.GetProperty<bool>(Dali::Actor::Property::CONNECTED_TO_SCENE), TEST_LOCATION);
200
201   application.GetScene().Remove(light);
202
203   application.SendNotification();
204   application.Render();
205
206   // Light is removed from layer when on scene
207   DALI_TEST_EQUALS(false, light.GetProperty<bool>(Dali::Actor::Property::CONNECTED_TO_SCENE), TEST_LOCATION);
208
209   END_TEST;
210 }
211
212 // Add a light on SceneView directly
213 int UtcDaliLightAdd01(void)
214 {
215   ToolkitTestApplication application;
216   Scene3D::SceneView     sceneView = Scene3D::SceneView::New();
217   sceneView.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
218   sceneView.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
219   sceneView.SetProperty(Dali::Actor::Property::WIDTH_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
220   sceneView.SetProperty(Dali::Actor::Property::HEIGHT_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
221   application.GetScene().Add(sceneView);
222
223   Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
224   sceneView.Add(model);
225
226   application.SendNotification();
227   application.Render();
228   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
229   application.SendNotification();
230   application.Render();
231
232   Scene3D::Light light = Scene3D::Light::New();
233   light.SetProperty(Dali::Actor::Property::COLOR, Color::BLUE);
234   Dali::DevelActor::LookAt(light, Vector3(1.0f, 0.0f, 0.0f));
235   sceneView.Add(light);
236
237   application.SendNotification();
238   application.Render();
239
240   Renderer renderer = model.FindChildByName("node2").GetRendererAt(0u);
241   DALI_TEST_CHECK(renderer);
242   Shader shader = renderer.GetShader();
243   DALI_TEST_CHECK(shader);
244
245   DALI_TEST_EQUALS(1u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
246   auto countPropertyIndex = shader.GetPropertyIndex("uLightCount");
247   DALI_TEST_CHECK(countPropertyIndex != Dali::Property::INVALID_INDEX);
248   DALI_TEST_EQUALS(1, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
249   auto colorPropertyIndex = shader.GetPropertyIndex("uLightColor[0]");
250   DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, 1.0f), shader.GetCurrentProperty<Vector3>(colorPropertyIndex), 0.01f, TEST_LOCATION);
251   auto directionPropertyIndex = shader.GetPropertyIndex("uLightDirection[0]");
252   DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f), shader.GetCurrentProperty<Vector3>(directionPropertyIndex), 0.01f, TEST_LOCATION);
253
254   light.Enable(false);
255
256   DALI_TEST_EQUALS(0u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
257   DALI_TEST_EQUALS(0, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
258
259   END_TEST;
260 }
261
262 // Add a light on an Actor that is child of SceneView.
263 int UtcDaliLightAdd02(void)
264 {
265   ToolkitTestApplication application;
266
267   Scene3D::SceneView sceneView = Scene3D::SceneView::New();
268   sceneView.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
269   sceneView.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
270   sceneView.SetProperty(Dali::Actor::Property::WIDTH_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
271   sceneView.SetProperty(Dali::Actor::Property::HEIGHT_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
272   application.GetScene().Add(sceneView);
273
274   Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
275   sceneView.Add(model);
276
277   application.SendNotification();
278   application.Render();
279   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
280   application.SendNotification();
281   application.Render();
282
283   Actor actor = Actor::New();
284   sceneView.Add(actor);
285
286   Scene3D::Light light = Scene3D::Light::New();
287   light.SetProperty(Dali::Actor::Property::COLOR, Color::BLUE);
288   Dali::DevelActor::LookAt(light, Vector3(1.0f, 0.0f, 0.0f));
289   actor.Add(light);
290
291   application.SendNotification();
292   application.Render();
293
294   Renderer renderer = model.FindChildByName("node2").GetRendererAt(0u);
295   DALI_TEST_CHECK(renderer);
296   Shader shader = renderer.GetShader();
297   DALI_TEST_CHECK(shader);
298
299   DALI_TEST_EQUALS(1u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
300   auto countPropertyIndex = shader.GetPropertyIndex("uLightCount");
301   DALI_TEST_CHECK(countPropertyIndex != DALI_KEY_INVALID);
302   DALI_TEST_EQUALS(1, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
303   auto colorPropertyIndex = shader.GetPropertyIndex("uLightColor[0]");
304   DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, 1.0f), shader.GetCurrentProperty<Vector3>(colorPropertyIndex), 0.01f, TEST_LOCATION);
305   auto directionPropertyIndex = shader.GetPropertyIndex("uLightDirection[0]");
306   DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f), shader.GetCurrentProperty<Vector3>(directionPropertyIndex), 0.01f, TEST_LOCATION);
307
308   light.Enable(false);
309
310   DALI_TEST_EQUALS(0u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
311   DALI_TEST_EQUALS(0, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
312
313   END_TEST;
314 }
315
316 // Enable a light after it is added on SceneView.
317 int UtcDaliLightAdd03(void)
318 {
319   ToolkitTestApplication application;
320
321   Scene3D::SceneView sceneView = Scene3D::SceneView::New();
322   sceneView.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
323   sceneView.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
324   sceneView.SetProperty(Dali::Actor::Property::WIDTH_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
325   sceneView.SetProperty(Dali::Actor::Property::HEIGHT_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
326   application.GetScene().Add(sceneView);
327
328   Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
329   sceneView.Add(model);
330
331   application.SendNotification();
332   application.Render();
333   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
334   application.SendNotification();
335   application.Render();
336
337   Scene3D::Light light = Scene3D::Light::New();
338   light.SetProperty(Dali::Actor::Property::COLOR, Color::BLUE);
339   Dali::DevelActor::LookAt(light, Vector3(1.0f, 0.0f, 0.0f));
340   light.Enable(false);
341   sceneView.Add(light);
342
343   application.SendNotification();
344   application.Render();
345
346   Renderer renderer = model.FindChildByName("node2").GetRendererAt(0u);
347   DALI_TEST_CHECK(renderer);
348   Shader shader = renderer.GetShader();
349   DALI_TEST_CHECK(shader);
350
351   DALI_TEST_EQUALS(0u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
352   auto countPropertyIndex = shader.GetPropertyIndex("uLightCount");
353   DALI_TEST_CHECK(countPropertyIndex != DALI_KEY_INVALID);
354   DALI_TEST_EQUALS(0, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
355
356   light.Enable(true);
357
358   application.SendNotification();
359   application.Render();
360
361   DALI_TEST_EQUALS(1u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
362   DALI_TEST_EQUALS(1, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
363   auto colorPropertyIndex = shader.GetPropertyIndex("uLightColor[0]");
364   DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, 1.0f), shader.GetCurrentProperty<Vector3>(colorPropertyIndex), 0.01f, TEST_LOCATION);
365   auto directionPropertyIndex = shader.GetPropertyIndex("uLightDirection[0]");
366   DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f), shader.GetCurrentProperty<Vector3>(directionPropertyIndex), 0.01f, TEST_LOCATION);
367
368   light.Enable(false);
369
370   application.SendNotification();
371   application.Render();
372
373   DALI_TEST_EQUALS(0u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
374   DALI_TEST_EQUALS(0, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
375
376   END_TEST;
377 }
378
379 int UtcDaliLightAdd04(void)
380 {
381   ToolkitTestApplication application;
382
383   Scene3D::SceneView sceneView = Scene3D::SceneView::New();
384   sceneView.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
385   sceneView.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
386   sceneView.SetProperty(Dali::Actor::Property::WIDTH_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
387   sceneView.SetProperty(Dali::Actor::Property::HEIGHT_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
388   application.GetScene().Add(sceneView);
389
390   Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
391   sceneView.Add(model);
392
393   application.SendNotification();
394   application.Render();
395   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
396   application.SendNotification();
397   application.Render();
398
399   Scene3D::Light light1 = Scene3D::Light::New();
400   light1.SetProperty(Dali::Actor::Property::COLOR, Color::BLUE);
401   Dali::DevelActor::LookAt(light1, Vector3(1.0f, 0.0f, 0.0f));
402   sceneView.Add(light1);
403
404   Scene3D::Light light2 = Scene3D::Light::New();
405   light2.SetProperty(Dali::Actor::Property::COLOR, Color::RED);
406   Dali::DevelActor::LookAt(light2, Vector3(0.0f, 0.0f, -1.0f));
407   sceneView.Add(light2);
408
409   application.SendNotification();
410   application.Render();
411
412   Renderer renderer = model.FindChildByName("node2").GetRendererAt(0u);
413   DALI_TEST_CHECK(renderer);
414   Shader shader = renderer.GetShader();
415   DALI_TEST_CHECK(shader);
416
417   DALI_TEST_EQUALS(2u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
418   auto countPropertyIndex = shader.GetPropertyIndex("uLightCount");
419   DALI_TEST_CHECK(countPropertyIndex != DALI_KEY_INVALID);
420   DALI_TEST_EQUALS(2, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
421   auto colorPropertyIndex1 = shader.GetPropertyIndex("uLightColor[0]");
422   DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, 1.0f), shader.GetCurrentProperty<Vector3>(colorPropertyIndex1), 0.01f, TEST_LOCATION);
423   auto directionPropertyIndex1 = shader.GetPropertyIndex("uLightDirection[0]");
424   DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f), shader.GetCurrentProperty<Vector3>(directionPropertyIndex1), 0.01f, TEST_LOCATION);
425   auto colorPropertyIndex2 = shader.GetPropertyIndex("uLightColor[1]");
426   DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f), shader.GetCurrentProperty<Vector3>(colorPropertyIndex2), 0.01f, TEST_LOCATION);
427   auto directionPropertyIndex2 = shader.GetPropertyIndex("uLightDirection[1]");
428   DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, -1.0f), shader.GetCurrentProperty<Vector3>(directionPropertyIndex2), 0.01f, TEST_LOCATION);
429
430   light1.Enable(false);
431
432   application.SendNotification();
433   application.Render();
434
435   DALI_TEST_EQUALS(1u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
436   DALI_TEST_EQUALS(1, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
437
438   // After light1 is disable, shader uniforms of lights are reordered.
439   DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f), shader.GetCurrentProperty<Vector3>(colorPropertyIndex1), 0.01f, TEST_LOCATION);
440   DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, -1.0f), shader.GetCurrentProperty<Vector3>(directionPropertyIndex1), 0.01f, TEST_LOCATION);
441
442   END_TEST;
443 }
444
445 // Check unactivated light in SceneView becomes activated when a light become disabled.
446 int UtcDaliLightAdd05(void)
447 {
448   ToolkitTestApplication application;
449
450   Scene3D::SceneView sceneView = Scene3D::SceneView::New();
451   sceneView.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
452   sceneView.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
453   sceneView.SetProperty(Dali::Actor::Property::WIDTH_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
454   sceneView.SetProperty(Dali::Actor::Property::HEIGHT_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
455   application.GetScene().Add(sceneView);
456
457   Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
458   sceneView.Add(model);
459
460   application.SendNotification();
461   application.Render();
462   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
463   application.SendNotification();
464   application.Render();
465
466   uint32_t                    maxLightCount = Scene3D::Light::GetMaximumEnabledLightCount();
467   std::vector<Scene3D::Light> lightList;
468   for(uint32_t i = 0; i < maxLightCount; ++i)
469   {
470     Scene3D::Light light = Scene3D::Light::New();
471     light.SetProperty(Dali::Actor::Property::COLOR, Color::BLUE);
472     Dali::DevelActor::LookAt(light, Vector3(1.0f, 0.0f, 0.0f));
473     sceneView.Add(light);
474     lightList.push_back(light);
475   }
476
477   Scene3D::Light light2 = Scene3D::Light::New();
478   light2.SetProperty(Dali::Actor::Property::COLOR, Color::RED);
479   Dali::DevelActor::LookAt(light2, Vector3(0.0f, 0.0f, -1.0f));
480   sceneView.Add(light2);
481   lightList.push_back(light2);
482
483   application.SendNotification();
484   application.Render();
485
486   Renderer renderer = model.FindChildByName("node2").GetRendererAt(0u);
487   DALI_TEST_CHECK(renderer);
488   Shader shader = renderer.GetShader();
489   DALI_TEST_CHECK(shader);
490
491   DALI_TEST_EQUALS(maxLightCount, sceneView.GetActivatedLightCount(), TEST_LOCATION);
492   auto countPropertyIndex = shader.GetPropertyIndex("uLightCount");
493   DALI_TEST_CHECK(countPropertyIndex != DALI_KEY_INVALID);
494   DALI_TEST_EQUALS(static_cast<int32_t>(maxLightCount), shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
495   for(uint32_t i = 0; i < maxLightCount; ++i)
496   {
497     std::string colorStringKey     = std::string("uLightColor[") + std::to_string(i) + "]";
498     auto        colorPropertyIndex = shader.GetPropertyIndex(colorStringKey);
499     DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, 1.0f), shader.GetCurrentProperty<Vector3>(colorPropertyIndex), 0.01f, TEST_LOCATION);
500
501     std::string directionStringKey     = std::string("uLightDirection[") + std::to_string(i) + "]";
502     auto        directionPropertyIndex = shader.GetPropertyIndex(directionStringKey);
503     DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f), shader.GetCurrentProperty<Vector3>(directionPropertyIndex), 0.01f, TEST_LOCATION);
504   }
505
506   lightList[2].Enable(false);
507
508   application.SendNotification();
509   application.Render();
510
511   DALI_TEST_EQUALS(maxLightCount, sceneView.GetActivatedLightCount(), TEST_LOCATION);
512   DALI_TEST_EQUALS(static_cast<int32_t>(maxLightCount), shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
513   for(uint32_t i = 0; i < maxLightCount; ++i)
514   {
515     tet_printf("i : %d\n", i);
516     Vector3 color, direction;
517     if(i == maxLightCount - 1)
518     {
519       color     = Vector3(1.0f, 0.0f, 0.0f);
520       direction = Vector3(0.0f, 0.0f, -1.0f);
521     }
522     else
523     {
524       color     = Vector3(0.0f, 0.0f, 1.0f);
525       direction = Vector3(1.0f, 0.0f, 0.0f);
526     }
527     std::string colorStringKey     = std::string("uLightColor[") + std::to_string(i) + "]";
528     auto        colorPropertyIndex = shader.GetPropertyIndex(colorStringKey);
529     DALI_TEST_EQUALS(color, shader.GetCurrentProperty<Vector3>(colorPropertyIndex), 0.01f, TEST_LOCATION);
530
531     std::string directionStringKey     = std::string("uLightDirection[") + std::to_string(i) + "]";
532     auto        directionPropertyIndex = shader.GetPropertyIndex(directionStringKey);
533     DALI_TEST_EQUALS(direction, shader.GetCurrentProperty<Vector3>(directionPropertyIndex), 0.01f, TEST_LOCATION);
534   }
535
536   for(uint32_t i = 0; i < lightList.size(); ++i)
537   {
538     if(i == 2)
539     {
540       DALI_TEST_EQUALS(false, lightList[i].IsEnabled(), TEST_LOCATION);
541     }
542     else
543     {
544       DALI_TEST_EQUALS(true, lightList[i].IsEnabled(), TEST_LOCATION);
545     }
546   }
547
548   END_TEST;
549 }
550
551 int UtcDaliLightModelAddAndRemove(void)
552 {
553   ToolkitTestApplication application;
554
555   Scene3D::SceneView sceneView = Scene3D::SceneView::New();
556   sceneView.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
557   sceneView.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
558   sceneView.SetProperty(Dali::Actor::Property::WIDTH_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
559   sceneView.SetProperty(Dali::Actor::Property::HEIGHT_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
560   application.GetScene().Add(sceneView);
561
562   Scene3D::Light light = Scene3D::Light::New();
563   light.SetProperty(Dali::Actor::Property::COLOR, Color::BLUE);
564   Dali::DevelActor::LookAt(light, Vector3(1.0f, 0.0f, 0.0f));
565   sceneView.Add(light);
566
567   application.SendNotification();
568   application.Render();
569
570   Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
571   sceneView.Add(model);
572
573   application.SendNotification();
574   application.Render();
575   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
576   application.SendNotification();
577   application.Render();
578
579   Renderer renderer = model.FindChildByName("node2").GetRendererAt(0u);
580   DALI_TEST_CHECK(renderer);
581   Shader shader = renderer.GetShader();
582   DALI_TEST_CHECK(shader);
583
584   DALI_TEST_EQUALS(1u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
585   auto countPropertyIndex = shader.GetPropertyIndex("uLightCount");
586   DALI_TEST_CHECK(countPropertyIndex != DALI_KEY_INVALID);
587   DALI_TEST_EQUALS(1, shader.GetProperty<int32_t>(countPropertyIndex), TEST_LOCATION);
588
589   auto colorPropertyIndex = shader.GetPropertyIndex("uLightColor[0]");
590   DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, 1.0f), shader.GetCurrentProperty<Vector3>(colorPropertyIndex), 0.01f, TEST_LOCATION);
591   auto directionPropertyIndex = shader.GetPropertyIndex("uLightDirection[0]");
592   DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f), shader.GetCurrentProperty<Vector3>(directionPropertyIndex), 0.01f, TEST_LOCATION);
593
594   DALI_TEST_EQUALS(1u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
595
596   model.Unparent();
597
598   DALI_TEST_EQUALS(1u, sceneView.GetActivatedLightCount(), TEST_LOCATION);
599
600   END_TEST;
601 }