svn merge -r 40061:40078 https://svn.blender.org/svnroot/bf-blender/trunk/blender
authorBenoit Bolsee <benoit.bolsee@online.be>
Fri, 9 Sep 2011 19:30:33 +0000 (19:30 +0000)
committerBenoit Bolsee <benoit.bolsee@online.be>
Fri, 9 Sep 2011 19:30:33 +0000 (19:30 +0000)
15 files changed:
release/scripts/startup/bl_ui/space_view3d_toolbar.py
source/blender/blenlib/BLI_math_inline.h
source/blender/editors/interface/interface_widgets.c
source/blender/editors/mesh/editmesh_mods.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/sculpt_paint/paint_stroke.c
source/blender/editors/space_outliner/outliner_draw.c
source/blender/editors/space_outliner/outliner_edit.c
source/blender/editors/space_outliner/outliner_intern.h
source/blender/editors/space_outliner/outliner_select.c
source/blender/editors/space_outliner/outliner_tools.c
source/blender/editors/space_outliner/outliner_tree.c
source/blender/makesdna/DNA_outliner_types.h
source/blender/makesdna/DNA_space_types.h
source/blender/python/intern/gpu.c

index aa26cb43eed71fe4835013bb3c9c10eaa81e5162..4b2ee57df68b2b7cab605acdb81de1e0706c575a 100644 (file)
@@ -768,9 +768,9 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, Panel):
             col = row.column()
 
             if brush.use_texture_overlay:
-                col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_OFF')
+                col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_OFF')
             else:
-                col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_ON')
+                col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_ON')
 
             col.active = tex_slot.map_mode in {'FIXED', 'TILED'}
 
