commit 25ad7eb30c7319c11f82f3269252f35c474b3ea5
parent 2933f8aacae2b40fcda89f85a76e6deb69679e66
Author: vaplv <vaplv@free.fr>
Date: Tue, 11 Apr 2023 14:43:45 +0200
Add the and test the aw_obj_get_<positions|texcoords|normals> functions
They return a pointer to the loaded positions, texture coordinates and
normals as they are internally stored, i.e. as lists of doubles.
Diffstat:
3 files changed, 111 insertions(+), 0 deletions(-)
diff --git a/src/aw.h b/src/aw.h
@@ -225,6 +225,21 @@ aw_obj_get_vertex_data
const struct aw_obj_vertex* vertex,
struct aw_obj_vertex_data* vertex_data);
+AW_API res_T
+aw_obj_get_positions
+ (const struct aw_obj* obj,
+ const double** positions); /* List of double 4 */
+
+AW_API res_T
+aw_obj_get_texcoords
+ (const struct aw_obj* obj,
+ const double** texcoords); /* List of double 3 */
+
+AW_API res_T
+aw_obj_get_normals
+ (const struct aw_obj* obj,
+ const double** normals); /* List of double 3 */
+
/*******************************************************************************
* Mtl functions
******************************************************************************/
diff --git a/src/aw_obj.c b/src/aw_obj.c
@@ -973,6 +973,30 @@ error:
goto exit;
}
+res_T
+aw_obj_get_positions(const struct aw_obj* obj, const double** positions)
+{
+ if(!obj || !positions) return RES_BAD_ARG;
+ *positions = darray_double_cdata_get(&obj->positions);
+ return RES_OK;
+}
+
+res_T
+aw_obj_get_texcoords(const struct aw_obj* obj, const double** texcoords)
+{
+ if(!obj || !texcoords) return RES_BAD_ARG;
+ *texcoords = darray_double_cdata_get(&obj->texcoords);
+ return RES_OK;
+}
+
+res_T
+aw_obj_get_normals(const struct aw_obj* obj, const double** normals)
+{
+ if(!obj || !normals) return RES_BAD_ARG;
+ *normals = darray_double_cdata_get(&obj->normals);
+ return RES_OK;
+}
+
#ifdef COMPILER_CL
#pragma warning(pop)
#endif
diff --git a/src/test_aw_obj.c b/src/test_aw_obj.c
@@ -50,6 +50,7 @@ test_plane(struct aw_obj* obj)
struct aw_obj_named_group mtl;
struct aw_obj_vertex vertex;
struct aw_obj_vertex_data vdata;
+ const double* data = NULL;
FILE* file;
const char* mtllib;
@@ -146,6 +147,22 @@ test_plane(struct aw_obj* obj)
CHK(!strcmp(group.name, "default"));
CHK(group.face_id == 0);
CHK(group.faces_count == 1);
+
+ CHK(aw_obj_get_positions(NULL, &data) == RES_BAD_ARG);
+ CHK(aw_obj_get_positions(obj, NULL) == RES_BAD_ARG);
+ CHK(aw_obj_get_positions(obj, &data) == RES_OK);
+ CHK(d4_eq(data+0, d4(v4,0,2,0,1)));
+ CHK(d4_eq(data+4, d4(v4,0,0,0,1)));
+ CHK(d4_eq(data+8, d4(v4,2,0,0,1)));
+ CHK(d4_eq(data+12, d4(v4,2,2,0,1)));
+
+ CHK(aw_obj_get_texcoords(NULL, &data) == RES_BAD_ARG);
+ CHK(aw_obj_get_texcoords(obj, NULL) == RES_BAD_ARG);
+ CHK(aw_obj_get_texcoords(obj, &data) == RES_OK);
+ CHK(d3_eq(data+0, d3(v4,0,1,0)));
+ CHK(d3_eq(data+3, d3(v4,0,0,0)));
+ CHK(d3_eq(data+6, d3(v4,1,0,0)));
+ CHK(d3_eq(data+9, d3(v4,1,1,0)));
}
static void
@@ -181,6 +198,7 @@ test_squares(struct aw_obj* obj)
struct aw_obj_smooth_group sgroup;
struct aw_obj_vertex vertex;
struct aw_obj_vertex_data vdata;
+ const double* data = NULL;
FILE* file;
CHK(obj != NULL);
@@ -266,6 +284,24 @@ test_squares(struct aw_obj* obj)
CHK(sgroup.faces_count == 2);
CHK(aw_obj_get_mtl(obj, 0, &mtl) == RES_BAD_ARG);
+
+ CHK(aw_obj_get_positions(obj, &data) == RES_OK);
+ CHK(d4_eq(data+0, d4(v4,0,2,0,1)));
+ CHK(d4_eq(data+4, d4(v4,0,0,0,1)));
+ CHK(d4_eq(data+8, d4(v4,2,0,0,1)));
+ CHK(d4_eq(data+12, d4(v4,2,2,0,1)));
+ CHK(d4_eq(data+16, d4(v4,4,0,-1.255298,1)));
+ CHK(d4_eq(data+20, d4(v4,4,2,-1.255298,1)));
+
+ CHK(aw_obj_get_normals(NULL, &data) == RES_BAD_ARG);
+ CHK(aw_obj_get_normals(obj, NULL) == RES_BAD_ARG);
+ CHK(aw_obj_get_normals(obj, &data) == RES_OK);
+ CHK(d3_eq(data+0, d3(v4,0,0,1)));
+ CHK(d3_eq(data+3, d3(v4,0,0,1)));
+ CHK(d3_eq(data+6, d3(v4,0.276597,0,0.960986)));
+ CHK(d3_eq(data+9, d3(v4,0.276597,0,0.960986)));
+ CHK(d3_eq(data+12, d3(v4,0.531611,0,0.846988)));
+ CHK(d3_eq(data+15, d3(v4,0.531611,0,0.846988)));
}
static void
@@ -303,6 +339,7 @@ test_cube(struct aw_obj* obj)
"usemtl purple\n"
"f 2 6 7 3\n"
"# 6 elements\n";
+ double v4[4];
const char* group_names[6] =
{ "front", "back", "right", "top", "left", "bottom" };
const char* mtl_names[6] =
@@ -310,6 +347,7 @@ test_cube(struct aw_obj* obj)
struct aw_obj_desc desc;
FILE* file;
const char* mtllib;
+ const double* data;
size_t i;
CHK(obj != NULL);
@@ -380,6 +418,16 @@ test_cube(struct aw_obj* obj)
CHK(!strcmp(mtllib, "my.mtl"));
CHK(aw_obj_get_mtllib(obj, 3, &mtllib) == RES_BAD_ARG);
+ CHK(aw_obj_get_positions(obj, &data) == RES_OK);
+ CHK(d4_eq(data+0, d4(v4,0,2,2,1)));
+ CHK(d4_eq(data+4, d4(v4,0,0,2,1)));
+ CHK(d4_eq(data+8, d4(v4,2,0,2,1)));
+ CHK(d4_eq(data+12, d4(v4,2,2,2,1)));
+ CHK(d4_eq(data+16, d4(v4,0,2,0,1)));
+ CHK(d4_eq(data+20, d4(v4,0,0,0,1)));
+ CHK(d4_eq(data+24, d4(v4,2,0,0,1)));
+ CHK(d4_eq(data+28, d4(v4,2,2,0,1)));
+
CHK(aw_obj_purge(NULL) == RES_BAD_ARG);
CHK(aw_obj_purge(obj) == RES_OK);
CHK(aw_obj_get_desc(obj, &desc) == RES_OK);
@@ -442,7 +490,9 @@ test_cbox(struct aw_obj* obj)
struct aw_obj_vertex_data vdata;
struct aw_obj_named_group group;
struct aw_obj_named_group mtl;
+ double v4[4];
double tmp[3];
+ const double* data;
FILE* file;
CHK(obj != NULL);
@@ -550,6 +600,28 @@ test_cbox(struct aw_obj* obj)
CHK(aw_obj_get_vertex(obj, 19, &vertex) == RES_OK);
CHK(aw_obj_get_vertex_data(obj, &vertex, &vdata) == RES_OK);
CHK(d3_eq_eps(vdata.position, d3(tmp, -1.02, 1.99, 0.99), 1.e-6));
+
+ CHK(aw_obj_get_positions(obj, &data) == RES_OK);
+ CHK(d4_eq(data+0, d4(v4,-1.01,0,0.99,1)));
+ CHK(d4_eq(data+4, d4(v4,1,0,0.99,1)));
+ CHK(d4_eq(data+8, d4(v4,1,0,-1.04,1)));
+ CHK(d4_eq(data+12, d4(v4,-0.99,0,-1.04,1)));
+ CHK(d4_eq(data+16, d4(v4,-1.02,1.99,0.99,1)));
+ CHK(d4_eq(data+20, d4(v4,-1.02,1.99,-1.04,1)));
+ CHK(d4_eq(data+24, d4(v4,1,1.99,-1.04,1)));
+ CHK(d4_eq(data+28, d4(v4,1,1.99,0.99,1)));
+ CHK(d4_eq(data+32, d4(v4,-0.99,0,-1.04,1)));
+ CHK(d4_eq(data+36, d4(v4,1,0,-1.04,1)));
+ CHK(d4_eq(data+40, d4(v4,1,1.99,-1.04,1)));
+ CHK(d4_eq(data+44, d4(v4,-1.02,1.99,-1.04,1)));
+ CHK(d4_eq(data+48, d4(v4,1,0,-1.04,1)));
+ CHK(d4_eq(data+52, d4(v4,1,0,0.99,1)));
+ CHK(d4_eq(data+56, d4(v4,1,1.99,0.99,1)));
+ CHK(d4_eq(data+60, d4(v4,1,1.99,-1.04,1)));
+ CHK(d4_eq(data+64, d4(v4,-1.01,0,0.99,1)));
+ CHK(d4_eq(data+68, d4(v4,-0.99,0,-1.04,1)));
+ CHK(d4_eq(data+72, d4(v4,-1.02,1.99,-1.04,1)));
+ CHK(d4_eq(data+76, d4(v4,-1.02,1.99,0.99,1)));
}
int