Synchronous update of Qt3D texture data
-
Use case
I have a
QImagewhich needs to be drawn synchronously in 2D (QQuickPaintedItem) and 3D (rendered as texture on a quad). The contents of theQImagechanges rapidly (like playing a movie).Current solution
Following the Qt3D examples and source code, I'm currently doing the following:
- Subclass
Qt3DRender::QAbstractTextureImageto represent my texture. My subclass has aQt3DRender::TexImageDataPtrmember that I update with the data from myQImage. So far so good. - Implement
Qt3DRender::QAbstractTextureImage::dataFunctor(), which (through a functor) returns myQt3DRender::TexImageDataPtrmember. This works.
Problem
The problem is that the texture loading is asynchronous, and the 3D version of the
QImagelags significantly behind the 2D version. There seem to be two asynchronous parts contributing to this- The
Qt3DRender::Render::LoadTextureDataJob, running in a separate thread, checks for updates in my functor, and callsQt3DRender::Render::Texture::requestTextureDataUpdate, which just marks it as requiring data upload - The
Qt3DRender::QRenderAspectthen comes a long (in the next frame, presumably), and uploads the new data to the GPU texture.
TL;DR
Is there a way for me to synchronously upload data to a Qt3D texture?
- Subclass