28template <
typename T,
int D>
29struct foreach_hmatrix_mult
38 foreach_hmatrix_mult (MatrixType
const& matrix, ValueType
const& value)
39 : mat(matrix), val(value) {}
40 void operator() (VectorType& vec) { vec = mat.mult(vec, val); }
49 throw std::invalid_argument(
"Null mesh given");
56 std::for_each(verts.begin(), verts.end(), func);
57 std::for_each(fnorm.begin(), fnorm.end(), func);
58 std::for_each(vnorm.begin(), vnorm.end(), func);
67 throw std::invalid_argument(
"Null mesh given");
73 foreach_hmatrix_mult<float, 4> vfunc(trans, 1.0f);
74 foreach_hmatrix_mult<float, 4> nfunc(trans, 0.0f);
75 std::for_each(verts.begin(), verts.end(), vfunc);
76 std::for_each(fnorm.begin(), fnorm.end(), nfunc);
77 std::for_each(vnorm.begin(), vnorm.end(), nfunc);
103 verts2.reserve(verts1.size() + verts2.size());
104 color2.reserve(color1.size() + color2.size());
105 confs2.reserve(confs1.size() + confs2.size());
106 values2.reserve(values1.size() + values2.size());
107 vnorm2.reserve(vnorm1.size() + vnorm2.size());
108 vtex2.reserve(vtex1.size() + vtex2.size());
109 fnorm2.reserve(fnorm1.size() + fnorm2.size());
110 faces2.reserve(faces1.size() + faces2.size());
112 std::size_t
const offset = verts2.size();
113 verts2.insert(verts2.end(), verts1.begin(), verts1.end());
114 color2.insert(color2.end(), color1.begin(), color1.end());
115 confs2.insert(confs2.end(), confs1.begin(), confs1.end());
116 values2.insert(values2.end(), values1.begin(), values1.end());
117 vnorm2.insert(vnorm2.end(), vnorm1.begin(), vnorm1.end());
118 vtex2.insert(vtex2.end(), vtex1.begin(), vtex1.end());
119 fnorm2.insert(fnorm2.end(), fnorm1.begin(), fnorm1.end());
121 for (std::size_t i = 0; i < faces1.size(); ++i)
122 faces2.push_back(faces1[i] + offset);
131 std::size_t
const num_vertices = mesh->get_vertices().size();
132 std::vector<int> component_per_vertex(num_vertices, -1);
133 int current_component = 0;
134 for (std::size_t i = 0; i < num_vertices; ++i)
137 if (component_per_vertex[i] >= 0)
141 std::list<std::size_t> queue;
143 while (!queue.empty())
145 std::size_t vid = queue.front();
149 if (component_per_vertex[vid] >= 0)
151 component_per_vertex[vid] = current_component;
155 queue.insert(queue.end(), adj_verts.begin(), adj_verts.end());
157 current_component += 1;
162 std::vector<std::size_t> components_size(current_component, 0);
163 for (std::size_t i = 0; i < component_per_vertex.size(); ++i)
164 components_size[component_per_vertex[i]] += 1;
168 for (std::size_t i = 0; i < component_per_vertex.size(); ++i)
169 if (components_size[component_per_vertex[i]] <= vertex_threshold)
170 delete_list[i] =
true;
173 mesh->delete_vertices_fix_faces(delete_list);
182 throw std::invalid_argument(
"Null mesh given");
186 if (verts.empty() || (!scale && !center))
190 math::Vec3f min(std::numeric_limits<float>::max());
191 math::Vec3f max(-std::numeric_limits<float>::max());
192 for (std::size_t i = 0; i < verts.size(); ++i)
193 for (std::size_t j = 0; j < 3; ++j)
195 min[j] = std::min(min[j], verts[i][j]);
196 max[j] = std::max(max[j], verts[i][j]);
203 float max_xyz = sizes.
maximum();
208 for (std::size_t i = 0; i < verts.size(); ++i)
209 verts[i] = (verts[i] - move) / max_xyz;
211 else if (scale && !center)
213 for (std::size_t i = 0; i < verts.size(); ++i)
216 else if (!scale && center)
218 for (std::size_t i = 0; i < verts.size(); ++i)
229 throw std::invalid_argument(
"Null mesh given");
233 for (std::size_t i = 0; i < faces.size(); i += 3)
235 mesh->recalc_normals(
true,
true);
245 throw std::invalid_argument(
"Null mesh given");
249 throw std::invalid_argument(
"Mesh without vertices given");
251 aabb_min =
math::Vec3f(std::numeric_limits<float>::max());
252 aabb_max =
math::Vec3f(-std::numeric_limits<float>::max());
253 for (std::size_t i = 0; i < verts.size(); ++i)
254 for (
int j = 0; j < 3; ++j)
256 if (verts[i][j] < aabb_min[j])
257 aabb_min[j] = verts[i][j];
258 if (verts[i][j] > aabb_max[j])
259 aabb_max[j] = verts[i][j];
269 throw std::invalid_argument(
"Null mesh given");
273 std::size_t num_deleted = 0;
274 for (std::size_t i = 0; i < mesh_info.
size(); ++i)
276 if (mesh_info[i].vclass == MeshInfo::VERTEX_CLASS_UNREF)
283 mesh->delete_vertices_fix_faces(dlist);
Matrix class for arbitrary dimensions and types.
Vector class for arbitrary dimensions and types.
T maximum(void) const
Returns the largest element in the vector.
std::vector< math::Vec3f > VertexList
std::vector< float > ConfidenceList
std::vector< math::Vec4f > ColorList
std::vector< float > ValueList
std::vector< std::size_t > AdjacentVertices
std::size_t size(void) const
std::vector< math::Vec3f > NormalList
std::vector< bool > DeleteList
std::vector< math::Vec2f > TexCoordList
std::shared_ptr< TriangleMesh > Ptr
std::vector< VertexID > FaceList
std::shared_ptr< TriangleMesh const > ConstPtr
#define MVE_NAMESPACE_BEGIN
#define MVE_NAMESPACE_END
#define MVE_GEOM_NAMESPACE_END
#define MVE_GEOM_NAMESPACE_BEGIN
void mesh_transform(mve::TriangleMesh::Ptr mesh, math::Matrix3f const &rot)
Transforms the vertices and normals of the mesh using the specified rotation matrix.
void mesh_invert_faces(TriangleMesh::Ptr mesh)
Inverts the orientation of all faces in the mesh.
std::size_t mesh_delete_unreferenced(TriangleMesh::Ptr mesh)
Cleans unreferenced vertices from the mesh.
void mesh_components(TriangleMesh::Ptr mesh, std::size_t vertex_threshold)
Discards isolated components with a vertex count below a threshold.
void mesh_find_aabb(TriangleMesh::ConstPtr mesh, math::Vec3f &aabb_min, math::Vec3f &aabb_max)
Calculates the mesh axis-aligned bounding box (AABB).
void mesh_scale_and_center(TriangleMesh::Ptr mesh, bool scale, bool center)
Scales the mesh such that it fits into a cube with length 1 and centers the mesh in the coordinate or...
void mesh_merge(TriangleMesh::ConstPtr mesh1, TriangleMesh::Ptr mesh2)
Merges the first given mesh with the second one, modifying the second one.
void swap(mve::Image< T > &a, mve::Image< T > &b)
Specialization of std::swap for efficient image swapping.
for-each functor: matrix-vector multiplication.