index 122b2679d5b59ba8e89f5953547410230e999e6d..4309e6122df85299b8e8bb4a3ce3fdc4809cda43 100644 (file)
@@ -45,8 +45,13 @@ extern "C" {
 #define MALWAYS_INLINE MINLINE
 #else
 #define MINLINE static inline
+#if (defined(__APPLE__) && defined(__ppc__))
+/* static inline __attribute__ here breaks osx ppc gcc42 build */
+#define MALWAYS_INLINE static __attribute__((always_inline))
+#else
 #define MALWAYS_INLINE static inline __attribute__((always_inline))
 #endif
+#endif
 #else
 #define MINLINE
 #define MALWAYS_INLINE
index 5da875356ea2524672c4086f3fd0988d57c689ae..c06e26eecaa45b0ff3263402fc01f0a16af56d0a 100644 (file)
@@ -86,12 +86,25 @@ typedef struct uiWidgetTrias {
        
 } uiWidgetTrias;
 
+/* max as used by round_box__edges */
+#define WIDGET_CURVE_RESOLU 9
+#define WIDGET_SIZE_MAX (WIDGET_CURVE_RESOLU*4)
+
+enum {
+       WIDGET_TOP_LEFT= 1,
+       WIDGET_TOP_RIGHT= 2,
+       WIDGET_BOTTOM_RIGHT= 4,
+       WIDGET_BOTTOM_LEFT= 8,
+       /* just for convenience */
+       WIDGET_ALL_CORNERS= (WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT)
+};
+
 typedef struct uiWidgetBase {
        
        int totvert, halfwayvert;
-       float outer_v[64][2];
-       float inner_v[64][2];
-       float inner_uv[64][2];
+       float outer_v[WIDGET_SIZE_MAX][2];
+       float inner_v[WIDGET_SIZE_MAX][2];
+       float inner_uv[WIDGET_SIZE_MAX][2];
        
        short inner, outline, emboss; /* set on/off */
        short shadedir;
@@ -123,7 +136,7 @@ typedef struct uiWidgetType {
 
 /* *********************** draw data ************************** */
 
-static float cornervec[9][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, 
+static float cornervec[WIDGET_CURVE_RESOLU][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
 {0.707, 0.293}, {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}, {1.0, 1.0}};
 
 static float jit[8][2]= {{0.468813 , -0.481430}, {-0.155755 , -0.352820}, 
@@ -175,6 +188,7 @@ GLubyte checker_stipple_sml[32*32/8] =
 
 void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3)
 {
+       float tri_arr[3][2]= {{x1, y1}, {x2, y2}, {x3, y3}};
        float color[4];
        int j;
        
@@ -182,20 +196,18 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y
        glGetFloatv(GL_CURRENT_COLOR, color);
        color[3] *= 0.125f;
        glColor4fv(color);
-       
+
+       glEnableClientState(GL_VERTEX_ARRAY);
+       glVertexPointer(2, GL_FLOAT, 0, tri_arr);
+
        /* for each AA step */
        for(j=0; j<8; j++) {
                glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
-
-               glBegin(GL_POLYGON);
-               glVertex2f(x1, y1);
-               glVertex2f(x2, y2);
-               glVertex2f(x3, y3);
-               glEnd();
-               
+               glDrawArrays(GL_TRIANGLES, 0, 3);
                glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
        }
 
+       glDisableClientState(GL_VERTEX_ARRAY);
        glDisable(GL_BLEND);
        
 }
@@ -216,7 +228,7 @@ static void widget_init(uiWidgetBase *wtb)
 /* return tot */
 static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int roundboxalign, float step)
 {
-       float vec[9][2];
+       float vec[WIDGET_CURVE_RESOLU][2];
        float minx, miny, maxx, maxy;
        int a, tot= 0;
        
@@ -231,59 +243,59 @@ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int r
        maxy= rect->ymax+step;
        
        /* mult */
-       for(a=0; a<9; a++) {
+       for(a=0; a < WIDGET_CURVE_RESOLU; a++) {
                vec[a][0]= rad*cornervec[a][0]; 
                vec[a][1]= rad*cornervec[a][1]; 
        }
        
        /* start with left-top, anti clockwise */
-       if(roundboxalign & 1) {
-               for(a=0; a<9; a++, tot++) {
+       if(roundboxalign & WIDGET_TOP_LEFT) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        vert[tot][0]= minx+rad-vec[a][0];
                        vert[tot][1]= maxy-vec[a][1];
                }
        }
        else {
-               for(a=0; a<9; a++, tot++) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        vert[tot][0]= minx;
                        vert[tot][1]= maxy;
                }
        }
        
-       if(roundboxalign & 8) {
-               for(a=0; a<9; a++, tot++) {
+       if(roundboxalign & WIDGET_BOTTOM_LEFT) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        vert[tot][0]= minx+vec[a][1];
                        vert[tot][1]= miny+rad-vec[a][0];
                }
        }
        else {
-               for(a=0; a<9; a++, tot++) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        vert[tot][0]= minx;
                        vert[tot][1]= miny;
                }
        }
        
-       if(roundboxalign & 4) {
-               for(a=0; a<9; a++, tot++) {
+       if(roundboxalign & WIDGET_BOTTOM_RIGHT) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        vert[tot][0]= maxx-rad+vec[a][0];
                        vert[tot][1]= miny+vec[a][1];
                }
        }
        else {
-               for(a=0; a<9; a++, tot++) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        vert[tot][0]= maxx;
                        vert[tot][1]= miny;
                }
        }
        
-       if(roundboxalign & 2) {
-               for(a=0; a<9; a++, tot++) {
+       if(roundboxalign & WIDGET_TOP_RIGHT) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        vert[tot][0]= maxx-vec[a][1];
                        vert[tot][1]= maxy-rad+vec[a][0];
                }
        }
        else {
-               for(a=0; a<9; a++, tot++) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        vert[tot][0]= maxx;
                        vert[tot][1]= maxy;
                }
@@ -294,7 +306,7 @@ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int r
 /* this call has 1 extra arg to allow mask outline */
 static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, float rad, float radi)
 {
-       float vec[9][2], veci[9][2];
+       float vec[WIDGET_CURVE_RESOLU][2], veci[WIDGET_CURVE_RESOLU][2];
        float minx= rect->xmin, miny= rect->ymin, maxx= rect->xmax, maxy= rect->ymax;
        float minxi= minx + 1.0f; /* boundbox inner */
        float maxxi= maxx - 1.0f;
@@ -303,8 +315,10 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
        float facxi= (maxxi!=minxi) ? 1.0f/(maxxi-minxi) : 0.0f; /* for uv, can divide by zero */
        float facyi= (maxyi!=minyi) ? 1.0f/(maxyi-minyi) : 0.0f;
        int a, tot= 0, minsize;
-       const int hnum= ((roundboxalign & (1|2))==(1|2) || (roundboxalign & (4|8))==(4|8)) ? 1 : 2;
-       const int vnum= ((roundboxalign & (1|8))==(1|8) || (roundboxalign & (2|4))==(2|4)) ? 1 : 2;
+       const int hnum= ((roundboxalign & (WIDGET_TOP_LEFT|WIDGET_TOP_RIGHT))==(WIDGET_TOP_LEFT|WIDGET_TOP_RIGHT) ||
+                        (roundboxalign & (WIDGET_BOTTOM_RIGHT|WIDGET_BOTTOM_LEFT))==(WIDGET_BOTTOM_RIGHT|WIDGET_BOTTOM_LEFT)) ? 1 : 2;
+       const int vnum= ((roundboxalign & (WIDGET_TOP_LEFT|WIDGET_BOTTOM_LEFT))==(WIDGET_TOP_LEFT|WIDGET_BOTTOM_LEFT) ||
+                        (roundboxalign & (WIDGET_TOP_RIGHT|WIDGET_BOTTOM_RIGHT))==(WIDGET_TOP_RIGHT|WIDGET_BOTTOM_RIGHT)) ? 1 : 2;
 
        minsize= MIN2((rect->xmax-rect->xmin)*hnum, (rect->ymax-rect->ymin)*vnum);
        
@@ -315,7 +329,7 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
                radi= 0.5f*minsize - 1.0f;
        
        /* mult */
-       for(a=0; a<9; a++) {
+       for(a=0; a < WIDGET_CURVE_RESOLU; a++) {
                veci[a][0]= radi*cornervec[a][0]; 
                veci[a][1]= radi*cornervec[a][1]; 
                vec[a][0]= rad*cornervec[a][0]; 
@@ -323,9 +337,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
        }
        
        /* corner left-bottom */
-       if(roundboxalign & 8) {
+       if(roundboxalign & WIDGET_BOTTOM_LEFT) {
                
-               for(a=0; a<9; a++, tot++) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        wt->inner_v[tot][0]= minxi+veci[a][1];
                        wt->inner_v[tot][1]= minyi+radi-veci[a][0];
                        
@@ -350,9 +364,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
        }
        
        /* corner right-bottom */
-       if(roundboxalign & 4) {
+       if(roundboxalign & WIDGET_BOTTOM_RIGHT) {
                
-               for(a=0; a<9; a++, tot++) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        wt->inner_v[tot][0]= maxxi-radi+veci[a][0];
                        wt->inner_v[tot][1]= minyi+veci[a][1];
                        
@@ -379,9 +393,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
        wt->halfwayvert= tot;
        
        /* corner right-top */
-       if(roundboxalign & 2) {
+       if(roundboxalign & WIDGET_TOP_RIGHT) {
                
-               for(a=0; a<9; a++, tot++) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        wt->inner_v[tot][0]= maxxi-veci[a][1];
                        wt->inner_v[tot][1]= maxyi-radi+veci[a][0];
                        
@@ -406,9 +420,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
        }
        
        /* corner left-top */
-       if(roundboxalign & 1) {
+       if(roundboxalign & WIDGET_TOP_LEFT) {
                
-               for(a=0; a<9; a++, tot++) {
+               for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
                        wt->inner_v[tot][0]= minxi+radi-veci[a][0];
                        wt->inner_v[tot][1]= maxyi-veci[a][1];
                        
@@ -433,7 +447,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
                
                tot++;
        }
-               
+
+       BLI_assert(tot <= WIDGET_SIZE_MAX);
+
        wt->totvert= tot;
 }
 
@@ -516,16 +532,13 @@ static void widget_scroll_circle(uiWidgetTrias *tria, rcti *rect, float triasize
 
 static void widget_trias_draw(uiWidgetTrias *tria)
 {
-       int a;
-       
-       glBegin(GL_TRIANGLES);
-       for(a=0; a<tria->tot; a++) {
-               glVertex2fv(tria->vec[ tria->index[a][0] ]);
-               glVertex2fv(tria->vec[ tria->index[a][1] ]);
-               glVertex2fv(tria->vec[ tria->index[a][2] ]);
-       }
-       glEnd();
-       
+       glEnableClientState(GL_VERTEX_ARRAY);
+       glEnableClientState(GL_INDEX_ARRAY);
+       glIndexPointer(GL_INT, 0, tria->index);
+       glVertexPointer(2, GL_FLOAT, 0, tria->vec);
+       glDrawArrays(GL_TRIANGLES, 0, tria->tot*3);
+       glDisableClientState(GL_VERTEX_ARRAY);
+       glDisableClientState(GL_INDEX_ARRAY);
 }
 
 static void widget_menu_trias(uiWidgetTrias *tria, rcti *rect)
@@ -601,19 +614,48 @@ static void round_box_shade_col4(const char col1[4], const char col2[4], const f
        glColor4ubv(col);
 }
 
-static void widgetbase_outline(uiWidgetBase *wtb)
+static void round_box_shade_col4_r(unsigned char col_r[4], const char col1[4], const char col2[4], const float fac)
+{
+       const int faci= FTOCHAR(fac);
+       const int facm= 255-faci;
+
+       col_r[0]= (faci*col1[0] + facm*col2[0])>>8;
+       col_r[1]= (faci*col1[1] + facm*col2[1])>>8;
+       col_r[2]= (faci*col1[2] + facm*col2[2])>>8;
+       col_r[3]= (faci*col1[3] + facm*col2[3])>>8;
+}
+
+static void widget_verts_to_quad_strip(uiWidgetBase *wtb, const int totvert, float quad_strip[WIDGET_SIZE_MAX*2+2][2])
 {
        int a;
-       
-       /* outline */
-       glBegin(GL_QUAD_STRIP);
-       for(a=0; a<wtb->totvert; a++) {
-               glVertex2fv(wtb->outer_v[a]);
-               glVertex2fv(wtb->inner_v[a]);
+       for(a=0; a<totvert; a++) {
+               copy_v2_v2(quad_strip[a*2], wtb->outer_v[a]);
+               copy_v2_v2(quad_strip[a*2+1], wtb->inner_v[a]);
+       }
+       copy_v2_v2(quad_strip[a*2], wtb->outer_v[0]);
+       copy_v2_v2(quad_strip[a*2+1], wtb->inner_v[0]);
+}
+
+static void widget_verts_to_quad_strip_open(uiWidgetBase *wtb, const int totvert, float quad_strip[WIDGET_SIZE_MAX*2][2])
+{
+       int a;
+       for(a=0; a<totvert; a++) {
+               quad_strip[a*2][0]= wtb->outer_v[a][0];
+               quad_strip[a*2][1]= wtb->outer_v[a][1];
+               quad_strip[a*2+1][0]= wtb->outer_v[a][0];
+               quad_strip[a*2+1][1]= wtb->outer_v[a][1] - 1.0f;
        }
-       glVertex2fv(wtb->outer_v[0]);
-       glVertex2fv(wtb->inner_v[0]);
-       glEnd();
+}
+
+static void widgetbase_outline(uiWidgetBase *wtb)
+{
+       float quad_strip[WIDGET_SIZE_MAX*2+2][2]; /* + 2 because the last pair is wrapped */
+       widget_verts_to_quad_strip(wtb, wtb->totvert, quad_strip);
+
+       glEnableClientState(GL_VERTEX_ARRAY);
+       glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+       glDrawArrays(GL_QUAD_STRIP, 0, wtb->totvert*2 + 2);
+       glDisableClientState(GL_VERTEX_ARRAY);
 }
 
 static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
@@ -626,100 +668,124 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
        if(wtb->inner) {
                if(wcol->shaded==0) {
                        if (wcol->alpha_check) {
+                               float inner_v_half[WIDGET_SIZE_MAX][2];
                                float x_mid= 0.0f; /* used for dumb clamping of values */
 
                                /* dark checkers */
                                glColor4ub(UI_TRANSP_DARK, UI_TRANSP_DARK, UI_TRANSP_DARK, 255);
-                               glBegin(GL_POLYGON);
-                               for(a=0; a<wtb->totvert; a++) {
-                                       glVertex2fv(wtb->inner_v[a]);
-                               }
-                               glEnd();
+                               glEnableClientState(GL_VERTEX_ARRAY);
+                               glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+                               glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+                               glDisableClientState(GL_VERTEX_ARRAY);
 
                                /* light checkers */
                                glEnable(GL_POLYGON_STIPPLE);
                                glColor4ub(UI_TRANSP_LIGHT, UI_TRANSP_LIGHT, UI_TRANSP_LIGHT, 255);
                                glPolygonStipple(checker_stipple_sml);
-                               glBegin(GL_POLYGON);
-                               for(a=0; a<wtb->totvert; a++) {
-                                       glVertex2fv(wtb->inner_v[a]);
-                               }
-                               glEnd();
+
+                               glEnableClientState(GL_VERTEX_ARRAY);
+                               glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+                               glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+                               glDisableClientState(GL_VERTEX_ARRAY);
+
                                glDisable(GL_POLYGON_STIPPLE);
 
                                /* alpha fill */
                                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
                                glColor4ubv((unsigned char*)wcol->inner);
-                               glBegin(GL_POLYGON);
+                               glEnableClientState(GL_VERTEX_ARRAY);
+
                                for(a=0; a<wtb->totvert; a++) {
-                                       glVertex2fv(wtb->inner_v[a]);
                                        x_mid += wtb->inner_v[a][0];
                                }
                                x_mid /= wtb->totvert;
-                               glEnd();
+
+                               glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+                               glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+                               glDisableClientState(GL_VERTEX_ARRAY);
 
                                /* 1/2 solid color */
                                glColor4ub(wcol->inner[0], wcol->inner[1], wcol->inner[2], 255);
-                               glBegin(GL_POLYGON);
-                               for(a=0; a<wtb->totvert; a++)
-                                       glVertex2f(MIN2(wtb->inner_v[a][0], x_mid), wtb->inner_v[a][1]);
-                               glEnd();
+
+                               for(a=0; a<wtb->totvert; a++) {
+                                       inner_v_half[a][0]= MIN2(wtb->inner_v[a][0], x_mid);
+                                       inner_v_half[a][1]= wtb->inner_v[a][1];
+                               }
+
+                               glEnableClientState(GL_VERTEX_ARRAY);
+                               glVertexPointer(2, GL_FLOAT, 0, inner_v_half);
+                               glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+                               glDisableClientState(GL_VERTEX_ARRAY);
                        }
                        else {
                                /* simple fill */
                                glColor4ubv((unsigned char*)wcol->inner);
-                               glBegin(GL_POLYGON);
-                               for(a=0; a<wtb->totvert; a++)
-                                       glVertex2fv(wtb->inner_v[a]);
-                               glEnd();
+
+                               glEnableClientState(GL_VERTEX_ARRAY);
+                               glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+                               glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+                               glDisableClientState(GL_VERTEX_ARRAY);
                        }
                }
                else {
                        char col1[4], col2[4];
+                       unsigned char col_array[WIDGET_SIZE_MAX * 4];
+                       unsigned char *col_pt= col_array;
                        
                        shadecolors4(col1, col2, wcol->inner, wcol->shadetop, wcol->shadedown);
                        
                        glShadeModel(GL_SMOOTH);
-                       glBegin(GL_POLYGON);
-                       for(a=0; a<wtb->totvert; a++) {
-                               round_box_shade_col4(col1, col2, wtb->inner_uv[a][wtb->shadedir]);
-                               glVertex2fv(wtb->inner_v[a]);
+                       for(a=0; a<wtb->totvert; a++, col_pt += 4) {
+                               round_box_shade_col4_r(col_pt, col1, col2, wtb->inner_uv[a][wtb->shadedir]);
                        }
-                       glEnd();
+
+                       glEnableClientState(GL_VERTEX_ARRAY);
+                       glEnableClientState(GL_COLOR_ARRAY);
+                       glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+                       glColorPointer(4, GL_UNSIGNED_BYTE, 0, col_array);
+                       glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+                       glDisableClientState(GL_VERTEX_ARRAY);
+                       glDisableClientState(GL_COLOR_ARRAY);
+
                        glShadeModel(GL_FLAT);
                }
        }
        
        /* for each AA step */
        if(wtb->outline) {
+               float quad_strip[WIDGET_SIZE_MAX*2+2][2]; /* + 2 because the last pair is wrapped */
+               float quad_strip_emboss[WIDGET_SIZE_MAX*2][2]; /* only for emboss */
+
+               widget_verts_to_quad_strip(wtb, wtb->totvert, quad_strip);
+
+               if(wtb->emboss) {
+                       widget_verts_to_quad_strip_open(wtb, wtb->halfwayvert, quad_strip_emboss);
+               }
+
+               glEnableClientState(GL_VERTEX_ARRAY);
+
                for(j=0; j<8; j++) {
                        glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
                        
                        /* outline */
                        glColor4ub(wcol->outline[0], wcol->outline[1], wcol->outline[2], 32);
-                       glBegin(GL_QUAD_STRIP);
-                       for(a=0; a<wtb->totvert; a++) {
-                               glVertex2fv(wtb->outer_v[a]);
-                               glVertex2fv(wtb->inner_v[a]);
-                       }
-                       glVertex2fv(wtb->outer_v[0]);
-                       glVertex2fv(wtb->inner_v[0]);
-                       glEnd();
+
+                       glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+                       glDrawArrays(GL_QUAD_STRIP, 0, wtb->totvert*2 + 2);
                
                        /* emboss bottom shadow */
                        if(wtb->emboss) {
                                glColor4f(1.0f, 1.0f, 1.0f, 0.02f);
-                               glBegin(GL_QUAD_STRIP);
-                               for(a=0; a<wtb->halfwayvert; a++) {
-                                       glVertex2fv(wtb->outer_v[a]);
-                                       glVertex2f(wtb->outer_v[a][0], wtb->outer_v[a][1]-1.0f);
-                               }
-                               glEnd();
+
+                               glVertexPointer(2, GL_FLOAT, 0, quad_strip_emboss);
+                               glDrawArrays(GL_QUAD_STRIP, 0, wtb->halfwayvert*2);
                        }
                        
                        glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
                }
+
+               glDisableClientState(GL_VERTEX_ARRAY);
        }
        
        /* decoration */
@@ -1611,7 +1677,8 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float
        uiWidgetBase wtb;
        rcti rect1= *rect;
        float alpha, alphastep;
-       int step, tot, a;
+       int step, totvert;
+       float quad_strip[WIDGET_SIZE_MAX*2][2];
        
        /* prevent tooltips to not show round shadow */
        if( 2.0f*radout > 0.2f*(rect1.ymax-rect1.ymin) )
@@ -1620,31 +1687,32 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float
                rect1.ymax -= 2.0f*radout;
        
        /* inner part */
-       tot= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & 12, 0.0f);
-       
+       totvert= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & (WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT), 0.0f);
+
        /* inverse linear shadow alpha */
        alpha= 0.15;
        alphastep= 0.67;
        
+       glEnableClientState(GL_VERTEX_ARRAY);
+
        for(step= 1; step<=radout; step++, alpha*=alphastep) {
-               round_box_shadow_edges(wtb.outer_v, &rect1, radin, 15, (float)step);
+               round_box_shadow_edges(wtb.outer_v, &rect1, radin, WIDGET_ALL_CORNERS, (float)step);
                
                glColor4f(0.0f, 0.0f, 0.0f, alpha);
-               
-               glBegin(GL_QUAD_STRIP);
-               for(a=0; a<tot; a++) {
-                       glVertex2fv(wtb.outer_v[a]);
-                       glVertex2fv(wtb.inner_v[a]);
-               }
-               glEnd();
+
+               widget_verts_to_quad_strip_open(&wtb, totvert, quad_strip);
+
+               glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+               glDrawArrays(GL_QUAD_STRIP, 0, totvert*2);
        }
-       
+
+       glDisableClientState(GL_VERTEX_ARRAY);
 }
 
 static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int direction)
 {
        uiWidgetBase wtb;
-       int roundboxalign= 15;
+       int roundboxalign= WIDGET_ALL_CORNERS;
        
        widget_init(&wtb);
        
@@ -1654,11 +1722,11 @@ static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int dir
                //rect->ymax += 4.0;
        }
        else if (direction == UI_DOWN) {
-               roundboxalign= 12;
+               roundboxalign= (WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT);
                rect->ymin -= 4.0;
        } 
        else if (direction == UI_TOP) {
-               roundboxalign= 3;
+               roundboxalign= WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT;
                rect->ymax += 4.0;
        }
        
@@ -2008,7 +2076,7 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect)
        widget_init(&wtb);
        
        /* fully rounded */
-       round_box_edges(&wtb, 15, rect, rad);
+       round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad);
        
        /* setup temp colors */
        wcol_tmp.outline[0]= wcol_tmp.outline[1]= wcol_tmp.outline[2]= 0;
@@ -2107,17 +2175,15 @@ void ui_draw_link_bezier(rcti *rect)
        if(ui_link_bezier_points(rect, coord_array, LINK_RESOL)) {
                /* we can reuse the dist variable here to increment the GL curve eval amount*/
                // const float dist= 1.0f/(float)LINK_RESOL; // UNUSED
-               int i;
 
                glEnable(GL_BLEND);
                glEnable(GL_LINE_SMOOTH);
-               
-               glBegin(GL_LINE_STRIP);
-               for(i=0; i<=LINK_RESOL; i++) {
-                       glVertex2fv(coord_array[i]);
-               }
-               glEnd();
-               
+
+               glEnableClientState(GL_VERTEX_ARRAY);
+               glVertexPointer(2, GL_FLOAT, 0, coord_array);
+               glDrawArrays(GL_LINE_STRIP, 0, LINK_RESOL);
+               glDisableClientState(GL_VERTEX_ARRAY);
+
                glDisable(GL_BLEND);
                glDisable(GL_LINE_SMOOTH);
 
@@ -2148,7 +2214,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
        if(horizontal)
                SWAP(short, wcol->shadetop, wcol->shadedown);
        
-       round_box_edges(&wtb, 15, rect, rad); 
+       round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad);
        widgetbase_draw(&wtb, wcol);
        
        /* slider */
@@ -2176,7 +2242,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
                if (state & UI_SCROLL_NO_OUTLINE)       
                        SWAP(short, outline, wtb.outline);
                
-               round_box_edges(&wtb, 15, slider, rad); 
+               round_box_edges(&wtb, WIDGET_ALL_CORNERS, slider, rad);
                
                if(state & UI_SCROLL_ARROWS) {
                        if(wcol->item[0] > 48) wcol->item[0]-= 48;
@@ -2343,7 +2409,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
                
                /* left part of slider, always rounded */
                rect1.xmax= rect1.xmin + ceil(offs+1.0f);
-               round_box_edges(&wtb1, roundboxalign & ~6, &rect1, offs);
+               round_box_edges(&wtb1, roundboxalign & ~(WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT), &rect1, offs);
                wtb1.outline= 0;
                widgetbase_draw(&wtb1, wcol);
                
@@ -2354,7 +2420,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
                        offs*= (rect1.xmax + offs - rect->xmax)/offs;
                else 
                        offs= 0.0f;
-               round_box_edges(&wtb1, roundboxalign & ~9, &rect1, offs);
+               round_box_edges(&wtb1, roundboxalign & ~(WIDGET_TOP_LEFT | WIDGET_BOTTOM_LEFT), &rect1, offs);
                
                widgetbase_draw(&wtb1, wcol);
                VECCOPY(wcol->outline, outline);
@@ -2436,7 +2502,7 @@ static void widget_icon_has_anim(uiBut *UNUSED(but), uiWidgetColors *wcol, rcti
                wtb.outline= 0;
                
                /* rounded */
-               round_box_edges(&wtb, 15, rect, 10.0f);
+               round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 10.0f);
                widgetbase_draw(&wtb, wcol);
        }       
 }
@@ -2499,7 +2565,7 @@ static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int
                widget_init(&wtb);
                
                /* half rounded */
-               round_box_edges(&wtb, 15, rect, rad);
+               round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad);
                
                widgetbase_draw(&wtb, wcol);
        }
@@ -2526,7 +2592,7 @@ static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int UNUSED(sta
        
        /* rounded, but no outline */
        wtb.outline= 0;
-       round_box_edges(&wtb, 15, rect, 4.0f);
+       round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 4.0f);
        
        widgetbase_draw(&wtb, wcol);
 }
@@ -2550,7 +2616,7 @@ static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int UN
        recttemp.ymax-= delta;
        
        /* half rounded */
-       round_box_edges(&wtb, 15, &recttemp, 4.0f);
+       round_box_edges(&wtb, WIDGET_ALL_CORNERS, &recttemp, 4.0f);
        
        /* decoration */
        if(state & UI_SELECT) {
@@ -2650,12 +2716,12 @@ static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *
                UI_GetThemeColor3ubv(TH_BACK, col);
                glColor3ubv(col);
                
-               round_box__edges(&wtb, 15, rect, 0.0f, 4.0);
+               round_box__edges(&wtb, WIDGET_ALL_CORNERS, rect, 0.0f, 4.0);
                widgetbase_outline(&wtb);
        }
        
        /* outline */
-       round_box_edges(&wtb, 15, rect, 5.0f);
+       round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 5.0f);
        wtb.outline= 1;
        wtb.inner= 0;
        widgetbase_draw(&wtb, &wt->wcol);
@@ -2836,37 +2902,27 @@ static int widget_roundbox_set(uiBut *but, rcti *rect)
                
                switch(but->flag & UI_BUT_ALIGN) {
                        case UI_BUT_ALIGN_TOP:
-                               return (12);
-                               break;
+                               return WIDGET_BOTTOM_LEFT | WIDGET_BOTTOM_RIGHT;
                        case UI_BUT_ALIGN_DOWN:
-                               return (3);
-                               break;
+                               return WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT;
                        case UI_BUT_ALIGN_LEFT:
-                               return (6);
-                               break;
+                               return WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT;
                        case UI_BUT_ALIGN_RIGHT:
-                               return (9);
-                               break;
-                               
-                       case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_RIGHT:
-                               return (1);
-                               break;
-                       case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT:
-                               return (2);
-                               break;
-                       case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT:
-                               return (8);
-                               break;
-                       case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_LEFT:
-                               return (4);
-                               break;
-                               
+                               return WIDGET_TOP_LEFT | WIDGET_BOTTOM_LEFT;
+                       case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_RIGHT:
+                               return WIDGET_TOP_LEFT;
+                       case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_LEFT:
+                               return WIDGET_TOP_RIGHT;
+                       case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_RIGHT:
+                               return WIDGET_BOTTOM_LEFT;
+                       case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_LEFT:
+                               return WIDGET_BOTTOM_RIGHT;
                        default:
-                               return (0);
-                               break;
+                               return 0;
                }
