summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJere Tuliniemi <jere.tuliniemi@qt.io>2019-09-25 15:35:59 +0300
committerJere Tuliniemi <jere.tuliniemi@qt.io>2019-09-30 10:09:36 +0300
commitd562409eb14f00567f7495c24c502e6b7aeb0cb0 (patch)
treee034590dfebbf0a446d52b814a05007f0b5b7723
parent52f3ec01c0f9e7170dd375de688541baf353bf81 (diff)
Provide texture ids through the C++ API
Image, subpresentation and layer texture ids are now provided by the presentation via an element path. The cached layer texture id is also stabilized. Instead recreating it every frame, the last effect is just rendered to the premade texture. For each intermediate effect, a new texture is still created. Task-number: QT3DS-3959 Change-Id: I2ad2b81be9ae61373a0bfd963501823f012e9fcc Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/api/studio3d/q3dspresentation.cpp15
-rw-r--r--src/api/studio3d/q3dspresentation.h2
-rw-r--r--src/engine/Qt3DSRuntimeView.cpp12
-rw-r--r--src/engine/Qt3DSRuntimeView.h1
-rw-r--r--src/runtime/Qt3DSIScriptBridge.h2
-rw-r--r--src/runtime/Qt3DSQmlEngine.cpp23
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.cpp19
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.h7
-rw-r--r--src/runtimerender/Qt3DSRenderer.h2
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp14
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.h2
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp23
-rw-r--r--src/viewer/Qt3DSViewerApp.cpp8
-rw-r--r--src/viewer/Qt3DSViewerApp.h2
14 files changed, 114 insertions, 18 deletions
diff --git a/src/api/studio3d/q3dspresentation.cpp b/src/api/studio3d/q3dspresentation.cpp
index 0536310..84a925a 100644
--- a/src/api/studio3d/q3dspresentation.cpp
+++ b/src/api/studio3d/q3dspresentation.cpp
@@ -959,6 +959,21 @@ void Q3DSPresentation::addImageProvider(const QString &providerId, QQmlImageProv
}
/*!
+ Returns the OpenGL texture id associated with a layer or an image specified
+ by \a elementPath.
+
+ For example, \c{Scene.Layer} returns the texture id of a layer while
+ \c{Scene.Layer.Rectangle.Material.diffusemap} returns the texture id of
+ an image or a subpresentation.
+ */
+uint Q3DSPresentation::textureId(const QString &elementPath)
+{
+ if (d_ptr->m_viewerApp)
+ return d_ptr->m_viewerApp->textureId(elementPath);
+ return 0;
+}
+
+/*!
Activate or deactivate the presentation identified by \a id depending
on the value of \a active.
*/
diff --git a/src/api/studio3d/q3dspresentation.h b/src/api/studio3d/q3dspresentation.h
index 1c53f98..6822ab0 100644
--- a/src/api/studio3d/q3dspresentation.h
+++ b/src/api/studio3d/q3dspresentation.h
@@ -126,6 +126,8 @@ public:
void addImageProvider(const QString &providerId, QQmlImageProviderBase *provider);
+ uint textureId(const QString &elementPath);
+
public Q_SLOTS:
void setSource(const QUrl &source);
void setVariantList(const QStringList &variantList);
diff --git a/src/engine/Qt3DSRuntimeView.cpp b/src/engine/Qt3DSRuntimeView.cpp
index c5448e3..76efaae 100644
--- a/src/engine/Qt3DSRuntimeView.cpp
+++ b/src/engine/Qt3DSRuntimeView.cpp
@@ -226,6 +226,7 @@ public:
void createMesh(const QString &name, qt3dsimp::Mesh *mesh) override;
void deleteMeshes(const QStringList &meshNames) override;
void addImageProvider(const QString &providerId, QQmlImageProviderBase *provider) override;
+ uint textureId(const QString &elementPath) override;
void SetAttribute(const char *elementPath, const char *attributeName,
const char *value) override;
bool GetAttribute(const char *elementPath, const char *attributeName, void *value) override;
@@ -743,6 +744,17 @@ void CRuntimeView::addImageProvider(const QString &providerId, QQmlImageProvider
}
}
+uint CRuntimeView::textureId(const QString &elementPath)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+ return theBridgeEngine.textureId(elementPath,
+ &m_RuntimeFactory->GetQt3DSRenderContext().GetRenderer());
+ }
+ return 0;
+}
+
void CRuntimeView::SetAttribute(const char *elementPath, const char *attributeName,
const char *value)
{
diff --git a/src/engine/Qt3DSRuntimeView.h b/src/engine/Qt3DSRuntimeView.h
index 482e69a..4e0b420 100644
--- a/src/engine/Qt3DSRuntimeView.h
+++ b/src/engine/Qt3DSRuntimeView.h
@@ -227,6 +227,7 @@ public:
virtual void createMesh(const QString &name, qt3dsimp::Mesh *mesh) = 0;
virtual void deleteMeshes(const QStringList &meshNames) = 0;
virtual void addImageProvider(const QString &providerId, QQmlImageProviderBase *provider) = 0;
+ virtual uint textureId(const QString &elementPath) = 0;
virtual void SetAttribute(const char *elementPath, const char *attributeName,
const char *value) = 0;
virtual bool GetAttribute(const char *elementPath, const char *attributeName, void *value) = 0;
diff --git a/src/runtime/Qt3DSIScriptBridge.h b/src/runtime/Qt3DSIScriptBridge.h
index b9df2b3..f424aac 100644
--- a/src/runtime/Qt3DSIScriptBridge.h
+++ b/src/runtime/Qt3DSIScriptBridge.h
@@ -187,6 +187,8 @@ public: // Elements
qt3ds::render::IBufferManager *bufferManager) = 0;
virtual void deleteMeshes(const QStringList &elementPath,
qt3ds::render::IBufferManager *bufferManager) = 0;
+ virtual uint textureId(const QString &elementPath,
+ qt3ds::render::IQt3DSRenderer *renderer) = 0;
public: // Components
virtual void GotoSlide(const char *component, const char *slideName,
diff --git a/src/runtime/Qt3DSQmlEngine.cpp b/src/runtime/Qt3DSQmlEngine.cpp
index 0bfddba..c7e6e88 100644
--- a/src/runtime/Qt3DSQmlEngine.cpp
+++ b/src/runtime/Qt3DSQmlEngine.cpp
@@ -450,6 +450,8 @@ public:
qt3ds::render::IBufferManager *bufferManager) override;
void deleteMeshes(const QStringList &meshNames,
qt3ds::render::IBufferManager *bufferManager) override;
+ uint textureId(const QString &elementPath,
+ qt3ds::render::IQt3DSRenderer *renderer) override;
void GotoSlide(const char *component, const char *slideName,
const SScriptEngineGotoSlideArgs &inArgs) override;
@@ -1833,6 +1835,27 @@ 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());
+ return static_cast<uint>(reinterpret_cast<size_t>(
+ image->m_TextureData.m_Texture->GetTextureObjectHandle()));
+ }
+ }
+ }
+ return 0;
+}
+
void CQmlEngineImpl::GotoSlide(const char *component, const char *slideName,
const SScriptEngineGotoSlideArgs &inArgs)
{
diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp
index 81027f1..795eeea 100644
--- a/src/runtimerender/Qt3DSRenderEffectSystem.cpp
+++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp
@@ -1719,13 +1719,18 @@ struct SEffectSystem : public IEffectSystem
QT3DSU32 theFinalWidth = ITextRenderer::NextMultipleOf4((QT3DSU32)(theDetails.m_Width));
QT3DSU32 theFinalHeight = ITextRenderer::NextMultipleOf4((QT3DSU32)(theDetails.m_Height));
NVRenderFrameBuffer *theBuffer = theManager.AllocateFrameBuffer();
- // UdoL Some Effects may need to run before HDR tonemap. This means we need to keep the
- // input format
- NVRenderTextureFormats::Enum theOutputFormat = NVRenderTextureFormats::RGBA8;
- if (theClass->m_DynamicClass->GetOutputTextureFormat() == NVRenderTextureFormats::Unknown)
- theOutputFormat = theDetails.m_Format;
- NVRenderTexture2D *theTargetTexture =
- theManager.AllocateTexture2D(theFinalWidth, theFinalHeight, theOutputFormat);
+ NVRenderTexture2D *theTargetTexture = inRenderArgument.m_targetTexture;
+ if (theTargetTexture == nullptr) {
+ // Some Effects may need to run before HDR tonemap. This means we need to keep the
+ // input format
+ NVRenderTextureFormats::Enum theOutputFormat = NVRenderTextureFormats::RGBA8;
+ if (theClass->m_DynamicClass->GetOutputTextureFormat()
+ == NVRenderTextureFormats::Unknown) {
+ theOutputFormat = theDetails.m_Format;
+ }
+ theTargetTexture = theManager.AllocateTexture2D(theFinalWidth, theFinalHeight,
+ theOutputFormat);
+ }
theBuffer->Attach(NVRenderFrameBufferAttachments::Color0, *theTargetTexture);
theContext.SetRenderTarget(theBuffer);
NVRenderContextScopedProperty<NVRenderRect> __viewport(
diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.h b/src/runtimerender/Qt3DSRenderEffectSystem.h
index a9ea7c5..def1539 100644
--- a/src/runtimerender/Qt3DSRenderEffectSystem.h
+++ b/src/runtimerender/Qt3DSRenderEffectSystem.h
@@ -57,16 +57,19 @@ namespace render {
// this is a depth preapass texture we need for some effects like bloom
// actually we need the stencil values
NVRenderTexture2D *m_DepthStencilBuffer;
+ NVRenderTexture2D *m_targetTexture;
SEffectRenderArgument(SEffect &inEffect, NVRenderTexture2D &inColorBuffer,
const QT3DSVec2 &inCameraClipRange,
- NVRenderTexture2D *inDepthTexture = NULL,
- NVRenderTexture2D *inDepthBuffer = NULL)
+ NVRenderTexture2D *inDepthTexture = nullptr,
+ NVRenderTexture2D *inDepthBuffer = nullptr,
+ NVRenderTexture2D *targetTexture = nullptr)
: m_Effect(inEffect)
, m_ColorBuffer(inColorBuffer)
, m_CameraClipRange(inCameraClipRange)
, m_DepthTexture(inDepthTexture)
, m_DepthStencilBuffer(inDepthBuffer)
+ , m_targetTexture(targetTexture)
{
}
};
diff --git a/src/runtimerender/Qt3DSRenderer.h b/src/runtimerender/Qt3DSRenderer.h
index fb6c3de..392fb62 100644
--- a/src/runtimerender/Qt3DSRenderer.h
+++ b/src/runtimerender/Qt3DSRenderer.h
@@ -167,6 +167,8 @@ namespace render {
const QT3DSVec3 &inMouseVec) const = 0;
virtual QT3DSVec3 ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const = 0;
+ virtual uint getLayerTextureId(SLayer &layer) = 0;
+
// Roughly equivalent of gluPickMatrix, allows users to setup a perspective transform that
// will draw some sub component
// of the layer. Used in combination with an expected viewport of 0,0,width,height the
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
index db3697a..04b08c1 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
@@ -968,6 +968,20 @@ namespace render {
return mouseVec;
}
+ uint Qt3DSRendererImpl::getLayerTextureId(SLayer &layer)
+ {
+ SLayerRenderData *data = GetOrCreateLayerRenderDataForNode(layer);
+ if (data->m_LayerCachedTexture) {
+ return static_cast<uint>(reinterpret_cast<size_t>(
+ data->m_LayerCachedTexture->GetTextureObjectHandle()));
+ }
+ if (data->m_LayerTexture) {
+ return static_cast<uint>(reinterpret_cast<size_t>(
+ data->m_LayerTexture->GetTextureObjectHandle()));
+ }
+ return 0;
+ }
+
Option<SLayerPickSetup> Qt3DSRendererImpl::GetLayerPickSetup(SLayer &inLayer,
const QT3DSVec2 &inMouseCoords,
const QSize &inPickDims)
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h
index cd104df..32c48d3 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h
@@ -385,6 +385,8 @@ namespace render {
const QT3DSVec3 &inMouseVec) const override;
QT3DSVec3 ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const override;
+ uint getLayerTextureId(SLayer &layer) override;
+
Option<SLayerPickSetup> GetLayerPickSetup(SLayer &inLayer,
const QT3DSVec2 &inMouseCoords,
const QSize &inPickDims) override;
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
index 3571c96..0eb7c51 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
@@ -1746,16 +1746,29 @@ namespace render {
NVRenderTexture2D *theLayerColorTexture = m_LayerTexture;
NVRenderTexture2D *theLayerDepthTexture = m_LayerDepthTexture;
+ if (!m_LayerCachedTexture) {
+ STextureDetails details(theLayerColorTexture->GetTextureDetails());
+ QT3DSU32 finalWidth = ITextRenderer::NextMultipleOf4((QT3DSU32)(details.m_Width));
+ QT3DSU32 finalHeight = ITextRenderer::NextMultipleOf4((QT3DSU32)(details.m_Height));
+ m_LayerCachedTexture = theResourceManager.AllocateTexture2D(finalWidth, finalHeight,
+ details.m_Format);
+ }
+
NVRenderTexture2D *theCurrentTexture = theLayerColorTexture;
for (SEffect *theEffect = m_Layer.m_FirstEffect; theEffect;
theEffect = theEffect->m_NextEffect) {
if (theEffect->m_Flags.IsActive() && m_Camera) {
+ NVRenderTexture2D *targetTexture = nullptr;
+ if (!theEffect->m_NextEffect)
+ targetTexture = m_LayerCachedTexture;
+
StartProfiling(theEffect->m_ClassName, false);
NVRenderTexture2D *theRenderedEffect = theEffectSystem.RenderEffect(
SEffectRenderArgument(*theEffect, *theCurrentTexture,
QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar),
- theLayerDepthTexture, m_LayerPrepassDepthTexture));
+ theLayerDepthTexture, m_LayerPrepassDepthTexture,
+ targetTexture));
EndProfiling(theEffect->m_ClassName);
@@ -1775,14 +1788,6 @@ namespace render {
}
}
}
-
- if (m_LayerCachedTexture && m_LayerCachedTexture != m_LayerTexture) {
- theResourceManager.Release(*m_LayerCachedTexture);
- m_LayerCachedTexture = NULL;
- }
-
- if (theCurrentTexture != m_LayerTexture)
- m_LayerCachedTexture = theCurrentTexture;
}
inline bool AnyCompletelyNonTransparentObjects(TRenderableObjectList &inObjects)
diff --git a/src/viewer/Qt3DSViewerApp.cpp b/src/viewer/Qt3DSViewerApp.cpp
index 5916061..a4cec7f 100644
--- a/src/viewer/Qt3DSViewerApp.cpp
+++ b/src/viewer/Qt3DSViewerApp.cpp
@@ -1051,6 +1051,14 @@ void Q3DSViewerApp::addImageProvider(const QString &providerId, QQmlImageProvide
m_Impl.m_view->addImageProvider(providerId, provider);
}
+uint Q3DSViewerApp::textureId(const QString &elementPath)
+{
+ if (!m_Impl.m_view)
+ return 0;
+
+ return m_Impl.m_view->textureId(elementPath);
+}
+
Q3DSViewerApp &Q3DSViewerApp::Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer,
QElapsedTimer *startupTimer)
{
diff --git a/src/viewer/Qt3DSViewerApp.h b/src/viewer/Qt3DSViewerApp.h
index d5b02e4..441cd50 100644
--- a/src/viewer/Qt3DSViewerApp.h
+++ b/src/viewer/Qt3DSViewerApp.h
@@ -495,6 +495,8 @@ public:
void addImageProvider(const QString &providerId, QQmlImageProviderBase *provider);
+ uint textureId(const QString &elementPath);
+
QString error();
void setPresentationId(const QString &id);