FreeTypeGL-0.0.1: src/demo/demo-cube.c
/* ============================================================================
* Freetype GL - A C OpenGL Freetype engine
* Platform: Any
* WWW: http://code.google.com/p/freetype-gl/
* ----------------------------------------------------------------------------
* Copyright 2011,2012 Nicolas P. Rougier. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials proided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of Nicolas P. Rougier.
* ============================================================================
*/
#if defined(__APPLE__)
# include <OpenGL/gl.h>
# include <Glut/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif
#include <stdlib.h>
#include "vertex-buffer.h"
// ------------------------------------------------------- global variables ---
vertex_buffer_t * cube;
// ------------------------------------------------------------------- init ---
void init( void )
{
GLfloat ambient[] = {0.1f, 0.1f, 0.1f, 1.0f};
GLfloat diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat position[] = {0.0f, 1.0f, 2.0f, 1.0f};
GLfloat specular[] = {0.0f, 0.0f, 0.0f, 1.0f};
glPolygonOffset( 1, 1 );
glClearColor( 1.0, 1.0, 1.0, 1.0 );
glEnable( GL_DEPTH_TEST );
glEnable( GL_COLOR_MATERIAL );
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_LIGHT0 );
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
glLightfv( GL_LIGHT0, GL_POSITION, position );
glEnable( GL_LINE_SMOOTH );
}
// ---------------------------------------------------------------- display ---
void display( void )
{
static float theta=0, phi=0;
theta += .5; phi += .5;
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
glRotatef( theta, 0,0,1 );
glRotatef( phi, 0,1,0 );
glDisable( GL_BLEND );
glEnable( GL_LIGHTING );
glEnable( GL_DEPTH_TEST );
glColor4f( 1, 1, 1, 1 );
glEnable( GL_POLYGON_OFFSET_FILL );
/* Use vertice (v), normal(n) and color (c) */
vertex_buffer_render( cube, GL_QUADS, "vnc" );
glDisable( GL_POLYGON_OFFSET_FILL );
glEnable( GL_BLEND );
glDisable( GL_LIGHTING );
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
glDepthMask( GL_FALSE );
/* Use vertice (v) only */
glColor4f( 0, 0, 0, .5 );
vertex_buffer_render( cube, GL_QUADS, "v" );
glDepthMask( GL_TRUE );
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glPopMatrix();
glutSwapBuffers( );
}
// ---------------------------------------------------------------- reshape ---
void reshape( int width, int height )
{
glViewport(0, 0, width, height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );
gluPerspective( 45.0, width/(float) height, 2.0, 10.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
glTranslatef( 0.0, 0.0, -5.0 );
}
// --------------------------------------------------------------- keyboard ---
void keyboard( unsigned char key, int x, int y )
{
if ( key == 27 )
{
exit( EXIT_SUCCESS );
}
}
// ------------------------------------------------------------------ timer ---
void timer( int dt )
{
glutPostRedisplay();
glutTimerFunc( dt, timer, dt );
}
// ------------------------------------------------------------------- main ---
int main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitWindowSize( 400, 400 );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
glutCreateWindow( argv[0] );
glutReshapeFunc( reshape );
glutDisplayFunc( display );
glutKeyboardFunc( keyboard );
glutTimerFunc( 1000/60, timer, 1000/60 );
typedef struct { float x,y,z;} xyz;
typedef struct { xyz position, normal, color;} vertex;
xyz v[] = { { 1, 1, 1}, {-1, 1, 1}, {-1,-1, 1}, { 1,-1, 1},
{ 1,-1,-1}, { 1, 1,-1}, {-1, 1,-1}, {-1,-1,-1} };
xyz n[] = { { 0, 0, 1}, { 1, 0, 0}, { 0, 1, 0} ,
{-1, 0, 1}, { 0,-1, 0}, { 0, 0,-1} };
xyz c[] = { {1, 1, 1}, {1, 1, 0}, {1, 0, 1}, {0, 1, 1},
{1, 0, 0}, {0, 0, 1}, {0, 1, 0}, {0, 0, 0} };
vertex vertices[24] = {
{v[0],n[0],c[0]}, {v[1],n[0],c[1]}, {v[2],n[0],c[2]}, {v[3],n[0],c[3]},
{v[0],n[1],c[0]}, {v[3],n[1],c[3]}, {v[4],n[1],c[4]}, {v[5],n[1],c[5]},
{v[0],n[2],c[0]}, {v[5],n[2],c[5]}, {v[6],n[2],c[6]}, {v[1],n[2],c[1]},
{v[1],n[3],c[1]}, {v[6],n[3],c[6]}, {v[7],n[3],c[7]}, {v[2],n[3],c[2]},
{v[7],n[4],c[7]}, {v[4],n[4],c[4]}, {v[3],n[4],c[3]}, {v[2],n[4],c[2]},
{v[4],n[5],c[4]}, {v[7],n[5],c[7]}, {v[6],n[5],c[6]}, {v[5],n[5],c[5]} };
GLuint indices[24] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,
12,13,14,15, 16,17,18,19, 20,21,22,23 };
cube = vertex_buffer_new( "v3f:n3f:c3f" );
vertex_buffer_push_back( cube, vertices, 24, indices, 24 );
init( );
glutMainLoop( );
return EXIT_SUCCESS;
}