diff options
-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; |