aboutsummaryrefslogtreecommitdiffstats
path: root/src/xr/quick3dxr/qquick3dxrcamera_p.h
blob: b83643a37fffb009ebd1bb2c080ae668ad8bb5db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#ifndef QQUICK3DXRCAMERA_P_H
#define QQUICK3DXRCAMERA_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//


#include <QtQuick3DXr/qtquick3dxrglobal.h>

#include <QObject>
#include <QtQuick3D/private/qquick3dcamera_p.h>

QT_BEGIN_NAMESPACE

class QQuick3DXrOrigin;

class Q_QUICK3DXR_EXPORT QQuick3DXrEyeCamera : public QQuick3DCamera
{
    Q_OBJECT
    Q_PROPERTY(float leftTangent READ leftTangent WRITE setLeftTangent NOTIFY leftTangentChanged)
    Q_PROPERTY(float rightTangent READ rightTangent WRITE setRightTangent NOTIFY rightTangentChanged)
    Q_PROPERTY(float upTangent READ upTangent WRITE setUpTangent NOTIFY upTangentChanged)
    Q_PROPERTY(float downTangent READ downTangent WRITE setDownTangent NOTIFY downTangentChanged)
    Q_PROPERTY(float clipNear READ clipNear WRITE setClipNear NOTIFY clipNearChanged)
    Q_PROPERTY(float clipFar READ clipFar WRITE setClipFar NOTIFY clipFarChanged)

public:
    explicit QQuick3DXrEyeCamera(QQuick3DXrOrigin *parent = nullptr);

    float leftTangent() const;
    float rightTangent() const;
    float upTangent() const;
    float downTangent() const;
    float clipNear() const;
    float clipFar() const;

public Q_SLOTS:
    void setLeftTangent(float leftTangent);
    void setRightTangent(float rightTangent);
    void setUpTangent(float upTangent);
    void setDownTangent(float downTangent);
    void setClipNear(float clipNear);
    void setClipFar(float clipFar);
    void setProjection(const QMatrix4x4 &projection);

Q_SIGNALS:
    void leftTangentChanged(float leftTangent);
    void rightTangentChanged(float rightTangent);
    void upTangentChanged(float upTangent);
    void downTangentChanged(float downTangent);
    void clipNearChanged(float clipNear);
    void clipFarChanged(float clipFar);

public:
    QMatrix4x4 m_projection;

protected:
    QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;

private:
    enum DirtyFlag : quint8
    {
        ProjectionDirty = 0x1, // Camera projection matrix needs to be recalculated
        ProjectionChanged = 0x2, // A camera projection matrix has changed (no recalculation needed)
        ClipChanged = 0x4, // Camera clip planes have changed
    };
    using DirtyFlagT = std::underlying_type_t<DirtyFlag>;

    void markDirty(DirtyFlag flag);
    void maybeUpdateProjection();
    float m_leftTangent = -0.017455064928218f;  // tan(-1)
    float m_rightTangent = 0.017455064928218f;  // tan(1)
    float m_upTangent = 0.017455064928218f;     // tan(1)
    float m_downTangent = -0.017455064928218f;  // tan(-1)
    float m_clipNear = 1.0f;
    float m_clipFar = 10000.0f;
    DirtyFlagT m_dirtyFlags = 0;
};

class Q_QUICK3DXR_EXPORT QQuick3DXrCamera : public QQuick3DNode
{
    Q_OBJECT
    Q_PROPERTY(float clipNear READ clipNear WRITE setClipNear NOTIFY clipNearChanged FINAL)
    Q_PROPERTY(float clipFar READ clipFar WRITE setClipFar NOTIFY clipFarChanged FINAL)
    QML_NAMED_ELEMENT(XrCamera)
    QML_ADDED_IN_VERSION(6, 8)

public:
    explicit QQuick3DXrCamera(QQuick3DXrOrigin *parent = nullptr);
    ~QQuick3DXrCamera();
    float clipNear() const;
    float clipFar() const;

public Q_SLOTS:
    void setClipNear(float clipNear);
    void setClipFar(float clipFar);

Q_SIGNALS:
    void clipNearChanged(float clipNear);
    void clipFarChanged(float clipFar);

protected:
    void itemChange(ItemChange change, const ItemChangeData &data) override;

private:
    void syncCameraSettings();

    float m_clipNear = 1.0f;
    float m_clipFar = 10000.0f;
};


QT_END_NAMESPACE

#endif // QQUICK3DXRCAMERA_P_H