mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 04:05:57 +08:00
Cut now respect reduction of triangles
This commit is contained in:
parent
59e14cb752
commit
bec8d5b31d
@ -302,11 +302,13 @@ void collect_surface_data(std::queue<FI> &process,
|
|||||||
/// <param name="faces">Faces to copy</param>
|
/// <param name="faces">Faces to copy</param>
|
||||||
/// <param name="count_outlines">Count of outlines</param>
|
/// <param name="count_outlines">Count of outlines</param>
|
||||||
/// <param name="mesh">Source CGAL mesh</param>
|
/// <param name="mesh">Source CGAL mesh</param>
|
||||||
|
/// <param name="reduction_map">Reduction of vertices</param>
|
||||||
/// <param name="v2v">[Output] map to convert CGAL vertex to its::vertex index</param>
|
/// <param name="v2v">[Output] map to convert CGAL vertex to its::vertex index</param>
|
||||||
/// <returns>Surface cut (Partialy filled - only index triangle set)</returns>
|
/// <returns>Surface cut (Partialy filled - only index triangle set)</returns>
|
||||||
SurfaceCut create_index_triangle_set(const std::vector<FI> &faces,
|
SurfaceCut create_index_triangle_set(const std::vector<FI> &faces,
|
||||||
size_t count_outlines,
|
size_t count_outlines,
|
||||||
const CutMesh &mesh,
|
const CutMesh &mesh,
|
||||||
|
const ReductionMap &reduction_map,
|
||||||
ConvertMap &v2v);
|
ConvertMap &v2v);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -314,10 +316,12 @@ SurfaceCut create_index_triangle_set(const std::vector<FI> &faces,
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="outlines">Half edges from border of cut - Oriented</param>
|
/// <param name="outlines">Half edges from border of cut - Oriented</param>
|
||||||
/// <param name="mesh">Source CGAL mesh</param>
|
/// <param name="mesh">Source CGAL mesh</param>
|
||||||
|
/// <param name="reduction_map">Reduction of vertices</param>
|
||||||
/// <param name="v2v">Map to convert CGAL vertex to its::vertex</param>
|
/// <param name="v2v">Map to convert CGAL vertex to its::vertex</param>
|
||||||
/// <returns>Cuts - outlines of surface</returns>
|
/// <returns>Cuts - outlines of surface</returns>
|
||||||
SurfaceCut::CutType create_cut(const std::vector<HI> &outlines,
|
SurfaceCut::CutType create_cut(const std::vector<HI> &outlines,
|
||||||
const CutMesh &mesh,
|
const CutMesh &mesh,
|
||||||
|
const ReductionMap &reduction_map,
|
||||||
const ConvertMap &v2v);
|
const ConvertMap &v2v);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -402,7 +406,6 @@ SurfaceCuts Slic3r::cut_surface(const indexed_triangle_set &model,
|
|||||||
priv::ConvertMap vertex_convert_map = cgal_model.add_property_map<priv::VI, SurfaceCut::Index>(vertec_convert_map_name).first;
|
priv::ConvertMap vertex_convert_map = cgal_model.add_property_map<priv::VI, SurfaceCut::Index>(vertec_convert_map_name).first;
|
||||||
SurfaceCuts result = priv::create_surface_cut(cgal_model, shapes, vertex_reduction_map, face_type_map, vertex_convert_map);
|
SurfaceCuts result = priv::create_surface_cut(cgal_model, shapes, vertex_reduction_map, face_type_map, vertex_convert_map);
|
||||||
|
|
||||||
|
|
||||||
priv::store(result, "C:/data/temp/cut"); // only debug
|
priv::store(result, "C:/data/temp/cut"); // only debug
|
||||||
|
|
||||||
// TODO: Filter surfaceCuts to only the top most.
|
// TODO: Filter surfaceCuts to only the top most.
|
||||||
@ -822,9 +825,11 @@ void priv::create_reduce_map(ReductionMap &reduction_map,
|
|||||||
|
|
||||||
SurfaceCut priv::create_index_triangle_set(const std::vector<FI> &faces,
|
SurfaceCut priv::create_index_triangle_set(const std::vector<FI> &faces,
|
||||||
size_t count_outlines,
|
size_t count_outlines,
|
||||||
const CutMesh &mesh,
|
const CutMesh &mesh,
|
||||||
|
const ReductionMap &reduction_map,
|
||||||
ConvertMap &v2v)
|
ConvertMap &v2v)
|
||||||
{
|
{
|
||||||
|
// IMPROVE: use reduced count of faces and outlines
|
||||||
size_t indices_size = faces.size();
|
size_t indices_size = faces.size();
|
||||||
size_t vertices_size = (indices_size * 3 - count_outlines / 2) / 2;
|
size_t vertices_size = (indices_size * 3 - count_outlines / 2) / 2;
|
||||||
|
|
||||||
@ -840,8 +845,16 @@ SurfaceCut priv::create_index_triangle_set(const std::vector<FI> &faces,
|
|||||||
Vec3i its_face;
|
Vec3i its_face;
|
||||||
// index into its_face
|
// index into its_face
|
||||||
int its_face_id = 0;
|
int its_face_id = 0;
|
||||||
|
bool exist_reduction = false;
|
||||||
do {
|
do {
|
||||||
VI vi = mesh.source(hi);
|
VI vi = mesh.source(hi);
|
||||||
|
|
||||||
|
VI vi_r = reduction_map[vi];
|
||||||
|
if (vi_r != vi) {
|
||||||
|
exist_reduction = true;
|
||||||
|
vi = vi_r;
|
||||||
|
}
|
||||||
|
|
||||||
size_t index = v2v[vi];
|
size_t index = v2v[vi];
|
||||||
if (index == std::numeric_limits<SurfaceCut::Index>::max()) {
|
if (index == std::numeric_limits<SurfaceCut::Index>::max()) {
|
||||||
index = sc.vertices.size();
|
index = sc.vertices.size();
|
||||||
@ -854,27 +867,47 @@ SurfaceCut priv::create_index_triangle_set(const std::vector<FI> &faces,
|
|||||||
its_face[its_face_id++] = index;
|
its_face[its_face_id++] = index;
|
||||||
hi = mesh.next(hi);
|
hi = mesh.next(hi);
|
||||||
} while (hi != hi_end);
|
} while (hi != hi_end);
|
||||||
|
|
||||||
|
// prevent add reduced triangle
|
||||||
|
if (exist_reduction && (
|
||||||
|
its_face[0] == its_face[1] ||
|
||||||
|
its_face[1] == its_face[2] ||
|
||||||
|
its_face[2] == its_face[0]
|
||||||
|
)) continue;
|
||||||
|
|
||||||
sc.indices.emplace_back(std::move(its_face));
|
sc.indices.emplace_back(std::move(its_face));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reduce size with respect to reduction triangles
|
||||||
|
sc.indices.shrink_to_fit();
|
||||||
|
sc.vertices.shrink_to_fit();
|
||||||
return sc;
|
return sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SurfaceCut::CutType priv::create_cut(const std::vector<HI> &outlines,
|
SurfaceCut::CutType priv::create_cut(const std::vector<HI> &outlines,
|
||||||
const CutMesh &mesh,
|
const CutMesh &mesh,
|
||||||
|
const ReductionMap &reduction_map,
|
||||||
const ConvertMap &v2v)
|
const ConvertMap &v2v)
|
||||||
{
|
{
|
||||||
SurfaceCut::CutType cut;
|
|
||||||
using Index = SurfaceCut::Index;
|
using Index = SurfaceCut::Index;
|
||||||
std::vector<std::vector<Index>> unclosed_cut;
|
SurfaceCut::CutType cut;
|
||||||
|
SurfaceCut::CutType unclosed_cut;
|
||||||
for (HI hi : outlines) {
|
for (HI hi : outlines) {
|
||||||
// source vertex (from)
|
|
||||||
VI vi_s = mesh.source(hi);
|
VI vi_s = mesh.source(hi);
|
||||||
Index vi_from = v2v[vi_s];
|
|
||||||
assert(vi_from != std::numeric_limits<Index>::max());
|
|
||||||
// target vertex (to)
|
|
||||||
VI vi_t = mesh.target(hi);
|
VI vi_t = mesh.target(hi);
|
||||||
Index vi_to = v2v[vi_t];
|
// reduced vertex
|
||||||
|
VI vi_s_r = reduction_map[vi_s];
|
||||||
|
VI vi_t_r = reduction_map[vi_t];
|
||||||
|
// is reduced edge?
|
||||||
|
if (vi_s_r == vi_t || vi_t_r == vi_s) continue;
|
||||||
|
|
||||||
|
// source vertex (from)
|
||||||
|
Index vi_from = v2v[vi_s_r];
|
||||||
|
assert(vi_from != std::numeric_limits<Index>::max());
|
||||||
|
|
||||||
|
// target vertex (to)
|
||||||
|
Index vi_to = v2v[vi_t_r];
|
||||||
assert(vi_to != std::numeric_limits<Index>::max());
|
assert(vi_to != std::numeric_limits<Index>::max());
|
||||||
|
|
||||||
std::vector<Index> *cut_move = nullptr;
|
std::vector<Index> *cut_move = nullptr;
|
||||||
@ -966,10 +999,10 @@ SurfaceCuts priv::create_surface_cut(const CutMesh &mesh,
|
|||||||
process.push(fi);
|
process.push(fi);
|
||||||
collect_surface_data(process, faces, outlines, face_type_map, mesh);
|
collect_surface_data(process, faces, outlines, face_type_map, mesh);
|
||||||
|
|
||||||
SurfaceCut sc = create_index_triangle_set(faces, outlines.size(), mesh, convert_map);
|
SurfaceCut sc = create_index_triangle_set(faces, outlines.size(), mesh, reduction_map, convert_map);
|
||||||
|
|
||||||
// connect outlines
|
// connect outlines
|
||||||
sc.cut = create_cut(outlines, mesh, convert_map);
|
sc.cut = create_cut(outlines, mesh, reduction_map, convert_map);
|
||||||
|
|
||||||
// TODO: create vertex2contour map
|
// TODO: create vertex2contour map
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ struct SurfaceCut : public indexed_triangle_set
|
|||||||
CutType cut;
|
CutType cut;
|
||||||
|
|
||||||
// conversion map from vertex index to contour point
|
// conversion map from vertex index to contour point
|
||||||
std::map<Index, ExPolygonsPoint> vertex2contour;
|
// std::map<Index, ExPolygonsPoint> vertex2contour;
|
||||||
};
|
};
|
||||||
using SurfaceCuts = std::vector<SurfaceCut>;
|
using SurfaceCuts = std::vector<SurfaceCut>;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user