[Bf-animsys] [PATCH] fix non-bezier key translation
Jess Balint
jbalint at gmail.com
Fri May 29 09:00:59 CEST 2009
Hi,
As the subject says, this fixes the non-bezier key translation. It's
broken foremestly in that it crashes :), and second that it doesn't take
the handle of the previous bezier segment into account for a non-bezier
segment.
Jess
-------------- next part --------------
Index: source/blender/editors/transform/transform_conversions.c
===================================================================
--- source/blender/editors/transform/transform_conversions.c (revision 20473)
+++ source/blender/editors/transform/transform_conversions.c (working copy)
@@ -3117,7 +3117,7 @@
bAnimListElem *ale;
int filter;
- BezTriple *bezt, *prevbezt;
+ BezTriple *bezt, *prevbezt, *nextbezt;
int count=0, i;
float cfra;
char side;
@@ -3159,7 +3159,8 @@
/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse */
if (fcu->bezt) {
- for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
+ for (prevbezt=NULL, i=0, bezt=fcu->bezt; i < fcu->totvert; i++, prevbezt=bezt, bezt++) {
+ nextbezt = (i < fcu->totvert - 1) ? bezt + 1 : NULL;
if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
if (v2d->around == V3D_LOCAL) {
/* for local-pivot we only need to count the number of selected handles only, so that centerpoitns don't
@@ -3172,13 +3173,14 @@
else if (bezt->f2 & SELECT) count++;
}
else {
- /* for 'normal' pivots */
- if (bezt->ipo == BEZT_IPO_BEZ) {
- if (bezt->f1 & SELECT) count++;
- if (bezt->f2 & SELECT) count++;
- if (bezt->f3 & SELECT) count++;
- }
- else if (bezt->f2 & SELECT) count++;
+ if ((bezt->f1 & SELECT) &&
+ (!prevbezt || prevbezt->ipo == BEZT_IPO_BEZ))
+ count++;
+ if (bezt->f2 & SELECT) count++;
+ if ((bezt->f3 & SELECT) &&
+ (bezt->ipo == BEZT_IPO_BEZ || !nextbezt ||
+ nextbezt->ipo == BEZT_IPO_BEZ))
+ count++;
}
}
}
@@ -3215,28 +3217,27 @@
prevbezt= NULL;
for (i=0; i < fcu->totvert; i++, prevbezt=bezt, bezt++) {
+ nextbezt = (i < fcu->totvert - 1) ? bezt + 1 : NULL;
if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
TransDataCurveHandleFlags *hdata = NULL;
short h1=1, h2=1;
/* only include handles if selected, and interpolaton mode uses beztriples */
- if ( (!prevbezt && (bezt->ipo==BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)) ) {
- if (bezt->f1 & SELECT) {
+ if ((bezt->f1 & SELECT) && (!prevbezt || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)))) {
+ hdata = initTransDataCurveHandes(td, bezt);
+ bezt_to_transdata(td++, td2d++, nob, bezt->vec[0], bezt->vec[1], 1, 1, intvals);
+ }
+ else if (bezt->ipo == BEZT_IPO_BEZ)
+ h1= 0;
+
+ if ((bezt->f3 & SELECT) && (!nextbezt || (nextbezt->ipo == BEZT_IPO_BEZ) ||
+ bezt->ipo == BEZT_IPO_BEZ)) {
+ if (hdata==NULL)
hdata = initTransDataCurveHandes(td, bezt);
- bezt_to_transdata(td++, td2d++, nob, bezt->vec[0], bezt->vec[1], 1, 1, intvals);
- }
- else
- h1= 0;
+ bezt_to_transdata(td++, td2d++, nob, bezt->vec[2], bezt->vec[1], 1, 1, intvals);
}
- if (bezt->ipo == BEZT_IPO_BEZ) {
- if (bezt->f3 & SELECT) {
- if (hdata==NULL)
- hdata = initTransDataCurveHandes(td, bezt);
- bezt_to_transdata(td++, td2d++, nob, bezt->vec[2], bezt->vec[1], 1, 1, intvals);
- }
- else
- h2= 0;
- }
+ else if (bezt->ipo == BEZT_IPO_BEZ)
+ h2= 0;
/* only include main vert if selected */
if (bezt->f2 & SELECT) {
More information about the Bf-animsys
mailing list