diff options
Diffstat (limited to 'src/runtimerender/graphobjects/Qt3DSRenderScene.cpp')
-rw-r--r-- | src/runtimerender/graphobjects/Qt3DSRenderScene.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp b/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp new file mode 100644 index 0000000..7917bd7 --- /dev/null +++ b/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** 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 "Qt3DSRenderScene.h" +#include "Qt3DSRenderLayer.h" +#include "Qt3DSRenderContextCore.h" +#include "render/Qt3DSRenderContext.h" + +using namespace qt3ds::render; + +SScene::SScene() + : SGraphObject(GraphObjectTypes::Scene) + , m_Presentation(NULL) + , m_FirstChild(NULL) + , m_ClearColor(0.0f) + , m_UseClearColor(true) + , m_Dirty(true) +{ +} + +void SScene::AddChild(SLayer &inLayer) +{ + if (m_FirstChild == NULL) + m_FirstChild = &inLayer; + else + GetLastChild()->m_NextSibling = &inLayer; + inLayer.m_Scene = this; +} + +SLayer *SScene::GetLastChild() +{ + // empty loop intentional + SLayer *child; + for (child = m_FirstChild; child && child->m_NextSibling; + child = (SLayer *)child->m_NextSibling) { + } + + return child; +} + +bool SScene::PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext, + const SRenderInstanceId id) +{ + // We need to iterate through the layers in reverse order and ask them to render. + bool wasDirty = m_Dirty; + m_Dirty = false; + if (m_FirstChild) { + wasDirty |= + inContext.GetRenderer().PrepareLayerForRender(*m_FirstChild, inViewportDimensions, + true, id); + } + return wasDirty; +} + +void SScene::Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext, + RenderClearCommand inClearColorBuffer, const SRenderInstanceId id) +{ + if ((inClearColorBuffer == SScene::ClearIsOptional && m_UseClearColor) + || inClearColorBuffer == SScene::AlwaysClear) { + QT3DSF32 clearColorAlpha + = inContext.IsInSubPresentation() && !m_UseClearColor ? 0.0f : 1.0f; + QT3DSVec4 clearColor(0.0f, 0.0f, 0.0f, clearColorAlpha); + if (m_UseClearColor) { + clearColor.x = m_ClearColor.x; + clearColor.y = m_ClearColor.y; + clearColor.z = m_ClearColor.z; + clearColor.w = m_ClearColor.w; + } + // Maybe clear and reset to previous clear color after we leave. + qt3ds::render::NVRenderContextScopedProperty<QT3DSVec4> __clearColor( + inContext.GetRenderContext(), &NVRenderContext::GetClearColor, + &NVRenderContext::SetClearColor, clearColor); + inContext.GetRenderContext().Clear(qt3ds::render::NVRenderClearValues::Color); + } + if (m_FirstChild) { + inContext.GetRenderer().RenderLayer(*m_FirstChild, inViewportDimensions, m_UseClearColor, + m_ClearColor, true, id); + } +} +void SScene::RenderWithClear(const QT3DSVec2 &inViewportDimensions, + IQt3DSRenderContext &inContext, + RenderClearCommand inClearColorBuffer, + QT3DSVec4 inClearColor, + const SRenderInstanceId id) +{ + // If this scene is not using clear color, we set the color + // to background color from parent layer. This allows + // fully transparent subpresentations (both scene and layer(s) transparent) + // to inherit color from the layer that contains them. + if (!m_UseClearColor) { + m_ClearColor = inClearColor; + m_UseClearColor = true; + } + Render(inViewportDimensions, inContext, inClearColorBuffer, id); +} |