Pergunta

Eu estou construindo um mecanismo de simulação física e editor no Windows. Eu quero construir a parte editor usando Qt e eu quero correr o motor usando SDL com OpenGL.

A minha primeira idéia era construir o editor usando apenas Qt e compartilhar tanto código com o motor (o gerenciador de recursos, o processador, a matemática). Mas, eu também gostaria de ser capaz de executar a simulação dentro do editor. Isto significa que eu também tenho que compartilhar o código de simulação que usa threads do SDL.

Então, minha pergunta é esta:? Existe uma maneira de ter uma render OpenGL para uma janela Qt usando SDL

Eu li na web que pode ser possível fornecer SDL com um identificador de janela em que para renderizar. Alguém tem experiência dong isso?

Além disso, a parte rosqueada do simulador pode representar um problema, uma vez que utiliza threads do SDL.

Foi útil?

Solução

Enquanto você pode fazê-lo funcionar como primeira resposta sugiro que você provavelmente vai ter problemas devido à threading. Não há soluções simples quando se trata de threading, e aqui você teria SDL Qt e OpenGL mainloop interagindo. Não é divertido.

A solução mais fácil e mais sã seria dissociar ambas as partes. Assim que SDL e Qt executados em processos separados e tê-los usar algum tipo de mensagens para comunicar (eu recomendo d-bus aqui). Você pode ter SDL renderizar na janela sem bordas e seu editor envia comandos através de mensagens.

Outras dicas

Esta é uma simplificação do que eu faço no meu projeto. Você pode usá-lo apenas como um widget comum, mas como você precisa, você pode usá-lo do objeto m_Screen para desenhar a superfície da SDL e ele vai mostrar no widget:)

#include "SDL.h"
#include <QWidget>

class SDLVideo : public QWidget {
    Q_OBJECT

public:
    SDLVideo(QWidget *parent = 0, Qt::WindowFlags f = 0) : QWidget(parent, f), m_Screen(0){
        setAttribute(Qt::WA_PaintOnScreen);
        setUpdatesEnabled(false);

        // Set the new video mode with the new window size
        char variable[64];
        snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
        putenv(variable);

        SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);

        // initialize default Video
        if((SDL_Init(SDL_INIT_VIDEO) == -1)) {
            std:cerr << "Could not initialize SDL: " << SDL_GetError() << std::endl;
        }

        m_Screen = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF);
        if (m_Screen == 0) {
            std::cerr << "Couldn't set video mode: " << SDL_GetError() << std::endl;
        }
    }

    virtual ~SDLVideo() {
        if(SDL_WasInit(SDL_INIT_VIDEO) != 0) {
            SDL_QuitSubSystem(SDL_INIT_VIDEO);
            m_Screen = 0;
        }
    }
private:
    SDL_Surface *m_Screen;
};

Espero que isso ajude

Nota:. Ele geralmente faz sentido definir a min e tamanho máximo desse widget para o tamanho da superfície SDL

renderização em OpenGL de QT é trivial (e funciona muito bem) Nenhuma experiência direta do SDL, mas há um exemplo aplicativo aqui sobre misturá-los. http://www.devolution.com/pipermail/sdl/2003- janeiro / 051805.html

Há um bom artigo sobre a mistura QT widgewts diretamente com o OpenGL aqui http://doc.trolltech.com/qq/qq26-openglcanvas.html um pouco além do que você estritamente precisa, mas bastante inteligente!

você poderia usar esta biblioteca (ver o diretório demo):

https://github.com/kronat/libqsdl

Tenha um bom dia

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top