Commit: b56339e52873427681413453083789a64286237a
Author: Antonio Vazquez
Date:   Sun Jun 4 13:57:12 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rBb56339e52873427681413453083789a64286237a

WIP: Basic structure for new object modes

Now there are 3 modes: Edit, Paint and Sculpt strokes.

These modes are only for new GP object.

Notice: Now the paint and sculpt modes can be activated but don't work.

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

M       source/blender/editors/gpencil/gpencil_edit.c
M       source/blender/editors/gpencil/gpencil_intern.h
M       source/blender/editors/gpencil/gpencil_ops.c
M       source/blender/editors/object/object_edit.c
M       source/blender/editors/screen/area.c
M       source/blender/makesdna/DNA_gpencil_types.h
M       source/blender/makesdna/DNA_object_types.h
M       source/blender/makesrna/intern/rna_object.c

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

diff --git a/source/blender/editors/gpencil/gpencil_edit.c 
b/source/blender/editors/gpencil/gpencil_edit.c
index 2a89a8ab0c7..392683557aa 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -111,6 +111,9 @@ static int gpencil_editmode_toggle_exec(bContext *C, 
wmOperator *UNUSED(op))
        
        /* Just toggle editmode flag... */
        gpd->flag ^= GP_DATA_STROKE_EDITMODE;
+       /* disable other GP modes */
+       gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+       gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
        /* recalculate parent matrix */
        if (gpd->flag & GP_DATA_STROKE_EDITMODE) {
                ED_gpencil_reset_layers_parent(ob, gpd);
@@ -151,6 +154,146 @@ void GPENCIL_OT_editmode_toggle(wmOperatorType *ot)
        ot->flag = OPTYPE_UNDO | OPTYPE_REGISTER;
 }
 
+/* Stroke Paint Mode Management */
+
+static int gpencil_paintmode_toggle_poll(bContext *C)
+{
+       /* if using gpencil object, use this gpd */
+       Object *ob = CTX_data_active_object(C);
+       if ((ob) && (ob->type == OB_GPENCIL)) {
+               return ob->gpd != NULL;
+       }
+       return ED_gpencil_data_get_active(C) != NULL;
+}
+
+static int gpencil_paintmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
+{
+       WorkSpace *workspace = CTX_wm_workspace(C);
+       bGPdata *gpd = ED_gpencil_data_get_active(C);
+       bool is_object = false;
+       int mode;
+       /* if using a gpencil object, use this datablock */
+       Object *ob = CTX_data_active_object(C);
+       if ((ob) && (ob->type == OB_GPENCIL)) {
+               gpd = ob->gpd;
+               is_object = true;
+       }
+
+       if (gpd == NULL)
+               return OPERATOR_CANCELLED;
+
+       /* Just toggle editmode flag... */
+       gpd->flag ^= GP_DATA_STROKE_PAINTMODE;
+       /* disable other GP modes */
+       gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+       gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
+
+       /* set mode */
+       if (gpd->flag & GP_DATA_STROKE_PAINTMODE) {
+               mode = OB_MODE_GPENCIL_PAINT;
+       }
+       else {
+               mode = OB_MODE_OBJECT;
+       }
+
+       if (is_object) {
+               ob->mode = mode;
+       }
+
+       /* set workspace mode */
+       BKE_workspace_object_mode_set(workspace, mode);
+
+       WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, 
NULL);
+       WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
+
+       return OPERATOR_FINISHED;
+}
+
+void GPENCIL_OT_paintmode_toggle(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Strokes Paint Mode Toggle";
+       ot->idname = "GPENCIL_OT_paintmode_toggle";
+       ot->description = "Enter/Exit paint mode for Grease Pencil strokes";
+
+       /* callbacks */
+       ot->exec = gpencil_paintmode_toggle_exec;
+       ot->poll = gpencil_paintmode_toggle_poll;
+
+       /* flags */
+       ot->flag = OPTYPE_UNDO | OPTYPE_REGISTER;
+}
+
+/* Stroke Scupt Mode Management */
+
+static int gpencil_sculptmode_toggle_poll(bContext *C)
+{
+       /* if using gpencil object, use this gpd */
+       Object *ob = CTX_data_active_object(C);
+       if ((ob) && (ob->type == OB_GPENCIL)) {
+               return ob->gpd != NULL;
+       }
+       return ED_gpencil_data_get_active(C) != NULL;
+}
+
+static int gpencil_sculptmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
+{
+       WorkSpace *workspace = CTX_wm_workspace(C);
+       bGPdata *gpd = ED_gpencil_data_get_active(C);
+       bool is_object = false;
+       int mode;
+       /* if using a gpencil object, use this datablock */
+       Object *ob = CTX_data_active_object(C);
+       if ((ob) && (ob->type == OB_GPENCIL)) {
+               gpd = ob->gpd;
+               is_object = true;
+       }
+
+       if (gpd == NULL)
+               return OPERATOR_CANCELLED;
+
+       /* Just toggle editmode flag... */
+       gpd->flag ^= GP_DATA_STROKE_SCULPTMODE;
+       /* disable other GP modes */
+       gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+       gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+
+       /* set mode */
+       if (gpd->flag & GP_DATA_STROKE_SCULPTMODE) {
+               mode = OB_MODE_GPENCIL_SCULPT;
+       }
+       else {
+               mode = OB_MODE_OBJECT;
+       }
+
+       if (is_object) {
+               ob->mode = mode;
+       }
+
+       /* set workspace mode */
+       BKE_workspace_object_mode_set(workspace, mode);
+
+       WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, 
NULL);
+       WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
+
+       return OPERATOR_FINISHED;
+}
+
+void GPENCIL_OT_sculptmode_toggle(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Strokes Sculpt Mode Toggle";
+       ot->idname = "GPENCIL_OT_sculptmode_toggle";
+       ot->description = "Enter/Exit sculpt mode for Grease Pencil strokes";
+
+       /* callbacks */
+       ot->exec = gpencil_sculptmode_toggle_exec;
+       ot->poll = gpencil_sculptmode_toggle_poll;
+
+       /* flags */
+       ot->flag = OPTYPE_UNDO | OPTYPE_REGISTER;
+}
+
 /* ************************************************ */
 /* Stroke Editing Operators */
 
