Allow to read bezier curves

This commit is contained in:
hasufell 2014-05-31 17:32:40 +02:00
parent 6e31ec91fd
commit 81e8aa0552
No known key found for this signature in database
GPG Key ID: 220CD1C5BDEED020
3 changed files with 92 additions and 6 deletions

View File

@ -290,7 +290,11 @@ void delete_object(HE_obj *obj)
free(obj->vertices[i].vec); free(obj->vertices[i].vec);
free(obj->vertices[i].col); free(obj->vertices[i].col);
} }
for (uint32_t i = 0; i < obj->bzc; i++)
free(obj->bez_curves[i].vec);
free(obj->edges); free(obj->edges);
free(obj->vertices); free(obj->vertices);
free(obj->faces); free(obj->faces);
free(obj->bez_curves);
} }

View File

@ -90,18 +90,25 @@ typedef struct obj_items obj_items;
* as they are in the .obj file, * as they are in the .obj file,
*/ */
typedef double** VERTICES; typedef double** VERTICES;
typedef struct FACES FACES;
/** /**
* 2d array which can hold the vertices texture * 2d array which can hold the vertices texture
* coordinates as they are in the .obj file, * coordinates as they are in the .obj file,
*/ */
typedef double** V_TEXTURES; typedef double** V_TEXTURES;
/**
* 2d array which holds the array or vertice references
* that describe a bezier curve.
*/
typedef int** BEZIER_CURV;
typedef struct FACES FACES;
typedef struct HE_edge HE_edge; typedef struct HE_edge HE_edge;
typedef struct HE_vert HE_vert; typedef struct HE_vert HE_vert;
typedef struct HE_vert_acc HE_vert_acc; typedef struct HE_vert_acc HE_vert_acc;
typedef struct HE_face HE_face; typedef struct HE_face HE_face;
typedef struct HE_obj HE_obj; typedef struct HE_obj HE_obj;
typedef struct color color; typedef struct color color;
typedef struct bez_curv bez_curv;
/** /**
@ -123,6 +130,10 @@ struct obj_items {
* Raw texture coordinates array. * Raw texture coordinates array.
*/ */
V_TEXTURES vt; V_TEXTURES vt;
/**
* Bezier curve
*/
BEZIER_CURV bez;
}; };
/** /**
@ -253,6 +264,10 @@ struct HE_obj {
* Array of faces. * Array of faces.
*/ */
HE_face *faces; HE_face *faces;
/**
* Array of bezier curves.
*/
bez_curv *bez_curves;
/** /**
* Count of edges. * Count of edges.
*/ */
@ -261,6 +276,10 @@ struct HE_obj {
* Count of vertices. * Count of vertices.
*/ */
uint32_t vc; uint32_t vc;
/**
* Count of bez curves.
*/
uint32_t bzc;
/** /**
* Count of faces. * Count of faces.
*/ */
@ -284,6 +303,20 @@ struct color {
double blue; double blue;
}; };
/**
* Bezier Curve.
*/
struct bez_curv {
/**
* Array of vectors.
*/
vector *vec;
/**
* Degree of the curve.
*/
uint32_t deg;
};
bool face_normal(HE_edge const * const edge, bool face_normal(HE_edge const * const edge,
vector *vec); vector *vec);

View File

