Commit: c2b928243f7cb88cfba11dc49b30fb3bf43919f4
Author: Jonathan deWerd
Date:   Fri Jun 27 16:07:45 2014 -0400
https://developer.blender.org/rBc2b928243f7cb88cfba11dc49b30fb3bf43919f4

Buggy code pre-reorganization.

===================================================================

M       source/blender/editors/curve/GridMesh.cpp
M       source/blender/editors/curve/GridMesh_GLUT_debug_tool.cpp

===================================================================

diff --git a/source/blender/editors/curve/GridMesh.cpp 
b/source/blender/editors/curve/GridMesh.cpp
index f9bec10..d6907ae 100644
--- a/source/blender/editors/curve/GridMesh.cpp
+++ b/source/blender/editors/curve/GridMesh.cpp
@@ -520,7 +520,7 @@ void GridMesh::trim_to_odd(int poly) {
                GreinerV2f *vvert = &v[vert];
                // Move until vert = valid starting vertex
                bool bail=false;
-               while (!(    (vvert->is_intersection  && !vvert->is_entry)
+               while (!(    (vvert->is_intersection)
                                  || (!vvert->is_intersection && 
vvert->is_interior))) {
                        vvert->is_used = true;
                        vert = vvert->next;
@@ -540,16 +540,23 @@ void GridMesh::trim_to_odd(int poly) {
                        first_trace_poly = vert;
                        if (poly!=vert) {
                                v[poly].next_poly = vert;
-                               v[poly].next = poly;
-                               v[poly].prev = poly;
+                               v[poly].next = 0;
+                               v[poly].prev = 0;
+                               v[poly].is_used = 1;
                        }
                }
+               // The do-while loop assumes is_intersection => needs to jump 
off
+               if (vvert->is_intersection) {
+                       vvert->is_used = 1;
+                       vert = vvert->next;
+                       vvert = &v[vert];
+               }
                // Now trace out the active boundary, leaving behind
                //  .is_used=1
                //  .first = latest_trace_poly
                //  .prev/.next connecting the boundary
                // and spinning out trace_origins every time we exit poly
-               while (vert != latest_trace_poly) {
+               do { // do while (vert != latest_trace_poly)
                        vvert->is_used = 1;
                        vvert->first = latest_trace_poly;
                        if (vvert->is_intersection) {
@@ -572,37 +579,46 @@ void GridMesh::trim_to_odd(int poly) {
                                                // v[last].next = fvert;
                                                // v[fvert].prev = last;
                                        }
-                                       vert = v[reentry_island].next;
-                                       vvert = &v[vert];
-                                       vvert->prev = fvert;
-                                       v[fvert].next = vert;
+                                       if (v[reentry_island].is_used) {
+                                               v[last].next = reentry_island;
+                                               v[reentry_island].prev = last;
+                                       } else { // Hop past the reentry island 
-- it's not our destination
+                                               vert = v[reentry_island].next;
+                                               vvert = &v[vert];
+                                               vvert->prev = fvert;
+                                               v[fvert].next = vert;
+                                       }
                                } else { // prev prev prev along foreign edge
                                        int fvert = v[escape_island].prev;
-                                       v[last].next = fvert;
-                                       v[fvert].prev = last;
+                                       int fvert_prev;
                                        while (true) {
+                                               fvert_prev = v[fvert].prev;
+                                               v[last].next = fvert;
+                                               v[fvert].prev = last;
                                                v[fvert].is_used = true;
                                                v[fvert].first = 
latest_trace_poly;
                                                reentry_island = 
v[fvert].neighbor;
                                                if (reentry_island) {
                                                        if 
(v[reentry_island].first==poly) break;
                                                }
-                                               int next_fvert = v[fvert].prev;
-                                               v[last].next = fvert;
-                                               v[fvert].prev = last;
                                                last = fvert;
-                                               fvert = next_fvert;
+                                               fvert = fvert_prev;
+                                       }
+                                       if (v[reentry_island].is_used) {
+                                               v[last].next = reentry_island;
+                                               v[reentry_island].prev = last;
+                                       } else {
+                                               vert = v[reentry_island].next;
+                                               vvert = &v[vert];
+                                               vvert->prev = fvert;
+                                               v[fvert].next = vert;
                                        }
-                                       vert = v[reentry_island].next;
-                                       vvert = &v[vert];
-                                       vvert->prev = fvert;
-                                       v[fvert].next = vert;
                                }
                        } else { // !vvert->is_intersection
                                vert = vvert->next;
                                vvert = &v[vert];
                        }
-               } // end while (vert != latest_trace_poly)
+               } while (vert && vert!=latest_trace_poly);
        }
 }
 
@@ -620,13 +636,13 @@ void GridMesh::label_interior_freepoly(int poly) {
        }
        for (int vert=poly; vert; vert=v[vert].next) {
                if (v[vert].is_intersection) {
-                       int neighbor = v[vert].neighbor;
-                       if (inside.count(neighbor)) {
+                       int neighbor_poly = v[v[vert].neighbor].first;
+                       if (inside.count(neighbor_poly)) {
                                v[vert].is_entry = false;
-                               inside.erase(neighbor);
+                               inside.erase(neighbor_poly);
                        } else {
                                v[vert].is_entry = true;
-                               inside.insert(neighbor);
+                               inside.insert(neighbor_poly);
                        }
                }
                if (v[vert].next==poly) break;
diff --git a/source/blender/editors/curve/GridMesh_GLUT_debug_tool.cpp 
b/source/blender/editors/curve/GridMesh_GLUT_debug_tool.cpp
index ae937f3..3c48517 100644
--- a/source/blender/editors/curve/GridMesh_GLUT_debug_tool.cpp
+++ b/source/blender/editors/curve/GridMesh_GLUT_debug_tool.cpp
@@ -25,10 +25,9 @@ float intersect_check_tol = .001; //Maximum Euclidean dist 
between intersect pts
 GridMesh *gm;
 bool clip_cyclic = true; // Required for initialization
 bool subj_cyclic = true;
-std::vector<float> clip_verts = {2.360000,8.648000, 3.176000,5.888000, 
0.200000,5.000000, 1.304000,0.416000, 4.208000,2.096000, 8.600000,0.536000, 
9.632000,4.736000, 5.960000,5.936000, 6.896000,8.696000};
-std::vector<float> subj0 = {2.816000,4.784000, 5.024000,5.000000, 
5.672000,4.808001, 5.720000,4.160000, 5.384000,3.248000, 4.496000,2.840000, 
4.832000,2.456000, 5.696000,3.056000, 6.104000,3.896000, 6.104000,5.024000, 
5.072000,5.672000};
-std::vector<float> subj1 = {3.992000,3.344000, 5.048000,3.320000, 
5.264000,3.896000, 5.120000,4.160000, 4.832000,4.232000, 4.472000,4.256001, 
4.160000,4.256001, 3.896000,4.160000};
-std::vector<std::vector<float>> subj_polys = {subj0,subj1};
+std::vector<float> clip_verts = {.2,.2,  1.8,.2,  1.8,1.8,  .2,1.8};
+std::vector<float> subj0 = {.8,.8,  1.2,.8,  1.2,1.2,  .8,1.2};
+std::vector<std::vector<float>> subj_polys = {subj0};
 std::vector<float> inout_pts = {};
 
 int clip = 0; // Vertex index of the first vertex of the clip polygon
@@ -40,13 +39,13 @@ int win_height = 500;
 void glut_coords_2_scene(float gx, float gy, float* sx, float* sy) {
        gx /= win_width;
        gy /= win_height;
-       *sx =-1.0*(1-gx) + 11.0*gx;
-       *sy =11.0*(1-gy) + -1.0*gy;
+       *sx =-1.0*(1-gx) + 03.0*gx;
+       *sy =03.0*(1-gy) + -1.0*gy;
 }
 
 void init_default_scene() {
        // Create the gridmesh
-       gm = new GridMesh(0,0,10,10,11,11);
+       gm = new GridMesh(0,0,2,2,2,2); // x,y x,y nx,ny
        // Import the clip polygon into the linked-list datastructure
        int last = 0;
        size_t clip_n = clip_verts.size()/2;
@@ -102,7 +101,7 @@ void GLUT_init(){
     glMatrixMode(GL_PROJECTION);
        // Defines the view box
        // left,right,bottom,top
-    gluOrtho2D(-1,11,-1,11);
+    gluOrtho2D(-1,03,-1,03);
        init_default_scene();
 }
 
@@ -251,9 +250,6 @@ void GLUT_reshape(int w, int h){
        glViewport(0,0,w,h);
        win_width = w;
        win_height = h;
-       if (debug){
-               printf("GLUT_reshape w:%d h:%d\n",w,h);
-       }
 }
 void dump_polys_to_stdout() {
        GreinerV2f *v = gm->v;
@@ -367,17 +363,17 @@ void create_pt(float sx, float sy) {
        grabbed_vert = v; // Let's drag the new vert we just made
        glutPostRedisplay();
 }
-void initiate_pt_drag_if_near_pt(float sx, float sy) {
-       GreinerV2f *v = gm->v; // Vertex info array
+int closest_vert(float sx, float sy, float *dist) {
+       GreinerV2f *v = gm->v;
        float closest_dist = 1e50;
-       int closest_vert = 0;
+       int nearest_v = 0;
        for (int vert=clip; vert; vert=v[vert].next) {
                float dx = v[vert].x - sx;
                float dy = v[vert].y - sy;
                float dist = sqrt(dx*dx + dy*dy);
                if (dist<closest_dist) {
                        closest_dist = dist;
-                       closest_vert = vert;
+                       nearest_v = vert;
                }
                if (v[vert].next==clip) break;
        }
@@ -388,13 +384,18 @@ void initiate_pt_drag_if_near_pt(float sx, float sy) {
                        float dist = sqrt(dx*dx + dy*dy);
                        if (dist<closest_dist) {
                                closest_dist = dist;
-                               closest_vert = vert;
+                               nearest_v = vert;
                        }
                        if (v[vert].next==poly) break;
                }
        }
-       if (debug) printf("Nearest point to mousedown (%f)\n",closest_dist);
-       grabbed_vert = (closest_dist<.1) ? closest_vert : 0;
+       if (dist) *dist = closest_dist;
+       return nearest_v;
+}
+void initiate_pt_drag_if_near_pt(float sx, float sy) {
+       float dist;
+       int v = closest_vert(sx,sy,&dist);
+       grabbed_vert = (dist<.1) ? v : 0;
 }
 void terminate_pt_drag() {
        //grabbed_vert = nullptr;
@@ -440,6 +441,12 @@ void GLUT_motion(int x, int y) {
                glutPostRedisplay();
        }
 }
+void GLUT_passive(int x, int y) {
+       float sx,sy,dist;
+       glut_coords_2_scene(x,y,&sx,&sy);
+       int v = closest_vert(sx,sy,&dist);
+       if (dist<.1) printf("Vertex near cursor: %i\n",v);
+}
 
 
 /***************************** MAIN *****************************/
@@ -453,7 +460,7 @@ int main(int argc, char **argv){
        glutReshapeFunc(GLUT_reshape);
        glutMouseFunc(GLUT_mouse);
        glutMotionFunc(GLUT_motion); // Mouse is dragged. Callback args: (int 
x, int y)
-       glutPassiveMotionFunc(NULL); // Mouse is moved. Callback args: (int x, 
int y)
+       glutPassiveMotionFunc(GLUT_passive); // Mouse is moved. Callback args: 
(int x, int y)
        glutKeyboardFunc(GLUT_keyboard);
        glutSpecialFunc(GLUT_specialkey);
     GLUT_init();

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to