Revision: 74213
          http://sourceforge.net/p/brlcad/code/74213
Author:   starseeker
Date:     2019-10-22 16:49:49 +0000 (Tue, 22 Oct 2019)
Log Message:
-----------
Make a stab at tracking edges through splitting

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/cdt_ovlps.cpp

Modified: brlcad/trunk/src/libbrep/cdt_ovlps.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-10-22 16:16:55 UTC (rev 
74212)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-10-22 16:49:49 UTC (rev 
74213)
@@ -337,13 +337,14 @@
        void plot();
 
        void verts_one_ring_update(long p_id);
+
+       void edge_add(cdt_mesh::uedge_t &ue, int update_verts);
+       void edge_remove(cdt_mesh::uedge_t &ue, int update_verts);
+
     private:
        void init_verts();
        void init_edges();
 
-       void edge_add(cdt_mesh::uedge_t &ue, int update_verts);
-       void edge_remove(cdt_mesh::uedge_t &ue, int update_verts);
-
        void edge_tris_remove(cdt_mesh::uedge_t &ue);
 
 };
@@ -1754,7 +1755,9 @@
 } 
 
 void
-replace_edge_split_tri(cdt_mesh::cdt_mesh_t &fmesh, size_t t_id, long np_id, 
cdt_mesh::uedge_t &split_edge)
+replace_edge_split_tri(cdt_mesh::cdt_mesh_t &fmesh, size_t t_id, long np_id,
+               cdt_mesh::uedge_t &split_edge, std::map<cdt_mesh::cdt_mesh_t *, 
omesh_t *> f2omap
+       )
 {
     cdt_mesh::triangle_t &t = fmesh.tris_vect[t_id];
 
@@ -1768,6 +1771,7 @@
        long v1 = (i < 2) ? t.v[i + 1] : t.v[0];
        cdt_mesh::edge_t ec(v0, v1);
        cdt_mesh::uedge_t uec(ec);
+       f2omap[&fmesh]->edge_remove(uec, 0);
        if (uec != split_edge) {
            if (!ecnt) {
                e1 = ec;
@@ -1778,6 +1782,7 @@
        }
     }
 
+
     cdt_mesh::triangle_t ntri1, ntri2;
     ntri1.v[0] = e1.v[0];
     ntri1.v[1] = np_id;
@@ -1793,6 +1798,17 @@
     fmesh.tri_add(ntri1);
     fmesh.tri_add(ntri2);
 
+    std::set<cdt_mesh::uedge_t> nedges;
+    std::set<cdt_mesh::uedge_t> n1 = fmesh.uedges(ntri1);
+    std::set<cdt_mesh::uedge_t> n2 = fmesh.uedges(ntri2);
+    nedges.insert(n1.begin(), n1.end());
+    nedges.insert(n2.begin(), n2.end());
+    std::set<cdt_mesh::uedge_t>::iterator n_it;
+    for (n_it = nedges.begin(); n_it != nedges.end(); n_it++) {
+       cdt_mesh::uedge_t ne = *n_it;
+       f2omap[&fmesh]->edge_add(ne, 0);
+    }
+
     fmesh.tri_plot(ntri1, "nt1.plot3");
     fmesh.tri_plot(ntri2, "nt2.plot3");
 }
@@ -1881,34 +1897,25 @@
        np_id = fmesh_f1.pnts.size() - 1;
        fmesh_f1.ep.insert(np_id);
        for (tr_it = ftris.begin(); tr_it != ftris.end(); tr_it++) {
-           replace_edge_split_tri(fmesh_f1, *tr_it, np_id, ue);
+           replace_edge_split_tri(fmesh_f1, *tr_it, np_id, ue, f2omap);
            replaced_tris++;
        }
 
-
-       // TODO - update edges
-       
        f2omap[&fmesh_f1]->vert_add(np_id);
        
     } else {
        np_id = fmesh_f1.pnts.size() - 1;
        fmesh_f1.ep.insert(np_id);
-       replace_edge_split_tri(fmesh_f1, *f1_tris.begin(), np_id, ue1);
+       replace_edge_split_tri(fmesh_f1, *f1_tris.begin(), np_id, ue1, f2omap);
        replaced_tris++;
 
-       // TODO - update edges
-
        f2omap[&fmesh_f1]->vert_add(np_id);
 
-
-
        np_id = fmesh_f2.pnts.size() - 1;
        fmesh_f2.ep.insert(np_id);
-       replace_edge_split_tri(fmesh_f2, *f2_tris.begin(), np_id, ue2);
+       replace_edge_split_tri(fmesh_f2, *f2_tris.begin(), np_id, ue2, f2omap);
        replaced_tris++;
 
-       // TODO - update edges
-
        f2omap[&fmesh_f2]->vert_add(np_id);
     }
 
@@ -2285,7 +2292,7 @@
     }
     std::cout << "Need to refine " << omeshes.size() << " meshes\n";
     // Filter out brep face edges - they must be handled first in a face 
independent split
-    std::queue<cdt_mesh::bedge_seg_t *> brep_edges_to_split;
+    std::set<cdt_mesh::bedge_seg_t *> brep_edges_to_split;
     std::set<omesh_t *>::iterator o_it;
     for (o_it = omeshes.begin(); o_it != omeshes.end(); o_it++) {
        omesh_t *omesh = *o_it;
@@ -2293,7 +2300,7 @@
        std::set<cdt_mesh::uedge_t>::iterator u_it;
        for (u_it = omesh->split_edges.begin(); u_it != 
omesh->split_edges.end(); u_it++) {
            if (omesh->fmesh->brep_edges.find(*u_it) != 
omesh->fmesh->brep_edges.end()) {
-               brep_edges_to_split.push(omesh->fmesh->ue2b_map[*u_it]); 
+               brep_edges_to_split.insert(omesh->fmesh->ue2b_map[*u_it]); 
                bedges.insert(*u_it);
            }
        }
@@ -2303,9 +2310,9 @@
     }
 
     std::cout << "Split " << brep_edges_to_split.size() << " brep edges\n";
-    while (!brep_edges_to_split.empty()) {
-       cdt_mesh::bedge_seg_t *bseg = brep_edges_to_split.front();
-       brep_edges_to_split.pop();
+    while (brep_edges_to_split.size()) {
+       cdt_mesh::bedge_seg_t *bseg = *brep_edges_to_split.begin();
+       brep_edges_to_split.erase(brep_edges_to_split.begin());
        double tmid = (bseg->edge_start + bseg->edge_end) * 0.5;
        int rtris = ovlp_split_edge(NULL, bseg, tmid, f2omap);
        if (rtris <= 0) {

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