summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2020-08-05 12:20:59 +0300
committerAntti Määttä <antti.maatta@qt.io>2020-08-12 10:31:28 +0300
commit9f5140ba5fccda4d3c2e7061ce9bb4518149c370 (patch)
tree6af3f740bb393a3c97347e179d23d7ddb1a26fbd
parente2f3a05959ff375996a9da8b0ab59dec7f508a80 (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.cpp87
-rw-r--r--src/runtimerender/Qt3DSRenderer.h4
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp8
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.h4
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;