Bugfix #25874
authorTon Roosendaal <ton@blender.org>
Mon, 31 Jan 2011 17:28:03 +0000 (17:28 +0000)
committerTon Roosendaal <ton@blender.org>
Mon, 31 Jan 2011 17:28:03 +0000 (17:28 +0000)
Area split error: if the first split position was exactly aligned
with another 'edge' it merged the edges, causing the subdivision
layout to go haywire. Only happens in rare occasions, good find
this report :)

source/blender/editors/screen/screen_edit.c
source/blender/editors/screen/screen_intern.h
source/blender/editors/screen/screen_ops.c

index 376e70f..9a11dfa 100644 (file)
@@ -346,7 +346,7 @@ static short testsplitpoint(ScrArea *sa, char dir, float fac)
        }
 }
 
-ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac)
+ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
 {
        ScrArea *newa=NULL;
        ScrVert *sv1, *sv2;
@@ -400,7 +400,8 @@ ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac)
        }
        
        /* remove double vertices en edges */
-       removedouble_scrverts(sc);
+       if(merge)
+               removedouble_scrverts(sc);
        removedouble_scredges(sc);
        removenotused_scredges(sc);
        
@@ -1611,7 +1612,7 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
                oldscreen->animtimer= NULL;
 
                /* returns the top small area */
-               newa= area_split(sc, (ScrArea *)sc->areabase.first, 'h', 0.99f);
+               newa= area_split(sc, (ScrArea *)sc->areabase.first, 'h', 0.99f, 1);
                ED_area_newspace(C, newa, SPACE_INFO);
 
                /* use random area when we have no active one, e.g. when the
index b20daf9..87b3973 100644 (file)
@@ -37,7 +37,7 @@ void          area_copy_data  (ScrArea *sa1, ScrArea *sa2, int swap_space);
 
 /* screen_edit.c */
 ScrEdge                *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2);
-ScrArea                *area_split(bScreen *sc, ScrArea *sa, char dir, float fac);
+ScrArea                *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge);
 int                    screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2);
 int                    area_getorientation(ScrArea *sa, ScrArea *sb);
 void           select_connected_scredge(bScreen *sc, ScrEdge *edge);
index d891b02..1c203b2 100644 (file)
@@ -1169,7 +1169,7 @@ static int area_split_apply(bContext *C, wmOperator *op)
        fac= RNA_float_get(op->ptr, "factor");
        dir= RNA_enum_get(op->ptr, "direction");
        
-       sd->narea= area_split(sc, sd->sarea, dir, fac);
+       sd->narea= area_split(sc, sd->sarea, dir, fac, 0); /* 0 = no merge */
        
        if(sd->narea) {
                ScrVert *sv;