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:
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;