Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-04-02 14:20:10 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-04-02 14:20:10 +0400
commit7b9d9ecab2c2b95cc20c589ae329144846995147 (patch)
tree3ba7c3630da73366b85845aaf6d26b36387b2cb3 /source/blender/editors/curve
parent48059cc32968e008b809571ccb80ffdd5f876ce6 (diff)
fix for a bug with Ctrl+Click extrude in curve editmode, it would use the wrong handle type in some cases.
also make it re-calculate the handle locations which is much more useful.
Diffstat (limited to 'source/blender/editors/curve')
-rw-r--r--source/blender/editors/curve/editcurve.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index a5188ea769e..9190cd940d6 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -4378,6 +4378,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
BPoint *bp, *newbp = NULL;
float imat[4][4], temp[3];
int ok= 0;
+ BezTriple *bezt_recalc[3] = {NULL};
invert_m4_m4(imat, obedit->obmat);
@@ -4471,9 +4472,14 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
newbezt+= nu->pntsu;
BEZ_SEL(newbezt);
cu->lastsel= newbezt;
- newbezt->h2= newbezt->h1;
+ newbezt->h1 = newbezt->h2;
bezt= nu->bezt+nu->pntsu-1;
ok= 1;
+
+ if (nu->pntsu > 1) {
+ bezt_recalc[1] = newbezt;
+ bezt_recalc[0] = newbezt - 1;
+ }
}
else if (bezt== nu->bezt) { /* first */
BEZ_DESEL(bezt);
@@ -4489,6 +4495,11 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
nu->bezt= newbezt;
bezt= newbezt+1;
ok= 1;
+
+ if (nu->pntsu > 1) {
+ bezt_recalc[1] = newbezt;
+ bezt_recalc[2] = newbezt + 1;
+ }
}
else if (mode!='e') {
BEZ_DESEL(bezt);
@@ -4523,8 +4534,19 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
else {
mul_v3_m4v3(newbezt->vec[1], imat, location);
sub_v3_v3v3(temp, newbezt->vec[1],temp);
- add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp);
- add_v3_v3v3(newbezt->vec[2], bezt->vec[2],temp);
+
+ if (bezt_recalc[1]) {
+ const char h1 = bezt_recalc[1]->h1, h2 = bezt_recalc[1]->h2;
+ bezt_recalc[1]->h1 = bezt_recalc[1]->h2 = HD_AUTO;
+ calchandleNurb(bezt_recalc[1], bezt_recalc[0], bezt_recalc[2], 0);
+ bezt_recalc[1]->h1 = h1;
+ bezt_recalc[1]->h2 = h2;
+ }
+ else {
+ add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp);
+ add_v3_v3v3(newbezt->vec[2], bezt->vec[2],temp);
+ }
+
if (newnu) calchandlesNurb(newnu);
else calchandlesNurb(nu);