[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48670] branches/soc-2012-bratwurst/source /blender/editors/transform: UV transform correction
Antony Riakiotakis
kalast at gmail.com
Fri Jul 6 03:39:42 CEST 2012
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
More information about the Bf-blender-cvs
mailing list