[Bf-blender-cvs] [59b35c39279] temp-workspace-object-mode-removal: Check multiple modes with brush update

Campbell Barton noreply at git.blender.org
Wed Feb 7 05:26:43 CET 2018


Commit: 59b35c39279d8121976071baf98b48213243254b
Author: Campbell Barton
Date:   Wed Feb 7 15:26:19 2018 +1100
Branches: temp-workspace-object-mode-removal
https://developer.blender.org/rB59b35c39279d8121976071baf98b48213243254b

Check multiple modes with brush update

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

M	source/blender/blenkernel/intern/paint.c

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

diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 507c43bf251..5a267f97d03 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -75,31 +75,67 @@ const char PAINT_CURSOR_TEXTURE_PAINT[3] = {255, 255, 255};
 
 static eOverlayControlFlags overlay_flags = 0;
 
+/* 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: enumerate multiple modes */
-	Paint *p = BKE_paint_get_active(scene, view_layer, 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, eObjectMode object_mode)
 {
-	/* TODO/OBMODE: enumerate multiple modes */
-	Paint *p = BKE_paint_get_active(scene, view_layer, 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)



More information about the Bf-blender-cvs mailing list