[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