gmio_stl: add option "stl_write_triangles_only" and function gmio_stlb_write_header()
This commit is contained in:
parent
cad2a28f65
commit
6eb38fcd8b
@ -129,10 +129,7 @@ static gmio_bool_t gmio_transfer_flush_buffer(gmio_transfer_t* trsf, size_t n)
|
|||||||
int gmio_stla_write(
|
int gmio_stla_write(
|
||||||
gmio_transfer_t* trsf,
|
gmio_transfer_t* trsf,
|
||||||
const gmio_stl_mesh_t* mesh,
|
const gmio_stl_mesh_t* mesh,
|
||||||
/* Options */
|
const gmio_stl_write_options_t *options)
|
||||||
const char* solid_name,
|
|
||||||
gmio_float_text_format_t float32_format,
|
|
||||||
uint8_t float32_prec)
|
|
||||||
{
|
{
|
||||||
/* Constants */
|
/* Constants */
|
||||||
const uint32_t total_facet_count = mesh != NULL ? mesh->triangle_count : 0;
|
const uint32_t total_facet_count = mesh != NULL ? mesh->triangle_count : 0;
|
||||||
@ -140,6 +137,16 @@ int gmio_stla_write(
|
|||||||
trsf != NULL ?
|
trsf != NULL ?
|
||||||
gmio_size_to_uint32(trsf->buffer.size / GMIO_STLA_FACET_SIZE_P2)
|
gmio_size_to_uint32(trsf->buffer.size / GMIO_STLA_FACET_SIZE_P2)
|
||||||
: 0;
|
: 0;
|
||||||
|
const char* solid_name =
|
||||||
|
options != NULL ? options->stla_solid_name : NULL;
|
||||||
|
const gmio_float_text_format_t float32_format =
|
||||||
|
options != NULL ?
|
||||||
|
options->stla_float32_format :
|
||||||
|
GMIO_FLOAT_TEXT_FORMAT_DECIMAL_LOWERCASE;
|
||||||
|
const uint8_t float32_prec =
|
||||||
|
options != NULL ? options->stla_float32_prec : 9;
|
||||||
|
const gmio_bool_t write_triangles_only =
|
||||||
|
options != NULL ? options->stl_write_triangles_only : GMIO_FALSE;
|
||||||
/* Variables */
|
/* Variables */
|
||||||
uint32_t ifacet = 0;
|
uint32_t ifacet = 0;
|
||||||
void* buffer_ptr = trsf != NULL ? trsf->buffer.ptr : NULL;
|
void* buffer_ptr = trsf != NULL ? trsf->buffer.ptr : NULL;
|
||||||
@ -171,7 +178,7 @@ int gmio_stla_write(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Write solid declaration */
|
/* Write solid declaration */
|
||||||
{
|
if (!write_triangles_only) {
|
||||||
buffc = gmio_write_string(buffc, "solid ");
|
buffc = gmio_write_string(buffc, "solid ");
|
||||||
buffc = gmio_write_string_eol(buffc, solid_name);
|
buffc = gmio_write_string_eol(buffc, solid_name);
|
||||||
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)buffer_ptr))
|
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)buffer_ptr))
|
||||||
@ -225,7 +232,7 @@ int gmio_stla_write(
|
|||||||
} /* end for (ifacet) */
|
} /* end for (ifacet) */
|
||||||
|
|
||||||
/* Write end of solid */
|
/* Write end of solid */
|
||||||
if (gmio_no_error(error)) {
|
if (gmio_no_error(error) && !write_triangles_only) {
|
||||||
buffc = gmio_write_string(trsf->buffer.ptr, "endsolid ");
|
buffc = gmio_write_string(trsf->buffer.ptr, "endsolid ");
|
||||||
buffc = gmio_write_string_eol(buffc, solid_name);
|
buffc = gmio_write_string_eol(buffc, solid_name);
|
||||||
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)buffer_ptr))
|
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)buffer_ptr))
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#define GMIO_INTERNAL_STLA_WRITE_H
|
#define GMIO_INTERNAL_STLA_WRITE_H
|
||||||
|
|
||||||
#include "../stl_mesh.h"
|
#include "../stl_mesh.h"
|
||||||
|
#include "../stl_io_options.h"
|
||||||
#include "../../gmio_core/text_format.h"
|
#include "../../gmio_core/text_format.h"
|
||||||
#include "../../gmio_core/transfer.h"
|
#include "../../gmio_core/transfer.h"
|
||||||
|
|
||||||
@ -29,9 +30,6 @@
|
|||||||
int gmio_stla_write(
|
int gmio_stla_write(
|
||||||
gmio_transfer_t* trsf,
|
gmio_transfer_t* trsf,
|
||||||
const gmio_stl_mesh_t* mesh,
|
const gmio_stl_mesh_t* mesh,
|
||||||
/* Options */
|
const gmio_stl_write_options_t* options);
|
||||||
const char* solid_name,
|
|
||||||
gmio_float_text_format_t float32_format,
|
|
||||||
uint8_t float32_prec);
|
|
||||||
|
|
||||||
#endif /* GMIO_INTERNAL_STLA_WRITE_H */
|
#endif /* GMIO_INTERNAL_STLA_WRITE_H */
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "stl_rw_common.h"
|
#include "stl_rw_common.h"
|
||||||
#include "stlb_byte_swap.h"
|
#include "stlb_byte_swap.h"
|
||||||
#include "../stl_error.h"
|
#include "../stl_error.h"
|
||||||
|
#include "../stl_io.h"
|
||||||
|
|
||||||
#include "../../gmio_core/error.h"
|
#include "../../gmio_core/error.h"
|
||||||
#include "../../gmio_core/internal/byte_codec.h"
|
#include "../../gmio_core/internal/byte_codec.h"
|
||||||
@ -67,13 +68,14 @@ static void gmio_stlb_write_facets(
|
|||||||
int gmio_stlb_write(
|
int gmio_stlb_write(
|
||||||
gmio_transfer_t* trsf,
|
gmio_transfer_t* trsf,
|
||||||
const gmio_stl_mesh_t* mesh,
|
const gmio_stl_mesh_t* mesh,
|
||||||
/* Options */
|
const gmio_stl_write_options_t* options,
|
||||||
const uint8_t* header_data,
|
|
||||||
gmio_endianness_t byte_order)
|
gmio_endianness_t byte_order)
|
||||||
{
|
{
|
||||||
/* Constants */
|
/* Constants */
|
||||||
const uint32_t facet_count =
|
const uint32_t facet_count =
|
||||||
mesh != NULL ? mesh->triangle_count : 0;
|
mesh != NULL ? mesh->triangle_count : 0;
|
||||||
|
const gmio_bool_t write_triangles_only =
|
||||||
|
options != NULL ? options->stl_write_triangles_only : GMIO_FALSE;
|
||||||
/* Variables */
|
/* Variables */
|
||||||
void* buffer_ptr = trsf != NULL ? trsf->buffer.ptr : NULL;
|
void* buffer_ptr = trsf != NULL ? trsf->buffer.ptr : NULL;
|
||||||
gmio_stlb_readwrite_helper_t wparams = {0};
|
gmio_stlb_readwrite_helper_t wparams = {0};
|
||||||
@ -92,25 +94,15 @@ int gmio_stlb_write(
|
|||||||
wparams.facet_count = gmio_size_to_uint32(
|
wparams.facet_count = gmio_size_to_uint32(
|
||||||
trsf->buffer.size / GMIO_STLB_TRIANGLE_RAWSIZE);
|
trsf->buffer.size / GMIO_STLB_TRIANGLE_RAWSIZE);
|
||||||
|
|
||||||
/* Write header */
|
if (!write_triangles_only) {
|
||||||
if (header_data == NULL) {
|
error = gmio_stlb_write_header(
|
||||||
/* Use buffer to store an empty header (filled with zeroes) */
|
&trsf->stream,
|
||||||
memset(buffer_ptr, 0, GMIO_STLB_HEADER_SIZE);
|
byte_order,
|
||||||
header_data = (const uint8_t*)buffer_ptr;
|
options != NULL ? options->stlb_header_data : NULL,
|
||||||
|
facet_count);
|
||||||
|
if (gmio_error(error))
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
if (gmio_stream_write(&trsf->stream, header_data, GMIO_STLB_HEADER_SIZE, 1)
|
|
||||||
!= 1)
|
|
||||||
{
|
|
||||||
return GMIO_ERROR_STREAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write facet count */
|
|
||||||
if (byte_order == GMIO_ENDIANNESS_LITTLE)
|
|
||||||
gmio_encode_uint32_le(facet_count, buffer_ptr);
|
|
||||||
else
|
|
||||||
gmio_encode_uint32_be(facet_count, buffer_ptr);
|
|
||||||
if (gmio_stream_write(&trsf->stream, buffer_ptr, sizeof(uint32_t), 1) != 1)
|
|
||||||
return GMIO_ERROR_STREAM;
|
|
||||||
|
|
||||||
/* Write triangles */
|
/* Write triangles */
|
||||||
for (i_facet = 0;
|
for (i_facet = 0;
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#define GMIO_INTERNAL_STLB_WRITE_H
|
#define GMIO_INTERNAL_STLB_WRITE_H
|
||||||
|
|
||||||
#include "../stl_mesh.h"
|
#include "../stl_mesh.h"
|
||||||
|
#include "../stl_io_options.h"
|
||||||
#include "../../gmio_core/endian.h"
|
#include "../../gmio_core/endian.h"
|
||||||
#include "../../gmio_core/transfer.h"
|
#include "../../gmio_core/transfer.h"
|
||||||
|
|
||||||
@ -29,8 +30,7 @@
|
|||||||
int gmio_stlb_write(
|
int gmio_stlb_write(
|
||||||
gmio_transfer_t* trsf,
|
gmio_transfer_t* trsf,
|
||||||
const gmio_stl_mesh_t* mesh,
|
const gmio_stl_mesh_t* mesh,
|
||||||
/* Options */
|
const gmio_stl_write_options_t* options,
|
||||||
const uint8_t* header_data,
|
|
||||||
gmio_endianness_t byte_order);
|
gmio_endianness_t byte_order);
|
||||||
|
|
||||||
#endif /* GMIO_INTERNAL_STLB_WRITE_H */
|
#endif /* GMIO_INTERNAL_STLB_WRITE_H */
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "../gmio_core/error.h"
|
#include "../gmio_core/error.h"
|
||||||
#include "../gmio_core/stream.h"
|
#include "../gmio_core/stream.h"
|
||||||
#include "../gmio_core/transfer.h"
|
#include "../gmio_core/transfer.h"
|
||||||
|
#include "../gmio_core/internal/byte_codec.h"
|
||||||
#include "../gmio_core/internal/helper_stream.h"
|
#include "../gmio_core/internal/helper_stream.h"
|
||||||
|
|
||||||
int gmio_stl_read_file(
|
int gmio_stl_read_file(
|
||||||
@ -118,32 +119,20 @@ int gmio_stl_write(
|
|||||||
const gmio_stl_mesh_t *mesh,
|
const gmio_stl_mesh_t *mesh,
|
||||||
const gmio_stl_write_options_t *options)
|
const gmio_stl_write_options_t *options)
|
||||||
{
|
{
|
||||||
const uint8_t* header_data =
|
|
||||||
options != NULL ? options->stlb_header_data : NULL;
|
|
||||||
int error = GMIO_ERROR_OK;
|
int error = GMIO_ERROR_OK;
|
||||||
|
|
||||||
if (trsf != NULL) {
|
if (trsf != NULL) {
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case GMIO_STL_FORMAT_ASCII: {
|
case GMIO_STL_FORMAT_ASCII: {
|
||||||
const char* solid_name =
|
error = gmio_stla_write(trsf, mesh, options);
|
||||||
options != NULL ? options->stla_solid_name : NULL;
|
|
||||||
const gmio_float_text_format_t float_fmt =
|
|
||||||
options != NULL ? options->stla_float32_format :
|
|
||||||
GMIO_FLOAT_TEXT_FORMAT_DECIMAL_LOWERCASE;
|
|
||||||
const uint8_t float_prec =
|
|
||||||
options != NULL ? options->stla_float32_prec : 9;
|
|
||||||
error = gmio_stla_write(
|
|
||||||
trsf, mesh, solid_name, float_fmt, float_prec);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GMIO_STL_FORMAT_BINARY_BE: {
|
case GMIO_STL_FORMAT_BINARY_BE: {
|
||||||
error = gmio_stlb_write(
|
error = gmio_stlb_write(trsf, mesh, options, GMIO_ENDIANNESS_BIG);
|
||||||
trsf, mesh, header_data, GMIO_ENDIANNESS_BIG);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GMIO_STL_FORMAT_BINARY_LE: {
|
case GMIO_STL_FORMAT_BINARY_LE: {
|
||||||
error = gmio_stlb_write(
|
error = gmio_stlb_write(trsf, mesh, options, GMIO_ENDIANNESS_LITTLE);
|
||||||
trsf, mesh, header_data, GMIO_ENDIANNESS_LITTLE);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GMIO_STL_FORMAT_UNKNOWN: {
|
case GMIO_STL_FORMAT_UNKNOWN: {
|
||||||
@ -157,3 +146,36 @@ int gmio_stl_write(
|
|||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const uint8_t internal_stlb_zero_header[GMIO_STLB_HEADER_SIZE] = { 0 };
|
||||||
|
|
||||||
|
int gmio_stlb_write_header(
|
||||||
|
gmio_stream_t *stream,
|
||||||
|
gmio_endianness_t byte_order,
|
||||||
|
const uint8_t *header,
|
||||||
|
uint32_t facet_count)
|
||||||
|
{
|
||||||
|
uint8_t facet_count_bytes[sizeof(uint32_t)];
|
||||||
|
const uint8_t* non_null_header =
|
||||||
|
header != NULL ? header : &internal_stlb_zero_header[0];
|
||||||
|
|
||||||
|
/* Write 80-byte header */
|
||||||
|
if (gmio_stream_write(stream, non_null_header, GMIO_STLB_HEADER_SIZE, 1)
|
||||||
|
!= 1)
|
||||||
|
{
|
||||||
|
return GMIO_ERROR_STREAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write facet count */
|
||||||
|
if (byte_order == GMIO_ENDIANNESS_LITTLE)
|
||||||
|
gmio_encode_uint32_le(facet_count, &facet_count_bytes[0]);
|
||||||
|
else
|
||||||
|
gmio_encode_uint32_be(facet_count, &facet_count_bytes[0]);
|
||||||
|
if (gmio_stream_write(stream, &facet_count_bytes[0], sizeof(uint32_t), 1)
|
||||||
|
!= 1)
|
||||||
|
{
|
||||||
|
return GMIO_ERROR_STREAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GMIO_ERROR_OK;
|
||||||
|
}
|
||||||
|
@ -141,6 +141,27 @@ int gmio_stlb_read(
|
|||||||
gmio_stl_mesh_creator_t* creator,
|
gmio_stl_mesh_creator_t* creator,
|
||||||
gmio_endianness_t byte_order);
|
gmio_endianness_t byte_order);
|
||||||
|
|
||||||
|
/*! Writes STL binary header data to stream
|
||||||
|
*
|
||||||
|
* This functions only writes the 80-bytes header array and the count of facets
|
||||||
|
* in the mesh(with respect of the specified byte order).
|
||||||
|
*
|
||||||
|
* \param stream Output stream where is written the header data
|
||||||
|
* \param byte_order Byte order of the output STL data
|
||||||
|
* \param header 80-bytes array of header data, can be safely set to NULL (to
|
||||||
|
* generate an array of zeroes)
|
||||||
|
* \param facet_count Total count of facets (triangles) in the mesh to be
|
||||||
|
* written
|
||||||
|
*
|
||||||
|
* \return Error code (see error.h and stl_error.h)
|
||||||
|
*/
|
||||||
|
GMIO_LIBSTL_EXPORT
|
||||||
|
int gmio_stlb_write_header(
|
||||||
|
gmio_stream_t* stream,
|
||||||
|
gmio_endianness_t byte_order,
|
||||||
|
const uint8_t* header,
|
||||||
|
uint32_t facet_count);
|
||||||
|
|
||||||
GMIO_C_LINKAGE_END
|
GMIO_C_LINKAGE_END
|
||||||
|
|
||||||
#endif /* GMIO_STL_IO_H */
|
#endif /* GMIO_STL_IO_H */
|
||||||
|
@ -27,6 +27,17 @@
|
|||||||
/*! Options for gmio_stl_write() */
|
/*! Options for gmio_stl_write() */
|
||||||
struct gmio_stl_write_options
|
struct gmio_stl_write_options
|
||||||
{
|
{
|
||||||
|
/*! Flag allowing to skip writting of any header/footer data, but just
|
||||||
|
* triangles
|
||||||
|
*
|
||||||
|
* If set to \c GMIO_TRUE then :
|
||||||
|
* \li for STL ASCII format, <tt>"solid <name>"</tt> and
|
||||||
|
* <tt>"endsolid"</tt> will no be written to output stream
|
||||||
|
* \li for STL binary format, the 80 bytes header followed bt the mesh
|
||||||
|
* facet count (4bytes) will no be written to output stream
|
||||||
|
*/
|
||||||
|
gmio_bool_t stl_write_triangles_only;
|
||||||
|
|
||||||
/*! Name of the solid to appear in "solid <name> \n facet normal ..."
|
/*! Name of the solid to appear in "solid <name> \n facet normal ..."
|
||||||
*
|
*
|
||||||
* Option useful only with STL ascii format (GMIO_STL_FORMAT_ASCII).
|
* Option useful only with STL ascii format (GMIO_STL_FORMAT_ASCII).
|
||||||
@ -54,7 +65,7 @@ struct gmio_stl_write_options
|
|||||||
*/
|
*/
|
||||||
uint8_t stla_float32_prec;
|
uint8_t stla_float32_prec;
|
||||||
|
|
||||||
/*! Header data consisting of 80 bytes
|
/*! Header data whose first 80 bytes have to be written
|
||||||
*
|
*
|
||||||
* Option useful only with STL binary formats (GMIO_STL_FORMAT_BINARY_LE
|
* Option useful only with STL binary formats (GMIO_STL_FORMAT_BINARY_LE
|
||||||
* or GMIO_STL_FORMAT_BINARY_BE).
|
* or GMIO_STL_FORMAT_BINARY_BE).
|
||||||
|
Loading…
Reference in New Issue
Block a user