13 m_vertexBufferData = vb.
data;
14 m_indexBufferData = ib.
data;
24 for (
quint32 entryIdx = 0, entryEnd = vb.
entries.size(); entryIdx < entryEnd; ++entryIdx) {
27 m_hasPositionData =
true;
28 m_vertexPosOffset =
entry.m_firstItemOffset;
31 m_vertexUVOffset =
entry.m_firstItemOffset;
34 m_vertexUVOffset =
entry.m_firstItemOffset;
37 m_vertexStride = vb.
stride;
49 m_vertexBufferData = vertexBuffer;
51 m_hasPositionData =
true;
52 m_vertexPosOffset = posOffset;
54 m_vertexUVOffset = uvOffset;
55 m_hasIndexBuffer = hasIndexBuffer;
56 m_indexBufferData = indexBuffer;
57 m_indexBufferComponentType = indexBufferType;
69 if (m_mesh.
isValid() && m_mesh.
drawMode() != QSSGMesh::Mesh::DrawMode::Triangles)
77 indexCount = m_vertexBufferData.
size() / m_vertexStride;
78 m_triangleBounds = calculateTriangleBounds(0, indexCount);
83 for (
quint32 subsetIdx = 0, subsetEnd = subsets.
size(); subsetIdx < subsetEnd; ++subsetIdx) {
90 root->
boundingData = getBounds(triangleOffset, triangleCount);
92 root = splitNode(root, triangleOffset, triangleCount);
98 root->
boundingData = getBounds(0, m_triangleBounds.size());
99 root = splitNode(root, 0, m_triangleBounds.size());
100 m_roots.append(root);
108 const quint32 triangleCount = indexCount / 3;
112 const quint32 triangleIndex =
i * 3 + indexOffset;
114 quint32 index1 = triangleIndex + 0;
115 quint32 index2 = triangleIndex + 1;
116 quint32 index3 = triangleIndex + 2;
118 if (m_hasIndexBuffer) {
119 index1 = getIndexBufferValue(triangleIndex + 0);
120 index2 = getIndexBufferValue(triangleIndex + 1);
121 index3 = getIndexBufferValue(triangleIndex + 2);
126 triangle->
vertex1 = getVertexBufferValuePosition(index1);
127 triangle->
vertex2 = getVertexBufferValuePosition(index2);
128 triangle->
vertex3 = getVertexBufferValuePosition(index3);
129 triangle->
uvCoord1 = getVertexBufferValueUV(index1);
130 triangle->
uvCoord2 = getVertexBufferValueUV(index2);
131 triangle->
uvCoord3 = getVertexBufferValueUV(index3);
136 triangleBounds.
append(triangle);
138 return triangleBounds;
162 if (!m_hasPositionData)
186 if (count < m_maxLeafTriangles || depth >= m_maxTreeDepth) {
196 if (
split.axis == QSSGMeshBVHBuilder::Axis::None) {
245 QSSGMeshBVHBuilder::Split
split;
246 split.axis = getLongestDimension(nodeBounds);
249 if (
split.axis != Axis::None)
255QSSGMeshBVHBuilder::Axis QSSGMeshBVHBuilder::getLongestDimension(
const QSSGBounds3 &nodeBounds)
257 QSSGMeshBVHBuilder::Axis axis = Axis::None;
258 float largestDistance = std::numeric_limits<float>::min();
265 if (delta.
x() > largestDistance) {
267 largestDistance = delta.
x();
269 if (delta.
y() > largestDistance) {
271 largestDistance = delta.
y();
273 if (delta.
z() > largestDistance)
288 average += m_triangleBounds[
i +
offset]->bounds.center(
int(axis));
290 return average /
count;
298 const int axis = int(
split.axis);
301 while (
left <=
right && m_triangleBounds[
left]->bounds.center()[axis] <
pos)
309 auto temp = m_triangleBounds[
left];
310 m_triangleBounds[
left] = m_triangleBounds[
right];
311 m_triangleBounds[
right] = temp;
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
iterator begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first byte in the byte-array.
qsizetype size() const noexcept
void append(parameter_type t)
static size_t getSizeOfType(QSSGRenderComponentType type)
Class representing 3D range or axis aligned bounding box.
void include(const QVector3D &v)
expands the volume to include v
Q_ALWAYS_INLINE bool isEmpty() const
QSSGMeshBVH * buildTree()
QSSGMeshBVHBuilder(const QSSGMesh::Mesh &mesh)
VertexBuffer vertexBuffer() const
IndexBuffer indexBuffer() const
QVector< Subset > subsets() const
DrawMode drawMode() const
The QVector2D class represents a vector or vertex in 2D space.
The QVector3D class represents a vector or vertex in 3D space.
constexpr float y() const noexcept
Returns the y coordinate of this point.
constexpr float x() const noexcept
Returns the x coordinate of this point.
constexpr float z() const noexcept
Returns the z coordinate of this point.
Combined button and popup list for selecting options.
static const double leftOffset
static const double rightOffset
GLint GLenum GLsizei GLsizei GLsizei depth
GLenum GLenum GLsizei count
const void GLsizei GLsizei stride
GLenum GLuint GLintptr offset
GLsizei GLsizei GLchar * source
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
static void split(QT_FT_Vector *b)
static const char * getUV1AttrName()
static const char * getPositionAttrName()
static const char * getUV0AttrName()
ComponentType componentType
QVector< VertexBufferEntry > entries