-       } 
-       return 15;
+       }
+
+       return WIDGET_ALL_CORNERS;
 }
 
 /* conversion from old to new buttons, so still messy */
@@ -3104,14 +3160,14 @@ void ui_draw_search_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
        uiWidgetType *wt= widget_type(UI_WTYPE_BOX);
        
        glEnable(GL_BLEND);
-       widget_softshadow(rect, 15, 5.0f, 8.0f);
+       widget_softshadow(rect, WIDGET_ALL_CORNERS, 5.0f, 8.0f);
        glDisable(GL_BLEND);
 
        wt->state(wt, 0);
        if(block)
-               wt->draw(&wt->wcol, rect, block->flag, 15);
+               wt->draw(&wt->wcol, rect, block->flag, WIDGET_ALL_CORNERS);
        else
-               wt->draw(&wt->wcol, rect, 0, 15);
+               wt->draw(&wt->wcol, rect, 0, WIDGET_ALL_CORNERS);
        
 }
 
index 612d1b18426680f3015e88d83bc41230fb6f321f..57b31b1c84f4e37878332875f97bd177db9b2423 100644 (file)
@@ -959,7 +959,7 @@ static int similar_edge_select__internal(EditMesh *em, int mode, float thresh)
                                        else if (eed->f2==0) /* first access, assign the face */
                                                eed->tmp.f= efa;
                                        else if (eed->f2==1) /* second, we assign the angle*/
