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 fc91c9efee867a2b670ee4a2070bcfe87217e38c
parent 10498e115555814aaa80443e4d41fd6060205094
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu, 10 Oct 2019 17:28:07 +0200

Add API calls to access scene geometry without prior analyze

Diffstat:
Msrc/senc.h | 26+++++++++++++++++++++++---
Msrc/senc_scene.c | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/test_senc_scene.c | 33++++++++++++++++++++++++++++++++-
Msrc/test_senc_undefined_medium.c | 38+++++++++++++++++++++++++++++++++++++-
4 files changed, 150 insertions(+), 5 deletions(-)

diff --git a/src/senc.h b/src/senc.h @@ -209,6 +209,24 @@ senc_scene_get_unique_triangles_count (const struct senc_scene* scene, unsigned* count); +/* Returns the itri_th unique triangles; the returned indices are + * unique vertex indices. + * Can be called anytime, before or after a call to analyze. */ +SENC_API res_T +senc_scene_get_unique_triangle + (const struct senc_scene* scene, + const unsigned itri, + unsigned indices[3]); + +/* Returns the itri_th unique triangles; the returned indices are + * unique vertex indices. + * Can be called anytime, before or after a call to analyze. */ +SENC_API res_T +senc_scene_get_unique_triangle_media + (const struct senc_scene* scene, + const unsigned itri, + unsigned media[2]); + /* Returns the number of vertices in the scene. */ SENC_API res_T senc_scene_get_vertices_count @@ -222,11 +240,13 @@ senc_scene_get_unique_vertices_count (const struct senc_scene* scene, unsigned* count); -/* Returns the number of triangles in the scene. */ +/* Returns the coordinates of the ivert_th unique vertex. + * Can be called anytime, before or after a call to analyze. */ SENC_API res_T -senc_scene_get_triangles_count +senc_scene_get_unique_vertex (const struct senc_scene* scene, - unsigned* count); + const unsigned ivert, + double coord[3]); SENC_API res_T senc_scene_ref_get diff --git a/src/senc_scene.c b/src/senc_scene.c @@ -18,6 +18,7 @@ #include "senc_scene_c.h" #include <rsys/rsys.h> +#include <rsys/double3.h> #include <rsys/mem_allocator.h> #include <limits.h> @@ -367,6 +368,46 @@ senc_scene_get_unique_triangles_count } res_T +senc_scene_get_unique_triangle + (const struct senc_scene* scn, + const unsigned itri, + unsigned indices[3]) +{ + const struct triangle_in* trg; + int i; + if(!scn || !indices + || itri >= darray_triangle_in_size_get(&scn->triangles_in)) + return RES_BAD_ARG; + trg = darray_triangle_in_cdata_get(&scn->triangles_in) + itri; + + FOR_EACH(i, 0, 3) { + ASSERT(trg->vertice_id[i] < UINT_MAX); + indices[i] = (unsigned)trg->vertice_id[i]; /* Back to API type */ + } + return RES_OK; +} + +res_T +senc_scene_get_unique_triangle_media + (const struct senc_scene* scn, + const unsigned itri, + unsigned media[2]) +{ + const struct triangle_in* trg; + int i; + if(!scn || !media + || itri >= darray_triangle_in_size_get(&scn->triangles_in)) + return RES_BAD_ARG; + trg = darray_triangle_in_cdata_get(&scn->triangles_in) + itri; + + FOR_EACH(i, 0, 2) { + ASSERT(trg->vertice_id[i] < UINT_MAX); + media[i] = (unsigned)trg->medium[i]; /* Back to API type */ + } + return RES_OK; +} + +res_T senc_scene_get_vertices_count (const struct senc_scene* scn, unsigned* count) @@ -387,6 +428,23 @@ senc_scene_get_unique_vertices_count } res_T +senc_scene_get_unique_vertex + (const struct senc_scene* scn, + const unsigned ivert, + double coord[3]) +{ + + const union double3* v; + if(!scn || !coord + || ivert >= darray_position_size_get(&scn->vertices)) + return RES_BAD_ARG; + + v = darray_position_cdata_get(&scn->vertices) + ivert; + d3_set(coord, v->vec); + return RES_OK; +} + +res_T senc_scene_ref_get(struct senc_scene* scn) { if(!scn) return RES_BAD_ARG; diff --git a/src/test_senc_scene.c b/src/test_senc_scene.c @@ -29,7 +29,8 @@ main(int argc, char** argv) struct senc_enclosure* enc = NULL; struct senc_enclosure_header header; struct context ctx; - unsigned medfront[2], medback[2]; + unsigned medfront[2], medback[2], ind[3]; + double vrtx[3]; unsigned count, i, maxm; enum senc_convention convention; (void)argc, (void)argv; @@ -51,6 +52,9 @@ main(int argc, char** argv) CHK(senc_scene_create(dev, SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn) == RES_OK); + CHK(senc_scene_reserve(NULL, 0, 0, 0) == RES_BAD_ARG); + CHK(senc_scene_reserve(scn, 0, 0, 0) == RES_OK); + CHK(senc_scene_get_convention(NULL, &convention) == RES_BAD_ARG); CHK(senc_scene_get_convention(scn, NULL) == RES_BAD_ARG); CHK(senc_scene_get_convention(NULL, NULL) == RES_BAD_ARG); @@ -118,6 +122,33 @@ main(int argc, char** argv) CHK(senc_scene_get_unique_vertices_count(scn, &count) == RES_OK); CHK(count == nvertices); + CHK(senc_scene_get_unique_triangle(NULL, 0, ind) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle(scn, UINT_MAX, ind) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle(scn, 0, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle(NULL, UINT_MAX, ind) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle(NULL, 0, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle(scn, UINT_MAX, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle(NULL, UINT_MAX, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle(scn, 0, ind) == RES_OK); + + CHK(senc_scene_get_unique_triangle_media(NULL, 0, ind) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle_media(scn, UINT_MAX, ind) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle_media(scn, 0, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle_media(NULL, UINT_MAX, ind) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle_media(NULL, 0, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle_media(scn, UINT_MAX, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle_media(NULL, UINT_MAX, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_triangle_media(scn, 0, ind) == RES_OK); + + CHK(senc_scene_get_unique_vertex(NULL, 0, vrtx) == RES_BAD_ARG); + CHK(senc_scene_get_unique_vertex(scn, UINT_MAX, vrtx) == RES_BAD_ARG); + CHK(senc_scene_get_unique_vertex(scn, 0, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_vertex(NULL, UINT_MAX, vrtx) == RES_BAD_ARG); + CHK(senc_scene_get_unique_vertex(NULL, 0, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_vertex(scn, UINT_MAX, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_vertex(NULL, UINT_MAX, NULL) == RES_BAD_ARG); + CHK(senc_scene_get_unique_vertex(scn, 0, vrtx) == RES_OK); + CHK(senc_scene_analyze(NULL, NULL) == RES_BAD_ARG); CHK(senc_scene_analyze(scn, NULL) == RES_BAD_ARG); CHK(senc_scene_analyze(NULL, &desc) == RES_BAD_ARG); diff --git a/src/test_senc_undefined_medium.c b/src/test_senc_undefined_medium.c @@ -33,7 +33,7 @@ test(enum senc_convention convention) unsigned medium; unsigned gid; struct context ctx; - unsigned i, t, ecount, tcount; + unsigned i, t, ecount, vcount, tcount; int is_front, is_in; unsigned media[12]; unsigned rev_box_indices[sizeof(box_indices) / sizeof(*box_indices)]; @@ -85,6 +85,24 @@ test(enum senc_convention convention) /* Cannot run analyze with undefined media */ BA(senc_scene_analyze(scn, &desc)); + /* Get the deduplicated geometry without (successful) analyze */ + OK(senc_scene_get_unique_vertices_count(scn, &vcount)); + CHK(vcount == nvertices); + OK(senc_scene_get_unique_triangles_count(scn, &tcount)); + CHK(tcount == ntriangles); + FOR_EACH(i, 0, tcount) { + int j; + unsigned med[2], ids[3]; + OK(senc_scene_get_unique_triangle(scn, i, ids)); + OK(senc_scene_get_unique_triangle_media(scn, i, med)); + CHK(med[0] == ((i % 2) ? 0 : SENC_UNDEFINED_MEDIUM) && med[1] == 1); + FOR_EACH(j, 0, 3) { + double pos[3]; + CHK(ids[j] < vcount); + OK(senc_scene_get_unique_vertex(scn, ids[j], pos)); + } + } + /* Same information again, using a reversed box */ ctx.indices = rev_box_indices; SWAP(const unsigned*, ctx.front_media, ctx.back_media); @@ -100,6 +118,24 @@ test(enum senc_convention convention) OK(senc_scene_add_geometry(scn, ntriangles, get_indices, get_media, NULL, nvertices, get_position, &ctx)); + /* Get the deduplicated geometry without (successful) analyze */ + OK(senc_scene_get_unique_vertices_count(scn, &vcount)); + CHK(vcount == nvertices); + OK(senc_scene_get_unique_triangles_count(scn, &tcount)); + CHK(tcount == ntriangles); + FOR_EACH(i, 0, tcount) { + int j; + unsigned med[2], ids[3]; + OK(senc_scene_get_unique_triangle(scn, i, ids)); + OK(senc_scene_get_unique_triangle_media(scn, i, med)); + CHK(med[0] == 0 && med[1] == 1); + FOR_EACH(j, 0, 3) { + double pos[3]; + CHK(ids[j] < vcount); + OK(senc_scene_get_unique_vertex(scn, ids[j], pos)); + } + } + /* Can run analyze */ OK(senc_scene_analyze(scn, &desc)); OK(senc_descriptor_ref_put(desc));