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