Revision: 48670
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48670
Author:   psy-fi
Date:     2012-07-06 01:39:41 +0000 (Fri, 06 Jul 2012)
Log Message:
-----------
UV transform correction
========================
* minor speedup, calculate edge lengths only on startup.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/editors/transform/transform.h
    
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_conversions.c
    
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_generics.c

Modified: 
branches/soc-2012-bratwurst/source/blender/editors/transform/transform.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/transform/transform.h    
2012-07-06 01:39:27 UTC (rev 48669)
+++ branches/soc-2012-bratwurst/source/blender/editors/transform/transform.h    
2012-07-06 01:39:41 UTC (rev 48670)
@@ -236,6 +236,8 @@
        /* initial vertex value. We have to store it here too because for 
proportional editing
         * we can't correlate vertex indices to transdata anymore due to 
sorting */
        float (*init_vec)[3];
+       float *edge_length;
+       int total_edges;
        int total_verts;
 } UVTransCorrect;
 

Modified: 
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_conversions.c
===================================================================
--- 
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_conversions.c
        2012-07-06 01:39:27 UTC (rev 48669)
+++ 
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_conversions.c
        2012-07-06 01:39:41 UTC (rev 48670)
@@ -1956,6 +1956,7 @@
        int propmode = (t->flag & T_PROP_EDIT) ? (t->flag & (T_PROP_EDIT | 
T_PROP_CONNECTED)) : 0;
        int mirror = 0;
        char *selstate = NULL;
+       char *edge_length_calc; /* setting to remember which edges have had 
their length calculated */
        short selectmode = ts->selectmode;
 
        if (t->flag & T_MIRROR) {
@@ -2054,7 +2055,10 @@
                uvtc->initial_uvs = initial_uvs = MEM_mallocN(bm->totvert * 
sizeof(*t->uvtc->initial_uvs), "uvtc_inituvs");
                uvtc->init_vec = MEM_mallocN(bm->totvert * 
sizeof(*t->uvtc->init_vec), "uvtc_initial_vertexes");
                uvtc->total_verts = bm->totvert;
-               BM_mesh_elem_index_ensure(bm, BM_VERT);
+               uvtc->total_edges = bm->totedge;
+               uvtc->edge_length = 
MEM_mallocN(sizeof(*uvtc->edge_length)*bm->totedge, "uvtc_edge_length");
+               edge_length_calc = 
MEM_callocN(sizeof(*edge_length_calc)*bm->totedge, 
"transform_edge_length_calc");
+               BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE);
        }
 
        tob = t->data = MEM_callocN(t->total * sizeof(TransData), 
"TransObData(Mesh EditMode)");
@@ -2133,6 +2137,9 @@
                                        tob->eve = eve;
 
                                        BM_ITER_ELEM(l, &iter2, eve, 
BM_LOOPS_OF_VERT) {
+                                               int edge_index = 
BM_elem_index_get(l->e);
+                                               /* we also need the previous 
edge in case the face normals do not behave well */
+                                               int edge_index_prev = 
BM_elem_index_get(l->prev->e);
                                                MLoopUV *luv = 
CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 
                                                *uvtcuv = 
MEM_mallocN(sizeof(**uvtcuv), "uvtcelem");
@@ -2144,6 +2151,15 @@
                                                (*uvtcuv)->l = l;
                                                (*uvtcuv)->next = NULL;
                                                uvtcuv = &((*uvtcuv)->next);
+
+                                               
if(!edge_length_calc[edge_index]) {
+                                                       
uvtc->edge_length[edge_index] = BM_edge_calc_length(l->e);
+                                                       
edge_length_calc[edge_index] = TRUE;
+                                               }
+                                               
if(!edge_length_calc[edge_index_prev]) {
+                                                       
uvtc->edge_length[edge_index_prev] = BM_edge_calc_length(l->prev->e);
+                                                       
edge_length_calc[edge_index_prev] = TRUE;
+                                               }
                                        }
 
                                        /* Now we need to sort uvs according to 
uv island */
@@ -2261,6 +2277,8 @@
                MEM_freeN(defmats);
        if (dists)
                MEM_freeN(dists);
+       if(edge_length_calc)
+               MEM_freeN(edge_length_calc);
        
        MEM_freeN(selstate);
 

Modified: 
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_generics.c
===================================================================
--- 
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_generics.c
   2012-07-06 01:39:27 UTC (rev 48669)
+++ 
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_generics.c
   2012-07-06 01:39:41 UTC (rev 48670)
