commit 2699ef9fe4cf1d8c5c420536cde9df7413d04678
parent 93338c9955a8e737a641d40a533e0e34b3f42976
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 3 Mar 2020 12:04:08 +0100
Add a feature on frontier API
Diffstat:
5 files changed, 39 insertions(+), 22 deletions(-)
diff --git a/src/senc3d.h b/src/senc3d.h
@@ -284,13 +284,13 @@ senc3d_scene_get_frontier_segments_count
(const struct senc3d_scene* scene,
unsigned* count);
-/* Returns the iseg_th frontier segment; the returned indices are global vertex
- * indices whose coordinates can be retrieved using senc3d_scene_get_vertex. */
+/* Returns the iseg_th frontier segment (triangle and vertices global IDs). */
SENC3D_API res_T
senc3d_scene_get_frontier_segment
(const struct senc3d_scene* scene,
const unsigned iseg,
- unsigned vrtx_id[SENC3D_GEOMETRY_DIMENSION-1]);
+ unsigned vrtx_id[SENC3D_GEOMETRY_DIMENSION-1],
+ unsigned* trg_id);
SENC3D_API res_T
senc3d_scene_ref_get
diff --git a/src/senc3d_descriptor.c b/src/senc3d_descriptor.c
@@ -140,10 +140,11 @@ res_T
senc3d_scene_get_frontier_segment
(const struct senc3d_scene* scn,
const unsigned iseg, /* There is no defined type for segment IDs */
- vrtx_id_t vrtx_id[2])
+ vrtx_id_t vrtx_id[2],
+ unsigned* trg_id)
{
- const struct trg_edge* edge;
- if(!vrtx_id || !scn
+ const struct frontier_edge* edge;
+ if(!vrtx_id || !scn || !trg_id
|| iseg >= darray_frontier_edge_size_get(&scn->analyze.frontiers))
return RES_BAD_ARG;
edge = darray_frontier_edge_cdata_get(&scn->analyze.frontiers) + iseg;
@@ -151,5 +152,6 @@ senc3d_scene_get_frontier_segment
ASSERT(edge->vrtx1 <= VRTX_MAX__);
vrtx_id[0] = edge->vrtx0;
vrtx_id[1] = edge->vrtx1;
+ *trg_id = edge->trg;
return RES_OK;
}
diff --git a/src/senc3d_scene_analyze.c b/src/senc3d_scene_analyze.c
@@ -643,7 +643,7 @@ group_connex_components
#pragma omp single
{
res_T tmp_res = RES_OK;
- size_t ec = ATOMIC_GET(next_enclosure_id);
+ size_t ec = (size_t)ATOMIC_GET(next_enclosure_id);
ASSERT(ec <= ENCLOSURE_MAX__);
scn->analyze.enclosures_count = (enclosure_id_t)ec;
tmp_res = darray_enclosure_resize(&scn->analyze.enclosures,
@@ -933,13 +933,14 @@ collect_and_link_neighbours
&& p_crt_side->medium != p_ccw_side->medium)
#pragma omp critical
{
- struct trg_edge disc;
+ struct frontier_edge frontier_edge;
log_warn(scn->dev,
"%s: found frontier involving triangle "PRTF_TRG".\n",
FUNC_NAME, crt_id);
- disc.vrtx0 = v0;
- disc.vrtx1 = v1;
- darray_frontier_edge_push_back(frontiers, &disc);
+ frontier_edge.trg = crt_id;
+ frontier_edge.vrtx0 = v0;
+ frontier_edge.vrtx1 = v1;
+ darray_frontier_edge_push_back(frontiers, &frontier_edge);
}
}
}
diff --git a/src/senc3d_scene_c.h b/src/senc3d_scene_c.h
@@ -121,8 +121,14 @@ struct trgside {
* front(trg_0), back(trg_0), front(trg_1), back(trg_1), ... */
};
+/* Frontier edge type */
+struct frontier_edge {
+ trg_id_t trg;
+ vrtx_id_t vrtx0, vrtx1;
+};
+
#define DARRAY_NAME frontier_edge
-#define DARRAY_DATA struct trg_edge
+#define DARRAY_DATA struct frontier_edge
#include <rsys/dynamic_array.h>
union double3 {
diff --git a/src/test_senc3d_scene.c b/src/test_senc3d_scene.c
@@ -28,7 +28,7 @@ main(int argc, char** argv)
struct senc3d_enclosure* enc = NULL;
struct senc3d_enclosure_header header;
struct context ctx = CONTEXT_NULL__;
- unsigned medfront[2], medback[2], ind[3], ids[2];
+ unsigned medfront[2], medback[2], ind[3], ids[2], trg;
double vrtx[3];
unsigned count, i, maxm;
int convention;
@@ -194,13 +194,21 @@ main(int argc, char** argv)
OK(senc3d_scene_get_frontier_segments_count(scn, &count));
CHK(count == 0);
- BA(senc3d_scene_get_frontier_segment(NULL, 0, ids));
- BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, ids));
- BA(senc3d_scene_get_frontier_segment(scn, 0, NULL));
- BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, ids));
- BA(senc3d_scene_get_frontier_segment(NULL, 0, NULL));
- BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, NULL));
- BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, NULL));
+ BA(senc3d_scene_get_frontier_segment(NULL, 0, ids, &trg));
+ BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, ids, &trg));
+ BA(senc3d_scene_get_frontier_segment(scn, 0, NULL, &trg));
+ BA(senc3d_scene_get_frontier_segment(scn, 0, ids, NULL));
+ BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, ids, &trg));
+ BA(senc3d_scene_get_frontier_segment(NULL, 0, NULL, &trg));
+ BA(senc3d_scene_get_frontier_segment(NULL, 0, ids, NULL));
+ BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, NULL, &trg));
+ BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, ids, NULL));
+ BA(senc3d_scene_get_frontier_segment(scn, 0, NULL, NULL));
+ BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, NULL, &trg));
+ BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, ids, NULL));
+ BA(senc3d_scene_get_frontier_segment(NULL, 0, NULL, NULL));
+ BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, NULL, NULL));
+ BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, NULL, NULL));
BA(senc3d_scene_ref_get(NULL));
OK(senc3d_scene_ref_get(scn));
@@ -229,8 +237,8 @@ main(int argc, char** argv)
OK(senc3d_scene_get_frontier_segments_count(scn, &count));
CHK(count == 3);
- OK(senc3d_scene_get_frontier_segment(scn, 0, ids));
- BA(senc3d_scene_get_frontier_segment(scn, 3, ids));
+ OK(senc3d_scene_get_frontier_segment(scn, 0, ids, &trg));
+ BA(senc3d_scene_get_frontier_segment(scn, 3, ids, &trg));
OK(senc3d_scene_ref_put(scn));