Revision: 16765
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16765
Author: campbellbarton
Date: 2008-09-27 12:08:19 +0200 (Sat, 27 Sep 2008)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/ipo.c
trunk/blender/source/blender/src/drawipo.c
Modified: trunk/blender/source/blender/blenkernel/intern/ipo.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/ipo.c 2008-09-27
09:11:44 UTC (rev 16764)
+++ trunk/blender/source/blender/blenkernel/intern/ipo.c 2008-09-27
10:08:19 UTC (rev 16765)
@@ -474,9 +474,9 @@
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 @@
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 @@
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];
Modified: trunk/blender/source/blender/src/drawipo.c
===================================================================
--- trunk/blender/source/blender/src/drawipo.c 2008-09-27 09:11:44 UTC (rev
16764)
+++ trunk/blender/source/blender/src/drawipo.c 2008-09-27 10:08:19 UTC (rev
16765)
@@ -1451,8 +1451,14 @@
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 @@
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]);
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs