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