[Bf-blender-cvs] [e0ea483bd77] greasepencil-object: First try to fix grease pencil object modes

Antonio Vazquez noreply at git.blender.org
Mon Feb 12 16:30:39 CET 2018


Commit: e0ea483bd77f819b397cd0b727b0c5e10b35984c
Author: Antonio Vazquez
Date:   Mon Feb 12 16:30:22 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rBe0ea483bd77f819b397cd0b727b0c5e10b35984c

First try to fix grease pencil object modes

After last merge of 2.8 the object modes was not working. Now we back to previous situation where the user can switch between objects and handle different modes.

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

M	source/blender/editors/gpencil/gpencil_edit.c
M	source/blender/editors/gpencil/gpencil_utils.c
M	source/blender/editors/include/ED_gpencil.h
M	source/blender/editors/object/object_select.c

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

diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 0a04ca64f57..b9582ce394d 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -90,78 +90,6 @@
 #include "gpencil_intern.h"
 
 /* ************************************************ */
-/* verify if is using the right brush */
-static void gpencil_verify_brush_type(bContext *C, int newmode)
-{
-	ToolSettings *ts = CTX_data_tool_settings(C);
-	GP_BrushEdit_Settings *gset = &ts->gp_sculpt;
-
-	switch (newmode) {
-		case OB_MODE_GPENCIL_SCULPT:
-			gset->flag &= ~GP_BRUSHEDIT_FLAG_WEIGHT_MODE;
-			if ((gset->brushtype < 0) || (gset->brushtype >= GP_EDITBRUSH_TYPE_WEIGHT)) {
-				gset->brushtype = GP_EDITBRUSH_TYPE_PUSH;
-			}
-			break;
-		case OB_MODE_GPENCIL_WEIGHT:
-			gset->flag |= GP_BRUSHEDIT_FLAG_WEIGHT_MODE;
-			if ((gset->weighttype < GP_EDITBRUSH_TYPE_WEIGHT) || (gset->weighttype >= TOT_GP_EDITBRUSH_TYPES)) {
-				gset->weighttype = GP_EDITBRUSH_TYPE_WEIGHT;
-			}
-			break;
-		default:
-			break;
-	}
-}
-
-
-/* setup modes and cursor */
-static void gpencil_setup_modes(bContext *C, bGPdata *gpd, int newmode)
-{
-	if (!gpd) {
-		return;
-	}
-
-	switch (newmode) {
-		case OB_MODE_GPENCIL_EDIT:
-			gpd->flag |= GP_DATA_STROKE_EDITMODE;
-			gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
-			gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
-			gpd->flag &= ~GP_DATA_STROKE_WEIGHTMODE;
-			ED_gpencil_toggle_brush_cursor(C, false, NULL);
-			break;
-		case OB_MODE_GPENCIL_PAINT:
-			gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
-			gpd->flag |= GP_DATA_STROKE_PAINTMODE;
-			gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
-			gpd->flag &= ~GP_DATA_STROKE_WEIGHTMODE;
-			ED_gpencil_toggle_brush_cursor(C, true, NULL);
-			break;
-		case OB_MODE_GPENCIL_SCULPT:
-			gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
-			gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
-			gpd->flag |= GP_DATA_STROKE_SCULPTMODE;
-			gpd->flag &= ~GP_DATA_STROKE_WEIGHTMODE;
-			gpencil_verify_brush_type(C, OB_MODE_GPENCIL_SCULPT);
-			ED_gpencil_toggle_brush_cursor(C, true, NULL);
-			break;
-		case OB_MODE_GPENCIL_WEIGHT:
-			gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
-			gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
-			gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
-			gpd->flag |= GP_DATA_STROKE_WEIGHTMODE;
-			gpencil_verify_brush_type(C, OB_MODE_GPENCIL_WEIGHT);
-			ED_gpencil_toggle_brush_cursor(C, true, NULL);
-			break;
-		default:
-			gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
-			gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
-			gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
-			ED_gpencil_toggle_brush_cursor(C, false, NULL);
-			break;
-	}
-}
-
 /* Stroke Edit Mode Management */
 static int gpencil_editmode_toggle_poll(bContext *C)
 {
@@ -220,7 +148,7 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *op)
 	ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
 	//ED_object_base_activate(C, view_layer->basact);
 	/* setup other modes */
