[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37766] branches/soc-2011-onion/source/ blender/editors/uvedit: smart stitch - previewable colors for vertices, vertices that can be stitched will be painted green while vertices that cannot be stitched will be red + fix for warning message on object scale ! = 1.0

Antony Riakiotakis kalast at gmail.com
Thu Jun 23 22:46:06 CEST 2011


Revision: 37766
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37766
Author:   psy-fi
Date:     2011-06-23 20:46:06 +0000 (Thu, 23 Jun 2011)
Log Message:
-----------
smart stitch - previewable colors for vertices, vertices that can be stitched will be painted green while vertices that cannot be stitched will be red + fix for warning message on object scale != 1.0

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

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c	2011-06-23 19:55:47 UTC (rev 37765)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_draw.c	2011-06-23 20:46:06 UTC (rev 37766)
@@ -835,36 +835,44 @@
 	}
 
 	/* finally draw stitch preview */
-	if((stitch_preview) && stitch_preview->enabled){
+	if(stitch_preview){
 		glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
-		glEnable(GL_BLEND);
-		glEnable(GL_VERTEX_ARRAY);
+		glEnableClientState(GL_VERTEX_ARRAY);
+		if(stitch_preview->enabled){
+			glEnable(GL_BLEND);
 
-		glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewTris);
-		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-		glColor4f(0.0, 1.0, 0.0, 0.2);
-		glDrawArrays(GL_TRIANGLES, 0, stitch_preview->numOfTris*3);
-		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-		glColor4f(1.0, 0.0, 1.0, 0.2);
-		glDrawArrays(GL_TRIANGLES, 0, stitch_preview->numOfTris*3);
-		glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
-		glColor4f(0.0, 0.0, 1.0, 0.5);
-		glDrawArrays(GL_TRIANGLES, 0, stitch_preview->numOfTris*3);
+			glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewTris);
+			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+			glColor4f(0.5, 0.5, 0.0, 0.2);
+			glDrawArrays(GL_TRIANGLES, 0, stitch_preview->numOfTris*3);
+			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+			glColor4f(1.0, 0.0, 1.0, 0.2);
+			glDrawArrays(GL_TRIANGLES, 0, stitch_preview->numOfTris*3);
+			glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+			glColor4f(0.0, 0.0, 1.0, 0.5);
+			glDrawArrays(GL_TRIANGLES, 0, stitch_preview->numOfTris*3);
 
-		glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewQuads);
-		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-		glColor4f(0.0, 1.0, 0.0, 0.5);
-		glDrawArrays(GL_QUADS, 0, stitch_preview->numOfQuads*4);
-		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-		glColor4f(1.0, 0.0, 1.0, 0.5);
-		glDrawArrays(GL_QUADS, 0, stitch_preview->numOfQuads*4);
-		glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
-		glColor4f(0.0, 0.0, 1.0, 0.5);
-		glDrawArrays(GL_QUADS, 0, stitch_preview->numOfQuads*4);
+			glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewQuads);
+			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+			glColor4f(0.5, 0.5, 0.0, 0.2);
+			glDrawArrays(GL_QUADS, 0, stitch_preview->numOfQuads*4);
+			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+			glColor4f(1.0, 0.0, 1.0, 0.2);
+			glDrawArrays(GL_QUADS, 0, stitch_preview->numOfQuads*4);
+			glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+			glColor4f(0.0, 0.0, 1.0, 0.2);
+			glDrawArrays(GL_QUADS, 0, stitch_preview->numOfQuads*4);
 
+			glDisable(GL_BLEND);
+		}
+		glEnableClientState(GL_COLOR_ARRAY);
+		glVertexPointer(2, GL_FLOAT, 0, stitch_preview->previewPoints);
+		glColorPointer(4, GL_UNSIGNED_BYTE, 0, stitch_preview->previewPointColors);
+		glPointSize(5.0);
+		glDrawArrays(GL_POINTS, 0, stitch_preview->numOfPoints);
+
 		glPopClientAttrib();
 		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-		glDisable(GL_BLEND);
 	}
 
 	glPointSize(1.0);

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-23 19:55:47 UTC (rev 37765)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_intern.h	2011-06-23 20:46:06 UTC (rev 37766)
@@ -67,7 +67,7 @@
 #define TF_SEL_MASK(id) (TF_SEL1 << id)
 
 /* margin for scale to differ from 1.0 for printing debug info */
