[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14326] trunk/blender/source/blender: Restore bezier handles to their original flag if the transform is canceled , for IPO's and curve edit mode.
Campbell Barton
ideasman42 at gmail.com
Fri Apr 4 17:07:27 CEST 2008
Revision: 14326
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14326
Author: campbellbarton
Date: 2008-04-04 17:06:50 +0200 (Fri, 04 Apr 2008)
Log Message:
-----------
Restore bezier handles to their original flag if the transform is canceled, for IPO's and curve edit mode.
Also retopo was running of curve transform was canceled.
Modified Paths:
--------------
trunk/blender/source/blender/include/transform.h
trunk/blender/source/blender/src/editipo.c
trunk/blender/source/blender/src/transform_conversions.c
trunk/blender/source/blender/src/transform_generics.c
Modified: trunk/blender/source/blender/include/transform.h
===================================================================
--- trunk/blender/source/blender/include/transform.h 2008-04-04 12:33:01 UTC (rev 14325)
+++ trunk/blender/source/blender/include/transform.h 2008-04-04 15:06:50 UTC (rev 14326)
@@ -137,6 +137,13 @@
float *loc2d; /* Pointer to real 2d location of data */
} TransData2D;
+/* we need to store 2 handles for each transdata incase the other handle wasnt selected */
+typedef struct TransDataCurveHandleFlags {
+ short ih1, ih2;
+ short *h1, *h2;
+} TransDataCurveHandleFlags;
+
+
typedef struct TransData {
float dist; /* Distance needed to affect element (for Proportionnal Editing) */
float rdist; /* Distance to the nearest element (for Proportionnal Editing) */
@@ -153,7 +160,11 @@
struct bConstraint *con; /* for objects/bones, the first constraint in its constraint stack */
TransDataExtension *ext; /* for objects, poses. 1 single malloc per TransInfo! */
TransDataIpokey *tdi; /* for objects, ipo keys. per transdata a malloc */
- void *tdmir; /* mirrored element pointer, in editmode mesh to EditVert */
+ union {
+ void *tdmir; /* mirrored element pointer, in editmode mesh to EditVert */
+ TransDataCurveHandleFlags *hdata;
+ } misc;
+
short flag; /* Various flags */
short protectflag; /* If set, copy of Object or PoseChannel protection */
/*#ifdef WITH_VERSE*/
@@ -289,6 +300,7 @@
#define TD_NOCENTER (1 << 9)
#define TD_NO_EXT (1 << 10) /* ext abused for particle key timing */
#define TD_SKIP (1 << 11) /* don't transform this data */
+#define TD_BEZTRIPLE (1 << 12) /* if this is a bez triple, we need to restore the handles, if this is set transdata->misc.hdata needs freeing */
/* transsnap->status */
#define SNAP_ON 1
Modified: trunk/blender/source/blender/src/editipo.c
===================================================================
--- trunk/blender/source/blender/src/editipo.c 2008-04-04 12:33:01 UTC (rev 14325)
+++ trunk/blender/source/blender/src/editipo.c 2008-04-04 15:06:50 UTC (rev 14326)
@@ -5066,7 +5066,7 @@
td2d->loc[2] = 0.0f;
td2d->loc2d = loc;
- td->flag = 0;
+ /*td->flag = 0;*/ /* can be set beforehand, else make sure its set to 0 */
td->loc = td2d->loc;
VECCOPY(td->center, cent);
VECCOPY(td->iloc, td->loc);
@@ -5077,7 +5077,7 @@
td2d->loc[2] = 0.0f;
td2d->loc2d = loc;
- td->flag = 0;
+ /*td->flag = 0;*/ /* can be set beforehand, else make sure its set to 0 */
td->loc = td2d->loc;
VECCOPY(td->center, cent);
VECCOPY(td->iloc, td->loc);
@@ -5168,19 +5168,51 @@
bezt= ei->icu->bezt;
for (b=0; b < ei->icu->totvert; b++, bezt++) {
+ TransDataCurveHandleFlags *hdata = NULL;
/* only include handles if selected, and interpolaton mode uses beztriples */
if (ei->icu->ipo==IPO_BEZ) {
- if (bezt->f1 & SELECT)
+ if (bezt->f1 & SELECT) {
+ td->flag |= TD_BEZTRIPLE;
+ hdata = td->misc.hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data");
+ hdata->ih1 = bezt->h1;
+ hdata->h1 = &bezt->h1;
+ hdata->ih2 = bezt->h2; /* incase the second is not selected */
+ hdata->h2 = &bezt->h2;
+
bezt_to_transdata(td++, td2d++, bezt->vec[0], bezt->vec[1], 1, onlytime);
- if (bezt->f3 & SELECT)
+ }
+ if (bezt->f3 & SELECT) {
+ if (hdata==NULL) {
+ td->flag |= TD_BEZTRIPLE;
+ hdata = td->misc.hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data");
+ hdata->ih1 = bezt->h1;
+ hdata->h1 = &bezt->h1;
+ hdata->ih2 = bezt->h2; /* incase the second is not selected */
+ hdata->h2 = &bezt->h2;
+ }
bezt_to_transdata(td++, td2d++, bezt->vec[2], bezt->vec[1], 1, onlytime);
+ }
}
/* only include main vert if selected */
if (bezt->f2 & SELECT) {
+
+ if ((bezt->f1&SELECT)==0 && (bezt->f3&SELECT)==0) {
+ if (hdata==NULL) {
+ td->flag |= TD_BEZTRIPLE;
+ hdata = td->misc.hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data");
+ hdata->ih1 = bezt->h1;
+ hdata->h1 = &bezt->h1;
+ hdata->ih2 = bezt->h2; /* incase the second is not selected */
+ hdata->h2 = &bezt->h2;
+ }
+ }
+
bezt_to_transdata(td++, td2d++, bezt->vec[1], bezt->vec[1], 1, onlytime);
}
}
+ /* Sets handles based on the selection */
+ testhandles_ipocurve(ei->icu);
}
}
}
Modified: trunk/blender/source/blender/src/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/src/transform_conversions.c 2008-04-04 12:33:01 UTC (rev 14325)
+++ trunk/blender/source/blender/src/transform_conversions.c 2008-04-04 15:06:50 UTC (rev 14326)
@@ -1281,7 +1281,7 @@
Mat3CpyMat4(mtx, G.obedit->obmat);
Mat3Inv(smtx, mtx);
-
+
td = t->data;
for(nu= editNurb.first; nu; nu= nu->next) {
if((nu->type & 7)==CU_BEZIER) {
@@ -1289,6 +1289,7 @@
head = tail = td;
for(a=0, bezt= nu->bezt; a<nu->pntsu; a++, bezt++) {
if(bezt->hide==0) {
+ TransDataCurveHandleFlags *hdata = NULL;
if( propmode ||
((bezt->f2 & SELECT) && (G.f & G_HIDDENHANDLES)) ||
@@ -1307,6 +1308,13 @@
td->ext = NULL;
td->tdi = NULL;
td->val = NULL;
+
+ td->flag |= TD_BEZTRIPLE;
+ hdata = td->misc.hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data");
+ hdata->ih1 = bezt->h1;
+ hdata->h1 = &bezt->h1;
+ hdata->ih2 = bezt->h2; /* incase the second is not selected */
+ hdata->h2 = &bezt->h2;
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
@@ -1338,7 +1346,18 @@
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
-
+
+ if ((bezt->f1&SELECT)==0 && (bezt->f3&SELECT)==0)
+ /* If the middle is selected but the sides arnt, this is needed */
+ if (hdata==NULL) { /* if the handle was not saved by the previous handle */
+ td->flag |= TD_BEZTRIPLE;
+ hdata = td->misc.hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data");
+ hdata->ih1 = bezt->h1;
+ hdata->h1 = &bezt->h1;
+ hdata->ih2 = bezt->h2; /* incase the second is not selected */
+ hdata->h2 = &bezt->h2;
+ }
+
td++;
count++;
tail++;
@@ -1361,6 +1380,15 @@
td->tdi = NULL;
td->val = NULL;
+ if (hdata==NULL) { /* if the handle was not saved by the previous handle */
+ td->flag |= TD_BEZTRIPLE;
+ hdata = td->misc.hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data");
+ hdata->ih1 = bezt->h1;
+ hdata->h1 = &bezt->h1;
+ hdata->ih2 = bezt->h2; /* incase the second is not selected */
+ hdata->h2 = &bezt->h2;
+ }
+
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
@@ -1376,6 +1404,8 @@
}
if (propmode && head != tail)
calc_distanceCurveVerts(head, tail-1);
+
+ testhandlesNurb(nu); /* sets the handles based on their selection, do this after the data is copied to the TransData */
}
else {
TransData *head, *tail;
@@ -1789,7 +1819,7 @@
td->ext = NULL;
td->tdi = NULL;
td->val = NULL;
- td->tdmir= NULL;
+ td->misc.tdmir= NULL;
if (BIF_GetTransInfo()->mode == TFM_BWEIGHT) {
td->val = &(eve->bweight);
td->ival = eve->bweight;
@@ -2142,7 +2172,7 @@
/* Mirror? */
if( (mirror>0 && tob->iloc[0]>0.0f) || (mirror<0 && tob->iloc[0]<0.0f)) {
EditVert *vmir= editmesh_get_x_mirror_vert(G.obedit, tob->iloc); /* initializes octree on first call */
- if(vmir!=eve) tob->tdmir= vmir;
+ if(vmir!=eve) tob->misc.tdmir= vmir;
}
tob++;
}
Modified: trunk/blender/source/blender/src/transform_generics.c
===================================================================
--- trunk/blender/source/blender/src/transform_generics.c 2008-04-04 12:33:01 UTC (rev 14325)
+++ trunk/blender/source/blender/src/transform_generics.c 2008-04-04 15:06:50 UTC (rev 14326)
@@ -255,7 +255,7 @@
if (td->flag & TD_SKIP)
continue;
- eve= td->tdmir;
+ eve= td->misc.tdmir;
if(eve) {
eve->co[0]= -td->loc[0];
eve->co[1]= td->loc[1];
@@ -325,8 +325,11 @@
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
/* watch it: if the time is wrong: do not correct handles */
- if (test_time_ipocurve(ei->icu)) dosort++;
- else testhandles_ipocurve(ei->icu);
+ if (test_time_ipocurve(ei->icu)) {
+ dosort++;
+ } else {
+ calchandles_ipocurve(ei->icu);
+ }
}
}
@@ -398,13 +401,20 @@
Nurb *nu= editNurb.first;
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA); /* sets recalc flags */
- while(nu) {
- test2DNurb(nu);
- testhandlesNurb(nu); /* test for bezier too */
- nu= nu->next;
+ if (t->state == TRANS_CANCEL) {
+ while(nu) {
+ calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */
+ nu= nu->next;
+ }
+ } else {
+ /* Normal updating */
+ while(nu) {
+ test2DNurb(nu);
+ calchandlesNurb(nu);
+ nu= nu->next;
+ }
+ retopo_do_all();
}
-
- retopo_do_all();
}
else if(G.obedit->type==OB_ARMATURE){ /* no recalc flag, does pose */
bArmature *arm= G.obedit->data;
@@ -711,6 +721,7 @@
/* since ipokeys are optional on objects, we mallocced them per trans-data */
for(a=0, td= t->data; a<t->total; a++, td++) {
if(td->tdi) MEM_freeN(td->tdi);
+ if (td->flag & TD_BEZTRIPLE) MEM_freeN(td->misc.hdata);
}
MEM_freeN(t->data);
}
@@ -774,6 +785,12 @@
}
}
}
+
+ if (td->flag & TD_BEZTRIPLE) {
+ *(td->misc.hdata->h1) = td->misc.hdata->ih1;
+ *(td->misc.hdata->h2) = td->misc.hdata->ih2;
+ }
+
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
More information about the Bf-blender-cvs
mailing list