Revision: 52514
          http://brlcad.svn.sourceforge.net/brlcad/?rev=52514&view=rev
Author:   starseeker
Date:     2012-09-21 18:53:26 +0000 (Fri, 21 Sep 2012)
Log Message:
-----------
Move loop building logic into function in preparation for building multiple 
loops (inner and outer) per patch.

Modified Paths:
--------------
    brlcad/trunk/src/librt/test_botpatches.cpp

Modified: brlcad/trunk/src/librt/test_botpatches.cpp
===================================================================
--- brlcad/trunk/src/librt/test_botpatches.cpp  2012-09-21 16:09:10 UTC (rev 
52513)
+++ brlcad/trunk/src/librt/test_botpatches.cpp  2012-09-21 18:53:26 UTC (rev 
52514)
@@ -1028,7 +1028,72 @@
     }
 }
 
+// Do pullbacks to generate trimming curves in 2D, use them to create BrepTrim 
and BrepLoop structures for
+// outer and inner trimming loops
 
+void build_loop(size_t patch_id, size_t loop_index, ON_BrepLoop::TYPE 
loop_type, std::map<size_t, std::vector<size_t> > *loops, struct Manifold_Info 
*info) {
+
+    ON_BrepFace& face = info->brep->m_F[patch_id];
+    // Start with outer loop
+    ON_BrepLoop& loop = info->brep->NewLoop(ON_BrepLoop::outer, face);
+    // build surface tree
+    brlcad::SurfaceTree* st = new brlcad::SurfaceTree(&face, false);
+
+    std::vector<size_t>::iterator loop_it;
+    std::vector<size_t> *loop_edges = &((*loops)[loop_index]);
+    int vert_prev = -1;
+    //std::cout << "Patch " << patch_id << " loop edges: \n";
+    bool trim_rev = false;
+    size_t pullback_failures = 0;
+    for(loop_it = loop_edges->begin(); loop_it != loop_edges->end(); 
loop_it++) {
+       size_t curr_edge = (*loop_it);
+       // Will we need to flip the trim?
+       ON_BrepEdge& edge = info->brep->m_E[curr_edge];
+       if(vert_prev != -1) {
+           if (vert_prev == edge.m_vi[0]) {
+               trim_rev = false;
+           } else {
+               trim_rev = true;
+           }
+       }
+       if(trim_rev) {
+           vert_prev = edge.m_vi[0];
+       } else {
+           vert_prev = edge.m_vi[1];
+       }
+       //std::cout << "edge verts: " << edge.m_vi[0] << "," << edge.m_vi[1] << 
" flip=" << trim_rev << "\n";
+
+       ON_2dPointArray curve_pnts_2d;
+       std::vector<size_t>::iterator v_it;
+       for (v_it = info->polycurves[curr_edge].begin(); v_it != 
info->polycurves[curr_edge].end(); v_it++) {
+           ON_3dPoint pt_3d(&info->bot->vertices[(*v_it)]);
+           ON_2dPoint pt_2d;
+           if(get_closest_point(pt_2d, &face, pt_3d, st)) {
+               curve_pnts_2d.Append(pt_2d);
+           } else {
+               pullback_failures++;
+               std::cout << "Pullback to face " << patch_id << "failed\n";
+           }
+       }
+       if (!pullback_failures) {
+           if(trim_rev) curve_pnts_2d.Reverse();
+           ON_Curve *trim_curve = interpolateCurve(curve_pnts_2d);
+           int c2i = info->brep->AddTrimCurve(trim_curve);
+           ON_BrepTrim& trim = info->brep->NewTrim(edge, trim_rev, loop, c2i);
+           trim.m_type = ON_BrepTrim::mated;
+           trim.m_tolerance[0] = 1e-3;
+           trim.m_tolerance[1] = 1e-3;
+       }
+    }
+    if (info->brep->LoopDirection(loop) != 1 && loop_type == 
ON_BrepLoop::outer) {
+       info->brep->FlipLoop(loop);
+    }
+    if (info->brep->LoopDirection(loop) != -1 && loop_type == 
ON_BrepLoop::inner) {
+       info->brep->FlipLoop(loop);
+    }
+
+}
+
 void find_loops(struct Manifold_Info *info)
 {
     std::map< size_t, std::set<size_t> >::iterator p_it;
@@ -1098,60 +1163,7 @@
            std::cout << "Patch " << (*p_it).first << " outer loop: " << 
outer_loop << "\n";
        }
 
