forked from bartvdbraak/blender
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:
parent
061c5c7633
commit
fe5dd01595
@ -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]);
|
||||
|
Loading…
Reference in New Issue
Block a user