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 "rendersettings_p.h" |
5 | |
6 | #include <Qt3DRender/QFrameGraphNode> |
7 | #include <Qt3DRender/private/abstractrenderer_p.h> |
8 | #include <Qt3DRender/private/qrendersettings_p.h> |
9 | #include <Qt3DRender/private/qrendercapabilities_p.h> |
10 | |
11 | QT_BEGIN_NAMESPACE |
12 | |
13 | |
14 | namespace Qt3DRender { |
15 | namespace Render { |
16 | |
17 | using namespace Qt3DCore; |
18 | |
19 | RenderSettings::RenderSettings() |
20 | : BackendNode() |
21 | , m_renderPolicy(QRenderSettings::OnDemand) |
22 | , m_pickMethod(QPickingSettings::BoundingVolumePicking) |
23 | , m_pickResultMode(QPickingSettings::NearestPick) |
24 | , m_faceOrientationPickingMode(QPickingSettings::FrontFace) |
25 | , m_pickWorldSpaceTolerance(.1f) |
26 | , m_activeFrameGraph() |
27 | { |
28 | } |
29 | |
30 | void RenderSettings::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) |
31 | { |
32 | const QRenderSettings *node = qobject_cast<const QRenderSettings *>(object: frontEnd); |
33 | if (!node) |
34 | return; |
35 | |
36 | BackendNode::syncFromFrontEnd(frontEnd, firstTime); |
37 | |
38 | const Qt3DCore::QNodeId activeFGId = Qt3DCore::qIdForNode(node: node->activeFrameGraph()); |
39 | if (activeFGId != m_activeFrameGraph) { |
40 | m_activeFrameGraph = activeFGId; |
41 | } |
42 | |
43 | if (node->renderPolicy() != m_renderPolicy) { |
44 | m_renderPolicy = node->renderPolicy(); |
45 | } |
46 | |
47 | auto ncnode = const_cast<QRenderSettings *>(node); |
48 | if (ncnode->pickingSettings()->pickMethod() != m_pickMethod) { |
49 | m_pickMethod = ncnode->pickingSettings()->pickMethod(); |
50 | } |
51 | |
52 | if (ncnode->pickingSettings()->pickResultMode() != m_pickResultMode) { |
53 | m_pickResultMode = ncnode->pickingSettings()->pickResultMode(); |
54 | } |
55 | |
56 | if (!qFuzzyCompare(p1: ncnode->pickingSettings()->worldSpaceTolerance(), p2: m_pickWorldSpaceTolerance)) { |
57 | m_pickWorldSpaceTolerance = ncnode->pickingSettings()->worldSpaceTolerance(); |
58 | } |
59 | |
60 | if (ncnode->pickingSettings()->faceOrientationPickingMode() != m_faceOrientationPickingMode) { |
61 | m_faceOrientationPickingMode = ncnode->pickingSettings()->faceOrientationPickingMode(); |
62 | } |
63 | |
64 | if (firstTime) |
65 | m_capabilities = QRenderCapabilitiesPrivate::get(q: const_cast<QRenderSettings *>(node)->renderCapabilities())->toString(); |
66 | |
67 | // Either because something above as changed or if QRenderSettingsPrivate::invalidFrame() |
68 | // was called |
69 | markDirty(changes: AbstractRenderer::AllDirty); |
70 | } |
71 | |
72 | RenderSettingsFunctor::RenderSettingsFunctor(AbstractRenderer *renderer) |
73 | : m_renderer(renderer) |
74 | { |
75 | } |
76 | |
77 | Qt3DCore::QBackendNode *RenderSettingsFunctor::create(Qt3DCore::QNodeId) const |
78 | { |
79 | if (m_renderer->settings() != nullptr) { |
80 | qWarning() << "Renderer settings already exists" ; |
81 | return nullptr; |
82 | } |
83 | |
84 | RenderSettings *settings = new RenderSettings; |
85 | settings->setRenderer(m_renderer); |
86 | m_renderer->setSettings(settings); |
87 | return settings; |
88 | } |
89 | |
90 | Qt3DCore::QBackendNode *RenderSettingsFunctor::get(Qt3DCore::QNodeId id) const |
91 | { |
92 | Q_UNUSED(id); |
93 | return m_renderer->settings(); |
94 | } |
95 | |
96 | void RenderSettingsFunctor::destroy(Qt3DCore::QNodeId id) const |
97 | { |
98 | Q_UNUSED(id); |
99 | // Deletes the old settings object |
100 | auto settings = m_renderer->settings(); |
101 | if (settings && settings->peerId() == id) { |
102 | m_renderer->setSettings(nullptr); |
103 | delete settings; |
104 | } |
105 | } |
106 | |
107 | } // namespace Render |
108 | } // namespace Qt3DRender |
109 | |
110 | QT_END_NAMESPACE |
111 | |