diff options
author | Antti Määttä <antti.maatta@qt.io> | 2020-08-05 12:20:59 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2020-08-12 10:31:28 +0300 |
commit | 9f5140ba5fccda4d3c2e7061ce9bb4518149c370 (patch) | |
tree | 6af3f740bb393a3c97347e179d23d7ddb1a26fbd /src/runtime | |
parent | e2f3a05959ff375996a9da8b0ab59dec7f508a80 (diff) |
Allow getting texture id from subpresentation layer
The subpresentation layer textures are stored per instance basis so the
getter needs to use the correct main presentation layer to get it.
Getting the subresentation texture id from images already work by
using "subpresentationId:elementPath" in the getter.
For subpresentation layers the getter needs to specify also the main
presentation layer using the subpresentation. The elementPath needs to be
specified as elementPath::subpresentationId:elementPath.
F.ex. "Scene.Layer2::subpres:Scene.Layer"
Task-number: QT3DS-4127
Change-Id: Ifeb654838e6cc97ac8f95841e080e3c35fc76ad7
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/runtime')
-rw-r--r-- | src/runtime/Qt3DSQmlEngine.cpp | 87 |
1 files changed, 51 insertions, 36 deletions
diff --git a/src/runtime/Qt3DSQmlEngine.cpp b/src/runtime/Qt3DSQmlEngine.cpp index 994f6c1..d5808ed 100644 --- a/src/runtime/Qt3DSQmlEngine.cpp +++ b/src/runtime/Qt3DSQmlEngine.cpp @@ -1806,49 +1806,64 @@ void CQmlEngineImpl::deleteMeshes(const QStringList &meshNames, uint CQmlEngineImpl::textureId(const QString &elementPath, qt3ds::render::IQt3DSRenderer *renderer) { - TElement *elem = getTarget(elementPath.toUtf8().constData()); - if (elem) { - auto translator = static_cast<qt3ds::render::Qt3DSTranslator *>(elem->GetAssociation()); - if (translator) { - qt3ds::render::GraphObjectTypes::Enum type = translator->GetUIPType(); - if (type == qt3ds::render::GraphObjectTypes::Layer) { - auto layer = static_cast<qt3ds::render::SLayer *>(&translator->RenderObject()); - return renderer->getLayerTextureId(*layer); - } else if (type == qt3ds::render::GraphObjectTypes::Image) { - auto image = static_cast<qt3ds::render::SImage *>(&translator->RenderObject()); - if (image->m_TextureData.m_Texture) { - return static_cast<uint>(reinterpret_cast<size_t>( - image->m_TextureData.m_Texture->GetTextureObjectHandle())); - } - } - } - } - return 0; + QSize size; + GLenum format; + return textureId(elementPath, renderer, size, format); } uint CQmlEngineImpl::textureId(const QString &elementPath, qt3ds::render::IQt3DSRenderer *renderer, QSize &size, GLenum &format) { - TElement *elem = getTarget(elementPath.toUtf8().constData()); - if (elem) { - auto translator = static_cast<qt3ds::render::Qt3DSTranslator *>(elem->GetAssociation()); - if (translator) { - qt3ds::render::GraphObjectTypes::Enum elemType = translator->GetUIPType(); - if (elemType == qt3ds::render::GraphObjectTypes::Layer) { - auto layer = static_cast<qt3ds::render::SLayer *>(&translator->RenderObject()); - auto texdetails = renderer->getLayerTextureDetails(*layer); - size = QSize(texdetails.m_Width, texdetails.m_Height); - // Assume that NVRenderTextureFormats enums match GL texture format enums - format = renderer->getTextureGlFormat(texdetails.m_Format); - return renderer->getLayerTextureId(*layer); - } else if (elemType == qt3ds::render::GraphObjectTypes::Image) { - auto image = static_cast<qt3ds::render::SImage *>(&translator->RenderObject()); - if (image->m_TextureData.m_Texture) { - auto texdetails = image->m_TextureData.m_Texture->GetTextureDetails(); + auto subpresLayer = elementPath.split(QStringLiteral("::")); + if (subpresLayer.size() == 2) { + // This is true only for subpresentation layers + // First retrieve the main layer + TElement *mainPresentationLayer = getTarget(subpresLayer[0].toUtf8().constData()); + if (!mainPresentationLayer) + return 0; + auto mainLayerTranslator = static_cast<qt3ds::render::Qt3DSTranslator *>(mainPresentationLayer->GetAssociation()); + auto mainLayerTranslatorType = mainLayerTranslator->GetUIPType(); + if (mainLayerTranslatorType != qt3ds::render::GraphObjectTypes::Layer) + return 0; + auto mainLayer = static_cast<qt3ds::render::SLayer *>(&mainLayerTranslator->RenderObject()); + + // Now retrieve the subpresentation layer being queried + TElement *subPresentationLayer = getTarget(subpresLayer[1].toUtf8().constData()); + if (!subPresentationLayer) + return 0; + auto subpresLayerTranslator = static_cast<qt3ds::render::Qt3DSTranslator *>(subPresentationLayer->GetAssociation()); + auto subpresLayerTranslatorType = subpresLayerTranslator->GetUIPType(); + if (subpresLayerTranslatorType != qt3ds::render::GraphObjectTypes::Layer) + return 0; + auto subpresLayer = static_cast<qt3ds::render::SLayer *>(&subpresLayerTranslator->RenderObject()); + + auto texdetails = renderer->getLayerTextureDetails(*subpresLayer, mainLayer); + size = QSize(texdetails.m_Width, texdetails.m_Height); + // Assume that NVRenderTextureFormats enums match GL texture format enums + format = renderer->getTextureGlFormat(texdetails.m_Format); + return renderer->getLayerTextureId(*subpresLayer, mainLayer); + } else { + TElement *elem = getTarget(elementPath.toUtf8().constData()); + if (elem) { + auto translator = static_cast<qt3ds::render::Qt3DSTranslator *>(elem->GetAssociation()); + if (translator) { + qt3ds::render::GraphObjectTypes::Enum elemType = translator->GetUIPType(); + if (elemType == qt3ds::render::GraphObjectTypes::Layer) { + auto layer = static_cast<qt3ds::render::SLayer *>(&translator->RenderObject()); + auto texdetails = renderer->getLayerTextureDetails(*layer); size = QSize(texdetails.m_Width, texdetails.m_Height); + // Assume that NVRenderTextureFormats enums match GL texture format enums format = renderer->getTextureGlFormat(texdetails.m_Format); - return static_cast<uint>(reinterpret_cast<size_t>( - image->m_TextureData.m_Texture->GetTextureObjectHandle())); + return renderer->getLayerTextureId(*layer); + } else if (elemType == qt3ds::render::GraphObjectTypes::Image) { + auto image = static_cast<qt3ds::render::SImage *>(&translator->RenderObject()); + if (image->m_TextureData.m_Texture) { + auto texdetails = image->m_TextureData.m_Texture->GetTextureDetails(); + size = QSize(texdetails.m_Width, texdetails.m_Height); + format = renderer->getTextureGlFormat(texdetails.m_Format); + return static_cast<uint>(reinterpret_cast<size_t>( + image->m_TextureData.m_Texture->GetTextureObjectHandle())); + } } } } |