X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-scene3d%2Futc-Dali-Model.cpp;h=c219f9379c6dd16722aec08eed97e586caf094d2;hb=c1236a21a2ddc2da56cb8d54b4ab7e7b1b6c2b50;hp=25d2624be7ca1fd786829a50153917ffb6f8c9f3;hpb=f809a475ea9f8d7507a7af569ebda0eab658433f;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-scene3d/utc-Dali-Model.cpp b/automated-tests/src/dali-scene3d/utc-Dali-Model.cpp index 25d2624..c219f93 100644 --- a/automated-tests/src/dali-scene3d/utc-Dali-Model.cpp +++ b/automated-tests/src/dali-scene3d/utc-Dali-Model.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,8 +22,12 @@ #include #include +#include #include +#include + +#include using namespace Dali; using namespace Dali::Toolkit; @@ -47,15 +51,18 @@ const bool DEFAULT_MODEL_CHILDREN_FOCUSABLE = false; * Donated by Norbert Nopper for glTF testing. * Take from https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/AnimatedCube */ -const char* TEST_GLTF_FILE_NAME = TEST_RESOURCE_DIR "/AnimatedCube.gltf"; -const char* TEST_GLTF_ANIMATION_TEST_FILE_NAME = TEST_RESOURCE_DIR "/animationTest.gltf"; -const char* TEST_DLI_FILE_NAME = TEST_RESOURCE_DIR "/arc.dli"; +const char* TEST_GLTF_FILE_NAME = TEST_RESOURCE_DIR "/AnimatedCube.gltf"; +const char* TEST_GLTF_ANIMATION_TEST_FILE_NAME = TEST_RESOURCE_DIR "/animationTest.gltf"; +const char* TEST_GLTF_MULTIPLE_PRIMITIVE_FILE_NAME = TEST_RESOURCE_DIR "/simpleMultiplePrimitiveTest.gltf"; +const char* TEST_DLI_FILE_NAME = TEST_RESOURCE_DIR "/arc.dli"; +const char* TEST_DLI_EXERCISE_FILE_NAME = TEST_RESOURCE_DIR "/exercise.dli"; + /** * For the diffuse and specular cube map texture. * These textures are based off version of Wave engine sample * Take from https://github.com/WaveEngine/Samples * - * Copyright (c) 2022 Wave Coorporation + * Copyright (c) 2023 Wave Coorporation * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -91,6 +98,19 @@ void TestFocusChangedCallback(Actor, Actor) gFocusChangedCallBackCalled = true; } +// For ResourceReady +static bool gOnRelayoutCallBackCalled = false; +void OnRelayoutCallback(Actor actor) +{ + gOnRelayoutCallBackCalled = true; +} + +static bool gResourceReadyCalled = false; +void OnResourceReady(Control control) +{ + gResourceReadyCalled = true; +} + } // namespace // Negative test case for a method @@ -129,6 +149,26 @@ int UtcDaliModelNew(void) } // Positive test case for a method +int UtcDaliModelNewP2(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliModelNew without url"); + + Scene3D::Model model = Scene3D::Model::New(); + DALI_TEST_CHECK(model); + + application.GetScene().Add(model); + + DALI_TEST_CHECK(model.GetProperty(Actor::Property::CONNECTED_TO_SCENE)); + + application.GetScene().Remove(model); + + DALI_TEST_CHECK(!model.GetProperty(Actor::Property::CONNECTED_TO_SCENE)); + + END_TEST; +} + +// Positive test case for a method int UtcDaliModelDownCast(void) { ToolkitTestApplication application; @@ -249,15 +289,23 @@ int UtcDaliModelOnScene01(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + uint32_t modelCount = model.GetModelRoot().GetChildCount(); DALI_TEST_EQUALS(1, modelCount, TEST_LOCATION); - END_TEST; } @@ -266,17 +314,26 @@ int UtcDaliModelOnScene02(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_DLI_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + uint32_t modelCount = model.GetModelRoot().GetChildCount(); DALI_TEST_EQUALS(1, modelCount, TEST_LOCATION); - Actor rootActor = model.GetModelRoot(); - Vector3 rootSize = rootActor.GetProperty(Dali::Actor::Property::SIZE); + Scene3D::ModelNode rootNode = model.GetModelRoot(); + Vector3 rootSize = rootNode.GetProperty(Dali::Actor::Property::SIZE); DALI_TEST_EQUALS(Vector3(2, 2, 1), rootSize, TEST_LOCATION); END_TEST; @@ -311,11 +368,24 @@ int UtcDaliModelGetNaturalSize(void) Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); Vector3 naturalSize = model.GetNaturalSize(); + DALI_TEST_EQUALS(Vector3::ZERO, naturalSize, TEST_LOCATION); + + application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + naturalSize = model.GetNaturalSize(); DALI_TEST_EQUALS(Vector3(2, 2, 2), naturalSize, TEST_LOCATION); - Actor root = model.GetModelRoot(); - DALI_TEST_CHECK(root); + Scene3D::ModelNode rootNode = model.GetModelRoot(); + DALI_TEST_CHECK(rootNode); END_TEST; } @@ -325,12 +395,21 @@ int UtcDaliModelSetImageBasedLightSource01(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = model.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -338,19 +417,33 @@ int UtcDaliModelSetImageBasedLightSource01(void) DALI_TEST_CHECK(renderer); TextureSet textureSet = renderer.GetTextures(); - DALI_TEST_EQUALS(textureSet.GetTextureCount(), 7u, TEST_LOCATION); + DALI_TEST_EQUALS(textureSet.GetTextureCount(), 9u, TEST_LOCATION); - Texture diffuseTexture = textureSet.GetTexture(5u); - Texture specularTexture = textureSet.GetTexture(6u); + Texture diffuseTexture = textureSet.GetTexture(7u); + Texture specularTexture = textureSet.GetTexture(8u); + gResourceReadyCalled = false; + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); model.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE); - Texture newDiffuseTexture = textureSet.GetTexture(5u); - Texture newSpecularTexture = textureSet.GetTexture(6u); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + TextureSet newTextureSet = renderer.GetTextures(); + Texture newDiffuseTexture = newTextureSet.GetTexture(7u); + Texture newSpecularTexture = newTextureSet.GetTexture(8u); DALI_TEST_NOT_EQUALS(diffuseTexture, newDiffuseTexture, 0.0f, TEST_LOCATION); DALI_TEST_NOT_EQUALS(specularTexture, newSpecularTexture, 0.0f, TEST_LOCATION); + model.Unparent(); + model.Reset(); END_TEST; } @@ -359,12 +452,21 @@ int UtcDaliModelSetImageBasedLightSource02(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = model.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -372,15 +474,16 @@ int UtcDaliModelSetImageBasedLightSource02(void) DALI_TEST_CHECK(renderer); TextureSet textureSet = renderer.GetTextures(); - DALI_TEST_EQUALS(textureSet.GetTextureCount(), 7u, TEST_LOCATION); + DALI_TEST_EQUALS(textureSet.GetTextureCount(), 9u, TEST_LOCATION); - Texture diffuseTexture = textureSet.GetTexture(5u); - Texture specularTexture = textureSet.GetTexture(6u); + Texture diffuseTexture = textureSet.GetTexture(7u); + Texture specularTexture = textureSet.GetTexture(8u); + // if url is empty, loading is not requested. model.SetImageBasedLightSource("", ""); - Texture newDiffuseTexture = textureSet.GetTexture(5u); - Texture newSpecularTexture = textureSet.GetTexture(6u); + Texture newDiffuseTexture = textureSet.GetTexture(7u); + Texture newSpecularTexture = textureSet.GetTexture(8u); DALI_TEST_EQUALS(diffuseTexture, newDiffuseTexture, TEST_LOCATION); DALI_TEST_EQUALS(specularTexture, newSpecularTexture, TEST_LOCATION); @@ -393,12 +496,21 @@ int UtcDaliModelSetImageBasedLightSource03(void) ToolkitTestApplication application; Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = model.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -406,15 +518,26 @@ int UtcDaliModelSetImageBasedLightSource03(void) DALI_TEST_CHECK(renderer); TextureSet textureSet = renderer.GetTextures(); - DALI_TEST_EQUALS(textureSet.GetTextureCount(), 7u, TEST_LOCATION); + DALI_TEST_EQUALS(textureSet.GetTextureCount(), 9u, TEST_LOCATION); - Texture diffuseTexture = textureSet.GetTexture(5u); - Texture specularTexture = textureSet.GetTexture(6u); + Texture diffuseTexture = textureSet.GetTexture(7u); + Texture specularTexture = textureSet.GetTexture(8u); + gResourceReadyCalled = false; + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); model.SetImageBasedLightSource("dummy.ktx", "dummy.ktx"); - Texture newDiffuseTexture = textureSet.GetTexture(5u); - Texture newSpecularTexture = textureSet.GetTexture(6u); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + Texture newDiffuseTexture = textureSet.GetTexture(7u); + Texture newSpecularTexture = textureSet.GetTexture(8u); DALI_TEST_EQUALS(diffuseTexture, newDiffuseTexture, TEST_LOCATION); DALI_TEST_EQUALS(specularTexture, newSpecularTexture, TEST_LOCATION); @@ -422,6 +545,29 @@ int UtcDaliModelSetImageBasedLightSource03(void) END_TEST; } +int UtcDaliModelSetImageBasedLightSource04(void) +{ + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + END_TEST; +} + int UtcDaliModelImageBasedFactor(void) { ToolkitTestApplication application; @@ -451,12 +597,21 @@ int UtcDaliModelChildrenSensitive01(void) // Allow children actor's event before on scene. view.SetChildrenSensitive(true); DALI_TEST_EQUALS(view.GetChildrenSensitive(), true, TEST_LOCATION); - application.GetScene().Add(view); + gResourceReadyCalled = false; + view.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = view.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -539,12 +694,21 @@ int UtcDaliModelChildrenSensitive02(void) // Block children actor's event before on scene. view.SetChildrenSensitive(false); DALI_TEST_EQUALS(view.GetChildrenSensitive(), false, TEST_LOCATION); - application.GetScene().Add(view); + gResourceReadyCalled = false; + view.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = view.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -610,12 +774,21 @@ int UtcDaliModelChildrenFocusable01(void) // Allow children actor's focus before on scene. view.SetChildrenFocusable(true); DALI_TEST_EQUALS(view.GetChildrenFocusable(), true, TEST_LOCATION); - application.GetScene().Add(view); + gResourceReadyCalled = false; + view.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = view.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -709,12 +882,21 @@ int UtcDaliModelModelChildrenFocusable02(void) // Block children actor's focus before on scene. view.SetChildrenFocusable(false); DALI_TEST_EQUALS(view.GetChildrenFocusable(), false, TEST_LOCATION); - application.GetScene().Add(view); + gResourceReadyCalled = false; + view.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + Actor meshActor = view.FindChildByName("AnimatedCube"); DALI_TEST_CHECK(meshActor); @@ -781,12 +963,21 @@ int UtcDaliModelAnimation01(void) Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + uint32_t animationCount = model.GetAnimationCount(); DALI_TEST_EQUALS(1, animationCount, TEST_LOCATION); @@ -806,9 +997,16 @@ int UtcDaliModelAnimation02(void) Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_ANIMATION_TEST_FILE_NAME); model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); - application.GetScene().Add(model); + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); application.SendNotification(); application.Render(); @@ -828,21 +1026,205 @@ int UtcDaliModelAnimation02(void) END_TEST; } -// For ResourceReady -namespace +int UtcDaliModelAnimation03(void) { -static bool gOnRelayoutCallBackCalled = false; -void OnRelayoutCallback(Actor actor) + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_DLI_EXERCISE_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + uint32_t animationCount = model.GetAnimationCount(); + DALI_TEST_EQUALS(18, animationCount, TEST_LOCATION); + + Animation animationByIndex = model.GetAnimation(0u); + DALI_TEST_CHECK(animationByIndex); + + Animation animationByName = model.GetAnimation("idleClip"); + DALI_TEST_CHECK(animationByName); + DALI_TEST_EQUALS(animationByIndex, animationByName, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelCameraGenerate01(void) { - gOnRelayoutCallBackCalled = true; + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_DLI_EXERCISE_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + uint32_t cameraCount = model.GetCameraCount(); + DALI_TEST_EQUALS(1, cameraCount, TEST_LOCATION); + + CameraActor generatedCamera = model.GenerateCamera(0u); + DALI_TEST_CHECK(generatedCamera); + + generatedCamera = model.GenerateCamera(1u); // Fail to generate camera + DALI_TEST_CHECK(!generatedCamera); + + END_TEST; } -static bool gResourceReadyCalled = false; -void OnResourceReady(Control control) +int UtcDaliModelCameraGenerate02(void) { - gResourceReadyCalled = true; + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + uint32_t cameraCount = model.GetCameraCount(); + DALI_TEST_EQUALS(6, cameraCount, TEST_LOCATION); + + CameraActor generatedCamera0 = model.GenerateCamera(0u); + DALI_TEST_CHECK(generatedCamera0); + CameraActor generatedCamera1 = model.GenerateCamera(1u); + DALI_TEST_CHECK(generatedCamera1); + CameraActor generatedCamera2 = model.GenerateCamera(2u); + DALI_TEST_CHECK(generatedCamera2); + CameraActor generatedCamera3 = model.GenerateCamera(3u); // Infinity far camera + DALI_TEST_CHECK(generatedCamera3); + CameraActor generatedCamera4 = model.GenerateCamera(4u); // Broken camera 1 + DALI_TEST_CHECK(!generatedCamera4); + CameraActor generatedCamera5 = model.GenerateCamera(5u); // Broken camera 2 + DALI_TEST_CHECK(!generatedCamera5); + CameraActor generatedCamera6 = model.GenerateCamera(6u); // Out of bound + DALI_TEST_CHECK(!generatedCamera6); + + CameraActor appliedCamera; + DALI_TEST_EQUALS(model.ApplyCamera(0u, appliedCamera), false, TEST_LOCATION); // Cannot apply into empty camera. + + auto CompareCameraProperties = [](CameraActor lhs, CameraActor rhs, const char* location) + { + DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::PROJECTION_MODE), rhs.GetProperty(Dali::CameraActor::Property::PROJECTION_MODE), TEST_LOCATION); + DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::NEAR_PLANE_DISTANCE), rhs.GetProperty(Dali::CameraActor::Property::NEAR_PLANE_DISTANCE), TEST_LOCATION); + + if(lhs.GetProperty(Dali::CameraActor::Property::PROJECTION_MODE) == static_cast(Dali::Camera::ProjectionMode::PERSPECTIVE_PROJECTION)) + { + DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::FIELD_OF_VIEW), rhs.GetProperty(Dali::CameraActor::Property::FIELD_OF_VIEW), TEST_LOCATION); + // TODO : Open this test when infinity far projection implement. + // DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), rhs.GetProperty(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), TEST_LOCATION); + } + else + { + DALI_TEST_EQUALS(lhs.GetProperty(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE), rhs.GetProperty(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE), TEST_LOCATION); + DALI_TEST_EQUALS(lhs.GetProperty(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), rhs.GetProperty(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), TEST_LOCATION); + } + }; + + appliedCamera = CameraActor::New(); + DALI_TEST_EQUALS(model.ApplyCamera(0u, appliedCamera), true, TEST_LOCATION); + CompareCameraProperties(generatedCamera0, appliedCamera, TEST_LOCATION); + DALI_TEST_EQUALS(model.ApplyCamera(1u, appliedCamera), true, TEST_LOCATION); + CompareCameraProperties(generatedCamera1, appliedCamera, TEST_LOCATION); + DALI_TEST_EQUALS(model.ApplyCamera(2u, appliedCamera), true, TEST_LOCATION); + CompareCameraProperties(generatedCamera2, appliedCamera, TEST_LOCATION); + DALI_TEST_EQUALS(model.ApplyCamera(3u, appliedCamera), true, TEST_LOCATION); + CompareCameraProperties(generatedCamera3, appliedCamera, TEST_LOCATION); + DALI_TEST_EQUALS(model.ApplyCamera(4u, appliedCamera), false, TEST_LOCATION); // Broken camera 1 + DALI_TEST_EQUALS(model.ApplyCamera(5u, appliedCamera), false, TEST_LOCATION); // Broken camera 2 + DALI_TEST_EQUALS(model.ApplyCamera(6u, appliedCamera), false, TEST_LOCATION); // Cannot apply over the index. + + END_TEST; +} + +int UtcDaliModelMultiplePrimitives(void) +{ + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_MULTIPLE_PRIMITIVE_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + Actor actor = model.FindChildByName("rootNode"); + + DALI_TEST_EQUALS(0, actor.GetChildCount(), TEST_LOCATION); + DALI_TEST_EQUALS(2, actor.GetRendererCount(), TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelColorMode(void) +{ + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + model.SetProperty(Dali::Actor::Property::COLOR, Color::RED); + application.GetScene().Add(model); + + gResourceReadyCalled = false; + model.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + Actor actor = model.FindChildByName("AnimatedCube"); + Vector4 childColor = actor[Dali::Actor::Property::COLOR]; + Vector4 childWorldColor = actor[Dali::Actor::Property::WORLD_COLOR]; + + DALI_TEST_EQUALS(childColor, Color::WHITE, TEST_LOCATION); + DALI_TEST_EQUALS(childWorldColor, Color::RED, TEST_LOCATION); + + END_TEST; } -} // namespace int UtcDaliModelResourceReady(void) { @@ -865,9 +1247,244 @@ int UtcDaliModelResourceReady(void) application.SendNotification(); application.Render(); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS(gOnRelayoutCallBackCalled, false, TEST_LOCATION); DALI_TEST_EQUALS(model.IsResourceReady(), true, TEST_LOCATION); DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); END_TEST; } + +int UtcDaliModelResourceCacheCheck(void) +{ + ToolkitTestApplication application; + + // Load three instances of the same model and add them to the scene + Scene3D::Model model1 = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + Scene3D::Model model2 = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + Scene3D::Model model3 = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + + application.GetScene().Add(model1); + application.GetScene().Add(model2); + application.GetScene().Add(model3); + + gResourceReadyCalled = false; + model1.ResourceReadySignal().Connect(&OnResourceReady); + model2.ResourceReadySignal().Connect(&OnResourceReady); + model3.ResourceReadySignal().Connect(&OnResourceReady); + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + // Check that the loading has finished for all the three instances + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + Actor meshActor1 = model1.FindChildByName("AnimatedCube"); + Actor meshActor2 = model2.FindChildByName("AnimatedCube"); + Actor meshActor3 = model3.FindChildByName("AnimatedCube"); + DALI_TEST_CHECK(meshActor1); + DALI_TEST_CHECK(meshActor2); + DALI_TEST_CHECK(meshActor3); + + Renderer renderer1 = meshActor1.GetRendererAt(0u); + Renderer renderer2 = meshActor2.GetRendererAt(0u); + Renderer renderer3 = meshActor3.GetRendererAt(0u); + DALI_TEST_CHECK(renderer1); + DALI_TEST_CHECK(renderer2); + DALI_TEST_CHECK(renderer3); + + // Check that all the three instances use the shared textures and geometries from the cache + // but have their own shader objects + DALI_TEST_EQUALS(renderer1.GetTextures(), renderer2.GetTextures(), TEST_LOCATION); + DALI_TEST_EQUALS(renderer1.GetTextures(), renderer3.GetTextures(), TEST_LOCATION); + DALI_TEST_EQUALS(renderer1.GetGeometry(), renderer2.GetGeometry(), TEST_LOCATION); + DALI_TEST_EQUALS(renderer1.GetGeometry(), renderer3.GetGeometry(), TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer1.GetShader(), renderer2.GetShader(), 0.0f, TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer1.GetShader(), renderer3.GetShader(), 0.0f, TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer2.GetShader(), renderer3.GetShader(), 0.0f, TEST_LOCATION); + + // Destroy model1 + model1.Unparent(); + model1.Reset(); + + // Check that all the other two instances still use the shared textures and geometries from the cache + // but have their own shader objects + DALI_TEST_EQUALS(renderer2.GetTextures(), renderer3.GetTextures(), TEST_LOCATION); + DALI_TEST_EQUALS(renderer2.GetGeometry(), renderer3.GetGeometry(), TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer2.GetShader(), renderer3.GetShader(), 0.0f, TEST_LOCATION); + + // Set new IBL textures for model2, and this should apply to model2 instance only + gResourceReadyCalled = false; + DALI_TEST_EQUALS(gResourceReadyCalled, false, TEST_LOCATION); + model2.SetImageBasedLightSource(TEST_DIFFUSE_TEXTURE, TEST_SPECULAR_TEXTURE); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + // Check that the new IBL textures are loaded for model2 + DALI_TEST_EQUALS(gResourceReadyCalled, true, TEST_LOCATION); + + // Check that the two instances still use the shared geometries from the cache + // but now have their own shader objects and different texture set + DALI_TEST_NOT_EQUALS(renderer2.GetTextures(), renderer3.GetTextures(), 0.0f, TEST_LOCATION); + DALI_TEST_EQUALS(renderer2.GetGeometry(), renderer3.GetGeometry(), TEST_LOCATION); + DALI_TEST_NOT_EQUALS(renderer2.GetShader(), renderer3.GetShader(), 0.0f, TEST_LOCATION); + + // Check that the two instances now have their own diffuse texture and specular texture, + // but all the other textures are still the same + TextureSet textureSet2 = renderer2.GetTextures(); + TextureSet textureSet3 = renderer3.GetTextures(); + DALI_TEST_EQUALS(textureSet2.GetTextureCount(), 9u, TEST_LOCATION); + DALI_TEST_EQUALS(textureSet3.GetTextureCount(), 9u, TEST_LOCATION); + + for(uint32_t i = 0; i < 7u; i++) + { + DALI_TEST_EQUALS(textureSet2.GetTexture(i), textureSet3.GetTexture(i), TEST_LOCATION); + } + + DALI_TEST_NOT_EQUALS(textureSet2.GetTexture(7u), textureSet3.GetTexture(7u), 0.0f, TEST_LOCATION); + DALI_TEST_NOT_EQUALS(textureSet2.GetTexture(8u), textureSet3.GetTexture(8u), 0.0f, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelAddRemoveModelNode(void) +{ + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(); + model.SetProperty(Dali::Actor::Property::SIZE, Vector2(50, 50)); + + Scene3D::ModelNode node1 = Scene3D::ModelNode::New(); + Scene3D::ModelNode node2 = Scene3D::ModelNode::New(); + Scene3D::ModelNode node3 = Scene3D::ModelNode::New(); + Scene3D::ModelNode node4 = Scene3D::ModelNode::New(); + + model.AddModelNode(node1); + model.AddModelNode(node2); + model.AddModelNode(node3); + model.RemoveModelNode(node1); // Remove node before scene on + + application.GetScene().Add(model); + + Dali::Scene3D::ModelNode root = model.GetModelRoot(); + DALI_TEST_CHECK(root); + DALI_TEST_EQUALS(2, root.GetChildCount(), TEST_LOCATION); + + model.RemoveModelNode(node2); // Remove node after scene on + + DALI_TEST_EQUALS(1, root.GetChildCount(), TEST_LOCATION); + + model.AddModelNode(node4); // Add during scene on + + DALI_TEST_EQUALS(2, root.GetChildCount(), TEST_LOCATION); + + application.GetScene().Remove(model); + + model.RemoveModelNode(node3); // Remove node after scene off + + END_TEST; +} + +int UtcDaliModelFindChildModelNodeByName(void) +{ + tet_infoline(" UtcDaliModelNodeFindChildModelNodeByName."); + + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(); + application.GetScene().Add(model); + + Scene3D::ModelNode modelNode1 = Scene3D::ModelNode::New(); + Scene3D::ModelNode modelNode2 = Scene3D::ModelNode::New(); + + modelNode1.SetProperty(Dali::Actor::Property::NAME, "modelNode1"); + modelNode2.SetProperty(Dali::Actor::Property::NAME, "modelNode2"); + model.AddModelNode(modelNode1); + model.AddModelNode(modelNode2); + + Scene3D::ModelNode child1 = model.FindChildModelNodeByName("modelNode1"); + DALI_TEST_CHECK(child1); + DALI_TEST_EQUALS(child1, modelNode1, TEST_LOCATION); + + Scene3D::ModelNode child2 = model.FindChildModelNodeByName("modelNode2"); + DALI_TEST_CHECK(child2); + DALI_TEST_EQUALS(child2, modelNode2, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelSizeChange(void) +{ + tet_infoline(" UtcDaliModelSizeChange."); + + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector3(300, 300, 300)); + application.GetScene().Add(model); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(model.GetChildCount(), 1u, TEST_LOCATION); + Vector3 scale = model.GetChildAt(0u).GetProperty(Dali::Actor::Property::SCALE); + + model.SetProperty(Dali::Actor::Property::SIZE, Vector3(600, 600, 600)); + Vector3 scale2 = model.GetChildAt(0u).GetProperty(Dali::Actor::Property::SCALE); + + DALI_TEST_NOT_EQUALS(scale, scale2, 0.1f, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliModelSizeChange2(void) +{ + tet_infoline(" UtcDaliModelSizeChange2."); + + ToolkitTestApplication application; + + Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_FILE_NAME); + model.SetProperty(Dali::Actor::Property::SIZE, Vector3(300, 300, 300)); + application.GetScene().Add(model); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(model.GetChildCount(), 1u, TEST_LOCATION); + Vector3 scale = model.GetChildAt(0u).GetProperty(Dali::Actor::Property::SCALE); + + Animation animation = Animation::New(0.5f); + animation.AnimateTo(Dali::Property(model, Dali::Actor::Property::SIZE), Vector3(600, 600, 600)); + animation.Play(); + + application.SendNotification(); + application.Render(250); + + application.SendNotification(); + + Vector3 scale2 = model.GetChildAt(0u).GetProperty(Dali::Actor::Property::SCALE); + DALI_TEST_NOT_EQUALS(scale, scale2, 0.1f, TEST_LOCATION); + + END_TEST; +}