Commit: fd119a3723f0a17e86214257867aa92bb99f3c0a
Author: Joshua Leung
Date:   Wed Jan 18 00:48:15 2017 +1300
Branches: master
https://developer.blender.org/rBfd119a3723f0a17e86214257867aa92bb99f3c0a

Code Cleanup for GP Interpolation ops (first pass)

* Reshuffled some blocks of code for better ease of navigation/flow in the file
* Improved some tooltips
* Removed "Helper" tag from some functions that serve bigger roles
* Fixed some errant formatting

===================================================================

M       source/blender/editors/gpencil/gpencil_edit.c
M       source/blender/editors/gpencil/gpencil_interpolate.c

===================================================================

diff --git a/source/blender/editors/gpencil/gpencil_edit.c 
b/source/blender/editors/gpencil/gpencil_edit.c
index f01dfee494..36c7ef78d9 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -1981,6 +1981,7 @@ void GPENCIL_OT_reproject(wmOperatorType *ot)
 }
 
 /* ******************* Stroke subdivide ************************** */
+
 /* helper: Count how many points need to be inserted */
 static int gp_count_subdivision_cuts(bGPDstroke *gps)
 {
diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c 
b/source/blender/editors/gpencil/gpencil_interpolate.c
index 154776dbb5..703bacf855 100644
--- a/source/blender/editors/gpencil/gpencil_interpolate.c
+++ b/source/blender/editors/gpencil/gpencil_interpolate.c
@@ -80,19 +80,38 @@
 #include "gpencil_intern.h"
 
 /* ************************************************ */
+/* Core/Shared Utilities */
 
-/* =========  Interpolation operators ========================== */
-/* Helper: Update point with interpolation */
+/* Poll callback for interpolation operators */
+static int gpencil_interpolate_poll(bContext *C)
+{
+       bGPdata *gpd = CTX_data_gpencil_data(C);
+       bGPDlayer *gpl = CTX_data_active_gpencil_layer(C);
+       
+       /* only 3D view */
+       if (CTX_wm_area(C)->spacetype != SPACE_VIEW3D) {
+               return 0;
+       }
+       
+       /* need data to interpolate */
+       if (ELEM(NULL, gpd, gpl)) {
+               return 0;
+       }
+       
+       return 1;
+}
+
+/* Perform interpolation */
 static void gp_interpolate_update_points(bGPDstroke *gps_from, bGPDstroke 
*gps_to, bGPDstroke *new_stroke, float factor)
 {
        bGPDspoint *prev, *pt, *next;
-
+       
        /* update points */
        for (int i = 0; i < new_stroke->totpoints; i++) {
                prev = &gps_from->points[i];
                pt = &new_stroke->points[i];
                next = &gps_to->points[i];
-
+               
                /* Interpolate all values */
                interp_v3_v3v3(&pt->x, &prev->x, &next->x, factor);
                pt->pressure = interpf(prev->pressure, next->pressure, factor);
@@ -101,32 +120,39 @@ static void gp_interpolate_update_points(bGPDstroke 
*gps_from, bGPDstroke *gps_t
        }
 }
 
+/* ****************** Interpolate Interactive *********************** */
+
 /* Helper: Update all strokes interpolated */
 static void gp_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgpi)
 {
        tGPDinterpolate_layer *tgpil;
-       bGPDstroke *new_stroke, *gps_from, *gps_to;
-       int cStroke;
-       float factor;
-       float shift = tgpi->shift;
-
+       const float shift = tgpi->shift;
+       
        for (tgpil = tgpi->ilayers.first; tgpil; tgpil = tgpil->next) {
-               factor = tgpil->factor + shift;
+               bGPDstroke *new_stroke;
+               const float factor = tgpil->factor + shift;
+               
                for (new_stroke = tgpil->interFrame->strokes.first; new_stroke; 
new_stroke = new_stroke->next) {
+                       bGPDstroke *gps_from, *gps_to;
+                       int stroke_idx;
+                       
                        if (new_stroke->totpoints == 0) {
                                continue;
                        }
+                       
                        /* get strokes to interpolate */
-                       cStroke = BLI_findindex(&tgpil->interFrame->strokes, 
new_stroke);
-                       gps_from = BLI_findlink(&tgpil->prevFrame->strokes, 
cStroke);
-                       gps_to = BLI_findlink(&tgpil->nextFrame->strokes, 
cStroke);
+                       stroke_idx = BLI_findindex(&tgpil->interFrame->strokes, 
new_stroke);
+                       
+                       gps_from = BLI_findlink(&tgpil->prevFrame->strokes, 
stroke_idx);
+                       gps_to = BLI_findlink(&tgpil->nextFrame->strokes, 
stroke_idx);
+                       
                        /* update points position */
                        if ((gps_from) && (gps_to)) {
                                gp_interpolate_update_points(gps_from, gps_to, 
new_stroke, factor);
                        }
                }
        }
-
+       
        WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL);
 }
 
