diff options
author | Ton Roosendaal <ton@blender.org> | 2005-03-14 17:16:59 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-03-14 17:16:59 +0300 |
commit | cce74ab4d02bb793c199b7dfdb193e30cc590092 (patch) | |
tree | cdfc26364a94216fe15118d20c1882817575a1a4 /source/blender | |
parent | fd4ad35d4ca04fe35c4a6cdf9cd7385fd56a6106 (diff) |
Transform: brought back axis constraint default after extruding. When
choosing 'individual faces' it uses the ShrinkFatten option.
Note for Martin: center of axis is still wrong, but you know!
Note for non-testers: unfortunately axis constrainting for old
transform now doesn't work anymore. New code is much nicer, I dont restore
hacks!
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/include/editmesh.h | 12 | ||||
-rw-r--r-- | source/blender/src/editmesh_add.c | 6 | ||||
-rw-r--r-- | source/blender/src/editmesh_lib.c | 38 | ||||
-rw-r--r-- | source/blender/src/editmesh_tools.c | 37 |
4 files changed, 53 insertions, 40 deletions
diff --git a/source/blender/include/editmesh.h b/source/blender/include/editmesh.h index 02834c71e5d..b9827e8af54 100644 --- a/source/blender/include/editmesh.h +++ b/source/blender/include/editmesh.h @@ -72,11 +72,13 @@ extern EditFace *exist_face(EditVert *v1, EditVert *v2, EditVert *v3, EditVert * extern void flipface(EditFace *efa); // flips for normal direction extern int compareface(EditFace *vl1, EditFace *vl2); -extern short extrudeflag_face_indiv(short flag); -extern short extrudeflag_verts_indiv(short flag); -extern short extrudeflag_edges_indiv(short flag); -extern short extrudeflag_vert(short flag); -extern short extrudeflag(short flag); +/* flag for selection bits, *nor will be filled with normal for extrusion constraint */ +/* return value defines if such normal was set */ +extern short extrudeflag_face_indiv(short flag, float *nor); +extern short extrudeflag_verts_indiv(short flag, float *nor); +extern short extrudeflag_edges_indiv(short flag, float *nor); +extern short extrudeflag_vert(short flag, float *nor); +extern short extrudeflag(short flag, float *nor); extern void adduplicateflag(int flag); extern void delfaceflag(int flag); diff --git a/source/blender/src/editmesh_add.c b/source/blender/src/editmesh_add.c index 5952f8d96cf..e7247cf1099 100644 --- a/source/blender/src/editmesh_add.c +++ b/source/blender/src/editmesh_add.c @@ -450,7 +450,7 @@ void add_primitiveMesh(int type) Mesh *me; EditVert *eve, *v1=NULL, *v2, *v3, *v4=NULL, *vtop, *vdown; float *curs, d, dia, phi, phid, cent[3], vec[3], imat[3][3], mat[3][3]; - float q[4], cmat[3][3]; + float q[4], cmat[3][3], nor[3]= {0.0, 0.0, 0.0}; static short tot=32, seg=32, subdiv=2; short a, b, ext=0, fill=0, totoud, newob=0; char *undostr="Add Primitive"; @@ -720,7 +720,7 @@ void add_primitiveMesh(int type) vec[1]= dia*phid; Mat3MulVecfl(imat, vec); for(a=0;a<seg-1;a++) { - extrudeflag_vert(2); + extrudeflag_vert(2, nor); // nor unused translateflag(2, vec); } recalc_editnormals(); // does face centers too @@ -756,7 +756,7 @@ void add_primitiveMesh(int type) QuatToMat3(q, cmat); for(a=0; a<seg; a++) { - extrudeflag_vert(2); + extrudeflag_vert(2, nor); // nor unused rotateflag(2, v1->co, cmat); } diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c index 6c96baada5a..43da433f1ef 100644 --- a/source/blender/src/editmesh_lib.c +++ b/source/blender/src/editmesh_lib.c @@ -487,7 +487,8 @@ static void set_edge_directions(void) } /* individual face extrude */ -short extrudeflag_face_indiv(short flag) +/* will use vertex normals for extrusion directions, so *nor is unaffected */ +short extrudeflag_face_indiv(short flag, float *nor) { EditMesh *em = G.editMesh; EditVert *eve, *v1, *v2, *v3, *v4; @@ -576,13 +577,13 @@ short extrudeflag_face_indiv(short flag) /* extrudes individual edges */ -short extrudeflag_edges_indiv(short flag) +/* nor is filled with constraint vector */ +short extrudeflag_edges_indiv(short flag, float *nor) { EditMesh *em = G.editMesh; EditVert *eve; EditEdge *eed; EditFace *efa; - float nor[3]={0.0, 0.0, 0.0}; for(eve= em->verts.first; eve; eve= eve->next) eve->vn= NULL; @@ -618,7 +619,6 @@ short extrudeflag_edges_indiv(short flag) for(eve= em->verts.last; eve; eve= eve->prev) { if(eve->vn) { eve->vn->f |= flag; - VECCOPY(eve->vn->no, nor); // transform() uses it } } @@ -626,12 +626,12 @@ short extrudeflag_edges_indiv(short flag) if(eed->v1->f & eed->v2->f & flag) eed->f |= flag; } - if(nor[0]==0.0 && nor[1]==0.0 && nor[2]==0.0) return 'h'; // h is grab, for correct undo print - return 'n'; + if(nor[0]==0.0 && nor[1]==0.0 && nor[2]==0.0) return 'g'; // g is grab + return 'n'; // n is for normal constraint } /* extrudes individual vertices */ -short extrudeflag_verts_indiv(short flag) +short extrudeflag_verts_indiv(short flag, float *nor) { EditMesh *em = G.editMesh; EditVert *eve; @@ -650,13 +650,13 @@ short extrudeflag_verts_indiv(short flag) for(eve= em->verts.last; eve; eve= eve->prev) if(eve->vn) eve->vn->f |= flag; - return 'h'; // h is grab, for correct undo print + return 'g'; // g is grab } /* this is actually a recode of extrudeflag(), using proper edge/face select */ /* hurms, doesnt use 'flag' yet, but its not called by primitive making stuff anyway */ -static short extrudeflag_edge(short flag) +static short extrudeflag_edge(short flag, float *nor) { /* all select edges/faces: extrude */ /* old select is cleared, in new ones it is set */ @@ -664,7 +664,6 @@ static short extrudeflag_edge(short flag) EditVert *eve, *nextve; EditEdge *eed, *nexted; EditFace *efa, *nextfa; - float nor[3]={0.0, 0.0, 0.0}; short del_old= 0; if(G.obedit==0 || get_mesh(G.obedit)==0) return 0; @@ -816,17 +815,16 @@ static short extrudeflag_edge(short flag) for(eve= em->verts.first; eve; eve= eve->next) { if(eve->vn) { eve->vn->f |= SELECT; - VECCOPY(eve->vn->no, nor); } } EM_select_flush(); - if(nor[0]==0.0 && nor[1]==0.0 && nor[2]==0.0) return 'h'; - return 'n'; + if(nor[0]==0.0 && nor[1]==0.0 && nor[2]==0.0) return 'g'; // grab + return 'n'; // normal constraint } -short extrudeflag_vert(short flag) +short extrudeflag_vert(short flag, float *nor) { /* all verts/edges/faces with (f & 'flag'): extrude */ /* from old verts, 'flag' is cleared, in new ones it is set */ @@ -834,7 +832,6 @@ short extrudeflag_vert(short flag) EditVert *eve, *v1, *v2, *v3, *v4, *nextve; EditEdge *eed, *e1, *e2, *e3, *e4, *nexted; EditFace *efa, *efa2, *nextvl; - float nor[3]={0.0, 0.0, 0.0}; short sel=0, del_old= 0; if(G.obedit==0 || get_mesh(G.obedit)==0) return 0; @@ -1035,9 +1032,6 @@ short extrudeflag_vert(short flag) } } if(eve) { - if(eve->f & flag) { - VECCOPY(eve->no, nor); - } eve->f &= ~128; } eve= nextve; @@ -1045,17 +1039,17 @@ short extrudeflag_vert(short flag) // since its vertex select mode now, it also deselects higher order EM_selectmode_flush(); - if(nor[0]==0.0 && nor[1]==0.0 && nor[2]==0.0) return 'h'; // h is grab, for correct undo print + if(nor[0]==0.0 && nor[1]==0.0 && nor[2]==0.0) return 'g'; // g is grab, for correct undo print return 'n'; } /* generic extrude */ -short extrudeflag(short flag) +short extrudeflag(short flag, float *nor) { if(G.scene->selectmode & SCE_SELECT_VERTEX) - return extrudeflag_vert(flag); + return extrudeflag_vert(flag, nor); else - return extrudeflag_edge(flag); + return extrudeflag_edge(flag, nor); } diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c index 1a4d7b64d9c..51d8c07aede 100644 --- a/source/blender/src/editmesh_tools.c +++ b/source/blender/src/editmesh_tools.c @@ -80,6 +80,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise #include "BIF_space.h" #include "BIF_resources.h" #include "BIF_toolbox.h" +#include "BIF_transform.h" #include "BDR_drawobject.h" #include "BDR_editobject.h" @@ -532,9 +533,11 @@ void hashvert_flag(int flag) } +/* generic extern called extruder */ void extrude_mesh(void) { - short nr, xmode= 0; + float nor[3]= {0.0, 0.0, 0.0}; + short nr, transmode= 0; TEST_EDITMESH @@ -547,18 +550,31 @@ void extrude_mesh(void) if(nr<1) return; - if(nr==1) xmode= extrudeflag(SELECT); - else if(nr==4) xmode= extrudeflag_verts_indiv(SELECT); - else if(nr==3) xmode= extrudeflag_edges_indiv(SELECT); - else xmode= extrudeflag_face_indiv(SELECT); + if(nr==1) transmode= extrudeflag(SELECT, nor); + else if(nr==4) transmode= extrudeflag_verts_indiv(SELECT, nor); + else if(nr==3) transmode= extrudeflag_edges_indiv(SELECT, nor); + else transmode= extrudeflag_face_indiv(SELECT, nor); - if(xmode==0) { + if(transmode==0) { error("No valid selection"); } else { EM_fgon_flags(); countall(); - transform(xmode); + +#ifdef NEWTRANSFORM + /* individual faces? */ + if(nr==2) { + Transform(TFM_SHRINKFATTEN); + } + else { + if(transmode=='n') + BIF_setSingleAxisConstraint(nor); + Transform(TFM_TRANSLATION); + } +#else + transform('g'); +#endif } } @@ -588,7 +604,7 @@ void split_mesh(void) void extrude_repeat_mesh(int steps, float offs) { - float dvec[3], tmat[3][3], bmat[3][3]; + float dvec[3], tmat[3][3], bmat[3][3], nor[3]= {0.0, 0.0, 0.0}; short a,ok; TEST_EDITMESH @@ -609,7 +625,7 @@ void extrude_repeat_mesh(int steps, float offs) Mat3MulVecfl(tmat, dvec); for(a=0;a<steps;a++) { - ok= extrudeflag(SELECT); + ok= extrudeflag(SELECT, nor); if(ok==0) { error("No valid vertices are selected"); break; @@ -631,6 +647,7 @@ void spin_mesh(int steps,int degr,float *dvec, int mode) extern short editbutflag; EditMesh *em = G.editMesh; EditVert *eve,*nextve; + float nor[3]= {0.0, 0.0, 0.0}; float *curs, si,n[3],q[4],cmat[3][3],imat[3][3], tmat[3][3]; float cent[3],bmat[3][3]; float phi; @@ -679,7 +696,7 @@ void spin_mesh(int steps,int degr,float *dvec, int mode) ok= 1; for(a=0;a<steps;a++) { - if(mode==0) ok= extrudeflag(SELECT); + if(mode==0) ok= extrudeflag(SELECT, nor); else adduplicateflag(SELECT); if(ok==0) { error("No valid vertices are selected"); |