Bug fix to load animation of dli in Model
authorseungho baek <sbsh.baek@samsung.com>
Tue, 3 Jan 2023 06:39:15 +0000 (15:39 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Fri, 6 Jan 2023 03:21:14 +0000 (12:21 +0900)
Change-Id: I5b174ebc7af111993189e41da54a4f627b277b26
Signed-off-by: seungho baek <sbsh.baek@samsung.com>
automated-tests/src/dali-scene3d/utc-Dali-Model.cpp
dali-scene3d/internal/controls/model/model-impl.cpp
dali-scene3d/public-api/loader/scene-definition.cpp

index 02393e3..db7a5e6 100644 (file)
@@ -51,6 +51,7 @@ const char* TEST_GLTF_FILE_NAME                    = TEST_RESOURCE_DIR "/Animate
 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
@@ -829,6 +830,31 @@ int UtcDaliModelAnimation02(void)
   END_TEST;
 }
 
+int UtcDaliModelAnimation03(void)
+{
+  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);
+
+  application.SendNotification();
+  application.Render();
+
+  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 UtcDaliModelMultiplePrimitives(void)
 {
   ToolkitTestApplication application;
index b552489..bed5f34 100644 (file)
@@ -509,8 +509,22 @@ void Model::LoadModel()
 
   if(!animations.empty())
   {
-    auto getActor = [&](const Scene3D::Loader::AnimatedProperty& property) {
-      return mModelRoot.FindChildById(scene.GetNode(property.mNodeIndex)->mNodeId);
+    auto getActor = [&](const Scene3D::Loader::AnimatedProperty& property)
+    {
+      Dali::Actor actor;
+      if(property.mNodeIndex != Scene3D::Loader::INVALID_INDEX)
+      {
+        auto* node = scene.GetNode(property.mNodeIndex);
+        if(node != nullptr)
+        {
+          actor = mModelRoot.FindChildById(node->mNodeId);
+        }
+      }
+      else
+      {
+        actor = mModelRoot.FindChildByName(property.mNodeName);
+      }
+      return actor;
     };
 
     mAnimations.clear();
index 993fcd1..3241769 100644 (file)
@@ -422,7 +422,11 @@ const NodeDefinition* SceneDefinition::GetNode(Index iNode) const
 
 NodeDefinition* SceneDefinition::GetNode(Index iNode)
 {
-  return mNodes[iNode].get();
+  if(iNode != Scene3D::Loader::INVALID_INDEX && iNode < mNodes.size())
+  {
+    return mNodes[iNode].get();
+  }
+  return nullptr;
 }
 
 void SceneDefinition::Visit(Index iNode, const Customization::Choices& choices, NodeDefinition::IVisitor& v)