-	gpencil_setup_modes(C, gpd, mode);
+	ED_gpencil_setup_modes(C, gpd, mode);
 	/* set cache as dirty */
 	BKE_gpencil_batch_cache_dirty(gpd);
 
@@ -303,7 +231,7 @@ static int gpencil_paintmode_toggle_exec(bContext *C, wmOperator *op)
 	ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
 	//ED_object_base_activate(C, view_layer->basact);
 	/* setup other modes */
-	gpencil_setup_modes(C, gpd, mode);
+	ED_gpencil_setup_modes(C, gpd, mode);
 	/* set cache as dirty */
 	BKE_gpencil_batch_cache_dirty(gpd);
 
@@ -385,7 +313,7 @@ static int gpencil_sculptmode_toggle_exec(bContext *C, wmOperator *op)
 	ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
 	//ED_object_base_activate(C, view_layer->basact);
 	/* setup other modes */
-	gpencil_setup_modes(C, gpd, mode);
+	ED_gpencil_setup_modes(C, gpd, mode);
 	/* set cache as dirty */
 	BKE_gpencil_batch_cache_dirty(gpd);
 
@@ -467,7 +395,7 @@ static int gpencil_weightmode_toggle_exec(bContext *C, wmOperator *op)
 	ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
 	//ED_object_base_activate(C, view_layer->basact);
 	/* setup other modes */
-	gpencil_setup_modes(C, gpd, mode);
+	ED_gpencil_setup_modes(C, gpd, mode);
 	/* set cache as dirty */
 	BKE_gpencil_batch_cache_dirty(gpd);
 
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index e570d816ded..3999716ca5c 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -1455,5 +1455,76 @@ void ED_gpencil_toggle_brush_cursor(bContext *C, bool enable, void *customdata)
 	}
 }
 
+/* verify if is using the right brush */
+static void gpencil_verify_brush_type(bContext *C, int newmode)
+{
+	ToolSettings *ts = CTX_data_tool_settings(C);
+	GP_BrushEdit_Settings *gset = &ts->gp_sculpt;
+
+	switch (newmode) {
+	case OB_MODE_GPENCIL_SCULPT:
+		gset->flag &= ~GP_BRUSHEDIT_FLAG_WEIGHT_MODE;
+		if ((gset->brushtype < 0) || (gset->brushtype >= GP_EDITBRUSH_TYPE_WEIGHT)) {
+			gset->brushtype = GP_EDITBRUSH_TYPE_PUSH;
+		}
+		break;
+	case OB_MODE_GPENCIL_WEIGHT:
+		gset->flag |= GP_BRUSHEDIT_FLAG_WEIGHT_MODE;
+		if ((gset->weighttype < GP_EDITBRUSH_TYPE_WEIGHT) || (gset->weighttype >= TOT_GP_EDITBRUSH_TYPES)) {
+			gset->weighttype = GP_EDITBRUSH_TYPE_WEIGHT;
+		}
+		break;
+	default:
+		break;
+	}
+}
+
+/* set object modes */
+void ED_gpencil_setup_modes(bContext *C, bGPdata *gpd, int newmode)
+{
+	if (!gpd) {
+		return;
+	}
+
+	switch (newmode) {
+	case OB_MODE_GPENCIL_EDIT:
+		gpd->flag |= GP_DATA_STROKE_EDITMODE;
+		gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_WEIGHTMODE;
+		ED_gpencil_toggle_brush_cursor(C, false, NULL);
+		break;
+	case OB_MODE_GPENCIL_PAINT:
+		gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+		gpd->flag |= GP_DATA_STROKE_PAINTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_WEIGHTMODE;
+		ED_gpencil_toggle_brush_cursor(C, true, NULL);
+		break;
+	case OB_MODE_GPENCIL_SCULPT:
+		gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+		gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+		gpd->flag |= GP_DATA_STROKE_SCULPTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_WEIGHTMODE;
+		gpencil_verify_brush_type(C, OB_MODE_GPENCIL_SCULPT);
+		ED_gpencil_toggle_brush_cursor(C, true, NULL);
+		break;
+	case OB_MODE_GPENCIL_WEIGHT:
+		gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+		gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
+		gpd->flag |= GP_DATA_STROKE_WEIGHTMODE;
+		gpencil_verify_brush_type(C, OB_MODE_GPENCIL_WEIGHT);
+		ED_gpencil_toggle_brush_cursor(C, true, NULL);
+		break;
+	default:
+		gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+		gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
+		ED_gpencil_toggle_brush_cursor(C, false, NULL);
+		break;
+	}
+}
+
 /* ******************************************************** */
 
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index d834677eb69..ba496ee15de 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -187,6 +187,8 @@ void ED_gpencil_create_monkey(struct bContext *C, struct bGPdata *gpd);
 /* ------------ Object Utilities ------------ */
 struct Object *ED_add_gpencil_object(struct bContext *C, struct Scene *scene, const float loc[3]);
 void ED_gpencil_add_defaults(struct bContext *C);
