BaseOpenGL
Vamos implementar uma classe chamada BaseOpenGL – classe para iniciantes, que tem por finalidade facilitar a utilização das funções básicas da biblioteca OpenGL.
A idéia é que seja possível implementar apenas os métodos interessantes numa classe derivada. E que com a classe implementada possamos dar um simples start.
Da maneira que implementei, foi preciso usar uma roupagem para contornar os métodos da opengl que usam callbacks.
Para entendimento das funções básicas, sem preocupações com a orientação à objetos sugiro o material da ufsc, ou do nehe
Vamos aos métodos Públicos:
BaseOpenGL(); virtual int startOpenGL(int,int,const char*); virtual void glEnable2D(); virtual void glDisable2D(); inline int getWidth(); inline int getHeight(); inline int getWindowNumber(); inline std::string getTitle(); virtual ~BaseOpenGL();
O método startOpenGL, criará a janela da opengl com o tamanho (widthxheight) determinado pelos inteiros passados e com título da janela definido pela string passada. Inicia a glut, seta algumas variáveis, configura as funções callbacks, e retorna o valor da função initGL.
As funções glEnabled2D() e glDisable2D(), abilitam e deabilitam, respectivamente, a opengl para trabalhar com 2D.
As funções seguintes são autoexplicativas e tem como objetivo o acesso a algumas variáveis.
-
Os métodos protegidos devem ser:
protected: virtual int initGL(); virtual void draw(void) = 0; virtual void idleDraw(void) = 0; virtual void reshapeWindow(int,int) = 0; virtual void keyBoardEvent(unsigned char,int,int) = 0; virtual void specialKeyBoardEvent(int,int,int) = 0; virtual void initialStartup(); static BaseOpenGL* reference; std::string title; int width; int height;
Sendo que as funções abstratas serão aquelas que devem ser implementadas numa classe posterior.
initGL deve fazer as pré-configurações e retornar “verdadeiro” se estiver tudo ok.
initialStartup deve ser implementada se o usuário quiser mudar ou acrescentar alguma configuração inicial.
A variável title é o título da janela, width e height, é o comprimento e a altura da janela.
‘reference’ é a roupagem. Esta variável deve apontar para a classe que está implemendo os métodos abstratos.
Portanto há um porém: No construtor – ou em algum outro lugar – da classe derivada, deve-se fazer com que o ponteiro reference aponte para ela. Algo semelhante à:
ClasseDerivada::ClasseDerivada(){
BaseOpenGL::reference = this;
}
-
Nos métodos privados temos as funções que irão preencher os callbacks e o número da janela:
int window; static void reshapeFunc(int,int); static void displayFunc(void); static void keyboardFunc(unsigned char tecla, int x, int y); static void specialFunc(int tecla, int x, int y); static void idleFunc(void);
e aqui encontra-se a implementação.
e aqui o cabeçalho.
Usaremos esta classe para implementar algumas coisas em opengl mais à diante.
É fácil usar, basta extender uma classe à partir da BaseOpenGL, implementar os métodos abstratos.
E no main do seu programa pode fazer algo parecido com isto:
#include <GL/glut.h>
#include "programaEmOpengl.h"
int main (int argc, char** argv)
{
glutInit(&argc,argv);
Programa p;
p.startOpenGL(640,480,"General");
glutMainLoop();
return 0;
}
//pronto.