-                                               eed->tmp.fp= RAD2DEGF(angle_v2v2(eed->tmp.f->n, efa->n))/180;
+                                               eed->tmp.fp= RAD2DEGF(angle_v3v3(eed->tmp.f->n, efa->n))/180;
                                        eed->f2++; /* f2==0 no face assigned. f2==1 one face found. f2==2 angle calculated.*/
                                }
                                j++;
@@ -1086,7 +1086,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op)
        Mesh *me= obedit->data;
        EditMesh *em= BKE_mesh_get_editmesh(me); 
 
-       int selcount = similar_edge_select__internal(em, RNA_int_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
+       int selcount = similar_edge_select__internal(em, RNA_enum_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
        
        if (selcount) {
                /* here was an edge-mode only select flush case, has to be generalized */
index b199f54cde1d4bf6d0e95c8534fb308bc295b262..62fdfc140dfe8500006aba88efbbaa2ee8f08738 100644 (file)
@@ -3485,8 +3485,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
        
        RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1);
        RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 0);
-       RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1);
-       RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 0);
+       RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1);
+       RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0);
        
        WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", UPARROWKEY, KM_PRESS, 0, 0);
        RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "next", 0);
index 09873566d4a91be076ce839fc21de5f57468c89e..9500c7f663c0b3154323b496d9d0c2b6c8dba08f 100644 (file)
@@ -322,8 +322,8 @@ static int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
        if (br->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
        }
 
        return 1;
