Revision control
Copy as Markdown
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#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