aboutsummaryrefslogtreecommitdiff
path: root/tests/glfw/splitview.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/glfw/splitview.c')
-rw-r--r--tests/glfw/splitview.c525
1 files changed, 0 insertions, 525 deletions
diff --git a/tests/glfw/splitview.c b/tests/glfw/splitview.c
deleted file mode 100644
index bb85a6e7..00000000
--- a/tests/glfw/splitview.c
+++ /dev/null
@@ -1,525 +0,0 @@
-//========================================================================
-// This is an example program for the GLFW library
-//
-// The program uses a "split window" view, rendering four views of the
-// same scene in one window (e.g. uesful for 3D modelling software). This
-// demo uses scissors to separete the four different rendering areas from
-// each other.
-//
-// (If the code seems a little bit strange here and there, it may be
-// because I am not a friend of orthogonal projections)
-//========================================================================
-
-#include <GL/glfw.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifdef EMSCRIPTEN
-#include <emscripten/emscripten.h>
-#endif
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-
-//========================================================================
-// Global variables
-//========================================================================
-
-// Mouse position
-static int xpos = 0, ypos = 0;
-
-// Window size
-static int width, height;
-
-// Active view: 0 = none, 1 = upper left, 2 = upper right, 3 = lower left,
-// 4 = lower right
-static int active_view = 0;
-
-// Rotation around each axis
-static int rot_x = 0, rot_y = 0, rot_z = 0;
-
-// Do redraw?
-static int do_redraw = 1;
-
-
-//========================================================================
-// Draw a solid torus (use a display list for the model)
-//========================================================================
-
-#define TORUS_MAJOR 1.5
-#define TORUS_MINOR 0.5
-#define TORUS_MAJOR_RES 32
-#define TORUS_MINOR_RES 32
-
-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 )
- {
- // Start recording displaylist
- 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++ )
- {
- glBegin( GL_QUAD_STRIP );
- for( j = 0; j <= TORUS_MAJOR_RES; j++ )
- {
- 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);
- 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);
-
- // Calculate surface normal
- 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 );
- nx *= scale;
- ny *= scale;
- nz *= scale;
-
- glNormal3f( (float)nx, (float)ny, (float)nz );
- glVertex3f( (float)x, (float)y, (float)z );
- }
- }
- glEnd();
- }
-
- // Stop recording displaylist
- glEndList();
- }
- else
- {
- // Playback displaylist
- glCallList( torus_list );
- }
-}
-
-
-//========================================================================
-// Draw the scene (a rotating torus)
-//========================================================================
-
-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};
- const GLfloat model_shininess = 20.0f;
-
- 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 );
-
- // Set model color (used for orthogonal views, lighting disabled)
- 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 );
-
- // Draw torus
- drawTorus();
-
- glPopMatrix();
-}
-
-
-//========================================================================
-// Draw a 2D grid (used for orthogonal views)
-//========================================================================
-
-static void drawGrid( float scale, int steps )
-{
- 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 );
-
- // 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 );
-
- // We don't want to update the Z-buffer
- glDepthMask( GL_FALSE );
-
- // Set grid color
- glColor3f( 0.0f, 0.5f, 0.5f );
-
- 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 ++ )
- {
- 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 ++ )
- {
- glVertex3f( x, -y, 0.0f );
- glVertex3f( x, y, 0.0f );
- x += scale;
- }
-
- glEnd();
-
- // Enable Z-buffer writing again
- glDepthMask( GL_TRUE );
-
- glPopMatrix();
-}
-
-
-//========================================================================
-// Draw all views
-//========================================================================
-
-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};
- const GLfloat light_specular[4] = {1.0f, 1.0f, 1.0f, 1.0f};
- const GLfloat light_ambient[4] = {0.2f, 0.2f, 0.3f, 1.0f};
- double aspect;
-
- // Calculate aspect of window
- 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 );
-
- // Enable scissor test
- glEnable( GL_SCISSOR_TEST );
-
- // Enable depth test
- glEnable( GL_DEPTH_TEST );
- glDepthFunc( GL_LEQUAL );
-
-
- // ** ORTHOGONAL VIEWS **
-
- // For orthogonal views, use wireframe rendering
- 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 );
-
- // Setup orthogonal projection matrix
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- 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 );
- 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 );
- drawScene();
-
- // Lower left view (FRONT VIEW)
- 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 );
- 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 );
- 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 );
- drawScene();
-
- // Disable line anti-aliasing
- glDisable( GL_LINE_SMOOTH );
- glDisable( GL_BLEND );
-
-
- // ** PERSPECTIVE VIEW **
-
- // For perspective view, use solid rendering
- glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
-
- // Enable face culling (faster rendering)
- glEnable( GL_CULL_FACE );
- glCullFace( GL_BACK );
- glFrontFace( GL_CW );
-
- // Setup perspective projection matrix
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- 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 );
- 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
-
- // 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 );
-
- // Draw scene
- drawScene();
-
- // Disable lighting
- glDisable( GL_LIGHTING );
-
- // Disable face culling
- glDisable( GL_CULL_FACE );
-
- // Disable depth test
- glDisable( GL_DEPTH_TEST );
-
- // Disable scissor test
- glDisable( GL_SCISSOR_TEST );
-
-
- // Draw a border around the active view
- if( active_view > 0 && active_view != 2 )
- {
- 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 );
- 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 );
- glEnd();
- }
-}
-
-
-//========================================================================
-// Window size callback function
-//========================================================================
-
-static void GLFWCALL windowSizeFun( int w, int h )
-{
- width = w;
- height = h > 0 ? h : 1;
- do_redraw = 1;
-}
-
-
-//========================================================================
-// Window refresh callback function
-//========================================================================
-
-static void GLFWCALL windowRefreshFun( void )
-{
- do_redraw = 1;
-}
-
-
-//========================================================================
-// Mouse position callback function
-//========================================================================
-
-static void GLFWCALL mousePosFun( int x, int y )
-{
- // Depending on which view was selected, rotate around different axes
- switch( active_view )
- {
- case 1:
- rot_x += y - ypos;
- rot_z += x - xpos;
- do_redraw = 1;
- break;
- case 3:
- rot_x += y - ypos;
- rot_y += x - xpos;
- do_redraw = 1;
- break;
- case 4:
- rot_y += x - xpos;
- rot_z += y - ypos;
- do_redraw = 1;
- break;
- default:
- // Do nothing for perspective view, or if no view is selected
- break;
- }
-
- // Remember mouse position
- xpos = x;
- ypos = y;
-}
-
-
-//========================================================================
-// Mouse button callback function
-//========================================================================
-
-static void GLFWCALL mouseButtonFun( int button, int action )
-{
- // Button clicked?
- if( ( button == GLFW_MOUSE_BUTTON_LEFT ) && action == GLFW_PRESS )
- {
- // Detect which of the four views was clicked
- active_view = 1;
- if( xpos >= width/2 )
- {
- active_view += 1;
- }
- if( ypos >= height/2 )
- {
- active_view += 2;
- }
- }
-
- // Button released?
- else if( button == GLFW_MOUSE_BUTTON_LEFT )
- {
- // Deselect any previously selected view
- active_view = 0;
- }
-
- do_redraw = 1;
-}
-
-
-//========================================================================
-// main()
-//========================================================================
-
-void iteration(){
- // Only redraw if we need to
- if( do_redraw )
- {
- // Draw all views
- drawAllViews();
-
- // Swap buffers
- glfwSwapBuffers();
-
- do_redraw = 0;
- }
-
- // Wait for new events
- glfwWaitEvents();
-}
-
-int main( void )
-{
- // Initialise GLFW
- if( !glfwInit() )
- {
- fprintf( stderr, "Failed to initialize GLFW\n" );
- exit( EXIT_FAILURE );
- }
-
- // Open OpenGL window
- if( !glfwOpenWindow( 500, 500, 0,0,0,0, 16,0, GLFW_WINDOW ) )
- {
- fprintf( stderr, "Failed to open GLFW window\n" );
- glfwTerminate();
- exit( EXIT_FAILURE );
- }
-
- // Enable vsync
- glfwSwapInterval( 1 );
-
- // Set window title
- glfwSetWindowTitle( "Split view demo" );
-
- // Enable sticky keys
- glfwEnable( GLFW_STICKY_KEYS );
-
- // Enable mouse cursor (only needed for fullscreen mode)
- glfwEnable( GLFW_MOUSE_CURSOR );
-
- // Disable automatic event polling
- glfwDisable( GLFW_AUTO_POLL_EVENTS );
-
- // Set callback functions
- glfwSetWindowSizeCallback( windowSizeFun );
- glfwSetWindowRefreshCallback( windowRefreshFun );
- glfwSetMousePosCallback( mousePosFun );
- glfwSetMouseButtonCallback( mouseButtonFun );
-
-#ifdef EMSCRIPTEN
- emscripten_set_main_loop (iteration, 0, 1);
-#else
- // Main loop
- do
- {
- iteration();
- } // Check if the ESC key was pressed or the window was closed
- while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS &&
- glfwGetWindowParam( GLFW_OPENED ) );
-#endif
-
- // Close OpenGL window and terminate GLFW
- glfwTerminate();
-
- exit( EXIT_SUCCESS );
-}
-