star-3dut

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

commit 0423521d6c797b720fd401dd8caac8ccd9ae20c2
parent 0c1ee97c60de54bc215ae7fbe028b3e5840904f7
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 10 Oct 2017 12:39:03 +0200

Restaure s3dut_create_cylinder function as it was previously.

To avoid breaking s3dut API.
Introduce a new s3dut_create_thin_cylinder function to offer the new
param to create non-closed cylinders.
Add the corresponding tests.

Diffstat:
Mcmake/CMakeLists.txt | 1+
Msrc/s3dut.h | 21++++++++++++++++++---
Msrc/s3dut_cylinder.c | 13+++++++++++++
Msrc/test_s3dut_cylinder.c | 79+++++++++++++++++++++++++++++++++++++++----------------------------------------
Asrc/test_s3dut_thin_cylinder.c | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 164 insertions(+), 43 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -82,6 +82,7 @@ if(NOT NO_TEST) new_test(test_s3dut_cuboid) new_test(test_s3dut_cylinder) + new_test(test_s3dut_thin_cylinder) new_test(test_s3dut_thick_cylinder) new_test(test_s3dut_hemisphere) new_test(test_s3dut_sphere) diff --git a/src/s3dut.h b/src/s3dut.h @@ -80,12 +80,27 @@ s3dut_create_sphere /* Create a triangulated cylinder centered in 0 discretized in `nslices' around * the Z axis and `nstacks' along the Z axis. The top and the bottom ends of - * the cylinder can be closed or not with a triangle fan whose center is on the + * the cylinder are closed with triangle fans whose center is on the Z axis. + * Face vertices are CCW ordered with respect to the cylinder center, i.e. they + * are CW ordered from the outside point of view. */ +S3DUT_API res_T +s3dut_create_cylinder + (struct mem_allocator* allocator, /* May be NULL <=> use default allocator */ + const double radius, /* In ]0, INF) */ + const double height, /* In ]0, INF) */ + const unsigned nslices, /* # subdivisions around Z axis in [3, INF) */ + const unsigned nstacks, /* # subdivision along Z axis in [1, INF) */ + struct s3dut_mesh** cylinder); + +/* Create a triangulated cylinder centered in 0 discretized in `nslices' around + * the Z axis and `nstacks' along the Z axis. The top and the bottom ends of + * the cylinder can be closed or not with a triangle fan whose center is on the * Z axis, according to the `close_ends' argument bit mask. Face vertices are * CCW ordered with respect to the cylinder center, i.e. they are CW ordered - * from the outside point of view. */ + * from the outside point of view. + * Similar to s3dut_create_cylinder with the ability to close ends or not. */ S3DUT_API res_T -s3dut_create_cylinder +s3dut_create_thin_cylinder (struct mem_allocator* allocator, /* May be NULL <=> use default allocator */ const double radius, /* In ]0, INF) */ const double height, /* In ]0, INF) */ diff --git a/src/s3dut_cylinder.c b/src/s3dut_cylinder.c @@ -165,6 +165,19 @@ s3dut_create_cylinder const double height, const unsigned nslices, const unsigned nstacks, + struct s3dut_mesh** mesh) +{ + return s3dut_create_thin_cylinder + (allocator, radius, height, nslices, nstacks, 0, mesh); +} + +res_T +s3dut_create_thin_cylinder + (struct mem_allocator* allocator, + const double radius, + const double height, + const unsigned nslices, + const unsigned nstacks, const unsigned close_ends, struct s3dut_mesh** mesh) { diff --git a/src/test_s3dut_cylinder.c b/src/test_s3dut_cylinder.c @@ -25,51 +25,50 @@ main(int argc, char** argv) (void)argc, (void)argv; CHECK(mem_init_proxy_allocator(&allocator, &mem_default_allocator), RES_OK); - #define CR_CYL s3dut_create_cylinder - CHECK(CR_CYL(NULL, 0, 0, 0, 0, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 0, 0, 0, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 1, 0, 0, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 1, 0, 0, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 0, 3, 0, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 0, 3, 0, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 1, 3, 0, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 1, 3, 0, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 0, 0, 1, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 0, 0, 1, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 1, 0, 1, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 1, 0, 1, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 0, 3, 1, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 0, 3, 1, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 1, 3, 1, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 1, 3, 1, 0, NULL), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 0, 0, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 0, 0, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 1, 0, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 1, 0, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 0, 3, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 0, 3, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 1, 3, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 1, 3, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 0, 0, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 0, 0, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 1, 0, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 1, 0, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 0, 3, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 0, 3, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 0, 1, 3, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(NULL, 1, 1, 3, 1, 0, &msh), RES_OK); + + CHECK(s3dut_create_cylinder(NULL, 0, 0, 0, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 0, 0, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 1, 0, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 1, 0, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 0, 3, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 0, 3, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 1, 3, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 1, 3, 0, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 0, 0, 1, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 0, 0, 1, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 1, 0, 1, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 1, 0, 1, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 0, 3, 1, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 0, 3, 1, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 1, 3, 1, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 1, 3, 1, NULL), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 0, 0, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 0, 0, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 1, 0, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 1, 0, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 0, 3, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 0, 3, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 1, 3, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 1, 3, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 0, 0, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 0, 0, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 1, 0, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 1, 0, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 0, 3, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 0, 3, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 0, 1, 3, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(NULL, 1, 1, 3, 1, &msh), RES_OK); CHECK(s3dut_mesh_ref_put(msh), RES_OK); - CHECK(CR_CYL(&allocator, 1, 1, 3, 1, 0, &msh), RES_OK); + CHECK(s3dut_create_cylinder(&allocator, 1, 1, 3, 1, &msh), RES_OK); CHECK(s3dut_mesh_ref_put(msh), RES_OK); - CHECK(CR_CYL(&allocator,-1, 1, 3, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(&allocator, 1,-1, 3, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(&allocator, 1, 1, 2, 1, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(&allocator, 1, 1, 3, 0, 0, &msh), RES_BAD_ARG); - CHECK(CR_CYL(&allocator, 1, 2, 16, 4, S3DUT_END_BOTTOM, &msh), RES_OK); - #undef CR_CYL + CHECK(s3dut_create_cylinder(&allocator, -1, 1, 3, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(&allocator, 1, -1, 3, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(&allocator, 1, 1, 2, 1, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(&allocator, 1, 1, 3, 0, &msh), RES_BAD_ARG); + CHECK(s3dut_create_cylinder(&allocator, 1, 2, 16, 4, &msh), RES_OK); CHECK(s3dut_mesh_get_data(msh, &data), RES_OK); dump_mesh_data(stdout, &data); diff --git a/src/test_s3dut_thin_cylinder.c b/src/test_s3dut_thin_cylinder.c @@ -0,0 +1,93 @@ +/* Copyright (C) |Meso|Star> 2016-2017 (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 "s3dut.h" +#include "test_s3dut_utils.h" + +int +main(int argc, char** argv) +{ + struct mem_allocator allocator; + struct s3dut_mesh* msh; + struct s3dut_mesh_data data; + (void)argc, (void)argv; + + CHECK(mem_init_proxy_allocator(&allocator, &mem_default_allocator), RES_OK); + + #define CR_CYL s3dut_create_thin_cylinder + + CHECK(CR_CYL(NULL, 0, 0, 0, 0, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 0, 0, 0, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 1, 0, 0, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 1, 0, 0, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 0, 3, 0, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 0, 3, 0, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 1, 3, 0, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 1, 3, 0, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 0, 0, 1, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 0, 0, 1, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 1, 0, 1, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 1, 0, 1, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 0, 3, 1, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 0, 3, 1, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 1, 3, 1, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 1, 3, 1, 0, NULL), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 0, 0, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 0, 0, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 1, 0, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 1, 0, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 0, 3, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 0, 3, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 1, 3, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 1, 3, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 0, 0, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 0, 0, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 1, 0, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 1, 0, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 0, 3, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 0, 3, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 0, 1, 3, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(NULL, 1, 1, 3, 1, 0, &msh), RES_OK); + CHECK(s3dut_mesh_ref_put(msh), RES_OK); + + CHECK(CR_CYL(&allocator, 1, 1, 3, 1, 0, &msh), RES_OK); + CHECK(s3dut_mesh_ref_put(msh), RES_OK); + + CHECK(CR_CYL(&allocator, 1, 1, 3, 1, 0, &msh), RES_OK); + CHECK(s3dut_mesh_ref_put(msh), RES_OK); + CHECK(CR_CYL(&allocator, 1, 1, 3, 1, S3DUT_END_TOP, &msh), RES_OK); + CHECK(s3dut_mesh_ref_put(msh), RES_OK); + CHECK(CR_CYL(&allocator, 1, 1, 3, 1, S3DUT_END_BOTTOM, &msh), RES_OK); + CHECK(s3dut_mesh_ref_put(msh), RES_OK); + CHECK(CR_CYL(&allocator, 1, 1, 3, 1, + S3DUT_END_TOP | S3DUT_END_BOTTOM, &msh), RES_OK); + CHECK(s3dut_mesh_ref_put(msh), RES_OK); + + CHECK(CR_CYL(&allocator, -1, 1, 3, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(&allocator, 1, -1, 3, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(&allocator, 1, 1, 2, 1, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(&allocator, 1, 1, 3, 0, 0, &msh), RES_BAD_ARG); + CHECK(CR_CYL(&allocator, 1, 2, 16, 4, S3DUT_END_BOTTOM, &msh), RES_OK); + + CHECK(s3dut_mesh_get_data(msh, &data), RES_OK); + dump_mesh_data(stdout, &data); + CHECK(s3dut_mesh_ref_put(msh), RES_OK); + + check_memory_allocator(&allocator); + mem_shutdown_proxy_allocator(&allocator); + CHECK(mem_allocated_size(), 0); + return 0; +} +