mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 23:05:52 +08:00
optimize embedding computation
fix seed of random generators set high angle importance for nearest mode
This commit is contained in:
parent
2185b4d514
commit
2bb5ec6e21
@ -687,8 +687,10 @@ void gather_enforcers_blockers(GlobalModelInfo &result, const PrintObject *po) {
|
|||||||
|
|
||||||
struct SeamComparator {
|
struct SeamComparator {
|
||||||
SeamPosition setup;
|
SeamPosition setup;
|
||||||
|
float angle_importance;
|
||||||
SeamComparator(SeamPosition setup) :
|
SeamComparator(SeamPosition setup) :
|
||||||
setup(setup) {
|
setup(setup) {
|
||||||
|
angle_importance = setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Standard comparator, must respect the requirements of comparators (e.g. give same result on same inputs) for sorting usage
|
// Standard comparator, must respect the requirements of comparators (e.g. give same result on same inputs) for sorting usage
|
||||||
@ -734,10 +736,10 @@ struct SeamComparator {
|
|||||||
|
|
||||||
// the penalites are kept close to range [0-1.x] however, it should not be relied upon
|
// the penalites are kept close to range [0-1.x] however, it should not be relied upon
|
||||||
float penalty_a = a.visibility +
|
float penalty_a = a.visibility +
|
||||||
SeamPlacer::angle_importance * compute_angle_penalty(a.local_ccw_angle)
|
angle_importance * compute_angle_penalty(a.local_ccw_angle)
|
||||||
+ distance_penalty_a;
|
+ distance_penalty_a;
|
||||||
float penalty_b = b.visibility +
|
float penalty_b = b.visibility +
|
||||||
SeamPlacer::angle_importance * compute_angle_penalty(b.local_ccw_angle)
|
angle_importance * compute_angle_penalty(b.local_ccw_angle)
|
||||||
+ distance_penalty_b;
|
+ distance_penalty_b;
|
||||||
|
|
||||||
return penalty_a < penalty_b;
|
return penalty_a < penalty_b;
|
||||||
@ -791,9 +793,9 @@ struct SeamComparator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
float penalty_a = a.visibility
|
float penalty_a = a.visibility
|
||||||
+ SeamPlacer::angle_importance * compute_angle_penalty(a.local_ccw_angle);
|
+ angle_importance * compute_angle_penalty(a.local_ccw_angle);
|
||||||
float penalty_b = b.visibility +
|
float penalty_b = b.visibility +
|
||||||
SeamPlacer::angle_importance * compute_angle_penalty(b.local_ccw_angle);
|
angle_importance * compute_angle_penalty(b.local_ccw_angle);
|
||||||
|
|
||||||
return penalty_a <= penalty_b || penalty_a - penalty_b < SeamPlacer::seam_align_score_tolerance;
|
return penalty_a <= penalty_b || penalty_a - penalty_b < SeamPlacer::seam_align_score_tolerance;
|
||||||
}
|
}
|
||||||
@ -1071,9 +1073,14 @@ void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) {
|
for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) {
|
||||||
bool layer_has_multiple_loops =
|
size_t regions_with_perimeter = 0;
|
||||||
layers[layer_idx].points[0].perimeter.end_index
|
for (const LayerRegion *region : po->layers()[layer_idx]->regions()) {
|
||||||
< layers[layer_idx].points.size() - 1;
|
if (region->perimeters.entities.size() > 0) {
|
||||||
|
regions_with_perimeter++;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
bool should_compute_layer_embedding = regions_with_perimeter > 1;
|
||||||
|
layers[layer_idx].points[0].perimeter.end_index < layers[layer_idx].points.size() - 1;
|
||||||
std::unique_ptr<PerimeterDistancer> current_layer_distancer = std::make_unique<PerimeterDistancer>(po->layers()[layer_idx]);
|
std::unique_ptr<PerimeterDistancer> current_layer_distancer = std::make_unique<PerimeterDistancer>(po->layers()[layer_idx]);
|
||||||
|
|
||||||
for (SeamCandidate &perimeter_point : layers[layer_idx].points) {
|
for (SeamCandidate &perimeter_point : layers[layer_idx].points) {
|
||||||
@ -1082,7 +1089,7 @@ void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po)
|
|||||||
perimeter_point.overhang = prev_layer_distancer->distance_from_perimeter(point);
|
perimeter_point.overhang = prev_layer_distancer->distance_from_perimeter(point);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layer_has_multiple_loops) { // search for embedded perimeter points (points hidden inside the print ,e.g. multimaterial join, best position for seam)
|
if (should_compute_layer_embedding) { // search for embedded perimeter points (points hidden inside the print ,e.g. multimaterial join, best position for seam)
|
||||||
perimeter_point.embedded_distance = current_layer_distancer->distance_from_perimeter(point);
|
perimeter_point.embedded_distance = current_layer_distancer->distance_from_perimeter(point);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,8 @@ public:
|
|||||||
static constexpr float overhang_distance_tolerance_factor = 0.5f;
|
static constexpr float overhang_distance_tolerance_factor = 0.5f;
|
||||||
|
|
||||||
// determines angle importance compared to visibility ( neutral value is 1.0f. )
|
// determines angle importance compared to visibility ( neutral value is 1.0f. )
|
||||||
static constexpr float angle_importance = 0.6f;
|
static constexpr float angle_importance_aligned = 0.6f;
|
||||||
|
static constexpr float angle_importance_nearest = 2.0f; // use much higher angle importance for nearest mode, to combat the visiblity info noise
|
||||||
|
|
||||||
// If enforcer or blocker is closer to the seam candidate than this limit, the seam candidate is set to Blocker or Enforcer
|
// If enforcer or blocker is closer to the seam candidate than this limit, the seam candidate is set to Blocker or Enforcer
|
||||||
static constexpr float enforcer_blocker_distance_tolerance = 0.35f;
|
static constexpr float enforcer_blocker_distance_tolerance = 0.35f;
|
||||||
|
@ -79,7 +79,7 @@ void its_short_edge_collpase(indexed_triangle_set &mesh, size_t target_triangle_
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::mt19937_64 generator { }; // default constant seed! so that results are deterministic
|
std::mt19937_64 generator { 27644437 };// default constant seed! so that results are deterministic
|
||||||
std::vector<size_t> face_indices(mesh.indices.size());
|
std::vector<size_t> face_indices(mesh.indices.size());
|
||||||
for (size_t idx = 0; idx < face_indices.size(); ++idx) {
|
for (size_t idx = 0; idx < face_indices.size(); ++idx) {
|
||||||
face_indices[idx] = idx;
|
face_indices[idx] = idx;
|
||||||
|
@ -28,7 +28,7 @@ TriangleSetSamples sample_its_uniform_parallel(size_t samples_count, const index
|
|||||||
area_sum_to_triangle_idx[area_sum] = t_idx;
|
area_sum_to_triangle_idx[area_sum] = t_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::mt19937_64 mersenne_engine { };
|
std::mt19937_64 mersenne_engine { 27644437 };
|
||||||
// random numbers on interval [0, 1)
|
// random numbers on interval [0, 1)
|
||||||
std::uniform_real_distribution<double> fdistribution;
|
std::uniform_real_distribution<double> fdistribution;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user