index 95a315272b97b0155624a17e18639505418e90db..e77bb979d47b1654c7ed5fe516cabeedc69e31a7 100644 (file)
@@ -97,7 +97,7 @@ static void outliner_height(SpaceOops *soops, ListBase *lb, int *h)
        TreeElement *te= lb->first;
        while(te) {
                TreeStoreElem *tselem= TREESTORE(te);
-               if((tselem->flag & TSE_CLOSED)==0) 
+               if(TSELEM_OPEN(tselem,soops))
                        outliner_height(soops, &te->subtree, h);
                (*h) += UI_UNIT_Y;
                te= te->next;
@@ -112,7 +112,7 @@ static void outliner_width(SpaceOops *soops, ListBase *lb, int *w)
 //             TreeStoreElem *tselem= TREESTORE(te);
                
                // XXX fixme... te->xend is not set yet
-               if(tselem->flag & TSE_CLOSED) {
+               if(!TSELEM_OPEN(tselem,soops)) {
                        if (te->xend > *w)
                                *w = te->xend;
                }
@@ -135,7 +135,7 @@ static void outliner_rna_width(SpaceOops *soops, ListBase *lb, int *w, int start
                if(startx+100 > *w)
                        *w = startx+100;
 
-               if((tselem->flag & TSE_CLOSED)==0)
+               if(TSELEM_OPEN(tselem,soops))
                        outliner_rna_width(soops, &te->subtree, w, startx+UI_UNIT_X);
                te= te->next;
        }
@@ -519,7 +519,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
                        }
                }
                
-               if((tselem->flag & TSE_CLOSED)==0) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree);
+               if(TSELEM_OPEN(tselem,soops)) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree);
        }
 }
 
@@ -560,7 +560,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
                                ptr= &te->rnaptr;
                                prop= te->directdata;
                                
-                               if(!(RNA_property_type(prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0))
+                               if(!(RNA_property_type(prop) == PROP_POINTER && (TSELEM_OPEN(tselem,soops))) )
                                        uiDefAutoButR(block, ptr, prop, -1, "", ICON_NONE, sizex, (int)te->ys, OL_RNA_COL_SIZEX, UI_UNIT_Y-1);
                        }
                        else if(tselem->type == TSE_RNA_ARRAY_ELEM) {
@@ -571,7 +571,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
                        }
                }
                
-               if((tselem->flag & TSE_CLOSED)==0) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree);
+               if(TSELEM_OPEN(tselem,soops)) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree);
        }
 }
 
@@ -828,7 +828,7 @@ static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soo
                        }
                }
                
-               if((tselem->flag & TSE_CLOSED)==0) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
+               if(TSELEM_OPEN(tselem,soops)) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
        }
 }
 
@@ -871,7 +871,7 @@ static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, Spa
                        }
                }
                
-               if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(C, block, ar, soops, &te->subtree);
+               if(TSELEM_OPEN(tselem,soops)) outliner_buttons(C, block, ar, soops, &te->subtree);
        }
 }
 
@@ -1237,6 +1237,18 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
                
                glEnable(GL_BLEND);
 
+               /* start by highlighting search matches 
+                *      we don't expand items when searching in the datablocks but we 
+                *      still want to highlight any filter matches. 
+                */
+               if ( (SEARCHING_OUTLINER(soops) || (soops->outlinevis==SO_DATABLOCKS && soops->search_string[0]!=0)) && 
+                        (tselem->flag & TSE_SEARCHMATCH)) 
+               {
+                       /* TODO - add search highlight colour to theme? */
+                       glColor4f(0.2f, 0.5f, 0.2f, 0.3f);
+                       glRecti(startx, *starty+1, ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1);
+               }
+
                /* colors for active/selected data */
                if(tselem->type==0) {
                        if(te->idcode==ID_SCE) {
@@ -1317,10 +1329,10 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
                                icon_x = startx+5*ufac;
                        
                                // icons a bit higher
-                       if(tselem->flag & TSE_CLOSED) 
-                               UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT);
-                       else
+                       if(TSELEM_OPEN(tselem,soops)) 
                                UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_DOWN);
+                       else
+                               UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT);
                }
                offsx+= UI_UNIT_X;
                
@@ -1356,7 +1368,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
                offsx+= (int)(UI_UNIT_X + UI_GetStringWidth(te->name));
                
                /* closed item, we draw the icons, not when it's a scene, or master-server list though */
-               if(tselem->flag & TSE_CLOSED) {
+               if(!TSELEM_OPEN(tselem,soops)) {
                        if(te->subtree.first) {
                                if(tselem->type==0 && te->idcode==ID_SCE);
                                else if(tselem->type!=TSE_R_LAYER) { /* this tree element always has same amount of branches, so dont draw */
@@ -1382,7 +1394,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
        te->ys= (float)*starty;
        te->xend= startx+offsx;
                
-       if((tselem->flag & TSE_CLOSED)==0) {
+       if(TSELEM_OPEN(tselem,soops)) {
                *starty-= UI_UNIT_Y;
                
                for(ten= te->subtree.first; ten; ten= ten->next)
@@ -1415,7 +1427,7 @@ static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx,
                        
                *starty-= UI_UNIT_Y;
                
-               if((tselem->flag & TSE_CLOSED)==0)
+               if(TSELEM_OPEN(tselem,soops))
                        outliner_draw_hierarchy(soops, &te->subtree, startx+UI_UNIT_X, starty);
        }
        
@@ -1439,12 +1451,12 @@ static void outliner_draw_struct_marks(ARegion *ar, SpaceOops *soops, ListBase *
                tselem= TREESTORE(te);
                
                /* selection status */
-               if((tselem->flag & TSE_CLOSED)==0)
+               if(TSELEM_OPEN(tselem,soops))
                        if(tselem->type == TSE_RNA_STRUCT)
                                glRecti(0, *starty+1, (int)ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, *starty+UI_UNIT_Y-1);
 
                *starty-= UI_UNIT_Y;
-               if((tselem->flag & TSE_CLOSED)==0) {
+               if(TSELEM_OPEN(tselem,soops)) {
                        outliner_draw_struct_marks(ar, soops, &te->subtree, starty);
                        if(tselem->type == TSE_RNA_STRUCT)
                                fdrawline(0, (float)*starty+UI_UNIT_Y, ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, (float)*starty+UI_UNIT_Y);
@@ -1465,7 +1477,7 @@ static void outliner_draw_selection(ARegion *ar, SpaceOops *soops, ListBase *lb,
                        glRecti(0, *starty+1, (int)ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1);
                }
                *starty-= UI_UNIT_Y;
-               if((tselem->flag & TSE_CLOSED)==0) outliner_draw_selection(ar, soops, &te->subtree, starty);
+               if(TSELEM_OPEN(tselem,soops)) outliner_draw_selection(ar, soops, &te->subtree, starty);
        }
 }
 
index 2b451a487489b26ec7fe024b10a0cb1e26b254de..05eace0d4efb53fc1051ff43d98cbf00869872bd 100644 (file)
@@ -687,7 +687,7 @@ static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te,
        te->ys= (float)(*starty);
        *starty-= UI_UNIT_Y;
        
-       if((tselem->flag & TSE_CLOSED)==0) {
+       if(TSELEM_OPEN(tselem,soops)) {
                TreeElement *ten;
                for(ten= te->subtree.first; ten; ten= ten->next) {
                        outliner_set_coordinates_element(soops, ten, startx+UI_UNIT_X, starty);
@@ -910,7 +910,7 @@ static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase
                }
                else tselem->flag |= TSE_CLOSED;
                
-               if(tselem->flag & TSE_CLOSED); else tree_element_show_hierarchy(scene, soops, &te->subtree);
+               if(TSELEM_OPEN(tselem,soops)) tree_element_show_hierarchy(scene, soops, &te->subtree);
        }
 }
 
@@ -1175,7 +1175,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, ReportL
                }
                
                /* go over sub-tree */
-               if ((tselem->flag & TSE_CLOSED)==0)
+               if (TSELEM_OPEN(tselem,soops))
                        do_outliner_drivers_editop(soops, &te->subtree, reports, mode);
        }
 }
@@ -1343,7 +1343,7 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa
                }
                
                /* go over sub-tree */
-               if ((tselem->flag & TSE_CLOSED)==0)
+               if (TSELEM_OPEN(tselem,soops))
                        do_outliner_keyingset_editop(soops, ks, &te->subtree, mode);
        }
 }
