diff options
author | Campbell Barton <ideasman42@gmail.com> | 2008-09-27 14:08:19 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2008-09-27 14:08:19 +0400 |
commit | fe5dd015956bd2a4cab9e0161daf6bac2faf5a3f (patch) | |
tree | ba447d6c7449626c8a120535737adab98095eb47 /source/blender/blenkernel | |
parent | 061c5c7633f025434a3d85266924c3add645c3e3 (diff) |
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.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/ipo.c | 62 |
1 files changed, 48 insertions, 14 deletions
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 1448ff8e417..b58a9e51b05 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -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[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; + 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]; |