Fixed ColliderMesh issue for NUI 14/302114/3
authorAdam Bialogonski <adam.b@samsung.com>
Thu, 30 Nov 2023 10:27:06 +0000 (10:27 +0000)
committerAdam Bialogonski <adam.b@samsung.com>
Thu, 30 Nov 2023 12:45:19 +0000 (12:45 +0000)
The collider mesh was not registered correctly upon adding the node to the Model.

Change-Id: Id9ca71070d892017915f610b79c4ab13447b7d51
Signed-off-by: Adam Bialogonski <adam.b@samsung.com>
automated-tests/src/dali-scene3d/utc-Dali-NavigationMesh.cpp
dali-scene3d/internal/controls/model/model-impl.cpp
dali-scene3d/internal/model-components/model-node-impl.h

index 5df30be..b2ccb7f 100644 (file)
@@ -813,3 +813,43 @@ int UtcDaliColliderMeshModelNodeSetup(void)
 
   END_TEST;
 }
+
+int UtcDaliColliderMeshModelNodeRemoveModelNode(void)
+{
+  tet_infoline("UtcDaliColliderMeshModelNodeRemoveModelNode: Test removing model node when there is collider mesh attached");
+
+  ToolkitTestApplication   application;
+  Dali::Scene3D::ModelNode node  = Dali::Scene3D::ModelNode::New();
+  Dali::Scene3D::Model     model = Dali::Scene3D::Model::New();
+  model.AddModelNode(node);
+
+  application.GetWindow().Add(model);
+  application.SendNotification();
+  application.Render();
+
+  auto colliderMesh = NavigationMeshFactory::CreateFromBuffer(GetTestColliderMesh(0));
+
+  // Redundant setup test
+  DALI_TEST_EQUALS(node.HasColliderMesh(), false, TEST_LOCATION);
+  node.SetColliderMesh(nullptr);
+  DALI_TEST_EQUALS(node.HasColliderMesh(), false, TEST_LOCATION);
+  node.SetColliderMesh(std::move(colliderMesh));
+  DALI_TEST_EQUALS(node.HasColliderMesh(), true, TEST_LOCATION);
+
+  model.RemoveModelNode(node);
+  DALI_TEST_EQUALS(node.HasColliderMesh(), true, TEST_LOCATION);
+
+  // Reset collider mesh
+  node.SetColliderMesh(nullptr);
+  DALI_TEST_EQUALS(node.HasColliderMesh(), false, TEST_LOCATION);
+
+  auto colliderMesh1 = NavigationMeshFactory::CreateFromBuffer(GetTestColliderMesh(0));
+
+  node.SetColliderMesh(std::move(colliderMesh1));
+  DALI_TEST_EQUALS(node.HasColliderMesh(), true, TEST_LOCATION);
+
+  model.AddModelNode(node);
+  DALI_TEST_EQUALS(node.HasColliderMesh(), true, TEST_LOCATION);
+
+  END_TEST;
+}
\ No newline at end of file
index 0171b1e..d2b1e9f 100644 (file)
@@ -313,11 +313,12 @@ void Model::AddModelNode(Scene3D::ModelNode modelNode)
     UpdateImageBasedLightScaleFactor();
   }
 
-  GetImplementation(modelNode).SetRootModel(*this);
+  GetImplementation(modelNode).SetRootModel(this);
 
   // If model has a collider mesh set, add it to the container
   if(modelNode.HasColliderMesh())
   {
+    RegisterColliderMesh(modelNode, modelNode.GetColliderMesh());
     Scene3D::ColliderMeshProcessor::Get().ColliderMeshChanged(Scene3D::Model::DownCast(Self()));
   }
 
@@ -353,6 +354,7 @@ void Model::RemoveModelNode(Scene3D::ModelNode modelNode)
   if(modelNode.HasColliderMesh())
   {
     RemoveColliderMesh(modelNode);
+    GetImplementation(modelNode).SetRootModel(nullptr);
   }
 
   if(mModelRoot)
index 35f1c12..f36e218 100644 (file)
@@ -306,11 +306,11 @@ public: // Public Method
 
   /**
   * @brief Sets a root model for the ModelNode
-  * @param[in] model Valid Model to set
+  * @param[in] model Valid Model or nullptr to disconnect node from tree
   */
-  void SetRootModel(Dali::Scene3D::Internal::Model& model)
+  void SetRootModel(Dali::Scene3D::Internal::Model* model)
   {
-    mParentModel = &model;
+    mParentModel = model;
   }
 
 private: