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

Reply via email to