/* main_glut.c - Don Yang (uguu.org) 05/12/03 */ #include"core.h" static int WindowHandle = 0; static int MouseX = 0, MouseY = 0; static void FirstPaint(void); static void InitWindowManager(void); static void ProcessIdleEvent(void); static void ProcessKeyboardEvent(unsigned char c, /*@unused@*/int u, /*@unused@*/int v); static void ProcessMouseButton(/*@unused@*/int b, /*@unused@*/int state, int x, int y); static void ProcessMouseMove(int x, int y); static void ProcessPaintEvent(void); static void ProcessResizeEvent(/*@unused@*/int w, /*@unused@*/int h); /******************************************************************** main */ int main(int argc, char **argv) { glutInit(&argc, argv); InitWindowManager(); glutMainLoop(); return 0; } /* main() */ /************************************************************** FirstPaint */ static void FirstPaint(void) { Init(); /* (core.c) */ glutDisplayFunc(ProcessPaintEvent); glutSetWindow(WindowHandle); glutPostRedisplay(); } /* FirstPaint() */ /******************************************************* InitWindowManager */ static void InitWindowManager(void) { glutInitDisplayMode((unsigned)(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)); glutInitWindowSize(WINDOW_INIT_WIDTH, WINDOW_INIT_HEIGHT); glutInitWindowPosition(WINDOW_INIT_X, WINDOW_INIT_Y); WindowHandle = glutCreateWindow(WINDOW_TITLE); glutSetWindowTitle(WINDOW_TITLE); glutSetWindow(WindowHandle); glutDisplayFunc(FirstPaint); glutIdleFunc(ProcessIdleEvent); glutReshapeFunc(ProcessResizeEvent); glutKeyboardFunc(ProcessKeyboardEvent); glutMouseFunc(ProcessMouseButton); glutMotionFunc(ProcessMouseMove); } /* InitWindowManager() */ /******************************************************** ProcessIdleEvent */ static void ProcessIdleEvent(void) { glutSetWindow(WindowHandle); glutPostRedisplay(); } /* ProcessIdleEvent() */ /**************************************************** ProcessKeyboardEvent */ static void ProcessKeyboardEvent(unsigned char c, /*@unused@*/int u, /*@unused@*/int v) { if( (int)c == 27 || tolower(c) == (int)'q' || tolower(c) == (int)'x' ) { glFlush(); Cleanup(); /* (core.c) */ exit(EXIT_SUCCESS); } } /* ProcessKeyboardEvent() */ /****************************************************** ProcessMouseButton */ static void ProcessMouseButton(/*@unused@*/int b, /*@unused@*/int state, int x, int y) { MouseX = x; MouseY = y; } /* ProcessMouseButton() */ /******************************************************** ProcessMouseMove */ static void ProcessMouseMove(int x, int y) { int dx, dy; /* Move window when mouse buttons are pressed. Note that we do not have to track button state, since this is not a glutPassiveMotion callback function, some button must be pressed. */ glutPositionWindow(glutGet(GLUT_WINDOW_X) + (dx = x - MouseX), glutGet(GLUT_WINDOW_Y) + (dy = y - MouseY)); MouseX = x - dx; MouseY = y - dy; } /* ProcessMouseMove() */ /******************************************************* ProcessPaintEvent */ static void ProcessPaintEvent(void) { glutSetWindow(WindowHandle); Render(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT)); glutSwapBuffers(); glFlush(); } /* ProcessPaintEvent() */ /****************************************************** ProcessResizeEvent */ static void ProcessResizeEvent(/*@unused@*/int w, /*@unused@*/int h) { glutSetWindow(WindowHandle); glutPostRedisplay(); } /* ProcessResizeEvent() */