glTranslatef(-750,0,0) | -- move center of message to origin |
---|---|
glRotatef(angle, 0,0,1) | -- rotate message |
glTranslatef(1000,1000,0) | -- move rotated message to center of screen |
/* Copyright (c) Mark J. Kilgard, 1994. */ /* This program is freely distributable without licensing fees and is provided without guarantee or warrantee expressed or implied. This program is -not- in the public domain. */ #include <string.h > #include <GL/glut.h > // Following are the two types of stroke fonts in GLUT: void *fonts[] = {GLUT_STROKE_ROMAN, GLUT_STROKE_MONO_ROMAN}; // GLUT_STROKE_ROMAN has variable width: void *font = GLUT_STROKE_ROMAN; char defaultMessage[] = "GLUT means OpenGL."; char *message = defaultMessage; int angle = 0; void selectFont(int newfont) { font = fonts[newfont]; glutPostRedisplay(); } void selectMessage(int msg) { switch (msg) { case 1: message = "abcdefghijklmnop"; break; case 2: message = "ABCDEFGHIJKLMNOP"; break; } } void tick(void) { angle -= 2; glutPostRedisplay(); } void display(void) { int len, i; glClear(GL_COLOR_BUFFER_BIT); // Question: Why do we Push and Pop Matrix? glPushMatrix(); glRotatef(angle, 0.0, 0.0, 1.0); glTranslatef(-750, 0, 0); len = (int) strlen(message); for (i = 0; i < len; i++) { glutStrokeCharacter(font, message[i]); } glPopMatrix(); glutSwapBuffers(); } int main(int argc, char **argv) { int i, submenu; glutInit(&argc, argv); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-mono")) { font = GLUT_STROKE_MONO_ROMAN; } } glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(600, 600); glutCreateWindow("anti-aliased stroke font"); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 2000, 0, 2000); glMatrixMode(GL_MODELVIEW); glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLineWidth(3.0); glTranslatef(1000, 1000, 0); glClearColor(0.0, 0.0, 0.0, 1.0); glColor3f(1.0, 1.0, 1.0); glutDisplayFunc(display); glutIdleFunc(tick); submenu = glutCreateMenu(selectMessage); glutAddMenuEntry("abc", 1); glutAddMenuEntry("ABC", 2); glutCreateMenu(selectFont); glutAddMenuEntry("Roman", 0); glutAddMenuEntry("Mono Roman", 1); glutAddSubMenu("Messages", submenu); glutAttachMenu(GLUT_RIGHT_BUTTON); glutMainLoop(); return 0; /* ANSI C requires main to return int. */ }