Revision: 28628
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28628
Author: joeedh
Date: 2010-05-06 21:54:43 +0200 (Thu, 06 May 2010)
Log Message:
-----------
keyframe transform, both through dopesheet/action editor and graph editor,
works a bit better with handles. handles now follow keyframes properly in
frame snap mode, in situations where they would move (but the keyframe would
not) in undesirable ways before. also hopefully fixed vector scope crash in
image editor. and disabled snapping to seconds (ever); this can be a seperate
option, silently switching to second snapping in frame snapping mode is
absolutely evil. also, the action editor draws in hundredth of seconds, not
seconds, so it didn't even work. Aligorith: I hope this code is ok, if not
feel free to rewrite it.
Modified Paths:
--------------
trunk/blender/source/blender/editors/interface/interface_draw.c
trunk/blender/source/blender/editors/transform/transform.c
trunk/blender/source/blender/editors/transform/transform.h
trunk/blender/source/blender/editors/transform/transform_conversions.c
trunk/blender/source/blender/editors/transform/transform_generics.c
Modified: trunk/blender/source/blender/editors/interface/interface_draw.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_draw.c
2010-05-06 19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/interface/interface_draw.c
2010-05-06 19:54:43 UTC (rev 28628)
@@ -1088,9 +1088,13 @@
glTranslatef(centerx, centery, 0.f);
glScalef(diam, diam, 0.f);
- glVertexPointer(2, GL_FLOAT, 0, scopes->vecscope);
- glDrawArrays(GL_POINTS, 0, scopes->waveform_tot);
+ /*apparently this can sometimes be NULL? - joeedh*/
+ if (scopes) {
+ glVertexPointer(2, GL_FLOAT, 0, scopes->vecscope);
+ glDrawArrays(GL_POINTS, 0, scopes->waveform_tot);
+ }
+
glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();
Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c 2010-05-06
19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform.c 2010-05-06
19:54:43 UTC (rev 28628)
@@ -202,17 +202,32 @@
UI_view2d_to_region_no_clip(t->view, v[0], v[1], adr, adr+1);
}
- else if(ELEM3(t->spacetype, SPACE_IPO, SPACE_NLA, SPACE_ACTION)) {
+ else if(t->spacetype == SPACE_ACTION) {
+ SpaceAction *sact = t->sa->spacedata.first;
int out[2] = {0, 0};
- UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1],
out, out+1);
+ if (sact->flag & SACTION_DRAWTIME) {
+ //vec[0] = vec[0]/((t->scene->r.frs_sec /
t->scene->r.frs_sec_base));
+
+ UI_view2d_to_region_no_clip((View2D *)t->view, vec[0],
vec[1], out, out+1);
+ } else {
+ UI_view2d_to_region_no_clip((View2D *)t->view, vec[0],
vec[1], out, out+1);
+ }
+
adr[0]= out[0];
adr[1]= out[1];
}
+ else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) {
+ int out[2] = {0, 0};
+
+ UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1],
out, out+1);
+ adr[0]= out[0];
+ adr[1]= out[1];
+ }
else if(t->spacetype==SPACE_SEQ) { /* XXX not tested yet, but should
work */
int out[2] = {0, 0};
- UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1],
out, out+1);
+ UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1],
out, out+1);
adr[0]= out[0];
adr[1]= out[1];
}
@@ -5285,12 +5300,12 @@
/* This function is used by Animation Editor specific transform functions to do
* the Snap Keyframe to Nearest Frame/Marker
*/
-static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, AnimData *adt,
short autosnap)
+static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D
*td2d, AnimData *adt, short autosnap)
{
/* snap key to nearest frame? */
if (autosnap == SACTSNAP_FRAME) {
const Scene *scene= t->scene;
- const short doTime= getAnimEdit_DrawTime(t);
+ const short doTime= 0; //XXX doesn't work -
getAnimEdit_DrawTime(t);
const double secf= FPS;
double val;
@@ -5332,6 +5347,14 @@
else
*(td->val)= val;
}
+
+ if ((td->flag & TD_MOVEHANDLE1) && td2d->h1) {
+ td2d->h1[0] = td2d->ih1[0] + *td->val - td->ival;
+ }
+
+ if ((td->flag & TD_MOVEHANDLE2) && td2d->h2) {
+ td2d->h2[0] = td2d->ih2[0] + *td->val - td->ival;
+ }
}
/* ----------------- Translation ----------------------- */
@@ -5394,6 +5417,7 @@
static void applyTimeTranslate(TransInfo *t, float sval)
{
TransData *td = t->data;
+ TransData2D *td2d = t->data2d;
Scene *scene = t->scene;
int i;
@@ -5402,16 +5426,18 @@
const short autosnap= getAnimEdit_SnapMode(t);
- float deltax, val;
+ float deltax, val, valprev;
/* it doesn't matter whether we apply to t->data or t->data2d, but
t->data2d is more convenient */
- for (i = 0 ; i < t->total; i++, td++) {
+ for (i = 0 ; i < t->total; i++, td++, td2d++) {
/* it is assumed that td->extra is a pointer to the AnimData,
* whose active action is where this keyframe comes from
* (this is only valid when not in NLA)
*/
AnimData *adt= (t->spacetype != SPACE_NLA) ? td->extra : NULL;
+ valprev = *td->val;
+
/* check if any need to apply nla-mapping */
if (adt && t->spacetype != SPACE_SEQ) {
deltax = t->values[0];
@@ -5441,7 +5467,7 @@
}
/* apply nearest snapping */
- doAnimEdit_SnapFrame(t, td, adt, autosnap);
+ doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap);
}
}
@@ -5652,6 +5678,7 @@
static void applyTimeScale(TransInfo *t) {
Scene *scene = t->scene;
TransData *td = t->data;
+ TransData2D *td2d = t->data2d;
int i;
const short autosnap= getAnimEdit_SnapMode(t);
@@ -5659,7 +5686,7 @@
const double secf= FPS;
- for (i = 0 ; i < t->total; i++, td++) {
+ for (i = 0 ; i < t->total; i++, td++, td2d++) {
/* it is assumed that td->extra is a pointer to the AnimData,
* whose active action is where this keyframe comes from
* (this is only valid when not in NLA)
@@ -5685,7 +5712,7 @@
*(td->val) += startx;
/* apply nearest snapping */
- doAnimEdit_SnapFrame(t, td, adt, autosnap);
+ doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap);
}
}
Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h 2010-05-06
19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform.h 2010-05-06
19:54:43 UTC (rev 28628)
@@ -151,6 +151,9 @@
typedef struct TransData2D {
float loc[3]; /* Location of data used to transform (x,y,0) */
float *loc2d; /* Pointer to real 2d location of data */
+
+ float *h1, *h2; /* Pointer to handle locations, if handles aren't
being moved independantly*/
+ float ih1[2], ih2[2];
} TransData2D;
/* we need to store 2 handles for each transdata incase the other handle wasnt
selected */
@@ -427,6 +430,8 @@
#define TD_NOTIMESNAP (1 << 14) /* for Graph Editor autosnap,
indicates that point should not undergo autosnapping */
#define TD_INTVALUES (1 << 15) /* for Graph Editor - curves
that can only have int-values need their keyframes tagged with this */
#define TD_MIRROR_EDGE (1 << 16) /* For editmode mirror, clamp
to x = 0 */
+#define TD_MOVEHANDLE1 (1 << 17) /* For fcurve handles, move
them along with their keyframes */
+#define TD_MOVEHANDLE2 (1 << 18)
/* transsnap->status */
#define SNAP_FORCED 1
Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c
2010-05-06 19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c
2010-05-06 19:54:43 UTC (rev 28628)
@@ -2972,9 +2972,8 @@
bezt->f1 |= SELECT;
bezt->f3 |= SELECT;
- /* increment by 3, as there are 3 points (3 *
x-coordinates) that need transform */
if (FrameOnMouseSide(side, bezt->vec[1][0], cfra))
- count += 3;
+ count += 1;
}
}
@@ -3023,9 +3022,10 @@
* The 'side' argument is needed for the extend mode. 'B' = both sides,
'R'/'L' mean only data
* on the named side are used.
*/
-static TransData *FCurveToTransData(TransData *td, FCurve *fcu, AnimData *adt,
char side, float cfra)
+static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv,
FCurve *fcu, AnimData *adt, char side, float cfra)
{
BezTriple *bezt;
+ TransData2D *td2d = *td2dv;
int i;
if (fcu == NULL)
@@ -3036,19 +3036,24 @@
if (BEZSELECTED(bezt)) {
/* only add if on the right 'side' of the current frame
*/
if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
- /* each control point needs to be added
separetely */
- TimeToTransData(td, bezt->vec[0], adt);
- td++;
-
TimeToTransData(td, bezt->vec[1], adt);
- td++;
- TimeToTransData(td, bezt->vec[2], adt);
+ /*set flags to move handles as necassary*/
+ td->flag |= TD_MOVEHANDLE1|TD_MOVEHANDLE2;
+ td2d->h1 = bezt->vec[0];
+ td2d->h2 = bezt->vec[2];
+
+ VECCOPY2D(td2d->ih1, td2d->h1);
+ VECCOPY2D(td2d->ih2, td2d->h2);
+
td++;
+ td2d++;
}
}
}
+ *td2dv = td2d;
+
return td;
}
@@ -3116,6 +3121,7 @@
{
Scene *scene= t->scene;
TransData *td = NULL;
+ TransData2D *td2d = NULL;
tGPFtransdata *tfd = NULL;
bAnimContext ac;
@@ -3179,7 +3185,9 @@
t->total= count;
t->data= MEM_callocN(t->total*sizeof(TransData), "TransData(Action
Editor)");
+ t->data2d= MEM_callocN(t->total*sizeof(TransData2D), "transdata2d");
td= t->data;
+ td2d = t->data2d;
if (ac.datatype == ANIMCONT_GPENCIL) {
if (t->mode == TFM_TIME_SLIDE) {
@@ -3216,7 +3224,7 @@
else
cfra = (float)CFRA;
- td= FCurveToTransData(td, fcu, adt, t->frame_side,
cfra);
+ td= ActionFCurveToTransData(td, &td2d, fcu, adt,
t->frame_side, cfra);
//}
}
@@ -3248,8 +3256,11 @@
/* Helper function for createTransGraphEditData, which is reponsible for
associating
* source data with transform data
*/
-static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData
*adt, float *loc, float *cent, short selected, short ishandle, short intvals)
+static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData
*adt, BezTriple *bezt, int bi, short selected, short ishandle, short intvals)
{
+ float *loc = bezt->vec[bi];
+ float *cent = bezt->vec[1];
+
/* New location from td gets dumped onto the old-location of td2d,
which then
* gets copied to the actual data at td2d->loc2d (bezt->vec[n])
*
@@ -3280,7 +3291,17 @@
VECCOPY(td->center, cent);
VECCOPY(td->iloc, td->loc);
}
-
+
+ if (td->flag & TD_MOVEHANDLE1) {
+ td2d->h1 = bezt->vec[0];
+ VECCOPY2D(td2d->ih1, td2d->h1);
+ } else td2d->h1 = NULL;
+
+ if (td->flag & TD_MOVEHANDLE2) {
+ td2d->h2 = bezt->vec[2];
+ VECCOPY2D(td2d->ih2, td2d->h2);
+ } else td2d->h2 = NULL;
+
memset(td->axismtx, 0, sizeof(td->axismtx));
td->axismtx[2][2] = 1.0f;
@@ -3300,7 +3321,7 @@
td->flag |= TD_NOTIMESNAP;
if (intvals)
td->flag |= TD_INTVALUES;
-
+
unit_m3(td->mtx);
unit_m3(td->smtx);
}
@@ -3362,11 +3383,11 @@
/* F-Curve may not have any keyframes */
if (fcu->bezt == NULL)
continue;
-
+
/* only include BezTriples whose 'keyframe' occurs on the same
side of the current frame as mouse */
for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0],
cfra)) {
- if (sipo->around == V3D_LOCAL) {
+ if (sipo->around == V3D_LOCAL && !ELEM(t->mode,
TFM_TRANSLATION, TFM_TIME_TRANSLATE)) {
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs