commit b6392049c5636c5fd69223396a6ddba8a4920c1f
parent c983b6ba8fd3370db9a455aa33f9b0fbf9526b7c
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 13 Feb 2018 12:55:15 +0100
Fix count VS unique count mismatches.
Diffstat:
3 files changed, 27 insertions(+), 16 deletions(-)
diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c
@@ -156,7 +156,7 @@ senc_descriptor_get_global_vertices
{
const union double3* v;
if(!vrtx || !desc
- || ivert >= darray_triangle_in_size_get(&desc->scene->triangles_in))
+ || ivert >= darray_position_size_get(&desc->scene->vertices))
return RES_BAD_ARG;
v = darray_position_cdata_get(&desc->scene->vertices) + ivert;
diff --git a/src/senc_descriptor_c.h b/src/senc_descriptor_c.h
@@ -77,8 +77,11 @@ triangle_enc_init(struct mem_allocator* alloc, struct triangle_enc* trg) {
struct senc_descriptor {
struct senc_scene* scene;
enclosure_id_t enclosures_count;
+ /* Store by-triangle components */
struct darray_triangle_comp triangles_comp;
+ /* Store by-triangle enclosures */
struct darray_triangle_enc triangles_enc;
+ /* Store enclosures */
struct darray_enclosure enclosures;
trg_id_t triangle_count;
vrtx_id_t vertices_count;
diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c
@@ -130,7 +130,11 @@ find_component_Zmax
side_membership = darray_char_cdata_get(&cc->side_membership);
/* Build the sorted list of side ids */
- FOR_EACH(trid, 0, scn->ntris) {
+ ASSERT(darray_triangle_tmp_size_get(triangles_tmp_array)
+ == darray_triangle_in_size_get(&scn->triangles_in));
+ ASSERT(scn->nutris
+ == darray_triangle_in_size_get(&scn->triangles_in));
+ FOR_EACH(trid, 0, scn->nutris) {
const char member = side_membership[trid];
struct triangle_in* const trg_in = triangles_in + trid;
struct triangle_tmp* const trg_tmp = triangles_tmp + trid;
@@ -201,7 +205,7 @@ add_side_to_stack
{
(void)scn;
ASSERT(scn && trgsides && stack
- && side_id < SIDE_MAX__ && side_id < 2 * scn->ntris);
+ && side_id < SIDE_MAX__ && side_id < 2 * scn->nutris);
ASSERT(!find_side_in_list(trgsides, stack, side_id, FLAG_WAITING_STACK));
darray_side_id_push_back(stack, &side_id);
trgsides[side_id].list_id = FLAG_WAITING_STACK;
@@ -216,7 +220,7 @@ add_side_to_medium_list
{
(void)scn;
ASSERT(scn && side_ids_by_medium && trgsides
- && side_id < 2 * scn->ntris);
+ && side_id < 2 * scn->nutris);
if(trgsides[side_id].list_id == FLAG_LIST_BY_MEDIUM) {
ASSERT(find_side_in_list(trgsides, side_ids_by_medium, side_id,
FLAG_LIST_BY_MEDIUM));
@@ -294,7 +298,7 @@ extract_connex_components
alloc = descriptor_get_allocator(desc);
scn = desc->scene;
- res = darray_triangle_comp_resize(&desc->triangles_comp, scn->ntris);
+ res = darray_triangle_comp_resize(&desc->triangles_comp, scn->nutris);
if(res != RES_OK) goto error;
triangles_comp = darray_triangle_comp_data_get(&desc->triangles_comp);
@@ -329,7 +333,7 @@ extract_connex_components
side_id_t crt_side_id = start_side_id;
char* side_membership;
- ASSERT(start_side_id == SIDE_NULL__ || start_side_id < 2 * scn->ntris);
+ ASSERT(start_side_id == SIDE_NULL__ || start_side_id < 2 * scn->nutris);
if(start_side_id == SIDE_NULL__)
break; /* start_side_id=SIDE_NULL__ => medium done! */
ASSERT(trgsides[start_side_id].list_id == FLAG_LIST_BY_MEDIUM);
@@ -339,9 +343,9 @@ extract_connex_components
ASSERT(tmp <= COMPONENT_MAX__);
cc_descriptor_clear(¤t_cc);
/* 1 char per triangle (2 sides) */
- darray_char_resize(¤t_cc.side_membership, scn->ntris);
+ darray_char_resize(¤t_cc.side_membership, scn->nutris);
side_membership = darray_char_data_get(¤t_cc.side_membership);
- memset(side_membership, 0, scn->ntris * sizeof(char));
+ memset(side_membership, 0, scn->nutris * sizeof(char));
current_cc.cc_id = (component_id_t)tmp;
current_cc.medium = m;
@@ -351,7 +355,7 @@ extract_connex_components
struct trgside* crt_side = trgsides + crt_side_id;
const trg_id_t crt_trg_id = TRGSIDE_2_TRG(crt_side_id);
struct triangle_comp* trg_comp = triangles_comp + crt_trg_id;
- ASSERT(crt_trg_id < scn->ntris);
+ ASSERT(crt_trg_id < scn->nutris);
ASSERT(trgsides[crt_side_id].medium == m);
/* Record crt_side both as component and triangle level */
@@ -422,6 +426,9 @@ exit:
MEM_RM(scn->dev->allocator, component_ids_by_medium);
}
darray_side_id_release(&stack);
+ ASSERT(desc->triangle_count
+ == darray_triangle_comp_size_get(&desc->triangles_comp));
+ /* triangles_enc is still unused: no size to assert */
return res;
error:
goto exit;
@@ -563,7 +570,7 @@ group_connex_components
continue;
} else {
/* If hit, group this component */
- const trg_id_t hit_trg_id = (trg_id_t) hit.prim.prim_id;
+ const trg_id_t hit_trg_id = (trg_id_t)hit.prim.prim_id;
const struct triangle_in* hit_trg_in =
darray_triangle_in_cdata_get(&desc->scene->triangles_in) + hit_trg_id;
const struct triangle_comp* hit_trg_comp =
@@ -571,8 +578,7 @@ group_connex_components
enum side_id hit_side = (hit.normal[2] > 0) ? SIDE_FRONT : SIDE_BACK;
const side_id_t hit_side_id = TRGIDxSIDE_2_TRGSIDE(hit_trg_id, hit_side);
- ASSERT(hit.prim.prim_id < desc->scene->ntris);
- ASSERT(hit.prim.prim_id <= TRG_MAX__);
+ ASSERT(hit.prim.prim_id < desc->scene->nutris);
/* Not really the root until following links */
cc->cc_group_root = hit_trg_comp->component[hit_side];
@@ -889,7 +895,7 @@ build_result
approx_trg_counts[e_id] += cc->triangle_count;
}
side_membership
- = MEM_ALLOC(alloc, desc->scene->ntris * sizeof(*side_membership));
+ = MEM_ALLOC(alloc, desc->scene->nutris * sizeof(*side_membership));
if(!side_membership) {
res = RES_MEM_ERR;
goto error;
@@ -901,14 +907,14 @@ build_result
FOR_EACH(e, 0, desc->enclosures_count) {
struct enclosure_data* enc = enclosures + e;
trg_id_t t;
- memset(side_membership, 0, desc->scene->ntris * sizeof(*side_membership));
+ memset(side_membership, 0, desc->scene->nutris * sizeof(*side_membership));
/* Process all CC enclosures_count times to limit memory footprint. */
FOR_EACH(c, 0, cc_count) {
const struct cc_descriptor* cc = cc_descriptors + c;
const char* cc_membership
= darray_char_cdata_get(&cc->side_membership);
if(cc->enclosure_id != e) continue;
- FOR_EACH(t, 0, desc->scene->ntris) side_membership[t] |= cc_membership[t];
+ 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]);
@@ -918,7 +924,9 @@ build_result
/* New vertex numbering scheme local to the enclosure */
htable_vrtx_id_clear(&vtable);
if(res != RES_OK) goto error;
- FOR_EACH(t, 0, desc->scene->ntris) {
+ ASSERT(desc->scene->nutris
+ == darray_triangle_in_size_get(&desc->scene->triangles_in));
+ FOR_EACH(t, 0, desc->scene->nutris) {
const struct triangle_in* trg_in = triangles_in + t;
struct triangle_in trg;
int i;