[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15117] branches/apricot/source/blender: UV transform X axis mirror

Campbell Barton ideasman42 at gmail.com
Wed Jun 4 16:57:06 CEST 2008


Revision: 15117
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15117
Author:   campbellbarton
Date:     2008-06-04 16:57:06 +0200 (Wed, 04 Jun 2008)

Log Message:
-----------
UV transform X axis mirror

Modified Paths:
--------------
    branches/apricot/source/blender/include/BIF_meshtools.h
    branches/apricot/source/blender/src/meshtools.c
    branches/apricot/source/blender/src/transform_conversions.c
    branches/apricot/source/blender/src/transform_generics.c

Modified: branches/apricot/source/blender/include/BIF_meshtools.h
===================================================================
--- branches/apricot/source/blender/include/BIF_meshtools.h	2008-06-04 12:32:47 UTC (rev 15116)
+++ branches/apricot/source/blender/include/BIF_meshtools.h	2008-06-04 14:57:06 UTC (rev 15117)
@@ -43,6 +43,7 @@
 extern long mesh_octree_table(struct Object *ob, float *co, char mode);
 extern int mesh_get_x_mirror_vert(struct Object *ob, int index);
 extern struct EditVert *editmesh_get_x_mirror_vert(struct Object *ob, float *co);
+extern float *editmesh_get_x_mirror_uv(struct Object *ob, float *co, float *face_cent);
 extern int *mesh_get_x_mirror_faces(struct Object *ob);
 
 #endif

Modified: branches/apricot/source/blender/src/meshtools.c
===================================================================
--- branches/apricot/source/blender/src/meshtools.c	2008-06-04 12:32:47 UTC (rev 15116)
+++ branches/apricot/source/blender/src/meshtools.c	2008-06-04 14:57:06 UTC (rev 15117)
@@ -882,6 +882,47 @@
 	return NULL;
 }
 
+extern void uv_center(float uv[][2], float cent[2], void * isquad);
+float *editmesh_get_x_mirror_uv(Object *ob, float *uv, float *face_cent)
+{
+	float vec[2];
+	float cent_vec[2];
+	float cent[2];
+	
+	/* ignore nan verts */
+	if (isnan(uv[0]) || !finite(uv[0]) ||
+		isnan(uv[1]) || !finite(uv[1])
+	   )
+		return NULL;
+	
+	vec[0]= -((uv[0])-0.5) + 0.5;
+	vec[1]= uv[1];
+
+	cent_vec[0]= -((face_cent[0])-0.5) + 0.5;	
+	cent_vec[1] = face_cent[1];
+	
+	/* TODO - Optimize */
+	{
+		EditFace *efa;
+		int i, len;
+		for(efa=G.editMesh->faces.first; efa; efa=efa->next) {
+			MTFace *tf= (MTFace *)CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
+			uv_center(tf->uv, cent, (void *)efa->v4);
+			
+			if ( (fabs(cent[0] - cent_vec[0]) < 0.001) && (fabs(cent[1] - cent_vec[1]) < 0.001) ) {			
+				len = efa->v4 ? 4 : 3;
+				for (i=0; i<len; i++) {
+					if ( (fabs(tf->uv[i][0] - vec[0]) < 0.001) && (fabs(tf->uv[i][1] - vec[1]) < 0.001) ) {
+						return tf->uv[i];
+					}
+				}
+			}
+		}
+	}
+	
+	return NULL;
+}
+
 static unsigned int mirror_facehash(void *ptr)
 {
 	MFace *mf= ptr;

Modified: branches/apricot/source/blender/src/transform_conversions.c
===================================================================
--- branches/apricot/source/blender/src/transform_conversions.c	2008-06-04 12:32:47 UTC (rev 15116)
+++ branches/apricot/source/blender/src/transform_conversions.c	2008-06-04 14:57:06 UTC (rev 15117)
@@ -2224,6 +2224,7 @@
 	Mat3One(td->smtx);
 }
 
+extern void uv_center(float uv[][2], float cent[2], void * isquad);
 static void createTransUVs(TransInfo *t)
 {
 	TransData *td = NULL;
@@ -2236,6 +2237,13 @@
 	EditMesh *em = G.editMesh;
 	EditFace *efa;
 	
+	int mirror = 0;
+	
+	if ((t->context & CTX_NO_MIRROR) == 0 && (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR))
+	{
+		mirror = 1;
+	}
+	
 	if(is_uv_tface_editing_allowed()==0) return;
 
 	/* count */
@@ -2270,12 +2278,27 @@
 			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++;
+				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) countsel++; 
+				if (efa_s2) countsel++; 
+				if (efa_s3) countsel++; 
+				if (efa->v4 && efa_s4) countsel++;
 				if(propmode)
 					count += (efa->v4)? 4: 3;
