This is a simple OpenGL program that draws a set of vertices using various point and line primitives.
primitives.cc:
// Peter Bui // CSE 40166 Computer Graphics (Fall 2010) // Example 3: fun with OpenGL primitives #include "color.h" #include <cmath> #include <cstdio> #include <cstdlib> #include <unistd.h> #ifdef __APPLE__ #include <GLUT/glut.h> #else #include <GL/glut.h> #endif using namespace std; // Constants ------------------------------------------------------------------- #define NVERTICES 6 GLfloat VERTICES[NVERTICES][2] = { { 0.0, 0.0}, { 5.0, 0.0}, { 7.5, 2.5}, { 5.0, 5.0}, { 0.0, 5.0}, {-2.5, 2.5} }; #define NPRIMITIVES 4 int PRIMITIVES[NPRIMITIVES] = { GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP }; // Global variables ------------------------------------------------------------ static int WindowWidth = 640; static int WindowHeight = 480; static int BackgroundColor = COLOR_BLACK; // Initialize viewing ---------------------------------------------------------- void init() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-5.0, 10.0, -5.0, 10.0); glMatrixMode(GL_MODELVIEW); glClearColor(ColorTable[BackgroundColor][0], ColorTable[BackgroundColor][1], ColorTable[BackgroundColor][2], 1.0); glEnable(GL_POINT_SMOOTH); } // Display callback ------------------------------------------------------------ void display() { int ViewportWidth = WindowWidth*2 / NPRIMITIVES; int ViewportHeight = WindowHeight*2 / NPRIMITIVES; glClear(GL_COLOR_BUFFER_BIT); for (int p = 0; p < NPRIMITIVES; p++) { glViewport((p % 2) * ViewportWidth, (p < 2) ? ViewportHeight : 0, ViewportWidth, ViewportHeight); glColor3fv(color_rotate()); glBegin(PRIMITIVES[p]); { for (int i = 0; i < NVERTICES; i++) glVertex2fv(VERTICES[i]); }glEnd(); } glFlush(); } // Keyboard callback ----------------------------------------------------------- void keyboard(unsigned char key, int x, int y) { if (key == 'q' || key == 'Q') exit(EXIT_SUCCESS); } // Show usage ------------------------------------------------------------------ void show_usage() { printf("usage: primitives [options]\n"); printf("General Options:\n"); printf(" -h Show this help message\n"); printf("\nWindow Options:\n"); printf(" -W <width> Set window width\n"); printf(" -H <height> Set window height\n"); } // Parse command line arguments ------------------------------------------------ void parse_command_line_arguments(int argc, char *argv[]) { int c; while ((c = getopt(argc, argv, "W:H:h")) >= 0) { switch (c) { case 'W': WindowWidth = strtol(optarg, NULL, 10); break; case 'H': WindowHeight = strtol(optarg, NULL, 10); break; case 'h': show_usage(); exit(EXIT_SUCCESS); break; default: fprintf(stderr, "primitives: unknown command line argument %c\n", c); show_usage(); exit(EXIT_FAILURE); break; } } } // Main execution -------------------------------------------------------------- int main(int argc, char *argv[]) { glutInit(&argc, argv); parse_command_line_arguments(argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowSize(WindowWidth, WindowHeight); glutCreateWindow("primitives"); glutDisplayFunc(display); glutKeyboardFunc(keyboard); init(); glutMainLoop(); return (EXIT_SUCCESS); } // vim: sts=4 sw=4 ts=8 ft=cpp
color.h:
#ifndef COLOR_H #define COLOR_H #ifdef __APPLE__ #include <OpenGL/gl.h> #else #include <GL/gl.h> #endif GLfloat ColorTable[][3] = { { 0.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0 }, { 1.0, 1.0, 0.0 }, { 1.0, 0.0, 1.0 }, { 0.0, 1.0, 1.0 }, { 1.0, 1.0, 1.0 }, }; enum COLOR_TABLE_INDEX { COLOR_BLACK = 0, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE, COLOR_UNKNOWN }; GLfloat * color_rotate() { static int index = COLOR_BLACK; index = (index + 1) % COLOR_WHITE; return ColorTable[index]; } #endif