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>2008-09-27 14:08:19 +0400
committerCampbell Barton <ideasman42@gmail.com>2008-09-27 14:08:19 +0400
commitfe5dd015956bd2a4cab9e0161daf6bac2faf5a3f (patch)
treeba447d6c7449626c8a120535737adab98095eb47 /source/blender/blenkernel
parent061c5c7633f025434a3d85266924c3add645c3e3 (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.c62
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];