Painter gizmos: reset out-of-range paint states at load (#16341)

Supports, seam, fuzzy skin and texture displacement loaded paint data with the default max_ebt, so a 3mf with a paint state above what the gizmo paints read past the 3-entry color table. Each gizmo now passes its highest paint state as max_ebt, as the MMU gizmo already does, and higher states load as unpainted.
This commit is contained in:
Eldenroot
2026-10-14 09:35:27 -05:00
committed by GitHub
parent 16efd3458b
commit 888012c30e
4 changed files with 9 additions and 4 deletions
+2 -1
View File
@@ -644,7 +644,8 @@ void GLGizmoFdmSupports::update_from_model_object(bool first_update)
const TriangleMesh* mesh = &mv->mesh();
m_triangle_selectors.emplace_back(std::make_unique<TriangleSelectorPatch>(*mesh, ebt_colors));
// Reset of TriangleSelector is done inside TriangleSelectorGUI's constructor, so we don't need it to perform it again in deserialize().
m_triangle_selectors.back()->deserialize(mv->supported_facets.get_data(), false);
// The colour table has NONE/ENFORCER/BLOCKER only: a higher state in the file is reset to NONE.
m_triangle_selectors.back()->deserialize(mv->supported_facets.get_data(), false, EnforcerBlockerType::BLOCKER);
m_triangle_selectors.back()->request_update_render_data();
//BBS: add timestamp logic
+2 -1
View File
@@ -397,7 +397,8 @@ void GLGizmoFuzzySkin::update_from_model_object(bool first_update)
const TriangleMesh* mesh = &mv->mesh();
m_triangle_selectors.emplace_back(std::make_unique<TriangleSelectorPatch>(*mesh, ebt_colors));
// Reset of TriangleSelector is done inside TriangleSelectorGUI's constructor, so we don't need it to perform it again in deserialize().
m_triangle_selectors.back()->deserialize(mv->fuzzy_skin_facets.get_data(), false);
// Fuzzy skin paints a single state (FUZZY_SKIN): a higher state in the file is reset to NONE.
m_triangle_selectors.back()->deserialize(mv->fuzzy_skin_facets.get_data(), false, EnforcerBlockerType::FUZZY_SKIN);
m_triangle_selectors.back()->request_update_render_data();
}
}
+3 -1
View File
@@ -1,6 +1,7 @@
#include "GLGizmoSeam.hpp"
#include "libslic3r/Model.hpp"
#include "libslic3r/TriangleSelector.hpp"
//#include "slic3r/GUI/3DScene.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp"
@@ -327,7 +328,8 @@ void GLGizmoSeam::update_from_model_object(bool first_update)
m_triangle_selectors.emplace_back(std::make_unique<TriangleSelectorPatch>(*mesh, ebt_colors));
// Reset of TriangleSelector is done inside TriangleSelectorGUI's constructor, so we don't need it to perform it again in deserialize().
m_triangle_selectors.back()->deserialize(mv->seam_facets.get_data(), false);
// The colour table has NONE/ENFORCER/BLOCKER only: a higher state in the file is reset to NONE.
m_triangle_selectors.back()->deserialize(mv->seam_facets.get_data(), false, EnforcerBlockerType::BLOCKER);
m_triangle_selectors.back()->request_update_render_data();
}
}
@@ -3739,7 +3739,8 @@ void GLGizmoTextureDisplacement::update_from_model_object(bool first_update)
break;
}
m_triangle_selectors.emplace_back(std::make_unique<TriangleSelectorPatch>(*mesh, ebt_colors));
m_triangle_selectors.back()->deserialize(data, false);
// The mask uses a single state (ENFORCER): a higher state in the file is reset to NONE.
m_triangle_selectors.back()->deserialize(data, false, EnforcerBlockerType::ENFORCER);
m_triangle_selectors.back()->request_update_render_data();
}