[Bf-blender-cvs] [ff7ccae322b] greasepencil-refactor: GPencil: Remove old drawing from Interpolate operator

Antonio Vazquez noreply at git.blender.org
Thu Feb 6 19:40:02 CET 2020


Commit: ff7ccae322b21a06f43f9d5ccb902eae9ddf80b6
Author: Antonio Vazquez
Date:   Thu Feb 6 19:37:03 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBff7ccae322b21a06f43f9d5ccb902eae9ddf80b6

GPencil: Remove old drawing from Interpolate operator

Now the drawing is done using the normal drawing engine and not the old drawing code.

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

M	source/blender/editors/gpencil/gpencil_intern.h
M	source/blender/editors/gpencil/gpencil_interpolate.c

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

diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 6c336837104..ace768d7f05 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -111,6 +111,8 @@ typedef struct tGPDinterpolate_layer {
 } tGPDinterpolate_layer;
 
 typedef struct tGPDinterpolate {
+  /** Current depsgraph from context */
+  struct Depsgraph *depsgraph;
   /** current scene from context */
   struct Scene *scene;
   /** area where painting originated */
@@ -138,8 +140,6 @@ typedef struct tGPDinterpolate {
   int flag;
 
   NumInput num; /* numeric input */
-  /** handle for drawing strokes while operator. */
-  void *draw_handle_3d;
 } tGPDinterpolate;
 
 /* Temporary primitive operation data */
diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c
index 8d697e76766..ce6a7d0454e 100644
--- a/source/blender/editors/gpencil/gpencil_interpolate.c
+++ b/source/blender/editors/gpencil/gpencil_interpolate.c
@@ -119,7 +119,22 @@ static void gp_interpolate_update_points(const bGPDstroke *gps_from,
 }
 
 /* ****************** Interpolate Interactive *********************** */
+/* Helper: free all temp strokes for display. */
+static void gp_interpolate_free_temp_strokes(bGPDframe *gpf)
+{
+  if (gpf == NULL) {
+    return;
+  }
 
+  bGPDstroke *gps_next;
+  for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps_next) {
+    gps_next = gps->next;
+    if (gps->flag & GP_STROKE_TAG) {
+      BLI_remlink(&gpf->strokes, gps);
+      BKE_gpencil_free_stroke(gps);
+    }
+  }
+}
 /* Helper: Update all strokes interpolated */
 static void gp_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgpi)
 {
@@ -129,6 +144,10 @@ static void gp_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgpi)
   LISTBASE_FOREACH (tGPDinterpolate_layer *, tgpil, &tgpi->ilayers) {
     const float factor = tgpil->factor + shift;
 
+    bGPDframe *gpf = tgpil->gpl->actframe;
+    /* Free temp strokes. */
+    gp_interpolate_free_temp_strokes(gpf);
+
     LISTBASE_FOREACH (bGPDstroke *, new_stroke, &tgpil->interFrame->strokes) {
       bGPDstroke *gps_from, *gps_to;
       int stroke_idx;
@@ -146,6 +165,13 @@ static void gp_interpolate_update_strokes(bContext *C, tGPDinterpolate *tgpi)
       /* update points position */
       if ((gps_from) && (gps_to)) {
         gp_interpolate_update_points(gps_from, gps_to, new_stroke, factor);
+
+        /* Add temp strokes. */
+        if (gpf) {
+          bGPDstroke *gps_eval = BKE_gpencil_stroke_duplicate(new_stroke, true);
+          gps_eval->flag |= GP_STROKE_TAG;
+          BLI_addtail(&gpf->strokes, gps_eval);
+        }
       }
     }
   }
@@ -317,15 +343,6 @@ static void gp_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
 /* ----------------------- */
 /* Drawing Callbacks */
 
-/* Drawing callback for modal operator in screen mode */
-static void gpencil_interpolate_draw_screen(const struct bContext *C,
-                                            ARegion *UNUSED(ar),
-                                            void *arg)
-{
-  tGPDinterpolate *tgpi = (tGPDinterpolate *)arg;
-  ED_gp_draw_interpolation(C, tgpi, REGION_DRAW_POST_PIXEL);
-}
-
 /* Drawing callback for modal operator in 3d mode */
 static void gpencil_interpolate_draw_3d(const bContext *C, ARegion *UNUSED(ar), void *arg)
 {
@@ -403,15 +420,17 @@ static void gpencil_interpolate_exit(bContext *C, wmOperator *op)
 
   /* don't assume that operator data exists at all */
   if (tgpi) {
-    /* Remove drawing handler. */
-    if (tgpi->draw_handle_3d) {
-      ED_region_draw_cb_exit(tgpi->ar->type, tgpi->draw_handle_3d);
-    }
-
     /* clear status message area */
     ED_area_status_text(tgpi->sa, NULL);
     ED_workspace_status_text(C, NULL);
 
+    /* Clear any temp stroke. */
+    LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+      LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
+        gp_interpolate_free_temp_strokes(gpf);
+      }
+    }
+
     /* finally, free memory used by temp data */
     LISTBASE_FOREACH (tGPDinterpolate_layer *, tgpil, &tgpi->ilayers) {
       BKE_gpencil_free_strokes(tgpil->interFrame);
@@ -435,6 +454,7 @@ static bool gp_interpolate_set_init_values(bContext *C, wmOperator *op, tGPDinte
   bGPdata *gpd = CTX_data_gpencil_data(C);
 
   /* set current scene and window */
+  tgpi->depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
   tgpi->scene = CTX_data_scene(C);
   tgpi->sa = CTX_wm_area(C);
   tgpi->ar = CTX_wm_region(C);
@@ -530,10 +550,6 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent
     tgpi = op->customdata;
   }
 
-  /* Enable custom drawing handler. */
-  tgpi->draw_handle_3d = ED_region_draw_cb_activate(
-      tgpi->ar->type, gpencil_interpolate_draw_3d, tgpi, REGION_DRAW_POST_VIEW);
-
   /* set cursor to indicate modal */
   WM_cursor_modal_set(win, WM_CURSOR_EW_SCROLL);



More information about the Bf-blender-cvs mailing list