Revision: 73216
          http://sourceforge.net/p/brlcad/code/73216
Author:   starseeker
Date:     2019-05-31 17:39:02 +0000 (Fri, 31 May 2019)
Log Message:
-----------
Start working on reorganizing the data groupings to be somewhat more face 
centeric, so it's clear which data is local to the face and which is not.  
Untested.

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/cdt.cpp
    brlcad/trunk/src/libbrep/cdt.h
    brlcad/trunk/src/libbrep/cdt_edge.cpp
    brlcad/trunk/src/libbrep/cdt_surf.cpp
    brlcad/trunk/src/libbrep/cdt_util.cpp

Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp    2019-05-31 11:12:44 UTC (rev 73215)
+++ brlcad/trunk/src/libbrep/cdt.cpp    2019-05-31 17:39:02 UTC (rev 73216)
@@ -141,9 +141,9 @@
 triangles_first_pass(struct ON_Brep_CDT_State *s_cdt, struct on_brep_mesh_data 
*md, int face_index)
 {
     ON_BrepFace &face = s_cdt->brep->m_F[face_index];
-    p2t::CDT *cdt = s_cdt->p2t_faces[face_index];
-    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
s_cdt->tri_to_on3_maps[face_index];
-    std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
s_cdt->tri_to_on3_norm_maps[face_index];
+    p2t::CDT *cdt = (*s_cdt->faces)[face_index]->cdt;
+    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_map;
+    std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_norm_map;
     std::vector<p2t::Triangle*> tris = cdt->GetTriangles();
     md->triangle_cnt += tris.size();
     for (size_t i = 0; i < tris.size(); i++) {
@@ -236,8 +236,8 @@
     // edge segment length of the face to decide if a face is degenerate
     // based on area.
     fastf_t dist = 0.001 * (*s_cdt->min_edge_seg_len)[face_index];
-    p2t::CDT *cdt = s_cdt->p2t_faces[face_index];
-    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
s_cdt->tri_to_on3_maps[face_index];
+    p2t::CDT *cdt = (*s_cdt->faces)[face_index]->cdt;
+    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_map;
     std::vector<p2t::Triangle*> tris = cdt->GetTriangles();
     for (size_t i = 0; i < tris.size(); i++) {
        p2t::Triangle *t = tris[i];
@@ -283,12 +283,9 @@
            p2t::Point *p2_B = t->GetPoint(1);
            p2t::Point *p2_C = t->GetPoint(2);
 
-           if (!s_cdt->face_degen_pnts[face_index]) {
-               s_cdt->face_degen_pnts[face_index] = new std::set<p2t::Point *>;
-           }
-           s_cdt->face_degen_pnts[face_index]->insert(p2_A);
-           s_cdt->face_degen_pnts[face_index]->insert(p2_B);
-           s_cdt->face_degen_pnts[face_index]->insert(p2_C);
+           (*s_cdt->faces)[face_index]->degen_pnts->insert(p2_A);
+           (*s_cdt->faces)[face_index]->degen_pnts->insert(p2_B);
+           (*s_cdt->faces)[face_index]->degen_pnts->insert(p2_C);
 
            /* If we have degeneracies along an edge, the impact is not
             * local to this face but will also impact the other face.
@@ -298,21 +295,18 @@
            ON_3dPoint *pt_B = (*pointmap)[p2_B];
            ON_3dPoint *pt_C = (*pointmap)[p2_C];
            std::set<BrepTrimPoint *>::iterator bit;
-           std::set<BrepTrimPoint *> &pAt = s_cdt->on_brep_edge_pnts[pt_A];
-           std::set<BrepTrimPoint *> &pBt = s_cdt->on_brep_edge_pnts[pt_B];
-           std::set<BrepTrimPoint *> &pCt = s_cdt->on_brep_edge_pnts[pt_C];
+           std::set<BrepTrimPoint *> &pAt = (*s_cdt->on_brep_edge_pnts)[pt_A];
+           std::set<BrepTrimPoint *> &pBt = (*s_cdt->on_brep_edge_pnts)[pt_B];
+           std::set<BrepTrimPoint *> &pCt = (*s_cdt->on_brep_edge_pnts)[pt_C];
            for (bit = pAt.begin(); bit != pAt.end(); bit++) {
                BrepTrimPoint *tpt = *bit;
                int f2ind = 
s_cdt->brep->m_T[tpt->trim_ind].Face()->m_face_index;
                if (f2ind != face_index) {
                    //bu_log("Pulls in face %d\n", f2ind);
-                   if (!s_cdt->face_degen_pnts[f2ind]) {
-                       s_cdt->face_degen_pnts[f2ind] = new std::set<p2t::Point 
*>;
-                   }
-                   std::set<p2t::Point *> tri_pnts = 
(*s_cdt->on3_to_tri_maps[f2ind])[pt_A];
+                   std::set<p2t::Point *> tri_pnts = 
(*(*s_cdt->faces)[face_index]->on3_to_tri_map)[pt_A];
                    std::set<p2t::Point *>::iterator tp_it;
                    for (tp_it = tri_pnts.begin(); tp_it != tri_pnts.end(); 
tp_it++) {
-                       s_cdt->face_degen_pnts[f2ind]->insert(*tp_it);
+                       (*s_cdt->faces)[face_index]->degen_pnts->insert(*tp_it);
                    }
                }
            }
@@ -321,13 +315,10 @@
                int f2ind = 
s_cdt->brep->m_T[tpt->trim_ind].Face()->m_face_index;
                if (f2ind != face_index) {
                    //bu_log("Pulls in face %d\n", f2ind);
-                   if (!s_cdt->face_degen_pnts[f2ind]) {
-                       s_cdt->face_degen_pnts[f2ind] = new std::set<p2t::Point 
*>;
-                   }
-                   std::set<p2t::Point *> tri_pnts = 
(*s_cdt->on3_to_tri_maps[f2ind])[pt_B];
+                   std::set<p2t::Point *> tri_pnts = 
(*(*s_cdt->faces)[face_index]->on3_to_tri_map)[pt_B];
                    std::set<p2t::Point *>::iterator tp_it;
                    for (tp_it = tri_pnts.begin(); tp_it != tri_pnts.end(); 
tp_it++) {
-                       s_cdt->face_degen_pnts[f2ind]->insert(*tp_it);
+                       (*s_cdt->faces)[face_index]->degen_pnts->insert(*tp_it);
                    }
                }
            }
@@ -336,13 +327,10 @@
                int f2ind = 
s_cdt->brep->m_T[tpt->trim_ind].Face()->m_face_index;
                if (f2ind != face_index) {
                    //bu_log("Pulls in face %d\n", f2ind);
-                   if (!s_cdt->face_degen_pnts[f2ind]) {
-                       s_cdt->face_degen_pnts[f2ind] = new std::set<p2t::Point 
*>;
-                   }
-                   std::set<p2t::Point *> tri_pnts = 
(*s_cdt->on3_to_tri_maps[f2ind])[pt_C];
+                   std::set<p2t::Point *> tri_pnts = 
(*(*s_cdt->faces)[face_index]->on3_to_tri_map)[pt_C];
                    std::set<p2t::Point *>::iterator tp_it;
                    for (tp_it = tri_pnts.begin(); tp_it != tri_pnts.end(); 
tp_it++) {
-                       s_cdt->face_degen_pnts[f2ind]->insert(*tp_it);
+                       (*s_cdt->faces)[face_index]->degen_pnts->insert(*tp_it);
                    }
                }
            }
@@ -357,9 +345,9 @@
 static void
 triangles_incorrect_normals(struct ON_Brep_CDT_State *s_cdt, struct 
on_brep_mesh_data *md, int face_index)
 {
-    p2t::CDT *cdt = s_cdt->p2t_faces[face_index];
-    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
s_cdt->tri_to_on3_maps[face_index];
-    std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
s_cdt->tri_to_on3_norm_maps[face_index];
+    p2t::CDT *cdt = (*s_cdt->faces)[face_index]->cdt;
+    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_map;
+    std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_norm_map;
     std::vector<p2t::Triangle*> tris = cdt->GetTriangles();
     for (size_t i = 0; i < tris.size(); i++) {
        p2t::Triangle *t = tris[i];
@@ -389,9 +377,10 @@
        if (invalid_face_normal == 3) {
            int tind[3] = {-1, -1, -1};
            int edge_pnt_cnt = 0;
+           std::map<p2t::Point *, int> *p2t_trim_ind = 
(*s_cdt->faces)[face_index]->p2t_trim_ind;
            for (int j = 0; j < 3; j++) {
-               if (s_cdt->p2t_edge_points->find(p[j]) != 
s_cdt->p2t_edge_points->end()) {
-                   tind[j] = (*s_cdt->p2t_edge_points)[p[j]];
+               if (p2t_trim_ind->find(p[j]) != p2t_trim_ind->end()) {
+                   tind[j] = (*p2t_trim_ind)[p[j]];
                    edge_pnt_cnt++;
                }
            }
@@ -404,7 +393,7 @@
                bu_log("Tri p3: %f %f %f\n", (*pointmap)[t->GetPoint(2)]->x, 
(*pointmap)[t->GetPoint(2)]->y, (*pointmap)[t->GetPoint(2)]->z);
                bu_log("Tri center: %f %f %f\n", tri_cent.x, tri_cent.y, 
tri_cent.z);
                bu_log("Tri norm: %f %f %f\n", tdir.x, tdir.y, tdir.z);
-               bu_log("edge trim: %d\n", 
(*s_cdt->p2t_edge_points)[t->GetPoint(0)]);
+               bu_log("edge trim: %d\n", (*p2t_trim_ind)[t->GetPoint(0)]);
 
                md->triangle_cnt--;
                md->tris_degen.insert(t);
@@ -486,10 +475,10 @@
            BrepTrimPoint btp;
            const ON_BrepVertex& v1 = face.Brep()->m_V[trim->m_vi[0]];
            ON_3dPoint *p3d = (*s_cdt->vert_pnts)[v1.m_vertex_index];
-           
(*s_cdt->strim_pnts)[face.m_face_index].insert(std::make_pair(trim->m_trim_index,
 p3d));
+           
(*s_cdt->faces)[face.m_face_index]->strim_pnts->insert(std::make_pair(trim->m_trim_index,
 p3d));
            ON_3dPoint *n3d = (*s_cdt->vert_avg_norms)[v1.m_vertex_index];
            if (n3d) {
-               
(*s_cdt->strim_norms)[face.m_face_index].insert(std::make_pair(trim->m_trim_index,
 n3d));
+               
(*s_cdt->faces)[face.m_face_index]->strim_norms->insert(std::make_pair(trim->m_trim_index,
 n3d));
            }
            double delta =  trim->Domain().Length() / 10.0;
            ON_Interval trim_dom = trim->Domain();
@@ -559,13 +548,14 @@
 {
     ON_RTree rt_trims;
     ON_2dPointArray on_surf_points;
+    int face_index = face.m_face_index;
     const ON_Surface *s = face.SurfaceOf();
     int loop_cnt = face.LoopCount();
     ON_2dPointArray on_loop_points;
     ON_SimpleArray<BrepTrimPoint> *brep_loop_points = new 
ON_SimpleArray<BrepTrimPoint>[loop_cnt];
-    std::map<p2t::Point *, ON_3dPoint *> *pointmap = new std::map<p2t::Point 
*, ON_3dPoint *>();
-    std::map<ON_3dPoint *, std::set<p2t::Point *>> *on3_to_tri = new 
std::map<ON_3dPoint *, std::set<p2t::Point *>>();
-    std::map<p2t::Point *, ON_3dPoint *> *normalmap = new std::map<p2t::Point 
*, ON_3dPoint *>();
+    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
(*s_cdt->faces)[face.m_face_index]->p2t_to_on3_map;
+    std::map<ON_3dPoint *, std::set<p2t::Point *>> *on3_to_tri = 
(*s_cdt->faces)[face.m_face_index]->on3_to_tri_map;
+    std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_norm_map;
     std::vector<p2t::Point*> polyline;
     p2t::CDT* cdt = NULL;
 
@@ -616,7 +606,7 @@
                // map point to last entry to 3d point
                p2t::Point *p = new p2t::Point((brep_loop_points[li])[i].p2d.x, 
(brep_loop_points[li])[i].p2d.y);
                polyline.push_back(p);
-               (*s_cdt->p2t_edge_points)[p] = 
(brep_loop_points[li])[i].trim_ind;
+               (*((*s_cdt->faces)[face.m_face_index]->p2t_trim_ind))[p] = 
(brep_loop_points[li])[i].trim_ind;
                (*pointmap)[p] = (brep_loop_points[li])[i].p3d;
                (*on3_to_tri)[(brep_loop_points[li])[i].p3d].insert(p);
                (*normalmap)[p] = (brep_loop_points[li])[i].n3d;
@@ -645,7 +635,7 @@
        }
     }
     // Using this in surface calculations, so assign now
-    s_cdt->brep_face_loop_points[face.m_face_index] = brep_loop_points;
+    (*s_cdt->faces)[face.m_face_index]->face_loop_points = brep_loop_points;
 
     // TODO - we may need to add 2D points on trims that the edges didn't know
     // about.  Since 3D points must be shared along edges and we're using
@@ -774,12 +764,7 @@
     /* Stash mappings for BoT reassembly.  Because there may be subsequent
      * refinement in overlap clearing operations, we avoid immediately
      * generating the mesh. */
-    int face_index = face.m_face_index;
-    s_cdt->p2t_faces[face_index] = cdt;
-    s_cdt->tri_to_on3_maps[face_index] = pointmap;
-    s_cdt->on3_to_tri_maps[face_index] = on3_to_tri;
-    s_cdt->tri_to_on3_norm_maps[face_index] = normalmap;
-
+    (*s_cdt->faces)[face_index]->cdt = cdt;
     return 0;
 }
 
@@ -977,12 +962,14 @@
 
                // Stash normals coming from non-singular trims at vertices for 
faces.  If a singular trim
                // needs a normal in 3D, want to use one of these
+               int mfaceind1 = trim1->Face()->m_face_index;
                ON_3dPoint *t1pnt = new ON_3dPoint(trim1_norm);
-               
(*s_cdt->vert_face_norms)[v.m_vertex_index][trim1->Face()->m_face_index].insert(t1pnt);
-               s_cdt->w3dnorms->push_back(t1pnt);
+               
(*(*s_cdt->faces)[mfaceind1]->vert_face_norms)[v.m_vertex_index].insert(t1pnt);
+               (*s_cdt->faces)[mfaceind1]->w3dnorms->push_back(t1pnt);
+               int mfaceind2 = trim2->Face()->m_face_index;
                ON_3dPoint *t2pnt = new ON_3dPoint(trim2_norm);
-               
(*s_cdt->vert_face_norms)[v.m_vertex_index][trim2->Face()->m_face_index].insert(t2pnt);
-               s_cdt->w3dnorms->push_back(t2pnt);
+               
(*(*s_cdt->faces)[mfaceind2]->vert_face_norms)[v.m_vertex_index].insert(t1pnt);
+               (*s_cdt->faces)[mfaceind2]->w3dnorms->push_back(t2pnt);
 
                // Add the normals to the vnrml total
                vnrml += trim1_norm;
@@ -1129,7 +1116,7 @@
            if (!p) {
                bu_log("unmapped point??? %d\n", pind);
            } else {
-               struct cdt_audit_info *paudit = s_cdt->pnt_audit_info[p];
+               struct cdt_audit_info *paudit = (*s_cdt->pnt_audit_info)[p];
                if (!paudit) {
                    bu_log("point with no audit info??? %d\n", pind);
                } else {
@@ -1177,7 +1164,7 @@
            if (!p) {
                bu_log("unmapped point??? %d\n", pind);
            } else {
-               struct cdt_audit_info *paudit = s_cdt->pnt_audit_info[p];
+               struct cdt_audit_info *paudit = (*s_cdt->pnt_audit_info)[p];
                if (!paudit) {
                    bu_log("point with no audit info??? %d\n", pind);
                } else {
@@ -1222,7 +1209,7 @@
            if (!p) {
                bu_log("unmapped point??? %d\n", pind);
            } else {
-               struct cdt_audit_info *paudit = s_cdt->pnt_audit_info[p];
+               struct cdt_audit_info *paudit = (*s_cdt->pnt_audit_info)[p];
                if (!paudit) {
                    bu_log("point with no audit info??? %d\n", pind);
                } else {
@@ -1257,9 +1244,9 @@
     point_t pt1 = VINIT_ZERO;
     point_t pt2 = VINIT_ZERO;
 
-    p2t::CDT *cdt = s->p2t_faces[face_index];
-    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
s->tri_to_on3_maps[face_index];
-    std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
s->tri_to_on3_norm_maps[face_index];
+    p2t::CDT *cdt = (*s->faces)[face_index]->cdt;
+    std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
(*s->faces)[face_index]->p2t_to_on3_map;
+    std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
(*s->faces)[face_index]->p2t_to_on3_norm_map;
     std::vector<p2t::Triangle*> tris = cdt->GetTriangles();
 
     switch (mode) {
@@ -1363,7 +1350,7 @@
    }
 
    for (int i = 0; i < s->brep->m_F.Count(); i++) {
-       if (s->p2t_faces[i]) {
+       if ((*s->faces)[i]) {
           (void)ON_Brep_CDT_VList_Face(vhead, vlfree, i, mode, s);
        }
    }
@@ -1461,22 +1448,17 @@
      * face's degen_pnts set.
      */
     for (int face_index = 0; face_index != s_cdt->brep->m_F.Count(); 
face_index++) {
-       std::set<p2t::Point *> *fdp = s_cdt->face_degen_pnts[face_index];
+       std::set<p2t::Point *> *fdp = (*s_cdt->faces)[face_index]->degen_pnts;
        if (!fdp) {
            continue;
        }
-       p2t::CDT *cdt = s_cdt->p2t_faces[face_index];
-       std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
s_cdt->tri_to_on3_maps[face_index];
-       std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
s_cdt->tri_to_on3_norm_maps[face_index];
+       p2t::CDT *cdt = (*s_cdt->faces)[face_index]->cdt;
+       std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_map;
+       std::map<p2t::Point *, ON_3dPoint *> *normalmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_norm_map;
 
        std::vector<p2t::Triangle *> *tri_add;
 
-       if (!s_cdt->p2t_extra_faces[face_index]) {
-           tri_add = new std::vector<p2t::Triangle *>;
-           s_cdt->p2t_extra_faces[face_index] = tri_add;
-       } else {
-           tri_add = s_cdt->p2t_extra_faces[face_index];
-       }
+       tri_add = (*s_cdt->faces)[face_index]->p2t_extra_faces;
 
        std::vector<p2t::Triangle*> tris = cdt->GetTriangles();
        for (size_t i = 0; i < tris.size(); i++) {
@@ -1716,10 +1698,7 @@
 
     bu_log("tri_cnt_init: %zd\n", md.triangle_cnt);
     for (int face_index = 0; face_index != s_cdt->brep->m_F.Count(); 
face_index++) {
-       std::vector<p2t::Triangle *> *tri_add = 
s_cdt->p2t_extra_faces[face_index];
-       if (!tri_add) {
-           continue;
-       }
+       std::vector<p2t::Triangle *> *tri_add = 
(*s_cdt->faces)[face_index]->p2t_extra_faces;
        //bu_log("adding %zd faces from %d\n", tri_add->size(), face_index);
        md.triangle_cnt += tri_add->size();
     }
@@ -1772,8 +1751,8 @@
     int face_cnt = 0;
     md.triangle_cnt = 0;
     for (int face_index = 0; face_index != s_cdt->brep->m_F.Count(); 
face_index++) {
-       p2t::CDT *cdt = s_cdt->p2t_faces[face_index];
-       std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
s_cdt->tri_to_on3_maps[face_index];
+       p2t::CDT *cdt = (*s_cdt->faces)[face_index]->cdt;
+       std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_map;
        std::vector<p2t::Triangle*> tris = cdt->GetTriangles();
        md.triangle_cnt += tris.size();
        int active_tris = 0;
@@ -1813,8 +1792,8 @@
     //bu_log("face_cnt: %d\n", face_cnt);
 
     for (int face_index = 0; face_index != s_cdt->brep->m_F.Count(); 
face_index++) {
-       std::vector<p2t::Triangle *> *tri_add = 
s_cdt->p2t_extra_faces[face_index];
-       std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
s_cdt->tri_to_on3_maps[face_index];
+       std::vector<p2t::Triangle *> *tri_add = 
(*s_cdt->faces)[face_index]->p2t_extra_faces;
+       std::map<p2t::Point *, ON_3dPoint *> *pointmap = 
(*s_cdt->faces)[face_index]->p2t_to_on3_map;
        if (!tri_add) {
            continue;
        }
@@ -1852,17 +1831,16 @@
     }
 
 
-    /* Clear out extra faces so they don't pollute another pass */
+    /* Clear out extra faces so they don't pollute another pass.
+     * TODO - need a better way to do this, incorporated with reset */
     for (int i = 0; i < s_cdt->brep->m_F.Count(); i++) {
-       std::vector<p2t::Triangle *> *ef = s_cdt->p2t_extra_faces[i];
-       if (ef) {
-           std::vector<p2t::Triangle *>::iterator trit;
-           for (trit = ef->begin(); trit != ef->end(); trit++) {
-               p2t::Triangle *t = *trit;
-               delete t;
-           }
-           ef->clear();
+       std::vector<p2t::Triangle *> *ef = (*s_cdt->faces)[i]->p2t_extra_faces;
+       std::vector<p2t::Triangle *>::iterator trit;
+       for (trit = ef->begin(); trit != ef->end(); trit++) {
+           p2t::Triangle *t = *trit;
+           delete t;
        }
+       ef->clear();
     }
 
 

Modified: brlcad/trunk/src/libbrep/cdt.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt.h      2019-05-31 11:12:44 UTC (rev 73215)
+++ brlcad/trunk/src/libbrep/cdt.h      2019-05-31 17:39:02 UTC (rev 73216)
@@ -83,6 +83,50 @@
     ON_2dPoint surf_uv;
 };
 
+struct ON_Brep_CDT_State;
+
+struct ON_Brep_CDT_Face_State {
+    struct ON_Brep_CDT_State *s_cdt;
+    int face_ind;
+
+    /* 3D data specific to this face (i.e. not shared at an edge) */
+    std::vector<ON_3dPoint *> *w3dpnts;
+    std::vector<ON_3dPoint *> *w3dnorms;
+
+    std::map<int, std::set<ON_3dPoint *>> *vert_face_norms;
+
+    /* loop points */
+    ON_SimpleArray<BrepTrimPoint> *face_loop_points;
+    std::map<p2t::Point *, BrepTrimPoint *> *p2t_to_trimpt;
+    std::map<p2t::Point *, int> *p2t_trim_ind;
+
+    /* singular trim info */
+    std::map<int,ON_3dPoint *> *strim_pnts;
+    std::map<int,ON_3dPoint *> *strim_norms;
+
+    /* non-loop surface points */
+    ON_2dPointArray *on_surf_points;
+
+    /* mappings */
+    std::map<ON_2dPoint *, ON_3dPoint *> *on2_to_on3_map;
+    std::map<ON_2dPoint *, p2t::Point *> *on2_to_p2t_map;
+    std::map<p2t::Point *, ON_3dPoint *> *p2t_to_on2_map;
+    std::map<p2t::Point *, ON_3dPoint *> *p2t_to_on3_map;
+    std::map<p2t::Point *, ON_3dPoint *> *p2t_to_on3_norm_map;
+    std::map<ON_3dPoint *, std::set<p2t::Point *>> *on3_to_tri_map;
+
+    /* Poly2Tri information */
+    p2t::CDT *cdt;
+    std::vector<p2t::Triangle *> *p2t_extra_faces;
+    std::set<p2t::Triangle *> *degen_faces;
+
+    /* Point status tracker */
+    std::set<p2t::Point *> *degen_pnts;
+    std::set<ON_2dPoint *> *deactivated_surf_pnts;
+    std::set<ON_2dPoint *> *added_surf_pnts;
+};
+
+
 struct ON_Brep_CDT_State {
 
     int status;
@@ -96,40 +140,25 @@
     fastf_t dist;
 
     /* 3D data */
-    std::map<int, double> *min_edge_seg_len;
-    std::map<int, double> *max_edge_seg_len;
     std::vector<ON_3dPoint *> *w3dpnts;
     std::vector<ON_3dPoint *> *w3dnorms;
 
+    /* Vertices */
     std::map<int, ON_3dPoint *> *vert_pnts;
     std::map<int, ON_3dPoint *> *vert_avg_norms;
-    std::map<int, std::map<int, std::set<ON_3dPoint *>>> *vert_face_norms;
+    std::map<int, ON_3dPoint *> *vert_to_on;
 
-    /* loop points */
-    std::map<int, ON_SimpleArray<BrepTrimPoint> *> *face_loop_points;
+    /* Edges */
+    std::set<ON_3dPoint *> *edge_pnts;
+    std::map<int, double> *min_edge_seg_len;
+    std::map<int, double> *max_edge_seg_len;
+    std::map<ON_3dPoint *, std::set<BrepTrimPoint *>> *on_brep_edge_pnts;
 
-    /* singular trim info */
-    std::map<int, std::map<int,ON_3dPoint *>> *strim_pnts;
-    std::map<int, std::map<int,ON_3dPoint *>> *strim_norms;
-
-    /* Poly2Tri data */
-    p2t::CDT **p2t_faces;
-    std::map<p2t::Point *, int> *p2t_edge_points;
-    std::vector<p2t::Triangle *> **p2t_extra_faces;
-    std::map<ON_2dPoint *, ON_3dPoint *> **on2_to_on3_maps;
-    std::map<p2t::Point *, ON_3dPoint *> **tri_to_on3_maps;
-    std::map<p2t::Point *, ON_3dPoint *> **tri_to_on3_norm_maps;
-    std::map<ON_3dPoint *, std::set<p2t::Point *>> **on3_to_tri_maps;
-
     /* Audit data */
-    std::map<ON_3dPoint *, struct cdt_audit_info *> pnt_audit_info;
+    std::map<ON_3dPoint *, struct cdt_audit_info *> *pnt_audit_info;
 
-    /* BoT -> ON mappings */
-    std::map<ON_3dPoint *, std::set<BrepTrimPoint *>> on_brep_edge_pnts;
-    std::map<int, ON_3dPoint *> *vert_to_on;
-    std::set<ON_3dPoint *> *edge_pnts;
-    ON_SimpleArray<BrepTrimPoint> **brep_face_loop_points;
-    std::set<p2t::Point *> **face_degen_pnts;
+    /* Face specific data */
+    std::map<int, struct ON_Brep_CDT_Face_State *> *faces;
 };
 
 struct brep_cdt_tol {
@@ -144,8 +173,8 @@
     const ON_Surface *s;
     const ON_BrepFace *f;
     ON_RTree *rt_trims;
-    std::map<int, std::map<int,ON_3dPoint *>> *strim_pnts;
-    std::map<int, std::map<int,ON_3dPoint *>> *strim_norms;
+    std::map<int,ON_3dPoint *> *strim_pnts;
+    std::map<int,ON_3dPoint *> *strim_norms;
     double u1, u2, v1, v2;
     fastf_t ulen;
     fastf_t u_lower_3dlen;
@@ -183,7 +212,15 @@
                 ON_2dPointArray &on_surf_points,
                 ON_RTree *rt_trims);
 
+
+struct ON_Brep_CDT_Face_State *
+ON_Brep_CDT_Face_Create(struct ON_Brep_CDT_State *s_cdt, int ind);
 void
+ON_Brep_CDT_Face_Reset(struct ON_Brep_CDT_Face_State *fcdt);
+void
+ON_Brep_CDT_Face_Destroy(struct ON_Brep_CDT_Face_State *fcdt);
+
+void
 plot_polyline(std::vector<p2t::Point *> *pnts, const char *filename);
 void
 plot_tri(p2t::Triangle *t, const char *filename);

Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp       2019-05-31 11:12:44 UTC (rev 
73215)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp       2019-05-31 17:39:02 UTC (rev 
73216)
@@ -235,7 +235,7 @@
        nbtp1->e = emid;
        nbtp1->trim_ind = trim.m_trim_index;
        (*trim1_param_points)[nbtp1->t] = nbtp1;
-       s_cdt->on_brep_edge_pnts[npt].insert(nbtp1);
+       (*s_cdt->on_brep_edge_pnts)[npt].insert(nbtp1);
 
        BrepTrimPoint *nbtp2 = new BrepTrimPoint;
        nbtp2->p3d = npt;
@@ -247,7 +247,7 @@
        nbtp2->e = emid;
        nbtp2->trim_ind = trim2->m_trim_index;
        (*trim2_param_points)[nbtp2->t] = nbtp2;
-       s_cdt->on_brep_edge_pnts[npt].insert(nbtp2);
+       (*s_cdt->on_brep_edge_pnts)[npt].insert(nbtp2);
 
        getEdgePoints(s_cdt, edge, nc, trim, sbtp1, nbtp1, sbtp2, nbtp2, 
cdt_tol, trim1_param_points, trim2_param_points, loop_min_dist);
        getEdgePoints(s_cdt, edge, nc, trim, nbtp1, ebtp1, nbtp2, ebtp2, 
cdt_tol, trim1_param_points, trim2_param_points, loop_min_dist);
@@ -326,7 +326,7 @@
        nbtp1->trim_ind = trim.m_trim_index;
        nbtp1->e = ON_UNSET_VALUE;
        (*trim1_param_points)[nbtp1->t] = nbtp1;
-       s_cdt->on_brep_edge_pnts[nsptp].insert(nbtp1);
+       (*s_cdt->on_brep_edge_pnts)[nsptp].insert(nbtp1);
 
        BrepTrimPoint *nbtp2 = new BrepTrimPoint;
        nbtp2->p3d = nsptp;
@@ -335,7 +335,7 @@
        nbtp2->trim_ind = trim2->m_trim_index;
        nbtp2->e = ON_UNSET_VALUE;
        (*trim2_param_points)[nbtp2->t] = nbtp2;
-       s_cdt->on_brep_edge_pnts[nsptp].insert(nbtp2);
+       (*s_cdt->on_brep_edge_pnts)[nsptp].insert(nbtp2);
     }
 
 }
@@ -553,7 +553,7 @@
     sbtp1->t = st1;
     sbtp1->trim_ind = trim.m_trim_index;
     (*trim1_param_points)[sbtp1->t] = sbtp1;
-    s_cdt->on_brep_edge_pnts[edge_start_3d].insert(sbtp1);
+    (*s_cdt->on_brep_edge_pnts)[edge_start_3d].insert(sbtp1);
 
     BrepTrimPoint *ebtp1 = new BrepTrimPoint;
     ebtp1->p3d = edge_end_3d;
@@ -565,7 +565,7 @@
     ebtp1->t = et1;
     ebtp1->trim_ind = trim.m_trim_index;
     (*trim1_param_points)[ebtp1->t] = ebtp1;
-    s_cdt->on_brep_edge_pnts[edge_end_3d].insert(ebtp1);
+    (*s_cdt->on_brep_edge_pnts)[edge_end_3d].insert(ebtp1);
 
     BrepTrimPoint *sbtp2 = new BrepTrimPoint;
     sbtp2->p3d = edge_start_3d;
@@ -577,7 +577,7 @@
     sbtp2->t = st2;
     sbtp2->trim_ind = trim2->m_trim_index;
     (*trim2_param_points)[sbtp2->t] = sbtp2;
-    s_cdt->on_brep_edge_pnts[edge_start_3d].insert(sbtp2);
+    (*s_cdt->on_brep_edge_pnts)[edge_start_3d].insert(sbtp2);
 
     BrepTrimPoint *ebtp2 = new BrepTrimPoint;
     ebtp2->p3d = edge_end_3d;
@@ -589,7 +589,7 @@
     ebtp2->t = et2;
     ebtp2->trim_ind = trim2->m_trim_index;
     (*trim2_param_points)[ebtp2->t] = ebtp2;
-    s_cdt->on_brep_edge_pnts[edge_end_3d].insert(ebtp2);
+    (*s_cdt->on_brep_edge_pnts)[edge_end_3d].insert(ebtp2);
 
 
     if (trim.IsClosed() || trim2->IsClosed()) {
@@ -648,7 +648,7 @@
        mbtp1->e = edge_mid_range;
        mbtp1->trim_ind = trim.m_trim_index;
        (*trim1_param_points)[mbtp1->t] = mbtp1;
-       s_cdt->on_brep_edge_pnts[nmp].insert(mbtp1);
+       (*s_cdt->on_brep_edge_pnts)[nmp].insert(mbtp1);
 
        BrepTrimPoint *mbtp2 = new BrepTrimPoint;
        mbtp2->p3d = nmp;
@@ -660,7 +660,7 @@
        mbtp1->e = edge_mid_range;
        mbtp2->trim_ind = trim2->m_trim_index;
        (*trim2_param_points)[mbtp2->t] = mbtp2;
-       s_cdt->on_brep_edge_pnts[nmp].insert(mbtp2);
+       (*s_cdt->on_brep_edge_pnts)[nmp].insert(mbtp2);
 
        getEdgePoints(s_cdt, edge, nc, trim, sbtp1, mbtp1, sbtp2, mbtp2, 
&cdt_tol, trim1_param_points, trim2_param_points, loop_min_dist);
        getEdgePoints(s_cdt, edge, nc, trim, mbtp1, ebtp1, mbtp2, ebtp2, 
&cdt_tol, trim1_param_points, trim2_param_points, loop_min_dist);

Modified: brlcad/trunk/src/libbrep/cdt_surf.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_surf.cpp       2019-05-31 11:12:44 UTC (rev 
73215)
+++ brlcad/trunk/src/libbrep/cdt_surf.cpp       2019-05-31 17:39:02 UTC (rev 
73216)
@@ -79,7 +79,7 @@
        }
        std::map<int, ON_3dPoint *>::iterator m_it;
        // Check the trims to see if uc,vc is on one of them
-       for (m_it = (*sinfo->strim_pnts)[sinfo->f->m_face_index].begin(); m_it 
!= (*sinfo->strim_pnts)[sinfo->f->m_face_index].end(); m_it++) {
+       for (m_it = sinfo->strim_pnts->begin(); m_it != 
sinfo->strim_pnts->end(); m_it++) {
            //bu_log("  trim %d\n", (*m_it).first);
            ON_Interval trim_dom = 
sinfo->f->Brep()->m_T[(*m_it).first].Domain();
            ON_2dPoint p2d1 = 
sinfo->f->Brep()->m_T[(*m_it).first].PointAt(trim_dom.m_t[0]);
@@ -110,9 +110,9 @@
            }
 
            if (on_trim) {
-               if 
((*sinfo->strim_norms)[sinfo->f->m_face_index].find((*m_it).first) != 
(*sinfo->strim_norms)[sinfo->f->m_face_index].end()) {
+               if (sinfo->strim_norms->find((*m_it).first) != 
sinfo->strim_norms->end()) {
                    ON_3dPoint *vnorm = NULL;
-                   vnorm = 
(*sinfo->strim_norms)[sinfo->f->m_face_index][(*m_it).first];
+                   vnorm = (*sinfo->strim_norms)[(*m_it).first];
                    //bu_log(" normal: %f, %f, %f\n", vnorm->x, vnorm->y, 
vnorm->z);
                    return vnorm;
                } else {
@@ -149,7 +149,7 @@
        double min_edge_dist = DBL_MAX;
        ON_BoundingBox uvbb(ON_2dPoint(u1,v1),ON_2dPoint(u2,v2));
 
-       ON_SimpleArray<BrepTrimPoint> *brep_loop_points = 
s_cdt->brep_face_loop_points[sinfo->f->m_face_index];
+       ON_SimpleArray<BrepTrimPoint> *brep_loop_points = 
(*s_cdt->faces)[sinfo->f->m_face_index]->face_loop_points;
        if (!brep_loop_points) {
            (*min_edge) = min_edge_dist;
            return ret;
@@ -516,17 +516,12 @@
            return;
        }
 
-       if (!s_cdt->on2_to_on3_maps[face.m_face_index]) {
-           std::map<ON_2dPoint *, ON_3dPoint *> *on2to3 = new 
std::map<ON_2dPoint *, ON_3dPoint *>();
-           s_cdt->on2_to_on3_maps[face.m_face_index] = on2to3;
-       }
-
        struct cdt_surf_info sinfo;
        sinfo.s = s;
        sinfo.f = &face;
        sinfo.rt_trims = rt_trims;
-       sinfo.strim_pnts = s_cdt->strim_pnts;
-       sinfo.strim_norms = s_cdt->strim_norms;
+       sinfo.strim_pnts = (*s_cdt->faces)[face.m_face_index]->strim_pnts;
+       sinfo.strim_norms = (*s_cdt->faces)[face.m_face_index]->strim_norms;
        double t1, t2;
        s->GetDomain(0, &t1, &t2);
        sinfo.ulen = fabs(t2 - t1);

Modified: brlcad/trunk/src/libbrep/cdt_util.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_util.cpp       2019-05-31 11:12:44 UTC (rev 
73215)
+++ brlcad/trunk/src/libbrep/cdt_util.cpp       2019-05-31 17:39:02 UTC (rev 
73216)
@@ -114,7 +114,7 @@
 CDT_Add3DPnt(struct ON_Brep_CDT_State *s, ON_3dPoint *p, int fid, int vid, int 
tid, int eid, fastf_t x2d, fastf_t y2d)
 {
     s->w3dpnts->push_back(p);
-    s->pnt_audit_info[p] = cdt_ainfo(fid, vid, tid, eid, x2d, y2d);
+    (*s->pnt_audit_info)[p] = cdt_ainfo(fid, vid, tid, eid, x2d, y2d);
 }
 
 // Digest tessellation tolerances...
@@ -158,50 +158,151 @@
     cdt->cos_within_ang = cos_within_ang;
 }
 
+struct ON_Brep_CDT_Face_State *
+ON_Brep_CDT_Face_Create(struct ON_Brep_CDT_State *s_cdt, int ind)
+{
+    struct ON_Brep_CDT_Face_State *fcdt = new struct ON_Brep_CDT_Face_State;
+
+    fcdt->s_cdt = s_cdt;
+    fcdt->face_ind = ind;
+
+    fcdt->w3dpnts = new std::vector<ON_3dPoint *>;
+    fcdt->w3dnorms = new std::vector<ON_3dPoint *>;
+
+    fcdt->vert_face_norms = new std::map<int, std::set<ON_3dPoint *>>;
+    fcdt->face_loop_points = NULL;
+    fcdt->p2t_to_trimpt = new std::map<p2t::Point *, BrepTrimPoint *>;
+    fcdt->p2t_trim_ind = new std::map<p2t::Point *, int>;
+
+    fcdt->strim_pnts = new std::map<int,ON_3dPoint *>;
+    fcdt->strim_norms = new std::map<int,ON_3dPoint *>;
+
+    fcdt->on_surf_points = new ON_2dPointArray;
+
+    fcdt->on2_to_on3_map = new std::map<ON_2dPoint *, ON_3dPoint *>;
+    fcdt->on2_to_p2t_map = new std::map<ON_2dPoint *, p2t::Point *>;
+    fcdt->p2t_to_on2_map = new std::map<p2t::Point *, ON_3dPoint *>;
+    fcdt->p2t_to_on3_map = new std::map<p2t::Point *, ON_3dPoint *>;
+    fcdt->p2t_to_on3_norm_map = new std::map<p2t::Point *, ON_3dPoint *>;
+    fcdt->on3_to_tri_map = new std::map<ON_3dPoint *, std::set<p2t::Point *>>;
+
+    fcdt->cdt = NULL;
+    fcdt->p2t_extra_faces = new std::vector<p2t::Triangle *>;
+    fcdt->degen_faces = new std::set<p2t::Triangle *>;
+
+    fcdt->degen_pnts = new std::set<p2t::Point *>;
+
+    return fcdt;
+}
+
+/* Clears old triangulation data */
+void
+ON_Brep_CDT_Face_Reset(struct ON_Brep_CDT_Face_State *fcdt)
+{
+    fcdt->on2_to_p2t_map->clear();
+    fcdt->p2t_to_on2_map->clear();
+    fcdt->p2t_to_on3_map->clear();
+    fcdt->p2t_to_on3_norm_map->clear();
+    fcdt->on3_to_tri_map->clear();
+    fcdt->p2t_to_trimpt->clear();
+    fcdt->p2t_trim_ind->clear();
+
+    if (fcdt->cdt) {
+       delete fcdt->cdt;
+       fcdt->cdt = NULL;
+    }
+
+    std::vector<p2t::Triangle *>::iterator trit;
+    for (trit = fcdt->p2t_extra_faces->begin(); trit != 
fcdt->p2t_extra_faces->end(); trit++) {
+       p2t::Triangle *t = *trit;
+       delete t;
+    }
+
+    fcdt->p2t_extra_faces->clear();
+    fcdt->degen_faces->clear();
+
+}
+
+void
+ON_Brep_CDT_Face_Destroy(struct ON_Brep_CDT_Face_State *fcdt)
+{
+    for (size_t i = 0; i < fcdt->w3dpnts->size(); i++) {
+       delete (*(fcdt->w3dpnts))[i];
+    }
+    for (size_t i = 0; i < fcdt->w3dnorms->size(); i++) {
+       delete (*(fcdt->w3dnorms))[i];
+    }
+
+    std::vector<p2t::Triangle *>::iterator trit;
+    for (trit = fcdt->p2t_extra_faces->begin(); trit != 
fcdt->p2t_extra_faces->end(); trit++) {
+       p2t::Triangle *t = *trit;
+       delete t;
+    }
+
+    delete fcdt->w3dpnts;
+    delete fcdt->w3dnorms;
+    delete fcdt->vert_face_norms;
+    if (fcdt->face_loop_points) {
+       delete fcdt->face_loop_points;
+    }
+    delete fcdt->p2t_to_trimpt;
+    delete fcdt->strim_pnts;
+    delete fcdt->strim_norms;
+    delete fcdt->on_surf_points;
+    delete fcdt->on2_to_on3_map;
+    delete fcdt->on2_to_p2t_map;
+    delete fcdt->p2t_to_on2_map;
+    delete fcdt->p2t_to_on3_map;
+    delete fcdt->p2t_to_on3_norm_map;
+    delete fcdt->on3_to_tri_map;
+    delete fcdt->p2t_extra_faces;
+    delete fcdt->degen_faces;
+    delete fcdt->degen_pnts;
+
+    delete fcdt;
+}
+
+
 struct ON_Brep_CDT_State *
 ON_Brep_CDT_Create(void *bv)
 {
+    struct ON_Brep_CDT_State *cdt = new struct ON_Brep_CDT_State;
+ 
+    /* Set status to "never evaluated" */
+    cdt->status = BREP_CDT_UNTESSELLATED;
+
     ON_Brep *brep = (ON_Brep *)bv;
-    struct ON_Brep_CDT_State *cdt = new struct ON_Brep_CDT_State;
     cdt->orig_brep = brep;
     cdt->brep = NULL;
 
-    cdt->min_edge_seg_len = new std::map<int, double>;
-    cdt->max_edge_seg_len = new std::map<int, double>;
+    /* Set sane default tolerances.  May want to do
+     * something better (perhaps brep dimension based...) */
+    cdt->abs = BREP_CDT_DEFAULT_TOL_ABS;
+    cdt->rel = BREP_CDT_DEFAULT_TOL_REL ;
+    cdt->norm = BREP_CDT_DEFAULT_TOL_NORM ;
+    cdt->dist = BREP_CDT_DEFAULT_TOL_DIST ;
 
+
     cdt->w3dpnts = new std::vector<ON_3dPoint *>;
+    cdt->w3dnorms = new std::vector<ON_3dPoint *>;
+
     cdt->vert_pnts = new std::map<int, ON_3dPoint *>;
-    cdt->w3dnorms = new std::vector<ON_3dPoint *>;
     cdt->vert_avg_norms = new std::map<int, ON_3dPoint *>;
-    cdt->vert_face_norms = new std::map<int, std::map<int, std::set<ON_3dPoint 
*>>>;
-    cdt->strim_pnts = new std::map<int,std::map<int, ON_3dPoint *> >;
-    cdt->strim_norms = new std::map<int,std::map<int, ON_3dPoint *> >;
     cdt->vert_to_on = new std::map<int, ON_3dPoint *>;
+
     cdt->edge_pnts = new std::set<ON_3dPoint *>;
-    cdt->brep_face_loop_points = (ON_SimpleArray<BrepTrimPoint> 
**)bu_calloc(brep->m_F.Count(), sizeof(std::map<p2t::Point *, BrepTrimPoint *> 
*), "face loop pnts");
-    cdt->face_degen_pnts = (std::set<p2t::Point *> 
**)bu_calloc(brep->m_F.Count(), sizeof(std::set<p2t::Point *> *), "degenerate 
edge points");
+    cdt->min_edge_seg_len = new std::map<int, double>;
+    cdt->max_edge_seg_len = new std::map<int, double>;
+    cdt->on_brep_edge_pnts = new std::map<ON_3dPoint *, std::set<BrepTrimPoint 
*>>;
 
-    cdt->p2t_faces = (p2t::CDT **)bu_calloc(brep->m_F.Count(), sizeof(p2t::CDT 
*), "poly2tri triangulations");
-    cdt->p2t_edge_points = new std::map<p2t::Point *, int>;
-    cdt->p2t_extra_faces = (std::vector<p2t::Triangle *> 
**)bu_calloc(brep->m_F.Count(), sizeof(std::vector<p2t::Triangle *> *), "extra 
p2t faces");
-    cdt->on2_to_on3_maps = (std::map<ON_2dPoint *, ON_3dPoint *> 
**)bu_calloc(brep->m_F.Count(), sizeof(std::map<ON_2dPoint *, ON_3dPoint *> *), 
"ON_2dPoint to ON_3dPoint maps");
-    cdt->tri_to_on3_maps = (std::map<p2t::Point *, ON_3dPoint *> 
**)bu_calloc(brep->m_F.Count(), sizeof(std::map<p2t::Point *, ON_3dPoint *> *), 
"poly2tri point to ON_3dPoint maps");
-    cdt->on3_to_tri_maps = (std::map<ON_3dPoint *, std::set<p2t::Point *>> 
**)bu_calloc(brep->m_F.Count(), sizeof(std::map<ON_3dPoint *, 
std::set<p2t::Point *>> *), "poly2tri point to ON_3dPoint maps");
-    cdt->tri_to_on3_norm_maps = (std::map<p2t::Point *, ON_3dPoint *> 
**)bu_calloc(brep->m_F.Count(), sizeof(std::map<p2t::Point *, ON_3dPoint *> *), 
"poly2tri point to ON_3dVector normal maps");
+    cdt->pnt_audit_info = new std::map<ON_3dPoint *, struct cdt_audit_info *>;
 
-    /* Set status to "never evaluated" */
-    cdt->status = BREP_CDT_UNTESSELLATED;
+    cdt->faces = new std::map<int, struct ON_Brep_CDT_Face_State *>;
 
-    /* Set sane default tolerances.  May want to do
-     * something better (perhaps brep dimension based...) */
-    cdt->abs = BREP_CDT_DEFAULT_TOL_ABS;
-    cdt->rel = BREP_CDT_DEFAULT_TOL_REL ;
-    cdt->norm = BREP_CDT_DEFAULT_TOL_NORM ;
-    cdt->dist = BREP_CDT_DEFAULT_TOL_DIST ;
-
     return cdt;
 }
 
+
 void
 ON_Brep_CDT_Destroy(struct ON_Brep_CDT_State *s_cdt)
 {
@@ -212,57 +313,30 @@
        delete (*(s_cdt->w3dnorms))[i];
     }
 
-    for (int i = 0; i < s_cdt->brep->m_F.Count(); i++) {
-       std::vector<p2t::Triangle *> *ef = s_cdt->p2t_extra_faces[i];
-       if (ef) {
-           std::vector<p2t::Triangle *>::iterator trit;
-           for (trit = ef->begin(); trit != ef->end(); trit++) {
-               p2t::Triangle *t = *trit;
-               delete t;
-           }
+    if (s_cdt->faces) {
+       std::map<int, struct ON_Brep_CDT_Face_State *>::iterator f_it;
+       for (f_it = s_cdt->faces->begin(); f_it != s_cdt->faces->end(); f_it++) 
{
+           struct ON_Brep_CDT_Face_State *f = f_it->second;
+           delete f;
        }
     }
 
-    for (int i = 0; i < s_cdt->brep->m_F.Count(); i++) {
-       if (s_cdt->brep_face_loop_points[i] != NULL) {
-           delete [] s_cdt->brep_face_loop_points[i];
-       }
-       if (s_cdt->face_degen_pnts[i] != NULL) {
-           delete s_cdt->face_degen_pnts[i];
-       }
+    if (s_cdt->brep) {
+       delete s_cdt->brep;
     }
 
-    for (int i = 0; i < s_cdt->brep->m_F.Count(); i++) {
-       if (s_cdt->on2_to_on3_maps[i] != NULL) {
-           delete s_cdt->on2_to_on3_maps[i];
-       }
-    }
-    bu_free(s_cdt->on2_to_on3_maps, "degen pnts");
-
-    delete s_cdt->min_edge_seg_len;
-    delete s_cdt->max_edge_seg_len;
-
-    delete s_cdt->p2t_edge_points;
-
-    delete s_cdt->w3dpnts;
     delete s_cdt->vert_pnts;
-    delete s_cdt->w3dnorms;
     delete s_cdt->vert_avg_norms;
-    delete s_cdt->vert_face_norms;
-    delete s_cdt->strim_pnts;
-    delete s_cdt->strim_norms;
     delete s_cdt->vert_to_on;
+
     delete s_cdt->edge_pnts;
-    delete s_cdt->p2t_extra_faces;
+    delete s_cdt->min_edge_seg_len;
+    delete s_cdt->max_edge_seg_len;
+    delete s_cdt->on_brep_edge_pnts;
 
-    if (s_cdt->brep) {
-       delete s_cdt->brep;
-    }
+    delete s_cdt->pnt_audit_info;
+    delete s_cdt->faces;
 
-    bu_free(s_cdt->brep_face_loop_points, "flp array");
-    bu_free(s_cdt->face_degen_pnts, "degen pnts");
-    // TODO - delete p2t data
-
     delete s_cdt;
 }
 

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