1// Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB).
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "rendersurfaceselector_p.h"
5#include <Qt3DRender/qrendersurfaceselector.h>
6#include <Qt3DRender/private/qrendersurfaceselector_p.h>
7#include <QtGui/qwindow.h>
8#include <QtGui/qscreen.h>
9#include <QtGui/qoffscreensurface.h>
10
11QT_BEGIN_NAMESPACE
12
13
14namespace {
15
16QSurface *surfaceFromQObject(QObject *o)
17{
18 QSurface *surface = nullptr;
19 QWindow *window = qobject_cast<QWindow *>(o);
20 if (window) {
21 surface = static_cast<QSurface *>(window);
22 } else {
23 QOffscreenSurface *offscreen = qobject_cast<QOffscreenSurface *>(object: o);
24 if (offscreen)
25 surface = static_cast<QSurface *>(offscreen);
26 }
27 return surface;
28}
29
30}
31
32namespace Qt3DRender {
33namespace Render {
34
35using namespace Qt3DCore;
36
37RenderSurfaceSelector::RenderSurfaceSelector()
38 : FrameGraphNode(FrameGraphNode::Surface)
39 , m_surfaceObj(nullptr)
40 , m_surface(nullptr)
41 , m_width(0)
42 , m_height(0)
43 , m_devicePixelRatio(0.0f)
44{
45}
46
47void RenderSurfaceSelector::syncFromFrontEnd(const QNode *frontEnd, bool firstTime)
48{
49 const QRenderSurfaceSelector *node = qobject_cast<const QRenderSurfaceSelector *>(object: frontEnd);
50 if (!node)
51 return;
52
53 FrameGraphNode::syncFromFrontEnd(frontEnd, firstTime);
54
55 if (node->surface() != m_surfaceObj) {
56 m_surfaceObj = node->surface();
57 m_surface = surfaceFromQObject(o: m_surfaceObj);
58 markDirty(changes: AbstractRenderer::FrameGraphDirty);
59 }
60
61 if (m_surface && m_surface->surfaceClass() == QSurface::Window) {
62 QWindow *window = static_cast<QWindow *>(m_surface);
63 if (window->width() != m_width) {
64 m_width = window->width();
65 markDirty(changes: AbstractRenderer::FrameGraphDirty);
66 }
67 if (window->height() != m_height) {
68 m_height = window->height();
69 markDirty(changes: AbstractRenderer::FrameGraphDirty);
70 }
71 }
72
73 if (node->externalRenderTargetSize() != m_renderTargetSize) {
74 m_renderTargetSize = node->externalRenderTargetSize();
75 markDirty(changes: AbstractRenderer::FrameGraphDirty);
76 }
77
78 if (node->surfacePixelRatio() != m_devicePixelRatio) {
79 m_devicePixelRatio = node->surfacePixelRatio();
80 markDirty(changes: AbstractRenderer::FrameGraphDirty);
81 }
82}
83
84QSize RenderSurfaceSelector::renderTargetSize() const
85{
86 if (m_renderTargetSize.isValid())
87 return m_renderTargetSize;
88 return QSize(m_width, m_height);
89}
90
91} // namespace Render
92} // namespace Qt3DRender
93
94QT_END_NAMESPACE
95

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of qt3d/src/render/framegraph/rendersurfaceselector.cpp