Forced recomputation of seed fill selected areas when the seed fill angle is changed by ALT+mouse wheel.
This commit is contained in:
parent
cf2a7f4dfa
commit
666cdeecd9
@ -178,12 +178,12 @@ void TriangleSelector::select_patch(const Vec3f& hit, int facet_start,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TriangleSelector::seed_fill_select_triangles(const Vec3f &hit, int facet_start, float seed_fill_angle)
|
void TriangleSelector::seed_fill_select_triangles(const Vec3f &hit, int facet_start, float seed_fill_angle, bool force_reselection)
|
||||||
{
|
{
|
||||||
assert(facet_start < m_orig_size_indices);
|
assert(facet_start < m_orig_size_indices);
|
||||||
|
|
||||||
// Recompute seed fill only if the cursor is pointing on facet unselected by seed fill.
|
// Recompute seed fill only if the cursor is pointing on facet unselected by seed fill.
|
||||||
if (int start_facet_idx = select_unsplit_triangle(hit, facet_start); start_facet_idx >= 0 && m_triangles[start_facet_idx].is_selected_by_seed_fill())
|
if (int start_facet_idx = select_unsplit_triangle(hit, facet_start); start_facet_idx >= 0 && m_triangles[start_facet_idx].is_selected_by_seed_fill() && !force_reselection)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this->seed_fill_unselect_all_triangles();
|
this->seed_fill_unselect_all_triangles();
|
||||||
@ -278,7 +278,7 @@ void TriangleSelector::append_touching_subtriangles(int itriangle, int vertexi,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
auto process_subtriangle = [this, &itriangle, &vertexi, &vertexj, &touching_subtriangles_out](const int subtriangle_idx, Partition partition) -> void {
|
auto process_subtriangle = [this, &itriangle, &vertexi, &vertexj, &touching_subtriangles_out](const int subtriangle_idx, Partition partition) -> void {
|
||||||
assert(subtriangle_idx == -1);
|
assert(subtriangle_idx != -1);
|
||||||
if (!m_triangles[subtriangle_idx].is_split())
|
if (!m_triangles[subtriangle_idx].is_split())
|
||||||
touching_subtriangles_out.emplace_back(subtriangle_idx);
|
touching_subtriangles_out.emplace_back(subtriangle_idx);
|
||||||
else if (int midpoint = this->triangle_midpoint(itriangle, vertexi, vertexj); midpoint != -1)
|
else if (int midpoint = this->triangle_midpoint(itriangle, vertexi, vertexj); midpoint != -1)
|
||||||
@ -312,7 +312,7 @@ void TriangleSelector::bucket_fill_select_triangles(const Vec3f& hit, int facet_
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto get_all_touching_triangles = [this](int facet_idx, const Vec3i &neighbors, const Vec3i &neighbors_propagated) -> std::vector<int> {
|
auto get_all_touching_triangles = [this](int facet_idx, const Vec3i &neighbors, const Vec3i &neighbors_propagated) -> std::vector<int> {
|
||||||
assert(facet_idx != -1 && facet_idx < m_triangles.size());
|
assert(facet_idx != -1 && facet_idx < int(m_triangles.size()));
|
||||||
assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors));
|
assert(this->verify_triangle_neighbors(m_triangles[facet_idx], neighbors));
|
||||||
std::vector<int> touching_triangles;
|
std::vector<int> touching_triangles;
|
||||||
Vec3i vertices = {m_triangles[facet_idx].verts_idxs[0], m_triangles[facet_idx].verts_idxs[1], m_triangles[facet_idx].verts_idxs[2]};
|
Vec3i vertices = {m_triangles[facet_idx].verts_idxs[0], m_triangles[facet_idx].verts_idxs[1], m_triangles[facet_idx].verts_idxs[2]};
|
||||||
|
@ -49,7 +49,8 @@ public:
|
|||||||
|
|
||||||
void seed_fill_select_triangles(const Vec3f &hit, // point where to start
|
void seed_fill_select_triangles(const Vec3f &hit, // point where to start
|
||||||
int facet_start, // facet of the original mesh (unsplit) that the hit point belongs to
|
int facet_start, // facet of the original mesh (unsplit) that the hit point belongs to
|
||||||
float seed_fill_angle); // the maximal angle between two facets to be painted by the same color
|
float seed_fill_angle, // the maximal angle between two facets to be painted by the same color
|
||||||
|
bool force_reselection = false); // force reselection of the triangle mesh even in cases that mouse is pointing on the selected triangle
|
||||||
|
|
||||||
void bucket_fill_select_triangles(const Vec3f &hit, // point where to start
|
void bucket_fill_select_triangles(const Vec3f &hit, // point where to start
|
||||||
int facet_start, // facet of the original mesh (unsplit) that the hit point belongs to
|
int facet_start, // facet of the original mesh (unsplit) that the hit point belongs to
|
||||||
|
@ -292,6 +292,11 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
|
|||||||
m_seed_fill_angle = action == SLAGizmoEventType::MouseWheelDown ? std::max(m_seed_fill_angle - SeedFillAngleStep, SeedFillAngleMin)
|
m_seed_fill_angle = action == SLAGizmoEventType::MouseWheelDown ? std::max(m_seed_fill_angle - SeedFillAngleStep, SeedFillAngleMin)
|
||||||
: std::min(m_seed_fill_angle + SeedFillAngleStep, SeedFillAngleMax);
|
: std::min(m_seed_fill_angle + SeedFillAngleStep, SeedFillAngleMax);
|
||||||
m_parent.set_as_dirty();
|
m_parent.set_as_dirty();
|
||||||
|
if (m_rr.mesh_id != -1) {
|
||||||
|
m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), m_seed_fill_angle, true);
|
||||||
|
m_triangle_selectors[m_rr.mesh_id]->request_update_render_data();
|
||||||
|
m_seed_fill_last_mesh_id = m_rr.mesh_id;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user