[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14835] trunk/blender/source/blender/src/ transform_conversions.c: Final fix fo revision 14827

Martin Poirier theeth at yahoo.com
Wed May 14 14:25:32 CEST 2008


Revision: 14835
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14835
Author:   theeth
Date:     2008-05-14 14:24:38 +0200 (Wed, 14 May 2008)

Log Message:
-----------
Final fix fo revision 14827

Fixing UV Quad Constraint when cancelling transform. Also, transdata conversion is a bit faster for all UV transforms.

Patch by Cambo, reviewed and revised.

Revision Links:
--------------
    http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14827

Modified Paths:
--------------
    trunk/blender/source/blender/src/transform_conversions.c

Modified: trunk/blender/source/blender/src/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/src/transform_conversions.c	2008-05-14 09:30:27 UTC (rev 14834)
+++ trunk/blender/source/blender/src/transform_conversions.c	2008-05-14 12:24:38 UTC (rev 14835)
@@ -2217,9 +2217,9 @@
 		td->flag |= TD_SELECTED;
 		td->dist= 0.0;
 	}
-	else
+	else {
 		td->dist= MAXFLOAT;
-	
+	}
 	Mat3One(td->mtx);
 	Mat3One(td->smtx);
 }
@@ -2231,25 +2231,57 @@
 	MTFace *tf;
 	int count=0, countsel=0;
 	int propmode = t->flag & T_PROP_EDIT;
-	
+	int efa_s1,efa_s2,efa_s3,efa_s4;
+
 	EditMesh *em = G.editMesh;
 	EditFace *efa;
 	
 	if(is_uv_tface_editing_allowed()==0) return;
 
 	/* count */
