summaryrefslogtreecommitdiffstats
path: root/src/render/backend/trianglesvisitor.cpp
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2016-04-29 10:19:01 +0300
committerSean Harmer <sean.harmer@kdab.com>2016-05-01 15:43:05 +0000
commitf52f556ab5f6304310990e38e5836120c41e9c67 (patch)
tree1c5aacb4b3006e4def58d5db9fff3d6044456bb9 /src/render/backend/trianglesvisitor.cpp
parentc5c7f766ade806a29d159412e806ae2b7b47fb91 (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.cpp22
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;
}
}