[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10924] trunk/blender/source/blender: Curve Selection Tool Refactor:

Juho Vepsäläinen bebraw at gmail.com
Thu Jun 14 16:36:27 CEST 2007


Revision: 10924
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=10924
Author:   bebraw
Date:     2007-06-14 16:36:27 +0200 (Thu, 14 Jun 2007)

Log Message:
-----------
Curve Selection Tool Refactor:
This commit refactors curve selection system to use certain curve selections
functions that encapsulate setting of selection flags. New function to select
adjacent control points was introduced too. Refactoring made it possible to 
simplify certain existing selection functions quite a bit. 
New functionality was delivered as well. Select more/less works now with NURBS 
as expected. Also two new curve selection functions were added: Select Every Nth 
and Select Random. 

See http://wiki.blender.org/index.php/BlenderDev/Curve_Selection_Tools for 
further information. 

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/include/BDR_editcurve.h
    trunk/blender/source/blender/include/blendef.h
    trunk/blender/source/blender/src/editcurve.c
    trunk/blender/source/blender/src/header_view3d.c
    trunk/blender/source/blender/src/space.c
    trunk/blender/source/blender/src/toolbox.c

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2007-06-14 12:29:56 UTC (rev 10923)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2007-06-14 14:36:27 UTC (rev 10924)
@@ -55,6 +55,7 @@
 void test_curve_type( struct Object *ob);
 void tex_space_curve( struct Curve *cu);
 int count_curveverts( struct ListBase *nurb);
+int count_curveverts_without_handles( struct ListBase *nurb);
 void freeNurb( struct Nurb *nu);
 void freeNurblist( struct ListBase *lb);
 struct Nurb *duplicateNurb( struct Nurb *nu);

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2007-06-14 12:29:56 UTC (rev 10923)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2007-06-14 14:36:27 UTC (rev 10924)
@@ -324,8 +324,21 @@
 	return tot;
 }
 
+int count_curveverts_without_handles(ListBase *nurb)
+{
+	Nurb *nu;
+	int tot=0;
+	
+	nu= nurb->first;
+	while(nu) {
+		if(nu->bezt) tot+= nu->pntsu;
+		else if(nu->bp) tot+= nu->pntsu*nu->pntsv;
+		
+		nu= nu->next;
+	}
+	return tot;
+}
 
-
 /* **************** NURBS ROUTINES ******************** */
 
 void freeNurb(Nurb *nu)

Modified: trunk/blender/source/blender/include/BDR_editcurve.h
===================================================================
--- trunk/blender/source/blender/include/BDR_editcurve.h	2007-06-14 12:29:56 UTC (rev 10923)
+++ trunk/blender/source/blender/include/BDR_editcurve.h	2007-06-14 14:36:27 UTC (rev 10924)
@@ -78,11 +78,13 @@
 void makecyclicNurb(void);
 void selectconnected_nurb(void);
 void selectrow_nurb(void);
-void selectends_nurb(int selFirst);
+void selectend_nurb(short selfirst, short doswap, short selstatus);
 void select_more_nurb(void);
 void select_less_nurb(void);
 void select_next_nurb(void);
 void select_prev_nurb(void);
+void select_random_nurb(void);
+void select_every_nth_nurb(void);
 void adduplicate_nurb(void);
 void delNurb(void);
 void nurb_set_smooth(short event);
@@ -98,4 +100,3 @@
 extern void undo_push_curve(char *name);
 
 #endif  /*  BDR_EDITCURVE_H */
-

Modified: trunk/blender/source/blender/include/blendef.h
===================================================================
--- trunk/blender/source/blender/include/blendef.h	2007-06-14 12:29:56 UTC (rev 10923)
+++ trunk/blender/source/blender/include/blendef.h	2007-06-14 14:36:27 UTC (rev 10924)
@@ -87,14 +87,17 @@
 #endif
 
 #define SELECT			1
+#define HIDDEN			1
+#define FIRST			1
 #define ACTIVE			2
 /*#ifdef WITH_VERSE*/
 #define VERSE			3
 /*#endif*/
 #define DESELECT		0
 #define NOT_YET			0
+#define VISIBLE			0
+#define LAST			0
 
-
 #define TESTBASE(base)	( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
 #define TESTBASELIB(base)	( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
 #define BASE_SELECTABLE(base)	 ((base->lay & G.vd->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0)

Modified: trunk/blender/source/blender/src/editcurve.c
===================================================================
--- trunk/blender/source/blender/src/editcurve.c	2007-06-14 12:29:56 UTC (rev 10923)
+++ trunk/blender/source/blender/src/editcurve.c	2007-06-14 14:36:27 UTC (rev 10924)
@@ -50,6 +50,7 @@
 #include "BLI_blenlib.h"
 #include "BLI_arithb.h"
 #include "BLI_dynstr.h"
+#include "BLI_rand.h"
 
 #include "DNA_curve_types.h"
 #include "DNA_ipo_types.h"
@@ -111,6 +112,66 @@
 	{0.0,  1.0}, { 1.0,  1.0}, { 1.0, 0.0}, { 1.0, -1.0}
 };
 
+/* ******************* SELECTION FUNCTIONS ********************* */
+
+/* returns 1 in case (de)selection was successful */
+static short select_beztriple(BezTriple *bezt, short selstatus, short flag, short hidden)
+{	
+	if(bezt) {
+		if((bezt->hide==0) || (hidden==1)) {
+			if(selstatus==1) { /* selects */			
+				bezt->f1 |= flag;
+				bezt->f2 |= flag;
+				bezt->f3 |= flag;
+				return 1;			
+			}
+			else { /* deselects */	
+				bezt->f1 &= ~flag; 
+				bezt->f2 &= ~flag; 
+				bezt->f3 &= ~flag; 
+				return 1;
+			}
+		}
+	}
+	
+	return 0;
+}
+
+/* returns 1 in case (de)selection was successful */
+static short select_bpoint(BPoint *bp, short selstatus, short flag, short hidden) 
+{	
+	if(bp) {
+		if((bp->hide==0) || (hidden==1)) {
+			if(selstatus==1) {
+				bp->f1 |= flag;
+				return 1;
+			}
+			else {
+				bp->f1 &= ~flag;
+				return 1;
+			}
+		}
+	}
+
+	return 0;
+}
+
+static short swap_selection_beztriple(BezTriple *bezt)
+{
+	if(bezt->f2 & 1)
+		return select_beztriple(bezt, DESELECT, 1, VISIBLE);
+	else
+		return select_beztriple(bezt, SELECT, 1, VISIBLE);
+}
+
+static short swap_selection_bpoint(BPoint *bp)
+{
+	if(bp->f1 & 1)
+		return select_bpoint(bp, DESELECT, 1, VISIBLE);
+	else
+		return select_bpoint(bp, SELECT, 1, VISIBLE);
+}
+
 short isNurbsel(Nurb *nu)
 {
 	BezTriple *bezt;
@@ -161,6 +222,7 @@
 	return sel;
 }
 
+/* ******************* PRINTS ********************* */
 
 void printknots()
 {
@@ -703,8 +765,8 @@
 				nu->bp= newbp;
 				a= nu->pntsu;
 				while(a--) {
-					bp->f1 |= flag;
-					newbp->f1 &= ~flag;
+					select_bpoint(bp, SELECT, flag, HIDDEN);
+					select_bpoint(newbp, DESELECT, flag, HIDDEN);
 					bp++; 
 					newbp++;
 				}
@@ -723,7 +785,7 @@
 				bp= nu->bp;
 				a= nu->pntsu*nu->pntsv;
 				while(a--) {
-					bp->f1 &= ~flag;
+					select_bpoint(bp, DESELECT, flag, HIDDEN);
 					bp++;
 				}
 
@@ -747,7 +809,7 @@
 
 					a= nu->pntsu;
 					while(a--) {
-						bp->f1 |= flag;
+						select_bpoint(bp, SELECT, flag, HIDDEN);
 						bp++;
 					}
 
@@ -793,7 +855,6 @@
 	return ok;
 }
 
-
 void adduplicateflagNurb(short flag)
 {
 	Nurb *nu, *newnu;
@@ -810,9 +871,7 @@
 				enda= -1;
 				starta= a;
 				while( (bezt->f1 & flag) || (bezt->f2 & flag) || (bezt->f3 & flag) ) {
-					bezt->f1 &= ~flag;
-					bezt->f2 &= ~flag;
-					bezt->f3 &= ~flag;
+					select_beztriple(bezt, DESELECT, flag, HIDDEN);
 					enda=a;
 					if(a>=nu->pntsu-1) break;
 					a++;
@@ -831,9 +890,7 @@
 					b= newnu->pntsu;
 					bezt1= newnu->bezt;
 					while(b--) {
-						bezt1->f1 |= flag;
-						bezt1->f2 |= flag;
-						bezt1->f3 |= flag;
+						select_beztriple(bezt1, SELECT, flag, HIDDEN);
 						bezt1++;
 					}
 
@@ -850,7 +907,7 @@
 				enda= -1;
 				starta= a;
 				while(bp->f1 & flag) {
-					bp->f1 &= ~flag;
+					select_bpoint(bp, DESELECT, flag, HIDDEN);
 					enda= a;
 					if(a>=nu->pntsu-1) break;
 					a++;
@@ -868,7 +925,7 @@
 					b= newnu->pntsu;
 					bp1= newnu->bp;
 					while(b--) {
-						bp1->f1 |= flag;
+						select_bpoint(bp1, SELECT, flag, HIDDEN);
 						bp1++;
 					}
 
@@ -931,7 +988,7 @@
 						for(b=0; b<nu->pntsu; b++, bp1++) {
 							if(bp1->f1 & flag) {
 								memcpy(bp, bp1, sizeof(BPoint));
-								bp1->f1 &= ~flag;
+								select_bpoint(bp1, DESELECT, flag, HIDDEN);
 								bp++;
 							}
 						}
@@ -1026,87 +1083,116 @@
 
 /* **************** EDIT ************************ */
 
-void deselectall_nurb()
+/* next == 1 -> select next 		*/
+/* next == -1 -> select previous 	*/
+/* cont == 1 -> select continuously 	*/
+/* selstatus, inverts behaviour		*/
+static void select_adjacent_cp(short next, short cont, short selstatus)
 {
 	Nurb *nu;
 	BezTriple *bezt;
 	BPoint *bp;
-	int a, b;
-
-	if(!G.vd || !(G.obedit->lay & G.vd->lay))
-		return;
-
-	a= 0;
+	int a;
+	short lastsel= 0, sel=0;
+	
+	if(next==0) return;
+	
 	for(nu= editNurb.first; nu; nu= nu->next) {
-		if((nu->type & 7)==CU_BEZIER) {
-			b= nu->pntsu;
+		lastsel=0;
+		if((nu->type & 7)==CU_BEZIER) {			
+			a= nu->pntsu;
 			bezt= nu->bezt;
-			while(b--) {
-				if(bezt->hide==0) {
-					if(bezt->f1 & 1) {
-						a=1; 
-						break;
-					}
-					if(bezt->f2 & 1) {
-						a=1; 
-						break;
-					}
-					if(bezt->f3 & 1) {
-						a=1; 
-						break;
-					}
+			if(next < 0) bezt= (nu->bezt + (a-1));
+			while(a--) {
+				if(a-abs(next) < 0) break;
+				sel= 0;
+				if((lastsel==0) && (bezt->hide==0) && ((bezt->f2 & 1) || (selstatus==0))) {
+					bezt+=next;
+					if(!(bezt->f2 & 1) || (selstatus==0)) {
+						sel= select_beztriple(bezt, selstatus, 1, VISIBLE);	
+						if((sel==1) && (cont==0)) lastsel= 1;
+					}							
 				}
-				bezt++;
+				else {
+					bezt+=next;
+					lastsel= 0;
+				}
+				/* move around in zigzag way so that we go through each */				
+				bezt-=(next-next/abs(next));				
 			}
 		}
 		else {
-			b= nu->pntsu*nu->pntsv;
+			a= nu->pntsu*nu->pntsv;
 			bp= nu->bp;
-			while(b--) {
-				if(bp->hide==0) {
-					if(bp->f1 & 1) {
-						a=1; 
-						break;
-					}
+			if(next < 0) bp= (nu->bp + (a-1));
+			while(a--) {
+				if(a-abs(next) < 0) break;
+				sel=0;
+				if((lastsel==0) && (bp->hide==0) && ((bp->f1 & 1) || (selstatus==0))) {
+					bp+=next;
+					if(!(bp->f1 & 1) || (selstatus==0)) {
+						sel= select_bpoint(bp, selstatus, 1, VISIBLE);
+						if((sel==1) && (cont==0)) lastsel= 1;
+					}			
 				}
-				bp++;
+				else {
+					bp+=next;
+					lastsel= 0;
+				}
+				/* move around in zigzag way so that we go through each */
+				bp-=(next-next/abs(next));				
 			}
 		}
-		if(a) break;
 	}
+}
 
+static short nurb_has_selected_cps()
+{
+	Nurb *nu;
+	BezTriple *bezt;
+	BPoint *bp;
+	int a;
+
 	for(nu= editNurb.first; nu; nu= nu->next) {
-		if((nu->type & 7)==1) {
-			b= nu->pntsu;
+		if((nu->type & 7)==CU_BEZIER) {
+			a= nu->pntsu;
 			bezt= nu->bezt;
-			while(b--) {
+			while(a--) {
 				if(bezt->hide==0) {
-					if(a) {
-						bezt->f1 &= ~1;
-						bezt->f2 &= ~1;
-						bezt->f3 &= ~1;
-					}
-					else {
-						bezt->f1 |= 1;
-						bezt->f2 |= 1;
-						bezt->f3 |= 1;
-					}
+					if((bezt->f1 & 1)
+					|| (bezt->f2 & 1)
+					|| (bezt->f3 & 1)) return 1;
 				}
 				bezt++;
 			}
 		}
 		else {
-			b= nu->pntsu*nu->pntsv;
+			a= nu->pntsu*nu->pntsv;
 			bp= nu->bp;
-			while(b--) {
-				if(bp->hide==0) {
-					if(a) bp->f1 &= ~ 1;
-					else bp->f1 |= 1;
-				}
+			while(a--) {
+				if((bp->hide==0) && (bp->f1 & 1)) return 1;
 				bp++;
 			}
 		}
 	}
+	
+	return 0;
+}
+
+void deselectall_nurb()
+{
+	if(!G.vd || !(G.obedit->lay & G.vd->lay))
+		return;
+
+	if(nurb_has_selected_cps()) { /* deselect all */
+		selectend_nurb(FIRST, 0, DESELECT); /* set first control points as unselected */
+		select_adjacent_cp(1, 1, DESELECT); /* cascade selection */	
+	}
+	else { /* select all */
+		selectend_nurb(FIRST, 0, SELECT); /* set first control points as selected */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list