index 61507d1ffe588d47a7a5aebaedf493b99e9f0cbb..215ab508ab6aaddcd0b3f02d833bc00bcd4ad1ab 100644 (file)
@@ -126,6 +126,27 @@ typedef struct TreeElement {
 #define OL_RNA_COL_SPACEX      (UI_UNIT_X*2.5f)
 
 
+/* Outliner Searching --
+
+   Are we looking for something in the outliner?
+   If so finding matches in child items makes it more useful
+
+        - We want to flag parents to act as being open to filter child matches 
+        - and also flag matches so we can highlight them
+        - Flags are stored in TreeStoreElem->flag
+        - Flag options defined in DNA_outliner_types.h
+        - SO_SEARCH_RECURSIVE defined in DNA_space_types.h
+        
+        - NOT in datablocks view - searching all datablocks takes way too long 
+               to be useful
+        - not searching into RNA items helps but isn't the complete solution
+       */
+
+#define SEARCHING_OUTLINER(sov)   (sov->search_flags & SO_SEARCH_RECURSIVE)
+
+/* is the currrent element open? if so we also show children */
+#define TSELEM_OPEN(telm,sv)   ( (telm->flag & TSE_CLOSED)==0 || (SEARCHING_OUTLINER(sv) && (telm->flag & TSE_CHILDSEARCH)) )
+
 /* outliner_tree.c ----------------------------------------------- */
 
 void outliner_free_tree(ListBase *lb);
index 2c0a8c34747b77b94c60808a01393030bc14a25d..a88625aad0dc73518934113515e7ee5533150008 100644 (file)
@@ -134,7 +134,7 @@ static int outliner_select(SpaceOops *soops, ListBase *lb, int *index, short *se
                                change |= 1;
                        }
                }
