Fix #23336: radial control crashing or not showing correct colors in modes

other than sculpt. The sculpt changes made the radial control code sculpt
mode specific, it should be usable for various purposes, so made it generic
again now.
This commit is contained in:
Brecht Van Lommel 2010-08-20 09:41:16 +00:00
parent 07cfb4f4f5
commit 4c094d700e
3 changed files with 42 additions and 36 deletions

@ -1144,10 +1144,16 @@ static int vpaint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *ev
{ {
Paint *p = paint_get_active(CTX_data_scene(C)); Paint *p = paint_get_active(CTX_data_scene(C));
Brush *brush = paint_brush(p); Brush *brush = paint_brush(p);
float col[4];
WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor); WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
p->paint_cursor = NULL; p->paint_cursor = NULL;
brush_radial_control_invoke(op, brush, 1); brush_radial_control_invoke(op, brush, 1);
copy_v3_v3(col, brush->add_col);
col[3]= 0.5f;
RNA_float_set_array(op->ptr, "color", col);
return WM_radial_control_invoke(C, op, event); return WM_radial_control_invoke(C, op, event);
} }
@ -1173,10 +1179,16 @@ static int wpaint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *ev
{ {
Paint *p = paint_get_active(CTX_data_scene(C)); Paint *p = paint_get_active(CTX_data_scene(C));
Brush *brush = paint_brush(p); Brush *brush = paint_brush(p);
float col[4];
WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor); WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
p->paint_cursor = NULL; p->paint_cursor = NULL;
brush_radial_control_invoke(op, brush, 1); brush_radial_control_invoke(op, brush, 1);
copy_v3_v3(col, brush->add_col);
col[3]= 0.5f;
RNA_float_set_array(op->ptr, "color", col);
return WM_radial_control_invoke(C, op, event); return WM_radial_control_invoke(C, op, event);
} }

@ -2726,10 +2726,24 @@ static int sculpt_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *ev
{ {
Paint *p = paint_get_active(CTX_data_scene(C)); Paint *p = paint_get_active(CTX_data_scene(C));
Brush *brush = paint_brush(p); Brush *brush = paint_brush(p);
float col[4], tex_col[4];
WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor); WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
p->paint_cursor = NULL; p->paint_cursor = NULL;
brush_radial_control_invoke(op, brush, 1); brush_radial_control_invoke(op, brush, 1);
if((brush->flag & BRUSH_DIR_IN) && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH))
copy_v3_v3(col, brush->sub_col);
else
copy_v3_v3(col, brush->add_col);
col[3]= 0.5f;
copy_v3_v3(tex_col, U.sculpt_paint_overlay_col);
tex_col[3]= (brush->texture_overlay_alpha / 100.0f);
RNA_float_set_array(op->ptr, "color", col);
RNA_float_set_array(op->ptr, "texture_color", tex_col);
return WM_radial_control_invoke(C, op, event); return WM_radial_control_invoke(C, op, event);
} }

