[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38389] branches/soc-2011-onion/source/ blender/editors/uvedit/uvedit_ops.c: some cleanup, and snapping related code (still nothing functional)

Antony Riakiotakis kalast at gmail.com
Thu Jul 14 13:32:34 CEST 2011


Revision: 38389
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38389
Author:   psy-fi
Date:     2011-07-14 11:32:33 +0000 (Thu, 14 Jul 2011)
Log Message:
-----------
some cleanup, and snapping related code (still nothing functional) 

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-07-14 09:54:03 UTC (rev 38388)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-07-14 11:32:33 UTC (rev 38389)
@@ -1127,13 +1127,13 @@
 /* stitch state object */
 typedef struct StitchState {
 	/* edge or vertex stitch mode */
-	short mode;
+	char mode;
 	/* use limit flag */
-	short use_limit;
+	char use_limit;
 	/* limit to operator, same as original operator */
 	float limitDist;
-	/* operate on vertex uvs or whole edge uvs */
-	short operationMode;
+	/* snap uv islands together during stitching */
+	char snapIslands;
 	/* editmesh, cached for use in modal handler */
 	EditMesh *em;
 	/* vertmap, contains vertices sharing uv's in linked lists. */
@@ -1223,7 +1223,7 @@
 				(!mode)? '*':' ',
 				uv_get_stitch_previewer()->enabled?'*':' ',
 				stitch_state->use_limit?'*':' ',
-				' ',
+				stitch_state->snapIslands?'*' :' ',
 				stitch_state->limitDist);
 		ED_area_headerprint(sa, msg);
 	}
@@ -1244,6 +1244,18 @@
 	}
 }
 
+struct IslandStitchData;
+
+/* This is a straightforward implementation, couunt the uv's in the island that will move and take the mean displacement and apply it to all
+ * elements of the island except from the stitchable */
+typedef struct IslandStitchData{
+	/* rotation can be used only for edges, for vertices there is no such notion */
+	float rotation;
+	float translation;
+	int numOfElements;
+}IslandStitchData;
+
+
 /* This function prepares the data of the previewer for display */
 static int stitch_process_data(StitchState *state, int final, Scene *scene, int doIndexInit)
 {
@@ -1256,7 +1268,9 @@
 	EditFace *editFace, *efa;
 	//**faceArray;
 	EditVert *editVert;
-	/* This holds uv's that must be updated if the initial uv is stitchable. */
+	IslandStitchData *island_stitch_data = NULL;
+
+	/* This holds uv's corresponding to the same vertex that must be updated if one of them is stitchable. */
 	UvElement **commonVertMaps;
 
 	MTFace *mt;
@@ -1283,322 +1297,323 @@
 
 	/* Make face array and initialize position in preview buffer */
 	for(editFace = state->em->faces.first, i = 0; editFace; editFace = editFace->next, i++){
-			editFace->tmp.l = -1;
-		}
+		editFace->tmp.l = -1;
+	}
 
-		/* The maximum number of faces that a UV can be part of is totfaces. We allocate this here to avoid allocating
-		* this too many times on the fly */
-		commonVertMaps = MEM_mallocN(state->em->totface*sizeof(UvElement *), "commonVertMaps");
+	/* The maximum number of faces that a UV can be part of is totfaces. We allocate this here to avoid allocating
+	* this too many times on the fly */
+	commonVertMaps = MEM_mallocN(state->em->totface*sizeof(*commonVertMaps), "commonVertMaps");
 
+	if(state->snapIslands){
+		island_stitch_data = MEM_callocN(sizeof(*island_stitch_data)*state->vmap->numOfIslands, "stitch_island_data");
+	}
 
