Revision: 74211
          http://sourceforge.net/p/brlcad/code/74211
Author:   starseeker
Date:     2019-10-22 15:43:48 +0000 (Tue, 22 Oct 2019)
Log Message:
-----------
checkpoint

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

Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp    2019-10-22 13:36:41 UTC (rev 74210)
+++ brlcad/trunk/src/libbrep/cdt.cpp    2019-10-22 15:43:48 UTC (rev 74211)
@@ -160,6 +160,7 @@
     fmesh->ep.insert(p1_ind);
     fmesh->ep.insert(p2_ind);
     fmesh->brep_edges.insert(cdt_mesh::uedge_t(p1_ind, p2_ind));
+    fmesh->ue2b_map[cdt_mesh::uedge_t(p1_ind, p2_ind)] = pe->eseg;
 
     while (first != next) {
        vcnt++;
@@ -168,6 +169,7 @@
        fmesh->ep.insert(p1_ind);
        fmesh->ep.insert(p2_ind);
        fmesh->brep_edges.insert(cdt_mesh::uedge_t(p1_ind, p2_ind));
+       fmesh->ue2b_map[cdt_mesh::uedge_t(p1_ind, p2_ind)] = next->eseg;
        next = next->next;
        if (vcnt > loop->poly.size()) {
            std::cerr << "infinite loop when reading loop edges\n";
@@ -241,6 +243,7 @@
 
     // List edges
     fmesh->brep_edges.clear();
+    fmesh->ue2b_map.clear();
     loop_edges(fmesh, &fmesh->outer_loop);
     std::map<int, cdt_mesh::cpolygon_t*>::iterator i_it;
     for (i_it = fmesh->inner_loops.begin(); i_it != fmesh->inner_loops.end(); 
i_it++) {

Modified: brlcad/trunk/src/libbrep/cdt_mesh.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.h 2019-10-22 13:36:41 UTC (rev 74210)
+++ brlcad/trunk/src/libbrep/cdt_mesh.h 2019-10-22 15:43:48 UTC (rev 74211)
@@ -550,6 +550,7 @@
 
     // cdt_mesh index versions of Brep data
     std::set<uedge_t> brep_edges;
+    std::map<uedge_t, bedge_seg_t *> ue2b_map;
     std::set<long> ep; // Brep edge point vertex indices
     std::set<long> sv; // Singularity vertex indices
     bool m_bRev;

Modified: brlcad/trunk/src/libbrep/cdt_ovlps.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-10-22 13:36:41 UTC (rev 
74210)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-10-22 15:43:48 UTC (rev 
74211)
@@ -333,6 +333,8 @@
 
        std::set<overt_t*> intruding_pnts;
 
+       std::set<cdt_mesh::uedge_t> split_edges;
+
        cdt_mesh::cdt_mesh_t *fmesh;
 
        void plot(const char *fname);
@@ -1808,7 +1810,8 @@
 }
 
 int
-ovlp_split_edge(std::set<cdt_mesh::bedge_seg_t *> *nsegs, 
cdt_mesh::bedge_seg_t *eseg, double t)
+ovlp_split_edge(std::set<cdt_mesh::bedge_seg_t *> *nsegs, 
cdt_mesh::bedge_seg_t *eseg, double t,
+    std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap)
 {
     int replaced_tris = 0;
 
@@ -1829,6 +1832,8 @@
     cdt_mesh::uedge_t ue2(poly2->p2o[eseg->tseg2->v[0]], 
poly2->p2o[eseg->tseg2->v[1]]);
     fmesh_f1.brep_edges.erase(ue1); 
     fmesh_f2.brep_edges.erase(ue2); 
+    fmesh_f1.ue2b_map.erase(ue1); 
+    fmesh_f2.ue2b_map.erase(ue2); 
     //ON_3dPoint ue1_p1 = *fmesh_f1.pnts[ue1.v[0]];
     //ON_3dPoint ue1_p2 = *fmesh_f1.pnts[ue1.v[1]];
     //std::cout << f_id1 << " ue1: " << ue1.v[0] << "," << ue1.v[1] << ": " << 
ue1_p1.x << "," << ue1_p1.y << "," << ue1_p1.z << " -> " << ue1_p2.x << "," << 
ue1_p2.y << "," << ue1_p2.z << "\n";
@@ -1869,6 +1874,8 @@
        cdt_mesh::uedge_t ue_2(poly_2->p2o[es->tseg2->v[0]], 
poly_2->p2o[es->tseg2->v[1]]);
        f1.brep_edges.insert(ue_1); 
        f2.brep_edges.insert(ue_2); 
+       f1.ue2b_map[ue_1] = es; 
+       f2.ue2b_map[ue_2] = es; 
     }
 
     long np_id;
@@ -1896,6 +1903,12 @@
        replaced_tris++;
     }
 
+    // TODO - add edges and vertices introduced into the mesh by the split to 
the omesh
+    // containers
+    if (f2omap.size()) {
+       std::cout << "TODO - didn't update omesh correctly after split!\n";
+    }
+
     return replaced_tris;
 }
 
