[Bf-blender-cvs] [b56339e5287] greasepencil-object: WIP: Basic structure for new object modes

Antonio Vazquez noreply at git.blender.org
Tue Jun 6 11:28:21 CEST 2017


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. @@




More information about the Bf-blender-cvs mailing list