From 69789d0184ffa54c1760ad5204bb4539c9399753 Mon Sep 17 00:00:00 2001 From: Mike Krus Date: Sat, 7 Dec 2019 13:03:58 +0000 Subject: Fix picking with primitive restart Task-number: QTBUG-71919 Change-Id: If7923fab6c43f5d7139d1bbdceb73c17bf489099 Reviewed-by: Paul Lemire --- src/render/backend/bufferutils_p.h | 4 ++++ src/render/backend/segmentsvisitor.cpp | 7 ++++++- src/render/backend/trianglesvisitor.cpp | 11 ++++++++++- src/render/backend/visitorutils_p.h | 2 ++ 4 files changed, 22 insertions(+), 2 deletions(-) (limited to 'src/render') diff --git a/src/render/backend/bufferutils_p.h b/src/render/backend/bufferutils_p.h index 2bb35fac6..ea783df0d 100644 --- a/src/render/backend/bufferutils_p.h +++ b/src/render/backend/bufferutils_p.h @@ -74,6 +74,8 @@ struct BufferInfo , count(0) , byteStride(0) , byteOffset(0) + , restartEnabled(false) + , restartIndexValue(-1) {} QByteArray data; @@ -82,6 +84,8 @@ struct BufferInfo uint count; uint byteStride; uint byteOffset; + bool restartEnabled; + int restartIndexValue; }; diff --git a/src/render/backend/segmentsvisitor.cpp b/src/render/backend/segmentsvisitor.cpp index a3a5d059c..68deafb15 100644 --- a/src/render/backend/segmentsvisitor.cpp +++ b/src/render/backend/segmentsvisitor.cpp @@ -140,13 +140,18 @@ void traverseSegmentStripIndexed(Index *indices, uint ndx[2]; Vector3D abc[2]; - ndx[0] = indices[0]; + + startLinePrimitive:ndx[0] = indices[i]; uint idx = ndx[0] * verticesStride; for (uint j = 0; j < maxVerticesDataSize; ++j) abc[0][j] = vertices[idx + j]; while (i < indexInfo.count - 1) { ndx[1] = indices[i + 1]; if (ndx[0] != ndx[1]) { + if (indexInfo.restartEnabled && indexInfo.restartIndexValue == static_cast(ndx[1])) { + i += 2; + goto startLinePrimitive; + } idx = ndx[1] * verticesStride; for (uint j = 0; j < maxVerticesDataSize; ++j) abc[1][j] = vertices[idx + j]; diff --git a/src/render/backend/trianglesvisitor.cpp b/src/render/backend/trianglesvisitor.cpp index 87ba7bde9..a58f2d20b 100644 --- a/src/render/backend/trianglesvisitor.cpp +++ b/src/render/backend/trianglesvisitor.cpp @@ -153,6 +153,10 @@ void traverseTriangleStripIndexed(index *indices, uint ndx[3]; Vector3D abc[3]; while (i < indexInfo.count - 2) { + if (indexInfo.restartEnabled && indexInfo.restartIndexValue == static_cast(indices[i + 2])) { + i += 3; + continue; + } bool degenerate = false; for (uint u = 0; u < 3; ++u) { ndx[u] = indices[i + u]; @@ -216,6 +220,11 @@ void traverseTriangleFanIndexed(index *indices, ndx[0] = indices[0]; uint i = 1; while (i < indexInfo.count - 1) { + if (indexInfo.restartEnabled && indexInfo.restartIndexValue == static_cast(indices[i + 1])) { + ndx[0] = indices[i + 2]; + i += 3; + continue; + } for (uint u = 0; u < 2; ++u) { ndx[u + 1] = indices[i + u]; uint idx = ndx[u + 1] * verticesStride; @@ -224,7 +233,7 @@ void traverseTriangleFanIndexed(index *indices, } } visitor->visit(ndx[2], abc[2], ndx[1], abc[1], ndx[0], abc[0]); - i += 1; + ++i; } } diff --git a/src/render/backend/visitorutils_p.h b/src/render/backend/visitorutils_p.h index 6a5c7b4ff..14183e11b 100644 --- a/src/render/backend/visitorutils_p.h +++ b/src/render/backend/visitorutils_p.h @@ -149,6 +149,8 @@ void visitPrimitives(NodeManagers *manager, const GeometryRenderer *renderer, Vi indexBufferInfo.byteOffset = indexAttribute->byteOffset(); indexBufferInfo.byteStride = indexAttribute->byteStride(); indexBufferInfo.count = indexAttribute->count(); + indexBufferInfo.restartEnabled = renderer->primitiveRestartEnabled(); + indexBufferInfo.restartIndexValue = renderer->restartIndexValue(); IndexExecutor executor; executor.m_vertexBufferInfo = vertexBufferInfo; -- cgit v1.2.3