svn merge -r 40061:40078 https://svn.blender.org/svnroot/bf-blender/trunk/blender
This commit is contained in:
@@ -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'}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
glVertex2fv(wtb->outer_v[0]);
|
||||
glVertex2fv(wtb->inner_v[0]);
|
||||
glEnd();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -47,7 +47,10 @@
|
||||
#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));
|
||||
|
||||
Reference in New Issue
Block a user