PRIMEIRA PÁGINA E ADICIONAR O PONTEIRO DO MOUSE
Primeira Página
Antes de mais nada devemos criar a página HTML que iremos utilizar na nossa interface. Abra um editor de sua preferência, por exemplo o Bloco de Notas(Notepad) ou o Dreamweaver e coloque o seguinte texto.
<html> <body> <p>Hello world!</p> </body> </html>
A página acima é bastante simples, ela apenas irá mostrar o texto "Hello World!". Todo o conteúdo que iremos utilizar na Navi, como páginas HTML e imagens, deve ser colocado em uma pasta. Nos tutoriais a pasta está localizada em OgreSDK\media\MediaNavi, Esse diretório também deve ser adicionado ao arquivo "resources.cfg". Dessa forma salve a página HTML acima nesse diretório, com o nome "helloworld.html".
No arquivo "AplicationListener.h" devemos adicionar os includes que serão utilizados pela Navi que estão listados abaixo:
#include "Navi.h" #include "NaviUtilities.h" #include "NaviManager.h" using namespace NaviLibrary;
Adicione também using namespace NaviLibrary; para evitarmos a repetição da referência "NaviLibrary::" durante o código.
//navi NaviManager* naviMgr; NaviMouse* mouse; NaviCursor* defaultCursor; NaviCursor* moveCursor; Navi* buttonNavi;
Ainda no arquivo "AplicationListener.h" declare as váriaveis acima. A "naviMgr" é o gerenciador da Navi, para que possamos utiliza-la. A variável "mouse" cuidará do ponteiro do mouse, sendo que "defaultCursor" tratará dos frames padrões da animação do mouse e "moveCursor" dos frames do ponteiro do mouse em movimento.
naviMgr = new NaviManager(window,"..\\..\\media\\MediaNavi");
naviMgr->createNavi("naviTeste", "local://helloworld.html", NaviPosition(Center), 150, 150, 0);
Indo para o arquivo "AplicationListener.cpp", adicione também a linha using namespace NaviLibrary;. Indo para o construtor da classe AplicationListener adicione o código acima. Inicializamos a variável "naviMgr" onde o primeiro parâmetro é a janela que estamos utilizando na Ogre. O segundo parâmetro é o diretório onde esta o conteúdo usado pela Navi.
A função "createNavi()" cria uma janela dentro da Ogre em que aparecerá uma página HTML. O nome dessa janela é definido no primeiro parâmetro da função, esse nome deve ser único, e posteriormente usado para acessar a janela. O segundo é a página HTML que será exibida, uma página comum da web deve-se passar o endereço completo, por exemplo, "http://www.irados.org". O terceiro é a posição relativa em relação a janela da Ogre, no exemplo, ela ficará no centro(Center), existem outras posições como TopRight e BottomLeft, utilize a complementação do código para ver as demais.
O quarto parâmentro é a largura e o quinto a altura, sendo que estes valores não devem ser menores que o conteúdo da página HTML. Se ela contiver uma figura de dimensões 400x300, as dimensões da janela da Navi não devem maiores que o da imagem, ou a janela será exibida distorcida. O sexto é a ordem de sobreposição das janelas, da mesma forma como nos viewports, a janela da posição -1 ficará coberta pela da posição 0(zero), caso as duas sejam colocadas uma sobre a outra.
naviMgr->Update();
Afim de que a Navi seja atualizada na tela, deve-se acrescentar a função "Update()" no loop principal do programa, ou seja, no método "frameStarted()". Execute o projeto, deverá aparecer algo como na figura abaixo:

Adicionar o Ponteiro do Mouse
O ponteiro do mouse pode ser customizado facilmente com o uso de imagens. As que serão utilizadas no tutorial, são as mesmas no exemplo que vem juntamente com a Navi, dessa forma, copie o conteúdo da pasta \OgreSDK\NaviLibrary\NaviDemo\Bin\Media para o diretório a qual estamos colocando as páginas HTML(OgreSDK\media\MediaNavi).
// Começa e configura o mouse mouse = new NaviMouse(64,64);
Inicializamos o ponteiro mouse passando como parâmetros as suas dimensões.
//define as imagens da animação padrão do mouse
defaultCursor = mouse->createCursor("fadingCursor", 3, 2);
defaultCursor->addFrame(1200, "cursor1.png")->addFrame(100, "cursor2.png")->
addFrame(100, "cursor3.png")->addFrame(100, "cursor4.png");
defaultCursor->addFrame(100, "cursor5.png")->addFrame(100, "cursor6.png")->
addFrame(100, "cursor5.png")->addFrame(100, "cursor4.png");
defaultCursor->addFrame(100, "cursor3.png")->addFrame(100, "cursor2.png");
mouse->setDefaultCursor("fadingCursor");
Logo após inicializamos a variável que cuidará da animação da imagem padrão do ponteiro através da função "createCursor()". Onde o primeiro parâmetro é o nome atribuido a ele, o segundo e terceiro parâmetros são as posições X e Y respectivamente na tela, em que o ponteiro irá aparecer inicialmente.
Para adicionarmos os frames para compor a animação do ponteiro, usa-se o método "addFrame()", em que o primeiro parâmetro é o tempo em milisegundos de duração da imagem do segundo parâmetro. Pode-se adicionar quantas imagens e quadros se queira, o loop é feito automaticamente. E com a função "setDefaultCursor()" defini-se o cursor que será o padrão, onde o nome do cursor é passado como parâmetro.
//define a imagem do mouse em movimento
moveCursor = mouse->createCursor("move", 19, 19);
moveCursor->addFrame(0, "cursorMove.png");
O trecho de código acima cria o ponteiro do mouse que aparecerá quando clicarmos com o botão direito do mouse e arrastarmos algum objeto da Navi na tela. É adicionado apenas um frame que é a imagem em si.
bool AplicationListener::mouseMoved( const OIS::MouseEvent &e ){
if(e.state.Z.rel != 0)
naviMgr->injectMouseWheel(e.state.Z.rel);
return naviMgr->injectMouseMove(e.state.X.abs, e.state.Y.abs);
}
bool AplicationListener::mousePressed( const OIS::MouseEvent &e, OIS::MouseButtonID id )
{
return naviMgr->injectMouseDown(id);
}
bool AplicationListener::mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id )
{
return naviMgr->injectMouseUp(id);
}
Afim de que a Navi possa obter as informações de entrada do mouse, é necessario adicionar alguns elementos aos métodos acima. Observe que muda-se na maioria deles apenas o valor de retorno do método, sendo que em "mouseMoved()" no trecho acima também mostra como a Navi consegue as informações de movimento da "rodinha" do meio do mouse. Execute e veja como está o programa agora.

Italo Mendes
italo.ribeiro@gmail.com
