Question

Je construis un moteur de simulation physique et un éditeur sous Windows. Je souhaite construire la partie éditeur à l'aide de Qt et exécuter le moteur à l'aide de SDL avec OpenGL.

Ma première idée était de construire l'éditeur en utilisant seulement Qt et de partager autant de code avec le moteur (le gestionnaire de ressources, le moteur de rendu, les maths). Mais j'aimerais aussi pouvoir exécuter la simulation dans l'éditeur. Cela signifie que je dois également partager le code de simulation utilisant des threads SDL.

Donc, ma question est la suivante: existe-t-il un moyen d’avoir le rendu OpenGL dans une fenêtre Qt en utilisant SDL?

J'ai lu sur le Web qu'il pourrait être possible de fournir à SDL un descripteur de fenêtre dans lequel effectuer le rendu. Quelqu'un a-t-il de l'expérience?

De plus, la partie filetée du simulateur peut poser problème car il utilise des threads SDL.

Était-ce utile?

La solution

Bien que vous puissiez le faire fonctionner, la première réponse suggère que vous allez probablement rencontrer des problèmes en raison de la thread. Il n’existe pas de solution simple en matière de threading. Dans ce cas, SDL Qt et OpenGL mainloop interagissent. Pas amusant.

La solution la plus simple et la plus saine serait de découpler les deux parties. Ainsi, SDL et Qt s'exécutent dans des processus distincts et leur demandent d'utiliser une sorte de messagerie pour communiquer (je vous recommande d-bus ici). Vous pouvez faire en sorte que SDL s'affiche dans une fenêtre sans bordure et votre éditeur envoie des commandes via des messages.

Autres conseils

Ceci est une simplification de ce que je fais dans mon projet. Vous pouvez l'utiliser comme un widget ordinaire, mais selon vos besoins, vous pouvez utiliser son objet m_Screen pour dessiner sur la surface SDL et cela s'affichera dans le 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;
};

J'espère que cela vous aidera

Remarque: il est généralement judicieux de définir la taille minimale et maximale de ce widget sur la taille de la surface SDL.

Le rendu sur opengl depuis QT est trivial (et fonctionne très bien) Aucune expérience directe de SDL, mais il existe un exemple d'application ici pour les mélanger. http://www.devolution.com/pipermail/sdl/2003- Janvier / 051805.html

Il y a un bon article sur le mélange de QT widgewts directement avec opengl ici http://doc.trolltech.com/qq/qq26-openglcanvas.html un peu au-delà de ce dont vous avez strictement besoin mais plutôt malin!

vous pouvez utiliser cette bibliothèque (voir le répertoire de démonstration):

https://github.com/kronat/libqsdl

Passez une bonne journée

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top