SFML community forums

Help => General => Topic started by: Eray on November 22, 2020, 10:47:48 pm

Title: SFML + QML
Post by: Eray on November 22, 2020, 10:47:48 pm
Hello,

I would like to use SFML with Qt.
More precisely I would like to create a QML component which is an instance of the SFML renderer.

Has anyone ever done this manipulation?

I tried to do something quickly with an object that inherits from QQuickItem and sf :: RenderWindow but the create doesn't work
and I'm not sure that's the right method.

My goal being to make an iOS / Android / Linux / Window game.

Thanks for your help
Title: Re: SFML + QML
Post by: Laurent on November 23, 2020, 08:39:15 am
Not sure if that's possible at all. To be more specific, I don't think you can make SFML use the OpenGL context that Qt uses behind the scenes -- especially since it now uses an abstract rendering API which can use non-OpenGL back-ends (D3D, Vulkan, Metal).

The easiest solution, though not optimal, could be to draw your SFML scene to a render-texture, retrieve its pixels and upload them to something that QtQuick can display: ideally a QSGTexture + QSGSimpleTextureNode, or anything else that you're more familiar with (like QQuickPaintedItem + QImage).

If you've got the QSGTexture solution working, it may be worth investigating into directly transfering the pixels between the SFML render-texture and the QSGTexture's internal texture, without downloading the pixels in system RAM. I have no idea if this is possible.
Title: Re: SFML + QML
Post by: Eray on November 24, 2020, 10:27:56 am
Thank you for your help.

I use QSG quite often.
So I managed to display my RenderTexture in my SFML through an image no problem.

Now I would like to improve it by going directly from the opengl sfml texture to the QSGTexture texture.

In its Qt interface allows you to transform an opengl texture into a qt texture.
https://doc.qt.io/qt-5/qquickwindow.html#createTextureFromNativeObject

But it doesn't work as is, I just have a black texture.
After digging a little deeper, I think my textures are not shared between the sfml and Qt contexts, do you think this is a possible lead and do you have any solutions?

Thanks
Title: Re: SFML + QML
Post by: Laurent on November 24, 2020, 07:59:58 pm
Nop, I'm afraid you won't be able to do this since SFML and Qt use different contexts, that are not shared.
Title: Re: SFML + QML
Post by: Eray on November 24, 2020, 08:36:50 pm
Thanks again for your reply !

I still have a small question with Qt, it is possible to share data from opengl contexts.

But I need to "link" my native context to a Qt context.

For that, I need to get the "GLXContext" of my SFML texture render, is it possible ?

Sources :
https://doc.qt.io/qt-5/qopenglcontext.html#setNativeHandle
https://doc.qt.io/qt-5/qglxnativecontext.html -> class I want to instantiate
https://doc.qt.io/qt-5/qopenglcontext.html#setShareContext

I do not despair yet ^^
Title: Re: SFML + QML
Post by: Laurent on November 25, 2020, 08:52:15 am
After drawing to the SFML render-texture, its OpenGL context should be active, therefore a call to glXGetCurrentContext should do the trick.