commit 8cce1bcbc3b1d8c524dd5df1ad37457a5ae929e5
parent ea96ad9c852b427814621b68fc30d811e8210b87
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 13 Feb 2018 10:31:43 +0100
Add code to determine by-triangle enclosures.
Diffstat:
2 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c
@@ -189,20 +189,15 @@ senc_descriptor_get_global_enclosures
const unsigned itri,
unsigned enclosures[2])
{
- const struct triangle_comp* trg;
+ const struct triangle_enc* trg;
int i;
if(!enclosures || !desc
- || itri >= darray_triangle_in_size_get(&desc->scene->triangles_in))
+ || itri >= darray_triangle_enc_size_get(&desc->triangles_enc))
return RES_BAD_ARG;
- trg = darray_triangle_comp_cdata_get(&desc->triangles_comp) + itri;
-
- /* FIXME: trg->component is not what we need.
- * We want an enclosure ID, not a component ID! */
-
-
+ trg = darray_triangle_enc_cdata_get(&desc->triangles_enc) + itri;
FOR_EACH(i, 0, 2) {
- ASSERT(trg->component[i] < UINT_MAX);
- enclosures[i] = (unsigned)trg->component[i]; /* Back to API type */
+ ASSERT(trg->enclosure[i] < UINT_MAX);
+ enclosures[i] = (unsigned)trg->enclosure[i]; /* Back to API type */
}
return RES_OK;
}
diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c
@@ -845,6 +845,7 @@ build_result
struct enclosure_data* enclosures;
char* side_membership = NULL;
const struct triangle_in* triangles_in;
+ struct triangle_enc* triangles_enc;
const union double3* positions;
struct htable_vrtx_id vtable;
size_t tmp;
@@ -893,6 +894,9 @@ build_result
res = RES_MEM_ERR;
goto error;
}
+ res = darray_triangle_enc_resize(&desc->triangles_enc, desc->scene->nutris);
+ if (res != RES_OK) goto error;
+ triangles_enc = darray_triangle_enc_data_get(&desc->triangles_enc);
htable_vrtx_id_init(alloc, &vtable);
FOR_EACH(e, 0, desc->enclosures_count) {
struct enclosure_data* enc = enclosures + e;
@@ -944,12 +948,16 @@ build_result
++enc->header.triangle_count;
res = darray_triangle_in_push_back(&enc->sides, &trg);
if(res != RES_OK) goto error;
+ 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;
+ ASSERT(triangles_enc[t].enclosure[SIDE_BACK] == ENCLOSURE_NULL__);
+ triangles_enc[t].enclosure[SIDE_BACK] = e;
}
}
}
@@ -1002,7 +1010,7 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc)
darray_neighbourhood_init(scn->dev->allocator, &neighbourhood_by_edge);
neighbourhood_by_edge_initialized = 1;
- /* Step 1: */
+ /* Step 1: list edges and connect triangles to edges */
res = scan_edges(scn, &neighbourhood_by_edge, &triangles_tmp);
if(res != RES_OK) {
log_err(scn->dev, "%s: could not scan edges.\n", FUNC_NAME);
@@ -1026,6 +1034,7 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc)
goto error;
}
+ /* Step 2: link triangles by neighbourhood */
res = link_neighbours(scn, trgsides, &neighbourhood_by_edge,
&triangles_tmp, side_ids_by_medium);
if(res != RES_OK) {
@@ -1038,6 +1047,7 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc)
darray_cc_descriptor_init(scn->dev->allocator, &connex_components);
connex_components_initialized = 1;
+ /* Step 3: extract triangle connex components */
res = extract_connex_components(desc, trgsides, &connex_components,
&triangles_tmp, side_ids_by_medium);
if(res != RES_OK) {
@@ -1057,6 +1067,7 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc)
}
side_ids_by_medium = NULL;
+ /* Step 4: group components */
res = group_connex_components(desc, trgsides, &connex_components);
if(res != RES_OK) {
log_err(scn->dev,