-               else if ((tselem->flag & TSE_CLOSED)==0) {
+               else if (TSELEM_OPEN(tselem,soops)) {
                        /* Only try selecting sub-elements if we haven't hit the right element yet
                         *
                         * Hack warning:
index b3170f9cd1e34e1fc8fcf7d58666d4a632ad282e..b2fdd34aab207a67e3acaaa13d3cbbe77f4fd5e5 100644 (file)
@@ -145,7 +145,7 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb,
                                }
                        }
                }
-               if((tselem->flag & TSE_CLOSED)==0) {
+               if(TSELEM_OPEN(tselem,soops)) {
                        set_operation_types(soops, &te->subtree,
                                                                scenelevel, objectlevel, idlevel, datalevel);
                }
@@ -250,7 +250,7 @@ static void outliner_do_libdata_operation(bContext *C, Scene *scene, SpaceOops *
                                operation_cb(C, scene, te, tsep, tselem);
                        }
                }
-               if((tselem->flag & TSE_CLOSED)==0) {
+               if(TSELEM_OPEN(tselem,soops)) {
                        outliner_do_libdata_operation(C, scene, soops, &te->subtree, operation_cb);
                }
        }
@@ -397,7 +397,7 @@ void outliner_do_object_operation(bContext *C, Scene *scene_act, SpaceOops *soop
                                operation_cb(C, scene_owner ? scene_owner : scene_act, te, NULL, tselem);
                        }
                }
-               if((tselem->flag & TSE_CLOSED)==0) {
+               if(TSELEM_OPEN(tselem,soops)) {
                        outliner_do_object_operation(C, scene_act, soops, &te->subtree, operation_cb);
                }
        }
@@ -504,7 +504,7 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li
                                operation_cb(event, te, tselem);
                        }
                }
-               if((tselem->flag & TSE_CLOSED)==0) {
+               if(TSELEM_OPEN(tselem,soops)) {
                        outliner_do_data_operation(soops, type, event, &te->subtree, operation_cb);
                }
        }
@@ -857,7 +857,7 @@ static void outliner_do_id_set_operation(SpaceOops *soops, int type, ListBase *l
                                operation_cb(te, tselem, tsep, newid);
                        }
                }
-               if ((tselem->flag & TSE_CLOSED)==0) {
+               if (TSELEM_OPEN(tselem,soops)) {
                        outliner_do_id_set_operation(soops, type, &te->subtree, newid, operation_cb);
                }
        }
index 8904dcc360fc53e7b5da808879e2f8347e24bcc5..7e9eabc08dbdb08fb4c05f9acb8dd76e557c5fab 100644 (file)
@@ -827,6 +827,10 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
        check_persistant(soops, te, id, type, index);
        tselem= TREESTORE(te);  
        
+       /* if we are searching for something expand to see child elements */
+       if(SEARCHING_OUTLINER(soops))
+               tselem->flag |= TSE_CHILDSEARCH;
+       
        te->parent= parent;
        te->index= index;       // for data arays
        if(ELEM3(type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP));
@@ -981,6 +985,9 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
                        else
                                te->name= (char*)RNA_struct_ui_name(ptr->type);
 
+                       /* If searching don't expand RNA entries */
+                       if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH;
+
                        iterprop= RNA_struct_iterator_property(ptr->type);
                        tot= RNA_property_collection_length(ptr, iterprop);
 
@@ -989,7 +996,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
                                if(!tselem->used)
                                        tselem->flag &= ~TSE_CLOSED;
 
-                       if(!(tselem->flag & TSE_CLOSED)) {
+                       if(TSELEM_OPEN(tselem,soops)) {
                                for(a=0; a<tot; a++)
                                        outliner_add_element(soops, &te->subtree, (void*)ptr, te, TSE_RNA_PROPERTY, a);
                        }
@@ -1010,11 +1017,14 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
                        te->directdata= prop;
                        te->rnaptr= *ptr;
 
+                       /* If searching don't expand RNA entries */
+                       if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH;
+
                        if(proptype == PROP_POINTER) {
                                pptr= RNA_property_pointer_get(ptr, prop);
 
                                if(pptr.data) {
-                                       if(!(tselem->flag & TSE_CLOSED))
+                                       if(TSELEM_OPEN(tselem,soops))
                                                outliner_add_element(soops, &te->subtree, (void*)&pptr, te, TSE_RNA_STRUCT, -1);
                                        else
                                                te->flag |= TE_LAZY_CLOSED;
@@ -1023,7 +1033,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
                        else if(proptype == PROP_COLLECTION) {
                                tot= RNA_property_collection_length(ptr, prop);
 
-                               if(!(tselem->flag & TSE_CLOSED)) {
+                               if(TSELEM_OPEN(tselem,soops)) {
                                        for(a=0; a<tot; a++) {
                                                RNA_property_collection_lookup_int(ptr, prop, a, &pptr);
                                                outliner_add_element(soops, &te->subtree, (void*)&pptr, te, TSE_RNA_STRUCT, a);
@@ -1035,7 +1045,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
                        else if(ELEM3(proptype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
                                tot= RNA_property_array_length(ptr, prop);
 
-                               if(!(tselem->flag & TSE_CLOSED)) {
+                               if(TSELEM_OPEN(tselem,soops)) {
                                        for(a=0; a<tot; a++)
                                                outliner_add_element(soops, &te->subtree, (void*)ptr, te, TSE_RNA_ARRAY_ELEM, a);
                                }
@@ -1068,7 +1078,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
                te->directdata= idv;
                te->name= km->idname;
                
-               if(!(tselem->flag & TSE_CLOSED)) {
+               if(TSELEM_OPEN(tselem,soops)) {
                        a= 0;
                        
                        for (kmi= km->items.first; kmi; kmi= kmi->next, a++) {
@@ -1368,7 +1378,10 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb)
                         */
                        tselem= TREESTORE(te);
                        
-                       if ((tselem->flag & TSE_CLOSED) || outliner_filter_tree(soops, &te->subtree)==0) { 
+                       /* flag as not a found item */
+                       tselem->flag &= ~TSE_SEARCHMATCH;
+                       
+                       if ((!TSELEM_OPEN(tselem,soops)) || outliner_filter_tree(soops, &te->subtree)==0) { 
                                outliner_free_tree(&te->subtree);
                                BLI_remlink(lb, te);
                                
@@ -1377,6 +1390,11 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb)
                        }
                }
                else {
+                       tselem= TREESTORE(te);
+                       
+                       /* flag as a found item - we can then highlight it */
+                       tselem->flag |= TSE_SEARCHMATCH;
+                       
                        /* filter subtree too */
                        outliner_filter_tree(soops, &te->subtree);
                }
@@ -1399,6 +1417,14 @@ void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
        TreeStoreElem *tselem;
        int show_opened= (soops->treestore==NULL); /* on first view, we open scenes */
 
+       /* Are we looking for something - we want to tag parents to filter child matches
+        - NOT in datablocks view - searching all datablocks takes way too long to be useful
+        - this variable is only set once per tree build */
+       if(soops->search_string[0]!=0 && soops->outlinevis!=SO_DATABLOCKS)
+               soops->search_flags |= SO_SEARCH_RECURSIVE;
+       else
+               soops->search_flags &= ~SO_SEARCH_RECURSIVE;
+
        if(soops->tree.first && (soops->storeflag & SO_TREESTORE_REDRAW))
                return;
 
index c44f10efde870e4f3d5346c4de14974c9620be4e..af19aa490ae4c29b2a5ec66692bdae7bb3b26117 100644 (file)
@@ -51,6 +51,8 @@ typedef struct TreeStore {
 #define TSE_CLOSED             1
 #define TSE_SELECTED   2
 #define TSE_TEXTBUT            4
+#define TSE_CHILDSEARCH 8
+#define TSE_SEARCHMATCH 16
 
 /* TreeStoreElem types in BIF_outliner.h */
 
index 66b10bcbf2162edbe794b0858b93e26161fd3898..1627d4d2acb3bd6445af58307d47ad9374741cbc 100644 (file)
@@ -861,6 +861,7 @@ enum {
 /* outliner search flags (SpaceOops->search_flags) */
 #define SO_FIND_CASE_SENSITIVE         (1<<0)
 #define SO_FIND_COMPLETE                       (1<<1)
+#define SO_SEARCH_RECURSIVE            (1<<2)
 
 /* headerbuttons: 450-499 */
 
index 7a798d7d579bbc40308da2638ff06d9e7e0df9a3..8d705e44bb8d1024318a90d91bcb0180bb3f0206 100644 (file)
 #include "DNA_object_types.h"
 #include "DNA_ID.h"
 #include "DNA_customdata_types.h"
+
 #include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
 #include "RNA_access.h"
 
 #include "bpy_rna.h"
@@ -138,7 +141,7 @@ PyInit_gpu(void)
        PyObject_SetAttrString(d, #f, val);     \
        Py_DECREF(val)
 
-static PyObject* GPU_export_shader(PyObject* self, PyObject *args, PyObject *kwds)
+static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObject *kwds)
 {
        PyObject* pyscene;
        PyObject* pymat;
@@ -238,7 +241,7 @@ static PyObject* GPU_export_shader(PyObject* self, PyObject *args, PyObject *kwd
                        PY_DICT_ADD_LONG(dict,uniform,texnumber);
                }
                if (uniform->texpixels) {
-                       val = PyByteArray_FromStringAndSize(uniform->texpixels, uniform->texsize);
+                       val = PyByteArray_FromStringAndSize((const char *)uniform->texpixels, uniform->texsize);
                        PyDict_SetItemString(dict, "texpixels", val);
                        Py_DECREF(val);
                        PY_DICT_ADD_LONG(dict,uniform,texsize);
@@ -280,7 +283,7 @@ static PyMethodDef meth_export_shader[] = {{ "export_shader", (PyCFunction)GPU_e
                                                                                  ":return: Dictionary defining the shader, uniforms and attributes.\n"
                                                                                  ":rtype: Dict"}};
 
-PyObject* GPU_initPython()
+PyObject* GPU_initPython(void)
 {
        PyObject* module = PyInit_gpu();
        PyModule_AddObject(module, "export_shader", (PyObject *)PyCFunction_New(meth_export_shader, NULL));