+				
+				if (mirror > 0) { /* check if we should be negative */
+					if 		(efa_s1 && tf->uv[0][0] < 0.5) mirror = -mirror;
+					else if	(efa_s2 && tf->uv[1][0] < 0.5) mirror = -mirror;
+					else if	(efa_s3 && tf->uv[2][0] < 0.5) mirror = -mirror;
+					else if	(efa->v4 && efa_s4 && tf->uv[2][0] < 0.5) mirror = -mirror;
+				}
+				
 			} else {
 				efa->tmp.p = NULL;
 			}
@@ -2347,10 +2370,61 @@
 					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);
+					float cent[2] = {0, 0};
+					if (mirror) {
+						uv_center(tf->uv, cent, (void *)efa->v4);
+					}
+					
+					if(simaUVSel_Check(efa, tf, 0)) {
+						UVsToTransData(td, td2d, tf->uv[0], 1);
+						/* Mirror? */
+						if( (mirror>0 && td->iloc[0]>0.5f) || (mirror<0 && td->iloc[0]<0.5f)) {
+							float *uvmir= editmesh_get_x_mirror_uv(G.obedit, td->iloc, cent);	/* initializes octree on first call */
+							if(uvmir && tf->uv[0] != uvmir) {
+								td->tdmir = uvmir;
+							}
+						}
+						td++; td2d++;
+					}
+					
+					if(simaUVSel_Check(efa, tf, 1))	{
+						UVsToTransData(td, td2d, tf->uv[1], 1);
+						/* Mirror? */
+						if( (mirror>0 && td->iloc[0]>0.5f) || (mirror<0 && td->iloc[0]<0.5f)) {
+							float *uvmir= editmesh_get_x_mirror_uv(G.obedit, td->iloc, cent);	/* initializes octree on first call */
+							if(uvmir && tf->uv[1] != uvmir) {
+								td->tdmir = uvmir;
+							}
+						}
+						td++; td2d++;
+					}
+					
+					if(simaUVSel_Check(efa, tf, 2))	{
+						UVsToTransData(td, td2d, tf->uv[2], 1);
+						/* Mirror? */
+						if( (mirror>0 && td->iloc[0]>0.5f) || (mirror<0 && td->iloc[0]<0.5f)) {
+							float *uvmir= editmesh_get_x_mirror_uv(G.obedit, td->iloc, cent);	/* initializes octree on first call */
+							if(uvmir && tf->uv[2] != uvmir) {
+								td->tdmir = uvmir;
+							}
+						}
+						td++; td2d++;
+					}
+					
+					if(efa->v4 && simaUVSel_Check(efa, tf, 3)) {
+						UVsToTransData(td, td2d, tf->uv[3], 1);
+						/* Mirror? */
+						if( (mirror>0 && td->iloc[0]>0.5f) || (mirror<0 && td->iloc[0]<0.5f)) {
+							float *uvmir= editmesh_get_x_mirror_uv(G.obedit, td->iloc, cent);	/* initializes octree on first call */
+							if(uvmir && tf->uv[3] != uvmir) {
+								td->tdmir = uvmir;
+							}
+						}
+						td++; td2d++;
+					}
+
+					
+					
 				}
 			}
 		}

Modified: branches/apricot/source/blender/src/transform_generics.c
===================================================================
--- branches/apricot/source/blender/src/transform_generics.c	2008-06-04 12:32:47 UTC (rev 15116)
+++ branches/apricot/source/blender/src/transform_generics.c	2008-06-04 14:57:06 UTC (rev 15117)
@@ -260,6 +260,28 @@
 		}		
 	}		
 }
+/* assumes G.obedit set to mesh object */
+static void edituv_apply_to_mirror(TransInfo *t)
+{
+	TransData *td = t->data;
+	float *uv;
+	int i;
+	
+	for(i = 0 ; i < t->total; i++, td++) {
+		if (td->flag & TD_NOACTION)
+			break;
+		if (td->loc==NULL)
+			break;
+		if (td->flag & TD_SKIP)
+			continue;
+		
+		uv = td->tdmir;
+		if(uv) {
+			uv[0]= -(td->loc[0]-0.5) + 0.5;
+			uv[1]=  td->loc[1];
+		}
+	}		
+}
 
 /* called for updating while transform acts, once per redraw */
 void recalcData(TransInfo *t)
@@ -415,8 +437,13 @@
 		if (G.obedit->type == OB_MESH) {
 			if(t->spacetype==SPACE_IMAGE) {
 				flushTransUVs(t);
+				
+				if((t->context & CTX_NO_MIRROR) == 0 && (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR))
+					edituv_apply_to_mirror(t);
+				
 				if (G.sima->flag & SI_LIVE_UNWRAP)
 					unwrap_lscm_live_re_solve();
+				
 			} else {
 				/* mirror modifier clipping? */
 				if(t->state != TRANS_CANCEL) {





More information about the Bf-blender-cvs mailing list