[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37963] branches/soc-2011-onion/source/ blender/editors/uvedit/uvedit_ops.c: smart stitch (edge mode) - edge selection + disable stuff to move elsewhere

Antony Riakiotakis kalast at gmail.com
Wed Jun 29 22:22:17 CEST 2011


Revision: 37963
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37963
Author:   psy-fi
Date:     2011-06-29 20:22:14 +0000 (Wed, 29 Jun 2011)
Log Message:
-----------
smart stitch (edge mode) - edge selection + disable stuff to move elsewhere

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

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-29 19:49:11 UTC (rev 37962)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-29 20:22:14 UTC (rev 37963)
@@ -1138,8 +1138,6 @@
 	EditMesh *em;
 	/* vertmap, contains vertices sharing uv's in linked lists. */
 	UvVertMap2 *vmap;
-	/* gHash with operand edges */
-	GHash *edges;
 } StitchState;
 
 /*
@@ -1422,24 +1420,23 @@
 		MEM_freeN(commonVertMaps);
 
 	/* Edge stitching case */
-	} else {
+	}
+	if(0){
 
-		/* Here we store the indices corresponding to UvMapVerts that contain the first vertex of the edge.*/
+		// Here we store the indices corresponding to UvMapVerts that contain the first vertex of the edge.*/
 		int *faceStack = MEM_mallocN(state->em->totface*sizeof(float)*8, "quad_uv_stitch_prev");
-		GHashIterator* edgeIterator = BLI_ghashIterator_new(state->edges);
 
-		for(; !BLI_ghashIterator_isDone(edgeIterator); BLI_ghashIterator_step(edgeIterator)){
-			/* simple check to see which of the two face vertices corresponds to the original */
+		for(; 0;){
+			// simple check to see which of the two face vertices corresponds to the original */
 			char vertCheck = 0;
 			EditVert *v1, *v2;
 			UvElement *element;
 			int stackSize = 0;
-			editEdge = BLI_ghashIterator_getKey(edgeIterator);
 
 			v1 = editEdge->v1;
 			v2 = editEdge->v2;
 
-			/* search for faces with the corresponding UV's and check if they comply with stitchability restrictions */
+			// search for faces with the corresponding UV's and check if they comply with stitchability restrictions */
 			for(element = vmap->vert[v1->tmp.l]; element; element = element->next){
 				int nverts;
 				efa = element->face;
@@ -1450,7 +1447,7 @@
 				}
 			}
 
-			/* Check if faces found comply with stitchability restrictions */
+			// Check if faces found comply with stitchability restrictions */
 			for(i = 0; i < stackSize; i++)
 			{
 				int faceIter;
@@ -1461,15 +1458,15 @@
 				nverts = (editFace->v4)? 4 : 3;
 				mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
 
-				/* Take uv's of first face */
+				// Take uv's of first face */
 				uv1[0][0] = mt->uv[element->tfindex][0];
 				uv1[0][1] = mt->uv[element->tfindex][1];
 				uv1[1][0] = (element->flag & STITCH_EDGE_PLUS)? mt->uv[(element->tfindex + 1)%nverts][0] : mt->uv[(element->tfindex + nverts - 1)%nverts][0];
 				uv1[1][1] = (element->flag & STITCH_EDGE_PLUS)? mt->uv[(element->tfindex + 1)%nverts][1] : mt->uv[(element->tfindex + nverts - 1)%nverts][1];
 
-				/* iterate through all of the rest faces and check if they are */
+				// iterate through all of the rest faces and check if they are */
 				for(faceIter = i+1; faceIter < stackSize; faceIter++){
-					/* flags to check if vertices have passed the test */
+					// flags to check if vertices have passed the test */
 					char v1pass = 0, v2pass = 0;
 					float uv2[2][2];
 					MTFace *tmptface;
@@ -1479,19 +1476,19 @@
 
 					tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
-					/* Take uv's of second face */
+					// Take uv's of second face */
 					uv2[0][0] = tmptface->uv[mapVertIter->tfindex][0];
 					uv2[0][1] = tmptface->uv[mapVertIter->tfindex][1];
 					uv2[1][0] = (mapVertIter->flag & STITCH_EDGE_PLUS)? tmptface->uv[(mapVertIter->tfindex + 1)%nverts][0] : tmptface->uv[(mapVertIter->tfindex + nverts - 1)%nverts][0];
 					uv2[1][1] = (mapVertIter->flag & STITCH_EDGE_PLUS)? tmptface->uv[(mapVertIter->tfindex + 1)%nverts][1] : tmptface->uv[(mapVertIter->tfindex + nverts - 1)%nverts][1];
 
-					/* Actual checks */
+					// Actual checks */
 					if(fabs((uv1[0][0] - uv2[0][0]) < STD_UV_CONNECT_LIMIT) &&
 						(fabs(uv1[0][1] - uv2[0][1]) < STD_UV_CONNECT_LIMIT) &&
 						fabs((uv1[1][0] - uv2[1][0]) < STD_UV_CONNECT_LIMIT) &&
 						(fabs(uv1[1][1] - uv2[1][1]) < STD_UV_CONNECT_LIMIT))
 					{
-						/* Coincident UV's so non-stitchable edge. */
+						// Coincident UV's so non-stitchable edge. */
 						continue;
 					}
 					else if(state->use_limit && ( fabs(uv1[0][0] - uv2[0][0]) > state->limitDist ||
@@ -1499,17 +1496,15 @@
 						fabs(uv1[1][0] - uv2[1][0]) > state->limitDist ||
 						fabs(uv1[1][1] - uv2[1][1]) > state->limitDist))
 					{
-						/* Both UVs out of stitch range */
+						// Both UVs out of stitch range */
 						continue;
 					}
 					else {
-						/* Stitchable case, do the necessary stuff */
+						// Stitchable case, do the necessary stuff */
 					}
 				}
 			}
 		}
-
-		BLI_ghashIterator_free(edgeIterator);
 	}
 
 	if(!final)
@@ -1617,7 +1612,6 @@
 	stitch_state->limitDist = RNA_float_get(op->ptr, "limit");
 	stitch_state->em = em = BKE_mesh_get_editmesh((Mesh*)obedit->data);
 	stitch_state->mode = VERT_STITCH;
-	stitch_state->edges = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "stitch edge selection hash");
 
 	stitch_state->vmap = EM_make_uv_vert_map2(stitch_state->em, 1, limit);
 
@@ -1662,7 +1656,6 @@
 	/* remember to set vertices used for redo operator in an RNA array or something */
 
 	EM_free_uv_vert_map2(stitch_state->vmap);
-	BLI_ghash_free(stitch_state->edges, NULL, NULL);
 
 	BKE_mesh_end_editmesh(obedit->data, stitch_state->em);
 
@@ -1803,10 +1796,48 @@
 					}
 					else
 					{
-						//UvElement *element = EM_get_uv_map_vert_for_edge(stitch_state->vmap, stitch_state->em, edge, 0);
-						//if(element && !BLI_ghash_haskey(stitch_state->edges,element)){
-						//	BLI_ghash_insert(stitch_state->edges, element, NULL);
-						//}
+						/* same as above but for two verts. Maybe make a function for this after implementation is concrete */
+						UvElement *element = stitch_state->vmap->vert[hit.vert];
+						UvElement *element2 = stitch_state->vmap->vert[hit.vert2];
+
+						UvElement *firstCoincident;
+						for(; element; element = element->next)
+						{
+							if(element->separate)
+								firstCoincident = element;
+							if(element->face == hit.efa){
+								for(element = firstCoincident; element; element = element->next){
+									MTFace *tface;
+									if(element->separate && element != firstCoincident)
+										break;
+									tface =  CustomData_em_get(&stitch_state->em->fdata, element->face->data, CD_MTFACE);
+									if(event->ctrl)
+										uvedit_uv_deselect(scene, element->face, tface, element->tfindex);
+									else
+										uvedit_uv_select(scene, element->face, tface, element->tfindex);
+								}
+								break;
+							}
+						}
+
+						for(; element2; element2 = element2->next)
+						{
+							if(element2->separate)
+								firstCoincident = element2;
+							if(element2->face == hit.efa){
+								for(element2 = firstCoincident; element2; element2 = element2->next){
+									MTFace *tface;
+									if(element2->separate && element2 != firstCoincident)
+										break;
+									tface =  CustomData_em_get(&stitch_state->em->fdata, element2->face->data, CD_MTFACE);
+									if(event->ctrl)
+										uvedit_uv_deselect(scene, element2->face, tface, element2->tfindex);
+									else
+										uvedit_uv_select(scene, element2->face, tface, element2->tfindex);
+								}
+								break;
+							}
+						}
 					}
 				}
 				stitch_process_data(stitch_state, 0, scene, 0);




More information about the Bf-blender-cvs mailing list