-	for (efa= em->faces.first; efa; efa= efa->next) {
-		tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-		if (simaFaceDraw_Check(efa, tf)) {
-			if (simaUVSel_Check(efa, tf, 0)) countsel++; 
-			if (simaUVSel_Check(efa, tf, 1)) countsel++; 
-			if (simaUVSel_Check(efa, tf, 2)) countsel++; 
-			if (efa->v4 && simaUVSel_Check(efa, tf, 3)) countsel++;
-			if(propmode)
-				count += (efa->v4)? 4: 3;
+	if (G.sima->flag & SI_BE_SQUARE && !propmode) {
+		for (efa= em->faces.first; efa; efa= efa->next) {
+			/* store face pointer for second loop, prevent second lookup */
+			tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+			if (simaFaceDraw_Check(efa, tf)) {
+				efa->tmp.p = tf;
+				
+				efa_s1 = simaUVSel_Check(efa, tf, 0);
+				efa_s2 = simaUVSel_Check(efa, tf, 1);
+				efa_s3 = simaUVSel_Check(efa, tf, 2);
+				if (efa->v4) {
+					efa_s4 = simaUVSel_Check(efa, tf, 3);
+					if ( efa_s1 || efa_s2 || efa_s3 || efa_s4 ) {
+						countsel += 4; /* all corners of this quad need their edges moved. so we must store TD for each */
+					}
+				} else {
+					/* tri's are delt with normally when SI_BE_SQUARE's enabled */
+					if (efa_s1) countsel++; 
+					if (efa_s2) countsel++; 
+					if (efa_s3) countsel++;
+				}
+			} else {
+				efa->tmp.p = NULL;
+			}
 		}
+	} else {
+		for (efa= em->faces.first; efa; efa= efa->next) {
+			tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+			if (simaFaceDraw_Check(efa, tf)) {
+				efa->tmp.p = tf;
+				
+				if (simaUVSel_Check(efa, tf, 0)) countsel++; 
+				if (simaUVSel_Check(efa, tf, 1)) countsel++; 
+				if (simaUVSel_Check(efa, tf, 2)) countsel++; 
+				if (efa->v4 && simaUVSel_Check(efa, tf, 3)) countsel++;
+				if(propmode)
+					count += (efa->v4)? 4: 3;
+			} else {
+				efa->tmp.p = NULL;
+			}
+		}
 	}
-
+	
  	/* note: in prop mode we need at least 1 selected */
 	if (countsel==0) return;
 	
@@ -2264,21 +2296,66 @@
 
 	td= t->data;
 	td2d= t->data2d;
-	for (efa= em->faces.first; efa; efa= efa->next) {
-		tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-		if (simaFaceDraw_Check(efa, tf)) {
-			if(propmode || simaUVSel_Check(efa, tf, 0))
-				UVsToTransData(td++, td2d++, tf->uv[0], simaUVSel_Check(efa, tf, 0));
-			if(propmode || simaUVSel_Check(efa, tf, 1))
-				UVsToTransData(td++, td2d++, tf->uv[1], simaUVSel_Check(efa, tf, 1));
-			if(propmode || simaUVSel_Check(efa, tf, 2))
-				UVsToTransData(td++, td2d++, tf->uv[2], simaUVSel_Check(efa, tf, 2));
+	
+	if (G.sima->flag & SI_BE_SQUARE && !propmode) {
+		for (efa= em->faces.first; efa; efa= efa->next) {
+			tf=(MTFace *)efa->tmp.p;
+			if (tf) {
+				efa_s1 = simaUVSel_Check(efa, tf, 0);
+				efa_s2 = simaUVSel_Check(efa, tf, 1);
+				efa_s3 = simaUVSel_Check(efa, tf, 2);
+				
+				if (efa->v4) {
+					efa_s4 = simaUVSel_Check(efa, tf, 3);
+					
+					if ( efa_s1 || efa_s2 || efa_s3 || efa_s4 ) {
+						/* all corners of this quad need their edges moved. so we must store TD for each */
 
-			if(efa->v4 && (propmode || simaUVSel_Check(efa, tf, 3)))
-				UVsToTransData(td++, td2d++, tf->uv[3], simaUVSel_Check(efa, tf, 3));
+						UVsToTransData(td, td2d, tf->uv[0], efa_s1);
+						if (!efa_s1)	td->flag |= TD_SKIP;
+						td++; td2d++;
+
+						UVsToTransData(td, td2d, tf->uv[1], efa_s2);
+						if (!efa_s2)	td->flag |= TD_SKIP;
+						td++; td2d++;
+
+						UVsToTransData(td, td2d, tf->uv[2], efa_s3);
+						if (!efa_s3)	td->flag |= TD_SKIP;
+						td++; td2d++;
+
+						UVsToTransData(td, td2d, tf->uv[3], efa_s4);
+						if (!efa_s4)	td->flag |= TD_SKIP;
+						td++; td2d++;
+					}
+				} else {
+					/* tri's are delt with normally when SI_BE_SQUARE's enabled */
+					if (efa_s1) UVsToTransData(td++, td2d++, tf->uv[0], 1); 
+					if (efa_s2) UVsToTransData(td++, td2d++, tf->uv[1], 1); 
+					if (efa_s3) UVsToTransData(td++, td2d++, tf->uv[2], 1);
+				}
+			}
 		}
+	} else {
+		for (efa= em->faces.first; efa; efa= efa->next) {
+			/*tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+			if (simaFaceDraw_Check(efa, tf)) {*/
+			if ((tf=(MTFace *)efa->tmp.p)) {
+				if (propmode) {
+					UVsToTransData(td++, td2d++, tf->uv[0], simaUVSel_Check(efa, tf, 0));
+					UVsToTransData(td++, td2d++, tf->uv[1], simaUVSel_Check(efa, tf, 1));
+					UVsToTransData(td++, td2d++, tf->uv[2], simaUVSel_Check(efa, tf, 2));
+					if(efa->v4)
+						UVsToTransData(td++, td2d++, tf->uv[3], simaUVSel_Check(efa, tf, 3));
+				} else {
+					if(simaUVSel_Check(efa, tf, 0))				UVsToTransData(td++, td2d++, tf->uv[0], 1);
+					if(simaUVSel_Check(efa, tf, 1))				UVsToTransData(td++, td2d++, tf->uv[1], 1);
+					if(simaUVSel_Check(efa, tf, 2))				UVsToTransData(td++, td2d++, tf->uv[2], 1);
+					if(efa->v4 && simaUVSel_Check(efa, tf, 3))	UVsToTransData(td++, td2d++, tf->uv[3], 1);
+				}
+			}
+		}
 	}
-
+	
 	if (G.sima->flag & SI_LIVE_UNWRAP)
 		unwrap_lscm_live_begin();
 }
@@ -2306,9 +2383,8 @@
 			td->loc2d[1]= floor(height*td->loc2d[1] + 0.5f)/height;
 		}
 	}
-
-	/* always call this, also for cancel (it transforms non-selected vertices...) */
-	if((G.sima->flag & SI_BE_SQUARE) && (t->state != TRANS_CANCEL))
+	
+	if((G.sima->flag & SI_BE_SQUARE) && (t->flag & T_PROP_EDIT)==0 && (t->state != TRANS_CANCEL)) 
 		be_square_tface_uv(em);
 
 	/* this is overkill if G.sima->lock is not set, but still needed */





More information about the Bf-blender-cvs mailing list