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
13QT_BEGIN_NAMESPACE
14
15namespace Qt3DRender {
16namespace Render {
17
18using namespace Qt3DCore;
19
20RayCaster::RayCaster()
21 : BackendNode(QBackendNode::ReadWrite)
22{
23}
24
25RayCaster::~RayCaster()
26{
27 notifyJob();
28}
29
30QAbstractRayCasterPrivate::RayCasterType RayCaster::type() const
31{
32 return m_type;
33}
34
35QAbstractRayCaster::RunMode RayCaster::runMode() const
36{
37 return m_runMode;
38}
39
40QVector3D RayCaster::origin() const
41{
42 return m_origin;
43}
44
45QVector3D RayCaster::direction() const
46{
47 return m_direction;
48}
49
50float RayCaster::length() const
51{
52 return m_length;
53}
54
55QPoint RayCaster::position() const
56{
57 return m_position;
58}
59
60Qt3DCore::QNodeIdVector RayCaster::layerIds() const
61{
62 return m_layerIds;
63}
64
65QAbstractRayCaster::FilterMode RayCaster::filterMode() const
66{
67 return m_filterMode;
68}
69
70void 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
84void 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
143void 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
153QT_END_NAMESPACE
154

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

source code of qt3d/src/render/picking/raycaster.cpp