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

Reply via email to