[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38255] branches/soc-2011-onion/source/ blender/editors/uvedit/uvedit_ops.c: Smart UV stitch

Antony Riakiotakis kalast at gmail.com
Sat Jul 9 12:43:23 CEST 2011


Revision: 38255
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38255
Author:   psy-fi
Date:     2011-07-09 10:43:22 +0000 (Sat, 09 Jul 2011)
Log Message:
-----------
Smart UV stitch
=====================
*correct bug with incorrect colouring of preview UV's
*added update view to mode switch

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-09 09:44:57 UTC (rev 38254)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-07-09 10:43:22 UTC (rev 38255)
@@ -1147,8 +1147,9 @@
 #define STITCH_PROCESSED 1
 #define STITCH_STITCHABLE 2
 #define STITCH_EDGE_PREVIEW 4
-#define STITCH_USE_FOR_STITCHING 8
-#define STITCH_DO_UPDATE 16
+#define STITCH_EDGE_STITCHABLE 8
+#define STITCH_USE_FOR_STITCHING 16
+#define STITCH_DO_UPDATE 32
 
 
 /* Previewer stuff (see uvedit_intern.h for more info) */
@@ -1488,6 +1489,7 @@
 
 										element->flag |= STITCH_STITCHABLE;
 										element2->flag |= STITCH_STITCHABLE;
+										element->flag |= STITCH_EDGE_STITCHABLE;
 
 										uv_average_tmp[0].count++;
 										uv_average_tmp[1].count++;
@@ -1521,11 +1523,13 @@
 											/* convention is to use the vertex at the beginning of the edge. This avoids ambiguity
 											 * in situations where two adjacent edges on the same face need to be stitched.  */
 											el_iter->flag |= STITCH_EDGE_PREVIEW;
+											el_iter->flag |= STITCH_EDGE_STITCHABLE;
 										}
 										else {
 											/* We need to flag the UvMapVert corresponding to the other vert, for the reason
 											 * outlined above. */
 											el_iter2->flag |= STITCH_EDGE_PREVIEW;
+											el_iter2->flag |= STITCH_EDGE_STITCHABLE;
 										}
 										preview->numOfOrig++;
 									}
