Revision: 39022
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39022
Author:   aligorith
Date:     2011-08-04 14:13:05 +0000 (Thu, 04 Aug 2011)
Log Message:
-----------
Bassam Feature Request: "Auto Clamped" handles can now be set per
handle/key

This used to be a weird per-curve setting which would happen to get
applied/work correctly if handles were set to "auto", and was a source
of constant confusion for both old and new animators. The main effect
of this handle-type/option was really to just ensure that auto-handles
stayed horizontal, instead of tilting as the keys were moved.

This commit simply changes this from a per-curve to per
keyframe/handle setting.

Modified Paths:
--------------
    branches/soc-2011-pepper/source/blender/blenkernel/intern/curve.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/fcurve.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/ipo.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/nla.c
    branches/soc-2011-pepper/source/blender/blenloader/intern/readfile.c
    branches/soc-2011-pepper/source/blender/editors/animation/drivers.c
    branches/soc-2011-pepper/source/blender/editors/animation/keyframes_edit.c
    branches/soc-2011-pepper/source/blender/editors/animation/keyframing.c
    branches/soc-2011-pepper/source/blender/editors/include/UI_resources.h
    branches/soc-2011-pepper/source/blender/editors/interface/resources.c
    branches/soc-2011-pepper/source/blender/editors/space_action/action_edit.c
    branches/soc-2011-pepper/source/blender/editors/space_graph/graph_edit.c
    branches/soc-2011-pepper/source/blender/makesdna/DNA_anim_types.h
    branches/soc-2011-pepper/source/blender/makesdna/DNA_curve_types.h
    branches/soc-2011-pepper/source/blender/makesdna/DNA_userdef_types.h
    branches/soc-2011-pepper/source/blender/makesrna/RNA_enum_types.h
    branches/soc-2011-pepper/source/blender/makesrna/intern/rna_curve.c
    branches/soc-2011-pepper/source/blender/makesrna/intern/rna_fcurve.c
    branches/soc-2011-pepper/source/blender/makesrna/intern/rna_userdef.c

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/curve.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/curve.c   
2011-08-04 14:06:30 UTC (rev 39021)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/curve.c   
2011-08-04 14:13:05 UTC (rev 39022)
@@ -2473,7 +2473,7 @@
        if(len2==0.0f) len2=1.0f;
 
 
