glfw/examples/triangle.c

107 lines
2.9 KiB
C
Raw Normal View History

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