-#define UNWRAP_SCALE_EPSILON 0.0001
+#define UNWRAP_SCALE_EPSILON 0.00001
 
 /* geometric utilities */
 void uv_center(float uv[][2], float cent[2], int quad);

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-23 19:55:47 UTC (rev 37765)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-23 20:46:06 UTC (rev 37766)
@@ -73,6 +73,9 @@
 
 #include "uvedit_intern.h"
 
+#define STITCH_STITCHABLE 1
+#define STITCH_UNSTITCHABLE 2
+
 /************************* state testing ************************/
 
 int ED_uvedit_test(Object *obedit)
@@ -1237,6 +1240,7 @@
 	/* Store Indices to editVerts */
 	for(editVert = state->em->verts.first, i = 0; editVert; editVert = editVert->next, i++){
 		editVert->tmp.t = i;
+		editVert->f1 = 0;
 	}
 
 	/* Make face array and initialize position in preview buffer */
@@ -1248,52 +1252,70 @@
 	/* 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 UV selected... */
+		/* 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))
 				{
+					EditVert *vt = *(&(editFace->v1)+i);
 					/* ...we'll iterate through all shared UV's of the corresponding vertex */
-					UvMapVert *mapVert = vmap->vert[(*(&(editFace->v1)+i))->tmp.t];
-					/* flag is not set anywhere so assuming it's safe to set to indicate use for preview */
-					mapVert->flag = 1;
+					UvMapVert *mapVert = vmap->vert[vt->tmp.t];
+					int numOfPreviewPoints = 0;
 
-					while(mapVert){
-						MTFace *tmptface;
+					/* Have we traversed this vertex before? */
+					if(vt->f1 == 0){
+						vt->f1 = STITCH_UNSTITCHABLE;
 
-						efa = faceArray[mapVert->f];
-						tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+						while(mapVert){
+							MTFace *tmptface;
 
-						preview->numOfPoints++;
+							efa = faceArray[mapVert->f];
+							tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+							numOfPreviewPoints++;
 
-						uv_average[(*(&(editFace->v1)+i))->tmp.t].count++;
-						uv_average[(*(&(editFace->v1)+i))->tmp.t].uv[0] += tmptface->uv[mapVert->tfindex][0];
-						uv_average[(*(&(editFace->v1)+i))->tmp.t].uv[1] += tmptface->uv[mapVert->tfindex][1];
+							/* should probably change these limits to something better. Still it will do for now. */
+							if(fabs((mt->uv[i][0] - tmptface->uv[mapVert->tfindex][0]) > 0.001) ||
+								(fabs(mt->uv[i][1] - tmptface->uv[mapVert->tfindex][1]) > 0.001) ){
+								vt->f1 = STITCH_STITCHABLE;
+							}
 
-						mapVert = mapVert->next;
 
-						/* store position in the preview buffer */
-						if(efa->tmp.l == -1)
-						{
-							if(efa->v4)
+							uv_average[vt->tmp.t].count++;
+							uv_average[vt->tmp.t].uv[0] += tmptface->uv[mapVert->tfindex][0];
+							uv_average[vt->tmp.t].uv[1] += tmptface->uv[mapVert->tfindex][1];
+
+							mapVert = mapVert->next;
+
+							/* store position in the preview buffer */
+							if(efa->tmp.l == -1)
 							{
-								efa->tmp.l = preview->numOfQuads*8;
-								preview->numOfQuads++;
+								if(efa->v4)
+								{
+									efa->tmp.l = preview->numOfQuads*8;
+									preview->numOfQuads++;
+								}
+								else {
+									efa->tmp.l = preview->numOfTris*6;
+									preview->numOfTris++;
+								}
 							}
-							else {
-								efa->tmp.l = preview->numOfTris*6;
-								preview->numOfTris++;
-							}
 						}
+						/* Increase number of preview points accordingly */
+						if(vt->f1 == STITCH_UNSTITCHABLE)
+						{
+							preview->numOfPoints++;
+						} else {
+							preview->numOfPoints += numOfPreviewPoints;
+						}
 					}
 				}
 			}
 		}
 	}
 
