#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<GL/glut.h> #ifndef M_PI #define M_PI 3.1415926 #endif GLboolean doubleBuffer, rodar; GLdouble tam,ang,dif; GLint delay;
int main(int argc, char **argv){ GLenum type; glutInit(&argc, argv); // Inicializa o GLUT // chama a função para processar os argumentos if (Args(argc, argv) == GL_FALSE) exit(1); type = GLUT_RGB | GLUT_ACCUM; // define as opções GLUT_RGB e GLUT_ACCUM // se doubleBuffer for verdadeiro define GLUT_DOUBLE senão define GLUT_SINGLE type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; glutInitDisplayMode(type); // Inicializa o modo do display glutInitWindowSize(300, 300); // cria uma janela 300x300 pixeis glutCreateWindow("Teste"); // nome da janela pode passar argv[0] Init(); // chama a função Init para inicialização do OpenGL glutReshapeFunc(Reshape); // Regista o callback Reshape glutKeyboardFunc(Key); // Regista o callback Keyboard glutDisplayFunc(Draw); // Regista o callback Display glutMainLoop(); // Inicia o ciclo de execução do GLUT }
void Init(void){ glClearColor(0.0, 0.0, 0.0, 0.0); // define a cor para apagar a janela }
void Reshape(int width, int height){ glViewport(0, 0, width, height); // define o viewport como sendo a janela toda glMatrixMode(GL_PROJECTION); // faz operações sobre a matriz GL_PROJECTION glLoadIdentity(); // gluOrtho2D(-1,1,-1,1); // define as coordenada relativas do viewport // esq, dir, baixo, cima glMatrixMode(GL_MODELVIEW); // faz operações sobre a matriz GL_MODELVIEW glLoadIdentity(); }
void Draw(void){ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3f(0.0, 0.0, 1.0); glVertex2f(tam*cos(ang),tam*sin(ang)); glColor3f(1.0, 0.0, 0.0); glVertex2f(tam*cos(ang+M_PI/2), tam*sin(ang+M_PI/2)); glColor3f(0.0, 1.0, 0.0); glVertex2f(tam*cos(ang+M_PI), tam*sin(ang+M_PI)); glColor3f(1.0, 1.0, 0.0); glVertex2f(tam*cos(ang-M_PI/2),tam*sin(ang-M_PI/2)); glEnd(); if (doubleBuffer) { glutSwapBuffers(); } else { glFlush(); } printf("Tam:%f Ang:%f\n",tam, ang); }
void Key(unsigned char key, int x, int y){ switch (key) { case '<': // diminui if (tam >= 0.2) { tam-=0.1; glutPostRedisplay(); // faz o redisplay da janela } break; case '>': // aumenta if (tam <= 0.8) { tam+=0.1; glutPostRedisplay(); // faz o redisplay da janela } break; case 'R': // inicia rotação rodar=GL_TRUE; glutTimerFunc(delay,Timer,0); // define um callback de tempo (delay ms) break; case 'r': // termina rotação rodar=GL_FALSE; break; case 27: // Se é escape sai exit(0); } }
void Timer(int valor) { ang+= dif; // faz o incremento ao angulo de rotação if (ang>2*M_PI) { // se passou de 2*M_PI subtrai 2*M_PI ang=ang-2*M_PI; } glutPostRedisplay(); // redesenha o ecran if (rodar) glutTimerFunc(delay,Timer,0); // se ainda é para rodar redefine o callback }
Pode ainda ser criada uma função para parse da linha de comandos, é chamada da função main
int Args(int argc, char **argv){ GLint i; doubleBuffer = GL_FALSE; // define o doubleBuffer como falso tam=.5; // tamanho inicial do quadrado ang=0; // angulo inicial dif=M_PI/16; // incremento da rotação delay=250; // intervalo de animação for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-sb") == 0) { doubleBuffer = GL_FALSE; } else if (strcmp(argv[i], "-db") == 0) { doubleBuffer = GL_TRUE; } else if (strncmp(argv[i], "-dif", 4) == 0) { dif = atof(&argv[i][4]); if (dif > 2*M_PI) dif = M_PI/16; } else if (strncmp(argv[i], "-del", 4) == 0) { dif = atof(&argv[i][4]); if (delay < 10) delay = 10; }else { printf("%s (Bad option).\n", argv[i]); return GL_FALSE; } } return GL_TRUE; }
Ultima alteração: quarta-feira, 22 de Fevereiro de 2006 às 11:18