Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-02-16 12:24:38 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-02-16 16:01:25 +0300
commitc28dea5e241a993ae9f3ca9f5208ad1e5010da63 (patch)
tree4dfb01fd21e8cd86ca709f1675b922b48957f5c3 /source/blender/editors/sculpt_paint
parent31f47f44dee2f1625c584e73e3e7f35e0157dd2a (diff)
Vertex Paint: expose exist paint-mode to API
Diffstat (limited to 'source/blender/editors/sculpt_paint')
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c251
1 files changed, 169 insertions, 82 deletions
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);
- }
-
- /* 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);
-
- paint_cursor_delete_textures();
+ ED_object_vpaintmode_exit_ex(workspace, ob);
}
else {
- workspace->object_mode |= mode_flag;
-
- ED_mesh_color_ensure(me, NULL);
-
- if (vp == NULL)
- vp = scene->toolsettings->vpaint = new_vpaint();
-
- paint_cursor_start(C, vertex_paint_poll);
-
- BKE_paint_init(scene, ePaintVertex, PAINT_CURSOR_VERTEX_PAINT);
-
- /* 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);
- }
-
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_vpaintmode_enter_ex(&eval_ctx, wm, workspace, scene, ob);
}
BKE_mesh_batch_cache_dirty(ob->data, BKE_MESH_BATCH_DIRTY_ALL);