@@ -1262,25 +1262,14 @@
 
 void deleteUVTransCorrect(struct UVTransCorrect *uvtc)
 {
-       /*
-       if(uvtc->boundary_edges) {
-               MEM_freeN(uvtc->boundary_edges);
-               uvtc->boundary_edges = NULL;
-       }
-       if(uvtc->unwrapped_faces) {
-               MEM_freeN(uvtc->unwrapped_faces);
-               uvtc->unwrapped_faces = NULL;
-       }
-
-       if(uvtc->affected_verts) {
-               MEM_freeN(uvtc->affected_verts);
-               uvtc->affected_verts = NULL;
-       }       
-       */
        if(uvtc->init_vec) {
                MEM_freeN(uvtc->init_vec);
                uvtc->init_vec = NULL;
        }
+       if(uvtc->edge_length) {
+               MEM_freeN(uvtc->edge_length);
+               uvtc->edge_length = NULL;
+       }
        if(uvtc->initial_uvs) {
                int i;
                for(i = 0; i < uvtc->total_verts; i++) {
@@ -1755,7 +1744,7 @@
                                float angle1, angle2, angle_boundary;
                                float cross1[3], cross2[3], cross[3];
                                float normal[3], projv[3];
-                               float edge_len_init, edge_len_init2;
+                               float edge_len_init, edge_len_init2, proj_len;
                                float edge_len_final, edge_len_final2;
                                float edge_vec_init[3], edge_vec_init2[3], 
neg_edge_prev[3];
                                //float edge_vec_final[3], edge_vec_final2[3];
@@ -1826,6 +1815,10 @@
                                        break;
                                }
 
+                               edge_len_init = 
uvtc->edge_length[BM_elem_index_get(l->e)];
+                               edge_len_init2 = 
uvtc->edge_length[BM_elem_index_get(l_prev->e)];
+                               proj_len = len_v3(projv);
+
                                /* get the vector pointing inside the face (not 
sure if this will work) */
                                cross_v3_v3v3(cross1, l->f->no, edge_vec_init);
                                /* we need to negate the second edge to follow 
the loop flow */
@@ -1835,13 +1828,13 @@
                                add_v3_v3v3(cross, cross2, cross1);
 
                                /* now get angles and use sine law to calculate 
translation across uv axes */
-                               angle1 = acos(dot_v3v3(projv, 
edge_vec_init)/(len_v3(projv)*len_v3(edge_vec_init)));
-                               angle_boundary = acos(dot_v3v3(edge_vec_init, 
edge_vec_init2)/(len_v3(edge_vec_init)*len_v3(edge_vec_init2)));
+                               angle1 = acos(dot_v3v3(projv, 
edge_vec_init)/(proj_len*edge_len_init));
+                               angle_boundary = acos(dot_v3v3(edge_vec_init, 
edge_vec_init2)/(edge_len_init*edge_len_init2));
 
-                               edge_len_final = 
len_v3(projv)*sin(angle_boundary - angle1)/sin(M_PI - angle_boundary);
+                               edge_len_final = proj_len*sin(angle_boundary - 
angle1)/sin(M_PI - angle_boundary);
 
-                               angle2 = acos(dot_v3v3(projv, 
edge_vec_init2)/(len_v3(projv)*len_v3(edge_vec_init2)));
-                               edge_len_final2 = 
len_v3(projv)*sin(angle_boundary - angle2)/sin(M_PI - angle_boundary);
+                               angle2 = acos(dot_v3v3(projv, 
edge_vec_init2)/(proj_len*edge_len_init2));
+                               edge_len_final2 = proj_len*sin(angle_boundary - 
angle2)/sin(M_PI - angle_boundary);
 
                                /*
                                mul1 = dot_v3v3(edge_vec_final, edge_vec_init) 
/ dot_v3v3(edge_vec_init, edge_vec_init);
@@ -1853,9 +1846,6 @@
                                edge_len_final2 = 
signf(mul2)*len_v3(edge_vec_final2);
                                */
 
-                               edge_len_init = len_v3(edge_vec_init);
-                               edge_len_init2 = len_v3(edge_vec_init2);
-
                                mul_v2_v2fl(uvdiff, edge_uv_init, 
edge_len_final/edge_len_init);
                                mul_v2_v2fl(uvdiff2, edge_uv_init2, 
edge_len_final2/edge_len_init2);
 
@@ -1874,6 +1864,7 @@
                                        print_v3("cross product 2\n", cross2);
                                        print_v3("cross total\n", cross);
                                        print_v3("diff vector\n", projv);
+                                       printf("edge_length1 %f, edge_length2 
%f, proj_length %f\n", edge_len_init, edge_len_init2, proj_len);
                                        printf("angle1 : %f, angle2 : %f, 
angle_boundary : %f\n", angle1, angle2, angle_boundary);
 #endif
 

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

Reply via email to