Я создаю движок и редактор для моделирования физики в Windows. Я хочу создать часть редактора с использованием Qt, и я хочу запустить движок с использованием SDL с OpenGL.
Моя первая идея заключалась в том, чтобы создать редактор, используя только Qt, и поделиться таким же количеством кода с движком (диспетчер ресурсов, средство визуализации, математика). Но я также хотел бы иметь возможность запускать моделирование внутри редактора. Это означает, что я также должен поделиться кодом моделирования, который использует потоки SDL.
Итак, мой вопрос таков: есть ли способ сделать рендеринг OpenGL в окне Qt с помощью SDL?
Я читал в сети, что можно было бы снабдить SDL дескриптором окна для рендеринга. У кого-нибудь есть такой опыт?
Кроме того, многопоточная часть симулятора может представлять проблему, поскольку использует потоки SDL.
Основываясь на задаче, которую вы хотите выполнить, я считаю, что вы можете сразу перейти к Qt и полностью сбросить SDL. Qt имеет аккуратную поддержку OpenGL, предлагает обработку ввода, гораздо лучшие (без обид, люди SDL) возможности пользовательского интерфейса и т.д. имеют стандартную многопоточность, параллелизм и т. д. + концепцию сигнала / слота). Если модель потоковой передачи вам не нравится, вы можете использовать, например, что-то вроде boost. В любом случае, я действительно не вижу причин использовать SDL + Qt в вашем сценарии.





Рендеринг в opengl из QT тривиален (и работает очень хорошо) Нет прямого опыта использования SDL, но здесь есть пример приложения для их смешивания. http://www.devolution.com/pipermail/sdl/2003-January/051805.html
Здесь есть хорошая статья о смешивании виджетов QT непосредственно с opengl. http://doc.trolltech.com/qq/qq26-openglcanvas.html немного сверх того, что вам строго нужно, но довольно умно!
OpenGL здесь не проблема. Я знаю, что он хорошо работает с Qt. Проблема в основном в потоках.
Моя ошибка. Я думал, что 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.
Работает ли взлом Window id на Mac? Похоже, это не работает на OSX. Я безуспешно пробовал как putenv, так и SDL_putenv.
Я знаю, что это действительно поздно, но может ли кто-нибудь объяснить мне, как это работает?
Хотя вы можете заставить его работать, как в первом ответе, вы, вероятно, столкнетесь с проблемами из-за потоковой передачи. Когда дело доходит до многопоточности, нет простых решений, и здесь у вас будет взаимодействовать SDL Qt и OpenGL mainloop. Не смешно.
Самым простым и разумным решением будет разъединение обеих частей. Так что SDL и Qt выполняются в отдельных процессах и используют какой-то обмен сообщениями для связи (я бы порекомендовал здесь d-bus). Вы можете настроить SDL-рендеринг в окно без полей, и ваш редактор будет отправлять команды через сообщения.
Спасибо, эта информация очень ценная. Думаю, придется разделить работу на 2 процесса. Самым большим препятствием является совместное использование «контекста» OpenGL. Виджеты Qt плохо работают с OpenGL / SDL. Многопоточность, похоже, работает хорошо, поскольку QT и SDL используют одну и ту же библиотеку (потоки pthreads, потоки win32).
Это проект с открытым исходным кодом, который я начинаю прямо сейчас. Я буду публиковать свою архитектуру / решение по мере продвижения проекта.