@ -37,7 +37,6 @@
#include "DNA_object_types.h" #include "DNA_object_types.h"
#include "DNA_screen_types.h" #include "DNA_screen_types.h"
#include "DNA_scene_types.h" #include "DNA_scene_types.h"
#include "DNA_brush_types.h"
#include "DNA_userdef_types.h" #include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h" #include "DNA_windowmanager_types.h"
@ -64,7 +63,6 @@
#include "BKE_scene.h" #include "BKE_scene.h"
#include "BKE_screen.h" /* BKE_ST_MAXNAME */ #include "BKE_screen.h" /* BKE_ST_MAXNAME */
#include "BKE_utildefines.h" #include "BKE_utildefines.h"
#include "BKE_brush.h" // JW
#include "BKE_idcode.h" #include "BKE_idcode.h"
#include "BIF_gl.h" #include "BIF_gl.h"
@ -74,7 +72,6 @@
#include "ED_screen.h" #include "ED_screen.h"
#include "ED_util.h" #include "ED_util.h"
#include "ED_view3d.h" // JW
#include "RNA_access.h" #include "RNA_access.h"
#include "RNA_define.h" #include "RNA_define.h"
@ -92,8 +89,6 @@
#include "wm_subwindow.h" #include "wm_subwindow.h"
#include "wm_window.h" #include "wm_window.h"
static ListBase global_ops= {NULL, NULL}; static ListBase global_ops= {NULL, NULL};
/* ************ operator API, exported ********** */ /* ************ operator API, exported ********** */
@ -2585,33 +2580,22 @@ const int WM_RADIAL_CONTROL_DISPLAY_SIZE = 200;
typedef struct wmRadialControl { typedef struct wmRadialControl {
int mode; int mode;
float initial_value, value, max_value; float initial_value, value, max_value;
float col[4], tex_col[4];
int initial_mouse[2]; int initial_mouse[2];
void *cursor; void *cursor;
GLuint tex; GLuint tex;
} wmRadialControl; } wmRadialControl;
extern Paint *paint_get_active(Scene *sce);
extern struct Brush *paint_brush(struct Paint *paint);
static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata) static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
{ {
wmRadialControl *rc = (wmRadialControl*)customdata; wmRadialControl *rc = (wmRadialControl*)customdata;
ARegion *ar = CTX_wm_region(C); ARegion *ar = CTX_wm_region(C);
float r1=0.0f, r2=0.0f, r3=0.0f, angle=0.0f; float r1=0.0f, r2=0.0f, r3=0.0f, angle=0.0f;
Paint *paint = paint_get_active(CTX_data_scene(C));
struct Brush *brush = paint_brush(paint);
ViewContext vc;
// int hit = 0; // int hit = 0;
int flip; if(rc->mode == WM_RADIALCONTROL_STRENGTH)
int sign; rc->tex_col[3]= (rc->value + 0.5);
float* col;
const float str = rc->mode == WM_RADIALCONTROL_STRENGTH ? (rc->value + 0.5) : (brush->texture_overlay_alpha / 100.0f);
if(rc->mode == WM_RADIALCONTROL_SIZE) { if(rc->mode == WM_RADIALCONTROL_SIZE) {
r1= rc->value; r1= rc->value;
@ -2629,18 +2613,6 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
x = rc->initial_mouse[0] - ar->winrct.xmin; x = rc->initial_mouse[0] - ar->winrct.xmin;
y = rc->initial_mouse[1] - ar->winrct.ymin; y = rc->initial_mouse[1] - ar->winrct.ymin;
view3d_set_viewcontext(C, &vc);
// XXX: no way currently to know state of pen flip or invert key modifier without starting a stroke
flip = 1;
sign = flip * ((brush->flag & BRUSH_DIR_IN)? -1 : 1);
if (sign < 0 && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH))
col = brush->sub_col;
else
col = brush->add_col;
glTranslatef((float)x, (float)y, 0.0f); glTranslatef((float)x, (float)y, 0.0f);
glEnable(GL_BLEND); glEnable(GL_BLEND);
@ -2657,7 +2629,7 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS); glBegin(GL_QUADS);
glColor4f(U.sculpt_paint_overlay_col[0],U.sculpt_paint_overlay_col[1],U.sculpt_paint_overlay_col[2], str); glColor4f(rc->tex_col[0], rc->tex_col[1], rc->tex_col[2], rc->tex_col[3]);
glTexCoord2f(0,0); glTexCoord2f(0,0);
glVertex2f(-r3, -r3); glVertex2f(-r3, -r3);
glTexCoord2f(1,0); glTexCoord2f(1,0);
@ -2671,7 +2643,7 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
} }
if(rc->mode == WM_RADIALCONTROL_ANGLE) { if(rc->mode == WM_RADIALCONTROL_ANGLE) {
glColor4f(col[0], col[1], col[2], 0.5f); glColor4f(rc->col[0], rc->col[1], rc->col[2], rc->col[3]);
glEnable(GL_LINE_SMOOTH); glEnable(GL_LINE_SMOOTH);
glRotatef(-angle, 0, 0, 1); glRotatef(-angle, 0, 0, 1);
fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0); fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0);
@ -2680,7 +2652,7 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
glDisable(GL_LINE_SMOOTH); glDisable(GL_LINE_SMOOTH);
} }
glColor4f(col[0], col[1], col[2], 0.5f); glColor4f(rc->col[0], rc->col[1], rc->col[2], rc->col[3]);
glutil_draw_lined_arc(0.0, M_PI*2.0, r1, 40); glutil_draw_lined_arc(0.0, M_PI*2.0, r1, 40);
glutil_draw_lined_arc(0.0, M_PI*2.0, r2, 40); glutil_draw_lined_arc(0.0, M_PI*2.0, r2, 40);
glDisable(GL_BLEND); glDisable(GL_BLEND);
@ -2806,6 +2778,9 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
MEM_freeN(im); MEM_freeN(im);
} }
RNA_float_get_array(op->ptr, "color", rc->col);
RNA_float_get_array(op->ptr, "texture_color", rc->tex_col);
RNA_int_set_array(op->ptr, "initial_mouse", mouse); RNA_int_set_array(op->ptr, "initial_mouse", mouse);
RNA_float_set(op->ptr, "new_value", initial_value); RNA_float_set(op->ptr, "new_value", initial_value);
@ -2850,6 +2825,8 @@ void WM_OT_radial_control_partial(wmOperatorType *ot)
{WM_RADIALCONTROL_STRENGTH, "STRENGTH", 0, "Strength", ""}, {WM_RADIALCONTROL_STRENGTH, "STRENGTH", 0, "Strength", ""},
{WM_RADIALCONTROL_ANGLE, "ANGLE", 0, "Angle", ""}, {WM_RADIALCONTROL_ANGLE, "ANGLE", 0, "Angle", ""},
{0, NULL, 0, NULL, NULL}}; {0, NULL, 0, NULL, NULL}};
static float color[4] = {1.0f, 1.0f, 1.0f, 0.5f};
static float tex_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
/* Should be set in custom invoke() */ /* Should be set in custom invoke() */
RNA_def_float(ot->srna, "initial_value", 0, 0, FLT_MAX, "Initial Value", "", 0, FLT_MAX); RNA_def_float(ot->srna, "initial_value", 0, 0, FLT_MAX, "Initial Value", "", 0, FLT_MAX);
@ -2861,7 +2838,10 @@ void WM_OT_radial_control_partial(wmOperatorType *ot)
RNA_def_enum(ot->srna, "mode", radial_mode_items, 0, "Mode", ""); RNA_def_enum(ot->srna, "mode", radial_mode_items, 0, "Mode", "");
/* Internal */ /* Internal */
RNA_def_int_vector(ot->srna, "initial_mouse", 2, NULL, INT_MIN, INT_MAX, "initial_mouse", "", INT_MIN, INT_MAX); RNA_def_int_vector(ot->srna, "initial_mouse", 2, NULL, INT_MIN, INT_MAX, "Initial Mouse", "", INT_MIN, INT_MAX);
RNA_def_float_color(ot->srna, "color", 4, color, 0.0f, FLT_MAX, "Color", "Radial control color", 0.0f, 1.0f);
RNA_def_float_color(ot->srna, "texture_color", 4, tex_color, 0.0f, FLT_MAX, "Texture Color", "Radial control texture color", 0.0f, 1.0f);
} }
/* ************************** timer for testing ***************** */ /* ************************** timer for testing ***************** */