Support extended triangle paint states up to 32

Extend TriangleSelector serialization to encode leaf facet paint states up to 32 by adding an escaped second nibble (12-bit path: wwwwzzzzxxyy). Implemented a push_nibble helper and an extended-prefix (0b1110) to signal the extra nibble. Updated deserialize, update_used_states and has_facets to decode the new format while preserving legacy behavior for 3..16. Adjusted asserts and state handling accordingly. Added a unit test and include for TriangleSelector to verify round-trip of paint states above 16.
This commit is contained in:
Ian Bassi
2026-05-31 11:54:32 -03:00
parent 9670da7ddd
commit 84c7186674
2 changed files with 73 additions and 14 deletions

View File

@@ -5,6 +5,7 @@
#include "libslic3r/MixedFilament.hpp"
#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Print.hpp"
#include "libslic3r/TriangleSelector.hpp"
#include "libslic3r/GCode/ToolOrdering.hpp"
#include <algorithm>
@@ -126,6 +127,21 @@ TEST_CASE("Mixed filament remap follows stable row ids when same-pair rows reord
CHECK(remap[4] == new_second_custom_virtual_id);
}
TEST_CASE("TriangleSelector round-trips paint states above 16", "[MixedFilament][TriangleSelector]")
{
TriangleMesh mesh = make_cube(20., 20., 20.);
TriangleSelector source(mesh);
source.set_facet(0, EnforcerBlockerType::Extruder32);
const TriangleSelector::TriangleSplittingData serialized = source.serialize();
REQUIRE(TriangleSelector::has_facets(serialized, EnforcerBlockerType::Extruder32));
TriangleSelector restored(mesh);
restored.deserialize(serialized, true, EnforcerBlockerType::ExtruderMax);
CHECK(restored.has_facets(EnforcerBlockerType::Extruder32));
}
TEST_CASE("Mixed filament remap keeps later painted colors stable when an earlier mixed row is deleted", "[MixedFilament]")
{
PresetBundle bundle;