- fixed error in lasso select (evaluated lasso coords one too many!)
authorTon Roosendaal <ton@blender.org>
Fri, 1 Oct 2004 09:54:47 +0000 (09:54 +0000)
committerTon Roosendaal <ton@blender.org>
Fri, 1 Oct 2004 09:54:47 +0000 (09:54 +0000)
- made ctrl+tab menu for selectmode only pop up in editmode mesh
- changed lasso code in zbuffer-select mode, that it also accepts lines
  as lasso

source/blender/src/editmesh_mods.c
source/blender/src/editview.c
source/blender/src/toets.c

index 2d68fd3e50349748272cb06021f389784af16339..e34ce22a70167e2c6a0139bef34c081948bf0d51 100644 (file)
@@ -295,6 +295,10 @@ int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short
        glBegin(GL_POLYGON);
        for(a=0; a<tot; a++) glVertex2s(mcords[a][0], mcords[a][1]);
        glEnd();
+       glBegin(GL_LINE_LOOP);  // for zero sized masks, lines
+       for(a=0; a<tot; a++) glVertex2s(mcords[a][0], mcords[a][1]);
+       glEnd();
+       
        persp(PERSP_VIEW);
        glFinish();     // to be sure readpixels sees mask
        
index 49a077ced218a312f8ddfa7c96d154c9466edcd8..21077c112bc6c2ed3474352e5c229c101aa53f12 100644 (file)
@@ -218,19 +218,12 @@ static short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4)  /* intersec
        */
        float div, labda, mu;
        
-       div= (v1[0]-v2[0])*(v3[1]-v4[1])-(v3[0]-v4[0])*(v1[1]-v2[1]);
+       div= (v2[0]-v1[0])*(v4[1]-v3[1])-(v2[1]-v1[1])*(v4[0]-v3[0]);
        if(div==0.0) return -1;
        
-       labda= (v1[1]-v3[1])*(v3[0]-v4[0])-(v1[0]-v3[0])*(v3[1]-v4[1]);
-       labda= -(labda/div);
-       
-       div= v3[1]-v4[1];
-       if(div==0) {
-               div=v3[0]-v4[0];
-               mu= -(labda*(v2[0]-v1[0])+v1[0]-v3[0])/div;
-       } else {
-               mu= -(labda*(v2[1]-v1[1])+v1[1]-v3[1])/div;
-       }
+       labda= ((float)(v1[1]-v3[1])*(v4[0]-v3[0])-(v1[0]-v3[0])*(v4[1]-v3[1]))/div;
+
+       mu= ((float)(v1[1]-v3[1])*(v2[0]-v1[0])-(v1[0]-v3[0])*(v2[1]-v1[1]))/div;
        
        if(labda>=0.0 && labda<=1.0 && mu>=0.0 && mu<=1.0) {
                if(labda==0.0 || labda==1.0 || mu==0.0 || mu==1.0) return 1;
@@ -243,7 +236,7 @@ static short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4)  /* intersec
 static int lasso_inside_edge(short mcords[][2], short moves, short *v1, short *v2)
 {
        int a;
-       
+
        // check points in lasso
        if(lasso_inside(mcords, moves, v1[0], v1[1])) return 1;
        if(lasso_inside(mcords, moves, v2[0], v2[1])) return 1;
@@ -251,7 +244,7 @@ static int lasso_inside_edge(short mcords[][2], short moves, short *v1, short *v
        /* no points in lasso, so we have to intersect with lasso edge */
        
        if( IsectLL2Ds(mcords[0], mcords[moves-1], v1, v2) > 0) return 1;
-       for(a=0; a<moves; a++) {
+       for(a=0; a<moves-1; a++) {
                if( IsectLL2Ds(mcords[a], mcords[a+1], v1, v2) > 0) return 1;
        }
        
@@ -400,6 +393,9 @@ static void do_lasso_select(short mcords[][2], short moves, short select)
                do_lasso_select_objects(mcords, moves, select);
        else if(G.obedit->type==OB_MESH) 
                do_lasso_select_mesh(mcords, moves, select);
+
+       BIF_undo_push("Lasso select");
+
 }
 
 /* un-draws and draws again */
index 4d1af7ba5afa5beb0c858e001caa44c32a0a77db..6657214cb526100bc0c386881a2724ffa74033a4 100644 (file)
@@ -759,7 +759,7 @@ int blenderqread(unsigned short event, short val)
                                        else enter_posemode();
                                }
                                else if(ob->type==OB_MESH) {
-                                       EM_selectmode_menu();
+                                       if(ob==G.obedit) EM_selectmode_menu();
                                }
                        }
                }