Wpis z mikrobloga

Próbuję sobie bibliotekę SDL (2.0.4) zgrać z Qt (5.7.0), tzn. zarządzać za pomocą biblioteki SDL zawartością QOpenGLWidget. Nie wiem czy to istotne, ale Linux + Nvidia (nie Nouveau).

Kolejność działań
1) SDL_Init(SDLINITEVERYTHING)
2) sdlw = SDL_CreateWindowForm((void*)ui->openGLWidget->winId())
3) sdlren = SDL_CreateRenderer(sdlw, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
Dwa pierwsze punkty są realizowane poprawnie, ale program nigdy nie opuszcza trzeciej funkcji. Po prostu tam gdzieś w środku się zawiesza, nie ma żadnego błędu czy segfaulta, system mi po jakimś czasie krzyczy, że "program nie odpowiada" i czy chcę mu dać więcej czasu...

Jeżeli zamiast SDLCreateWindowForm, użyję funkcji SDLCreateWindow - wszystko jest OK. Dlatego zwrócono mi uwagę na to:

In some cases (e.g. OpenGL) and on some platforms (e.g. Microsoft Windows) the hint SDL
HINTVIDEOWINDOWSHAREPIXELFORMAT needs to be configured before using SDLCreateWindowFrom().
Ale ten hint za argument przyjmuje... SDL_Window... czyli bez sensu. Zrobiłem więc ukryte okno, ale też nie pomogło (o ile robię to dobrze):
http://pastebin.com/6fsM668i

Znalazłem kilka podobnych wątków w sieci, dotyczących nie tylko Qt, ale i wxWidgets - żaden z nich nie ma odpowiedzi...

  • 37
@Dijuna: w ostatecznosci debugowalbym. ;) Mozesz np. skompilowac sobie SDL2 gdzies z boku i do niego sie zlinkowac, zeby miec zrodla. Wtedy odpalasz sesje z debuggerem i stopujesz sobie jak sie zawiesi. Zobaczysz wtedy na czym utknal.
@TheNewIcek: próbowałem i bez flag, teraz przetestowałem SDLRENDERERSFOTWARE i to samo... co do debugowania to ktoś już to zrobił, napisał tylko, że "context is NULL in SDL_Init", ale chyba nie pozostaje mi nic innego jak zrobić to samemu... choć nigdy nie robiłem tego. :P
@Dijuna: sdl jest po prostu toolkitem do inutu/renderera etc, qt robi to samo co sdl tylko znacznie więcej. sdla używa się do gier, qt jest bardzo duże i ma mniej ciekawą licencję. jeżeli tak czy owak zamierzasz używać qt, lepiej porzucić sdl i używać jednego zcentralizowanego api.

które wcale nie jest takie inne od sdl.
sam napisałem aplikację do renderowania danych przestrzennych w opengl i użyłem czystego qt, działa bardzo dobrze.

@kalectwo: opublikowałeś może kod, czy prywatne? Jak zacząć robić coś takiego?
@Dijuna: po prostu wsadziłem kod do renderowania w klasę dziedziczącą qopenglwidget, gdzie łapałem eventy myszy.
qt teraz ma nawet obsługę gamepadów, więc nie sądzę, by czegoś ci brakowało.

apka była do mojej inżynierki, jakiś wycięty kawałek mogę ci podrzucić.

a właśnie, chwila, używasz opengl czy czegoś dziwnego?
@kalectwo: ja jeszcze niczego nie używam, od 2 dni o tym czytam. ( ͡° ʖ̯ ͡°) tzn. ogólnie używam Qt w pracy, znam najbardziej po prostu. Ale nic związanego z gamedev jeszcze nie robiłem, odkurzam marzenia po prostu.
@Dijuna: sdl ma jakieś proste metody do rysowania obiektów z obrotem itd. qt też ma (QPainter) i wygląda na to, że też ma wspomaganie GPU. jeżeli zamierzasz ich używać, powinieneś się na to nastawić.

ja osobiście używałem opengl, nie wiem czy chcesz schodzić tak nisko.
@Dijuna: problem jest taki, że qt samo w sobie nie jest... "idealne" do tego typu zastosowań. jeżeli zależy ci na wykorzystaniu tylko zachowania QObjectów itd, możesz rozważyć wzięcie samego qt core bez gui i dokleić je do sdl.

edit: no dobra, to nieważne xD