Add more user controls, draw faces as separate polygons

This also fixes drawing of open objects.
This commit is contained in:
hasufell 2014-05-15 18:33:43 +02:00
parent a25bc0ff4d
commit fd9d15c4ea
No known key found for this signature in database
GPG Key ID: 220CD1C5BDEED020
3 changed files with 137 additions and 38 deletions

View File

@ -47,6 +47,9 @@
#define SYSTEM_POS_Z -15.0f #define SYSTEM_POS_Z -15.0f
#define SYSTEM_POS_Z_BACK 15.0f #define SYSTEM_POS_Z_BACK 15.0f
#define VISIBILITY_FACTOR 5.0f #define VISIBILITY_FACTOR 5.0f
#define FAR_CLIPPING_PLANE 60.0f
#define NEAR_CLIPPING_PLANE 1.0f
#define CAMERA_ANGLE 60.0f
int year; int year;
int yearabs = 365; int yearabs = 365;
@ -54,6 +57,7 @@ int day;
int dayabs = 30; int dayabs = 30;
HE_obj *obj; HE_obj *obj;
bool show_normals = false; bool show_normals = false;
bool shademodel = true;
/* /*
* static function declaration * static function declaration
@ -64,32 +68,40 @@ static void draw_obj(int32_t const myxrot,
static void draw_Planet_1(void); static void draw_Planet_1(void);
static void draw_Planet_2(void); static void draw_Planet_2(void);
static void gl_destroy(void); static void gl_destroy(void);
static void draw_normals(HE_obj const * const obj); static void draw_normals(HE_obj const * const obj,
float const scale_inc);
static void draw_vertices(HE_obj const * const obj,
bool disco);
static void draw_normals(HE_obj const * const obj) static void draw_normals(HE_obj const * const obj,
float const scale_inc)
{ {
static float normals_scale_factor = 0.3f;
static float line_width = 2;
vector vec; vector vec;
normals_scale_factor += scale_inc;
glPushMatrix();
glLineWidth(line_width);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINES);
for (uint32_t i = 0; i < obj->vc; i++) { for (uint32_t i = 0; i < obj->vc; i++) {
VEC_NORMAL(&(obj->vertices[i]), &vec); VEC_NORMAL(&(obj->vertices[i]), &vec);
glPushMatrix();
glLineWidth(3);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex3f(obj->vertices[i].vec->x, glVertex3f(obj->vertices[i].vec->x,
obj->vertices[i].vec->y, obj->vertices[i].vec->y,
obj->vertices[i].vec->z); obj->vertices[i].vec->z);
glVertex3f(obj->vertices[i].vec->x + (vec.x), glVertex3f(obj->vertices[i].vec->x + (vec.x * normals_scale_factor),
obj->vertices[i].vec->y + (vec.y), obj->vertices[i].vec->y + (vec.y * normals_scale_factor),
obj->vertices[i].vec->z + (vec.z)); obj->vertices[i].vec->z + (vec.z * normals_scale_factor));
glEnd();
glPopMatrix();
} }
glEnd();
glPopMatrix();
} }
/** /**
@ -97,20 +109,73 @@ static void draw_normals(HE_obj const * const obj)
* in appropriate order. * in appropriate order.
* *
* @param obj the object of which we will draw the vertices * @param obj the object of which we will draw the vertices
* @param disco_set determines whether we are in disco mode
*/ */
static void draw_vertices(HE_obj const * const obj) static void draw_vertices(HE_obj const * const obj,
bool disco_set)
{ {
/* color */
static float red = 90,
blue = 90,
green = 90;
static bool disco = false;
if (disco_set)
disco = !disco;
glPushMatrix();
for (uint32_t i = 0; i < obj->fc; i++) { /* for all faces */ for (uint32_t i = 0; i < obj->fc; i++) { /* for all faces */
HE_edge *tmp_edge = obj->faces[i].edge; HE_edge *tmp_edge = obj->faces[i].edge;
/* add random values */
red += rand() / (RAND_MAX / ((rand() % 11) / 10.0f));
blue += rand() / (RAND_MAX / ((rand() % 11) / 10.0f));
green += rand() / (RAND_MAX / ((rand() % 11) / 10.0f));
/* values above 180 will cause negative color values */
red = fmodf(red, 181.0f);
blue = fmodf(blue, 181.0f);
green = fmodf(green, 181.0f);
if (disco) {
tmp_edge->vert->col->red =
(sin(red * i * (M_PI / 180)) / 2) + 0.5;
tmp_edge->vert->col->green =
(sin(green * i * (M_PI / 180)) / 2) + 0.5;
tmp_edge->vert->col->blue =
(sin(blue * i * (M_PI / 180)) / 2) + 0.5;
} else {
if (tmp_edge->vert->col->red == -1)
tmp_edge->vert->col->red =
(sin(red * i * (M_PI / 180)) / 2) + 0.5;
if (tmp_edge->vert->col->green == -1)
tmp_edge->vert->col->green =
(sin(green * i * (M_PI / 180)) / 2) + 0.5;
if (tmp_edge->vert->col->blue == -1)
tmp_edge->vert->col->blue =
(sin(blue * i * (M_PI / 180)) / 2) + 0.5;
}
glBegin(GL_POLYGON);
do { /* for all edges of the face */ do { /* for all edges of the face */
glColor3f(tmp_edge->vert->col->red,
tmp_edge->vert->col->green,
tmp_edge->vert->col->blue);
glVertex3f(tmp_edge->vert->vec->x, glVertex3f(tmp_edge->vert->vec->x,
tmp_edge->vert->vec->y, tmp_edge->vert->vec->y,
tmp_edge->vert->vec->z); tmp_edge->vert->vec->z);
} while ((tmp_edge = tmp_edge->next) != obj->faces[i].edge); } while ((tmp_edge = tmp_edge->next) != obj->faces[i].edge);
glEnd();
} }
glPopMatrix();
} }
/** /**
* Draws an object. * Draws an object.
* *
@ -127,21 +192,6 @@ static void draw_obj(int32_t const myxrot,
yrot = 0, yrot = 0,
zrot = 0; zrot = 0;
/* color */
static float red = 90,
blue = 90,
green = 90;
/* add random values */
red += rand() / (RAND_MAX / ((rand() % 11) / 10.0f));
blue += rand() / (RAND_MAX / ((rand() % 11) / 10.0f));
green += rand() / (RAND_MAX / ((rand() % 11) / 10.0f));
/* values above 180 will cause negative color values */
red = fmodf(red, 181.0f);
blue = fmodf(blue, 181.0f);
green = fmodf(green, 181.0f);
vector center_vert; vector center_vert;
FIND_CENTER(obj, &center_vert); FIND_CENTER(obj, &center_vert);
@ -169,13 +219,9 @@ static void draw_obj(int32_t const myxrot,
-center_vert.z + SYSTEM_POS_Z); -center_vert.z + SYSTEM_POS_Z);
if (show_normals) if (show_normals)
draw_normals(obj); draw_normals(obj, 0);
glBegin(GL_POLYGON);
glColor3f(sin(red * (M_PI / 180)), draw_vertices(obj, false);
sin(blue * (M_PI / 180)),
sin(green * (M_PI / 180)));
draw_vertices(obj);
glEnd();
glPopMatrix(); glPopMatrix();
} }
@ -357,7 +403,7 @@ void init(char const * const filename)
year = 0; year = 0;
glClearColor(0.0, 0.0, 0.0, 0.0); glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT); glShadeModel(GL_SMOOTH);
} }
/** /**
@ -372,7 +418,10 @@ void reshape(GLsizei w, GLsizei h)
glViewport(0, 0, w, h); glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
gluPerspective(60.0, (GLfloat) w / (GLfloat) h, 1.0, 30.0); gluPerspective(CAMERA_ANGLE,
(GLfloat) w / (GLfloat) h,
NEAR_CLIPPING_PLANE,
FAR_CLIPPING_PLANE);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
glTranslatef(0.0, 0.0, -5.0); glTranslatef(0.0, 0.0, -5.0);
@ -424,6 +473,13 @@ void animate()
void keyboard(unsigned char key, int x, int y) void keyboard(unsigned char key, int x, int y)
{ {
switch (key) { switch (key) {
case 'b':
if (glIsEnabled(GL_CULL_FACE))
glDisable(GL_CULL_FACE);
else
glEnable(GL_CULL_FACE);
glutPostRedisplay();
break;
case 't': case 't':
dayabs += 15; dayabs += 15;
glutPostRedisplay(); glutPostRedisplay();
@ -464,6 +520,28 @@ void keyboard(unsigned char key, int x, int y)
draw_obj(0, 0, -2); draw_obj(0, 0, -2);
glutPostRedisplay(); glutPostRedisplay();
break; break;
case 'D':
draw_vertices(obj, true);
glutPostRedisplay();
break;
case 'S':
if (shademodel) {
glShadeModel(GL_FLAT);
shademodel = false;
} else {
glShadeModel(GL_SMOOTH);
shademodel = true;
}
glutPostRedisplay();
break;
case 'k':
draw_normals(obj, 0.02f);
glutPostRedisplay();
break;
case 'l':
draw_normals(obj, -0.02f);
glutPostRedisplay();
break;
case 'w': case 'w':
glTranslatef(0.0f, 1.0f, 0.0f); glTranslatef(0.0f, 1.0f, 0.0f);
break; break;

View File

@ -339,6 +339,11 @@ HE_obj *parse_obj(char const * const obj_string)
vertices[vc].edge_array = NULL; vertices[vc].edge_array = NULL;
vertices[vc].eac = 0; vertices[vc].eac = 0;
/* allocate color struct and set preliminary colors */
vertices[vc].col = malloc(sizeof(color));
vertices[vc].col->red = -1;
vertices[vc].col->green = -1;
vertices[vc].col->blue = -1;
vc++; vc++;
/* exceeds 3 dimensions, malformed vertice */ /* exceeds 3 dimensions, malformed vertice */
@ -483,6 +488,7 @@ void delete_object(HE_obj *obj)
for (uint32_t i = 0; i < obj->vc; i++) { for (uint32_t i = 0; i < obj->vc; i++) {
free(obj->vertices[i].vec); free(obj->vertices[i].vec);
free(obj->vertices[i].col);
free(obj->vertices[i].edge_array); free(obj->vertices[i].edge_array);
} }
free(obj->edges); free(obj->edges);

View File

@ -105,6 +105,7 @@ typedef struct HE_edge HE_edge;
typedef struct HE_vert HE_vert; typedef struct HE_vert HE_vert;
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;
/** /**
@ -157,6 +158,11 @@ struct HE_vert {
* Element count of the edge_array. * Element count of the edge_array.
*/ */
uint32_t eac; uint32_t eac;
/**
* Color of the vertex.
*/
color *col;
}; };
/** /**
@ -201,6 +207,15 @@ struct HE_obj {
uint32_t fc; uint32_t fc;
}; };
/**
* Color.
*/
struct color {
float red;
float green;
float blue;
};
bool face_normal(HE_edge const * const edge, bool face_normal(HE_edge const * const edge,
vector *vec); vector *vec);