@@ -135,12 +161,12 @@ static bool gp_interpolate_check_todo(bContext *C, 
bGPdata *gpd)
 {
        ToolSettings *ts = CTX_data_tool_settings(C);
        int flag = ts->gp_sculpt.flag;
-
+       
        bGPDlayer *gpl;
        bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C);
        bGPDstroke *gps_from, *gps_to;
        int fFrame;
-
+       
        /* get layers */
        for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
                /* all layers or only active */
@@ -151,6 +177,7 @@ static bool gp_interpolate_check_todo(bContext *C, bGPdata 
*gpd)
                if (!gpencil_layer_is_editable(gpl) || (gpl->actframe == NULL)) 
{
                        continue;
                }
+               
                /* read strokes */
                for (gps_from = gpl->actframe->strokes.first; gps_from; 
gps_from = gps_from->next) {
                        /* only selected */
@@ -165,12 +192,14 @@ static bool gp_interpolate_check_todo(bContext *C, 
bGPdata *gpd)
                        if (ED_gpencil_stroke_color_use(gpl, gps_from) == 
false) {
                                continue;
                        }
+                       
                        /* get final stroke to interpolate */
                        fFrame = BLI_findindex(&gpl->actframe->strokes, 
gps_from);
                        gps_to = BLI_findlink(&gpl->actframe->next->strokes, 
fFrame);
                        if (gps_to == NULL) {
                                continue;
                        }
+                       
                        return 1;
                }
        }
@@ -186,13 +215,14 @@ static void gp_interpolate_set_points(bContext *C, 
tGPDinterpolate *tgpi)
        bGPDlayer *active_gpl = CTX_data_active_gpencil_layer(C);
        bGPDstroke *gps_from, *gps_to, *new_stroke;
        int fFrame;
-
+       
        /* save initial factor for active layer to define shift limits */
        tgpi->init_factor = (float)(tgpi->cframe - 
active_gpl->actframe->framenum) / (active_gpl->actframe->next->framenum - 
active_gpl->actframe->framenum + 1);
+       
        /* limits are 100% below 0 and 100% over the 100% */
        tgpi->low_limit = -1.0f - tgpi->init_factor;
        tgpi->high_limit = 2.0f - tgpi->init_factor;
-
+       
        /* set layers */
        for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
                /* all layers or only active */
@@ -203,47 +233,54 @@ static void gp_interpolate_set_points(bContext *C, 
tGPDinterpolate *tgpi)
                if (!gpencil_layer_is_editable(gpl) || (gpl->actframe == NULL)) 
{
                        continue;
                }
+               
                /* create temp data for each layer */
                tgpil = NULL;
                tgpil = MEM_callocN(sizeof(tGPDinterpolate_layer), "GPencil 
Interpolate Layer");
-
+               
                tgpil->gpl = gpl;
                tgpil->prevFrame = gpl->actframe;
                tgpil->nextFrame = gpl->actframe->next;
-
+               
                BLI_addtail(&tgpi->ilayers, tgpil);
+               
                /* create a new temporary frame */
                tgpil->interFrame = MEM_callocN(sizeof(bGPDframe), "bGPDframe");
                tgpil->interFrame->framenum = tgpi->cframe;
-
+               
                /* get interpolation factor by layer (usually must be equal for 
all layers, but not sure) */
                tgpil->factor = (float)(tgpi->cframe - 
tgpil->prevFrame->framenum) / (tgpil->nextFrame->framenum - 
tgpil->prevFrame->framenum + 1);
+               
                /* create new strokes data with interpolated points reading 
original stroke */
                for (gps_from = tgpil->prevFrame->strokes.first; gps_from; 
gps_from = gps_from->next) {
                        bool valid = true;
+                       
                        /* only selected */
                        if ((tgpi->flag & 
GP_BRUSHEDIT_FLAG_INTERPOLATE_ONLY_SELECTED) && ((gps_from->flag & 
GP_STROKE_SELECT) == 0)) {
                                valid = false;
                        }
-
                        /* skip strokes that are invalid for current view */
                        if (ED_gpencil_stroke_can_use(C, gps_from) == false) {
                                valid = false;
                        }
+                       
                        /* check if the color is editable */
                        if (ED_gpencil_stroke_color_use(tgpil->gpl, gps_from) 
== false) {
                                valid = false;
                        }
+                       
                        /* get final stroke to interpolate */
                        fFrame = BLI_findindex(&tgpil->prevFrame->strokes, 
gps_from);
                        gps_to = BLI_findlink(&tgpil->nextFrame->strokes, 
fFrame);
                        if (gps_to == NULL) {
                                valid = false;
                        }
+                       
                        /* create new stroke */
                        new_stroke = MEM_dupallocN(gps_from);
                        new_stroke->points = MEM_dupallocN(gps_from->points);
                        new_stroke->triangles = 
MEM_dupallocN(gps_from->triangles);
+                       
                        if (valid) {
                                /* if destination stroke is smaller, resize 
new_stroke to size of gps_to stroke */
                                if (gps_from->totpoints > gps_to->totpoints) {
@@ -262,26 +299,47 @@ static void gp_interpolate_set_points(bContext *C, 
tGPDinterpolate *tgpi)
                                new_stroke->tot_triangles = 0;
                                new_stroke->triangles = 
MEM_recallocN(new_stroke->triangles, sizeof(*new_stroke->triangles));
                        }
+                       
                        /* add to strokes */
                        BLI_addtail(&tgpil->interFrame->strokes, new_stroke);
                }
        }
 }
 
