Commit: 796aae61d953aad4f3087b9b68ed29c111c42593
Author: Antonio Vazquez
Date:   Wed Dec 20 17:38:50 2017 +0100
Branches: greasepencil-object
https://developer.blender.org/rB796aae61d953aad4f3087b9b68ed29c111c42593

WIP: Define basic struct/functions for modal fill

Not implement yet.

Prepare the different elements required by modal operator.

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

M       source/blender/editors/gpencil/drawgpencil.c
M       source/blender/editors/gpencil/gpencil_fill.c
M       source/blender/editors/include/ED_gpencil.h

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

diff --git a/source/blender/editors/gpencil/drawgpencil.c 
b/source/blender/editors/gpencil/drawgpencil.c
index dda65d04ea3..f5d25b7fad9 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -1482,6 +1482,14 @@ void ED_gp_draw_primitives(const bContext *C, 
tGPDprimitive *tgpi, const int typ
        glDisable(GL_BLEND);
 }
 
+/* draw fill mask (used only while operator is running) */
+void ED_gp_draw_fill(const struct bContext *UNUSED(C), struct tGPDfill 
*UNUSED(tgpf))
+{
+       /* TODO: Not implemented yet */
+       float color[4];
+       UI_GetThemeColor3fv(TH_GP_VERTEX_SELECT, color);
+}
+
 /* loop over gpencil data layers, drawing them */
 static void gp_draw_data_layers(
         const bGPDbrush *brush, float alpha, Object *ob, bGPdata *gpd,
diff --git a/source/blender/editors/gpencil/gpencil_fill.c 
b/source/blender/editors/gpencil/gpencil_fill.c
index 960d617a464..b62b2ec12d7 100644
--- a/source/blender/editors/gpencil/gpencil_fill.c
+++ b/source/blender/editors/gpencil/gpencil_fill.c
@@ -29,6 +29,8 @@
 
 #include <stdio.h>
 
+#include "MEM_guardedalloc.h" 
+
 #include "BLI_utildefines.h"
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
@@ -37,12 +39,15 @@
 #include "DNA_gpencil_types.h"
 #include "DNA_windowmanager_types.h"
 
+#include "BKE_main.h" 
 #include "BKE_gpencil.h"
 #include "BKE_context.h"
 #include "BKE_screen.h"
+#include "BKE_paint.h" 
 
 #include "ED_gpencil.h"
 #include "ED_screen.h"
+#include "ED_space_api.h" 
 
 #include "GPU_immediate.h"
 #include "GPU_draw.h"
@@ -149,6 +154,16 @@ static unsigned int *gp_draw_offscreen_strokes(Scene 
*scene, Object *ob, rcti re
        return data;
 }
 
+/* ----------------------- */
+/* Drawing Callbacks */
+
+/* Drawing callback for modal operator in 3d mode */
+static void gpencil_fill_draw_3d(const bContext *C, ARegion *UNUSED(ar), void 
*arg)
+{
+       tGPDfill *tgpf = (tGPDfill *)arg;
+       //ED_gp_draw_fill(C, tgpf, REGION_DRAW_POST_VIEW); 
+}
+
 /* check if context is suitable for filling */
 static int gpencil_fill_poll(bContext *C)
 {
@@ -169,15 +184,36 @@ static int gpencil_fill_poll(bContext *C)
        return 0;
 }
 
-/* start of interactive part of operator */
-static int gpencil_fill_invoke(bContext *C, wmOperator *op, const wmEvent 
*event)
+/* Allocate memory and initialize values */
+static tGPDfill *gp_session_init_fill(bContext *C, wmOperator *op)
 {
-       WM_cursor_modal_set(CTX_wm_window(C), BC_PAINTBRUSHCURSOR);
+       tGPDfill *tgpf = MEM_callocN(sizeof(tGPDfill), "GPencil Fill Data");
 
-       /* add a modal handler for this operator*/
-       WM_event_add_modal_handler(C, op);
+       /* define initial values */
+       ToolSettings *ts = CTX_data_tool_settings(C);
+       bGPdata *gpd = CTX_data_gpencil_data(C);
+       Main *bmain = CTX_data_main(C);
 
-       return OPERATOR_RUNNING_MODAL;
+       /* set current scene and window info */
+       tgpf->scene = CTX_data_scene(C);
+       tgpf->ob = CTX_data_active_object(C);
+       tgpf->sa = CTX_wm_area(C);
+       tgpf->ar = CTX_wm_region(C);
+       tgpf->rv3d = tgpf->ar->regiondata;
+       tgpf->v3d = tgpf->sa->spacedata.first;
+
+       /* set GP datablock */
+       tgpf->gpd = gpd;
+
+       /* get palette and color info */
+       bGPDpaletteref *palslot = BKE_gpencil_paletteslot_validate(bmain, gpd);
+       tgpf->palette = palslot->palette;
+       tgpf->palcolor = BKE_palette_color_get_active(tgpf->palette);
+
+       tgpf->lock_axis = ts->gp_sculpt.lock_axis;
+
+       /* return context data for running operator */
+       return tgpf;
 }
 
 /* end operator */
@@ -187,6 +223,23 @@ static void gpencil_fill_exit(bContext *C, wmOperator *op)
        /* restore cursor to indicate end of fill */
        WM_cursor_modal_restore(CTX_wm_window(C));
 
+       tGPDfill *tgpf = op->customdata;
+       bGPdata *gpd = tgpf->gpd;
+
+       /* don't assume that operator data exists at all */
+       if (tgpf) {
+               /* remove drawing handler */
+               if (tgpf->draw_handle_3d) {
+                       ED_region_draw_cb_exit(tgpf->ar->type, 
tgpf->draw_handle_3d);
+               }
+
+               /* finally, free memory used by temp data */
+               MEM_freeN(tgpf);
+       }
+
+       /* clear pointer */
+       op->customdata = NULL;
+
        /* drawing batch cache is dirty now */
        if ((ob) && (ob->type == OB_GPENCIL) && (ob->data)) {
                bGPdata *gpd = ob->data;
@@ -201,6 +254,49 @@ static void gpencil_fill_cancel(bContext *C, wmOperator 
*op)
        gpencil_fill_exit(C, op);
 }
 
+/* Init: Allocate memory and set init values */
+static int gpencil_fill_init(bContext *C, wmOperator *op)
+{
+       tGPDfill *tgpf;
+
+       /* check context */
+       tgpf = op->customdata = gp_session_init_fill(C, op);
+       if (tgpf == NULL) {
+               /* something wasn't set correctly in context */
+               gpencil_fill_exit(C, op);
+               return 0;
+       }
+
+       /* everything is now setup ok */
+       return 1;
+}
+
+/* start of interactive part of operator */
+static int gpencil_fill_invoke(bContext *C, wmOperator *op, const wmEvent 
*event)
+{
+       tGPDfill *tgpf = NULL;
+
+       /* try to initialize context data needed */
+       if (!gpencil_fill_init(C, op)) {
+               if (op->customdata)
+                       MEM_freeN(op->customdata);
+               return OPERATOR_CANCELLED;
+       }
+       else {
+               tgpf = op->customdata;
+       }
+
+       /* Enable custom drawing handlers */
+       tgpf->draw_handle_3d = ED_region_draw_cb_activate(tgpf->ar->type, 
gpencil_fill_draw_3d, tgpf, REGION_DRAW_POST_VIEW);
+
+       WM_cursor_modal_set(CTX_wm_window(C), BC_PAINTBRUSHCURSOR);
+
+       /* add a modal handler for this operator*/
+       WM_event_add_modal_handler(C, op);
+
+       return OPERATOR_RUNNING_MODAL;
+}
+
 /* events handling during interactive part of operator */
 static int gpencil_fill_modal(bContext *C, wmOperator *op, const wmEvent 
*event)
 {
diff --git a/source/blender/editors/include/ED_gpencil.h 
b/source/blender/editors/include/ED_gpencil.h
index 6eb7872da26..b80a310e1d4 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -121,6 +121,25 @@ typedef struct tGPDprimitive {
        void *draw_handle_3d;             /* handle for drawing strokes while 
operator is running 3d stuff */
 } tGPDprimitive;
 
+/* Temporary fill operation data */
+typedef struct tGPDfill {
+       struct Scene *scene;              /* current scene from context */
+       struct Object *ob;                /* current active gp object */
+       struct ScrArea *sa;               /* area where painting originated */
+       struct RegionView3D *rv3d;        /* region where painting originated */
+       struct View3D *v3d;               /* view3 where painting originated */
+       struct ARegion *ar;               /* region where painting originated */
+       struct bGPdata *gpd;              /* current GP datablock */
+       struct Palette *palette;          /* current palette */
+       struct PaletteColor *palcolor;    /* current palette color */
+       struct bGPDlayer *gpl;            /* layer */
+       struct bGPDframe *gpf;            /* frame */
+
+       int lock_axis;                    /* lock to viewport axis */
+
+       void *draw_handle_3d;             /* handle for drawing strokes while 
operator is running 3d stuff */
+} tGPDfill;
+
 /* Temporary 'Stroke Point' data
  *
  * Used as part of the 'stroke cache' used during drawing of new strokes

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to