diff options
author | Germano Cavalcante <germano.costa@ig.com.br> | 2017-04-17 00:50:06 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2017-04-17 00:50:06 +0300 |
commit | 57d31171d0c92358325869bdbcd3dbddbf2cdfd5 (patch) | |
tree | 695d45e624711a50336a73836d36c56d0e16ae3a /source/blender | |
parent | 15215652e1b22c779f5249309381fef1b74eb96f (diff) |
Object.raycast: more minor improvements ...
- if it is to check a bool, let it be local;
- removes gotos;
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/makesrna/intern/rna_object_api.c | 63 |
1 files changed, 27 insertions, 36 deletions
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 55852139065..6b3f4dc7bcc 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -321,60 +321,51 @@ static void rna_Object_ray_cast( float origin[3], float direction[3], float distance, int *r_success, float r_location[3], float r_normal[3], int *r_index) { + bool success = false; + if (ob->derivedFinal == NULL) { BKE_reportf(reports, RPT_ERROR, "Object '%s' has no mesh data to be used for ray casting", ob->id.name + 2); return; } - *r_success = false; - /* Test BoundBox first (efficiency) */ BoundBox *bb = BKE_object_boundbox_get(ob); - if (bb) { - float distmin, distmax; - if (isect_ray_aabb_v3_simple(origin, direction, bb->vec[0], bb->vec[6], &distmin, &distmax)) { - float dist = distmin >= 0 ? distmin : distmax; - if (dist > distance) { - goto finally; - } - } - else { - goto finally; - } - } + float distmin; + if (!bb || isect_ray_aabb_v3_simple(origin, direction, bb->vec[0], bb->vec[6], &distmin, NULL) && distmin <= distance) { - BVHTreeFromMesh treeData = {NULL}; + BVHTreeFromMesh treeData = {NULL}; - /* no need to managing allocation or freeing of the BVH data. this is generated and freed as needed */ - bvhtree_from_mesh_looptri(&treeData, ob->derivedFinal, 0.0f, 4, 6); + /* no need to managing allocation or freeing of the BVH data. this is generated and freed as needed */ + bvhtree_from_mesh_looptri(&treeData, ob->derivedFinal, 0.0f, 4, 6); - /* may fail if the mesh has no faces, in that case the ray-cast misses */ - if (treeData.tree != NULL) { - BVHTreeRayHit hit; + /* may fail if the mesh has no faces, in that case the ray-cast misses */ + if (treeData.tree != NULL) { + BVHTreeRayHit hit; - hit.index = -1; - hit.dist = distance; - - normalize_v3(direction); + hit.index = -1; + hit.dist = distance; + normalize_v3(direction); - if (BLI_bvhtree_ray_cast(treeData.tree, origin, direction, 0.0f, &hit, - treeData.raycast_callback, &treeData) != -1) - { - if (hit.dist <= distance) { - *r_success = true; - copy_v3_v3(r_location, hit.co); - copy_v3_v3(r_normal, hit.no); - *r_index = dm_looptri_to_poly_index(ob->derivedFinal, &treeData.looptri[hit.index]); + if (BLI_bvhtree_ray_cast(treeData.tree, origin, direction, 0.0f, &hit, + treeData.raycast_callback, &treeData) != -1) + { + if (hit.dist <= distance) { + *r_success = success = true; + + copy_v3_v3(r_location, hit.co); + copy_v3_v3(r_normal, hit.no); + *r_index = dm_looptri_to_poly_index(ob->derivedFinal, &treeData.looptri[hit.index]); + } } - } - free_bvhtree_from_mesh(&treeData); + free_bvhtree_from_mesh(&treeData); + } } + if (success == false) { + *r_success = false; - if (*r_success == false) { -finally: zero_v3(r_location); zero_v3(r_normal); *r_index = -1; |