-		/* Initialize the preview buffers */
+	/* Initialize the preview buffers */
 	preview->previewQuads = (float *)MEM_mallocN(preview->numOfQuads*sizeof(float)*8, "quad_uv_stitch_prev");
 	preview->previewTris = (float *)MEM_mallocN(preview->numOfTris*sizeof(float)*6, "tri_uv_stitch_prev");
 	preview->previewPoints = (float *)MEM_mallocN(preview->numOfPoints*sizeof(float)*2, "stitch_preview_points");
@@ -1316,35 +1338,47 @@
 	}
 
 	for(editVert = state->em->verts.first; editVert; editVert = editVert->next){
-			short stitchable;
 			UvMapVert *mapVert = vmap->vert[editVert->tmp.t];
 
-			if(mapVert->flag){
-				/* UV's that have a corresponding stitchable UV have a mapVert->next */
-				stitchable = (mapVert->next != NULL);
 
-				while(mapVert){
-					float uv[2];
-					int averageBufIndex;
-					efa = faceArray[mapVert->f];
 
-					averageBufIndex = (*(&(efa->v1) + mapVert->tfindex))->tmp.t;
-					uv[0] = uv_average[averageBufIndex].uv[0]/uv_average[averageBufIndex].count;
-					uv[1] = uv_average[averageBufIndex].uv[1]/uv_average[averageBufIndex].count;
-					preview->previewPoints[bufferIterator*2] = uv[0];
-					preview->previewPoints[bufferIterator*2 + 1] = uv[1];
-					/* stitchable uv's will be green, non-stitchable red */
-					preview->previewPointColors[bufferIterator] = stitchable? (0x00FF0000):(0x0000FF00);
+			if(editVert->f1 != 0){
+				short stitchable = (editVert->f1 == STITCH_STITCHABLE);
 
-					if(efa->v4){
-						preview->previewQuads[efa->tmp.l + 2*mapVert->tfindex] = uv[0];
-						preview->previewQuads[efa->tmp.l + 2*mapVert->tfindex + 1] = uv[1];
+				if(stitchable){
+					while(mapVert){
+						float uv[2];
+						int averageBufIndex;
+						efa = faceArray[mapVert->f];
+						mt = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+
+						averageBufIndex = (*(&(efa->v1) + mapVert->tfindex))->tmp.t;
+						uv[0] = uv_average[averageBufIndex].uv[0]/uv_average[averageBufIndex].count;
+						uv[1] = uv_average[averageBufIndex].uv[1]/uv_average[averageBufIndex].count;
+						preview->previewPoints[bufferIterator*2] = mt->uv[mapVert->tfindex][0];
+						preview->previewPoints[bufferIterator*2 + 1] = mt->uv[mapVert->tfindex][1];
+						/* stitchable uv's will be green, non-stitchable red */
+						preview->previewPointColors[bufferIterator] = 0x0000FF00;
+
+						if(efa->v4){
+							preview->previewQuads[efa->tmp.l + 2*mapVert->tfindex] = uv[0];
+							preview->previewQuads[efa->tmp.l + 2*mapVert->tfindex + 1] = uv[1];
+						}
+						else {
+							preview->previewTris[efa->tmp.l + 2*mapVert->tfindex]  = uv[0];
+							preview->previewTris[efa->tmp.l + 2*mapVert->tfindex + 1] = uv[1];
+						}
+						mapVert = mapVert->next;
+						bufferIterator++;
 					}
-					else {
-						preview->previewTris[efa->tmp.l + 2*mapVert->tfindex]  = uv[0];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list