-       if(bezt->h1==HD_AUTO || bezt->h2==HD_AUTO) {    /* auto */
+       if(ELEM(bezt->h1,HD_AUTO,HD_AUTO_ANIM) || 
ELEM(bezt->h2,HD_AUTO,HD_AUTO_ANIM)) {    /* auto */
                vx= dx1/len2 + dx/len1;
                vy= dy1/len2 + dy/len1;
                vz= dz1/len2 + dz/len1;
@@ -2484,13 +2484,13 @@
                        if(len1>5.0f*len2) len1= 5.0f*len2;     
                        if(len2>5.0f*len1) len2= 5.0f*len1;
                        
-                       if(bezt->h1==HD_AUTO) {
+                       if(ELEM(bezt->h1,HD_AUTO,HD_AUTO_ANIM)) {
                                len1/=len;
                                *(p2-3)= *p2-vx*len1;
                                *(p2-2)= *(p2+1)-vy*len1;
                                *(p2-1)= *(p2+2)-vz*len1;
                                
-                               if(mode==2 && next && prev) {   // keep 
horizontal if extrema
+                               if((bezt->h1==HD_AUTO_ANIM) && next && prev) {  
// keep horizontal if extrema
                                        float ydiff1= prev->vec[1][1] - 
bezt->vec[1][1];
                                        float ydiff2= next->vec[1][1] - 
bezt->vec[1][1];
                                        if( (ydiff1 <= 0.0f && ydiff2 <= 0.0f) 
|| (ydiff1 >= 0.0f && ydiff2 >= 0.0f) ) {
@@ -2512,13 +2512,13 @@
                                        }
                                }
                        }
-                       if(bezt->h2==HD_AUTO) {
+                       if(ELEM(bezt->h2,HD_AUTO,HD_AUTO_ANIM)) {
                                len2/=len;
                                *(p2+3)= *p2+vx*len2;
                                *(p2+4)= *(p2+1)+vy*len2;
                                *(p2+5)= *(p2+2)+vz*len2;
                                
-                               if(mode==2 && next && prev) {   // keep 
horizontal if extrema
+                               if((bezt->h2==HD_AUTO_ANIM) && next && prev) {  
// keep horizontal if extrema
                                        float ydiff1= prev->vec[1][1] - 
bezt->vec[1][1];
                                        float ydiff2= next->vec[1][1] - 
bezt->vec[1][1];
                                        if( (ydiff1 <= 0.0f && ydiff2 <= 0.0f) 
|| (ydiff1 >= 0.0f && ydiff2 >= 0.0f) ) {

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/fcurve.c  
2011-08-04 14:06:30 UTC (rev 39021)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/fcurve.c  
2011-08-04 14:13:05 UTC (rev 39022)
@@ -792,13 +792,10 @@
                if (bezt->vec[2][0] < bezt->vec[1][0]) bezt->vec[2][0]= 
bezt->vec[1][0];
                
                /* calculate auto-handles */
-               if (fcu->flag & FCURVE_AUTO_HANDLES) 
-                       calchandleNurb(bezt, prev, next, 2);    /* 2==special 
autohandle && keep extrema horizontal */
-               else
-                       calchandleNurb(bezt, prev, next, 1);    /* 1==special 
autohandle */
+               calchandleNurb(bezt, prev, next, 1);    /* 1==special 
autohandle */
                
                /* for automatic ease in and out */
-               if ((bezt->h1==HD_AUTO) && (bezt->h2==HD_AUTO)) {
+               if (ELEM(bezt->h1,HD_AUTO,HD_AUTO_ANIM) && 
ELEM(bezt->h2,HD_AUTO,HD_AUTO_ANIM)) {
                        /* only do this on first or last beztriple */
                        if ((a == 0) || (a == fcu->totvert-1)) {
                                /* set both handles to have same horizontal 
value as keyframe */
@@ -846,9 +843,9 @@
                /* one or two handles selected only */
                if (ELEM(flag, 0, 7)==0) {
                        /* auto handles become aligned */
-                       if (bezt->h1==HD_AUTO)
+                       if (ELEM(bezt->h1, HD_AUTO, HD_AUTO_ANIM))
                                bezt->h1= HD_ALIGN;
-                       if (bezt->h2==HD_AUTO)
+                       if (ELEM(bezt->h2, HD_AUTO, HD_AUTO_ANIM))
                                bezt->h2= HD_ALIGN;
                        
                        /* vector handles become 'free' when only one half 
selected */

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/ipo.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/ipo.c     
2011-08-04 14:06:30 UTC (rev 39021)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/ipo.c     
2011-08-04 14:13:05 UTC (rev 39022)
@@ -1157,7 +1157,6 @@
        if (icu->flag & IPO_ACTIVE) fcu->flag |= FCURVE_ACTIVE;
        if (icu->flag & IPO_MUTE) fcu->flag |= FCURVE_MUTED;
        if (icu->flag & IPO_PROTECT) fcu->flag |= FCURVE_PROTECTED;
-       if (icu->flag & IPO_AUTO_HORIZ) fcu->flag |= FCURVE_AUTO_HANDLES;
        
        /* set extrapolation */
        switch (icu->extrap) {
@@ -1242,6 +1241,12 @@
                                        /* 'hide' flag is now used for keytype 
- only 'keyframes' existed before */
                                        dst->hide= BEZT_KEYTYPE_KEYFRAME;
                                        
+                                       /* auto-handles - per curve to per 
handle */
+                                       if (icu->flag & IPO_AUTO_HORIZ) {
+                                               if (dst->h1 == HD_AUTO) dst->h1 
= HD_AUTO_ANIM;
+                                               if (dst->h2 == HD_AUTO) dst->h2 
= HD_AUTO_ANIM;
+                                       }
+                                       
                                        /* correct values, by checking if the 
flag of interest is set */
                                        if ( ((int)(dst->vec[1][1])) & 
(abp->bit) )
                                                dst->vec[0][1]= dst->vec[1][1]= 
dst->vec[2][1] = 1.0f;
@@ -1292,6 +1297,12 @@
                                        
                                /* 'hide' flag is now used for keytype - only 
'keyframes' existed before */
                                dst->hide= BEZT_KEYTYPE_KEYFRAME;
+                               
+                               /* auto-handles - per curve to per handle */
+                               if (icu->flag & IPO_AUTO_HORIZ) {
+                                       if (dst->h1 == HD_AUTO) dst->h1 = 
HD_AUTO_ANIM;
+                                       if (dst->h2 == HD_AUTO) dst->h2 = 
HD_AUTO_ANIM;
+                               }
                                        
                                /* correct values for euler rotation curves 
                                 *      - they were degrees/10 

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/nla.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/nla.c     
2011-08-04 14:06:30 UTC (rev 39021)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/nla.c     
2011-08-04 14:13:05 UTC (rev 39022)
@@ -1185,7 +1185,7 @@
                        BLI_addtail(&strip->fcurves, fcu);
                        
                        /* set default flags */
-                       fcu->flag = 
(FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+                       fcu->flag = (FCURVE_VISIBLE|FCURVE_SELECTED);
                        
                        /* store path - make copy, and store that */
                        fcu->rna_path= BLI_strdupn("influence", 9);
@@ -1206,7 +1206,7 @@
                        BLI_addtail(&strip->fcurves, fcu);
                        
                        /* set default flags */
-                       fcu->flag = 
(FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+                       fcu->flag = (FCURVE_VISIBLE|FCURVE_SELECTED);
                        
                        /* store path - make copy, and store that */
                        fcu->rna_path= BLI_strdupn("strip_time", 10);

Modified: branches/soc-2011-pepper/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenloader/intern/readfile.c        
2011-08-04 14:06:30 UTC (rev 39021)
+++ branches/soc-2011-pepper/source/blender/blenloader/intern/readfile.c        
2011-08-04 14:13:05 UTC (rev 39022)
@@ -11799,6 +11799,38 @@
                                SEQ_END
                        }
                }
+               {
+                       /* Make "auto-clamped" handles a per-keyframe setting 
instead of per-FCurve 
+                        *
+                        * We're only patching F-Curves in Actions here, since 
it is assumed that most
+                        * drivers out there won't be using this (and if they 
are, they're in the minority).
+                        * While we should aim to fix everything ideally, in 
practice it's far too hard
+                        * to get to every animdata block, not to mention the 
performance hit that'd have
+                        */
+                       bAction *act;
+                       FCurve *fcu;
+                       
+                       for (act = main->action.first; act; act = act->id.next) 
{
+                               for (fcu = act->curves.first; fcu; fcu = 
fcu->next) {
+                                       BezTriple *bezt;
+                                       unsigned int i = 0;
+                                       
+                                       /* only need to touch curves that had 
this flag set */
+                                       if ((fcu->flag & FCURVE_AUTO_HANDLES) 
== 0)
+                                               continue;
+                                       if ((fcu->totvert == 0) || (fcu->bezt 
== NULL))
+                                               continue;
+                                               
+                                       /* only change auto-handles to 
auto-clamped */
+                                       for (bezt=fcu->bezt; i < fcu->totvert; 
i++, bezt++) {
+                                               if (bezt->h1 == HD_AUTO) 
bezt->h1 = HD_AUTO_ANIM;
+                                               if (bezt->h2 == HD_AUTO) 
bezt->h2 = HD_AUTO_ANIM;
+                                       }
+                                       
+                                       fcu->flag &= ~FCURVE_AUTO_HANDLES;
+                               }
+                       }
+               }
        }
        
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! 
*/

Modified: branches/soc-2011-pepper/source/blender/editors/animation/drivers.c
===================================================================
--- branches/soc-2011-pepper/source/blender/editors/animation/drivers.c 
2011-08-04 14:06:30 UTC (rev 39021)
+++ branches/soc-2011-pepper/source/blender/editors/animation/drivers.c 
2011-08-04 14:13:05 UTC (rev 39022)
@@ -108,7 +108,7 @@
                /* use default settings to make a F-Curve */
                fcu= MEM_callocN(sizeof(FCurve), "FCurve");
                
-               fcu->flag = 
(FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+               fcu->flag = (FCURVE_VISIBLE|FCURVE_SELECTED);
                
                /* store path - make copy, and store that */
                fcu->rna_path= BLI_strdupn(rna_path, strlen(rna_path));
@@ -386,10 +386,6 @@
                copy_fmodifiers(&fcu->modifiers, 
&channeldriver_copypaste_buf->modifiers);
                
                        /* flags - on a per-relevant-flag basis */
-               if (channeldriver_copypaste_buf->flag & FCURVE_AUTO_HANDLES)
-                       fcu->flag |= FCURVE_AUTO_HANDLES;
-               else
-                       fcu->flag &= ~FCURVE_AUTO_HANDLES;
                        /* extrapolation mode */
                fcu->extend= channeldriver_copypaste_buf->extend;
                        

Modified: 
branches/soc-2011-pepper/source/blender/editors/animation/keyframes_edit.c
===================================================================
--- branches/soc-2011-pepper/source/blender/editors/animation/keyframes_edit.c  
2011-08-04 14:06:30 UTC (rev 39021)
+++ branches/soc-2011-pepper/source/blender/editors/animation/keyframes_edit.c  
2011-08-04 14:13:05 UTC (rev 39022)
@@ -756,24 +756,41 @@
 /* ******************************************* */
 /* Settings */
 
+/* standard validation step for a few of these (implemented as macro for 
inlining without fn-call overhead):
+ *     "if the handles are not of the same type, set them to type free"
+ */
+#define ENSURE_HANDLES_MATCH(bezt) \
+               if (bezt->h1 != bezt->h2) { \
+                       if ELEM3(bezt->h1, HD_ALIGN, HD_AUTO, HD_AUTO_ANIM) 
bezt->h1= HD_FREE; \
+                       if ELEM3(bezt->h2, HD_ALIGN, HD_AUTO, HD_AUTO_ANIM) 
bezt->h2= HD_FREE; \
+               }
+
 /* Sets the selected bezier handles to type 'auto' */
 static short set_bezier_auto(KeyframeEditData *UNUSED(ked), BezTriple *bezt) 
 {
-       if((bezt->f1  & SELECT) || (bezt->f3 & SELECT)) {
-               if (bezt->f1 & SELECT) bezt->h1= HD_AUTO; /* the secret code 
for auto */
+       if ((bezt->f1 & SELECT) || (bezt->f3 & SELECT)) {
+               if (bezt->f1 & SELECT) bezt->h1= HD_AUTO;
                if (bezt->f3 & SELECT) bezt->h2= HD_AUTO;
                
-               /* if the handles are not of the same type, set them
-                * to type free
-                */
-               if (bezt->h1 != bezt->h2) {
-                       if ELEM(bezt->h1, HD_ALIGN, HD_AUTO) bezt->h1= HD_FREE;
-                       if ELEM(bezt->h2, HD_ALIGN, HD_AUTO) bezt->h2= HD_FREE;
-               }
+               ENSURE_HANDLES_MATCH(bezt);
        }
        return 0;
 }
 
+/* Sets the selected bezier handles to type 'auto-clamped'

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to