linear ipo curves were still using their handles to calculate an extrapolated value.

It would only work when the bezier point had its handles set to auto before changing to a linear IpoCurve since the handles were being recalculated during transform.
This commit is contained in:
Campbell Barton 2008-09-27 10:08:19 +00:00
parent 061c5c7633
commit fe5dd01595
2 changed files with 65 additions and 18 deletions

@ -474,9 +474,9 @@ void calchandles_ipocurve(IpoCurve *icu)
int a;
a= icu->totvert;
/* IPO_CONST doesn't have handles */
if(a<2 || icu->ipo==IPO_CONST) return;
if(a<2 || icu->ipo==IPO_CONST || icu->ipo==IPO_LIN) return;
bezt= icu->bezt;
prev= 0;
@ -940,13 +940,29 @@ float eval_icu(IpoCurve *icu, float ipotime)
if(prevbezt->vec[1][0]>=ipotime) {
if( (icu->extrap & IPO_DIR) && icu->ipo!=IPO_CONST) {
dx= prevbezt->vec[1][0]-ipotime;
fac= prevbezt->vec[1][0]-prevbezt->vec[0][0];
if(fac!=0.0) {
fac= (prevbezt->vec[1][1]-prevbezt->vec[0][1])/fac;
cvalue= prevbezt->vec[1][1]-fac*dx;
if (icu->ipo==IPO_LIN) {
if (icu->totvert==1) cvalue= prevbezt->vec[1][1];
else {
/* use the next center point instead of our own handle for
* linear interpolated extrapolate */
bezt = prevbezt+1;
dx= prevbezt->vec[1][0]-ipotime;
fac= bezt->vec[1][0]-prevbezt->vec[1][0];
if(fac!=0.0) {
fac= (bezt->vec[1][1]-prevbezt->vec[1][1])/fac;
cvalue= prevbezt->vec[1][1]-fac*dx;
}
else cvalue= prevbezt->vec[1][1];
}
} else {
dx= prevbezt->vec[1][0]-ipotime;
fac= prevbezt->vec[1][0]-prevbezt->vec[0][0];
if(fac!=0.0) {
fac= (prevbezt->vec[1][1]-prevbezt->vec[0][1])/fac;
cvalue= prevbezt->vec[1][1]-fac*dx;
}
else cvalue= prevbezt->vec[1][1];
}
else cvalue= prevbezt->vec[1][1];
}
else cvalue= prevbezt->vec[1][1];
@ -955,14 +971,32 @@ float eval_icu(IpoCurve *icu, float ipotime)
else if( (prevbezt+a)->vec[1][0]<=ipotime) {
if( (icu->extrap & IPO_DIR) && icu->ipo!=IPO_CONST) {
prevbezt+= a;
dx= ipotime-prevbezt->vec[1][0];
fac= prevbezt->vec[2][0]-prevbezt->vec[1][0];
if (icu->ipo==IPO_LIN) {
if (icu->totvert==1) cvalue= prevbezt->vec[1][1];
else {
/* use the previous center point instead of our own handle for
* linear interpolated extrapolate */
bezt = prevbezt-1;
dx= ipotime-prevbezt->vec[1][0];
fac= prevbezt->vec[1][0]-bezt->vec[1][0];
if(fac!=0) {
fac= (prevbezt->vec[2][1]-prevbezt->vec[1][1])/fac;
cvalue= prevbezt->vec[1][1]+fac*dx;
if(fac!=0) {
fac= (prevbezt->vec[1][1]-bezt->vec[1][1])/fac;
cvalue= prevbezt->vec[1][1]+fac*dx;
}
else cvalue= prevbezt->vec[1][1];
}
} else {
dx= ipotime-prevbezt->vec[1][0];
fac= prevbezt->vec[2][0]-prevbezt->vec[1][0];
if(fac!=0) {
fac= (prevbezt->vec[2][1]-prevbezt->vec[1][1])/fac;
cvalue= prevbezt->vec[1][1]+fac*dx;
}
else cvalue= prevbezt->vec[1][1];
}
else cvalue= prevbezt->vec[1][1];
}
else cvalue= (prevbezt+a)->vec[1][1];

@ -1451,8 +1451,14 @@ static void draw_ipocurves(int sel)
if( (icu->extrap & IPO_CYCL)==0) {
if(prevbezt->vec[1][0] > G.v2d->cur.xmin) {
v1[0]= G.v2d->cur.xmin;
if(icu->extrap==IPO_HORIZ || icu->ipo==IPO_CONST) v1[1]= prevbezt->vec[1][1];
else {
if(icu->extrap==IPO_HORIZ || icu->ipo==IPO_CONST || icu->totvert==1) {
v1[1]= prevbezt->vec[1][1];
} else if (icu->ipo==IPO_LIN) {
/* extrapolate linear dosnt use the handle, use the next points center instead */
fac= (prevbezt->vec[1][0]-bezt->vec[1][0])/(prevbezt->vec[1][0]-v1[0]);
if(fac!=0.0) fac= 1.0/fac;
v1[1]= prevbezt->vec[1][1]-fac*(prevbezt->vec[1][1]-bezt->vec[1][1]);
} else {
fac= (prevbezt->vec[0][0]-prevbezt->vec[1][0])/(prevbezt->vec[1][0]-v1[0]);
if(fac!=0.0) fac= 1.0/fac;
v1[1]= prevbezt->vec[1][1]-fac*(prevbezt->vec[0][1]-prevbezt->vec[1][1]);
@ -1531,8 +1537,15 @@ static void draw_ipocurves(int sel)
if( (icu->extrap & IPO_CYCL)==0) {
if(prevbezt->vec[1][0] < G.v2d->cur.xmax) {
v1[0]= G.v2d->cur.xmax;
if(icu->extrap==IPO_HORIZ || icu->ipo==IPO_CONST) v1[1]= prevbezt->vec[1][1];
else {
if(icu->extrap==IPO_HORIZ || icu->ipo==IPO_CONST ||icu->totvert==1) {
v1[1]= prevbezt->vec[1][1];
} else if (icu->ipo==IPO_LIN) {
/* extrapolate linear dosnt use the handle, use the previous points center instead */
bezt = prevbezt-1;
fac= (prevbezt->vec[1][0]-bezt->vec[1][0])/(prevbezt->vec[1][0]-v1[0]);
if(fac!=0.0) fac= 1.0/fac;
v1[1]= prevbezt->vec[1][1]-fac*(prevbezt->vec[1][1]-bezt->vec[1][1]);
} else {
fac= (prevbezt->vec[2][0]-prevbezt->vec[1][0])/(prevbezt->vec[1][0]-v1[0]);
if(fac!=0.0) fac= 1.0/fac;
v1[1]= prevbezt->vec[1][1]-fac*(prevbezt->vec[2][1]-prevbezt->vec[1][1]);