mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-13 02:41:16 +00:00
* Add Missing Includes Across src/libslic3r Every libslic3r source and header now directly includes the headers declaring what it uses, rather than relying on the precompiled header or transitive includes. Generated with clang-tidy misc-include-cleaner, with libslic3r headers spelled libslic3r/... so they resolve outside the library's private include paths. MultiMaterialSegmentation.hpp, Support/SupportParameters.hpp and Format/STEP.hpp are made self-contained by hand. * Make the libslic3r Headers Compile on Their Own Each now includes, or forward-declares, what it uses instead of relying on what its includers happened to include first. Left out: I18N.hpp, which errors on purpose when included from GUI code, and VoxelizeCSGMesh.hpp and SLA/bicubic.h, which nothing includes and which no longer compile at all. * Add the Includes Missing From the Hand-Fixed libslic3r Headers clang-tidy would not edit these headers while they failed to compile on their own, so the first pass skipped them. With the headers now self-contained, a second pass adds the rest. * Keep Windows Setup Ahead of the Added libslic3r Includes Print.cpp and Thread.cpp open with a _WIN32 block that has to come first; without the precompiled header, Print.cpp otherwise reaches windows.h through OCCT with NONLS defined and boost/regex fails. OpenVDBUtils.cpp and SLA/SupportTreeBuilder.cpp had includes inside #ifndef NOMINMAX, which libslic3r defines on Windows, so those were skipped there. .clang-tidy also ignores the MSVC STL and UCRT internals, Boost.Multiprecision's fwd.hpp and CPython's Windows include directory. * Re-Add libslic3r Includes After the Clipper2 2.0.1 Migration Rebasing onto main took main's version of the files the Clipper2 migration rewrote, so their added includes are restored here, along with includes for main's new code. Clipper2's individual headers are now ignored by clang-tidy: they only build the Z variant through clipper2_z.hpp, which defines USINGZ first, so including clipper.core.h and the like directly broke ClipperZUtils.cpp.
126 lines
4.1 KiB
C++
126 lines
4.1 KiB
C++
#ifndef CSGMESH_HPP
|
|
#define CSGMESH_HPP
|
|
|
|
#include <libslic3r/AnyPtr.hpp>
|
|
#include <libslic3r/Point.hpp>
|
|
#include <libslic3r/TriangleMesh.hpp>
|
|
#include <admesh/stl.h>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
namespace Slic3r { namespace csg {
|
|
|
|
// A CSGPartT should be an object that can provide at least a mesh + trafo and an
|
|
// associated csg operation. A collection of CSGPartT objects can then
|
|
// be interpreted as one model and used in various contexts. It can be assembled
|
|
// with CGAL or OpenVDB, rendered with OpenCSG or provided to a ray-tracer to
|
|
// deal with various parts of it according to the supported CSG types...
|
|
//
|
|
// A few simple templated interface functions are provided here and a default
|
|
// CSGPart class that implements the necessary means to be usable as a
|
|
// CSGPartT object.
|
|
|
|
// Supported CSG operation types
|
|
enum class CSGType { Union, Difference, Intersection };
|
|
|
|
// A CSG part can instruct the processing to push the sub-result until a new
|
|
// csg part with a pop instruction appears. This can be used to implement
|
|
// parentheses in a CSG expression represented by the collection of csg parts.
|
|
// A CSG part can not contain another CSG collection, only a mesh, this is why
|
|
// its easier to do this stacking instead of recursion in the data definition.
|
|
// CSGStackOp::Continue means no stack operation required.
|
|
// When a CSG part contains a Push instruction, it is expected that the CSG
|
|
// operation it contains refers to the whole collection spanning to the nearest
|
|
// part with a Pop instruction.
|
|
// e.g.:
|
|
// {
|
|
// CUBE1: { mesh: cube, op: Union, stack op: Continue },
|
|
// CUBE2: { mesh: cube, op: Difference, stack op: Push},
|
|
// CUBE3: { mesh: cube, op: Union, stack op: Pop}
|
|
// }
|
|
// is a collection of csg parts representing the expression CUBE1 - (CUBE2 + CUBE3)
|
|
enum class CSGStackOp { Push, Continue, Pop };
|
|
|
|
// Get the CSG operation of the part. Can be overriden for any type
|
|
template<class CSGPartT> CSGType get_operation(const CSGPartT &part)
|
|
{
|
|
return part.operation;
|
|
}
|
|
|
|
// Get the stack operation required by the CSG part.
|
|
template<class CSGPartT> CSGStackOp get_stack_operation(const CSGPartT &part)
|
|
{
|
|
return part.stack_operation;
|
|
}
|
|
|
|
// Get the mesh for the part. Can be overriden for any type
|
|
template<class CSGPartT>
|
|
const indexed_triangle_set *get_mesh(const CSGPartT &part)
|
|
{
|
|
return part.its_ptr.get();
|
|
}
|
|
|
|
// Get the transformation associated with the mesh inside a CSGPartT object.
|
|
// Can be overriden for any type.
|
|
template<class CSGPartT>
|
|
Transform3f get_transform(const CSGPartT &part)
|
|
{
|
|
return part.trafo;
|
|
}
|
|
|
|
// Default implementation
|
|
struct CSGPart {
|
|
AnyPtr<const indexed_triangle_set> its_ptr;
|
|
Transform3f trafo;
|
|
CSGType operation;
|
|
CSGStackOp stack_operation;
|
|
std::string name;
|
|
|
|
CSGPart(AnyPtr<const indexed_triangle_set> ptr = {},
|
|
CSGType op = CSGType::Union,
|
|
const Transform3f &tr = Transform3f::Identity())
|
|
: its_ptr{std::move(ptr)}
|
|
, operation{op}
|
|
, stack_operation{CSGStackOp::Continue}
|
|
, trafo{tr}
|
|
{}
|
|
};
|
|
|
|
//Prusa
|
|
// Check if there are only positive parts (Union) within the collection.
|
|
template<class Cont> bool is_all_positive(const Cont &csgmesh)
|
|
{
|
|
bool is_all_pos =
|
|
std::all_of(csgmesh.begin(),
|
|
csgmesh.end(),
|
|
[](auto &part) {
|
|
return csg::get_operation(part) == csg::CSGType::Union;
|
|
});
|
|
|
|
return is_all_pos;
|
|
}
|
|
|
|
//Prusa
|
|
// Merge all the positive parts of the collection into a single triangle mesh without performing
|
|
// any booleans.
|
|
template<class Cont>
|
|
indexed_triangle_set csgmesh_merge_positive_parts(const Cont &csgmesh)
|
|
{
|
|
indexed_triangle_set m;
|
|
for (auto &csgpart : csgmesh) {
|
|
auto op = csg::get_operation(csgpart);
|
|
const indexed_triangle_set * pmesh = csg::get_mesh(csgpart);
|
|
if (pmesh && op == csg::CSGType::Union) {
|
|
indexed_triangle_set mcpy = *pmesh;
|
|
its_transform(mcpy, csg::get_transform(csgpart), true);
|
|
its_merge(m, mcpy);
|
|
}
|
|
}
|
|
|
|
return m;
|
|
}
|
|
|
|
}} // namespace Slic3r::csg
|
|
|
|
#endif // CSGMESH_HPP
|