realmente pequena e so e usada uma vez, ela fica no arquivo de implementacao como uma funcao local estatica:void getTerrainImage(bool flipX, bool flipY, Ogre::Image& img){ img.load("terrain.png", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); if (flipX) img.flipAroundY(); if (flipY) img.flipAroundX(); }Ele carrega o arquivo 'terrain.png' dos locais de recursos e a inverte, se necessario.Nota: a inversao (flipping) e feita para imitar um terreno "sem emendas", assim, e possivel fazer um terreno grande ilimitado usando apenas um mapa de alturas 513x513. Esta e so uma dica, se o terreno de alturas do seu terreno ja e "sem emendas", voce nao precisa fazer a inversao, so precisa definir o mapa de alturas individuais para cada Terrain. Neste tutorial nos so usamos um TerrainGroup de tamanho 1x1 (observe isto na funcao createScene() function) entao este codigo, na realidade, nao e usado.initBlendMapsLembra-se dos nossos tres tipos de camadas de terrenos, definidos em configureTerrainDefaults()? Agora, nos iremos combinar essas camadas, baseando-se na altura da lajota. Em um projeto real, voce pode usar as estampas armazenadas em canais RGBA em um arquivo ou um arquivo que esta separado do mapa de alturas.Esta e toda a funcao initBlendMaps:void TutorialBasico3::initBlendMaps(Ogre::Terrain* terrain){ Ogre::TerrainLayerBlendMap* blendMap0 = terrain->getLayerBlendMap(1); Ogre::TerrainLayerBlendMap* blendMap1 = terrain->getLayerBlendMap(2); Ogre::Real minHeight0 = 70; Ogre::Real fadeDist0 = 40; Ogre::Real minHeight1 = 70; Ogre::Real fadeDist1 = 15; float* pBlend1 = blendMap1->getBlendPointer(); for (Ogre::uint16 y = 0; y < terrain->getLayerBlendMapSize(); ++y) { for (Ogre::uint16 x = 0; x < terrain->getLayerBlendMapSize(); ++x) { Ogre::Real tx, ty; blendMap0->convertImageToTerrainSpace(x, y, &tx, &ty); Ogre::Real height = terrain->getHeightAtTerrainPosition(tx, ty); Ogre::Real val = (height - minHeight0) / fadeDist0; val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1); val = (height - minHeight1) / fadeDist1; val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1); *pBlend1++ = val; } } blendMap0->dirty(); blendMap1->dirty(); blendMap0->update(); blendMap1->update();}Nos nao vamos adentrar nos telhas de como esta funcao funciona neste tutorial. Apenas vamos dizer que ela usa a altura do terreno para estampar as tres camadas no terreno. Observe o uso de ofgetLayerBlendMap() e getBlendPointer().Compilando e testando!Finalmente, poderemos compilar o nosso programa para ver como ficou!Utilize a configuracao Direct3D. Por alguma razao, o OpenGL nao renderiza o terreno inteiro ao mesmo tempo (somente uma area proxima ao usuario).O programa pode demorar um pouco ate que ele permita o movimento com o mouse e o teclado. Isso porque ele esta construindo e renderizando todo o terreno, e bloqueia qualquer acao do usuario. Portanto, tenha paciencia na hora de compilar. No proximo tutorial, colocaremos uma funcao para que o nosso Aplicativo mostre uma mensagem de carregamento.O seu programa deve ficar assim:Dica: se voce apertar 'R', voce vera todos os objetos e terrenos da cena como uma malha de triangulos. O terreno ficara desse jeito:Experimente fazer isto e explore o terreno!Na proxima aula, adicionaremos mais algumas funcoes a esse nosso programa e aprenderemos a configurar ceu e neblina! Lembrem-se de guardar esse projeto, pois continuaremos a partir dele no proximo post!