From b82b23ee1305756672de40c7cee3b00500d84ea1 Mon Sep 17 00:00:00 2001 From: Filip Sykala Date: Thu, 25 Nov 2021 15:48:10 +0100 Subject: [PATCH] Fix negative volume with no convex hull --- src/slic3r/GUI/CameraUtils.cpp | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/CameraUtils.cpp b/src/slic3r/GUI/CameraUtils.cpp index e39b062101..c4b54677af 100644 --- a/src/slic3r/GUI/CameraUtils.cpp +++ b/src/slic3r/GUI/CameraUtils.cpp @@ -40,17 +40,34 @@ Points CameraUtils::project(const Camera & camera, Slic3r::Polygon CameraUtils::create_hull2d(const Camera & camera, const GLVolume &volume) { - // TODO: fix Negative volume doesnt have convex hull + std::vector vertices; const TriangleMesh *hull = volume.convex_hull(); - assert(hull != nullptr); - const indexed_triangle_set &its = hull->its; - const Transform3d & trafoMat = + if (hull != nullptr) { + const indexed_triangle_set &its = hull->its; + vertices.reserve(its.vertices.size()); + // cast vector + for (const Vec3f &vertex : its.vertices) + vertices.emplace_back(vertex.cast()); + } 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_volume_transformation().get_matrix(); - std::vector vertices; - vertices.reserve(its.vertices.size()); - for (const Vec3f &vertex : its.vertices) - vertices.emplace_back(trafoMat * vertex.cast()); + for (Vec3d &vertex : vertices) + vertex = trafoMat * vertex.cast(); Points vertices_2d = project(camera, vertices); return Geometry::convex_hull(vertices_2d);