gmio_stl/internal: improve STL ascii output implementation
This commit is contained in:
parent
39132c0b3f
commit
64e2456728
@ -50,13 +50,7 @@ enum { GMIO_STLA_FACET_SIZE = 321 };
|
|||||||
enum { GMIO_STLA_FACET_SIZE_P2 = 512 };
|
enum { GMIO_STLA_FACET_SIZE_P2 = 512 };
|
||||||
enum { GMIO_STLA_SOLID_NAME_MAX_LEN = 512 };
|
enum { GMIO_STLA_SOLID_NAME_MAX_LEN = 512 };
|
||||||
|
|
||||||
GMIO_INLINE char* gmio_write_string(char* buffer, const char* str)
|
/* Fucntions for raw strings(ie. "const char*") */
|
||||||
{
|
|
||||||
const char* safe_str = str != NULL ? str : "";
|
|
||||||
const size_t len = strlen(safe_str);
|
|
||||||
strncpy(buffer, safe_str, len);
|
|
||||||
return buffer + len;
|
|
||||||
}
|
|
||||||
|
|
||||||
GMIO_INLINE char* gmio_write_eol(char* buffer)
|
GMIO_INLINE char* gmio_write_eol(char* buffer)
|
||||||
{
|
{
|
||||||
@ -64,24 +58,30 @@ GMIO_INLINE char* gmio_write_eol(char* buffer)
|
|||||||
return buffer + 1;
|
return buffer + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
GMIO_INLINE char* gmio_write_string_eol(char* buffer, const char* str)
|
GMIO_INLINE char* gmio_write_rawstr(char* buffer, const char* str)
|
||||||
{
|
{
|
||||||
buffer = gmio_write_string(buffer, str);
|
/* pre-condition: str must not be NULL */
|
||||||
return gmio_write_eol(buffer);
|
#if 0
|
||||||
|
const size_t len = strlen(str);
|
||||||
|
strncpy(buffer, str, len);
|
||||||
|
return buffer + len;
|
||||||
|
#else
|
||||||
|
/* Not that good :
|
||||||
|
* the compiler cannot optimize copy for the target architecture
|
||||||
|
*/
|
||||||
|
while (*str != 0) {
|
||||||
|
*buffer = *str;
|
||||||
|
++buffer;
|
||||||
|
++str;
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*static char* gmio_write_space(char* buffer)
|
GMIO_INLINE char* gmio_write_rawstr_eol(char* buffer, const char* str)
|
||||||
{
|
{
|
||||||
*buffer = ' ';
|
buffer = gmio_write_rawstr(buffer, str);
|
||||||
return buffer + 1;
|
return gmio_write_eol(buffer);
|
||||||
}*/
|
|
||||||
|
|
||||||
GMIO_INLINE char* gmio_write_nspaces(char* buffer, int n)
|
|
||||||
{
|
|
||||||
const int offset = n;
|
|
||||||
while (n > 0)
|
|
||||||
*(buffer + (--n)) = ' ';
|
|
||||||
return buffer + offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GMIO_INLINE char gmio_float_text_format_to_specifier(
|
GMIO_INLINE char gmio_float_text_format_to_specifier(
|
||||||
@ -120,7 +120,8 @@ GMIO_INLINE char* gmio_write_coords(
|
|||||||
coords_format, coords->x, coords->y, coords->z);
|
coords_format, coords->x, coords->y, coords->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gmio_bool_t gmio_transfer_flush_buffer(gmio_transfer_t* trsf, size_t n)
|
GMIO_INLINE gmio_bool_t gmio_transfer_flush_buffer(
|
||||||
|
gmio_transfer_t* trsf, size_t n)
|
||||||
{
|
{
|
||||||
const size_t write_count =
|
const size_t write_count =
|
||||||
gmio_stream_write(&trsf->stream, trsf->memblock.ptr, sizeof(char), n);
|
gmio_stream_write(&trsf->stream, trsf->memblock.ptr, sizeof(char), n);
|
||||||
@ -130,7 +131,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,
|
||||||
const gmio_stl_write_options_t *options)
|
const gmio_stl_write_options_t* options)
|
||||||
{
|
{
|
||||||
/* 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;
|
||||||
@ -138,8 +139,10 @@ int gmio_stla_write(
|
|||||||
trsf != NULL ?
|
trsf != NULL ?
|
||||||
gmio_size_to_uint32(trsf->memblock.size / GMIO_STLA_FACET_SIZE_P2)
|
gmio_size_to_uint32(trsf->memblock.size / GMIO_STLA_FACET_SIZE_P2)
|
||||||
: 0;
|
: 0;
|
||||||
const char* solid_name =
|
const char* opt_solid_name =
|
||||||
options != NULL ? options->stla_solid_name : NULL;
|
options != NULL ? options->stla_solid_name : NULL;
|
||||||
|
const char* solid_name =
|
||||||
|
opt_solid_name != NULL ? opt_solid_name : "";
|
||||||
const gmio_float_text_format_t float32_format =
|
const gmio_float_text_format_t float32_format =
|
||||||
options != NULL ?
|
options != NULL ?
|
||||||
options->stla_float32_format :
|
options->stla_float32_format :
|
||||||
@ -170,9 +173,9 @@ int gmio_stla_write(
|
|||||||
gmio_float_text_format_to_specifier(float32_format);
|
gmio_float_text_format_to_specifier(float32_format);
|
||||||
char* it = coords_format;
|
char* it = coords_format;
|
||||||
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
|
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
|
||||||
it = gmio_write_nspaces(it, 2);
|
it = gmio_write_rawstr(it, " ");
|
||||||
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
|
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
|
||||||
it = gmio_write_nspaces(it, 2);
|
it = gmio_write_rawstr(it, " ");
|
||||||
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
|
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
|
||||||
*it = 0; /* Write terminating null byte */
|
*it = 0; /* Write terminating null byte */
|
||||||
/* TODO: check the "format" string can contain the given precision */
|
/* TODO: check the "format" string can contain the given precision */
|
||||||
@ -180,8 +183,8 @@ int gmio_stla_write(
|
|||||||
|
|
||||||
/* Write solid declaration */
|
/* Write solid declaration */
|
||||||
if (!write_triangles_only) {
|
if (!write_triangles_only) {
|
||||||
buffc = gmio_write_string(buffc, "solid ");
|
buffc = gmio_write_rawstr(buffc, "solid ");
|
||||||
buffc = gmio_write_string_eol(buffc, solid_name);
|
buffc = gmio_write_rawstr_eol(buffc, solid_name);
|
||||||
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)mblock_ptr))
|
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)mblock_ptr))
|
||||||
return GMIO_ERROR_STREAM;
|
return GMIO_ERROR_STREAM;
|
||||||
}
|
}
|
||||||
@ -208,23 +211,19 @@ int gmio_stla_write(
|
|||||||
++ibuffer_facet)
|
++ibuffer_facet)
|
||||||
{
|
{
|
||||||
func_get_triangle(mesh_cookie, ibuffer_facet, &tri);
|
func_get_triangle(mesh_cookie, ibuffer_facet, &tri);
|
||||||
buffc = gmio_write_string(buffc, "facet normal ");
|
buffc = gmio_write_rawstr(buffc, "facet normal ");
|
||||||
buffc = gmio_write_coords(buffc, coords_format, &tri.normal);
|
buffc = gmio_write_coords(buffc, coords_format, &tri.normal);
|
||||||
buffc = gmio_write_eol(buffc);
|
|
||||||
|
|
||||||
buffc = gmio_write_string_eol(buffc, "outer loop");
|
buffc = gmio_write_rawstr(buffc, "\nouter loop");
|
||||||
buffc = gmio_write_string(buffc, " vertex ");
|
buffc = gmio_write_rawstr(buffc, "\n vertex ");
|
||||||
buffc = gmio_write_coords(buffc, coords_format, &tri.v1);
|
buffc = gmio_write_coords(buffc, coords_format, &tri.v1);
|
||||||
buffc = gmio_write_eol(buffc);
|
buffc = gmio_write_rawstr(buffc, "\n vertex ");
|
||||||
buffc = gmio_write_string(buffc, " vertex ");
|
|
||||||
buffc = gmio_write_coords(buffc, coords_format, &tri.v2);
|
buffc = gmio_write_coords(buffc, coords_format, &tri.v2);
|
||||||
buffc = gmio_write_eol(buffc);
|
buffc = gmio_write_rawstr(buffc, "\n vertex ");
|
||||||
buffc = gmio_write_string(buffc, " vertex ");
|
|
||||||
buffc = gmio_write_coords(buffc, coords_format, &tri.v3);
|
buffc = gmio_write_coords(buffc, coords_format, &tri.v3);
|
||||||
buffc = gmio_write_eol(buffc);
|
buffc = gmio_write_rawstr(buffc, "\nendloop");
|
||||||
buffc = gmio_write_string_eol(buffc, "endloop");
|
|
||||||
|
|
||||||
buffc = gmio_write_string_eol(buffc, "endfacet");
|
buffc = gmio_write_rawstr(buffc, "\nendfacet\n");
|
||||||
} /* end for (ibuffer_facet) */
|
} /* end for (ibuffer_facet) */
|
||||||
|
|
||||||
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)mblock_ptr))
|
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)mblock_ptr))
|
||||||
@ -237,8 +236,8 @@ int gmio_stla_write(
|
|||||||
|
|
||||||
/* Write end of solid */
|
/* Write end of solid */
|
||||||
if (gmio_no_error(error) && !write_triangles_only) {
|
if (gmio_no_error(error) && !write_triangles_only) {
|
||||||
buffc = gmio_write_string(trsf->memblock.ptr, "endsolid ");
|
buffc = gmio_write_rawstr(trsf->memblock.ptr, "endsolid ");
|
||||||
buffc = gmio_write_string_eol(buffc, solid_name);
|
buffc = gmio_write_rawstr_eol(buffc, solid_name);
|
||||||
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)mblock_ptr))
|
if (!gmio_transfer_flush_buffer(trsf, buffc - (char*)mblock_ptr))
|
||||||
error = GMIO_ERROR_STREAM;
|
error = GMIO_ERROR_STREAM;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user