[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48895] branches/soc-2012-bratwurst/source /blender/editors/transform/transform_generics.c: UV transform correction
Antony Riakiotakis
kalast at gmail.com
Fri Jul 13 21:20:19 CEST 2012
Revision: 48895
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48895
Author: psy-fi
Date: 2012-07-13 19:20:18 +0000 (Fri, 13 Jul 2012)
Log Message:
-----------
UV transform correction
=======================
* Make a better estimate of closest loops by taking angle sign into
account.
Modified Paths:
--------------
branches/soc-2012-bratwurst/source/blender/editors/transform/transform_generics.c
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-13 14:21:17 UTC (rev 48894)
+++ branches/soc-2012-bratwurst/source/blender/editors/transform/transform_generics.c 2012-07-13 19:20:18 UTC (rev 48895)
@@ -1781,13 +1781,12 @@
copy_v3_v3(edge_world_parall, edge_vec_init2);
}
/* tmp! */
+ angle = loops[0].angle;
copy_v3_v3(edge_world_parall, edge_vec_init1);
normalize_v3(edge_world_parall);
- mul_v3_fl(edge_world_parall, angle*displaced_length);
+ mul_v3_fl(edge_world_parall, cos(angle)*displaced_length);
- angle = acos(angle);
-
/* to get an 'outward' direction in uv space, just get the perpendicular vector.
* To get a correct outward vector, we need to negate the vector appropriately
* according to the winding of the loop */
@@ -1922,7 +1921,7 @@
UVTransCorrInfoUV *first_island_uv, *uvtcuv;
float projv[3], proj_len;
UVTCLoop boundary_loops[2];
- const UVTCLoop boundary_loop_init = {-10.0, NULL, FALSE};
+ const UVTCLoop boundary_loop_init = {4*M_PI, NULL, FALSE};
int index;
BMVert *v = td[i].eve;
@@ -1945,6 +1944,7 @@
float angle1, angle2;
float dot_tmp;
float proj_prev[3], proj_next[3];
+ float cross1[3], cross2[3];
int index_next, index_prev;
BMLoop *l_next, *l_prev, *l = uvtcuv->l;
@@ -1976,37 +1976,40 @@
sub_v3_v3v3(proj_next, proj_next, td[i].iloc);
sub_v3_v3v3(proj_prev, proj_prev, td[i].iloc);
+ cross_v3_v3v3(cross1, projv, proj_next);
+ cross_v3_v3v3(cross2, projv, proj_prev);
/* now calculate the angles between the edges and the displacement vector */
dot_tmp = dot_v3v3(projv, projv);
- angle1 = dot_v3v3(projv, proj_next)/(sqrtf(dot_tmp*dot_v3v3(proj_next, proj_next)));
- angle2 = dot_v3v3(projv, proj_prev)/(sqrtf(dot_tmp*dot_v3v3(proj_prev, proj_prev)));
+ angle1 = acos(dot_v3v3(projv, proj_next)/(sqrtf(dot_tmp*dot_v3v3(proj_next, proj_next))));
+ angle2 = acos(dot_v3v3(projv, proj_prev)/(sqrtf(dot_tmp*dot_v3v3(proj_prev, proj_prev))));
+ if(signf(dot_v3v3(cross1, uvtc->init_normal[index])) > 0.0) {
+ angle1 = 2*M_PI - angle1;
+ }
+ if(signf(dot_v3v3(cross2, uvtc->init_normal[index])) > 0.0) {
+ angle2 = 2*M_PI - angle2;
+ }
+
/* store the loops that have the minimum angle with the displacement vector */
- if((angle1 > boundary_loops[0].angle) && (!boundary_loops[1].loop || l_next->v != boundary_loops[1].loop->v)) {
- boundary_loops[1].angle = boundary_loops[0].angle;
- boundary_loops[1].loop = boundary_loops[0].loop;
- boundary_loops[1].prev = boundary_loops[0].prev;
-
+ if((angle1 < boundary_loops[0].angle)) {
boundary_loops[0].angle = angle1;
boundary_loops[0].loop = l_next;
boundary_loops[0].prev = FALSE;
- } else if((angle1 > boundary_loops[1].angle) && (!boundary_loops[0].loop || l_next->v != boundary_loops[0].loop->v)) {
- boundary_loops[1].angle = angle1;
+ }
+ if(((2*M_PI - angle1) < boundary_loops[1].angle)) {
+ boundary_loops[1].angle = 2*M_PI - angle1;
boundary_loops[1].loop = l_next;
boundary_loops[1].prev = FALSE;
}
- if((angle2 > boundary_loops[0].angle) && (!boundary_loops[1].loop || l_prev->v != boundary_loops[1].loop->v)) {
- boundary_loops[1].angle = boundary_loops[0].angle;
- boundary_loops[1].loop = boundary_loops[0].loop;
- boundary_loops[1].prev = boundary_loops[0].prev;
-
+ if((angle2 < boundary_loops[0].angle)) {
boundary_loops[0].angle = angle2;
boundary_loops[0].loop = l_prev;
boundary_loops[0].prev = TRUE;
- } else if((angle2 > boundary_loops[1].angle) && (!boundary_loops[0].loop || l_prev->v != boundary_loops[0].loop->v)) {
- boundary_loops[1].angle = angle2;
+ }
+ if(((2*M_PI - angle2) < boundary_loops[1].angle)) {
+ boundary_loops[1].angle = 2*M_PI - angle2;
boundary_loops[1].loop = l_prev;
boundary_loops[1].prev = TRUE;
}
More information about the Bf-blender-cvs
mailing list