[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