[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41108] branches/soc-2011-onion-uv-tools/ source/blender/editors/uvedit/uvedit_ops.c: edge selection/ deselection in stitching working correctly + mode change between edge/ vert stitch fixes.

Antony Riakiotakis kalast at gmail.com
Tue Oct 18 23:20:40 CEST 2011


Revision: 41108
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41108
Author:   psy-fi
Date:     2011-10-18 21:20:39 +0000 (Tue, 18 Oct 2011)
Log Message:
-----------
edge selection/deselection in stitching working correctly + mode change between edge/vert stitch fixes.

Modified Paths:
--------------
    branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c

Modified: branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c	2011-10-18 19:49:55 UTC (rev 41107)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c	2011-10-18 21:20:39 UTC (rev 41108)
@@ -2291,78 +2291,79 @@
 				UvElement *element2 = state->uvs[edge->uv2];
 
 				UvElement *element_iter1 = state->elementMap->vert[(*(&element1->face->v1 + element1->tfindex))->tmp.l];
-				UvElement *element_iter2 = state->elementMap->vert[(*(&element2->face->v1 + element2->tfindex))->tmp.l];
 
 				for(;element_iter1; element_iter1 = element_iter1->next){
-					if(element_iter1->separate){
-						for(;element_iter2; element_iter2 = element_iter2->next){
-							if(element_iter2->separate){
-								int uniqueIndex1;
-								int uniqueIndex2;
-								UvEdge tmp_edge, *edge_iter;
+					UvElement *element_iter2 = state->elementMap->vert[(*(&element2->face->v1 + element2->tfindex))->tmp.l];
 
-								if((element_iter1 == element1) && (element_iter2 == element2))
-									continue;
+					for(;element_iter2; element_iter2 = element_iter2->next){
+						int uniqueIndex1;
+						int uniqueIndex2;
+						UvEdge tmp_edge, *edge_iter;
 
-								uniqueIndex1 = state->map[element_iter1 - state->elementMap->buf];
-								uniqueIndex2 = state->map[element_iter2 - state->elementMap->buf];
+						uniqueIndex1 = state->map[element_iter1 - state->elementMap->buf];
+						uniqueIndex2 = state->map[element_iter2 - state->elementMap->buf];
 
-								if(uniqueIndex2 > uniqueIndex1){
-									tmp_edge.uv1 = uniqueIndex1;
-									tmp_edge.uv2 = uniqueIndex2;
-								}else{
-									tmp_edge.uv1 = uniqueIndex2;
-									tmp_edge.uv2 = uniqueIndex1;
-								}
+						if(uniqueIndex2 > uniqueIndex1){
+							tmp_edge.uv1 = uniqueIndex1;
+							tmp_edge.uv2 = uniqueIndex2;
+						}else{
+							tmp_edge.uv1 = uniqueIndex2;
+							tmp_edge.uv2 = uniqueIndex1;
+						}
 
-								edge_iter = (UvEdge *)BLI_ghash_lookup(state->edgeHash, &tmp_edge);
+						/* Same edge. If we don't use this, internal edges will always be stitchable */
+						if(tmp_edge.uv1 == edge->uv1 && tmp_edge.uv2 == edge->uv2){
+							continue;
+						}
 
-								if(edge_iter && (edge_iter->flag & STITCH_BOUNDARY)){
-									if(state->use_limit){
-										MTFace *mtface_orig1 = CustomData_em_get(&state->em->fdata, element1->face->data, CD_MTFACE);
-										MTFace *mtface_iter1 = CustomData_em_get(&state->em->fdata, element_iter1->face->data, CD_MTFACE);
+						edge_iter = (UvEdge *)BLI_ghash_lookup(state->edgeHash, &tmp_edge);
 
-										MTFace *mtface_orig2 = CustomData_em_get(&state->em->fdata, element1->face->data, CD_MTFACE);
-										MTFace *mtface_iter2 = CustomData_em_get(&state->em->fdata, element_iter1->face->data, CD_MTFACE);
+						if(edge_iter && (edge_iter->flag & STITCH_BOUNDARY) && !(edge_iter->flag & STITCH_STITCHABLE)){
+							if(state->use_limit){
+								MTFace *mtface_orig1 = CustomData_em_get(&state->em->fdata, element1->face->data, CD_MTFACE);
+								MTFace *mtface_iter1 = CustomData_em_get(&state->em->fdata, element_iter1->face->data, CD_MTFACE);
 
-										if(fabs(mtface_orig1->uv[element1->tfindex][0] - mtface_iter1->uv[element_iter1->tfindex][0]) < state->limitDist
+								MTFace *mtface_orig2 = CustomData_em_get(&state->em->fdata, element1->face->data, CD_MTFACE);
+								MTFace *mtface_iter2 = CustomData_em_get(&state->em->fdata, element_iter1->face->data, CD_MTFACE);
+
+								if(fabs(mtface_orig1->uv[element1->tfindex][0] - mtface_iter1->uv[element_iter1->tfindex][0]) < state->limitDist
 										&& fabs(mtface_orig1->uv[element1->tfindex][1] - mtface_iter1->uv[element_iter1->tfindex][1]) < state->limitDist
 										&& fabs(mtface_orig2->uv[element2->tfindex][0] - mtface_iter2->uv[element_iter2->tfindex][0]) < state->limitDist
 										&& fabs(mtface_orig2->uv[element2->tfindex][1] - mtface_iter2->uv[element_iter2->tfindex][1]) < state->limitDist){
-											stitch_setup_face_preview_for_uv_group(element1, state, island_stitch_data);
-											stitch_setup_face_preview_for_uv_group(element2, state, island_stitch_data);
-											stitch_setup_face_preview_for_uv_group(element_iter1, state, island_stitch_data);
-											stitch_setup_face_preview_for_uv_group(element_iter2, state, island_stitch_data);
-											if(!(edge_iter->flag & STITCH_STITCHABLE)){
-												edge_iter->flag |= STITCH_STITCHABLE;
-												preview->numOfStitchable++;
-											}
-											if(!(edge->flag & STITCH_STITCHABLE)){
-												edge->flag |= STITCH_STITCHABLE;
-												preview->numOfStitchable++;
-											}
-										}
-									}else{
-										stitch_setup_face_preview_for_uv_group(element1, state, island_stitch_data);
-										stitch_setup_face_preview_for_uv_group(element2, state, island_stitch_data);
-										stitch_setup_face_preview_for_uv_group(element_iter1, state, island_stitch_data);
-										stitch_setup_face_preview_for_uv_group(element_iter2, state, island_stitch_data);
-										if(!(edge_iter->flag & STITCH_STITCHABLE)){
-											edge_iter->flag |= STITCH_STITCHABLE;
-											preview->numOfStitchable++;
-										}
-										if(!(edge->flag & STITCH_STITCHABLE)){
-											edge->flag |= STITCH_STITCHABLE;
-											preview->numOfStitchable++;
-										}
-									}
+									UvElement *element_prev1 = state->uvs[tmp_edge.uv1];
+									UvElement *element_prev2 = state->uvs[tmp_edge.uv2];
+
+									stitch_setup_face_preview_for_uv_group(element1, state, island_stitch_data);
+									stitch_setup_face_preview_for_uv_group(element2, state, island_stitch_data);
+									stitch_setup_face_preview_for_uv_group(element_prev1, state, island_stitch_data);
+									stitch_setup_face_preview_for_uv_group(element_prev2, state, island_stitch_data);
+
+									edge->flag |= STITCH_STITCHABLE;
+									edge_iter->flag |= STITCH_STITCHABLE;
+									preview->numOfStitchable++;
 								}
+							}else{
+								UvElement *element_prev1 = state->uvs[tmp_edge.uv1];
+								UvElement *element_prev2 = state->uvs[tmp_edge.uv2];
+
+								stitch_setup_face_preview_for_uv_group(element1, state, island_stitch_data);
+								stitch_setup_face_preview_for_uv_group(element2, state, island_stitch_data);
+								stitch_setup_face_preview_for_uv_group(element_prev1, state, island_stitch_data);
+								stitch_setup_face_preview_for_uv_group(element_prev2, state, island_stitch_data);
+
+								edge->flag |= STITCH_STITCHABLE;
+								edge_iter->flag |= STITCH_STITCHABLE;
+								preview->numOfStitchable++;
 							}
 						}
 					}
 				}
-				if(!(edge->flag & STITCH_STITCHABLE)){
+				/* Caution here, this is valid only if each group of edges with common verts is traversed once */
+				if(edge->flag & STITCH_STITCHABLE){
 					/* Add to preview */
+					preview->numOfStitchable++;
+				}
+				else{
 					preview->numOfUnstitchable++;
 				}
 			}else{
@@ -2594,7 +2595,7 @@
 		MEM_freeN(averageUvPosition);
 	}else{
 		for(i = 0; i < state->total_edges; i++){
-			state->edges[i].flag  &= STITCH_SELECTED | STITCH_BOUNDARY;
+			state->edges[i].flag  &= (STITCH_SELECTED | STITCH_BOUNDARY);
 		}
 	}
 
@@ -2894,8 +2895,8 @@
 	}
 }
 
-/* Make sure we are selectig only one of a vertex's common uv */
-static void stitch_select_uv(UvElement *element, StitchState *stitch_state, void **selection_stack, int *total_selected,int select)
+/* Make sure we are selecting only one of a vertex's common uv */
+static void stitch_select_uv(UvElement *element, StitchState *stitch_state, void **selection_stack, int *total_selected, int select)
 {
 	int uniqueIndex;
 	/* This works due to setting of tmp in find nearest uv vert */
@@ -2927,10 +2928,54 @@
 	}
 }
 
-/* Make sure we are selectig only one of edges with common vertices */
-static void stitch_select_edge(UvEdge *edge, StitchState *stitch_state)
+/* Make sure we are selecting only one of edges with common vertices */
+static void stitch_select_edge(UvEdge *edge, StitchState *state, void **selection_stack, int *total_selected, int select)
 {
+	UvElement *element1 = state->uvs[edge->uv1];
+	UvElement *element2 = state->uvs[edge->uv2];
 
+	UvElement *element_iter1 = state->elementMap->vert[(*(&element1->face->v1 + element1->tfindex))->tmp.l];
+
+	for(;element_iter1; element_iter1 = element_iter1->next){
+
+		UvElement *element_iter2 = state->elementMap->vert[(*(&element2->face->v1 + element2->tfindex))->tmp.l];
+
+		for(;element_iter2; element_iter2 = element_iter2->next){
+			int uniqueIndex1;
+			int uniqueIndex2;
+			UvEdge tmp_edge, *edge_iter;
+
+			uniqueIndex1 = state->map[element_iter1 - state->elementMap->buf];
+			uniqueIndex2 = state->map[element_iter2 - state->elementMap->buf];
+
+			if(uniqueIndex2 > uniqueIndex1){
+				tmp_edge.uv1 = uniqueIndex1;
+				tmp_edge.uv2 = uniqueIndex2;
+			}else{
+				tmp_edge.uv1 = uniqueIndex2;
+				tmp_edge.uv2 = uniqueIndex1;
+			}
+
+			edge_iter = (UvEdge *)BLI_ghash_lookup(state->edgeHash, &tmp_edge);
+
+			if(edge_iter && edge_iter->flag & STITCH_SELECTED){
+				int i;
+				edge_iter->flag &= ~STITCH_SELECTED;
+				for(i = 0; i < *total_selected; i++){
+					if(((UvEdge *)selection_stack[i]) == edge_iter){
+						(*total_selected)--;
+						selection_stack[i] = selection_stack[*total_selected];
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	if(select){
+		edge->flag |= STITCH_SELECTED;
+		selection_stack[(*total_selected)++] = edge;
+	}
 }
 
 static int stitch_modal(bContext *C, wmOperator *op, wmEvent *event)
@@ -3019,8 +3064,16 @@
 		/* Use Edge selection */
 		case MKEY:
 			if(event->val == KM_PRESS){
+				EditVert *ev;
+				int i;
+
 				void **new_selection = MEM_mallocN(sizeof(*new_selection)*stitch_state->elementMap->totalUVs, "uv_stitch_selection_stack");
 
+				/* Store Indices to editVerts. */
+				for(ev = stitch_state->em->verts.first, i = 0; ev; ev = ev->next, i++){
+					ev->tmp.l = i;
+				}
+
 				if(stitch_state->mode == EDGE_STITCH){
 					int i;
 					int total_uvs_selected = 0;
@@ -3041,6 +3094,8 @@
 				else{
 					int i;
 					int total_edges_selected = 0;
+
+					/* first do a quick evaluation of stitchability of uvs */
 					for(i = 0; i < stitch_state->selection_size; i++){
 						UvElement *element = (UvElement *)stitch_state->selection_stack[i];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list