-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
101 lines (84 loc) · 2.18 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <filesystem>
#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
namespace fs = std::filesystem;
struct MyTraits : public OpenMesh::DefaultTraits
{
typedef OpenMesh::Vec3d Point; // use double-values points
};
typedef OpenMesh::PolyMesh_ArrayKernelT<MyTraits> MyMesh;
void ListDir(const std::string& dir, const std::string& extension, std::vector<std::string>& filelist)
{
for (const auto& entry : fs::directory_iterator(dir))
{
fs::path fPath = entry.path();
if (fs::is_directory(fPath))
{
ListDir(fPath.string(), extension, filelist);
}
if (fs::is_regular_file(fPath))
{
if (fPath.has_extension())
{
if (fPath.extension().string().compare(extension) == 0)
{
filelist.emplace_back(fPath.string());
}
}
}
}
}
int main(int argc, char** argv)
{
std::vector<std::string> filelist;
ListDir(argv[1], ".obj", filelist);
std::vector<MyMesh::Point> main_points;
std::vector<std::vector<size_t>> main_faces;
int last_vert_num = 0;
for (const auto& mesh_name : filelist)
{
std::cout << mesh_name << std::endl;
MyMesh sub_mesh;
OpenMesh::IO::read_mesh(sub_mesh, mesh_name);
for (const auto& v_h : sub_mesh.vertices())
{
main_points.emplace_back(sub_mesh.point(v_h));
}
for (const auto& f_h : sub_mesh.faces())
{
std::vector<size_t> vertex_ids;
for (const auto& fv_h : f_h.vertices())
{
vertex_ids.emplace_back(fv_h.idx() + last_vert_num);
}
main_faces.emplace_back(vertex_ids);
}
last_vert_num = main_points.size();
}
MyMesh main_mesh;
// generate vertices
std::vector<MyMesh::VertexHandle> vhandles;
vhandles.reserve(main_points.size());
for (const auto& main_pt : main_points)
{
vhandles.emplace_back(main_mesh.add_vertex(main_pt));
}
// generate faces
std::vector<MyMesh::VertexHandle> face_vhandles;
for (const auto& main_face : main_faces)
{
face_vhandles.clear();
for (const auto& main_vid : main_face)
{
face_vhandles.push_back(vhandles[main_vid]);
}
main_mesh.add_face(face_vhandles);
}
if (!OpenMesh::IO::write_mesh(main_mesh, argv[2]))
{
std::cerr << "Cannot write mesh !" << std::endl;
return 1;
}
return 0;
}