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:
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;
+}
+