Integre LibRocket com SDL e OpenGL

7

Atualmente, estive envolvido em um projeto de jogo e chegamos ao ponto em que queremos adicionar a GUI para menus e outras coisas, mas o tempo que gastamos desenvolvendo nosso próprio sistema pode nos custar um pouco de tempo, e isso faz parte do sistema que não queremos perder muito tempo.

Então, estamos lendo sobre algumas bibliotecas de interface do usuário, como GUIchan, CEGUI e recentemente LibRocket, que aparentemente são muito flexíveis e úteis, então minha pergunta é se o Librocket poderia ser integrado a um projeto desenvolvido em SDL / OpenGL em C ++? e se você souber onde encontrar informações sobre isso, porque não conseguimos encontrar algo assim.

oscar.rpr
fonte

Respostas:

7

Sim, você absolutamente pode usar o libRocket com praticamente qualquer sistema de renderização (existem aplicativos libRocket na maioria dos sistemas de desktop, iOS e Android.)

libRocket usa uma interface de renderização abstrata internamente. A libRocket é uma biblioteca pronta para analisar o texto em estruturas internas e, em seguida, envia sua geometria para o renderizador abstrato.

Portanto, nada será renderizado se você não implementar o renderizador sozinho. Você simplesmente herda Rocket :: Core :: RenderInterface se não estiver enganado e implementa algumas funções.

A documentação sobre como fazer isso pode ser encontrada aqui: http://librocket.com/wiki/documentation/C%2B%2BManual/Interfaces

Então, quando você atribuir seu representante personalizado, ele será usado para empurrar a geometria. Neste ponto, você tem total controle do que fazer com isso.

Existem exemplos para renderizadores OpenGL, mas você pode adaptar um ao SDL, se achar que combina com você!

Espero que ajude.

Grimshaw
fonte
Obrigado pelo comentário, que vai me ajudar muito no processo.
oscar.rpr
11
@ oscar.rpr Note-se também que a libRocket fornece uma interface de renderização de amostra que não fornece otimizações que você pode usar nos arquivos samples / shell / include / ShellRenderInterface.h e samples / shell / src / ShellRenderInterface.cpp, conforme explicado aqui . Além disso, na última vez em que o usei, a biblioteca não ativou GL_VERTEX_ARRAYS quando foi renderizada, então eu tive que fazer isso sozinho ou não consegui ver nada.
Martin Foot
Obrigado pela resposta, vou trabalhar com isso hoje em dia, digo o meu progresso.
Oscar.rpr
1

Eu acho que você precisa fazer algumas alterações no código libRocket para fazer passar a criação da janela. Não tenho certeza se existe outra maneira, mas tenho certeza de que esse trecho de código funcionará! e presumo que você esteja desenvolvendo para um sistema Windows, se você estiver direcionando para outra plataforma, existem etapas semelhantes, mas com diferentes variáveis ​​e alterações de função!

Antes de tudo, você precisa obter um manipulador para a janela que o SDL cria. esse trecho de código extrai o valor HWND necessário (de acordo com aqui :

#include <SDL_syswm.h>

struct SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);

if(-1 == SDL_GetWMInfo(&wmInfo))
    throw AVException(SDL_GetError());

HWND hwndSDL = wmInfo.window;

agora precisamos garantir que o libRocket use a mesma janela para sua renderização. Após uma pequena pesquisa nos arquivos, encontrei um arquivo hg/shell/src/win32/ShellWin32.cpp(o endereço é baseado no googlecode) que contém funções de criação de janelas. lá você vai ver uma função chamada bool Shell::OpenWindow(const char* name, bool attach_opengl). essa é a principal função responsável pela criação de uma janela. Para fazer com que o libRocket reutilize nossa hwndSDLvariável, você deve remover / comentar todas as linhas nessa função, exceto estas:

if (attach_opengl)
{
    opengl_attached = AttachOpenGL();
    if (!opengl_attached)
        return false;
}

e pouco antes dessas linhas, adicione este pedaço de código:

window_handle = hwndSDL;

Sei que provavelmente não é a melhor maneira de fazer um trabalho, mas tenho certeza que funcionará. e se você estiver direcionando algo diferente de janelas, basta encontrar equivalentes para o valor HWND e a função createwindow. eles certamente estão em algum lugar nos códigos, já que quase todos os sistemas de janelas, janelas ou não, compartilham a mesma lógica.

Ali1S232
fonte
Desculpe, você usa libRocket frequentemente? Tenho quase certeza libRocket não vem com esse tipo de baixo nível de código .. Sem desconsiderar a sua resposta :) Vou tentar uma resposta de qualquer maneira :)
Grimshaw
Obrigado pela resposta, vou verificar sua ideia para futuros projetos de jogos.
oscar.rpr
11
@ Diabo não, eu acabei de descobrir que existe uma biblioteca! como afirmei na minha resposta, não tenho certeza se esse foi o melhor método para libRocket, mas deve funcionar. Fiz a mesma coisa para conectar outras bibliotecas gráficas. por exemplo, para inicializar um mecanismo de jogo dentro do Qt SDK.
Ali1S232