@@ -1624,67 +1628,81 @@
 			}
 		}
 		for(element = vmap->buf, i = 0; i < state->vmap->numOfUVs; element++, i++){
-			if(element->flag & STITCH_STITCHABLE){
-				float uv[2];
+			if(preview->mode == VERT_STITCH)
+			{
+				if(element->flag & STITCH_STITCHABLE){
+					float uv[2];
 
-				efa = element->face;
-				mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+					efa = element->face;
+					mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
 
-				uv[0] = uv_average[i].uv[0]/uv_average[i].count;
-				uv[1] = uv_average[i].uv[1]/uv_average[i].count;
-				if(preview->mode == VERT_STITCH)
-				{
+					uv[0] = uv_average[i].uv[0]/uv_average[i].count;
+					uv[1] = uv_average[i].uv[1]/uv_average[i].count;
+
 					preview->previewOrig[bufferIterator*2] = mt->uv[element->tfindex][0];
 					preview->previewOrig[bufferIterator*2 + 1] = mt->uv[element->tfindex][1];
 					/* stitchable uv's will be green, non-stitchable red */
 					preview->previewOrigColors[bufferIterator] = 0x0000FF00;
 					bufferIterator++;
-				} else if(element->flag & STITCH_EDGE_PREVIEW){
-					int nverts = (efa->v4)? 4 : 3;
-					preview->previewOrig[bufferIterator*4] = mt->uv[element->tfindex][0];
-					preview->previewOrig[bufferIterator*4 + 1] = mt->uv[element->tfindex][1];
-					preview->previewOrig[bufferIterator*4 + 2] = mt->uv[(element->tfindex + 1)%nverts][0];
-					preview->previewOrig[bufferIterator*4 + 3] = mt->uv[(element->tfindex + 1)%nverts][1];
 
-					preview->previewOrigColors[bufferIterator*2] = 0x0000FF00;
-					preview->previewOrigColors[bufferIterator*2 + 1] = 0x0000FF00;
-					bufferIterator++;
-				}
-				if(efa->v4){
-					preview->previewQuads[efa->tmp.l + 2*element->tfindex] = uv[0];
-					preview->previewQuads[efa->tmp.l + 2*element->tfindex + 1] = uv[1];
-				}
-				else {
-					preview->previewTris[efa->tmp.l + 2*element->tfindex]  = uv[0];
-					preview->previewTris[efa->tmp.l + 2*element->tfindex + 1] = uv[1];
-				}
-				/* reset flag, vertapMapbuffer is persistent and will be used on next run too! */
-				element->flag = 0;
-			}
-			/* stitchable are always processed so this code actually tests non-stitchness */
-			else if(element->flag & STITCH_PROCESSED)
-			{
-				efa = element->face;
-				mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
-				if(preview->mode == VERT_STITCH)
-				{
+					if(efa->v4){
+						preview->previewQuads[efa->tmp.l + 2*element->tfindex] = uv[0];
+						preview->previewQuads[efa->tmp.l + 2*element->tfindex + 1] = uv[1];
+					}
+					else {
+						preview->previewTris[efa->tmp.l + 2*element->tfindex]  = uv[0];
+						preview->previewTris[efa->tmp.l + 2*element->tfindex + 1] = uv[1];
+					}
+				} else if(element->flag & STITCH_PROCESSED) {
+					efa = element->face;
+					mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
 					preview->previewOrig[bufferIterator*2] = mt->uv[element->tfindex][0];
 					preview->previewOrig[bufferIterator*2 + 1] = mt->uv[element->tfindex][1];
 					preview->previewOrigColors[bufferIterator] = 0x000000FF;
 					bufferIterator++;
-				} else if(element->flag & STITCH_EDGE_PREVIEW){
-					int nverts = (efa->v4)? 4 : 3;
+				}
+			}else{
+				if(element->flag & STITCH_STITCHABLE){
+					float uv[2];
+					int nverts;
+					efa = element->face;
+					nverts = (efa->v4)? 4 : 3;
+					mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+					uv[0] = uv_average[i].uv[0]/uv_average[i].count;
+					uv[1] = uv_average[i].uv[1]/uv_average[i].count;
+					if(efa->v4){
+						preview->previewQuads[efa->tmp.l + 2*element->tfindex] = uv[0];
+						preview->previewQuads[efa->tmp.l + 2*element->tfindex + 1] = uv[1];
+					}
+					else {
+						preview->previewTris[efa->tmp.l + 2*element->tfindex]  = uv[0];
+						preview->previewTris[efa->tmp.l + 2*element->tfindex + 1] = uv[1];
+					}
+				}
+				if(element->flag & STITCH_EDGE_PREVIEW){
+					int nverts;
+					efa = element->face;
+					nverts = (efa->v4)? 4 : 3;
+					mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
 					preview->previewOrig[bufferIterator*4] = mt->uv[element->tfindex][0];
 					preview->previewOrig[bufferIterator*4 + 1] = mt->uv[element->tfindex][1];
 					preview->previewOrig[bufferIterator*4 + 2] = mt->uv[(element->tfindex + 1)%nverts][0];
 					preview->previewOrig[bufferIterator*4 + 3] = mt->uv[(element->tfindex + 1)%nverts][1];
-
-					preview->previewOrigColors[bufferIterator*2] = 0x000000FF;
-					preview->previewOrigColors[bufferIterator*2 + 1] = 0x000000FF;
+					if(element->flag & STITCH_EDGE_STITCHABLE){
+						preview->previewOrigColors[bufferIterator*2] = 0x0000FF00;
+						preview->previewOrigColors[bufferIterator*2 + 1] = 0x0000FF00;
+					}else
+					{
+						preview->previewOrigColors[bufferIterator*2] = 0x000000FF;
+						preview->previewOrigColors[bufferIterator*2 + 1] = 0x000000FF;
+					}
 					bufferIterator++;
 				}
-				element->flag = 0;
 			}
+			element->flag = 0;
 		}
 	}
 	if(final)
@@ -1862,6 +1880,8 @@
 					stitch_state->mode = VERT_STITCH;
 				else
 					stitch_state->mode = EDGE_STITCH;
+
+				stitch_process_data(stitch_state, 0, scene, 1);
 				break;
 			}
 			return OPERATOR_RUNNING_MODAL;




More information about the Bf-blender-cvs mailing list