diff --git a/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h b/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h index ee46360b0ccab03701613c706492cca53a554b27..1d19d0e26605e6646ede00ed7a15896d00e77fa9 100644 --- a/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h +++ b/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h @@ -86,6 +86,10 @@ private: std::vector<uint16_t> createTriangularFaces(std::vector<int> &faceIndices, std::vector<uint16_t> &windingOrder) const; + + void createTrianglesFromPolygon(std::vector<uint16_t> &windingOrder, + std::vector<uint16_t> &triangularFaces, + int &startOfFace, int &endOfFace) const; }; } // namespace NexusGeometry diff --git a/Framework/NexusGeometry/src/NexusGeometryParser.cpp b/Framework/NexusGeometry/src/NexusGeometryParser.cpp index 1ee56e1502da7241edd17cabef445897206e72e1..03f8464b8b51dc0255b28e522fcf839a752251eb 100644 --- a/Framework/NexusGeometry/src/NexusGeometryParser.cpp +++ b/Framework/NexusGeometry/src/NexusGeometryParser.cpp @@ -458,23 +458,36 @@ std::vector<uint16_t> NexusGeometryParser::createTriangularFaces( std::vector<uint16_t> triangularFaces; int startOfFace = 0; + int endOfFace = 0; for (auto it = faceIndices.begin() + 1; it != faceIndices.end(); ++it) { - int endOfFace = *it; - int polygonOrder = endOfFace - startOfFace; + endOfFace = *it; + createTrianglesFromPolygon(windingOrder, triangularFaces, startOfFace, + endOfFace); + } - auto first = windingOrder.begin() + startOfFace; + // and the last face + endOfFace = static_cast<int>(windingOrder.size()); + createTrianglesFromPolygon(windingOrder, triangularFaces, startOfFace, + endOfFace); - for (int polygonVertex = 1; polygonVertex < polygonOrder - 1; - ++polygonVertex) { - triangularFaces.push_back(*first); - triangularFaces.push_back(*(windingOrder.begin() + polygonVertex)); - triangularFaces.push_back(*(windingOrder.begin() + polygonVertex + 1)); - } - startOfFace = endOfFace + 1; - } return triangularFaces; } +void NexusGeometryParser::createTrianglesFromPolygon( + std::vector<uint16_t> &windingOrder, std::vector<uint16_t> &triangularFaces, + int &startOfFace, int &endOfFace) const { + int polygonOrder = endOfFace - startOfFace; + auto first = windingOrder.begin() + startOfFace; + + for (int polygonVertex = 1; polygonVertex < polygonOrder - 1; + ++polygonVertex) { + triangularFaces.push_back(*first); + triangularFaces.push_back(*(windingOrder.begin() + polygonVertex)); + triangularFaces.push_back(*(windingOrder.begin() + polygonVertex + 1)); + } + startOfFace = endOfFace + 1; // start of the next face +} + // Parse source and add to instrument void NexusGeometryParser::parseAndAddSource() { H5std_string sourcePath = "raw_data_1/instrument/source";