Merge branch 'master' into blender2.8
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 18 Dec 2017 15:19:12 +0000 (16:19 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 18 Dec 2017 15:19:12 +0000 (16:19 +0100)
source/blender/blenkernel/BKE_paint.h
source/blender/blenkernel/intern/paint.c
source/blender/editors/sculpt_paint/paint_stroke.c
source/blender/modifiers/intern/MOD_surfacedeform.c

index 31f4695201c76016c69e9e0b1d1d019c5de3e90a..b8fde8bd68e8ba30d09b1cc439a869909150ee57 100644 (file)
@@ -157,7 +157,7 @@ float paint_grid_paint_mask(const struct GridPaintMask *gpm, unsigned level,
                             unsigned x, unsigned y);
 
 /* stroke related */
-void paint_calculate_rake_rotation(struct UnifiedPaintSettings *ups, struct Brush *brush, const float mouse_pos[2]);
+bool paint_calculate_rake_rotation(struct UnifiedPaintSettings *ups, struct Brush *brush, const float mouse_pos[2]);
 void paint_update_brush_rake_rotation(struct UnifiedPaintSettings *ups, struct Brush *brush, float rotation);
 
 void BKE_paint_stroke_get_average(struct Scene *scene, struct Object *ob, float stroke[3]);
index c88642a8164ab3dfed1798c3cd7c2f317fa98044..1170223606662012ddc42aebc6e0ea7ea9900f28 100644 (file)
@@ -641,8 +641,9 @@ void paint_update_brush_rake_rotation(UnifiedPaintSettings *ups, Brush *brush, f
                ups->brush_rotation_sec = 0.0f;
 }
 
-void paint_calculate_rake_rotation(UnifiedPaintSettings *ups, Brush *brush, const float mouse_pos[2])
+bool paint_calculate_rake_rotation(UnifiedPaintSettings *ups, Brush *brush, const float mouse_pos[2])
 {
+       bool ok = false;
        if ((brush->mtex.brush_angle_mode & MTEX_ANGLE_RAKE) || (brush->mask_mtex.brush_angle_mode & MTEX_ANGLE_RAKE)) {
                const float r = RAKE_THRESHHOLD;
                float rotation;
@@ -658,16 +659,20 @@ void paint_calculate_rake_rotation(UnifiedPaintSettings *ups, Brush *brush, cons
                        ups->last_rake_angle = rotation;
 
                        paint_update_brush_rake_rotation(ups, brush, rotation);
+                       ok = true;
                }
                /* make sure we reset here to the last rotation to avoid accumulating
                 * values in case a random rotation is also added */
                else {
                        paint_update_brush_rake_rotation(ups, brush, ups->last_rake_angle);
+                       ok = false;
                }
        }
        else {
                ups->brush_rotation = ups->brush_rotation_sec = 0.0f;
+               ok = true;
        }
+       return ok;
 }
 
 void BKE_sculptsession_free_deformMats(SculptSession *ss)
index dacaea6a96efc4c98bd2e727787f2f9978367146..9dd51b289f4f0dd2880cef8082c217565956bc3d 100644 (file)
@@ -233,6 +233,9 @@ static bool paint_brush_update(bContext *C,
        UnifiedPaintSettings *ups = stroke->ups;
        bool location_sampled = false;
        bool location_success = false;
+       /* Use to perform all operations except applying the stroke,
+        * needed for operations that require cursor motion (rake). */
+       bool is_dry_run = false;
        bool do_random = false;
        bool do_random_mask = false;
        /* XXX: Use pressure value from first brush step for brushes which don't
@@ -371,7 +374,10 @@ static bool paint_brush_update(bContext *C,
                }
                /* curve strokes do their own rake calculation */
                else if (!(brush->flag & BRUSH_CURVE)) {
-                       paint_calculate_rake_rotation(ups, brush, mouse_init);
+                       if (!paint_calculate_rake_rotation(ups, brush, mouse_init)) {
+                               /* Not enough motion to define an angle. */
+                               is_dry_run = true;
+                       }
                }
        }
 
@@ -402,7 +408,7 @@ static bool paint_brush_update(bContext *C,
                }
        }
 
-       return location_success;
+       return location_success && (is_dry_run == false);
 }
 
 static bool paint_stroke_use_jitter(ePaintMode mode, Brush *brush, bool invert)
index b623293ed5cf7af6373a24b5f9aa5a3552e6e232..2919f169d002f60f262c49ac2399c1f00588d939 100644 (file)
@@ -314,11 +314,13 @@ BLI_INLINE int isPolyValid(const float coords[][2], const unsigned int nr)
 
        copy_v2_v2(prev_co, coords[nr - 1]);
        sub_v2_v2v2(prev_vec, prev_co, coords[nr - 2]);
+       normalize_v2(prev_vec);
 
        for (int i = 0; i < nr; i++) {
                sub_v2_v2v2(curr_vec, coords[i], prev_co);
 
-               if (len_squared_v2(curr_vec) < FLT_EPSILON) {
+               const float curr_len = normalize_v2(curr_vec);
+               if (curr_len < FLT_EPSILON) {
                        return MOD_SDEF_BIND_RESULT_OVERLAP_ERR;
                }