blob: c7a9ae9a73fd61ab8f2d894ea1ac0ea93c6e602f (
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#ifndef QSSGMESHBVH_H
#define QSSGMESHBVH_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 <QtQuick3DUtils/private/qtquick3dutilsglobal_p.h>
#include <QtQuick3DUtils/private/qssgbounds3_p.h>
#include <QtQuick3DUtils/private/qssgassert_p.h>
#include <QtGui/QVector2D>
#include <QtCore/QVector>
QT_BEGIN_NAMESPACE
class QSSGMeshBVH;
class Q_QUICK3DUTILS_EXPORT QSSGMeshBVHNode
{
public:
class Handle
{
public:
Handle() = default;
bool isNull() const { return !m_owner || m_idx < size_t(FallbackIndex::Count); }
inline explicit operator const QSSGMeshBVHNode *() const;
inline QSSGMeshBVHNode *operator->() const;
private:
friend class QSSGMeshBVH;
Handle(QSSGMeshBVH *owner, size_t idx)
: m_owner(owner)
, m_idx(idx)
{}
QSSGMeshBVH *m_owner = nullptr;
size_t m_idx = 0;
};
// Internal
Handle left;
Handle right;
QSSGBounds3 boundingData;
//splitAxis
// Leaf
int offset = 0;
int count = 0;
private:
friend class QSSGMeshBVH;
friend class QSSGMeshBVHBuilder;
enum class FallbackIndex : quint8
{
InvalidRead = 0,
InvalidWrite = 1,
Count
};
};
struct Q_QUICK3DUTILS_EXPORT QSSGMeshBVHTriangle
{
QSSGBounds3 bounds;
QVector3D vertex1;
QVector3D vertex2;
QVector3D vertex3;
QVector2D uvCoord1;
QVector2D uvCoord2;
QVector2D uvCoord3;
};
using QSSGMeshBVHTriangles = std::vector<QSSGMeshBVHTriangle>;
using QSSGMeshBVHRoots = std::vector<QSSGMeshBVHNode::Handle>;
using QSSGMeshBVHNodes = std::vector<QSSGMeshBVHNode>;
class Q_QUICK3DUTILS_EXPORT QSSGMeshBVH
{
public:
QSSGMeshBVH() = default;
~QSSGMeshBVH();
[[nodiscard]] QSSGMeshBVHNode::Handle newHandle()
{
m_nodes.emplace_back();
return { this, m_nodes.size() - 1 };
}
[[nodiscard]] const QSSGMeshBVHTriangles &triangles() const { return m_triangles; }
[[nodiscard]] const QSSGMeshBVHRoots &roots() const { return m_roots; }
[[nodiscard]] const QSSGMeshBVHNodes &nodes() const { return m_nodes; }
private:
friend class QSSGMeshBVHNode::Handle;
friend class QSSGMeshBVHBuilder;
using FallbackIndex = QSSGMeshBVHNode::FallbackIndex;
size_t getNodeIndex(size_t idx, FallbackIndex op) const
{
const bool valid = (idx >= size_t(FallbackIndex::Count) && idx < m_nodes.size());
return (valid * idx) + (!valid * size_t(op));
}
QSSGMeshBVHNode &mutableValue(qsizetype idx)
{
return m_nodes[getNodeIndex(idx, FallbackIndex::InvalidWrite)];
}
const QSSGMeshBVHNode &value(qsizetype idx) const
{
return m_nodes[getNodeIndex(idx, FallbackIndex::InvalidRead)];
}
QSSGMeshBVHRoots m_roots;
QSSGMeshBVHNodes m_nodes { { /* 0 - reserved for invalid reads */ }, { /* 1 - reserved for invalid writes */ } };
QSSGMeshBVHTriangles m_triangles;
};
QSSGMeshBVHNode::Handle::operator const QSSGMeshBVHNode *() const
{
return &m_owner->value(m_idx);
}
QSSGMeshBVHNode *QSSGMeshBVHNode::Handle::operator->() const
{
return &m_owner->mutableValue(m_idx);
}
QT_END_NAMESPACE
#endif // QSSGMESHBVH_H
|