Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qopenxrcamera.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "qopenxrcamera_p.h"
5#include "qopenxrorigin_p.h"
6#include <QtQuick3DRuntimeRender/private/qssgrendercamera_p.h>
7#include <QtQuick3D/private/qquick3dutils_p.h>
8#include <QtQuick3D/private/qquick3dnode_p_p.h>
9
10#include <cmath>
11
13
19
21{
22 return m_leftTangent;
23}
24
26{
27 return m_rightTangent;
28}
29
31{
32 return m_upTangent;
33}
34
36{
37 return m_downTangent;
38}
39
41{
42 return m_clipNear;
43}
44
46{
47 return m_clipFar;
48}
49
50void QOpenXREyeCamera::setLeftTangent(float leftTangent)
51{
52 if (qFuzzyCompare(m_leftTangent, leftTangent))
53 return;
54
55 m_leftTangent = leftTangent;
56 emit leftTangentChanged(m_leftTangent);
57 markProjectionDirty();
58}
59
60void QOpenXREyeCamera::setRightTangent(float rightTangent)
61{
62 if (qFuzzyCompare(m_rightTangent, rightTangent))
63 return;
64
65 m_rightTangent = rightTangent;
66 emit rightTangentChanged(m_rightTangent);
67 markProjectionDirty();
68}
69
70void QOpenXREyeCamera::setUpTangent(float upTangent)
71{
72 if (qFuzzyCompare(m_upTangent, upTangent))
73 return;
74
75 m_upTangent = upTangent;
76 emit upTangentChanged(m_upTangent);
77 markProjectionDirty();
78}
79
80void QOpenXREyeCamera::setDownTangent(float downTangent)
81{
82 if (qFuzzyCompare(m_downTangent, downTangent))
83 return;
84
85 m_downTangent = downTangent;
86 emit downTangentChanged(m_downTangent);
87 markProjectionDirty();
88}
89
91{
92 if (qFuzzyCompare(m_clipNear, clipNear))
93 return;
94
95 m_clipNear = clipNear;
96 emit clipNearChanged(m_clipNear);
97 markProjectionDirty();
98}
99
101{
102 if (qFuzzyCompare(m_clipFar, clipFar))
103 return;
104
105 m_clipFar = clipFar;
106 emit clipFarChanged(m_clipFar);
107 markProjectionDirty();
108}
109
111{
113 if (camera) {
114 maybeUpdateProjection();
115 bool changed = false;
116 changed |= qUpdateIfNeeded(camera->projection, m_projection);
117 // Still need to report near and far (used for shadows)
118 changed |= qUpdateIfNeeded(camera->clipNear, m_clipNear);
119 changed |= qUpdateIfNeeded(camera->clipFar, m_clipFar);
120 if (changed)
122 }
123 return camera;
124}
125
126void QOpenXREyeCamera::markProjectionDirty()
127{
128 if (!m_projectionDirty) {
129 m_projectionDirty = true;
130 update();
131 }
132}
133
134void QOpenXREyeCamera::maybeUpdateProjection()
135{
136 if (!m_projectionDirty)
137 return;
138
139 const float right = m_rightTangent * m_clipNear;
140 const float top = m_upTangent * m_clipNear;
141#if defined(Q_OS_VISIONOS)
142 // cp_view_get_tangents always returns positive values
143 // so we need to negate the left and down tangents
144 const float left = -m_leftTangent * m_clipNear;
145 const float bottom = -m_downTangent * m_clipNear;
146#else
147 const float left = m_leftTangent * m_clipNear;
148 const float bottom = m_downTangent * m_clipNear;
149#endif
150
151 float *m = m_projection.data();
152
153 m[0] = 2 * m_clipNear / (right - left);
154 m[4] = 0;
155 m[8] = (right + left) / (right - left);
156 m[12] = 0;
157
158 m[1] = 0;
159 m[5] = 2 * m_clipNear / (top - bottom);
160 m[9] = (top + bottom) / (top - bottom);
161 m[13] = 0;
162
163 m[2] = 0;
164 m[6] = 0;
165 m[10] = m_clipFar / (m_clipNear - m_clipFar);
166 m[14] = m_clipFar * m_clipNear / (m_clipNear - m_clipFar);
167
168
169 m[3] = 0;
170 m[7] = 0;
171 m[11] = -1;
172 m[15] = 0;
173
174 const bool isReverseZ = false; // placeholder
175 if (isReverseZ) {
176 if (std::isinf(m_clipFar)) {
177 m[10] = 0;
178 m[14] = m_clipNear;
179 } else {
180 m[10] = -m[10] - 1;
181 m[14] = -m[14];
182 }
183 } else if (std::isinf(m_clipFar)) {
184 m[10] = -1;
185 m[14] = -m_clipNear;
186 }
187}
188
193
198
200{
201 return m_clipNear;
202}
203
205{
206 return m_clipFar;
207}
208
209
210void QOpenXRCamera::setClipNear(float clipNear)
211{
212 if (qFuzzyCompare(m_clipNear, clipNear))
213 return;
214 m_clipNear = clipNear;
215 emit clipNearChanged(m_clipNear);
216}
217
218void QOpenXRCamera::setClipFar(float clipFar)
219{
220 if (qFuzzyCompare(m_clipFar, clipFar))
221 return;
222 m_clipFar = clipFar;
223 emit clipFarChanged(m_clipFar);
224}
225
float * data()
Returns a pointer to the raw data of this matrix.
void clipNearChanged(float clipNear)
QOpenXRCamera(QQuick3DNode *parent=nullptr)
void clipFarChanged(float clipFar)
void setClipFar(float clipFar)
void setClipNear(float clipNear)
void setUpTangent(float upTangent)
void clipNearChanged(float clipNear)
void setRightTangent(float rightTangent)
void setClipNear(float clipNear)
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
void setLeftTangent(float leftTangent)
void downTangentChanged(float downTangent)
void setClipFar(float clipFar)
void rightTangentChanged(float rightTangent)
void setDownTangent(float downTangent)
void leftTangentChanged(float leftTangent)
void upTangentChanged(float upTangent)
QOpenXREyeCamera(QQuick3DNode *parent=nullptr)
void clipFarChanged(float clipFar)
QMatrix4x4 m_projection
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
QCamera * camera
Definition camera.cpp:19
Combined button and popup list for selecting options.
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
const GLfloat * m
GLdouble GLdouble GLdouble GLdouble top
GLdouble GLdouble right
GLint left
GLint GLint bottom
QT_BEGIN_NAMESPACE bool qUpdateIfNeeded(T &orig, T updated)
#define emit
Definition moc.h:23