diff options
Diffstat (limited to 'src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderContextCore.cpp')
m--------- | src/Runtime/ogl-runtime | 0 | ||||
-rw-r--r-- | src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderContextCore.cpp | 858 |
2 files changed, 0 insertions, 858 deletions
diff --git a/src/Runtime/ogl-runtime b/src/Runtime/ogl-runtime new file mode 160000 +Subproject 2025912174c4cf99270b7439ec3b021e1d089ae diff --git a/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderContextCore.cpp deleted file mode 100644 index 33e1bf6c..00000000 --- a/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderContextCore.cpp +++ /dev/null @@ -1,858 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008-2012 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSRender.h" -#include "EABase/eabase.h" //char16_t definition -#include "Qt3DSRenderContextCore.h" -#include "foundation/StringTable.h" -#include "Qt3DSRenderNode.h" -#include "Qt3DSRenderBufferManager.h" -#include "Qt3DSRenderer.h" -#include "Qt3DSRenderResourceManager.h" -#include "render/Qt3DSRenderContext.h" -#include "foundation/Qt3DSAtomic.h" -#include "Qt3DSOffscreenRenderManager.h" -#include "Qt3DSTextRenderer.h" -#include "Qt3DSRenderInputStreamFactory.h" -#include "Qt3DSRenderEffectSystem.h" -#include "Qt3DSRenderShaderCache.h" -#include "foundation/Qt3DSFoundation.h" -#include "render/Qt3DSRenderFrameBuffer.h" -#include "render/Qt3DSRenderRenderBuffer.h" -#include "render/Qt3DSRenderTexture2D.h" -#include "Qt3DSRenderCamera.h" -#include "foundation/Qt3DSContainers.h" -#include "Qt3DSRenderThreadPool.h" -#include "Qt3DSRenderImageBatchLoader.h" -#include "Qt3DSRenderTextTextureCache.h" -#include "Qt3DSRenderTextTextureAtlas.h" -#include "Qt3DSRenderPlugin.h" -#include "Qt3DSRenderDynamicObjectSystem.h" -#include "Qt3DSRenderCustomMaterialSystem.h" -#include "Qt3DSRenderPixelGraphicsRenderer.h" -#include "foundation/Qt3DSPerfTimer.h" -#include "Qt3DSRenderBufferLoader.h" -#include "foundation/FastAllocator.h" -#include "foundation/AutoDeallocatorAllocator.h" -#include "Qt3DSRenderRenderList.h" -#include "Qt3DSRenderPathManager.h" -#include "Qt3DSRenderShaderCodeGeneratorV2.h" -#include "Qt3DSRenderDefaultMaterialShaderGenerator.h" -#include "Qt3DSRenderCustomMaterialShaderGenerator.h" -#include "Qt3DSDistanceFieldRenderer.h" - -using namespace qt3ds::render; - -namespace { - -struct SRenderContextCore : public IQt3DSRenderContextCore -{ - NVFoundationBase &m_Foundation; - NVScopedRefCounted<IStringTable> m_StringTable; - NVScopedRefCounted<IPerfTimer> m_PerfTimer; - NVScopedRefCounted<IInputStreamFactory> m_InputStreamFactory; - NVScopedRefCounted<IThreadPool> m_ThreadPool; - NVScopedRefCounted<IDynamicObjectSystemCore> m_DynamicObjectSystem; - NVScopedRefCounted<ICustomMaterialSystemCore> m_MaterialSystem; - NVScopedRefCounted<IEffectSystemCore> m_EffectSystem; - NVScopedRefCounted<IBufferLoader> m_BufferLoader; - NVScopedRefCounted<IRenderPluginManagerCore> m_RenderPluginManagerCore; - NVScopedRefCounted<ITextRendererCore> m_TextRenderer; - NVScopedRefCounted<ITextRendererCore> m_OnscreenTexRenderer; - NVScopedRefCounted<IPathManagerCore> m_PathManagerCore; - NVScopedRefCounted<ITextRendererCore> m_distanceFieldRenderer; - - QT3DSI32 mRefCount; - SRenderContextCore(NVFoundationBase &fnd, IStringTable &strTable) - : m_Foundation(fnd) - , m_StringTable(strTable) - , m_PerfTimer(IPerfTimer::CreatePerfTimer(fnd)) - , m_InputStreamFactory(IInputStreamFactory::Create(fnd)) - , m_ThreadPool(IThreadPool::CreateThreadPool(fnd, 4)) - , mRefCount(0) - { - m_DynamicObjectSystem = IDynamicObjectSystemCore::CreateDynamicSystemCore(*this); - m_MaterialSystem = ICustomMaterialSystemCore::CreateCustomMaterialSystemCore(*this); - m_EffectSystem = IEffectSystemCore::CreateEffectSystemCore(*this); - m_RenderPluginManagerCore = - IRenderPluginManagerCore::Create(fnd, strTable, *m_InputStreamFactory); - m_BufferLoader = IBufferLoader::Create(m_Foundation, *m_InputStreamFactory, *m_ThreadPool); - m_PathManagerCore = IPathManagerCore::CreatePathManagerCore(*this); - } - - virtual ~SRenderContextCore() {} - - QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator()) - - IStringTable &GetStringTable() override { return *m_StringTable; } - NVFoundationBase &GetFoundation() override { return m_Foundation; } - NVAllocatorCallback &GetAllocator() override { return m_Foundation.getAllocator(); } - IInputStreamFactory &GetInputStreamFactory() override { return *m_InputStreamFactory; } - IThreadPool &GetThreadPool() override { return *m_ThreadPool; } - IDynamicObjectSystemCore &GetDynamicObjectSystemCore() override - { - return *m_DynamicObjectSystem; - } - ICustomMaterialSystemCore &GetMaterialSystemCore() override { return *m_MaterialSystem; } - IEffectSystemCore &GetEffectSystemCore() override { return *m_EffectSystem; } - IPerfTimer &GetPerfTimer() override { return *m_PerfTimer; } - IBufferLoader &GetBufferLoader() override { return *m_BufferLoader; } - IRenderPluginManagerCore &GetRenderPluginCore() override { return *m_RenderPluginManagerCore; } - IPathManagerCore &GetPathManagerCore() override { return *m_PathManagerCore; } - IQt3DSRenderContext &CreateRenderContext(NVRenderContext &inContext, - const char8_t *inPrimitivesDirectory, - bool delayedLoading) override; - void SetTextRendererCore(ITextRendererCore &inRenderer) override { m_TextRenderer = inRenderer; } - ITextRendererCore *GetTextRendererCore() override { return m_TextRenderer.mPtr; } - void setDistanceFieldRenderer(ITextRendererCore &inRenderer) override - { - m_distanceFieldRenderer = inRenderer; - } - ITextRendererCore *getDistanceFieldRenderer() override { return m_distanceFieldRenderer.mPtr; } - void SetOnscreenTextRendererCore(ITextRendererCore &inRenderer) override - { - m_OnscreenTexRenderer = inRenderer; - } - ITextRendererCore *GetOnscreenTextRendererCore() override { return m_OnscreenTexRenderer.mPtr; } -}; - -inline float Clamp(float val, float inMin = 0.0f, float inMax = 1.0f) -{ - if (val < inMin) - return inMin; - if (val > inMax) - return inMax; - return val; -} - -struct SPerFrameAllocator : public NVAllocatorCallback -{ - SFastAllocator<> m_FastAllocator; - SSAutoDeallocatorAllocator m_LargeAllocator; - - SPerFrameAllocator(NVAllocatorCallback &baseAllocator) - : m_FastAllocator(baseAllocator, "PerFrameAllocation") - , m_LargeAllocator(baseAllocator) - { - } - - inline void *allocate(size_t inSize, const char *inFile, int inLine) - { - if (inSize < 8192) - return m_FastAllocator.allocate(inSize, "PerFrameAllocation", inFile, inLine, 0); - else - return m_LargeAllocator.allocate(inSize, "PerFrameAllocation", inFile, inLine, 0); - } - - inline void *allocate(size_t inSize, const char *inFile, int inLine, int, int) - { - if (inSize < 8192) - return m_FastAllocator.allocate(inSize, "PerFrameAllocation", inFile, inLine, 0); - else - return m_LargeAllocator.allocate(inSize, "PerFrameAllocation", inFile, inLine, 0); - } - - inline void deallocate(void *, size_t) {} - - void reset() - { - m_FastAllocator.reset(); - m_LargeAllocator.deallocateAllAllocations(); - } - - void *allocate(size_t inSize, const char *typeName, const char *inFile, int inLine, - int flags = 0) override - { - if (inSize < SFastAllocator<>::SlabSize) - return m_FastAllocator.allocate(inSize, typeName, inFile, inLine, flags); - else - return m_LargeAllocator.allocate(inSize, typeName, inFile, inLine, flags); - } - - void *allocate(size_t inSize, const char *typeName, const char *inFile, int inLine, - size_t alignment, size_t alignmentOffset) override - { - if (inSize < SFastAllocator<>::SlabSize) - return m_FastAllocator.allocate(inSize, typeName, inFile, inLine, alignment, - alignmentOffset); - else - return m_LargeAllocator.allocate(inSize, typeName, inFile, inLine, alignment, - alignmentOffset); - } - - void deallocate(void *) override {} -}; - -struct SRenderContext : public IQt3DSRenderContext -{ - NVScopedRefCounted<NVRenderContext> m_RenderContext; - NVScopedRefCounted<IQt3DSRenderContextCore> m_CoreContext; - NVScopedRefCounted<IStringTable> m_StringTable; - NVScopedRefCounted<IPerfTimer> m_PerfTimer; - NVScopedRefCounted<IInputStreamFactory> m_InputStreamFactory; - NVScopedRefCounted<IBufferManager> m_BufferManager; - NVScopedRefCounted<IResourceManager> m_ResourceManager; - NVScopedRefCounted<IOffscreenRenderManager> m_OffscreenRenderManager; - NVScopedRefCounted<IQt3DSRenderer> m_Renderer; - NVScopedRefCounted<ITextRenderer> m_TextRenderer; - NVScopedRefCounted<ITextRenderer> m_distanceFieldRenderer; - NVScopedRefCounted<ITextRenderer> m_OnscreenTextRenderer; - NVScopedRefCounted<ITextTextureCache> m_TextTextureCache; - NVScopedRefCounted<ITextTextureAtlas> m_TextTextureAtlas; - NVScopedRefCounted<IDynamicObjectSystem> m_DynamicObjectSystem; - NVScopedRefCounted<IEffectSystem> m_EffectSystem; - NVScopedRefCounted<IShaderCache> m_ShaderCache; - NVScopedRefCounted<IThreadPool> m_ThreadPool; - NVScopedRefCounted<IImageBatchLoader> m_ImageBatchLoader; - NVScopedRefCounted<IRenderPluginManager> m_RenderPluginManager; - NVScopedRefCounted<ICustomMaterialSystem> m_CustomMaterialSystem; - NVScopedRefCounted<IPixelGraphicsRenderer> m_PixelGraphicsRenderer; - NVScopedRefCounted<IPathManager> m_PathManager; - NVScopedRefCounted<IShaderProgramGenerator> m_ShaderProgramGenerator; - NVScopedRefCounted<IDefaultMaterialShaderGenerator> m_DefaultMaterialShaderGenerator; - NVScopedRefCounted<ICustomMaterialShaderGenerator> m_CustomMaterialShaderGenerator; - SPerFrameAllocator m_PerFrameAllocator; - NVScopedRefCounted<IRenderList> m_RenderList; - QT3DSU32 m_FrameCount; - volatile QT3DSI32 mRefCount; - // Viewport that this render context should use - Option<NVRenderRect> m_Viewport; - QSize m_WindowDimensions; - ScaleModes::Enum m_ScaleMode; - bool m_WireframeMode; - bool m_IsInSubPresentation; - Option<QT3DSVec4> m_SceneColor; - Option<QT3DSVec4> m_MatteColor; - RenderRotationValues::Enum m_Rotation; - NVScopedRefCounted<NVRenderFrameBuffer> m_RotationFBO; - NVScopedRefCounted<NVRenderTexture2D> m_RotationTexture; - NVScopedRefCounted<NVRenderRenderBuffer> m_RotationDepthBuffer; - NVRenderFrameBuffer *m_ContextRenderTarget; - NVRenderRect m_PresentationViewport; - QSize m_PresentationDimensions; - QSize m_RenderPresentationDimensions; - QSize m_PreRenderPresentationDimensions; - QT3DSVec2 m_PresentationScale; - NVRenderRect m_VirtualViewport; - QPair<QT3DSF32, int> m_FPS; - bool m_AuthoringMode; - QVector<QT3DSF32> m_frameTimes; - - SRenderContext(NVRenderContext &ctx, IQt3DSRenderContextCore &inCore, - const char8_t *inApplicationDirectory, bool delayedLoading) - : m_RenderContext(ctx) - , m_CoreContext(inCore) - , m_StringTable(ctx.GetStringTable()) - , m_PerfTimer(inCore.GetPerfTimer()) - , m_InputStreamFactory(inCore.GetInputStreamFactory()) - , m_BufferManager( - IBufferManager::Create(ctx, *m_StringTable, *m_InputStreamFactory, *m_PerfTimer)) - , m_ResourceManager(IResourceManager::CreateResourceManager(ctx)) - , m_ShaderCache(IShaderCache::CreateShaderCache(ctx, *m_InputStreamFactory, *m_PerfTimer)) - , m_ThreadPool(inCore.GetThreadPool()) - , m_RenderList(IRenderList::CreateRenderList(ctx.GetFoundation())) - , m_PerFrameAllocator(ctx.GetAllocator()) - , m_FrameCount(0) - , mRefCount(0) - , m_WindowDimensions(800, 480) - , m_ScaleMode(ScaleModes::ExactSize) - , m_WireframeMode(false) - , m_IsInSubPresentation(false) - , m_Rotation(RenderRotationValues::NoRotation) - , m_ContextRenderTarget(NULL) - , m_PresentationScale(0, 0) - , m_FPS(qMakePair(0.0, 0)) - , m_AuthoringMode(false) - { - m_BufferManager->enableReloadableResources(delayedLoading); - m_OffscreenRenderManager = IOffscreenRenderManager::CreateOffscreenRenderManager( - ctx.GetAllocator(), *m_StringTable, *m_ResourceManager, *this); - m_Renderer = IQt3DSRenderer::CreateRenderer(*this); - if (inApplicationDirectory && *inApplicationDirectory) - m_InputStreamFactory->AddSearchDirectory(inApplicationDirectory); - - m_ImageBatchLoader = - IImageBatchLoader::CreateBatchLoader(ctx.GetFoundation(), *m_InputStreamFactory, - *m_BufferManager, *m_ThreadPool, *m_PerfTimer); - m_RenderPluginManager = inCore.GetRenderPluginCore().GetRenderPluginManager(ctx); - m_DynamicObjectSystem = inCore.GetDynamicObjectSystemCore().CreateDynamicSystem(*this); - m_EffectSystem = inCore.GetEffectSystemCore().GetEffectSystem(*this); - m_CustomMaterialSystem = inCore.GetMaterialSystemCore().GetCustomMaterialSystem(*this); - // as does the custom material system - m_PixelGraphicsRenderer = IPixelGraphicsRenderer::CreateRenderer(*this, *m_StringTable); - ITextRendererCore *theTextCore = inCore.GetTextRendererCore(); - m_ShaderProgramGenerator = IShaderProgramGenerator::CreateProgramGenerator(*this); - m_DefaultMaterialShaderGenerator = - IDefaultMaterialShaderGenerator::CreateDefaultMaterialShaderGenerator(*this); - m_CustomMaterialShaderGenerator = - ICustomMaterialShaderGenerator::CreateCustomMaterialShaderGenerator(*this); - if (theTextCore) { - m_TextRenderer = theTextCore->GetTextRenderer(ctx); - m_TextTextureCache = ITextTextureCache::CreateTextureCache( - m_RenderContext->GetFoundation(), *m_TextRenderer, *m_RenderContext); - } - -#if QT_VERSION >= QT_VERSION_CHECK(5,12,2) - ITextRendererCore *distanceFieldRenderer = inCore.getDistanceFieldRenderer(); - if (distanceFieldRenderer) { - m_distanceFieldRenderer = distanceFieldRenderer->GetTextRenderer(ctx); - static_cast<Q3DSDistanceFieldRenderer *>(m_distanceFieldRenderer.mPtr) - ->setContext(*this); - } -#endif - - ITextRendererCore *theOnscreenTextCore = inCore.GetOnscreenTextRendererCore(); - if (theOnscreenTextCore) { - m_OnscreenTextRenderer = theOnscreenTextCore->GetTextRenderer(ctx); - m_TextTextureAtlas = ITextTextureAtlas::CreateTextureAtlas( - m_RenderContext->GetFoundation(), *m_OnscreenTextRenderer, *m_RenderContext); - } - m_PathManager = inCore.GetPathManagerCore().OnRenderSystemInitialize(*this); - -#if defined (QT3DS_SHADER_PLATFORM_LIBRARY_DIR) - const QString platformDirectory; -#if defined(_WIN32) - platformDirectory = QStringLiteral("res/platform/win"); -#elif defined(_LINUX) - platformDirectory = QStringLiteral("res/platform/linux"); -#elif defined(_MACOSX) - platformDirectory = QStringLiteral("res/platform/macos"); -#endif - GetDynamicObjectSystem().setShaderCodeLibraryPlatformDirectory(platformDirectory); -#endif - } - - QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext->GetAllocator()); - - IStringTable &GetStringTable() override { return *m_StringTable; } - NVFoundationBase &GetFoundation() override { return m_RenderContext->GetFoundation(); } - NVAllocatorCallback &GetAllocator() override { return m_RenderContext->GetAllocator(); } - IQt3DSRenderer &GetRenderer() override { return *m_Renderer; } - IBufferManager &GetBufferManager() override { return *m_BufferManager; } - IResourceManager &GetResourceManager() override { return *m_ResourceManager; } - NVRenderContext &GetRenderContext() override { return *m_RenderContext; } - IOffscreenRenderManager &GetOffscreenRenderManager() override - { - return *m_OffscreenRenderManager; - } - IInputStreamFactory &GetInputStreamFactory() override { return *m_InputStreamFactory; } - IEffectSystem &GetEffectSystem() override { return *m_EffectSystem; } - IShaderCache &GetShaderCache() override { return *m_ShaderCache; } - IThreadPool &GetThreadPool() override { return *m_ThreadPool; } - IImageBatchLoader &GetImageBatchLoader() override { return *m_ImageBatchLoader; } - ITextTextureCache *GetTextureCache() override { return m_TextTextureCache.mPtr; } - ITextTextureAtlas *GetTextureAtlas() override { return m_TextTextureAtlas.mPtr; } - IRenderPluginManager &GetRenderPluginManager() override { return *m_RenderPluginManager; } - IDynamicObjectSystem &GetDynamicObjectSystem() override { return *m_DynamicObjectSystem; } - ICustomMaterialSystem &GetCustomMaterialSystem() override { return *m_CustomMaterialSystem; } - IPixelGraphicsRenderer &GetPixelGraphicsRenderer() override { return *m_PixelGraphicsRenderer; } - IPerfTimer &GetPerfTimer() override { return *m_PerfTimer; } - IRenderList &GetRenderList() override { return *m_RenderList; } - IPathManager &GetPathManager() override { return *m_PathManager; } - IShaderProgramGenerator &GetShaderProgramGenerator() override - { - return *m_ShaderProgramGenerator; - } - IDefaultMaterialShaderGenerator &GetDefaultMaterialShaderGenerator() override - { - return *m_DefaultMaterialShaderGenerator; - } - ICustomMaterialShaderGenerator &GetCustomMaterialShaderGenerator() override - { - return *m_CustomMaterialShaderGenerator; - } - NVAllocatorCallback &GetPerFrameAllocator() override { return m_PerFrameAllocator; } - - QT3DSU32 GetFrameCount() override { return m_FrameCount; } - void SetFPS(QPair<QT3DSF32, int> inFPS) override { m_FPS = inFPS; } - QPair<QT3DSF32, int> GetFPS(void) override { return m_FPS; } - - void SetFrameTime(QT3DSF32 time) override - { - m_frameTimes.push_front(time); - // Store only one value for now. This can be increased once we have proper graph for - // the frame times. - if (m_frameTimes.size() > 1) - m_frameTimes.pop_back(); - } - QVector<QT3DSF32> GetFrameTimes() const override - { - return m_frameTimes; - } - - bool IsAuthoringMode() override { return m_AuthoringMode; } - void SetAuthoringMode(bool inMode) override { m_AuthoringMode = inMode; } - - bool IsInSubPresentation() override { return m_IsInSubPresentation; } - void SetInSubPresentation(bool inValue) override { m_IsInSubPresentation = inValue; } - - ITextRenderer *GetTextRenderer() override { return m_TextRenderer; } - - ITextRenderer *getDistanceFieldRenderer() override { return m_distanceFieldRenderer; } - - ITextRenderer *GetOnscreenTextRenderer() override { return m_OnscreenTextRenderer; } - - void SetSceneColor(Option<QT3DSVec4> inSceneColor) override { m_SceneColor = inSceneColor; } - void SetMatteColor(Option<QT3DSVec4> inMatteColor) override { m_MatteColor = inMatteColor; } - - void SetWindowDimensions(const QSize &inWindowDimensions) override - { - m_WindowDimensions = inWindowDimensions; - } - - QSize GetWindowDimensions() override { return m_WindowDimensions; } - - void SetScaleMode(ScaleModes::Enum inMode) override { m_ScaleMode = inMode; } - - ScaleModes::Enum GetScaleMode() override { return m_ScaleMode; } - - void SetWireframeMode(bool inEnable) override { m_WireframeMode = inEnable; } - - bool GetWireframeMode() override { return m_WireframeMode; } - - void SetViewport(Option<NVRenderRect> inViewport) override { m_Viewport = inViewport; } - Option<NVRenderRect> GetViewport() const override { return m_Viewport; } - - IRenderWidgetContext &GetRenderWidgetContext() override - { - return m_Renderer->GetRenderWidgetContext(); - } - - eastl::pair<NVRenderRect, NVRenderRect> GetPresentationViewportAndOuterViewport() const - { - QSize thePresentationDimensions(m_PresentationDimensions); - NVRenderRect theOuterViewport(GetContextViewport()); - if (m_Rotation == RenderRotationValues::Clockwise90 - || m_Rotation == RenderRotationValues::Clockwise270) { - eastl::swap(theOuterViewport.m_Width, theOuterViewport.m_Height); - eastl::swap(theOuterViewport.m_X, theOuterViewport.m_Y); - } - // Calculate the presentation viewport perhaps with the window width and height swapped. - return eastl::make_pair( - GetPresentationViewport(theOuterViewport, m_ScaleMode, thePresentationDimensions), - theOuterViewport); - } - - NVRenderRectF GetDisplayViewport() const override - { - return GetPresentationViewportAndOuterViewport().first; - } - - void SetPresentationDimensions(const QSize &inPresentationDimensions) override - { - m_PresentationDimensions = inPresentationDimensions; - } - QSize GetCurrentPresentationDimensions() const override - { - return m_PresentationDimensions; - } - - void SetRenderRotation(RenderRotationValues::Enum inRotation) override - { - m_Rotation = inRotation; - } - - RenderRotationValues::Enum GetRenderRotation() const override { return m_Rotation; } - QT3DSVec2 GetMousePickViewport() const override - { - bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation; - if (renderOffscreen) - return QT3DSVec2((QT3DSF32)m_PresentationViewport.m_Width, - (QT3DSF32)m_PresentationViewport.m_Height); - else - return QT3DSVec2((QT3DSF32)m_WindowDimensions.width(), (QT3DSF32)m_WindowDimensions.height()); - } - NVRenderRect GetContextViewport() const override - { - NVRenderRect retval; - if (m_Viewport.hasValue()) - retval = *m_Viewport; - else - retval = NVRenderRect(0, 0, m_WindowDimensions.width(), m_WindowDimensions.height()); - - return retval; - } - - QT3DSVec2 GetMousePickMouseCoords(const QT3DSVec2 &inMouseCoords) const override - { - bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation; - if (renderOffscreen) { - QSize thePresentationDimensions(m_RenderPresentationDimensions); - NVRenderRect theViewport(GetContextViewport()); - // Calculate the presentation viewport perhaps with the presentation width and height - // swapped. - NVRenderRect thePresentationViewport = - GetPresentationViewport(theViewport, m_ScaleMode, thePresentationDimensions); - // Translate pick into presentation space without rotations or anything else. - QT3DSF32 YHeightDiff = (QT3DSF32)((QT3DSF32)m_WindowDimensions.height() - - (QT3DSF32)thePresentationViewport.m_Height); - QT3DSVec2 theLocalMouse((inMouseCoords.x - thePresentationViewport.m_X), - (inMouseCoords.y - YHeightDiff + thePresentationViewport.m_Y)); - switch (m_Rotation) { - default: - case RenderRotationValues::NoRotation: - QT3DS_ASSERT(false); - break; - case RenderRotationValues::Clockwise90: - eastl::swap(theLocalMouse.x, theLocalMouse.y); - theLocalMouse.y = thePresentationViewport.m_Width - theLocalMouse.y; - break; - case RenderRotationValues::Clockwise180: - theLocalMouse.y = thePresentationViewport.m_Height - theLocalMouse.y; - theLocalMouse.x = thePresentationViewport.m_Width - theLocalMouse.x; - break; - case RenderRotationValues::Clockwise270: - eastl::swap(theLocalMouse.x, theLocalMouse.y); - theLocalMouse.x = thePresentationViewport.m_Height - theLocalMouse.x; - break; - } - return theLocalMouse; - } - return inMouseCoords; - } - - NVRenderRect GetPresentationViewport(const NVRenderRect &inViewerViewport, - ScaleModes::Enum inScaleToFit, - const QSize &inPresDimensions) const - { - NVRenderRect retval; - QT3DSI32 theWidth = inViewerViewport.m_Width; - QT3DSI32 theHeight = inViewerViewport.m_Height; - if (inPresDimensions.width() == 0 || inPresDimensions.height() == 0) - return NVRenderRect(0, 0, 0, 0); - // Setup presentation viewport. This may or may not match the physical viewport that we - // want to setup. - // Avoiding scaling keeps things as sharp as possible. - if (inScaleToFit == ScaleModes::ExactSize) { - retval.m_Width = inPresDimensions.width(); - retval.m_Height = inPresDimensions.height(); - retval.m_X = (theWidth - (QT3DSI32)inPresDimensions.width()) / 2; - retval.m_Y = (theHeight - (QT3DSI32)inPresDimensions.height()) / 2; - } else if (inScaleToFit == ScaleModes::ScaleToFit - || inScaleToFit == ScaleModes::FitSelected) { - // Scale down in such a way to preserve aspect ratio. - float screenAspect = (float)theWidth / (float)theHeight; - float thePresentationAspect = - (float)inPresDimensions.width() / (float)inPresDimensions.height(); - if (screenAspect >= thePresentationAspect) { - // if the screen height is the limiting factor - retval.m_Y = 0; - retval.m_Height = theHeight; - retval.m_Width = (QT3DSI32)(thePresentationAspect * retval.m_Height); - retval.m_X = (theWidth - retval.m_Width) / 2; - } else { - retval.m_X = 0; - retval.m_Width = theWidth; - retval.m_Height = (QT3DSI32)(retval.m_Width / thePresentationAspect); - retval.m_Y = (theHeight - retval.m_Height) / 2; - } - } else { - // Setup the viewport for everything and let the presentations figure it out. - retval.m_X = 0; - retval.m_Y = 0; - retval.m_Width = theWidth; - retval.m_Height = theHeight; - } - retval.m_X += inViewerViewport.m_X; - retval.m_Y += inViewerViewport.m_Y; - return retval; - } - - void RenderText2D(QT3DSF32 x, QT3DSF32 y, qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor, - const char *text) override - { - m_Renderer->RenderText2D(x, y, inColor, text); - } - - void RenderGpuProfilerStats(QT3DSF32 x, QT3DSF32 y, - qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor) override - { - m_Renderer->RenderGpuProfilerStats(x, y, inColor); - } - - NVRenderRect GetPresentationViewport() const override { return m_PresentationViewport; } - struct SBeginFrameResult - { - bool m_RenderOffscreen; - QSize m_PresentationDimensions; - bool m_ScissorTestEnabled; - NVRenderRect m_ScissorRect; - NVRenderRect m_Viewport; - QSize m_FBODimensions; - SBeginFrameResult(bool ro, QSize presDims, bool scissorEnabled, - NVRenderRect scissorRect, NVRenderRect viewport, - QSize fboDims) - : m_RenderOffscreen(ro) - , m_PresentationDimensions(presDims) - , m_ScissorTestEnabled(scissorEnabled) - , m_ScissorRect(scissorRect) - , m_Viewport(viewport) - , m_FBODimensions(fboDims) - { - } - SBeginFrameResult() {} - }; - - // Calculated values passed from beginframe to setupRenderTarget. - // Trying to avoid duplicate code as much as possible. - SBeginFrameResult m_BeginFrameResult; - - void BeginFrame(bool firstFrame) override - { - m_PreRenderPresentationDimensions = m_PresentationDimensions; - QSize thePresentationDimensions(m_PreRenderPresentationDimensions); - NVRenderRect theContextViewport(GetContextViewport()); - m_PerFrameAllocator.reset(); - IRenderList &theRenderList(*m_RenderList); - theRenderList.BeginFrame(); - if (m_Viewport.hasValue()) { - theRenderList.SetScissorTestEnabled(true); - theRenderList.SetScissorRect(theContextViewport); - } else { - theRenderList.SetScissorTestEnabled(false); - } - bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation; - eastl::pair<NVRenderRect, NVRenderRect> thePresViewportAndOuterViewport = - GetPresentationViewportAndOuterViewport(); - NVRenderRect theOuterViewport = thePresViewportAndOuterViewport.second; - // Calculate the presentation viewport perhaps with the window width and height swapped. - NVRenderRect thePresentationViewport = thePresViewportAndOuterViewport.first; - m_PresentationViewport = thePresentationViewport; - m_PresentationScale = QT3DSVec2( - (QT3DSF32)thePresentationViewport.m_Width / (QT3DSF32)thePresentationDimensions.width(), - (QT3DSF32)thePresentationViewport.m_Height / (QT3DSF32)thePresentationDimensions.height()); - QSize fboDimensions; - if (thePresentationViewport.m_Width > 0 && thePresentationViewport.m_Height > 0) { - if (renderOffscreen == false) { - m_PresentationDimensions = QSize(thePresentationViewport.m_Width, - thePresentationViewport.m_Height); - m_RenderList->SetViewport(thePresentationViewport); - if (thePresentationViewport.m_X || thePresentationViewport.m_Y - || thePresentationViewport.m_Width != (QT3DSI32)theOuterViewport.m_Width - || thePresentationViewport.m_Height != (QT3DSI32)theOuterViewport.m_Height) { - m_RenderList->SetScissorRect(thePresentationViewport); - m_RenderList->SetScissorTestEnabled(true); - } - } else { - QT3DSU32 imageWidth = ITextRenderer::NextMultipleOf4(thePresentationViewport.m_Width); - QT3DSU32 imageHeight = - ITextRenderer::NextMultipleOf4(thePresentationViewport.m_Height); - fboDimensions = QSize(imageWidth, imageHeight); - m_PresentationDimensions = QSize(thePresentationViewport.m_Width, - thePresentationViewport.m_Height); - NVRenderRect theSceneViewport = NVRenderRect(0, 0, imageWidth, imageHeight); - m_RenderList->SetScissorTestEnabled(false); - m_RenderList->SetViewport(theSceneViewport); - } - } - - m_BeginFrameResult = SBeginFrameResult( - renderOffscreen, m_PresentationDimensions, m_RenderList->IsScissorTestEnabled(), - m_RenderList->GetScissor(), m_RenderList->GetViewport(), fboDimensions); - - m_Renderer->BeginFrame(); - m_OffscreenRenderManager->BeginFrame(); - if (m_TextRenderer) - m_TextRenderer->BeginFrame(); - if (m_TextTextureCache) - m_TextTextureCache->BeginFrame(); - m_ImageBatchLoader->BeginFrame(firstFrame); - } - - QT3DSVec2 GetPresentationScaleFactor() const override { return m_PresentationScale; } - - virtual void SetupRenderTarget() - { - NVRenderRect theContextViewport(GetContextViewport()); - if (m_Viewport.hasValue()) { - m_RenderContext->SetScissorTestEnabled(true); - m_RenderContext->SetScissorRect(theContextViewport); - } else { - m_RenderContext->SetScissorTestEnabled(false); - } - { - QT3DSVec4 theClearColor; - if (m_MatteColor.hasValue()) - theClearColor = m_MatteColor; - else - theClearColor = m_SceneColor; - m_RenderContext->SetClearColor(theClearColor); - m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color); - } - bool renderOffscreen = m_BeginFrameResult.m_RenderOffscreen; - m_RenderContext->SetViewport(m_BeginFrameResult.m_Viewport); - m_RenderContext->SetScissorRect(m_BeginFrameResult.m_ScissorRect); - m_RenderContext->SetScissorTestEnabled(m_BeginFrameResult.m_ScissorTestEnabled); - - if (m_PresentationViewport.m_Width > 0 && m_PresentationViewport.m_Height > 0) { - if (renderOffscreen == false) { - if (m_RotationFBO != NULL) { - m_ResourceManager->Release(*m_RotationFBO); - m_ResourceManager->Release(*m_RotationTexture); - m_ResourceManager->Release(*m_RotationDepthBuffer); - m_RotationFBO = NULL; - m_RotationTexture = NULL; - m_RotationDepthBuffer = NULL; - } - if (m_SceneColor.hasValue() && m_SceneColor.getValue().w != 0.0f) { - m_RenderContext->SetClearColor(m_SceneColor); - m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color); - } - } else { - QT3DSU32 imageWidth = m_BeginFrameResult.m_FBODimensions.width(); - QT3DSU32 imageHeight = m_BeginFrameResult.m_FBODimensions.height(); - NVRenderTextureFormats::Enum theColorBufferFormat = NVRenderTextureFormats::RGBA8; - NVRenderRenderBufferFormats::Enum theDepthBufferFormat = - NVRenderRenderBufferFormats::Depth16; - m_ContextRenderTarget = m_RenderContext->GetRenderTarget(); - if (m_RotationFBO == NULL) { - m_RotationFBO = m_ResourceManager->AllocateFrameBuffer(); - m_RotationTexture = m_ResourceManager->AllocateTexture2D( - imageWidth, imageHeight, theColorBufferFormat); - m_RotationDepthBuffer = m_ResourceManager->AllocateRenderBuffer( - imageWidth, imageHeight, theDepthBufferFormat); - m_RotationFBO->Attach(NVRenderFrameBufferAttachments::Color0, - *m_RotationTexture); - m_RotationFBO->Attach(NVRenderFrameBufferAttachments::Depth, - *m_RotationDepthBuffer); - } else { - STextureDetails theDetails = m_RotationTexture->GetTextureDetails(); - if (theDetails.m_Width != imageWidth || theDetails.m_Height != imageHeight) { - m_RotationTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, imageWidth, - imageHeight, theColorBufferFormat); - m_RotationDepthBuffer->SetDimensions( - qt3ds::render::NVRenderRenderBufferDimensions(imageWidth, imageHeight)); - } - } - m_RenderContext->SetRenderTarget(m_RotationFBO); - if (m_SceneColor.hasValue()) { - m_RenderContext->SetClearColor(m_SceneColor); - m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color); - } - } - } - } - - void RunRenderTasks() override - { - m_RenderList->RunRenderTasks(); - SetupRenderTarget(); - } - - // Note this runs before EndFrame - virtual void TeardownRenderTarget() - { - if (m_RotationFBO) { - ScaleModes::Enum theScaleToFit = m_ScaleMode; - NVRenderRect theOuterViewport(GetContextViewport()); - m_RenderContext->SetRenderTarget(m_ContextRenderTarget); - QSize thePresentationDimensions = GetCurrentPresentationDimensions(); - if (m_Rotation == RenderRotationValues::Clockwise90 - || m_Rotation == RenderRotationValues::Clockwise270) { - thePresentationDimensions = QSize(thePresentationDimensions.height(), - thePresentationDimensions.width()); - } - m_RenderPresentationDimensions = thePresentationDimensions; - // Calculate the presentation viewport perhaps with the presentation width and height - // swapped. - NVRenderRect thePresentationViewport = - GetPresentationViewport(theOuterViewport, theScaleToFit, thePresentationDimensions); - SCamera theCamera; - switch (m_Rotation) { - default: - QT3DS_ASSERT(false); - break; - case RenderRotationValues::Clockwise90: - theCamera.m_Rotation.z = 90; - break; - case RenderRotationValues::Clockwise180: - theCamera.m_Rotation.z = 180; - break; - case RenderRotationValues::Clockwise270: - theCamera.m_Rotation.z = 270; - break; - } - TORAD(theCamera.m_Rotation.z); - theCamera.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty); - theCamera.m_Flags.SetOrthographic(true); - m_RenderContext->SetViewport(thePresentationViewport); - QT3DSVec2 theCameraDimensions((QT3DSF32)thePresentationViewport.m_Width, - (QT3DSF32)thePresentationViewport.m_Height); - theCamera.CalculateGlobalVariables( - NVRenderRect(0, 0, (QT3DSU32)thePresentationViewport.m_Width, - (QT3DSU32)thePresentationViewport.m_Height), - theCameraDimensions); - QT3DSMat44 theVP; - theCamera.CalculateViewProjectionMatrix(theVP); - SNode theTempNode; - theTempNode.CalculateGlobalVariables(); - QT3DSMat44 theMVP; - QT3DSMat33 theNormalMat; - theTempNode.CalculateMVPAndNormalMatrix(theVP, theMVP, theNormalMat); - m_RenderContext->SetCullingEnabled(false); - m_RenderContext->SetBlendingEnabled(false); - m_RenderContext->SetDepthTestEnabled(false); - m_Renderer->RenderQuad(QT3DSVec2((QT3DSF32)m_PresentationViewport.m_Width, - (QT3DSF32)m_PresentationViewport.m_Height), - theMVP, *m_RotationTexture); - } - } - - void EndFrame() override - { - TeardownRenderTarget(); - m_ImageBatchLoader->EndFrame(); - if (m_TextTextureCache) - m_TextTextureCache->EndFrame(); - if (m_TextRenderer) - m_TextRenderer->EndFrame(); - if (m_distanceFieldRenderer) - m_distanceFieldRenderer->EndFrame(); - m_OffscreenRenderManager->EndFrame(); - m_Renderer->EndFrame(); - m_CustomMaterialSystem->EndFrame(); - m_PresentationDimensions = m_PreRenderPresentationDimensions; - ++m_FrameCount; - } -}; - -IQt3DSRenderContext &SRenderContextCore::CreateRenderContext(NVRenderContext &inContext, - const char8_t *inPrimitivesDirectory, - bool delayedLoading) -{ - return *QT3DS_NEW(m_Foundation.getAllocator(), SRenderContext)(inContext, *this, - inPrimitivesDirectory, - delayedLoading); -} -} - -IQt3DSRenderContextCore &IQt3DSRenderContextCore::Create(NVFoundationBase &fnd, IStringTable &strt) -{ - return *QT3DS_NEW(fnd.getAllocator(), SRenderContextCore)(fnd, strt); -} |