libstl: improve rapidity by using C style cast to decode memory
This commit is contained in:
parent
aebea13385
commit
f71c061328
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user