+/* ----------------------- */
+/* Drawing Callbacks */
+
+/* Drawing callback for modal operator in screen mode */
+static void gpencil_interpolate_draw_screen(const struct bContext *UNUSED(C), 
ARegion *UNUSED(ar), void *arg)
+{
+       tGPDinterpolate *tgpi = (tGPDinterpolate *)arg;
+       ED_gp_draw_interpolation(tgpi, REGION_DRAW_POST_PIXEL);
+}
+
+/* Drawing callback for modal operator in 3d mode */
+static void gpencil_interpolate_draw_3d(const bContext *UNUSED(C), ARegion 
*UNUSED(ar), void *arg)
+{
+       tGPDinterpolate *tgpi = (tGPDinterpolate *)arg;
+       ED_gp_draw_interpolation(tgpi, REGION_DRAW_POST_VIEW);
+}
+
+/* ----------------------- */
+
 /* Helper: calculate shift based on position of mouse (we only use x-axis for 
now.
-* since this is more convenient for users to do), and store new shift value
-*/
+ * since this is more convenient for users to do), and store new shift value
+ */
 static void gpencil_mouse_update_shift(tGPDinterpolate *tgpi, wmOperator *op, 
const wmEvent *event)
 {
        float mid = (float)(tgpi->ar->winx - tgpi->ar->winrct.xmin) / 2.0f;
        float mpos = event->x - tgpi->ar->winrct.xmin;
+       
        if (mpos >= mid) {
                tgpi->shift = ((mpos - mid) * tgpi->high_limit) / mid;
        }
        else {
                tgpi->shift = tgpi->low_limit - ((mpos * tgpi->low_limit) / 
mid);
        }
-
+       
        CLAMP(tgpi->shift, tgpi->low_limit, tgpi->high_limit);
        RNA_float_set(op->ptr, "shift", tgpi->shift);
 }
@@ -292,23 +350,24 @@ static void 
gpencil_interpolate_status_indicators(tGPDinterpolate *p)
        Scene *scene = p->scene;
        char status_str[UI_MAX_DRAW_STR];
        char msg_str[UI_MAX_DRAW_STR];
-       BLI_strncpy(msg_str, IFACE_("GPencil Interpolation: ESC/RMB to cancel, 
Enter/LMB to confirm, WHEEL/MOVE to adjust, Factor"), UI_MAX_DRAW_STR);
-
+       
+       BLI_strncpy(msg_str, IFACE_("GPencil Interpolation: ESC/RMB to cancel, 
Enter/LMB to confirm, WHEEL/MOVE to adjust factor"), UI_MAX_DRAW_STR);
+       
        if (hasNumInput(&p->num)) {
                char str_offs[NUM_STR_REP_LEN];
-
+               
                outputNumInput(&p->num, str_offs, &scene->unit);
-
+               
                BLI_snprintf(status_str, sizeof(status_str), "%s: %s", msg_str, 
str_offs);
        }
        else {
                BLI_snprintf(status_str, sizeof(status_str), "%s: %d %%", 
msg_str, (int)((p->init_factor + p->shift)  * 100.0f));
        }
-
+       
        ED_area_headerprint(p->sa, status_str);
 }
 
-/* Helper: Update screen and stroke */
+/* Update screen and stroke */
 static void gpencil_interpolate_update(bContex

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to