Sistemas de Interfaces com o Usuário e Glut/OpenGL Objetos de comuns interface Modelo de Programação Toolkit de Interface (GLUT, SDK, ... ) Dispositivos Usuário Sistema Gráfico (OpenGL, Direct3D, ...) Computador Programa GráficoInterativo Programação Convencional Programação Convencional Os comandos são executados segundo uma ordem préestabelecida e seqüêncial. inicio captura dados processa dados fim Eventos típicos (WIMP) KeyPress KeyRelease ButtonPress ButtonRelease Motion LeaveNotify EnterNotify WindowExposure Resize Timer Idle Janela A Janela B Janela C Modelo de Call Backs Processa Evento Tipo 1 Eventos Examina eventos, chama os módulos de processamento Motif Visual Basic Glut IUP ... Processa Evento Tipo 2 Processa Evento Tipo 3 Programa de Aplicação Visual Basic Ponteiro para Função em C Na linguagem C você pode criar e manipular ponteiros para funções. – Isso permite escolher qual função a ser usada em tempo de execução. – O ponteiro para uma função pode ser passado como parâmetro para outra função. Exemplo 1 de Function Pointer int func1(int arg) { return(2 * arg); } int func2(int arg) { return(10 * arg); } void func3(int (*func_ptr)(int)) { int i = 10, j; j = func_ptr(i); printf("\n%d",j); } void main(void) { func3(func1); func3(func2); } Exemplo 2 (QuickSort) void qsort (void* base, int nel, int width, int (*CPtr)(void*, void*)); Para comparar caracteres, deve ser criada uma função de comparação: int CmpChar ( char* a, char* b) { if ( *a == *b ) return 0; else return ( *a > *b ? 1 : -1 ); } int (*CmpPtr)(); // declare a function pointer CmpPtr = CmpChar; // initialize it qsort ( buffer, 32, sizeof(char), CmpPtr ); Exemplo 3 (CallBack IUP) typedef int (*Icallback)(Ihandle *, ...); Icallback IupSetFunction (char *ação, Icallback função) ; static int iup_CbFechaTodos( void ); static int iup_CbAbreTodos( void ); static int iup_CbMousePress (Ihandle* self,int botao,int estado,int x,int y,char* r); static int iup_CbMouseMove(Ihandle *self, int x, int y, char*r); static int iup_CbMouseEnter (Ihandle *self); IupSetFunction("cb_FechaTodos", (Icallback) iup_CbFechaTodos); IupSetFunction("cb_AbreTodos", (Icallback) iup_CbAbreTodos); IupSetFunction("cb_MousePress", (Icallback) iup_CbMousePress); IupSetFunction("cb_MouseMove", (Icallback) iup_CbMouseMove); IupSetFunction("cb_MouseEnter", (Icallback) iup_CbMouseEnter); OpenGL/GLUT #include <glut.h> #include <image.h> /* Variaveis globais */ typedef struct window_impl { int width; int height;} Window; Window window; IMAGE pic; int main(int argc, char **argv) { pic = imgReadBMP(filename); imgGetDimensions(pic, &window.width, &window.height); /* GLUT - Initialization */ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(window.width, window.height); glutCreateWindow("CG2001-T1"); /* Registrando callbacks */ glutDisplayFunc(displayCall); glutReshapeFunc(reshapeCall); glutMouseFunc(mouseCall); glutMotionFunc(motionCall); glutKeyboardFunc(keyboardCall); glutIdleFunc(idleCall); /* GLUT main loop */ glutMainLoop(); return 0; } Exemplo simples da GLUT void displayCall(void) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); imgDraw(pic); glFlush(); glutSwapBuffers(); } void reshapeCall(int width, int height) { glViewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D (0.0, (GLsizei)width, 0.0, (GLsizei)height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); window.width = width; window.height = height; }