[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