[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41351] branches/soc-2011-onion-uv-tools/ source/blender/editors/uvedit/uvedit_ops.c: smart stitching

Antony Riakiotakis kalast at gmail.com
Fri Oct 28 22:36:41 CEST 2011


Revision: 41351
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41351
Author:   psy-fi
Date:     2011-10-28 20:36:40 +0000 (Fri, 28 Oct 2011)
Log Message:
-----------
smart stitching
===================
*Completely remove old evaluation function
*Add new shortcuts to area header.

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-28 19:40:32 UTC (rev 41350)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c	2011-10-28 20:36:40 UTC (rev 41351)
@@ -1392,7 +1392,7 @@
 /* This function updates the header of the UV editor when the stitch tool updates its settings */
 static void stitch_update_header(StitchState *stitch_state, bContext *C)
 {
-	static char str[] = "Select(V {+Ctrl deselect}) Toggle(T) %c Vertex  %c Edge,  %c Preview(P),  %c Limit(L),  %c Snap(S),  %c  Midpoints(M), Ctrl+Wheel(limit adjust): %.2f";
+	static char str[] = "Select(V {+Ctrl deselect}) Toggle(T) %c Vertex %c Edge, %c Preview(P), %c Limit(L), %c Snap(S), %c  Midpoints(M), (Ctrl+Wheel/-+)Limit Adjust: %.2f, Switch Static Island(I) ";
 	char msg[256];
 	ScrArea *sa= CTX_wm_area(C);
 	char mode = (stitch_state->mode == VERT_STITCH);
@@ -1532,581 +1532,8 @@
 	island_stitch_data[element->island].medianPoint[1] += (mt->uv[(element->tfindex + 1)%nverts][1] + mt->uv[element->tfindex][1]) / 2.0;
 
 }
-#ifndef STITCHNEW
-/* This function prepares the data of the previewer for display */
-static int stitch_process_data(StitchState *state, int final, Scene *scene, int doIndexInit)
-{
-	StitchPreviewer *preview = uv_get_stitch_previewer();
-	UVVertAverage *uv_average;
-	UvElementMap *elementMap = state->elementMap;
-	UvElement *element;
-	int i;
-	int bufferIterator = 0;
-	EditFace *editFace, *efa;
-	//**faceArray;
-	EditVert *editVert;
-	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;
-	short preview_enabled = preview->enabled;
-
-	/* cleanup previous preview */
-	stitch_preview_delete();
-	preview = stitch_preview_init();
-	if(preview == NULL)
-		return OPERATOR_CANCELLED;
-	preview->enabled = preview_enabled;
-	preview->mode = state->mode;
-	/* UV average is stored for every UV since potentially every UV can be stitched with another. Highly unlikely, I know but possible
-	 * nevertheless :p */
-	uv_average = (UVVertAverage *)MEM_callocN(state->elementMap->totalUVs*sizeof(UVVertAverage), "stitch_averages");
-
-	/* Store Indices to editVerts */
-	if(doIndexInit){
-		for(editVert = state->em->verts.first, i = 0; editVert; editVert = editVert->next, i++){
-			editVert->tmp.l = i;
-		}
-	}
-
-	/* Make face array and initialize position in preview buffer */
-	for(editFace = state->em->faces.first; editFace; editFace = editFace->next){
-		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(*commonVertMaps), "commonVertMaps");
-
-	if(state->snapIslands){
-		island_stitch_data = MEM_callocN(sizeof(*island_stitch_data)*state->elementMap->totalIslands, "stitch_island_data");
-	}
-
-	/* Iterate over all faces and find selected uv's */
-	for(editFace = state->em->faces.first ; editFace; editFace=editFace->next){
-		int vertsPerFace;
-
-		mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
-		vertsPerFace = editFace->v4 ? 4 : 3;
-
-		for(i = 0; i < vertsPerFace; i++){
-			/************ Vert stitching case **********************/
-			if(state->mode == VERT_STITCH){
-				if(uvedit_uv_selected(scene, editFace, mt, 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 = elementMap->vert[vt->tmp.l];
-
-					/* 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)
-						{
-							/* Assign first UV coincident */
-							element = el_iter;
-							averageIndex = element - elementMap->buf;
-						}
-					}
-
-					/* Add preview only if it hasn't been added already */
-					if(!(element->flag & (STITCH_STITCHABLE | STITCH_PROCESSED))){
-						preview->numOfStitchable++;
-					}
-
-					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 = elementMap->vert[vt->tmp.l], iter = 0; el_iter; el_iter = el_iter->next){
-						MTFace *tmptface;
-
-						if(el_iter == element){
-							continue;
-						}
-
-						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;
-						}
-						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)
-					{
-						/* add original face to preview */
-						if(state->snapIslands){
-							island_stitch_data[element->island].addedForPreview = 1;
-						}
-						else {
-							stitch_set_face_preview_buffer_position(editFace, preview);
-						}
-						for(iter2 = 0; iter2 < iter; iter2++)
-						{
-							int averageIndex2;
-							el_iter = commonVertMaps[iter2];
-							efa = el_iter->face;
-							averageIndex2 = el_iter - elementMap->buf;
-							/* Add preview only if it hasn't been added already */
-							if(!(el_iter->flag & (STITCH_STITCHABLE | STITCH_PROCESSED))){
-								preview->numOfStitchable++;
-							}
-							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];
-							if(state->snapIslands){
-								island_stitch_data[el_iter->island].addedForPreview = 1;
-							}
-							else {
-								stitch_set_face_preview_buffer_position(efa, preview);
-							}
-						}
-					}
-				}
-				/****************** Edge stitching case *************************/
-			} else {
-				/* Is this edge selected? */
-				if(uvedit_uv_selected(scene, editFace, mt, i))
-				{
-					EditVert *v1, *v2;
-					/* The sep hold the first UVElement coincident with our elements. If edge
-					 * is stitchable we must update all these. */
-					UvElement *el_iter, *element2, *el_sep1, *el_sep2, *iter_sep1, *iter_sep2;
-					float uv1[2][2];
-					int nverts, stack_iter;
-					int stackSize1 = 0;
-					int stackSize2 = 0;
-					int index1, index2;
-					UVVertAverage uv_average_tmp[2];
-					/* need another one of these for each of the 2 verts*/
-					UvElement **commonVertMaps2 = MEM_mallocN(state->em->totface*sizeof(UvElement *), "commonVertMaps2");
-
-					memset(uv_average_tmp, 0, sizeof(uv_average_tmp));
-
-					v1 = *(&editFace->v1 + i);
-					v2 = *(&editFace->v1 + (i + 1)%vertsPerFace);
-
-					/* Find the uv element that matches the current face */
-					for(el_iter = elementMap->vert[v1->tmp.l]; el_iter; el_iter = el_iter->next){
-						if(el_iter->separate)
-							el_sep1 = el_iter;
-						efa = el_iter->face;
-						nverts = efa->v4 ? 4 : 3;
-						if(efa == editFace){
-							UvElement *el_iter2;
-							element = el_iter;
-							/* Find the uv element for the other uv too */
-							for(el_iter2 = elementMap->vert[v2->tmp.l]; el_iter2; el_iter2 = el_iter2->next){
-								if(el_iter2->separate)
-									el_sep2 = el_iter2;
-								if(el_iter2->face == efa){
-									element2 = el_iter2;
-									break;
-								}
-							}
-							break;
-						}
-					}
-
-					index1 = element - elementMap->buf;
-					index2 = element2 - elementMap->buf;
-
-					element->flag |= STITCH_PROCESSED;
-					element->flag |= STITCH_EDGE_PREVIEW;
-					preview->numOfStitchable++;
-
-					uv_average_tmp[0].count++;
-					uv_average_tmp[1].count++;
-
-					uv_average_tmp[0].uv[0] = uv1[0][0] = mt->uv[element->tfindex][0];
-					uv_average_tmp[0].uv[1] = uv1[0][1] = mt->uv[element->tfindex][1];
-					uv_average_tmp[1].uv[0] = uv1[1][0] = mt->uv[(element2->tfindex)][0];
-					uv_average_tmp[1].uv[1] = uv1[1][1] = mt->uv[(element2->tfindex)][1];
-
-					/* Now iterate through all faces and find potential stitchable edges */
-					for(el_iter = elementMap->vert[v1->tmp.l]; el_iter; el_iter = el_iter->next){
-						char vertCheck = 0;
-						float uv2[2][2];
-						MTFace *tmptface;
-						efa = el_iter->face;
-						nverts = (efa->v4)? 4 : 3;
-						if(el_iter->separate)
-							iter_sep1 = el_iter;
-						/* Check to see if both vertices exist on the edge of the new face */
-						if((vertCheck = (*(&efa->v1 + (el_iter->tfindex + 1)%nverts) == v2))
-								|| (*(&efa->v1 + (el_iter->tfindex + nverts - 1)%nverts) == v2)){
-
-							tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
-
-							/* Take uv's of second face */
-							uv2[0][0] = tmptface->uv[el_iter->tfindex][0];
-							uv2[0][1] = tmptface->uv[el_iter->tfindex][1];
-							uv2[1][0] = (vertCheck)? tmptface->uv[(el_iter->tfindex + 1)%nverts][0] : tmptface->uv[(el_iter->tfindex + nverts - 1)%nverts][0];
-							uv2[1][1] = (vertCheck)? tmptface->uv[(el_iter->tfindex + 1)%nverts][1] : tmptface->uv[(el_iter->tfindex + nverts - 1)%nverts][1];
-
-							/* Actual checks */
-							if(fabs((uv1[0][0] - uv2[0][0]) < STD_UV_CONNECT_LIMIT) &&

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list