1 | // Copyright (C) 2018 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 "raycaster_p.h" |
5 | #include "qpickevent.h" |
6 | #include <Qt3DRender/private/abstractrenderer_p.h> |
7 | #include <Qt3DRender/qabstractraycaster.h> |
8 | #include <Qt3DRender/qlayer.h> |
9 | #include <Qt3DRender/private/qabstractraycaster_p.h> |
10 | #include <Qt3DRender/private/raycastingjob_p.h> |
11 | #include <Qt3DRender/private/qrenderaspect_p.h> |
12 | |
13 | QT_BEGIN_NAMESPACE |
14 | |
15 | namespace Qt3DRender { |
16 | namespace Render { |
17 | |
18 | using namespace Qt3DCore; |
19 | |
20 | RayCaster::RayCaster() |
21 | : BackendNode(QBackendNode::ReadWrite) |
22 | { |
23 | } |
24 | |
25 | RayCaster::~RayCaster() |
26 | { |
27 | notifyJob(); |
28 | } |
29 | |
30 | QAbstractRayCasterPrivate::RayCasterType RayCaster::type() const |
31 | { |
32 | return m_type; |
33 | } |
34 | |
35 | QAbstractRayCaster::RunMode RayCaster::runMode() const |
36 | { |
37 | return m_runMode; |
38 | } |
39 | |
40 | QVector3D RayCaster::origin() const |
41 | { |
42 | return m_origin; |
43 | } |
44 | |
45 | QVector3D RayCaster::direction() const |
46 | { |
47 | return m_direction; |
48 | } |
49 | |
50 | float RayCaster::length() const |
51 | { |
52 | return m_length; |
53 | } |
54 | |
55 | QPoint RayCaster::position() const |
56 | { |
57 | return m_position; |
58 | } |
59 | |
60 | Qt3DCore::QNodeIdVector RayCaster::layerIds() const |
61 | { |
62 | return m_layerIds; |
63 | } |
64 | |
65 | QAbstractRayCaster::FilterMode RayCaster::filterMode() const |
66 | { |
67 | return m_filterMode; |
68 | } |
69 | |
70 | void RayCaster::cleanup() |
71 | { |
72 | BackendNode::setEnabled(false); |
73 | m_type = QAbstractRayCasterPrivate::WorldSpaceRayCaster; |
74 | m_runMode = QAbstractRayCaster::SingleShot; |
75 | m_direction = QVector3D(0.f, 0.f, 1.f); |
76 | m_origin = {}; |
77 | m_length = 0.f; |
78 | m_position = {}; |
79 | m_filterMode = QAbstractRayCaster::AcceptAllMatchingLayers; |
80 | m_layerIds.clear(); |
81 | notifyJob(); |
82 | } |
83 | |
84 | void RayCaster::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) |
85 | { |
86 | const QAbstractRayCaster *node = qobject_cast<const QAbstractRayCaster *>(object: frontEnd); |
87 | if (!node) |
88 | return; |
89 | |
90 | BackendNode::syncFromFrontEnd(frontEnd, firstTime); |
91 | |
92 | if (node->runMode() != m_runMode) { |
93 | m_runMode = node->runMode(); |
94 | notifyJob(); |
95 | markDirty(changes: AbstractRenderer::AllDirty); |
96 | } |
97 | |
98 | if (node->filterMode() != m_filterMode) { |
99 | m_filterMode = node->filterMode(); |
100 | notifyJob(); |
101 | markDirty(changes: AbstractRenderer::AllDirty); |
102 | } |
103 | |
104 | const Qt3DCore::QNodeIdVector layerIds = Qt3DCore::qIdsForNodes(nodes: node->layers()); |
105 | if (layerIds != m_layerIds) { |
106 | m_layerIds = layerIds; |
107 | markDirty(changes: AbstractRenderer::LayersDirty); |
108 | notifyJob(); |
109 | } |
110 | |
111 | const QAbstractRayCasterPrivate *d = static_cast<const QAbstractRayCasterPrivate *>(QNodePrivate::get(q: node)); |
112 | if (d->m_direction != m_direction) { |
113 | m_direction = d->m_direction; |
114 | notifyJob(); |
115 | markDirty(changes: AbstractRenderer::AllDirty); |
116 | } |
117 | |
118 | if (!qFuzzyCompare(p1: d->m_length, p2: m_length)) { |
119 | m_length = d->m_length; |
120 | notifyJob(); |
121 | markDirty(changes: AbstractRenderer::AllDirty); |
122 | } |
123 | |
124 | if (d->m_origin != m_origin) { |
125 | m_origin = d->m_origin; |
126 | notifyJob(); |
127 | markDirty(changes: AbstractRenderer::AllDirty); |
128 | } |
129 | |
130 | if (d->m_position != m_position) { |
131 | m_position = d->m_position; |
132 | notifyJob(); |
133 | markDirty(changes: AbstractRenderer::AllDirty); |
134 | } |
135 | |
136 | if (d->m_rayCasterType != m_type) { |
137 | m_type = d->m_rayCasterType; |
138 | notifyJob(); |
139 | markDirty(changes: AbstractRenderer::AllDirty); |
140 | } |
141 | } |
142 | |
143 | void RayCaster::notifyJob() |
144 | { |
145 | if (m_renderer && m_renderer->aspect()) |
146 | QRenderAspectPrivate::get(q: m_renderer->aspect())->m_rayCastingJob->markCastersDirty(); |
147 | } |
148 | |
149 | } // Render |
150 | |
151 | } // Qt3DRender |
152 | |
153 | QT_END_NAMESPACE |
154 | |