-       // Do pullbacks to generate trimming curves in 2D, use them to create 
BrepTrim and BrepLoop structures for
-       // outer and inner trimming loops
-       
-       ON_BrepFace& face = info->brep->m_F[(*p_it).first];
-        // Start with outer loop
-        ON_BrepLoop& loop = info->brep->NewLoop(ON_BrepLoop::outer, face);
-        // build surface tree
-        brlcad::SurfaceTree* st = new brlcad::SurfaceTree(&face, false);
-
-       std::vector<size_t>::iterator loop_it;
-        std::vector<size_t> *outer_loop_edges = &(loops[outer_loop]);
-        int vert_prev = -1;
-       //std::cout << "Patch " << (*p_it).first << " outer loop edges: \n";
-       bool trim_rev = false;
-       for(loop_it = outer_loop_edges->begin(); loop_it != 
outer_loop_edges->end(); loop_it++) {
-           size_t curr_edge = (*loop_it);
-           // Will we need to flip the trim?
-          ON_BrepEdge& edge = info->brep->m_E[curr_edge];
-          if(vert_prev != -1) {
-              if (vert_prev == edge.m_vi[0]) {
-                  trim_rev = false;
-              } else {
-                  trim_rev = true;
-              }
-          }
-          if(trim_rev) {
-              vert_prev = edge.m_vi[0];
-          } else {
-              vert_prev = edge.m_vi[1];
-          }
-          //std::cout << "edge verts: " << edge.m_vi[0] << "," << edge.m_vi[1] 
<< " flip=" << trim_rev << "\n";
-
-          ON_2dPointArray curve_pnts_2d;
-          std::vector<size_t>::iterator v_it;
-          for (v_it = info->polycurves[curr_edge].begin(); v_it != 
info->polycurves[curr_edge].end(); v_it++) {
-              ON_3dPoint pt_3d(&info->bot->vertices[(*v_it)]);
-              ON_2dPoint pt_2d;
-              if(get_closest_point(pt_2d, &face, pt_3d, st)) {
-                  curve_pnts_2d.Append(pt_2d);
-              } else {
-                  std::cout << "Pullback to face " << (*p_it).first << 
"failed\n";
-              }
-          }
-           if(trim_rev) curve_pnts_2d.Reverse();
-          ON_Curve *trim_curve = interpolateCurve(curve_pnts_2d);
-          int c2i = info->brep->AddTrimCurve(trim_curve);
-           ON_BrepTrim& trim = info->brep->NewTrim(edge, trim_rev, loop, c2i);
-           trim.m_type = ON_BrepTrim::mated;
-           trim.m_tolerance[0] = 1e-3;
-           trim.m_tolerance[1] = 1e-3;
-        }
-        if (info->brep->LoopDirection(loop) != 1) {
-          info->brep->FlipLoop(loop);
-        }
+       build_loop((*p_it).first, outer_loop, ON_BrepLoop::outer, &loops, info);
     }
 }
 
@@ -1184,20 +1196,24 @@
     // Edges are important for patch merging - tighten them by adding more edge
     // points than just the vertex points.  Probably the right thing to do 
here is
     // to use points from the 3D NURBS edge curves instead of the bot edges, 
but
-    // this is a first step and it does seem to improve the surface mapping at 
the
-    // edges, at least from what I can tell in the wireframe.
+    // the points used for surface fitting must be the points used for 2D 
pullback
+    // curve fitting
     EdgeList edges;
     EdgeList::iterator e_it;
     find_edge_segments(faces, &edges, info);
     for (e_it = edges.begin(); e_it != edges.end(); e_it++) {
-       point_t p1, p2, p3;
-       VMOVE(p1, &bot->vertices[(*e_it).first])
-       VMOVE(p2, &bot->vertices[(*e_it).second])
-       p3[0] = (p1[0] + p2[0])/2;
-       p3[1] = (p1[1] + p2[1])/2;
-       p3[2] = (p1[2] + p2[2])/2;
-       // add edge midpoint
-       data.push_back(ON_3dVector(V3ARGS(p3)));
+       std::set<size_t> faces_from_edge = info->edge_to_face[(*e_it)];
+       for (f_it = faces->begin(); f_it != faces->end(); f_it++) {
+           double vdot = ON_DotProduct(*info->face_normals.At(*(f_it)), 
*info->face_normals.At(*(info->patches[curr_patch].begin())));
+           if (vdot > 0) {
+               ON_3dPoint 
pt1(&info->bot->vertices[info->bot->faces[(*f_it)*3+0]*3]);
+               ON_3dPoint 
pt2(&info->bot->vertices[info->bot->faces[(*f_it)*3+1]*3]);
+               ON_3dPoint 
pt3(&info->bot->vertices[info->bot->faces[(*f_it)*3+2]*3]);
+               data.push_back(ON_3dVector(pt1));
+               data.push_back(ON_3dVector(pt2));
+               data.push_back(ON_3dVector(pt3));
+           }
+       }
     }
 }
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Got visibility?
Most devs has no idea what their production app looks like.
Find out how fast your code is with AppDynamics Lite.
http://ad.doubleclick.net/clk;262219671;13503038;y?
http://info.appdynamics.com/FreeJavaPerformanceDownload.html
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to