Domanda

Sto costruendo un motore di simulazione fisica e un editor in Windows. Voglio costruire la parte dell'editor usando Qt e voglio far funzionare il motore usando SDL con OpenGL.

La mia prima idea è stata quella di costruire l'editor usando solo Qt e condividere lo stesso codice con il motore (il gestore delle risorse, il renderer, la matematica). Ma vorrei anche poter eseguire la simulazione all'interno dell'editor. Ciò significa che devo anche condividere il codice di simulazione che utilizza thread SDL.

Quindi, la mia domanda è questa: c'è un modo per avere un rendering OpenGL in una finestra Qt usando SDL?

Ho letto sul web che potrebbe essere possibile fornire a SDL un handle di finestra in cui eseguire il rendering. Qualcuno ha esperienza dong che?

Inoltre, la parte filettata del simulatore potrebbe rappresentare un problema poiché utilizza thread SDL.

È stato utile?

Soluzione

Anche se potresti farlo funzionare come la prima risposta, suggerisci che probabilmente incontrerai problemi dovuti al threading. Non ci sono soluzioni semplici quando si tratta di threading, e qui dovresti interagire con SDL Qt e OpenGL mainloop. Non divertente.

La soluzione più semplice e più sana sarebbe quella di disaccoppiare entrambe le parti. In modo che SDL e Qt funzionino in processi separati e li facciano usare un qualche tipo di messaggistica per comunicare (consiglierei d-bus qui). Puoi avere il rendering SDL in una finestra senza bordi e il tuo editor invia comandi tramite messaggi.

Altri suggerimenti

Questa è una semplificazione di ciò che faccio nel mio progetto. Puoi usarlo come un normale widget, ma di cui hai bisogno, puoi usare il suo oggetto m_Screen per disegnare sulla superficie SDL e verrà mostrato nel 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;
};

Spero che questo aiuti

Nota: di solito ha senso impostare sia la dimensione minima che massima di questo widget sulla dimensione della superficie SDL.

Il rendering su OpenGL da QT è banale (e funziona molto bene) Nessuna esperienza diretta di SDL, ma qui c'è un'app di esempio sulla miscelazione. http://www.devolution.com/pipermail/sdl/2003- gennaio / 051805.html

C'è un buon articolo sulla miscelazione dei widgewts QT direttamente con l'opengl qui http://doc.trolltech.com/qq/qq26-openglcanvas.html un po 'oltre ciò di cui hai strettamente bisogno ma piuttosto intelligente!

potresti usare questa libreria (vedi la directory demo):

https://github.com/kronat/libqsdl

Buona giornata

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top