forked from bartvdbraak/blender
Added code in loopcut to undo cut if edgeslide was cancelled. (For you Chris!)
Also Added some code for UV's in subdivide. This is close, but still is not perfect :(
This commit is contained in:
parent
d7dcadfb7a
commit
0a05783cba
@ -173,7 +173,7 @@ extern void edge_flip(void);
|
||||
extern void fill_mesh(void);
|
||||
extern void bevel_menu();
|
||||
void edge_rotate_selected(int dir);
|
||||
void EdgeSlide(short immediate, float imperc);
|
||||
int EdgeSlide(short immediate, float imperc);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -363,8 +363,11 @@ void CutEdgeloop(int numcuts)
|
||||
if(numcuts == 1){
|
||||
if(cuthalf)
|
||||
EdgeSlide(1,0.0);
|
||||
else
|
||||
EdgeSlide(0,0.0);
|
||||
else {
|
||||
if(EdgeSlide(0,0.0) == -1){
|
||||
undo_editmode_step(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -1193,6 +1193,17 @@ static void flipvertarray(EditVert** arr, short size)
|
||||
}
|
||||
}
|
||||
|
||||
static int VecEqual(float *a, float *b){
|
||||
if( a[0] == b[0] &&
|
||||
(a[1] == b[1] &&
|
||||
a[2] == b[2])){
|
||||
return 1;
|
||||
}
|
||||
else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void set_uv_vcol(EditFace *efa, float *co, float *uv, char *col)
|
||||
{
|
||||
EditVert *v1,*v2,*v3,*v4;
|
||||
@ -1203,6 +1214,37 @@ static void set_uv_vcol(EditFace *efa, float *co, float *uv, char *col)
|
||||
short i, j;
|
||||
char *cp0, *cp1, *cp2;
|
||||
|
||||
//First Check for exact match between co and efa verts
|
||||
if(VecEqual(co,efa->v1->co)){
|
||||
uv[0] = efa->tf.uv[0][0];
|
||||
uv[1] = efa->tf.uv[0][1];
|
||||
col[0]= (char)efa->tf.col[0];
|
||||
col[1]= (char)(*(&efa->tf.col[0]+1));
|
||||
col[2]= (char)(*(&efa->tf.col[0]+2));
|
||||
col[3]= (char)(*(&efa->tf.col[0]+3));
|
||||
} else if(VecEqual(co,efa->v2->co)){
|
||||
uv[0] = efa->tf.uv[1][0];
|
||||
uv[1] = efa->tf.uv[1][1];
|
||||
col[0]= (char)efa->tf.col[1];
|
||||
col[1]= (char)(*(&efa->tf.col[1]+1));
|
||||
col[2]= (char)(*(&efa->tf.col[1]+2));
|
||||
col[3]= (char)(*(&efa->tf.col[1]+3));
|
||||
} else if(VecEqual(co,efa->v3->co)){
|
||||
uv[0] = efa->tf.uv[2][0];
|
||||
uv[1] = efa->tf.uv[2][1];
|
||||
col[0]= (char)efa->tf.col[2];
|
||||
col[1]= (char)(*(&efa->tf.col[2]+1));
|
||||
col[2]= (char)(*(&efa->tf.col[2]+2));
|
||||
col[3]= (char)(*(&efa->tf.col[2]+3));
|
||||
} else if(efa->v4 && VecEqual(co,efa->v4->co)){
|
||||
uv[0] = efa->tf.uv[3][0];
|
||||
uv[1] = efa->tf.uv[3][1];
|
||||
col[0]= (char)efa->tf.col[3];
|
||||
col[1]= (char)(*(&efa->tf.col[3]+1));
|
||||
col[2]= (char)(*(&efa->tf.col[3]+2));
|
||||
col[3]= (char)(*(&efa->tf.col[3]+3));
|
||||
}
|
||||
|
||||
/* define best projection of face XY, XZ or YZ */
|
||||
xn= fabs(efa->n[0]);
|
||||
yn= fabs(efa->n[1]);
|
||||
@ -4171,7 +4213,7 @@ void freeGHash(GHash *g)
|
||||
return;
|
||||
}
|
||||
|
||||
void EdgeSlide(short immediate, float imperc)
|
||||
int EdgeSlide(short immediate, float imperc)
|
||||
{
|
||||
EditMesh *em = G.editMesh;
|
||||
EditFace *efa;
|
||||
@ -4182,7 +4224,7 @@ void EdgeSlide(short immediate, float imperc)
|
||||
SlideVert *tempsv;
|
||||
float perc = 0, percp = 0;
|
||||
int i = 0,j;
|
||||
int numsel, numadded=0, timesthrough = 0, vertsel=0, prop=1;
|
||||
int numsel, numadded=0, timesthrough = 0, vertsel=0, prop=1, cancel = 0;
|
||||
short event, draw=1;
|
||||
short mval[2], mvalo[2];
|
||||
char str[128];
|
||||
@ -4210,7 +4252,7 @@ void EdgeSlide(short immediate, float imperc)
|
||||
efa->e1->f1++;
|
||||
if(efa->e1->f1 > 2){
|
||||
okee("3+ face edge - Stopping");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if(efa->e2->f & SELECT){
|
||||
@ -4218,7 +4260,7 @@ void EdgeSlide(short immediate, float imperc)
|
||||
efa->e2->f1++;
|
||||
if(efa->e2->f1 > 2){
|
||||
okee("3+ face edge - Stopping");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if(efa->e3->f & SELECT){
|
||||
@ -4226,7 +4268,7 @@ void EdgeSlide(short immediate, float imperc)
|
||||
efa->e3->f1++;
|
||||
if(efa->e3->f1 > 2){
|
||||
okee("3+ face edge - Stopping");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if(efa->e4 && efa->e4->f & SELECT){
|
||||
@ -4234,13 +4276,13 @@ void EdgeSlide(short immediate, float imperc)
|
||||
efa->e4->f1++;
|
||||
if(efa->e4->f1 > 2){
|
||||
okee("3+ face edge - Stopping");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
// Make sure loop is not 2 edges of same face
|
||||
if(ct > 1){
|
||||
okee("loop crosses itself - Stopping");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
// Get # of selected verts
|
||||
@ -4251,7 +4293,7 @@ void EdgeSlide(short immediate, float imperc)
|
||||
// Test for multiple segments
|
||||
if(vertsel > numsel+1){
|
||||
okee("Was not a single edge loop - Stopping");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get the edgeloop in order - mark f1 with SELECT once added
|
||||
@ -4289,7 +4331,7 @@ void EdgeSlide(short immediate, float imperc)
|
||||
if(timesthrough >= numsel*2){
|
||||
BLI_linklist_free(edgelist,NULL);
|
||||
okee("could not order loop - Stopping");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4414,7 +4456,7 @@ void EdgeSlide(short immediate, float imperc)
|
||||
BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN);
|
||||
BLI_linklist_free(vertlist,NULL);
|
||||
BLI_linklist_free(edgelist,NULL);
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
BLI_ghash_insert(vertgh,ev,tempsv);
|
||||
|
||||
@ -4541,11 +4583,16 @@ void EdgeSlide(short immediate, float imperc)
|
||||
event= extern_qread(&val); // extern_qread stores important events for the mainloop to handle
|
||||
|
||||
/* val==0 on key-release event */
|
||||
if(val && ((event==ESCKEY || event==PADENTER)|| ( event==LEFTMOUSE || event==RETKEY ))){
|
||||
draw = 0;
|
||||
}
|
||||
if(val && (event==RIGHTMOUSE || event==ESCKEY || (event==MIDDLEMOUSE) )){
|
||||
perc = 0;
|
||||
if(val && (event == ESCKEY || event==RIGHTMOUSE)){
|
||||
perc = 0; // Set back to begining %
|
||||
immediate = 1; //Run through eval code 1 more time
|
||||
cancel = 1; // Return -1
|
||||
}
|
||||
if(val && ( event==PADENTER || ( event==LEFTMOUSE || event==RETKEY ))){
|
||||
draw = 0; // End looping now
|
||||
}
|
||||
if(val && event==MIDDLEMOUSE){
|
||||
perc = 0;
|
||||
immediate = 1;
|
||||
}
|
||||
}
|
||||
@ -4558,6 +4605,13 @@ void EdgeSlide(short immediate, float imperc)
|
||||
BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN);
|
||||
BLI_linklist_free(vertlist,NULL);
|
||||
BLI_linklist_free(edgelist,NULL);
|
||||
|
||||
if(cancel == 1){
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------- OLD SUBDIVIDE -----------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user