[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