diff --git a/src/gl_draw.c b/src/gl_draw.c index 3eefb6a..92cf989 100644 --- a/src/gl_draw.c +++ b/src/gl_draw.c @@ -96,9 +96,12 @@ static void draw_obj(uint32_t const myxrot, static uint32_t xrot = 0, yrot = 0, zrot = 0; - HE_vert *center_vert = find_center(obj); + vector center_vert; float scalefactor = get_normalized_scale_factor(obj) * VISIBILITY_FACTOR; + if (!find_center(obj, ¢er_vert)) + return; /* TODO: better error handling */ + xrot += myxrot; yrot += myyrot; zrot += myzrot; @@ -116,9 +119,9 @@ static void draw_obj(uint32_t const myxrot, glTranslatef(0.0f, 0.0f, SYSTEM_POS_Z_BACK); /* pull into middle of universe */ - glTranslatef(-center_vert->x, - -center_vert->y, - -center_vert->z + SYSTEM_POS_Z); + glTranslatef(-center_vert.x, + -center_vert.y, + -center_vert.z + SYSTEM_POS_Z); glBegin(GL_POLYGON); glColor3f(0.0f, 1.0f, 0.0f); @@ -126,8 +129,6 @@ static void draw_obj(uint32_t const myxrot, glEnd(); glPopMatrix(); - - free(center_vert); } /** diff --git a/src/half_edge.c b/src/half_edge.c index febfb03..673954f 100644 --- a/src/half_edge.c +++ b/src/half_edge.c @@ -27,7 +27,9 @@ #include "err.h" #include "filereader.h" #include "half_edge.h" +#include "vector.h" +#include #include #include #include @@ -50,21 +52,19 @@ HE_edge **get_all_emanating_edges(HE_vert *vertice) * in a HE_vert struct. * * @param obj the object we want to find the center of - * @return newly allocated HE_vert with empty edge member - * and coordinates which represent the middle of the object + * @param vec the vector to store the result in [out] + * @return true/false for success/failure */ -HE_vert *find_center(HE_obj const * const obj) +bool find_center(HE_obj const * const obj, vector *vec) { float x = 0, y = 0, z = 0; uint32_t i; - HE_vert *newvert; - if (!obj) - return NULL; + if (!obj || !vec) + return false; - newvert = malloc(sizeof(HE_vert)); for (i = 0; i < obj->vc; i++) { x += obj->vertices[i].x; @@ -72,12 +72,11 @@ HE_vert *find_center(HE_obj const * const obj) z += obj->vertices[i].z; } - newvert->x = x / i; - newvert->y = y / i; - newvert->z = z / i; - newvert->edge = NULL; + vec->x = x / i; + vec->y = y / i; + vec->z = z / i; - return newvert; + return true; } /** diff --git a/src/half_edge.h b/src/half_edge.h index 0ff9f10..ae742a5 100644 --- a/src/half_edge.h +++ b/src/half_edge.h @@ -28,6 +28,9 @@ #define _DROW_ENGINE_HE_OPERATIONS_H +#include "vector.h" + +#include #include @@ -124,7 +127,7 @@ struct HE_obj { HE_edge **get_all_emanating_edges(HE_vert *vertice); -HE_vert *find_center(HE_obj const * const obj); +bool find_center(HE_obj const * const obj, vector *vec); float get_normalized_scale_factor(HE_obj const * const obj); HE_obj *parse_obj(char const * const filename); diff --git a/src/test/cunit.c b/src/test/cunit.c index b8a4f29..e1f4707 100644 --- a/src/test/cunit.c +++ b/src/test/cunit.c @@ -106,6 +106,8 @@ int main(void) test_find_center1)) || (NULL == CU_add_test(pSuite, "test2 finding center ob obj", test_find_center2)) || + (NULL == CU_add_test(pSuite, "test3 finding center ob obj", + test_find_center3)) || (NULL == CU_add_test(pSuite, "test1 getting normalized scale factor", test_get_normalized_scale_factor1)) || (NULL == CU_add_test(pSuite, "test2 getting normalized scale factor", diff --git a/src/test/cunit.h b/src/test/cunit.h index 18922d0..b5e6c28 100644 --- a/src/test/cunit.h +++ b/src/test/cunit.h @@ -45,6 +45,7 @@ void test_parse_obj4(void); void test_find_center1(void); void test_find_center2(void); +void test_find_center3(void); void test_get_normalized_scale_factor1(void); void test_get_normalized_scale_factor2(void); diff --git a/src/test/cunit_half_edge.c b/src/test/cunit_half_edge.c index c437683..840e65e 100644 --- a/src/test/cunit_half_edge.c +++ b/src/test/cunit_half_edge.c @@ -457,13 +457,15 @@ void test_find_center1(void) "f 7 1 3 5\n"; HE_obj *obj = parse_obj(string); - HE_vert *newvert = find_center(obj); + vector newvec; + bool retval = find_center(obj, &newvec); CU_ASSERT_PTR_NOT_NULL(obj); + CU_ASSERT_EQUAL(retval, true); - CU_ASSERT_EQUAL(newvert->x, 10.0); - CU_ASSERT_EQUAL(newvert->y, 10.5); - CU_ASSERT_EQUAL(newvert->z, 10.0); + CU_ASSERT_EQUAL(newvec.x, 10.0); + CU_ASSERT_EQUAL(newvec.y, 10.5); + CU_ASSERT_EQUAL(newvec.z, 10.0); } /** @@ -471,9 +473,37 @@ void test_find_center1(void) */ void test_find_center2(void) { - HE_vert *newvert = find_center(NULL); + vector newvec; + bool retval = find_center(NULL, &newvec); - CU_ASSERT_PTR_NULL(newvert); + CU_ASSERT_EQUAL(retval, false); +} + +/** + * Test error handling by passing a NULL pointer. + */ +void test_find_center3(void) +{ + char const * const string = "" + "v 9.0 10.0 11.0\n" + "v 11.0 10.0 11.0\n" + "v 9.0 11.0 11.0\n" + "v 11.0 11.0 11.0\n" + "v 9.0 11.0 9.0\n" + "v 11.0 11.0 9.0\n" + "v 9.0 10.0 9.0\n" + "v 11.0 10.0 9.0\n" + "f 1 2 4 3\n" + "f 3 4 6 5\n" + "f 5 6 8 7\n" + "f 7 8 2 1\n" + "f 2 8 6 4\n" + "f 7 1 3 5\n"; + + HE_obj *obj = parse_obj(string); + bool retval = find_center(obj, NULL); + + CU_ASSERT_EQUAL(retval, false); } /** @@ -499,7 +529,6 @@ void test_get_normalized_scale_factor1(void) "f 7 1 3 5\n"; HE_obj *obj = parse_obj(string); - HE_vert *newvert = find_center(obj); float factor = get_normalized_scale_factor(obj); CU_ASSERT_PTR_NOT_NULL(obj);