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 e70b1309a821c6ef260ecdbd724755006a4ef216
parent 0559c985183b74253979b287914be9084663fdb6
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon,  3 Feb 2020 16:01:19 +0100

Some API renames

add an include file to help writing code for 2D and 3D

Diffstat:
Mcmake/CMakeLists.txt | 19++++++++++---------
Msrc/senc.h | 69+++++++++++++++++++++++++++++++++++++++++----------------------------
Asrc/sencX3.h | 423+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/senc_descriptor.c | 6+++---
Msrc/senc_enclosure.c | 4++--
Msrc/senc_s3d_helper.h | 4++--
Msrc/senc_scene.c | 6+++---
Msrc/test_senc_cube_on_cube.c | 2+-
Msrc/test_senc_enclosure.c | 56++++++++++++++++++++++++++++----------------------------
Msrc/test_senc_inconsistant_cube.c | 2+-
Msrc/test_senc_many_enclosures.c | 2+-
Msrc/test_senc_many_triangles.c | 2+-
Msrc/test_senc_scene.c | 92++++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/test_senc_some_enclosures.c | 2+-
Msrc/test_senc_some_triangles.c | 2+-
Msrc/test_senc_unspecified_medium.c | 6+++---
Msrc/test_senc_utils.h | 8++++----
17 files changed, 571 insertions(+), 134 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -26,9 +26,9 @@ cmake_dependent_option(HUGE_ADDITIONAL_TESTS "Build additional tests that involve millions of triangles" OFF "NOT NO_TEST" OFF) -################################################################################ +############################################################################### # Check dependencies -################################################################################ +############################################################################### find_package(RCMake 0.4 REQUIRED) find_package(Star3D 0.6 REQUIRED) find_package(RSys 0.8.1 REQUIRED) @@ -64,9 +64,9 @@ else() endif() endif() -################################################################################ +############################################################################### # Configure and define targets -################################################################################ +############################################################################### set(VERSION_MAJOR 0) set(VERSION_MINOR 4) set(VERSION_PATCH 2) @@ -81,7 +81,8 @@ set(SENC_FILES_SRC set(SENC_FILES_INC_API senc.h - senc_s3d_helper.h) + senc_s3d_helper.h + sencX3.h) set(SENC_FILES_INC senc_device_c.h @@ -124,9 +125,9 @@ endif() rcmake_setup_devel(senc StarEnc ${VERSION} star/senc_version.h) -################################################################################ +############################################################################### # Add tests -################################################################################ +############################################################################### if(NOT NO_TEST) function(build_test _name) add_executable(${_name} @@ -174,9 +175,9 @@ if(NOT NO_TEST) endif() endif() -################################################################################ +############################################################################### # Define output & install directories -################################################################################ +############################################################################### install(TARGETS senc ARCHIVE DESTINATION bin LIBRARY DESTINATION lib diff --git a/src/senc.h b/src/senc.h @@ -60,6 +60,11 @@ struct senc_device; struct senc_scene; struct senc_enclosure; +/******************************************************************************* + * The dimension of the geometry used in the library. + ******************************************************************************/ +#define SENC_GEOMETRY_DIMENSION 3 + /* A type to discriminate triangle sides */ enum senc_side { SENC_FRONT, @@ -70,7 +75,7 @@ enum senc_side { struct senc_enclosure_header { /* The ID of the enclosure; 0, 1, ... */ unsigned enclosure_id; - /* Number of triangles; a triangle can be accounted for twice, once by side */ + /* Number of triangles; a triangle can be accounted for twice, once by side*/ unsigned primitives_count; /* Number of unique triangles; a triangle cannot be accounted for twice */ unsigned unique_primitives_count; @@ -98,7 +103,8 @@ struct senc_enclosure_header { * (for a closed enclosure Ng points toward the inside or toward the outside) * by using the flags : * SENC_CONVENTION_NORMAL_INSIDE => Ng points toward the enclosure, - * SENC_CONVENTION_NORMAL_OUTSIDE => Ng points to the opposite of the enclosure. + * SENC_CONVENTION_NORMAL_OUTSIDE => Ng points toward the opposite of the + * enclosure. * * Note that normals in output data can be opposite to normals in input data * (vertices are then given in reverse order). @@ -129,12 +135,12 @@ enum senc_convention { BEGIN_DECLS -/******************************************************************************* +/****************************************************************************** * StarEnclosures device. It is an handle toward the StarEnc library. * It manages the lib resources. * If provided, the allocator has to be suitable for parallel high frequency * allocations. As a consequence, a rsys proxy allocator should be avoided. - ******************************************************************************/ + *****************************************************************************/ SENC_API res_T senc_device_create (struct logger* logger, /* May be NULL <=> use default logger */ @@ -151,10 +157,10 @@ SENC_API res_T senc_device_ref_put (struct senc_device* device); -/******************************************************************************* +/****************************************************************************** * StarEnclosures scene. A scene is a collection of triangles. Each triangle is * defined with a medium on each side. - ******************************************************************************/ + *****************************************************************************/ /* Creates a scene from some vertices and triangles. * Neither vertices nor triangles can include duplicates. * Triangles cannot be degenerated. */ @@ -165,14 +171,20 @@ senc_scene_create /* Number of triangles */ const unsigned triangles_count, /* User function that provides vertices ids for triangles */ - void(*get_indices)(const unsigned itri, unsigned ids[3], void* context), + void(*get_indices)( + const unsigned itri, + unsigned ids[SENC_GEOMETRY_DIMENSION], + void* context), /* User function that provides media ids for triangles */ void(*get_media) /* Can be NULL <=> SENC_UNSPECIFIED_MEDIUM medium used */ (const unsigned itri, unsigned med[2], void* context), /* Number of vertices */ const unsigned vertices_count, /* User function that provides coordinates for vertices */ - void(*get_position)(const unsigned ivert, double pos[3], void* context), + void(*get_position)( + const unsigned ivert, + double pos[SENC_GEOMETRY_DIMENSION], + void* context), /* Context provided to user callbacks; can be NULL */ void* context, /* The created scene */ @@ -186,20 +198,20 @@ senc_scene_get_convention /* Returns the number of triangles in the scene. */ SENC_API res_T -senc_scene_get_primitives_count +senc_scene_get_triangles_count (const struct senc_scene* scene, unsigned* count); /* Returns the itri_th triangle vertices' indices. */ SENC_API res_T -senc_scene_get_primitive +senc_scene_get_triangle (const struct senc_scene* scene, const unsigned itri, - unsigned indices[3]); + unsigned indices[SENC_GEOMETRY_DIMENSION]); /* Returns the media for the itri_th triangle. */ SENC_API res_T -senc_scene_get_primitive_media +senc_scene_get_triangle_media (const struct senc_scene* scene, const unsigned itri, unsigned media[2]); @@ -215,7 +227,7 @@ SENC_API res_T senc_scene_get_vertex (const struct senc_scene* scene, const unsigned ivert, - double coord[3]); + double coord[SENC_GEOMETRY_DIMENSION]); /* Returns the greater medium id found in added geometry. In API calls using a * medium, any value in the [0 max_medium_id[ range is valid. However there can @@ -258,7 +270,7 @@ senc_scene_get_enclosure_by_medium /* Returns the enclosures the itri_th triangle front and back sides are member * of. */ SENC_API res_T -senc_scene_get_primitive_enclosures +senc_scene_get_triangle_enclosures (const struct senc_scene* scene, const unsigned itri, unsigned enclosures[2]); @@ -267,17 +279,17 @@ senc_scene_get_primitive_enclosures * - that have arity 1 (single triangle using the segment) * - that connect 2 different media */ SENC_API res_T -senc_scene_get_frontier_elements_count +senc_scene_get_frontier_segments_count (const struct senc_scene* scene, unsigned* count); -/* Returns the iseg_th frontier segment; the returned indices are global unique - * vertex indices. */ +/* Returns the iseg_th frontier segment; the returned indices are global vertex + * indices whose coordinates can be retrieved using senc_scene_get_vertex. */ SENC_API res_T -senc_scene_get_frontier_element +senc_scene_get_frontier_segment (const struct senc_scene* scene, const unsigned iseg, - unsigned vrtx_id[2]); + unsigned vrtx_id[SENC_GEOMETRY_DIMENSION-1]); SENC_API res_T senc_scene_ref_get @@ -287,20 +299,21 @@ SENC_API res_T senc_scene_ref_put (struct senc_scene* scene); -/******************************************************************************* +/****************************************************************************** * StarEnclosures enclosure. It is an handle toward an enclosure. * Counts and other information on enclosures are not individually accessible, * but as a whole through header access. - * An enclosure can list the "same" triangle twice if both sides are in. In this - * case the 2 occurences of the triangle have reversed vertices order and + * An enclosure can list the "same" triangle twice if both sides are in. In + * this case the 2 occurences of the triangle have reversed vertices order and * unique_triangle_count and triangle_count differ. * Vertices and triangles numbering schemes are specific to each enclosure: * the "same" item appearing in 2 different enclosures has no reason to get the * same index twice or to have the same index in the global numbering scheme. * By-index API accesses of triangles (or properties) visit unique triangles * for indices in the [0 unique_triangle_count[ range and back-faces of the - * doubly-included triangles in the [unique_triangle_count triangle_count[ range. - ******************************************************************************/ + * doubly-included triangles in the [unique_triangle_count triangle_count[ + * range. + *****************************************************************************/ /* Returns the header of an enclosure. */ SENC_API res_T senc_enclosure_get_header @@ -310,22 +323,22 @@ senc_enclosure_get_header /* Returns the itri_th triangle of an enclosure. * Indices are local to the enclosure. */ SENC_API res_T -senc_enclosure_get_primitive +senc_enclosure_get_triangle (const struct senc_enclosure* enclosure, const unsigned itri, - unsigned indices[3]); + unsigned indices[SENC_GEOMETRY_DIMENSION]); /* Returns the coordinates of the ivert_th vertex of an enclosure. */ SENC_API res_T senc_enclosure_get_vertex (const struct senc_enclosure* enclosure, const unsigned ivert, - double coord[3]); + double coord[SENC_GEOMETRY_DIMENSION]); /* Returns the global id of the itri_th triangle of an enclosure * and the involved side. */ SENC_API res_T -senc_enclosure_get_primitive_global_id +senc_enclosure_get_triangle_id (const struct senc_enclosure* enclosure, const unsigned itri, unsigned* gid, diff --git a/src/sencX3.h b/src/sencX3.h @@ -0,0 +1,423 @@ +/* Copyright (C) |Meso|Star> 2016-2020 (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/>. */ + +#ifndef SENC_X_3D_H +#define SENC_X_3D_H + +#include <star/senc.h> +#include <rsys/rsys.h> + +/* This file can be used in conjunction with sencX2.h from the the + * star-enclosures-2D library to write code for both 2D and 3D geometries using + * the following pattern: + * + * #if (DIM==2) + * #include <star/sencX2.h> + * #elif (DIM==3) + * #include <star/sencX3.h> + * #else + * #error DIM should be defined; possible values are 2 and 3 + * #endif + * + * Then use the sencX_... types and functions in your code. + */ + +/* Forward declaration of external opaque data types */ +struct logger; +struct mem_allocator; + +/* Forward declaration of StarEnclosures opaque data types. These data types + * are ref counted. Once created with the appropriated `senc_<TYPE>_create' + * function, the caller implicitly owns the created data, i.e. its reference + * counter is set to 1. The senc_<TYPE>_ref_<get|put> functions get or release + * a reference on the data, i.e. they increment or decrement the reference + * counter, respectively. When this counter reaches 0, the object is silently + * destroyed and cannot be used anymore. */ +typedef struct senc_device sencX_device; +typedef struct senc_scene sencX_scene; +typedef struct senc_enclosure sencX_enclosure; + +/******************************************************************************* + * The dimension of the geometry used in the library. + ******************************************************************************/ +#define SENCX_GEOMETRY_DIMENSION SENC_GEOMETRY_DIMENSION + +/* A type to discriminate triangle sides */ +enum sencXd_side { + SENCXD_FRONT = SENC_FRONT, + SENCXD_BACK = SENC_BACK +}; + +/* Enclosure header type */ +typedef struct senc_enclosure_header sencXd_enclosure_header; + +/* We consider the geometrical normal Ng to a triangle V0 V1 V2 + * that verifies "(V0, V0V1, V0V2, Ng) is a direct system" + * (right-handed system). + * + * The user can set the convention used to determine which side of + * a triangle is to be considered front/back by using the flags : + * SENC_CONVENTION_NORMAL_FRONT => Ng points toward the front side, + * SENC_CONVENTION_NORMAL_BACK => Ng points toward the back side. + * + * Additionaly the user can set the convention used to output enclosures + * so that Ng points toward the enclosure or on the opposite direction + * (for a closed enclosure Ng points toward the inside or toward the outside) + * by using the flags : + * SENC_CONVENTION_NORMAL_INSIDE => Ng points toward the enclosure, + * SENC_CONVENTION_NORMAL_OUTSIDE => Ng points to the opposite of the enclosure. + * + * Note that normals in output data can be opposite to normals in input data + * (vertices are then given in reverse order). + * + * Also note that both sides of a triangle can be part of the same enclosure; + * in this case the 2 sides will be given with opposite Ng (meaning they + * will be given with opposite vertices order). + */ +enum sencXd_convention { + /* + * Convention regarding FRONT/BACK sides in input data + */ + + /* Geometrical normals point toward the front side */ + SENCXD_CONVENTION_NORMAL_FRONT = SENC_CONVENTION_NORMAL_FRONT, + /* Geometrical normals point toward the back side */ + SENCXD_CONVENTION_NORMAL_BACK = SENC_CONVENTION_NORMAL_BACK, + + /* + * Convention regarding geometrical normals in output data + */ + + /* Geometrical normals point toward the enclosure */ + SENCXD_CONVENTION_NORMAL_INSIDE = SENC_CONVENTION_NORMAL_INSIDE, + /* Geometrical normals point to the opposite of the enclosure */ + SENCXD_CONVENTION_NORMAL_OUTSIDE = SENC_CONVENTION_NORMAL_OUTSIDE +}; + +/****************************************************************************** + * The value that should be used to let media unspecified. + *****************************************************************************/ +#define SENCXD_UNSPECIFIED_MEDIUM SENC_UNSPECIFIED_MEDIUM + +BEGIN_DECLS + +/****************************************************************************** + * StarEnclosures device. It is an handle toward the StarEnc library. + * It manages the lib resources. + * If provided, the allocator has to be suitable for parallel high frequency + * allocations. As a consequence, a rsys proxy allocator should be avoided. + *****************************************************************************/ +static FINLINE res_T +sencXd_device_create + (struct logger* logger, /* May be NULL <=> use default logger */ + struct mem_allocator* allocator, /* May be NULL <=> use default allocator */ + const unsigned nthreads_hint, + const int verbose, + struct senc_device** device) +{ + return senc_device_create(logger, allocator, nthreads_hint, verbose, device); +} + +static FINLINE res_T +sencXd_device_ref_get + (struct senc_device* device) +{ + return senc_device_ref_get(device); +} + +static FINLINE res_T +sencXd_device_ref_put + (struct senc_device* device) +{ + return senc_device_ref_put(device); +} + +/****************************************************************************** + * StarEnclosures scene. A scene is a collection of triangles. Each triangle is + * defined with a medium on each side. + *****************************************************************************/ +/* Creates a scene from some vertices and triangles. + * Neither vertices nor triangles can include duplicates. + * Triangles cannot be degenerated. */ +static FINLINE res_T +sencXd_scene_create + (struct senc_device* device, + const int convention, + /* Number of triangles */ + const unsigned triangles_count, + /* User function that provides vertices ids for triangles */ + void(*get_indices)( + const unsigned itri, + unsigned ids[SENCX_GEOMETRY_DIMENSION], + void* context), + /* User function that provides media ids for triangles */ + void(*get_media) /* Can be NULL <=> SENC_UNSPECIFIED_MEDIUM medium used */ + (const unsigned itri, unsigned med[2], void* context), + /* Number of vertices */ + const unsigned vertices_count, + /* User function that provides coordinates for vertices */ + void(*get_position)( + const unsigned ivert, + double pos[SENCX_GEOMETRY_DIMENSION], + void* context), + /* Context provided to user callbacks; can be NULL */ + void* context, + /* The created scene */ + struct senc_scene** scene) +{ + return senc_scene_create(device, convention, triangles_count, get_indices, + get_media, vertices_count, get_position, context, scene); +} + +/* Returns the convention flags in use with the scene. */ +static FINLINE res_T +sencXd_scene_get_convention + (const struct senc_scene* scene, + int* convention) +{ + return senc_scene_get_convention(scene, convention); +} + +/* Returns the number of triangles in the scene. */ +static FINLINE res_T +sencXd_scene_get_primitives_count + (const struct senc_scene* scene, + unsigned* count) +{ + return senc_enclosure_get_triangles_count(scene, count); +} + +/* Returns the itri_th triangle vertices' indices. */ +static FINLINE res_T +sencXd_scene_get_primitive + (const struct senc_scene* scene, + const unsigned itri, + unsigned indices[SENCX_GEOMETRY_DIMENSION]) +{ + return senc_enclosure_get_triangle(scene, itri, indices); +} + +/* Returns the media for the itri_th triangle. */ +static FINLINE res_T +sencXd_scene_get_primitive_media + (const struct senc_scene* scene, + const unsigned itri, + unsigned media[2]) +{ + return senc_enclosure_get_triangle_media(scene, itri, media); +} + +/* Returns the number of vertices in the scene. */ +static FINLINE res_T +sencXd_scene_get_vertices_count + (const struct senc_scene* scene, + unsigned* count) +{ + return senc_scene_get_vertices_count(scene, count); +} + +/* Returns the coordinates of the ivert_th vertex. */ +static FINLINE res_T +sencXd_scene_get_vertex + (const struct senc_scene* scene, + const unsigned ivert, + double coord[SENCX_GEOMETRY_DIMENSION]) +{ + return senc_scene_get_vertex(scene, ivert, coord); +} + +/* Returns the greater medium id found in added geometry. In API calls using a + * medium, any value in the [0 max_medium_id[ range is valid. However there can + * be unused ids (no geometry refered to this medium id). */ +static FINLINE res_T +sencXd_scene_get_max_medium + (const struct senc_scene* scene, + unsigned* max_medium_id) +{ + return senc_scene_get_max_medium(scene, max_medium_id); +} + +/* Returns the number of enclosures. */ +static FINLINE res_T +sencXd_scene_get_enclosure_count + (const struct senc_scene* scene, + unsigned* count) +{ + return senc_scene_get_enclosure_count(scene, count); +} + +/* Returns the number of enclosures that have some geometry refering to the + * imed_th medium or SENC_UNSPECIFIED_MEDIUM. */ +static FINLINE res_T +sencXd_scene_get_enclosure_count_by_medium + (const struct senc_scene* scene, + const unsigned imed, + unsigned* count) +{ + return senc_scene_get_enclosure_count_by_medium(scene, imed, count); +} + +/* Returns the idx_th enclosure. */ +static FINLINE res_T +sencXd_scene_get_enclosure + (struct senc_scene* scene, + const unsigned idx, + struct senc_enclosure** enclosure) +{ + return senc_scene_get_enclosure(scene, idx, enclosure); +} + +/* Returns the idx_th enclosure using the imed_th medium or + * SENC_UNSPECIFIED_MEDIUM. */ +static FINLINE res_T +sencXd_scene_get_enclosure_by_medium + (struct senc_scene* scene, + const unsigned imed, + const unsigned idx, + struct senc_enclosure** enclosure) +{ + return senc_scene_get_enclosure_by_medium(scene, imed, idx, enclosure); +} + +/* Returns the enclosures the itri_th triangle front and back sides are member + * of. */ +static FINLINE res_T +sencXd_scene_get_primitive_enclosures + (const struct senc_scene* scene, + const unsigned itri, + unsigned enclosures[2]) +{ + return senc_scene_get_triangle_enclosures(scene, itri, enclosures); +} + +/* Returns the number of segments that are frontier segments: + * - that have arity 1 (single triangle using the segment) + * - that connect 2 different media */ +static FINLINE res_T +sencXd_scene_get_frontier_elements_count + (const struct senc_scene* scene, + unsigned* count) +{ + return senc_scene_get_frontier_segments_count(scene, count); +} + +/* Returns the iseg_th frontier segment; the returned indices are global vertex + * indices whose coordinates can be retrieved using sencXd_scene_get_vertex. */ +static FINLINE res_T +sencXd_scene_get_frontier_element + (const struct senc_scene* scene, + const unsigned iseg, + unsigned vrtx_id[SENCX_GEOMETRY_DIMENSION-1]) +{ + return senc_scene_get_frontier_segment(scene, iseg, vrtx_id); +} + +static FINLINE res_T +sencXd_scene_ref_get + (struct senc_scene* scene) +{ + return senc_scene_ref_get(scene); +} + +static FINLINE res_T +sencXd_scene_ref_put + (struct senc_scene* scene) +{ + return senc_scene_ref_put(scene); +} + +/******************************************************************************* + * StarEnclosures enclosure. It is an handle toward an enclosure. + * Counts and other information on enclosures are not individually accessible, + * but as a whole through header access. + * An enclosure can list the "same" triangle twice if both sides are in. In this + * case the 2 occurences of the triangle have reversed vertices order and + * unique_triangle_count and triangle_count differ. + * Vertices and triangles numbering schemes are specific to each enclosure: + * the "same" item appearing in 2 different enclosures has no reason to get the + * same index twice or to have the same index in the global numbering scheme. + * By-index API accesses of triangles (or properties) visit unique triangles + * for indices in the [0 unique_triangle_count[ range and back-faces of the + * doubly-included triangles in the [unique_triangle_count triangle_count[ range. + ******************************************************************************/ +/* Returns the header of an enclosure. */ +static FINLINE res_T +sencXd_enclosure_get_header + (const struct senc_enclosure* enclosure, + struct senc_enclosure_header* header) +{ + return senc_enclosure_get_header(enclosure, header); +} + +/* Returns the itri_th triangle of an enclosure. + * Indices are local to the enclosure. */ +static FINLINE res_T +sencXd_enclosure_get_primitive + (const struct senc_enclosure* enclosure, + const unsigned itri, + unsigned indices[SENCX_GEOMETRY_DIMENSION]) +{ + return senc_enclosure_get_triangle(enclosure, itri, indices); +} + +/* Returns the coordinates of the ivert_th vertex of an enclosure. */ +static FINLINE res_T +sencXd_enclosure_get_vertex + (const struct senc_enclosure* enclosure, + const unsigned ivert, + double coord[SENCX_GEOMETRY_DIMENSION]) +{ + return senc_enclosure_get_vertex(enclosure, ivert, coord); +} + +/* Returns the global id of the itri_th triangle of an enclosure + * and the involved side. */ +static FINLINE res_T +sencXd_enclosure_get_primitive_id + (const struct senc_enclosure* enclosure, + const unsigned itri, + unsigned* gid, + enum senc_side* side) +{ + return senc_enclosure_get_triangle_id(enclosure, itri, gid, side); +} + +/* Returns the id of the imed_th medium of an enclosure. */ +static FINLINE res_T +sencXd_enclosure_get_medium + (const struct senc_enclosure* enclosure, + const unsigned imed, + unsigned* medium) +{ + return senc_enclosure_get_medium(enclosure, imed, medium); +} + +static FINLINE res_T +sencXd_enclosure_ref_get + (struct senc_enclosure* enclosure) +{ + return senc_enclosure_ref_get(enclosure); +} + +static FINLINE res_T +sencXd_enclosure_ref_put + (struct senc_enclosure* enclosure) +{ + return senc_enclosure_ref_put(enclosure); +} + +END_DECLS + +#endif /* SENC_X_3D_H */ diff --git a/src/senc_descriptor.c b/src/senc_descriptor.c @@ -109,7 +109,7 @@ senc_scene_get_enclosure_by_medium } res_T -senc_scene_get_primitive_enclosures +senc_scene_get_triangle_enclosures (const struct senc_scene* scn, const unsigned itri, unsigned enclosures[2]) @@ -130,7 +130,7 @@ senc_scene_get_primitive_enclosures } res_T -senc_scene_get_frontier_elements_count +senc_scene_get_frontier_segments_count (const struct senc_scene* scn, unsigned* count) { @@ -144,7 +144,7 @@ senc_scene_get_frontier_elements_count } res_T -senc_scene_get_frontier_element +senc_scene_get_frontier_segment (const struct senc_scene* scn, const unsigned iseg, unsigned vrtx_id[2]) diff --git a/src/senc_enclosure.c b/src/senc_enclosure.c @@ -75,7 +75,7 @@ senc_enclosure_get_header } res_T -senc_enclosure_get_primitive +senc_enclosure_get_triangle (const struct senc_enclosure* enclosure, const unsigned itri, unsigned indices[3]) @@ -117,7 +117,7 @@ senc_enclosure_get_vertex } res_T -senc_enclosure_get_primitive_global_id +senc_enclosure_get_triangle_id (const struct senc_enclosure* enclosure, const unsigned itri, unsigned* gid, diff --git a/src/senc_s3d_helper.h b/src/senc_s3d_helper.h @@ -33,7 +33,7 @@ senc_s3d_scene_get_indices__ const struct senc_scene* scene = ctx; res_T r; ASSERT(indices && scene); - r = senc_scene_get_primitive(scene, itri, indices); + r = senc_scene_get_triangle(scene, itri, indices); ASSERT(r == RES_OK); (void)r; } @@ -67,7 +67,7 @@ senc_s3d_enclosure_get_indices__ const struct senc_enclosure* enclosure = ctx; res_T r; ASSERT(indices && ctx); - r = senc_enclosure_get_primitive(enclosure, itri, indices); + r = senc_enclosure_get_triangle(enclosure, itri, indices); ASSERT(r == RES_OK); (void)r; } diff --git a/src/senc_scene.c b/src/senc_scene.c @@ -235,7 +235,7 @@ senc_scene_get_convention } res_T -senc_scene_get_primitives_count +senc_scene_get_triangles_count (const struct senc_scene* scn, unsigned* count) { @@ -245,7 +245,7 @@ senc_scene_get_primitives_count } res_T -senc_scene_get_primitive +senc_scene_get_triangle (const struct senc_scene* scn, const unsigned itri, unsigned indices[3]) @@ -265,7 +265,7 @@ senc_scene_get_primitive } res_T -senc_scene_get_primitive_media +senc_scene_get_triangle_media (const struct senc_scene* scn, const unsigned itri, unsigned media[2]) diff --git a/src/test_senc_cube_on_cube.c b/src/test_senc_cube_on_cube.c @@ -171,7 +171,7 @@ main(int argc, char** argv) OK(senc_scene_get_vertices_count(scn, &count)); CHK(count == cube_on_cube_vertices_count); - OK(senc_scene_get_primitives_count(scn, &count)); + OK(senc_scene_get_triangles_count(scn, &count)); CHK(count == cube_on_cube_triangles_count); OK(senc_scene_get_enclosure_count(scn, &count)); diff --git a/src/test_senc_enclosure.c b/src/test_senc_enclosure.c @@ -71,14 +71,14 @@ test(const int convention) BA(senc_enclosure_ref_put(NULL)); OK(senc_enclosure_ref_put(enclosure)); - BA(senc_enclosure_get_primitive(NULL, 0, indices[0])); - BA(senc_enclosure_get_primitive(enclosure, ntriangles, indices[0])); - BA(senc_enclosure_get_primitive(enclosure, 0, NULL)); - BA(senc_enclosure_get_primitive(NULL, ntriangles, indices[0])); - BA(senc_enclosure_get_primitive(NULL, 0, NULL)); - BA(senc_enclosure_get_primitive(enclosure, ntriangles, NULL)); - BA(senc_enclosure_get_primitive(NULL, ntriangles, NULL)); - OK(senc_enclosure_get_primitive(enclosure, 0, indices[0])); + BA(senc_enclosure_get_triangle(NULL, 0, indices[0])); + BA(senc_enclosure_get_triangle(enclosure, ntriangles, indices[0])); + BA(senc_enclosure_get_triangle(enclosure, 0, NULL)); + BA(senc_enclosure_get_triangle(NULL, ntriangles, indices[0])); + BA(senc_enclosure_get_triangle(NULL, 0, NULL)); + BA(senc_enclosure_get_triangle(enclosure, ntriangles, NULL)); + BA(senc_enclosure_get_triangle(NULL, ntriangles, NULL)); + OK(senc_enclosure_get_triangle(enclosure, 0, indices[0])); BA(senc_enclosure_get_vertex(NULL, 0, vrtx)); BA(senc_enclosure_get_vertex(enclosure, nvertices, vrtx)); @@ -89,22 +89,22 @@ test(const int convention) BA(senc_enclosure_get_vertex(NULL, nvertices, NULL)); OK(senc_enclosure_get_vertex(enclosure, 0, vrtx)); - BA(senc_enclosure_get_primitive_global_id(NULL, 0, &gid, NULL)); - BA(senc_enclosure_get_primitive_global_id(enclosure, ntriangles, &gid, NULL)); - BA(senc_enclosure_get_primitive_global_id(enclosure, 0, NULL, NULL)); - BA(senc_enclosure_get_primitive_global_id(NULL, ntriangles, &gid, NULL)); - BA(senc_enclosure_get_primitive_global_id(NULL, 0, NULL, NULL)); - BA(senc_enclosure_get_primitive_global_id(enclosure, ntriangles, NULL, NULL)); - BA(senc_enclosure_get_primitive_global_id(NULL, ntriangles, NULL, NULL)); - BA(senc_enclosure_get_primitive_global_id(enclosure, 0, &gid, NULL)); - BA(senc_enclosure_get_primitive_global_id(NULL, 0, &gid, &side)); - BA(senc_enclosure_get_primitive_global_id(enclosure, ntriangles, &gid, &side)); - BA(senc_enclosure_get_primitive_global_id(enclosure, 0, NULL, &side)); - BA(senc_enclosure_get_primitive_global_id(NULL, ntriangles, &gid, &side)); - BA(senc_enclosure_get_primitive_global_id(NULL, 0, NULL, &side)); - BA(senc_enclosure_get_primitive_global_id(enclosure, ntriangles, NULL, &side)); - BA(senc_enclosure_get_primitive_global_id(NULL, ntriangles, NULL, &side)); - OK(senc_enclosure_get_primitive_global_id(enclosure, 0, &gid, &side)); + BA(senc_enclosure_get_triangle_id(NULL, 0, &gid, NULL)); + BA(senc_enclosure_get_triangle_id(enclosure, ntriangles, &gid, NULL)); + BA(senc_enclosure_get_triangle_id(enclosure, 0, NULL, NULL)); + BA(senc_enclosure_get_triangle_id(NULL, ntriangles, &gid, NULL)); + BA(senc_enclosure_get_triangle_id(NULL, 0, NULL, NULL)); + BA(senc_enclosure_get_triangle_id(enclosure, ntriangles, NULL, NULL)); + BA(senc_enclosure_get_triangle_id(NULL, ntriangles, NULL, NULL)); + BA(senc_enclosure_get_triangle_id(enclosure, 0, &gid, NULL)); + BA(senc_enclosure_get_triangle_id(NULL, 0, &gid, &side)); + BA(senc_enclosure_get_triangle_id(enclosure, ntriangles, &gid, &side)); + BA(senc_enclosure_get_triangle_id(enclosure, 0, NULL, &side)); + BA(senc_enclosure_get_triangle_id(NULL, ntriangles, &gid, &side)); + BA(senc_enclosure_get_triangle_id(NULL, 0, NULL, &side)); + BA(senc_enclosure_get_triangle_id(enclosure, ntriangles, NULL, &side)); + BA(senc_enclosure_get_triangle_id(NULL, ntriangles, NULL, &side)); + OK(senc_enclosure_get_triangle_id(enclosure, 0, &gid, &side)); BA(senc_enclosure_get_medium(NULL, 0, &medium)); BA(senc_enclosure_get_medium(enclosure, 2, &medium)); @@ -138,7 +138,7 @@ test(const int convention) CHK(header.is_infinite == (i == 0)); FOR_EACH(t, 0, header.primitives_count) { - OK(senc_enclosure_get_primitive_global_id(enclosure, t, &gid, &side)); + OK(senc_enclosure_get_triangle_id(enclosure, t, &gid, &side)); CHK(gid == t); CHK(side == (medium == 0) ? SENC_FRONT : SENC_BACK); } @@ -152,7 +152,7 @@ test(const int convention) int same, reversed; /* Read same triangles in both enclosures */ FOR_EACH(i, 0, 2) - OK(senc_enclosure_get_primitive(enclosures[i], n, indices[i])); + OK(senc_enclosure_get_triangle(enclosures[i], n, indices[i])); /* Same triangles and opposite sides for the 2 enclosures */ FOR_EACH(i, 0, 3) CHK(indices[0][i] == indices[1][2 - i]); /* Enclosure 0 is outside (and contains medium 0 if convention is front). @@ -180,7 +180,7 @@ test(const int convention) OK(senc_scene_create(dev, convention, ntriangles - 1, get_indices, get_media, nvertices, get_position, &ctx, &scn)); - OK(senc_scene_get_frontier_elements_count(scn, &count)); + OK(senc_scene_get_frontier_segments_count(scn, &count)); CHK(count == 3); OK(senc_scene_get_enclosure_count(scn, &count)); @@ -205,7 +205,7 @@ test(const int convention) CHK(header.is_infinite == 1); FOR_EACH(t, 0, header.primitives_count) { - OK(senc_enclosure_get_primitive_global_id(enclosure, t, &gid, &side)); + OK(senc_enclosure_get_triangle_id(enclosure, t, &gid, &side)); /* The first unique_triangle_count triangles of an enclosure * are unique triangles */ if(t < header.unique_primitives_count) CHK(gid == t); diff --git a/src/test_senc_inconsistant_cube.c b/src/test_senc_inconsistant_cube.c @@ -118,7 +118,7 @@ test(const int convention) /* Should be made of the same triangles */ CHK(same); CHK(i ? reversed != fst_reversed : reversed == fst_reversed); - OK(senc_enclosure_get_primitive_global_id(enclosure, i, &gid, &side)); + OK(senc_enclosure_get_triangle_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 @@ -76,7 +76,7 @@ main(int argc, char** argv) OK(senc_scene_get_vertices_count(scn, &count)); CHK(count == NB_CYL * cyl_vrtx_count); - OK(senc_scene_get_primitives_count(scn, &count)); + OK(senc_scene_get_triangles_count(scn, &count)); CHK(count == NB_CYL * cyl_trg_count); OK(senc_scene_get_enclosure_count(scn, &count)); diff --git a/src/test_senc_many_triangles.c b/src/test_senc_many_triangles.c @@ -76,7 +76,7 @@ main(int argc, char** argv) OK(senc_scene_get_vertices_count(scn, &count)); CHK(count == NB_CYL * cyl_vrtx_count); - OK(senc_scene_get_primitives_count(scn, &count)); + OK(senc_scene_get_triangles_count(scn, &count)); CHK(count == NB_CYL * cyl_trg_count); OK(senc_scene_get_enclosure_count(scn, &count)); diff --git a/src/test_senc_scene.c b/src/test_senc_scene.c @@ -85,10 +85,10 @@ main(int argc, char** argv) CHK(convention == (SENC_CONVENTION_NORMAL_FRONT | SENC_CONVENTION_NORMAL_INSIDE)); - BA(senc_scene_get_primitives_count(NULL, &count)); - BA(senc_scene_get_primitives_count(scn, NULL)); - BA(senc_scene_get_primitives_count(NULL, NULL)); - OK(senc_scene_get_primitives_count(scn, &count)); + BA(senc_scene_get_triangles_count(NULL, &count)); + BA(senc_scene_get_triangles_count(scn, NULL)); + BA(senc_scene_get_triangles_count(NULL, NULL)); + OK(senc_scene_get_triangles_count(scn, &count)); CHK(count == ntriangles); BA(senc_scene_get_vertices_count(NULL, &count)); @@ -97,23 +97,23 @@ main(int argc, char** argv) OK(senc_scene_get_vertices_count(scn, &count)); CHK(count == nvertices); - BA(senc_scene_get_primitive(NULL, 0, ind)); - BA(senc_scene_get_primitive(scn, UINT_MAX, ind)); - BA(senc_scene_get_primitive(scn, 0, NULL)); - BA(senc_scene_get_primitive(NULL, UINT_MAX, ind)); - BA(senc_scene_get_primitive(NULL, 0, NULL)); - BA(senc_scene_get_primitive(scn, UINT_MAX, NULL)); - BA(senc_scene_get_primitive(NULL, UINT_MAX, NULL)); - OK(senc_scene_get_primitive(scn, 0, ind)); - - BA(senc_scene_get_primitive_media(NULL, 0, ind)); - BA(senc_scene_get_primitive_media(scn, UINT_MAX, ind)); - BA(senc_scene_get_primitive_media(scn, 0, NULL)); - BA(senc_scene_get_primitive_media(NULL, UINT_MAX, ind)); - BA(senc_scene_get_primitive_media(NULL, 0, NULL)); - BA(senc_scene_get_primitive_media(scn, UINT_MAX, NULL)); - BA(senc_scene_get_primitive_media(NULL, UINT_MAX, NULL)); - OK(senc_scene_get_primitive_media(scn, 0, ind)); + BA(senc_scene_get_triangle(NULL, 0, ind)); + BA(senc_scene_get_triangle(scn, UINT_MAX, ind)); + BA(senc_scene_get_triangle(scn, 0, NULL)); + BA(senc_scene_get_triangle(NULL, UINT_MAX, ind)); + BA(senc_scene_get_triangle(NULL, 0, NULL)); + BA(senc_scene_get_triangle(scn, UINT_MAX, NULL)); + BA(senc_scene_get_triangle(NULL, UINT_MAX, NULL)); + OK(senc_scene_get_triangle(scn, 0, ind)); + + BA(senc_scene_get_triangle_media(NULL, 0, ind)); + BA(senc_scene_get_triangle_media(scn, UINT_MAX, ind)); + BA(senc_scene_get_triangle_media(scn, 0, NULL)); + BA(senc_scene_get_triangle_media(NULL, UINT_MAX, ind)); + BA(senc_scene_get_triangle_media(NULL, 0, NULL)); + BA(senc_scene_get_triangle_media(scn, UINT_MAX, NULL)); + BA(senc_scene_get_triangle_media(NULL, UINT_MAX, NULL)); + OK(senc_scene_get_triangle_media(scn, 0, ind)); BA(senc_scene_get_vertex(NULL, 0, vrtx)); BA(senc_scene_get_vertex(scn, UINT_MAX, vrtx)); @@ -179,28 +179,28 @@ main(int argc, char** argv) /* Index 0 is out of range for SENC_UNSPECIFIED_MEDIUM. */ BA(senc_scene_get_enclosure_by_medium(scn, SENC_UNSPECIFIED_MEDIUM, 0, &enc)); - BA(senc_scene_get_primitive_enclosures(NULL, 0, ids)); - BA(senc_scene_get_primitive_enclosures(scn, UINT_MAX, ids)); - BA(senc_scene_get_primitive_enclosures(scn, 0, NULL)); - BA(senc_scene_get_primitive_enclosures(NULL, UINT_MAX, ids)); - BA(senc_scene_get_primitive_enclosures(NULL, 0, NULL)); - BA(senc_scene_get_primitive_enclosures(scn, UINT_MAX, NULL)); - BA(senc_scene_get_primitive_enclosures(NULL, UINT_MAX, NULL)); - OK(senc_scene_get_primitive_enclosures(scn, 0, ids)); - - BA(senc_scene_get_frontier_elements_count(NULL, &count)); - BA(senc_scene_get_frontier_elements_count(scn, NULL)); - BA(senc_scene_get_frontier_elements_count(NULL, NULL)); - OK(senc_scene_get_frontier_elements_count(scn, &count)); + BA(senc_scene_get_triangle_enclosures(NULL, 0, ids)); + BA(senc_scene_get_triangle_enclosures(scn, UINT_MAX, ids)); + BA(senc_scene_get_triangle_enclosures(scn, 0, NULL)); + BA(senc_scene_get_triangle_enclosures(NULL, UINT_MAX, ids)); + BA(senc_scene_get_triangle_enclosures(NULL, 0, NULL)); + BA(senc_scene_get_triangle_enclosures(scn, UINT_MAX, NULL)); + BA(senc_scene_get_triangle_enclosures(NULL, UINT_MAX, NULL)); + OK(senc_scene_get_triangle_enclosures(scn, 0, ids)); + + BA(senc_scene_get_frontier_segments_count(NULL, &count)); + BA(senc_scene_get_frontier_segments_count(scn, NULL)); + BA(senc_scene_get_frontier_segments_count(NULL, NULL)); + OK(senc_scene_get_frontier_segments_count(scn, &count)); CHK(count == 0); - BA(senc_scene_get_frontier_element(NULL, 0, ids)); - BA(senc_scene_get_frontier_element(scn, UINT_MAX, ids)); - BA(senc_scene_get_frontier_element(scn, 0, NULL)); - BA(senc_scene_get_frontier_element(NULL, UINT_MAX, ids)); - BA(senc_scene_get_frontier_element(NULL, 0, NULL)); - BA(senc_scene_get_frontier_element(scn, UINT_MAX, NULL)); - BA(senc_scene_get_frontier_element(NULL, UINT_MAX, NULL)); + BA(senc_scene_get_frontier_segment(NULL, 0, ids)); + BA(senc_scene_get_frontier_segment(scn, UINT_MAX, ids)); + BA(senc_scene_get_frontier_segment(scn, 0, NULL)); + BA(senc_scene_get_frontier_segment(NULL, UINT_MAX, ids)); + BA(senc_scene_get_frontier_segment(NULL, 0, NULL)); + BA(senc_scene_get_frontier_segment(scn, UINT_MAX, NULL)); + BA(senc_scene_get_frontier_segment(NULL, UINT_MAX, NULL)); BA(senc_scene_ref_get(NULL)); OK(senc_scene_ref_get(scn)); @@ -227,10 +227,10 @@ main(int argc, char** argv) ntriangles - 1, get_indices, get_media, nvertices, get_position, &ctx, &scn)); - OK(senc_scene_get_frontier_elements_count(scn, &count)); + OK(senc_scene_get_frontier_segments_count(scn, &count)); CHK(count == 3); - OK(senc_scene_get_frontier_element(scn, 0, ids)); - BA(senc_scene_get_frontier_element(scn, 3, ids)); + OK(senc_scene_get_frontier_segment(scn, 0, ids)); + BA(senc_scene_get_frontier_segment(scn, 3, ids)); OK(senc_scene_ref_put(scn)); @@ -248,7 +248,7 @@ main(int argc, char** argv) CHK(!header.is_infinite); OK(senc_enclosure_ref_put(enc)); - OK(senc_scene_get_primitive_media(scn, 0, medback)); + OK(senc_scene_get_triangle_media(scn, 0, medback)); OK(senc_scene_ref_put(scn)); /* Medium mismatch between neighbour segments, but OK */ @@ -282,7 +282,7 @@ main(int argc, char** argv) CHK(header.is_infinite); OK(senc_enclosure_ref_put(enc)); - OK(senc_scene_get_primitive_media(scn, 0, medfront)); + OK(senc_scene_get_triangle_media(scn, 0, medfront)); FOR_EACH(i, 0, 2) CHK(medback[i] == medfront[i]); OK(senc_scene_ref_put(scn)); diff --git a/src/test_senc_some_enclosures.c b/src/test_senc_some_enclosures.c @@ -3395,7 +3395,7 @@ main(int argc, char** argv) OK(senc_scene_get_vertices_count(scn, &count)); CHK(count == NB_CYL * CYL_VRTX_COUNT); - OK(senc_scene_get_primitives_count(scn, &count)); + OK(senc_scene_get_triangles_count(scn, &count)); CHK(count == NB_CYL * CYL_TRG_COUNT); OK(senc_scene_get_enclosure_count(scn, &count)); diff --git a/src/test_senc_some_triangles.c b/src/test_senc_some_triangles.c @@ -2712,7 +2712,7 @@ main(int argc, char** argv) OK(senc_scene_get_vertices_count(scn, &count)); CHK(count == NB_CYL * CYL_VRTX_COUNT); - OK(senc_scene_get_primitives_count(scn, &count)); + OK(senc_scene_get_triangles_count(scn, &count)); CHK(count == NB_CYL * CYL_TRG_COUNT); OK(senc_scene_get_enclosure_count(scn, &count)); diff --git a/src/test_senc_unspecified_medium.c b/src/test_senc_unspecified_medium.c @@ -221,10 +221,10 @@ test(const int convention) FOR_EACH(t, 0, header.primitives_count) { unsigned ind[3]; - OK(senc_enclosure_get_primitive_global_id(enclosure, t, &gid, &side)); + OK(senc_enclosure_get_triangle_id(enclosure, t, &gid, &side)); CHK(gid == t); CHK(side == (medium == 1) ? SENC_BACK : SENC_FRONT); - OK(senc_enclosure_get_primitive(enclosure, t, ind)); + OK(senc_enclosure_get_triangle(enclosure, t, ind)); } OK(senc_enclosure_ref_put(enclosure)); } @@ -300,7 +300,7 @@ test(const int convention) OK(senc_enclosure_ref_put(ee)); FOR_EACH(t, 0, header.primitives_count) { - OK(senc_enclosure_get_primitive_global_id(enclosure, t, &gid, &side)); + OK(senc_enclosure_get_triangle_id(enclosure, t, &gid, &side)); CHK(gid == t); CHK(side == (medium == 1) ? SENC_BACK : SENC_FRONT); } diff --git a/src/test_senc_utils.h b/src/test_senc_utils.h @@ -150,7 +150,7 @@ dump_global ASSERT(scn && name); OK(senc_scene_get_vertices_count(scn, &vertices_count)); - OK(senc_scene_get_primitives_count(scn, &triangles_count)); + OK(senc_scene_get_triangles_count(scn, &triangles_count)); stream = fopen(name, "w"); CHK(stream); @@ -161,7 +161,7 @@ dump_global } FOR_EACH(i, 0, triangles_count) { unsigned indices[3]; - OK(senc_scene_get_primitive(scn, i, indices)); + OK(senc_scene_get_triangle(scn, i, indices)); fprintf(stream, "f %lu %lu %lu\n", (unsigned long)(1 + indices[0]), (unsigned long)(1 + indices[1]), (unsigned long)(1 + indices[2])); } @@ -195,7 +195,7 @@ dump_enclosure } FOR_EACH(i, 0, header.primitives_count) { unsigned indices[3]; - OK(senc_enclosure_get_primitive(enclosure, i, indices)); + OK(senc_enclosure_get_triangle(enclosure, i, indices)); fprintf(stream, "f %lu %lu %lu\n", (unsigned long)(1+indices[0]), (unsigned long)(1+indices[1]), (unsigned long)(1+indices[2])); } @@ -235,7 +235,7 @@ cmp_trg ASSERT(enclosure && trg2 && vertices2 && trg_eq && trg_reversed); - OK(senc_enclosure_get_primitive(enclosure, itri, trg1)); + OK(senc_enclosure_get_triangle(enclosure, itri, trg1)); FOR_EACH(i, 0, 3) { OK(senc_enclosure_get_vertex(enclosure, trg1[i], t1[i])); d3_set(t2[i], vertices2 + (3 * trg2[i]));