@@ -1902,7 +1915,8 @@
 int
 split_brep_face_edges_near_verts(
        std::set<struct ON_Brep_CDT_State *> &a_cdt,
-       std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs
+       std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs,
+       std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
        )
 {
     std::map<long, cdt_mesh::bedge_seg_t *> b_edges;
@@ -2026,10 +2040,11 @@
            int f_id1 = 
s_cdt_edge->brep->m_T[eseg->tseg1->trim_ind].Face()->m_face_index;
            int f_id2 = 
s_cdt_edge->brep->m_T[eseg->tseg2->trim_ind].Face()->m_face_index;
 #endif
-
-           int rtris = ovlp_split_edge(NULL, eseg, t);
+           int rtris = ovlp_split_edge(NULL, eseg, t, f2omap);
            if (rtris >= 0) {
                replaced_tris += rtris;
+
+
 #if 0
                cdt_mesh::cdt_mesh_t &fmesh_f1 = s_cdt_edge->fmeshes[f_id1];
                cdt_mesh::cdt_mesh_t &fmesh_f2 = s_cdt_edge->fmeshes[f_id2];
@@ -2111,9 +2126,10 @@
 }
 #endif
 
-void
-get_intruding_points(std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs)
+int
+characterize_tri_intersections(std::set<std::pair<omesh_t *, omesh_t *>> 
&check_pairs)
 {
+    int ret = 0;
     std::set<std::pair<omesh_t *, omesh_t *>>::iterator cp_it;
     for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
        omesh_t *omesh1 = cp_it->first;
@@ -2152,11 +2168,13 @@
                ON_3dPoint tp = *omesh2->fmesh->pnts[t2.v[i]];
                double dist = plane1.DistanceTo(tp);
                if (dist < 0 && fabs(dist) > ON_ZERO_TOLERANCE && 
on_point_inside(s_cdt1, &tp)) {
+#if 0
                    std::cout << s_cdt1->name << " face " << 
omesh1->fmesh->f_id << " test point inside from " << s_cdt2->name << " face " 
<< omesh2->fmesh->f_id << ":\n";
                    std::cout << "ip: " << omesh2->overts[t2.v[i]]->vpnt().x << 
"," << omesh2->overts[t2.v[i]]->vpnt().y << "," << 
omesh2->overts[t2.v[i]]->vpnt().z << "\n";
                    std::cout << "dist: " << dist << "\n";
                    std::cout << "isectpt1: " << isectpt1[X] << "," << 
isectpt1[Y] << "," << isectpt1[Z] << "\n";
                    std::cout << "isectpt2: " << isectpt2[X] << "," << 
isectpt2[Y] << "," << isectpt2[Z] << "\n";
+#endif
                    omesh1->intruding_pnts.insert(omesh2->overts[t2.v[i]]);
                    have_interior_pnt = true;
 #if 0
@@ -2202,11 +2220,13 @@
                ON_3dPoint tp = *omesh1->fmesh->pnts[t1.v[i]];
                double dist = plane2.DistanceTo(tp);
                if (dist < 0 && fabs(dist) > ON_ZERO_TOLERANCE && 
on_point_inside(s_cdt2, &tp)) {
+#if 0
                    std::cout << s_cdt2->name << " face " << 
omesh2->fmesh->f_id << " test point inside from " << s_cdt1->name << " face " 
<< omesh1->fmesh->f_id << ":\n";
                    std::cout << "ip: " << omesh1->overts[t1.v[i]]->vpnt().x << 
"," << omesh1->overts[t1.v[i]]->vpnt().y << "," << 
omesh1->overts[t1.v[i]]->vpnt().z << "\n";
                    std::cout << "dist: " << dist << "\n";
                    std::cout << "isectpt1: " << isectpt1[X] << "," << 
isectpt1[Y] << "," << isectpt1[Z] << "\n";
                    std::cout << "isectpt2: " << isectpt2[X] << "," << 
isectpt2[Y] << "," << isectpt2[Z] << "\n";
+#endif
                    omesh2->intruding_pnts.insert(omesh1->overts[t1.v[i]]);
                    have_interior_pnt = true;
                }
@@ -2213,14 +2233,106 @@
            }
            if (!have_interior_pnt) {
                std::cout << "PROBLEM - intersecting triangles but no vertex 
points are interior!\n";
+               // Strategy here - queue up all the unordered edges on both 
triangles in their
+               // respective omeshes for midpoint splitting.
+               {
+                   // Mesh 1, triangle 1
+                   std::set<cdt_mesh::uedge_t> uedges = 
omesh1->fmesh->uedges(t1);
+                   omesh1->split_edges.insert(uedges.begin(), uedges.end());
+               }
+               {
+                   // Mesh 2, triangle 2
+                   std::set<cdt_mesh::uedge_t> uedges = 
omesh2->fmesh->uedges(t2);
+                   omesh2->split_edges.insert(uedges.begin(), uedges.end());
+               }
+               ret = 2;
            }
        }
     }
