[Bf-blender-cvs] [c28dea5e241] blender2.8: Vertex Paint: expose exist paint-mode to API

Campbell Barton noreply at git.blender.org
Fri Feb 16 14:07:09 CET 2018


Commit: c28dea5e241a993ae9f3ca9f5208ad1e5010da63
Author: Campbell Barton
Date:   Fri Feb 16 20:24:38 2018 +1100
Branches: blender2.8
https://developer.blender.org/rBc28dea5e241a993ae9f3ca9f5208ad1e5010da63

Vertex Paint: expose exist paint-mode to API

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

M	source/blender/editors/include/ED_object.h
M	source/blender/editors/sculpt_paint/paint_vertex.c

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

diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 757a463f171..0452464f9d0 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -57,6 +57,7 @@ struct PropertyRNA;
 struct EnumPropertyItem;
 struct EvaluationContext;
 struct WorkSpace;
+struct wmWindowManager;
 
 #include "DNA_object_enums.h"
 
@@ -134,6 +135,21 @@ bool ED_object_editmode_load(struct Object *obedit);
 
 bool ED_object_editmode_calc_active_center(struct Object *obedit, const bool select_only, float r_center[3]);
 
+
+void ED_object_vpaintmode_enter_ex(
+        const struct EvaluationContext *eval_ctx, struct wmWindowManager *wm,
+        struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
+void ED_object_vpaintmode_enter(struct bContext *C);
+void ED_object_wpaintmode_enter_ex(
+        const struct EvaluationContext *eval_ctx, struct wmWindowManager *wm,
+        struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
+void ED_object_wpaintmode_enter(struct bContext *C);
+
+void ED_object_vpaintmode_exit_ex(struct WorkSpace *workspace, struct Object *ob);
+void ED_object_vpaintmode_exit(struct bContext *C);
+void ED_object_wpaintmode_exit_ex(struct WorkSpace *workspace, struct Object *ob);
+void ED_object_wpaintmode_exit(struct bContext *C);
+
 void ED_object_location_from_view(struct bContext *C, float loc[3]);
 void ED_object_rotation_from_view(struct bContext *C, float rot[3], const char align_axis);
 void ED_object_base_init_transform(struct bContext *C, struct Base *base, const float loc[3], const float rot[3]);
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 4fc6ba40fdc..8ce0af068d6 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -1035,75 +1035,200 @@ static void vertex_paint_init_session_data(
 
 }
 
-/* *************** set wpaint operator ****************** */
+/* -------------------------------------------------------------------- */
+/** \name Enter Vertex/Weight Paint Mode
+ * \{ */
 
-/**
- * \note Keep in sync with #vpaint_mode_toggle_exec
- */
-static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
+static void ed_vwpaintmode_enter_generic(
+        const EvaluationContext *eval_ctx,
+        wmWindowManager *wm,
+        WorkSpace *workspace, Scene *scene,
+        Object *ob, const eObjectMode mode_flag)
+{
+	workspace->object_mode |= mode_flag;
+	Mesh *me = BKE_mesh_from_object(ob);
+
+	if (mode_flag == OB_MODE_VERTEX_PAINT) {
+		const ePaintMode paint_mode = ePaintVertex;
+		ED_mesh_color_ensure(me, NULL);
+
+		if (scene->toolsettings->vpaint == NULL) {
+			scene->toolsettings->vpaint = new_vpaint();
+		}
+
+		Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
+		paint_cursor_start_explicit(paint, wm, vertex_paint_poll);
+		BKE_paint_init(scene, paint_mode, PAINT_CURSOR_VERTEX_PAINT);
+	}
+	else if (mode_flag == OB_MODE_WEIGHT_PAINT) {
+		const  ePaintMode paint_mode = ePaintWeight;
+
+		if (scene->toolsettings->wpaint == NULL) {
+			scene->toolsettings->wpaint = new_vpaint();
+		}
+
+		Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
+		paint_cursor_start_explicit(paint, wm, weight_paint_poll);
+		BKE_paint_init(scene, paint_mode, PAINT_CURSOR_WEIGHT_PAINT);
+
+		/* weight paint specific */
+		ED_mesh_mirror_spatial_table(ob, NULL, NULL, NULL, 's');
+		ED_vgroup_sync_from_pose(ob);
+	}
+	else {
+		BLI_assert(0);
+	}
+
+	/* Create vertex/weight paint mode session data */
+	if (ob->sculpt) {
+		if (ob->sculpt->cache) {
+			sculpt_cache_free(ob->sculpt->cache);
+			ob->sculpt->cache = NULL;
+		}
+		BKE_sculptsession_free(ob);
+	}
+
+	vertex_paint_init_session(eval_ctx, scene, ob);
+}
+
+void ED_object_vpaintmode_enter_ex(
+        const EvaluationContext *eval_ctx, wmWindowManager *wm,
+        WorkSpace *workspace, Scene *scene, Object *ob)
 {
+	ed_vwpaintmode_enter_generic(
+	        eval_ctx, wm, workspace, scene, ob, OB_MODE_VERTEX_PAINT);
+}
+void ED_object_vpaintmode_enter(struct bContext *C)
+{
+	EvaluationContext eval_ctx;
+	CTX_data_eval_ctx(C, &eval_ctx);
+	wmWindowManager *wm = CTX_wm_manager(C);
 	WorkSpace *workspace = CTX_wm_workspace(C);
+	Scene *scene = CTX_data_scene(C);
 	Object *ob = CTX_data_active_object(C);
-	const int mode_flag = OB_MODE_WEIGHT_PAINT;
-	const bool is_mode_set = (workspace->object_mode & mode_flag) != 0;
+	ED_object_vpaintmode_enter_ex(&eval_ctx, wm, workspace, scene, ob);
+}
+
+void ED_object_wpaintmode_enter_ex(
+        const EvaluationContext *eval_ctx, wmWindowManager *wm,
+        WorkSpace *workspace, Scene *scene, Object *ob)
+{
+	ed_vwpaintmode_enter_generic(
+	        eval_ctx, wm, workspace, scene, ob, OB_MODE_WEIGHT_PAINT);
+}
+void ED_object_wpaintmode_enter(struct bContext *C)
+{
+	EvaluationContext eval_ctx;
+	CTX_data_eval_ctx(C, &eval_ctx);
+	wmWindowManager *wm = CTX_wm_manager(C);
+	WorkSpace *workspace = CTX_wm_workspace(C);
 	Scene *scene = CTX_data_scene(C);
-	VPaint *wp = scene->toolsettings->wpaint;
-	Mesh *me;
+	Object *ob = CTX_data_active_object(C);
+	ED_object_wpaintmode_enter_ex(&eval_ctx, wm, workspace, scene, ob);
+}
 
-	if (!is_mode_set) {
-		if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
-			return OPERATOR_CANCELLED;
-		}
-	}
+/** \} */
 
-	me = BKE_mesh_from_object(ob);
+/* -------------------------------------------------------------------- */
+/** \name Exit Vertex/Weight Paint Mode
+ * \{ */
 
-	if (workspace->object_mode & mode_flag) {
-		workspace->object_mode &= ~mode_flag;
+static void ed_vwpaintmode_exit_generic(
+        WorkSpace *workspace,
+        Object *ob, const eObjectMode mode_flag)
+{
+	Mesh *me = BKE_mesh_from_object(ob);
+	workspace->object_mode &= ~mode_flag;
 
+	if (mode_flag == OB_MODE_VERTEX_PAINT) {
+		if (me->editflag & ME_EDIT_PAINT_FACE_SEL) {
+			BKE_mesh_flush_select_from_polys(me);
+		}
+		else if (me->editflag & ME_EDIT_PAINT_VERT_SEL) {
+			BKE_mesh_flush_select_from_verts(me);
+		}
+	}
+	else if (mode_flag == OB_MODE_WEIGHT_PAINT) {
 		if (me->editflag & ME_EDIT_PAINT_VERT_SEL) {
 			BKE_mesh_flush_select_from_verts(me);
 		}
 		else if (me->editflag & ME_EDIT_PAINT_FACE_SEL) {
 			BKE_mesh_flush_select_from_polys(me);
 		}
+	}
+	else {
+		BLI_assert(0);
+	}
 
-		/* weight paint specific */
-		ED_mesh_mirror_spatial_table(NULL, NULL, NULL, NULL, 'e');
-		ED_mesh_mirror_topo_table(NULL, NULL, 'e');
+	/* If the cache is not released by a cancel or a done, free it now. */
+	if (ob->sculpt->cache) {
+		sculpt_cache_free(ob->sculpt->cache);
+		ob->sculpt->cache = NULL;
+	}
 
-		/* If the cache is not released by a cancel or a done, free it now. */
-		if (ob->sculpt->cache) {
-			sculpt_cache_free(ob->sculpt->cache);
-			ob->sculpt->cache = NULL;
-		}
+	BKE_sculptsession_free(ob);
 
-		BKE_sculptsession_free(ob);
+	paint_cursor_delete_textures();
 
-		paint_cursor_delete_textures();
+	if (mode_flag == OB_MODE_WEIGHT_PAINT) {
+		ED_mesh_mirror_spatial_table(NULL, NULL, NULL, NULL, 'e');
+		ED_mesh_mirror_topo_table(NULL, NULL, 'e');
 	}
-	else {
-		workspace->object_mode |= mode_flag;
+}
 
-		if (wp == NULL)
-			wp = scene->toolsettings->wpaint = new_vpaint();
+void ED_object_vpaintmode_exit_ex(WorkSpace *workspace, Object *ob)
+{
+	ed_vwpaintmode_exit_generic(workspace, ob, OB_MODE_VERTEX_PAINT);
+}
+void ED_object_vpaintmode_exit(struct bContext *C)
+{
+	WorkSpace *workspace = CTX_wm_workspace(C);
+	Object *ob = CTX_data_active_object(C);
+	ED_object_vpaintmode_exit_ex(workspace, ob);
+}
 
-		paint_cursor_start(C, weight_paint_poll);
+void ED_object_wpaintmode_exit_ex(WorkSpace *workspace, Object *ob)
+{
+	ed_vwpaintmode_exit_generic(workspace, ob, OB_MODE_WEIGHT_PAINT);
+}
+void ED_object_wpaintmode_exit(struct bContext *C)
+{
+	WorkSpace *workspace = CTX_wm_workspace(C);
+	Object *ob = CTX_data_active_object(C);
+	ED_object_wpaintmode_exit_ex(workspace, ob);
+}
 
-		BKE_paint_init(scene, ePaintWeight, PAINT_CURSOR_WEIGHT_PAINT);
+/** \} */
 
-		/* weight paint specific */
-		ED_mesh_mirror_spatial_table(ob, NULL, NULL, NULL, 's');
-		ED_vgroup_sync_from_pose(ob);
+/* *************** set wpaint operator ****************** */
 
-		/* Create vertex/weight paint mode session data */
-		if (ob->sculpt) {
-			BKE_sculptsession_free(ob);
+/**
+ * \note Keep in sync with #vpaint_mode_toggle_exec
+ */
+static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
+{
+	WorkSpace *workspace = CTX_wm_workspace(C);
+	Object *ob = CTX_data_active_object(C);
+	const int mode_flag = OB_MODE_WEIGHT_PAINT;
+	const bool is_mode_set = (workspace->object_mode & mode_flag) != 0;
+	Scene *scene = CTX_data_scene(C);
+
+	if (!is_mode_set) {
+		if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
+			return OPERATOR_CANCELLED;
 		}
+	}
 
+	Mesh *me = BKE_mesh_from_object(ob);
+
+	if (is_mode_set) {
+		ED_object_wpaintmode_exit_ex(workspace, ob);
+	}
+	else {
 		EvaluationContext eval_ctx;
 		CTX_data_eval_ctx(C, &eval_ctx);
-		vertex_paint_init_session(&eval_ctx, scene, ob);
+		wmWindowManager *wm = CTX_wm_manager(C);
+		ED_object_wpaintmode_enter_ex(&eval_ctx, wm, workspace, scene, ob);
 	}
 
 	BKE_mesh_batch_cache_dirty(ob->data, BKE_MESH_BATCH_DIRTY_ALL);
@@ -2225,8 +2350,6 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
 	const int mode_flag = OB_MODE_VERTEX_PAINT;
 	const bool is_mode_set = (workspace->object_mode & mode_flag) != 0;
 	Scene *scene = CTX_data_scene(C);
-	VPaint *vp = scene->toolsettings->vpaint;
-	Mesh *me;
 
 	if (!is_mode_set) {
 		if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
@@ -2234,53 +2357,17 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
 		}
 	}
 
-	me = BKE_mesh_from_object(ob);
+	Mesh *me = BKE_mesh_from_object(ob);
 
 	/* toggle: end vpaint */
 	if (is_mode_set) {
-		workspace->object_mode &= ~mode_flag;
-
-		if (me->editflag & ME_EDIT_PAINT_FACE_SEL) {
-			BKE_mesh_flush_select_from_polys(me);
-		}
-		else if (me->editflag & ME_EDIT_PAINT_VERT_SEL) {
-			BKE_mesh_flush_select_from_verts(me);
-		}
-
-		

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list