[Bf-blender-cvs] [effbff3] mesh-transfer-data: avoid sqrt when nearest values are under the threshold
Campbell Barton
noreply at git.blender.org
Mon Nov 17 23:00:22 CET 2014
Commit: effbff355133cc8ee1b613ae179f1e758632882f
Author: Campbell Barton
Date: Mon Nov 17 23:00:17 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rBeffbff355133cc8ee1b613ae179f1e758632882f
avoid sqrt when nearest values are under the threshold
===================================================================
M source/blender/blenkernel/intern/mesh_remap.c
===================================================================
diff --git a/source/blender/blenkernel/intern/mesh_remap.c b/source/blender/blenkernel/intern/mesh_remap.c
index fb0f838..9697248 100644
--- a/source/blender/blenkernel/intern/mesh_remap.c
+++ b/source/blender/blenkernel/intern/mesh_remap.c
@@ -145,9 +145,10 @@ static int mesh_remap_interp_poly_data_get(
return sources_num;
}
-static float mesh_remap_bvhtree_query_nearest(
+static bool mesh_remap_bvhtree_query_nearest(
BVHTreeFromMesh *treedata, BVHTreeNearest *nearest, const SpaceTransform *space_transform,
- float co[3], const float max_dist_sq)
+ float co[3], const float max_dist_sq,
+ float *r_hit_dist)
{
/* Convert the vertex to tree coordinates, if needed. */
if (space_transform) {
@@ -163,12 +164,20 @@ static float mesh_remap_bvhtree_query_nearest(
}
/* Compute and store result. If invalid (-1 index), keep FLT_MAX dist. */
BLI_bvhtree_find_nearest(treedata->tree, co, nearest, treedata->nearest_callback, treedata);
- return sqrtf(nearest->dist_sq);
+
+ if ((nearest->index != -1) && (nearest->dist_sq <= max_dist_sq)) {
+ *r_hit_dist = sqrtf(nearest->dist_sq);
+ return true;
+ }
+ else {
+ return false;
+ }
}
-static float mesh_remap_bvhtree_query_raycast(
+static bool mesh_remap_bvhtree_query_raycast(
BVHTreeFromMesh *treedata, BVHTreeRayHit *rayhit, const SpaceTransform *space_transform,
- float co[3], float no[3], const float radius, const float max_dist)
+ float co[3], float no[3], const float radius, const float max_dist,
+ float *r_hit_dist)
{
/* Convert the vertex to tree coordinates, if needed. */
if (space_transform) {
@@ -188,15 +197,21 @@ static float mesh_remap_bvhtree_query_raycast(
}
#endif
- return rayhit->dist;
+ if ((rayhit->index != -1) && (rayhit->dist <= max_dist)) {
+ *r_hit_dist = rayhit->dist;
+ return true;
+ }
+ else {
+ return false;
+ }
}
/* Little helper when dealing with source islands */
typedef struct IslandResult {
- float factor; /* A factor, based on which best island for a given set of elements will be selected. */
- int index_src; /* Index of the source. */
- float hit_distance; /* The actual hit distance. */
- float hit_point[3]; /* The hit point, if relevant. */
+ float factor; /* A factor, based on which best island for a given set of elements will be selected. */
+ int index_src; /* Index of the source. */
+ float hit_dist; /* The actual hit distance. */
+ float hit_point[3]; /* The hit point, if relevant. */
} IslandResult;
/* Note about all bvh/raycasting stuff below:
@@ -246,7 +261,7 @@ void BKE_mesh_remap_calc_verts_from_dm(
BVHTreeFromMesh treedata = {NULL};
BVHTreeNearest nearest = {0};
BVHTreeRayHit rayhit = {0};
- float hitdist;
+ float hit_dist;
if (mode == MREMAP_MODE_VERT_NEAREST) {
bvhtree_from_mesh_verts(&treedata, dm_src, 0.0f, 2, 6);
@@ -257,12 +272,11 @@ void BKE_mesh_remap_calc_verts_from_dm(
copy_v3_v3(tmp_co, verts_dst[i].co);
- hitdist = mesh_remap_bvhtree_query_nearest(
+ if (mesh_remap_bvhtree_query_nearest(
&treedata, &nearest, space_transform,
- tmp_co, max_dist_sq);
-
- if (nearest.index != -1) {
- mesh_remap_item_define(r_map, i, hitdist, 0, 1, &nearest.index, &full_weight);
+ tmp_co, max_dist_sq, &hit_dist))
+ {
+ mesh_remap_item_define(r_map, i, hit_dist, 0, 1, &nearest.index, &full_weight);
}
else {
/* No source for this dest vertex! */
@@ -283,11 +297,10 @@ void BKE_mesh_remap_calc_verts_from_dm(
copy_v3_v3(tmp_co, verts_dst[i].co);
- hitdist = mesh_remap_bvhtree_query_nearest(
+ if (mesh_remap_bvhtree_query_nearest(
&treedata, &nearest, space_transform,
- tmp_co, max_dist_sq);
-
- if (nearest.index != -1) {
+ tmp_co, max_dist_sq, &hit_dist))
+ {
MEdge *me = &edges_src[nearest.index];
float (*v1cos)[3] = &vcos_src[me->v1];
float (*v2cos)[3] = &vcos_src[me->v2];
@@ -296,7 +309,7 @@ void BKE_mesh_remap_calc_verts_from_dm(
const float dist_v1 = len_squared_v3v3(tmp_co, *v1cos);
const float dist_v2 = len_squared_v3v3(tmp_co, *v2cos);
const int index = (int)((dist_v1 > dist_v2) ? me->v2 : me->v1);
- mesh_remap_item_define(r_map, i, hitdist, 0, 1, &index, &full_weight);
+ mesh_remap_item_define(r_map, i, hit_dist, 0, 1, &index, &full_weight);
}
else if (mode == MREMAP_MODE_VERT_EDGEINTERP_NEAREST) {
int indices[2];
@@ -310,7 +323,7 @@ void BKE_mesh_remap_calc_verts_from_dm(
CLAMP(weights[0], 0.0f, 1.0f);
weights[1] = 1.0f - weights[0];
- mesh_remap_item_define(r_map, i, hitdist, 0, 2, indices, weights);
+ mesh_remap_item_define(r_map, i, hit_dist, 0, 2, indices, weights);
}
}
else {
@@ -346,17 +359,16 @@ void BKE_mesh_remap_calc_verts_from_dm(
copy_v3_v3(tmp_co, verts_dst[i].co);
normal_short_to_float_v3(tmp_no, verts_dst[i].no);
- hitdist = mesh_remap_bvhtree_query_raycast(
+ if (mesh_remap_bvhtree_query_raycast(
&treedata, &rayhit, space_transform,
- tmp_co, tmp_no, ray_radius, max_dist);
-
- if ((rayhit.index != -1) && (hitdist <= max_dist)) {
+ tmp_co, tmp_no, ray_radius, max_dist, &hit_dist))
+ {
MPoly *mp_src = &polys_src[orig_poly_index_src[rayhit.index]];
const int sources_num = mesh_remap_interp_poly_data_get(
mp_src, loops_src, (const float (*)[3])vcos_src, rayhit.co,
&tmp_buff_size, &vcos, false, &indices, &weights, true, NULL);
- mesh_remap_item_define(r_map, i, rayhit.dist, 0, sources_num, indices, weights);
+ mesh_remap_item_define(r_map, i, hit_dist, 0, sources_num, indices, weights);
}
else {
/* No source for this dest vertex! */
@@ -373,11 +385,10 @@ void BKE_mesh_remap_calc_verts_from_dm(
/* Convert the vertex to tree coordinates. */
copy_v3_v3(tmp_co, verts_dst[i].co);
- hitdist = mesh_remap_bvhtree_query_nearest(
+ if (mesh_remap_bvhtree_query_nearest(
&treedata, &nearest, space_transform,
- tmp_co, max_dist_sq);
-
- if (nearest.index != -1) {
+ tmp_co, max_dist_sq, &hit_dist))
+ {
MPoly *mp = &polys_src[orig_poly_index_src[nearest.index]];
if (mode == MREMAP_MODE_VERT_POLY_NEAREST) {
@@ -387,7 +398,7 @@ void BKE_mesh_remap_calc_verts_from_dm(
&tmp_buff_size, &vcos, false, &indices, &weights, false,
&index);
- mesh_remap_item_define(r_map, i, hitdist, 0, 1, &index, &full_weight);
+ mesh_remap_item_define(r_map, i, hit_dist, 0, 1, &index, &full_weight);
}
else if (mode == MREMAP_MODE_VERT_POLYINTERP_NEAREST) {
const int sources_num = mesh_remap_interp_poly_data_get(
@@ -395,7 +406,7 @@ void BKE_mesh_remap_calc_verts_from_dm(
&tmp_buff_size, &vcos, false, &indices, &weights, true,
NULL);
- mesh_remap_item_define(r_map, i, hitdist, 0, sources_num, indices, weights);
+ mesh_remap_item_define(r_map, i, hit_dist, 0, sources_num, indices, weights);
}
}
else {
@@ -442,7 +453,7 @@ void BKE_mesh_remap_calc_edges_from_dm(
BVHTreeFromMesh treedata = {NULL};
BVHTreeNearest nearest = {0};
BVHTreeRayHit rayhit = {0};
- float hitdist;
+ float hit_dist;
if (mode == MREMAP_MODE_EDGE_VERT_NEAREST) {
const int num_verts_src = dm_src->getNumVerts(dm_src);
@@ -453,7 +464,7 @@ void BKE_mesh_remap_calc_edges_from_dm(
MeshElemMap *vert2edge_src_map;
int *vert2edge_src_map_mem;
- /* Note we store an integer index in second element (first one is hitdist). */
+ /* Note we store an integer index in second element (first one is hit_dist). */
float (*v_dst2src_map)[2] = MEM_mallocN(sizeof(*v_dst2src_map) * (size_t)numverts_dst, __func__);
fill_vn_fl((float *)v_dst2src_map, numverts_dst * 2, -1.0f);
@@ -479,12 +490,12 @@ void BKE_mesh_remap_calc_edges_from_dm(
float tmp_co[3];
copy_v3_v3(tmp_co, verts_dst[vidx_dst].co);
- hitdist = mesh_remap_bvhtree_query_nearest(
- &treedata, &nearest, space_transform,
- tmp_co, max_dist_sq);
- if (nearest.index != -1) {
- v_dst2src_map[vidx_dst][0] = hitdist;
+ if (mesh_remap_bvhtree_query_nearest(
+ &treedata, &nearest, space_transform,
+ tmp_co, max_dist_sq, &hit_dist))
+ {
+ v_dst2src_map[vidx_dst][0] = hit_dist;
v_dst2src_map[vidx_dst][1] = (float)nearest.index;
}
else {
@@ -547,8 +558,8 @@ void BKE_mesh_remap_calc_edges_from_dm(
copy_v3_v3(co_dst, co2_dst);
}
}
- hitdist = len_v3v3(co_dst, co_src);
- mesh_remap_item_define(r_map, i, hitdist, 0, 1, &best_eidx_src, &full_weight);
+ hit_dist = len_v3v3(co_dst, co_src);
+ mesh_remap_item_define(r_map, i, hit_dist, 0, 1, &best_eidx_src, &full_weight);
}
else {
/* No source for this dest edge! */
@@ -570,12 +581,11 @@ void BKE_mesh_remap_calc_edges_from_dm(
interp_v3_v3v3(tmp_co, verts_dst[edges_dst[i].v1].co, verts_dst[edges_dst[i].v2].co, 0.5f);
- hitdist = mesh_remap_bvhtree_query_nearest(
+ if (mesh_remap_bvhtree_query_nearest(
&treedata, &nearest, space_transform,
- tmp_co, max_dist_sq);
-
- if (nearest.index != -1) {
- mesh_remap_item_define(r_map, i, hitdist, 0, 1, &nearest.index, &full_weight);
+ tmp_co, max_dist_sq, &hit_dist))
+ {
+ mesh_remap_item_define(r_map, i, hit_dist, 0, 1, &nearest.index, &full_weight);
}
else {
/* No source for this dest edge! */
@@ -600,11 +610,10 @@ void BKE_mesh_remap_calc_edges_from_dm(
interp_v3_v3v3(tmp_co, verts_dst[edges_dst[i].v1].co, verts_dst[edges_dst[i].v2].co, 0.5f);
- hitdist = mesh_remap_bvhtree_query_nearest(
+ if (mesh_remap_bvhtree_query_nearest(
&treedata, &nearest, space_transform,
- tmp_co, max_dist_sq);
-
- if (nearest.index != -1) {
+ tmp_co, max_dist_sq, &hit_dist))
+ {
MPoly *mp_src = &polys_src[orig_poly_index_src[nearest.i
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list