Fix: stroke spacing fails in image editor, we need to account for
authorAntony Riakiotakis <kalast@gmail.com>
Sun, 10 Mar 2013 18:46:31 +0000 (18:46 +0000)
committerAntony Riakiotakis <kalast@gmail.com>
Sun, 10 Mar 2013 18:46:31 +0000 (18:46 +0000)
zooming because spacing used to happen in unscaled screen space

source/blender/editors/sculpt_paint/paint_image.c
source/blender/editors/sculpt_paint/paint_intern.h
source/blender/editors/sculpt_paint/paint_stroke.c

index b7c0356..969efaf 100644 (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);
 
index b0478bc..bcf1775 100644 (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);
index 4ef52f0..db4eb08 100644 (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