2010-09-07 11:34:51 -04:00
|
|
|
//========================================================================
|
|
|
|
// 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>
|
|
|
|
|
2012-06-05 17:55:10 -04:00
|
|
|
#define GLFW_INCLUDE_GLU
|
2010-10-24 09:04:17 -04:00
|
|
|
#include <GL/glfw3.h>
|
2010-09-07 11:34:51 -04:00
|
|
|
|
2010-10-24 09:02:59 -04:00
|
|
|
int main(void)
|
2010-09-07 11:34:51 -04:00
|
|
|
{
|
|
|
|
int width, height, x;
|
2010-09-09 13:18:18 -04:00
|
|
|
GLFWwindow window;
|
2010-09-07 11:34:51 -04:00
|
|
|
|
|
|
|
// Initialise GLFW
|
2012-02-07 08:58:58 -05:00
|
|
|
if (!glfwInit())
|
2010-09-07 11:34:51 -04:00
|
|
|
{
|
2010-10-24 09:02:59 -04:00
|
|
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
|
|
|
exit(EXIT_FAILURE);
|
2010-09-07 11:34:51 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// Open a window and create its OpenGL context
|
2012-09-27 15:37:36 -04:00
|
|
|
window = glfwCreateWindow(640, 480, "Spinning Triangle", NULL, NULL);
|
2010-09-09 13:18:18 -04:00
|
|
|
if (!window)
|
2010-09-07 11:34:51 -04:00
|
|
|
{
|
2010-10-24 09:02:59 -04:00
|
|
|
fprintf(stderr, "Failed to open GLFW window\n");
|
|
|
|
exit(EXIT_FAILURE);
|
2010-09-07 11:34:51 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// Enable vertical sync (on cards that support it)
|
2012-08-10 09:29:45 -04:00
|
|
|
glfwMakeContextCurrent(window);
|
2010-10-24 09:02:59 -04:00
|
|
|
glfwSwapInterval(1);
|
2010-09-07 11:34:51 -04:00
|
|
|
|
2012-08-10 09:29:45 -04:00
|
|
|
// Ensure we can capture the escape key being pressed below
|
|
|
|
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
|
|
|
|
|
2012-08-10 07:31:15 -04:00
|
|
|
for (;;)
|
2010-09-07 11:34:51 -04:00
|
|
|
{
|
2010-10-24 09:02:59 -04:00
|
|
|
double t = glfwGetTime();
|
2012-06-22 07:53:02 -04:00
|
|
|
glfwGetCursorPos(window, &x, NULL);
|
2010-09-07 11:34:51 -04:00
|
|
|
|
|
|
|
// Get window size (may be different than the requested size)
|
2010-10-24 09:02:59 -04:00
|
|
|
glfwGetWindowSize(window, &width, &height);
|
2010-09-07 11:34:51 -04:00
|
|
|
|
|
|
|
// Special case: avoid division by zero below
|
|
|
|
height = height > 0 ? height : 1;
|
|
|
|
|
2010-10-24 09:02:59 -04:00
|
|
|
glViewport(0, 0, width, height);
|
2010-09-07 11:34:51 -04:00
|
|
|
|
|
|
|
// Clear color buffer to black
|
2010-10-24 09:02:59 -04:00
|
|
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
2010-09-07 11:34:51 -04:00
|
|
|
|
|
|
|
// Select and setup the projection matrix
|
2010-10-24 09:02:59 -04:00
|
|
|
glMatrixMode(GL_PROJECTION);
|
2010-09-07 11:34:51 -04:00
|
|
|
glLoadIdentity();
|
2010-10-24 09:03:29 -04:00
|
|
|
gluPerspective(65.f, (GLfloat) width / (GLfloat) height, 1.f, 100.f);
|
2010-09-07 11:34:51 -04:00
|
|
|
|
|
|
|
// Select and setup the modelview matrix
|
|
|
|
glMatrixMode( GL_MODELVIEW );
|
|
|
|
glLoadIdentity();
|
2010-10-24 09:02:59 -04:00
|
|
|
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
|
2010-09-07 11:34:51 -04:00
|
|
|
|
|
|
|
// Draw a rotating colorful triangle
|
2010-10-24 09:02:59 -04:00
|
|
|
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);
|
2010-09-07 11:34:51 -04:00
|
|
|
glEnd();
|
|
|
|
|
|
|
|
// Swap buffers
|
2012-08-06 12:13:37 -04:00
|
|
|
glfwSwapBuffers(window);
|
2010-09-09 13:18:18 -04:00
|
|
|
glfwPollEvents();
|
2010-09-07 11:34:51 -04:00
|
|
|
|
2012-08-10 07:31:15 -04:00
|
|
|
// Check if the ESC key was pressed or the window should be closed
|
2012-08-03 10:20:52 -04:00
|
|
|
if (glfwGetKey(window, GLFW_KEY_ESCAPE))
|
2012-08-10 07:31:15 -04:00
|
|
|
break;
|
|
|
|
if (glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED))
|
|
|
|
break;
|
|
|
|
}
|
2010-09-07 11:34:51 -04:00
|
|
|
|
|
|
|
// Close OpenGL window and terminate GLFW
|
|
|
|
glfwTerminate();
|
|
|
|
|
2010-10-24 09:02:59 -04:00
|
|
|
exit(EXIT_SUCCESS);
|
2010-09-07 11:34:51 -04:00
|
|
|
}
|
|
|
|
|