diff options
author | Spartan322 <Megacake1234@gmail.com> | 2024-10-14 02:57:59 -0400 |
---|---|---|
committer | Spartan322 <Megacake1234@gmail.com> | 2024-10-14 02:57:59 -0400 |
commit | 22d604c80d9ffd7ad72b06458a2e8e72ee5737e3 (patch) | |
tree | 176614fa17d6a68691b5f27f8e5f7d9b4dd17729 /core/math | |
parent | 83d65738b06986e5aa0943cae01e357133e04a75 (diff) | |
parent | 92e51fca7247c932f95a1662aefc28aca96e8de6 (diff) | |
download | redot-engine-22d604c80d9ffd7ad72b06458a2e8e72ee5737e3.tar.gz |
Merge commit godotengine@92e51fca7247c932f95a1662aefc28aca96e8de6
Diffstat (limited to 'core/math')
-rw-r--r-- | core/math/geometry_2d.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/core/math/geometry_2d.cpp b/core/math/geometry_2d.cpp index 68e236df3d..2812ebbe51 100644 --- a/core/math/geometry_2d.cpp +++ b/core/math/geometry_2d.cpp @@ -37,7 +37,8 @@ #define STB_RECT_PACK_IMPLEMENTATION #include "thirdparty/misc/stb_rect_pack.h" -#define PRECISION 5 // Based on CMP_EPSILON. +const int clipper_precision = 5; // Based on CMP_EPSILON. +const double clipper_scale = Math::pow(10.0, clipper_precision); Vector<Vector<Vector2>> Geometry2D::decompose_polygon_in_convex(const Vector<Point2> &polygon) { Vector<Vector<Vector2>> decomp; @@ -226,7 +227,7 @@ Vector<Vector<Point2>> Geometry2D::_polypaths_do_operation(PolyBooleanOperation path_b[i] = PointD(p_polypath_b[i].x, p_polypath_b[i].y); } - ClipperD clp(PRECISION); // Scale points up internally to attain the desired precision. + ClipperD clp(clipper_precision); // Scale points up internally to attain the desired precision. clp.PreserveCollinear(false); // Remove redundant vertices. if (is_a_open) { clp.AddOpenSubject({ path_a }); @@ -300,9 +301,10 @@ Vector<Vector<Point2>> Geometry2D::_polypath_offset(const Vector<Point2> &p_poly } // Inflate/deflate. - PathsD paths = InflatePaths({ polypath }, p_delta, jt, et, 2.0, PRECISION, 0.0); - // Here the miter_limit = 2.0 and arc_tolerance = 0.0 are Clipper2 defaults, - // and the PRECISION is used to scale points up internally, to attain the desired precision. + PathsD paths = InflatePaths({ polypath }, p_delta, jt, et, 2.0, clipper_precision, 0.25 * clipper_scale); + // Here the points are scaled up internally and + // the arc_tolerance is scaled accordingly + // to attain the desired precision. Vector<Vector<Point2>> polypaths; for (PathsD::size_type i = 0; i < paths.size(); ++i) { |