You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
5.1 KiB
225 lines
5.1 KiB
/* gltest.c */ |
|
|
|
#include <stdlib.h> |
|
#include "SDL.h" |
|
#include "i2c.h" |
|
|
|
#include "SDL_opengl.h" |
|
|
|
static void setup_opengl( int width, int height ) |
|
{ |
|
float ratio = (float) width / (float) height; |
|
|
|
glShadeModel( GL_SMOOTH ); |
|
|
|
glCullFace( GL_BACK ); |
|
glFrontFace( GL_CCW ); |
|
glEnable( GL_CULL_FACE ); |
|
|
|
glClearColor( 0, 0, 0, 0 ); |
|
|
|
glViewport( 0, 0, width, height ); |
|
|
|
glMatrixMode( GL_PROJECTION ); |
|
glLoadIdentity( ); |
|
|
|
gluPerspective( 60.0, ratio, 1.0, 1024.0 ); |
|
} |
|
|
|
|
|
void drawscene(int r, int p, int y) |
|
{ |
|
static float roll, pitch, yaw; |
|
|
|
roll += (float)r / 1000; |
|
pitch += (float)p / 1000; |
|
yaw += (float)y / 1000; |
|
|
|
if (roll > 360.0) |
|
roll -= 360.0; |
|
if (roll < 360.0) |
|
roll += 360.0; |
|
if (pitch > 360.0) |
|
pitch -= 360.0; |
|
if (pitch < 360.0) |
|
pitch += 360.0; |
|
if (yaw > 360.0) |
|
yaw -= 360.0; |
|
if (yaw < 360.0) |
|
yaw += 360.0; |
|
|
|
|
|
static GLfloat v0[] = { -1.0f, -1.0f, 1.0f }; |
|
static GLfloat v1[] = { 1.0f, -1.0f, 1.0f }; |
|
static GLfloat v2[] = { 1.0f, 1.0f, 1.0f }; |
|
static GLfloat v3[] = { -1.0f, 1.0f, 1.0f }; |
|
static GLfloat v4[] = { -1.0f, -1.0f, -1.0f }; |
|
static GLfloat v5[] = { 1.0f, -1.0f, -1.0f }; |
|
static GLfloat v6[] = { 1.0f, 1.0f, -1.0f }; |
|
static GLfloat v7[] = { -1.0f, 1.0f, -1.0f }; |
|
static GLubyte red[] = { 255, 0, 0, 255 }; |
|
static GLubyte green[] = { 0, 255, 0, 255 }; |
|
static GLubyte blue[] = { 0, 0, 255, 255 }; |
|
static GLubyte white[] = { 255, 255, 255, 255 }; |
|
static GLubyte yellow[] = { 0, 255, 255, 255 }; |
|
static GLubyte black[] = { 0, 0, 0, 255 }; |
|
static GLubyte orange[] = { 255, 255, 0, 255 }; |
|
static GLubyte purple[] = { 255, 0, 255, 0 }; |
|
|
|
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); |
|
|
|
/* We don't want to modify the projection matrix. */ |
|
glMatrixMode( GL_MODELVIEW ); |
|
glLoadIdentity( ); |
|
|
|
/* Move down the z-axis. */ |
|
glTranslatef( (float)0*4, (float)0*4, -5.0 ); |
|
|
|
/* Apply rotation from our model */ |
|
glRotatef( roll, 1.0, 0.0, 0.0 ); |
|
glRotatef( pitch, 0.0, 0.0, 1.0 ); |
|
glRotatef( yaw, 0.0, -1.0, 0.0 ); |
|
|
|
/* Send our triangle data to the pipeline. */ |
|
glBegin( GL_TRIANGLES ); |
|
|
|
glColor4ubv( red ); |
|
glVertex3fv( v0 ); |
|
glColor4ubv( green ); |
|
glVertex3fv( v1 ); |
|
glColor4ubv( blue ); |
|
glVertex3fv( v2 ); |
|
|
|
glColor4ubv( red ); |
|
glVertex3fv( v0 ); |
|
glColor4ubv( blue ); |
|
glVertex3fv( v2 ); |
|
glColor4ubv( white ); |
|
glVertex3fv( v3 ); |
|
|
|
glColor4ubv( green ); |
|
glVertex3fv( v1 ); |
|
glColor4ubv( black ); |
|
glVertex3fv( v5 ); |
|
glColor4ubv( orange ); |
|
glVertex3fv( v6 ); |
|
|
|
glColor4ubv( green ); |
|
glVertex3fv( v1 ); |
|
glColor4ubv( orange ); |
|
glVertex3fv( v6 ); |
|
glColor4ubv( blue ); |
|
glVertex3fv( v2 ); |
|
|
|
glColor4ubv( black ); |
|
glVertex3fv( v5 ); |
|
glColor4ubv( yellow ); |
|
glVertex3fv( v4 ); |
|
glColor4ubv( purple ); |
|
glVertex3fv( v7 ); |
|
|
|
glColor4ubv( black ); |
|
glVertex3fv( v5 ); |
|
glColor4ubv( purple ); |
|
glVertex3fv( v7 ); |
|
glColor4ubv( orange ); |
|
glVertex3fv( v6 ); |
|
|
|
glColor4ubv( yellow ); |
|
glVertex3fv( v4 ); |
|
glColor4ubv( red ); |
|
glVertex3fv( v0 ); |
|
glColor4ubv( white ); |
|
glVertex3fv( v3 ); |
|
|
|
glColor4ubv( yellow ); |
|
glVertex3fv( v4 ); |
|
glColor4ubv( white ); |
|
glVertex3fv( v3 ); |
|
glColor4ubv( purple ); |
|
glVertex3fv( v7 ); |
|
|
|
glColor4ubv( white ); |
|
glVertex3fv( v3 ); |
|
glColor4ubv( blue ); |
|
glVertex3fv( v2 ); |
|
glColor4ubv( orange ); |
|
glVertex3fv( v6 ); |
|
|
|
glColor4ubv( white ); |
|
glVertex3fv( v3 ); |
|
glColor4ubv( orange ); |
|
glVertex3fv( v6 ); |
|
glColor4ubv( purple ); |
|
glVertex3fv( v7 ); |
|
|
|
glColor4ubv( green ); |
|
glVertex3fv( v1 ); |
|
glColor4ubv( red ); |
|
glVertex3fv( v0 ); |
|
glColor4ubv( yellow ); |
|
glVertex3fv( v4 ); |
|
|
|
glColor4ubv( green ); |
|
glVertex3fv( v1 ); |
|
glColor4ubv( yellow ); |
|
glVertex3fv( v4 ); |
|
glColor4ubv( black ); |
|
glVertex3fv( v5 ); |
|
|
|
glEnd( ); |
|
|
|
SDL_GL_SwapBuffers(); |
|
} |
|
|
|
int main(int argc, char *argv[]) |
|
{ |
|
SDL_Surface *screen; |
|
int roll, pitch, yaw; |
|
|
|
if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 ) { |
|
fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); |
|
exit(1); |
|
} |
|
atexit(SDL_Quit); |
|
|
|
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 ); |
|
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 ); |
|
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 ); |
|
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 32 ); |
|
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); |
|
|
|
//screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE); |
|
screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL); |
|
if ( screen == NULL ) { |
|
fprintf(stderr, "Unable to set 640x480 video: %s\n", SDL_GetError()); |
|
exit(1); |
|
} |
|
|
|
setup_opengl(640, 480); |
|
|
|
initparallel(); |
|
setupi2c(); |
|
calibrate(); |
|
|
|
query_device(&roll, &pitch, &yaw); |
|
drawscene(roll, pitch, yaw); |
|
|
|
while (1) |
|
{ |
|
SDL_Event event; |
|
/* SDL_WaitEvent(&event); */ |
|
while (SDL_PollEvent(&event)) |
|
{ |
|
switch (event.type) |
|
{ |
|
case SDL_QUIT: |
|
case SDL_KEYDOWN: |
|
exit(0); |
|
} |
|
} |
|
query_device(&roll, &pitch, &yaw); |
|
drawscene(roll, pitch, yaw); |
|
} |
|
|
|
}
|
|
|