Performance optimizations and bugfix
This commit is contained in:
parent
3b7ea5587e
commit
d527122046
2 changed files with 16 additions and 3 deletions
|
@ -76,12 +76,20 @@ inline Face facestats(const std::array<Vec3d, 3> &triangle)
|
||||||
inline const Vec3d DOWN = {0., 0., -1.};
|
inline const Vec3d DOWN = {0., 0., -1.};
|
||||||
constexpr double POINTS_PER_UNIT_AREA = 1.;
|
constexpr double POINTS_PER_UNIT_AREA = 1.;
|
||||||
|
|
||||||
|
// The score function for a particular face
|
||||||
inline double get_score(const Face &fc)
|
inline double get_score(const Face &fc)
|
||||||
{
|
{
|
||||||
|
// Simply get the angle (acos of dot product) between the face normal and
|
||||||
|
// the DOWN vector.
|
||||||
double phi = 1. - std::acos(fc.normal.dot(DOWN)) / PI;
|
double phi = 1. - std::acos(fc.normal.dot(DOWN)) / PI;
|
||||||
|
|
||||||
|
// Only consider faces that have have slopes below 90 deg:
|
||||||
phi = phi * (phi > 0.5);
|
phi = phi * (phi > 0.5);
|
||||||
|
|
||||||
|
// Make the huge slopes more significant than the smaller slopes
|
||||||
phi = phi * phi * phi;
|
phi = phi * phi * phi;
|
||||||
|
|
||||||
|
// Multiply with the area of the current face
|
||||||
return fc.area * POINTS_PER_UNIT_AREA * phi;
|
return fc.area * POINTS_PER_UNIT_AREA * phi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,6 +184,8 @@ std::vector<XYRotation> get_chull_rotations(const TriangleMesh &mesh)
|
||||||
{
|
{
|
||||||
TriangleMesh chull = mesh.convex_hull_3d();
|
TriangleMesh chull = mesh.convex_hull_3d();
|
||||||
chull.require_shared_vertices();
|
chull.require_shared_vertices();
|
||||||
|
double chull2d_area = chull.convex_hull().area();
|
||||||
|
double area_threshold = chull2d_area / (scaled<double>(1e3) * scaled(1.));
|
||||||
|
|
||||||
size_t facecount = chull.its.indices.size();
|
size_t facecount = chull.its.indices.size();
|
||||||
auto inputs = reserve_vector<XYRotation>(facecount);
|
auto inputs = reserve_vector<XYRotation>(facecount);
|
||||||
|
@ -183,8 +193,10 @@ std::vector<XYRotation> get_chull_rotations(const TriangleMesh &mesh)
|
||||||
for (size_t fi = 0; fi < facecount; ++fi) {
|
for (size_t fi = 0; fi < facecount; ++fi) {
|
||||||
Face fc = facestats(get_triangle_vertices(chull, fi));
|
Face fc = facestats(get_triangle_vertices(chull, fi));
|
||||||
|
|
||||||
auto q = Eigen::Quaterniond{}.FromTwoVectors(fc.normal, DOWN);
|
if (fc.area > area_threshold) {
|
||||||
inputs.emplace_back(from_transform3d(Transform3d::Identity() * q));
|
auto q = Eigen::Quaterniond{}.FromTwoVectors(fc.normal, DOWN);
|
||||||
|
inputs.emplace_back(from_transform3d(Transform3d::Identity() * q));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return inputs;
|
return inputs;
|
||||||
|
|
|
@ -13,7 +13,8 @@ namespace Slic3r { namespace GUI {
|
||||||
void RotoptimizeJob::process()
|
void RotoptimizeJob::process()
|
||||||
{
|
{
|
||||||
int obj_idx = m_plater->get_selected_object_idx();
|
int obj_idx = m_plater->get_selected_object_idx();
|
||||||
if (obj_idx < 0) { return; }
|
if (obj_idx < 0 || m_plater->sla_print().objects().size() <= obj_idx)
|
||||||
|
return;
|
||||||
|
|
||||||
ModelObject *o = m_plater->model().objects[size_t(obj_idx)];
|
ModelObject *o = m_plater->model().objects[size_t(obj_idx)];
|
||||||
const SLAPrintObject *po = m_plater->sla_print().objects()[size_t(obj_idx)];
|
const SLAPrintObject *po = m_plater->sla_print().objects()[size_t(obj_idx)];
|
||||||
|
|
Loading…
Reference in a new issue