Fix negative volume with no convex hull

This commit is contained in:
Filip Sykala 2021-11-25 15:48:10 +01:00
parent 1e719bab26
commit b82b23ee13

View File

@ -40,17 +40,34 @@ Points CameraUtils::project(const Camera & camera,
Slic3r::Polygon CameraUtils::create_hull2d(const Camera & camera, Slic3r::Polygon CameraUtils::create_hull2d(const Camera & camera,
const GLVolume &volume) const GLVolume &volume)
{ {
// TODO: fix Negative volume doesnt have convex hull std::vector<Vec3d> vertices;
const TriangleMesh *hull = volume.convex_hull(); const TriangleMesh *hull = volume.convex_hull();
assert(hull != nullptr); if (hull != nullptr) {
const indexed_triangle_set &its = hull->its; const indexed_triangle_set &its = hull->its;
const Transform3d & trafoMat = vertices.reserve(its.vertices.size());
// cast vector
for (const Vec3f &vertex : its.vertices)
vertices.emplace_back(vertex.cast<double>());
} else {
// Negative volume doesn't have convex hull so use bounding box
auto bb = volume.bounding_box();
Vec3d &min = bb.min;
Vec3d &max = bb.max;
vertices = {min,
Vec3d(min.x(), min.y(), max.z()),
Vec3d(min.x(), max.y(), min.z()),
Vec3d(min.x(), max.y(), max.z()),
Vec3d(max.x(), min.y(), min.z()),
Vec3d(max.x(), min.y(), max.z()),
Vec3d(max.x(), max.y(), min.z()),
max};
}
const Transform3d &trafoMat =
volume.get_instance_transformation().get_matrix() * volume.get_instance_transformation().get_matrix() *
volume.get_volume_transformation().get_matrix(); volume.get_volume_transformation().get_matrix();
std::vector<Vec3d> vertices; for (Vec3d &vertex : vertices)
vertices.reserve(its.vertices.size()); vertex = trafoMat * vertex.cast<double>();
for (const Vec3f &vertex : its.vertices)
vertices.emplace_back(trafoMat * vertex.cast<double>());
Points vertices_2d = project(camera, vertices); Points vertices_2d = project(camera, vertices);
return Geometry::convex_hull(vertices_2d); return Geometry::convex_hull(vertices_2d);