|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|