From ccea6fdde90d0c2e8cc6a15381266399ce3bdce8 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Sun, 7 Dec 2014 20:09:45 -0500 Subject: [PATCH] Bugfix: 2D scale or mirror sometimes caused flipped normals which caused larger issues downstream. Fixes #1055 --- src/GeometryEvaluator.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/GeometryEvaluator.cc b/src/GeometryEvaluator.cc index 71b52a81..40250c68 100644 --- a/src/GeometryEvaluator.cc +++ b/src/GeometryEvaluator.cc @@ -547,7 +547,12 @@ Response GeometryEvaluator::visit(State &state, const TransformNode &node) node.matrix(1,0), node.matrix(1,1), node.matrix(1,3), node.matrix(3,0), node.matrix(3,1), node.matrix(3,3); newpoly->transform(mat2); - geom = newpoly; + // A 2D transformation may flip the winding order of a polygon. + // If that happens with a sanitized polygon, we need to reverse + // the winding order for it to be correct. + if (newpoly->isSanitized() && mat2.matrix().determinant() <= 0) { + geom.reset(ClipperUtils::sanitize(*newpoly)); + } } else if (geom->getDimension() == 3) { shared_ptr ps = dynamic_pointer_cast(geom);