diff --git a/src/libslic3r/SLA/BranchingTreeSLA.cpp b/src/libslic3r/SLA/BranchingTreeSLA.cpp index 96675288d..fcd546ae0 100644 --- a/src/libslic3r/SLA/BranchingTreeSLA.cpp +++ b/src/libslic3r/SLA/BranchingTreeSLA.cpp @@ -26,7 +26,10 @@ class BranchingTreeBuilder: public branchingtree::Builder { rtree /* ? */> m_pillar_index; - std::vector m_pillars; + std::vector m_pillars; // to put an index over them + + // cache succesfull ground connections + std::map m_gnd_connections; // Scaling of the input value 'widening_factor:<0, 1>' to produce resonable // widening behaviour @@ -182,6 +185,13 @@ public: } bool is_valid() const override { return !m_builder.ctl().stopcondition(); } + + + void group_pillars() + { + + } + }; bool BranchingTreeBuilder::add_bridge(const branchingtree::Node &from, @@ -251,31 +261,15 @@ bool BranchingTreeBuilder::add_ground_bridge(const branchingtree::Node &from, get_radius(to)); if (conn) { - build_ground_connection(m_builder, m_sm, conn); +// build_ground_connection(m_builder, m_sm, conn); Junction connlast = conn.path.back(); branchingtree::Node n{connlast.pos.cast(), float(connlast.r)}; n.left = from.id; m_pillars.emplace_back(n); m_pillar_index.insert({n.pos, m_pillars.size() - 1}); + m_gnd_connections[m_pillars.size() - 1] = conn; + ret = true; - -// Vec3d endp = cjunc? cjunc->pos : j.pos; -// double R = cjunc? cjunc->r : j.r; -// Vec3d dir = cjunc? Vec3d((j.pos - cjunc->pos).normalized()) : DOWN; -// auto plr = create_ground_pillar(ex_tbb, m_builder, m_sm, endp, dir, R, get_radius(to)); - -// if (plr.second >= 0) { -// m_builder.add_junction(endp, R); -// if (cjunc) { -// m_builder.add_diffbridge(j.pos, endp, j.r, R); -// branchingtree::Node n{cjunc->pos.cast(), float(R)}; -// n.left = from.id; -// m_pillars.emplace_back(n); -// m_pillar_index.insert({n.pos, m_pillars.size() - 1}); -// } - -// ret = true; -// } } } else { const auto &resnode = m_pillars[result->second]; @@ -381,6 +375,8 @@ void create_branching_tree(SupportTreeBuilder &builder, const SupportableMesh &s BranchingTreeBuilder vbuilder{builder, sm, nodes}; branchingtree::build_tree(nodes, vbuilder); + vbuilder.group_pillars(); + for (size_t id : vbuilder.unroutable_pinheads()) builder.head(id).invalidate(); diff --git a/src/libslic3r/SLA/DefaultSupportTree.cpp b/src/libslic3r/SLA/DefaultSupportTree.cpp index 63280b9df..06477c40c 100644 --- a/src/libslic3r/SLA/DefaultSupportTree.cpp +++ b/src/libslic3r/SLA/DefaultSupportTree.cpp @@ -344,15 +344,21 @@ bool DefaultSupportTree::create_ground_pillar(const Junction &hjp, const Vec3d &sourcedir, long head_id) { - auto [ret, pillar_id] = sla::create_ground_pillar(suptree_ex_policy, - m_builder, m_sm, hjp, - sourcedir, hjp.r, head_id); + long pillar_id = SupportTreeNode::ID_UNSET; + + auto conn = sla::find_pillar_route(suptree_ex_policy, m_sm, hjp, sourcedir, hjp.r); + if (conn) + pillar_id = build_ground_connection(m_builder, m_sm, conn); + +// auto [ret, pillar_id] = sla::create_ground_pillar(suptree_ex_policy, +// m_builder, m_sm, hjp, +// sourcedir, hjp.r, head_id); if (pillar_id >= 0) // Save the pillar endpoint in the spatial index m_pillar_index.guarded_insert(m_builder.pillar(pillar_id).endpt, unsigned(pillar_id)); - return ret; + return bool(conn); } void DefaultSupportTree::add_pinheads() diff --git a/src/libslic3r/SLA/SupportTreeUtils.hpp b/src/libslic3r/SLA/SupportTreeUtils.hpp index e7bf9f018..ecc9fdbf7 100644 --- a/src/libslic3r/SLA/SupportTreeUtils.hpp +++ b/src/libslic3r/SLA/SupportTreeUtils.hpp @@ -652,7 +652,6 @@ struct GroundConnection { template GroundConnection find_pillar_route(Ex policy, -// SupportTreeBuilder &builder, const SupportableMesh &sm, const Junction &source, const Vec3d &sourcedir, @@ -661,7 +660,6 @@ GroundConnection find_pillar_route(Ex policy, GroundConnection ret; Vec3d jp = source.pos, endp = jp, dir = sourcedir; -// long pillar_id = SupportTreeNode::ID_UNSET; bool can_add_base = false/*, non_head = false*/; double gndlvl = 0.; // The Z level where pedestals should be @@ -694,18 +692,13 @@ GroundConnection find_pillar_route(Ex policy, sm.cfg.head_back_radius_mm); if (diffbr && diffbr->endp.z() > jp_gnd) { -// auto &br = builder.add_diffbridge(*diffbr); -// if (head_id >= 0) -// builder.head(head_id).bridge_id = br.id; ret.path.emplace_back(source); endp = diffbr->endp; radius = diffbr->end_r; -// builder.add_junction(endp, radius); ret.path.emplace_back(endp, radius); -// non_head = true; dir = diffbr->get_dir(); eval_limits(); - } else return ret;//return {false, pillar_id}; + } else return ret; } if (sm.cfg.object_elevation_mm < EPSILON) @@ -760,28 +753,18 @@ GroundConnection find_pillar_route(Ex policy, } if (t > 0.) { // Need to make additional bridge -// const Bridge& br = builder.add_bridge(endp, nexp, radius); -// if (head_id >= 0) -// builder.head(head_id).bridge_id = br.id; - -// builder.add_junction(nexp, radius); ret.path.emplace_back(nexp, radius); endp = nexp; -// non_head = true; } } Vec3d gp = to_floor(endp); - double h = endp.z() - gp.z(); -// pillar_id = head_id >= 0 && !non_head ? builder.add_pillar(head_id, h) : -// builder.add_pillar(gp, h, radius, end_radius); ret.end_radius = end_radius; if (can_add_base) { - ret.pillar_base = Pedestal{gp, h, sm.cfg.base_height_mm, sm.cfg.base_radius_mm}; -// builder.add_pillar_base(pillar_id, sm.cfg.base_height_mm, -// sm.cfg.base_radius_mm); + ret.pillar_base = + Pedestal{gp, sm.cfg.base_height_mm, sm.cfg.base_radius_mm, end_radius}; } return ret; //{true, pillar_id}; @@ -806,7 +789,15 @@ inline long build_ground_connection(SupportTreeBuilder &builder, auto gp = conn.path.back().pos; gp.z() = ground_level(sm); double h = conn.path.back().pos.z() - gp.z(); - ret = builder.add_pillar(gp, h, conn.path.back().r, conn.end_radius); + +// TODO: does not work yet +// if (conn.path.back().id < 0) { +// // this is a head +// long head_id = std::abs(conn.path.back().id); +// ret = builder.add_pillar(head_id, h); +// } else + ret = builder.add_pillar(gp, h, conn.path.back().r, conn.end_radius); + if (conn.pillar_base) builder.add_pillar_base(ret, conn.pillar_base->height, conn.pillar_base->r_bottom); @@ -846,19 +837,16 @@ GroundConnection find_ground_connection( if (std::isinf(tdown)) { ret.path.emplace_back(j); - if (d > 0) { - Vec3d endp = hjp + d * dir; - double bridge_ratio = d / (d + (endp.z() - sm.emesh.ground_level())); - double pill_r = r + bridge_ratio * (end_r - r); + Vec3d endp = hjp + d * dir; + double bridge_ratio = d / (d + (endp.z() - sm.emesh.ground_level())); + double pill_r = r + bridge_ratio * (end_r - r); -// ret.path.emplace_back(endp, pill_r); - auto route = find_pillar_route(policy, sm, {endp, pill_r}, dir, end_r); - for (auto &j : route.path) - ret.path.emplace_back(j); + auto route = find_pillar_route(policy, sm, {endp, pill_r}, dir, end_r); + for (auto &j : route.path) + ret.path.emplace_back(j); - ret.pillar_base = route.pillar_base; - ret.end_radius = end_r; - } + ret.pillar_base = route.pillar_base; + ret.end_radius = end_r; } return ret;