#if 0 #!/bin/sh FILE=`echo $0 | sed "s/\.cp*$//"` CC="gcc -std=c99 -Wall -pedantic" if [ -z "$SDL_CONFIG" ]; then SDL_CONFIG="sdl-config" fi $CC `$SDL_CONFIG --cflags` $FILE.c -o $FILE `$SDL_CONFIG --libs` -lGL exit #endif /* here the example file: * qmesh.txt, one single row * 0.0 1.0 0.0 -1.0 5.0 -1.0 5.0 1.0 */ #include #include #include "SDL.h" #include "SDL_opengl.h" typedef struct { float x, y; } Point; typedef struct { float x, y, a, l; } Line; typedef struct { Point a, b, c, d; } Quad; typedef struct { int qCount; Quad quads[20]; } QMesh; QMesh *loadQMesh(char *path) { FILE *f; char buff[512]; int i; Quad q; QMesh *m; if (!(f = fopen(path, "r"))) return NULL; m = malloc(sizeof(QMesh)); if (!m) return NULL; m->qCount = 0; while (!feof(f)) { fgets(buff, 512, f); for (i = 0; buff[i]; i++) if (buff[i] == '\n') buff[i] = '\0'; sscanf(buff, "%f %f %f %f %f %f %f %f", &q.a.x, &q.a.y, &q.b.x, &q.b.y, &q.c.x, &q.c.y, &q.d.x, &q.d.y); m->quads[m->qCount++] = q; } fclose(f); return m; } void drawLineMesh(Line *l, QMesh *m) { int i; glPushMatrix(); glTranslatef(l->x, l->y, 0.0); glRotatef(l->a, 0.0, 0.0, 1.0); glLineWidth(1.0); glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); for (i = 0; i < m->qCount; i++) { glVertex2f(m->quads[i].a.x, m->quads[i].a.y); glVertex2f(m->quads[i].b.x, m->quads[i].b.y); glVertex2f(m->quads[i].c.x, m->quads[i].c.y); glVertex2f(m->quads[i].d.x, m->quads[i].d.y); } glEnd(); glLineWidth(2.0); glColor3f(1.0, 0.0, 0.0); glBegin(GL_LINES); glVertex2f(0.0, 0.0); glVertex2f(l->l, 0.0); glEnd(); glTranslatef(l->l, 0.0, 0.0); glPopMatrix(); } int main(int argc, char **argv) { SDL_Event sdlEv; Uint32 sdlVideoFlags = SDL_OPENGL; Uint8 quit; /* Initialize */ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTTHREAD) < 0) { fprintf(stderr, "SDL_Init: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } atexit(SDL_Quit); /* Start graphic system with OGL */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (!SDL_SetVideoMode(400, 400, 0, sdlVideoFlags)) { fprintf(stderr, "SDL_SetVideoMode: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } glShadeModel(GL_SMOOTH); glViewport(0, 0, 400, 400); glMatrixMode(GL_PROJECTION); glOrtho(-10, 10, -10, 10, -1, 1); glMatrixMode(GL_MODELVIEW); /* Application Initialization */ Line l; l.l = 6.0; l.a = 0.0; QMesh *m = loadQMesh("qmesh.txt"); if (!m) exit(EXIT_FAILURE); SDL_EnableKeyRepeat(100, 50); /* Main loop */ quit = 0; while (!quit) { while (SDL_PollEvent(&sdlEv)) switch (sdlEv.type) { case SDL_QUIT: quit = 1; break; case SDL_KEYDOWN: switch (sdlEv.key.keysym.sym) { case SDLK_LEFT: l.a += 2.0; break; case SDLK_RIGHT: l.a -= 2.0; break; default: break; } default: break; } glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); drawLineMesh(&l, m); SDL_GL_SwapBuffers(); } return EXIT_SUCCESS; }