Instalação e Configuração de Bibliotecas e Plugins
Este guia aborda a integração do motor Irrlicht em aplicações Qt 5 para exibir a saída gráfica em uma janela Qt dedicada, considerando o ambiente de desenvolvimento com Visual Studio 2012.
Primeiramente, instale o Qt 5.2.0 a partir do instalador oficial. Em seguida, adicione o plugin do Qt para o Visual Studio 2012, disponível na página de downloads do Qt. Para o motor Irrlicht, utilize a versão 1.8.1, que já inclui bibliotecas pré-compiladas. Caso deseje compilar manualmente, será necessário o DirectX SDK, ou você pode desativar o suporte ao Direct3D no arquivo de configuração do Irrlicht.
Para desativar o Direct3D e forçar o uso do OpenGL, edite o arquivo IrrCompileConfig.h localizado no diretório de include do Irrlicht. Comente as linhas referentes à compilação com Direct3D:
// Comentando suporte ao Direct3D 9
// #define _IRR_COMPILE_WITH_DIRECT3D_9_
#ifdef NO_IRR_COMPILE_WITH_DIRECT3D_9_
#undef _IRR_COMPILE_WITH_DIRECT3D_9_
#endif
Após a instalação, configure o Visual Studio 2012 para reconhecer o Qt: no menu Qt5, selecione "Qt Options" e adicione o caminho de instalação do Qt.
Preparação do Ambiente de Desenvolvimento
Crie um novo projeto Qt no Visual Studio, nomeando a solução como "IrrlichtSolution" e o projeto como "IrrlichtHelloWorld". Durante a criação, selecione a opção de suporte a OpenGL. Em seguida, cnofigure os diretórios de include e bibliotecas no projeto.
Nas propriedades do projeto, adicione os caminhos de include do Irrlicht e do Qt. Para as bibliotecas, especifique os diretórios onde estão localizados os arquivos .lib do Irrlicht. Nos campos de dependências adicionais do linker, inclua as bibliotecas necessárias, como Irrlicht.lib.
Design e Implementação
Baseado no exemplo "HelloWorld" do Irrlicht, o objetivo é adaptá-lo para:
- Renderizar a saída do Irrlicht em uma janela Qt específica.
- Permitir iniciar e parar o motor de renderização.
- Controlar a posição da câmera na cena.
Para renderizar em uma janela Qt, utilize a estrutura SIrrlichtCreationParameters do Irrlicht, passando o identificador da janela Qt. Em seguida, crie um dispositivo Irrlicht com createDeviceEx.
irr::SIrrlichtCreationParameters config;
config.WindowId = reinterpret_cast<void*>(qtWindowHandle);
IrrlichtDevice* device = createDeviceEx(config);
Para controlar a câmera, armazene a referência ao nó da câmera e atualize sua posição conforme necessário:
irr::core::vector3df camPos(0, 30, -40);
irr::scene::ICameraSceneNode* camera = sceneManager->addCameraSceneNode(0, camPos, irr::core::vector3df(0, 5, 0));
A renderização é realizada em uma thread separada, herdando de QThread. A thread gerencia o loop principal do Irrlicht, permitindo iniciar e pausar a renderização.
class IrrlichtRenderThread : public QThread {
public:
void run() override {
irr::SIrrlichtCreationParameters params;
params.WindowId = reinterpret_cast<void*>(targetWindowId);
IrrlichtDevice* dev = createDeviceEx(params);
if (!dev) return;
dev->setWindowCaption(L"Demo Irrlicht com Qt");
IVideoDriver* drv = dev->getVideoDriver();
ISceneManager* smgr = dev->getSceneManager();
IGUIEnvironment* gui = dev->getGUIEnvironment();
gui->addStaticText(L"Renderizando via Irrlicht em janela Qt",
irr::core::rect<s32>(10, 10, 260, 22), true);
IAnimatedMesh* meshData = smgr->getMesh("modelo.md2");
if (!meshData) {
dev->drop();
return;
}
IAnimatedMeshSceneNode* meshNode = smgr->addAnimatedMeshSceneNode(meshData);
if (meshNode) {
meshNode->setMaterialFlag(EMF_LIGHTING, false);
meshNode->setMD2Animation(scene::EMAT_STAND);
meshNode->setMaterialTexture(0, drv->getTexture("textura.bmp"));
}
irr::core::vector3df initialCamPos(0, 30, -40);
ICameraSceneNode* cam = smgr->addCameraSceneNode(0, initialCamPos, irr::core::vector3df(0, 5, 0));
while (dev->run() && renderActive) {
drv->beginScene(true, true, SColor(255, 100, 101, 140));
smgr->drawAll();
gui->drawAll();
drv->endScene();
}
dev->drop();
}
bool renderActive = true;
void* targetWindowId = nullptr;
};
Para ativar ou desativar a renderização, modifique a flag renderActive da thread. A posição da câmera pode ser ajustada diretamente no nó da câmera após a captura da referência.