+
+    if (ret == 2) {
+       // If we need to refine (i.e. change the mesh) we're going to have to 
go through
+       // the interior identification process again.
+       for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
+           cp_it->first->intruding_pnts.clear();
+           cp_it->second->intruding_pnts.clear();
+       }
+    }
+
+    return ret;
 }
 
 void
-process_near_edge_pnts(std::map<cdt_mesh::cdt_mesh_t *, std::set<struct 
p_mvert_info *>> *face_npnts)
+refine_omeshes(
+       std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs,
+       std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
+       )
 {
+    std::set<omesh_t *> omeshes;
+    std::set<std::pair<omesh_t *, omesh_t *>>::iterator cp_it;
+    for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
+       omesh_t *omesh1 = cp_it->first;
+       omesh_t *omesh2 = cp_it->second;
+       if (omesh1->split_edges.size()) {
+           omeshes.insert(omesh1);
+       }
+       if (omesh2->split_edges.size()) {
+           omeshes.insert(omesh2);
+       }
+    }
+    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<omesh_t *>::iterator o_it;
+    for (o_it = omeshes.begin(); o_it != omeshes.end(); o_it++) {
+       omesh_t *omesh = *o_it;
+       std::set<cdt_mesh::uedge_t> bedges;
+       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]); 
+               bedges.insert(*u_it);
+           }
+       }
+       for (u_it = bedges.begin(); u_it != bedges.end(); u_it++) {
+           omesh->split_edges.erase(*u_it);
+       }
+    }
+
+    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();
+       double tmid = (bseg->edge_start + bseg->edge_end) * 0.5;
+       int rtris = ovlp_split_edge(NULL, bseg, tmid, f2omap);
+       if (rtris <= 0) {
+           std::cout << "edge split failed!\n";
+       }
+    }
+
+    for (o_it = omeshes.begin(); o_it != omeshes.end(); o_it++) {
+       omesh_t *omesh = *o_it;
+       std::set<cdt_mesh::uedge_t>::iterator u_it;
+       for (u_it = omesh->split_edges.begin(); u_it != 
omesh->split_edges.end(); u_it++) {
+           cdt_mesh::uedge_t ue = *u_it;
+           ON_3dPoint p1 = *omesh->fmesh->pnts[ue.v[0]];
+           ON_3dPoint p2 = *omesh->fmesh->pnts[ue.v[1]];
+           double dist = p1.DistanceTo(p2);
+           ON_3dPoint pmid = (p1 + p2) * 0.5;
+           ON_3dPoint spnt;
+           ON_3dVector sn;
+           closest_surf_pnt(spnt, sn, *omesh->fmesh, &pmid, 2*dist);
+       }
+    }
+
+
+
+}
+
+void
+process_near_edge_pnts(std::map<cdt_mesh::cdt_mesh_t *, std::set<struct 
p_mvert_info *>> *face_npnts, 
+    std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap)
+{
     std::map<cdt_mesh::bedge_seg_t *, std::set<struct p_mvert_info *>> esplits;
     std::map<cdt_mesh::cdt_mesh_t *, std::set<struct p_mvert_info 
*>>::iterator f_it;
     for (f_it = face_npnts->begin(); f_it != face_npnts->end(); f_it++) {
@@ -2390,7 +2502,7 @@
                int f_id1 = 
s_cdt_edge->brep->m_T[closest_edge->tseg1->trim_ind].Face()->m_face_index;
                int f_id2 = 
s_cdt_edge->brep->m_T[closest_edge->tseg2->trim_ind].Face()->m_face_index;
 #endif
-               ovlp_split_edge(&nsegs, closest_edge, split_t);
+               ovlp_split_edge(&nsegs, closest_edge, split_t, f2omap);
 #if 1
                cdt_mesh::cdt_mesh_t &fmesh_f1 = s_cdt_edge->fmeshes[f_id1];
                cdt_mesh::cdt_mesh_t &fmesh_f2 = s_cdt_edge->fmeshes[f_id2];
@@ -2558,7 +2670,7 @@
        a_cdt.insert((struct ON_Brep_CDT_State *)p_it->first->p_cdt);
        a_cdt.insert((struct ON_Brep_CDT_State *)p_it->second->p_cdt);
     }
-    int sbfvtri_cnt = split_brep_face_edges_near_verts(a_cdt, ocheck_pairs);
+    int sbfvtri_cnt = split_brep_face_edges_near_verts(a_cdt, ocheck_pairs, 
f2omap);
     if (sbfvtri_cnt) {
        std::cout << "Replaced " << sbfvtri_cnt << " triangles by splitting 
edges near vertices\n";
        check_faces_validity(check_pairs, 2);
@@ -2574,7 +2686,9 @@
     }
 #endif
 
-    get_intruding_points(ocheck_pairs);
+    while (characterize_tri_intersections(ocheck_pairs) == 2) {
+       refine_omeshes(ocheck_pairs, f2omap);
+    }
 
     //process_near_edge_pnts(face_npnts);
 

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