@ -49,7 +49,8 @@ static void delete_accel_struct(HE_obj *he_obj);
static void delete_raw_object(obj_items *raw_obj, static void delete_raw_object(obj_items *raw_obj,
uint32_t fc, uint32_t fc,
uint32_t vc, uint32_t vc,
uint32_t vt); uint32_t vt,
uint32_t bzc);
/** /**
@ -83,12 +84,13 @@ static bool assemble_obj_arrays(char const * const obj_string,
*str_tmp_ptr = NULL; *str_tmp_ptr = NULL;
/* these will be assigned later to the out structs */ /* these will be assigned later to the out structs */
uint32_t vc = 0, fc = 0, ec = 0, vtc = 0; uint32_t vc = 0, fc = 0, ec = 0, vtc = 0, bzc = 0;
VERTICES obj_v = NULL; VERTICES obj_v = NULL;
FACES *obj_f = malloc(sizeof(*obj_f)); FACES *obj_f = malloc(sizeof(*obj_f));
uint32_t **obj_f_v = NULL; /* tmp v member of obj_f */ uint32_t **obj_f_v = NULL; /* tmp v member of obj_f */
uint32_t **obj_f_vt = NULL; /* tmp vt member of obj_f */ uint32_t **obj_f_vt = NULL; /* tmp vt member of obj_f */
V_TEXTURES obj_vt = NULL; V_TEXTURES obj_vt = NULL;
BEZIER_CURV bez = NULL;
if (!obj_string || !raw_obj) if (!obj_string || !raw_obj)
return false; return false;
@ -190,6 +192,26 @@ static bool assemble_obj_arrays(char const * const obj_string,
} }
fc++; fc++;
obj_f_v[fc] = NULL; /* trailing NULL pointer */ obj_f_v[fc] = NULL; /* trailing NULL pointer */
/*
* Bezier Curve
*/
} else if (!strcmp(str_tmp_ptr, "curv")) {
char *myint = NULL;
uint8_t i = 0;
REALLOC(bez, sizeof(*bez) * (bzc + 2));
bez[bzc] = NULL;
while ((myint = strtok_r(NULL, " ", &str_ptr_space))) {
i++;
REALLOC(bez[bzc],
sizeof(**bez) * (i + 1));
bez[bzc][i - 1] = atoi(myint);
bez[bzc][i] = 0;
}
bzc++;
bez[bzc] = NULL; /* trailing NULL pointer */
} }
str_tmp_ptr = strtok_r(NULL, "\n", &str_ptr_newline); str_tmp_ptr = strtok_r(NULL, "\n", &str_ptr_newline);
@ -205,6 +227,7 @@ static bool assemble_obj_arrays(char const * const obj_string,
obj_f->vt = obj_f_vt; obj_f->vt = obj_f_vt;
raw_obj->f = obj_f; raw_obj->f = obj_f;
raw_obj->vt = obj_vt; raw_obj->vt = obj_vt;
raw_obj->bez = bez;
/* cleanup */ /* cleanup */
free(string); free(string);
@ -228,12 +251,14 @@ static bool assemble_obj_arrays(char const * const obj_string,
static void assemble_HE_stage1(obj_items const * const raw_obj, static void assemble_HE_stage1(obj_items const * const raw_obj,
HE_obj *he_obj) HE_obj *he_obj)
{ {
uint32_t vc = 0; uint32_t vc = 0,
bzc = 0;
uint8_t const xpos = 0; uint8_t const xpos = 0;
uint8_t const ypos = 1; uint8_t const ypos = 1;
uint8_t const zpos = 2; uint8_t const zpos = 2;
int8_t default_color = -1; int8_t default_color = -1;
HE_vert *vertices = he_obj->vertices; HE_vert *vertices = he_obj->vertices;
bez_curv *bez_curves = NULL;
while (raw_obj->v[vc]) { while (raw_obj->v[vc]) {
vector *tmp_vec; vector *tmp_vec;
@ -264,6 +289,25 @@ static void assemble_HE_stage1(obj_items const * const raw_obj,
vc++; vc++;
} }
while (raw_obj->bez[bzc]) {
uint32_t i = 0;
vector *bez_vec = NULL;
REALLOC(bez_curves, sizeof(*bez_curves) * (bzc + 2));
while (raw_obj->bez[bzc][i]) {
REALLOC(bez_vec, sizeof(vector) * (i + 1));
bez_vec[i] = *(vertices[raw_obj->bez[bzc][i] - 1].vec);
i++;
}
bez_curves[bzc].vec = bez_vec;
bez_curves[bzc].deg = i - 1; /* i is length */
bzc++;
}
he_obj->bez_curves = bez_curves;
he_obj->bzc = bzc;
he_obj->vertices = vertices; he_obj->vertices = vertices;
} }
@ -476,7 +520,8 @@ HE_obj *parse_obj(char const * const obj_string)
assemble_HE_stage3(he_obj); assemble_HE_stage3(he_obj);
/* cleanup */ /* cleanup */
delete_raw_object(&raw_obj, he_obj->fc, he_obj->vc, he_obj->vtc); delete_raw_object(&raw_obj, he_obj->fc,
he_obj->vc, he_obj->vtc, he_obj->bzc);
delete_accel_struct(he_obj); delete_accel_struct(he_obj);
free(string); free(string);
@ -503,11 +548,14 @@ static void delete_accel_struct(HE_obj *he_obj)
static void delete_raw_object(obj_items *raw_obj, static void delete_raw_object(obj_items *raw_obj,
uint32_t fc, uint32_t fc,
uint32_t vc, uint32_t vc,
uint32_t vtc) uint32_t vtc,
uint32_t bzc)
{ {
if (!raw_obj) if (!raw_obj)
return; return;
for (uint32_t i = 0; i < bzc; i++)
free(raw_obj->bez[i]);
for (uint32_t i = 0; i < vtc; i++) for (uint32_t i = 0; i < vtc; i++)
free(raw_obj->vt[i]); free(raw_obj->vt[i]);
for (uint32_t i = 0; i < vc; i++) for (uint32_t i = 0; i < vc; i++)
@ -516,6 +564,7 @@ static void delete_raw_object(obj_items *raw_obj,
free(raw_obj->f->v[i]); free(raw_obj->f->v[i]);
free(raw_obj->f->vt[i]); free(raw_obj->f->vt[i]);
} }
free(raw_obj->bez);
free(raw_obj->f->v); free(raw_obj->f->v);
free(raw_obj->f->vt); free(raw_obj->f->vt);
free(raw_obj->v); free(raw_obj->v);