Revision: 73802
          http://sourceforge.net/p/brlcad/code/73802
Author:   starseeker
Date:     2019-08-30 19:50:04 +0000 (Fri, 30 Aug 2019)
Log Message:
-----------
Didn't mean to commit that file yet.

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

Modified: brlcad/trunk/src/libbrep/cdt2.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt2.cpp   2019-08-30 19:48:16 UTC (rev 73801)
+++ brlcad/trunk/src/libbrep/cdt2.cpp   2019-08-30 19:50:04 UTC (rev 73802)
@@ -780,7 +780,6 @@
     // Next, for each face and each loop in each face define the initial
     // loop polygons.  Note there is no splitting of edges at this point -
     // we are simply establishing the initial closed polygons.
-    std::set<cdt_mesh::cpolyedge_t *> singular_edges;
     for (int face_index = 0; face_index < brep->m_F.Count(); face_index++) {
        ON_BrepFace &face = s_cdt->brep->m_F[face_index];
        int loop_cnt = face.LoopCount();
@@ -804,13 +803,14 @@
            long cv = -1;
            long pv = -1;
            long fv = -1;
-
            for (int lti = 0; lti < trim_count; lti++) {
                ON_BrepTrim *trim = loop->Trim(lti);
+               //int sind = (trim->m_bRev3d) ? 1 : 0;
+               //int eind = (trim->m_bRev3d) ? 0 : 1;
                ON_Interval range = trim->Domain();
                if (lti == 0) {
                    // Get the 2D point, add it to the mesh and current polygon
-                   cp = trim->PointAt(range.m_t[0]);
+                   cp = trim->PointAt(range.m_t[0]); // Note: deliberately not 
using sind here
                    long find = fmesh->add_point(cp);
                    pv = cpoly->add_point(cp, find);
                    fv = pv;
@@ -835,35 +835,39 @@
                }
 
                // Get the 2D point, add it to the mesh and current polygon
-               cp = trim->PointAt(range.m_t[1]);
-               if (lti == trim_count - 1) {
-                   cv = fv;
-               } else {
-                   long find;
-                   find = fmesh->add_point(cp);
-                   cv = cpoly->add_point(cp, find);
+               cp = trim->PointAt(range.m_t[1]); // Note: deliberately not 
using eind here
+               long find = fmesh->add_point(cp);
+               cv = cpoly->add_point(cp, find);
 
-                   // Let cdt_mesh know about the 3D information
-                   ON_3dVector norm = ON_3dVector::UnsetVector;
-                   if (trim->m_type != ON_BrepTrim::singular) {
-                       // 3D points are globally unique, but normals are not - 
the same edge point may
-                       // have different normals from two faces at a sharp 
edge.  Calculate the
-                       // face normal for this point on this surface.
-                       ON_3dPoint tmp1;
-                       surface_EvNormal(trim->SurfaceOf(), cp.x, cp.y, tmp1, 
norm);
-                   }
-
-                   ON_3dPoint *cp3d = 
(*s_cdt->vert_pnts)[trim->Vertex(1)->m_vertex_index];
-                   long f3ind = fmesh->add_point(cp3d);
-                   long fnind = fmesh->add_normal(new ON_3dPoint(norm));
-                   fmesh->p2d3d[find] = f3ind;
-                   fmesh->nmap[f3ind] = fnind;
+               // Let cdt_mesh know about the 3D information
+               ON_3dVector norm = ON_3dVector::UnsetVector;
+               if (trim->m_type != ON_BrepTrim::singular) {
+                   // 3D points are globally unique, but normals are not - the 
same edge point may
+                   // have different normals from two faces at a sharp edge.  
Calculate the
+                   // face normal for this point on this surface.
+                   ON_3dPoint tmp1;
+                   surface_EvNormal(trim->SurfaceOf(), cp.x, cp.y, tmp1, norm);
                }
+               ON_3dPoint *cp3d = 
(*s_cdt->vert_pnts)[trim->Vertex(1)->m_vertex_index];
+               long f3ind = fmesh->add_point(cp3d);
+               long fnind = fmesh->add_normal(new ON_3dPoint(norm));
+               fmesh->p2d3d[find] = f3ind;
+               fmesh->nmap[f3ind] = fnind;
 
                struct cdt_mesh::edge_t lseg(pv, cv);
                cdt_mesh::cpolyedge_t *ne = cpoly->add_edge(lseg);
                ne->trim_ind = trim->m_trim_index;
 
+               // When breaking down a reversed-in-3D trim, the driving edge
+               // segment will be referencing the opposite side of the flipped
+               // edge compared to what the loop expects.  For edge driven
+               // splitting, we need to think about the domain of the trim in
+               // reverse.  The initial trim edge (pv and cv) we set up in the
+               // correct numerical order rather than using sind/eind and
+               // handle the 3D flip by linking to the opposite 3D vertex
+               // points (since the vertex points are a special case anyway)
+               // but for subsequent splitting operations we need to reverse
+               // our notions of where the trim curve starts and ends.
                ne->trim_start = range.m_t[0];
                ne->trim_end = range.m_t[1];
 
@@ -884,14 +888,10 @@
                    // A null eseg will indicate a singularity and a need for 
special case
                    // splitting of the 2D edge only
                    ne->eseg = NULL;
-                   singular_edges.insert(ne);
                }
            }
-
-           if (!cpoly->closed()) {
-               std::cerr << "Failed to create valid loop!\n";
-           }
-           cpoly->print();
+           struct cdt_mesh::edge_t last_seg(cv, fv);
+           cpoly->add_edge(last_seg);
        }
     }
 
@@ -1033,6 +1033,39 @@
     }
 
     // TODO - split singularity trims in 2D
+    std::set<cdt_mesh::cpolyedge_t *> singular_edges;
+    for (int face_index = 0; face_index < brep->m_F.Count(); face_index++) {
+       ON_BrepFace &face = s_cdt->brep->m_F[face_index];
+       int loop_cnt = face.LoopCount();
+       cdt_mesh::cdt_mesh_t *fmesh = &s_cdt->fmeshes[face_index];
+       cdt_mesh::cpolygon_t *cpoly = NULL;
+
+
+       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;
+           cpoly =  (is_outer) ? &fmesh->outer_loop :fmesh->inner_loops[li];
+           if (!cpoly->poly.size()) continue;  // Shouldn't be possible?...
+           cdt_mesh::cpolyedge_t *pe = (*cpoly->poly.begin());
+           cdt_mesh::cpolyedge_t *first = pe;
+           cdt_mesh::cpolyedge_t *next = pe->next;
+
+           if (!first->eseg) singular_edges.insert(first);
+
+           // Walk the loop - an infinite loop is not closed
+           size_t ecnt = 1;
+           while (first != next) {
+               ecnt++;
+               if (!next) break;
+               if (!next->eseg) singular_edges.insert(next);
+               next = next->next;
+               if (ecnt > cpoly->poly.size()) {
+                   std::cout << "\nERROR infinite loop\n";
+                   break;
+               }
+           }
+       }
+    }
     if (singular_edges.size()) {
        std::cout << "Have " << singular_edges.size() << " singular edges\n";
     }

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