-
Bug
-
Resolution: Done
-
P2: Important
-
6.0
-
None
-
7269ac7c02c6178c83e3468adddb5ee0aedcbdf6 (qt/qtquick3d/dev) d76240bc5483ce1f4a53b6579833b4c81e70311e (qt/qtquick3d/6.0) 1fafbc5e250be2db0f919157a709110e83ea85f5 (qt/qtquick3d/6.1)
-
Qt Quick 3D - 2021 - Weeks 7/8, Qt Quick 3D - 2021 Week 9 - 10
In QQuick3DTexture::updateSpatialNode() we have this block:
m_textureProviderConnection = connect(provider, &QSGTextureProvider::textureChanged, this, [provider, imageNode] () {
// called on the render thread, if there is one; while not
// obvious, the gui thread is blocked too because one can
// get here only from either the textureProvider() call
// above, or from QQuickImage::updatePaintNode()
imageNode->m_qsgTexture = provider->texture();
// the QSGTexture may be different now, go through loadRenderImage() again
imageNode->m_flags.setFlag(QSSGRenderImage::Flag::Dirty);
}, Qt::DirectConnection);
Something is wrong about this, at least when the texture provider is a View3D. The following snippet will not lead to live rendering in the second View3D. Rather, it only updates when something else triggers an update.
View3D {
id: lightmapSource
renderMode: View3D.Offscreen // so a texture provider as well
...
}
...
View3D {
...
Model {
...
materials: DefaultMaterial {
lighting: DefaultMaterial.NoLighting
diffuseMap: Texture {
sourceItem: lightmapSource
indexUV: 1
}
}
}
}
The problem should not affect texture providers where the provided texture is an QSGDynamicTexture (this includes layers). An Image or a View3D are however not like that, there is no explicit updateTexture() step for those. So those still need to trigger proper updating upon textureChanged().