commit 9c7d44f46626f0ba1eb0ee245814e6bd1a55a432
parent d65eb65b9004c90f494282f860fe17eeeed07c58
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Sun, 15 Mar 2020 17:58:47 +0100
BugFix: mismatch medium id VS medium index
Diffstat:
5 files changed, 30 insertions(+), 23 deletions(-)
diff --git a/src/senc3d_descriptor.c b/src/senc3d_descriptor.c
@@ -58,7 +58,7 @@ senc3d_scene_get_enclosure_count_by_medium
return RES_BAD_ARG;
ASSERT(darray_enc_ids_array_size_get(&scn->analyze.enc_ids_array_by_medium)
== 1 + scn->next_medium_idx);
- m_idx = (imed == SENC3D_UNSPECIFIED_MEDIUM) ? 0 : imed + 1;
+ m_idx = medium_id_2_medium_idx(imed);
enc_ids = darray_enc_ids_array_cdata_get(&scn->analyze.enc_ids_array_by_medium)
+ m_idx;
tmp = darray_enc_id_size_get(enc_ids);
@@ -98,7 +98,7 @@ senc3d_scene_get_enclosure_by_medium
return RES_BAD_ARG;
ASSERT(darray_enc_ids_array_size_get(&scn->analyze.enc_ids_array_by_medium)
== 1 + scn->next_medium_idx);
- m_idx = (imed == SENC3D_UNSPECIFIED_MEDIUM) ? 0 : imed + 1;
+ m_idx = medium_id_2_medium_idx(imed);
enc_ids =
darray_enc_ids_array_cdata_get(&scn->analyze.enc_ids_array_by_medium) + m_idx;
if(idx >= darray_enc_id_size_get(enc_ids)) return RES_BAD_ARG;
diff --git a/src/senc3d_enclosure_data.h b/src/senc3d_enclosure_data.h
@@ -104,7 +104,7 @@ bool_array_of_media_to_darray_media
const medium_id_t next_medium_idx)
{
res_T res = RES_OK;
- size_t m_idx;
+ int64_t m_idx;
const uchar* data;
ASSERT(src && dst);
@@ -114,11 +114,9 @@ bool_array_of_media_to_darray_media
darray_media_clear(dst);
if(res != RES_OK) goto error;
ASSERT(next_medium_idx <= MEDIUM_MAX__ + 1);
- FOR_EACH(m_idx, 0, next_medium_idx + 1) {
- medium_id_t medium;
- size_t mm = m_idx ? (medium_id_t)(m_idx - 1) : SENC3D_UNSPECIFIED_MEDIUM;
+ FOR_EACH(m_idx, 0, 1 + (int64_t)next_medium_idx) {
+ medium_id_t medium = medium_idx_2_medium_id(m_idx);
if(!data[m_idx]) continue;
- medium = (medium_id_t)mm;
res = darray_media_push_back(dst, &medium);
if(res != RES_OK) goto error;
}
diff --git a/src/senc3d_internal_types.h b/src/senc3d_internal_types.h
@@ -82,6 +82,18 @@ typedef unsigned medium_id_t;
#define MEDIUM_NULL__ UINT_MAX
#define PRTF_MDM "%u"
+static FINLINE medium_id_t
+medium_idx_2_medium_id(int64_t m_idx) {
+ return m_idx ? (medium_id_t)(m_idx - 1) : SENC3D_UNSPECIFIED_MEDIUM;
+}
+
+static FINLINE unsigned
+medium_id_2_medium_idx(medium_id_t medium) {
+ uint64_t tmp = (medium == SENC3D_UNSPECIFIED_MEDIUM) ? 0 : medium + 1;
+ ASSERT(tmp <= UINT_MAX);
+ return (unsigned)tmp;
+}
+
/* Enclosure IDs type */
typedef unsigned enclosure_id_t;
#define ENCLOSURE_MAX__ (UINT_MAX-1)
diff --git a/src/senc3d_scene.c b/src/senc3d_scene.c
@@ -193,7 +193,7 @@ senc3d_scene_create
OK(htable_trg_set(&unique_triangles, &trg_key, &nt));
for(s = SENC3D_FRONT; s <= SENC3D_BACK; s += SENC3D_BACK - SENC3D_FRONT) {
struct side_range* media_use;
- size_t m_idx = (med[s] == SENC3D_UNSPECIFIED_MEDIUM) ? 0 : med[s] + 1;
+ size_t m_idx = medium_id_2_medium_idx(med[s]);
tmp.medium[s] = med[s];
if(m_idx >= scn->next_medium_idx) {
medium_id_t medium;
diff --git a/src/senc3d_scene_analyze.c b/src/senc3d_scene_analyze.c
@@ -190,7 +190,7 @@ extract_connex_components
FOR_EACH(s, 0, 2) {
const side_id_t side = TRGIDxSIDE_2_TRGSIDE(t_, s);
medium_id_t medium = trg_in->medium[s];
- m_idx = (medium == SENC3D_UNSPECIFIED_MEDIUM) ? 0 : medium + 1;
+ m_idx = medium_id_2_medium_idx(medium);
ASSERT(media_use[m_idx].first <= side && side
<= media_use[m_idx].last);
}
@@ -202,8 +202,7 @@ extract_connex_components
#pragma omp for schedule(dynamic) nowait
/* Process all media, including unspecified */
for(m_idx = 0; m_idx < 1 + (int64_t)scn->next_medium_idx; m_idx++) {
- const medium_id_t medium
- = m_idx ? (medium_id_t)(m_idx - 1) : SENC3D_UNSPECIFIED_MEDIUM;
+ const medium_id_t medium = medium_idx_2_medium_id(m_idx);
/* media_use 0 is for SENC3D_UNSPECIFIED_MEDIUM, n+1 is for n */
const struct side_range* media_use =
darray_side_range_cdata_get(&scn->media_use) + m_idx;
@@ -321,13 +320,12 @@ extract_connex_components
enum side_flag nbour_side_id = TRGSIDE_2_SIDEFLAG(neighbour_id);
uchar* nbour_used = processed + nbour_trg_id;
const struct trgside* neighbour = trgsides + neighbour_id;
- medium_id_t nbour_med_idx = (neighbour->medium == SENC3D_UNSPECIFIED_MEDIUM)
- ? 0 : neighbour->medium + 1;
- if(neighbour->medium < medium
+ medium_id_t nbour_med_idx = medium_id_2_medium_idx(neighbour->medium);
+ if((int64_t)nbour_med_idx < m_idx
|| (*nbour_used & SIDE_CANCELED_FLAG(nbour_side_id)))
{
/* 1) Not the same medium.
- * Neighbour's medium id is less than current medium: the whole
+ * Neighbour's medium idx is less than current medium: the whole
* component is to be processed by another thread (possibly the one
* associated with neighbour's medium).
* 2) Neighbour was canceled: no need to replay the component
@@ -382,7 +380,7 @@ extract_connex_components
ASSERT(id <= COMPONENT_MAX__);
cc->cc_id = (component_id_t)id;
sz = darray_side_id_size_get(¤t_component);
- ASSERT(sz <= SIDE_MAX__);
+ ASSERT(sz > 0 && sz <= SIDE_MAX__);
cc->side_count = (side_id_t)sz;
cc->side_range.first = start_side_id;
cc->side_range.last = last_side_id;
@@ -402,7 +400,8 @@ extract_connex_components
enum senc3d_side sid = TRGSIDE_2_SIDE(s);
component_id_t* cmp = triangles_comp[tid].component;
ASSERT(cmp[sid] == COMPONENT_NULL__);
- ASSERT(trgsides[s].medium >= medium);
+ ASSERT(medium_id_2_medium_idx(trgsides[s].medium)
+ >= medium_id_2_medium_idx(medium));
cmp[sid] = cc->cc_id;
}
@@ -547,7 +546,6 @@ extract_connex_components
static void
group_connex_components
(struct senc3d_scene* scn,
- struct trgside* trgsides,
struct darray_triangle_comp* triangles_comp,
struct darray_ptr_component_descriptor* connex_components,
struct s3d_scene_view* s3d_view,
@@ -564,8 +562,7 @@ group_connex_components
component_id_t cc_count;
int64_t ccc;
- (void)trgsides;
- ASSERT(scn && trgsides && triangles_comp && connex_components
+ ASSERT(scn && triangles_comp && connex_components
&& s3d_view && next_enclosure_id && res);
ASSERT(scn->analyze.enclosures_count == 1);
@@ -1053,7 +1050,7 @@ build_result
/* Add this enclosure in relevant by-medium lists */
FOR_EACH(m, 0, enc->header.enclosed_media_count) {
medium_id_t medium = darray_media_cdata_get(&enc->enclosed_media)[m];
- size_t m_idx = (medium == SENC3D_UNSPECIFIED_MEDIUM) ? 0 : medium + 1;
+ size_t m_idx = medium_id_2_medium_idx(medium);
struct darray_enc_id* enc_ids_array_by_medium;
ASSERT(medium == SENC3D_UNSPECIFIED_MEDIUM || medium < scn->next_medium_idx);
ASSERT(darray_enc_ids_array_size_get(&scn->analyze.enc_ids_array_by_medium)
@@ -1277,8 +1274,8 @@ scene_analyze
} /* No barrier here */
/* Step 3: group components */
- group_connex_components(scn, trgsides, &triangles_comp,
- &connex_components, s3d_view, &next_enclosure_id, &res);
+ group_connex_components(scn, &triangles_comp, &connex_components, s3d_view,
+ &next_enclosure_id, &res);
/* Barrier at the end of step 3: data used in step 3 can be released /
* data produced by step 3 can be used */