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 b91e596b241bcdf91cc4b8bcb9bbbc8146a19043
parent e3c0df09d923326dd728cdb3a87164bf2db0ac3e
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu, 15 Feb 2018 14:35:12 +0100

Fix a warning in Release

Also improve code for self-hit filtering.

Diffstat:
Msrc/senc_scene_analyze.c | 38+++++++++++++++-----------------------
1 file changed, 15 insertions(+), 23 deletions(-)

diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -467,11 +467,6 @@ get_scn_position(const unsigned ivert, float pos[3], void* ctx) { f3_set_d3(pos, pt->vec); } -struct ray_ctx { - component_id_t origin_component; - const struct darray_triangle_comp* triangles_comp; -}; - static int self_hit_filter (const struct s3d_hit* hit, @@ -480,32 +475,30 @@ self_hit_filter void* ray_data, void* filter_data) { - const struct senc_descriptor* desc = filter_data; - const struct ray_ctx* ctx = ray_data; + const struct darray_triangle_comp* triangles_comp = filter_data; + const component_id_t* origin_component = ray_data; const struct triangle_comp* hit_trg_comp; enum side_id hit_side; component_id_t hit_component; (void)ray_org; (void)ray_dir; - ASSERT(hit && ray_org && ctx && ray_data && desc); - ASSERT(hit->prim.prim_id < darray_triangle_comp_size_get(ctx->triangles_comp)); - hit_trg_comp - = darray_triangle_comp_cdata_get(ctx->triangles_comp) + hit->prim.prim_id; + ASSERT(hit && triangles_comp && origin_component); + ASSERT(hit->prim.prim_id < darray_triangle_comp_size_get(triangles_comp)); + hit_trg_comp = darray_triangle_comp_cdata_get(triangles_comp) + + hit->prim.prim_id; hit_side = (hit->normal[2] > 0) ? SIDE_FRONT : SIDE_BACK; hit_component = hit_trg_comp->component[hit_side]; - if(hit_component == ctx->origin_component) { - /* self hit */ - ASSERT(hit->distance < 1e-6); - } - return (hit_component == ctx->origin_component); + /* Not self hit or distance should be small */ + ASSERT(hit_component != *origin_component || hit->distance < 1e-6); + return (hit_component == *origin_component); } static res_T group_connex_components (struct senc_descriptor* desc, struct trgside* trgsides, - const struct darray_triangle_comp* triangles_comp, + struct darray_triangle_comp* triangles_comp, struct darray_cc_descriptor* connex_components) { res_T res = RES_OK; @@ -516,7 +509,6 @@ group_connex_components struct s3d_shape* s3d_shp = NULL; struct s3d_scene_view* s3d_view = NULL; struct s3d_vertex_data attribs; - struct ray_ctx ray_context; size_t tmp; component_id_t cc_count, c; medium_id_t infinite_medium = MEDIUM_NULL__; @@ -546,8 +538,7 @@ group_connex_components ASSERT(desc->scene->nuverts < UINT_MAX); OK(s3d_mesh_setup_indexed_vertices(s3d_shp, (unsigned)desc->scene->nutris, get_scn_indices, (unsigned)desc->scene->nuverts, &attribs, 1, desc->scene)); - s3d_mesh_set_hit_filter_function(s3d_shp, self_hit_filter, desc); - ray_context.triangles_comp = triangles_comp; + s3d_mesh_set_hit_filter_function(s3d_shp, self_hit_filter, triangles_comp); OK(s3d_scene_attach_shape(s3d_scn, s3d_shp)); OK(s3d_scene_view_create(s3d_scn, S3D_TRACE, &s3d_view)); @@ -560,6 +551,8 @@ group_connex_components struct cc_descriptor* const cc = descriptors + c; const struct triangle_comp* origin_trg = darray_triangle_comp_cdata_get(triangles_comp) + cc->max_z_vrtx_id; + component_id_t self_hit_component + = origin_trg->component[1 - TRGSIDE_2_SIDE(cc->max_z_side_id)]; ASSERT(cc->cc_group_root == CC_GROUP_ID_NONE); @@ -583,9 +576,8 @@ group_connex_components == TRGSIDE_OPPOSITE(cc->max_z_side_id)))); f3_set_d3(origin, cc->max_vrtx); /* Self-hit data: self hit if hit this component "on the other side" */ - ray_context.origin_component - = origin_trg->component[1- TRGSIDE_2_SIDE(cc->max_z_side_id)]; - OK(s3d_scene_view_trace_ray(s3d_view, origin, dir, range, &ray_context, &hit)); + OK(s3d_scene_view_trace_ray(s3d_view, origin, dir, range, + &self_hit_component, &hit)); /* If no hit, the component is facing an infinite medium */ if(S3D_HIT_NONE(&hit)) { cc->cc_group_root = CC_GROUP_ROOT_INFINITE;