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>
|
2010-09-10 13:16:03 +02:00
|
|
|
#include <GL/glfw3.h>
|
2010-09-07 17:34:51 +02:00
|
|
|
|
|
|
|
|
|
|
|
int main( void )
|
|
|
|
{
|
|
|
|
int width, height, x;
|
|
|
|
double t;
|
2010-09-09 19:18:18 +02:00
|
|
|
GLFWwindow window;
|
2010-09-07 17:34:51 +02:00
|
|
|
|
|
|
|
// Initialise GLFW
|
|
|
|
if( !glfwInit() )
|
|
|
|
{
|
|
|
|
fprintf( stderr, "Failed to initialize GLFW\n" );
|
|
|
|
exit( EXIT_FAILURE );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Open a window and create its OpenGL context
|
2010-09-10 13:24:19 +02:00
|
|
|
window = glfwOpenWindow( 640, 480, GLFW_WINDOWED );
|
2010-09-09 19:18:18 +02:00
|
|
|
if (!window)
|
2010-09-07 17:34:51 +02:00
|
|
|
{
|
|
|
|
fprintf( stderr, "Failed to open GLFW window\n" );
|
|
|
|
|
|
|
|
glfwTerminate();
|
|
|
|
exit( EXIT_FAILURE );
|
|
|
|
}
|
|
|
|
|
2010-09-09 19:18:18 +02:00
|
|
|
glfwSetWindowTitle( window, "Spinning Triangle" );
|
2010-09-07 17:34:51 +02:00
|
|
|
|
|
|
|
// Ensure we can capture the escape key being pressed below
|
2010-09-09 19:18:18 +02:00
|
|
|
glfwEnable( window, GLFW_STICKY_KEYS );
|
2010-09-07 17:34:51 +02:00
|
|
|
|
|
|
|
// Enable vertical sync (on cards that support it)
|
|
|
|
glfwSwapInterval( 1 );
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
t = glfwGetTime();
|
2010-09-09 19:18:18 +02:00
|
|
|
glfwGetMousePos( window, &x, NULL );
|
2010-09-07 17:34:51 +02:00
|
|
|
|
|
|
|
// Get window size (may be different than the requested size)
|
2010-09-09 19:18:18 +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;
|
|
|
|
|
|
|
|
glViewport( 0, 0, width, height );
|
|
|
|
|
|
|
|
// Clear color buffer to black
|
|
|
|
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
|
|
|
glClear( GL_COLOR_BUFFER_BIT );
|
|
|
|
|
|
|
|
// Select and setup the projection matrix
|
|
|
|
glMatrixMode( GL_PROJECTION );
|
|
|
|
glLoadIdentity();
|
|
|
|
gluPerspective( 65.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f );
|
|
|
|
|
|
|
|
// Select and setup the modelview matrix
|
|
|
|
glMatrixMode( GL_MODELVIEW );
|
|
|
|
glLoadIdentity();
|
|
|
|
gluLookAt( 0.0f, 1.0f, 0.0f, // Eye-position
|
|
|
|
0.0f, 20.0f, 0.0f, // View-point
|
|
|
|
0.0f, 0.0f, 1.0f ); // Up-vector
|
|
|
|
|
|
|
|
// Draw a rotating colorful triangle
|
|
|
|
glTranslatef( 0.0f, 14.0f, 0.0f );
|
|
|
|
glRotatef( 0.3f*(GLfloat)x + (GLfloat)t*100.0f, 0.0f, 0.0f, 1.0f );
|
|
|
|
glBegin( GL_TRIANGLES );
|
|
|
|
glColor3f( 1.0f, 0.0f, 0.0f );
|
|
|
|
glVertex3f( -5.0f, 0.0f, -4.0f );
|
|
|
|
glColor3f( 0.0f, 1.0f, 0.0f );
|
|
|
|
glVertex3f( 5.0f, 0.0f, -4.0f );
|
|
|
|
glColor3f( 0.0f, 0.0f, 1.0f );
|
|
|
|
glVertex3f( 0.0f, 0.0f, 6.0f );
|
|
|
|
glEnd();
|
|
|
|
|
|
|
|
// Swap buffers
|
|
|
|
glfwSwapBuffers();
|
2010-09-09 19:18:18 +02:00
|
|
|
glfwPollEvents();
|
2010-09-07 17:34:51 +02:00
|
|
|
|
|
|
|
} // Check if the ESC key was pressed or the window was closed
|
2010-09-09 19:18:18 +02:00
|
|
|
while( glfwIsWindow(window) &&
|
|
|
|
glfwGetKey( window, GLFW_KEY_ESC ) != GLFW_PRESS );
|
2010-09-07 17:34:51 +02:00
|
|
|
|
|
|
|
// Close OpenGL window and terminate GLFW
|
|
|
|
glfwTerminate();
|
|
|
|
|
|
|
|
exit( EXIT_SUCCESS );
|
|
|
|
}
|
|
|
|
|