- It is possible to scale radius of MetaElem again.

- It is possible to change dx, dy and dz params in 3Dview with manipulators
    or with some shortcuts (S-X, S-Y, S-Z).
 - User can scale stiffness when green circle is selected.
 - MetaElem is selected with RMB click at green or red circle, then user can
    grab or rotate with MetaElem as usual.

 - Screenshot:
    http://e-learning.vslib.cz/~hnidek/pics/scale_stiffness.jpg

 - Captured video:
    http://e-learning.vslib.cz/~hnidek/captured-videos/scale_stiffness.avi
This commit is contained in:
Jiri Hnidek 2005-04-11 19:31:05 +00:00
parent 52b7b978e3
commit 78939c0cc0
8 changed files with 57 additions and 18 deletions

@ -198,6 +198,7 @@ typedef struct TransInfo {
#define TD_NOACTION 2 #define TD_NOACTION 2
#define TD_USEQUAT 4 #define TD_USEQUAT 4
#define TD_NOTCONNECTED 8 #define TD_NOTCONNECTED 8
#define TD_SINGLESIZE 16 /* used for scaling of MetaElem->rad */
void initWarp(TransInfo *t); void initWarp(TransInfo *t);
int Warp(TransInfo *t, short mval[2]); int Warp(TransInfo *t, short mval[2]);

@ -48,7 +48,7 @@ typedef struct MetaElem {
struct BoundBox *bb; /* Bound Box of MetaElem */ struct BoundBox *bb; /* Bound Box of MetaElem */
int i1,j1,k1, i2,j2,k2; /* corners of Bounding Box in lattice */ int i1,j1,k1, i2,j2,k2; /* corners of Bounding Box in lattice */
short type, lay, flag, selcol; short type, flag, selcol1, selcol2;
float x, y, z; /* Position of centre of MetaElem */ float x, y, z; /* Position of centre of MetaElem */
float quat[4]; /* Rotation of MetaElem */ float quat[4]; /* Rotation of MetaElem */
float expx, expy, expz; /* dx, dy, dz parameters */ float expx, expy, expz; /* dx, dy, dz parameters */
@ -104,6 +104,7 @@ typedef struct MetaBall {
/* ml->flag */ /* ml->flag */
#define MB_NEGATIVE 2 #define MB_NEGATIVE 2
#define MB_HIDE 8 #define MB_HIDE 8
#define MB_SCALE_RAD 16
#endif #endif

@ -410,7 +410,7 @@ static PyObject *Metaball_addMetaelem( BPy_Metaball * self, PyObject * args )
{ {
MetaElem *ml; MetaElem *ml;
PyObject *listargs = 0; PyObject *listargs = 0;
int type, lay; int type;
float x, y, z, rad, s, expx, expy, expz; float x, y, z, rad, s, expx, expy, expz;
if( !PyArg_ParseTuple( args, "O", &listargs ) ) if( !PyArg_ParseTuple( args, "O", &listargs ) )
return ( EXPP_ReturnPyObjError return ( EXPP_ReturnPyObjError
@ -425,7 +425,6 @@ static PyObject *Metaball_addMetaelem( BPy_Metaball * self, PyObject * args )
y = PyFloat_AsDouble( PyList_GetItem( listargs, 2 ) ); y = PyFloat_AsDouble( PyList_GetItem( listargs, 2 ) );
z = PyFloat_AsDouble( PyList_GetItem( listargs, 3 ) ); z = PyFloat_AsDouble( PyList_GetItem( listargs, 3 ) );
rad = PyFloat_AsDouble( PyList_GetItem( listargs, 4 ) ); rad = PyFloat_AsDouble( PyList_GetItem( listargs, 4 ) );
lay = PyInt_AsLong( PyList_GetItem( listargs, 5 ) );
s = PyFloat_AsDouble( PyList_GetItem( listargs, 6 ) ); s = PyFloat_AsDouble( PyList_GetItem( listargs, 6 ) );
expx = PyFloat_AsDouble( PyList_GetItem( listargs, 7 ) ); expx = PyFloat_AsDouble( PyList_GetItem( listargs, 7 ) );
expy = PyFloat_AsDouble( PyList_GetItem( listargs, 8 ) ); expy = PyFloat_AsDouble( PyList_GetItem( listargs, 8 ) );
@ -438,7 +437,6 @@ static PyObject *Metaball_addMetaelem( BPy_Metaball * self, PyObject * args )
ml->y = y; ml->y = y;
ml->z = z; ml->z = z;
ml->rad = rad; ml->rad = rad;
ml->lay = lay;
ml->s = s; ml->s = s;
ml->flag = SELECT; ml->flag = SELECT;
ml->type = type; ml->type = type;

@ -2980,17 +2980,30 @@ static void drawmball(Object *ob, int dt)
while(ml) { while(ml) {
/* draw radius */
if(ob==G.obedit) { if(ob==G.obedit) {
if(ml->flag & SELECT) cpack(0xA0A0F0); if((ml->flag & SELECT) && (ml->flag & MB_SCALE_RAD)) cpack(0xA0A0F0);
else cpack(0x3030A0); else cpack(0x3030A0);
if(G.f & G_PICKSEL) { if(G.f & G_PICKSEL) {
ml->selcol= code; ml->selcol1= code;
glLoadName(code++); glLoadName(code++);
} }
} }
drawcircball(&(ml->x), ml->rad, imat); drawcircball(&(ml->x), ml->rad, imat);
/* draw stiffness */
if(ob==G.obedit) {
if((ml->flag & SELECT) && !(ml->flag & MB_SCALE_RAD)) cpack(0xA0F0A0);
else cpack(0x30A030);
if(G.f & G_PICKSEL) {
ml->selcol2= code;
glLoadName(code++);
}
}
drawcircball(&(ml->x), ml->rad*atan(ml->s)/M_PI_2, imat);
ml= ml->next; ml= ml->next;
} }
} }

@ -177,9 +177,8 @@ void add_primitiveMball(int dummy_argument)
ml->quat[2]= 0.0; ml->quat[2]= 0.0;
ml->quat[3]= 0.0; ml->quat[3]= 0.0;
ml->rad= 2.0; ml->rad= 2.0;
ml->lay= 1;
ml->s= 2.0; ml->s= 2.0;
ml->flag= SELECT; ml->flag= SELECT | MB_SCALE_RAD;
switch(dummy_argument) { switch(dummy_argument) {
case 1: case 1:
@ -258,13 +257,19 @@ void mouse_mball()
if(hits>0) { if(hits>0) {
ml= startelem; ml= startelem;
while(ml) { while(ml) {
/* if(base->lay & G.vd->lay) { */
for(a=0; a<hits; a++) { for(a=0; a<hits; a++) {
/* index converted for gl stuff */ /* index converted for gl stuff */
if(ml->selcol==buffer[ 4 * a + 3 ]) act= ml; if(ml->selcol1==buffer[ 4 * a + 3 ]){
ml->flag |= MB_SCALE_RAD;
act= ml;
}
if(ml->selcol2==buffer[ 4 * a + 3 ]){
ml->flag &= ~MB_SCALE_RAD;
act= ml;
}
} }
/* } */
if(act) break; if(act) break;

@ -1400,7 +1400,14 @@ void borderselect(void)
while(ml) { while(ml) {
for(a=0; a<hits; a++) { for(a=0; a<hits; a++) {
if(ml->selcol==buffer[ (4 * a) + 3 ]) { if(ml->selcol1==buffer[ (4 * a) + 3 ]) {
ml->flag |= MB_SCALE_RAD;
if(val==LEFTMOUSE) ml->flag |= SELECT;
else ml->flag &= ~SELECT;
break;
}
if(ml->selcol2==buffer[ (4 * a) + 3 ]) {
ml->flag &= ~MB_SCALE_RAD;
if(val==LEFTMOUSE) ml->flag |= SELECT; if(val==LEFTMOUSE) ml->flag |= SELECT;
else ml->flag &= ~SELECT; else ml->flag &= ~SELECT;
break; break;

@ -1021,6 +1021,9 @@ int Resize(TransInfo *t, short mval[2])
add_tdi_poin(tdi->sizez, tdi->oldsize+2, vec[2]); add_tdi_poin(tdi->sizez, tdi->oldsize+2, vec[2]);
} }
else if((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)){
*td->val = td->ival * fsize[0] * td->factor;
}
else { else {
td->ext->size[0] = td->ext->isize[0] * (fsize[0]) * td->factor; td->ext->size[0] = td->ext->isize[0] * (fsize[0]) * td->factor;
td->ext->size[1] = td->ext->isize[1] * (fsize[1]) * td->factor; td->ext->size[1] = td->ext->isize[1] * (fsize[1]) * td->factor;

@ -591,7 +591,7 @@ static void createTransMBallVerts(TransInfo *t)
VECCOPY(td->iloc, td->loc); VECCOPY(td->iloc, td->loc);
VECCOPY(td->center, td->loc); VECCOPY(td->center, td->loc);
if(ml->flag & SELECT) td->flag= TD_SELECTED | TD_USEQUAT; if(ml->flag & SELECT) td->flag= TD_SELECTED | TD_USEQUAT | TD_SINGLESIZE;
else td->flag= TD_USEQUAT; else td->flag= TD_USEQUAT;
Mat3CpyMat3(td->smtx, smtx); Mat3CpyMat3(td->smtx, smtx);
@ -599,13 +599,24 @@ static void createTransMBallVerts(TransInfo *t)
td->ext = tx; td->ext = tx;
td->tdi = NULL; td->tdi = NULL;
td->val = NULL;
/* Radius of MetaElem (mass of MetaElem influence) */
if(ml->flag & MB_SCALE_RAD){
td->val = &ml->rad;
td->ival = ml->rad;
}
else{
td->val = &ml->s;
td->ival = ml->s;
}
/* expx/expy/expz determine "shape" of some MetaElem types */
tx->size = &ml->expx; tx->size = &ml->expx;
tx->isize[0] = ml->expx; tx->isize[0] = ml->expx;
tx->isize[1] = ml->expy; tx->isize[1] = ml->expy;
tx->isize[2] = ml->expz; tx->isize[2] = ml->expz;
/* quat is used for rotation of MetaElem */
tx->quat = ml->quat; tx->quat = ml->quat;
QUATCOPY(tx->iquat, ml->quat); QUATCOPY(tx->iquat, ml->quat);