transform_snap_object: fix ray_start_correction in snap to edit_mesh.

This commit is contained in:
Germano Cavalcante 2018-11-25 17:15:05 -02:00
parent 36429a5bc9
commit 9d7b767dd7
1 changed files with 22 additions and 80 deletions

View File

@ -230,36 +230,6 @@ static void iter_snap_objects(
}
}
static bool walk_parent_bvhroot_cb(const BVHTreeAxisRange *bounds, void *userdata)
{
BVHTreeRay *ray = userdata;
const float bbmin[3] = {bounds[0].min, bounds[1].min, bounds[2].min};
const float bbmax[3] = {bounds[0].max, bounds[1].max, bounds[2].max};
if (!isect_ray_aabb_v3_simple(ray->origin, ray->direction, bbmin, bbmax, &ray->radius, NULL)) {
ray->radius = -1;
}
return false;
}
static bool isect_ray_bvhroot_v3(struct BVHTree *tree, const float ray_start[3], const float ray_dir[3], float *depth)
{
BVHTreeRay ray;
copy_v3_v3(ray.origin, ray_start);
copy_v3_v3(ray.direction, ray_dir);
BLI_bvhtree_walk_dfs(tree, walk_parent_bvhroot_cb, NULL, NULL, &ray);
if (ray.radius > 0) {
*depth = ray.radius;
return true;
}
else {
return false;
}
}
/** \} */
/* -------------------------------------------------------------------- */
@ -395,6 +365,17 @@ static bool raycastMesh(
return retval;
}
}
/* We pass a temp ray_start, set from object's boundbox, to avoid precision issues with
* very far away ray_start values (as returned in case of ortho view3d), see T50486, T38358.
*/
if (len_diff > 400.0f) {
len_diff -= local_scale; /* make temp start point a bit away from bbox hit point. */
madd_v3_v3fl(ray_start_local, ray_normal_local, len_diff);
local_depth -= len_diff;
}
else {
len_diff = 0.0f;
}
SnapObjectData_Mesh *sod = snap_object_data_mesh_get(sctx, ob);
@ -435,32 +416,6 @@ static bool raycastMesh(
}
}
/* Only use closer ray_start in case of ortho view! In perspective one, ray_start may already
* been *inside* boundbox, leading to snap failures (see T38409).
* Note also ar might be null (see T38435), in this case we assume ray_start is ok!
*/
if (len_diff == 0.0f) { /* do_ray_start_correction */
/* We *need* a reasonably valid len_diff in this case.
* Get the distance to bvhtree root */
if (!isect_ray_bvhroot_v3(treedata->tree, ray_start_local, ray_normal_local, &len_diff)) {
return retval;
}
}
/* You need to make sure that ray_start is really far away,
* because even in the Orthografic view, in some cases,
* the ray can start inside the object (see T50486) */
if (len_diff > 400.0f) {
/* We pass a temp ray_start, set from object's boundbox, to avoid precision issues with
* very far away ray_start values (as returned in case of ortho view3d), see T38358.
*/
len_diff -= local_scale; /* make temp start point a bit away from bbox hit point. */
madd_v3_v3fl(ray_start_local, ray_normal_local, len_diff);
local_depth -= len_diff;
}
else {
len_diff = 0.0f;
}
float timat[3][3]; /* transpose inverse matrix for normals */
transpose_m3_m4(timat, imat);
@ -564,6 +519,17 @@ static bool raycastEditMesh(
return retval;
}
}
/* We pass a temp ray_start, set from object's boundbox, to avoid precision issues with
* very far away ray_start values (as returned in case of ortho view3d), see T50486, T38358.
*/
if (len_diff > 400.0f) {
len_diff -= local_scale; /* make temp start point a bit away from bbox hit point. */
madd_v3_v3fl(ray_start_local, ray_normal_local, len_diff);
local_depth -= len_diff;
}
else {
len_diff = 0.0f;
}
SnapObjectData_EditMesh *sod = snap_object_data_editmesh_get(sctx, em);
@ -614,30 +580,6 @@ static bool raycastEditMesh(
}
}
/* Only use closer ray_start in case of ortho view! In perspective one, ray_start
* may already been *inside* boundbox, leading to snap failures (see T38409).
* Note also ar might be null (see T38435), in this case we assume ray_start is ok!
*/
if (sctx->use_v3d && !((RegionView3D *)sctx->v3d_data.ar->regiondata)->is_persp) { /* do_ray_start_correction */
/* We *need* a reasonably valid len_diff in this case.
* Get the distance to bvhtree root */
if (!isect_ray_bvhroot_v3(treedata->tree, ray_start_local, ray_normal_local, &len_diff)) {
return retval;
}
/* You need to make sure that ray_start is really far away,
* because even in the Orthografic view, in some cases,
* the ray can start inside the object (see T50486) */
if (len_diff > 400.0f) {
/* We pass a temp ray_start, set from object's boundbox, to avoid precision issues with
* very far away ray_start values (as returned in case of ortho view3d), see T38358.
*/
len_diff -= local_scale; /* make temp start point a bit away from bbox hit point. */
madd_v3_v3fl(ray_start_local, ray_normal_local, len_diff);
local_depth -= len_diff;
}
else len_diff = 0.0f;
}
float timat[3][3]; /* transpose inverse matrix for normals */
transpose_m3_m4(timat, imat);