diff --git a/source/blender/editors/gpencil/gpencil_intern.h 
b/source/blender/editors/gpencil/gpencil_intern.h
index 029773b71a9..a7420f04d82 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -231,6 +231,8 @@ typedef enum eGPencil_PaintModes {
 /* stroke editing ----- */
 
 void GPENCIL_OT_editmode_toggle(struct wmOperatorType *ot);
+void GPENCIL_OT_paintmode_toggle(struct wmOperatorType *ot);
+void GPENCIL_OT_sculptmode_toggle(struct wmOperatorType *ot);
 void GPENCIL_OT_selection_opacity_toggle(struct wmOperatorType *ot);
 
 void GPENCIL_OT_select(struct wmOperatorType *ot);
diff --git a/source/blender/editors/gpencil/gpencil_ops.c 
b/source/blender/editors/gpencil/gpencil_ops.c
index d276ddf9aea..811a048e055 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -120,6 +120,20 @@ static int gp_stroke_editmode_poll(bContext *C)
        return (gpd && (gpd->flag & GP_DATA_STROKE_EDITMODE));
 }
 
+/* Poll callback for stroke painting mode */
+static int gp_stroke_paintmode_poll(bContext *C)
+{
+       bGPdata *gpd = CTX_data_gpencil_data(C);
+       return (gpd && (gpd->flag & GP_DATA_STROKE_PAINTMODE));
+}
+
+/* Poll callback for stroke sculpting mode */
+static int gp_stroke_sculptmode_poll(bContext *C)
+{
+       bGPdata *gpd = CTX_data_gpencil_data(C);
+       return (gpd && (gpd->flag & GP_DATA_STROKE_SCULPTMODE));
+}
+
 /* Stroke Editing Keymap - Only when editmode is enabled */
 static void ed_keymap_gpencil_editing(wmKeyConfig *keyconf)
 {
@@ -337,12 +351,46 @@ static void ed_keymap_gpencil_editing(wmKeyConfig 
*keyconf)
        ED_keymap_proportional_editmode(keyconf, keymap, true);
 }
 
