diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/api/studio3d/q3dspresentation.cpp | 15 | ||||
-rw-r--r-- | src/api/studio3d/q3dspresentation.h | 2 | ||||
-rw-r--r-- | src/engine/Qt3DSRuntimeView.cpp | 12 | ||||
-rw-r--r-- | src/engine/Qt3DSRuntimeView.h | 1 | ||||
-rw-r--r-- | src/runtime/Qt3DSIScriptBridge.h | 2 | ||||
-rw-r--r-- | src/runtime/Qt3DSQmlEngine.cpp | 23 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderEffectSystem.cpp | 19 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderEffectSystem.h | 7 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderer.h | 2 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp | 14 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.h | 2 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp | 23 | ||||
-rw-r--r-- | src/viewer/Qt3DSViewerApp.cpp | 8 | ||||
-rw-r--r-- | src/viewer/Qt3DSViewerApp.h | 2 |
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); |