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-08 13:14:26 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-02-08 13:14:26 +0300
commit345c6298e995ea618c34282ba6d7ab5af032f191 (patch)
treef4fbc4798e17d0f19efc28b51a41425d0c552be8 /source/blender/blenkernel/intern/paint.c
parent14a19fed788af0cf3695eb5def92510841056e08 (diff)
Object Mode: move to workspace struct
- Read-only access can often use EvaluationContext.object_mode - Write access to go to WorkSpace.object_mode. - Some TODO's remain (marked as "TODO/OBMODE") - Add-ons will need updating (context.active_object.mode -> context.workspace.object_mode) - There will be small/medium issues that still need resolving this does work on a basic level though. See D3037
Diffstat (limited to 'source/blender/blenkernel/intern/paint.c')
-rw-r--r--source/blender/blenkernel/intern/paint.c80
1 files changed, 59 insertions, 21 deletions
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 5ba4face835..5a267f97d03 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -75,29 +75,67 @@ const char PAINT_CURSOR_TEXTURE_PAINT[3] = {255, 255, 255};
static eOverlayControlFlags overlay_flags = 0;
-void BKE_paint_invalidate_overlay_tex(Scene *scene, ViewLayer *view_layer, const Tex *tex)
+/* Keep in sync with 'BKE_paint_get_active' */
+#define OB_MODE_HAS_PAINT_STRUCT(SEP) \
+ OB_MODE_SCULPT SEP \
+ OB_MODE_VERTEX_PAINT SEP \
+ OB_MODE_WEIGHT_PAINT SEP \
+ OB_MODE_TEXTURE_PAINT SEP \
+ OB_MODE_EDIT
+
+#define COMMA ,
+static const eObjectMode ob_mode_has_paint_struct = OB_MODE_HAS_PAINT_STRUCT(|);
+static const eObjectMode ob_mode_has_paint_struct_array[] = {OB_MODE_HAS_PAINT_STRUCT(COMMA)};
+#undef COMMA
+
+#define FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p) \
+{ \
+ eObjectMode object_mode_test = object_mode & ob_mode_has_paint_struct; \
+ for (uint _i = 0; _i < ARRAY_SIZE(ob_mode_has_paint_struct_array) && object_mode_test; _i++) { \
+ eObjectMode object_mode_single = ob_mode_has_paint_struct_array[_i]; \
+ if (object_mode_test & object_mode_single) { \
+ object_mode_test &= ~object_mode_single; \
+ Paint *p = BKE_paint_get_active(scene, view_layer, object_mode_single); \
+ {
+
+#define FOREACH_OB_MODE_PAINT_ITER_END \
+ } \
+ } \
+ } \
+} ((void)0)
+
+void BKE_paint_invalidate_overlay_tex(
+ Scene *scene, ViewLayer *view_layer, const Tex *tex, eObjectMode object_mode)
{
- /* TODO/OBMODE (we should combine all) */
- Paint *p = BKE_paint_get_active(scene, view_layer, G.main->eval_ctx->object_mode);
- Brush *br = p->brush;
-
- if (!br)
- return;
-
- if (br->mtex.tex == tex)
- overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_PRIMARY;
- if (br->mask_mtex.tex == tex)
- overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_SECONDARY;
+ FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p)
+ {
+ Brush *br = p->brush;
+ if (br) {
+ if (br->mtex.tex == tex) {
+ overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_PRIMARY;
+ }
+ if (br->mask_mtex.tex == tex) {
+ overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_SECONDARY;
+ }
+ }
+ }
+ FOREACH_OB_MODE_PAINT_ITER_END;
}
-void BKE_paint_invalidate_cursor_overlay(Scene *scene, ViewLayer *view_layer, CurveMapping *curve)
+void BKE_paint_invalidate_cursor_overlay(
+ Scene *scene, ViewLayer *view_layer, CurveMapping *curve, eObjectMode object_mode)
{
- /* TODO/OBMODE (we should combine all) */
- Paint *p = BKE_paint_get_active(scene, view_layer, G.main->eval_ctx->object_mode);
- Brush *br = p->brush;
-
- if (br && br->curve == curve)
- overlay_flags |= PAINT_INVALID_OVERLAY_CURVE;
+ FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p)
+ {
+ Brush *br = p->brush;
+ if (br) {
+ if (br->curve == curve) {
+ overlay_flags |= PAINT_INVALID_OVERLAY_CURVE;
+ break;
+ }
+ }
+ }
+ FOREACH_OB_MODE_PAINT_ITER_END;
}
void BKE_paint_invalidate_overlay_all(void)
@@ -794,7 +832,7 @@ void BKE_sculptsession_free(Object *ob)
BM_log_free(ss->bm_log);
if (dm && dm->getPBVH)
- dm->getPBVH(NULL, dm); /* signal to clear */
+ dm->getPBVH(NULL, dm, OB_MODE_OBJECT); /* signal to clear */
if (ss->texcache)
MEM_freeN(ss->texcache);
@@ -949,7 +987,7 @@ void BKE_sculpt_update_mesh_elements(
ss->vmask = CustomData_get_layer(&me->vdata, CD_PAINT_MASK);
}
- ss->pbvh = dm->getPBVH(ob, dm);
+ ss->pbvh = dm->getPBVH(ob, dm, eval_ctx->object_mode);
ss->pmap = (need_pmap && dm->getPolyMap) ? dm->getPolyMap(ob, dm) : NULL;
pbvh_show_diffuse_color_set(ss->pbvh, ss->show_diffuse_color);