commit 0297c0ebf967a16e8ce31171d87b5b4b00b22a42
parent 120c8aec968a4e5f91ea2dec338064223c45f704
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 7 Jan 2016 15:22:29 +0100
Implement the stl to Star-3D functions
Diffstat:
| M | src/s3dstl.c | | | 110 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 110 insertions(+), 0 deletions(-)
diff --git a/src/s3dstl.c b/src/s3dstl.c
@@ -28,6 +28,7 @@
#include "s3dstl.h"
+#include <rsys/float3.h>
#include <rsys/logger.h>
#include <rsys/mem_allocator.h>
#include <rsys/ref_count.h>
@@ -50,6 +51,87 @@ struct s3dstl {
* Helper functions
******************************************************************************/
static void
+get_position(const unsigned ivert, float pos[3], void* ctx)
+{
+ const struct sstl_desc* desc = ctx;
+ ASSERT(ctx && pos && ivert < desc->vertices_count);
+ f3_set(pos, desc->vertices + ivert * 3);
+}
+
+static void
+get_indices(const unsigned itri, unsigned ids[3], void* ctx)
+{
+ const struct sstl_desc* desc = ctx;
+ const unsigned* indices;
+ ASSERT(ctx && ids && itri < desc->triangles_count);
+ indices = desc->indices + itri*3;
+ ids[0] = indices[0];
+ ids[1] = indices[1];
+ ids[2] = indices[2];
+}
+
+static void
+log_error(const struct s3dstl* s3dstl, const char* msg, ...)
+{
+ va_list vargs_list;
+ ASSERT(s3dstl && msg);
+ if(s3dstl->verbose) {
+ res_T res; (void)res;
+ va_start(vargs_list, msg);
+ res = logger_vprint(s3dstl->logger, LOG_ERROR, msg, vargs_list);
+ ASSERT(res == RES_OK);
+ va_end(vargs_list);
+ }
+}
+
+static res_T
+shape_create(struct s3dstl* s3dstl, const char* filename)
+{
+ struct s3d_vertex_data vertex_data;
+ struct s3d_shape* shape = NULL;
+ struct sstl_desc desc;
+ res_T res = RES_OK;
+ ASSERT(s3dstl && filename);
+
+ res = sstl_get_desc(s3dstl->sstl, &desc);
+ if(res != RES_OK) {
+ log_error(s3dstl, "%s: couldn't retrieve the STL descriptor.\n", filename);
+ goto error;
+ }
+
+ if(!desc.triangles_count) goto exit;
+
+ res = s3d_shape_create_mesh(s3dstl->s3d, &shape);
+ if(res != RES_OK) {
+ log_error(s3dstl, "%s: couldn't create the Star-3D shape.\n", filename);
+ goto error;
+ }
+
+ vertex_data.usage = S3D_POSITION;
+ vertex_data.type = S3D_FLOAT3;
+ vertex_data.get = get_position;
+
+ res = s3d_mesh_setup_indexed_vertices(shape, (unsigned)desc.triangles_count,
+ get_indices, (unsigned)desc.vertices_count, &vertex_data, 1, &desc);
+ if(res != RES_OK) {
+ log_error(s3dstl, "%s: couldn't setup the data of the Star-3D shape.\n",
+ filename);
+ goto error;
+ }
+
+ if(s3dstl->shape) {
+ S3D(shape_ref_put(s3dstl->shape));
+ s3dstl->shape = shape;
+ }
+
+exit:
+ return res;
+error:
+ if(shape) S3D(shape_ref_put(shape));
+ goto exit;
+}
+
+static void
release_s3dstl(ref_T* ref)
{
struct s3dstl* s3dstl;
@@ -153,3 +235,31 @@ s3dstl_get_sstl(struct s3dstl* s3dstl, struct sstl** sstl)
return RES_OK;
}
+res_T
+s3dstl_load(struct s3dstl* s3dstl, const char* filename)
+{
+ res_T res;
+ if(!s3dstl || !filename) return RES_BAD_ARG;
+ res = sstl_load(s3dstl->sstl, filename);
+ if(res != RES_OK) return res;
+ return shape_create(s3dstl, filename);
+}
+
+res_T
+s3dstl_load_stream(struct s3dstl* s3dstl, FILE* stream)
+{
+ res_T res;
+ if(!s3dstl || !stream) return RES_BAD_ARG;
+ res = sstl_load_stream(s3dstl->sstl, stream);
+ if(res != RES_OK) return res;
+ return shape_create(s3dstl, "STREAM");
+}
+
+res_T
+s3dstl_get_shape(struct s3dstl* s3dstl, struct s3d_shape** shape)
+{
+ if(!s3dstl || !shape) return RES_BAD_ARG;
+ *shape = s3dstl->shape;
+ return RES_OK;
+}
+