| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- /*! \file subwin.c
- \ingroup demos
- This program is a test harness for the subwindows
- in OpenGLUT. Based Originally on shape.c demo.
-
- \author Written by Evan Felix February 2011
- \author Portions Copyright (C) 2004, the OpenGLUT project contributors. <br>
- OpenGLUT branched from freeglut in February, 2004.
-
- \image html openglut_subwin.png OpenGLUT Sub Window Demonstration
- \include demos/subwin/subwin.c
- */
- #include <GL/freeglut.h>
- #include <stdarg.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #ifdef _MSC_VER
- /* DUMP MEMORY LEAKS */
- #include <crtdbg.h>
- #endif
- #define MAXSTR 16
- char **strings;
- int mainwin;
- /*!
- Does printf()-like work using freeglut/OpenGLUT
- glutBitmapString(). Uses a fixed font. Prints
- at the indicated row/column position.
- Limitation: Cannot address pixels.
- Limitation: Renders in screen coords, not model coords.
- */
- static void shapesPrintf (int row, int col, const char *fmt, ...)
- {
- static char buf[256];
- int viewport[4];
- void *font = GLUT_BITMAP_9_BY_15;
- va_list args;
- va_start(args, fmt);
- #if defined(WIN32) && !defined(__CYGWIN__)
- (void) _vsnprintf (buf, sizeof(buf), fmt, args);
- #else
- (void) vsnprintf (buf, sizeof(buf), fmt, args);
- #endif
- va_end(args);
- glGetIntegerv(GL_VIEWPORT,viewport);
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho(0,viewport[2],0,viewport[3],-1,1);
- glRasterPos2i
- (
- glutBitmapWidth(font, ' ') * col,
- - glutBitmapHeight(font) * (row+2) + viewport[3]
- );
- glutBitmapString (font, (unsigned char*)buf);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- }
- /* GLUT callback Handlers */
- static void
- resize(int width, int height)
- {
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- /*gluOrtho2D(0, width, 0, height);*/
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity() ;
- }
- static void display(void)
- {
- int win = glutGetWindow();
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glColor3d(1,0,0);
- glDisable(GL_LIGHTING);
- glColor3d(0.1,0.1,0.4);
- if (win == mainwin)
- {
- shapesPrintf (2, 3, "Move The mouse into different windows");
- shapesPrintf (3, 3, "pressing keys will add to the string");
- shapesPrintf (5, 3, "Window: %d", win);
- shapesPrintf (6, 3, "String: %s", strings[win]);
- }
- else
- {
- shapesPrintf (1, 3, "Window: %d", win);
- shapesPrintf (2, 3, "String: %s", strings[win]);
- }
- glutSwapBuffers();
- }
- static void
- key(unsigned char key, int x, int y)
- {
- char *s,str[2];
- int win = glutGetWindow();
-
- switch (key)
- {
- case 27 :
- case 'Q':
- case 'q': glutLeaveMainLoop () ; break;
- default:
- s=strings[win];
- if (strlen(s)+1>MAXSTR) {
- s[0]=0;
- }
- str[0]=key;
- str[1]=0;
- strcat(s,str);
- break;
- }
- glutPostRedisplay();
- }
- static void special (int key, int x, int y)
- {
- switch (key)
- {
- default:
- break;
- }
- glutPostRedisplay();
- }
- static void
- entry(int state)
- {
- int win = glutGetWindow();
- printf("Win: %d, state: %d\n",win,state);
- }
- /* Program entry point */
- int
- main(int argc, char *argv[])
- {
- int winmax,sw1,sw2,sw2sw,i;
-
- glutInitWindowSize(640,480);
- glutInitWindowPosition(40,40);
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
- glutCreateWindow("FreeGLUT Sub Windows");
- glutReshapeFunc(resize);
- glutDisplayFunc(display);
- glutKeyboardFunc(key);
- glutSpecialFunc(special);
- glutEntryFunc(entry);
- glutSetOption ( GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION ) ;
- glClearColor(1,1,1,1);
- mainwin = glutGetWindow();
- winmax=mainwin;
-
- sw1=glutCreateSubWindow(mainwin,4,240,314,236);
- glutReshapeFunc(resize);
- glutDisplayFunc(display);
- glutKeyboardFunc(key);
- glutSpecialFunc(special);
- glutEntryFunc(entry);
- glClearColor(0.7f,0.7f,0.7f,1);
- winmax = sw1 > winmax ? sw1 : winmax;
- sw2=glutCreateSubWindow(mainwin,322,240,314,236);
- glutReshapeFunc(resize);
- glutDisplayFunc(display);
- glutKeyboardFunc(key);
- glutSpecialFunc(special);
- glutEntryFunc(entry);
- glClearColor(0.7f,0.7f,0.7f,1);
- winmax = sw2 > winmax ? sw2 : winmax;
- sw2sw=glutCreateSubWindow(sw2,10,128,294,98);
- glutReshapeFunc(resize);
- glutDisplayFunc(display);
- glutKeyboardFunc(key);
- glutSpecialFunc(special);
- glutEntryFunc(entry);
- glClearColor(0.4f,0.4f,0.4f,1);
- winmax = sw2sw > winmax ? sw2sw : winmax;
- strings = malloc(sizeof(char *)*(winmax+1));
- for (i=0;i<winmax+1;i++) {
- strings[i] = malloc(sizeof(char)*MAXSTR+1);
- strings[i][0]=0;
- }
- glutMainLoop();
- #ifdef _MSC_VER
- /* DUMP MEMORY LEAK INFORMATION */
- _CrtDumpMemoryLeaks () ;
- #endif
- return EXIT_SUCCESS;
- }
|