Revision: 73801
          http://sourceforge.net/p/brlcad/code/73801
Author:   starseeker
Date:     2019-08-30 19:48:16 +0000 (Fri, 30 Aug 2019)
Log Message:
-----------
Initialize

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

Modified: brlcad/trunk/src/libbrep/cdt2.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt2.cpp   2019-08-30 18:50:55 UTC (rev 73800)
+++ brlcad/trunk/src/libbrep/cdt2.cpp   2019-08-30 19:48:16 UTC (rev 73801)
@@ -780,6 +780,7 @@
     // 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();
@@ -803,14 +804,13 @@
            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]); // Note: deliberately not 
using sind here
+                   cp = trim->PointAt(range.m_t[0]);
                    long find = fmesh->add_point(cp);
                    pv = cpoly->add_point(cp, find);
                    fv = pv;
@@ -835,39 +835,35 @@
                }
 
                // Get the 2D point, add it to the mesh and current polygon
-               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);
+               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);
 
-               // 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);
+                   // 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;
                }
-               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];
 
@@ -888,10 +884,14 @@
                    // 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);
                }
            }
-           struct cdt_mesh::edge_t last_seg(cv, fv);
-           cpoly->add_edge(last_seg);
+
+           if (!cpoly->closed()) {
+               std::cerr << "Failed to create valid loop!\n";
+           }
+           cpoly->print();
        }
     }
 
@@ -1033,39 +1033,6 @@
     }
 
     // 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";
     }

Modified: brlcad/trunk/src/libbrep/cdt_mesh.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.h 2019-08-30 18:50:55 UTC (rev 73800)
+++ brlcad/trunk/src/libbrep/cdt_mesh.h 2019-08-30 19:48:16 UTC (rev 73801)
@@ -274,11 +274,20 @@
        cpolyedge_t *prev;
        cpolyedge_t *next;
 
+       cpolyedge_t() {
+           v[0] = -1;
+           v[1] = -1;
+           polygon = NULL;
+           prev = NULL;
+           next = NULL;
+       };
+
        long v[2];
 
        cpolyedge_t(edge_t &e){
            v[0] = e.v[0];
            v[1] = e.v[1];
+           polygon = NULL;
            prev = NULL;
            next = NULL;
        };

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