[Bf-blender-cvs] [a689efb] mesh-transfer-data: Fixes to loop mapping code. Looks like UV transfer is starting to look better ; )

Bastien Montagne noreply at git.blender.org
Tue Oct 7 23:00:26 CEST 2014


Commit: a689efb979d469f49adb2f1b874a6ffb4dd07048
Author: Bastien Montagne
Date:   Tue Oct 7 22:47:15 2014 +0200
Branches: mesh-transfer-data
https://developer.blender.org/rBa689efb979d469f49adb2f1b874a6ffb4dd07048

Fixes to loop mapping code. Looks like UV transfer is starting to look better ;)

===================================================================

M	source/blender/blenkernel/intern/mesh_mapping.c

===================================================================

diff --git a/source/blender/blenkernel/intern/mesh_mapping.c b/source/blender/blenkernel/intern/mesh_mapping.c
index 2d83698..e9515c6 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.c
+++ b/source/blender/blenkernel/intern/mesh_mapping.c
@@ -1416,8 +1416,10 @@ void BKE_dm2mesh_mapping_loops_compute(
 		float (*poly_nors_dst)[3] = NULL;
 		float (*loop_nors_dst)[3] = NULL;
 
-		MeshElemMap *vert_to_polyloop_map_src = NULL;
-		int *vert_to_polyloop_map_src_buff = NULL;
+		MeshElemMap *vert_to_loop_map_src = NULL;
+		int *vert_to_loop_map_src_buff = NULL;
+		MeshElemMap *vert_to_poly_map_src = NULL;
+		int *vert_to_poly_map_src_buff = NULL;
 
 		bool verts_allocated_src;
 		MVert *verts_src = DM_get_vert_array(dm_src, &verts_allocated_src);
@@ -1440,7 +1442,7 @@ void BKE_dm2mesh_mapping_loops_compute(
 		int *indices_interp = NULL;
 		float *weights_interp = NULL;
 
-		int tidx, pidx_dst, lidx_dst, plidx_dst, pidx_src, lidx_src;
+		int tidx, pidx_dst, lidx_dst, plidx_dst, pidx_src, lidx_src, plidx_src;
 
 		if (!use_from_vert) {
 			vcos_src = MEM_mallocN(sizeof(*vcos_src) * (size_t)num_verts_src, __func__);
@@ -1492,12 +1494,10 @@ void BKE_dm2mesh_mapping_loops_compute(
 		}
 
 		if (use_from_vert) {
-			if (mode & M2MMAP_USE_LOOP) {
-				BKE_mesh_vert_loop_map_create(&vert_to_polyloop_map_src, &vert_to_polyloop_map_src_buff,
-				                              polys_src, loops_src, num_verts_src, num_polys_src, num_loops_src);
-			}
-			else if (mode & M2MMAP_USE_POLY) {
-				BKE_mesh_vert_poly_map_create(&vert_to_polyloop_map_src, &vert_to_polyloop_map_src_buff,
+			BKE_mesh_vert_loop_map_create(&vert_to_loop_map_src, &vert_to_loop_map_src_buff,
+			                              polys_src, loops_src, num_verts_src, num_polys_src, num_loops_src);
+			if (mode & M2MMAP_USE_POLY) {
+				BKE_mesh_vert_poly_map_create(&vert_to_poly_map_src, &vert_to_poly_map_src_buff,
 				                              polys_src, loops_src, num_verts_src, num_polys_src, num_loops_src);
 			}
 		}
@@ -1636,6 +1636,7 @@ void BKE_dm2mesh_mapping_loops_compute(
 				for (plidx_dst = 0; plidx_dst < mp_dst->totloop; plidx_dst++, ml_dst++) {
 					if (use_from_vert) {
 						float tmp_co[3];
+						MeshElemMap *vert_to_refelem_map_src = NULL;
 
 						copy_v3_v3(tmp_co, verts_dst[ml_dst->v].co);
 						nearest.index = -1;
@@ -1652,20 +1653,34 @@ void BKE_dm2mesh_mapping_loops_compute(
 							if (mode == M2MMAP_MODE_LOOP_NEAREST_LOOPNOR) {
 								nor_dst = &loop_nors_dst[plidx_dst + mp_dst->loopstart];
 								nors_src = loop_nors_src;
+								vert_to_refelem_map_src = vert_to_loop_map_src;
 							}
 							else {  /* if (mode == M2MMAP_MODE_LOOP_NEAREST_POLYNOR) { */
 								nor_dst = pnor_dst;
 								nors_src = poly_nors_src;
+								vert_to_refelem_map_src = vert_to_poly_map_src;
 							}
 
-							for (i = vert_to_polyloop_map_src[nearest.index].count; i--;) {
-								const int idx_src = vert_to_polyloop_map_src[nearest.index].indices[i];
+							for (i = vert_to_refelem_map_src[nearest.index].count; i--;) {
+								const int idx_src = vert_to_refelem_map_src[nearest.index].indices[i];
 								const float dot = dot_v3v3(nors_src[idx_src], *nor_dst);
 								if (dot > best_nor_dot) {
 									best_nor_dot = dot;
 									best_idx_src = idx_src;
 								}
 							}
+							if (mode == M2MMAP_MODE_LOOP_NEAREST_POLYNOR) {
+								/* Our best_idx_src is a poly one for now!
+								 * Have to find its loop matching our closest vertex. */
+								MPoly *mp_src = &polys_src[best_idx_src];
+								MLoop *ml_src = &loops_src[mp_src->loopstart];
+								for (plidx_src = 0; plidx_src < mp_src->totloop; plidx_src++, ml_src++) {
+									if ((int)ml_src->v == nearest.index) {
+										best_idx_src = plidx_src + mp_src->loopstart;
+										break;
+									}
+								}
+							}
 							facs[tidx][plidx_dst][0] = (hitdist != 0.0f) ? (1.0f / hitdist * best_nor_dot) : FLT_MAX;
 							facs[tidx][plidx_dst][1] = hitdist;
 							facs[tidx][plidx_dst][2] = (float)best_idx_src;
@@ -1703,7 +1718,6 @@ void BKE_dm2mesh_mapping_loops_compute(
 					else {  /* Nearest poly either to use all its loops/verts or just closest one. */
 						float tmp_co[3];
 
-						/* Convert the vertex to tree coordinates. */
 						copy_v3_v3(tmp_co, verts_dst[ml_dst->v].co);
 						nearest.index = -1;
 
@@ -1713,7 +1727,7 @@ void BKE_dm2mesh_mapping_loops_compute(
 						if (nearest.index >= 0) {
 							facs[tidx][plidx_dst][0] = (hitdist != 0.0f) ? (1.0f / hitdist) : FLT_MAX;
 							facs[tidx][plidx_dst][1] = hitdist;
-							facs[tidx][plidx_dst][2] = (float)orig_poly_idx_src[rayhit.index];
+							facs[tidx][plidx_dst][2] = (float)orig_poly_idx_src[nearest.index];
 							copy_v3_v3(&facs[tidx][plidx_dst][3], nearest.co);
 						}
 						else {
@@ -1828,8 +1842,11 @@ void BKE_dm2mesh_mapping_loops_compute(
 		if (faces_allocated_src) {
 			MEM_freeN(faces_src);
 		}
-		if (vert_to_polyloop_map_src_buff) {
-			MEM_freeN(vert_to_polyloop_map_src_buff);
+		if (vert_to_loop_map_src_buff) {
+			MEM_freeN(vert_to_loop_map_src_buff);
+		}
+		if (vert_to_poly_map_src_buff) {
+			MEM_freeN(vert_to_poly_map_src_buff);
 		}
 		if (vcos_interp) {
 			MEM_freeN(vcos_interp);




More information about the Bf-blender-cvs mailing list