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!
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user