commit 2164d1f97c366eb8bb5c760549381de9e0119d6d
parent 892ecc9dd8a7d5e0e0492f26a07375d6c4a898b4
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Wed, 23 Oct 2019 15:10:05 +0200
Keep a single API call for add_geometry. This breaks API.
As the add and merge callbacks allow the client app to manage custom
triangle ids, the global_id callback (that was ill-defined) is removed.
The senc_enclosure_get_triangle_id API call now returns the involved
side along with the triangle id.
Some redundant API calls are removed too.
Diffstat:
21 files changed, 236 insertions(+), 347 deletions(-)
diff --git a/src/senc.h b/src/senc.h
@@ -61,6 +61,12 @@ struct senc_device;
struct senc_scene;
struct senc_enclosure;
+/* A type to discriminate triangle sides */
+enum senc_side {
+ SENC_FRONT,
+ SENC_BACK
+};
+
/* Enclosure header type */
struct senc_enclosure_header {
/* The ID of the enclosure; 0, 1, ... */
@@ -172,13 +178,12 @@ senc_scene_reserve
* of SENC_UNDEFINED_MEDIUM that causes no error) and are deduplicated.
* The special value SENC_UNDEFINED_MEDIUM denotes an undefined medium.
* It can be used to define the 2 sides of a triangle at different times.
- * When deduplicating triangles, the first occurence is kept (with its original
- * global_id). Users can provide their own global ids for triangles; these ids
- * are not used by the library but are returned as-is by some API calls.
- * The callbacks devoted to attributes management allow the client app to store
- * its own data. Add and merge events can fail and stop the add_geometry. */
+ * When deduplicating triangles, the first occurence remains.
+ * The add_triangle and merge_triangle callbacks can be used for attributes
+ * management including triangle IDs; they allow the client app to store
+ * its own data. They can also fail and stop the add_geometry call. */
SENC_API res_T
-senc_scene_add_geometry_attr
+senc_scene_add_geometry
(struct senc_scene* scene,
/* Number of added triangles */
const unsigned triangles_count,
@@ -187,8 +192,6 @@ senc_scene_add_geometry_attr
/* User function that provides media ids for added triangles */
void(*media) /* Can be NULL <=> SENC_UNDEFINED_MEDIUM medium used */
(const unsigned itri, unsigned med[2], void* context),
- void(*global_id) /* Can be NULL <=> use triangle rank */
- (const unsigned itri, unsigned* gid, void* context),
/* Number of added vertices */
const unsigned vertices_count,
/* User function that provides coordinates for added vertices */
@@ -196,10 +199,10 @@ senc_scene_add_geometry_attr
/* Called for each new triangle so that the client app can manage its own
* triangle data/properties/attributes.
* If return is not RES_OK, add_geometry stops and fails. */
- res_T(*add_triangle) /* Can be NULL */
+ res_T(*add_triangle) /* Can be NULL */
(const unsigned global_id, const unsigned itri, void* context),
/* Called if the IVERTth triangle of the current add_geometry is equal to
- * the GLOBAL_IDth global triangle so that the client app can try to merge
+ * the global_id_th global triangle so that the client app can try to merge
* its own triangle data. The reversed_triangle arg indicates if the triangle
* vertices' order is the same it was when the triangle was first added.
* If return is not RES_OK, add_geometry stops and fails. */
@@ -208,29 +211,6 @@ senc_scene_add_geometry_attr
void* context),
void* context);
-static INLINE res_T
-senc_scene_add_geometry
- (struct senc_scene* scene,
- /* Number of added triangles */
- const unsigned triangles_count,
- /* User function that provides vertices ids for added triangles */
- void(*indices)(const unsigned itri, unsigned ids[3], void* context),
- /* User function that provides media ids for added triangles */
- void(*media) /* Can be NULL <=> SENC_UNDEFINED_MEDIUM medium used */
- (const unsigned itri, unsigned med[2], void* context),
- /* User function that provides a global id for added triangles. */
- void(*global_id) /* Can be NULL <=> use triangle rank */
- (const unsigned itri, unsigned* gid, void* context),
- /* Number of added vertices */
- const unsigned vertices_count,
- /* User function that provides coordinates for added vertices */
- void(*position)(const unsigned ivert, double pos[3], void* context),
- void* context)
-{
- return senc_scene_add_geometry_attr(scene, triangles_count, indices,
- media, global_id, vertices_count, position, NULL, NULL, context);
-}
-
/* Returns a descriptor of the scene that holds the analysis' result. */
SENC_API res_T
senc_scene_analyze
@@ -394,14 +374,6 @@ senc_descriptor_get_global_triangle_enclosures
const unsigned itri,
unsigned enclosures[2]);
-/* Returns the global id of the itri_th global unique triangles, either the
- * user provided one or the default one. */
-SENC_API res_T
-senc_descriptor_get_global_triangle_global_id
- (const struct senc_descriptor* descriptor,
- const unsigned itri,
- unsigned* gid);
-
/* Returns the number of segments that are frontier segments:
* - that have arity 1 (single triangle using the segment)
* - that connect 2 different media */
@@ -446,7 +418,8 @@ senc_enclosure_get_header
(const struct senc_enclosure* enclosure,
struct senc_enclosure_header* header);
-/* Returns the itri_th triangle of an enclosure. */
+/* Returns the itri_th triangle of an enclosure.
+ * Indices are local to the enclosure. */
SENC_API res_T
senc_enclosure_get_triangle
(const struct senc_enclosure* enclosure,
@@ -460,20 +433,14 @@ senc_enclosure_get_vertex
const unsigned ivert,
double coord[3]);
-/* Returns the front and back side media ids of the itri_th triangle of an
- * enclosure. */
-SENC_API res_T
-senc_enclosure_get_triangle_media
- (const struct senc_enclosure* enclosure,
- const unsigned itri,
- unsigned medium[2]);
-
-/* Returns the global id of the itri_th triangle of an enclosure. */
+/* Returns the global id of the itri_th triangle of an enclosure
+ * and the involved side. */
SENC_API res_T
senc_enclosure_get_triangle_global_id
(const struct senc_enclosure* enclosure,
const unsigned itri,
- unsigned* gid);
+ unsigned* gid,
+ enum senc_side* side);
/* Returns the id of the imed_th medium of an enclosure. */
SENC_API res_T
diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c
@@ -272,21 +272,6 @@ senc_descriptor_get_global_triangle_enclosures
}
res_T
-senc_descriptor_get_global_triangle_global_id
- (const struct senc_descriptor* desc,
- const unsigned itri,
- unsigned* gid)
-{
- const struct triangle_in* trg;
- if(!gid || !desc
- || itri >= darray_triangle_in_size_get(&desc->scene->triangles_in))
- return RES_BAD_ARG;
- trg = darray_triangle_in_cdata_get(&desc->scene->triangles_in) + itri;
- *gid = trg->global_id;
- return RES_OK;
-}
-
-res_T
senc_descriptor_get_frontier_segments_count
(const struct senc_descriptor* desc,
unsigned* count)
diff --git a/src/senc_enclosure.c b/src/senc_enclosure.c
@@ -81,17 +81,17 @@ senc_enclosure_get_triangle
const unsigned itri,
unsigned indices[3])
{
- const struct triangle_in* triangle;
+ const struct side_enc* side;
int i;
if(!enclosure || !indices
|| itri >= enclosure->data->header.triangle_count)
return RES_BAD_ARG;
- ASSERT(darray_triangle_in_size_get(&enclosure->data->sides)
+ ASSERT(darray_sides_enc_size_get(&enclosure->data->sides)
== enclosure->data->header.triangle_count);
- triangle = darray_triangle_in_cdata_get(&enclosure->data->sides) + itri;
+ side = darray_sides_enc_cdata_get(&enclosure->data->sides) + itri;
FOR_EACH(i, 0, 3) {
- ASSERT(triangle->vertice_id[i] < UINT_MAX);
- indices[i] = (unsigned)triangle->vertice_id[i]; /* Back to API type */
+ ASSERT(side->vertice_id[i] < UINT_MAX);
+ indices[i] = (unsigned)side->vertice_id[i]; /* Back to API type */
}
return RES_OK;
}
@@ -118,42 +118,21 @@ senc_enclosure_get_vertex
}
res_T
-senc_enclosure_get_triangle_media
- (const struct senc_enclosure* enclosure,
- const unsigned itri,
- unsigned medium[2])
-{
- const struct triangle_in* triangle;
- int i;
- if(!enclosure || !medium
- || itri >= enclosure->data->header.triangle_count)
- return RES_BAD_ARG;
- ASSERT(darray_triangle_in_size_get(&enclosure->data->sides)
- == enclosure->data->header.triangle_count);
- triangle = darray_triangle_in_cdata_get(&enclosure->data->sides) + itri;
- FOR_EACH(i, 0, 2) {
-#if (UINT_MAX < MEDIUM_MAX__)
- ASSERT(triangle->medium[i] < UINT_MAX);
-#endif
- medium[i] = (unsigned)triangle->medium[i]; /* Back to API type */
- }
- return RES_OK;
-}
-
-res_T
senc_enclosure_get_triangle_global_id
(const struct senc_enclosure* enclosure,
const unsigned itri,
- unsigned* gid)
+ unsigned* gid,
+ enum senc_side* sde)
{
- const struct triangle_in* triangle;
- if(!enclosure || !gid
+ const struct side_enc* side;
+ if(!enclosure || !gid || !sde
|| itri >= enclosure->data->header.triangle_count)
return RES_BAD_ARG;
- ASSERT(darray_triangle_in_size_get(&enclosure->data->sides)
+ ASSERT(darray_sides_enc_size_get(&enclosure->data->sides)
== enclosure->data->header.triangle_count);
- triangle = darray_triangle_in_cdata_get(&enclosure->data->sides) + itri;
- *gid = triangle->global_id;
+ side = darray_sides_enc_cdata_get(&enclosure->data->sides) + itri;
+ *gid = (unsigned)TRGSIDE_2_TRG(side->side_id);
+ *sde = TRGSIDE_2_SIDE(side->side_id);
return RES_OK;
}
diff --git a/src/senc_enclosure_data.h b/src/senc_enclosure_data.h
@@ -21,6 +21,21 @@
#include <rsys/hash_table.h>
#include <rsys/dynamic_array.h>
+#include "senc.h"
+#include "senc_scene_c.h"
+#include "senc_internal_types.h"
+
+#include <limits.h>
+
+struct side_enc {
+ vrtx_id_t vertice_id[3];
+ side_id_t side_id;
+};
+
+#define DARRAY_NAME sides_enc
+#define DARRAY_DATA struct side_enc
+#include <rsys/dynamic_array.h>
+
/* unsigned char array with init to zero */
static FINLINE void
zero_init_uchar
@@ -32,12 +47,6 @@ zero_init_uchar
#define DARRAY_FUNCTOR_INIT zero_init_uchar
#include <rsys/dynamic_array_uchar.h>
-#include "senc.h"
-#include "senc_scene_c.h"
-#include "senc_internal_types.h"
-
-#include <limits.h>
-
static void
init_header(struct senc_enclosure_header* header)
{
@@ -112,7 +121,7 @@ error:
struct enclosure_data {
struct senc_enclosure_header header;
/* Same triangle can appear twice if both sides */
- struct darray_triangle_in sides;
+ struct darray_sides_enc sides;
/* Index of vertices in scene's unique vertices */
struct darray_vrtx_id vertices;
/* List of the enclosed media */
@@ -137,7 +146,7 @@ enclosure_data_init(struct mem_allocator* alloc, struct enclosure_data* enc) {
enc->side_range.first = SIDE_NULL__;
enc->side_range.last = 0;
enc->side_count = 0;
- darray_triangle_in_init(alloc, &enc->sides);
+ darray_sides_enc_init(alloc, &enc->sides);
darray_vrtx_id_init(alloc, &enc->vertices);
darray_uchar_init(alloc, &enc->tmp_enclosed_media);
darray_media_init(alloc, &enc->enclosed_media);
@@ -155,7 +164,7 @@ enclosure_data_copy
dst->first_component = src->first_component;
dst->side_range = src->side_range;
dst->side_count = src->side_count;
- OK(darray_triangle_in_copy(&dst->sides, &src->sides));
+ OK(darray_sides_enc_copy(&dst->sides, &src->sides));
OK(darray_vrtx_id_copy(&dst->vertices, &src->vertices));
OK(darray_uchar_copy(&dst->tmp_enclosed_media, &src->tmp_enclosed_media));
OK(darray_media_copy(&dst->enclosed_media, &src->enclosed_media));
@@ -166,7 +175,7 @@ error:
static FINLINE void
enclosure_data_release(struct enclosure_data* n) {
ASSERT(n);
- darray_triangle_in_release(&n->sides);
+ darray_sides_enc_release(&n->sides);
darray_vrtx_id_release(&n->vertices);
darray_uchar_release(&n->tmp_enclosed_media);
darray_media_release(&n->enclosed_media);
@@ -184,7 +193,7 @@ enclosure_data_copy_and_release
dst->first_component = src->first_component;
dst->side_range = src->side_range;
dst->side_count = src->side_count;
- OK(darray_triangle_in_copy_and_release(&dst->sides, &src->sides));
+ OK(darray_sides_enc_copy_and_release(&dst->sides, &src->sides));
OK(darray_vrtx_id_copy_and_release(&dst->vertices, &src->vertices));
OK(darray_uchar_copy_and_release(&dst->tmp_enclosed_media,
&src->tmp_enclosed_media));
diff --git a/src/senc_internal_types.h b/src/senc_internal_types.h
@@ -95,12 +95,6 @@ enum side_flag {
FLAG_BACK = BIT(1)
};
-/* This one is used as an index to arrays */
-enum side_id {
- SIDE_FRONT = 0,
- SIDE_BACK = 1
-};
-
/* Utility macros */
static FINLINE trg_id_t
TRGSIDE_2_TRG(side_id_t s) {
@@ -113,9 +107,9 @@ TRGSIDE_IS_FRONT(side_id_t s) {
return (s & 1) == 0;
}
-static FINLINE enum side_id
+static FINLINE enum senc_side
TRGSIDE_2_SIDE(side_id_t s) {
- return (s & 1) ? SIDE_BACK : SIDE_FRONT;
+ return (s & 1) ? SENC_BACK : SENC_FRONT;
}
static FINLINE enum side_flag
@@ -130,16 +124,16 @@ SIDE_CANCELED_FLAG(enum side_flag f) {
}
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));
+TRGIDxSIDE_2_TRGSIDE(trg_id_t t, enum senc_side i) {
+ ASSERT((((size_t)t << 1) | (i == SENC_BACK)) < SIDE_MAX__);
+ ASSERT(i == SENC_FRONT || i == SENC_BACK);
+ return (side_id_t)((t << 1) | (i == SENC_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);
+ TRGSIDE_IS_FRONT(s) ? SENC_BACK : SENC_FRONT);
}
#endif /* SENC_INTERNAL_TYPES_H */
diff --git a/src/senc_scene.c b/src/senc_scene.c
@@ -127,12 +127,11 @@ error:
}
res_T
-senc_scene_add_geometry_attr
+senc_scene_add_geometry
(struct senc_scene* scn,
const unsigned ntris,
void(*indices)(const unsigned, unsigned*, void*),
void(*media)(const unsigned, unsigned*, void*),
- void(*global_id)(const unsigned, unsigned*, void*),
const unsigned nverts,
void(*position)(const unsigned, double*, void* ctx),
res_T(*add_triangle)(const unsigned, const unsigned, void*),
@@ -201,11 +200,6 @@ senc_scene_add_geometry_attr
struct triangle_in tmp, *range_adjust_ptr = NULL;
trg_id_t* p_trg;
char reversed;
- if(global_id) {
- global_id(i, &tmp.global_id, ctx);
- } else {
- tmp.global_id = (unsigned)(scn->ntris + i);
- }
indices(i, ind, ctx); /* API: indices need unsigneds */
FOR_EACH(j, 0, 3) {
if(ind[j] >= nverts) {
@@ -222,7 +216,7 @@ senc_scene_add_geometry_attr
const union double3* positions
= darray_position_cdata_get(&scn->vertices);
log_err(scn->dev, "%s: triangle %lu is degenerate.\n",
- FUNC_NAME, (unsigned long)tmp.global_id);
+ FUNC_NAME, (unsigned long)(scn->ntris + i));
log_err(scn->dev, " (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n",
SPLIT3(positions[trg[i].vertice_id[0]].vec),
SPLIT3(positions[trg[i].vertice_id[1]].vec),
@@ -260,11 +254,10 @@ senc_scene_add_geometry_attr
= darray_position_cdata_get(&scn->vertices);
log_err(scn->dev, "%s: triangle %lu is a duplicate"
" of triangle %lu with incoherent media.\n",
- FUNC_NAME, (unsigned long)tmp.global_id,
- (unsigned long)trg[*p_trg].global_id);
+ FUNC_NAME, (unsigned long)(scn->ntris + i), (unsigned long)*p_trg);
log_err(scn->dev,
"Triangle %lu:\n (%g %g %g)\n (%g %g %g)\n (%g %g %g)\n",
- (unsigned long)trg[*p_trg].global_id,
+ (unsigned long)*p_trg,
SPLIT3(positions[trg[*p_trg].vertice_id[0]].vec),
SPLIT3(positions[trg[*p_trg].vertice_id[1]].vec),
SPLIT3(positions[trg[*p_trg].vertice_id[2]].vec));
@@ -287,12 +280,11 @@ senc_scene_add_geometry_attr
}
}
if(merge_triangle) {
- OK(merge_triangle(trg[*p_trg].global_id, i, same, ctx));
+ OK(merge_triangle((unsigned)*p_trg, i, same, ctx));
} else {
log_warn(scn->dev,
"%s: triangle %lu is a duplicate of triangle %lu.\n",
- FUNC_NAME, (unsigned long)tmp.global_id,
- (unsigned long)trg[*p_trg].global_id);
+ FUNC_NAME, (unsigned long)(scn->ntris + i), (unsigned long)*p_trg);
}
}
} else {
@@ -307,7 +299,7 @@ senc_scene_add_geometry_attr
scn->sides_with_defined_medium_count++;
}
if(add_triangle) {
- OK(add_triangle(tmp.global_id, i, ctx));
+ OK(add_triangle((unsigned)u, i, ctx));
}
++actual_nutris;
}
diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c
@@ -117,7 +117,7 @@ self_hit_filter
const struct darray_triangle_comp* triangles_comp = filter_data;
const component_id_t* origin_component = ray_data;
const struct triangle_comp* hit_trg_comp;
- enum side_id hit_side;
+ enum senc_side hit_side;
component_id_t hit_component;
(void)ray_org; (void)ray_dir;
@@ -125,7 +125,7 @@ self_hit_filter
ASSERT(hit->prim.prim_id < darray_triangle_comp_size_get(triangles_comp));
hit_trg_comp = darray_triangle_comp_cdata_get(triangles_comp)
+ hit->prim.prim_id;
- hit_side = (hit->normal[2] > 0) ? SIDE_FRONT : SIDE_BACK;
+ hit_side = (hit->normal[2] > 0) ? SENC_FRONT : SENC_BACK;
hit_component = hit_trg_comp->component[hit_side];
/* Not self hit or distance should be small */
@@ -257,7 +257,7 @@ extract_connex_components
#ifndef NDEBUG
{
trg_id_t tid = TRGSIDE_2_TRG(start_side_id);
- enum side_id s = TRGSIDE_2_SIDE(start_side_id);
+ enum senc_side s = TRGSIDE_2_SIDE(start_side_id);
medium_id_t side_med
= darray_triangle_in_data_get(&desc->scene->triangles_in)[tid].medium[s];
ASSERT(side_med == m);
@@ -413,7 +413,7 @@ extract_connex_components
FOR_EACH(ii, 0, sz) {
const side_id_t s = darray_side_id_cdata_get(¤t_component)[ii];
trg_id_t tid = TRGSIDE_2_TRG(s);
- enum side_id sid = TRGSIDE_2_SIDE(s);
+ enum senc_side sid = TRGSIDE_2_SIDE(s);
component_id_t* cmp = triangles_comp[tid].component;
ASSERT(cmp[sid] == COMPONENT_NULL__);
ASSERT(trgsides[s].medium >= m);
@@ -428,7 +428,7 @@ extract_connex_components
const side_id_t side_id =
darray_side_id_cdata_get(&ids_of_sides_around_max_z_vertex)[ii];
const trg_id_t trg_id = TRGSIDE_2_TRG(side_id);
- enum side_id s = TRGSIDE_2_SIDE(side_id);
+ enum senc_side s = TRGSIDE_2_SIDE(side_id);
const struct triangle_in* trg_in =
darray_triangle_in_cdata_get(&scn->triangles_in) + trg_id;
const struct triangle_comp* trg_comp = triangles_comp + trg_id;
@@ -440,7 +440,7 @@ extract_connex_components
* regardless of numeric accuracy, we need to prevent them to
* contribute (remember than x + y - y == x can be false). */
ASSERT(trg_comp->component[s] == cc->cc_id); (void)s;
- if(trg_comp->component[SIDE_FRONT] == trg_comp->component[SIDE_BACK])
+ if(trg_comp->component[SENC_FRONT] == trg_comp->component[SENC_BACK])
continue;
d3_sub(edge0, vertices[trg_in->vertice_id[1]].vec,
@@ -546,8 +546,8 @@ extract_connex_components
FOR_EACH(t_, 0, scn->nutris) {
struct triangle_comp* trg_comp =
darray_triangle_comp_data_get(triangles_comp_array) + t_;
- ASSERT(trg_comp->component[SIDE_FRONT] != COMPONENT_NULL__);
- ASSERT(trg_comp->component[SIDE_BACK] != COMPONENT_NULL__);
+ ASSERT(trg_comp->component[SENC_FRONT] != COMPONENT_NULL__);
+ ASSERT(trg_comp->component[SENC_BACK] != COMPONENT_NULL__);
}
FOR_EACH(c, 0, ATOMIC_GET(component_count)) {
struct cc_descriptor** components =
@@ -636,13 +636,13 @@ group_connex_components
const trg_id_t hit_trg_id = (trg_id_t)hit.prim.prim_id;
const struct triangle_comp* hit_trg_comp =
darray_triangle_comp_cdata_get(triangles_comp) + hit_trg_id;
- enum side_id hit_side =
+ enum senc_side hit_side =
((hit.normal[2] < 0) /* Facing geometrical normal of hit */
== ((desc->scene->convention & SENC_CONVENTION_NORMAL_FRONT) != 0))
/* Warning: following Embree 2 convention for geometrical normals,
* the Star3D hit normal is left-handed while star-enclosure uses
* right-handed convention */
- ? SIDE_BACK : SIDE_FRONT;
+ ? SENC_BACK : SENC_FRONT;
ASSERT(hit.normal[2] != 0);
ASSERT(hit_trg_id < desc->scene->nutris);
@@ -891,11 +891,11 @@ collect_and_link_neighbours
const trg_id_t ccw_id = ccw_neighbour->trg_id;
/* Facing sides of triangles */
const int front = ((scn->convention & SENC_CONVENTION_NORMAL_FRONT) != 0);
- const enum side_id crt_side
- = current->normal_toward_next_neighbour == front ? SIDE_FRONT : SIDE_BACK;
- const enum side_id ccw_side
+ const enum senc_side crt_side
+ = current->normal_toward_next_neighbour == front ? SENC_FRONT : SENC_BACK;
+ const enum senc_side ccw_side
= ccw_neighbour->normal_toward_next_neighbour == front ?
- SIDE_BACK : SIDE_FRONT;
+ SENC_BACK : SENC_FRONT;
/* Index of sides in trgsides */
const side_id_t crt_side_idx = TRGIDxSIDE_2_TRGSIDE(crt_id, crt_side);
const side_id_t ccw_side_idx = TRGIDxSIDE_2_TRGSIDE(ccw_id, ccw_side);
@@ -913,8 +913,7 @@ collect_and_link_neighbours
prev_id = previous->trg_id;
log_err(scn->dev,
"%s: found 2 overlying triangles (%lu & %lu).\n", FUNC_NAME,
- (unsigned long)triangles_in[crt_id].global_id,
- (unsigned long)triangles_in[prev_id].global_id);
+ (unsigned long)crt_id, (unsigned long)prev_id);
tmp_res = RES_BAD_OP;
goto tmp_error;
}
@@ -945,7 +944,7 @@ collect_and_link_neighbours
struct trg_edge disc;
log_warn(scn->dev,
"%s: found frontier involving triangle %lu.\n",
- FUNC_NAME, (unsigned long)triangles_in[crt_id].global_id);
+ FUNC_NAME, (unsigned long)crt_id);
disc.vrtx0 = v0;
disc.vrtx1 = v1;
darray_frontier_edge_push_back(frontiers, &disc);
@@ -1013,16 +1012,16 @@ build_result
#pragma omp for
for(tt = 0; tt < (int64_t)scn->nutris; tt++) {
trg_id_t t = (trg_id_t)tt;
- const component_id_t cf_id = triangles_comp[t].component[SIDE_FRONT];
- const component_id_t cb_id = triangles_comp[t].component[SIDE_BACK];
+ const component_id_t cf_id = triangles_comp[t].component[SENC_FRONT];
+ const component_id_t cb_id = triangles_comp[t].component[SENC_BACK];
const struct cc_descriptor* cf = cc_descriptors[cf_id];
const struct cc_descriptor* cb = cc_descriptors[cb_id];
const enclosure_id_t ef_id = cf->enclosure_id;
const enclosure_id_t eb_id = cb->enclosure_id;
- ASSERT(triangles_enc[t].enclosure[SIDE_FRONT] == ENCLOSURE_NULL__);
- triangles_enc[t].enclosure[SIDE_FRONT] = ef_id;
- ASSERT(triangles_enc[t].enclosure[SIDE_BACK] == ENCLOSURE_NULL__);
- triangles_enc[t].enclosure[SIDE_BACK] = eb_id;
+ ASSERT(triangles_enc[t].enclosure[SENC_FRONT] == ENCLOSURE_NULL__);
+ triangles_enc[t].enclosure[SENC_FRONT] = ef_id;
+ ASSERT(triangles_enc[t].enclosure[SENC_BACK] == ENCLOSURE_NULL__);
+ triangles_enc[t].enclosure[SENC_BACK] = eb_id;
}
/* Implicit barrier here */
@@ -1083,7 +1082,7 @@ build_result
if(*res != RES_OK) continue;
/* Build side and vertex lists. */
- OK2(darray_triangle_in_resize(&enc->sides, enc->side_count));
+ OK2(darray_sides_enc_resize(&enc->sides, enc->side_count));
/* Size is just a int */
OK2(darray_vrtx_id_reserve(&enc->vertices,
(size_t)(enc->side_count * 0.6)));
@@ -1097,11 +1096,11 @@ build_result
t++)
{
const struct triangle_in* trg_in = triangles_in + t;
- struct triangle_in* trg;
+ struct side_enc* side_enc;
unsigned vertice_id[3];
int i;
- if(triangles_enc[t].enclosure[SIDE_FRONT] != e
- && triangles_enc[t].enclosure[SIDE_BACK] != e)
+ if(triangles_enc[t].enclosure[SENC_FRONT] != e
+ && triangles_enc[t].enclosure[SENC_BACK] != e)
continue;
++enc->header.unique_triangle_count;
@@ -1121,41 +1120,33 @@ build_result
++enc->header.vertices_count;
}
}
- ASSERT(triangles_enc[t].enclosure[SIDE_FRONT] == e
- || triangles_enc[t].enclosure[SIDE_BACK] == e);
- if(triangles_enc[t].enclosure[SIDE_FRONT] == e) {
+ ASSERT(triangles_enc[t].enclosure[SENC_FRONT] == e
+ || triangles_enc[t].enclosure[SENC_BACK] == e);
+ if(triangles_enc[t].enclosure[SENC_FRONT] == e) {
/* Front side of the original triangle is member of the enclosure */
int input_normal_in = normals_front;
int revert_triangle = (input_normal_in != output_normal_in);
++enc->header.triangle_count;
- trg = darray_triangle_in_data_get(&enc->sides) + fst_idx++;
- FOR_EACH(i, 0, 2) {
- int ii = revert_triangle ? 1 - i : i;
- trg->medium[i] = trg_in->medium[ii];
- }
- trg->global_id = trg_in->global_id;
+ side_enc = darray_sides_enc_data_get(&enc->sides) + fst_idx++;
FOR_EACH(i, 0, 3) {
int ii = revert_triangle ? 2 - i : i;
- trg->vertice_id[i] = vertice_id[ii];
+ side_enc->vertice_id[i] = vertice_id[ii];
}
+ side_enc->side_id = TRGIDxSIDE_2_TRGSIDE(t, SENC_FRONT);
}
- if(triangles_enc[t].enclosure[SIDE_BACK] == e) {
+ if(triangles_enc[t].enclosure[SENC_BACK] == e) {
/* Back side of the original triangle is member of the enclosure */
int input_normal_in = normals_back;
int revert_triangle = (input_normal_in != output_normal_in);
++enc->header.triangle_count;
/* If both sides are in the enclosure, put the second side at the end */
- trg = darray_triangle_in_data_get(&enc->sides) +
- ((triangles_enc[t].enclosure[SIDE_FRONT] == e) ? --sgd_idx : fst_idx++);
- FOR_EACH(i, 0, 2) {
- int ii = revert_triangle ? 1 - i : i;
- trg->medium[i] = trg_in->medium[ii];
- }
- trg->global_id = trg_in->global_id;
+ side_enc = darray_sides_enc_data_get(&enc->sides) +
+ ((triangles_enc[t].enclosure[SENC_FRONT] == e) ? --sgd_idx : fst_idx++);
FOR_EACH(i, 0, 3) {
int ii = revert_triangle ? 2 - i : i;
- trg->vertice_id[i] = vertice_id[ii];
+ side_enc->vertice_id[i] = vertice_id[ii];
}
+ side_enc->side_id = TRGIDxSIDE_2_TRGSIDE(t, SENC_BACK);
}
if(fst_idx == sgd_idx) break;
}
diff --git a/src/senc_scene_c.h b/src/senc_scene_c.h
@@ -48,8 +48,6 @@ struct triangle_in {
vrtx_id_t vertice_id[3];
/* Ids of this triangle's media */
medium_id_t medium[2];
- /* Triangle index in user world (that is regardless of deduplication). */
- unsigned global_id;
};
static FINLINE void
@@ -59,7 +57,6 @@ triangle_in_init(struct mem_allocator* alloc, struct triangle_in* trg) {
ASSERT(trg);
FOR_EACH(i, 0, 3) trg->vertice_id[i] = VRTX_NULL__;
FOR_EACH(i, 0, 2) trg->medium[i] = SENC_UNDEFINED_MEDIUM;
- trg->global_id = 0;
}
#define DARRAY_NAME triangle_in
diff --git a/src/test_senc_cube_behind_cube.c b/src/test_senc_cube_behind_cube.c
@@ -47,8 +47,8 @@ main(int argc, char** argv)
ctx.back_media = medium1;
/* First cube */
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
/* +Z from the first cube,
* big enough to prevent rays from the first cube to miss this one */
@@ -56,8 +56,8 @@ main(int argc, char** argv)
ctx.scale = 5;
/* Second cube */
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
@@ -85,8 +85,8 @@ main(int argc, char** argv)
ctx.back_media = medium0;
/* Third cube */
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
if(desc) CHK(senc_descriptor_ref_put(desc) == RES_OK);
desc = NULL;
diff --git a/src/test_senc_cube_in_cube.c b/src/test_senc_cube_in_cube.c
@@ -49,8 +49,8 @@ main(int argc, char** argv)
ctx.back_media = medium1;
/* First cube */
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
d3(ctx.offset, -1, -1, -1);
ctx.scale = 3;
@@ -59,8 +59,8 @@ main(int argc, char** argv)
ctx.reverse_vrtx = 1;
/* Second cube */
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
@@ -91,8 +91,8 @@ main(int argc, char** argv)
ctx.back_media = medium0;
/* Third cube */
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
if(desc) CHK(senc_descriptor_ref_put(desc) == RES_OK);
desc = NULL;
diff --git a/src/test_senc_cube_on_cube.c b/src/test_senc_cube_on_cube.c
@@ -74,7 +74,7 @@ main(int argc, char** argv)
/* Add cube #1 */
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
d3(ctx.offset, 1, 1, 1);
ctx.scale = 1;
@@ -86,7 +86,7 @@ main(int argc, char** argv)
/* Add cube #2 (has a duplicate face with cube #1) */
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
ctx.positions = box_vertices; /* Can use distorded cube for cube #3 */
d3(ctx.offset, 0, 0, 0);
@@ -100,7 +100,7 @@ main(int argc, char** argv)
/* Add cube #3 */
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
diff --git a/src/test_senc_descriptor.c b/src/test_senc_descriptor.c
@@ -52,8 +52,8 @@ main(int argc, char** argv)
ctx.front_media = medium0;
ctx.back_media = medium1;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
@@ -164,22 +164,11 @@ main(int argc, char** argv)
CHK(enclosures[0] == 0
&& enclosures[1] == 1);
- CHK(senc_descriptor_get_global_triangle_global_id(NULL, 0, indices)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_global_triangle_global_id(NULL, nvertices, indices)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_global_triangle_global_id(desc, 0, NULL)
- == RES_BAD_ARG);
- CHK(senc_descriptor_get_global_triangle_global_id(desc, 0, indices)
- == RES_OK);
- /* No duplicates and no custom id: user id is unique vertex id */
- CHK(indices[0] == 0);
-
/* Add valid duplicate geometry */
CHK(senc_descriptor_ref_put(desc) == RES_OK);
desc = NULL;
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
CHK(senc_descriptor_get_global_vertices_count(desc, &count) == RES_OK);
@@ -195,8 +184,8 @@ main(int argc, char** argv)
desc = NULL;
ctx.front_media = medium1;
ctx.back_media = medium0;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_BAD_ARG);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_BAD_ARG);
CHK(senc_scene_ref_put(scn) == RES_OK);
if(desc) CHK(senc_descriptor_ref_put(desc) == RES_OK);
@@ -209,7 +198,7 @@ main(int argc, char** argv)
== RES_OK);
CHK(senc_scene_add_geometry(scn, ntriangles - 1, get_indices, get_media,
- NULL, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
diff --git a/src/test_senc_enclosure.c b/src/test_senc_enclosure.c
@@ -22,7 +22,7 @@
#include <star/s3d.h>
static void
-test(int convention)
+test(const int convention)
{
struct mem_allocator allocator;
struct senc_descriptor* desc = NULL;
@@ -36,13 +36,15 @@ test(int convention)
struct s3d_shape* s3d_shp = NULL;
struct s3d_vertex_data s3d_attribs;
unsigned indices[2][3];
- unsigned medium, media[2];
+ unsigned medium;
unsigned gid;
+ enum senc_side side;
double vrtx[3];
struct context ctx;
unsigned i, n, t, ecount;
int conv;
- int is_front, is_in;
+ const int conv_front = (convention & SENC_CONVENTION_NORMAL_FRONT) != 0;
+ const int conv_in = (convention & SENC_CONVENTION_NORMAL_INSIDE) != 0;
CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK);
CHK(senc_device_create(NULL, &allocator, SENC_NTHREADS_DEFAULT, 1, &dev)
@@ -52,8 +54,6 @@ test(int convention)
CHK(senc_scene_get_convention(scn, &conv) == RES_OK);
CHK(conv == convention);
- is_front = (conv & SENC_CONVENTION_NORMAL_FRONT) != 0;
- is_in = (conv & SENC_CONVENTION_NORMAL_INSIDE) != 0;
s3d_attribs.type = S3D_FLOAT3;
s3d_attribs.usage = S3D_POSITION;
@@ -76,7 +76,7 @@ test(int convention)
ctx.back_media = medium1;
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
@@ -112,32 +112,38 @@ test(int convention)
CHK(senc_enclosure_get_vertex(NULL, nvertices, NULL) == RES_BAD_ARG);
CHK(senc_enclosure_get_vertex(enclosure, 0, vrtx) == RES_OK);
- CHK(senc_enclosure_get_triangle_media(NULL, 0, media) == RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_media(enclosure, ntriangles, media)
+ CHK(senc_enclosure_get_triangle_global_id(NULL, 0, &gid, NULL)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_media(enclosure, 0, NULL) == RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_media(NULL, ntriangles, media)
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, ntriangles, &gid, NULL)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_media(NULL, 0, NULL) == RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_media(enclosure, ntriangles, NULL)
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, 0, NULL, NULL)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_media(NULL, ntriangles, NULL)
+ CHK(senc_enclosure_get_triangle_global_id(NULL, ntriangles, &gid, NULL)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_media(enclosure, 0, media) == RES_OK);
-
- CHK(senc_enclosure_get_triangle_global_id(NULL, 0, &gid) == RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_global_id(enclosure, ntriangles, &gid)
+ CHK(senc_enclosure_get_triangle_global_id(NULL, 0, NULL, NULL)
+ == RES_BAD_ARG);
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, ntriangles, NULL, NULL)
+ == RES_BAD_ARG);
+ CHK(senc_enclosure_get_triangle_global_id(NULL, ntriangles, NULL, NULL)
+ == RES_BAD_ARG);
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, 0, &gid, NULL)
+ == RES_BAD_ARG);
+ CHK(senc_enclosure_get_triangle_global_id(NULL, 0, &gid, &side)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_global_id(enclosure, 0, NULL)
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, ntriangles, &gid, &side)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_global_id(NULL, ntriangles, &gid)
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, 0, NULL, &side)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_global_id(NULL, 0, NULL) == RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_global_id(enclosure, ntriangles, NULL)
+ CHK(senc_enclosure_get_triangle_global_id(NULL, ntriangles, &gid, &side)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_global_id(NULL, ntriangles, NULL)
+ CHK(senc_enclosure_get_triangle_global_id(NULL, 0, NULL, &side)
== RES_BAD_ARG);
- CHK(senc_enclosure_get_triangle_global_id(enclosure, 0, &gid) == RES_OK);
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, ntriangles, NULL, &side)
+ == RES_BAD_ARG);
+ CHK(senc_enclosure_get_triangle_global_id(NULL, ntriangles, NULL, &side)
+ == RES_BAD_ARG);
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, 0, &gid, &side)
+ == RES_OK);
CHK(senc_enclosure_get_medium(NULL, 0, &medium) == RES_BAD_ARG);
CHK(senc_enclosure_get_medium(enclosure, 2, &medium) == RES_BAD_ARG);
@@ -164,15 +170,16 @@ test(int convention)
/* Geometrical normals point outside the cube in input triangles:
* if convention is front, front medium (0) is outside,
* that is medium 0's enclosure is infinite */
- CHK(is_front == ((medium == 0) == header.is_infinite));
+ CHK(conv_front == ((medium == 0) == header.is_infinite));
CHK(header.triangle_count == ntriangles);
CHK(header.unique_triangle_count == ntriangles);
CHK(header.vertices_count == nvertices);
CHK(header.is_infinite == (i == 0));
FOR_EACH(t, 0, header.triangle_count) {
- CHK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid) == RES_OK);
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid, &side) == RES_OK);
CHK(gid == t);
+ CHK(side == (medium == 0) ? SENC_FRONT : SENC_BACK);
}
CHK(senc_enclosure_ref_put(enclosure) == RES_OK);
@@ -192,9 +199,9 @@ test(int convention)
* of input triangles for enclosure 0 iff convention is inside.
* The opposite holds for enclosure 1. */
cmp_trg(n, enclosures[0], box_indices + 3 * n, box_vertices, &same, &reversed);
- CHK((same && !reversed) == is_in);
+ CHK((same && !reversed) == conv_in);
cmp_trg(n, enclosures[1], box_indices + 3 * n, box_vertices, &same, &reversed);
- CHK(same && reversed == is_in);
+ CHK(same && reversed == conv_in);
}
FOR_EACH(i, 0, 2)
CHK(senc_enclosure_ref_put(enclosures[i]) == RES_OK);
@@ -205,8 +212,7 @@ test(int convention)
/* Same 3D cube, but with a hole (incomplete).
* 1 single enclosure including both sides of triangles */
- CHK(senc_scene_create(dev,
- SENC_CONVENTION_NORMAL_BACK | SENC_CONVENTION_NORMAL_INSIDE, &scn) == RES_OK);
+ CHK(senc_scene_create(dev, convention, &scn) == RES_OK);
ctx.positions = box_vertices;
ctx.indices = box_indices;
@@ -216,7 +222,7 @@ test(int convention)
ctx.back_media = medium1;
CHK(senc_scene_add_geometry(scn, ntriangles - 1, get_indices, get_media,
- NULL, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
@@ -239,11 +245,12 @@ test(int convention)
CHK(header.vertices_count == nvertices);
CHK(header.is_infinite == 1);
- FOR_EACH(t, 0, header.unique_triangle_count) {
+ FOR_EACH(t, 0, header.triangle_count) {
+ CHK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid, &side) == RES_OK);
/* The first unique_triangle_count triangles of an enclosure
* are unique triangles */
- CHK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid) == RES_OK);
- CHK(gid == t);
+ if (t < header.unique_triangle_count) CHK(gid == t);
+ CHK(side == (t < header.unique_triangle_count) ? SENC_FRONT : SENC_BACK);
}
FOR_EACH(n, 0, header.unique_triangle_count) {
diff --git a/src/test_senc_inconsistant_cube.c b/src/test_senc_inconsistant_cube.c
@@ -49,7 +49,7 @@ static const unsigned
inconsistant_medium_back[12] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
static void
-test(int convention)
+test(const int convention)
{
struct mem_allocator allocator;
struct senc_descriptor* desc = NULL;
@@ -83,7 +83,7 @@ test(int convention)
ctx.back_media = inconsistant_medium_back;
CHK(senc_scene_add_geometry(scn, inconsistant_box_ntriangles, get_indices,
- get_media, NULL, nvertices, get_position, &ctx) == RES_OK);
+ get_media, nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
@@ -98,8 +98,8 @@ test(int convention)
FOR_EACH(e, 0, ecount) {
unsigned medium, expected_external_medium, expected_medium;
char name[128];
- int front_inside;
- int expected_side;
+ enum senc_side side, expected_side;
+ unsigned gid;
CHK(senc_descriptor_get_enclosure(desc, e, &enclosure) == RES_OK);
CHK(senc_enclosure_get_header(enclosure, &header) == RES_OK);
CHK(header.enclosed_media_count == 1);
@@ -110,9 +110,6 @@ test(int convention)
expected_medium = (header.is_infinite ?
expected_external_medium : !expected_external_medium);
CHK(medium == expected_medium);
- /* Common media, for non input triangles */
- front_inside = (conv_front == conv_in);
- expected_side = front_inside ? 0 : 1;
sprintf(name, "test_inconsistant_cube_%s_%s_%u.obj",
conv_front ? "front" : "back", conv_in ? "in" : "out", e);
@@ -120,16 +117,17 @@ test(int convention)
FOR_EACH(i, 0, header.triangle_count) {
int same, reversed, fst_reversed;
- unsigned med[2];
- fst_reversed = (e == 0) == conv_in;
- CHK(senc_enclosure_get_triangle_media(enclosure, i, med) == RES_OK);
- CHK(med[expected_side] == medium);
+ fst_reversed = ((e == 0) == conv_in);
+ expected_side = (inconsistant_medium_front[i] == expected_medium)
+ ? SENC_FRONT : SENC_BACK;
cmp_trg(i, enclosure,
inconsistant_box_indices + (3 * i), box_vertices,
&same, &reversed);
/* Should be made of the same triangles */
CHK(same);
CHK(i ? reversed != fst_reversed : reversed == fst_reversed);
+ senc_enclosure_get_triangle_global_id(enclosure, i, &gid, &side);
+ CHK(side == expected_side);
}
SENC(enclosure_ref_put(enclosure));
}
diff --git a/src/test_senc_many_enclosures.c b/src/test_senc_many_enclosures.c
@@ -123,7 +123,7 @@ main(int argc, char** argv)
misalignment *= -1;
d3(ctx.ctx.offset, center_x + misalignment, center_y + misalignment, 0);
CHK(senc_scene_add_geometry(scn, cyl_trg_count, get_s3dut_indices,
- get_s3dut_media, NULL, cyl_vrtx_count, get_s3dut_position, &ctx)
+ get_s3dut_media, cyl_vrtx_count, get_s3dut_position, NULL, NULL, &ctx)
== RES_OK);
}
}
diff --git a/src/test_senc_many_triangles.c b/src/test_senc_many_triangles.c
@@ -110,7 +110,7 @@ main(int argc, char** argv)
m1 = i;
d3(ctx.ctx.offset, 0, 0, i * 10);
CHK(senc_scene_add_geometry(scn, cyl_trg_count, get_s3dut_indices,
- get_s3dut_media, NULL, cyl_vrtx_count, get_s3dut_position, &ctx)
+ get_s3dut_media, cyl_vrtx_count, get_s3dut_position, NULL, NULL, &ctx)
== RES_OK);
}
S3DUT(mesh_ref_put(cyl));
diff --git a/src/test_senc_sample_enclosure.c b/src/test_senc_sample_enclosure.c
@@ -72,7 +72,7 @@ main(int argc, char** argv)
ctx.back_media = medium0;
CHK(senc_scene_add_geometry(scn, ntriangles - 1, get_indices,
- get_media, NULL, nvertices, get_position, &ctx) == RES_OK);
+ get_media, nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
diff --git a/src/test_senc_scene.c b/src/test_senc_scene.c
@@ -106,20 +106,19 @@ main(int argc, char** argv)
d3(ctx.offset, 0, 0, 0);
ctx.front_media = medium0;
ctx.back_media = medium1;
- ctx.global_ids = gid_face;
CHK(senc_scene_add_geometry(NULL, ntriangles, get_indices, get_media,
- get_global_id, nvertices, get_position, &ctx) == RES_BAD_ARG);
- CHK(senc_scene_add_geometry(scn, 0, get_indices, get_media, get_global_id,
- nvertices, get_position, &ctx) == RES_BAD_ARG);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_BAD_ARG);
+ CHK(senc_scene_add_geometry(scn, 0, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_BAD_ARG);
CHK(senc_scene_add_geometry(scn, ntriangles, NULL, get_media,
- get_global_id, nvertices, get_position, &ctx) == RES_BAD_ARG);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_BAD_ARG);
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- get_global_id, 0, get_position, &ctx) == RES_BAD_ARG);
+ 0, get_position, NULL, NULL, &ctx) == RES_BAD_ARG);
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- get_global_id, nvertices, NULL, &ctx) == RES_BAD_ARG);
+ nvertices, NULL, NULL, NULL, &ctx) == RES_BAD_ARG);
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- get_global_id, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_get_triangles_count(scn, &count) == RES_OK);
CHK(count == ntriangles);
@@ -175,7 +174,7 @@ main(int argc, char** argv)
CHK(senc_scene_get_convention(scn, &convention) == RES_OK);
CHK(convention == (SENC_CONVENTION_NORMAL_BACK | SENC_CONVENTION_NORMAL_INSIDE));
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- get_global_id, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
/* Check that medium 0 is inside */
CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 0, &enc) == RES_OK);
@@ -183,21 +182,14 @@ main(int argc, char** argv)
CHK(!header.is_infinite);
CHK(senc_enclosure_ref_put(enc) == RES_OK);
- FOR_EACH(i, 0, ntriangles) {
- unsigned gid;
- CHK(senc_descriptor_get_global_triangle_global_id(desc, i, &gid) == RES_OK);
- /* gid has been set to gid_face. */
- CHK(gid == gid_face[i]);
- }
CHK(senc_descriptor_get_global_triangle_media(desc, 0, medback) == RES_OK);
-
ctx.front_media = medium1_3;
CHK(senc_scene_ref_put(scn) == RES_OK);
CHK(senc_descriptor_ref_put(desc) == RES_OK);
CHK(senc_scene_create(dev,
SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn) == RES_OK);
CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- get_global_id, nvertices, get_position, &ctx) == RES_OK);
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
/* Medium mismatch between neighbour segments, but OK */
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
@@ -218,8 +210,8 @@ main(int argc, char** argv)
CHK(senc_descriptor_ref_put(desc) == RES_OK);
CHK(senc_scene_create(dev,
SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn) == RES_OK);
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_analyze(scn, &desc) == RES_OK);
/* Check that medium 0 is outside */
CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 0, &enc) == RES_OK);
@@ -227,46 +219,40 @@ main(int argc, char** argv)
CHK(header.is_infinite);
CHK(senc_enclosure_ref_put(enc) == RES_OK);
- FOR_EACH(i, 0, ntriangles) {
- unsigned gid;
- CHK(senc_descriptor_get_global_triangle_global_id(desc, i, &gid) == RES_OK);
- /* Default gid: triangle rank. */
- CHK(gid == i);
- }
CHK(senc_descriptor_get_global_triangle_media(desc, 0, medfront) == RES_OK);
FOR_EACH(i, 0, 2) CHK(medback[i] == medfront[i]);
/* Invalid vertex ID */
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices - 1, get_position, &ctx) == RES_BAD_ARG);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices - 1, get_position, NULL, NULL, &ctx) == RES_BAD_ARG);
/* Incoherent medium on a duplicate triangle */
ctx.back_media = medium1_3;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_BAD_ARG);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_BAD_ARG);
/* It is OK add geometry after a failed add */
ctx.back_media = medium1;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
/* Coherent medium on duplicate triangle */
ctx.back_media = medium1;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
/* Coherent medium on duplicate triangle V2 */
ctx.reverse_med = 1;
ctx.front_media = medium1;
ctx.back_media = medium0;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
/* Coherent medium on duplicate triangle V3 */
ctx.reverse_med = 0;
ctx.reverse_vrtx = 1;
- CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL,
- nvertices, get_position, &ctx) == RES_OK);
+ CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, NULL, NULL, &ctx) == RES_OK);
CHK(senc_scene_ref_put(scn) == RES_OK);
CHK(senc_device_ref_put(dev) == RES_OK);
diff --git a/src/test_senc_undefined_medium.c b/src/test_senc_undefined_medium.c
@@ -22,7 +22,7 @@
#include <star/s3d.h>
static void
-test(int convention)
+test(const int convention)
{
struct mem_allocator allocator;
struct senc_descriptor* desc = NULL;
@@ -32,11 +32,12 @@ test(int convention)
struct senc_enclosure_header header;
unsigned medium, expected_external_medium, expected_internal_medium;
unsigned gid;
+ enum senc_side side;
struct context ctx;
unsigned i, t, ecount, vcount, tcount, scount;
unsigned media[12];
unsigned rev_box_indices[sizeof(box_indices) / sizeof(*box_indices)];
- int conv_front = (convention & SENC_CONVENTION_NORMAL_FRONT) != 0;
+ const int conv_front = (convention & SENC_CONVENTION_NORMAL_FRONT) != 0;
/* Create a box with reversed triangles */
FOR_EACH(i, 0, sizeof(rev_box_indices) / sizeof(*rev_box_indices)) {
@@ -69,13 +70,13 @@ test(int convention)
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = SENC_UNDEFINED_MEDIUM;
OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL,
- NULL, nvertices, get_position, &ctx));
+ nvertices, get_position, NULL, NULL, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == 2 * ntriangles);
/* Add geometry with no media information on the front sides */
OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx));
+ nvertices, get_position, NULL, NULL, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == ntriangles);
@@ -117,8 +118,9 @@ test(int convention)
FOR_EACH(t, 0, header.triangle_count) {
unsigned ind[3];
- OK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid));
+ OK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid, &side));
CHK(gid == t);
+ CHK(side == (medium == 1) ? SENC_BACK :SENC_FRONT);
OK(senc_enclosure_get_triangle(enclosure, t, ind));
}
OK(senc_enclosure_ref_put(enclosure));
@@ -129,7 +131,7 @@ test(int convention)
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = (i % 2) ? 0 : SENC_UNDEFINED_MEDIUM;
OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx));
+ nvertices, get_position, NULL, NULL, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == ntriangles / 2);
@@ -159,7 +161,7 @@ test(int convention)
ctx.indices = rev_box_indices;
SWAP(const unsigned*, ctx.front_media, ctx.back_media);
OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx));
+ nvertices, get_position, NULL, NULL, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == ntriangles / 2);
@@ -171,7 +173,7 @@ test(int convention)
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = (i % 2) ? SENC_UNDEFINED_MEDIUM : 0;
OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx));
+ nvertices, get_position, NULL, NULL, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == 0);
@@ -201,7 +203,7 @@ test(int convention)
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = 0;
OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx));
+ nvertices, get_position, NULL, NULL, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == 0);
@@ -209,7 +211,7 @@ test(int convention)
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = (i % 2);
BA(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, &ctx));
+ nvertices, get_position, NULL, NULL, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == 0);
@@ -249,8 +251,9 @@ test(int convention)
OK(senc_enclosure_ref_put(ee));
FOR_EACH(t, 0, header.triangle_count) {
- OK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid));
+ OK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid, &side));
CHK(gid == t);
+ CHK(side == (medium == 1) ? SENC_BACK : SENC_FRONT);
}
OK(senc_enclosure_ref_put(enclosure));
}
diff --git a/src/test_senc_undefined_medium_attr.c b/src/test_senc_undefined_medium_attr.c
@@ -99,7 +99,7 @@ merge_trg
}
static void
-test(int convention)
+test(const int convention)
{
struct mem_allocator allocator;
struct senc_descriptor* desc = NULL;
@@ -109,12 +109,13 @@ test(int convention)
struct senc_enclosure_header header;
unsigned medium, expected_external_medium, expected_internal_medium;
unsigned gid;
+ enum senc_side side;
struct context ctx;
unsigned i, t, ecount, vcount, tcount, scount;
unsigned media[12], interface_ids[12] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };
unsigned rev_box_indices[sizeof(box_indices) / sizeof(*box_indices)];
struct merge_ctx merge_ctx;
- int conv_front = (convention & SENC_CONVENTION_NORMAL_FRONT) != 0;
+ const int conv_front = (convention & SENC_CONVENTION_NORMAL_FRONT) != 0;
darray_intface_id_init(&allocator, &merge_ctx.global_interf_data);
merge_ctx.current_add_interf_data = interface_ids;
@@ -150,20 +151,20 @@ test(int convention)
/* Add geometry with no media information on both sides */
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = SENC_UNDEFINED_MEDIUM;
- OK(senc_scene_add_geometry_attr(scn, ntriangles, get_indices, NULL,
- NULL, nvertices, get_position, add_trg, merge_trg, &ctx));
+ OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL,
+ nvertices, get_position, add_trg, merge_trg, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == 2 * ntriangles);
/* If merge fails, add geometry fails */
interface_ids[0] = 6;
- BA(senc_scene_add_geometry_attr(scn, ntriangles, get_indices, NULL,
- NULL, nvertices, get_position, add_trg, merge_trg, &ctx));
+ BA(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL,
+ nvertices, get_position, add_trg, merge_trg, &ctx));
interface_ids[0] = 0;
/* Add geometry with no media information on the front sides */
- OK(senc_scene_add_geometry_attr(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, add_trg, merge_trg, &ctx));
+ OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, add_trg, merge_trg, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == ntriangles);
@@ -205,8 +206,9 @@ test(int convention)
FOR_EACH(t, 0, header.triangle_count) {
unsigned ind[3];
- OK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid));
+ OK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid, &side));
CHK(gid == t);
+ CHK(side == (medium == 1) ? SENC_BACK : SENC_FRONT);
OK(senc_enclosure_get_triangle(enclosure, t, ind));
}
OK(senc_enclosure_ref_put(enclosure));
@@ -216,8 +218,8 @@ test(int convention)
/* Same geometry, front media are defined for odd triangles */
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = (i % 2) ? 0 : SENC_UNDEFINED_MEDIUM;
- OK(senc_scene_add_geometry_attr(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, add_trg, merge_trg, &ctx));
+ OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, add_trg, merge_trg, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == ntriangles / 2);
@@ -246,8 +248,8 @@ test(int convention)
/* Same information again, using a reversed box */
ctx.indices = rev_box_indices;
SWAP(const unsigned*, ctx.front_media, ctx.back_media);
- OK(senc_scene_add_geometry_attr(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, add_trg, merge_trg, &ctx));
+ OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, add_trg, merge_trg, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == ntriangles / 2);
@@ -258,8 +260,8 @@ test(int convention)
/* Define media for remaining triangles, using reversed box */
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = (i % 2) ? SENC_UNDEFINED_MEDIUM : 0;
- OK(senc_scene_add_geometry_attr(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, add_trg, merge_trg, &ctx));
+ OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, add_trg, merge_trg, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == 0);
@@ -288,16 +290,16 @@ test(int convention)
/* Define media for all triangles, nothing new here */
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = 0;
- OK(senc_scene_add_geometry_attr(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, add_trg, merge_trg, &ctx));
+ OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, add_trg, merge_trg, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == 0);
/* Define incoherent media for some triangles */
for (i = 0; i < sizeof(media) / sizeof(*media); i++)
media[i] = (i % 2);
- BA(senc_scene_add_geometry_attr(scn, ntriangles, get_indices, get_media,
- NULL, nvertices, get_position, add_trg, merge_trg, &ctx));
+ BA(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media,
+ nvertices, get_position, add_trg, merge_trg, &ctx));
OK(senc_scene_get_unique_sides_without_medium_count(scn, &scount));
CHK(scount == 0);
@@ -337,8 +339,9 @@ test(int convention)
OK(senc_enclosure_ref_put(ee));
FOR_EACH(t, 0, header.triangle_count) {
- OK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid));
+ OK(senc_enclosure_get_triangle_global_id(enclosure, t, &gid, &side));
CHK(gid == t);
+ CHK(side == (medium == 1) ? SENC_BACK : SENC_FRONT);
}
OK(senc_enclosure_ref_put(enclosure));
}
diff --git a/src/test_senc_utils.h b/src/test_senc_utils.h
@@ -81,7 +81,6 @@ struct context {
const unsigned* indices;
const unsigned* front_media;
const unsigned* back_media;
- const unsigned* global_ids;
void* custom;
double offset[3];
double scale;
@@ -95,8 +94,6 @@ static const unsigned medium1_3[12] = { 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1 };
static const unsigned medium1_back0[12] = { 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 };
static const unsigned medium1_front0[12] = { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
-static const unsigned gid_face[12] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };
-
static INLINE void
get_indices(const unsigned itri, unsigned ids[3], void* context)
{
@@ -126,14 +123,6 @@ get_media(const unsigned itri, unsigned medium[2], void* context)
medium[ctx->reverse_med ? 0 : 1] = ctx->back_media[itri];
}
-static INLINE void
-get_global_id(const unsigned itri, unsigned* gid, void* context)
-{
- const struct context* ctx = context;
- ASSERT(gid && context);
- *gid = ctx->global_ids[itri];
-}
-
/*******************************************************************************
* Miscellaneous
******************************************************************************/