[Bf-blender-cvs] [f897d953727] blender2.8: EditMBall: multi-object select random

Campbell Barton noreply at git.blender.org
Sat May 12 22:17:32 CEST 2018


Commit: f897d953727074c6916c3a15b21a072cbc5ffa8a
Author: Campbell Barton
Date:   Sat May 12 22:16:09 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBf897d953727074c6916c3a15b21a072cbc5ffa8a

EditMBall: multi-object select random

D3356 by @Quetzal

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

M	source/blender/blenkernel/BKE_mball.h
M	source/blender/blenkernel/intern/mball.c
M	source/blender/editors/metaball/mball_edit.c

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

diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index a486e8319c6..41f04c09e69 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -47,6 +47,8 @@ struct MetaBall *BKE_mball_copy(struct Main *bmain, const struct MetaBall *mb);
 
 void BKE_mball_make_local(struct Main *bmain, struct MetaBall *mb, const bool lib_local);
 
+bool BKE_mball_is_any_selected(const struct MetaBall *mb);
+bool BKE_mball_is_any_unselected(const struct MetaBall *mb);
 bool BKE_mball_is_basis_for(struct Object *ob1, struct Object *ob2);
 bool BKE_mball_is_basis(struct Object *ob);
 struct Object *BKE_mball_basis_find(struct Scene *scene, struct Object *ob);
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index d7fb2d0a17b..7fc289f8bf2 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -314,6 +314,26 @@ bool BKE_mball_is_basis_for(Object *ob1, Object *ob2)
 	}
 }
 
+bool BKE_mball_is_any_selected(const MetaBall *mb)
+{
+	for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) {
+		if(ml->flag & SELECT) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool BKE_mball_is_any_unselected(const MetaBall *mb)
+{
+	for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) {
+		if((ml->flag & SELECT) == 0) {
+			return true;
+		}
+	}
+	return false;
+}
+
 /* \brief copy some properties from object to other metaball object with same base name
  *
  * When some properties (wiresize, threshold, update flags) of metaball are changed, then this properties
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 0aea5cb5480..0835618043d 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -49,6 +49,7 @@
 
 #include "BKE_context.h"
 #include "BKE_mball.h"
+#include "BKE_layer.h"
 
 #include "DEG_depsgraph.h"
 
@@ -367,32 +368,47 @@ void MBALL_OT_select_similar(wmOperatorType *ot)
 /* Random metaball selection */
 static int select_random_metaelems_exec(bContext *C, wmOperator *op)
 {
-	Object *obedit = CTX_data_edit_object(C);
-	MetaBall *mb = (MetaBall *)obedit->data;
-	MetaElem *ml;
 	const bool select = (RNA_enum_get(op->ptr, "action") == SEL_SELECT);
 	const float randfac = RNA_float_get(op->ptr, "percent") / 100.0f;
 	const int seed = WM_operator_properties_select_random_seed_increment_get(op);
 	
-	RNG *rng = BLI_rng_new_srandom(seed);
+	ViewLayer *view_layer = CTX_data_view_layer(C);
+	uint objects_len = 0;
+	Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+	for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *obedit = objects[ob_index];
+		MetaBall *mb = (MetaBall *)obedit->data;
+		if (!BKE_mball_is_any_unselected(mb)) {
+			continue;
+		}
+		int seed_iter = seed;
 
-	for (ml = mb->editelems->first; ml; ml = ml->next) {
-		if (BLI_rng_get_float(rng) < randfac) {
-			if (select)
-				ml->flag |= SELECT;
-			else
-				ml->flag &= ~SELECT;
+		/* This gives a consistent result regardless of object order. */
+		if (ob_index) {
+			seed_iter += BLI_ghashutil_strhash_p(obedit->id.name);
 		}
-	}
 
-	BLI_rng_free(rng);
+		RNG *rng = BLI_rng_new_srandom(seed_iter);
 
-	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
-	
+		for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) {
+			if (BLI_rng_get_float(rng) < randfac) {
+				if (select) {
+					ml->flag |= SELECT;
+				}
+				else {
+					ml->flag &= ~SELECT;
+				}
+			}
+		}
+
+		BLI_rng_free(rng);
+
+		WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
+	}
+	MEM_freeN(objects);
 	return OPERATOR_FINISHED;
 }
 
-
 void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot)
 {
 	/* identifiers */



More information about the Bf-blender-cvs mailing list