forked from bartvdbraak/blender
Fix: curve reset for brushes now gives proper smooth curve as default,
also moved brush curve presets code into curvemapping code.
This commit is contained in:
parent
8af456313a
commit
29f90af19c
@ -733,7 +733,7 @@ class VIEW3D_PT_tools_brush_curve(PaintPanel):
|
||||
settings = self.paint_settings(context)
|
||||
brush = settings.brush
|
||||
|
||||
layout.template_curve_mapping(brush, "curve")
|
||||
layout.template_curve_mapping(brush, "curve", brush=True)
|
||||
layout.operator_menu_enum("brush.curve_preset", property="shape")
|
||||
|
||||
|
||||
|
@ -36,6 +36,7 @@ struct Brush;
|
||||
struct ImBuf;
|
||||
struct Scene;
|
||||
struct wmOperator;
|
||||
enum CurveMappingPreset;
|
||||
|
||||
/* datablock functions */
|
||||
struct Brush *add_brush(const char *name);
|
||||
@ -54,12 +55,7 @@ int brush_clone_image_set_nr(struct Brush *brush, int nr);
|
||||
int brush_clone_image_delete(struct Brush *brush);
|
||||
|
||||
/* brush curve */
|
||||
typedef enum {
|
||||
BRUSH_PRESET_SHARP,
|
||||
BRUSH_PRESET_SMOOTH,
|
||||
BRUSH_PRESET_MAX
|
||||
} BrushCurvePreset;
|
||||
void brush_curve_preset(struct Brush *b, BrushCurvePreset preset);
|
||||
void brush_curve_preset(struct Brush *b, enum CurveMappingPreset preset);
|
||||
float brush_curve_strength_clamp(struct Brush *br, float p, const float len);
|
||||
float brush_curve_strength(struct Brush *br, float p, const float len); /* used for sculpt */
|
||||
|
||||
|
@ -34,6 +34,13 @@ struct CurveMap;
|
||||
struct ImBuf;
|
||||
struct rctf;
|
||||
|
||||
typedef enum CurveMappingPreset {
|
||||
CURVE_PRESET_LINE,
|
||||
CURVE_PRESET_SHARP,
|
||||
CURVE_PRESET_SMOOTH,
|
||||
CURVE_PRESET_MAX
|
||||
} CurveMappingPreset;
|
||||
|
||||
void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w);
|
||||
void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w);
|
||||
|
||||
@ -44,7 +51,7 @@ void curvemapping_set_black_white(struct CurveMapping *cumap, float *black, f
|
||||
|
||||
void curvemap_remove(struct CurveMap *cuma, int flag);
|
||||
void curvemap_insert(struct CurveMap *cuma, float x, float y);
|
||||
void curvemap_reset(struct CurveMap *cuma, struct rctf *clipr);
|
||||
void curvemap_reset(struct CurveMap *cuma, struct rctf *clipr, CurveMappingPreset preset);
|
||||
void curvemap_sethandle(struct CurveMap *cuma, int type);
|
||||
|
||||
void curvemapping_changed(struct CurveMapping *cumap, int rem_doubles);
|
||||
|
@ -88,7 +88,7 @@ Brush *add_brush(const char *name)
|
||||
brush->sculpt_tool = SCULPT_TOOL_DRAW;
|
||||
brush->flag |= BRUSH_SPACE;
|
||||
|
||||
brush_curve_preset(brush, BRUSH_PRESET_SMOOTH);
|
||||
brush_curve_preset(brush, CURVE_PRESET_SMOOTH);
|
||||
|
||||
/* enable fake user by default */
|
||||
brush->id.flag |= LIB_FAKEUSER;
|
||||
@ -225,7 +225,7 @@ void brush_toggled_fake_user(Brush *brush)
|
||||
}
|
||||
}
|
||||
|
||||
void brush_curve_preset(Brush *b, BrushCurvePreset preset)
|
||||
void brush_curve_preset(Brush *b, CurveMappingPreset preset)
|
||||
{
|
||||
CurveMap *cm = NULL;
|
||||
|
||||
@ -233,46 +233,9 @@ void brush_curve_preset(Brush *b, BrushCurvePreset preset)
|
||||
b->curve = curvemapping_add(1, 0, 0, 1, 1);
|
||||
|
||||
cm = b->curve->cm;
|
||||
|
||||
if(cm->curve)
|
||||
MEM_freeN(cm->curve);
|
||||
|
||||
if(preset == BRUSH_PRESET_SHARP)
|
||||
cm->totpoint= 3;
|
||||
if(preset == BRUSH_PRESET_SMOOTH)
|
||||
cm->totpoint= 4;
|
||||
if(preset == BRUSH_PRESET_MAX)
|
||||
cm->totpoint= 2;
|
||||
|
||||
|
||||
cm->curve= MEM_callocN(cm->totpoint*sizeof(CurveMapPoint), "curve points");
|
||||
cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
|
||||
|
||||
if(preset == BRUSH_PRESET_SHARP) {
|
||||
cm->curve[0].x= 0;
|
||||
cm->curve[0].y= 1;
|
||||
cm->curve[1].x= 0.33;
|
||||
cm->curve[1].y= 0.33;
|
||||
cm->curve[2].x= 1;
|
||||
cm->curve[2].y= 0;
|
||||
}
|
||||
else if(preset == BRUSH_PRESET_SMOOTH) {
|
||||
cm->curve[0].x= 0;
|
||||
cm->curve[0].y= 1;
|
||||
cm->curve[1].x= 0.25;
|
||||
cm->curve[1].y= 0.92;
|
||||
cm->curve[2].x= 0.75;
|
||||
cm->curve[2].y= 0.08;
|
||||
cm->curve[3].x= 1;
|
||||
cm->curve[3].y= 0;
|
||||
}
|
||||
else if(preset == BRUSH_PRESET_MAX) {
|
||||
cm->curve[0].x= 0;
|
||||
cm->curve[0].y= 1;
|
||||
cm->curve[1].x= 1;
|
||||
cm->curve[1].y= 1;
|
||||
}
|
||||
|
||||
curvemap_reset(cm, &b->curve->clipr, preset);
|
||||
curvemapping_changed(b->curve, 0);
|
||||
}
|
||||
|
||||
|
@ -236,16 +236,54 @@ void curvemap_insert(CurveMap *cuma, float x, float y)
|
||||
cuma->curve= cmp;
|
||||
}
|
||||
|
||||
void curvemap_reset(CurveMap *cuma, rctf *clipr)
|
||||
void curvemap_reset(CurveMap *cuma, rctf *clipr, CurveMappingPreset preset)
|
||||
{
|
||||
cuma->totpoint= 2;
|
||||
|
||||
cuma->curve[0].x= clipr->xmin;
|
||||
cuma->curve[0].y= clipr->ymin;
|
||||
cuma->curve[0].flag= 0;
|
||||
cuma->curve[1].x= clipr->xmax;
|
||||
cuma->curve[1].y= clipr->ymax;
|
||||
cuma->curve[1].flag= 0;
|
||||
if(cuma->curve)
|
||||
MEM_freeN(cuma->curve);
|
||||
|
||||
switch(preset) {
|
||||
case CURVE_PRESET_LINE: cuma->totpoint= 2; break;
|
||||
case CURVE_PRESET_SHARP: cuma->totpoint= 3; break;
|
||||
case CURVE_PRESET_SMOOTH: cuma->totpoint= 4; break;
|
||||
case CURVE_PRESET_MAX: cuma->totpoint= 2; break;
|
||||
}
|
||||
|
||||
cuma->curve= MEM_callocN(cuma->totpoint*sizeof(CurveMapPoint), "curve points");
|
||||
|
||||
switch(preset) {
|
||||
case CURVE_PRESET_LINE:
|
||||
cuma->curve[0].x= clipr->xmin;
|
||||
cuma->curve[0].y= clipr->ymin;
|
||||
cuma->curve[0].flag= 0;
|
||||
cuma->curve[1].x= clipr->xmax;
|
||||
cuma->curve[1].y= clipr->ymax;
|
||||
cuma->curve[1].flag= 0;
|
||||
break;
|
||||
case CURVE_PRESET_SHARP:
|
||||
cuma->curve[0].x= 0;
|
||||
cuma->curve[0].y= 1;
|
||||
cuma->curve[1].x= 0.33;
|
||||
cuma->curve[1].y= 0.33;
|
||||
cuma->curve[2].x= 1;
|
||||
cuma->curve[2].y= 0;
|
||||
break;
|
||||
case CURVE_PRESET_SMOOTH:
|
||||
cuma->curve[0].x= 0;
|
||||
cuma->curve[0].y= 1;
|
||||
cuma->curve[1].x= 0.25;
|
||||
cuma->curve[1].y= 0.92;
|
||||
cuma->curve[2].x= 0.75;
|
||||
cuma->curve[2].y= 0.08;
|
||||
cuma->curve[3].x= 1;
|
||||
cuma->curve[3].y= 0;
|
||||
break;
|
||||
case CURVE_PRESET_MAX:
|
||||
cuma->curve[0].x= 0;
|
||||
cuma->curve[0].y= 1;
|
||||
cuma->curve[1].x= 1;
|
||||
cuma->curve[1].y= 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if(cuma->table) {
|
||||
MEM_freeN(cuma->table);
|
||||
|
@ -1553,7 +1553,7 @@ static void direct_link_brush(FileData *fd, Brush *brush)
|
||||
if(brush->curve)
|
||||
direct_link_curvemapping(fd, brush->curve);
|
||||
else
|
||||
brush_curve_preset(brush, BRUSH_PRESET_SHARP);
|
||||
brush_curve_preset(brush, CURVE_PRESET_SHARP);
|
||||
}
|
||||
|
||||
static void direct_link_script(FileData *fd, Script *script)
|
||||
|
@ -653,7 +653,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, struct PointerRNA *ptr);
|
||||
uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
|
||||
void uiTemplatePreview(uiLayout *layout, struct ID *id, struct ID *parent, struct MTex *slot);
|
||||
void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
|
||||
void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, char *propname, int type, int levels);
|
||||
void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, char *propname, int type, int levels, int brush);
|
||||
void uiTemplateTriColorSet(uiLayout *layout, struct PointerRNA *ptr, char *propname);
|
||||
void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, char *propname,
|
||||
PointerRNA *used_ptr, char *used_propname, int active_layer);
|
||||
|
@ -33,6 +33,7 @@
|
||||
|
||||
#include "BLI_string.h"
|
||||
|
||||
#include "BKE_colortools.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_icons.h"
|
||||
#include "BKE_global.h"
|
||||
@ -1652,8 +1653,8 @@ static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event)
|
||||
CurveMap *cuma= cumap->cm+cumap->cur;
|
||||
|
||||
switch(event) {
|
||||
case 0:
|
||||
curvemap_reset(cuma, &cumap->clipr);
|
||||
case 0: /* reset */
|
||||
curvemap_reset(cuma, &cumap->clipr, CURVE_PRESET_LINE);
|
||||
curvemapping_changed(cumap, 0);
|
||||
break;
|
||||
case 1:
|
||||
@ -1675,6 +1676,10 @@ static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event)
|
||||
cuma->flag |= CUMA_EXTEND_EXTRAPOLATE;
|
||||
curvemapping_changed(cumap, 0);
|
||||
break;
|
||||
case 6: /* reset smooth */
|
||||
curvemap_reset(cuma, &cumap->clipr, CURVE_PRESET_SMOOTH);
|
||||
curvemapping_changed(cumap, 0);
|
||||
break;
|
||||
}
|
||||
ED_region_tag_redraw(CTX_wm_region(C));
|
||||
}
|
||||
@ -1701,6 +1706,26 @@ static uiBlock *curvemap_tools_func(bContext *C, struct ARegion *ar, void *cumap
|
||||
return block;
|
||||
}
|
||||
|
||||
static uiBlock *curvemap_brush_tools_func(bContext *C, struct ARegion *ar, void *cumap_v)
|
||||
{
|
||||
uiBlock *block;
|
||||
short yco= 0, menuwidth=120;
|
||||
|
||||
block= uiBeginBlock(C, ar, "curvemap_tools_func", UI_EMBOSS);
|
||||
uiBlockSetButmFunc(block, curvemap_tools_dofunc, cumap_v);
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset View", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Auto Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Curve", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
|
||||
|
||||
uiBlockSetDirection(block, UI_RIGHT);
|
||||
uiTextBoundsBlock(block, 50);
|
||||
|
||||
uiEndBlock(C, block);
|
||||
return block;
|
||||
}
|
||||
|
||||
static void curvemap_buttons_redraw(bContext *C, void *arg1, void *arg2)
|
||||
{
|
||||
ED_region_tag_redraw(CTX_wm_region(C));
|
||||
@ -1712,7 +1737,7 @@ static void curvemap_buttons_reset(bContext *C, void *cb_v, void *cumap_v)
|
||||
int a;
|
||||
|
||||
for(a=0; a<CM_TOT; a++)
|
||||
curvemap_reset(cumap->cm+a, &cumap->clipr);
|
||||
curvemap_reset(cumap->cm+a, &cumap->clipr, CURVE_PRESET_LINE);
|
||||
|
||||
cumap->black[0]=cumap->black[1]=cumap->black[2]= 0.0f;
|
||||
cumap->white[0]=cumap->white[1]=cumap->white[2]= 1.0f;
|
||||
@ -1724,7 +1749,7 @@ static void curvemap_buttons_reset(bContext *C, void *cb_v, void *cumap_v)
|
||||
}
|
||||
|
||||
/* still unsure how this call evolves... we use labeltype for defining what curve-channels to show */
|
||||
static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labeltype, int levels, RNAUpdateCb *cb)
|
||||
static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labeltype, int levels, int brush, RNAUpdateCb *cb)
|
||||
{
|
||||
CurveMapping *cumap= ptr->data;
|
||||
uiLayout *row, *sub, *split;
|
||||
@ -1792,7 +1817,11 @@ static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labe
|
||||
bt= uiDefIconBut(block, BUT, 0, ICON_ZOOMOUT, 0, 0, dx, 14, NULL, 0.0, 0.0, 0.0, 0.0, "Zoom out");
|
||||
uiButSetFunc(bt, curvemap_buttons_zoom_out, cumap, NULL);
|
||||
|
||||
bt= uiDefIconBlockBut(block, curvemap_tools_func, cumap, 0, ICON_MODIFIER, 0, 0, dx, 18, "Tools");
|
||||
if(brush)
|
||||
bt= uiDefIconBlockBut(block, curvemap_brush_tools_func, cumap, 0, ICON_MODIFIER, 0, 0, dx, 18, "Tools");
|
||||
else
|
||||
bt= uiDefIconBlockBut(block, curvemap_tools_func, cumap, 0, ICON_MODIFIER, 0, 0, dx, 18, "Tools");
|
||||
|
||||
uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
|
||||
|
||||
if(cumap->flag & CUMA_DO_CLIP) icon= ICON_CLIPUV_HLT; else icon= ICON_CLIPUV_DEHLT;
|
||||
@ -1825,7 +1854,7 @@ static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labe
|
||||
uiBlockSetNFunc(block, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, int type, int levels)
|
||||
void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, int type, int levels, int brush)
|
||||
{
|
||||
RNAUpdateCb *cb;
|
||||
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
|
||||
@ -1842,7 +1871,7 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, i
|
||||
cb->ptr= *ptr;
|
||||
cb->prop= prop;
|
||||
|
||||
curvemap_buttons_layout(layout, &cptr, type, levels, cb);
|
||||
curvemap_buttons_layout(layout, &cptr, type, levels, brush, cb);
|
||||
|
||||
MEM_freeN(cb);
|
||||
}
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "BLI_math.h"
|
||||
|
||||
#include "BKE_brush.h"
|
||||
#include "BKE_colortools.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_DerivedMesh.h"
|
||||
#include "BKE_global.h"
|
||||
@ -214,9 +215,9 @@ static int brush_curve_preset_poll(bContext *C)
|
||||
void BRUSH_OT_curve_preset(wmOperatorType *ot)
|
||||
{
|
||||
static EnumPropertyItem prop_shape_items[] = {
|
||||
{BRUSH_PRESET_SHARP, "SHARP", 0, "Sharp", ""},
|
||||
{BRUSH_PRESET_SMOOTH, "SMOOTH", 0, "Smooth", ""},
|
||||
{BRUSH_PRESET_MAX, "MAX", 0, "Max", ""},
|
||||
{CURVE_PRESET_SHARP, "SHARP", 0, "Sharp", ""},
|
||||
{CURVE_PRESET_SMOOTH, "SMOOTH", 0, "Smooth", ""},
|
||||
{CURVE_PRESET_MAX, "MAX", 0, "Max", ""},
|
||||
{0, NULL, 0, NULL, NULL}};
|
||||
|
||||
ot->name= "Preset";
|
||||
@ -228,7 +229,7 @@ void BRUSH_OT_curve_preset(wmOperatorType *ot)
|
||||
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
RNA_def_enum(ot->srna, "shape", prop_shape_items, BRUSH_PRESET_SHARP, "Mode", "");
|
||||
RNA_def_enum(ot->srna, "shape", prop_shape_items, CURVE_PRESET_SMOOTH, "Mode", "");
|
||||
}
|
||||
|
||||
|
||||
|
@ -389,7 +389,7 @@ static void image_panel_curves(const bContext *C, Panel *pa)
|
||||
levels= (ibuf->channels==4);
|
||||
|
||||
RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &simaptr);
|
||||
uiTemplateCurveMapping(pa->layout, &simaptr, "curves", 'c', levels);
|
||||
uiTemplateCurveMapping(pa->layout, &simaptr, "curves", 'c', levels, 0);
|
||||
}
|
||||
|
||||
ED_space_image_release_buffer(sima, lock);
|
||||
|
@ -196,7 +196,7 @@ static void node_buts_time(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
}
|
||||
#endif
|
||||
|
||||
uiTemplateCurveMapping(layout, ptr, "curve", 's', 0);
|
||||
uiTemplateCurveMapping(layout, ptr, "curve", 's', 0, 0);
|
||||
|
||||
row= uiLayoutRow(layout, 1);
|
||||
uiItemR(row, "Sta", 0, ptr, "start", 0);
|
||||
@ -210,7 +210,7 @@ static void node_buts_colorramp(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
|
||||
static void node_buts_curvevec(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
{
|
||||
uiTemplateCurveMapping(layout, ptr, "mapping", 'v', 0);
|
||||
uiTemplateCurveMapping(layout, ptr, "mapping", 'v', 0, 0);
|
||||
}
|
||||
|
||||
static float *_sample_col= NULL; // bad bad, 2.5 will do better?
|
||||
@ -231,7 +231,7 @@ static void node_buts_curvecol(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
else
|
||||
cumap->flag &= ~CUMA_DRAW_SAMPLE;
|
||||
|
||||
uiTemplateCurveMapping(layout, ptr, "mapping", 'c', 0);
|
||||
uiTemplateCurveMapping(layout, ptr, "mapping", 'c', 0, 0);
|
||||
}
|
||||
|
||||
static void node_buts_normal(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
|
@ -320,6 +320,7 @@ void RNA_api_ui_layout(StructRNA *srna)
|
||||
api_ui_item_rna_common(func);
|
||||
RNA_def_enum(func, "type", curve_type_items, 0, "Type", "Type of curves to display.");
|
||||
RNA_def_boolean(func, "levels", 0, "", "Show black/white levels.");
|
||||
RNA_def_boolean(func, "brush", 0, "", "Show brush options.");
|
||||
|
||||
func= RNA_def_function(srna, "template_color_ramp", "uiTemplateColorRamp");
|
||||
api_ui_item_rna_common(func);
|
||||
|
Loading…
Reference in New Issue
Block a user