libstl: improve rapidity by using C style cast to decode memory

This commit is contained in:
Hugues Delorme 2013-02-21 14:53:41 +01:00
parent aebea13385
commit f71c061328
4 changed files with 37 additions and 82 deletions

View File

@ -1,6 +1,7 @@
#include "stlb_read.h"
#include "../endian.h"
#include "stlb_triangle.h"
struct _internal_foug_stlb_geom_input
{
@ -44,8 +45,7 @@ static void foug_stlb_read_facets(foug_stlb_geom_input_t* geom_input,
uint8_t* buffer,
uint32_t facet_count)
{
foug_stl_triangle_t triangle;
uint16_t attr_byte_count;
foug_stlb_triangle_t triangle;
uint32_t buffer_offset;
uint32_t i_facet;
@ -54,32 +54,12 @@ static void foug_stlb_read_facets(foug_stlb_geom_input_t* geom_input,
buffer_offset = 0;
for (i_facet = 0; i_facet < facet_count; ++i_facet) {
/* Read normal */
triangle.normal.x = foug_decode_real32_le(buffer + buffer_offset);
triangle.normal.y = foug_decode_real32_le(buffer + 1*sizeof(foug_real32_t) + buffer_offset);
triangle.normal.z = foug_decode_real32_le(buffer + 2*sizeof(foug_real32_t) + buffer_offset);
/* Read vertex1 */
triangle.v1.x = foug_decode_real32_le(buffer + 3*sizeof(foug_real32_t) + buffer_offset);
triangle.v1.y = foug_decode_real32_le(buffer + 4*sizeof(foug_real32_t) + buffer_offset);
triangle.v1.z = foug_decode_real32_le(buffer + 5*sizeof(foug_real32_t) + buffer_offset);
/* Read vertex2 */
triangle.v2.x = foug_decode_real32_le(buffer + 6*sizeof(foug_real32_t) + buffer_offset);
triangle.v2.y = foug_decode_real32_le(buffer + 7*sizeof(foug_real32_t) + buffer_offset);
triangle.v2.z = foug_decode_real32_le(buffer + 8*sizeof(foug_real32_t) + buffer_offset);
/* Read vertex3 */
triangle.v3.x = foug_decode_real32_le(buffer + 9*sizeof(foug_real32_t) + buffer_offset);
triangle.v3.y = foug_decode_real32_le(buffer + 10*sizeof(foug_real32_t) + buffer_offset);
triangle.v3.z = foug_decode_real32_le(buffer + 11*sizeof(foug_real32_t) + buffer_offset);
/* Attribute byte count */
attr_byte_count = foug_decode_uint16_le(buffer + 12*sizeof(foug_real32_t) + buffer_offset);
/* Add triangle */
(*(geom_input->manip.process_next_triangle_func))(geom_input, &triangle, attr_byte_count);
/* Decode data */
triangle = *((foug_stlb_triangle_t*)(buffer + buffer_offset));
buffer_offset += FOUG_STLB_TRIANGLE_SIZE;
/* Declare triangle */
(*(geom_input->manip.process_next_triangle_func))(geom_input, &triangle);
}
}
@ -134,7 +114,7 @@ int foug_stlb_read(foug_stlb_read_args_t args)
break; /* Exit if no facet to read */
if (foug_stlb_no_error(error)) {
foug_stlb_read_facets_one_go(args.geom_input, args.buffer, facet_count_read);
foug_stlb_read_facets(args.geom_input, args.buffer, facet_count_read);
accum_facet_count_read += facet_count_read;
if (foug_task_control_is_stop_requested(args.task_control)) {
error = FOUG_STLB_READ_TASK_STOPPED_ERROR;

View File

@ -2,27 +2,24 @@
#define FOUG_C_LIBSTL_STLB_READ_H
#include "stl_global.h"
#include "stl_triangle.h"
#include "stlb_triangle.h"
#include "../stream.h"
#include "../task_control.h"
/* foug_stlb_geom_input : opaque structure */
typedef struct _internal_foug_stlb_geom_input foug_stlb_geom_input_t;
typedef void (*foug_stlb_geom_input_process_header_func_t)(foug_stlb_geom_input_t*, const uint8_t*);
typedef void (*foug_stlb_geom_input_begin_triangles_func_t)(foug_stlb_geom_input_t*, uint32_t);
typedef void (*foug_stlb_geom_input_process_next_triangle_func_t)(foug_stlb_geom_input_t*,
const foug_stl_triangle_t*,
uint16_t);
typedef void (*foug_stlb_geom_input_end_triangles_func_t)(foug_stlb_geom_input_t*);
typedef struct
/* foug_stlb_geom_input_manip */
typedef struct foug_stlb_geom_input_manip
{
foug_stlb_geom_input_process_header_func_t process_header_func;
foug_stlb_geom_input_begin_triangles_func_t begin_triangles_func;
foug_stlb_geom_input_process_next_triangle_func_t process_next_triangle_func;
foug_stlb_geom_input_end_triangles_func_t end_triangles_func;
void (*process_header_func)(foug_stlb_geom_input_t*, const uint8_t*);
void (*begin_triangles_func)(foug_stlb_geom_input_t*, uint32_t);
void (*process_next_triangle_func)(foug_stlb_geom_input_t*, const foug_stlb_triangle_t*);
void (*end_triangles_func)(foug_stlb_geom_input_t*);
} foug_stlb_geom_input_manip_t;
/* foug_stlb_geom_input : services */
FOUG_DATAEX_LIBSTL_EXPORT
foug_stlb_geom_input_t* foug_stlb_geom_input_create(foug_malloc_func_t func,
void* data,
@ -30,10 +27,12 @@ foug_stlb_geom_input_t* foug_stlb_geom_input_create(foug_malloc_func_t func,
FOUG_DATAEX_LIBSTL_EXPORT
void* foug_stlb_geom_input_get_cookie(const foug_stlb_geom_input_t* geom);
FOUG_DATAEX_LIBSTL_EXPORT
void foug_stlb_geom_input_set_cookie(foug_stlb_geom_input_t* geom, void* data);
typedef struct
/* foug_stlb_read_args */
typedef struct foug_stlb_read_args
{
foug_stlb_geom_input_t* geom_input;
foug_stream_t* stream;
@ -45,6 +44,7 @@ typedef struct
FOUG_DATAEX_LIBSTL_EXPORT
int foug_stlb_read(foug_stlb_read_args_t args);
/* Error codes returned by foug_stlb_read() */
#define FOUG_STLB_READ_NO_ERROR 0
#define FOUG_STLB_READ_NULL_GEOM_INPUT_ERROR 1
#define FOUG_STLB_READ_NULL_STREAM_ERROR 2

View File

@ -1,5 +1,6 @@
#include "stlb_write.h"
#include "stlb_triangle.h"
#include "../endian.h"
#include <string.h>
@ -46,42 +47,18 @@ static void foug_stlb_write_facets(const foug_stlb_geom_output_t* geom_output,
uint32_t ifacet_start,
uint32_t facet_count)
{
foug_stl_triangle_t triangle;
uint16_t attr_byte_count;
foug_stlb_triangle_t triangle;
uint32_t buffer_offset;
uint32_t i_facet;
if (geom_output->manip.get_triangle_func == NULL)
return;
attr_byte_count = 0;
buffer_offset = 0;
for (i_facet = ifacet_start; i_facet < (ifacet_start + facet_count); ++i_facet) {
(*(geom_output->manip.get_triangle_func))(geom_output, i_facet, &triangle, &attr_byte_count);
/* Normal */
foug_encode_real32_le(triangle.normal.x, buffer + buffer_offset);
foug_encode_real32_le(triangle.normal.y, buffer + 1*sizeof(foug_real32_t) + buffer_offset);
foug_encode_real32_le(triangle.normal.z, buffer + 2*sizeof(foug_real32_t) + buffer_offset);
/* Vertex1 */
foug_encode_real32_le(triangle.v1.x, buffer + 3*sizeof(foug_real32_t) + buffer_offset);
foug_encode_real32_le(triangle.v1.y, buffer + 4*sizeof(foug_real32_t) + buffer_offset);
foug_encode_real32_le(triangle.v1.z, buffer + 5*sizeof(foug_real32_t) + buffer_offset);
/* Vertex2 */
foug_encode_real32_le(triangle.v2.x, buffer + 6*sizeof(foug_real32_t) + buffer_offset);
foug_encode_real32_le(triangle.v2.y, buffer + 7*sizeof(foug_real32_t) + buffer_offset);
foug_encode_real32_le(triangle.v2.z, buffer + 8*sizeof(foug_real32_t) + buffer_offset);
/* Vertex3 */
foug_encode_real32_le(triangle.v3.x, buffer + 9*sizeof(foug_real32_t) + buffer_offset);
foug_encode_real32_le(triangle.v3.y, buffer + 10*sizeof(foug_real32_t) + buffer_offset);
foug_encode_real32_le(triangle.v3.z, buffer + 11*sizeof(foug_real32_t) + buffer_offset);
/* Attribute byte count */
foug_encode_uint16_le(attr_byte_count, buffer + 12*sizeof(foug_real32_t) + buffer_offset);
(*(geom_output->manip.get_triangle_func))(geom_output, i_facet, &triangle);
memcpy(buffer + buffer_offset, &triangle, FOUG_STLB_TRIANGLE_SIZE);
buffer_offset += FOUG_STLB_TRIANGLE_SIZE;
} /* end for */
}
@ -155,8 +132,7 @@ int foug_stlb_write(foug_stlb_write_args_t args)
error = FOUG_STLB_WRITE_TASK_STOPPED_ERROR;
}
else {
foug_task_control_set_progress(args.task_control,
(foug_real32_t)(i_facet + 1));
foug_task_control_set_progress(args.task_control, (foug_real32_t)(i_facet + 1));
}
}
} /* end for */

View File

@ -2,26 +2,22 @@
#define FOUG_C_LIBSTL_STLB_WRITE_H
#include "stl_global.h"
#include "stl_triangle.h"
#include "stlb_triangle.h"
#include "../stream.h"
#include "../task_control.h"
/* foug_stlb_geom_output : opaque structure */
typedef struct _internal_foug_stlb_geom_output foug_stlb_geom_output_t;
typedef void (*foug_stlb_geom_output_get_header_func_t)(const foug_stlb_geom_output_t*, uint8_t*);
typedef uint32_t (*foug_stlb_geom_output_get_triangle_count_func_t)(const foug_stlb_geom_output_t*);
typedef void (*foug_stlb_geom_output_get_triangle_func_t)(const foug_stlb_geom_output_t*,
uint32_t,
foug_stl_triangle_t*,
uint16_t*);
typedef struct
/* foug_stlb_geom_output_manip */
typedef struct foug_stlb_geom_output_manip
{
foug_stlb_geom_output_get_header_func_t get_header_func;
foug_stlb_geom_output_get_triangle_count_func_t get_triangle_count_func;
foug_stlb_geom_output_get_triangle_func_t get_triangle_func;
void (*get_header_func)(const foug_stlb_geom_output_t*, uint8_t*);
uint32_t (*get_triangle_count_func)(const foug_stlb_geom_output_t*);
void (*get_triangle_func)(const foug_stlb_geom_output_t*, uint32_t, foug_stlb_triangle_t*);
} foug_stlb_geom_output_manip_t;
/* foug_stlb_geom_output : services */
FOUG_DATAEX_LIBSTL_EXPORT
foug_stlb_geom_output_t* foug_stlb_geom_output_create(foug_malloc_func_t func,
void* data,
@ -29,10 +25,12 @@ foug_stlb_geom_output_t* foug_stlb_geom_output_create(foug_malloc_func_t func,
FOUG_DATAEX_LIBSTL_EXPORT
void* foug_stlb_geom_output_get_cookie(const foug_stlb_geom_output_t* geom);
FOUG_DATAEX_LIBSTL_EXPORT
void foug_stlb_geom_output_set_cookie(foug_stlb_geom_output_t* geom, void* data);
typedef struct
/* foug_stlb_write_args */
typedef struct foug_stlb_write_args
{
foug_stlb_geom_output_t* geom_output;
foug_stream_t* stream;
@ -44,6 +42,7 @@ typedef struct
FOUG_DATAEX_LIBSTL_EXPORT
int foug_stlb_write(foug_stlb_write_args_t args);
/* Error codes returned by foug_stlb_write() */
#define FOUG_STLB_WRITE_NO_ERROR 0
#define FOUG_STLB_WRITE_NULL_GEOM_OUTPUT_ERROR 1
#define FOUG_STLB_WRITE_NULL_STREAM_ERROR 2