summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);