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) {


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to