From 5484b6fbb7e9a545007275a2da0129000c285529 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 16 Jun 2016 12:15:47 -0700 Subject: [PATCH] more correct extraction from triangle strips --- .../src/RenderableModelEntityItem.cpp | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 13d757e9b4..1adbd4fe1a 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -761,24 +761,27 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) { auto indexEnd = indexItr + (partItr->_numIndices - 2); // first triangle uses the first three indices - triangleIndices.push_back(*indexItr + meshIndexOffset); - triangleIndices.push_back(*(++indexItr) + meshIndexOffset); - triangleIndices.push_back(*(indexItr + 1) + meshIndexOffset); + triangleIndices.push_back(*(indexItr++) + meshIndexOffset); + triangleIndices.push_back(*(indexItr++) + meshIndexOffset); + triangleIndices.push_back(*(indexItr++) + meshIndexOffset); // the rest use previous and next index uint32_t triangleCount = 1; while (indexItr != indexEnd) { - if (triangleCount % 2 == 0) { - // even triangles use first two indices in order - triangleIndices.push_back(*(indexItr) + meshIndexOffset); - triangleIndices.push_back(*(++indexItr) + meshIndexOffset); // yes pre-increment - } else { - // odd triangles swap order of first two indices - triangleIndices.push_back(*(indexItr + 1) + meshIndexOffset); - triangleIndices.push_back(*(indexItr++) + meshIndexOffset); // yes post-increment + if ((*indexItr) != model::Mesh::PRIMITIVE_RESTART_INDEX) { + if (triangleCount % 2 == 0) { + // even triangles use first two indices in order + triangleIndices.push_back(*(indexItr - 2) + meshIndexOffset); + triangleIndices.push_back(*(indexItr - 1) + meshIndexOffset); + } else { + // odd triangles swap order of first two indices + triangleIndices.push_back(*(indexItr - 1) + meshIndexOffset); + triangleIndices.push_back(*(indexItr - 2) + meshIndexOffset); + } + triangleIndices.push_back(*indexItr + meshIndexOffset); + ++triangleCount; } - triangleIndices.push_back(*(indexItr + 1) + meshIndexOffset); - ++triangleCount; + ++indexItr; } } else if (partItr->_topology == model::Mesh::QUADS) { // TODO: support model::Mesh::QUADS