GP: Primitive: Changes from gp branch
[blender.git] / source / blender / editors / gpencil / gpencil_primitive.c
index a6c6c31a9ad4cc7ebb0b7e68ea03369718a2d912..5c72827fb9b5142715195a81bf2556d2565ac58a 100644 (file)
@@ -96,6 +96,7 @@
 #define IN_PROGRESS 1
 #define IN_CURVE_EDIT 2
 #define IN_MOVE 3
+#define IN_BRUSH_SIZE 4
 
 #define SELECT_NONE 0
 #define SELECT_START 1
@@ -375,6 +376,10 @@ static void gpencil_primitive_add_segment(tGPDprimitive *tgpi)
 /* Helper: set control point */
 static void gp_primitive_set_cp(tGPDprimitive *tgpi, float p[2], float color[4], int size)
 {
+       if (tgpi->flag == IN_PROGRESS) {
+               return;
+       }
+
        bGPDcontrolpoint *cp_points = tgpi->gpd->runtime.cp_points;
 
        if (tgpi->gpd->runtime.tot_cp_points < MAX_CP) {
@@ -786,9 +791,10 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
                tGPspoint *p2d = &points2D[i];
 
                /* set rnd value for reuse */
-               if (p2d->rnd_dirty != true) {
+               if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) && (p2d->rnd_dirty != true)) {
                        p2d->rnd[0] = BLI_rng_get_float(tgpi->rng);
                        p2d->rnd[1] = BLI_rng_get_float(tgpi->rng);
+                       p2d->rnd[2] = BLI_rng_get_float(tgpi->rng);
                        p2d->rnd_dirty = true;
                }
 
@@ -842,7 +848,7 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
                        svec[0] = -mvec[1];
                        svec[1] = mvec[0];
 
-                       if (p2d->rnd[0] > 0.5f) {
+                       if (p2d->rnd[1] > 0.5f) {
                                mul_v2_fl(svec, -fac);
                        }
                        else {
@@ -856,10 +862,10 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
                    (brush->gpencil_settings->draw_random_press > 0.0f))
                {
                        if (p2d->rnd[0] > 0.5f) {
-                               pressure -= brush->gpencil_settings->draw_random_press * p2d->rnd[0];
+                               pressure -= brush->gpencil_settings->draw_random_press * p2d->rnd[1];
                        }
                        else {
-                               pressure += brush->gpencil_settings->draw_random_press * p2d->rnd[0];
+                               pressure += brush->gpencil_settings->draw_random_press * p2d->rnd[2];
                        }
                }
 
@@ -876,8 +882,8 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
                if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
                    (brush->gpencil_settings->draw_random_strength > 0.0f))
                {
-                       if (p2d->rnd[1] > 0.5f) {
-                               strength -= strength * brush->gpencil_settings->draw_random_strength * p2d->rnd[1];
+                       if (p2d->rnd[2] > 0.5f) {
+                               strength -= strength * brush->gpencil_settings->draw_random_strength * p2d->rnd[0];
                        }
                        else {
                                strength += strength * brush->gpencil_settings->draw_random_strength * p2d->rnd[1];
@@ -1323,6 +1329,28 @@ static void gpencil_primitive_edit_event_handling(bContext *C, wmOperator *op, w
        }
 }
 
+/* brush size */
+static void gpencil_primitive_size(tGPDprimitive *tgpi, bool reset)
+{
+       Brush * brush = tgpi->brush;
+       if (brush) {
+               if (reset) {
+                       brush->size = tgpi->brush_size;
+                       tgpi->brush_size = 0;
+               }
+               else {
+                       if (tgpi->brush_size == 0) {
+                               tgpi->brush_size = brush->size;
+                       }
+                       float move[2];
+                       sub_v2_v2v2(move, tgpi->mval, tgpi->mvalo);
+                       int adjust = (move[1] > 0.0f) ? 1 : -1;
+                       brush->size += adjust * (int)fabsf(len_manhattan_v2(move));
+               }
+               CLAMP_MIN(brush->size, 1);
+       }
+}
+
 /* move */
 static void gpencil_primitive_move(tGPDprimitive *tgpi, bool reset)
 {
@@ -1385,6 +1413,29 @@ static int gpencil_primitive_modal(bContext *C, wmOperator *op, const wmEvent *e
                copy_v2_v2(tgpi->mvalo, tgpi->mval);
                return OPERATOR_RUNNING_MODAL;
        }
+       else if (tgpi->flag == IN_BRUSH_SIZE) {
+               switch (event->type) {
+               case MOUSEMOVE:
+                       gpencil_primitive_size(tgpi, false);
+                       gpencil_primitive_update(C, op, tgpi);
+                       break;
+               case ESCKEY:
+               case MIDDLEMOUSE:
+               case LEFTMOUSE:
+                       tgpi->brush_size = 0;
+                       tgpi->flag = IN_CURVE_EDIT;
+                       break;
+               case RIGHTMOUSE:
+                       if (event->val == KM_RELEASE) {
+                               tgpi->flag = IN_CURVE_EDIT;
+                               gpencil_primitive_size(tgpi, true);
+                               gpencil_primitive_update(C, op, tgpi);
+                       }
+                       break;
+               }
+               copy_v2_v2(tgpi->mvalo, tgpi->mval);
+               return OPERATOR_RUNNING_MODAL;
+       }
        else if (tgpi->flag != IDLE) {
                gpencil_primitive_edit_event_handling(C, op, win, event, tgpi);
        }
@@ -1477,6 +1528,14 @@ static int gpencil_primitive_modal(bContext *C, wmOperator *op, const wmEvent *e
                        }
                        break;
                }
+               case FKEY: /* brush thickness */
+               {
+                       if ((event->val == KM_PRESS)) {
+                               tgpi->flag = IN_BRUSH_SIZE;
+                               WM_cursor_modal_set(win, BC_NS_SCROLLCURSOR);
+                       }
+                       break;
+               }
                case CKEY: /* curve mode */
                {
                        if ((event->val == KM_PRESS) &&