Parse gltf mesh extra and extensions + Get BlendShape index by name
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-scene3d / utc-Dali-Model.cpp
index 28b929e..b2d8169 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <dali-toolkit-test-suite-utils.h>
 #include <dali-toolkit/dali-toolkit.h>
+#include <dali/devel-api/common/map-wrapper.h>
 #include <stdlib.h>
 #include <iostream>
 
@@ -25,6 +26,7 @@
 #include <toolkit-event-thread-callback.h>
 
 #include <dali-scene3d/public-api/controls/model/model.h>
+#include <dali-scene3d/public-api/model-components/model-node.h>
 
 #include <dali/devel-api/actors/camera-actor-devel.h>
 
@@ -52,9 +54,10 @@ const bool DEFAULT_MODEL_CHILDREN_FOCUSABLE = false;
  */
 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_EXTRAS_FILE_NAME             = TEST_RESOURCE_DIR "/AnimatedMorphCubeAnimateNonZeroFrame.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";
+const char* TEST_DLI_EXERCISE_FILE_NAME            = TEST_RESOURCE_DIR "/exercise.dli";
 
 /**
  * For the diffuse and specular cube map texture.
@@ -148,6 +151,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<bool>(Actor::Property::CONNECTED_TO_SCENE));
+
+  application.GetScene().Remove(model);
+
+  DALI_TEST_CHECK(!model.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
+
+  END_TEST;
+}
+
+// Positive test case for a method
 int UtcDaliModelDownCast(void)
 {
   ToolkitTestApplication application;
@@ -311,8 +334,8 @@ int UtcDaliModelOnScene02(void)
   uint32_t modelCount = model.GetModelRoot().GetChildCount();
   DALI_TEST_EQUALS(1, modelCount, TEST_LOCATION);
 
-  Actor   rootActor = model.GetModelRoot();
-  Vector3 rootSize  = rootActor.GetProperty<Vector3>(Dali::Actor::Property::SIZE);
+  Scene3D::ModelNode rootNode = model.GetModelRoot();
+  Vector3            rootSize = rootNode.GetProperty<Vector3>(Dali::Actor::Property::SIZE);
   DALI_TEST_EQUALS(Vector3(2, 2, 1), rootSize, TEST_LOCATION);
 
   END_TEST;
@@ -363,8 +386,8 @@ int UtcDaliModelGetNaturalSize(void)
   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;
 }
@@ -1122,7 +1145,7 @@ int UtcDaliModelCameraGenerate02(void)
     {
       DALI_TEST_EQUALS(lhs.GetProperty<float>(Dali::CameraActor::Property::FIELD_OF_VIEW), rhs.GetProperty<float>(Dali::CameraActor::Property::FIELD_OF_VIEW), TEST_LOCATION);
       // TODO : Open this test when infinity far projection implement.
-      //DALI_TEST_EQUALS(lhs.GetProperty<float>(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), rhs.GetProperty<float>(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), TEST_LOCATION);
+      // DALI_TEST_EQUALS(lhs.GetProperty<float>(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), rhs.GetProperty<float>(Dali::CameraActor::Property::FAR_PLANE_DISTANCE), TEST_LOCATION);
     }
     else
     {
@@ -1327,7 +1350,7 @@ int UtcDaliModelResourceCacheCheck(void)
   DALI_TEST_EQUALS(textureSet2.GetTextureCount(), 9u, TEST_LOCATION);
   DALI_TEST_EQUALS(textureSet3.GetTextureCount(), 9u, TEST_LOCATION);
 
-  for (uint32_t i = 0; i < 7u; i++)
+  for(uint32_t i = 0; i < 7u; i++)
   {
     DALI_TEST_EQUALS(textureSet2.GetTexture(i), textureSet3.GetTexture(i), TEST_LOCATION);
   }
@@ -1338,3 +1361,181 @@ int UtcDaliModelResourceCacheCheck(void)
   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<Vector3>(Dali::Actor::Property::SCALE);
+
+  model.SetProperty(Dali::Actor::Property::SIZE, Vector3(600, 600, 600));
+  Vector3 scale2 = model.GetChildAt(0u).GetProperty<Vector3>(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<Vector3>(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<Vector3>(Dali::Actor::Property::SCALE);
+  DALI_TEST_NOT_EQUALS(scale, scale2, 0.1f, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliModelRetrieveBlendShapeNames(void)
+{
+  tet_infoline(" UtcDaliModelRetrieveBlendShapeByName.");
+
+  ToolkitTestApplication application;
+
+  Scene3D::Model model = Scene3D::Model::New(TEST_GLTF_EXTRAS_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);
+
+  // Get target ModelNode that has extras
+  Scene3D::ModelNode expectNode = model.FindChildModelNodeByName("AnimatedMorphCube");
+
+  // Pair of expected blend shape index from expectNode.
+  std::map<std::string, Scene3D::Loader::BlendShapes::Index> expectBlendShapeNames = {
+    {"Target_0", 0u},
+    {"Target_1", 1u},
+  };
+
+  std::vector<std::string> blendShapeNameList;
+  model.RetrieveBlendShapeNames(blendShapeNameList);
+
+  DALI_TEST_EQUALS(blendShapeNameList.size(), expectBlendShapeNames.size(), TEST_LOCATION);
+  for(auto i = 0u; i < blendShapeNameList.size(); ++i)
+  {
+    const auto& name = blendShapeNameList[i];
+    tet_printf("Check retrieved blendshape name : %s\n", name.c_str());
+
+    const auto& iter = expectBlendShapeNames.find(name);
+    DALI_TEST_CHECK(iter != expectBlendShapeNames.end());
+
+    std::vector<Scene3D::ModelNode> nodeList;
+    model.RetrieveModelNodesByBlendShapeName(name, nodeList);
+    DALI_TEST_EQUALS(nodeList.size(), 1u, TEST_LOCATION);
+    DALI_TEST_EQUALS(nodeList[0], expectNode, TEST_LOCATION);
+    DALI_TEST_EQUALS(nodeList[0].GetBlendShapeIndexByName(name), iter->second, TEST_LOCATION);
+  }
+
+  END_TEST;
+}