From d29871d02af6ab8b7baf84d769a69bcb36ca22cf Mon Sep 17 00:00:00 2001
From: Matthew D Jones <matthew.d.jones@tessella.com>
Date: Tue, 27 Feb 2018 15:40:33 +0000
Subject: [PATCH] Also create triangles for the last polgyon in the nexus mesh

---
 .../MantidNexusGeometry/NexusGeometryParser.h |  4 +++
 .../NexusGeometry/src/NexusGeometryParser.cpp | 35 +++++++++++++------
 2 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h b/Framework/NexusGeometry/inc/MantidNexusGeometry/NexusGeometryParser.h
index ee46360b0cc..1d19d0e2660 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 1ee56e1502d..03f8464b8b5 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";
-- 
GitLab