mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-18 22:42:37 +00:00
* build: clear 2 warnings - a precedence bug and an arm64-only pragma Both were found by promoting every warning to an error across the CI matrix. Neither is reported by clang-cl on Windows x64, which is the configuration the #15374 inventory measures. LineSplit.hpp reserved with path.size() + closed ? 1 : 0. Addition binds tighter than ?:, so that parses as (path.size() + closed) ? 1 : 0, and the function returns early when path is empty, so the condition is always true and the reserve is always 1. The vector then grows by reallocation instead of reserving once. Output is unaffected, since reserve only sets capacity. Reported by Clang on Linux, macOS and Flatpak; GCC does not diagnose it. Int128.hpp declared #pragma intrinsic(_mul128) under _WIN64, which is defined on Windows arm64 as well, where that x64 intrinsic does not exist. The call site at line 190 is already guarded on _M_X64 and carries a comment saying ARM64 has no _mul128, so the pragma now uses the same guard. x64 is unchanged because _M_X64 is defined there. * build: clear 1 warning - CLI error label prints 1 instead of a name construct_assemble_list is a function, so streaming it converts the function pointer to bool. When that catch block fires the CLI prints "1: <message>". This line was already fixed in #5963 and came back in the wholesale revert of that PR two weeks later, which was reverting an auto-orientation regression somewhere in its 184 files. The string is restored exactly as it was merged then.
71 lines
2.0 KiB
C++
71 lines
2.0 KiB
C++
#ifndef SRC_LIBSLIC3R_ALGORITHM_LINE_SPLIT_HPP_
|
|
#define SRC_LIBSLIC3R_ALGORITHM_LINE_SPLIT_HPP_
|
|
|
|
#include "ClipperZUtils.hpp"
|
|
|
|
namespace Slic3r {
|
|
namespace Algorithm {
|
|
|
|
struct SplitLineJunction
|
|
{
|
|
Point p;
|
|
|
|
// true if the line between this point and the next point is inside the clip polygon (or on the edge of the clip polygon)
|
|
bool clipped;
|
|
|
|
// Index from the original input.
|
|
// - If this junction is presented in the source polygon/polyline, this is the index of the point with in the source;
|
|
// - if this point in a new point that caused by the intersection, this will be -(1+index of the first point of the source line involved in this intersection);
|
|
// - if this junction came from the clip polygon, it will be treated as new point.
|
|
int64_t src_idx;
|
|
|
|
SplitLineJunction(const Point& p, bool clipped, int64_t src_idx)
|
|
: p(p)
|
|
, clipped(clipped)
|
|
, src_idx(src_idx) {}
|
|
|
|
bool is_src() const { return src_idx >= 0; }
|
|
size_t get_src_index() const
|
|
{
|
|
if (is_src()) {
|
|
return src_idx;
|
|
} else {
|
|
return -src_idx - 1;
|
|
}
|
|
}
|
|
};
|
|
|
|
using SplittedLine = std::vector<SplitLineJunction>;
|
|
|
|
SplittedLine do_split_line(const ClipperZUtils::ZPath& path, const ExPolygons& clip, bool closed);
|
|
|
|
// Return the splitted line, or empty if no intersection found
|
|
template<class PathType>
|
|
SplittedLine split_line(const PathType& path, const ExPolygons& clip, bool closed)
|
|
{
|
|
if (path.empty()) {
|
|
return {};
|
|
}
|
|
|
|
// Convert the input path into an open ZPath
|
|
ClipperZUtils::ZPath p;
|
|
p.reserve(path.size() + (closed ? 1 : 0));
|
|
ClipperLib_Z::cInt z = 0;
|
|
for (const auto& point : path) {
|
|
p.emplace_back(point.x(), point.y(), z);
|
|
z++;
|
|
}
|
|
if (closed) {
|
|
// duplicate the first point at the end to make a closed path open
|
|
p.emplace_back(p.front());
|
|
p.back().z() = z;
|
|
}
|
|
|
|
return do_split_line(p, clip, closed);
|
|
}
|
|
|
|
} // Algorithm
|
|
} // Slic3r
|
|
|
|
#endif /* SRC_LIBSLIC3R_ALGORITHM_LINE_SPLIT_HPP_ */
|