Revision: 73879
http://sourceforge.net/p/brlcad/code/73879
Author: starseeker
Date: 2019-09-10 16:15:02 +0000 (Tue, 10 Sep 2019)
Log Message:
-----------
After the initial breakdown, we won't need updated rtrees again until the
surface points are added.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt.cpp
brlcad/trunk/src/libbrep/cdt.h
brlcad/trunk/src/libbrep/cdt_edge.cpp
Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp 2019-09-10 15:32:07 UTC (rev 73878)
+++ brlcad/trunk/src/libbrep/cdt.cpp 2019-09-10 16:15:02 UTC (rev 73879)
@@ -650,20 +650,11 @@
}
#endif
+ // Rebuild finalized 2D RTrees for faces (needed for surface processing)
+ finalize_2d_rtrees(s_cdt);
+
+
#if 0
- // Build RTrees of 2D and 3D edge segments for edge aware processing
- for (int index = 0; index < brep->m_E.Count(); index++) {
- std::vector<cdt_mesh::bedge_seg_t *> &epsegs =
s_cdt->e2polysegs[index];
- std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
- for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
- cdt_mesh::bedge_seg_t *b = *e_it;
- rtree_bbox_2d(s_cdt, b->tseg1);
- rtree_bbox_2d(s_cdt, b->tseg2);
- rtree_bbox_3d(s_cdt, b->tseg1);
- rtree_bbox_3d(s_cdt, b->tseg2);
- }
- }
-
for (int index = 0; index < brep->m_F.Count(); index++) {
struct bu_vls fname = BU_VLS_INIT_ZERO;
bu_vls_sprintf(&fname, "%d-rtree_outer_polygon.plot3", index);
Modified: brlcad/trunk/src/libbrep/cdt.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt.h 2019-09-10 15:32:07 UTC (rev 73878)
+++ brlcad/trunk/src/libbrep/cdt.h 2019-09-10 16:15:02 UTC (rev 73879)
@@ -162,7 +162,7 @@
calc_trim_vnorm(ON_BrepVertex& v, ON_BrepTrim *trim);
std::set<cdt_mesh::cpolyedge_t *>
-split_singular_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::cpolyedge_t *ce);
+split_singular_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::cpolyedge_t *ce,
int update_rtree);
bool initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt);
void refine_close_edges(struct ON_Brep_CDT_State *s_cdt);
@@ -175,6 +175,7 @@
void curved_edges_refine(struct ON_Brep_CDT_State *s_cdt);
void tol_linear_edges_split(struct ON_Brep_CDT_State *s_cdt);
void refine_near_loops(struct ON_Brep_CDT_State *s_cdt);
+void finalize_2d_rtrees(struct ON_Brep_CDT_State *s_cdt);
void plot_rtree_2d(ON_RTree *rtree, const char *filename);
void plot_rtree_2d2(RTree<void *, double, 2> &rtree, const char *filename);
Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-10 15:32:07 UTC (rev
73878)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-10 16:15:02 UTC (rev
73879)
@@ -595,7 +595,7 @@
}
std::set<cdt_mesh::bedge_seg_t *>
-split_edge_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::bedge_seg_t *bseg,
int force)
+split_edge_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::bedge_seg_t *bseg,
int force, int update_rtrees)
{
std::set<cdt_mesh::bedge_seg_t *> nedges;
@@ -683,8 +683,10 @@
bseg2->tan_end = bseg->tan_end;
// Remove the old segments from their respective rtrees
- rtree_bbox_2d_remove(s_cdt, bseg->tseg1);
- rtree_bbox_2d_remove(s_cdt, bseg->tseg2);
+ if (update_rtrees) {
+ rtree_bbox_2d_remove(s_cdt, bseg->tseg1);
+ rtree_bbox_2d_remove(s_cdt, bseg->tseg2);
+ }
// Using the 2d mid points, update the polygons associated with tseg1 and
tseg2.
cdt_mesh::cpolyedge_t *poly1_ne1, *poly1_ne2, *poly2_ne1, *poly2_ne2;
@@ -754,21 +756,23 @@
nedges.insert(bseg2);
// Update the rtrees with the new segments
+ if (update_rtrees) {
+ rtree_bbox_2d(s_cdt, bseg1->tseg1);
+ rtree_bbox_2d(s_cdt, bseg1->tseg2);
+ rtree_bbox_2d(s_cdt, bseg2->tseg1);
+ rtree_bbox_2d(s_cdt, bseg2->tseg2);
+#if 0
+ struct bu_vls fname = BU_VLS_INIT_ZERO;
+ int face_index =
s_cdt->brep->m_T[bseg1->tseg1->trim_ind].Face()->m_face_index;
+ bu_vls_sprintf(&fname, "%d-rtree_2d_split_update.plot3", face_index);
+ plot_rtree_2d2(s_cdt->face_rtrees_2d[face_index], bu_vls_cstr(&fname));
+ face_index =
s_cdt->brep->m_T[bseg2->tseg1->trim_ind].Face()->m_face_index;
+ bu_vls_sprintf(&fname, "%d-rtree_2d_split_update.plot3", face_index);
+ plot_rtree_2d2(s_cdt->face_rtrees_2d[face_index], bu_vls_cstr(&fname));
+ bu_vls_free(&fname);
+#endif
+ }
- rtree_bbox_2d(s_cdt, bseg1->tseg1);
- rtree_bbox_2d(s_cdt, bseg1->tseg2);
- rtree_bbox_2d(s_cdt, bseg2->tseg1);
- rtree_bbox_2d(s_cdt, bseg2->tseg2);
-
- struct bu_vls fname = BU_VLS_INIT_ZERO;
- int face_index =
s_cdt->brep->m_T[bseg1->tseg1->trim_ind].Face()->m_face_index;
- bu_vls_sprintf(&fname, "%d-rtree_2d_split_update.plot3", face_index);
- plot_rtree_2d2(s_cdt->face_rtrees_2d[face_index], bu_vls_cstr(&fname));
- face_index = s_cdt->brep->m_T[bseg2->tseg1->trim_ind].Face()->m_face_index;
- bu_vls_sprintf(&fname, "%d-rtree_2d_split_update.plot3", face_index);
- plot_rtree_2d2(s_cdt->face_rtrees_2d[face_index], bu_vls_cstr(&fname));
- bu_vls_free(&fname);
-
delete bseg;
return nedges;
}
@@ -855,7 +859,7 @@
#endif
std::set<cdt_mesh::cpolyedge_t *>
-split_singular_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::cpolyedge_t *ce)
+split_singular_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::cpolyedge_t *ce,
int update_rtrees)
{
std::set<cdt_mesh::cpolyedge_t *> nedges;
cdt_mesh::cpolygon_t *poly = ce->polygon;
@@ -874,6 +878,10 @@
// vertices
fmesh->p2d3d[f_ind2d] = fmesh->p2d3d[poly->p2o[ce->v[0]]];
+ if (update_rtrees) {
+ rtree_bbox_2d_remove(s_cdt, ce);
+ }
+
// Using the 2d mid points, update the polygons associated with tseg1 and
tseg2.
cdt_mesh::cpolyedge_t *poly_ne1, *poly_ne2;
int v[2];
@@ -899,6 +907,11 @@
nedges.insert(poly_ne1);
nedges.insert(poly_ne2);
+ if (update_rtrees) {
+ rtree_bbox_2d(s_cdt, poly_ne1);
+ rtree_bbox_2d(s_cdt, poly_ne2);
+ }
+
return nedges;
}
@@ -928,7 +941,7 @@
// 1. Any edges with at least 1 closed trim are split.
if (trim1->IsClosed() || trim2->IsClosed()) {
- esegs_closed = split_edge_seg(s_cdt, e, 1);
+ esegs_closed = split_edge_seg(s_cdt, e, 1, 1);
if (!esegs_closed.size()) {
// split failed?? On a closed edge this is fatal - we must
split it
// to work with it at all
@@ -944,7 +957,7 @@
if (!crv->IsLinear(BN_TOL_DIST)) {
std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
for (e_it = esegs_closed.begin(); e_it != esegs_closed.end();
e_it++) {
- std::set<cdt_mesh::bedge_seg_t *> efirst =
split_edge_seg(s_cdt, *e_it, 1);
+ std::set<cdt_mesh::bedge_seg_t *> efirst =
split_edge_seg(s_cdt, *e_it, 1, 1);
if (!efirst.size()) {
// split failed?? On a curved edge we must split at
least once to
// avoid potentially degenerate polygons (if we had to
split a closed
@@ -955,7 +968,7 @@
// one additional time
std::set<cdt_mesh::bedge_seg_t *>::iterator s_it;
for (s_it = efirst.begin(); s_it != efirst.end();
s_it++) {
- std::set<cdt_mesh::bedge_seg_t *> etmp =
split_edge_seg(s_cdt, *s_it, 1);
+ std::set<cdt_mesh::bedge_seg_t *> etmp =
split_edge_seg(s_cdt, *s_it, 1, 1);
if (!etmp.size()) {
// split failed?? This isn't good and shouldn't
// happen, but it's not fatal the way the
previous two
@@ -1259,7 +1272,7 @@
while (ws->size()) {
cdt_mesh::bedge_seg_t *b = *ws->begin();
ws->erase(ws->begin());
- std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 0);
+ std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 0, 0);
if (esegs_split.size()) {
ns->insert(esegs_split.begin(), esegs_split.end());
} else {
@@ -1403,7 +1416,7 @@
bool split_edge = (b->e_start->DistanceTo(*b->e_end) > split_tol);
if (split_edge) {
// If we need to split, do so
- std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 1);
+ std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 1, 0);
if (esegs_split.size()) {
ws->insert(esegs_split.begin(), esegs_split.end());
} else {
@@ -1450,7 +1463,7 @@
while (ws->size()) {
cdt_mesh::bedge_seg_t *b = *ws->begin();
ws->erase(ws->begin());
- std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 0);
+ std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 0, 0);
if (esegs_split.size()) {
ns->insert(esegs_split.begin(), esegs_split.end());
} else {
@@ -1591,7 +1604,7 @@
if (pe->eseg) {
cdt_mesh::bedge_seg_t *b = pe->eseg;
if (pe->split_status == 2) {
- std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 1);
+ std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 1, 1);
if (esegs_split.size()) {
split_check = true;
std::copy(esegs_split.begin(), esegs_split.end(),
std::back_inserter(curr_edge_segs[b->edge_ind]));
@@ -1618,7 +1631,7 @@
} else {
// Trim only, no edge.
if (pe->split_status == 2) {
- std::set<cdt_mesh::cpolyedge_t *> ntrims =
split_singular_seg(s_cdt, pe);
+ std::set<cdt_mesh::cpolyedge_t *> ntrims =
split_singular_seg(s_cdt, pe, 1);
if (ntrims.size()) {
std::copy(ntrims.begin(), ntrims.end(),
std::back_inserter(current_trims));
split_check = true;
@@ -1662,9 +1675,50 @@
}
}
+void
+finalize_2d_rtrees(struct ON_Brep_CDT_State *s_cdt)
+{
+ ON_Brep* brep = s_cdt->brep;
+ for (int face_index = 0; face_index < brep->m_F.Count(); face_index++) {
+ ON_BrepFace &face = s_cdt->brep->m_F[face_index];
+ s_cdt->face_rtrees_2d[face.m_face_index].RemoveAll();
+ cdt_mesh::cdt_mesh_t *fmesh = &s_cdt->fmeshes[face.m_face_index];
+ std::cout << "Face " << face.m_face_index << " final 2D rtree
build...\n";
+ std::vector<cdt_mesh::cpolyedge_t *> ws;
+ std::vector<cdt_mesh::cpolyedge_t *>::iterator w_it;
+ int loop_cnt = face.LoopCount();
+ for (int li = 0; li < loop_cnt; li++) {
+ const ON_BrepLoop *loop = face.Loop(li);
+ bool is_outer = (face.OuterLoop()->m_loop_index ==
loop->m_loop_index) ? true : false;
+ cdt_mesh::cpolygon_t *cpoly = NULL;
+ if (is_outer) {
+ cpoly = &fmesh->outer_loop;
+ } else {
+ cpoly = fmesh->inner_loops[li];
+ }
+ size_t ecnt = 1;
+ cdt_mesh::cpolyedge_t *pe = (*cpoly->poly.begin());
+ cdt_mesh::cpolyedge_t *first = pe;
+ cdt_mesh::cpolyedge_t *next = pe->next;
+ rtree_bbox_2d(s_cdt, first);
+ // Walk the loop
+ while (first != next) {
+ ecnt++;
+ if (!next) break;
+ rtree_bbox_2d(s_cdt, next);
+ next = next->next;
+ if (ecnt > cpoly->poly.size()) {
+ std::cerr << "\nrefine_close_edges: ERROR! encountered
infinite loop\n";
+ return;
+ }
+ }
+ }
+ }
+}
+
/** @} */
// Local Variables:
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits