[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37882] branches/soc-2011-onion/source/ blender/editors/uvedit: smart welding - using flags for uv evaluation + some cleanup and preparation stuff for edge stitching , fixed bug where new UV's would not be at the centre of new old ones.

Antony Riakiotakis kalast at gmail.com
Tue Jun 28 03:08:08 CEST 2011


Revision: 37882
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37882
Author:   psy-fi
Date:     2011-06-28 01:08:06 +0000 (Tue, 28 Jun 2011)
Log Message:
-----------
smart welding - using flags for uv evaluation + some cleanup and preparation stuff for edge stitching, fixed bug where new UV's would not be at the centre of new old ones. Still a strange crash remaining. investigating

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

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h	2011-06-28 00:40:39 UTC (rev 37881)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h	2011-06-28 01:08:06 UTC (rev 37882)
@@ -49,8 +49,10 @@
 	float *previewQuads;
 	/* ...and here we'll store the triangles*/
 	float *previewTris;
-	/* Preview points.These will be the selected vertices */
+	/* Preview points.These will be the previewed vertices */
 	float *previewPoints;
+	/* Preview edges, for previewed edges */
+	float *previewEdges;
 	/* Colors for selected vertices */
 	unsigned int *previewPointColors;
 
@@ -58,6 +60,7 @@
 	unsigned int numOfTris;
 	unsigned int numOfQuads;
 	unsigned int numOfPoints;
+	unsigned int numOfEdges;
 	/* stores whether user desires preview display */
 	char enabled;
 } StitchPreviewer;

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-28 00:40:39 UTC (rev 37881)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-28 01:08:06 UTC (rev 37882)
@@ -73,8 +73,9 @@
 
 #include "uvedit_intern.h"
 
-#define STITCH_STITCHABLE 1
-#define STITCH_UNSTITCHABLE 2
+#define STITCH_PROCESSED 1
+#define STITCH_STITCHABLE 2
+#define STITCH_SELECTED	4
 
 /************************* state testing ************************/
 
@@ -1155,12 +1156,14 @@
 	_stitch_preview = MEM_mallocN(sizeof(StitchPreviewer), "stitch_previewer");
 	_stitch_preview->previewQuads = NULL;
 	_stitch_preview->previewTris = NULL;
+	_stitch_preview->previewEdges = NULL;
 	_stitch_preview->previewPoints = NULL;
 	_stitch_preview->previewPointColors = NULL;
 
 	_stitch_preview->numOfQuads = 0;
 	_stitch_preview->numOfTris = 0;
 	_stitch_preview->numOfPoints = 0;
+	_stitch_preview->numOfEdges = 0;
 
 	_stitch_preview->enabled = 1;
 	return _stitch_preview;
@@ -1191,6 +1194,11 @@
 			MEM_freeN(_stitch_preview->previewPointColors);
 			_stitch_preview->previewPointColors = NULL;
 		}
+		if(_stitch_preview->previewEdges)
+		{
+			MEM_freeN(_stitch_preview->previewEdges);
+			_stitch_preview->previewEdges = NULL;
+		}
 		MEM_freeN(_stitch_preview);
 		_stitch_preview = NULL;
 	}
@@ -1223,16 +1231,18 @@
 }
 
 /* This function prepares the data of the previewer for display */
-static int stitch_process_data(StitchState *state, int final)
+static int stitch_process_data(StitchState *state, int final, Scene *scene)
 {
 	StitchPreviewer *preview = uv_get_stitch_previewer();
 	UVVertAverage *uv_average;
 	UvVertMap *vmap = state->vmap;
 	UvMapVert *mapVert = vmap->buf;
 	int i;
+	int numOfEdges = 0;
 	int bufferIterator = 0;
 	EditFace *editFace, *efa, **faceArray;
 	EditVert *editVert;
+	EditEdge *editEdge;
 	MTFace *mt;
 	short preview_enabled = preview->enabled;
 	const char FACE_UVS_SELECTED = TF_SEL1 | TF_SEL2 | TF_SEL3 | TF_SEL4;
@@ -1250,6 +1260,7 @@
 	 * nevertheless :p */
 	uv_average = (UVVertAverage *)MEM_callocN(state->vmap->numOfUVs*sizeof(UVVertAverage), "stitch_averages");
 
+	/* This serves exactly as the EM_init_arrays with the added advantage that we can initialize the preview buffer position. */
 	faceArray = (EditFace **)MEM_mallocN(state->em->totface*sizeof(EditFace *), "stitch preview faceArray");
 	/* Store Indices to editVerts */
 	for(editVert = state->em->verts.first, i = 0; editVert; editVert = editVert->next, i++){
@@ -1262,85 +1273,90 @@
 			editFace->tmp.l = -1;
 		}
 
+	/* If mode is edge mode initialize the edge position on preview buffer to -1 (invalid) */
+	if(state->mode == EDGE_STITCH){
+		for(editEdge = state->em->edges.first; editEdge; editEdge = editEdge->next){
+			editEdge->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(UvMapVert *), "commonVertMaps");
 
-	/* 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;
+	if(state->mode == VERT_STITCH){
+		/* 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;
 
-			for(i = 0; i < vertsPerFace; i++){
-				if(mt->flag & TF_SEL_MASK(i))
-				{
-					int averageIndex;
-					int iter = 0;
-					int iter2;
-					UvMapVert *mv_iter;
-					EditVert *vt = *(&(editFace->v1)+i);
-					/* ...we'll iterate through all shared UV's of the corresponding vertex */
-					mv_iter = vmap->vert[vt->tmp.t];
-					/* Original vertex will be previewed, of course */
-					preview->numOfPoints++;
+				for(i = 0; i < vertsPerFace; i++){
+					if(mt->flag & TF_SEL_MASK(i))
+					{
+						int averageIndex;
+						int iter = 0;
+						int iter2;
+						UvMapVert *mv_iter;
+						EditVert *vt = *(&(editFace->v1)+i);
+						/* ...we'll iterate through all shared UV's of the corresponding vertex */
+						mv_iter = vmap->vert[vt->tmp.t];
+						/* Original vertex will be previewed, of course */
+						preview->numOfPoints++;
 
-					/* First we need the UVMapVert that corresponds to our uv */
-					for(;mv_iter; mv_iter =  mv_iter->next)
-					{
-						/* Here we assume face does not use the same vertex twice. */
-						if(faceArray[mv_iter->f] == editFace)
+						/* First we need the UVMapVert that corresponds to our uv */
+						for(;mv_iter; mv_iter =  mv_iter->next)
 						{
-							mapVert = mv_iter;
-							/* If the selected UV has not been flagged as stichable or anything at all, tag it as unstitchable */
-							if(!mapVert->flag)
+							UvMapVert *sep;
+							if(mv_iter->separate)
+								sep = mv_iter;
+							/* Here we assume face does not use the same vertex twice. */
+							if(faceArray[mv_iter->f] == editFace)
 							{
-								mapVert->flag = STITCH_UNSTITCHABLE;
+								/* Assign first UV coincident */
+								mapVert = sep;
+								averageIndex = mapVert - vmap->buf;
 							}
-							averageIndex = mapVert - vmap->buf;
 						}
-					}
-					/* if uv is stitchable, it has already been processed */
-					if(mapVert->flag != STITCH_STITCHABLE)
-					{
-						uv_average[averageIndex].count++;
+
+						uv_average[averageIndex].count = 1;
 						uv_average[averageIndex].uv[0] = mt->uv[i][0];
 						uv_average[averageIndex].uv[1] = mt->uv[i][1];
 
 						for(mv_iter = vmap->vert[vt->tmp.t], iter = 0; mv_iter; mv_iter = mv_iter->next){
 							MTFace *tmptface;
 
-							if(mv_iter == mapVert)
+							if(mv_iter == mapVert){
 								continue;
+							}
 
 							efa = faceArray[mv_iter->f];
 							tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
 							if(fabs((mt->uv[i][0] - tmptface->uv[mv_iter->tfindex][0]) < STD_UV_CONNECT_LIMIT) &&
-								(fabs(mt->uv[i][1] - tmptface->uv[mv_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++] = mv_iter;
+								(fabs(mt->uv[i][1] - tmptface->uv[mv_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++] = mv_iter;
 							} else {
 								if((!state->use_limit) || ( (fabs(mt->uv[i][0] - tmptface->uv[mv_iter->tfindex][0]) < state->limitDist
 									&& fabs(mt->uv[i][1] - tmptface->uv[mv_iter->tfindex][1]) < state->limitDist) ))
 								{
 									commonVertMaps[iter++] = mv_iter;
-									/* pointer arithmetic to the rescue */
-									mapVert->flag = STITCH_STITCHABLE;
-									if(!(mv_iter->flag))
-										preview->numOfPoints++;
-									mv_iter->flag = STITCH_STITCHABLE;
-
-									uv_average[averageIndex].count++;
-									uv_average[averageIndex].uv[0] += tmptface->uv[mv_iter->tfindex][0];
-									uv_average[averageIndex].uv[1] += tmptface->uv[mv_iter->tfindex][1];
+									mapVert->flag |= STITCH_STITCHABLE;
+									if(mv_iter->separate){
+										uv_average[averageIndex].count++;
+										uv_average[averageIndex].uv[0] += tmptface->uv[mv_iter->tfindex][0];
+										uv_average[averageIndex].uv[1] += tmptface->uv[mv_iter->tfindex][1];
+									}
 								}
 							}
 						}
+
+						mapVert->flag |= STITCH_PROCESSED;
 						/* here we update coincident uvs */
-						if(mapVert->flag == STITCH_STITCHABLE)
+						if(mapVert->flag & STITCH_STITCHABLE)
 						{
 							/* add original face to preview */
 							if(editFace->tmp.l == -1)
@@ -1363,7 +1379,9 @@
 								averageIndex2 = mv_iter - vmap->buf;
 								preview->numOfPoints++;
 
-								mv_iter->flag = STITCH_STITCHABLE;
+								mv_iter->flag |= STITCH_STITCHABLE;
+								mv_iter->flag |= STITCH_PROCESSED;
+								/* += because of a complex scenario involving */
 								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];
@@ -1385,9 +1403,12 @@
 				}
 			}
 		}
+
+		MEM_freeN(commonVertMaps);
+
+	} else {
+
 	}
-
-	MEM_freeN(commonVertMaps);
 	if(!final)
 	{
 		/* Initialize the preview buffers */
@@ -1410,7 +1431,7 @@
 			}
 		}
 		for(mapVert = vmap->buf, i = 0; i < state->vmap->numOfUVs; mapVert++, i++){
-			if(mapVert->flag == STITCH_STITCHABLE){
+			if(mapVert->flag & STITCH_STITCHABLE){
 				float uv[2];
 				int averageBufIndex;
 
@@ -1437,7 +1458,8 @@
 				/* reset flag, vertapMapbuffer is persistent and will be used on next run too! */
 				mapVert->flag = 0;
 			}
-			else if(mapVert->flag == STITCH_UNSTITCHABLE)
+			/* stitchable are always processed so this code actually tests non-stitchness */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list