star-enclosures-3d

Extract enclosures from 3D geometry
git clone git://git.meso-star.fr/star-enclosures-3d.git
Log | Files | Refs | README | LICENSE

commit ecf0017d2cc1e6f4f7012118dd8bbd30a6fd79de
parent d60cebbae6444985fc439c9aea41a88d86f1c8ab
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu, 23 Apr 2020 13:40:44 +0200

Huge performance improvement

Diffstat:
Msrc/senc3d_scene_analyze.c | 18+++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/senc3d_scene_analyze.c b/src/senc3d_scene_analyze.c @@ -600,6 +600,7 @@ group_connex_components component_id_t cc_count; int64_t ccc; struct filter_ctx filter_ctx; + float lower[3], upper[3]; ASSERT(scn && triangles_comp && connex_components && s3d_view && next_enclosure_id && res); @@ -612,15 +613,18 @@ group_connex_components positions = darray_position_cdata_get(&scn->vertices); filter_ctx.scn = scn; filter_ctx.triangles_comp = triangles_comp; + *res = s3d_scene_view_get_aabb(s3d_view, lower, upper); + if(*res != RES_OK) return; /* Cast rays to find links between connex components */ #pragma omp for for(ccc = 0; ccc < (int64_t)cc_count; ccc++) { res_T tmp_res = RES_OK; component_id_t c = (component_id_t)ccc; struct s3d_hit hit = S3D_HIT_NULL; - float origin[3]; + float origin[3], rrr[3], r; struct cc_descriptor* const cc = descriptors[c]; const double* max_vrtx; + int i; if(*res != RES_OK) continue; ASSERT(cc->cc_id == c); @@ -641,8 +645,16 @@ group_connex_components f3_set_d3(origin, max_vrtx); /* Self-hit data: self hit if hit this component "on the other side" */ filter_ctx.origin_component = cc->cc_id; - tmp_res = s3d_scene_view_closest_point(s3d_view, origin, FLT_MAX, - &filter_ctx, &hit); + /* Limit search radius. Only +Z moves are permitted */ + FOR_EACH(i, 0, 2) { + ASSERT(lower[i] <= origin[i] && origin[i] <= upper[i]); + rrr[i] = MMIN(origin[i] - lower[i], upper[i] - origin[i]); + } + ASSERT(lower[2] <= origin[2] && origin[2] <= upper[2]); + rrr[2] = upper[2] - origin[2]; + r = f3_len(rrr) + FLT_EPSILON; /* Ensure r > 0 */ + tmp_res = s3d_scene_view_closest_point(s3d_view, origin, r, &filter_ctx, + &hit); if(tmp_res != RES_OK) { *res = tmp_res; continue;