Вопрос

Я создаю движок физического моделирования и редактор в Windows.Я хочу создать редакторскую часть, используя Qt, и я хочу запустить движок, используя SDL с OpenGL.

Моей первой идеей было создать редактор, используя только Qt, и поделиться как можно большим количеством кода с движком (менеджером ресурсов, средством визуализации, математикой).Но я также хотел бы иметь возможность запускать симуляцию внутри редактора. Это означает, что я также должен поделиться кодом моделирования, который использует потоки SDL.

Итак, мой вопрос заключается в следующем:Есть ли способ отобразить OpenGL в окне Qt с помощью SDL?

Я читал в Интернете, что, возможно, можно было бы снабдить SDL дескриптором окна для рендеринга.У кого-нибудь есть опыт в этом?

Кроме того, потоковая часть симулятора может представлять проблему, поскольку она использует потоки SDL.

Это было полезно?

Решение

Хотя вы могли бы заставить его работать, как предполагает первый ответ, вы, скорее всего, столкнетесь с проблемами из-за многопоточности.Когда дело доходит до потоковой обработки, простых решений не существует, и здесь у вас будет взаимодействие SDL Qt и OpenGL mainloop.Не весело.

Самым простым и разумным решением было бы разделить обе части.Чтобы SDL и Qt запускались в отдельных процессах и чтобы они использовали какой-то вид обмена сообщениями для связи (здесь я бы рекомендовал d-bus ).Вы можете визуализировать SDL в окне без полей, и ваш редактор будет отправлять команды через сообщения.

Другие советы

Это упрощение того, что я делаю в своем проекте.Вы можете использовать его как обычный виджет, но по мере необходимости вы можете использовать его объект m_Screen для рисования на поверхности SDL, и он будет отображаться в виджете :)

#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;
};

Надеюсь, это поможет

Примечание:Обычно имеет смысл установить минимальный и максимальный размер этого виджета в соответствии с размером поверхности SDL.

Рендеринг в opengl из QT тривиален (и работает очень хорошо). У меня нет прямого опыта работы с SDL, но здесь есть пример приложения о их смешивании.http://www.devolution.com/pipermail/sdl/2003-January/051805.html

Здесь есть хорошая статья о смешивании QT widgewts непосредственно с opengl http://doc.trolltech.com/qq/qq26-openglcanvas.html немного больше того, что вам строго необходимо, но довольно умно!

вы могли бы использовать эту библиотеку (см. демонстрационный каталог).:

https://github.com/kronat/libqsdl

Хорошего вам дня

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top