diff --git a/examples/splitview.c b/examples/splitview.c index 1611ad90..42c5ec16 100644 --- a/examples/splitview.c +++ b/examples/splitview.c @@ -50,48 +50,49 @@ static int do_redraw = 1; #define TORUS_MAJOR_RES 32 #define TORUS_MINOR_RES 32 -static void drawTorus( void ) +static void drawTorus(void) { static GLuint torus_list = 0; int i, j, k; double s, t, x, y, z, nx, ny, nz, scale, twopi; - if( !torus_list ) + if (!torus_list) { // Start recording displaylist - torus_list = glGenLists( 1 ); - glNewList( torus_list, GL_COMPILE_AND_EXECUTE ); + torus_list = glGenLists(1); + glNewList(torus_list, GL_COMPILE_AND_EXECUTE); // Draw torus twopi = 2.0 * M_PI; - for( i = 0; i < TORUS_MINOR_RES; i++ ) + for (i = 0; i < TORUS_MINOR_RES; i++) { - glBegin( GL_QUAD_STRIP ); - for( j = 0; j <= TORUS_MAJOR_RES; j++ ) + glBegin(GL_QUAD_STRIP); + for (j = 0; j <= TORUS_MAJOR_RES; j++) { - for( k = 1; k >= 0; k-- ) + for (k = 1; k >= 0; k--) { s = (i + k) % TORUS_MINOR_RES + 0.5; t = j % TORUS_MAJOR_RES; // Calculate point on surface - x = (TORUS_MAJOR+TORUS_MINOR*cos(s*twopi/TORUS_MINOR_RES))*cos(t*twopi/TORUS_MAJOR_RES); + x = (TORUS_MAJOR + TORUS_MINOR * cos(s * twopi / TORUS_MINOR_RES)) * cos(t * twopi / TORUS_MAJOR_RES); y = TORUS_MINOR * sin(s * twopi / TORUS_MINOR_RES); - z = (TORUS_MAJOR+TORUS_MINOR*cos(s*twopi/TORUS_MINOR_RES))*sin(t*twopi/TORUS_MAJOR_RES); + z = (TORUS_MAJOR + TORUS_MINOR * cos(s * twopi / TORUS_MINOR_RES)) * sin(t * twopi / TORUS_MAJOR_RES); // Calculate surface normal - nx = x - TORUS_MAJOR*cos(t*twopi/TORUS_MAJOR_RES); + nx = x - TORUS_MAJOR * cos(t * twopi / TORUS_MAJOR_RES); ny = y; - nz = z - TORUS_MAJOR*sin(t*twopi/TORUS_MAJOR_RES); - scale = 1.0 / sqrt( nx*nx + ny*ny + nz*nz ); + nz = z - TORUS_MAJOR * sin(t * twopi / TORUS_MAJOR_RES); + scale = 1.0 / sqrt(nx*nx + ny*ny + nz*nz); nx *= scale; ny *= scale; nz *= scale; - glNormal3f( (float)nx, (float)ny, (float)nz ); - glVertex3f( (float)x, (float)y, (float)z ); + glNormal3f((float) nx, (float) ny, (float) nz); + glVertex3f((float) x, (float) y, (float) z); } } + glEnd(); } @@ -101,7 +102,7 @@ static void drawTorus( void ) else { // Playback displaylist - glCallList( torus_list ); + glCallList(torus_list); } } @@ -110,7 +111,7 @@ static void drawTorus( void ) // Draw the scene (a rotating torus) //======================================================================== -static void drawScene( void ) +static void drawScene(void) { const GLfloat model_diffuse[4] = {1.0f, 0.8f, 0.8f, 1.0f}; const GLfloat model_specular[4] = {0.6f, 0.6f, 0.6f, 1.0f}; @@ -119,17 +120,17 @@ static void drawScene( void ) glPushMatrix(); // Rotate the object - glRotatef( (GLfloat)rot_x*0.5f, 1.0f, 0.0f, 0.0f ); - glRotatef( (GLfloat)rot_y*0.5f, 0.0f, 1.0f, 0.0f ); - glRotatef( (GLfloat)rot_z*0.5f, 0.0f, 0.0f, 1.0f ); + glRotatef((GLfloat) rot_x * 0.5f, 1.0f, 0.0f, 0.0f); + glRotatef((GLfloat) rot_y * 0.5f, 0.0f, 1.0f, 0.0f); + glRotatef((GLfloat) rot_z * 0.5f, 0.0f, 0.0f, 1.0f); // Set model color (used for orthogonal views, lighting disabled) - glColor4fv( model_diffuse ); + glColor4fv(model_diffuse); // Set model material (used for perspective view, lighting enabled) - glMaterialfv( GL_FRONT, GL_DIFFUSE, model_diffuse ); - glMaterialfv( GL_FRONT, GL_SPECULAR, model_specular ); - glMaterialf( GL_FRONT, GL_SHININESS, model_shininess ); + glMaterialfv(GL_FRONT, GL_DIFFUSE, model_diffuse); + glMaterialfv(GL_FRONT, GL_SPECULAR, model_specular); + glMaterialf(GL_FRONT, GL_SHININESS, model_shininess); // Draw torus drawTorus(); @@ -142,55 +143,55 @@ static void drawScene( void ) // Draw a 2D grid (used for orthogonal views) //======================================================================== -static void drawGrid( float scale, int steps ) +static void drawGrid(float scale, int steps) { - int i; + int i; float x, y; glPushMatrix(); // Set background to some dark bluish grey - glClearColor( 0.05f, 0.05f, 0.2f, 0.0f); - glClear( GL_COLOR_BUFFER_BIT ); + glClearColor(0.05f, 0.05f, 0.2f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); // Setup modelview matrix (flat XY view) glLoadIdentity(); - gluLookAt( 0.0, 0.0, 1.0, - 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0 ); + gluLookAt(0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0); // We don't want to update the Z-buffer - glDepthMask( GL_FALSE ); + glDepthMask(GL_FALSE); // Set grid color - glColor3f( 0.0f, 0.5f, 0.5f ); + glColor3f(0.0f, 0.5f, 0.5f); - glBegin( GL_LINES ); + glBegin(GL_LINES); // Horizontal lines - x = scale * 0.5f * (float)(steps-1); - y = -scale * 0.5f * (float)(steps-1); - for( i = 0; i < steps; i ++ ) + x = scale * 0.5f * (float) (steps - 1); + y = -scale * 0.5f * (float) (steps - 1); + for (i = 0; i < steps; i++) { - glVertex3f( -x, y, 0.0f ); - glVertex3f( x, y, 0.0f ); + glVertex3f(-x, y, 0.0f); + glVertex3f(x, y, 0.0f); y += scale; } // Vertical lines - x = -scale * 0.5f * (float)(steps-1); - y = scale * 0.5f * (float)(steps-1); - for( i = 0; i < steps; i ++ ) + x = -scale * 0.5f * (float) (steps - 1); + y = scale * 0.5f * (float) (steps - 1); + for (i = 0; i < steps; i++) { - glVertex3f( x, -y, 0.0f ); - glVertex3f( x, y, 0.0f ); + glVertex3f(x, -y, 0.0f); + glVertex3f(x, y, 0.0f); x += scale; } glEnd(); // Enable Z-buffer writing again - glDepthMask( GL_TRUE ); + glDepthMask(GL_TRUE); glPopMatrix(); } @@ -200,7 +201,7 @@ static void drawGrid( float scale, int steps ) // Draw all views //======================================================================== -static void drawAllViews( void ) +static void drawAllViews(void) { const GLfloat light_position[4] = {0.0f, 8.0f, 8.0f, 1.0f}; const GLfloat light_diffuse[4] = {1.0f, 1.0f, 1.0f, 1.0f}; @@ -209,145 +210,142 @@ static void drawAllViews( void ) double aspect; // Calculate aspect of window - if( height > 0 ) - { - aspect = (double)width / (double)height; - } + if (height > 0) + aspect = (double) width / (double) height; else - { aspect = 1.0; - } // Clear screen - glClearColor( 0.0f, 0.0f, 0.0f, 0.0f); - glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Enable scissor test - glEnable( GL_SCISSOR_TEST ); + glEnable(GL_SCISSOR_TEST); // Enable depth test - glEnable( GL_DEPTH_TEST ); - glDepthFunc( GL_LEQUAL ); - + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); // ** ORTHOGONAL VIEWS ** // For orthogonal views, use wireframe rendering - glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Enable line anti-aliasing - glEnable( GL_LINE_SMOOTH ); - glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + glEnable(GL_LINE_SMOOTH); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Setup orthogonal projection matrix - glMatrixMode( GL_PROJECTION ); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho( -3.0*aspect, 3.0*aspect, -3.0, 3.0, 1.0, 50.0 ); + glOrtho(-3.0 * aspect, 3.0 * aspect, -3.0, 3.0, 1.0, 50.0); // Upper left view (TOP VIEW) - glViewport( 0, height/2, width/2, height/2 ); - glScissor( 0, height/2, width/2, height/2 ); - glMatrixMode( GL_MODELVIEW ); + glViewport(0, height / 2, width / 2, height / 2); + glScissor(0, height / 2, width / 2, height / 2); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt( 0.0f, 10.0f, 1e-3f, // Eye-position (above) - 0.0f, 0.0f, 0.0f, // View-point - 0.0f, 1.0f, 0.0f ); // Up-vector - drawGrid( 0.5, 12 ); + gluLookAt(0.0f, 10.0f, 1e-3f, // Eye-position (above) + 0.0f, 0.0f, 0.0f, // View-point + 0.0f, 1.0f, 0.0f); // Up-vector + drawGrid(0.5, 12); drawScene(); // Lower left view (FRONT VIEW) - glViewport( 0, 0, width/2, height/2 ); - glScissor( 0, 0, width/2, height/2 ); - glMatrixMode( GL_MODELVIEW ); + glViewport(0, 0, width / 2, height / 2); + glScissor(0, 0, width / 2, height / 2); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt( 0.0f, 0.0f, 10.0f, // Eye-position (in front of) - 0.0f, 0.0f, 0.0f, // View-point - 0.0f, 1.0f, 0.0f ); // Up-vector - drawGrid( 0.5, 12 ); + gluLookAt(0.0f, 0.0f, 10.0f, // Eye-position (in front of) + 0.0f, 0.0f, 0.0f, // View-point + 0.0f, 1.0f, 0.0f); // Up-vector + drawGrid(0.5, 12); drawScene(); // Lower right view (SIDE VIEW) - glViewport( width/2, 0, width/2, height/2 ); - glScissor( width/2, 0, width/2, height/2 ); - glMatrixMode( GL_MODELVIEW ); + glViewport(width / 2, 0, width / 2, height / 2); + glScissor(width / 2, 0, width / 2, height / 2); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt( 10.0f, 0.0f, 0.0f, // Eye-position (to the right) - 0.0f, 0.0f, 0.0f, // View-point - 0.0f, 1.0f, 0.0f ); // Up-vector - drawGrid( 0.5, 12 ); + gluLookAt(10.0f, 0.0f, 0.0f, // Eye-position (to the right) + 0.0f, 0.0f, 0.0f, // View-point + 0.0f, 1.0f, 0.0f); // Up-vector + drawGrid(0.5, 12); drawScene(); // Disable line anti-aliasing - glDisable( GL_LINE_SMOOTH ); - glDisable( GL_BLEND ); - + glDisable(GL_LINE_SMOOTH); + glDisable(GL_BLEND); // ** PERSPECTIVE VIEW ** // For perspective view, use solid rendering - glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // Enable face culling (faster rendering) - glEnable( GL_CULL_FACE ); - glCullFace( GL_BACK ); - glFrontFace( GL_CW ); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CW); // Setup perspective projection matrix - glMatrixMode( GL_PROJECTION ); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective( 65.0f, aspect, 1.0f, 50.0f ); + gluPerspective(65.0f, aspect, 1.0f, 50.0f); // Upper right view (PERSPECTIVE VIEW) - glViewport( width/2, height/2, width/2, height/2 ); - glScissor( width/2, height/2, width/2, height/2 ); - glMatrixMode( GL_MODELVIEW ); + glViewport(width / 2, height / 2, width / 2, height / 2); + glScissor(width / 2, height / 2, width / 2, height / 2); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt( 3.0f, 1.5f, 3.0f, // Eye-position - 0.0f, 0.0f, 0.0f, // View-point - 0.0f, 1.0f, 0.0f ); // Up-vector + gluLookAt(3.0f, 1.5f, 3.0f, // Eye-position + 0.0f, 0.0f, 0.0f, // View-point + 0.0f, 1.0f, 0.0f); // Up-vector // Configure and enable light source 1 - glLightfv( GL_LIGHT1, GL_POSITION, light_position ); - glLightfv( GL_LIGHT1, GL_AMBIENT, light_ambient ); - glLightfv( GL_LIGHT1, GL_DIFFUSE, light_diffuse ); - glLightfv( GL_LIGHT1, GL_SPECULAR, light_specular ); - glEnable( GL_LIGHT1 ); - glEnable( GL_LIGHTING ); + glLightfv(GL_LIGHT1, GL_POSITION, light_position); + glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); + glEnable(GL_LIGHT1); + glEnable(GL_LIGHTING); // Draw scene drawScene(); // Disable lighting - glDisable( GL_LIGHTING ); + glDisable(GL_LIGHTING); // Disable face culling - glDisable( GL_CULL_FACE ); + glDisable(GL_CULL_FACE); // Disable depth test - glDisable( GL_DEPTH_TEST ); + glDisable(GL_DEPTH_TEST); // Disable scissor test - glDisable( GL_SCISSOR_TEST ); - + glDisable(GL_SCISSOR_TEST); // Draw a border around the active view - if( active_view > 0 && active_view != 2 ) + if (active_view > 0 && active_view != 2) { - glViewport( 0, 0, width, height ); - glMatrixMode( GL_PROJECTION ); + glViewport(0, 0, width, height); + + glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho( 0.0, 2.0, 0.0, 2.0, 0.0, 1.0 ); - glMatrixMode( GL_MODELVIEW ); + glOrtho(0.0, 2.0, 0.0, 2.0, 0.0, 1.0); + + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glColor3f( 1.0f, 1.0f, 0.6f ); - glTranslatef( (GLfloat) ((active_view - 1) & 1), (GLfloat) (1 - (active_view - 1) / 2), 0.0f ); - glBegin( GL_LINE_STRIP ); - glVertex2i( 0, 0 ); - glVertex2i( 1, 0 ); - glVertex2i( 1, 1 ); - glVertex2i( 0, 1 ); - glVertex2i( 0, 0 ); + glTranslatef((GLfloat) ((active_view - 1) & 1), (GLfloat) (1 - (active_view - 1) / 2), 0.0f); + + glColor3f(1.0f, 1.0f, 0.6f); + + glBegin(GL_LINE_STRIP); + glVertex2i(0, 0); + glVertex2i(1, 0); + glVertex2i(1, 1); + glVertex2i(0, 1); + glVertex2i(0, 0); glEnd(); } } @@ -357,7 +355,7 @@ static void drawAllViews( void ) // Window size callback function //======================================================================== -static void windowSizeFun( GLFWwindow window, int w, int h ) +static void windowSizeFun(GLFWwindow window, int w, int h) { width = w; height = h > 0 ? h : 1; @@ -369,7 +367,7 @@ static void windowSizeFun( GLFWwindow window, int w, int h ) // Window refresh callback function //======================================================================== -static void windowRefreshFun( GLFWwindow window ) +static void windowRefreshFun(GLFWwindow window) { do_redraw = 1; } @@ -379,10 +377,10 @@ static void windowRefreshFun( GLFWwindow window ) // Mouse position callback function //======================================================================== -static void mousePosFun( GLFWwindow window, int x, int y ) +static void mousePosFun(GLFWwindow window, int x, int y) { // Depending on which view was selected, rotate around different axes - switch( active_view ) + switch (active_view) { case 1: rot_x += y - ypos; @@ -414,25 +412,18 @@ static void mousePosFun( GLFWwindow window, int x, int y ) // Mouse button callback function //======================================================================== -static void mouseButtonFun( GLFWwindow window, int button, int action ) +static void mouseButtonFun(GLFWwindow window, int button, int action) { - // Button clicked? - if( ( button == GLFW_MOUSE_BUTTON_LEFT ) && action == GLFW_PRESS ) + if ((button == GLFW_MOUSE_BUTTON_LEFT) && action == GLFW_PRESS) { // Detect which of the four views was clicked active_view = 1; - if( xpos >= width/2 ) - { + if (xpos >= width / 2) active_view += 1; - } - if( ypos >= height/2 ) - { + if (ypos >= height / 2) active_view += 2; - } } - - // Button released? - else if( button == GLFW_MOUSE_BUTTON_LEFT ) + else if (button == GLFW_MOUSE_BUTTON_LEFT) { // Deselect any previously selected view active_view = 0; @@ -443,51 +434,50 @@ static void mouseButtonFun( GLFWwindow window, int button, int action ) //======================================================================== -// main() +// main //======================================================================== -int main( void ) +int main(void) { GLFWwindow window; // Initialise GLFW - if( !glfwInit() ) + if (!glfwInit()) { - fprintf( stderr, "Failed to initialize GLFW\n" ); - exit( EXIT_FAILURE ); + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(EXIT_FAILURE); } glfwOpenWindowHint(GLFW_DEPTH_BITS, 16); // Open OpenGL window - window = glfwOpenWindow( 500, 500, GLFW_WINDOWED, "Split view demo", NULL ); + window = glfwOpenWindow(500, 500, GLFW_WINDOWED, "Split view demo", NULL); if (!window) { - fprintf( stderr, "Failed to open GLFW window\n" ); - glfwTerminate(); - exit( EXIT_FAILURE ); + fprintf(stderr, "Failed to open GLFW window\n"); + exit(EXIT_FAILURE); } // Enable vsync - glfwSwapInterval( 1 ); + glfwSwapInterval(1); // Enable sticky keys - glfwEnable( window, GLFW_STICKY_KEYS ); + glfwEnable(window, GLFW_STICKY_KEYS); // Enable mouse cursor (only needed for fullscreen mode) - glfwEnable( window, GLFW_MOUSE_CURSOR ); + glfwEnable(window, GLFW_MOUSE_CURSOR); // Set callback functions - glfwSetWindowSizeCallback( window, windowSizeFun ); - glfwSetWindowRefreshCallback( window, windowRefreshFun ); - glfwSetMousePosCallback( window, mousePosFun ); - glfwSetMouseButtonCallback( window, mouseButtonFun ); + glfwSetWindowSizeCallback(window, windowSizeFun); + glfwSetWindowRefreshCallback(window, windowRefreshFun); + glfwSetMousePosCallback(window, mousePosFun); + glfwSetMouseButtonCallback(window, mouseButtonFun); // Main loop do { // Only redraw if we need to - if( do_redraw ) + if (do_redraw) { // Draw all views drawAllViews(); @@ -502,12 +492,12 @@ int main( void ) glfwWaitEvents(); } // Check if the ESC key was pressed or the window was closed - while( glfwIsWindow(window) && - glfwGetKey(window, GLFW_KEY_ESC) != GLFW_PRESS ); + while (glfwIsWindow(window) && + glfwGetKey(window, GLFW_KEY_ESC) != GLFW_PRESS); // Close OpenGL window and terminate GLFW glfwTerminate(); - exit( EXIT_SUCCESS ); + exit(EXIT_SUCCESS); }