diff options
author | Antti Määttä <antti.maatta@qt.io> | 2016-04-29 10:19:01 +0300 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-05-01 15:43:05 +0000 |
commit | f52f556ab5f6304310990e38e5836120c41e9c67 (patch) | |
tree | 1c5aacb4b3006e4def58d5db9fff3d6044456bb9 /src/render/backend/trianglesvisitor.cpp | |
parent | c5c7f766ade806a29d159412e806ae2b7b47fb91 (diff) |
Fix trianglevisitor traversing triangle strips
Triangle strips contain index count - 2 triangles. Add degenerate triangle
handling.
Task-number: QTBUG-49808
Change-Id: I154b19beb2df80561cf60bbd4572b3c4c49ccd41
Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com>
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/backend/trianglesvisitor.cpp')
-rw-r--r-- | src/render/backend/trianglesvisitor.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/render/backend/trianglesvisitor.cpp b/src/render/backend/trianglesvisitor.cpp index 62b4cd1cf..c2cff33d3 100644 --- a/src/render/backend/trianglesvisitor.cpp +++ b/src/render/backend/trianglesvisitor.cpp @@ -145,6 +145,15 @@ void traverseTriangles(vertex *vertices, } } +static inline bool checkDegenerate(const uint ndx[3], const uint idx, const uint i) +{ + for (uint j = 0; j < i; ++j) { + if (idx == ndx[j]) + return true; + } + return false; +} + // indices, vertices are already offset template<typename index, typename vertex> void traverseTriangleStripIndexed(index *indices, @@ -159,15 +168,20 @@ void traverseTriangleStripIndexed(index *indices, uint ndx[3]; QVector3D abc[3]; - while (i < indexInfo.count) { + while (i < indexInfo.count - 2) { + bool degenerate = false; for (uint u = 0; u < 3; ++u) { uint idx = indices[i + u] * verticesStride; + if (checkDegenerate(ndx, idx, i)) { + degenerate = true; + break; + } ndx[u] = idx; - for (uint j = 0; j < maxVerticesDataSize; ++j) { + for (uint j = 0; j < maxVerticesDataSize; ++j) abc[u][j] = vertices[idx + j]; - } } - visitor->visit(ndx[2], abc[2], ndx[1], abc[1], ndx[0], abc[0]); + if (!degenerate) + visitor->visit(ndx[2], abc[2], ndx[1], abc[1], ndx[0], abc[0]); ++i; } } |