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.
18 #include <dali-toolkit-test-suite-utils.h>
19 #include <dali-toolkit/dali-toolkit.h>
23 #include <dali-scene3d/public-api/controls/model/model.h>
24 #include <dali-scene3d/public-api/controls/scene-view/scene-view.h>
27 using namespace Dali::Toolkit;
29 void scene_view_startup(void)
31 test_return_value = TET_UNDEF;
34 void scene_view_cleanup(void)
36 test_return_value = TET_PASS;
42 * For the AnimatedCube.gltf and its Assets
43 * Donated by Norbert Nopper for glTF testing.
44 * Take from https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/AnimatedCube
46 const char* TEST_GLTF_FILE_NAME = TEST_RESOURCE_DIR "/AnimatedCube.gltf";
49 * For the diffuse and specular cube map texture.
50 * These textures are based off version of Wave engine sample
51 * Take from https://github.com/WaveEngine/Samples
53 * Copyright (c) 2022 Wave Coorporation
55 * Permission is hereby granted, free of charge, to any person obtaining a copy
56 * of this software and associated documentation files (the "Software"), to
57 * deal in the Software without restriction, including without limitation the
58 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
59 * sell copies of the Software, and to permit persons to whom the Software is
60 * furnished to do so, subject to the following conditions:
62 * The above copyright notice and this permission notice shall be included in
63 * all copies or substantial portions of the Software.
65 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
66 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
67 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
68 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
69 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
70 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
73 const char* TEST_DIFFUSE_TEXTURE = TEST_RESOURCE_DIR "/forest_irradiance.ktx";
74 const char* TEST_SPECULAR_TEXTURE = TEST_RESOURCE_DIR "/forest_radiance.ktx";
76 Dali::Texture GetDiffuseTexture(Dali::Scene3D::Model model)
78 Dali::Texture texture;
80 Actor meshActor = model.FindChildByName("AnimatedCube");
83 Renderer renderer = meshActor.GetRendererAt(0u);
86 TextureSet textureSet = renderer.GetTextures();
87 if(textureSet.GetTextureCount() == 7u)
89 texture = textureSet.GetTexture(5u);
97 Dali::Texture GetSpecularTexture(Dali::Scene3D::Model model)
99 Dali::Texture texture;
101 Actor meshActor = model.FindChildByName("AnimatedCube");
104 Renderer renderer = meshActor.GetRendererAt(0u);
107 TextureSet textureSet = renderer.GetTextures();
108 if(textureSet.GetTextureCount() == 7u)
110 texture = textureSet.GetTexture(6u);
119 // Negative test case for a method
120 int UtcDaliSceneViewUninitialized(void)
122 ToolkitTestApplication application;
123 tet_infoline("UtcDaliSceneViewUninitialized");
125 Scene3D::SceneView view;
129 // New() must be called to create a Model or it wont be valid.
130 Actor a = Actor::New();
132 DALI_TEST_CHECK(false);
134 catch(Dali::DaliException& e)
136 // Tests that a negative test of an assertion succeeds
137 DALI_TEST_PRINT_ASSERT(e);
138 DALI_TEST_CHECK(!view);
143 // Positive test case for a method
144 int UtcDaliSceneViewNew(void)
146 ToolkitTestApplication application;
147 tet_infoline("UtcDaliSceneViewNew");
149 Scene3D::SceneView view = Scene3D::SceneView::New();
150 DALI_TEST_CHECK(view);
154 // Positive test case for a method
155 int UtcDaliSceneViewDownCast(void)
157 ToolkitTestApplication application;
158 tet_infoline("UtcDaliSceneViewDownCast");
160 Scene3D::SceneView view = Scene3D::SceneView::New();
161 BaseHandle handle(view);
163 Scene3D::SceneView sceneView = Scene3D::SceneView::DownCast(handle);
164 DALI_TEST_CHECK(view);
165 DALI_TEST_CHECK(sceneView);
166 DALI_TEST_CHECK(sceneView == view);
170 int UtcDaliSceneViewTypeRegistry(void)
172 ToolkitTestApplication application;
173 tet_infoline("UtcDaliSceneViewTypeRegistry");
175 TypeRegistry typeRegistry = TypeRegistry::Get();
176 DALI_TEST_CHECK(typeRegistry);
178 TypeInfo typeInfo = typeRegistry.GetTypeInfo("SceneView");
179 DALI_TEST_CHECK(typeInfo);
181 BaseHandle handle = typeInfo.CreateInstance();
182 DALI_TEST_CHECK(handle);
184 Scene3D::SceneView model = Scene3D::SceneView::DownCast(handle);
185 DALI_TEST_CHECK(model);
190 // Positive test case for a method
191 int UtcDaliSceneViewAddRemove(void)
193 ToolkitTestApplication application;
194 tet_infoline("UtcDaliSceneViewAddRemove");
196 Scene3D::SceneView view = Scene3D::SceneView::New();
197 DALI_TEST_CHECK(view);
198 DALI_TEST_EQUALS(1u, view.GetChildCount(), TEST_LOCATION);
200 Actor actor = Actor::New();
202 view.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
203 view.SetProperty(Actor::Property::SIZE, application.GetScene().GetSize());
206 DALI_TEST_EQUALS(1u, view.GetChildCount(), TEST_LOCATION);
207 Actor layer = view.GetChildAt(0u);
209 DALI_TEST_EQUALS(2u, layer.GetChildCount(), TEST_LOCATION);
210 DALI_TEST_EQUALS(actor, layer.GetChildAt(1u), TEST_LOCATION); // index 0u is default camera
213 DALI_TEST_EQUALS(1u, layer.GetChildCount(), TEST_LOCATION);
217 int UtcDaliSceneViewCopyAndAssignment(void)
219 ToolkitTestApplication application;
221 Scene3D::SceneView view = Scene3D::SceneView::New();
222 DALI_TEST_CHECK(view);
224 Scene3D::SceneView copy(view);
225 DALI_TEST_CHECK(view == copy);
227 Scene3D::SceneView assign;
228 DALI_TEST_CHECK(!assign);
231 DALI_TEST_CHECK(assign == view);
236 int UtcDaliSceneViewMoveConstructor(void)
238 ToolkitTestApplication application;
240 Scene3D::SceneView view = Scene3D::SceneView::New();
241 DALI_TEST_EQUALS(1, view.GetBaseObject().ReferenceCount(), TEST_LOCATION);
242 view.SetProperty(Actor::Property::SENSITIVE, false);
243 DALI_TEST_CHECK(false == view.GetProperty<bool>(Actor::Property::SENSITIVE));
245 Scene3D::SceneView moved = std::move(view);
246 DALI_TEST_CHECK(moved);
247 DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
248 DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
249 DALI_TEST_CHECK(!view);
254 int UtcDaliSceneViewMoveAssignment(void)
256 ToolkitTestApplication application;
258 Scene3D::SceneView view = Scene3D::SceneView::New();
259 DALI_TEST_EQUALS(1, view.GetBaseObject().ReferenceCount(), TEST_LOCATION);
260 view.SetProperty(Actor::Property::SENSITIVE, false);
261 DALI_TEST_CHECK(false == view.GetProperty<bool>(Actor::Property::SENSITIVE));
263 Scene3D::SceneView moved;
264 moved = std::move(view);
265 DALI_TEST_CHECK(moved);
266 DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
267 DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
268 DALI_TEST_CHECK(!view);
273 int UtcDaliSceneViewOnScene01(void)
275 ToolkitTestApplication application;
277 Scene3D::SceneView view = Scene3D::SceneView::New();
279 DALI_TEST_EQUALS(1u, view.GetChildCount(), TEST_LOCATION);
280 Actor layer = view.GetChildAt(0u);
282 DALI_TEST_EQUALS(1u, layer.GetChildCount(), TEST_LOCATION);
284 application.GetScene().Add(view);
286 application.SendNotification();
287 application.Render();
289 // CameraActor is added on layer when on scene
290 DALI_TEST_EQUALS(1u, layer.GetChildCount(), TEST_LOCATION);
295 int UtcDaliSceneViewOnScene02(void)
297 ToolkitTestApplication application;
299 uint32_t renderTaskCount = application.GetScene().GetRenderTaskList().GetTaskCount();
300 DALI_TEST_EQUALS(1u, renderTaskCount, TEST_LOCATION);
302 Scene3D::SceneView view = Scene3D::SceneView::New();
304 renderTaskCount = application.GetScene().GetRenderTaskList().GetTaskCount();
305 DALI_TEST_EQUALS(2u, renderTaskCount, TEST_LOCATION);
307 RenderTask renderTask = application.GetScene().GetRenderTaskList().GetTask(1u);
308 CameraActor camera = renderTask.GetCameraActor();
310 application.GetScene().Add(view);
312 application.SendNotification();
313 application.Render();
315 CameraActor defaultCamera = renderTask.GetCameraActor();
316 DALI_TEST_CHECK(defaultCamera);
317 DALI_TEST_EQUALS(camera, defaultCamera, TEST_LOCATION);
318 DALI_TEST_EQUALS(defaultCamera, view.GetSelectedCamera(), TEST_LOCATION);
323 int UtcDaliSceneViewUserCamera(void)
325 ToolkitTestApplication application;
327 Scene3D::SceneView view = Scene3D::SceneView::New();
328 view.SetProperty(Dali::Actor::Property::SIZE, Vector2(100, 100));
330 application.GetScene().Add(view);
332 application.SendNotification();
333 application.Render();
335 CameraActor defaultCamera = view.GetSelectedCamera();
336 CameraActor camera = Dali::CameraActor::New();
337 camera.SetProperty(Dali::Actor::Property::NAME, "camera");
338 view.AddCamera(camera);
339 view.SelectCamera("camera");
341 DALI_TEST_NOT_EQUALS(defaultCamera, view.GetSelectedCamera(), 0.0f, TEST_LOCATION);
342 DALI_TEST_EQUALS(camera, view.GetSelectedCamera(), TEST_LOCATION);
344 camera.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
345 camera.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
346 camera.SetFieldOfView(0.5f);
347 camera.SetNearClippingPlane(1.0f);
348 camera.SetFarClippingPlane(5000.0f);
349 camera.SetProperty(Dali::Actor::Property::POSITION, Vector3(20, 30, 40));
351 float fov = camera[Dali::CameraActor::Property::FIELD_OF_VIEW];
352 float nearPlain = camera[Dali::CameraActor::Property::NEAR_PLANE_DISTANCE];
353 float farPlain = camera[Dali::CameraActor::Property::FAR_PLANE_DISTANCE];
354 Vector3 cameraPosition = camera[Dali::Actor::Property::POSITION];
356 view.SetProperty(Dali::Actor::Property::SIZE, Vector2(400, 300));
358 DALI_TEST_EQUALS(fov, camera.GetProperty<float>(Dali::CameraActor::Property::FIELD_OF_VIEW), TEST_LOCATION);
359 DALI_TEST_EQUALS(nearPlain, camera.GetProperty<float>(Dali::CameraActor::Property::NEAR_PLANE_DISTANCE), TEST_LOCATION);
360 DALI_TEST_EQUALS(farPlain, camera.GetProperty<float>(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), TEST_LOCATION);
361 DALI_TEST_EQUALS(cameraPosition, camera.GetProperty<Vector3>(Dali::Actor::Property::POSITION), TEST_LOCATION);
366 int UtcDaliSceneViewAddRemoveCamera(void)
368 ToolkitTestApplication application;
370 Scene3D::SceneView view = Scene3D::SceneView::New();
371 view.SetProperty(Dali::Actor::Property::SIZE, Vector2(100, 100));
373 application.GetScene().Add(view);
375 application.SendNotification();
376 application.Render();
378 CameraActor camera0 = view.GetSelectedCamera();
379 camera0.SetProperty(Dali::Actor::Property::NAME, "camera0");
380 CameraActor camera1 = Dali::CameraActor::New();
381 camera1.SetProperty(Dali::Actor::Property::NAME, "camera1");
383 DALI_TEST_EQUALS(1u, view.GetCameraCount(), TEST_LOCATION);
384 view.AddCamera(camera1);
385 DALI_TEST_EQUALS(2u, view.GetCameraCount(), TEST_LOCATION);
387 DALI_TEST_EQUALS(camera0, view.GetCamera(0), TEST_LOCATION);
388 DALI_TEST_EQUALS(camera0, view.GetCamera("camera0"), TEST_LOCATION);
389 DALI_TEST_EQUALS(camera1, view.GetCamera(1), TEST_LOCATION);
390 DALI_TEST_EQUALS(camera1, view.GetCamera("camera1"), TEST_LOCATION);
392 DALI_TEST_EQUALS(camera0, view.GetSelectedCamera(), TEST_LOCATION);
393 view.SelectCamera(1); // 0 -> 1
394 DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
395 view.SelectCamera("camera0"); // 1 -> 0
396 DALI_TEST_EQUALS(camera0, view.GetSelectedCamera(), TEST_LOCATION);
397 view.SelectCamera("camera1"); // 0 -> 1
398 DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
399 view.SelectCamera(0); // 1 -> 0
400 DALI_TEST_EQUALS(camera0, view.GetSelectedCamera(), TEST_LOCATION);
402 view.SelectCamera(1); // 0 -> 1
403 DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
404 DALI_TEST_EQUALS(2u, view.GetCameraCount(), TEST_LOCATION);
405 view.RemoveCamera(camera1); // 1 -> 0
406 DALI_TEST_EQUALS(camera0, view.GetSelectedCamera(), TEST_LOCATION);
407 DALI_TEST_EQUALS(1u, view.GetCameraCount(), TEST_LOCATION);
409 CameraActor defaultCamera = view.GetSelectedCamera();
410 DALI_TEST_CHECK(defaultCamera);
411 DALI_TEST_EQUALS(camera0, defaultCamera, TEST_LOCATION);
412 DALI_TEST_NOT_EQUALS(camera1, defaultCamera, 0.0f, TEST_LOCATION);
416 int UtcDaliSceneViewImageBasedLight(void)
418 ToolkitTestApplication application;
420 Scene3D::SceneView view = Scene3D::SceneView::New();
421 view.SetProperty(Dali::Actor::Property::SIZE, Vector2(100, 100));
423 application.GetScene().Add(view);
425 application.SendNotification();
426 application.Render();
428 Scene3D::Model modelView1 = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
429 Scene3D::Model modelView2 = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
430 Scene3D::Model modelView3 = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
431 view.Add(modelView1);
432 view.Add(modelView2);
434 DALI_TEST_NOT_EQUALS(GetDiffuseTexture(modelView1), GetDiffuseTexture(modelView2), 0.0f, TEST_LOCATION);
435 DALI_TEST_NOT_EQUALS(GetSpecularTexture(modelView1), GetSpecularTexture(modelView2), 0.0f, TEST_LOCATION);
436 DALI_TEST_NOT_EQUALS(GetDiffuseTexture(modelView1), GetDiffuseTexture(modelView3), 0.0f, TEST_LOCATION);
437 DALI_TEST_NOT_EQUALS(GetSpecularTexture(modelView1), GetSpecularTexture(modelView3), 0.0f, TEST_LOCATION);
439 view.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE);
441 DALI_TEST_EQUALS(GetDiffuseTexture(modelView1), GetDiffuseTexture(modelView2), TEST_LOCATION);
442 DALI_TEST_EQUALS(GetSpecularTexture(modelView1), GetSpecularTexture(modelView2), TEST_LOCATION);
443 DALI_TEST_NOT_EQUALS(GetDiffuseTexture(modelView1), GetDiffuseTexture(modelView3), 0.0f, TEST_LOCATION);
444 DALI_TEST_NOT_EQUALS(GetSpecularTexture(modelView1), GetSpecularTexture(modelView3), 0.0f, TEST_LOCATION);
446 view.Add(modelView3);
448 DALI_TEST_EQUALS(GetDiffuseTexture(modelView1), GetDiffuseTexture(modelView3), TEST_LOCATION);
449 DALI_TEST_EQUALS(GetSpecularTexture(modelView1), GetSpecularTexture(modelView3), TEST_LOCATION);
451 view.Remove(modelView1);
452 view.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE);
454 DALI_TEST_NOT_EQUALS(GetDiffuseTexture(modelView1), GetDiffuseTexture(modelView2), 0.0f, TEST_LOCATION);
455 DALI_TEST_NOT_EQUALS(GetSpecularTexture(modelView1), GetSpecularTexture(modelView2), 0.0f, TEST_LOCATION);
456 DALI_TEST_NOT_EQUALS(GetDiffuseTexture(modelView1), GetDiffuseTexture(modelView3), 0.0f, TEST_LOCATION);
457 DALI_TEST_NOT_EQUALS(GetSpecularTexture(modelView1), GetSpecularTexture(modelView3), 0.0f, TEST_LOCATION);
458 DALI_TEST_EQUALS(GetDiffuseTexture(modelView2), GetDiffuseTexture(modelView3), TEST_LOCATION);
459 DALI_TEST_EQUALS(GetSpecularTexture(modelView2), GetSpecularTexture(modelView3), TEST_LOCATION);
464 int UtcDaliSceneViewImageBasedFactor(void)
466 ToolkitTestApplication application;
468 Scene3D::SceneView view = Scene3D::SceneView::New();
469 view.SetProperty(Dali::Actor::Property::SIZE, Vector2(100, 100));
471 application.GetScene().Add(view);
473 application.SendNotification();
474 application.Render();
476 Scene3D::Model modelView1 = Scene3D::Model::New(TEST_GLTF_FILE_NAME);
477 view.Add(modelView1);
479 DALI_TEST_EQUALS(view.GetImageBasedLightScaleFactor(), 1.0f, TEST_LOCATION);
480 DALI_TEST_EQUALS(modelView1.GetImageBasedLightScaleFactor(), 1.0f, TEST_LOCATION);
482 view.SetImageBasedLightScaleFactor(0.5f);
483 DALI_TEST_EQUALS(view.GetImageBasedLightScaleFactor(), 0.5f, TEST_LOCATION);
484 DALI_TEST_EQUALS(modelView1.GetImageBasedLightScaleFactor(), 0.5f, TEST_LOCATION);
488 int UtcDaliSceneViewUseFramebuffer01(void)
490 ToolkitTestApplication application;
492 Scene3D::SceneView view = Scene3D::SceneView::New();
493 view.SetProperty(Dali::Actor::Property::SIZE, Vector2(100, 100));
495 application.GetScene().Add(view);
497 application.SendNotification();
498 application.Render();
500 bool useFramebuffer = view.IsUsingFramebuffer();
501 view.UseFramebuffer(true);
502 DALI_TEST_NOT_EQUALS(useFramebuffer, view.IsUsingFramebuffer(), 0.0f, TEST_LOCATION);
507 int UtcDaliSceneViewUseFramebuffer02(void)
509 ToolkitTestApplication application;
511 Scene3D::SceneView view = Scene3D::SceneView::New();
512 view.SetProperty(Dali::Actor::Property::SIZE, Vector2(100, 100));
514 application.GetScene().Add(view);
516 application.SendNotification();
517 application.Render();
519 RenderTask renderTask = application.GetScene().GetRenderTaskList().GetTask(1u);
520 DALI_TEST_CHECK(!renderTask.GetFrameBuffer());
522 view.UseFramebuffer(true);
523 DALI_TEST_CHECK(renderTask.GetFrameBuffer());
525 view.UseFramebuffer(false);
526 DALI_TEST_CHECK(!renderTask.GetFrameBuffer());
528 view.UseFramebuffer(true);
529 DALI_TEST_CHECK(renderTask.GetFrameBuffer());
537 static bool gOnRelayoutCallBackCalled = false;
538 void OnRelayoutCallback(Actor actor)
540 gOnRelayoutCallBackCalled = true;
543 static bool gResourceReadyCalled = false;
544 void OnResourceReady(Control control)
546 gResourceReadyCalled = true;
550 int UtcDaliSceneViewResourceReady(void)
552 ToolkitTestApplication application;
554 gOnRelayoutCallBackCalled = false;
555 gResourceReadyCalled = false;
556 Scene3D::SceneView view = Scene3D::SceneView::New();
557 view.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
558 view.OnRelayoutSignal().Connect(OnRelayoutCallback);
559 view.ResourceReadySignal().Connect(OnResourceReady);
560 // SceneView::IsResourceReady() returns true by default.
561 DALI_TEST_EQUALS(view.IsResourceReady(), true, TEST_LOCATION);
564 DALI_TEST_CHECK(!gOnRelayoutCallBackCalled);
565 DALI_TEST_CHECK(!gResourceReadyCalled);
567 application.GetScene().Add(view);
569 application.SendNotification();
570 application.Render();
572 DALI_TEST_EQUALS(gOnRelayoutCallBackCalled, true, TEST_LOCATION);
573 DALI_TEST_EQUALS(view.IsResourceReady(), true, TEST_LOCATION);
574 DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION);
576 gOnRelayoutCallBackCalled = false;
577 gResourceReadyCalled = false;
579 view.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE);
581 application.SendNotification();
582 application.Render();
584 DALI_TEST_EQUALS(gOnRelayoutCallBackCalled, false, TEST_LOCATION);
585 DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION);