[Bf-blender-cvs] [202bb32] master: Fix T37056: Making segment flips curves it's not needed

Sergey Sharybin noreply at git.blender.org
Thu Jan 2 20:47:59 CET 2014


Commit: 202bb321343a5545d0d31d195f64b487d4c40c54
Author: Sergey Sharybin
Date:   Fri Jan 3 01:44:46 2014 +0600
https://developer.blender.org/rB202bb321343a5545d0d31d195f64b487d4c40c54

Fix T37056: Making segment flips curves it's not needed

Made the system around splines order a bit smarter, so
crating a segment between two splines wouldn't switch
direction if splines are selected in a way that they're
"co-linear".

It is possible to make things even smarter using active
point and so, but that i'd consider a TODO.

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

M	source/blender/editors/curve/editcurve.c

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

diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index bc97515..6664433 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -4151,67 +4151,81 @@ static int make_segment_exec(bContext *C, wmOperator *op)
 
 		if ((nu->flagu & CU_NURB_CYCLIC) == 0) {    /* not cyclic */
 			if (nu->type == CU_BEZIER) {
-				if (nu1 == NULL) {
-					if (BEZSELECTED_HIDDENHANDLES(cu, nu->bezt)) {
-						nu1 = nu;
+				if (BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu - 1]))) {
+					/* Last point is selected, preferred for nu2 */
+					if (nu2 == NULL) {
+						nu2 = nu;
 					}
-					else {
-						if (BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu - 1]))) {
-							nu1 = nu;
-							BKE_nurb_direction_switch(nu);
-							keyData_switchDirectionNurb(cu, nu);
+					else if (nu1 == NULL) {
+						nu1 = nu;
+
+						/* Just in case both of first/last CV are selected check
+						 * whether we really need to switch the direction.
+						 */
+						if (!BEZSELECTED_HIDDENHANDLES(cu, nu1->bezt)) {
+							BKE_nurb_direction_switch(nu1);
+							keyData_switchDirectionNurb(cu, nu1);
 						}
 					}
 				}
-				else if (nu2 == NULL) {
-					if (BEZSELECTED_HIDDENHANDLES(cu, nu->bezt)) {
-						nu2 = nu;
-						BKE_nurb_direction_switch(nu);
-						keyData_switchDirectionNurb(cu, nu);
+				else if (BEZSELECTED_HIDDENHANDLES(cu, nu->bezt)) {
+					/* First point is selected, preferred for nu1 */
+					if (nu1 == NULL) {
+						nu1 = nu;
 					}
-					else {
-						if (BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu - 1]))) {
-							nu2 = nu;
+					else if (nu2 == NULL) {
+						nu2 = nu;
+
+						/* Just in case both of first/last CV are selected check
+						 * whether we really need to switch the direction.
+						 */
+						if (!BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu2->pntsu - 1]))) {
+							BKE_nurb_direction_switch(nu2);
+							keyData_switchDirectionNurb(cu, nu2);
 						}
 					}
 				}
-				else {
-					break;
-				}
 			}
 			else if (nu->pntsv == 1) {
+				/* Same logic as above: if first point is selected spline is
+				 * preferred for nu1, if last point is selected spline is
+				 * preferred for u2u.
+				 */
+
 				bp = nu->bp;
-				if (nu1 == NULL) {
-					if (bp->f1 & SELECT) {
-						nu1 = nu;
+				if (bp[nu->pntsu - 1].f1 & SELECT)  {
+					if (nu2 == NULL) {
+						nu2 = nu;
 					}
-					else {
-						bp = bp + (nu->pntsu - 1);
-						if (bp->f1 & SELECT) {
-							nu1 = nu;
+					else if (nu1 == NULL) {
+						nu1 = nu;
+
+						if ((bp->f1 & SELECT) == 0) {
 							BKE_nurb_direction_switch(nu);
 							keyData_switchDirectionNurb(cu, nu);
 						}
 					}
 				}
-				else if (nu2 == NULL) {
-					if (bp->f1 & SELECT) {
-						nu2 = nu;
-						BKE_nurb_direction_switch(nu);
-						keyData_switchDirectionNurb(cu, nu);
+				else if (bp->f1 & SELECT) {
+					if (nu1 == NULL) {
+						nu1 = nu;
 					}
-					else {
-						bp = bp + (nu->pntsu - 1);
-						if (bp->f1 & SELECT) {
-							nu2 = nu;
+					else if (nu2 == NULL) {
+						nu2 = nu;
+
+						if ((bp[nu->pntsu - 1].f1 & SELECT) == 0) {
+							BKE_nurb_direction_switch(nu);
+							keyData_switchDirectionNurb(cu, nu);
 						}
 					}
 				}
-				else {
-					break;
-				}
 			}
 		}
+
+		if (nu1 && nu2) {
+			/* Got second spline, no need to loop over rest of the splines. */
+			break;
+		}
 	}
 
 	if ((nu1 && nu2) && (nu1 != nu2)) {




More information about the Bf-blender-cvs mailing list