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

Fix a memleak

Diffstat:
Msrc/senc_scene.c | 7++++---
Dsrc/test_senc_descriptor.c | 238-------------------------------------------------------------------------------
2 files changed, 4 insertions(+), 241 deletions(-)

diff --git a/src/senc_scene.c b/src/senc_scene.c @@ -113,8 +113,10 @@ senc_scene_create OK(darray_enclosure_resize(&scn->analyze.enclosures, 1)); scn->analyze.enclosures_count = 1; - if(!scn || !indices || !position || !nverts || !ntris) - return RES_BAD_ARG; + if(!scn || !indices || !position || !nverts || !ntris) { + res = RES_BAD_ARG; + goto error; + } OK(darray_position_reserve(&scn->vertices, scn->nverts)); OK(darray_triangle_in_reserve(&scn->triangles_in, scn->ntris)); @@ -298,7 +300,6 @@ senc_scene_get_vertex const unsigned ivert, double coord[3]) { - const union double3* v; if(!scn || !coord || ivert >= darray_position_size_get(&scn->vertices)) diff --git a/src/test_senc_descriptor.c b/src/test_senc_descriptor.c @@ -1,238 +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" - -#include <rsys/float3.h> -#include <rsys/double3.h> - -int -main(int argc, char** argv) -{ - struct mem_allocator allocator; - struct senc_device* dev = NULL; - struct senc_scene* scn = NULL; - struct descriptor* desc = NULL; - struct senc_enclosure* enc = NULL; - struct context ctx = CONTEXT_NULL__; - unsigned count, maxm; - unsigned indices[3]; - double coord[3]; - unsigned media[2]; - unsigned enclosures[2]; - (void)argc, (void)argv; - - CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); - CHK(senc_device_create(NULL, &allocator, SENC_NTHREADS_DEFAULT, 1, &dev) - == RES_OK); - - CHK(senc_scene_create(dev, - SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn) == RES_OK); - - /* A 3D cube */ - 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 = medium0; - ctx.back_media = medium1; - - 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); - - CHK(senc_descriptor_ref_get(desc) == RES_OK); - CHK(senc_descriptor_ref_get(NULL) == RES_BAD_ARG); - CHK(senc_descriptor_ref_put(NULL) == RES_BAD_ARG); - CHK(senc_descriptor_ref_put(desc) == RES_OK); - - CHK(senc_descriptor_get_max_medium(NULL, &maxm) == RES_BAD_ARG); - CHK(senc_descriptor_get_max_medium(desc, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_max_medium(NULL, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_max_medium(desc, &maxm) == RES_OK); - - CHK(maxm == 1); - - CHK(senc_descriptor_get_enclosure_count(NULL, &count) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count(desc, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count(NULL, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count(desc, &count) == RES_OK); - - CHK(count == 2); - - CHK(senc_descriptor_get_enclosure_count_by_medium(NULL, 0, &count) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count_by_medium(desc, 9, &count) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count_by_medium(desc, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count_by_medium(NULL, 9, &count) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count_by_medium(NULL, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count_by_medium(desc, 9, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count_by_medium(NULL, 9, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_count_by_medium(desc, 0, &count) == RES_OK); - - CHK(count == 1); - - CHK(senc_descriptor_get_enclosure(NULL, 0, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure(desc, 9, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure(desc, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure(NULL, 9, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure(NULL, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure(desc, 9, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure(NULL, 9, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure(desc, 0, &enc) == RES_OK); - - CHK(senc_enclosure_ref_put(enc) == RES_OK); - - CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 9, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 9, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(desc, 9, 0, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(desc, 9, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(desc, 9, 9, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(desc, 9, 9, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(NULL, 0, 0, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(NULL, 0, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(NULL, 0, 9, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(NULL, 0, 9, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(NULL, 9, 0, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(NULL, 9, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(NULL, 9, 9, &enc) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(NULL, 9, 9, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_enclosure_by_medium(desc, 0, 0, &enc) == RES_OK); - - CHK(senc_descriptor_get_vertices_count(NULL, &count) == RES_BAD_ARG); - CHK(senc_descriptor_get_vertices_count(desc, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_vertices_count(desc, &count) == RES_OK); - CHK(count == nvertices); - - CHK(senc_descriptor_get_triangles_count(NULL, &count) == RES_BAD_ARG); - CHK(senc_descriptor_get_triangles_count(desc, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_triangles_count(desc, &count) == RES_OK); - CHK(count == ntriangles); - - CHK(senc_descriptor_get_triangle(NULL, 0, indices) == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle(NULL, ntriangles, indices) - == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle(desc, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle(desc, 0, indices) == RES_OK); - CHK(indices[0] == box_indices[0] - && indices[1] == box_indices[1] - && indices[2] == box_indices[2]); - - CHK(senc_descriptor_get_vertex(NULL, 0, coord) == RES_BAD_ARG); - CHK(senc_descriptor_get_vertex(NULL, nvertices, coord) - == RES_BAD_ARG); - CHK(senc_descriptor_get_vertex(desc, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_vertex(desc, 0, coord) == RES_OK); - CHK(coord[0] == box_vertices[0] - && coord[1] == box_vertices[1] - && coord[2] == box_vertices[2]); - - CHK(senc_descriptor_get_triangle_media(NULL, 0, media) - == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_media(NULL, nvertices, media) - == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_media(desc, 0, NULL) - == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_media(desc, 0, media) == RES_OK); - CHK(media[0] == ctx.front_media[0] - && media[1] == ctx.back_media[1]); - - CHK(senc_descriptor_get_triangle_enclosures( - NULL, 0, enclosures) == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_enclosures( - NULL, nvertices, enclosures) == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_enclosures(desc, 0, NULL) - == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_enclosures(desc, 0, enclosures) - == RES_OK); - CHK(enclosures[0] == 0 && enclosures[1] == 1); - - CHK(senc_descriptor_get_triangle_global_id(NULL, 0, indices) - == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_global_id(NULL, nvertices, indices) - == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_global_id(desc, 0, NULL) - == RES_BAD_ARG); - CHK(senc_descriptor_get_triangle_global_id(desc, 0, indices) - == RES_OK); - /* No duplicates: 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, - nvertices, get_position, NULL, NULL, &ctx) == RES_OK); - CHK(senc_scene_analyze(scn, &desc) == RES_OK); - - CHK(senc_descriptor_get_vertices_count(desc, &count) == RES_OK); - /* Duplicate vertices have been replaced */ - CHK(count == nvertices); - - CHK(senc_descriptor_get_triangles_count(desc, &count) == RES_OK); - /* Duplicate triangles have been replaced */ - CHK(count == ntriangles); - - /* Add invalid duplicate geometry */ - CHK(senc_descriptor_ref_put(desc) == RES_OK); - desc = NULL; - ctx.front_media = medium1; - ctx.back_media = medium0; - 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); - desc = NULL; - CHK(senc_enclosure_ref_put(enc) == RES_OK); - - /* Same cube with a hole (last triangle is missing) */ - CHK(senc_scene_create(dev, - SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE, &scn) - == RES_OK); - - CHK(senc_scene_add_geometry(scn, ntriangles - 1, get_indices, get_media, - nvertices, get_position, NULL, NULL, &ctx) == RES_OK); - - CHK(senc_scene_analyze(scn, &desc) == RES_OK); - - CHK(senc_descriptor_get_frontier_segments_count(NULL, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segments_count(desc, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segments_count(NULL, &count) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segments_count(desc, &count) == RES_OK); - - CHK(senc_descriptor_get_frontier_segment(NULL, count, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segment(desc, count, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segment(NULL, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segment(NULL, count, indices) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segment(desc, 0, NULL) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segment(desc, count, indices) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segment(NULL, 0, indices) == RES_BAD_ARG); - CHK(senc_descriptor_get_frontier_segment(desc, 0, indices) == RES_OK); - - CHK(senc_scene_ref_put(scn) == RES_OK); - CHK(senc_device_ref_put(dev) == RES_OK); - if(desc) CHK(senc_descriptor_ref_put(desc) == RES_OK); - - check_memory_allocator(&allocator); - mem_shutdown_proxy_allocator(&allocator); - CHK(mem_allocated_size() == 0); - - return 0; -}