Ogre, parte 1


Bom, como prometido, temos algo do Ogre aqui :D

Repito que não vou fazer um tutorial sobre isso, para isso vejam a Wiki do Ogre.
Antes de mais nada, como já foi dito anteriormente, o Ogre por sí só é uma engine gráfica 3D, o que quer dizer que sim, você pode fazer seu jogo nela, mas irá faltar no mínimo iteração com o usuário, som e física (verdade, alguns jogos não precisam de física, mas ficam muito melhores com;). Quando você instala o Ogre ele vem com a parte de iteração, utilizando agora o OIS (antigamente era a SDL) e para ter uma GUI, ele utiliza a CEGUI. Com isso você já consegue fazer um jogo quase completo (isso e muita paciência), ou um aplicativo, que é o que vou mostrar aqui.

Antes de mais nada,  vamos falar um pouco sobre onde estou desenvolvendo e exatamente o que estou desenvolvendo.

Estou fazendo um programa para aprender direito como o Ogre funciona, o programa se chama OgreViewer, sua documentação pode ser encontrada aqui, ele serve basicamente para carregar uma Mesh no Ogre, iluminar, animar, testar vários materiais nela, checar performance, posicionamento, e outras coisas que é possível fazer com o Ogre. Até agora temos uma aplicação Ogre que carrega uma Mesh, ilumina, possibilita a utilização de materiais customizáveis e deixa a Mesh rotacionando para ver o efeito da luz no material. Já é um começo.
O ambiente de desenvolvimento utilizado (apesar do SVN conter um projeto do tipo Autotools para Linux), é o Code::Blocks, pois é um ambiente OpenSource que roda em Windows, Mac e Linux assim como o Ogre (a única grande alteração para rodar um aplicativo é sua inicialização na função main(), que eu não vou tratar aqui, nossos aplicativos são desenvolvidos em Linux).

Bom, antes de mais nada, você pode baixar o código fonte do programa via Subversion, em http://svn.geekvault.org/ogre/greViewer. Caso você não esteja conseguindo compilar o código, provavelmente está faltando alguma biblioteca, a única biblioteca extra que utilizo é a OgreAL, um wrapper da OpenAL para o Ogre, baixe-a, instale-a e tudo deve funcionar.

Uma vez com o código em mãos, vamos falar um pouco sobre como o Ogre funciona. O Ogre possui uma arquitetura baseada em plugins, e essa é a grande sacada deles, a grande maioria das engines gráficas utilizam apenas uma arquitetura de herança, complicando o código e tirando sua portabilidade. No Ogre, se você precisa de uma cena que utiliza BSP, basta carregar o plugin que permite isso, configurar sua cena para aceitar informações do tipo BSP e você está pronto, detalhe, isso pode ser feito em run-time.
Outra característica importante do Ogre são os Listeners, sendo que o mais importante deles é sem dúvida o FrameListener. Apesar de eu não falar sobre Padrões de Projetos, um Listener é basicamente uma classe que “ouve” por mudanças e ações nela e toma suas devidas ações. No caso do FrameListener ele possui duas funções básicas, frameStarted() e frameEnded() executam antes e após cada frame ter sido renderizado, útil para animações e tratamento de inputs ;) .
Isso tendo falado, já podemos explicar o processo de inicialização, vamos ver a função OgreStartup::go(void)

void OgreStartup::go(void){
startLog();
createRoot();
defineResources();
setupRenderSystem();
createRenderWindow();
setupScene();
createCamera();
setupViewport();
initializeResourceGroups();
setupAudioSystem();
setupCEGUI();
setupInputSystem();
createScene();
createFrameListener();
startRenderLoop();
}

Ela é intuitiva não? Vamos passo a passo:

  1. startLog(). Essa função inicia o log do Ogre
  2. createRoot(). A classe Root do Ogre é a classe que controla o Ogre, precisamos iniciá-la antes de mais nada
  3. defineResources(). Como o Ogre utiliza plugins e recursos externos (Meshs, texturas, particulas, etc), precisamos saber onde eles estão, essa função faz isso e os pré-carrega na memória
  4. setupRenderSystem(). Aqui escolhemos se utilizamos DirectX ou OpenGL.
  5. createRenderWindow(). Uma vez escolhido o sistema de renderização, criamos a nossa janela principal.
  6. setupScene(). Escolhemos o plugin para construir a nossa cena, BSP, genérico, Outdoor, etc.
  7. createCamera(). Criamos uma camera principal para podermos ver a cena.
  8. setupViewport(). A camera precisa de um Viewport para renderizar o que ela vê, aqui criamos esse Viewport default.
  9. initializeResourceGroups(). Lembra dos recursos externos no passo 3? Aqui inicializamos os mesmos na memória da GPU ou do PC.
  10. setupAudioSystem(). Um jogo sem audio é bem chato não? Inicializamos o OgreAL.
  11. setupCEGUI(). Inicializamos a GUI default que o Ogre utiliza.
  12. setupInputSystem(). Inicializamos o OIS para termos ações do teclado, mouse e joystick.
  13. createScene(). Criamos a cena para mostrar, essa função é puramente virtual, já que cada cena é diferente da outra, não temos uma cena única.
  14. createFrameListener(). Cria os Listeners, também é puramente virtual, pois normalmente você terá n Listeners.
  15. startRenderLoop(). Inicia o processo de renderização de cada frame.

Por hoje é só, na próxima parte eu vou explicar função por função como ela faz, e na parte 3 irei explicar como criar uma cena básica e um FrameListener básico para podermos movimentar a camera e sair do programa.

Até lá.

, ,

  1. No comments yet.
(will not be published)