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 815f406e05ef6099a854ecf610a07c30b07f9e40
parent 4a01818cc2ae2f98684d03211f7ff2fcaa140f38
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 13 Feb 2018 18:50:42 +0100

Replace repetitive error code by a macro.

Diffstat:
Msrc/senc_device_c.h | 4++++
Msrc/senc_scene.c | 39+++++++++++++--------------------------
Msrc/senc_scene_analyze.c | 73++++++++++++++++++++++++-------------------------------------------------
3 files changed, 41 insertions(+), 75 deletions(-)

diff --git a/src/senc_device_c.h b/src/senc_device_c.h @@ -19,6 +19,10 @@ #include <rsys/free_list.h> #include <rsys/ref_count.h> +#define OK(expr)\ + res = expr;\ + if(res != RES_OK) goto error; + struct name { FITEM; }; #define FITEM_TYPE name #include <rsys/free_list.h> diff --git a/src/senc_scene.c b/src/senc_scene.c @@ -118,20 +118,13 @@ senc_scene_add_geometry return RES_BAD_ARG; /* Make room for new geometry; suppose no more duplicates. */ - res = darray_position_reserve(&scn->vertices, scn->nuverts + nverts); - if(res != RES_OK) goto error; - res = darray_triangle_in_reserve(&scn->triangles_in, scn->nutris + ntris); - if(res != RES_OK) goto error; - res = htable_vrtx_reserve(&scn->unique_vertices, scn->nuverts + nverts); - if(res != RES_OK) goto error; - res = darray_vrtx_id_reserve(&scn->unique_vertice_ids, scn->nverts + nverts); - if(res != RES_OK) goto error; - res = htable_trg_reserve(&scn->unique_triangles, scn->nutris + ntris); - if(res != RES_OK) goto error; - res = darray_trg_id_reserve(&scn->unique_triangle_ids, scn->ntris + ntris); - if (res != RES_OK) goto error; - res = darray_char_reserve(&scn->triangle_reversed, scn->ntris + ntris); - if (res != RES_OK) goto error; + OK(darray_position_reserve(&scn->vertices, scn->nuverts + nverts)); + OK(darray_triangle_in_reserve(&scn->triangles_in, scn->nutris + ntris)); + OK(htable_vrtx_reserve(&scn->unique_vertices, scn->nuverts + nverts)); + OK(darray_vrtx_id_reserve(&scn->unique_vertice_ids, scn->nverts + nverts)); + OK(htable_trg_reserve(&scn->unique_triangles, scn->nutris + ntris)); + OK(darray_trg_id_reserve(&scn->unique_triangle_ids, scn->ntris + ntris)); + OK(darray_char_reserve(&scn->triangle_reversed, scn->ntris + ntris)); /* Get geometry */ trg = darray_triangle_in_cdata_get(&scn->triangles_in); @@ -152,15 +145,13 @@ senc_scene_add_geometry res = darray_position_push_back(&scn->vertices, &tmp); if (res != RES_OK) goto error; ASSERT(unique_v == htable_vrtx_size_get(&scn->unique_vertices)); - res = htable_vrtx_set(&scn->unique_vertices, &tmp, &unique_v); + OK(htable_vrtx_set(&scn->unique_vertices, &tmp, &unique_v)); ++actual_nuverts; - if(res != RES_OK) goto error; } /* The unique ID for vertex v is u */ ASSERT(scn->nverts + i == darray_vrtx_id_size_get(&scn->unique_vertice_ids)); - res = darray_vrtx_id_push_back(&scn->unique_vertice_ids, &unique_v); - if(res != RES_OK) goto error; + OK(darray_vrtx_id_push_back(&scn->unique_vertice_ids, &unique_v)); ++actual_nverts; } @@ -256,10 +247,8 @@ senc_scene_add_geometry /* New triangle */ trg_id_t u = scn->nutris + actual_nutris; ASSERT(u == htable_trg_size_get(&scn->unique_triangles)); - res = htable_trg_set(&scn->unique_triangles, &trg_key, &u); - if(res != RES_OK) goto error; - res = darray_triangle_in_push_back(&scn->triangles_in, &tmp); - if (res != RES_OK) goto error; + OK(htable_trg_set(&scn->unique_triangles, &trg_key, &u)); + OK(darray_triangle_in_push_back(&scn->triangles_in, &tmp)); ++actual_nutris; } ASSERT(darray_trg_id_size_get(&scn->unique_triangle_ids) @@ -267,10 +256,8 @@ senc_scene_add_geometry ASSERT(scn->ntris + i == darray_trg_id_size_get(&scn->unique_triangle_ids)); tr = scn->nutris + i; - res = darray_trg_id_push_back(&scn->unique_triangle_ids, &tr); - if (res != RES_OK) goto error; - res = darray_char_push_back(&scn->triangle_reversed, &reversed); - if (res != RES_OK) goto error; + OK(darray_trg_id_push_back(&scn->unique_triangle_ids, &tr)); + OK(darray_char_push_back(&scn->triangle_reversed, &reversed)); ++actual_ntris; } diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -298,8 +298,7 @@ extract_connex_components alloc = descriptor_get_allocator(desc); scn = desc->scene; - res = darray_triangle_comp_resize(&desc->triangles_comp, scn->nutris); - if(res != RES_OK) goto error; + OK(darray_triangle_comp_resize(&desc->triangles_comp, scn->nutris)); triangles_comp = darray_triangle_comp_data_get(&desc->triangles_comp); /* Init data structures */ @@ -505,34 +504,24 @@ group_connex_components attribs.usage = S3D_POSITION; attribs.get = get_scn_position; - res = s3d_device_create(desc->scene->dev->logger, alloc, 0, &s3d); - if(res != RES_OK) goto error; - - res = s3d_scene_create(s3d, &s3d_scn); - if(res != RES_OK) goto error; - /* Put geometry in a 3D view */ - res = s3d_shape_create_mesh(s3d, &s3d_shp); - if(res != RES_OK) goto error; + OK(s3d_device_create(desc->scene->dev->logger, alloc, 0, &s3d)); + OK(s3d_scene_create(s3d, &s3d_scn)); + OK(s3d_shape_create_mesh(s3d, &s3d_shp)); /* Back to API type for ntris and nverts */ ASSERT(desc->scene->nutris < UINT_MAX); ASSERT(desc->scene->nuverts < UINT_MAX); - res = s3d_mesh_setup_indexed_vertices(s3d_shp, (unsigned)desc->scene->nutris, - get_scn_indices, (unsigned)desc->scene->nuverts, &attribs, 1, desc->scene); - if(res != RES_OK) goto error; - - res = s3d_scene_attach_shape(s3d_scn, s3d_shp); - if(res != RES_OK) goto error; - - res = s3d_scene_view_create(s3d_scn, S3D_TRACE, &s3d_view); - if(res != RES_OK) goto error; + OK(s3d_mesh_setup_indexed_vertices(s3d_shp, (unsigned)desc->scene->nutris, + get_scn_indices, (unsigned)desc->scene->nuverts, &attribs, 1, desc->scene)); + OK(s3d_scene_attach_shape(s3d_scn, s3d_shp)); + OK(s3d_scene_view_create(s3d_scn, S3D_TRACE, &s3d_view)); /* Cast rays to find links between connex components */ FOR_EACH(c, 0, cc_count) { struct s3d_hit hit = S3D_HIT_NULL; float origin[3]; - const float direction[3] = { 0, 0, 1 }; + const float dir[3] = { 0, 0, 1 }; const float range[2] = { 0, FLT_MAX }; struct cc_descriptor* const cc = descriptors + c; @@ -557,9 +546,7 @@ group_connex_components || trgsides[cc->max_z_side_id].facing_side_id[2] == TRGSIDE_OPPOSITE(cc->max_z_side_id)))); f3_set_d3(origin, cc->max_vrtx); - res = s3d_scene_view_trace_ray( - s3d_view, origin, direction, range, NULL, &hit); - if(res != RES_OK) goto error; + OK(s3d_scene_view_trace_ray(s3d_view, origin, dir, range, NULL, &hit)); /* If no hit, the component is facing an infinite medium */ if(S3D_HIT_NONE(&hit)) { cc->cc_group_root = CC_GROUP_ROOT_INFINITE; @@ -719,12 +706,9 @@ scan_edges /* Make some room for edges. */ max_nbedges = (edge_id_t)(scn->nuverts + scn->nutris + 2); htable_edge_id_init(scn->dev->allocator, &edge_ids); - res = htable_edge_id_reserve(&edge_ids, max_nbedges); - if(res != RES_OK) goto error; - res = darray_neighbourhood_reserve(neighbourhood_by_edge, max_nbedges); - if(res != RES_OK) goto error; - res = darray_triangle_tmp_resize(triangles_tmp_array, scn->nutris); - if(res != RES_OK) goto error; + OK(htable_edge_id_reserve(&edge_ids, max_nbedges)); + OK(darray_neighbourhood_reserve(neighbourhood_by_edge, max_nbedges)); + OK(darray_triangle_tmp_resize(triangles_tmp_array, scn->nutris)); /* Loop on triangles to register edges. */ triangles_in = darray_triangle_in_data_get(&scn->triangles_in); @@ -753,12 +737,10 @@ scan_edges tmp = htable_edge_id_size_get(&edge_ids); ASSERT(tmp <= EDGE_MAX__); id = (edge_id_t)tmp; - res = htable_edge_id_set(&edge_ids, &neighbourhood.edge, &id); - if(res != RES_OK) goto error; + OK(htable_edge_id_set(&edge_ids, &neighbourhood.edge, &id)); darray_neighbour_init(scn->dev->allocator, &neighbourhood.neighbours); - res = darray_neighbourhood_push_back( - neighbourhood_by_edge, &neighbourhood); - if(res != RES_OK) goto error; + OK(darray_neighbourhood_push_back(neighbourhood_by_edge, + &neighbourhood)); } /* Add neighbour info to edge's neighbour list */ neighbour_list @@ -973,13 +955,10 @@ build_result FOR_EACH(t, 0, desc->scene->nutris) side_membership[t] |= cc_membership[t]; } /* Translate membership into a side and vertex lists. */ - res = darray_triangle_in_reserve(&enc->sides, approx_trg_counts[e]); - if(res != RES_OK) goto error; - res = darray_position_reserve(&enc->vertices, approx_trg_counts[e] / 2); - if(res != RES_OK) goto error; + OK(darray_triangle_in_reserve(&enc->sides, approx_trg_counts[e])); + OK(darray_position_reserve(&enc->vertices, approx_trg_counts[e] / 2)); /* New vertex numbering scheme local to the enclosure */ htable_vrtx_id_clear(&vtable); - if(res != RES_OK) goto error; ASSERT(desc->scene->nutris == darray_triangle_in_size_get(&desc->scene->triangles_in)); FOR_EACH(t, 0, desc->scene->nutris) { @@ -998,28 +977,24 @@ build_result ASSERT(tmp == darray_position_size_get(&enc->vertices)); ASSERT(tmp < VRTX_MAX__); trg.vertice_id[i] = (vrtx_id_t)tmp; - res = htable_vrtx_id_set( - &vtable, trg_in->vertice_id + i, trg.vertice_id + i); - if(res != RES_OK) goto error; - res = darray_position_push_back( - &enc->vertices, positions + trg_in->vertice_id[i]); - if(res != RES_OK) goto error; + OK(htable_vrtx_id_set(&vtable, trg_in->vertice_id + i, + trg.vertice_id + i)); + OK(darray_position_push_back(&enc->vertices, + positions + trg_in->vertice_id[i])); ++enc->header.vertices_count; } } FOR_EACH(i, 0, 2) trg.medium[i] = trg_in->medium[i]; if(side_membership[t] & FLAG_FRONT) { ++enc->header.triangle_count; - res = darray_triangle_in_push_back(&enc->sides, &trg); - if(res != RES_OK) goto error; + OK(darray_triangle_in_push_back(&enc->sides, &trg)); ASSERT(triangles_enc[t].enclosure[SIDE_FRONT] == ENCLOSURE_NULL__); triangles_enc[t].enclosure[SIDE_FRONT] = e; } if(side_membership[t] & FLAG_BACK) { ++enc->header.triangle_count; triangle_in_flip(&trg); - res = darray_triangle_in_push_back(&enc->sides, &trg); - if(res != RES_OK) goto error; + OK(darray_triangle_in_push_back(&enc->sides, &trg)); ASSERT(triangles_enc[t].enclosure[SIDE_BACK] == ENCLOSURE_NULL__); triangles_enc[t].enclosure[SIDE_BACK] = e; }