[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16765] trunk/blender/source/blender: linear ipo curves were still using their handles to calculate an extrapolated value .
Campbell Barton
ideasman42 at gmail.com
Sat Sep 27 12:08:19 CEST 2008
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]);
More information about the Bf-blender-cvs
mailing list