diff --git a/src/bundles/graphics/_graphics/mesh_edges.cpp b/src/bundles/graphics/_graphics/mesh_edges.cpp
index e0537a835..93b8202a1 100644
|
a
|
b
|
|
| 13 | 13 | * === UCSF ChimeraX Copyright === |
| 14 | 14 | */ |
| 15 | 15 | |
| 16 | | #include <set> // use std::set |
| | 16 | #include <vector> |
| | 17 | #include <algorithm> |
| | 18 | #include <functional> |
| 17 | 19 | |
| 18 | 20 | #include <arrays/pythonarray.h> // use array_from_python() |
| 19 | 21 | #include <arrays/rcarray.h> // use Numeric_Array, Array<T> |
| … |
… |
|
| 25 | 27 | namespace Map_Cpp |
| 26 | 28 | { |
| 27 | 29 | |
| | 30 | static_assert(sizeof(int) * 2 == sizeof(size_t), "Size of int is not half of size_t - hash needs a re-think!"); |
| | 31 | |
| | 32 | |
| | 33 | size_t edge_hash (int i0, int i1) noexcept |
| | 34 | { |
| | 35 | return ((size_t)i0 << 32 | i1); |
| | 36 | } |
| | 37 | |
| 28 | 38 | // ---------------------------------------------------------------------------- |
| 29 | 39 | // Find edges of displayed triangles. Edges that appear in 2 or more triangles |
| 30 | 40 | // are only listed once. |
| … |
… |
namespace Map_Cpp
|
| 32 | 42 | static IArray calculate_masked_edges(const IArray &triangles, |
| 33 | 43 | const BArray &tmask, const BArray &emask) |
| 34 | 44 | { |
| 35 | | std::set< std::pair<int,int> > edges; |
| | 45 | |
| | 46 | std::vector< size_t > edges; |
| 36 | 47 | |
| 37 | 48 | unsigned char *show_t = (tmask.size() > 0 ? tmask.values() : NULL); |
| 38 | 49 | unsigned char *show_e = (emask.size() > 0 ? emask.values() : NULL); |
| 39 | | int n = triangles.size(0); |
| | 50 | size_t n = triangles.size(0); |
| | 51 | |
| 40 | 52 | int *tarray = triangles.values(); |
| 41 | 53 | for (int k = 0 ; k < n ; ++k, tarray += 3) |
| 42 | 54 | { |
| … |
… |
static IArray calculate_masked_edges(const IArray &triangles,
|
| 47 | 59 | if (ebits & (EDGE0_DISPLAY_MASK << j)) |
| 48 | 60 | { |
| 49 | 61 | int i0 = tarray[j], i1 = tarray[(j+1)%3]; |
| 50 | | edges.insert(i0 < i1 ? std::pair<int,int>(i0, i1) : |
| 51 | | std::pair<int,int>(i1, i0)); |
| | 62 | edges.push_back(i0 < i1 ? edge_hash(i0, i1) : edge_hash(i1, i0)); |
| 52 | 63 | } |
| 53 | 64 | } |
| 54 | 65 | } |
| | 66 | std::sort(edges.begin(), edges.end()); |
| | 67 | auto last = std::unique(edges.begin(), edges.end()); |
| | 68 | edges.erase(last, edges.end()); |
| | 69 | |
| 55 | 70 | |
| 56 | 71 | int64_t size[2] = {(int64_t)edges.size(), 2}; |
| 57 | 72 | IArray masked_edges(2, size); |
| 58 | 73 | int *eiarray = masked_edges.values(); |
| 59 | | for (std::set< std::pair<int,int> >::iterator ei = edges.begin() ; |
| | 74 | for (auto ei = edges.begin() ; |
| 60 | 75 | ei != edges.end() ; ++ei) |
| 61 | 76 | { |
| 62 | | *eiarray = (*ei).first; eiarray += 1; |
| 63 | | *eiarray = (*ei).second; eiarray += 1; |
| | 77 | auto i0 = (*ei)>>32; |
| | 78 | auto i1 = (*ei)&0x00000000FFFFFFFF; |
| | 79 | *eiarray = i0; eiarray += 1; |
| | 80 | *eiarray = i1; eiarray += 1; |
| 64 | 81 | } |
| 65 | 82 | |
| 66 | 83 | return masked_edges; |