mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-22 19:50:44 +00:00
feat: Add Z Anti-Aliasing (ZAA) contouring support
Port Z Anti-Aliasing from BambuStudio-ZAA (https://github.com/adob/BambuStudio-ZAA) to OrcaSlicer. ZAA eliminates stair-stepping on curved and sloped top surfaces by raycasting each extrusion point against the original 3D mesh and micro-adjusting Z height to follow the actual surface geometry. Key changes: - Add ContourZ.cpp raycasting algorithm (~330 lines) - Extend geometry with 3D support (Point3, Line3, Polyline3, MultiPoint3) - Template arc fitting for 2D/3D compatibility - Change ExtrusionPath::polyline from Polyline to Polyline3 - Add 5 ZAA config options (zaa_enabled, zaa_min_z, etc.) - Add posContouring pipeline step in PrintObject - Update GCode writer for 3D coordinate output - Add ZAA settings UI in Print Settings > Quality - Add docs/ZAA.md with usage and implementation details ZAA is opt-in and disabled by default. When disabled, the slicing pipeline is unchanged.
This commit is contained in:
@@ -1163,7 +1163,7 @@ static void modulate_extrusion_by_overlapping_layers(
|
||||
for (ExtrusionEntity *ee : extrusions_in_out) {
|
||||
ExtrusionPath *path = dynamic_cast<ExtrusionPath*>(ee);
|
||||
assert(path != nullptr);
|
||||
polylines.emplace_back(Polyline(std::move(path->polyline)));
|
||||
polylines.emplace_back(path->polyline.to_polyline());
|
||||
path_ends.emplace_back(std::pair<Point, Point>(polylines.back().points.front(), polylines.back().points.back()));
|
||||
delete path;
|
||||
}
|
||||
@@ -1288,9 +1288,10 @@ static void modulate_extrusion_by_overlapping_layers(
|
||||
if (! path->polyline.points.empty())
|
||||
path->polyline.points.pop_back();
|
||||
// Consume the fragment's polyline, remove it from the input fragments, so it will be ignored the next time.
|
||||
path->polyline.append(std::move(frag_polyline));
|
||||
path->polyline.append(Polyline3(std::move(frag_polyline)));
|
||||
frag_polyline.points.clear();
|
||||
pt_current = path->polyline.points.back();
|
||||
const Point3 &pt_back3 = path->polyline.points.back();
|
||||
pt_current = Point(pt_back3.x(), pt_back3.y());
|
||||
if (pt_current == pt_end) {
|
||||
// End of the path.
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user