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,25 +761,28 @@ 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 ((*indexItr) != model::Mesh::PRIMITIVE_RESTART_INDEX) {
if (triangleCount % 2 == 0) { if (triangleCount % 2 == 0) {
// even triangles use first two indices in order // even triangles use first two indices in order
triangleIndices.push_back(*(indexItr) + meshIndexOffset); triangleIndices.push_back(*(indexItr - 2) + meshIndexOffset);
triangleIndices.push_back(*(++indexItr) + meshIndexOffset); // yes pre-increment triangleIndices.push_back(*(indexItr - 1) + meshIndexOffset);
} else { } else {
// odd triangles swap order of first two indices // odd triangles swap order of first two indices
triangleIndices.push_back(*(indexItr + 1) + meshIndexOffset); triangleIndices.push_back(*(indexItr - 1) + meshIndexOffset);
triangleIndices.push_back(*(indexItr++) + meshIndexOffset); // yes post-increment triangleIndices.push_back(*(indexItr - 2) + meshIndexOffset);
} }
triangleIndices.push_back(*(indexItr + 1) + meshIndexOffset); triangleIndices.push_back(*indexItr + meshIndexOffset);
++triangleCount; ++triangleCount;
} }
++indexItr;
}
} else if (partItr->_topology == model::Mesh::QUADS) { } else if (partItr->_topology == model::Mesh::QUADS) {
// TODO: support model::Mesh::QUADS // TODO: support model::Mesh::QUADS
} }