Fix: stroke spacing fails in image editor, we need to account for

zooming because spacing used to happen in unscaled screen space
This commit is contained in:
Antony Riakiotakis
2013-03-10 18:46:31 +00:00
parent ca5f7b778c
commit 623902ac51
3 changed files with 10 additions and 2 deletions

View File

@@ -623,7 +623,7 @@ void PAINT_OT_image_paint(wmOperatorType *ot)
}
static int get_imapaint_zoom(bContext *C, float *zoomx, float *zoomy)
int get_imapaint_zoom(bContext *C, float *zoomx, float *zoomy)
{
RegionView3D *rv3d = CTX_wm_region_view3d(C);

View File

@@ -126,6 +126,7 @@ struct ImagePaintPartialRedraw *get_imapaintpartial(void);
void set_imapaintpartial(struct ImagePaintPartialRedraw * ippr);
void imapaint_clear_partial_redraw(void);
void imapaint_dirty_region(struct Image *ima, struct ImBuf *ibuf, int x, int y, int w, int h);
int get_imapaint_zoom(struct bContext *C, float *zoomx, float *zoomy);
void *paint_2d_new_stroke(struct bContext *, struct wmOperator *);
void paint_2d_redraw(const bContext *C, void *ps, int final);
void paint_2d_stroke_done(void *ps);

View File

@@ -269,14 +269,21 @@ static int paint_space_stroke(bContext *C, wmOperator *op, wmEvent *event, const
size_pressure = pressure;
if (size_pressure > FLT_EPSILON) {
float zoomx, zoomy;
/* brushes can have a minimum size of 1.0 but with pressure it can be smaller then a pixel
* causing very high step sizes, hanging blender [#32381] */
const float size_clamp = max_ff(1.0f, BKE_brush_size_get(scene, stroke->brush) * size_pressure);
float spacing = stroke->brush->spacing;
/* stroke system is used for 2d paint too, so we need to account for
* the fact that brush can be scaled there. */
get_imapaint_zoom(C, &zoomx, &zoomy);
if (stroke->brush->flag & BRUSH_SPACING_PRESSURE)
spacing = max_ff(1.0f, spacing * (1.5f - pressure));
spacing *= max_ff(zoomx, zoomy);
scale = (size_clamp * spacing / 50.0f) / length;
if (scale > FLT_EPSILON) {
mul_v2_fl(vec, scale);
@@ -360,7 +367,7 @@ bool paint_supports_dynamic_size(Brush *br)
bool paint_supports_jitter(PaintMode mode)
{
return ELEM(mode, PAINT_SCULPT, PAINT_TEXTURE_PROJECTIVE);
return ELEM3(mode, PAINT_SCULPT, PAINT_TEXTURE_PROJECTIVE, PAINT_TEXTURE_2D);
}
#define PAINT_STROKE_MODAL_CANCEL 1