-		/* Count number of points/faces so that we allocate appropriate buffer */
-		for(editFace = state->em->faces.first ; editFace; editFace=editFace->next){
-			mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
-			/* if face has any UV's selected... */
-			if(mt->flag & FACE_UVS_SELECTED){
-				int vertsPerFace = editFace->v4 ? 4 : 3;
+	/* Iterate over all faces and find selected uv's */
+	for(editFace = state->em->faces.first ; editFace; editFace=editFace->next){
+		mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
+		/* if face has any UV's selected... */
+		if(mt->flag & FACE_UVS_SELECTED){
+			int vertsPerFace = editFace->v4 ? 4 : 3;
 
-				for(i = 0; i < vertsPerFace; i++){
-					/************ Vert stitching case **********************/
-					if(state->mode == VERT_STITCH){
-						if(mt->flag & TF_SEL_MASK(i))
+			for(i = 0; i < vertsPerFace; i++){
+				/************ Vert stitching case **********************/
+				if(state->mode == VERT_STITCH){
+					if(mt->flag & TF_SEL_MASK(i))
+					{
+						int averageIndex;
+						int iter = 0;
+						int iter2;
+						UvElement *el_iter;
+						EditVert *vt = *(&(editFace->v1)+i);
+						/* ...we'll iterate through all shared UV's of the corresponding vertex */
+						el_iter = vmap->vert[vt->tmp.l];
+						/* Original vertex will be previewed, of course */
+						preview->numOfOrig++;
+
+						/* First we need the UVMapVert that corresponds to our uv */
+						for(;el_iter; el_iter =  el_iter->next)
 						{
-							int averageIndex;
-							int iter = 0;
-							int iter2;
-							UvElement *el_iter;
-							EditVert *vt = *(&(editFace->v1)+i);
-							/* ...we'll iterate through all shared UV's of the corresponding vertex */
-							el_iter = vmap->vert[vt->tmp.l];
-							/* Original vertex will be previewed, of course */
-							preview->numOfOrig++;
-
-							/* First we need the UVMapVert that corresponds to our uv */
-							for(;el_iter; el_iter =  el_iter->next)
+							/* Here we assume face does not use the same vertex twice. */
+							if(el_iter->face == editFace)
 							{
-								/* Here we assume face does not use the same vertex twice. */
-								if(el_iter->face == editFace)
-								{
-									/* Assign first UV coincident */
-									element = el_iter;
-									averageIndex = element - vmap->buf;
-								}
+								/* Assign first UV coincident */
+								element = el_iter;
+								averageIndex = element - vmap->buf;
 							}
+						}
 
-							uv_average[averageIndex].count ++;
-							uv_average[averageIndex].uv[0] += mt->uv[i][0];
-							uv_average[averageIndex].uv[1] += mt->uv[i][1];
+						uv_average[averageIndex].count ++;
+						uv_average[averageIndex].uv[0] += mt->uv[i][0];
+						uv_average[averageIndex].uv[1] += mt->uv[i][1];
 
-							for(el_iter = vmap->vert[vt->tmp.l], iter = 0; el_iter; el_iter = el_iter->next){
-								MTFace *tmptface;
+						for(el_iter = vmap->vert[vt->tmp.l], iter = 0; el_iter; el_iter = el_iter->next){
+							MTFace *tmptface;
 
-								if(el_iter == element){
-									continue;
-								}
+							if(el_iter == element){
+								continue;
+							}
 
-								efa = el_iter->face;
-								tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+							efa = el_iter->face;
+							tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
-								if(fabs((mt->uv[i][0] - tmptface->uv[el_iter->tfindex][0]) < STD_UV_CONNECT_LIMIT) &&
-										(fabs(mt->uv[i][1] - tmptface->uv[el_iter->tfindex][1]) < STD_UV_CONNECT_LIMIT))
-								{
-									/* if the uv being iterated is coincident with the original, just add it to be updated later if
-									 * original uv is stitchable */
-									commonVertMaps[iter++] = el_iter;
+							if(fabs((mt->uv[i][0] - tmptface->uv[el_iter->tfindex][0]) < STD_UV_CONNECT_LIMIT) &&
+								(fabs(mt->uv[i][1] - tmptface->uv[el_iter->tfindex][1]) < STD_UV_CONNECT_LIMIT))
+							{
+								/* if the uv being iterated is coincident with the original, just add it to be updated later if
+								 * original uv is stitchable */
+								commonVertMaps[iter++] = el_iter;
+							}
+							else if((!state->use_limit) || ( (fabs(mt->uv[i][0] - tmptface->uv[el_iter->tfindex][0]) < state->limitDist
+								&& fabs(mt->uv[i][1] - tmptface->uv[el_iter->tfindex][1]) < state->limitDist) ))
+							{
+								commonVertMaps[iter++] = el_iter;
+								element->flag |= STITCH_STITCHABLE;
+								if(el_iter->separate){
+									uv_average[averageIndex].count++;
+									uv_average[averageIndex].uv[0] += tmptface->uv[el_iter->tfindex][0];
+									uv_average[averageIndex].uv[1] += tmptface->uv[el_iter->tfindex][1];
 								}
-								else if((!state->use_limit) || ( (fabs(mt->uv[i][0] - tmptface->uv[el_iter->tfindex][0]) < state->limitDist
-									&& fabs(mt->uv[i][1] - tmptface->uv[el_iter->tfindex][1]) < state->limitDist) ))
-								{
-									commonVertMaps[iter++] = el_iter;
-									element->flag |= STITCH_STITCHABLE;
-									if(el_iter->separate){
-										uv_average[averageIndex].count++;
-										uv_average[averageIndex].uv[0] += tmptface->uv[el_iter->tfindex][0];
-										uv_average[averageIndex].uv[1] += tmptface->uv[el_iter->tfindex][1];
-									}
-								}
 							}
+						}
 
-							element->flag |= STITCH_PROCESSED;
-							/* here we update coincident uvs */
-							if(element->flag & STITCH_STITCHABLE)
+						element->flag |= STITCH_PROCESSED;
+						/* here we update coincident uvs */
+						if(element->flag & STITCH_STITCHABLE)
+						{
+							/* add original face to preview */
+							stitch_update_face_preview_index(editFace, preview);
+							for(iter2 = 0; iter2 < iter; iter2++)
 							{
-								/* add original face to preview */
-								stitch_update_face_preview_index(editFace, preview);
-								for(iter2 = 0; iter2 < iter; iter2++)
-								{
-									int averageIndex2;
-									el_iter = commonVertMaps[iter2];
-									efa = el_iter->face;
-									averageIndex2 = el_iter - vmap->buf;
-									preview->numOfOrig++;
+								int averageIndex2;
+								el_iter = commonVertMaps[iter2];
+								efa = el_iter->face;
+								averageIndex2 = el_iter - vmap->buf;
+								preview->numOfOrig++;
 
-									el_iter->flag |= STITCH_STITCHABLE;
-									//el_iter->flag |= STITCH_PROCESSED;
+								el_iter->flag |= STITCH_STITCHABLE;
+								//el_iter->flag |= STITCH_PROCESSED;
 
-									uv_average[averageIndex2].count += uv_average[averageIndex].count;
-									uv_average[averageIndex2].uv[0] += uv_average[averageIndex].uv[0];
-									uv_average[averageIndex2].uv[1] += uv_average[averageIndex].uv[1];
+								uv_average[averageIndex2].count += uv_average[averageIndex].count;
+								uv_average[averageIndex2].uv[0] += uv_average[averageIndex].uv[0];
+								uv_average[averageIndex2].uv[1] += uv_average[averageIndex].uv[1];
 
-									stitch_update_face_preview_index(efa, preview);
-								}
+								stitch_update_face_preview_index(efa, preview);
 							}
 						}
-					/****************** Edge stitching case *************************/
-					} else
+					}
+				/****************** Edge stitching case *************************/
+				} else {
+					/* Is this edge selected? */
+					if(mt->flag & TF_SEL_MASK(i) && mt->flag & TF_SEL_MASK((i+1)%vertsPerFace))
 					{
-						/* Is this edge selected? */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list