[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51104] trunk/blender/source/blender: add mball_foreachScreenElem() and use for lasso & circle selection, also utility metaball functions to (de)select all.

Campbell Barton ideasman42 at gmail.com
Sat Oct 6 05:02:20 CEST 2012


Revision: 51104
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51104
Author:   campbellbarton
Date:     2012-10-06 03:02:14 +0000 (Sat, 06 Oct 2012)
Log Message:
-----------
add mball_foreachScreenElem() and use for lasso & circle selection, also utility metaball functions to (de)select all.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mball.h
    trunk/blender/source/blender/blenkernel/intern/mball.c
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/metaball/mball_edit.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_select.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mball.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mball.h	2012-10-06 01:30:49 UTC (rev 51103)
+++ trunk/blender/source/blender/blenkernel/BKE_mball.h	2012-10-06 03:02:14 UTC (rev 51104)
@@ -63,4 +63,8 @@
 
 struct MetaElem *BKE_mball_element_add(struct MetaBall *mb, const int type);
 
+void BKE_mball_select_all(struct MetaBall *mb);
+void BKE_mball_deselect_all(struct MetaBall *mb);
+void BKE_mball_select_swap(struct MetaBall *mb);
+
 #endif

Modified: trunk/blender/source/blender/blenkernel/intern/mball.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mball.c	2012-10-06 01:30:49 UTC (rev 51103)
+++ trunk/blender/source/blender/blenkernel/intern/mball.c	2012-10-06 03:02:14 UTC (rev 51104)
@@ -2396,3 +2396,32 @@
 		add_v3_v3(&ml->x, offset);
 	}
 }
+
+/* *** select funcs *** */
+void BKE_mball_select_all(struct MetaBall *mb)
+{
+	MetaElem *ml;
+
+	for (ml = mb->editelems->first; ml; ml = ml->next) {
+		ml->flag |= SELECT;
+	}
+}
+
+void BKE_mball_deselect_all(MetaBall *mb)
+{
+	MetaElem *ml;
+
+	for (ml = mb->editelems->first; ml; ml = ml->next) {
+		ml->flag &= ~SELECT;
+	}
+}
+
+void BKE_mball_select_swap(struct MetaBall *mb)
+{
+	MetaElem *ml;
+
+	for (ml = mb->editelems->first; ml; ml = ml->next) {
+		ml->flag ^= SELECT;
+	}
+}
+

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2012-10-06 01:30:49 UTC (rev 51103)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2012-10-06 03:02:14 UTC (rev 51104)
@@ -44,6 +44,7 @@
 struct ImBuf;
 struct MVert;
 struct Main;
+struct MetaElem;
 struct Nurb;
 struct Nurb;
 struct Object;
@@ -170,6 +171,7 @@
 void mesh_foreachScreenEdge(struct ViewContext *vc, void (*func)(void *userData, struct BMEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, eV3DClipTest clipVerts);
 void mesh_foreachScreenFace(struct ViewContext *vc, void (*func)(void *userData, struct BMFace *efa, int x, int y, int index), void *userData);
 void nurbs_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct Nurb *nu, struct BPoint *bp, struct BezTriple *bezt, int beztindex, int x, int y), void *userData);
+void mball_foreachScreenElem(struct ViewContext *vc, void (*func)(void *userData, struct MetaElem *ml, int x, int y), void *userData);
 void lattice_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct BPoint *bp, int x, int y), void *userData);
 void armature_foreachScreenBone(struct ViewContext *vc, void (*func)(void *userData, struct EditBone *ebone, int x0, int y0, int x1, int y1), void *userData);
 void pose_foreachScreenBone(struct ViewContext *vc, void (*func)(void *userData, struct bPoseChannel *pchan, int x0, int y0, int x1, int y1), void *userData);

Modified: trunk/blender/source/blender/editors/metaball/mball_edit.c
===================================================================
--- trunk/blender/source/blender/editors/metaball/mball_edit.c	2012-10-06 01:30:49 UTC (rev 51103)
+++ trunk/blender/source/blender/editors/metaball/mball_edit.c	2012-10-06 03:02:14 UTC (rev 51104)
@@ -129,37 +129,33 @@
 	MetaElem *ml;
 	int action = RNA_enum_get(op->ptr, "action");
 
-	ml = mb->editelems->first;
-	if (ml) {
-		if (action == SEL_TOGGLE) {
-			action = SEL_SELECT;
-			while (ml) {
-				if (ml->flag & SELECT) {
-					action = SEL_DESELECT;
-					break;
-				}
-				ml = ml->next;
-			}
-		}
+	if (mb->editelems->first == NULL)
+		return OPERATOR_CANCELLED;
 
-		ml = mb->editelems->first;
-		while (ml) {
-			switch (action) {
-				case SEL_SELECT:
-					ml->flag |= SELECT;
-					break;
-				case SEL_DESELECT:
-					ml->flag &= ~SELECT;
-					break;
-				case SEL_INVERT:
-					ml->flag ^= SELECT;
-					break;
+	if (action == SEL_TOGGLE) {
+		action = SEL_SELECT;
+		for (ml = mb->editelems->first; ml; ml = ml->next) {
+			if (ml->flag & SELECT) {
+				action = SEL_DESELECT;
+				break;
 			}
-			ml = ml->next;
 		}
-		WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
 	}
 
+	switch (action) {
+		case SEL_SELECT:
+			BKE_mball_select_all(mb);
+			break;
+		case SEL_DESELECT:
+			BKE_mball_deselect_all(mb);
+			break;
+		case SEL_INVERT:
+			BKE_mball_select_swap(mb);
+			break;
+	}
+
+	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
+
 	return OPERATOR_FINISHED;
 }
 
@@ -421,7 +417,7 @@
 	Object *obedit = CTX_data_edit_object(C);
 	ViewContext vc;
 	MetaBall *mb = (MetaBall *)obedit->data;
-	MetaElem *ml, *act = NULL;
+	MetaElem *ml, *ml_act = NULL;
 	int a, hits;
 	unsigned int buffer[4 * MAXPICKBUF];
 	rcti rect;
@@ -451,14 +447,14 @@
 				/* index converted for gl stuff */
 				if (ml->selcol1 == buffer[4 * a + 3]) {
 					ml->flag |= MB_SCALE_RAD;
-					act = ml;
+					ml_act = ml;
 				}
 				if (ml->selcol2 == buffer[4 * a + 3]) {
 					ml->flag &= ~MB_SCALE_RAD;
-					act = ml;
+					ml_act = ml;
 				}
 			}
-			if (act) break;
+			if (ml_act) break;
 			ml = ml->next;
 			if (ml == NULL) ml = mb->editelems->first;
 			if (ml == startelem) break;
@@ -466,31 +462,28 @@
 		
 		/* When some metaelem was found, then it is necessary to select or
 		 * deselect it. */
-		if (act) {
+		if (ml_act) {
 			if (extend) {
-				act->flag |= SELECT;
+				ml_act->flag |= SELECT;
 			}
 			else if (deselect) {
-				act->flag &= ~SELECT;
+				ml_act->flag &= ~SELECT;
 			}
 			else if (toggle) {
-				if (act->flag & SELECT)
-					act->flag &= ~SELECT;
+				if (ml_act->flag & SELECT)
+					ml_act->flag &= ~SELECT;
 				else
-					act->flag |= SELECT;
+					ml_act->flag |= SELECT;
 			}
 			else {
 				/* Deselect all existing metaelems */
-				ml = mb->editelems->first;
-				while (ml) {
-					ml->flag &= ~SELECT;
-					ml = ml->next;
-				}
+				BKE_mball_deselect_all(mb);
+
 				/* Select only metaelem clicked on */
-				act->flag |= SELECT;
+				ml_act->flag |= SELECT;
 			}
 			
-			mb->lastelem = act;
+			mb->lastelem = ml_act;
 			
 			WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
 

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2012-10-06 01:30:49 UTC (rev 51103)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2012-10-06 03:02:14 UTC (rev 51104)
@@ -2221,6 +2221,25 @@
 }
 
 /* ED_view3d_init_mats_rv3d must be called first */
+void mball_foreachScreenElem(
+        struct ViewContext *vc,
+        void (*func)(void *userData, struct MetaElem *ml, int x, int y),
+        void *userData)
+{
+	MetaBall *mb = (MetaBall *)vc->obedit->data;
+	MetaElem *ml;
+
+	for (ml = mb->editelems->first; ml; ml = ml->next) {
+		int screen_co[2];
+		if (ED_view3d_project_int_object(vc->ar, &ml->x, screen_co,
+		                                 V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_SUCCESS)
+		{
+			func(userData, ml, screen_co[0], screen_co[1]);
+		}
+	}
+}
+
+/* ED_view3d_init_mats_rv3d must be called first */
 void armature_foreachScreenBone(
         struct ViewContext *vc,
         void (*func)(void *userData, struct EditBone *ebone, int x0, int y0, int x1, int y1),

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_select.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_select.c	2012-10-06 01:30:49 UTC (rev 51103)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_select.c	2012-10-06 03:02:14 UTC (rev 51104)
@@ -61,13 +61,14 @@
 #include "IMB_imbuf.h"
 #include "BKE_global.h"
 
+#include "BKE_armature.h"
 #include "BKE_context.h"
-#include "BKE_paint.h"
-#include "BKE_armature.h"
 #include "BKE_depsgraph.h"
-#include "BKE_tessmesh.h"
+#include "BKE_mball.h"
 #include "BKE_movieclip.h"
 #include "BKE_object.h"
+#include "BKE_paint.h"
+#include "BKE_tessmesh.h"
 #include "BKE_tracking.h"
 
 
@@ -678,32 +679,34 @@
 	}
 }
 
+static void do_lasso_select_mball__doSelectElem(void *userData, struct MetaElem *ml, int x, int y)
+{
+	LassoSelectUserData *data = userData;
 
+	if (BLI_rcti_isect_pt(data->rect, x, y) &&
+	    BLI_lasso_is_point_inside(data->mcords, data->moves, x, y, INT_MAX)) {
+		if (data->select) ml->flag |=  SELECT;
+		else              ml->flag &= ~SELECT;
+		data->is_change = TRUE;
+	}
+}
 static void do_lasso_select_meta(ViewContext *vc, const int mcords[][2], short moves, short extend, short select)
 {
+	LassoSelectUserData data;
+	rcti rect;
+
 	MetaBall *mb = (MetaBall *)vc->obedit->data;
-	MetaElem *ml;
 
-	if (extend == 0 && select) {
-		/* XXX, make an editor function as is done elsewhere */
-		for (ml = mb->editelems->first; ml; ml = ml->next) {
-			ml->flag &= ~SELECT;
-		}
-	}
+	if (extend == 0 && select)
+		 BKE_mball_deselect_all(mb);
 
+	view3d_userdata_lassoselect_init(&data, vc, &rect, mcords, moves, select);
+
 	ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
 
-	for (ml = mb->editelems->first; ml; ml = ml->next) {
-		int screen_co[2];
-		if (ED_view3d_project_int_object(vc->ar, &ml->x, screen_co,
-		                                 V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_SUCCESS)
-		{
-			if (BLI_lasso_is_point_inside(mcords, moves, screen_co[0], screen_co[1], INT_MAX)) {
-				if (select) ml->flag |=  SELECT;
-				else        ml->flag &= ~SELECT;
-			}
-		}
-	}
+	BLI_lasso_boundbox(&rect, mcords, moves);
+
+	mball_foreachScreenElem(vc, do_lasso_select_mball__doSelectElem, &data);
 }
 
 static int do_paintvert_box_select(ViewContext *vc, rcti *rect, int select, int extend)
@@ -1792,11 +1795,8 @@
 
 	hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, rect);
 
-	if (extend == 0 && select) {
-		for (ml = mb->editelems->first; ml; ml = ml->next) {
-			ml->flag &= ~SELECT;
-		}
-	}
+	if (extend == 0 && select)
+		BKE_mball_deselect_all(mb);
 	
 	for (ml = mb->editelems->first; ml; ml = ml->next) {
 		for (a = 0; a < hits; a++) {
@@ -2577,27 +2577,27 @@
 	}
 }
 
+static void do_circle_select_mball__doSelectElem(void *userData, struct MetaElem *ml, int x, int y)
+{
+	CircleSelectUserData *data = userData;
+	const float delta[2] = {(float)(x - data->mval[0]),
+	                        (float)(y - data->mval[1])};
+
+	if (len_squared_v2(delta) <= data->radius_squared) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list