tesseract_urdf_mesh_material_unit.cpp
Go to the documentation of this file.
3 #include <gtest/gtest.h>
4 #include <Eigen/Geometry>
6 
7 #include <tesseract_urdf/mesh.h>
12 
13 TEST(TesseractURDFUnit, parse_mesh_material_dae) // NOLINT
14 {
16  const bool global_make_convex = false;
17  const auto parse_mesh_fn =
18  [&](const tinyxml2::XMLElement* xml_element, const tesseract_common::ResourceLocator& locator, bool visual) {
19  return tesseract_urdf::parseMesh(xml_element, locator, visual, global_make_convex);
20  };
21 
22  {
23  std::string str = R"(<mesh filename="package://tesseract_support/meshes/tesseract_material_mesh.dae"/>)";
24  std::vector<tesseract_geometry::PolygonMesh::Ptr> meshes;
25  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
26  meshes, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
27  EXPECT_TRUE(meshes.size() == 4);
28  auto& mesh0 = meshes[1];
29  auto& mesh1 = meshes[2];
30  auto& mesh2 = meshes[3];
31  auto& mesh3 = meshes[0];
32 
33  EXPECT_EQ(mesh0->getFaceCount(), 34);
34  EXPECT_EQ(mesh0->getVertexCount(), 68);
35  EXPECT_EQ(mesh1->getFaceCount(), 15);
36  EXPECT_EQ(mesh1->getVertexCount(), 17);
37  EXPECT_EQ(mesh2->getFaceCount(), 15);
38  EXPECT_EQ(mesh2->getVertexCount(), 17);
39  EXPECT_EQ(mesh3->getFaceCount(), 2);
40  EXPECT_EQ(mesh3->getVertexCount(), 4);
41 
42  auto mesh0_normals = mesh0->getNormals();
43  ASSERT_TRUE(mesh0_normals != nullptr);
44  EXPECT_EQ(mesh0_normals->size(), 68);
45  auto mesh1_normals = mesh1->getNormals();
46  ASSERT_TRUE(mesh1_normals != nullptr);
47  EXPECT_EQ(mesh1_normals->size(), 17);
48  auto mesh2_normals = mesh2->getNormals();
49  ASSERT_TRUE(mesh2_normals != nullptr);
50  EXPECT_EQ(mesh2_normals->size(), 17);
51  auto mesh3_normals = mesh3->getNormals();
52  ASSERT_TRUE(mesh3_normals != nullptr);
53  EXPECT_EQ(mesh3_normals->size(), 4);
54 
55  auto mesh0_material = mesh0->getMaterial();
56  EXPECT_TRUE(mesh0_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.7, 0.7, 0.7, 1), 0.01));
57  EXPECT_NEAR(mesh0_material->getMetallicFactor(), 0.0, 0.01);
58  EXPECT_NEAR(mesh0_material->getRoughnessFactor(), 0.5, 0.01);
59  EXPECT_TRUE(mesh0_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
60 
61  auto mesh1_material = mesh1->getMaterial();
62  EXPECT_TRUE(mesh1_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.8, 0, 0, 1), 0.01));
63  EXPECT_NEAR(mesh1_material->getMetallicFactor(), 0.0, 0.01);
64  EXPECT_NEAR(mesh1_material->getRoughnessFactor(), 0.5, 0.01);
65  EXPECT_TRUE(mesh1_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
66 
67  auto mesh2_material = mesh2->getMaterial();
68  EXPECT_TRUE(mesh2_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.05, 0.8, 0.05, 1), 0.01));
69  EXPECT_NEAR(mesh2_material->getMetallicFactor(), 0.0, 0.01);
70  EXPECT_NEAR(mesh2_material->getRoughnessFactor(), 0.5, 0.01);
71  EXPECT_TRUE(mesh2_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0.1, 0.1, 0.5, 1), 0.01));
72 
73  auto mesh3_material = mesh3->getMaterial();
74  EXPECT_TRUE(mesh3_material->getBaseColorFactor().isApprox(Eigen::Vector4d(1, 1, 1, 1), 0.01));
75  EXPECT_NEAR(mesh3_material->getMetallicFactor(), 0, 0.01);
76  EXPECT_NEAR(mesh3_material->getRoughnessFactor(), 0.5, 0.01);
77  EXPECT_TRUE(mesh3_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
78 
79  EXPECT_TRUE(mesh0->getTextures() == nullptr);
80  EXPECT_TRUE(mesh1->getTextures() == nullptr);
81  EXPECT_TRUE(mesh2->getTextures() == nullptr);
82 
83  ASSERT_TRUE(mesh3->getTextures() != nullptr);
84  ASSERT_EQ(mesh3->getTextures()->size(), 1);
85 
86  auto texture = mesh3->getTextures()->at(0);
87  EXPECT_EQ(texture->getTextureImage()->getResourceContents().size(), 38212);
88  EXPECT_EQ(texture->getUVs()->size(), 4);
89  }
90 }
91 
92 #ifdef TESSERACT_ASSIMP_USE_PBRMATERIAL
93 TEST(TesseractURDFUnit, parse_mesh_material_gltf2) // NOLINT
94 {
96  const bool global_make_convex = false;
97  const auto parse_mesh_fn =
98  [&](const tinyxml2::XMLElement* xml_element, const tesseract_common::ResourceLocator& locator, bool visual) {
99  return tesseract_urdf::parseMesh(xml_element, locator, visual, global_make_convex);
100  };
101 
102  {
103  std::string str = R"(<mesh filename="package://tesseract_support/meshes/tesseract_material_mesh.glb"/>)";
104  std::vector<tesseract_geometry::PolygonMesh::Ptr> meshes;
105  EXPECT_TRUE(runTest<std::vector<tesseract_geometry::PolygonMesh::Ptr>>(
106  meshes, parse_mesh_fn, str, tesseract_urdf::MESH_ELEMENT_NAME.data(), resource_locator, true));
107  EXPECT_TRUE(meshes.size() == 4);
108  auto& mesh0 = meshes[0];
109  auto& mesh1 = meshes[1];
110  auto& mesh2 = meshes[2];
111  auto& mesh3 = meshes[3];
112 
113  EXPECT_EQ(mesh0->getFaceCount(), 34);
114  EXPECT_EQ(mesh0->getVertexCount(), 68);
115  EXPECT_EQ(mesh1->getFaceCount(), 15);
116  EXPECT_EQ(mesh1->getVertexCount(), 17);
117  EXPECT_EQ(mesh2->getFaceCount(), 15);
118  EXPECT_EQ(mesh2->getVertexCount(), 17);
119  EXPECT_EQ(mesh3->getFaceCount(), 2);
120  EXPECT_EQ(mesh3->getVertexCount(), 4);
121 
122  auto mesh0_normals = mesh0->getNormals();
123  ASSERT_TRUE(mesh0_normals != nullptr);
124  EXPECT_EQ(mesh0_normals->size(), 68);
125  auto mesh1_normals = mesh1->getNormals();
126  ASSERT_TRUE(mesh1_normals != nullptr);
127  EXPECT_EQ(mesh1_normals->size(), 17);
128  auto mesh2_normals = mesh2->getNormals();
129  ASSERT_TRUE(mesh2_normals != nullptr);
130  EXPECT_EQ(mesh2_normals->size(), 17);
131  auto mesh3_normals = mesh3->getNormals();
132  ASSERT_TRUE(mesh3_normals != nullptr);
133  EXPECT_EQ(mesh3_normals->size(), 4);
134 
135  auto mesh0_material = mesh0->getMaterial();
136  EXPECT_TRUE(mesh0_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.7, 0.7, 0.7, 1), 0.01));
137  EXPECT_NEAR(mesh0_material->getMetallicFactor(), 0.0, 0.01);
138  EXPECT_NEAR(mesh0_material->getRoughnessFactor(), 0.5, 0.01);
139  EXPECT_TRUE(mesh0_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
140 
141  auto mesh1_material = mesh1->getMaterial();
142  EXPECT_TRUE(mesh1_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.8, 0, 0, 1), 0.01));
143  EXPECT_NEAR(mesh1_material->getMetallicFactor(), 0.8, 0.01);
144  EXPECT_NEAR(mesh1_material->getRoughnessFactor(), 0.1, 0.01);
145  EXPECT_TRUE(mesh1_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
146 
147  auto mesh2_material = mesh2->getMaterial();
148  EXPECT_TRUE(mesh2_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.05, 0.8, 0.05, 1), 0.01));
149  EXPECT_NEAR(mesh2_material->getMetallicFactor(), 0.9, 0.01);
150  EXPECT_NEAR(mesh2_material->getRoughnessFactor(), 0.7, 0.01);
151  EXPECT_TRUE(mesh2_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0.1, 0.1, 0.5, 1), 0.01));
152 
153  auto mesh3_material = mesh3->getMaterial();
154  EXPECT_TRUE(mesh3_material->getBaseColorFactor().isApprox(Eigen::Vector4d(1, 1, 1, 1), 0.01));
155  EXPECT_NEAR(mesh3_material->getMetallicFactor(), 0, 0.01);
156  EXPECT_NEAR(mesh3_material->getRoughnessFactor(), 0.5, 0.01);
157  EXPECT_TRUE(mesh3_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
158 
159  EXPECT_TRUE(mesh0->getTextures() == nullptr);
160  EXPECT_TRUE(mesh1->getTextures() == nullptr);
161  EXPECT_TRUE(mesh2->getTextures() == nullptr);
162 
163  ASSERT_TRUE(mesh3->getTextures() != nullptr);
164  ASSERT_EQ(mesh3->getTextures()->size(), 1);
165 
166  auto texture = mesh3->getTextures()->at(0);
167  EXPECT_EQ(texture->getTextureImage()->getResourceContents().size(), 38212);
168  EXPECT_EQ(texture->getUVs()->size(), 4);
169  }
170 }
171 #endif
mesh.h
resource_locator.h
tesseract_urdf::MESH_ELEMENT_NAME
static constexpr std::string_view MESH_ELEMENT_NAME
Definition: mesh.h:47
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
EXPECT_TRUE
#define EXPECT_TRUE(args)
tesseract_urdf_common_unit.h
runTest
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH TESSERACT_COMMON_IGNORE_WARNINGS_POP bool runTest(ElementType &type, std::function< ElementType(const tinyxml2::XMLElement *)> func, const std::string &xml_string, const std::string &element_name)
Definition: tesseract_urdf_common_unit.h:21
EXPECT_NEAR
#define EXPECT_NEAR(a, b, prec)
tesseract_common::ResourceLocator
mesh.h
Parse mesh from xml string.
TESSERACT_COMMON_IGNORE_WARNINGS_POP
TEST
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH TESSERACT_COMMON_IGNORE_WARNINGS_POP TEST(TesseractURDFUnit, parse_mesh_material_dae)
Definition: tesseract_urdf_mesh_material_unit.cpp:13
tesseract_common::GeneralResourceLocator
macros.h
mesh_material.h
EXPECT_EQ
#define EXPECT_EQ(a, b)
tesseract_urdf::parseMesh
std::vector< std::shared_ptr< tesseract_geometry::PolygonMesh > > parseMesh(const tinyxml2::XMLElement *xml_element, const tesseract_common::ResourceLocator &locator, bool visual, bool make_convex)
Parse xml element mesh.
Definition: mesh.cpp:47


tesseract_urdf
Author(s): Levi Armstrong
autogenerated on Thu Apr 24 2025 03:10:44