| //======================================================================== |
| // This is a small test application for GLFW. |
| // The program opens a window (640x480), and renders a spinning colored |
| // triangle (it is controlled with both the GLFW timer and the mouse). |
| //======================================================================== |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include <GL/glfw3.h> |
| |
| int main(void) |
| { |
| int width, height, x; |
| GLFWwindow window; |
| |
| // Initialise GLFW |
| if (!glfwInit()) |
| { |
| fprintf(stderr, "Failed to initialize GLFW\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| // Open a window and create its OpenGL context |
| window = glfwOpenWindow(640, 480, GLFW_WINDOWED, "Spinning Triangle", NULL); |
| if (!window) |
| { |
| fprintf(stderr, "Failed to open GLFW window\n"); |
| exit(EXIT_FAILURE); |
| } |
| |
| // Ensure we can capture the escape key being pressed below |
| glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); |
| |
| // Enable vertical sync (on cards that support it) |
| glfwSwapInterval(1); |
| |
| do |
| { |
| double t = glfwGetTime(); |
| glfwGetMousePos(window, &x, NULL); |
| |
| // Get window size (may be different than the requested size) |
| glfwGetWindowSize(window, &width, &height); |
| |
| // Special case: avoid division by zero below |
| height = height > 0 ? height : 1; |
| |
| glViewport(0, 0, width, height); |
| |
| // Clear color buffer to black |
| glClearColor(0.f, 0.f, 0.f, 0.f); |
| glClear(GL_COLOR_BUFFER_BIT); |
| |
| // Select and setup the projection matrix |
| glMatrixMode(GL_PROJECTION); |
| glLoadIdentity(); |
| gluPerspective(65.f, (GLfloat) width / (GLfloat) height, 1.f, 100.f); |
| |
| // Select and setup the modelview matrix |
| glMatrixMode( GL_MODELVIEW ); |
| glLoadIdentity(); |
| gluLookAt(0.f, 1.f, 0.f, // Eye-position |
| 0.f, 20.f, 0.f, // View-point |
| 0.f, 0.f, 1.f); // Up-vector |
| |
| // Draw a rotating colorful triangle |
| glTranslatef(0.f, 14.f, 0.f); |
| glRotatef(0.3f * (GLfloat) x + (GLfloat) t * 100.f, 0.f, 0.f, 1.f); |
| |
| glBegin(GL_TRIANGLES); |
| glColor3f(1.f, 0.f, 0.f); |
| glVertex3f(-5.f, 0.f, -4.f); |
| glColor3f(0.f, 1.f, 0.f); |
| glVertex3f(5.f, 0.f, -4.f); |
| glColor3f(0.f, 0.f, 1.f); |
| glVertex3f(0.f, 0.f, 6.f); |
| glEnd(); |
| |
| // Swap buffers |
| glfwSwapBuffers(); |
| glfwPollEvents(); |
| |
| } // Check if the ESC key was pressed or the window was closed |
| while (glfwIsWindow(window) && |
| glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS); |
| |
| // Close OpenGL window and terminate GLFW |
| glfwTerminate(); |
| |
| exit(EXIT_SUCCESS); |
| } |
| |