more correct extraction from triangle strips

This commit is contained in:
Andrew Meadows 2016-06-16 12:15:47 -07:00
parent c0c77e9027
commit 5484b6fbb7

View file

@ -761,24 +761,27 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) {
auto indexEnd = indexItr + (partItr->_numIndices - 2); auto indexEnd = indexItr + (partItr->_numIndices - 2);
// first triangle uses the first three indices // first triangle uses the first three indices
triangleIndices.push_back(*indexItr + meshIndexOffset); triangleIndices.push_back(*(indexItr++) + meshIndexOffset);
triangleIndices.push_back(*(++indexItr) + meshIndexOffset); triangleIndices.push_back(*(indexItr++) + meshIndexOffset);
triangleIndices.push_back(*(indexItr + 1) + meshIndexOffset); triangleIndices.push_back(*(indexItr++) + meshIndexOffset);
// the rest use previous and next index // the rest use previous and next index
uint32_t triangleCount = 1; uint32_t triangleCount = 1;
while (indexItr != indexEnd) { while (indexItr != indexEnd) {
if (triangleCount % 2 == 0) { if ((*indexItr) != model::Mesh::PRIMITIVE_RESTART_INDEX) {
// even triangles use first two indices in order if (triangleCount % 2 == 0) {
triangleIndices.push_back(*(indexItr) + meshIndexOffset); // even triangles use first two indices in order
triangleIndices.push_back(*(++indexItr) + meshIndexOffset); // yes pre-increment triangleIndices.push_back(*(indexItr - 2) + meshIndexOffset);
} else { triangleIndices.push_back(*(indexItr - 1) + meshIndexOffset);
// odd triangles swap order of first two indices } else {
triangleIndices.push_back(*(indexItr + 1) + meshIndexOffset); // odd triangles swap order of first two indices
triangleIndices.push_back(*(indexItr++) + meshIndexOffset); // yes post-increment triangleIndices.push_back(*(indexItr - 1) + meshIndexOffset);
triangleIndices.push_back(*(indexItr - 2) + meshIndexOffset);
}
triangleIndices.push_back(*indexItr + meshIndexOffset);
++triangleCount;
} }
triangleIndices.push_back(*(indexItr + 1) + meshIndexOffset); ++indexItr;
++triangleCount;
} }
} else if (partItr->_topology == model::Mesh::QUADS) { } else if (partItr->_topology == model::Mesh::QUADS) {
// TODO: support model::Mesh::QUADS // TODO: support model::Mesh::QUADS