Bom, como prometido, temos algo do Ogre aqui
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:
- startLog(). Essa função inicia o log do Ogre
- createRoot(). A classe Root do Ogre é a classe que controla o Ogre, precisamos iniciá-la antes de mais nada
- 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
- setupRenderSystem(). Aqui escolhemos se utilizamos DirectX ou OpenGL.
- createRenderWindow(). Uma vez escolhido o sistema de renderização, criamos a nossa janela principal.
- setupScene(). Escolhemos o plugin para construir a nossa cena, BSP, genérico, Outdoor, etc.
- createCamera(). Criamos uma camera principal para podermos ver a cena.
- setupViewport(). A camera precisa de um Viewport para renderizar o que ela vê, aqui criamos esse Viewport default.
- initializeResourceGroups(). Lembra dos recursos externos no passo 3? Aqui inicializamos os mesmos na memória da GPU ou do PC.
- setupAudioSystem(). Um jogo sem audio é bem chato não? Inicializamos o OgreAL.
- setupCEGUI(). Inicializamos a GUI default que o Ogre utiliza.
- setupInputSystem(). Inicializamos o OIS para termos ações do teclado, mouse e joystick.
- createScene(). Criamos a cena para mostrar, essa função é puramente virtual, já que cada cena é diferente da outra, não temos uma cena única.
- createFrameListener(). Cria os Listeners, também é puramente virtual, pois normalmente você terá n Listeners.
- 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á.

Recent Comments