/*

*-------------------------------------------------

*exemplo2.C

*

*Este exemplo desenha um cubo 3D na tela

*A camera pode ser rotacionada ao redor

*do eixo especificado pela direcao (1,0,0)

*A rotacao eh ativada em passos fixos

*iguais a 13 graus, com o usuario

*pressionando a tecla r

*

*Autor: Marcelo Walter

*Versao inicial: Fevereiro 28, 2000

*  Revisado: Novembro, 2006

*--------------------------------------------------

*/


/*

*------------------------------------------------

* Includes

*------------------------------------------------

*/

#include <stdlib.h>

#include <stdio.h>

#include <GL/glut.h>


/*

*------------------------------------------------

* Prototipos para as funcoes globais

*------------------------------------------------

*/

static void inic( void );

static void exibeCB( void );

static void tecladoCB( unsigned char tecla, int x, int y );

static void redesenhaCB( int w, int h );

static void setaCamera( void );

static void desenhaCena( void );


/* Definicoes Locais */

#define INC_ROTACAO    13.0    // avanca rotacao em 13 graus


/* Variavel Global */

float Rotacao = 0.0;


/*

*------------------------------------------------

* Rotina MAIN

*------------------------------------------------

*/

int main( int argc, char *argv[] )

{

  glutInit( &argc, argv );

  glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );

 

  inic();

 

  glutMainLoop();

  return 1;

}


/*

*------------------------------------------------

* Esta funcao inicializa a janela OpenGL,

* registra as rotinas callback e inicializa

* as matrizes de transformacao

*------------------------------------------------

*/

static void inic()

{

glutCreateWindow( "Exemplo 2 OpenGL/GLUT" ); // Titulo da janela


/* Registra as rotinas de callback */

glutDisplayFunc( exibeCB );

glutKeyboardFunc( tecladoCB );

glutReshapeFunc( redesenhaCB );


/* Cor de fundo default */

glClearColor( 0, 0, 0, 0 );      

   

/* Habilita remocao de elementos ocultos */

glEnable( GL_DEPTH_TEST );           


glMatrixMode( GL_MODELVIEW );

glLoadIdentity();

 

glMatrixMode( GL_PROJECTION );

glLoadIdentity();

}



/*

*------------------------------------------------------

* Rotina para tratamento de evento - exibicao de janela

*------------------------------------------------------

*/

static void exibeCB()

{

/* Estabelece parametros da camera */

setaCamera();

/* Desenha a cena propriamente dita */

desenhaCena();


/* Estamos usando double-buffering. Precisamos trocar

   os buffers */

glutSwapBuffers();

}



/*

*------------------------------------------------

* Rotina para tratamento de evento - Teclado

* tecla - tecla pressionada pelo usuario

* x - posicao x do mouse

* y - posicao y do mouse

*------------------------------------------------

*/

static void tecladoCB( unsigned char tecla, int x, int y )

{

  switch( tecla ) {

  case 'q':                     /* Encerra o programa */

  case 'Q':

    exit( 0 );

  case 'r':                     /* Rotaciona o objeto */

  case 'R':

    Rotacao += INC_ROTACAO;

    /* Verifica limites no valor da rotacao */

    if( Rotacao >= 360.0 ) Rotacao -= 360.0;

    break;

  default:

  printf("Opcao nao definida!\n");

    break;

  }

  /* Esta chamada eh muito importante. Sem ela o programa

     nao exibe nada! */

  glutPostRedisplay();



/*

*------------------------------------------------

* Rotina para tratamento de evento

* Alteracao do tamanho da janela

* w - largura atual da janela

* h - altura atual da janela

*------------------------------------------------

*/

static void redesenhaCB( int w, int h )

{

   glViewport( 0, 0, w, h );

}  


/*

*------------------------------------------------

* Estabelece o tipo de projecao, posicao e orientacao

* da camera

*------------------------------------------------

*/

static void setaCamera( void )

{

  glMatrixMode( GL_PROJECTION );


  glLoadIdentity();

  gluPerspective( 45.0, 1.0, 0.1, 100.0 );

  glTranslatef( 0, 0, -5 );             // Move a posicao default da camera

                                        // longe da origem

}


/*

*------------------------------------------------

* Esta rotina desenha a cena assumindo que a posicao

* da camera foi estabelecida

*------------------------------------------------

*/

static void desenhaCena( void )

{


// glClear limpa tambem o buffer de profundidade

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glColor3f( 1.0, 1.0, 0.0 );          // Desenha na cor amarela


glMatrixMode( GL_MODELVIEW );

glPushMatrix();

glRotatef( Rotacao, 1.0, 1.0, 1.0 );

glutWireCube( 1.0 );                  // desenha cubo com tamanho igual a 1

glPopMatrix();


glFlush();

}