[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