From 47d904a628ec35a1a0f08ab2ad7bd664cc0c601f Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 12 Feb 2018 18:16:10 +0100 Subject: [PATCH] Changed the Slic3r coordinate type from long to int32 to match the point type on Windows / Linux / OSX to achieve the same behavior on all the 32 / 64bit systems. (Windows always treats the long as 32bit int, while Linux treats long as a 64bit int). --- xs/src/admesh/util.cpp | 6 ++---- xs/src/libslic3r/Point.hpp | 20 +------------------- xs/src/libslic3r/libslic3r.h | 4 ++-- xs/xsp/BoundingBox.xsp | 8 ++++---- xs/xsp/BridgeDetector.xsp | 4 ++-- xs/xsp/Flow.xsp | 4 ++-- xs/xsp/Point.xsp | 18 +++++++++--------- 7 files changed, 22 insertions(+), 42 deletions(-) diff --git a/xs/src/admesh/util.cpp b/xs/src/admesh/util.cpp index b0c31469d..f3bf59b56 100644 --- a/xs/src/admesh/util.cpp +++ b/xs/src/admesh/util.cpp @@ -171,12 +171,11 @@ stl_scale(stl_file *stl, float factor) { } static void calculate_normals(stl_file *stl) { - long i; float normal[3]; if (stl->error) return; - for(i = 0; i < stl->stats.number_of_facets; i++) { + for(uint32_t i = 0; i < stl->stats.number_of_facets; i++) { stl_calculate_normal(normal, &stl->facet_start[i]); stl_normalize_vector(normal); stl->facet_start[i].normal.x = normal[0]; @@ -381,7 +380,6 @@ stl_mirror_xz(stl_file *stl) { } static float get_volume(stl_file *stl) { - long i; stl_vertex p0; stl_vertex p; stl_normal n; @@ -396,7 +394,7 @@ static float get_volume(stl_file *stl) { p0.y = stl->facet_start[0].vertex[0].y; p0.z = stl->facet_start[0].vertex[0].z; - for(i = 0; i < stl->stats.number_of_facets; i++) { + for(uint32_t i = 0; i < stl->stats.number_of_facets; i++) { p.x = stl->facet_start[i].vertex[0].x - p0.x; p.y = stl->facet_start[i].vertex[0].y - p0.y; p.z = stl->facet_start[i].vertex[0].z - p0.z; diff --git a/xs/src/libslic3r/Point.hpp b/xs/src/libslic3r/Point.hpp index 77e07bec8..09c292b5a 100644 --- a/xs/src/libslic3r/Point.hpp +++ b/xs/src/libslic3r/Point.hpp @@ -32,8 +32,7 @@ public: coord_t x; coord_t y; Point(coord_t _x = 0, coord_t _y = 0): x(_x), y(_y) {}; - Point(int _x, int _y): x(_x), y(_y) {}; - Point(long long _x, long long _y): x(coord_t(_x)), y(coord_t(_y)) {}; // for Clipper + Point(int64_t _x, int64_t _y): x(coord_t(_x)), y(coord_t(_y)) {}; // for Clipper Point(double x, double y); static Point new_scale(coordf_t x, coordf_t y) { return Point(coord_t(scale_(x)), coord_t(scale_(y))); } @@ -271,23 +270,6 @@ template inline TO convert_to(const Pointf3 &src) { return TO(typen #include #include namespace boost { namespace polygon { - template <> - struct geometry_concept { typedef coordinate_concept type; }; - -/* Boost.Polygon already defines a specialization for coordinate_traits as of 1.60: - https://github.com/boostorg/polygon/commit/0ac7230dd1f8f34cb12b86c8bb121ae86d3d9b97 */ -#if BOOST_VERSION < 106000 - template <> - struct coordinate_traits { - typedef coord_t coordinate_type; - typedef long double area_type; - typedef long long manhattan_area_type; - typedef unsigned long long unsigned_area_type; - typedef long long coordinate_difference; - typedef long double coordinate_distance; - }; -#endif - template <> struct geometry_concept { typedef point_concept type; }; diff --git a/xs/src/libslic3r/libslic3r.h b/xs/src/libslic3r/libslic3r.h index 7c694b05e..e58b01582 100644 --- a/xs/src/libslic3r/libslic3r.h +++ b/xs/src/libslic3r/libslic3r.h @@ -17,8 +17,8 @@ #define SLIC3R_VERSION "1.39.0" #define SLIC3R_BUILD "UNKNOWN" -typedef long coord_t; -typedef double coordf_t; +typedef int32_t coord_t; +typedef double coordf_t; //FIXME This epsilon value is used for many non-related purposes: // For a threshold of a squared Euclidean distance, diff --git a/xs/xsp/BoundingBox.xsp b/xs/xsp/BoundingBox.xsp index a326c7501..df8e6baea 100644 --- a/xs/xsp/BoundingBox.xsp +++ b/xs/xsp/BoundingBox.xsp @@ -25,10 +25,10 @@ double radius(); Clone min_point() %code{% RETVAL = THIS->min; %}; Clone max_point() %code{% RETVAL = THIS->max; %}; - long x_min() %code{% RETVAL = THIS->min.x; %}; - long x_max() %code{% RETVAL = THIS->max.x; %}; - long y_min() %code{% RETVAL = THIS->min.y; %}; - long y_max() %code{% RETVAL = THIS->max.y; %}; + int x_min() %code{% RETVAL = THIS->min.x; %}; + int x_max() %code{% RETVAL = THIS->max.x; %}; + int y_min() %code{% RETVAL = THIS->min.y; %}; + int y_max() %code{% RETVAL = THIS->max.y; %}; std::string serialize() %code{% char buf[2048]; sprintf(buf, "%ld,%ld;%ld,%ld", THIS->min.x, THIS->min.y, THIS->max.x, THIS->max.y); RETVAL = buf; %}; bool defined() %code{% RETVAL = THIS->defined; %}; diff --git a/xs/xsp/BridgeDetector.xsp b/xs/xsp/BridgeDetector.xsp index c7ac409df..0039d3579 100644 --- a/xs/xsp/BridgeDetector.xsp +++ b/xs/xsp/BridgeDetector.xsp @@ -23,7 +23,7 @@ BridgeDetector* BridgeDetector::new(expolygon, lower_slices, extrusion_width) ExPolygon* expolygon; ExPolygonCollection* lower_slices; - long extrusion_width; + int extrusion_width; CODE: RETVAL = new BridgeDetector(*expolygon, *lower_slices, extrusion_width); OUTPUT: @@ -33,7 +33,7 @@ BridgeDetector* BridgeDetector::new_expolygons(expolygons, lower_slices, extrusion_width) ExPolygonCollection* expolygons; ExPolygonCollection* lower_slices; - long extrusion_width; + int extrusion_width; CODE: RETVAL = new BridgeDetector(expolygons->expolygons, *lower_slices, extrusion_width); OUTPUT: diff --git a/xs/xsp/Flow.xsp b/xs/xsp/Flow.xsp index d9b7a45c0..b57df5e37 100644 --- a/xs/xsp/Flow.xsp +++ b/xs/xsp/Flow.xsp @@ -26,8 +26,8 @@ float spacing(); float spacing_to(Flow* other) %code{% RETVAL = THIS->spacing(*other); %}; - long scaled_width(); - long scaled_spacing(); + int scaled_width(); + int scaled_spacing(); double mm3_per_mm(); %{ diff --git a/xs/xsp/Point.xsp b/xs/xsp/Point.xsp index d0f9260c7..b7aded6a0 100644 --- a/xs/xsp/Point.xsp +++ b/xs/xsp/Point.xsp @@ -8,7 +8,7 @@ %} %name{Slic3r::Point} class Point { - Point(long _x = 0, long _y = 0); + Point(int _x = 0, int _y = 0); ~Point(); Clone clone() %code{% RETVAL=THIS; %}; @@ -18,13 +18,13 @@ %code{% RETVAL = to_SV_pureperl(THIS); %}; SV* pp() %code{% RETVAL = to_SV_pureperl(THIS); %}; - long x() + int x() %code{% RETVAL = THIS->x; %}; - long y() + int y() %code{% RETVAL = THIS->y; %}; - void set_x(long val) + void set_x(int val) %code{% THIS->x = val; %}; - void set_y(long val) + void set_y(int val) %code{% THIS->y = val; %}; int nearest_point_index(Points points); Clone nearest_point(Points points) @@ -77,15 +77,15 @@ Point::coincides_with(point_sv) }; %name{Slic3r::Point3} class Point3 { - Point3(long _x = 0, long _y = 0, long _z = 0); + Point3(int _x = 0, int _y = 0, int _z = 0); ~Point3(); Clone clone() %code{% RETVAL = THIS; %}; - long x() + int x() %code{% RETVAL = THIS->x; %}; - long y() + int y() %code{% RETVAL = THIS->y; %}; - long z() + int z() %code{% RETVAL = THIS->z; %}; std::string serialize() %code{% char buf[2048]; sprintf(buf, "%ld,%ld,%ld", THIS->x, THIS->y, THIS->z); RETVAL = buf; %}; };