diff options
author | Mike Krus <mike.krus@kdab.com> | 2019-12-09 15:10:53 +0000 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2019-12-13 07:10:27 +0000 |
commit | ecd193d7b5788fca8b478a02068060a078dc5738 (patch) | |
tree | 15a1d0d5408fc8d811c9e278739d6102a4bf9d81 /src/render | |
parent | cfaa43c554ef3e9d1e2ebf1cbdbbb8ce1bdcbe59 (diff) |
Fix picking with primitive restart for line loops
Previous fix was not closing the loop on every primitive,
just the last one.
Task-number: QTBUG-71919
Change-Id: I22d52258477b0c4777118ee36a0b3868da982885
Reviewed-by: Volker Enderlein <volker.enderlein@ifm-chemnitz.de>
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/backend/segmentsvisitor.cpp | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/src/render/backend/segmentsvisitor.cpp b/src/render/backend/segmentsvisitor.cpp index 68deafb15..d9f2d79ec 100644 --- a/src/render/backend/segmentsvisitor.cpp +++ b/src/render/backend/segmentsvisitor.cpp @@ -135,39 +135,44 @@ void traverseSegmentStripIndexed(Index *indices, bool loop) { uint i = 0; + uint stripStartIndex = 0; + const uint verticesStride = vertexInfo.byteStride / sizeof(Vertex); const uint maxVerticesDataSize = qMin(vertexInfo.dataSize, 3U); uint ndx[2]; Vector3D abc[2]; - - 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<int>(ndx[1])) { - i += 2; - goto startLinePrimitive; - } - idx = ndx[1] * verticesStride; - for (uint j = 0; j < maxVerticesDataSize; ++j) - abc[1][j] = vertices[idx + j]; - visitor->visit(ndx[0], abc[0], ndx[1], abc[1]); + while (i < indexInfo.count) { + if (indexInfo.restartEnabled && indexInfo.restartIndexValue == static_cast<int>(indices[i])) { + ++i; + continue; } + stripStartIndex = i; + ndx[0] = indices[stripStartIndex]; + uint idx = ndx[0] * verticesStride; + for (uint j = 0; j < maxVerticesDataSize; ++j) + abc[0][j] = vertices[idx + j]; ++i; - ndx[0] = ndx[1]; - abc[0] = abc[1]; - } - if (loop) { - ndx[1] = indices[0]; - if (ndx[0] != ndx[1]) { - idx = ndx[1] * verticesStride; - for (uint j = 0; j < maxVerticesDataSize; ++j) - abc[1][j] = vertices[idx + j]; - visitor->visit(ndx[0], abc[0], ndx[1], abc[1]); + while (i < indexInfo.count && (!indexInfo.restartEnabled || indexInfo.restartIndexValue != static_cast<int>(indices[i]))) { + ndx[1] = indices[i]; + if (ndx[0] != ndx[1]) { + idx = ndx[1] * verticesStride; + for (uint j = 0; j < maxVerticesDataSize; ++j) + abc[1][j] = vertices[idx + j]; + visitor->visit(ndx[0], abc[0], ndx[1], abc[1]); + } + ++i; + ndx[0] = ndx[1]; + abc[0] = abc[1]; + } + if (loop) { + ndx[1] = indices[stripStartIndex]; + if (ndx[0] != ndx[1]) { + idx = ndx[1] * verticesStride; + for (uint j = 0; j < maxVerticesDataSize; ++j) + abc[1][j] = vertices[idx + j]; + visitor->visit(ndx[0], abc[0], ndx[1], abc[1]); + } } } } |