diff options
-rw-r--r-- | source/blender/include/BIF_editmesh.h | 3 | ||||
-rw-r--r-- | source/blender/src/edit.c | 21 | ||||
-rw-r--r-- | source/blender/src/editmesh_tools.c | 427 | ||||
-rw-r--r-- | source/blender/src/header_view3d.c | 13 | ||||
-rw-r--r-- | source/blender/src/toolbox.c | 3 |
5 files changed, 261 insertions, 206 deletions
diff --git a/source/blender/include/BIF_editmesh.h b/source/blender/include/BIF_editmesh.h index 5cf5f6c8f8a..76cb9cada9c 100644 --- a/source/blender/include/BIF_editmesh.h +++ b/source/blender/include/BIF_editmesh.h @@ -216,8 +216,7 @@ int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed); void shape_copy_select_from(void); void shape_propagate(void); -int collapseEdges(int uvmerge); -int collapseFaces(int uvmerge); +int collapseEdges(void); int merge_firstlast(int first, int uvmerge); int merge_target( int target, int uvmerge); diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c index 6587cc301dd..286f544e340 100644 --- a/source/blender/src/edit.c +++ b/source/blender/src/edit.c @@ -1565,13 +1565,13 @@ void mergemenu(void) if(G.scene->selectmode & SCE_SELECT_VERTEX) if(G.editMesh->selected.first && G.editMesh->selected.last && ((EditSelection*)G.editMesh->selected.first)->type == EDITVERT && ((EditSelection*)G.editMesh->selected.last)->type == EDITVERT) - event = pupmenu("Merge %t|At First %x6|At Last%x1|At Center%x3|At Cursor%x4|Collapse Edges%x2|Collapse Faces%x5"); + event = pupmenu("Merge %t|At First %x6|At Last%x1|At Center%x3|At Cursor%x4|Collapse%x2"); else if (G.editMesh->selected.first && ((EditSelection*)G.editMesh->selected.first)->type == EDITVERT) - event = pupmenu("Merge %t|At First %x6|At Center%x3|At Cursor%x4|Collapse Edges%x2|Collapse Faces%x5"); + event = pupmenu("Merge %t|At First %x6|At Center%x3|At Cursor%x4|Collapse%x2"); else if (G.editMesh->selected.last && ((EditSelection*)G.editMesh->selected.last)->type == EDITVERT) - event = pupmenu("Merge %t|At Last %x1|At Center%x3|At Cursor%x4|Collapse Edges%x2|Collapse Faces%x5"); - else event = pupmenu("Merge %t|At Center%x3|At Cursor%x4|Collapse Edges%x2|Collapse Faces%x5"); - else event = pupmenu("Merge %t|At Center%x3|At Cursor%x4|Collapse Edges%x2|Collapse Faces%x5"); + event = pupmenu("Merge %t|At Last %x1|At Center%x3|At Cursor%x4|Collapse%x2"); + else event = pupmenu("Merge %t|At Center%x3|At Cursor%x4|Collapse%x2"); + else event = pupmenu("Merge %t|At Center%x3|At Cursor%x4|Collapse%x2"); switch (event) { case -1: @@ -1597,15 +1597,8 @@ void mergemenu(void) BIF_undo_push("Merge at first selected"); break; case 2: - if(G.qual & LR_CTRLKEY) remCount = collapseEdges(1); - else remCount = collapseEdges(0); - - BIF_undo_push("Collapse Edges"); - break; - case 5: - if(G.qual & LR_CTRLKEY) remCount = collapseFaces(1); - else remCount = collapseFaces(0); - BIF_undo_push("Collapse Faces"); + remCount = collapseEdges(); + BIF_undo_push("Collapse"); break; } notice("Removed %d Vertices", remCount); diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c index 5c6f5c021b7..39247fa0b6d 100644 --- a/source/blender/src/editmesh_tools.c +++ b/source/blender/src/editmesh_tools.c @@ -5622,8 +5622,8 @@ void shape_copy_select_from() } /* Collection Routines|Currently used by the improved merge code*/ -/* both buildEdge_collection() and buildFace_collection() create a list of lists*/ -/* these lists are filled with edges or faces that are topologically connected.*/ +/* buildEdge_collection() creates a list of lists*/ +/* these lists are filled with edges that are topologically connected.*/ typedef struct Collection{ struct Collection *next, *prev; @@ -5636,11 +5636,6 @@ typedef struct CollectedEdge{ EditEdge *eed; } CollectedEdge; -typedef struct CollectedFace{ - struct CollectedFace *next, *prev; - EditFace *efa; -} CollectedFace; - #define MERGELIMIT 0.001 static void build_edgecollection(ListBase *allcollections) @@ -5718,116 +5713,266 @@ static void build_edgecollection(ListBase *allcollections) } } -static void build_facecollection(ListBase *allcollections) /*Builds a collection of lists of connected faces from the currently selected set*/ +static void freecollections(ListBase *allcollections) { + struct Collection *curcollection; + + for(curcollection = allcollections->first; curcollection; curcollection = curcollection->next) + BLI_freelistN(&(curcollection->collectionbase)); + BLI_freelistN(allcollections); +} + +/*Begin UV Edge Collapse Code + Like Edge subdivide, Edge Collapse should handle UV's intelligently, but since UV's are a per-face attribute, normal edge collapse will fail + in areas such as the boundries of 'UV islands'. So for each edge collection we need to build a set of 'welded' UV vertices and edges for it. + The welded UV edges can then be sorted and collapsed. +*/ +typedef struct wUV{ + struct wUV *next, *prev; + ListBase nodes; + float u, v; /*cached copy of UV coordinates pointed to by nodes*/ + EditVert *eve; + int f; +} wUV; + +typedef struct wUVNode{ + struct wUVNode *next, *prev; + float *u; /*pointer to original tface data*/ + float *v; /*pointer to original tface data*/ +} wUVNode; + +typedef struct wUVEdge{ + struct wUVEdge *next, *prev; + float v1uv[2], v2uv[2]; /*nasty.*/ + struct wUV *v1, *v2; /*oriented same as editedge*/ + EditEdge *eed; + int f; +} wUVEdge; + +typedef struct wUVEdgeCollect{ /*used for grouping*/ + struct wUVEdgeCollect *next, *prev; + wUVEdge *uved; + int id; +} wUVEdgeCollect; + +static void append_weldedUV(EditFace *efa, EditVert *eve, int tfindex, ListBase *uvverts){ + wUV *curwvert, *newwvert; + wUVNode *newnode; + int found; + + found = 0; + + for(curwvert=uvverts->first; curwvert; curwvert=curwvert->next){ + if(curwvert->eve == eve && curwvert->u == efa->tf.uv[tfindex][0] && curwvert->v == efa->tf.uv[tfindex][1]){ + newnode = MEM_callocN(sizeof(wUVNode), "Welded UV Vert Node"); + newnode->u = &(efa->tf.uv[tfindex][0]); + newnode->v = &(efa->tf.uv[tfindex][1]); + BLI_addtail(&(curwvert->nodes), newnode); + found = 1; + break; + } + } + + if(!found){ + newnode = MEM_callocN(sizeof(wUVNode), "Welded UV Vert Node"); + newnode->u = &(efa->tf.uv[tfindex][0]); + newnode->v = &(efa->tf.uv[tfindex][1]); + + newwvert = MEM_callocN(sizeof(wUV), "Welded UV Vert"); + newwvert->u = *(newnode->u); + newwvert->v = *(newnode->v); + newwvert->eve = eve; + + BLI_addtail(&(newwvert->nodes), newnode); + BLI_addtail(uvverts, newwvert); + + } +} + +static void build_weldedUVs(ListBase *uvverts){ EditFace *efa; - Collection *facecollection, *newcollection; - CollectedFace *newface; + for(efa=G.editMesh->faces.first; efa; efa=efa->next){ + if(efa->v1->f1) append_weldedUV(efa, efa->v1, 0, uvverts); + if(efa->v2->f1) append_weldedUV(efa, efa->v2, 1, uvverts); + if(efa->v3->f1) append_weldedUV(efa, efa->v3, 2, uvverts); + if(efa->v4 && efa->v4->f1) append_weldedUV(efa, efa->v4, 3, uvverts); + } +} + +static void append_weldedUVEdge(EditFace *efa, EditEdge *eed, ListBase *uvedges){ + wUVEdge *curwedge, *newwedge; + int v1tfindex, v2tfindex, found; - int currtag, lowtag; - short collectionfound = 0; - int tagarray[3]; /*used to pull the tags out of faces vertices. an entry of -1 means no vertex exists....*/ - currtag = 1; /*don't start with zero since f1 is cleared to that in editvert and editface structs already*/ + found = 0; + + if(eed->v1 == efa->v1) v1tfindex = 0; + else if(eed->v1 == efa->v2) v1tfindex = 1; + else if(eed->v1 == efa->v3) v1tfindex = 2; + else if(eed->v1 == efa->v4) v1tfindex = 3; + + if(eed->v2 == efa->v1) v2tfindex = 0; + else if(eed->v2 == efa->v2) v2tfindex = 1; + else if(eed->v2 == efa->v3) v2tfindex = 2; + else if(eed->v2 == efa->v4) v2tfindex = 3; + + for(curwedge=uvedges->first; curwedge; curwedge=curwedge->next){ + if(curwedge->eed == eed && curwedge->v1uv[0] == efa->tf.uv[v1tfindex][0] && curwedge->v1uv[1] == efa->tf.uv[v1tfindex][1] && curwedge->v2uv[0] == efa->tf.uv[v2tfindex][0] && curwedge->v2uv[1] == efa->tf.uv[v2tfindex][1]){ + found = 1; + break; //do nothing, we don't need another welded uv edge + } + } + + if(!found){ + newwedge = MEM_callocN(sizeof(wUVEdge), "Welded UV Edge"); + newwedge->v1uv[0] = efa->tf.uv[v1tfindex][0]; + newwedge->v1uv[1] = efa->tf.uv[v1tfindex][1]; + newwedge->v2uv[0] = efa->tf.uv[v2tfindex][0]; + newwedge->v2uv[1] = efa->tf.uv[v2tfindex][1]; + newwedge->eed = eed; + + BLI_addtail(uvedges, newwedge); + } +} - for (efa=G.editMesh->faces.first; efa; efa=efa->next){ - efa->tmp.l = 0; - efa->v1->tmp.l = 0; - efa->v2->tmp.l = 0; - efa->v3->tmp.l = 0; - if(efa->v4) efa->v4->tmp.l = 0; +static void build_weldedUVEdges(ListBase *uvedges, ListBase *uvverts){ + + wUV *curwvert; + wUVEdge *curwedge; + EditFace *efa; + + for(efa=G.editMesh->faces.first; efa; efa=efa->next){ + if(efa->e1->f1) append_weldedUVEdge(efa, efa->e1, uvedges); + if(efa->e2->f1) append_weldedUVEdge(efa, efa->e2, uvedges); + if(efa->e3->f1) append_weldedUVEdge(efa, efa->e3, uvedges); + if(efa->e4 && efa->e4->f1) append_weldedUVEdge(efa, efa->e4, uvedges); } - /*1st pass*/ - for (efa=G.editMesh->faces.first; efa; efa=efa->next){ - if(efa->f&SELECT){ /*face has no vertices that have been visited before since all the f1 tags are zero*/ - if((efa->v1->tmp.l + efa->v2->tmp.l + efa->v3->tmp.l + ((efa->v4) ? efa->v4->tmp.l : 0)) == 0){ - efa->v1->tmp.l = currtag; - efa->v2->tmp.l = currtag; - efa->v3->tmp.l = currtag; - if(efa->v4) efa->v4->tmp.l = currtag; + + //link vertices: for each uvedge, search uvverts to populate v1 and v2 pointers + for(curwedge=uvedges->first; curwedge; curwedge=curwedge->next){ + for(curwvert=uvverts->first; curwvert; curwvert=curwvert->next){ + if(curwedge->eed->v1 == curwvert->eve && curwedge->v1uv[0] == curwvert->u && curwedge->v1uv[1] == curwvert->v){ + curwedge->v1 = curwvert; + break; } - else{ /*the face has some vert tagged allready as a result of another face that it shares verts with being already visited*/ - lowtag = currtag+1; /* plus one? why? this makes little sense!*/ - - /*test to find the lowest tag....*/ - if(efa->v1->tmp.l < lowtag && efa->v1->tmp.l != 0 && efa->v1->tmp.l != -1) lowtag = efa->v1->tmp.l; - if(efa->v2->tmp.l < lowtag && efa->v2->tmp.l != 0 && efa->v2->tmp.l != -1) lowtag = efa->v2->tmp.l; - if(efa->v3->tmp.l < lowtag && efa->v3->tmp.l != 0 && efa->v3->tmp.l != -1) lowtag = efa->v3->tmp.l; - - if(efa->v4){ - if(efa->v4->tmp.l < lowtag && efa->v4->tmp.l != 0 && efa->v4->tmp.l != -1) lowtag = efa->v4->tmp.l; - } - - /*set all vertices to lowest tag*/ - efa->v1->tmp.l = lowtag; - efa->v2->tmp.l = lowtag; - efa->v3->tmp.l = lowtag; - if(efa->v4) efa->v4->tmp.l = lowtag; + } + for(curwvert=uvverts->first; curwvert; curwvert=curwvert->next){ + if(curwedge->eed->v2 == curwvert->eve && curwedge->v2uv[0] == curwvert->u && curwedge->v2uv[1] == curwvert->v){ + curwedge->v2 = curwvert; + break; } - currtag += 1; } } - - /*2nd pass - Nessecary because of faces connected only by a single vertex*/ - for (efa=G.editMesh->faces.first; efa; efa=efa->next){ - lowtag = currtag+1; /*plus one? why? this makes little sense!*/ - if(efa->f&SELECT){ - tagarray[0] = efa->v1->tmp.l; - tagarray[1] = efa->v2->tmp.l; - tagarray[2] = efa->v3->tmp.l; - tagarray[3] = (efa->v4) ? efa->v4->tmp.l : -1; /*could be a triangle, have to test*/ - - if(efa->v1->tmp.l < lowtag && efa->v1->tmp.l != 0 && efa->v1->tmp.l != -1) lowtag = efa->v1->tmp.l; - if(efa->v2->tmp.l < lowtag && efa->v2->tmp.l != 0 && efa->v2->tmp.l != -1) lowtag = efa->v2->tmp.l; - if(efa->v3->tmp.l < lowtag && efa->v3->tmp.l != 0 && efa->v3->tmp.l != -1) lowtag = efa->v3->tmp.l; - if(efa->v4){ - if(efa->v4->tmp.l < lowtag && efa->v4->tmp.l != 0 && efa->v4->tmp.l != -1) lowtag = efa->v4->tmp.l; +} + +static void free_weldedUVs(ListBase *uvverts){ + wUV *curwvert; + for(curwvert = uvverts->first; curwvert; curwvert=curwvert->next) BLI_freelistN(&(curwvert->nodes)); + BLI_freelistN(uvverts); +} + +static void collapse_edgeuvs(void){ + EditEdge *eed; + ListBase uvedges, uvverts, allcollections; + wUVEdge *curwedge; + wUVNode *curwnode; + wUVEdgeCollect *collectedwuve, *newcollectedwuve; + Collection *wuvecollection, *newcollection; + int curtag, balanced, collectionfound, vcount; + float avg[2]; + + uvverts.first = uvverts.last = uvedges.first = uvedges.last = allcollections.first = allcollections.last = NULL; + + build_weldedUVs(&uvverts); + build_weldedUVEdges(&uvedges, &uvverts); + + curtag = 0; + + for(curwedge=uvedges.first; curwedge; curwedge=curwedge->next){ + curwedge->v1->f = curtag; + curwedge->v2->f = curtag; + curtag +=1; + } + + balanced = 0; + while(!balanced){ + balanced = 1; + for(curwedge=uvedges.first; curwedge; curwedge=curwedge->next){ + if(curwedge->v1->f != curwedge->v2->f){ + if(curwedge->v1->f > curwedge->v2->f) curwedge->v1->f = curwedge->v2->f; + else curwedge->v2->f = curwedge->v1->f; + balanced = 0; } - efa->tmp.l = lowtag; /*actually tag the face now with lowtag*/ } } + for(curwedge=uvedges.first; curwedge; curwedge=curwedge->next) curwedge->f = curwedge->v1->f; - for(efa=G.editMesh->faces.first; efa; efa=efa->next){ - if(efa->f&SELECT){ - if(allcollections->first){ - for(facecollection = allcollections->first; facecollection; facecollection=facecollection->next){ - if(facecollection->index == efa->tmp.l){ - newface = MEM_mallocN(sizeof(CollectedFace), "collected face"); - newface->efa = efa; - BLI_addtail(&(facecollection->collectionbase), newface); - collectionfound = 1; - break; - } - else collectionfound = 0; + + for(curwedge=uvedges.first; curwedge; curwedge=curwedge->next){ + if(allcollections.first){ + for(wuvecollection = allcollections.first; wuvecollection; wuvecollection=wuvecollection->next){ + if(wuvecollection->index == curwedge->f){ + newcollectedwuve = MEM_callocN(sizeof(wUVEdgeCollect), "Collected Welded UV Edge"); + newcollectedwuve->uved = curwedge; + BLI_addtail(&(wuvecollection->collectionbase), newcollectedwuve); + collectionfound = 1; + break; } + + else collectionfound = 0; } - if(allcollections->first == NULL || collectionfound == 0){ - newcollection = MEM_mallocN(sizeof(Collection), "element collection"); - newcollection->index = efa->tmp.l; - newcollection->collectionbase.first = 0; - newcollection->collectionbase.last = 0; - - newface = MEM_mallocN(sizeof(CollectedFace), "collected face"); - newface->efa = efa; + } + if(allcollections.first == NULL || collectionfound == 0){ + newcollection = MEM_callocN(sizeof(Collection), "element collection"); + newcollection->index = curwedge->f; + newcollection->collectionbase.first = 0; + newcollection->collectionbase.last = 0; + + newcollectedwuve = MEM_callocN(sizeof(wUVEdgeCollect), "Collected Welded UV Edge"); + newcollectedwuve->uved = curwedge; - BLI_addtail(&(newcollection->collectionbase), newface); - BLI_addtail(allcollections, newcollection); - } + BLI_addtail(&(newcollection->collectionbase), newcollectedwuve); + BLI_addtail(&allcollections, newcollection); + } + } + + for(wuvecollection=allcollections.first; wuvecollection; wuvecollection=wuvecollection->next){ + + vcount = avg[0] = avg[1] = 0; + + for(collectedwuve= wuvecollection->collectionbase.first; collectedwuve; collectedwuve = collectedwuve->next){ + avg[0] += collectedwuve->uved->v1uv[0]; + avg[1] += collectedwuve->uved->v1uv[1]; + + avg[0] += collectedwuve->uved->v2uv[0]; + avg[1] += collectedwuve->uved->v2uv[1]; + + vcount +=2; + } + avg[0] /= vcount; avg[1] /= vcount; + + for(collectedwuve= wuvecollection->collectionbase.first; collectedwuve; collectedwuve = collectedwuve->next){ + for(curwnode=collectedwuve->uved->v1->nodes.first; curwnode; curwnode=curwnode->next){ + *(curwnode->u) = avg[0]; + *(curwnode->v) = avg[1]; + } + for(curwnode=collectedwuve->uved->v2->nodes.first; curwnode; curwnode=curwnode->next){ + *(curwnode->u) = avg[0]; + *(curwnode->v) = avg[1]; + } + } } -} - -static void freecollections(ListBase *allcollections) -{ - struct Collection *curcollection; - for(curcollection = allcollections->first; curcollection; curcollection = curcollection->next) - BLI_freelistN(&(curcollection->collectionbase)); - BLI_freelistN(allcollections); + free_weldedUVs(&uvverts); + BLI_freelistN(&uvedges); + freecollections(&allcollections); } +/*End UV Edge collapse code*/ + static void collapseuvs(void) { EditFace *efa; @@ -5892,9 +6037,10 @@ static void collapseuvs(void) } } -int collapseEdges(int uvmerge) +int collapseEdges(void) { EditVert *eve; + EditEdge *eed; ListBase allcollections; CollectedEdge *curredge; @@ -5939,94 +6085,17 @@ int collapseEdges(int uvmerge) VECCOPY(((EditEdge*)curredge->eed)->v1->co,avgcount); VECCOPY(((EditEdge*)curredge->eed)->v2->co,avgcount); } - if(uvmerge){ - for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0; - for(curredge = edgecollection->collectionbase.first; curredge; curredge = curredge->next){ - curredge->eed->v1->f1 = 1; - curredge->eed->v2->f1 = 1; - } - - collapseuvs(); - } - } - freecollections(&allcollections); - removedoublesflag(1, MERGELIMIT); - /*get rid of this!*/ - countall(); - return mergecount; -} - -int collapseFaces(int uvmerge){ - - EditVert *eve; - ListBase allcollections; - CollectedFace *currface; - Collection *facecollection; - - int groupcount; - int vcount,totFaces,mergecount; - float avgcount[3]; - - allcollections.first = 0; - allcollections.last = 0; - - mergecount = 0; - build_facecollection(&allcollections); - groupcount = BLI_countlist(&allcollections); - - for(facecollection = allcollections.first; facecollection; facecollection = facecollection->next){ - totFaces = BLI_countlist(&(facecollection->collectionbase)); - mergecount += totFaces; - avgcount[0] = 0; avgcount[1] = 0; avgcount[2] = 0; - vcount = 0; - for(currface = facecollection->collectionbase.first; currface; currface = currface->next){ - avgcount[0] += ((EditFace*)currface->efa)->v1->co[0]; - avgcount[1] += ((EditFace*)currface->efa)->v1->co[1]; - avgcount[2] += ((EditFace*)currface->efa)->v1->co[2]; - - avgcount[0] += ((EditFace*)currface->efa)->v2->co[0]; - avgcount[1] += ((EditFace*)currface->efa)->v2->co[1]; - avgcount[2] += ((EditFace*)currface->efa)->v2->co[2]; - - avgcount[0] += ((EditFace*)currface->efa)->v3->co[0]; - avgcount[1] += ((EditFace*)currface->efa)->v3->co[1]; - avgcount[2] += ((EditFace*)currface->efa)->v3->co[2]; - - vcount+= 3; - - if(((EditFace*)currface->efa)->v4){ - avgcount[0] += ((EditFace*)currface->efa)->v3->co[0]; - avgcount[1] += ((EditFace*)currface->efa)->v3->co[1]; - avgcount[2] += ((EditFace*)currface->efa)->v3->co[2]; - vcount+=1; - } - } - - - avgcount[0] /= vcount; avgcount[1] /=vcount; avgcount[2] /= vcount; - - for(currface = facecollection->collectionbase.first; currface; currface = currface->next){ - VECCOPY(((EditFace*)currface->efa)->v1->co,avgcount); - VECCOPY(((EditFace*)currface->efa)->v2->co,avgcount); - VECCOPY(((EditFace*)currface->efa)->v3->co,avgcount); - if(((EditFace*)currface->efa)->v4) VECCOPY(((EditFace*)currface->efa)->v4->co, avgcount); + /*uv collapse*/ + for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0; + for(eed=G.editMesh->edges.first; eed; eed=eed->next) eed->f1 = 0; + for(curredge = edgecollection->collectionbase.first; curredge; curredge = curredge->next){ + curredge->eed->v1->f1 = 1; + curredge->eed->v2->f1 = 1; + curredge->eed->f1 = 1; } + collapse_edgeuvs(); - if(uvmerge){ - for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0; - - for(currface = facecollection->collectionbase.first; currface; currface = currface->next){ - currface->efa->v1->f1 = 1; - currface->efa->v2->f1 = 1; - currface->efa->v3->f1 = 1; - if(currface->efa->v4){ - currface->efa->v4->f1 = 1; - - } - } - collapseuvs(); - } } freecollections(&allcollections); removedoublesflag(1, MERGELIMIT); diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c index f6d65b7affe..c56a9eedfef 100644 --- a/source/blender/src/header_view3d.c +++ b/source/blender/src/header_view3d.c @@ -2282,8 +2282,8 @@ void do_view3d_edit_mesh_edgesmenu(void *arg, int event) EdgeLoopDelete(); break; case 14: /*Collapse Edges*/ - collapseEdges(0); - BIF_undo_push("Collapse Edges"); + collapseEdges(); + BIF_undo_push("Collapse"); break; } allqueue(REDRAWVIEW3D, 0); @@ -2327,7 +2327,7 @@ static uiBlock *view3d_edit_mesh_edgesmenu(void *arg_unused) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Slide Edge |Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Edge Loop|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse Edges", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); return block; @@ -2363,11 +2363,6 @@ void do_view3d_edit_mesh_facesmenu(void *arg, int event) case 7: /* Set Solid */ mesh_set_smooth_faces(0); break; - - case 8: /*Collapse Faces*/ - collapseFaces(0); - BIF_undo_push("Collapse Faces"); - break; } allqueue(REDRAWVIEW3D, 0); } @@ -2383,7 +2378,7 @@ static uiBlock *view3d_edit_mesh_facesmenu(void *arg_unused) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill|Shift F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beautify Fill|Alt F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse Faces|Alt M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); + uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c index 798ca55f5a0..a6654795243 100644 --- a/source/blender/src/toolbox.c +++ b/source/blender/src/toolbox.c @@ -940,7 +940,7 @@ static TBitem tb_mesh_edit_vertex[]= { static TBitem tb_mesh_edit_edge[]= { { 0, "Make Edge/Face|F", 5, NULL}, -{ 0, "Collapse Edges|Alt M", 14, NULL}, +{ 0, "Collapse|Alt M", 14, NULL}, { 0, "SEPR", 0, NULL}, { 0, "Bevel|W, Alt 2", 6, NULL}, { 0, "Loop Subdivide|Ctrl R", 4, NULL}, @@ -966,7 +966,6 @@ static TBitem tb_mesh_edit_face[]= { { 0, "Make Edge/Face|F", 5, NULL}, { 0, "Fill|Shift F", 0, NULL}, { 0, "Beautify Fill|Alt F", 1, NULL}, -{ 0, "Collapse Faces|Alt M", 8, NULL}, { 0, "SEPR", 0, NULL}, { 0, "Convert to Triangles|Ctrl T", 2, NULL}, { 0, "Convert to Quads|Alt J", 3, NULL}, |