+/* set object modes */
+void ED_gpencil_setup_modes(struct bContext *C, struct bGPdata *gpd, int newmode);
 
 struct tGPencilSort *ED_gpencil_allocate_cache(struct tGPencilSort *cache, int *gp_cache_size, int gp_cache_used);
 void ED_gpencil_add_to_cache(struct tGPencilSort *cache, struct RegionView3D *rv3d, struct Base *base, int *gp_cache_used);
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index 69e0fd20b86..7dbac5e09f4 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -42,6 +42,7 @@
 #include "DNA_armature_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_workspace_types.h"
+#include "DNA_gpencil_types.h"
 
 #include "BLI_math.h"
 #include "BLI_listbase.h"
@@ -72,6 +73,7 @@
 #include "ED_object.h"
 #include "ED_screen.h"
 #include "ED_keyframing.h"
+#include "ED_gpencil.h"
 
 #include "UI_interface.h"
 #include "UI_resources.h"
@@ -137,9 +139,32 @@ void ED_object_base_activate(bContext *C, Base *base)
 
 	eObjectMode object_mode = workspace->object_mode;
 	workspace->object_mode = OB_MODE_OBJECT;
-
 	view_layer->basact = base;
 
+	/* grease pencil modes */
+	if ((base->object) && (base->object->type == OB_GPENCIL)) {
+		if (base->object->data) {
+			bGPdata *gpd = (bGPdata *)base->object->data;
+			reset = true;
+			if (gpd->flag & GP_DATA_STROKE_EDITMODE) { 
+				workspace->object_mode = OB_MODE_GPENCIL_EDIT;
+			}
+			else if (gpd->flag & GP_DATA_STROKE_PAINTMODE) { 
+				workspace->object_mode = OB_MODE_GPENCIL_PAINT;
+			}
+			else if (gpd->flag & GP_DATA_STROKE_SCULPTMODE) { 
+				workspace->object_mode = OB_MODE_GPENCIL_SCULPT;
+			}
+			else if (gpd->flag & GP_DATA_STROKE_WEIGHTMODE){ 
+				workspace->object_mode = OB_MODE_GPENCIL_WEIGHT;
+			}
+			else { 
+				workspace->object_mode = OB_MODE_OBJECT; 
+			}
+			ED_gpencil_setup_modes(C, gpd, workspace->object_mode);
+		}
+	}
+
 	if (reset == false) {
 		wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_mode_set", false);
 		PointerRNA ptr;



More information about the Bf-blender-cvs mailing list