+/* Stroke Painting Keymap - Only when paintmode is enabled */
+static void ed_keymap_gpencil_painting(wmKeyConfig *keyconf)
+{
+       wmKeyMap *keymap = WM_keymap_find(keyconf, "Grease Pencil Stroke Paint 
Mode", 0, 0);
+       wmKeyMapItem *kmi;
+
+       /* set poll callback - so that this keymap only gets enabled when 
stroke paintmode is enabled */
+       keymap->poll = gp_stroke_paintmode_poll;
+
+       /* ----------------------------------------------- */
+
+       /* Exit PaintMode */
+       WM_keymap_add_item(keymap, "GPENCIL_OT_paintmode_toggle", TABKEY, 
KM_PRESS, 0, 0);
+
+}
+
+/* Stroke Sculpting Keymap - Only when sculptmode is enabled */
+static void ed_keymap_gpencil_sculpting(wmKeyConfig *keyconf)
+{
+       wmKeyMap *keymap = WM_keymap_find(keyconf, "Grease Pencil Stroke Sculpt 
Mode", 0, 0);
+       wmKeyMapItem *kmi;
+
+       /* set poll callback - so that this keymap only gets enabled when 
stroke sculptmode is enabled */
+       keymap->poll = gp_stroke_sculptmode_poll;
+
+       /* ----------------------------------------------- */
+
+       /* Exit PaintMode */
+       WM_keymap_add_item(keymap, "GPENCIL_OT_sculptmode_toggle", TABKEY, 
KM_PRESS, 0, 0);
+
+}
+
 /* ==================== */
 
 void ED_keymap_gpencil(wmKeyConfig *keyconf)
 {
        ed_keymap_gpencil_general(keyconf);
        ed_keymap_gpencil_editing(keyconf);
+       ed_keymap_gpencil_painting(keyconf);
+       ed_keymap_gpencil_sculpting(keyconf);
 }
 
 /* ****************************************** */
@@ -356,6 +404,8 @@ void ED_operatortypes_gpencil(void)
        /* Editing (Strokes) ------------ */
        
        WM_operatortype_append(GPENCIL_OT_editmode_toggle);
+       WM_operatortype_append(GPENCIL_OT_paintmode_toggle);
+       WM_operatortype_append(GPENCIL_OT_sculptmode_toggle);
        WM_operatortype_append(GPENCIL_OT_selection_opacity_toggle);
 
        WM_operatortype_append(GPENCIL_OT_select);
diff --git a/source/blender/editors/object/object_edit.c 
b/source/blender/editors/object/object_edit.c
index 99fc473e1d1..414016b268e 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -1386,7 +1386,6 @@ static EnumPropertyItem *object_mode_set_itemsf(bContext 
*C, PointerRNA *UNUSED(
        EnumPropertyItem *input = rna_enum_object_mode_items;
        EnumPropertyItem *item = NULL;
        Object *ob;
-       bGPdata *gpd;
        int totitem = 0;
 
        if (!C) /* needed for docs */
@@ -1403,8 +1402,8 @@ static EnumPropertyItem *object_mode_set_itemsf(bContext 
*C, PointerRNA *UNUSED(
                            (input->value == OB_MODE_PARTICLE_EDIT && 
use_mode_particle_edit) ||
                            (ELEM(input->value, OB_MODE_SCULPT, 
OB_MODE_VERTEX_PAINT,
                                   OB_MODE_WEIGHT_PAINT, OB_MODE_TEXTURE_PAINT) 
&& (ob->type == OB_MESH)) ||
-                               /* TODO: future gpencil modes to add here */
-                               (ELEM(input->value, OB_MODE_GPENCIL_EDIT) && 
(ob->type == OB_GPENCIL)) ||
+                               (ELEM(input->value, OB_MODE_GPENCIL_EDIT, 
OB_MODE_GPENCIL_PAINT, 
+                                         OB_MODE_GPENCIL_SCULPT) && (ob->type 
== OB_GPENCIL)) ||
                            (input->value == OB_MODE_OBJECT))
                        {
                                RNA_enum_item_add(&item, &totitem, input);
@@ -1442,6 +1441,10 @@ static const char *object_mode_op_string(int mode)
                return "OBJECT_OT_posemode_toggle";
        if (mode == OB_MODE_GPENCIL_EDIT)
                return "GPENCIL_OT_editmode_toggle";
+       if (mode == OB_MODE_GPENCIL_PAINT)
+               return "GPENCIL_OT_paintmode_toggle";
+       if (mode == OB_MODE_GPENCIL_SCULPT)
+               return "GPENCIL_OT_sculptmode_toggle";
        return NULL;
 }
 
@@ -1453,8 +1456,6 @@ static bool object_mode_compat_test(Object *ob, 
ObjectMode mode)
        if (ob) {
                if (mode == OB_MODE_OBJECT)
                        return true;
-               else if (mode == OB_MODE_GPENCIL_EDIT)
-                       return true; /* XXX: assume this is the case for now... 
*/
 
                switch (ob->type) {
                        case OB_MESH:
@@ -1479,6 +1480,12 @@ static bool object_mode_compat_test(Object *ob, 
ObjectMode mode)
                                if (mode & (OB_MODE_EDIT | OB_MODE_POSE))
                                        return true;
                                break;
+                       case OB_GPENCIL:
+                               if (mode & (OB_MODE_GPENCIL_EDIT | 
OB_MODE_GPENCIL_PAINT | OB_MODE_GPENCIL_SCULPT))
+                               {
+                                       return true;
+                               }
+                               break;
                }
        }
 
@@ -1537,32 +1544,42 @@ static int object_mode_set_exec(bContext *C, 

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to