#include <GL/freeglut.h>\r
#include "vmath.h"\r
\r
+#ifndef M_PI\r
+#define M_PI 3.14159265358979323846264338327950\r
+#endif\r
+\r
void draw_cube(void);\r
\r
/* callbacks */\r
void disp(void);\r
void reshape(int x, int y);\r
void keyb(unsigned char key, int x, int y);\r
-void sbmot(int x, int y, int z); /* spaceball translation */\r
-void sbrot(int x, int y, int z); /* spaceball rotation */\r
-void sbbut(int bn, int state); /* spaceball button */\r
+void sbmot(int x, int y, int z); /* spaceball translation */\r
+void sbrot(int x, int y, int z); /* spaceball rotation */\r
+void sbbut(int bn, int state); /* spaceball button */\r
\r
vec3_t pos = {0, 0, -6};\r
quat_t rot = {0, 0, 0, 1};\r
\r
int main(int argc, char **argv)\r
{\r
- glutInit(&argc, argv);\r
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);\r
- glutCreateWindow("spaceball demo");\r
+ glutInit(&argc, argv);\r
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);\r
+ glutCreateWindow("spaceball demo");\r
\r
- glutDisplayFunc(disp);\r
- glutReshapeFunc(reshape);\r
- glutKeyboardFunc(keyb);\r
- glutSpaceballMotionFunc(sbmot);\r
- glutSpaceballRotateFunc(sbrot);\r
- glutSpaceballButtonFunc(sbbut);\r
+ glutDisplayFunc(disp);\r
+ glutReshapeFunc(reshape);\r
+ glutKeyboardFunc(keyb);\r
+ glutSpaceballMotionFunc(sbmot);\r
+ glutSpaceballRotateFunc(sbrot);\r
+ glutSpaceballButtonFunc(sbbut);\r
\r
- glEnable(GL_CULL_FACE);\r
+ glEnable(GL_CULL_FACE);\r
\r
- glutMainLoop();\r
- return 0;\r
+ glutMainLoop();\r
+ return 0;\r
}\r
\r
void disp(void)\r
{\r
- mat4_t xform;\r
+ mat4_t xform;\r
\r
- quat_to_mat(xform, rot);\r
+ quat_to_mat(xform, rot);\r
\r
- glClear(GL_COLOR_BUFFER_BIT);\r
+ glClear(GL_COLOR_BUFFER_BIT);\r
\r
- glMatrixMode(GL_MODELVIEW);\r
- glLoadIdentity();\r
- glTranslatef(pos.x, pos.y, pos.z);\r
- glMultTransposeMatrixf((float*)xform);\r
+ glMatrixMode(GL_MODELVIEW);\r
+ glLoadIdentity();\r
+ glTranslatef(pos.x, pos.y, pos.z);\r
+ glMultMatrixf((float*)xform);\r
\r
- draw_cube();\r
+ draw_cube();\r
\r
- glutSwapBuffers();\r
+ glutSwapBuffers();\r
}\r
\r
void draw_cube(void)\r
{\r
- glBegin(GL_QUADS);\r
- /* face +Z */\r
- glNormal3f(0, 0, 1);\r
- glColor3f(1, 0, 0);\r
- glVertex3f(-1, -1, 1);\r
- glVertex3f(1, -1, 1);\r
- glVertex3f(1, 1, 1);\r
- glVertex3f(-1, 1, 1);\r
- /* face +X */\r
- glNormal3f(1, 0, 0);\r
- glColor3f(0, 1, 0);\r
- glVertex3f(1, -1, 1);\r
- glVertex3f(1, -1, -1);\r
- glVertex3f(1, 1, -1);\r
- glVertex3f(1, 1, 1);\r
- /* face -Z */\r
- glNormal3f(0, 0, -1);\r
- glColor3f(0, 0, 1);\r
- glVertex3f(1, -1, -1);\r
- glVertex3f(-1, -1, -1);\r
- glVertex3f(-1, 1, -1);\r
- glVertex3f(1, 1, -1);\r
- /* face -X */\r
- glNormal3f(-1, 0, 0);\r
- glColor3f(1, 1, 0);\r
- glVertex3f(-1, -1, -1);\r
- glVertex3f(-1, -1, 1);\r
- glVertex3f(-1, 1, 1);\r
- glVertex3f(-1, 1, -1);\r
- /* face +Y */\r
- glNormal3f(0, 1, 0);\r
- glColor3f(0, 1, 1);\r
- glVertex3f(-1, 1, 1);\r
- glVertex3f(1, 1, 1);\r
- glVertex3f(1, 1, -1);\r
- glVertex3f(-1, 1, -1);\r
- /* face -Y */\r
- glNormal3f(0, -1, 0);\r
- glColor3f(1, 0, 1);\r
- glVertex3f(-1, -1, -1);\r
- glVertex3f(1, -1, -1);\r
- glVertex3f(1, -1, 1);\r
- glVertex3f(-1, -1, 1);\r
- glEnd();\r
+ glBegin(GL_QUADS);\r
+ /* face +Z */\r
+ glNormal3f(0, 0, 1);\r
+ glColor3f(1, 0, 0);\r
+ glVertex3f(-1, -1, 1);\r
+ glVertex3f(1, -1, 1);\r
+ glVertex3f(1, 1, 1);\r
+ glVertex3f(-1, 1, 1);\r
+ /* face +X */\r
+ glNormal3f(1, 0, 0);\r
+ glColor3f(0, 1, 0);\r
+ glVertex3f(1, -1, 1);\r
+ glVertex3f(1, -1, -1);\r
+ glVertex3f(1, 1, -1);\r
+ glVertex3f(1, 1, 1);\r
+ /* face -Z */\r
+ glNormal3f(0, 0, -1);\r
+ glColor3f(0, 0, 1);\r
+ glVertex3f(1, -1, -1);\r
+ glVertex3f(-1, -1, -1);\r
+ glVertex3f(-1, 1, -1);\r
+ glVertex3f(1, 1, -1);\r
+ /* face -X */\r
+ glNormal3f(-1, 0, 0);\r
+ glColor3f(1, 1, 0);\r
+ glVertex3f(-1, -1, -1);\r
+ glVertex3f(-1, -1, 1);\r
+ glVertex3f(-1, 1, 1);\r
+ glVertex3f(-1, 1, -1);\r
+ /* face +Y */\r
+ glNormal3f(0, 1, 0);\r
+ glColor3f(0, 1, 1);\r
+ glVertex3f(-1, 1, 1);\r
+ glVertex3f(1, 1, 1);\r
+ glVertex3f(1, 1, -1);\r
+ glVertex3f(-1, 1, -1);\r
+ /* face -Y */\r
+ glNormal3f(0, -1, 0);\r
+ glColor3f(1, 0, 1);\r
+ glVertex3f(-1, -1, -1);\r
+ glVertex3f(1, -1, -1);\r
+ glVertex3f(1, -1, 1);\r
+ glVertex3f(-1, -1, 1);\r
+ glEnd();\r
}\r
\r
/* 45deg fov */\r
-#define FOV (M_PI / 4.0)\r
+#define FOV (M_PI / 4.0)\r
\r
void reshape(int x, int y)\r
{\r
- float aspect = (float)x / (float)y;\r
- float halfy = tan(FOV / 2.0);\r
- float halfx = halfy * aspect;\r
+ float aspect = (float)x / (float)y;\r
+ float halfy = (float)tan(FOV / 2.0);\r
+ float halfx = halfy * aspect;\r
\r
- glViewport(0, 0, x, y);\r
+ glViewport(0, 0, x, y);\r
\r
- glMatrixMode(GL_PROJECTION);\r
- glLoadIdentity();\r
- glFrustum(-halfx, halfx, -halfy, halfy, 1.0, 1000.0);\r
+ glMatrixMode(GL_PROJECTION);\r
+ glLoadIdentity();\r
+ glFrustum(-halfx, halfx, -halfy, halfy, 1.0, 1000.0);\r
}\r
\r
void keyb(unsigned char key, int x, int y)\r
{\r
- switch(key) {\r
- case 'q':\r
- case 'Q':\r
- case 27:\r
- exit(0);\r
-\r
- case ' ':\r
- /* reset initial view */\r
- pos = v3_cons(0, 0, -6);\r
- rot = quat_cons(1, 0, 0, 0);\r
- glutPostRedisplay();\r
-\r
- default:\r
- break;\r
- }\r
+ switch(key) {\r
+ case 'q':\r
+ case 'Q':\r
+ case 27:\r
+ exit(0);\r
+\r
+ case ' ':\r
+ /* reset initial view */\r
+ pos = v3_cons(0, 0, -6);\r
+ rot = quat_cons(1, 0, 0, 0);\r
+ glutPostRedisplay();\r
+\r
+ default:\r
+ break;\r
+ }\r
}\r
\r
void sbmot(int x, int y, int z)\r
{\r
- pos.x += x * 0.001;\r
- pos.y += y * 0.001;\r
- pos.z -= z * 0.001;\r
- glutPostRedisplay();\r
+ pos.x += x * 0.001f;\r
+ pos.y += y * 0.001f;\r
+ pos.z -= z * 0.001f;\r
+ glutPostRedisplay();\r
}\r
\r
void sbrot(int x, int y, int z)\r
{\r
- float axis_len = sqrt(x * x + y * y + z * z);\r
- rot = quat_rotate(rot, axis_len * 0.001, -x / axis_len, -y / axis_len, z / axis_len);\r
- glutPostRedisplay();\r
+ float axis_len = (float)sqrt(x * x + y * y + z * z);\r
+ rot = quat_rotate(rot, axis_len * 0.001f, -x / axis_len, -y / axis_len, z / axis_len);\r
+ glutPostRedisplay();\r
}\r
\r
void sbbut(int bn, int state)\r
{\r
- if(state == GLUT_DOWN) {\r
- pos = v3_cons(0, 0, -6);\r
- rot = quat_cons(1, 0, 0, 0);\r
- glutPostRedisplay();\r
- }\r
+ if(state == GLUT_DOWN) {\r
+ pos = v3_cons(0, 0, -6);\r
+ rot = quat_cons(1, 0, 0, 0);\r
+ glutPostRedisplay();\r
+ }\r
}\r