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 | |
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>
-rw-r--r-- | src/runtime/Qt3DSQmlEngine.cpp | 87 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderer.h | 4 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp | 8 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.h | 4 |
4 files changed, 59 insertions, 44 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())); + } } } } diff --git a/src/runtimerender/Qt3DSRenderer.h b/src/runtimerender/Qt3DSRenderer.h index 50c27c3..383267c 100644 --- a/src/runtimerender/Qt3DSRenderer.h +++ b/src/runtimerender/Qt3DSRenderer.h @@ -170,11 +170,11 @@ namespace render { const QT3DSVec3 &inMouseVec) const = 0; virtual QT3DSVec3 ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const = 0; - virtual uint getLayerTextureId(SLayer &layer) = 0; + virtual uint getLayerTextureId(SLayer &layer, const SRenderInstanceId id = nullptr) = 0; virtual GLenum getTextureGlFormat(NVRenderTextureFormats::Enum internalFormat) = 0; - virtual STextureDetails getLayerTextureDetails(SLayer &layer) = 0; + virtual STextureDetails getLayerTextureDetails(SLayer &layer, const SRenderInstanceId id = nullptr) = 0; // Roughly equivalent of gluPickMatrix, allows users to setup a perspective transform that // will draw some sub component diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp index a8b6a4f..ad9b227 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp @@ -968,9 +968,9 @@ namespace render { return mouseVec; } - uint Qt3DSRendererImpl::getLayerTextureId(SLayer &layer) + uint Qt3DSRendererImpl::getLayerTextureId(SLayer &layer, const SRenderInstanceId id) { - SLayerRenderData *data = GetOrCreateLayerRenderDataForNode(layer); + SLayerRenderData *data = GetOrCreateLayerRenderDataForNode(layer, id); if (data->m_LayerCachedTexture) { return static_cast<uint>(reinterpret_cast<size_t>( data->m_LayerCachedTexture->GetTextureObjectHandle())); @@ -1003,9 +1003,9 @@ namespace render { } } - STextureDetails Qt3DSRendererImpl::getLayerTextureDetails(SLayer &inLayer) + STextureDetails Qt3DSRendererImpl::getLayerTextureDetails(SLayer &inLayer, const SRenderInstanceId id) { - SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inLayer); + SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inLayer, id); if (theData->m_LayerCachedTexture) return theData->m_LayerCachedTexture->GetTextureDetails(); diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h index decd7fd..d3048ea 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h @@ -386,9 +386,9 @@ namespace render { const QT3DSVec3 &inMouseVec) const override; QT3DSVec3 ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const override; - uint getLayerTextureId(SLayer &layer) override; + uint getLayerTextureId(SLayer &layer, const SRenderInstanceId id) override; - STextureDetails getLayerTextureDetails(SLayer &inLayer) override; + STextureDetails getLayerTextureDetails(SLayer &inLayer, const SRenderInstanceId id) override; GLenum getTextureGlFormat(NVRenderTextureFormats::Enum internalFormat) override; |