[Bf-blender-cvs] [ead1152] mesh-transfer-data: Expose epsilon (precision) prop to user, for raycating against verts/edges it's absolutely needed!

Bastien Montagne noreply at git.blender.org
Wed Oct 15 13:11:24 CEST 2014


Commit: ead115281a7bfa03b0786ee0ad40046316362814
Author: Bastien Montagne
Date:   Wed Oct 15 13:02:01 2014 +0200
Branches: mesh-transfer-data
https://developer.blender.org/rBead115281a7bfa03b0786ee0ad40046316362814

Expose epsilon (precision) prop to user, for raycating against verts/edges it's absolutely needed!

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

M	source/blender/blenkernel/BKE_mesh_mapping.h
M	source/blender/blenkernel/intern/mesh_mapping.c
M	source/blender/editors/include/ED_object.h
M	source/blender/editors/object/object_transfer_data.c

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

diff --git a/source/blender/blenkernel/BKE_mesh_mapping.h b/source/blender/blenkernel/BKE_mesh_mapping.h
index becdfc6..dd2c5ae 100644
--- a/source/blender/blenkernel/BKE_mesh_mapping.h
+++ b/source/blender/blenkernel/BKE_mesh_mapping.h
@@ -240,6 +240,9 @@ enum {
 	/* Nearest edge of nearest poly (using mid-point). */
 	M2MMAP_MODE_EDGE_POLY_NEAREST        = M2MMAP_MODE_EDGE | M2MMAP_USE_POLY | M2MMAP_USE_NEAREST,
 
+	/* Project dest edge along both its vertices' normals, and use shortest edge-path between hitting points. */
+	//M2MMAP_MODE_EDGE_EDGEINTERP_VNORPROJ = M2MMAP_MODE_EDGE | M2MMAP_USE_VERT | M2MMAP_USE_NORPROJ | M2MMAP_USE_INTERP,
+
 	/* ***** Target's polygons ***** */
 	M2MMAP_MODE_POLY                     = 1 << 26,
 
@@ -276,23 +279,23 @@ enum {
 /* TODO add mesh2mesh versions (we'll need mesh versions of bvhtree funcs too, though!). */
 
 void BKE_dm2mesh_mapping_verts_compute(
-        const int mode, const struct SpaceTransform *space_transform, const float max_dist,
+        const int mode, const struct SpaceTransform *space_transform, const float max_dist, const float bvh_epsilon,
         const struct MVert *verts_dst, const int numverts_dst,
         struct DerivedMesh *dm_src, Mesh2MeshMapping *r_map);
 
 void BKE_dm2mesh_mapping_edges_compute(
-        const int mode, const struct SpaceTransform *space_transform, const float max_dist,
+        const int mode, const struct SpaceTransform *space_transform, const float max_dist, const float bvh_epsilon,
         const struct MVert *verts_dst, const int numverts_dst, const struct MEdge *edges_dst, const int numedges_dst,
         struct DerivedMesh *dm_src, Mesh2MeshMapping *r_map);
 
 void BKE_dm2mesh_mapping_polys_compute(
-        const int mode, const struct SpaceTransform *space_transform, const float max_dist,
+        const int mode, const struct SpaceTransform *space_transform, const float max_dist, const float bvh_epsilon,
         struct MVert *verts_dst, const int numverts_dst, struct MPoly *polys_dst, const int numpolys_dst,
         struct MLoop *loops_dst, const int numloops_dst, struct CustomData *pdata_dst, struct DerivedMesh *dm_src,
         struct Mesh2MeshMapping *r_map);
 
 void BKE_dm2mesh_mapping_loops_compute(
-        const int mode, const struct SpaceTransform *space_transform, const float max_dist,
+        const int mode, const struct SpaceTransform *space_transform, const float max_dist, const float bvh_epsilon,
         struct MVert *verts_dst, const int numverts_dst, struct MEdge *edges_dst, const int numedges_dst,
         struct MPoly *polys_dst, const int numpolys_dst, struct MLoop *loops_dst, const int numloops_dst,
         struct CustomData *pdata_dst, struct CustomData *ldata_dst, const float split_angle_dst,
diff --git a/source/blender/blenkernel/intern/mesh_mapping.c b/source/blender/blenkernel/intern/mesh_mapping.c
index fe966e6..082b8d0 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.c
+++ b/source/blender/blenkernel/intern/mesh_mapping.c
@@ -847,7 +847,7 @@ static float bke_mesh2mesh_bvhtree_query_raycast(
 }
 
 void BKE_dm2mesh_mapping_verts_compute(
-        const int mode, const SpaceTransform *space_transform, const float max_dist,
+        const int mode, const SpaceTransform *space_transform, const float max_dist, const float bvh_epsilon,
         const MVert *verts_dst, const int numverts_dst, DerivedMesh *dm_src,
         Mesh2MeshMapping *r_map)
 {
@@ -872,7 +872,7 @@ void BKE_dm2mesh_mapping_verts_compute(
 		float hitdist;
 
 		if (mode == M2MMAP_MODE_VERT_NEAREST) {
-			bvhtree_from_mesh_verts(&treedata, dm_src, 0.0, 2, 6);
+			bvhtree_from_mesh_verts(&treedata, dm_src, bvh_epsilon, 2, 6);
 			nearest.index = -1;
 
 			for (i = 0; i < numverts_dst; i++) {
@@ -897,7 +897,7 @@ void BKE_dm2mesh_mapping_verts_compute(
 			float (*vcos_src)[3] = MEM_mallocN(sizeof(*vcos_src) * (size_t)dm_src->getNumVerts(dm_src), __func__);
 			dm_src->getVertCos(dm_src, vcos_src);
 
-			bvhtree_from_mesh_edges(&treedata, dm_src, 0.0, 2, 6);
+			bvhtree_from_mesh_edges(&treedata, dm_src, bvh_epsilon, 2, 6);
 			nearest.index = -1;
 
 			for (i = 0; i < numverts_dst; i++) {
@@ -956,7 +956,7 @@ void BKE_dm2mesh_mapping_verts_compute(
 			float *weights = MEM_mallocN(sizeof(*weights) * tmp_buff_size, __func__);
 
 			dm_src->getVertCos(dm_src, vcos_src);
-			bvhtree_from_mesh_faces(&treedata, dm_src, 0.0, 2, 6);
+			bvhtree_from_mesh_faces(&treedata, dm_src, bvh_epsilon, 2, 6);
 			/* bvhtree here uses tesselated faces... */
 			orig_poly_idx_src = dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
 
@@ -1041,7 +1041,7 @@ void BKE_dm2mesh_mapping_verts_compute(
 
 /* TODO: all those 'nearest' edge computations could be hugely enhanced, not top priority though. */
 void BKE_dm2mesh_mapping_edges_compute(
-        const int mode, const SpaceTransform *space_transform, const float max_dist,
+        const int mode, const SpaceTransform *space_transform, const float max_dist, const float bvh_epsilon,
         const MVert *verts_dst, const int numverts_dst, const MEdge *edges_dst, const int numedges_dst,
         DerivedMesh *dm_src, Mesh2MeshMapping *r_map)
 {
@@ -1082,7 +1082,7 @@ void BKE_dm2mesh_mapping_edges_compute(
 
 			dm_src->getVertCos(dm_src, vcos_src);
 
-			bvhtree_from_mesh_verts(&treedata, dm_src, 0.0, 2, 6);
+			bvhtree_from_mesh_verts(&treedata, dm_src, bvh_epsilon, 2, 6);
 			nearest.index = -1;
 
 			for (i = 0; i < numedges_dst; i++) {
@@ -1181,7 +1181,7 @@ void BKE_dm2mesh_mapping_edges_compute(
 			MEM_freeN(vert2edge_src_map_mem);
 		}
 		else if (mode == M2MMAP_MODE_EDGE_NEAREST) {
-			bvhtree_from_mesh_edges(&treedata, dm_src, 0.0, 2, 6);
+			bvhtree_from_mesh_edges(&treedata, dm_src, bvh_epsilon, 2, 6);
 			nearest.index = -1;
 
 			for (i = 0; i < numedges_dst; i++) {
@@ -1209,7 +1209,7 @@ void BKE_dm2mesh_mapping_edges_compute(
 			int *orig_poly_idx_src;
 
 			dm_src->getVertCos(dm_src, vcos_src);
-			bvhtree_from_mesh_faces(&treedata, dm_src, 0.0, 2, 6);
+			bvhtree_from_mesh_faces(&treedata, dm_src, bvh_epsilon, 2, 6);
 			/* bvhtree here uses tesselated faces... */
 			orig_poly_idx_src = dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
 
@@ -1264,7 +1264,7 @@ void BKE_dm2mesh_mapping_edges_compute(
 }
 
 void BKE_dm2mesh_mapping_polys_compute(
-        const int mode, const SpaceTransform *space_transform, const float max_dist,
+        const int mode, const SpaceTransform *space_transform, const float max_dist, const float bvh_epsilon,
         MVert *verts_dst, const int numverts_dst, MPoly *polys_dst, const int numpolys_dst,
         MLoop *loops_dst, const int numloops_dst, CustomData *pdata_dst, DerivedMesh *dm_src,
         Mesh2MeshMapping *r_map)
@@ -1303,7 +1303,7 @@ void BKE_dm2mesh_mapping_polys_compute(
 
 		int *orig_poly_idx_src;
 
-		bvhtree_from_mesh_faces(&treedata, dm_src, 0.0, 2, 6);
+		bvhtree_from_mesh_faces(&treedata, dm_src, bvh_epsilon, 2, 6);
 		/* bvhtree here uses tesselated faces... */
 		orig_poly_idx_src = dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
 
@@ -1477,9 +1477,8 @@ void BKE_dm2mesh_mapping_polys_compute(
 	}
 }
 
-
 void BKE_dm2mesh_mapping_loops_compute(
-        const int mode, const SpaceTransform *space_transform, const float max_dist,
+        const int mode, const SpaceTransform *space_transform, const float max_dist, const float bvh_epsilon,
         MVert *verts_dst, const int numverts_dst, MEdge *edges_dst, const int numedges_dst,
         MPoly *polys_dst, const int numpolys_dst, MLoop *loops_dst, const int numloops_dst,
         CustomData *pdata_dst, CustomData *ldata_dst, const float split_angle_dst,
@@ -1646,7 +1645,7 @@ void BKE_dm2mesh_mapping_loops_compute(
 					}
 					/* verts 'ownership' is transfered to treedata here, which will handle its freeing. */
 					bvhtree_from_mesh_verts_ex(&treedata[tidx], verts_src, num_verts_src, verts_allocated_src,
-					                           verts_active, num_verts_active, 0.0, 2, 6);
+					                           verts_active, num_verts_active, bvh_epsilon, 2, 6);
 					if (verts_allocated_src) {
 						verts_allocated_src = false;  /* Only 'give' our verts once, to first tree! */
 					}
@@ -1655,9 +1654,8 @@ void BKE_dm2mesh_mapping_loops_compute(
 				MEM_freeN(verts_active);
 			}
 			else {
-				for (tidx = 0; tidx < num_trees; tidx++) {
-					bvhtree_from_mesh_verts(&treedata[tidx], dm_src, 0.0, 2, 6);
-				}
+				BLI_assert(num_trees == 1);
+				bvhtree_from_mesh_verts(&treedata[0], dm_src, bvh_epsilon, 2, 6);
 			}
 		}
 		else {  /* We use polygons. */
@@ -1692,7 +1690,7 @@ void BKE_dm2mesh_mapping_loops_compute(
 					/* verts 'ownership' is transfered to treedata here, which will handle its freeing. */
 					bvhtree_from_mesh_faces_ex(&treedata[tidx], verts_src, verts_allocated_src,
 					                           faces_src, num_faces_src, faces_allocated_src,
-					                           faces_active, num_faces_active, 0.0, 2, 6);
+					                           faces_active, num_faces_active, bvh_epsilon, 2, 6);
 					if (verts_allocated_src) {
 						verts_allocated_src = false;  /* Only 'give' our verts once, to first tree! */
 					}
@@ -1704,9 +1702,8 @@ void BKE_dm2mesh_mapping_loops_compute(
 				MEM_freeN(faces_active);
 			}
 			else {
-				for (tidx = 0; tidx < num_trees; tidx++) {
-					bvhtree_from_mesh_faces(&treedata[tidx], dm_src, 0.0f, 2, 6);
-				}
+				BLI_assert(num_tress == 1);
+				bvhtree_from_mesh_faces(&treedata[0], dm_src, bvh_epsilon, 2, 6);
 				orig_poly_idx_src = dm_src->getTessFaceDataArray(dm_src, CD_ORIGINDEX);
 			}
 		}
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 2350bb1..3d23410 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -275,7 +275,7 @@ bool ED_data_transfer_layersmapping_cdlayers(
 bool ED_data_transfer(
         struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, const int data_type, const bool use_create,
         const int map_vert_mode, const int map_edge_mode, const int map_poly_mode, const int map_loop_mode,
-        struct SpaceTransform *space_transform, const float max_distance,
+        st

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list