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 89ecb45a6e8ce09b855a14125911db46a467c7f6
parent f968ffa8cdb1c097cb5ae8335a69ea1c7f0fb307
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue,  7 Jan 2020 16:38:04 +0100

BugFix: getter accessing wrong enclosure

Diffstat:
Msrc/senc_descriptor.c | 4++--
Dsrc/test_senc_add_n_merge.c | 205-------------------------------------------------------------------------------
2 files changed, 2 insertions(+), 207 deletions(-)

diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c @@ -60,7 +60,7 @@ senc_scene_get_enclosure_count_by_medium return RES_BAD_ARG; ASSERT(darray_enc_ids_array_size_get(&scn->analyze.enc_ids_array_by_medium) == 1 + scn->next_medium_idx); - m_idx = (imed == SENC_UNDEFINED_MEDIUM) ? scn->next_medium_idx : imed; + m_idx = (imed == SENC_UNDEFINED_MEDIUM) ? 0 : imed + 1; enc_ids = darray_enc_ids_array_cdata_get(&scn->analyze.enc_ids_array_by_medium) + m_idx; tmp = darray_enc_id_size_get(enc_ids); @@ -100,7 +100,7 @@ senc_scene_get_enclosure_by_medium return RES_BAD_ARG; ASSERT(darray_enc_ids_array_size_get(&scn->analyze.enc_ids_array_by_medium) == 1 + scn->next_medium_idx); - m_idx = (imed == SENC_UNDEFINED_MEDIUM) ? scn->next_medium_idx : imed; + m_idx = (imed == SENC_UNDEFINED_MEDIUM) ? 0 : imed + 1; enc_ids = darray_enc_ids_array_cdata_get(&scn->analyze.enc_ids_array_by_medium) + m_idx; if(idx >= darray_enc_id_size_get(enc_ids)) return RES_BAD_ARG; diff --git a/src/test_senc_add_n_merge.c b/src/test_senc_add_n_merge.c @@ -1,205 +0,0 @@ -/* Copyright (C) |Meso|Star> 2016-2018 (contact@meso-star.com) -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -#include "senc.h" -#include "test_senc_utils.h" - -/* Manage add_geometry behaviour */ -struct add_geom_ctx { - unsigned add_cpt, merge_cpt; - res_T add_res, merge_res; -}; - -static res_T -add_trg - (const unsigned global_id, - const unsigned iseg, - void* context) -{ - struct context* ctx = context; - struct add_geom_ctx* add_geom_ctx; - ASSERT(ctx); (void)global_id; (void)iseg; - add_geom_ctx = ctx->custom; - if(add_geom_ctx->add_res == RES_OK) ++add_geom_ctx->add_cpt; - return add_geom_ctx->add_res; -} - -static res_T -merge_trg - (const unsigned global_id, - const unsigned iseg, - const int reversed_segment, - const unsigned triangle_media[2], - const unsigned merge_media[2], - void* context) -{ - struct context* ctx = context; - struct add_geom_ctx* add_geom_ctx; - ASSERT(ctx && triangle_media && merge_media); - (void)global_id; (void)iseg; (void)reversed_segment; (void)triangle_media; (void)merge_media; - add_geom_ctx = ctx->custom; - if(add_geom_ctx->merge_res == RES_OK) ++add_geom_ctx->merge_cpt; - return add_geom_ctx->merge_res; -} - -int -main(int argc, char** argv) -{ - struct mem_allocator allocator; - struct senc_device* dev = NULL; - struct senc_scene* scn = NULL; - struct context ctx = CONTEXT_NULL__; - unsigned i; - struct add_geom_ctx add_geom_ctx; - unsigned media[12]; - const int conv = SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE; - const unsigned media_count = sizeof(media) / sizeof(*media); - (void)argc; (void)argv; - - OK(mem_init_proxy_allocator(&allocator, &mem_default_allocator)); - OK(senc_device_create(NULL, &allocator, SENC_NTHREADS_DEFAULT, 1, &dev)); - OK(senc_scene_create(dev, conv, &scn)); - - /* A 3D cube. - * 2 enclosures (inside, outside) sharing the same triangles, - * but opposite sides */ - ctx.positions = box_vertices; - ctx.indices = box_indices; - ctx.scale = 1; - ctx.reverse_vrtx = 0; - ctx.reverse_med = 0; - d3(ctx.offset, 0, 0, 0); - ctx.front_media = media; - ctx.back_media = medium1; - ctx.custom = &add_geom_ctx; - - add_geom_ctx.add_cpt = add_geom_ctx.merge_cpt = 0; - add_geom_ctx.add_res = add_geom_ctx.merge_res = RES_OK; - - /* Geometry with no media information on both sides */ - for (i = 0; i < media_count; i++) media[i] = SENC_UNDEFINED_MEDIUM; - ctx.front_media = media; - ctx.back_media = media; - - /* If add fails, add geometry fails the same way */ - add_geom_ctx.add_res = RES_BAD_ARG; - BA(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx)); - CHK(add_geom_ctx.add_cpt == 0); - add_geom_ctx.add_res = RES_MEM_ERR; - CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx) == RES_MEM_ERR); - CHK(add_geom_ctx.add_cpt == 0); - - /* Successful add geometry with add callback */ - add_geom_ctx.add_res = RES_OK; - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx)); - CHK(add_geom_ctx.add_cpt == media_count); - CHK(add_geom_ctx.merge_cpt == 0); - - /* Clear scene */ - SENC(scene_ref_put(scn)); - OK(senc_scene_create(dev, conv, &scn)); - - /* Successful add geometry without add callback */ - add_geom_ctx.add_cpt = 0; - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, NULL, merge_trg, &ctx)); - CHK(add_geom_ctx.add_cpt == 0); - CHK(add_geom_ctx.merge_cpt == 0); - - /* If merge fails, add geometry fails the same way */ - add_geom_ctx.merge_res = RES_BAD_ARG; - BA(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx)); - CHK(add_geom_ctx.merge_cpt == 0); - add_geom_ctx.merge_res = RES_MEM_ERR; - CHK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx) == RES_MEM_ERR); - CHK(add_geom_ctx.merge_cpt == 0); - - /* Successful add geometry without merge callback */ - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, NULL, &ctx)); - CHK(add_geom_ctx.merge_cpt == 0); - - /* Successful add geometry with merge callback */ - add_geom_ctx.merge_res = RES_OK; - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx)); - CHK(add_geom_ctx.merge_cpt == media_count); - add_geom_ctx.merge_cpt = 0; - - /* Geometry with media information on both sides */ - ctx.front_media = medium0; - ctx.back_media = medium1; - - /* Clear scene */ - SENC(scene_ref_put(scn)); - OK(senc_scene_create(dev, conv, &scn)); - - /* Successful add geometry with add callback */ - add_geom_ctx.add_res = RES_OK; - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx)); - CHK(add_geom_ctx.add_cpt == media_count); - CHK(add_geom_ctx.merge_cpt == 0); - add_geom_ctx.add_cpt = 0; - - /* Clear scene */ - SENC(scene_ref_put(scn)); - OK(senc_scene_create(dev, conv, &scn)); - - /* Successful add geometry with add callback */ - add_geom_ctx.add_res = RES_OK; - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx)); - CHK(add_geom_ctx.add_cpt == media_count); - CHK(add_geom_ctx.merge_cpt == 0); - add_geom_ctx.add_cpt = 0; - - /* Successful add geometry with merge callback */ - add_geom_ctx.merge_res = RES_OK; - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx)); - CHK(add_geom_ctx.merge_cpt == media_count); - add_geom_ctx.merge_cpt = 0; - - /* Geometry with incompatible media information on both sides */ - ctx.front_media = medium1; - ctx.back_media = medium0; - - /* Unsuccessful add geometry without merge callback */ - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, NULL, &ctx)); - CHK(add_geom_ctx.merge_cpt == 0); - - /* Successful add geometry with merge callback */ - add_geom_ctx.merge_res = RES_OK; - OK(senc_scene_add_geometry(scn, ntriangles, get_indices, NULL, - nvertices, get_position, add_trg, merge_trg, &ctx)); - CHK(add_geom_ctx.merge_cpt == media_count); - add_geom_ctx.merge_cpt = 0; - - SENC(scene_ref_put(scn)); - SENC(device_ref_put(dev)); - - check_memory_allocator(&allocator); - mem_shutdown_proxy_allocator(&allocator); - CHK(mem_allocated_size() == 0); - - return 0; -}