O Objeto SceneManager
Autor: Matheus Santana | Publicado: 2011-10-25T15:18:00-03:00


Sem contar com o objeto Root, o SceneManager é, provavelmente, o objeto mais importante de todos com que você vai lidar quando estiver desenvolvendo sua aplicação OGRE. Certamente, será o objeto mais utilizado também.


O SceneManager é responsável pelo conteúdo da cena que está sendo renderizada pela engine. Ele é responsável por organizar o conteúdo usando a técnica que achar mais adequada para realizar as tarefas de criação e gerenciamento de câmeras, objetos móveis (entidades), luzes e materiais (propriedades superficiais dos objetos), bem como por gerenciar a "geometria global" - que é a geometria estática mais ampla, geralmente utilizada para representar partes da cena que não se movem.


É ao SceneManager que você recorre quando quer criar uma câmera para a cena! Também é através dele que se pode adicionar ou remover uma fonte de luz. Ou seja, sua aplicação não precisa manter listas dos objetos que estão sendo dispostos: o SceneManager mantém um conjunto de todos os objetos na cena para que o programador possa referenciá-los quando precisar. Consulte na API&nbsp;os métodos getLight(), getCamera(), getEntity() e outros.

O SceneManager também envia a cena para RenderSystem quando é hora de renderizar a cena. No entanto, o programador nunca precisa chamar o método _renderScene&nbsp;diretamente. Ele é chamado automaticamente sempre que um objeto que está sendo renderizado é atualizado.

Portanto, a maior parte da interação do programador com o objeto SceneManager é durante a configuração da cena em que, possivelmente, é invocada uma grande quantidade de métodos (o que às vezes é guiado por algum arquivo de entrada que contém os dados da cena). Também é possível modificar o conteúdo da cena dinamicamente durante o ciclo de renderização, caso se crie um objeto FrameListener.

Diferentes tipos de cena exigem abordagens algorítmicas muito diferentes para decidir quais objetos são mandados pro RenderSystem da maneira mais eficiente possível. Por conta disso, a classe SceneManager foi projetada para ser estendida para diferentes tipos de cena.

O objeto SceneManager padrão irá renderizar uma cena mas ele faz muito pouca ou quase nenhuma organização de cena e não se pode esperar que trabalhe de maneira ótima (o mais eficientemente possível) para cenas muito amplas.

O intuito de criar especializações para a classe SceneManager é justamente que cada uma delas irá otimizar a organização da cena para ganhar desempenho, visto que assumem o que pode ser feito para cada tipo de cena. Um exemplo de especialização é a BspSceneManager, que otimiza a renderização para cenas grandes in-door com base em uma árvore BSP.

A aplicação que usa OGRE não precisa saber quais são as especializações disponíveis. Ela deve simplesmente chamar Root::createSceneManager(..) passando como parâmetro um dos vários tipos de cena (ST_GENERIC, ST_INTERIOR, etc.). A engine irá automaticamente usar a melhor especialização de SceneManager para o tipo de cena escolhido ou o padrão caso uma especialização não esteja disponível. Isso permite que os desenvolvedores de OGRE possam criar novas especializações para tipos de cena para os quais ainda não havia especialização alguma e as aplicações usufruam das novas especializações sem mudar nada do seu código.