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 c4507c2d77c1df0c54257572597b189a7f959d1d
parent 358b00c1371eda630adef5897c6a8e4fad42a183
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 16 Feb 2018 15:11:05 +0100

BugFix: opposite triangle side index computation was broken.

Fixed some comments and added assert too.

Diffstat:
Msrc/senc_scene_analyze_c.h | 43+++++++++++++++++++++++++++++++++----------
1 file changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/senc_scene_analyze_c.h b/src/senc_scene_analyze_c.h @@ -66,6 +66,7 @@ set_edge char* reversed) { ASSERT(edge && reversed && vrtx0 != vrtx1); + ASSERT(*reversed == CHAR_MAX); /* Should not be already set. */ if(vrtx0 < vrtx1) { edge->vrtx0 = vrtx0; edge->vrtx1 = vrtx1; @@ -115,11 +116,6 @@ TRGSIDE_IS_FRONT(side_id_t s) { return (s & 1) == 0; } -static FINLINE side_id_t -TRGSIDE_OPPOSITE(side_id_t s) { - return s ^ (~1); -} - static FINLINE enum side_id TRGSIDE_2_SIDE(side_id_t s) { return (s & 1) ? SIDE_BACK : SIDE_FRONT; @@ -128,9 +124,16 @@ TRGSIDE_2_SIDE(side_id_t s) { static FINLINE side_id_t TRGIDxSIDE_2_TRGSIDE(trg_id_t t, enum side_id i) { ASSERT((((size_t)t << 1) | (i == SIDE_BACK)) < SIDE_MAX__); + ASSERT(i == SIDE_FRONT || i == SIDE_BACK); return (side_id_t)((t << 1) | (i == SIDE_BACK)); } +static FINLINE side_id_t +TRGSIDE_OPPOSITE(side_id_t s) { + return TRGIDxSIDE_2_TRGSIDE(TRGSIDE_2_TRG(s), + TRGSIDE_IS_FRONT(s) ? SIDE_BACK : SIDE_FRONT); +} + /* Descriptors for connex component. * Define lists of trg sides starting from a given head. * Also keeps the maximum z info of the component @@ -217,7 +220,9 @@ cc_descriptor_copy(struct cc_descriptor* dst, const struct cc_descriptor* src) } static FINLINE res_T -cc_descriptor_copy_and_release(struct cc_descriptor* dst, struct cc_descriptor* src) +cc_descriptor_copy_and_release + (struct cc_descriptor* dst, + struct cc_descriptor* src) { ASSERT(dst && src); d3_set(dst->max_vrtx, src->max_vrtx); @@ -229,7 +234,8 @@ cc_descriptor_copy_and_release(struct cc_descriptor* dst, struct cc_descriptor* dst->cc_id = src->cc_id; dst->cc_group_root = src->cc_group_root; dst->enclosure_id = src->enclosure_id; - return darray_char_copy_and_release(&dst->side_membership, &src->side_membership); + return darray_char_copy_and_release(&dst->side_membership, + &src->side_membership); } #define DARRAY_NAME cc_descriptor @@ -243,16 +249,33 @@ cc_descriptor_copy_and_release(struct cc_descriptor* dst, struct cc_descriptor* /* Triangle information. * Depending on lifespan, information is kept in different places: * - triangle_in for user provided information (kept in scene) - * - triangle_comp for information describing components (kept in senc_descriptor) - * - triangle_tmp for tmp information (kept until triangle_comp is ready) */ + * - triangle_tmp for tmp information (kept until triangle_comp is ready) + * - triangle_comp for information describing components (kept until + * triangle_enc is ready) + * - triangle_enc for information describing enclosures (kept in + * senc_descriptor). */ struct triangle_tmp { /* Are the edges of the triangle defined in the same order than - * the edges they are linked to? */ + * the edges they are linked to? */ char reversed_edge[3]; /* tmp data used to find the +Z-most vertex of components */ char max_z_vrtx_id; double max_z; }; + +#ifndef NDEBUG +static FINLINE void +triangle_tmp_init(struct mem_allocator* alloc, struct triangle_tmp* trg) { + int i; + (void) alloc; + ASSERT(trg); + FOR_EACH(i, 0, 3) trg->reversed_edge[i] = CHAR_MAX; + trg->max_z_vrtx_id = CHAR_MAX; + trg->max_z = -DBL_MAX; +} +#define DARRAY_FUNCTOR_INIT triangle_tmp_init +#endif + #define DARRAY_NAME triangle_tmp #define DARRAY_DATA struct triangle_tmp #include <rsys/dynamic_array.h>