star-3dut

Generate meshes of simple geometric shapes
git clone git://git.meso-star.fr/star-3dut.git
Log | Files | Refs | README | LICENSE

commit 088b3fc08a1e7d29818a77b5cbe96964db5e5c5d
parent 06b836cda6bfc748801cb882c2b490dbe2385635
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri,  6 Oct 2017 17:49:50 +0200

The nslices arg validity for s3dut_create_hemisphere is now [3 Inf).

The same as other sphere related functions.

Diffstat:
Msrc/s3dut.h | 2+-
Msrc/s3dut_sphere.c | 103+++++++++++++++++++++++++++++++------------------------------------------------
Msrc/test_s3dut_hemisphere.c | 22+++++++++++-----------
3 files changed, 52 insertions(+), 75 deletions(-)

diff --git a/src/s3dut.h b/src/s3dut.h @@ -133,7 +133,7 @@ S3DUT_API res_T s3dut_create_hemisphere (struct mem_allocator* allocator, const double radius, - const unsigned nslices, /* # subdivisions around Z axis in [2, INF) */ + const unsigned nslices, /* # subdivisions around Z axis in [3, INF) */ const unsigned nstacks, /* # subdivisions along Z axis int [2, INF) */ struct s3dut_mesh** hemisphere); diff --git a/src/s3dut_sphere.c b/src/s3dut_sphere.c @@ -171,16 +171,46 @@ setup_sphere_indices } } -static res_T -s3dut_create_truncated_sphere_do +/******************************************************************************* + * Exported function + ******************************************************************************/ +res_T +s3dut_create_sphere (struct mem_allocator* allocator, const double radius, const unsigned nslices, const unsigned nstacks, - const double z_range[2], - const unsigned close_ends, struct s3dut_mesh** mesh) { + return s3dut_create_truncated_sphere + (allocator, radius, nslices, nstacks, NULL, 0, mesh); +} + +res_T +s3dut_create_hemisphere +(struct mem_allocator* allocator, + const double radius, + const unsigned nslices, + const unsigned nstacks, + struct s3dut_mesh** mesh) +{ + double z_range[2]; + z_range[0] = 0; + z_range[1] = +radius; + return s3dut_create_truncated_sphere + (allocator, radius, nslices, nstacks, z_range, 0, mesh); +} + +res_T +s3dut_create_truncated_sphere +(struct mem_allocator* allocator, + const double radius, + const unsigned nslices, + const unsigned nstacks, + const double z_range[2], + const unsigned close_ends, + struct s3dut_mesh** mesh) +{ struct s3dut_mesh* sphere = NULL; const int top_truncated = z_range && z_range[1] < +radius; const int bottom_truncated = z_range && z_range[0] > -radius; @@ -197,6 +227,12 @@ s3dut_create_truncated_sphere_do res_T res = RES_OK; ASSERT(0 <= nb_truncated && nb_truncated <= 2); + if(radius <= 0 || nslices < 3 || nstacks < 2 || !mesh + || (z_range && z_range[0] >= z_range[1])) { + res = RES_BAD_ARG; + goto error; + } + res = mesh_create(allocator, S3DUT_MESH_SPHERE, nverts, ntris, &sphere); if(res != RES_OK) goto error; @@ -217,62 +253,3 @@ error: } goto exit; } - - -/******************************************************************************* - * Exported function - ******************************************************************************/ -res_T -s3dut_create_sphere - (struct mem_allocator* allocator, - const double radius, - const unsigned nslices, - const unsigned nstacks, - struct s3dut_mesh** mesh) -{ - if(radius <= 0 || nslices < 3 || nstacks < 2 || !mesh) { - return RES_BAD_ARG; - } - - return s3dut_create_truncated_sphere_do - (allocator, radius, nslices, nstacks, NULL, 0, mesh); -} - -res_T -s3dut_create_hemisphere -(struct mem_allocator* allocator, - const double radius, - const unsigned nslices, - const unsigned nstacks, - struct s3dut_mesh** mesh) -{ - double z_range[2]; - - if(radius <= 0 || nslices < 2 || nstacks < 2 || !mesh) { - return RES_BAD_ARG; - } - - z_range[0] = 0; - z_range[1] = +radius; - return s3dut_create_truncated_sphere_do - (allocator, radius, nslices, nstacks, z_range, 0, mesh); -} - -res_T -s3dut_create_truncated_sphere - (struct mem_allocator* allocator, - const double radius, - const unsigned nslices, - const unsigned nstacks, - const double z_range[2], - const unsigned close_ends, - struct s3dut_mesh** mesh) -{ - if(radius <= 0 || nslices < 3 || nstacks < 2 || !mesh - || (z_range && z_range[0] >= z_range[1])) { - return RES_BAD_ARG; - } - - return s3dut_create_truncated_sphere_do - (allocator, radius, nslices, nstacks, z_range, close_ends, mesh); -} diff --git a/src/test_s3dut_hemisphere.c b/src/test_s3dut_hemisphere.c @@ -32,20 +32,20 @@ main(int argc, char** argv) CHECK(s3dut_create_hemisphere(NULL, 0, 0, 0, NULL), RES_BAD_ARG); CHECK(s3dut_create_hemisphere(NULL, 1, 0, 0, NULL), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(NULL, 0, 2, 0, NULL), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(NULL, 1, 2, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(NULL, 0, 3, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(NULL, 1, 3, 0, NULL), RES_BAD_ARG); CHECK(s3dut_create_hemisphere(NULL, 0, 0, 2, NULL), RES_BAD_ARG); CHECK(s3dut_create_hemisphere(NULL, 1, 0, 2, NULL), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(NULL, 0, 2, 2, NULL), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(NULL, 1, 2, 2, NULL), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(NULL, 0, 3, 2, NULL), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(NULL, 1, 3, 2, NULL), RES_BAD_ARG); CHECK(s3dut_create_hemisphere(NULL, 0, 0, 0, &msh), RES_BAD_ARG); CHECK(s3dut_create_hemisphere(NULL, 1, 0, 0, &msh), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(NULL, 0, 2, 0, &msh), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(NULL, 1, 2, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(NULL, 0, 3, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(NULL, 1, 3, 0, &msh), RES_BAD_ARG); CHECK(s3dut_create_hemisphere(NULL, 0, 0, 2, &msh), RES_BAD_ARG); CHECK(s3dut_create_hemisphere(NULL, 1, 0, 2, &msh), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(NULL, 0, 2, 2, &msh), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(NULL, 1, 2, 2, &msh), RES_OK); + CHECK(s3dut_create_hemisphere(NULL, 0, 3, 2, &msh), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(NULL, 1, 3, 2, &msh), RES_OK); CHECK(s3dut_mesh_ref_get(NULL), RES_BAD_ARG); CHECK(s3dut_mesh_ref_get(msh), RES_OK); @@ -53,12 +53,12 @@ main(int argc, char** argv) CHECK(s3dut_mesh_ref_put(msh), RES_OK); CHECK(s3dut_mesh_ref_put(msh), RES_OK); - CHECK(s3dut_create_hemisphere(&allocator, 1, 2, 2, &msh), RES_OK); + CHECK(s3dut_create_hemisphere(&allocator, 1, 3, 2, &msh), RES_OK); CHECK(s3dut_mesh_ref_put(msh), RES_OK); CHECK(s3dut_create_hemisphere(&allocator, 1, 1, 2, &msh), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(&allocator, 1, 2, 1, &msh), RES_BAD_ARG); - CHECK(s3dut_create_hemisphere(&allocator,-1, 2, 2, &msh), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(&allocator, 1, 3, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_hemisphere(&allocator,-1, 3, 2, &msh), RES_BAD_ARG); CHECK(s3dut_create_hemisphere(&allocator, 1, 32, 16, &msh), RES_OK); CHECK(s3dut_mesh_get_data(NULL, NULL), RES_BAD_ARG);