Fix T41665, stroke jittering used when setting the clone cursor
This commit is contained in:
@@ -930,39 +930,27 @@ void BKE_brush_scale_size(int *r_brush_size,
|
||||
|
||||
void BKE_brush_jitter_pos(const Scene *scene, Brush *brush, const float pos[2], float jitterpos[2])
|
||||
{
|
||||
int use_jitter = (brush->flag & BRUSH_ABSOLUTE_JITTER) ?
|
||||
(brush->jitter_absolute != 0) : (brush->jitter != 0);
|
||||
float rand_pos[2];
|
||||
float spread;
|
||||
int diameter;
|
||||
|
||||
/* jitter-ed brush gives weird and unpredictable result for this
|
||||
* kinds of stroke, so manually disable jitter usage (sergey) */
|
||||
use_jitter &= (brush->flag & (BRUSH_DRAG_DOT | BRUSH_ANCHORED)) == 0;
|
||||
|
||||
if (use_jitter) {
|
||||
float rand_pos[2];
|
||||
float spread;
|
||||
int diameter;
|
||||
|
||||
do {
|
||||
rand_pos[0] = BLI_rng_get_float(brush_rng) - 0.5f;
|
||||
rand_pos[1] = BLI_rng_get_float(brush_rng) - 0.5f;
|
||||
} while (len_squared_v2(rand_pos) > (0.5f * 0.5f));
|
||||
do {
|
||||
rand_pos[0] = BLI_rng_get_float(brush_rng) - 0.5f;
|
||||
rand_pos[1] = BLI_rng_get_float(brush_rng) - 0.5f;
|
||||
} while (len_squared_v2(rand_pos) > (0.5f * 0.5f));
|
||||
|
||||
|
||||
if (brush->flag & BRUSH_ABSOLUTE_JITTER) {
|
||||
diameter = 2 * brush->jitter_absolute;
|
||||
spread = 1.0;
|
||||
}
|
||||
else {
|
||||
diameter = 2 * BKE_brush_size_get(scene, brush);
|
||||
spread = brush->jitter;
|
||||
}
|
||||
/* find random position within a circle of diameter 1 */
|
||||
jitterpos[0] = pos[0] + 2 * rand_pos[0] * diameter * spread;
|
||||
jitterpos[1] = pos[1] + 2 * rand_pos[1] * diameter * spread;
|
||||
if (brush->flag & BRUSH_ABSOLUTE_JITTER) {
|
||||
diameter = 2 * brush->jitter_absolute;
|
||||
spread = 1.0;
|
||||
}
|
||||
else {
|
||||
copy_v2_v2(jitterpos, pos);
|
||||
diameter = 2 * BKE_brush_size_get(scene, brush);
|
||||
spread = brush->jitter;
|
||||
}
|
||||
/* find random position within a circle of diameter 1 */
|
||||
jitterpos[0] = pos[0] + 2 * rand_pos[0] * diameter * spread;
|
||||
jitterpos[1] = pos[1] + 2 * rand_pos[1] * diameter * spread;
|
||||
}
|
||||
|
||||
void BKE_brush_randomize_texture_coordinates(UnifiedPaintSettings *ups, bool mask)
|
||||
|
||||
@@ -112,7 +112,7 @@ typedef struct PaintStroke {
|
||||
float cached_size_pressure;
|
||||
/* last pressure will store last pressure value for use in interpolation for space strokes */
|
||||
float last_pressure;
|
||||
|
||||
int stroke_mode;
|
||||
|
||||
float zoom_2d;
|
||||
int pen_flip;
|
||||
@@ -347,6 +347,20 @@ static bool paint_brush_update(bContext *C,
|
||||
return location_success;
|
||||
}
|
||||
|
||||
static bool paint_stroke_use_jitter(PaintMode mode, Brush *brush, bool invert)
|
||||
{
|
||||
bool use_jitter = (brush->flag & BRUSH_ABSOLUTE_JITTER) ?
|
||||
(brush->jitter_absolute != 0) : (brush->jitter != 0);
|
||||
|
||||
/* jitter-ed brush gives weird and unpredictable result for this
|
||||
* kinds of stroke, so manually disable jitter usage (sergey) */
|
||||
use_jitter &= (brush->flag & (BRUSH_DRAG_DOT | BRUSH_ANCHORED)) == 0;
|
||||
use_jitter &= (!ELEM(mode, PAINT_TEXTURE_2D, PAINT_TEXTURE_PROJECTIVE) ||
|
||||
!(invert && brush->imagepaint_tool == PAINT_TOOL_CLONE));
|
||||
|
||||
|
||||
return use_jitter;
|
||||
}
|
||||
|
||||
/* Put the location of the next stroke dot into the stroke RNA and apply it to the mesh */
|
||||
static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, const float mouse_in[2], float pressure)
|
||||
@@ -382,6 +396,7 @@ static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, const float
|
||||
copy_v2_v2(stroke->last_mouse_position, mouse_in);
|
||||
stroke->last_pressure = pressure;
|
||||
|
||||
if (paint_stroke_use_jitter(mode, brush, stroke->stroke_mode == BRUSH_STROKE_INVERT))
|
||||
{
|
||||
float delta[2];
|
||||
float factor = stroke->zoom_2d;
|
||||
@@ -400,6 +415,9 @@ static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, const float
|
||||
add_v2_v2v2(mouse_out, mouse_in, delta);
|
||||
}
|
||||
}
|
||||
else {
|
||||
copy_v2_v2(mouse_out, mouse_in);
|
||||
}
|
||||
|
||||
if (!paint_brush_update(C, brush, mode, stroke, mouse_in, mouse_out, pressure, location)) {
|
||||
return;
|
||||
@@ -615,6 +633,7 @@ PaintStroke *paint_stroke_new(bContext *C,
|
||||
stroke->done = done;
|
||||
stroke->event_type = event_type; /* for modal, return event */
|
||||
stroke->ups = ups;
|
||||
stroke->stroke_mode = RNA_enum_get(op->ptr, "mode");
|
||||
|
||||
get_imapaint_zoom(C, &zoomx, &zoomy);
|
||||
stroke->zoom_2d = max_ff(zoomx, zoomy);
|
||||
|
||||
Reference in New Issue
Block a user